pax_global_header00006660000000000000000000000064132266772010014520gustar00rootroot0000000000000052 comment=2603af40e5d263456c35cbe8ec85ce045d1a64b1 glewlwyd-1.3.1/000077500000000000000000000000001322667720100133605ustar00rootroot00000000000000glewlwyd-1.3.1/.gitignore000066400000000000000000000015011322667720100153450ustar00rootroot00000000000000*.o *.key *.pem *.log *.err valgrind.txt glewlwyd.conf glewlwyd test/glewlwyd_oauth2_auth_code test/glewlwyd_oauth2_client_cred test/glewlwyd_oauth2_code test/glewlwyd_oauth2_implicit test/glewlwyd_oauth2_resource_owner_pwd_cred test/glewlwyd_oauth2_code_client_confidential test/glewlwyd_oauth2_refresh_token test/glewlwyd_oauth2_refresh_token_client_confidential test/glewlwyd_oauth2_resource_owner_pwd_cred_client_confidential test/glewlwyd_admin_authorization test/glewlwyd_crud_scope test/glewlwyd_crud_user test/glewlwyd_crud_client test/glewlwyd_crud_resource test/glewlwyd_delete_token test/glewlwyd_update_user_profile test/glewlwyd_user_session_user test/glewlwyd_user_session_admin test/glewlwyd_user_refresh_token_user test/glewlwyd_user_refresh_token_admin test/test-token.html webapp/test-token.html glewlwyd_http_auth glewlwyd-1.3.1/API.md000066400000000000000000000540221322667720100143160ustar00rootroot00000000000000# Glewlwyd API description This document is intended to describe all data API endpoints. Data API endpoints are Glewlwyd specific endpoints used to manage data such as users, passwords, clients, scope names, resources, and disable refresh tokens. For OAuth 2 endpoints specification, please read the document OAUTH2.md. ## Endpoints authentication All the endpoints require proper authentication to provide their service. The authentication method used is [Bearer Token](https://tools.ietf.org/html/rfc6750). For each endpoint, the scope required will be defined in the `Security` paragraph. The admin scope name is `g_admin`, but this value can be changed in the configuration file. ## Prefix All urls are based on the prefix you will setup. In this document, all endpoints will assume they use the prefix `/api`. ## Content-type All request and response body use `application/json` content-type. ## Error response The HTTP status codes used are the following: - 200 OK: no error - 400 Invlid parameters: The user has sent invalid data. The details of all the errors are sent in the response body - 404 Not found: The specified resource doesn't exist - 500 Server error: An error occured on the server ## Authentication API ### Authenticate a user with its login and password #### URL `/api/auth/user/` #### Method `POST` #### Security none #### Data Parameters Request body arameters must be encoded using the `application/x-www-form-urlencoded` format. ``` username: text, required password: text, required remember: text, optional ``` #### Success response Code 200 A session cookie containing a valid token. If `remember` is equal to the string value `true`, the session cookie will have a max_age equal to config value `session_expiration`, otherwise, the session cookie will expire at the end of the session. #### Error Response Code 400 Error input parameters Content: json array containing all errors ### Disable current session cookie #### URL `/api/auth/user/` #### Method `DELETE` #### Security Session token #### Success response Code 200 Stored session cookie will be disabled. Code 400 Error input parameters Content: json array containing all errors ## Grant scope API ### Get user scope grant Return the list of scope available for the connected user #### URL `/api/auth/grant` #### Method `GET` #### Security Session token or header bearer token #### URL Parameters #### Success response Code 200 Content ```javascript [ { name: text, description: text } ] ``` ### Grant access to scope for a client #### URL `/api/auth/grant` #### Method `POST` #### Security Session token or header bearer token #### Data Parameters Request body arameters must be encoded using the `application/x-www-form-urlencoded` format. ``` client_id: text, required scope: text, required, list of scope values separated by space ``` #### Success response Code 200 #### Error Response Code 400 Error input parameters Content: json array containing all errors ### Delete grant access to scope for a client #### URL `/api/auth/grant` #### Method `DELETE` #### Security Session token or header bearer token #### Data Parameters Request body arameters must be encoded using the `application/x-www-form-urlencoded` format. ``` client_id: text, required scope: text, required, list of scope values separated by space ``` #### Success response Code 200 #### Error Response Code 400 Error input parameters Content: json array containing all errors ## Profile API ### Get current profile #### URL `/api/profile/` #### Method `GET` #### Security Session token or header bearer token #### Success response Code 200 Content ```javascript { name: text, email: text, login: text, scope: [ // Array of strings ] } ``` ### Update current profile #### URL `/api/profile/` #### Method `POST` #### Security Session token or header bearer token #### Data Parameters ```javascript { name: text, maximum 256 characters, optional old_password: text, optional new_password: text, mandatory if old_password is set } // At least one optional value must be set ``` #### Success response Code 200 #### Error Response Code 400 Error input parameters Content: json array containing all errors ### Get current profile's refresh token list #### URL `/api/profile/refresh_token/` #### Method `GET` #### Security Session token or header bearer token #### Success response Code 200 Content ```javascript [ { token_hash: text, authorization_type: text, ip_source: text, enabled: boolean, issued_at: numeric, last_seen: numeric, expired_at: numeric } ] ``` ### Revoke a refresh token from current profile's list #### URL `/api/profile/refresh_token/` #### Method `DELETE` #### Security Session token or header bearer token #### Data Parameters ```javascript { token_hash: text, required } ``` #### Success response Code 200 ### Get current profile's refresh token list #### URL `/api/profile/refresh_token/` #### Method `GET` #### Security Session token or header bearer token #### Success response Code 200 Content ```javascript [ { token_hash: text, authorization_type: text, ip_source: text, enabled: boolean, issued_at: numeric, last_seen: numeric, expired_at: numeric } ] ``` ### Revoke a refresh token from current profile's list #### URL `/api/profile/refresh_token/` #### Method `DELETE` #### Security Session token or header bearer token #### Data Parameters ```javascript { token_hash: text, required } ``` #### Success response Code 200 ### Get current profile's session list #### URL `/api/profile/session/` #### Method `GET` #### Security Session token or header bearer token #### Success response Code 200 Content ```javascript [ { session_hash: text, ip_source: text, enabled: boolean, issued_at: numeric, last_seen: numeric, expired_at: numeric } ] ``` ### Revoke a session from current profile's list #### URL `/api/profile/session/` #### Method `DELETE` #### Security Session token or header bearer token #### Data Parameters ```javascript { session_hash: text, required } ``` #### Success response Code 200 ### Send an email to reset a user's password #### URL `/profile/reset_password/{username}` #### Method `POST` #### URL Parameters `username`: a valid username that has en email registered #### Success response Code 200 #### Error response Code 400 Username specified has no e-mail. ### Reset a user profile' password #### URL `/profile/reset_password/{username}` #### Method `PUT` #### URL Parameters `username`: a valid username that has en email registered #### Data parameters Request body arameters must be encoded using the `application/x-www-form-urlencoded` format. ``` token: text, token sent to the user via e-mail, mandatory password: text, at least 8 characters, mandatory ``` #### Success response Code 200 #### Error response Code 400 Token or password invalid. ## Authorization type API ### Get all authorization type status #### URL `/api/authorization/` #### Method `GET` #### Security Scope required: `g_admin` #### Success response Code 200 Content ```javascript [ { name: text, description: text, enabled: boolean } ] ``` ### Get a specific authorization type status #### URL `/api/authorization/{authorization_type}` #### Method `GET` #### Security Scope required: `g_admin` #### Success response Code 200 Content ```javascript { name: text, description: text, enabled: boolean } ``` #### Error Response Code 404 Resource not found ### Update one response type status #### URL `/api/authorization/{authorization_type}` #### Method `PUT` #### Security Scope required: `g_admin` #### URL Parameters Required `authorization_type`: authorization type name #### Data Parameters ```javascript { description: text, maximum 256 characters, optional enabled: boolean, optional } ``` #### Success response Code 200 #### Error Response Code 404 Resource not found Code 400 Error input parameters Content: json array containing all errors ## Scope API ### Get the list of available scopes #### URL `/api/scope` #### Method `GET` #### Security Scope required: `g_admin` #### Success response Code 200 Content ```javascript [ { name: text, description: text } ] ``` ### Get a specific scope #### URL `/api/scope/{scope_name}` #### Method `GET` #### Security Scope required: `g_admin` #### URL Parameters Required `scope_name`: name of the scope #### Success response Code 200 Content ```javascript { name: text, description: text } ``` #### Error Response Code 404 Resource not found ### Add a new scope #### URL `/api/scope` #### Method `POST` #### Security Scope required: `g_admin` #### Data Parameters ```javascript { name: text, maximum 128 characters, name must be unique, mandatory description: text, maximum 512 characters, optional } ``` #### Success response Code 200 #### Error Response Code 400 Error input parameters Content: json array containing all errors ### Update a scope #### URL `/api/scope/{scope_name}` #### Method `PUT` #### Security Scope required: `g_admin` #### URL Parameters Required `scope_name`: name of the scope #### Data Parameters ```javascript { description: text, maximum 512 characters, optional } ``` #### Success response Code 200 #### Error Response Code 404 Resource not found Code 400 Error input parameters Content: json array containing all errors ### Delete an existing scope #### URL `/api/scope/{scope_name}` #### Method `DELETE` #### Security Scope required: `g_admin` #### URL Parameters Required `scope_name`: name of the scope #### Success response Code 200 #### Error Response Code 404 Resource not found ## User API The user API allows user CRUD. You can have LDAP or Database backend to store users, or both. Once a user is created in a backend, ldap or database, it can be modified, but the login or the backend can't be updated. ### Get the list of users #### URL `/api/user?source&search&offset&limit` #### Method `GET` #### Security Scope required: `g_admin` #### URL Parameters Optional `source`: source to get the user data: vaues can be `database`, `ldap` or `all` default is `all` `search`: search pattern for name, login or email. API will return any user that match the corresponding pattern. `offset`: offset to start the list result, default is 0 `limit`: number of users to list, default is 20 #### Success response Code 200 Content ```javascript [ // An array of user objects { source: text, name: text, email: text, login: text, enabled: boolean, additional_property_name: text, optional, set if additional_property_name is set in the config file additional_property_value: text, optional, set if additional_property_name is set in the config file scope: [ // Array of strings ] } ] ``` ### Get a specific user #### URL `/api/user/{login}?source` #### Method `GET` #### Security Scope required: `g_admin` #### URL Parameters Required `login`: user login Optional `source`: source to get the user data: vaues can be `database`, `ldap` or `all` default is `all` #### Success response Code 200 Content ```javascript { source: text, name: text, email: text, login: text, enabled: boolean, additional_property_name: text, optional, set if additional_property_name is set in the config file additional_property_value: text, optional, set if additional_property_name is set in the config file scope: [ // Array of strings ] } ``` #### Error Response Code 404 Resource not found ### Create a new user #### URL `/api/user` #### Method `POST` #### Security Scope required: `g_admin` #### Data Parameters ```javascript { source: text, values can be "database" or "ldap", optional, default is "database" name: text, maximum 256 characters, optional email: text, maximum 256 characters, optional login: text, maximum 128 characters, mandatory password: text, minimum 8 characters, mandatory additional_property_value: text, maximum 512 characters, optional, set if additional_property_name is set in the config file enabled: boolean, default true scope: [ // Array of strings ] } ``` #### Success response Code 200 #### Error Response Code 400 Error input parameters Content: json array containing all errors ### Update an existing user If no password is specified in the request, the password is not changed. #### URL `/api/user/{login}?source` #### Method `PUT` #### Security Scope required: `g_admin` #### URL Parameters Required `login`: user login Optional `source`: source to get the user data: vaues can be `database`, `ldap` or `all` default is `all` #### Data Parameters ```javascript { name: text, maximum 256 characters, optional email: text, maximum 256 characters, optional password: text, minimum 8 characters, optional enabled: boolean, default true additional_property_value: text, maximum 512 characters, optional, set if additional_property_name is set in the config file scope: [ // Array of strings ] } ``` #### Success response Code 200 #### Error Response Code 404 Resource not found Code 400 Error input parameters Content: json array containing all errors ### Delete an existing user #### URL `/api/user/{login}?source` #### Method `DELETE` #### Security Scope required: `g_admin` #### URL Parameters Required `login`: user login Optional `source`: source to get the user data: vaues can be `database`, `ldap` or `all` default is `all` #### Success response Code 200 #### Error Response Code 404 Resource not found ### Get an existing user's refresh token list #### URL `/api/user/{login}/refresh_token/` #### Method `GET` #### Security Scope required: `g_admin` #### Success response Code 200 Content ```javascript [ { token_hash: text, authorization_type: text, ip_source: text, enabled: boolean, issued_at: numeric, last_seen: numeric, expired_at: numeric } ] ``` ### Revoke a refresh token from an existing user's list #### URL `/api/user/{login}/refresh_token/` #### Method `DELETE` #### Security Scope required: `g_admin` #### Data Parameters ```javascript { token_hash: text, required } ``` #### Success response Code 200 ### Get an existing user's session list #### URL `/api/user/{login}/session/` #### Method `GET` #### Security Scope required: `g_admin` #### Success response Code 200 Content ```javascript [ { session_hash: text, ip_source: text, enabled: boolean, issued_at: numeric, last_seen: numeric, expired_at: numeric } ] ``` ### Revoke a session from an existing user's list #### URL `/api/user/{login}/session/` #### Method `DELETE` #### Security Scope required: `g_admin` #### Data Parameters ```javascript { session_hash: text, required } ``` #### Success response Code 200 ### Send an email to reset a user's password #### URL `/user/{username}/reset_password` #### Method `POST` #### Security Scope required: `g_admin` #### URL Parameters `username`: a valid username that has en email registered #### Success response Code 200 #### Error response Code 400 Username specified has no e-mail. ## Client API The client API allows client CRUD. You can have LDAP or Database backend to store clients, or both. If you ose both, then the LDAP backend is checked first, if no client with this credentials exist, then the Database backend is checked. If you use the LDAP backend, make sure that the client specified in `bind_dn` config file parameter has proper credentials to list, create, modify and update entries. ### Get the list of clients #### URL `/api/client?source&search&offset&limit` #### Method `GET` #### Security Scope required: `g_admin` #### URL Parameters Optional `source`: source to get the client data: vaues can be `database`, `ldap` or `all` default is `all` `search`: search pattern for name, description or client_id. API will return any client that match the corresponding pattern. `offset`: offset to start the list result, default is 0 `limit`: number of users to list, default is 20 #### Success response Code 200 Content ```javascript [ // An array of client objects { source: text, name: text, description: text, client_id: text, confidential: boolean, enabled: boolean, scope: [ // Array of strings ], redirect_uri: [ { name: text, uri: text, enabled: true } ], authorization_type: [ // Array of strings ] } ] ``` ### Get a specific client #### URL `/api/client/{client_id}?source` #### Method `GET` #### Security Scope required: `g_admin` #### URL Parameters Required `client_id`: client_id Optional `source`: source to get the client data: vaues can be `database`, `ldap` or `all` default is `all` #### Success response Code 200 Content ```javascript { source: text, name: text, description: text, client_id: text, confidential: boolean, enabled: boolean, scope: [ // Array of strings ], redirect_uri: [ { name: text, uri: text, enabled: true } ], authorization_type: [ // Array of strings ] } ``` #### Error Response Code 404 Resource not found ### Create a new client #### URL `/api/client` #### Method `POST` #### Security Scope required: `g_admin` #### Data Parameters ```javascript { source: text, optional, values can be "ldap" or "database", default is "database" name: text, maximum 128 characters, mandatory description: text, maximum 256 characters, optional client_id: text, maximum 128 characters, must be unique, mandatory confidential: boolean, optional, default false enabled: boolean, optional, default true password: text, minimum 8 characters, mandatory if confidential is true scope: [ // Array of strings, at least one value is mandatory if confidential is true ], redirect_uri: [ // Array of redirect_uri, at least one value is mandatory { name: text, maximum 128 characters, mandatory, must be unique within the client uri: text, maximum 512 characters, mandatory enabled: boolean, optional, default true } ], authorization_type: [ // Array of strings, must be valid authorization_type ] } ``` #### Success response Code 200 #### Error Response Code 400 Error input parameters Content: json array containing all errors ### Update an existing client If no password is specified in the request, the password is not changed. #### URL `/api/client/{client_id}?source` #### Method `PUT` #### Security Scope required: `g_admin` #### URL Parameters Required `client_id`: client client_id Optional `source`: source to get the client data: vaues can be `database`, `ldap` or `all` default is `all` #### Data Parameters ```javascript { name: text, maximum 128 characters, mandatory description: text, maximum 256 characters, optional client_id: text, maximum 128 characters, must be unique, mandatory confidential: boolean, optional, default false enabled: boolean, optional, default true password: text, minimum 8 characters, mandatory if confidential is true scope: [ // Array of strings, at least one value is mandatory if confidential is true ], redirect_uri: [ // Array of redirect_uri, at least one value is mandatory { name: text, maximum 128 characters, mandatory, must be unique within the client uri: text, maximum 512 characters, mandatory enabled: boolean, optional, default true } ], authorization_type: [ // Array of strings, must be valid authorization_type ] } ``` #### Success response Code 200 #### Error Response Code 404 Resource not found Code 400 Error input parameters Content: json array containing all errors ### Delete an existing client #### URL `/api/client/{client_id}?source` #### Method `DELETE` #### Security Scope required: `g_admin` #### URL Parameters Required `client_id`: client client_id Optional `source`: source to get the client data: vaues can be `database`, `ldap` or `all` default is `all` #### Success response Code 200 #### Error Response Code 404 Resource not found ## Resource API These endpoints allows resource management, although since tokens are JWT, there is no need for resource services to contact Glewlwyd, so it's just an FYI. ### List available resources #### URL `/api/resource` #### Method `GET` #### Security Scope required: `g_admin` #### Success response Code 200 Content ```javascript [ { name: text, description: text, uri: text } ] ``` ### Get a specific resource #### URL `/api/resource/{resource_name}` #### Method `GET` #### Security Scope required: `g_admin` #### URL Parameters Required `resource_name`: name of the resource #### Success response Code 200 Content ```javascript { name: text, description: text, uri: text } ``` #### Error Response Code 404 Resource not found ### Add a new resource #### URL `/api/resource` #### Method `POST` #### Security Scope required: `g_admin` #### Data Parameters ```javascript { name: text, maximum 128 characters, mandatory description: text, maximum 256 characters, optional uri: text, maximum 128 characters, mandatory } ``` #### Success response Code 200 #### Error Response Code 400 Error input parameters Content: json array containing all errors ### Update an existing resource #### URL `/api/resource/{resource_name}` #### Method `PUT` #### Security Scope required: `g_admin` #### URL Parameters Required `resource_name`: name of the resource #### Data Parameters ```javascript { description: text, maximum 256 characters, optional uri: text, maximum 128 characters, mandatory } ``` #### Success response Code 200 #### Error Response Code 404 Resource not found Code 400 Error input parameters Content: json array containing all errors ### Delete an existing resource #### URL `/api/resourceError binding to ldap server mode/:resource_name` #### Method `DELETE` #### Security Scope required: `g_admin` #### URL Parameters Required `resource_name`: name of the resource #### Success response Code 200 #### Error Response Code 404 Resource not found glewlwyd-1.3.1/INSTALL.md000066400000000000000000000421211322667720100150100ustar00rootroot00000000000000# Installation ## Debian-ish packages [![Packaging status](https://repology.org/badge/vertical-allrepos/glewlwyd.svg)](https://repology.org/metapackage/glewlwyd) Glewlwyd is now available in Debian Buster (testing) and some Debian based distributions. To install it on your device, use the following command as root: ```shell # apt install glewlwyd ``` Then, you must initialize your database, setup your jwt key and setup your `glewlwyd.conf` file ## Docker [Rafael](https://github.com/rafaelhdr/) is currently working on a [docker image](https://github.com/rafaelhdr/glewlwyd-oauth2-server) for Glewlwyd, Kudos to him! This is a work-in-progress but you already can easily build an image with MariaDB or SQLite3 backend. Check out the documentation for more informations. ## Manual install from Github You must install the following libraries including their header files: ``` libmicrohttpd libjansson libcurl uuid libldap2 libmysqlclient libsqlite3 libconfig libgnutls libssl ``` On a Debian based distribution (Debian, Ubuntu, Raspbian, etc.), you can install those dependencies using the following command: ```shell $ sudo apt-get install libmicrohttpd-dev libjansson-dev libcurl4-gnutls-dev uuid-dev libldap2-dev libmysqlclient-dev libsqlite3-dev libconfig-dev libgnutls28-dev libssl-dev ``` ### Libssl vs libgnutls Both libraries are mentionned required, but you can get rid of libssl if you install `libjwt` with the option `--without-openssl`. `gnutls` 3.5.8 minimum is required. For this documentation to be compatible with most linux distributions (at least the one I use), I don't remove libssl from the required libraries yet. ### Libmicrohttpd bug on POST parameters With Libmicrohttpd 0.9.37 and older version, there is a bug when parsing `application/x-www-form-urlencoded` parameters. This is fixed in later version, from the 0.9.38, so if your Libmicrohttd version is older than that, I suggest getting a newer version of [libmicrohttpd](https://www.gnu.org/software/libmicrohttpd/). ### Build Glewlwyd and its dependencies Download Glewlwyd and its dependendencies hosted on github, compile and install. ```shell # Install libjwt # libtool and autoconf may be required, install them with 'sudo apt-get install libtool autoconf' $ git clone https://github.com/benmcollins/libjwt.git $ cd libjwt/ $ autoreconf -i $ ./configure # use ./configure --without-openssl to use gnutls instead, you must have gnutls 3.5.8 minimum $ make $ sudo make install # Install Orcania $ git clone https://github.com/babelouest/orcania.git $ cd orcania/ $ make $ sudo make install # Install Yder $ git clone https://github.com/babelouest/yder.git $ cd yder/src/ $ make $ sudo make install # Install Ulfius $ git clone https://github.com/babelouest/ulfius.git $ cd ulfius/src/ $ make $ sudo make install # Install Hoel $ git clone https://github.com/babelouest/hoel.git $ cd hoel/src/ $ make $ sudo make install # Install Glewlwyd $ git clone https://github.com/babelouest/glewlwyd.git $ cd glewlwyd/src/ $ make $ sudo make install ``` ## Configuration Copy `glewlwyd.conf.sample` to `glewlwyd.conf`, edit the file `glewlwyd.conf` with your own settings. ### login and grant urls Update the entries `login_url` and `grant_url` in the configuration file to fit your installation, for example: ``` login_url="http://localhost:4593/app/login.html?" grant_url="http://localhost:4593/app/grant.html?" ``` ### Digest algorithm Specify in the config file the parameter `hash_algorithm` to store passwords with sqlite3 backend, and token digests. Algorithms available are SHA1, SHA256, SHA512, MD5. ### Data storage backend initialisation #### TL;DR For a Mariadb/Mysql database, you must create a database or use an existing one first, example: ```sql -- Create database and user CREATE DATABASE `glewlwyd`; GRANT ALL PRIVILEGES ON glewlwyd.* TO 'glewlwyd'@'%' identified BY 'glewlwyd'; GRANT ALL PRIVILEGES ON glewlwyd.* TO 'glewlwyd'@'localhost' identified BY 'glewlwyd'; FLUSH PRIVILEGES; ``` Then, use the script that fit your database backend and Digest algorithm in the [database](database) folder: - `database/init-mariadb.sql` - `database/init-sqlite3-md5.sql` - `database/init-sqlite3-sha.sql` - `database/init-sqlite3-sha256.sql` - `database/init-sqlite3-sha512.sql` ##### Secuity warning! Those scripts create a valid database that allow to use glewlwyd but to avoid potential security issues, you must make the following changes before opening Glewlwyd API to the wild web: - Change the admin password when you connect to the application - Change the redirect_uri value for the client `g_admin` with an absolute redirect_uri value, e.g. `http://localhost:4593/app/`, then uncomment the corresponding line in [glewlwyd.react.js](https://github.com/babelouest/glewlwyd/blob/master/webapp/app/glewlwyd.react.js#L47) and set with your value. - Change the values `login_url` and `grant_url` in your configuration file for absolute urls, e.g. `http://localhost:4593/app/login.html?` #### Detailed installation You can use a MySql/MariaDB database or a SQLite3 database file. Use the dedicated script, `glewlwyd.mariadb.sql` or `glewlwyd.sqlite3.sql` to initialize your database. #### Admin scope value If you want to use a different name for admin scope (default is `g_admin`), you must update the init script before running it, change the last line which reads: ```sql INSERT INTO g_scope (gs_name, gs_description) VALUES ('g_admin', 'Glewlwyd admin scope'); ``` With your own `gs_name` value. #### MySql/MariaDB database initialization Use the script `glewlwyd.mariadb.sql` provided to initialize the MySql/MariaDB database table. The example below creates a database called `glewlwyd` with user/password glewlwyd/glewlwyd. ```shell $ mysql mysql> CREATE DATABASE `glewlwyd`; mysql> GRANT ALL PRIVILEGES ON glewlwyd.* TO 'glewlwyd'@'%' identified BY 'glewlwyd'; mysql> FLUSH PRIVILEGES; mysql> USE glewlwyd mysql> SOURCE glewlwyd.mariadb.sql ``` #### SQLite3 database file Use the script `glewlwyd.sqlite3.sql` to initialize the SQLite3 database tables. ```shell $ sqlite3 /var/cache/glewlwyd/glewlwyd.db < glewlwyd.sqlite3.sql ``` #### Register management webapp To be able to connect to the front-end application, you must register it first with the script `database/init.sql`. For example, run this command for the MySql/Mariadb database: ```shell $ mysql glewlwyd < database/init.sql ``` For the sqlite3 database backend, use the following command: ```shell $ sqlite3 /var/cache/glewlwyd/glewlwyd.db < database/init.sql ``` ### Authentication backend configuration For the authentication backend, you can use a LDAP server or your database, or both. If you use both backends, then on an authentication process, the user or the client will be tested in the LDAP first, then in the database if not found. ### Add an administrator user before first use An administrator must be present in the backend to use the application (manage scopes, users, clients, resources, authorization types). An administrator in the LDAP backend is a user who has the `admin_scope` (default `g_admin`) in its scope list. The following examples will add an admin with the login `admin` and the password `password`. #### LDAP Backend administrator Scope list is stored in the parameter `scope_property_user_read` (`o` by default). #### Database Backend administrator (MySql/MariaDB) To add an administrator in the MySql/MariaDB database, connect to the databse and use the following command (update with your own e-mail and password values): ```sql $ mysql mysql> INSERT INTO g_user (gu_login, gu_name, gu_email, gu_password, gu_enabled) VALUES ('admin', 'The Boss', 'boss@glewlwyd.domain', PASSWORD('password'), 1); mysql> INSERT INTO g_user_scope (gu_id, gs_id) VALUES ((SELECT gu_id from g_user WHERE gu_login='admin'), (SELECT gs_id from g_scope WHERE gs_name='g_admin')); mysql> INSERT INTO g_user_scope (gu_id, gs_id) VALUES ((SELECT gu_id from g_user WHERE gu_login='admin'), (SELECT gs_id from g_scope WHERE gs_name='g_profile')); ``` #### Database Backend administrator (SQLite3) Since SQLite3 uses the `hash_algorithm` value to store its password, you must store the password with the correct hashed value. Use the following list for the initial password (don't forget the prefix): ``` value 'password' hashed using different algorithms: - MD5: {MD5}X03MO1qnZdYdgyfeuILPmQ== - SHA1: {SHA}W6ph5Mm5Pz8GgiULbPgzG37mj9g= - SHA256: {SHA256}XohImNooBHFR0OVvjcYpJ3NgPQ1qq73WKhHvch0VQtg= - SHA512: {SHA512}sQnzu7wkTrgkQZF+0G1hi5AI3Qmzvv0bXgc5THBqi7mAsdd4Xll27ASbRt9fEyavWi6m0QP9B8lThf+rDKy8hg== ``` To add an administrator in the SQLite3 database, connect to the databse and use the following command (update with your own e-mail and password values): ```sql $ sqlite sqlite> INSERT INTO g_user (gu_login, gu_name, gu_email, gu_password, gu_enabled) VALUES ('admin', 'The Boss', 'boss@glewlwyd.domain', '{MD5}X03MO1qnZdYdgyfeuILPmQ==', 1); sqlite> INSERT INTO g_user_scope (gu_id, gs_id) VALUES ((SELECT gu_id from g_user WHERE gu_login='admin'), (SELECT gs_id from g_scope WHERE gs_name='g_admin')); sqlite> INSERT INTO g_user_scope (gu_id, gs_id) VALUES ((SELECT gu_id from g_user WHERE gu_login='admin'), (SELECT gs_id from g_scope WHERE gs_name='g_profile')); ``` ### JWT configuration You can choose between SHA (HS256, HS384, HS512), RSA (RS256, RS384, RS512) and ECDSA (ES256, ES384, ES512) anglorithms to sign the tokens. Note that if you use SHA, you will need to share the `sha_secret` value with the resource providers and keep it safe in all places. If you use RSA or ECDSA algorithm, you will need to share the public key specified in `[rsa|ecdsa]_pub_file` with resource providers, and you will need to keep the private key `[rsa|ecdsa]_key_file` safe. The values available for the parameter `key_size` are 256, 284 and 512 only. To choose your signature algorithm, set the value `true` to the parameter `use_[rsa|ecdsa|sha]` you want, and `false` to the other ones. Finally, set the additional parameter used for your algorithm: - `*_key_file` and `*_pub_file` if you choose ECDSA or RSA signatures, with the path to the public and private signature files - `sha_secret` if you choose SHA signatures, with the value of the secret #### RSA private/public key creation You can use the following example commands to create a pair of private and public keys for the algorithms RSA or ECDSA: ```SHELL $ # RS512 $ # private key $ openssl genrsa -out private-rsa.key 4096 $ # public key $ openssl rsa -in private-rsa.key -outform PEM -pubout -out public-rsa.pem $ # ES512 $ # private key $ openssl ecparam -genkey -name secp521r1 -noout -out private-ecdsa.key $ # public key $ openssl ec -in private-ecdsa.key -pubout -out public-ecdsa.pem ``` For more information about generating keys, see [OpenSSL Documentation](https://www.openssl.org/docs/) ### Install service The files `glewlwyd-init` (SysV init) and `glewlwyd.service` (Systemd) can be used to have glewlwyd as a daemon. They are fitted for a Raspbian distrbution, but can easily be changed for other systems. #### Install as a SysV init daemon and run ```shell $ sudo cp glewlwyd-init /etc/init.d/glewlwyd $ sudo update-rc.d glewlwyd defaults $ sudo service glewlwyd start ``` #### Install as a Systemd daemon and run ```shell $ sudo cp glewlwyd.service /etc/systemd/system $ sudo systemctl enable glewlwyd $ sudo sudo systemctl start glewlwyd ``` ## Run Glewlwyd Run the application using the service command if you installed the init file: ```shell $ sudo service glewlwyd start ``` You can also manually start the application like this: ```shell $ ./glewlwyd --config-file=glewlwyd.conf ``` By default, Glewlwyd is available on TCP port 4593. You can use the test page `tests/test-token.html` to validate the behaviour. To access it, copy the file into webapp and go to the url: [http://localhost:4593/app/test-token.html](http://localhost:4593/app/test-token.html). ## SSL/TLS OAuth 2 specifies that a secured connection is mandatory, via SSL or TLS, to avoid data and token to be stolen, or Man-In-The-Middle attacks. Glewlwyd supports starting a secure connection with a private/public key certificate, but it also can be with a classic non-secure HTTP connection, and be available to users behind a HTTPS proxy. ## Resource server authorization usage and access tokens Glewlwyd provides [JSON Web Tokens](https://jwt.io/) which is a standard way to validate a token without asking the authorization server. A JSON Web Token (JWT) comes with a signature that authenticates itself. There is no way for a resource server to determine if a token is valid, except by checking the Authorization token. i.e., there is no API where you could ask Glewlwyd server if an access token is valid or not. Therefore, the resource server MUST verify the access token using its signature. Examples of resource server access token validation are available in the folder [clients](https://github.com/babelouest/glewlwyd/tree/master/clients/). There are 2 ways to sign a token: - SHA symetric encryption - RSA asymetric encryption The token parameters are located in the `jwt` block in the configuration file: ``` jwt = { use_rsa = true rsa_key_file = "/usr/local/etc/glewlwyd/private.key" rsa_pub_file = "/usr/local/etc/glewlwyd/public.pem" use_sha = false sha_secret = "secret" } ``` Depending on the algorithm you choose, you will need to share information with the resource services. - With RSA encryption, the resource service will have to authenticate the tokens using the `rsa_pub_file` file content, you will have to keep secret the `rsa_key_file` file content to prevent token forgery. - With SHA encryption, the resource service will have to authenticate the tokens using the `sha_secret` value, you must share the `sha_secret` value between the authentication server and the resource services, and keep it private between them to prevent token forgery. In your resource server, you must validate all API call with the token given in the `Authorization` header as described in [RFC6750](https://tools.ietf.org/html/rfc6750). You can use a jwt library available for the language and architecture of your choice, to validate the token signature and content. If the token signature is verified, you MUST manually validate the token time validity using the values `iat` and `expires_in` in the token payload. Every `access_token` has the following header and payload format: ```javascript // Header { "typ": "JWT", "alg": "RS512" // for RSA signatures, HS512 for SHA signatures } // Payload { "expires_in": 3600, // Token expiration in seconds, default is 1 hour "iat": 1484278795, // Issued at, time in UNIX epoch format "salt": "abcd1234", // A random string "scope": "scope1 scope2", // The scope values "type": "access_token", // The token type "username": "admin" // The username who was granted access for this scope } ``` Refresh and session tokens are also JWTs, but their payload have slightly different values. A session token doesn't have a scope value, and the `type` values are respectively `refresh_token` and `session_token`. Although these tokens are validated by the Glewlwyd server directly. ## Front-end application All front-end pages have a minimal design, feel free to modify them for your own need, or create your own application. ### Glewlwyd manager Glewlwyd comes with a small front-end that uses the backend API to manage profile, users, clients, scopes, resources and authorization types. #### Configuration The config file `glewlwyd.conf` contains the following variables: `static_files_path` and `static_files_prefix`, `static_files_path` is the path to the front-end application. Set it to the location of your webapp folder before running glewlwyd, e.g. `"/home/pi/glewlwyd/webapp"`, `static_files_prefix` will be the url path to access to the front-end application, default is [http://localhost:4953/app/](http://localhost:4953/app/). #### Change front-end path If you want to change the path to the front-end application, e.g. change it from http://localhost:4953/app/ to http://localhost:4953/admin/ for example, there are 2 steps to follow. - 1: Change the values `static_files_prefix`, `login_url` and `grant_url` in the confguration file The value `static_files_prefix` must match your new path, e.g. `admin`, the `login_url` and `grant_url` must be changed accordingly, e.g. `"../admin/login.html?"` and `"../admin/grant.html?"`. - 2: Change the `redirect_uri` value of the g_admin client in the database, e.g.: ```SQL UPDATE g_redirect_uri set gru_uri='../admin/index.html' where gc_id=(SELECT gc_id from g_client WHERE gc_client_id='g_admin'); ``` #### Scope To connect to the management application, you must use a user that have `g_admin` scope. The front-end management application is a tiny single page app (SPA) written in ReactJS/JQuery, responsive as much as I can, not the best design in the world, but useful anyway. ### tests/test-token.html This page is here only for oauth2 tests and behaviour validation. If you want to use it, you need to update the `glewlwyd_api` value and all parameters provided, such as `redirect_uri`, `scope` and `client`. Beware, all password inputs are of type `text`, so a typed password is not hidden from a hidden third-party dangerous predator. glewlwyd-1.3.1/LICENSE000066400000000000000000001045731322667720100143770ustar00rootroot00000000000000Copyright 2016-2017 Nicolas Mora mail@babelouest.org GNU 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. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU 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 Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. {one line to give the program's name and a brief idea of what it does.} Copyright (C) {year} {name of author} This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: {project} Copyright (C) {year} {fullname} This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . glewlwyd-1.3.1/Makefile000066400000000000000000000022711322667720100150220ustar00rootroot00000000000000# # Glewlwyd OAuth2 Authorization Server # # Makefile used to build the software # # Copyright 2016 Nicolas Mora # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU GENERAL PUBLIC LICENSE # License as published by the Free Software Foundation; # version 3 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU GENERAL PUBLIC LICENSE for more details. # # You should have received a copy of the GNU General Public # License along with this program. If not, see . # GLEWLWYD_SOURCE=./src GLEWLWYD_TESTS=./test all: cd $(GLEWLWYD_SOURCE) && $(MAKE) debug: cd $(GLEWLWYD_SOURCE) && $(MAKE) debug install: cd $(GLEWLWYD_SOURCE) && $(MAKE) install memcheck: cd $(GLEWLWYD_SOURCE) && $(MAKE) memcheck test-debug: cd $(GLEWLWYD_SOURCE) && $(MAKE) test-debug test: cd $(GLEWLWYD_TESTS) && $(MAKE) test clean: cd $(GLEWLWYD_SOURCE) && $(MAKE) clean cd $(GLEWLWYD_TESTS) && $(MAKE) clean glewlwyd-1.3.1/OAUTH2.md000066400000000000000000000231121322667720100146430ustar00rootroot00000000000000# Glewlwyd OAuth 2 endpoints specifications This document is intended to describe Glewlwyd oauth 2 implementation. OAuth endpoints are used to authenticate the user, and to send tokens or other authentication and identification data. The complete specification is available in the [OAuth 2 RFC document](https://tools.ietf.org/html/rfc6749). If you see an issue or have a question on Glewlwyd OAuth 2 implementation, you can open an issue or send an email at the following address [mail@babelouest.org](mail@babelouest.org). ## Endpoints authentication Authentication has different faces, and differs with the authorization scheme. ## Prefix All URIs are based on the prefix you will setup. In this document, all API endpoints will assume they use the prefix `/glewlwyd`, and all static file endpoints will assume they use the prefix `/app`. ## Login and grant URIs In this document, the login URI will be displayed as `http://login.html` and the grant URI will be displayed as `http://grant.html`, this will be replaced by the values from your environment that you can define in the config file. ## Scope In this document, we assume that scope is enabled in glewlwyd server configuration. If scope is disabled, then all scope values will be ignored in all requests and no scope will be sent in the responses. ## OAuth 2 endpoints ### Authorization endpoint This is a multi-method, multi-parameters, versatile endpoint, used to provide authentication management. It handles the following authorization schemes as describe in the [OAuth 2 RFC document](https://tools.ietf.org/html/rfc6749): - Authorization Code Grant (Authorization part) - Implicit Grant #### URL `/glewlwyd/auth` #### Method `GET` ### Token endpoint This endpoint is used to provide tokens to the user. It handles the following authorization schemes as describe in the [OAuth 2 RFC document](https://tools.ietf.org/html/rfc6749): - Authorization Code Grant (Access Token part) - Resource Owner Password Credentials Grant - Client Credentials Grant - Refreshing a token - Deleting a token #### URL `/glewlwyd/token` #### Method `POST` ## OAuth 2 schemes Each scheme is described in the following chapter. The description may not be as complete as the [OAuth 2 RFC document](https://tools.ietf.org/html/rfc6749), consider the RFC as the authority standard. ### Authorization code grant - Authorization request #### URL `/glewlwyd/auth` #### Method `GET` #### URL Parameters Required ``` `response_type`: text, must be set to `code` `client_id`: text, client_id that sends the request on behalf of the resource owner, must be a valid client_id `redirect_uri`: text, redirect_uri to send the resource owner to after the connection, must ba a valid redirect_uri for the specified client_id `scope`: text, scope list that the resource owner will grant access to the client, multiple scope values must be separated by a space ``` Optional `state`: text, an identifier used to prevent requests collisions and bypass, will be sent back as is to the client #### Result ##### Resource owner not authenticated Code 302 Resource owner is not authenticated with a valid session token. Redirect to `http://login.html?client_id={client_id}&redirect_uri={redirect_uri}&scope={scope}&additional_parameters` for authentication. See login paragraph for details. ##### Scope not granted to the client Code 302 Redirect to `http://grant.html?client_id={client_id}&redirect_uri={redirect_uri}&scope={scope}&additional_parameters` for grant access. See grant paragraph for details. ##### Success response Code 302 Redirect to `redirect_uri`#code=`code`&state=`state` with `redirect_uri` specified in the request, a `code` generated for the access, and the state specified in the request if any. ##### Error Scope Scope is not allowed for this user Code 302 Redirect to `redirect_uri`#error=invalid_scope&state=`state` with `redirect_uri` specified in the request, `invalid_scope` as error value, and the state specified in the request if any. ##### Error client Client is invalid, redirect_uri is invalid for this client, or client is not allowed to use this scheme Code 302 Redirect to `redirect_uri`#error=unauthorized_client&state=`state` with `redirect_uri` specified in the request, `unauthorized_client` as error value, and the state specified in the request if any. ### Authorization code grant - Authorization Response #### URL `/glewlwyd/token` #### Method `POST` #### Security If `client_id` refers to a confidential client, then client_id and client_password must be sent via Basic HTTP Auth. #### Data Parameters Request body arameters must be encoded using the `application/x-www-form-urlencoded` format. ``` grant_type: text, must be set to "authorization_code". code: text, required redirect_uri: text, must be same redirect_uri used in the authorization request that sent back this code client_id: text, must be the same client_id used in the authorization request that sent back this code ``` #### Success response Code 200 Content ```javascript { "access_token":text, jwt token "token_type":text, value is "bearer", "expires_in":number, set by server configuration "refresh_token":text, jwt token } ``` #### Error Response Code 400 Error input parameters The combination code/redirect_uri/client_id is incorrect. ### Implicit Grant #### URL `/glewlwyd/auth` #### Method `GET` #### URL Parameters Required ``` `response_type`: text, must be set to `token` `client_id`: text, client_id that sends the request on behalf of the resource owner, must be a valid client_id `redirect_uri`: text, redirect_uri to send the resource owner to after the connection, must ba a valid redirect_uri for the specified client_id `scope`: text, scope list that the resource owner will grant access to the client, multiple scope values must be separated by a space ``` Optional `state`: text, an identifier used to prevent requests collisions and bypass, will be sent back as is to the client #### Result ##### Resource owner not authenticated Code 302 Resource owner is not authenticated with a valid session token. Redirect to `http://login.html?client_id={client_id}&redirect_uri={redirect_uri}&scope={scope}&additional_parameters` for authentication. See login paragraph for details. ##### Scope not granted to the client Code 302 Redirect to `http://grant.html?client_id={client_id}&redirect_uri={redirect_uri}&scope={scope}&additional_parameters` for grant access. See grant paragraph for details. ##### Success response Code 302 Redirect to `redirect_uri`#token=`token`&state=`state` with `redirect_uri` specified in the request, a `code` generated for the access, and the state specified in the request if any. ##### Error Scope Scope is not allowed for this user Code 302 Redirect to `redirect_uri`#error=invalid_scope&state=`state` with `redirect_uri` specified in the request, `invalid_scope` as error value, and the state specified in the request if any. ##### Error client Client is invalid, redirect_uri is invalid for this client, or client is not allowed to use this scheme Code 302 Redirect to `redirect_uri`#error=unauthorized_client&state=`state` with `redirect_uri` specified in the request, `unauthorized_client` as error value, and the state specified in the request if any. ### Resource Owner Password Credentials Grant #### URL `/glewlwyd/token` #### Method `POST` #### Data Parameters Request body arameters must be encoded using the `application/x-www-form-urlencoded` format. ``` grant_type: text, must be set to "password". username: text password: text scope: text ``` #### Success response Code 200 Content ```javascript { "access_token":text, jwt token "token_type":text, value is "bearer", "expires_in":number, set by server configuration "refresh_token":text, jwt token } ``` #### Error Response Code 403 username or password invalid. ### Client Credentials Grant #### URL `/glewlwyd/token` #### Method `POST` #### Security HTTP Basic authentication with client_id/client_password credentials. Client_id must be set as confidential #### URL Parameters Required Optional #### Data Parameters Request body arameters must be encoded using the `application/x-www-form-urlencoded` format. ``` grant_type: text, must be set to "client_credentials". scope: text ``` #### Success response Code 200 Content ```javascript { "access_token":text, jwt token "token_type":text, value is "bearer", "expires_in":number, set by server configuration } ``` #### Error Response Code 403 Access denied ### Refresh token Send a new access_token based on a valid reresh_token #### URL `/glewlwyd/token` #### Method `POST` #### Data Parameters Request body arameters must be encoded using the `application/x-www-form-urlencoded` format. ``` grant_type: text, must be set to "refresh_token". refresh_token: text, a valid refres_token, mandatory scope: text, must the same scope or a sub scope of the scope used to provide the refresh_token, optional ``` #### Success response Code 200 Content ```javascript { "access_token":text, jwt token "token_type":text, value is "bearer", "expires_in":number, set by server configuration } ``` #### Error Response Code 400 Error input parameters ### Invalidate refresh token Mark a refresh_token as invalid, to prevent further access_toen to be generated #### URL `/glewlwyd/token` #### Method `POST` #### Data Parameters Request body arameters must be encoded using the `application/x-www-form-urlencoded` format. ``` grant_type: text, must be set to "delete_token". refresh_token: text, a valid refres_token, mandatory ``` #### Success response Code 200 #### Error Response Code 400 Error input parameters glewlwyd-1.3.1/README.md000066400000000000000000000063331322667720100146440ustar00rootroot00000000000000# Glewlwyd Oauth 2 authentication server [Oauth 2](https://oauth.net/2/) Server providing [JSON Web Tokens](https://jwt.io/) for identification. Lightweight, fast and easy to install on small systems. Requires a MySql or SQLite3 database. Handles LDAP or database for users backend. The API backend is fully written in language C, it's based on [Ulfius](https://github.com/babelouest/ulfius) HTTP framework, [Hoel](https://github.com/babelouest/hoel) database framework and [Libjwt](https://github.com/benmcollins/libjwt.git) JSON Web Tokens library. ![user list screenshot](https://raw.githubusercontent.com/babelouest/glewlwyd/master/screenshots/g_1_users.png) ## Installation Please read the [INSTALL.md](INSTALL.md) file for more information. ## Screenshots Some screenshots examples: ![User details page](https://github.com/babelouest/glewlwyd/raw/master/screenshots/g_2_user_details.png) ![User update](https://github.com/babelouest/glewlwyd/raw/master/screenshots/g_1_users_udate.png) ![Clients list page](https://github.com/babelouest/glewlwyd/raw/master/screenshots/g_3_clients.png) ![Client update](https://github.com/babelouest/glewlwyd/raw/master/screenshots/g_3_clients_update.png) ![Scopes list](https://github.com/babelouest/glewlwyd/raw/master/screenshots/g_4_scopes.png) ![Authorization types](https://github.com/babelouest/glewlwyd/raw/master/screenshots/g_6_auth_types.png) ### Current user All users can also update their own profile with the dedicated page `profile.html`. ![User profile page](https://github.com/babelouest/glewlwyd/raw/master/screenshots/profile.png) ![Update user profile password](https://github.com/babelouest/glewlwyd/raw/master/screenshots/profile_upate_password.png) The pages `login.html`, `grant.html` and `reset.html` are tiny pages used to login, logout, grant scope access or reset a password. ![login](https://github.com/babelouest/glewlwyd/raw/master/screenshots/sign_in.png) ![reset](https://github.com/babelouest/glewlwyd/raw/master/screenshots/password_forgot.png) If a user uses the reset password functionnality, he or she will receive the content of the file `reset.eml`. The email uses two patterns that will be replaced by values: `$USERNAME` for the username and `$URL` for the url to the reset.html page. `$URL` must be set in the configuration file properly so the emails will lead to the correct page. More screenshots of the front-end application are availabe in the [screenshot](https://github.com/babelouest/glewlwyd/tree/master/screenshots) folder. ## Projects using Glewlwyd as authentication server Glewlwyd front-end applications uses glewlwyd to authenticate of course, but other projects are also using it to delegate the authentication and focus on their goals: - [Taliesin](https://github.com/babelouest/taliesin), an audio streaming server - [Angharad](https://github.com/babelouest/angharad), a house automation server to connect and control IOT devices using different protocols (Zwave, Taulas, etc.) - [Hutch](https://github.com/babelouest/hutch), an online password manager ## Questions, problems or feature requests You can open an [issue](https://github.com/babelouest/glewlwyd/issues) in github or send me an [e-mail](mailto:mail@babelouest.org). Any help is much appreciated! glewlwyd-1.3.1/database/000077500000000000000000000000001322667720100151245ustar00rootroot00000000000000glewlwyd-1.3.1/database/README.md000066400000000000000000000031241322667720100164030ustar00rootroot00000000000000# Glewlwyd database scripts This folder contains several scrpts to create or initialize the glewlwyd database. If you use a MariaDB/Mysql database, you must have a valid access to the database first. The following script shows an example of how to create a database called `glewlwyd` with a user `glewlwyd` and a password `glewlwyd` that can be accessible from remote locations or localhost: ```sql -- Create database and user CREATE DATABASE `glewlwyd`; GRANT ALL PRIVILEGES ON glewlwyd.* TO 'glewlwyd'@'%' identified BY 'glewlwyd'; GRANT ALL PRIVILEGES ON glewlwyd.* TO 'glewlwyd'@'localhost' identified BY 'glewlwyd'; FLUSH PRIVILEGES; ``` ## init-[mariadb|sqlite3-md5|sqlite3-sha|sqlite3-sha256|sqlite3-sha512].sql These files are databse creation and initialization scripts used for the type of database you need. The user 'admin' has the password 'password'. Once the database is set and your glewlwyd.conf file is valid, you can start the glewlwyd service and go to the webpage http[s]://localhost:4593/app/index.html. ### Secuity warning! Those scripts create a valid database that allow to use glewlwyd but to avoid huge security issues, you must make 2 changes on your first connection: - Change the admin password when you connect to the application - Change the redirect_uri for the client `g_admin` with your real redirect_uri ## glewlwyd.init-db-only.[mariadb|sqlite3].sql These files create an empty database with only authorization types and default scopes, but with no client or user. ## init-webapp-only.sql This file creates the webapp client values to be able to connect to the admin page glewlwyd-1.3.1/database/glewlwyd.init-db-only.mariadb.sql000066400000000000000000000235001322667720100234050ustar00rootroot00000000000000-- Mysql/MariaDB init script -- Create database and user -- CREATE DATABASE `glewlwyd`; -- GRANT ALL PRIVILEGES ON glewlwyd.* TO 'glewlwyd'@'%' identified BY 'glewlwyd'; -- FLUSH PRIVILEGES; -- USE `glewlwyd`; DROP TABLE IF EXISTS `g_refresh_token_scope`; DROP TABLE IF EXISTS `g_code_scope`; DROP TABLE IF EXISTS `g_code`; DROP TABLE IF EXISTS `g_client_user_scope`; DROP TABLE IF EXISTS `g_client_authorization_type`; DROP TABLE IF EXISTS `g_resource_scope`; DROP TABLE IF EXISTS `g_client_scope`; DROP TABLE IF EXISTS `g_user_scope`; DROP TABLE IF EXISTS `g_client_scope`; DROP TABLE IF EXISTS `g_access_token`; DROP TABLE IF EXISTS `g_refresh_token`; DROP TABLE IF EXISTS `g_session`; DROP TABLE IF EXISTS `g_resource`; DROP TABLE IF EXISTS `g_reset_password`; DROP TABLE IF EXISTS `g_redirect_uri`; DROP TABLE IF EXISTS `g_client`; DROP TABLE IF EXISTS `g_authorization_type`; DROP TABLE IF EXISTS `g_scope`; DROP TABLE IF EXISTS `g_user`; -- ----------- -- -- Data tables -- -- ----------- -- -- User table, contains registered users with their password encrypted CREATE TABLE `g_user` ( `gu_id` INT(11) PRIMARY KEY AUTO_INCREMENT, `gu_name` VARCHAR(512) DEFAULT '', `gu_email` VARCHAR(512) DEFAULT '', `gu_login` VARCHAR(128) NOT NULL UNIQUE, `gu_password` VARCHAR(128) NOT NULL, `gu_additional_property_value` VARCHAR(512), `gu_enabled` TINYINT(1) DEFAULT 1 ); CREATE INDEX `i_g_user_name` ON `g_user`(`gu_name`); CREATE INDEX `i_g_user_login` ON `g_user`(`gu_login`); -- Scope table, contain all scope values available CREATE TABLE `g_scope` ( `gs_id` INT(11) PRIMARY KEY AUTO_INCREMENT, `gs_name` VARCHAR(128) NOT NULL, `gs_description` VARCHAR(512) DEFAULT '' ); CREATE INDEX `i_g_scope_name` ON `g_scope`(`gs_name`); -- Authorization type table, to store authorization type available CREATE TABLE `g_authorization_type` ( `got_id` INT(11) PRIMARY KEY AUTO_INCREMENT, `got_code` INT(2) NOT NULL UNIQUE, -- 0: Authorization Code Grant, 1: Code Grant, 2: Implicit Grant, 3: Resource Owner Password Credentials Grant, 4: Client Credentials Grant `got_name` VARCHAR(128) NOT NULL, `got_description` VARCHAR(512) DEFAULT '', `got_enabled` TINYINT(1) DEFAULT 1 ); CREATE INDEX `i_g_authorization_name` ON `g_authorization_type`(`got_name`); CREATE INDEX `i_g_authorization_code` ON `g_authorization_type`(`got_code`); -- Client table, contains all registered clients with their client_id CREATE TABLE `g_client` ( `gc_id` INT(11) PRIMARY KEY AUTO_INCREMENT, `gc_name` VARCHAR(128) NOT NULL, `gc_description` VARCHAR(512) DEFAULT '', `gc_client_id` VARCHAR(128) NOT NULL UNIQUE, `gc_client_password` VARCHAR(128), `gc_confidential` TINYINT(1) DEFAULT 0, `gc_enabled` TINYINT(1) DEFAULT 1 ); CREATE INDEX `i_g_client_name` ON `g_client`(`gc_name`); CREATE INDEX `i_g_client_id` ON `g_client`(`gc_client_id`); -- Resource table, contains all registered resource server CREATE TABLE `g_resource` ( `gr_id` INT(11) PRIMARY KEY AUTO_INCREMENT, `gr_name` VARCHAR(128) NOT NULL UNIQUE, `gr_description` VARCHAR(512) DEFAULT '', `gr_uri` VARCHAR(512) ); CREATE INDEX `i_g_resource_name` ON `g_resource`(`gr_name`); -- Redirect URI, contains all registered redirect_uti values for the clients CREATE TABLE `g_redirect_uri` ( `gru_id` INT(11) PRIMARY KEY AUTO_INCREMENT, `gc_id` INT(11) NOT NULL, `gru_name` VARCHAR(128) NOT NULL, `gru_uri` VARCHAR(512), FOREIGN KEY(`gc_id`) REFERENCES `g_client`(`gc_id`) ON DELETE CASCADE ); -- Reset a user password CREATE TABLE `g_reset_password` ( `grp_id` INT(11) PRIMARY KEY AUTO_INCREMENT, `grp_username` VARCHAR(128) NOT NULL, `grp_ip_source` VARCHAR(64) NOT NULL, `grp_token` VARCHAR(512) NOT NULL, `grp_enabled` TINYINT(1) DEFAULT 1, `grp_issued_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, `grp_reset_at` TIMESTAMP NULL ); CREATE INDEX `i_g_reset_password_username` ON `g_reset_password`(`grp_username`); -- ------------ -- -- Token tables -- -- ------------ -- -- Refresh token table, to store a signature and meta information on all refresh tokens sent CREATE TABLE `g_refresh_token` ( `grt_id` INT(11) PRIMARY KEY AUTO_INCREMENT, `grt_hash` VARCHAR(128) NOT NULL, `grt_authorization_type` INT(2) NOT NULL, -- 0: Authorization Code Grant, 1: Implicit Grant, 2: Resource Owner Password Credentials Grant, 3: Client Credentials Grant `grt_username` VARCHAR(128) NOT NULL, `gc_client_id` VARCHAR(128), `grt_issued_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, `grt_last_seen` TIMESTAMP NULL, `grt_expired_at` TIMESTAMP NULL, `grt_ip_source` VARCHAR(64) NOT NULL, `grt_enabled` TINYINT(1) DEFAULT 1 ); -- Access token table, to store meta information on access tokensw sent CREATE TABLE `g_access_token` ( `gat_id` INT(11) PRIMARY KEY AUTO_INCREMENT, `grt_id` INT(11), `gat_authorization_type` INT(2) NOT NULL, -- 0: Authorization Code Grant, 1: Implicit Grant, 2: Resource Owner Password Credentials Grant, 3: Client Credentials Grant `gat_issued_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, `gat_ip_source` VARCHAR(64) NOT NULL, FOREIGN KEY(`grt_id`) REFERENCES `g_refresh_token`(`grt_id`) ON DELETE CASCADE ); CREATE INDEX `i_g_refresh_token_username` ON `g_refresh_token`(`grt_username`); -- Session table, to store signature and meta information on session tokens sent CREATE TABLE `g_session` ( `gss_id` INT(11) PRIMARY KEY AUTO_INCREMENT, `gss_hash` VARCHAR(128) NOT NULL, `gss_username` VARCHAR(128) NOT NULL, `gss_issued_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, `gss_last_seen` TIMESTAMP NULL, `gss_expired_at` TIMESTAMP NULL, `gss_ip_source` VARCHAR(64) NOT NULL, `gss_enabled` TINYINT(1) DEFAULT 1 ); CREATE INDEX `i_g_session_username` ON `g_session`(`gss_username`); -- -------------- -- -- Linking tables -- -- -------------- -- -- User scope table, to store scope available for each user CREATE TABLE `g_user_scope` ( `gus_id` INT(11) PRIMARY KEY AUTO_INCREMENT, `gu_id` INT(11) NOT NULL, `gs_id` INT(11) NOT NULL, FOREIGN KEY(`gu_id`) REFERENCES `g_user`(`gu_id`) ON DELETE CASCADE, FOREIGN KEY(`gs_id`) REFERENCES `g_scope`(`gs_id`) ON DELETE CASCADE ); -- Client scope table, to store scope available for a client on client authentication CREATE TABLE `g_client_scope` ( `gcs_id` INT(11) PRIMARY KEY AUTO_INCREMENT, `gc_id` INT(11) NOT NULL, `gs_id` INT(11) NOT NULL, FOREIGN KEY(`gc_id`) REFERENCES `g_client`(`gc_id`) ON DELETE CASCADE, FOREIGN KEY(`gs_id`) REFERENCES `g_scope`(`gs_id`) ON DELETE CASCADE ); -- Resource scope table, to store scope required for a resource service CREATE TABLE `g_resource_scope` ( `grs_id` INT(11) PRIMARY KEY AUTO_INCREMENT, `gr_id` INT(11) NOT NULL, `gs_id` INT(11) NOT NULL, FOREIGN KEY(`gr_id`) REFERENCES `g_resource`(`gr_id`) ON DELETE CASCADE, FOREIGN KEY(`gs_id`) REFERENCES `g_scope`(`gs_id`) ON DELETE CASCADE ); -- Client authorization type table, to store authorization types available for the client CREATE TABLE `g_client_authorization_type` ( `gcat_id` INT(11) PRIMARY KEY AUTO_INCREMENT, `gc_client_id` VARCHAR(128) NOT NULL, `got_id` INT(11) NOT NULL, FOREIGN KEY(`got_id`) REFERENCES `g_authorization_type`(`got_id`) ON DELETE CASCADE ); -- Client user scope table, to store the authorization of the user to use scope for this client CREATE TABLE `g_client_user_scope` ( `gcus_id` INT(11) PRIMARY KEY AUTO_INCREMENT, `gc_client_id` VARCHAR(128) NOT NULL, `gco_username` VARCHAR(128) NOT NULL, `gs_id` INT(11) NOT NULL, FOREIGN KEY(`gs_id`) REFERENCES `g_scope`(`gs_id`) ON DELETE CASCADE ); CREATE INDEX `i_g_client_user_scope_username` ON `g_client_user_scope`(`gco_username`); -- Code table, used to store auth code sent with response_type code and validate it with response_type authorization_code CREATE TABLE `g_code` ( `gco_id` INT(11) PRIMARY KEY AUTO_INCREMENT, `gco_date` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, `gco_code_hash` VARCHAR(128) NOT NULL, `gco_ip_source` VARCHAR(64) NOT NULL, `gco_enabled` TINYINT(1) DEFAULT 1, `gc_client_id` VARCHAR(128) NOT NULL, `gco_username` VARCHAR(128) NOT NULL, `gco_redirect_uri` VARCHAR(512) ); CREATE INDEX `i_g_code_username` ON `g_code`(`gco_username`); -- Code scope table, used to link a generated code to a list of scopes CREATE TABLE `g_code_scope` ( `gcs_id` INT(11) PRIMARY KEY AUTO_INCREMENT, `gco_id` INT(11) NOT NULL, `gs_id` INT(11) NOT NULL, FOREIGN KEY(`gco_id`) REFERENCES `g_code`(`gco_id`) ON DELETE CASCADE, FOREIGN KEY(`gs_id`) REFERENCES `g_scope`(`gs_id`) ON DELETE CASCADE ); -- Refresh token scope table, used to link a generated refresh token to a list of scopes CREATE TABLE `g_refresh_token_scope` ( `grts_id` INT(11) PRIMARY KEY AUTO_INCREMENT, `grt_id` INT(11) NOT NULL, `gs_id` INT(11) NOT NULL, FOREIGN KEY(`grt_id`) REFERENCES `g_refresh_token`(`grt_id`) ON DELETE CASCADE, FOREIGN KEY(`gs_id`) REFERENCES `g_scope`(`gs_id`) ON DELETE CASCADE ); INSERT INTO g_authorization_type (got_name, got_code, got_description) VALUES ('authorization_code', 0, 'Authorization Code Grant - Access token: https://tools.ietf.org/html/rfc6749#section-4.1'); INSERT INTO g_authorization_type (got_name, got_code, got_description) VALUES ('code', 1, 'Authorization Code Grant - Authorization: https://tools.ietf.org/html/rfc6749#section-4.1'); INSERT INTO g_authorization_type (got_name, got_code, got_description) VALUES ('token', 2, 'Implicit Grant: https://tools.ietf.org/html/rfc6749#section-4.2'); INSERT INTO g_authorization_type (got_name, got_code, got_description) VALUES ('password', 3, 'Resource Owner Password Credentials Grant: https://tools.ietf.org/html/rfc6749#section-4.3'); INSERT INTO g_authorization_type (got_name, got_code, got_description) VALUES ('client_credentials', 4, 'Client Credentials Grant: https://tools.ietf.org/html/rfc6749#section-4.4'); INSERT INTO g_scope (gs_name, gs_description) VALUES ('g_admin', 'Glewlwyd admin scope'); INSERT INTO g_scope (gs_name, gs_description) VALUES ('g_profile', 'Glewlwyd profile scope'); glewlwyd-1.3.1/database/glewlwyd.init-db-only.sqlite3.sql000066400000000000000000000246561322667720100234070ustar00rootroot00000000000000-- SQlite3 init script DROP TABLE IF EXISTS `g_refresh_token_scope`; DROP TABLE IF EXISTS `g_code_scope`; DROP TABLE IF EXISTS `g_code`; DROP TABLE IF EXISTS `g_client_user_scope`; DROP TABLE IF EXISTS `g_client_authorization_type`; DROP TABLE IF EXISTS `g_resource_scope`; DROP TABLE IF EXISTS `g_client_scope`; DROP TABLE IF EXISTS `g_user_scope`; DROP TABLE IF EXISTS `g_client_scope`; DROP TABLE IF EXISTS `g_access_token`; DROP TABLE IF EXISTS `g_refresh_token`; DROP TABLE IF EXISTS `g_session`; DROP TABLE IF EXISTS `g_resource`; DROP TABLE IF EXISTS `g_reset_password`; DROP TABLE IF EXISTS `g_redirect_uri`; DROP TABLE IF EXISTS `g_client`; DROP TABLE IF EXISTS `g_authorization_type`; DROP TABLE IF EXISTS `g_scope`; DROP TABLE IF EXISTS `g_user`; -- ----------- -- -- Data tables -- -- ----------- -- -- User table, contains registered users with their password encrypted CREATE TABLE `g_user` ( `gu_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gu_name` TEXT DEFAULT '', `gu_email` TEXT DEFAULT '', `gu_login` TEXT NOT NULL UNIQUE, `gu_password` TEXT NOT NULL, `gu_additional_property_value` TEXT, `gu_enabled` INTEGER DEFAULT 1 ); CREATE INDEX `i_g_user` ON `g_user`(`gu_id`); CREATE INDEX `i_g_user_name` ON `g_user`(`gu_name`); CREATE INDEX `i_g_user_login` ON `g_user`(`gu_login`); -- Scope table, contain all scope values available CREATE TABLE `g_scope` ( `gs_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gs_name` TEXT NOT NULL, `gs_description` TEXT DEFAULT '' ); CREATE INDEX `i_g_scope` ON `g_scope`(`gs_id`); CREATE INDEX `i_g_scope_name` ON `g_scope`(`gs_name`); -- Authorization type table, to store authorization type available CREATE TABLE `g_authorization_type` ( `got_id` INTEGER PRIMARY KEY AUTOINCREMENT, `got_code` INTEGER NOT NULL UNIQUE, -- 0: Authorization Code Grant, 1: Code Grant, 2: Implicit Grant, 3: Resource Owner Password Credentials Grant, 4: Client Credentials Grant `got_name` TEXT NOT NULL, `got_description` TEXT DEFAULT '', `got_enabled` INTEGER DEFAULT 1 ); CREATE INDEX `i_g_authorization_type` ON `g_authorization_type`(`got_id`); CREATE INDEX `i_g_authorization_name` ON `g_authorization_type`(`got_name`); CREATE INDEX `i_g_authorization_code` ON `g_authorization_type`(`got_code`); -- Client table, contains all registered clients with their client_id CREATE TABLE `g_client` ( `gc_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gc_name` TEXT NOT NULL, `gc_description` TEXT DEFAULT '', `gc_client_id` TEXT NOT NULL UNIQUE, `gc_client_password` TEXT, `gc_confidential` INTEGER DEFAULT 0, `gc_enabled` INTEGER DEFAULT 1 ); CREATE INDEX `i_g_client` ON `g_client`(`gc_id`); CREATE INDEX `i_g_client_name` ON `g_client`(`gc_name`); CREATE INDEX `i_g_client_id` ON `g_client`(`gc_client_id`); -- Redirect URI, contains all registered redirect_uti values for the clients CREATE TABLE `g_redirect_uri` ( `gru_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gc_id` INTEGER NOT NULL, `gru_name` TEXT NOT NULL, `gru_uri` TEXT, FOREIGN KEY(`gc_id`) REFERENCES `g_client`(`gc_id`) ON DELETE CASCADE ); CREATE INDEX `i_g_redirect_uri` ON `g_redirect_uri`(`gru_id`); -- Resource table, contains all registered resource server CREATE TABLE `g_resource` ( `gr_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gr_name` TEXT NOT NULL UNIQUE, `gr_description` TEXT DEFAULT '', `gr_uri` TEXT ); CREATE INDEX `i_g_resource` ON `g_resource`(`gr_id`); CREATE INDEX `i_g_resource_name` ON `g_resource`(`gr_name`); -- Reset a user password CREATE TABLE `g_reset_password` ( `grp_id` INTEGER PRIMARY KEY AUTOINCREMENT, `grp_username` TEXT NOT NULL, `grp_ip_source` TEXT NOT NULL, `grp_token` TEXT NOT NULL, `grp_enabled` INTEGER DEFAULT 1, `grp_issued_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, `grp_reset_at` TIMESTAMP NULL ); CREATE INDEX `i_g_reset_password` ON `g_reset_password`(`grp_id`); CREATE INDEX `i_g_reset_password_username` ON `g_reset_password`(`grp_username`); -- ------------ -- -- Token tables -- -- ------------ -- -- Refresh token table, to store a signature and meta information on all refresh_tokens sent CREATE TABLE `g_refresh_token` ( `grt_id` INTEGER PRIMARY KEY AUTOINCREMENT, `grt_hash` TEXT NOT NULL, `grt_authorization_type` INTEGER NOT NULL, -- 0: Authorization Code Grant, 1: Implicit Grant, 2: Resource Owner Password Credentials Grant, 3: Client Credentials Grant `grt_username` TEXT NOT NULL, `gc_client_id` TEXT, `grt_scope` TEXT, `grt_issued_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, `grt_last_seen` TIMESTAMP NULL, `grt_expired_at` TIMESTAMP NULL, `grt_ip_source` TEXT NOT NULL, `grt_enabled` INTEGER DEFAULT 1 ); CREATE INDEX `i_g_refresh_token` ON `g_refresh_token`(`grt_id`); CREATE INDEX `i_g_refresh_token_username` ON `g_refresh_token`(`grt_username`); -- Access token table, to store meta information on access_token sent CREATE TABLE `g_access_token` ( `gat_id` INTEGER PRIMARY KEY AUTOINCREMENT, `grt_id` INTEGER, `gat_authorization_type` INTEGER NOT NULL, -- 0: Authorization Code Grant, 1: Implicit Grant, 2: Resource Owner Password Credentials Grant, 3: Client Credentials Grant `gat_issued_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, `gat_ip_source` TEXT NOT NULL, FOREIGN KEY(`grt_id`) REFERENCES `g_refresh_token`(`grt_id`) ON DELETE CASCADE ); CREATE INDEX `i_g_access_token` ON `g_access_token`(`gat_id`); -- Session table, to store signature and meta information on session tokens sent CREATE TABLE `g_session` ( `gss_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gss_hash` TEXT NOT NULL, `gss_username` TEXT NOT NULL, `gss_issued_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, `gss_last_seen` TIMESTAMP NULL, `gss_expired_at` TIMESTAMP NULL, `gss_ip_source` TEXT NOT NULL, `gss_enabled` INTEGER DEFAULT 1 ); CREATE INDEX `i_g_session` ON `g_session`(`gss_id`); CREATE INDEX `i_g_session_username` ON `g_session`(`gss_username`); -- -------------- -- -- Linking tables -- -- -------------- -- -- User scope table, to store scope available for each user CREATE TABLE `g_user_scope` ( `gus_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gu_id` INTEGER NOT NULL, `gs_id` INTEGER NOT NULL, FOREIGN KEY(`gu_id`) REFERENCES `g_user`(`gu_id`) ON DELETE CASCADE, FOREIGN KEY(`gs_id`) REFERENCES `g_scope`(`gs_id`) ON DELETE CASCADE ); CREATE INDEX `i_g_user_scope` ON `g_user_scope`(`gus_id`); -- Client scope table, to store scope available for a client on client authentication CREATE TABLE `g_client_scope` ( `gcs_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gc_id` INTEGER NOT NULL, `gs_id` INTEGER NOT NULL, FOREIGN KEY(`gc_id`) REFERENCES `g_client`(`gc_id`) ON DELETE CASCADE, FOREIGN KEY(`gs_id`) REFERENCES `g_scope`(`gs_id`) ON DELETE CASCADE ); CREATE INDEX `i_g_client_scope` ON `g_client_scope`(`gcs_id`); -- Resource scope table, to store scope required for a resource service CREATE TABLE `g_resource_scope` ( `grs_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gr_id` INTEGER NOT NULL, `gs_id` INTEGER NOT NULL, FOREIGN KEY(`gr_id`) REFERENCES `g_resource`(`gr_id`) ON DELETE CASCADE, FOREIGN KEY(`gs_id`) REFERENCES `g_scope`(`gs_id`) ON DELETE CASCADE ); CREATE INDEX `i_g_resource_scope` ON `g_resource_scope`(`grs_id`); -- Client authorization type table, to store authorization types available for the client CREATE TABLE `g_client_authorization_type` ( `gcat_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gc_client_id` TEXT NOT NULL, `got_id` INTEGER NOT NULL, FOREIGN KEY(`got_id`) REFERENCES `g_authorization_type`(`got_id`) ON DELETE CASCADE ); CREATE INDEX `i_g_client_authorization_type` ON `g_client_authorization_type`(`gcat_id`); -- Client user scope table, to store the authorization of the user to use scope for this client CREATE TABLE `g_client_user_scope` ( `gcus_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gc_client_id` TEXT NOT NULL, `gco_username` TEXT NOT NULL, `gs_id` INTEGER NOT NULL, FOREIGN KEY(`gs_id`) REFERENCES `g_scope`(`gs_id`) ON DELETE CASCADE ); CREATE INDEX `i_g_client_user_scope` ON `g_client_user_scope`(`gcus_id`); CREATE INDEX `i_g_client_user_scope_username` ON `g_client_user_scope`(`gco_username`); -- Code table, used to store auth code sent with response_type code and validate it with response_type authorization_code CREATE TABLE `g_code` ( `gco_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gco_date` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, `gco_code_hash` TEXT NOT NULL, `gco_ip_source` TEXT NOT NULL, `gco_enabled` INTEGER DEFAULT 1, `gc_client_id` TEXT NOT NULL, `gco_username` TEXT NOT NULL, `gco_redirect_uri` TEXT ); CREATE INDEX `i_g_code` ON `g_code`(`gco_id`); CREATE INDEX `i_g_code_username` ON `g_code`(`gco_username`); -- Code scope table, used to link a generated code to a list of scopes CREATE TABLE `g_code_scope` ( `gcs_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gco_id` INTEGER NOT NULL, `gs_id` INTEGER NOT NULL, FOREIGN KEY(`gco_id`) REFERENCES `g_code`(`gco_id`) ON DELETE CASCADE, FOREIGN KEY(`gs_id`) REFERENCES `g_scope`(`gs_id`) ON DELETE CASCADE ); CREATE INDEX `i_g_code_scope` ON `g_code_scope`(`gcs_id`); -- Refresh token scope table, used to link a generated refresh token to a list of scopes CREATE TABLE `g_refresh_token_scope` ( `grts_id` INTEGER PRIMARY KEY AUTOINCREMENT, `grt_id` INTEGER NOT NULL, `gs_id` INTEGER NOT NULL, FOREIGN KEY(`grt_id`) REFERENCES `g_refresh_token`(`grt_id`) ON DELETE CASCADE, FOREIGN KEY(`gs_id`) REFERENCES `g_scope`(`gs_id`) ON DELETE CASCADE ); CREATE INDEX `i_g_refresh_token_scope` ON `g_refresh_token_scope`(`grts_id`); INSERT INTO g_authorization_type (got_name, got_code, got_description) VALUES ('authorization_code', 0, 'Authorization Code Grant - Access token: https://tools.ietf.org/html/rfc6749#section-4.1'); INSERT INTO g_authorization_type (got_name, got_code, got_description) VALUES ('code', 1, 'Authorization Code Grant - Authorization: https://tools.ietf.org/html/rfc6749#section-4.1'); INSERT INTO g_authorization_type (got_name, got_code, got_description) VALUES ('token', 2, 'Implicit Grant: https://tools.ietf.org/html/rfc6749#section-4.2'); INSERT INTO g_authorization_type (got_name, got_code, got_description) VALUES ('password', 3, 'Resource Owner Password Credentials Grant: https://tools.ietf.org/html/rfc6749#section-4.3'); INSERT INTO g_authorization_type (got_name, got_code, got_description) VALUES ('client_credentials', 4, 'Client Credentials Grant: https://tools.ietf.org/html/rfc6749#section-4.4'); INSERT INTO g_scope (gs_name, gs_description) VALUES ('g_admin', 'Glewlwyd admin scope'); INSERT INTO g_scope (gs_name, gs_description) VALUES ('g_profile', 'Glewlwyd profile scope'); glewlwyd-1.3.1/database/init-mariadb.sql000066400000000000000000000262171322667720100202150ustar00rootroot00000000000000-- ----------------------------------------------------- -- -- Mariadb/Mysql Database -- -- Initialize Glewlwyd Database for the backend server -- -- The administration client app -- -- And the default user 'admin' with password 'password' -- -- ----------------------------------------------------- -- DROP TABLE IF EXISTS `g_refresh_token_scope`; DROP TABLE IF EXISTS `g_code_scope`; DROP TABLE IF EXISTS `g_code`; DROP TABLE IF EXISTS `g_client_user_scope`; DROP TABLE IF EXISTS `g_client_authorization_type`; DROP TABLE IF EXISTS `g_resource_scope`; DROP TABLE IF EXISTS `g_client_scope`; DROP TABLE IF EXISTS `g_user_scope`; DROP TABLE IF EXISTS `g_client_scope`; DROP TABLE IF EXISTS `g_access_token`; DROP TABLE IF EXISTS `g_refresh_token`; DROP TABLE IF EXISTS `g_session`; DROP TABLE IF EXISTS `g_resource`; DROP TABLE IF EXISTS `g_reset_password`; DROP TABLE IF EXISTS `g_redirect_uri`; DROP TABLE IF EXISTS `g_client`; DROP TABLE IF EXISTS `g_authorization_type`; DROP TABLE IF EXISTS `g_scope`; DROP TABLE IF EXISTS `g_user`; -- ----------- -- -- Data tables -- -- ----------- -- -- User table, contains registered users with their password encrypted CREATE TABLE `g_user` ( `gu_id` INT(11) PRIMARY KEY AUTO_INCREMENT, `gu_name` VARCHAR(512) DEFAULT '', `gu_email` VARCHAR(512) DEFAULT '', `gu_login` VARCHAR(128) NOT NULL UNIQUE, `gu_password` VARCHAR(128) NOT NULL, `gu_additional_property_value` VARCHAR(512), `gu_enabled` TINYINT(1) DEFAULT 1 ); CREATE INDEX `i_g_user_name` ON `g_user`(`gu_name`); CREATE INDEX `i_g_user_login` ON `g_user`(`gu_login`); -- Scope table, contain all scope values available CREATE TABLE `g_scope` ( `gs_id` INT(11) PRIMARY KEY AUTO_INCREMENT, `gs_name` VARCHAR(128) NOT NULL, `gs_description` VARCHAR(512) DEFAULT '' ); CREATE INDEX `i_g_scope_name` ON `g_scope`(`gs_name`); -- Authorization type table, to store authorization type available CREATE TABLE `g_authorization_type` ( `got_id` INT(11) PRIMARY KEY AUTO_INCREMENT, `got_code` INT(2) NOT NULL UNIQUE, -- 0: Authorization Code Grant, 1: Code Grant, 2: Implicit Grant, 3: Resource Owner Password Credentials Grant, 4: Client Credentials Grant `got_name` VARCHAR(128) NOT NULL, `got_description` VARCHAR(512) DEFAULT '', `got_enabled` TINYINT(1) DEFAULT 1 ); CREATE INDEX `i_g_authorization_name` ON `g_authorization_type`(`got_name`); CREATE INDEX `i_g_authorization_code` ON `g_authorization_type`(`got_code`); -- Client table, contains all registered clients with their client_id CREATE TABLE `g_client` ( `gc_id` INT(11) PRIMARY KEY AUTO_INCREMENT, `gc_name` VARCHAR(128) NOT NULL, `gc_description` VARCHAR(512) DEFAULT '', `gc_client_id` VARCHAR(128) NOT NULL UNIQUE, `gc_client_password` VARCHAR(128), `gc_confidential` TINYINT(1) DEFAULT 0, `gc_enabled` TINYINT(1) DEFAULT 1 ); CREATE INDEX `i_g_client_name` ON `g_client`(`gc_name`); CREATE INDEX `i_g_client_id` ON `g_client`(`gc_client_id`); -- Resource table, contains all registered resource server CREATE TABLE `g_resource` ( `gr_id` INT(11) PRIMARY KEY AUTO_INCREMENT, `gr_name` VARCHAR(128) NOT NULL UNIQUE, `gr_description` VARCHAR(512) DEFAULT '', `gr_uri` VARCHAR(512) ); CREATE INDEX `i_g_resource_name` ON `g_resource`(`gr_name`); -- Redirect URI, contains all registered redirect_uti values for the clients CREATE TABLE `g_redirect_uri` ( `gru_id` INT(11) PRIMARY KEY AUTO_INCREMENT, `gc_id` INT(11) NOT NULL, `gru_name` VARCHAR(128) NOT NULL, `gru_uri` VARCHAR(512), FOREIGN KEY(`gc_id`) REFERENCES `g_client`(`gc_id`) ON DELETE CASCADE ); -- Reset a user password CREATE TABLE `g_reset_password` ( `grp_id` INT(11) PRIMARY KEY AUTO_INCREMENT, `grp_username` VARCHAR(128) NOT NULL, `grp_ip_source` VARCHAR(64) NOT NULL, `grp_token` VARCHAR(512) NOT NULL, `grp_enabled` TINYINT(1) DEFAULT 1, `grp_issued_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, `grp_reset_at` TIMESTAMP NULL ); CREATE INDEX `i_g_reset_password_username` ON `g_reset_password`(`grp_username`); -- ------------ -- -- Token tables -- -- ------------ -- -- Refresh token table, to store a signature and meta information on all refresh tokens sent CREATE TABLE `g_refresh_token` ( `grt_id` INT(11) PRIMARY KEY AUTO_INCREMENT, `grt_hash` VARCHAR(128) NOT NULL, `grt_authorization_type` INT(2) NOT NULL, -- 0: Authorization Code Grant, 1: Implicit Grant, 2: Resource Owner Password Credentials Grant, 3: Client Credentials Grant `grt_username` VARCHAR(128) NOT NULL, `gc_client_id` VARCHAR(128), `grt_issued_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, `grt_last_seen` TIMESTAMP NULL, `grt_expired_at` TIMESTAMP NULL, `grt_ip_source` VARCHAR(64) NOT NULL, `grt_enabled` TINYINT(1) DEFAULT 1 ); -- Access token table, to store meta information on access tokensw sent CREATE TABLE `g_access_token` ( `gat_id` INT(11) PRIMARY KEY AUTO_INCREMENT, `grt_id` INT(11), `gat_authorization_type` INT(2) NOT NULL, -- 0: Authorization Code Grant, 1: Implicit Grant, 2: Resource Owner Password Credentials Grant, 3: Client Credentials Grant `gat_issued_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, `gat_ip_source` VARCHAR(64) NOT NULL, FOREIGN KEY(`grt_id`) REFERENCES `g_refresh_token`(`grt_id`) ON DELETE CASCADE ); CREATE INDEX `i_g_refresh_token_username` ON `g_refresh_token`(`grt_username`); -- Session table, to store signature and meta information on session tokens sent CREATE TABLE `g_session` ( `gss_id` INT(11) PRIMARY KEY AUTO_INCREMENT, `gss_hash` VARCHAR(128) NOT NULL, `gss_username` VARCHAR(128) NOT NULL, `gss_issued_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, `gss_last_seen` TIMESTAMP NULL, `gss_expired_at` TIMESTAMP NULL, `gss_ip_source` VARCHAR(64) NOT NULL, `gss_enabled` TINYINT(1) DEFAULT 1 ); CREATE INDEX `i_g_session_username` ON `g_session`(`gss_username`); -- -------------- -- -- Linking tables -- -- -------------- -- -- User scope table, to store scope available for each user CREATE TABLE `g_user_scope` ( `gus_id` INT(11) PRIMARY KEY AUTO_INCREMENT, `gu_id` INT(11) NOT NULL, `gs_id` INT(11) NOT NULL, FOREIGN KEY(`gu_id`) REFERENCES `g_user`(`gu_id`) ON DELETE CASCADE, FOREIGN KEY(`gs_id`) REFERENCES `g_scope`(`gs_id`) ON DELETE CASCADE ); -- Client scope table, to store scope available for a client on client authentication CREATE TABLE `g_client_scope` ( `gcs_id` INT(11) PRIMARY KEY AUTO_INCREMENT, `gc_id` INT(11) NOT NULL, `gs_id` INT(11) NOT NULL, FOREIGN KEY(`gc_id`) REFERENCES `g_client`(`gc_id`) ON DELETE CASCADE, FOREIGN KEY(`gs_id`) REFERENCES `g_scope`(`gs_id`) ON DELETE CASCADE ); -- Resource scope table, to store scope required for a resource service CREATE TABLE `g_resource_scope` ( `grs_id` INT(11) PRIMARY KEY AUTO_INCREMENT, `gr_id` INT(11) NOT NULL, `gs_id` INT(11) NOT NULL, FOREIGN KEY(`gr_id`) REFERENCES `g_resource`(`gr_id`) ON DELETE CASCADE, FOREIGN KEY(`gs_id`) REFERENCES `g_scope`(`gs_id`) ON DELETE CASCADE ); -- Client authorization type table, to store authorization types available for the client CREATE TABLE `g_client_authorization_type` ( `gcat_id` INT(11) PRIMARY KEY AUTO_INCREMENT, `gc_client_id` VARCHAR(128) NOT NULL, `got_id` INT(11) NOT NULL, FOREIGN KEY(`got_id`) REFERENCES `g_authorization_type`(`got_id`) ON DELETE CASCADE ); -- Client user scope table, to store the authorization of the user to use scope for this client CREATE TABLE `g_client_user_scope` ( `gcus_id` INT(11) PRIMARY KEY AUTO_INCREMENT, `gc_client_id` VARCHAR(128) NOT NULL, `gco_username` VARCHAR(128) NOT NULL, `gs_id` INT(11) NOT NULL, FOREIGN KEY(`gs_id`) REFERENCES `g_scope`(`gs_id`) ON DELETE CASCADE ); CREATE INDEX `i_g_client_user_scope_username` ON `g_client_user_scope`(`gco_username`); -- Code table, used to store auth code sent with response_type code and validate it with response_type authorization_code CREATE TABLE `g_code` ( `gco_id` INT(11) PRIMARY KEY AUTO_INCREMENT, `gco_date` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, `gco_code_hash` VARCHAR(128) NOT NULL, `gco_ip_source` VARCHAR(64) NOT NULL, `gco_enabled` TINYINT(1) DEFAULT 1, `gc_client_id` VARCHAR(128) NOT NULL, `gco_username` VARCHAR(128) NOT NULL, `gco_redirect_uri` VARCHAR(512) ); CREATE INDEX `i_g_code_username` ON `g_code`(`gco_username`); -- Code scope table, used to link a generated code to a list of scopes CREATE TABLE `g_code_scope` ( `gcs_id` INT(11) PRIMARY KEY AUTO_INCREMENT, `gco_id` INT(11) NOT NULL, `gs_id` INT(11) NOT NULL, FOREIGN KEY(`gco_id`) REFERENCES `g_code`(`gco_id`) ON DELETE CASCADE, FOREIGN KEY(`gs_id`) REFERENCES `g_scope`(`gs_id`) ON DELETE CASCADE ); -- Refresh token scope table, used to link a generated refresh token to a list of scopes CREATE TABLE `g_refresh_token_scope` ( `grts_id` INT(11) PRIMARY KEY AUTO_INCREMENT, `grt_id` INT(11) NOT NULL, `gs_id` INT(11) NOT NULL, FOREIGN KEY(`grt_id`) REFERENCES `g_refresh_token`(`grt_id`) ON DELETE CASCADE, FOREIGN KEY(`gs_id`) REFERENCES `g_scope`(`gs_id`) ON DELETE CASCADE ); -- Initialize authorization types INSERT INTO g_authorization_type (got_name, got_code, got_description) VALUES ('authorization_code', 0, 'Authorization Code Grant - Access token: https://tools.ietf.org/html/rfc6749#section-4.1'); INSERT INTO g_authorization_type (got_name, got_code, got_description) VALUES ('code', 1, 'Authorization Code Grant - Authorization: https://tools.ietf.org/html/rfc6749#section-4.1'); INSERT INTO g_authorization_type (got_name, got_code, got_description) VALUES ('token', 2, 'Implicit Grant: https://tools.ietf.org/html/rfc6749#section-4.2'); INSERT INTO g_authorization_type (got_name, got_code, got_description) VALUES ('password', 3, 'Resource Owner Password Credentials Grant: https://tools.ietf.org/html/rfc6749#section-4.3'); INSERT INTO g_authorization_type (got_name, got_code, got_description) VALUES ('client_credentials', 4, 'Client Credentials Grant: https://tools.ietf.org/html/rfc6749#section-4.4'); -- Create default scopes INSERT INTO g_scope (gs_name, gs_description) VALUES ('g_admin', 'Glewlwyd admin scope'); INSERT INTO g_scope (gs_name, gs_description) VALUES ('g_profile', 'Glewlwyd profile scope'); -- Create Glewlwyd administration application client connection INSERT INTO g_client (gc_name, gc_description, gc_client_id) VALUES ('admin app', 'Glewlwyd administration app', 'g_admin'); INSERT INTO g_redirect_uri (gru_name, gru_uri, gc_id) VALUES ('uri_g_admin', '../app/index.html', (SELECT gc_id from g_client WHERE gc_client_id='g_admin')); INSERT INTO g_client_authorization_type (gc_client_id, got_id) VALUES ('g_admin', (SELECT got_id from g_authorization_type WHERE got_name='code')); INSERT INTO g_client_authorization_type (gc_client_id, got_id) VALUES ('g_admin', (SELECT got_id from g_authorization_type WHERE got_name='token')); -- Create admin user with admin scope INSERT INTO g_user (gu_login, gu_name, gu_email, gu_password, gu_enabled) VALUES ('admin', 'The Boss', 'boss@glewlwyd.domain', PASSWORD('password'), 1); INSERT INTO g_user_scope (gu_id, gs_id) VALUES ((SELECT gu_id from g_user WHERE gu_login='admin'), (SELECT gs_id from g_scope WHERE gs_name='g_admin')); INSERT INTO g_user_scope (gu_id, gs_id) VALUES ((SELECT gu_id from g_user WHERE gu_login='admin'), (SELECT gs_id from g_scope WHERE gs_name='g_profile')); glewlwyd-1.3.1/database/init-sqlite3-md5.sql000066400000000000000000000277031322667720100206660ustar00rootroot00000000000000-- ----------------------------------------------------- -- -- Sqlite3 Database/MD5 encoding -- -- Initialize Glewlwyd Database for the backend server -- -- The administration client app -- -- And the default user 'admin' with password 'password' -- -- ----------------------------------------------------- -- DROP TABLE IF EXISTS `g_refresh_token_scope`; DROP TABLE IF EXISTS `g_code_scope`; DROP TABLE IF EXISTS `g_code`; DROP TABLE IF EXISTS `g_client_user_scope`; DROP TABLE IF EXISTS `g_client_authorization_type`; DROP TABLE IF EXISTS `g_resource_scope`; DROP TABLE IF EXISTS `g_client_scope`; DROP TABLE IF EXISTS `g_user_scope`; DROP TABLE IF EXISTS `g_client_scope`; DROP TABLE IF EXISTS `g_access_token`; DROP TABLE IF EXISTS `g_refresh_token`; DROP TABLE IF EXISTS `g_session`; DROP TABLE IF EXISTS `g_resource`; DROP TABLE IF EXISTS `g_reset_password`; DROP TABLE IF EXISTS `g_redirect_uri`; DROP TABLE IF EXISTS `g_client`; DROP TABLE IF EXISTS `g_authorization_type`; DROP TABLE IF EXISTS `g_scope`; DROP TABLE IF EXISTS `g_user`; -- ----------- -- -- Data tables -- -- ----------- -- -- User table, contains registered users with their password encrypted CREATE TABLE `g_user` ( `gu_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gu_name` TEXT DEFAULT '', `gu_email` TEXT DEFAULT '', `gu_login` TEXT NOT NULL UNIQUE, `gu_password` TEXT NOT NULL, `gu_additional_property_value` TEXT, `gu_enabled` INTEGER DEFAULT 1 ); CREATE INDEX `i_g_user` ON `g_user`(`gu_id`); CREATE INDEX `i_g_user_name` ON `g_user`(`gu_name`); CREATE INDEX `i_g_user_login` ON `g_user`(`gu_login`); -- Scope table, contain all scope values available CREATE TABLE `g_scope` ( `gs_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gs_name` TEXT NOT NULL, `gs_description` TEXT DEFAULT '' ); CREATE INDEX `i_g_scope` ON `g_scope`(`gs_id`); CREATE INDEX `i_g_scope_name` ON `g_scope`(`gs_name`); -- Authorization type table, to store authorization type available CREATE TABLE `g_authorization_type` ( `got_id` INTEGER PRIMARY KEY AUTOINCREMENT, `got_code` INTEGER NOT NULL UNIQUE, -- 0: Authorization Code Grant, 1: Code Grant, 2: Implicit Grant, 3: Resource Owner Password Credentials Grant, 4: Client Credentials Grant `got_name` TEXT NOT NULL, `got_description` TEXT DEFAULT '', `got_enabled` INTEGER DEFAULT 1 ); CREATE INDEX `i_g_authorization_type` ON `g_authorization_type`(`got_id`); CREATE INDEX `i_g_authorization_name` ON `g_authorization_type`(`got_name`); CREATE INDEX `i_g_authorization_code` ON `g_authorization_type`(`got_code`); -- Client table, contains all registered clients with their client_id CREATE TABLE `g_client` ( `gc_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gc_name` TEXT NOT NULL, `gc_description` TEXT DEFAULT '', `gc_client_id` TEXT NOT NULL UNIQUE, `gc_client_password` TEXT, `gc_confidential` INTEGER DEFAULT 0, `gc_enabled` INTEGER DEFAULT 1 ); CREATE INDEX `i_g_client` ON `g_client`(`gc_id`); CREATE INDEX `i_g_client_name` ON `g_client`(`gc_name`); CREATE INDEX `i_g_client_id` ON `g_client`(`gc_client_id`); -- Redirect URI, contains all registered redirect_uti values for the clients CREATE TABLE `g_redirect_uri` ( `gru_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gc_id` INTEGER NOT NULL, `gru_name` TEXT NOT NULL, `gru_uri` TEXT, FOREIGN KEY(`gc_id`) REFERENCES `g_client`(`gc_id`) ON DELETE CASCADE ); CREATE INDEX `i_g_redirect_uri` ON `g_redirect_uri`(`gru_id`); -- Resource table, contains all registered resource server CREATE TABLE `g_resource` ( `gr_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gr_name` TEXT NOT NULL UNIQUE, `gr_description` TEXT DEFAULT '', `gr_uri` TEXT ); CREATE INDEX `i_g_resource` ON `g_resource`(`gr_id`); CREATE INDEX `i_g_resource_name` ON `g_resource`(`gr_name`); -- Reset a user password CREATE TABLE `g_reset_password` ( `grp_id` INTEGER PRIMARY KEY AUTOINCREMENT, `grp_username` TEXT NOT NULL, `grp_ip_source` TEXT NOT NULL, `grp_token` TEXT NOT NULL, `grp_enabled` INTEGER DEFAULT 1, `grp_issued_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, `grp_reset_at` TIMESTAMP NULL ); CREATE INDEX `i_g_reset_password` ON `g_reset_password`(`grp_id`); CREATE INDEX `i_g_reset_password_username` ON `g_reset_password`(`grp_username`); -- ------------ -- -- Token tables -- -- ------------ -- -- Refresh token table, to store a signature and meta information on all refresh_tokens sent CREATE TABLE `g_refresh_token` ( `grt_id` INTEGER PRIMARY KEY AUTOINCREMENT, `grt_hash` TEXT NOT NULL, `grt_authorization_type` INTEGER NOT NULL, -- 0: Authorization Code Grant, 1: Implicit Grant, 2: Resource Owner Password Credentials Grant, 3: Client Credentials Grant `grt_username` TEXT NOT NULL, `gc_client_id` TEXT, `grt_scope` TEXT, `grt_issued_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, `grt_last_seen` TIMESTAMP NULL, `grt_expired_at` TIMESTAMP NULL, `grt_ip_source` TEXT NOT NULL, `grt_enabled` INTEGER DEFAULT 1 ); CREATE INDEX `i_g_refresh_token` ON `g_refresh_token`(`grt_id`); CREATE INDEX `i_g_refresh_token_username` ON `g_refresh_token`(`grt_username`); -- Access token table, to store meta information on access_token sent CREATE TABLE `g_access_token` ( `gat_id` INTEGER PRIMARY KEY AUTOINCREMENT, `grt_id` INTEGER, `gat_authorization_type` INTEGER NOT NULL, -- 0: Authorization Code Grant, 1: Implicit Grant, 2: Resource Owner Password Credentials Grant, 3: Client Credentials Grant `gat_issued_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, `gat_ip_source` TEXT NOT NULL, FOREIGN KEY(`grt_id`) REFERENCES `g_refresh_token`(`grt_id`) ON DELETE CASCADE ); CREATE INDEX `i_g_access_token` ON `g_access_token`(`gat_id`); -- Session table, to store signature and meta information on session tokens sent CREATE TABLE `g_session` ( `gss_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gss_hash` TEXT NOT NULL, `gss_username` TEXT NOT NULL, `gss_issued_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, `gss_last_seen` TIMESTAMP NULL, `gss_expired_at` TIMESTAMP NULL, `gss_ip_source` TEXT NOT NULL, `gss_enabled` INTEGER DEFAULT 1 ); CREATE INDEX `i_g_session` ON `g_session`(`gss_id`); CREATE INDEX `i_g_session_username` ON `g_session`(`gss_username`); -- -------------- -- -- Linking tables -- -- -------------- -- -- User scope table, to store scope available for each user CREATE TABLE `g_user_scope` ( `gus_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gu_id` INTEGER NOT NULL, `gs_id` INTEGER NOT NULL, FOREIGN KEY(`gu_id`) REFERENCES `g_user`(`gu_id`) ON DELETE CASCADE, FOREIGN KEY(`gs_id`) REFERENCES `g_scope`(`gs_id`) ON DELETE CASCADE ); CREATE INDEX `i_g_user_scope` ON `g_user_scope`(`gus_id`); -- Client scope table, to store scope available for a client on client authentication CREATE TABLE `g_client_scope` ( `gcs_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gc_id` INTEGER NOT NULL, `gs_id` INTEGER NOT NULL, FOREIGN KEY(`gc_id`) REFERENCES `g_client`(`gc_id`) ON DELETE CASCADE, FOREIGN KEY(`gs_id`) REFERENCES `g_scope`(`gs_id`) ON DELETE CASCADE ); CREATE INDEX `i_g_client_scope` ON `g_client_scope`(`gcs_id`); -- Resource scope table, to store scope required for a resource service CREATE TABLE `g_resource_scope` ( `grs_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gr_id` INTEGER NOT NULL, `gs_id` INTEGER NOT NULL, FOREIGN KEY(`gr_id`) REFERENCES `g_resource`(`gr_id`) ON DELETE CASCADE, FOREIGN KEY(`gs_id`) REFERENCES `g_scope`(`gs_id`) ON DELETE CASCADE ); CREATE INDEX `i_g_resource_scope` ON `g_resource_scope`(`grs_id`); -- Client authorization type table, to store authorization types available for the client CREATE TABLE `g_client_authorization_type` ( `gcat_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gc_client_id` TEXT NOT NULL, `got_id` INTEGER NOT NULL, FOREIGN KEY(`got_id`) REFERENCES `g_authorization_type`(`got_id`) ON DELETE CASCADE ); CREATE INDEX `i_g_client_authorization_type` ON `g_client_authorization_type`(`gcat_id`); -- Client user scope table, to store the authorization of the user to use scope for this client CREATE TABLE `g_client_user_scope` ( `gcus_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gc_client_id` TEXT NOT NULL, `gco_username` TEXT NOT NULL, `gs_id` INTEGER NOT NULL, FOREIGN KEY(`gs_id`) REFERENCES `g_scope`(`gs_id`) ON DELETE CASCADE ); CREATE INDEX `i_g_client_user_scope` ON `g_client_user_scope`(`gcus_id`); CREATE INDEX `i_g_client_user_scope_username` ON `g_client_user_scope`(`gco_username`); -- Code table, used to store auth code sent with response_type code and validate it with response_type authorization_code CREATE TABLE `g_code` ( `gco_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gco_date` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, `gco_code_hash` TEXT NOT NULL, `gco_ip_source` TEXT NOT NULL, `gco_enabled` INTEGER DEFAULT 1, `gc_client_id` TEXT NOT NULL, `gco_username` TEXT NOT NULL, `gco_redirect_uri` TEXT ); CREATE INDEX `i_g_code` ON `g_code`(`gco_id`); CREATE INDEX `i_g_code_username` ON `g_code`(`gco_username`); -- Code scope table, used to link a generated code to a list of scopes CREATE TABLE `g_code_scope` ( `gcs_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gco_id` INTEGER NOT NULL, `gs_id` INTEGER NOT NULL, FOREIGN KEY(`gco_id`) REFERENCES `g_code`(`gco_id`) ON DELETE CASCADE, FOREIGN KEY(`gs_id`) REFERENCES `g_scope`(`gs_id`) ON DELETE CASCADE ); CREATE INDEX `i_g_code_scope` ON `g_code_scope`(`gcs_id`); -- Refresh token scope table, used to link a generated refresh token to a list of scopes CREATE TABLE `g_refresh_token_scope` ( `grts_id` INTEGER PRIMARY KEY AUTOINCREMENT, `grt_id` INTEGER NOT NULL, `gs_id` INTEGER NOT NULL, FOREIGN KEY(`grt_id`) REFERENCES `g_refresh_token`(`grt_id`) ON DELETE CASCADE, FOREIGN KEY(`gs_id`) REFERENCES `g_scope`(`gs_id`) ON DELETE CASCADE ); CREATE INDEX `i_g_refresh_token_scope` ON `g_refresh_token_scope`(`grts_id`); -- Initialize authorization types INSERT INTO g_authorization_type (got_name, got_code, got_description) VALUES ('authorization_code', 0, 'Authorization Code Grant - Access token: https://tools.ietf.org/html/rfc6749#section-4.1'); INSERT INTO g_authorization_type (got_name, got_code, got_description) VALUES ('code', 1, 'Authorization Code Grant - Authorization: https://tools.ietf.org/html/rfc6749#section-4.1'); INSERT INTO g_authorization_type (got_name, got_code, got_description) VALUES ('token', 2, 'Implicit Grant: https://tools.ietf.org/html/rfc6749#section-4.2'); INSERT INTO g_authorization_type (got_name, got_code, got_description) VALUES ('password', 3, 'Resource Owner Password Credentials Grant: https://tools.ietf.org/html/rfc6749#section-4.3'); INSERT INTO g_authorization_type (got_name, got_code, got_description) VALUES ('client_credentials', 4, 'Client Credentials Grant: https://tools.ietf.org/html/rfc6749#section-4.4'); -- Create default scopes INSERT INTO g_scope (gs_name, gs_description) VALUES ('g_admin', 'Glewlwyd admin scope'); INSERT INTO g_scope (gs_name, gs_description) VALUES ('g_profile', 'Glewlwyd profile scope'); -- Create Glewlwyd administration application client connection INSERT INTO g_client (gc_name, gc_description, gc_client_id) VALUES ('admin app', 'Glewlwyd administration app', 'g_admin'); INSERT INTO g_redirect_uri (gru_name, gru_uri, gc_id) VALUES ('uri_g_admin', '../app/index.html', (SELECT gc_id from g_client WHERE gc_client_id='g_admin')); INSERT INTO g_client_authorization_type (gc_client_id, got_id) VALUES ('g_admin', (SELECT got_id from g_authorization_type WHERE got_name='code')); INSERT INTO g_client_authorization_type (gc_client_id, got_id) VALUES ('g_admin', (SELECT got_id from g_authorization_type WHERE got_name='token')); -- Create admin user with admin scope INSERT INTO g_user (gu_login, gu_name, gu_email, gu_password, gu_enabled) VALUES ('admin', 'The Boss', 'boss@glewlwyd.domain', '{MD5}X03MO1qnZdYdgyfeuILPmQ==', 1); INSERT INTO g_user_scope (gu_id, gs_id) VALUES ((SELECT gu_id from g_user WHERE gu_login='admin'), (SELECT gs_id from g_scope WHERE gs_name='g_admin')); INSERT INTO g_user_scope (gu_id, gs_id) VALUES ((SELECT gu_id from g_user WHERE gu_login='admin'), (SELECT gs_id from g_scope WHERE gs_name='g_profile')); glewlwyd-1.3.1/database/init-sqlite3-sha.sql000066400000000000000000000277071322667720100207600ustar00rootroot00000000000000-- ----------------------------------------------------- -- -- Sqlite3 Database/SHA encoding -- -- Initialize Glewlwyd Database for the backend server -- -- The administration client app -- -- And the default user 'admin' with password 'password' -- -- ----------------------------------------------------- -- DROP TABLE IF EXISTS `g_refresh_token_scope`; DROP TABLE IF EXISTS `g_code_scope`; DROP TABLE IF EXISTS `g_code`; DROP TABLE IF EXISTS `g_client_user_scope`; DROP TABLE IF EXISTS `g_client_authorization_type`; DROP TABLE IF EXISTS `g_resource_scope`; DROP TABLE IF EXISTS `g_client_scope`; DROP TABLE IF EXISTS `g_user_scope`; DROP TABLE IF EXISTS `g_client_scope`; DROP TABLE IF EXISTS `g_access_token`; DROP TABLE IF EXISTS `g_refresh_token`; DROP TABLE IF EXISTS `g_session`; DROP TABLE IF EXISTS `g_resource`; DROP TABLE IF EXISTS `g_reset_password`; DROP TABLE IF EXISTS `g_redirect_uri`; DROP TABLE IF EXISTS `g_client`; DROP TABLE IF EXISTS `g_authorization_type`; DROP TABLE IF EXISTS `g_scope`; DROP TABLE IF EXISTS `g_user`; -- ----------- -- -- Data tables -- -- ----------- -- -- User table, contains registered users with their password encrypted CREATE TABLE `g_user` ( `gu_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gu_name` TEXT DEFAULT '', `gu_email` TEXT DEFAULT '', `gu_login` TEXT NOT NULL UNIQUE, `gu_password` TEXT NOT NULL, `gu_additional_property_value` TEXT, `gu_enabled` INTEGER DEFAULT 1 ); CREATE INDEX `i_g_user` ON `g_user`(`gu_id`); CREATE INDEX `i_g_user_name` ON `g_user`(`gu_name`); CREATE INDEX `i_g_user_login` ON `g_user`(`gu_login`); -- Scope table, contain all scope values available CREATE TABLE `g_scope` ( `gs_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gs_name` TEXT NOT NULL, `gs_description` TEXT DEFAULT '' ); CREATE INDEX `i_g_scope` ON `g_scope`(`gs_id`); CREATE INDEX `i_g_scope_name` ON `g_scope`(`gs_name`); -- Authorization type table, to store authorization type available CREATE TABLE `g_authorization_type` ( `got_id` INTEGER PRIMARY KEY AUTOINCREMENT, `got_code` INTEGER NOT NULL UNIQUE, -- 0: Authorization Code Grant, 1: Code Grant, 2: Implicit Grant, 3: Resource Owner Password Credentials Grant, 4: Client Credentials Grant `got_name` TEXT NOT NULL, `got_description` TEXT DEFAULT '', `got_enabled` INTEGER DEFAULT 1 ); CREATE INDEX `i_g_authorization_type` ON `g_authorization_type`(`got_id`); CREATE INDEX `i_g_authorization_name` ON `g_authorization_type`(`got_name`); CREATE INDEX `i_g_authorization_code` ON `g_authorization_type`(`got_code`); -- Client table, contains all registered clients with their client_id CREATE TABLE `g_client` ( `gc_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gc_name` TEXT NOT NULL, `gc_description` TEXT DEFAULT '', `gc_client_id` TEXT NOT NULL UNIQUE, `gc_client_password` TEXT, `gc_confidential` INTEGER DEFAULT 0, `gc_enabled` INTEGER DEFAULT 1 ); CREATE INDEX `i_g_client` ON `g_client`(`gc_id`); CREATE INDEX `i_g_client_name` ON `g_client`(`gc_name`); CREATE INDEX `i_g_client_id` ON `g_client`(`gc_client_id`); -- Redirect URI, contains all registered redirect_uti values for the clients CREATE TABLE `g_redirect_uri` ( `gru_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gc_id` INTEGER NOT NULL, `gru_name` TEXT NOT NULL, `gru_uri` TEXT, FOREIGN KEY(`gc_id`) REFERENCES `g_client`(`gc_id`) ON DELETE CASCADE ); CREATE INDEX `i_g_redirect_uri` ON `g_redirect_uri`(`gru_id`); -- Resource table, contains all registered resource server CREATE TABLE `g_resource` ( `gr_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gr_name` TEXT NOT NULL UNIQUE, `gr_description` TEXT DEFAULT '', `gr_uri` TEXT ); CREATE INDEX `i_g_resource` ON `g_resource`(`gr_id`); CREATE INDEX `i_g_resource_name` ON `g_resource`(`gr_name`); -- Reset a user password CREATE TABLE `g_reset_password` ( `grp_id` INTEGER PRIMARY KEY AUTOINCREMENT, `grp_username` TEXT NOT NULL, `grp_ip_source` TEXT NOT NULL, `grp_token` TEXT NOT NULL, `grp_enabled` INTEGER DEFAULT 1, `grp_issued_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, `grp_reset_at` TIMESTAMP NULL ); CREATE INDEX `i_g_reset_password` ON `g_reset_password`(`grp_id`); CREATE INDEX `i_g_reset_password_username` ON `g_reset_password`(`grp_username`); -- ------------ -- -- Token tables -- -- ------------ -- -- Refresh token table, to store a signature and meta information on all refresh_tokens sent CREATE TABLE `g_refresh_token` ( `grt_id` INTEGER PRIMARY KEY AUTOINCREMENT, `grt_hash` TEXT NOT NULL, `grt_authorization_type` INTEGER NOT NULL, -- 0: Authorization Code Grant, 1: Implicit Grant, 2: Resource Owner Password Credentials Grant, 3: Client Credentials Grant `grt_username` TEXT NOT NULL, `gc_client_id` TEXT, `grt_scope` TEXT, `grt_issued_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, `grt_last_seen` TIMESTAMP NULL, `grt_expired_at` TIMESTAMP NULL, `grt_ip_source` TEXT NOT NULL, `grt_enabled` INTEGER DEFAULT 1 ); CREATE INDEX `i_g_refresh_token` ON `g_refresh_token`(`grt_id`); CREATE INDEX `i_g_refresh_token_username` ON `g_refresh_token`(`grt_username`); -- Access token table, to store meta information on access_token sent CREATE TABLE `g_access_token` ( `gat_id` INTEGER PRIMARY KEY AUTOINCREMENT, `grt_id` INTEGER, `gat_authorization_type` INTEGER NOT NULL, -- 0: Authorization Code Grant, 1: Implicit Grant, 2: Resource Owner Password Credentials Grant, 3: Client Credentials Grant `gat_issued_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, `gat_ip_source` TEXT NOT NULL, FOREIGN KEY(`grt_id`) REFERENCES `g_refresh_token`(`grt_id`) ON DELETE CASCADE ); CREATE INDEX `i_g_access_token` ON `g_access_token`(`gat_id`); -- Session table, to store signature and meta information on session tokens sent CREATE TABLE `g_session` ( `gss_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gss_hash` TEXT NOT NULL, `gss_username` TEXT NOT NULL, `gss_issued_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, `gss_last_seen` TIMESTAMP NULL, `gss_expired_at` TIMESTAMP NULL, `gss_ip_source` TEXT NOT NULL, `gss_enabled` INTEGER DEFAULT 1 ); CREATE INDEX `i_g_session` ON `g_session`(`gss_id`); CREATE INDEX `i_g_session_username` ON `g_session`(`gss_username`); -- -------------- -- -- Linking tables -- -- -------------- -- -- User scope table, to store scope available for each user CREATE TABLE `g_user_scope` ( `gus_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gu_id` INTEGER NOT NULL, `gs_id` INTEGER NOT NULL, FOREIGN KEY(`gu_id`) REFERENCES `g_user`(`gu_id`) ON DELETE CASCADE, FOREIGN KEY(`gs_id`) REFERENCES `g_scope`(`gs_id`) ON DELETE CASCADE ); CREATE INDEX `i_g_user_scope` ON `g_user_scope`(`gus_id`); -- Client scope table, to store scope available for a client on client authentication CREATE TABLE `g_client_scope` ( `gcs_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gc_id` INTEGER NOT NULL, `gs_id` INTEGER NOT NULL, FOREIGN KEY(`gc_id`) REFERENCES `g_client`(`gc_id`) ON DELETE CASCADE, FOREIGN KEY(`gs_id`) REFERENCES `g_scope`(`gs_id`) ON DELETE CASCADE ); CREATE INDEX `i_g_client_scope` ON `g_client_scope`(`gcs_id`); -- Resource scope table, to store scope required for a resource service CREATE TABLE `g_resource_scope` ( `grs_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gr_id` INTEGER NOT NULL, `gs_id` INTEGER NOT NULL, FOREIGN KEY(`gr_id`) REFERENCES `g_resource`(`gr_id`) ON DELETE CASCADE, FOREIGN KEY(`gs_id`) REFERENCES `g_scope`(`gs_id`) ON DELETE CASCADE ); CREATE INDEX `i_g_resource_scope` ON `g_resource_scope`(`grs_id`); -- Client authorization type table, to store authorization types available for the client CREATE TABLE `g_client_authorization_type` ( `gcat_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gc_client_id` TEXT NOT NULL, `got_id` INTEGER NOT NULL, FOREIGN KEY(`got_id`) REFERENCES `g_authorization_type`(`got_id`) ON DELETE CASCADE ); CREATE INDEX `i_g_client_authorization_type` ON `g_client_authorization_type`(`gcat_id`); -- Client user scope table, to store the authorization of the user to use scope for this client CREATE TABLE `g_client_user_scope` ( `gcus_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gc_client_id` TEXT NOT NULL, `gco_username` TEXT NOT NULL, `gs_id` INTEGER NOT NULL, FOREIGN KEY(`gs_id`) REFERENCES `g_scope`(`gs_id`) ON DELETE CASCADE ); CREATE INDEX `i_g_client_user_scope` ON `g_client_user_scope`(`gcus_id`); CREATE INDEX `i_g_client_user_scope_username` ON `g_client_user_scope`(`gco_username`); -- Code table, used to store auth code sent with response_type code and validate it with response_type authorization_code CREATE TABLE `g_code` ( `gco_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gco_date` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, `gco_code_hash` TEXT NOT NULL, `gco_ip_source` TEXT NOT NULL, `gco_enabled` INTEGER DEFAULT 1, `gc_client_id` TEXT NOT NULL, `gco_username` TEXT NOT NULL, `gco_redirect_uri` TEXT ); CREATE INDEX `i_g_code` ON `g_code`(`gco_id`); CREATE INDEX `i_g_code_username` ON `g_code`(`gco_username`); -- Code scope table, used to link a generated code to a list of scopes CREATE TABLE `g_code_scope` ( `gcs_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gco_id` INTEGER NOT NULL, `gs_id` INTEGER NOT NULL, FOREIGN KEY(`gco_id`) REFERENCES `g_code`(`gco_id`) ON DELETE CASCADE, FOREIGN KEY(`gs_id`) REFERENCES `g_scope`(`gs_id`) ON DELETE CASCADE ); CREATE INDEX `i_g_code_scope` ON `g_code_scope`(`gcs_id`); -- Refresh token scope table, used to link a generated refresh token to a list of scopes CREATE TABLE `g_refresh_token_scope` ( `grts_id` INTEGER PRIMARY KEY AUTOINCREMENT, `grt_id` INTEGER NOT NULL, `gs_id` INTEGER NOT NULL, FOREIGN KEY(`grt_id`) REFERENCES `g_refresh_token`(`grt_id`) ON DELETE CASCADE, FOREIGN KEY(`gs_id`) REFERENCES `g_scope`(`gs_id`) ON DELETE CASCADE ); CREATE INDEX `i_g_refresh_token_scope` ON `g_refresh_token_scope`(`grts_id`); -- Initialize authorization types INSERT INTO g_authorization_type (got_name, got_code, got_description) VALUES ('authorization_code', 0, 'Authorization Code Grant - Access token: https://tools.ietf.org/html/rfc6749#section-4.1'); INSERT INTO g_authorization_type (got_name, got_code, got_description) VALUES ('code', 1, 'Authorization Code Grant - Authorization: https://tools.ietf.org/html/rfc6749#section-4.1'); INSERT INTO g_authorization_type (got_name, got_code, got_description) VALUES ('token', 2, 'Implicit Grant: https://tools.ietf.org/html/rfc6749#section-4.2'); INSERT INTO g_authorization_type (got_name, got_code, got_description) VALUES ('password', 3, 'Resource Owner Password Credentials Grant: https://tools.ietf.org/html/rfc6749#section-4.3'); INSERT INTO g_authorization_type (got_name, got_code, got_description) VALUES ('client_credentials', 4, 'Client Credentials Grant: https://tools.ietf.org/html/rfc6749#section-4.4'); -- Create default scopes INSERT INTO g_scope (gs_name, gs_description) VALUES ('g_admin', 'Glewlwyd admin scope'); INSERT INTO g_scope (gs_name, gs_description) VALUES ('g_profile', 'Glewlwyd profile scope'); -- Create Glewlwyd administration application client connection INSERT INTO g_client (gc_name, gc_description, gc_client_id) VALUES ('admin app', 'Glewlwyd administration app', 'g_admin'); INSERT INTO g_redirect_uri (gru_name, gru_uri, gc_id) VALUES ('uri_g_admin', '../app/index.html', (SELECT gc_id from g_client WHERE gc_client_id='g_admin')); INSERT INTO g_client_authorization_type (gc_client_id, got_id) VALUES ('g_admin', (SELECT got_id from g_authorization_type WHERE got_name='code')); INSERT INTO g_client_authorization_type (gc_client_id, got_id) VALUES ('g_admin', (SELECT got_id from g_authorization_type WHERE got_name='token')); -- Create admin user with admin scope INSERT INTO g_user (gu_login, gu_name, gu_email, gu_password, gu_enabled) VALUES ('admin', 'The Boss', 'boss@glewlwyd.domain', '{SHA}W6ph5Mm5Pz8GgiULbPgzG37mj9g=', 1); INSERT INTO g_user_scope (gu_id, gs_id) VALUES ((SELECT gu_id from g_user WHERE gu_login='admin'), (SELECT gs_id from g_scope WHERE gs_name='g_admin')); INSERT INTO g_user_scope (gu_id, gs_id) VALUES ((SELECT gu_id from g_user WHERE gu_login='admin'), (SELECT gs_id from g_scope WHERE gs_name='g_profile')); glewlwyd-1.3.1/database/init-sqlite3-sha256.sql000066400000000000000000000277321322667720100212130ustar00rootroot00000000000000-- ----------------------------------------------------- -- -- Sqlite3 Database/SHA256 encoding -- -- Initialize Glewlwyd Database for the backend server -- -- The administration client app -- -- And the default user 'admin' with password 'password' -- -- ----------------------------------------------------- -- DROP TABLE IF EXISTS `g_refresh_token_scope`; DROP TABLE IF EXISTS `g_code_scope`; DROP TABLE IF EXISTS `g_code`; DROP TABLE IF EXISTS `g_client_user_scope`; DROP TABLE IF EXISTS `g_client_authorization_type`; DROP TABLE IF EXISTS `g_resource_scope`; DROP TABLE IF EXISTS `g_client_scope`; DROP TABLE IF EXISTS `g_user_scope`; DROP TABLE IF EXISTS `g_client_scope`; DROP TABLE IF EXISTS `g_access_token`; DROP TABLE IF EXISTS `g_refresh_token`; DROP TABLE IF EXISTS `g_session`; DROP TABLE IF EXISTS `g_resource`; DROP TABLE IF EXISTS `g_reset_password`; DROP TABLE IF EXISTS `g_redirect_uri`; DROP TABLE IF EXISTS `g_client`; DROP TABLE IF EXISTS `g_authorization_type`; DROP TABLE IF EXISTS `g_scope`; DROP TABLE IF EXISTS `g_user`; -- ----------- -- -- Data tables -- -- ----------- -- -- User table, contains registered users with their password encrypted CREATE TABLE `g_user` ( `gu_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gu_name` TEXT DEFAULT '', `gu_email` TEXT DEFAULT '', `gu_login` TEXT NOT NULL UNIQUE, `gu_password` TEXT NOT NULL, `gu_additional_property_value` TEXT, `gu_enabled` INTEGER DEFAULT 1 ); CREATE INDEX `i_g_user` ON `g_user`(`gu_id`); CREATE INDEX `i_g_user_name` ON `g_user`(`gu_name`); CREATE INDEX `i_g_user_login` ON `g_user`(`gu_login`); -- Scope table, contain all scope values available CREATE TABLE `g_scope` ( `gs_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gs_name` TEXT NOT NULL, `gs_description` TEXT DEFAULT '' ); CREATE INDEX `i_g_scope` ON `g_scope`(`gs_id`); CREATE INDEX `i_g_scope_name` ON `g_scope`(`gs_name`); -- Authorization type table, to store authorization type available CREATE TABLE `g_authorization_type` ( `got_id` INTEGER PRIMARY KEY AUTOINCREMENT, `got_code` INTEGER NOT NULL UNIQUE, -- 0: Authorization Code Grant, 1: Code Grant, 2: Implicit Grant, 3: Resource Owner Password Credentials Grant, 4: Client Credentials Grant `got_name` TEXT NOT NULL, `got_description` TEXT DEFAULT '', `got_enabled` INTEGER DEFAULT 1 ); CREATE INDEX `i_g_authorization_type` ON `g_authorization_type`(`got_id`); CREATE INDEX `i_g_authorization_name` ON `g_authorization_type`(`got_name`); CREATE INDEX `i_g_authorization_code` ON `g_authorization_type`(`got_code`); -- Client table, contains all registered clients with their client_id CREATE TABLE `g_client` ( `gc_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gc_name` TEXT NOT NULL, `gc_description` TEXT DEFAULT '', `gc_client_id` TEXT NOT NULL UNIQUE, `gc_client_password` TEXT, `gc_confidential` INTEGER DEFAULT 0, `gc_enabled` INTEGER DEFAULT 1 ); CREATE INDEX `i_g_client` ON `g_client`(`gc_id`); CREATE INDEX `i_g_client_name` ON `g_client`(`gc_name`); CREATE INDEX `i_g_client_id` ON `g_client`(`gc_client_id`); -- Redirect URI, contains all registered redirect_uti values for the clients CREATE TABLE `g_redirect_uri` ( `gru_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gc_id` INTEGER NOT NULL, `gru_name` TEXT NOT NULL, `gru_uri` TEXT, FOREIGN KEY(`gc_id`) REFERENCES `g_client`(`gc_id`) ON DELETE CASCADE ); CREATE INDEX `i_g_redirect_uri` ON `g_redirect_uri`(`gru_id`); -- Resource table, contains all registered resource server CREATE TABLE `g_resource` ( `gr_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gr_name` TEXT NOT NULL UNIQUE, `gr_description` TEXT DEFAULT '', `gr_uri` TEXT ); CREATE INDEX `i_g_resource` ON `g_resource`(`gr_id`); CREATE INDEX `i_g_resource_name` ON `g_resource`(`gr_name`); -- Reset a user password CREATE TABLE `g_reset_password` ( `grp_id` INTEGER PRIMARY KEY AUTOINCREMENT, `grp_username` TEXT NOT NULL, `grp_ip_source` TEXT NOT NULL, `grp_token` TEXT NOT NULL, `grp_enabled` INTEGER DEFAULT 1, `grp_issued_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, `grp_reset_at` TIMESTAMP NULL ); CREATE INDEX `i_g_reset_password` ON `g_reset_password`(`grp_id`); CREATE INDEX `i_g_reset_password_username` ON `g_reset_password`(`grp_username`); -- ------------ -- -- Token tables -- -- ------------ -- -- Refresh token table, to store a signature and meta information on all refresh_tokens sent CREATE TABLE `g_refresh_token` ( `grt_id` INTEGER PRIMARY KEY AUTOINCREMENT, `grt_hash` TEXT NOT NULL, `grt_authorization_type` INTEGER NOT NULL, -- 0: Authorization Code Grant, 1: Implicit Grant, 2: Resource Owner Password Credentials Grant, 3: Client Credentials Grant `grt_username` TEXT NOT NULL, `gc_client_id` TEXT, `grt_scope` TEXT, `grt_issued_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, `grt_last_seen` TIMESTAMP NULL, `grt_expired_at` TIMESTAMP NULL, `grt_ip_source` TEXT NOT NULL, `grt_enabled` INTEGER DEFAULT 1 ); CREATE INDEX `i_g_refresh_token` ON `g_refresh_token`(`grt_id`); CREATE INDEX `i_g_refresh_token_username` ON `g_refresh_token`(`grt_username`); -- Access token table, to store meta information on access_token sent CREATE TABLE `g_access_token` ( `gat_id` INTEGER PRIMARY KEY AUTOINCREMENT, `grt_id` INTEGER, `gat_authorization_type` INTEGER NOT NULL, -- 0: Authorization Code Grant, 1: Implicit Grant, 2: Resource Owner Password Credentials Grant, 3: Client Credentials Grant `gat_issued_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, `gat_ip_source` TEXT NOT NULL, FOREIGN KEY(`grt_id`) REFERENCES `g_refresh_token`(`grt_id`) ON DELETE CASCADE ); CREATE INDEX `i_g_access_token` ON `g_access_token`(`gat_id`); -- Session table, to store signature and meta information on session tokens sent CREATE TABLE `g_session` ( `gss_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gss_hash` TEXT NOT NULL, `gss_username` TEXT NOT NULL, `gss_issued_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, `gss_last_seen` TIMESTAMP NULL, `gss_expired_at` TIMESTAMP NULL, `gss_ip_source` TEXT NOT NULL, `gss_enabled` INTEGER DEFAULT 1 ); CREATE INDEX `i_g_session` ON `g_session`(`gss_id`); CREATE INDEX `i_g_session_username` ON `g_session`(`gss_username`); -- -------------- -- -- Linking tables -- -- -------------- -- -- User scope table, to store scope available for each user CREATE TABLE `g_user_scope` ( `gus_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gu_id` INTEGER NOT NULL, `gs_id` INTEGER NOT NULL, FOREIGN KEY(`gu_id`) REFERENCES `g_user`(`gu_id`) ON DELETE CASCADE, FOREIGN KEY(`gs_id`) REFERENCES `g_scope`(`gs_id`) ON DELETE CASCADE ); CREATE INDEX `i_g_user_scope` ON `g_user_scope`(`gus_id`); -- Client scope table, to store scope available for a client on client authentication CREATE TABLE `g_client_scope` ( `gcs_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gc_id` INTEGER NOT NULL, `gs_id` INTEGER NOT NULL, FOREIGN KEY(`gc_id`) REFERENCES `g_client`(`gc_id`) ON DELETE CASCADE, FOREIGN KEY(`gs_id`) REFERENCES `g_scope`(`gs_id`) ON DELETE CASCADE ); CREATE INDEX `i_g_client_scope` ON `g_client_scope`(`gcs_id`); -- Resource scope table, to store scope required for a resource service CREATE TABLE `g_resource_scope` ( `grs_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gr_id` INTEGER NOT NULL, `gs_id` INTEGER NOT NULL, FOREIGN KEY(`gr_id`) REFERENCES `g_resource`(`gr_id`) ON DELETE CASCADE, FOREIGN KEY(`gs_id`) REFERENCES `g_scope`(`gs_id`) ON DELETE CASCADE ); CREATE INDEX `i_g_resource_scope` ON `g_resource_scope`(`grs_id`); -- Client authorization type table, to store authorization types available for the client CREATE TABLE `g_client_authorization_type` ( `gcat_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gc_client_id` TEXT NOT NULL, `got_id` INTEGER NOT NULL, FOREIGN KEY(`got_id`) REFERENCES `g_authorization_type`(`got_id`) ON DELETE CASCADE ); CREATE INDEX `i_g_client_authorization_type` ON `g_client_authorization_type`(`gcat_id`); -- Client user scope table, to store the authorization of the user to use scope for this client CREATE TABLE `g_client_user_scope` ( `gcus_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gc_client_id` TEXT NOT NULL, `gco_username` TEXT NOT NULL, `gs_id` INTEGER NOT NULL, FOREIGN KEY(`gs_id`) REFERENCES `g_scope`(`gs_id`) ON DELETE CASCADE ); CREATE INDEX `i_g_client_user_scope` ON `g_client_user_scope`(`gcus_id`); CREATE INDEX `i_g_client_user_scope_username` ON `g_client_user_scope`(`gco_username`); -- Code table, used to store auth code sent with response_type code and validate it with response_type authorization_code CREATE TABLE `g_code` ( `gco_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gco_date` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, `gco_code_hash` TEXT NOT NULL, `gco_ip_source` TEXT NOT NULL, `gco_enabled` INTEGER DEFAULT 1, `gc_client_id` TEXT NOT NULL, `gco_username` TEXT NOT NULL, `gco_redirect_uri` TEXT ); CREATE INDEX `i_g_code` ON `g_code`(`gco_id`); CREATE INDEX `i_g_code_username` ON `g_code`(`gco_username`); -- Code scope table, used to link a generated code to a list of scopes CREATE TABLE `g_code_scope` ( `gcs_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gco_id` INTEGER NOT NULL, `gs_id` INTEGER NOT NULL, FOREIGN KEY(`gco_id`) REFERENCES `g_code`(`gco_id`) ON DELETE CASCADE, FOREIGN KEY(`gs_id`) REFERENCES `g_scope`(`gs_id`) ON DELETE CASCADE ); CREATE INDEX `i_g_code_scope` ON `g_code_scope`(`gcs_id`); -- Refresh token scope table, used to link a generated refresh token to a list of scopes CREATE TABLE `g_refresh_token_scope` ( `grts_id` INTEGER PRIMARY KEY AUTOINCREMENT, `grt_id` INTEGER NOT NULL, `gs_id` INTEGER NOT NULL, FOREIGN KEY(`grt_id`) REFERENCES `g_refresh_token`(`grt_id`) ON DELETE CASCADE, FOREIGN KEY(`gs_id`) REFERENCES `g_scope`(`gs_id`) ON DELETE CASCADE ); CREATE INDEX `i_g_refresh_token_scope` ON `g_refresh_token_scope`(`grts_id`); -- Initialize authorization types INSERT INTO g_authorization_type (got_name, got_code, got_description) VALUES ('authorization_code', 0, 'Authorization Code Grant - Access token: https://tools.ietf.org/html/rfc6749#section-4.1'); INSERT INTO g_authorization_type (got_name, got_code, got_description) VALUES ('code', 1, 'Authorization Code Grant - Authorization: https://tools.ietf.org/html/rfc6749#section-4.1'); INSERT INTO g_authorization_type (got_name, got_code, got_description) VALUES ('token', 2, 'Implicit Grant: https://tools.ietf.org/html/rfc6749#section-4.2'); INSERT INTO g_authorization_type (got_name, got_code, got_description) VALUES ('password', 3, 'Resource Owner Password Credentials Grant: https://tools.ietf.org/html/rfc6749#section-4.3'); INSERT INTO g_authorization_type (got_name, got_code, got_description) VALUES ('client_credentials', 4, 'Client Credentials Grant: https://tools.ietf.org/html/rfc6749#section-4.4'); -- Create default scopes INSERT INTO g_scope (gs_name, gs_description) VALUES ('g_admin', 'Glewlwyd admin scope'); INSERT INTO g_scope (gs_name, gs_description) VALUES ('g_profile', 'Glewlwyd profile scope'); -- Create Glewlwyd administration application client connection INSERT INTO g_client (gc_name, gc_description, gc_client_id) VALUES ('admin app', 'Glewlwyd administration app', 'g_admin'); INSERT INTO g_redirect_uri (gru_name, gru_uri, gc_id) VALUES ('uri_g_admin', '../app/index.html', (SELECT gc_id from g_client WHERE gc_client_id='g_admin')); INSERT INTO g_client_authorization_type (gc_client_id, got_id) VALUES ('g_admin', (SELECT got_id from g_authorization_type WHERE got_name='code')); INSERT INTO g_client_authorization_type (gc_client_id, got_id) VALUES ('g_admin', (SELECT got_id from g_authorization_type WHERE got_name='token')); -- Create admin user with admin scope INSERT INTO g_user (gu_login, gu_name, gu_email, gu_password, gu_enabled) VALUES ('admin', 'The Boss', 'boss@glewlwyd.domain', '{SHA256}XohImNooBHFR0OVvjcYpJ3NgPQ1qq73WKhHvch0VQtg=', 1); INSERT INTO g_user_scope (gu_id, gs_id) VALUES ((SELECT gu_id from g_user WHERE gu_login='admin'), (SELECT gs_id from g_scope WHERE gs_name='g_admin')); INSERT INTO g_user_scope (gu_id, gs_id) VALUES ((SELECT gu_id from g_user WHERE gu_login='admin'), (SELECT gs_id from g_scope WHERE gs_name='g_profile')); glewlwyd-1.3.1/database/init-sqlite3-sha512.sql000066400000000000000000000300061322667720100211720ustar00rootroot00000000000000-- ----------------------------------------------------- -- -- Sqlite3 Database/SHA512 encoding -- -- Initialize Glewlwyd Database for the backend server -- -- The administration client app -- -- And the default user 'admin' with password 'password' -- -- ----------------------------------------------------- -- DROP TABLE IF EXISTS `g_refresh_token_scope`; DROP TABLE IF EXISTS `g_code_scope`; DROP TABLE IF EXISTS `g_code`; DROP TABLE IF EXISTS `g_client_user_scope`; DROP TABLE IF EXISTS `g_client_authorization_type`; DROP TABLE IF EXISTS `g_resource_scope`; DROP TABLE IF EXISTS `g_client_scope`; DROP TABLE IF EXISTS `g_user_scope`; DROP TABLE IF EXISTS `g_client_scope`; DROP TABLE IF EXISTS `g_access_token`; DROP TABLE IF EXISTS `g_refresh_token`; DROP TABLE IF EXISTS `g_session`; DROP TABLE IF EXISTS `g_resource`; DROP TABLE IF EXISTS `g_reset_password`; DROP TABLE IF EXISTS `g_redirect_uri`; DROP TABLE IF EXISTS `g_client`; DROP TABLE IF EXISTS `g_authorization_type`; DROP TABLE IF EXISTS `g_scope`; DROP TABLE IF EXISTS `g_user`; -- ----------- -- -- Data tables -- -- ----------- -- -- User table, contains registered users with their password encrypted CREATE TABLE `g_user` ( `gu_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gu_name` TEXT DEFAULT '', `gu_email` TEXT DEFAULT '', `gu_login` TEXT NOT NULL UNIQUE, `gu_password` TEXT NOT NULL, `gu_additional_property_value` TEXT, `gu_enabled` INTEGER DEFAULT 1 ); CREATE INDEX `i_g_user` ON `g_user`(`gu_id`); CREATE INDEX `i_g_user_name` ON `g_user`(`gu_name`); CREATE INDEX `i_g_user_login` ON `g_user`(`gu_login`); -- Scope table, contain all scope values available CREATE TABLE `g_scope` ( `gs_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gs_name` TEXT NOT NULL, `gs_description` TEXT DEFAULT '' ); CREATE INDEX `i_g_scope` ON `g_scope`(`gs_id`); CREATE INDEX `i_g_scope_name` ON `g_scope`(`gs_name`); -- Authorization type table, to store authorization type available CREATE TABLE `g_authorization_type` ( `got_id` INTEGER PRIMARY KEY AUTOINCREMENT, `got_code` INTEGER NOT NULL UNIQUE, -- 0: Authorization Code Grant, 1: Code Grant, 2: Implicit Grant, 3: Resource Owner Password Credentials Grant, 4: Client Credentials Grant `got_name` TEXT NOT NULL, `got_description` TEXT DEFAULT '', `got_enabled` INTEGER DEFAULT 1 ); CREATE INDEX `i_g_authorization_type` ON `g_authorization_type`(`got_id`); CREATE INDEX `i_g_authorization_name` ON `g_authorization_type`(`got_name`); CREATE INDEX `i_g_authorization_code` ON `g_authorization_type`(`got_code`); -- Client table, contains all registered clients with their client_id CREATE TABLE `g_client` ( `gc_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gc_name` TEXT NOT NULL, `gc_description` TEXT DEFAULT '', `gc_client_id` TEXT NOT NULL UNIQUE, `gc_client_password` TEXT, `gc_confidential` INTEGER DEFAULT 0, `gc_enabled` INTEGER DEFAULT 1 ); CREATE INDEX `i_g_client` ON `g_client`(`gc_id`); CREATE INDEX `i_g_client_name` ON `g_client`(`gc_name`); CREATE INDEX `i_g_client_id` ON `g_client`(`gc_client_id`); -- Redirect URI, contains all registered redirect_uti values for the clients CREATE TABLE `g_redirect_uri` ( `gru_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gc_id` INTEGER NOT NULL, `gru_name` TEXT NOT NULL, `gru_uri` TEXT, FOREIGN KEY(`gc_id`) REFERENCES `g_client`(`gc_id`) ON DELETE CASCADE ); CREATE INDEX `i_g_redirect_uri` ON `g_redirect_uri`(`gru_id`); -- Resource table, contains all registered resource server CREATE TABLE `g_resource` ( `gr_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gr_name` TEXT NOT NULL UNIQUE, `gr_description` TEXT DEFAULT '', `gr_uri` TEXT ); CREATE INDEX `i_g_resource` ON `g_resource`(`gr_id`); CREATE INDEX `i_g_resource_name` ON `g_resource`(`gr_name`); -- Reset a user password CREATE TABLE `g_reset_password` ( `grp_id` INTEGER PRIMARY KEY AUTOINCREMENT, `grp_username` TEXT NOT NULL, `grp_ip_source` TEXT NOT NULL, `grp_token` TEXT NOT NULL, `grp_enabled` INTEGER DEFAULT 1, `grp_issued_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, `grp_reset_at` TIMESTAMP NULL ); CREATE INDEX `i_g_reset_password` ON `g_reset_password`(`grp_id`); CREATE INDEX `i_g_reset_password_username` ON `g_reset_password`(`grp_username`); -- ------------ -- -- Token tables -- -- ------------ -- -- Refresh token table, to store a signature and meta information on all refresh_tokens sent CREATE TABLE `g_refresh_token` ( `grt_id` INTEGER PRIMARY KEY AUTOINCREMENT, `grt_hash` TEXT NOT NULL, `grt_authorization_type` INTEGER NOT NULL, -- 0: Authorization Code Grant, 1: Implicit Grant, 2: Resource Owner Password Credentials Grant, 3: Client Credentials Grant `grt_username` TEXT NOT NULL, `gc_client_id` TEXT, `grt_scope` TEXT, `grt_issued_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, `grt_last_seen` TIMESTAMP NULL, `grt_expired_at` TIMESTAMP NULL, `grt_ip_source` TEXT NOT NULL, `grt_enabled` INTEGER DEFAULT 1 ); CREATE INDEX `i_g_refresh_token` ON `g_refresh_token`(`grt_id`); CREATE INDEX `i_g_refresh_token_username` ON `g_refresh_token`(`grt_username`); -- Access token table, to store meta information on access_token sent CREATE TABLE `g_access_token` ( `gat_id` INTEGER PRIMARY KEY AUTOINCREMENT, `grt_id` INTEGER, `gat_authorization_type` INTEGER NOT NULL, -- 0: Authorization Code Grant, 1: Implicit Grant, 2: Resource Owner Password Credentials Grant, 3: Client Credentials Grant `gat_issued_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, `gat_ip_source` TEXT NOT NULL, FOREIGN KEY(`grt_id`) REFERENCES `g_refresh_token`(`grt_id`) ON DELETE CASCADE ); CREATE INDEX `i_g_access_token` ON `g_access_token`(`gat_id`); -- Session table, to store signature and meta information on session tokens sent CREATE TABLE `g_session` ( `gss_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gss_hash` TEXT NOT NULL, `gss_username` TEXT NOT NULL, `gss_issued_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, `gss_last_seen` TIMESTAMP NULL, `gss_expired_at` TIMESTAMP NULL, `gss_ip_source` TEXT NOT NULL, `gss_enabled` INTEGER DEFAULT 1 ); CREATE INDEX `i_g_session` ON `g_session`(`gss_id`); CREATE INDEX `i_g_session_username` ON `g_session`(`gss_username`); -- -------------- -- -- Linking tables -- -- -------------- -- -- User scope table, to store scope available for each user CREATE TABLE `g_user_scope` ( `gus_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gu_id` INTEGER NOT NULL, `gs_id` INTEGER NOT NULL, FOREIGN KEY(`gu_id`) REFERENCES `g_user`(`gu_id`) ON DELETE CASCADE, FOREIGN KEY(`gs_id`) REFERENCES `g_scope`(`gs_id`) ON DELETE CASCADE ); CREATE INDEX `i_g_user_scope` ON `g_user_scope`(`gus_id`); -- Client scope table, to store scope available for a client on client authentication CREATE TABLE `g_client_scope` ( `gcs_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gc_id` INTEGER NOT NULL, `gs_id` INTEGER NOT NULL, FOREIGN KEY(`gc_id`) REFERENCES `g_client`(`gc_id`) ON DELETE CASCADE, FOREIGN KEY(`gs_id`) REFERENCES `g_scope`(`gs_id`) ON DELETE CASCADE ); CREATE INDEX `i_g_client_scope` ON `g_client_scope`(`gcs_id`); -- Resource scope table, to store scope required for a resource service CREATE TABLE `g_resource_scope` ( `grs_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gr_id` INTEGER NOT NULL, `gs_id` INTEGER NOT NULL, FOREIGN KEY(`gr_id`) REFERENCES `g_resource`(`gr_id`) ON DELETE CASCADE, FOREIGN KEY(`gs_id`) REFERENCES `g_scope`(`gs_id`) ON DELETE CASCADE ); CREATE INDEX `i_g_resource_scope` ON `g_resource_scope`(`grs_id`); -- Client authorization type table, to store authorization types available for the client CREATE TABLE `g_client_authorization_type` ( `gcat_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gc_client_id` TEXT NOT NULL, `got_id` INTEGER NOT NULL, FOREIGN KEY(`got_id`) REFERENCES `g_authorization_type`(`got_id`) ON DELETE CASCADE ); CREATE INDEX `i_g_client_authorization_type` ON `g_client_authorization_type`(`gcat_id`); -- Client user scope table, to store the authorization of the user to use scope for this client CREATE TABLE `g_client_user_scope` ( `gcus_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gc_client_id` TEXT NOT NULL, `gco_username` TEXT NOT NULL, `gs_id` INTEGER NOT NULL, FOREIGN KEY(`gs_id`) REFERENCES `g_scope`(`gs_id`) ON DELETE CASCADE ); CREATE INDEX `i_g_client_user_scope` ON `g_client_user_scope`(`gcus_id`); CREATE INDEX `i_g_client_user_scope_username` ON `g_client_user_scope`(`gco_username`); -- Code table, used to store auth code sent with response_type code and validate it with response_type authorization_code CREATE TABLE `g_code` ( `gco_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gco_date` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, `gco_code_hash` TEXT NOT NULL, `gco_ip_source` TEXT NOT NULL, `gco_enabled` INTEGER DEFAULT 1, `gc_client_id` TEXT NOT NULL, `gco_username` TEXT NOT NULL, `gco_redirect_uri` TEXT ); CREATE INDEX `i_g_code` ON `g_code`(`gco_id`); CREATE INDEX `i_g_code_username` ON `g_code`(`gco_username`); -- Code scope table, used to link a generated code to a list of scopes CREATE TABLE `g_code_scope` ( `gcs_id` INTEGER PRIMARY KEY AUTOINCREMENT, `gco_id` INTEGER NOT NULL, `gs_id` INTEGER NOT NULL, FOREIGN KEY(`gco_id`) REFERENCES `g_code`(`gco_id`) ON DELETE CASCADE, FOREIGN KEY(`gs_id`) REFERENCES `g_scope`(`gs_id`) ON DELETE CASCADE ); CREATE INDEX `i_g_code_scope` ON `g_code_scope`(`gcs_id`); -- Refresh token scope table, used to link a generated refresh token to a list of scopes CREATE TABLE `g_refresh_token_scope` ( `grts_id` INTEGER PRIMARY KEY AUTOINCREMENT, `grt_id` INTEGER NOT NULL, `gs_id` INTEGER NOT NULL, FOREIGN KEY(`grt_id`) REFERENCES `g_refresh_token`(`grt_id`) ON DELETE CASCADE, FOREIGN KEY(`gs_id`) REFERENCES `g_scope`(`gs_id`) ON DELETE CASCADE ); CREATE INDEX `i_g_refresh_token_scope` ON `g_refresh_token_scope`(`grts_id`); -- Initialize authorization types INSERT INTO g_authorization_type (got_name, got_code, got_description) VALUES ('authorization_code', 0, 'Authorization Code Grant - Access token: https://tools.ietf.org/html/rfc6749#section-4.1'); INSERT INTO g_authorization_type (got_name, got_code, got_description) VALUES ('code', 1, 'Authorization Code Grant - Authorization: https://tools.ietf.org/html/rfc6749#section-4.1'); INSERT INTO g_authorization_type (got_name, got_code, got_description) VALUES ('token', 2, 'Implicit Grant: https://tools.ietf.org/html/rfc6749#section-4.2'); INSERT INTO g_authorization_type (got_name, got_code, got_description) VALUES ('password', 3, 'Resource Owner Password Credentials Grant: https://tools.ietf.org/html/rfc6749#section-4.3'); INSERT INTO g_authorization_type (got_name, got_code, got_description) VALUES ('client_credentials', 4, 'Client Credentials Grant: https://tools.ietf.org/html/rfc6749#section-4.4'); -- Create default scopes INSERT INTO g_scope (gs_name, gs_description) VALUES ('g_admin', 'Glewlwyd admin scope'); INSERT INTO g_scope (gs_name, gs_description) VALUES ('g_profile', 'Glewlwyd profile scope'); -- Create Glewlwyd administration application client connection INSERT INTO g_client (gc_name, gc_description, gc_client_id) VALUES ('admin app', 'Glewlwyd administration app', 'g_admin'); INSERT INTO g_redirect_uri (gru_name, gru_uri, gc_id) VALUES ('uri_g_admin', '../app/index.html', (SELECT gc_id from g_client WHERE gc_client_id='g_admin')); INSERT INTO g_client_authorization_type (gc_client_id, got_id) VALUES ('g_admin', (SELECT got_id from g_authorization_type WHERE got_name='code')); INSERT INTO g_client_authorization_type (gc_client_id, got_id) VALUES ('g_admin', (SELECT got_id from g_authorization_type WHERE got_name='token')); -- Create admin user with admin scope INSERT INTO g_user (gu_login, gu_name, gu_email, gu_password, gu_enabled) VALUES ('admin', 'The Boss', 'boss@glewlwyd.domain', '{SHA512}sQnzu7wkTrgkQZF+0G1hi5AI3Qmzvv0bXgc5THBqi7mAsdd4Xll27ASbRt9fEyavWi6m0QP9B8lThf+rDKy8hg==', 1); INSERT INTO g_user_scope (gu_id, gs_id) VALUES ((SELECT gu_id from g_user WHERE gu_login='admin'), (SELECT gs_id from g_scope WHERE gs_name='g_admin')); INSERT INTO g_user_scope (gu_id, gs_id) VALUES ((SELECT gu_id from g_user WHERE gu_login='admin'), (SELECT gs_id from g_scope WHERE gs_name='g_profile')); glewlwyd-1.3.1/database/init-webapp-only.sql000066400000000000000000000011051322667720100210400ustar00rootroot00000000000000 INSERT INTO g_client (gc_name, gc_description, gc_client_id) VALUES ('admin app', 'Glewlwyd administration app', 'g_admin'); INSERT INTO g_redirect_uri (gru_name, gru_uri, gc_id) VALUES ('uri_g_admin', '../app/index.html', (SELECT gc_id from g_client WHERE gc_client_id='g_admin')); INSERT INTO g_client_authorization_type (gc_client_id, got_id) VALUES ('g_admin', (SELECT got_id from g_authorization_type WHERE got_name='code')); INSERT INTO g_client_authorization_type (gc_client_id, got_id) VALUES ('g_admin', (SELECT got_id from g_authorization_type WHERE got_name='token')); glewlwyd-1.3.1/glewlwyd-init000077500000000000000000000016751322667720100161160ustar00rootroot00000000000000#!/bin/sh ### BEGIN INIT INFO # Provides: glewlwyd # Required-Start: $network $time # Required-Stop: $network $time # Should-Start: # Should-Stop: # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Starts the glewlwyd daemon # Description: ### END INIT INFO user=pi group=pi prefix=/usr/bin exec_prefix=${prefix} glewlwyd=${prefix}/glewlwyd glewlwydconf=--config=/etc/glewlwyd.conf pidfile=/var/run/glewlwyd.pid case "$1" in stop) echo -n "Stopping Glewlwyd " start-stop-daemon --stop --pidfile $pidfile echo "OK" ;; start) echo -n "Starting Glewlwyd " touch $pidfile chown $user:$group $pidfile start-stop-daemon --start --quiet --make-pidfile --pidfile $pidfile \ --chuid $user:$group --background --exec $glewlwyd -- $glewlwydconf echo "OK" ;; restart) $0 stop $0 start ;; *) echo "Usage: $0 {start|stop|restart}" exit 1 ;; esac glewlwyd-1.3.1/glewlwyd.conf.sample000066400000000000000000000172311322667720100173510ustar00rootroot00000000000000# # # Glewlwyd OAuth2 Authorization Server # # Copyright 2016-2017 Nicolas Mora # Gnu Public License V3 # # # port to open for remote commands port=4593 # url prefix url_prefix="api" # path to static files for /app url static_files_path="/var/www/" # static files prefix static_files_prefix = "app" # mime types for static files static_files_mime_types = ( { extension = ".html" type = "text/html" }, { extension = ".css" type = "text/css" }, { extension = ".js" type = "application/javascript" }, { extension = ".png" type = "image/png" }, { extension = ".jpg" type = "image/jpeg" }, { extension = ".jpeg" type = "image/jpeg" }, { extension = ".ttf" type = "font/ttf" }, { extension = ".woff" type = "font/woff" }, { extension = ".woff2" type = "font/woff2" }, { extension = ".map" type = "application/octet-stream" }, { extension = ".ico" type = "image/x-icon" } ) # access-control-allow-origin value allow_origin="*" # log mode (console, syslog, file) log_mode="console" # log level: NONE, ERROR, WARNING, INFO, DEBUG log_level="DEBUG" # output to log file (required if log_mode is file) log_file="/tmp/glewlwyd.log" # use scope for access control (default false) use_scope=true # refresh token expiration in seconds, default is 2 weeks refresh_token_expiation=1209600 # access token expiration in seconds, default is 1 hour access_token_expiration=3600 # session expiration, default is 4 weeks session_expiration=2419200 # session key session_key="GLEWLWYD_SESSION_ID" # admin scope name admin_scope="g_admin" # profile scope name profile_scope="g_profile" # additional property name that will be included in access tokens, uncomment to enable this feature # additional_property_name = "new_property" # code expiration in seconds, default is 10 minutes code_expiration=600 # TLS/SSL configuration values use_secure_connection=false secure_connection_key_file="cert.key" secure_connection_pem_file="cert.pem" # login and grant urls login_url="https://example.org/glewlwyd/app/login.html?" grant_url="https://example.org/glewlwyd/app/grant.html?" # Reset password configuration reset_password=true # optional, default false reset_password_config = { # SMTP parameters smtp_host="localhost" # mandatory smtp_port=25 # optional, default 25 smtp_use_tls=false # optional, default false smtp_verify_certificate=false # optional, default false # smtp_user="user" # optional, default no value # smtp_password="password" # optional, default no value token_expiration=604800 # in seconds, optional, default 604800 email_from="glewlwyd@example.org" # mandatory email_subject="Glewlwyd email reset" # mandatory email_template="reset.eml" # mandatory page_url_prefix="https://example.org/glewlwyd/app/reset.html?user=$USERNAME&code=$TOKEN" # mandatory } # Algorithms available are SHA1, SHA256, SHA512, MD5, default is SHA256 hash_algorithm = "SHA256" # MariaDB/Mysql database connection database = { type = "mariadb"; host = "localhost"; user = "glewlwyd"; password = "glewlwyd"; dbname = "glewlwyd"; port = 0; }; # SQLite database connection # database = # { # type = "sqlite3"; # path = "/tmp/glewlwyd.db"; # }; # Authentication configuration authentication = { http_auth = false http_auth_url = "https://example.com/auth/validate" # mandatory if http_auth is true set this value to "http://localhost:2884/auth" for unit tests http_auth_check_certificate = true # optional, default true database_auth = true ldap_auth = true uri = "ldap://localhost" bind_dn = "cn=operator,dc=example,dc=org" bind_passwd = "password" base_search_user = "ou=user,dc=example,dc=org" # Read parameters filter_user_read = "objectClass=inetOrgPerson" login_property_user_read = "cn" scope_property_user_read = "o" email_property_user_read = "mail" name_property_user_read = "sn" additional_property_value_read = "memberOf" # will fill the jwt property `group` with the content of the LDAP property `memberOf`, optional, leave empty if no use # Write parameters ldap_user_write = true rdn_property_user_write = "cn" # Single value login_property_user_write = "cn" # Multiple values separated by a comma scope_property_user_write = "o" # Multiple values separated by a comma email_property_user_write = "mail" # Multiple values separated by a comma additional_property_value_write = "memberOf" # Multiple values separated by a comma name_property_user_write = "sn" password_property_user_write = "userPassword" # Single value password_algorithm_user_write = "SSHA" # Single value, values available are SSHA, SHA, SMD5, MD5 or PLAIN object_class_user_write = "top,person,organizationalPerson,inetOrgPerson" # Multiple values separated by a comma base_search_client = "ou=client,dc=example,dc=org" # Read parameters filter_client_read = "objectClass=inetOrgPerson" client_id_property_client_read = "cn" scope_property_client_read = "o" name_property_client_read = "sn" description_property_client_read = "description" redirect_uri_property_client_read = "labeledURI" confidential_property_client_read = "employeeType" # Write parameters ldap_client_write = true rdn_property_client_write = "cn" # Single value client_id_property_client_write = "cn" # Multiple values separated by a comma scope_property_client_write = "o" # Multiple values separated by a comma name_property_client_write = "sn" # Multiple values separated by a comma description_property_client_write = "description" # Multiple values separated by a comma redirect_uri_property_client_write = "labeledURI" # Multiple values separated by a comma password_property_client_write = "userPassword"# Single value confidential_property_client_write = "employeeType" password_algorithm_client_write = "SSHA" # Single value, values available are SSHA, SHA, SMD5, MD5 or PLAIN object_class_client_write = "top,person,organizationalPerson,inetOrgPerson" # Multiple values separated by a comma } # jwt parameters jwt = { # key size for algorithms, values available are 256, 384 or 512, default 512 key_size = 512 # Use RSA algorithm to sign tokens (asymetric) use_rsa = false # path to the key (private) certificate file to sign tokens rsa_key_file = "private.key" # path to the public certificate file to validate signatures rsa_pub_file = "public.pem" # Use ECDSA algorithm to sign tokens (asymetric) use_ecdsa = false # path to the key (private) certificate file to sign tokens ecdsa_key_file = "private.key" # path to the public certificate file to validate signatures ecdsa_pub_file = "public.pem" # Use SHA algorithm to sign tokens (symetric) use_sha = true # characters used to generate and validate the token sha_secret = "secret" } glewlwyd-1.3.1/glewlwyd.service000066400000000000000000000005251322667720100166020ustar00rootroot00000000000000[Unit] Description=Glewlwyd OAuth2 authentication provider After=network.target [Service] Type=simple EnvironmentFile=-/usr/local/etc/glewlwyd/glewlwyd.conf ExecStart=/usr/local/bin/glewlwyd --config-file=/usr/local/etc/glewlwyd/glewlwyd.conf User=pi KillMode=process Restart=on-failure [Install] WantedBy=multi-user.target Alias=glewlwyd glewlwyd-1.3.1/reset.eml000066400000000000000000000000711322667720100151770ustar00rootroot00000000000000Hello $USERNAME, Click here to reset your password: $URLglewlwyd-1.3.1/resources/000077500000000000000000000000001322667720100153725ustar00rootroot00000000000000glewlwyd-1.3.1/resources/README.md000066400000000000000000000006211322667720100166500ustar00rootroot00000000000000# Token validation for resource services This folder contains example of token validation for a resource service. A token is provided in the HTTP request as described in the [RFC 6750](https://tools.ietf.org/html/rfc6750) concerning the Bearer token. If you want to add other exampes in different languages or different contexts for a Glewlwyd token, feel free to post a pull request or contact me. glewlwyd-1.3.1/resources/ulfius/000077500000000000000000000000001322667720100167015ustar00rootroot00000000000000glewlwyd-1.3.1/resources/ulfius/README.md000066400000000000000000000034141322667720100201620ustar00rootroot00000000000000# Token validation for resource service based on [Ulfius](https://github.com/babelouest/ulfius) framework These files contain an authentication callback for Ulfius framework to validate a Glewlwyd access token with the correct scope. To use this file, you must create a `struct _glewlwyd_resource_config` with your specific parameters: ```C struct _glewlwyd_resource_config { int method; // Values are G_METHOD_HEADER, G_METHOD_BODY or G_METHOD_URL for the access_token location, see https://tools.ietf.org/html/rfc6750 char * oauth_scope; // Scope values required by the resource, multiple values must be separated by a space character char * jwt_decode_key; // The key used to decode an access token jwt_alg_t jwt_alg; // The algorithm used to encode a token, see http://benmcollins.github.io/libjwt/ char * realm; // Optional, a realm value that will be sent back to the client }; ``` Then, you use `callback_check_glewlwyd_access_token` as authentication callback for your ulfius endpoints that need to validate a glewlwyd access_token, example: ```C struct _glewlwyd_resource_config g_config; g_config.method = G_METHOD_HEADER; g_config.oauth_scope = "scope1"; g_config.jwt_decode_key = "secret"; g_config.jwt_alg = JWT_ALG_HS512; g_config.realm = "example"; // First example, add an endpoint with the authentication callback callback_check_glewlwyd_access_token ulfius_add_endpoint_by_val(instance, "GET", "/api", "/resurce/:id", &callback_check_glewlwyd_access_token, (void*)g_config, NULL, &callback_get_resource, (void*)config); // Second example, use callback_check_glewlwyd_access_token as a default authentication callback ulfius_set_default_auth_function(instance, &callback_check_glewlwyd_access_token, (void*)g_config, NULL); ``` glewlwyd-1.3.1/resources/ulfius/glewlwyd_resource.c000066400000000000000000000236001322667720100226130ustar00rootroot00000000000000/** * * Glewlwyd OAuth2 Authorization token check * * Copyright 2016-2018 Nicolas Mora * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * License as published by the Free Software Foundation; * version 3 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU GENERAL PUBLIC LICENSE for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ #include #include #include #include #include #include "glewlwyd_resource.h" /** * check if bearer token has some of the specified scope */ int callback_check_glewlwyd_access_token (const struct _u_request * request, struct _u_response * response, void * user_data) { struct _glewlwyd_resource_config * config = (struct _glewlwyd_resource_config *)user_data; json_t * j_access_token = NULL, * j_res_scope; int res = U_CALLBACK_UNAUTHORIZED, res_validity; const char * token_value = NULL; char * response_value = NULL; if (config != NULL) { switch (config->method) { case G_METHOD_HEADER: if (u_map_get(request->map_header, HEADER_AUTHORIZATION) != NULL) { if (o_strstr(u_map_get(request->map_header, HEADER_AUTHORIZATION), HEADER_PREFIX_BEARER) == u_map_get(request->map_header, HEADER_AUTHORIZATION)) { token_value = u_map_get(request->map_header, HEADER_AUTHORIZATION) + o_strlen(HEADER_PREFIX_BEARER); } } break; case G_METHOD_BODY: if (o_strstr(u_map_get(request->map_header, ULFIUS_HTTP_HEADER_CONTENT), MHD_HTTP_POST_ENCODING_FORM_URLENCODED) != NULL && u_map_get(request->map_post_body, BODY_URL_PARAMETER) != NULL) { token_value = u_map_get(request->map_post_body, BODY_URL_PARAMETER); } break; case G_METHOD_URL: token_value = u_map_get(request->map_url, BODY_URL_PARAMETER); break; } if (token_value != NULL) { j_access_token = access_token_check_signature(config, token_value); if (check_result_value(j_access_token, G_OK)) { res_validity = access_token_check_validity(config, json_object_get(j_access_token, "grants")); if (res_validity == G_OK) { j_res_scope = access_token_check_scope(config, json_object_get(j_access_token, "grants")); if (check_result_value(j_res_scope, G_ERROR_INSUFFICIENT_SCOPE)) { response_value = msprintf(HEADER_PREFIX_BEARER "%s%s%serror=\"insufficient_scope\",error_description=\"The scope is invalid\"", (config->realm!=NULL?"realm=":""), (config->realm!=NULL?config->realm:""), (config->realm!=NULL?",":"")); u_map_put(response->map_header, HEADER_RESPONSE, response_value); o_free(response_value); } else if (!check_result_value(j_res_scope, G_OK)) { response_value = msprintf(HEADER_PREFIX_BEARER "%s%s%serror=\"invalid_request\",error_description=\"Internal server error\"", (config->realm!=NULL?"realm=":""), (config->realm!=NULL?config->realm:""), (config->realm!=NULL?",":"")); u_map_put(response->map_header, HEADER_RESPONSE, response_value); o_free(response_value); } else { res = U_CALLBACK_CONTINUE; response->shared_data = (void*)json_pack("{sssO}", "username", json_string_value(json_object_get(json_object_get(j_access_token, "grants"), "username")), "scope", json_object_get(j_res_scope, "scope")); if (response->shared_data == NULL) { res = U_CALLBACK_ERROR; } } json_decref(j_res_scope); } else if (res_validity == G_ERROR_INVALID_TOKEN) { response_value = msprintf(HEADER_PREFIX_BEARER "%s%s%serror=\"invalid_request\",error_description=\"The access token is invalid\"", (config->realm!=NULL?"realm=":""), (config->realm!=NULL?config->realm:""), (config->realm!=NULL?",":"")); u_map_put(response->map_header, HEADER_RESPONSE, response_value); o_free(response_value); } else { response_value = msprintf(HEADER_PREFIX_BEARER "%s%s%serror=\"invalid_request\",error_description=\"Internal server error\"", (config->realm!=NULL?"realm=":""), (config->realm!=NULL?config->realm:""), (config->realm!=NULL?",":"")); u_map_put(response->map_header, HEADER_RESPONSE, response_value); o_free(response_value); } } else { response_value = msprintf(HEADER_PREFIX_BEARER "%s%s%serror=\"invalid_request\",error_description=\"The access token is invalid\"", (config->realm!=NULL?"realm=":""), (config->realm!=NULL?config->realm:""), (config->realm!=NULL?",":"")); u_map_put(response->map_header, HEADER_RESPONSE, response_value); o_free(response_value); } json_decref(j_access_token); } else { response_value = msprintf(HEADER_PREFIX_BEARER "%s%s%serror=\"invalid_token\",error_description=\"The access token is missing\"", (config->realm!=NULL?"realm=":""), (config->realm!=NULL?config->realm:""), (config->realm!=NULL?",":"")); u_map_put(response->map_header, HEADER_RESPONSE, response_value); o_free(response_value); } } return res; } /** * Validates if an access_token grants has a valid scope * return the final scope list on success */ json_t * access_token_check_scope(struct _glewlwyd_resource_config * config, json_t * j_access_token) { int i, scope_count_token, scope_count_expected; char ** scope_list_token, ** scope_list_expected; json_t * j_res = NULL, * j_scope_final_list = json_array(); if (j_scope_final_list != NULL) { if (j_access_token != NULL) { scope_count_token = split_string(json_string_value(json_object_get(j_access_token, "scope")), " ", &scope_list_token); scope_count_expected = split_string(config->oauth_scope, " ", &scope_list_expected); if (scope_count_token > 0 && scope_count_expected > 0) { for (i=0; scope_count_expected > 0 && scope_list_expected[i] != NULL; i++) { if (string_array_has_value((const char **)scope_list_token, scope_list_expected[i])) { json_array_append_new(j_scope_final_list, json_string(scope_list_expected[i])); } } if (json_array_size(j_scope_final_list) > 0) { j_res = json_pack("{sisO}", "result", G_OK, "scope", j_scope_final_list); } else { j_res = json_pack("{si}", "result", G_ERROR_INSUFFICIENT_SCOPE); } } else { j_res = json_pack("{si}", "result", G_ERROR_INTERNAL); } free_string_array(scope_list_token); free_string_array(scope_list_expected); } else { j_res = json_pack("{si}", "result", G_ERROR_INVALID_TOKEN); } } else { j_res = json_pack("{si}", "result", G_ERROR_INTERNAL); } json_decref(j_scope_final_list); return j_res; } /** * Validates if an access_token grants has valid parameters: * - username: non empty string * - type: match "access_token" * - iat + expires_in < now */ int access_token_check_validity(struct _glewlwyd_resource_config * config, json_t * j_access_token) { time_t now; json_int_t expiration; int res; if (j_access_token != NULL) { // Token is valid, check type and expiration date time(&now); expiration = json_integer_value(json_object_get(j_access_token, "iat")) + json_integer_value(json_object_get(j_access_token, "expires_in")); if (now < expiration && json_object_get(j_access_token, "type") != NULL && json_is_string(json_object_get(j_access_token, "type")) && 0 == o_strcmp("access_token", json_string_value(json_object_get(j_access_token, "type"))) && json_object_get(j_access_token, "username") != NULL && json_is_string(json_object_get(j_access_token, "username")) && json_string_length(json_object_get(j_access_token, "username")) > 0) { res = G_OK; } else { res = G_ERROR_INVALID_REQUEST; } } else { res = G_ERROR_INVALID_TOKEN; } return res; } /** * validates if the token value is a valid jwt and has a valid signature */ json_t * access_token_check_signature(struct _glewlwyd_resource_config * config, const char * token_value) { json_t * j_return, * j_grants; jwt_t * jwt = NULL; char * grants; if (token_value != NULL) { if (!jwt_decode(&jwt, token_value, (const unsigned char *)config->jwt_decode_key, o_strlen(config->jwt_decode_key)) && jwt_get_alg(jwt) == config->jwt_alg) { grants = jwt_get_grants_json(jwt, NULL); j_grants = json_loads(grants, JSON_DECODE_ANY, NULL); if (j_grants != NULL) { j_return = json_pack("{siso}", "result", G_OK, "grants", j_grants); } else { j_return = json_pack("{si}", "result", G_ERROR); } o_free(grants); } else { j_return = json_pack("{si}", "result", G_ERROR_INVALID_TOKEN); } jwt_free(jwt); } else { j_return = json_pack("{si}", "result", G_ERROR_INVALID_TOKEN); } return j_return; } /** * Return the ayload of an access token */ json_t * access_token_get_payload(const char * token_value) { json_t * j_return, * j_grants; jwt_t * jwt = NULL; char * grants; if (token_value != NULL) { if (!jwt_decode(&jwt, token_value, NULL, 0)) { grants = jwt_get_grants_json(jwt, NULL); j_grants = json_loads(grants, JSON_DECODE_ANY, NULL); if (j_grants != NULL) { j_return = json_pack("{siso}", "result", G_OK, "grants", j_grants); } else { j_return = json_pack("{si}", "result", G_ERROR); } o_free(grants); } else { j_return = json_pack("{si}", "result", G_ERROR_INVALID_TOKEN); } jwt_free(jwt); } else { j_return = json_pack("{si}", "result", G_ERROR_INVALID_TOKEN); } return j_return; } glewlwyd-1.3.1/resources/ulfius/glewlwyd_resource.h000066400000000000000000000035461322667720100226270ustar00rootroot00000000000000/** * * Glewlwyd OAuth2 Authorization token check * * Copyright 2016-2018 Nicolas Mora * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * License as published by the Free Software Foundation; * version 3 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU GENERAL PUBLIC LICENSE for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ #include #define G_OK 0 #define G_ERROR 1 #define G_ERROR_INTERNAL 2 #define G_ERROR_INVALID_REQUEST 3 #define G_ERROR_INVALID_TOKEN 4 #define G_ERROR_INSUFFICIENT_SCOPE 5 #define G_METHOD_HEADER 0 #define G_METHOD_BODY 1 #define G_METHOD_URL 2 #define HEADER_PREFIX_BEARER "Bearer " #define HEADER_RESPONSE "WWW-Authenticate" #define HEADER_AUTHORIZATION "Authorization" #define BODY_URL_PARAMETER "access_token" struct _glewlwyd_resource_config { int method; char * oauth_scope; char * jwt_decode_key; jwt_alg_t jwt_alg; char * realm; }; int callback_check_glewlwyd_access_token (const struct _u_request * request, struct _u_response * response, void * user_data); json_t * access_token_check_signature(struct _glewlwyd_resource_config * config, const char * token_value); json_t * access_token_get_payload(const char * token_value); int access_token_check_validity(struct _glewlwyd_resource_config * config, json_t * j_access_token); json_t * access_token_check_scope(struct _glewlwyd_resource_config * config, json_t * j_access_token); glewlwyd-1.3.1/screenshots/000077500000000000000000000000001322667720100157205ustar00rootroot00000000000000glewlwyd-1.3.1/screenshots/g_1_users.png000066400000000000000000001771541322667720100203340ustar00rootroot00000000000000‰PNG  IHDR…©zž% pHYs  šœtIMEá: +tEXtCommentCreated with GIMPW IDATxÚìÝLÛwžïû¿lvB‚›Æ´)NOÇ4=¸÷ö ÌL¡Ó{ : )ŽÔ…Î*¤{FZ¨fKfuCö*äê&¹ÚIrF%GÚT{&‰îv¤‚´%wUv »SèŽâ™;…mŠ§Ûšfj§šì$pÿà‡ á7&!ñó!!ÅØ|üý~¾«~^þ¼?IccccÀ-™.xð $B!€@(…¡@ H„B €P  $B!€@(…¡@ H„B €P  $B!€@(…¡@ H„B €P  $€TºVÏo? ê¯OÿZWCúuû6`A©))ÚhÎÐßîù®¾µ-;ní&ѽ¿ý,¨WÖ®dã:%¥””Dñ& ÕhdDc7Gôó—Æ-â«ä'§­dã:%§¥X´¤¤d¥×))-]?9ý븵Ë]VIðÚu%§éË’lH×`h8~íÑ¥°:ÆÆÆ¤¤$:À²$%%Çu/2B!€@(…¡@ H„B €P€•H5kÿÿ¾Co?—q¿°œÏmS™…ˆ á†*]HT¦­¹:ò²]…S&~sYµÝêQ¦*~°U¾öÕ5ô µQÏ?!çðE Œ2¡ 1¥šµ÷åÇiÿµ {‡™ö\†Š¿e“óFÕÿÝïÕ1HwáþÇÚ0@‚2*/ýºÚþ0#Še¶êÈžQIÖ ßÊdÑëQ¤÷ïÐù¿ù®Þ(±(;æiƒe‹V¿ ÷ÿW½[ý”JÏèÝ}OÊžºŒö²¶êí†Bí4E_žý\¡Þ¯Ùªlej÷¾ï©jcŠö¿ê=× ƒ•B€„¹%)u“ŽýÍs*N›åf«ŽüHÒrW ¥nÐþšgUvõSú{¿‚¦GTãzVo¥÷è¥w®)’ºIûôM|vAûþnPÚú¸º–eÈ»¼öæ=˜ë:û³•ùÇ…r¶wiOo„@X)€’eN›çé‰CE¦¥·lÚö„ÊÒ¯èÐ[u|’»÷cíûÇAY¾õ¸©Röv»Jô…ür@=¯©§»W‡þp{Îe µ· [“ÿ`?¡Äå`Fµœu5ÙV“Œƒ_ªw(ú»àÅ/åK˔ݔ,«=SÆË_ª*¬¹%ÏG×—ÙW s#@£ Ýœçé_u'{Õ3tž!5YF.rÂcO!@B3¤J¹¢} ïF™jÑ©CÏÊ)MB¿W×2¡ Hᬇå0 È?ÑFöÖ‡•sóºSÇÈs:ø²]á¿‚Y¨îYòu¿¯Þ[Rä‚Gíú¬¿üµýË ´õqíß–³÷ÏtC ´§‘aùnšTñâ#òt J?1ÞÞ`Ìq)Eæ™ÊN¿¦à#!Q$Ñ ϼö–ÒÌÙtÄfÚš«#/ÛU¸1eâ7—U{Э™UñƒGäkÿxá@(Õ¬ýû¾#—ùΧ|íÿª—þ应µY¯»¶«üñ ™‡‡åþÍ¿«¾# àÄë [¶êà.»J­Éòy>Ññ VyÞ¯ÊcŸi`¶÷\ =«Ã¡c?xDy7åýèýТcE_i×É‹ *Yù%Ï©±(K¡{_»Þ -k¯$Ü7CAýþWâÒ¡¬B!,J–EeÛFÕó»+¡N²ìÿ­H§·^Pé©K¢‡Z¦#°ªîj(r7éè‘“ê˜#ÝŒD4ä÷¨ÇïQOG³Nʪ¢ší¯rʵBœz[t¢áøœã12Ô€'¨[ÍG%k‘jöש¢0gAHXž–Ži$ù[:å­ªŠsàu¿ ©¿³CçÚÚÔÝç•?84¾¹Á$«Ý!g±KU®bÙâœÉ„z›ÔPB]þ¹nKCò{zä÷ô¨£ù„Lù;µÿHJsŒ|ˆÜWîÒžB!u¯Tiõ‰¹¡YùÕu²Z;*Ëâb!^êlpiÇž£Kþ.|í%½T×"ox™oö¨¥s–* þµyïeŸøÔÙÔ¨ÆÆF5ži[þù-·[¼mjp½ WöUsWŸ&!IŠ Éß×£s'÷i× .5´{¯ÃóµÕª|ÏÜÐl†úZuà¥Jç¦à>sV …Ô{¼J¯5Lû­ÁêT‰«L%N»r¬ÙÊVD¾¯¼>zZšu®/f-…§YÕ•ajª—“ÊMX‰°W-ûªt´gz0c²©¤¬D¥Ž}jŠY&duUª¬Â©©XÈN缉5¾}玫uê’äÜÿ¶šŽTª0fã sNžŠkO©ý­×•?õ[¿šv,1”‹áíP‹'úÐyð˜ª\öeTNéAª‰¦ÕC]g)m æ•””$Ñ–ellT)))qkoC¡€:ŽžTtP®vŸ:¦ò¥Ô¤2æ©êØþiÁ-gûD,„% ÷êÍ£]ÑU:†">U¯BËÚ0;T{ê”ʲ£¿ê;~Tí‹L&Bî&õD¢Ÿ‡Š›,N—œS¯ªãœ7Æw@=-1k„ò÷ë°kî’pƼJÙŸÓùÍêZf*òvÆÜ›œª(^ì@0ÊV¶7æšõªÍà Ì-{C¦nG†éË2ÑFsFÜÚ[µ=…ÂýÍzÓ}lÝ}D{ó–±HN™jËU}n|:¨»Mž°SŽ8ìwôËíöÈ *$³¬96Ùìvåå°qÑ]òÊÝÝ+¯?¨ ʶÚd/,T^œ/A ó¤ÎŬH)8²_¥–e4dvªîH™:«ÏL‘<çUi•m¡UosOtÕ\®KÅ9’ä”Ë)õL|V‚çä­ÉSžñ~»aùz{äöø EdζÉf³Éî°iÎKö¨Ó}è¬(ÐB—$§¤BùGL”›óª{ ,—eéòÅ,ï1Y•mXÂ[òT`•Ü~IŠ(I‹ØÝhUî7!¯º»ÝòøC2;ÊärZVÿJ? çÀÝòÓ=ßÕ«?kר’”d0*))™N° ±±QE»9¢Ÿî)[»« …åm9³_‡S5yËÜÞ¨üª:í6ôŽïÝaÌ“"ÒJv˜õ·©ñèIµög}Þ”_¦½µ{årÎ,+Rwm©^›\îá<¦÷NÏ>éí=£ò]'£}ûºÞi©Ô¬{Ò‡ÚUýÂMfhÎcïéTñ|¬wñ8ìmr½tbbU…]ûßi’+g«ß{D/íiUpâÚ~÷ÔLÀ­3Gt²Ë?kÖ¢×u¤¡Rö¸ŒGŸ:ÞtGk…j –?élvîÕÞÜs:1±ÔÄßÜ¢þŠºùƒœ[Íî©#½²xâ˜å¬pJî©TH-ÞÕÏÛXXÝÕßÑkâ|ã}*\àõµßÑk=ãò¿§3¥æñÏiã.í:;óxt`dz:0ÞYªy»Móe^¾î㪯oVßÐ,Of;Uñú~Քβ(è•/zQ”Ÿ·ˆkb°Éž-t# Vx3¤!¯¼!-!h¶ª¤á˜l¹’Ùn^¥ûMôúõI¯4%™Trº]GFù:T[N}h*sÊÑ»G•''®§©D§Û,|^6Uî8¤ñjzkWã,÷Ÿ»yeN‹î»\€9|k[¶~þãRýäô¯u5ôµnݾM§XPJJŠ6š3ôÓ=¥úֶ층»:±tØ¯ŽžèÄ¡¡h¯ŠWðÅo£­\µõõª¯¯W}KŽe!=,o[­Ê_94çĦ$ õÓ‰ê—TÝØ;cy³ìe11E‡æÚ&Ðß©iSíêcï‘°§K½Sì*Ë_èïâqäË5µ…ŠG-=¾ûØÓÒ¡ÉÞ5TÜQ¢-ÜFU/UÏI’¿ë„ö”ש#‡ñpë\´V˜r«\+\‰“£’½1eÌ‚êñÏÿ!wKLé8»*Š¢ÉšÙ¹sZ ¹®Ï}RB."oS•v½6G $IA·šìRuÓeñÂ!4¨S¶ì‹º¯ i(fü—y/0Ûr¢{9©OÇOt.a"£rœÅ*.ÿqæWé~3W·Gè¬×ž}Ñ ejl»dj¸[-‹(mèiÖÔöJ†U8Í÷ü<x%MüÀ½¼g¬ÎJ¡Pï´Ir{‰}M|ë;Ð^¯ªC=Ñ}ed’½ Pùö|ÙÌ^õ¹ûÔÝã™z¾ïìUEN«©Î1uüG¹ìêŸDêU§_rØf¾SXž¿ó¨ÃV©ÓxÇk½1«XrË´˜ÊIwï8rTìÊÕ‰‰e1ž–\®¹Ë|…ûÔÜ9ÙƒT8§¯` ´kßž“ê‹ÎÎWQ‘S[¶äïSgGÇøJ¡.ÚgXñutÊ;õȪbgΊ۴8J”«¾‰T~uö‡Te›+¡ÉÝÜ}˜_¡i •Ì…Ú9m±P›½äÝ©ýû«TâȉËý*÷›YûÀצG£Á«d);[y6³d+–+÷¤NHÒzÚ< ;æk/ ®æè=ÂTR¥™™Ð=9 ¿ý,¨WÖ®dã:%e¬Wåã,ÂØØ¨‚7FôêÏÚõóÇoµÐª„Ba¿[Ñõ$Vç­I¾@»êšš¸4Øwêȱ:Ç~Ë¿J {Ûu´îÀÔÊ’æ}:^òŽê'gèsœ*±J¿$ùÕãö©Ö6#d{ÕÙ7ó«ïõuzvÎ,£T_wtZÔZ\¨EEwñ8rŠ]Ê=1QBÎÓ¢ž€kÚäþ´·ìkQ÷d'›ŠU9m†9 öC‡bVÌ”¿»QÇjÓB¦ªºýr7ÖªölŸ"‘•/!ö{£a—Á®BkÆS¶CÎli`¢ËünŸÂ¥s”H t«9f­ü;öÎ1Ë› u¨ÅS'Çê§B²8+Uç”vËw®Kþˆ$åhgMÝÂ{.ù‘Aû›tÌ[ΩâÒJUµ×©òÀäg®O-îÊK§ß ŒÆ¥œ£O玷FCk‰ŠmËòÏÿçâÒîªÄÒ‘ 7æ[åÙ²fßëî «¿ùd4Œ°VèÔéú雌¶R54VÅTpTëÉØÒRVGOÈÓá¹³TR°OSùŠ)úÚ`wŸî(¾ò¨c ÚW%‹M,îâqÌ(!×Ü3W¡­ÜMŠfBÊíbï9½ÙS0lg£gBãÌrÖ6ª±,;.×>è‰9Ûl‡²ã1ólœ¾‚&蟻¬VÀݬh&äTEáglqîT´ Ý:ï“rÙe:â²Í:™ŸSº_u±Uö<+©R÷‘jí›|lPA]…lË¿€²UžÒ[¯;ešùÔG=­'uèµW´ã;…*¯ªÓ‘3mêî,òšÄó~3Ëý52Ñæ™#ªœ%HÉ)qiêãìÒ9ïÜGíëj‰–޳–©Òf\3çÀƒ"xíº’Sù?_Ë“lH×`h8~í­ÆA†C±«;Ì2/¢˜¯Å¥gŸ}vQ?¥Gú—6aö¨¹e²žI%û÷Î_šËèÐÞýEÑ=GÜ­ê›J\Œ²•ÄL$÷whæ¶!O‡&óûÞ½*˜lh CžÐÌCëPÿä“S¥¶ÅþânÇx ¹Iž–žÙ'{C½jžšA¾sÕ·­eêxd*ÑÁÚ¥å¦1ËY³?zÌ+‰æì;C€e1Ê{ð¡ˆf_ÓPOóT’1¾ÇÒl'mqª"&@êl‘gͧBvíÝ;ÿ5´Ï¨=·¬S ¸ÕX]®×Z£5)­eÇtd%•M_^å)µ½uX»KìsŒ‹ˆü}]j=yH¯½²Cß)t©öx‹Ü¾ð]ºßÌÆ¤²†š;ʼE?®±!nPþ9úݧžè2!åºÊ5=ºÇçÀbllLJb7!Ë“””¬[·oÇ­½Õ)`;;nX½æï”{jùJ¡\‹˜…4;+c ¯ºc&¶29'Ÿr«sÚ7ñÃòvNÆ+V8 Tb›|®_3¾µïïî–fr”ɾ„/ ÜÍãÈ)ŽY}Ð×¢Ù …ÜÍÑý^²Käš6ÃPoÌFSÙ% O[œª(0¬Ñ¢aÆÐž#$ô¨9fu‹³b®Å"çôTHÍ}k<Ê-SÁ¼µ2VpýÂuŸ©SùŽjuÇìhStX§ ¯,ÁœWªÚ#Mê|ÿ>¶_»Ë dŸk‘Zd@=ÍGUýÒ ª<Þ={8çûÍL%råÏw£˜âú;ÚäŸíe¾ž˜ÒqvUFokä<ÄÛª„BFSÌDp$¤PäÞžd ßÍ)Pîbæ!V9cJ! øcW›8Tâˆ>×íŽ-‹å—{r&ÕäP¡-GŽ©RlCê팞 È”8ÊK›è¾›Ç1mõAŸZÜ3§ÃCênîQ´Ò”kú>&áõLm4e½Ø¾ˆrQfÙ—½iL”!v©Z8¨ø LjB±óÝFó¬ù§¯«9ZžËP  ÇÜWØâtM+!×ÝÒ·¦KÈòò´:•!Ãòu6ªö¥zídWL ‘­‚×O«íxéâöÝZò+GŽb—jÕÔ~^ï¿û–Þ8X£öYÎ3"OókÚUÛ¢™ÕÙâ~¿™)¯P -(œâú;ÔéelöÄ”ŽË¯PQÎÚ;ñ•º,Ù2hrÁ_}¾°JóæŸýËq5éý²¹žÈßR¥]'–u¥:ÐÕ«PeÎø³~Må-¶"Ù’Áé”Iç4$ÉßÓ«@­m|PŸ:b¾©_²ä:Jwó8ÆWœ˜¸}ÍnJK£ûºÕ<µqN®*f®:ˆ„œZì‘-gÎâfƒÍ6›LòÄìQµTFeÛ²¥ÉüùÃRÎJ'£Ã>õÅ +Sîl}6½<—"]zí…g?n»[ÔvʹF'ÎÍ&Sü õª¥¡^G»¦¯m1åïÔþ†º%”W\9£%O…åy*,¯R½BêïlSË™7ÕÚC=GU÷¦SMµÑ}•⿙Δ½ðÌœbUÚOè¨güÜÖéSUUΜcÓYQpÇÞ^kâ<ÄÕꬲ:5õeqåö„óW2çú1KÁå®ï+ì[ùÚpxzgYô›ø½Ñý|ÂSß¾Ï-_qc´•È19ûéîçövF÷ñÉ-SÁ2¶H¹›Ç1½„\«b zš5U%Í^©âœ;:PÑQ`–y±y‚Á´â èÍöœèäs¤WÝþ8 òGî˜vrÖ;Óש&Ï Þc¨SMk¹„\\ó™°|ÝÇUUºgz d-RÍï¨ýLý] „fEÊ+®Tý™v½}°dÚÊ¡æFE/ÓêÜo¦u{öb¢”¸ìÑclë”o®±i(PE¡å®Ü7—~âiUV )Û!‡I˜øB½§£O¡òâìVÐ\þñÄÎ%›òUäÌ^r6ÛŒ Ìl§ ³¥ ¤HŸ:½a9ó$ogßÄ ©l9ïc¶«Ä&õx$EzÕá «Ða”¿Ó=µÆZ\¸¼’Xwó8rŠåÊ=¡ñÅBnµºC*-5K ¨+ºqŽò+ŠîlÃhŒ¹þa…;߉¬¸„šÙ^,›z&B2¿zÜÕÚ,+j3Ô×!ïÔ#« w¶çëlÑ´µmÃ"VFD‰DÿÝÓäVÈ¿ýsÖ¦°úÏTkÏɾ˜Ò~¹*Ùß ý.GüÏ=Ô¯în¯B’Œf›œ…yKx£låu*د]''®n¤Oíž°œãêÝo–!§À%»ŽŽûõø*åʹsl ªfßßkœ€øYPÈhW¹Ó s]S¼=gÔ(VùrçáÃ^µ÷-÷[ëF™³M’ÆC%ƒ£VGŽ;W¾ÈÁhSIIÍç†4¹ŸO]žÔ7¹¯Á®â©• –ñý|<~ICêuû%‡I½Sûø˜TPl½Žcz 9w«[¡Òb™}]1Ö;U1ÛR#ƒY¦©š‚Ayƒ‹«á WP:nò´ T–+MVôœi–×U+Û² ¨óLtÿ$e«äŽnóª£%&²ï×;M®EµTî˜(û%EzZÔ*Tኒ‘ˆ"¡µ{òµL„LÎÝ:r¸V…–Õy¿°·EõZÇÇ•¡H§Þ;¾Ä}FÙʪd?yh"h j ÑxвJ÷›åÈ)’Ë~tb, ¨¥Ç'—+G’OScÓ¤’ªüYB±5tâ&yuš5*¿ª,¦ÄRŸÞlî_öŠPßYu¬`¡9fUH$èU(Nçh/wN­üèèU äQçd8b+–=f¦Õêtj²bÚ@g¿!OtC¡JíÆûâ8¦•s7Ë’|MŠV¢ª˜}2ÚôCr{sAÃòõxâp­rTR•}èoQc÷òGA¸÷Mì‹éÓ2—îØ2ËÛ©i™«h‘+Á,*Š)û¥HZzW:bƒZÉB»Uå=£Ú£Ñ@ÈZvLoŸZ½@H’ŒÙ9Ñ{SÄ«þåôqƪ/ƒa•ï7ËaQQEt,yZÜ H’/flf—¨bŽÏüÚ9€Uš©×·õÞá:øE½åzD¹ó-¡Hݤc ;tþðs*I¿óiÓv§Þ?¼Cçÿ²föQÎÞîÐÛ ;ôÞË›d0mÕ[ ßÕÎ,I¦-z«á»ÚÅ0HDɫհÑQ¥Ý¹ÑÇþ³õz³±P¸_gŽt¬hµˆÙ^ 2<r/fv3Эãuµª­­UmÝÍvèF{¹1íöõvªw⡵À9mãöiûùx:Ô×Û1õZƒ³Lö|ÿ®GN±\ÑMŒÔÒݳ"Æ ‚ 祸²åpD7hš±ÇɬüêèŒOša)©UÙÔÛ©«þ¨:—3ËîÕñ}­š:*ƒS5¶;^æmkQtg+s IDAT»*ŠŸrXŠ\ŠNåGÔÓÜ;ï„|8²À*º@¿:ýkñöRçñ7£%öò÷ëTC±,«ý¶ÙE«š ¨¹Å»ôaàí™V>0?fÕÛjÝo–5î *¢cÉÓ¢ž@xZé8kYåæ<€øJ•óÏéÈ·²&æ2Ó”÷-‡Ný`“Þ }“\ÛRïhÏñ­Mk¬ÊŠA/>"SïoUùW¹õµÎu_”g„«Ÿè’W¯é•×ïŒY-4 ³¯R»o)mÔy¨ZgVz(…*ŸZ¥âÖÉ3 ­Z «ÿìQ5wõ¨§§G=^ƒÌ³}¢Íù*›\€q«¹¹g"¼2ÈQ8£žØÄ~>w¾V²—ÙW¶oÊ]=Žñr ¨çäQ™ªDU¬Jç\-e//ŒÞTÞÔÉVë„:Õ¯0ÃèTM]A4¥êоêÆÅMtO ‹~5½V­Ö˜œÊ¾w¿Jg¦a¯Ú:b<¿BKI:,Eš¶XhbEÖœýä›ÿ$|gÕ·ï>né™Z#¤Ý ®åí«µä±`—« ú} ÿÙ5yÃK»/Œ ªg–\­ûÍrX T1µH®O-=ž˜7W®rÛÝ¿oÜk©ëUá¸sâÂâÈUÞ®øü7enFx”º^eÛFå½z{ dŠÌ©·ütPþI#×ÔÜ1 >B¡„—¼š›u:V3[ìÐ]Ujìô-\J.àÖ™ê]Ú×1‡#±©lo´|˜ÿìk:Ô˜óÕ!÷qí‹I#ò«J昬¶ÈY2 ÉÝ3™ØUtÇ’›‰ý|fym¹s¥k#îîqL+!ç÷LMŽ›Š+”?Ï$°1·Ê§RÂ!uìÛ§–9&ãÃÞí«ïR$ŽãÑR~PGJbnמ³ª®¬SSo`Á¿ õ·©¡òpGÈàܯc³¬ {[t.6r,qõËÌrnµÌH…ŒÙÑPcàìõÎñ {[Tbé%ø"wáæêk†U&»r‚½êí]ÊO¿|ËZ‰b–so…¢w¦>¨zMMý‹ICr7¾¦1ãÀ¾»bÆj›Õºß,ïÞPàŠK_lˆk¯ŒÄwõ¾ p¿º-ï‡_)´õ9bJȬ[å¼P›tâ7ÉÊw½¨÷ÿbKÌ¢ ƒvÖìлÿÍ|Gy9ÃÖgôî¾'Uô'Oéô¾ÿªó‡_Ð[¯äÊ>ùé[tº¡PeÛÑῨ·K2Ço²èõ¿(/÷7ßÕ%–‰÷3hgM‘êJQÞ®ïëýW6É`z$Z>n¦ô ªx¥Pï6ìÐùÃ/è´k«ì©\íUòê6o”£¦Qû b&â#}:»ï%½àªÕ‘¦v¹û} „Â’Â |êïnScC•ŠwTë¤{"n°ïÖ©c%‹Xº77KIƒj¦’Œ :ö½¤ª#mrÇÎ*‡¼êl¬Ueuk´ô—µBu%sOéçË:ó—¹År̲`&v?ŸèkK–¶Šd-Ç´r“²URaŸ‰¤1O{Æ\Lj[GwíR]c»z}!…Ãa…|ýêïnˆc N‹ŠžR3¦E—NìÙ¡Òªz5¶u«ßëS(–Â!¼ýr·ŸQCu¹^xåÎÅ®X³ïÖ©7\ʹã„Ãò¶tDËË)_˸Àw–sÇ”3*·(&4 ¶ªöµ3r¦‡¯³Q¯UUŸ$CöRÞ=¨^ÿj×ý ËçöFuéhõíÙ³”Ÿj½éYÞqóöêXML¹uâ•T^{\Mínõûã ¬€Ï«þÞnµŸiPUñ ª>²åîÖAWÎ]»ß,kÔTh*Ú FCÜüŠ…÷¹ZKç7·¾Vó,ß²ô¨ÿÖüñ¡ž[›ä²NN­'ËþÜ&é_È3õ·£òü& ÈÖÇ”?옖Ë:¬Žß^Ÿõ ÙÆ6)5ªãÿýªáUpëv~%&TJËÔ^×6é·ëøo‡¥Ô Ú_ó¬\©~ýû÷Uý™ ŸÕ[/mAµžìÒñË·Õÿö¯ô·®Ìó%ð íÜýœö¦tô¾¯ª3ŸÊ·í?Oo;­¤˜Éáœõ3¾ŸÏ9õļQvaA|>\wõ8ÆKÈ8“’XKä²-\+Ê\¸_ýÚÓ<ù·~u= ®³³½Ú ‚ýGd}sß´óZÙxÌSÕo+ûЊÁ¾íëÐÙE4arÖèø±ªÙÇEØ£–®˜ƒuVhY Á,ErÙêèdþàn–;T¬â‰ÏRX«2SµÎMÌð¹OªzÇI²seË–‚Þ'¯¯½F»;U}`¾OAÙM, ªuO©Üö)œ­ÊÆF¹â¾ä#¢ 'xo}FåUÒé`UÌX”ü=Í:ÑÓ¼¸&²KtìTíì{ò¬Öýf9,NUäKÓ/¿SÅ–{w߸‡L[,²û?U㇨êéõ2ë¦ú?üTçüfnýZçI†n ©í£Q5>—%ÃgWIÍTù7’åþå× =}YÄQÝ·œrmMU×n)û©­Ê»êWý¥Ñ9¾©Ž_þ^ÍŸJº¦Þ¡ ½ó£'T’uIÍ#’”¢P·[º‡ÇÏáO¨,ýнåÑx±­µ/5Kí?x\Žúܷ׆-Û´÷¡+ª?æQψ$…tè—™rþÈ&§é’âRÈ kJòÝy›•yGïÛ-çb“ƒ];¿­öS¡›*É]éa”«±é˜vÚg®=™ebÓZ¢ƒM§T™·À̦ѮRçôö%¶ÙWÌÄîç3þÑUÁ\¯]ª»|ÓJÈI²º\Ê[Tf9êÎèôëE „PV•lÒ±2kü7h3æ¨üÈ;zçY—ò_‹|•íKm§ª4×ÖIaO‹:b3¡…ZÞz‰%ääVsìLf§öŸÚ¯‚ Èã‰B&gNŸª’ݸðøq•ÇvÆ< xZ•ZraC÷úög–£®Iï¼QsG?.psRnÉ~~ûˆæÍUVã~³Ì±ä¬pN?ƒ‚Ý*4ßÃû&À=bØú”Þ®ý¦êþt»j·Êýo^5ýÛE¶å©îO·ëȾ§ýÛæ›6¿%Ïï o{DöTÉ`yD©WtÎ?#…¹5¨ÖÏFåx.K&Tô\¦|~¡9Û ©Ó Œ"þ¯ä¹™¡‚“Ç–ûÓèê¦l«IÆÁ/ÕÚ/~)_Z¦ìK(¹e¶fÉ’ñÿ:xü§ûGÉ"c´|(w±2 Q9ŵ:U\%ow‡Zε©Ûí•?845±h0Yes¨¤¬\eÅY¦Í+樤ᘲ}’Ù–3#(0ÊQß®÷ë&Î3!™S¬ú¦÷TÙÙ¢–¶uº=òE$™”k“Ýf—³Ä%WižÌ‹<¯üÝûµ;Û3~›Jsý¥E5¯kw_I†l»Êç­_Ây­êqÌv÷4Æ\ƒ\UÌ¿9ÉÌ[•ÇõNI¯:ϵè\g¯¼þ Ba£Ì969œerU”È9Q›­î÷U3qŽÆxŽÇÂ*o«¯·Smêèé“7ÔÐÔL·A&«MgŠ‹KTR¼ð˜0:Ôy¾!.Ghq5é¼kž÷Ês©±½H:ÓÑ+w@Á!I†lå: T¾³bj‡íUzýußøGÀa˜µ?òêNëì£:ÙÜ#Opò3aWÌöE²Õ¾­÷÷FÇãB×cî×[TÞt^å÷ü8>Û]òvwª³£Cî^yýCÓ“Uö<‡ò ŠT^V,‡e‘#1.÷£rJjôºu$[ê%õÍU‚íÖ Z?KÖáç, nM•§}pÖièâEõ¦>£½¥Y² ~®ŽÀ|ojV±5Y]Ÿ?ëÙÓ"j¾:{ô)œõ°¦ù'Þ<{ëÃʹy]ž%”| ùC ™×+{dxbûɰծcχuü—ºÅ°yÐ$ÓX²°W-1û°,fÃzà~ÄJ€Iš²3ñ²ŒŒª¬Œ¯2~ë?«*+¤–ÏæHNFÕòY²œOeÈÿ›Kò/plå/?£ŠolPþö\yå1™?í×¹9‚¤¡Ï>SÇÈ&|Ù®¢­få;žÔ±dÉ×ý‰z—äD.~ª3—³Ôð¿9Tö r:ì:öÊ㲇å'z ¥ÒXªpßµLÝÁœª(°Ð)Ö¸› KZ(k¡í°‡.^Tï͇Uèÿ\^uKîß\“ìµ|4¼À¡]Ö‘_Ý’ËU :óMy?º ê–K ÎÙôú»ß*äÚ®†=.óð°ÜÝçµ§#¤¥m~]gÿþ7’ë)ÕUÈ|3¬Þßþªþ§kŠ0`HIcccctæ’×’)Û ˆ§KÇëªkând*yCmG —¶? žyí-¥™³éˆ5Âú'¢Ó»ÖÜ_s«óí´ïwÃqy¿Ü’"µØ?UùÉ‹s®2l}Fí»“µïÿþܬÎÁ,n†‚úý¯Ä¥-V aaNÕï:ÝC(zKSÕ^!÷ÿï~§¿» o”ž)ç¶ÍÚ[˜¡ÞürÒqÀÝC(„e2©è`£ªlôÄ2dåêà­Š|øïªë¥ÖB!,ÌhSA~¶¼}AEdR®³D•5{år°—̹ô‘^:ðÑâ^{ñ÷záÿ¢Ïpw aaf‡jÏ´«–žà¾•L<ø…¡@ €U’””$Ñ–ellT)))qkPVIö†LÝŽ Ó–e42¢æŒ¸µG(«ä§{¾«±›# kll”°(cc£ã÷›#úéžïƭݤ±1Ö.ÀjùígAýäô¯u54¬Û·oÓ!”’’¢æ ýtÏwõ­mÙqk—P P>  $B!€@(…¡@ H„B €P  $€ÔÕj¸u`P‡uap„^Æo{Vº¶gehgnX“’ÆÆÆÆâÝh½û }>¡w‘p3tÄùXsâ^>®Å{•@ ëó¡ˆZ¼WéÀš÷PȼA¯"¡Q2°Å=b•ÝÇ×…kO2]ðà#H„B €P ¤Þë·/ý_¶êÏ×IÒá__Ö…±˜§“ŒÚ[˜£çS% ê'ÿvUþE·¦²ÿò¨þ,]ÒÐeý¥{H×fý]œ¥™ÔPøž$ê÷^ÔO¯Ž.ò“õí?ÉUÍúåœïRúáîýý† ëµÃ’ª´ÑˆþÙ;$ÿXüºz5ÛàA“JėŲ~"’¤dm4]ë®ÞЄì$­Û´^å¦Iхχä¿}?´ Àƒ‡P(ÎÝé|Ô8í7†Mëµ=å†Ü÷,°¸¥>òëóÔ$ÝŒD–±2j¥Ö‚û6Ú°q£öØ2µ}}š2u[—¯«íÓ«úUhtYí¥¥e¨ô‰,=ŸePŽ!Y×GÂú|0¤ø$¤ÿXl “‘©ëÆÿy90¢ –t”¡›’å¾|çq­Û°A{7ëéõiº92"÷çƒúdæ.OIéúËïZU,]ÿê’~6hÒmë”k“oðºÚŸþGpiËrÖmؤ†onPNÌï2ÓھŨC›3õóó_êWà oXcÝbÖC’¤°Z?½ª§³¬*H•¶?š¡ —¯O[e³á¡ÍúÛ§2•9ñØž®çí[ôíyÚÏܼE6Gçd­Wõ³z99MYSW4MÛ}Xù£þúâ"bõ›Ô•*ÃäcƒQOlѺÈõÓËsõc²ž~Òª¿Þœ:íd™ÖiÇSë´ýÓ/Ôpñ–ƒ74`X§\ƒ$Ê÷õˆ>•sQÓMú«of*7YÒÈx;ß~ʪKÊ´÷Ë\—¡íz"ù:ðÅíyÚ^æõ¼ã8x°¬¡•Béú³ü- ¿ÌhVõD 4xéK5xnèš!C/?½E;Ö¥ªàÉMúÕ—ua±¹P’A;Ÿš "ú—jÕC›7ê/ŸÈTVr†^}2Sîß Í_:-É ·¤ÿûë¯õápX+·U°9EZ¿^O§]׿Nf4)ÚóäD 4:¢w?¾¢IÕóOX´c}òñÚä4eE†ôó¿VÀ`ÒŸ\¯I9[2d¹xsbµÐ<’Så÷]Ö//Ý”L´×ž©,%ë™Ç2´áò眶N/OB׿úJ‡?ÖµTƒ¾mXž•¬\ÛFm÷}©ÿã+]}D?},MRD¿üðËñ2zI±—=S¹·Âú} ¢Àà-)ä—'¡Ë—¾ÒÉÏGt-Ù¨òü‡õbº”ûè:Y¿¸6OÛ˼ž3€Ì}W>βɬ\Iã«qn(0&)<¬_z®ëûßÌ”!5Cß7%éÂ"7¿I[gÖ·'–É\þü+½yy<¹ |ÐÿXŸ®›S¤õf=6 uhçß°®iL7þxC×7›•©t½¸)EÿúåxR•¶Þ¬§'²ŸO<_é—oK ë}IÊ-|HÛçz“¯ƒzó‹aÝä÷šµãé IÒOP¿º:*é¦ZsÖ«f½¤ä¥-¦n\ÑÿÃÐxxº¢ÖG3õê:I©iZ'Í„ESÌõ™z:ë¶ÜWFÔÞçÓ'ë’%)°ØPnô†þûo¾”{*0Öé¾/•¦1ù‡å¿¤ ™IJ›ÌÊ’S•–$i,×óÖ<ÇÀfí„B£C:üë˺;Ù»çËø/´aýdY1£^-ܦWïh(E9éÉÒbC¡ôÉÒk·u!0-%ÐÀW7¥Í)’Rõ„!Iÿzs®rIzìÑ̉vFôî•ñDäæPHî[f=Ÿ*=ñè:Y¾ ) iú´‰rmõ Ƥ'7Gtþ†´}Ýìï¹=µÏÍÍ©Tä¶.G¢ÇµäL#‰éªQ][Ì"™›7ÔúÕ-ýÕæT)=SöT¦þLÒõÃú0Ò»Ÿ__l÷KCCº{з#úp0Iß{l½^µYôŸL1¥íâ}=oÍs<`BÑíhFå Ï>ŒÉ·¤ê_I+?¦$£vLí“®šÂmª™ù“YOCúUøA6·å¾ðGýØ—©·dÊiY§œT)s]† ËPAÎþöƒËúp1«…FG§Y)ëôão?¬gS%é¦.\º¦óƒ#RÎÃúóõ«x=g˜û,Óµ¡Û«="jí»¤&ƒ‡¤Y×¥(Mcºqã¶bÒ£y݉hPéÊRж[R¥Ðd4¬'6O`»­O"cs¶±.k½œ ö¤Q;,©úÕ·tíÆ-EdAd¥¨}¢¬œÒŒzvÝÚ¿ iii²’¤[#jëÒ/û¥uúžÍ¢?ßœ*¥šTº> ¯.½mËæ¬‰@(¢øÍ:7,I)úÞ£ºk×€Ñ}·R(¸¡ËôÒõò™øä†É}Ïþ°^µ¤H£Ã:ùÁ%¹ìãæ>ˆ¬×ƒôÐc›µ÷F@­ƒ£Ê±lÒ_nžXýóõ×úpÎö’õÄ£SåàÞýèŠ>Œ]©”œ¦Ò§²õL²”““)Ë×øúk}8ºNÏ&KOØ7뇣Wõ/‘=ÿ¸eîý„ÖuYy*]Ò¨.|ú•þŸKanÝ’è¶´9UÒmÝ•¦oü“,‹AÒð''M Íg6¥Ë¸­,Ë&ýÐ4ó…³·½¤ë™Ä 8î¿òqÃ×ô¦oäôЖÍúé–Ø'oë¼' –Rl,¢Ö®ééonPŽ zþÉ=ûü­aýüãyöÈIIW馉UI__SÛåá¯ÑÍÀF=³9YZgÖ·3®éÜð°~ñÉ =m_'Crºv1ãÉIš\ï3kÛþ^OPÉ÷ß!êÂ|úÉG×ôû¡›º.I£·åüZ?ÿíúÙ—·–ÜâkWtàƒKj ŒÈ•$] ëÂ¥€ê?¸¤_ Ï]jlæõzfâߟø†gÝãhàÒ°"’¤4½¸e<Òø¿Ô_}8¨ó_ßTDR$VÏ'—ôó¡ûàÜÑéó>úã DnOœ›t=Öïÿø•ê?üZþ‰.»èçÈÄkniðÖüeÛn^¿ªÃ}×tadâ:ÜÖ?ìÓÁÏ'’¾Ôu*ÏJž·í•\OTIcccq!ÿa×gô*Þ/Š¶Ñ €5%™.xð $B!€@(…¡@ˆ{(ôX¦^EB{rC:Xsâ 9-ëèU$´íY„B€µ'î¡Ë¶‘ÕBHXeä²m¤#kNÒØØØØj4Ü⽪ ƒ#úøÚ½ŒÞ“Òµ=+@°f­Z(€µ#™.xð $B!€@(…¡@ H„B €P  $B!€@(RgûåÕ«WéÀªJKKÓÍ›7éü¿ ظqc\ÚI£;l”H„B €PÀÿÏÞWU&úÞÿJ’#ÙHˆ$ Ä4†Ë¤h›8Ñ¢à„xÃìZ[´[Ô#xênPï!œ:Bßè‡+T7x¼‚×(Nô‹®6ðF±™Ú@Ç%aÈÆÀ„ììÀûaž!À†|?U)²÷ZëYÏzÖÚIÖúñ<$I’$© 0’$I’$I’$Ij …$I’$I’$I’šC!I’$I’$I’¤&ÀPH’$I’$I’$© 0’$I’$I’$Ij …$I’$I’$I’šC!I’$I’$I’¤&ÀPH’$I’$I’$© 0’$I’$I’$Ij …$I’$I’$I’šC!I’$I’$I’¤&ÀPH’$I’$I’$© 0’$I’$I’$Ij …$I’$I’$I’šC!I’$I’$I’¤&ÀPH’$I’$I’$© 0’$²’’A’$I’$I:O I’$I’$I’$5ñg¢Ðh4Jee%‘H„h4j+KÒ*99ÙF$I’$I’ÎíÞ½{wcFùá‡hժ͛7'>>ÞV–$I’$I’$I:Ç=Ú°aIII´lÙÒÖ•$I’$I’$IŠ>§ÐÎ; ƒ¶¬$I’$I’$IR iôPh×®]4kÖÌ–•$I’$I’$IŠ!¦7’$I’$I’$IM€¡$I’$I’$IR`($I’$I’$I’Ô I’$I’$I’$5ô ­ IDAT†B’$I’$I’$IM€¡$I’$I’$IR`($I’$I’$I’Ô I’$I’$I’$5†B’$I’$I’$IM@L†BUK_ã¥Áóðà—xmiÕ)¯#I’$I’$I’¤=b/Š3ý÷¡l°£Œ¿ü~:Å‘SXgŸõÌüõÃüzæúÃwµòe=<š¿n÷B$I’$I’$I¶øó¡’U«ÞcükïðÍæ:Ú\ÍC¿¼Ã3'I’$I’$I’tb¯§P ‡Á¿º•——tàÖûSx§`ßl® nó7Ì*x‡”û÷¯sǯ“ðdJ’$I’$I’$MŒõÚβßþ3¿[%7>ô$w$4'}Ç;,õK®¼¾'×çå‘w}WÒPUZÌÖe yø­ÚPºnLhI×®)'Tž$I’$I’$IÒÙc=…ÒéýÒkô"¥3ùçžE9-é’wîH ®t ^y…­d2àßþÌø¬c'-Ç­- yWÿöÏܽòK¾üòKMǬ׮çùß¾D×ÐòF@æA=}4O¶ R¨Ç1Ê»Ñi…$I’$I’$IÒYÖ,6«µe3?j„¶²jÑGÎ*ä£E«!€r>š¹ŒíÇ,+…Ì6°yÕJ6ô~„Ò/‹©k™EJT-›Ékï­¡y×¹gð ŒÿÝ¿pG—¼·²ŠK²²¸dk)UÍÓIOßó•Rõ^›ñWª"GÞë±Ê“$]8ÊgåsÝu×qÝu×1xAøŒo'I’$I’$ªø˜¬Ud=ß”ÖЪuk¾a}¤'9Gí,Ôœƒùϯ3züfÝÑ•6í”þõ#f-ÜÁÕ¿zˆœl§œ³°ý’_swNUË>béÖ–ôhs œû¹?óŸøýØßÁà;h³ýKÞ›^HiÏ¡M8BUŽQž$I’$I’$IÒÙ›¡;X¿õDW]ÏŽã¬ÈÄøiÃô…LŸXÈh™Ù…»GüõÜ3–[ó¿ä¥¿ãµü÷:Hhy%y¿Ë/sÀeÜ?v üî5¦,dGBK®ìýŠÜ#$.µå0nè8æU²}¨‚âÅïò›Åï25÷YÞœ8˜NÇN–(ÿtCFÏ#tê)I’$I’¤³ÇPH’¤XSù)£Z2z=@~ï\²R!TZļ·Þ¥(”½Ëð ½ù  ïàž8•Ÿ2jà8Vïy™Ü­/ý{çÒ-*V1ïƒyWC¤h*ƒ‡™9k\•ðŠŒx«!Jî@NV&Y½R§ž’$I’$I:« …$IŠ1å g°¸!héöâl¦ Ì:`˜·~äç÷cìƒC™‚êo±<œGÞ¾´¥’ãöBÉô9‚ü†oë—Ïà§eÖˆ¡ü¦(e3ñjfË:âPreo½dpïø)Œìwð:§WOI’$I’$mÍlI’bI-¡åå ßçß÷aM0—ÁßJ·œrrR‰Ô°¬|S’šä{'íÛ¾;'N¤oòž—s¦S\{ôåŽy“±ý­ÇiÖS’$I’$Ig=…$IŠ1`"P ”2wq9ýûg¶NÖÀILxø¶å‹çP@ùƒs>\[0—Çû§2ï­TQTݳŽT™¾<Õ7­Ñë)I’$I’¤³ÏžB’$Å”D²úÞÊžY{"»þà ˜õi¥áãm¦tÁžHˆ@9J*+ö&1'£a»ËCG鯓s+9‰]OI’$I’$ ö’$)Æ$vÎä+xî7‹ ‹ßå7‹ßå7@ 5‡Ü^½èÛ¿?½s³é TK(Ôðmd1£ï»ó÷!ŽÀf Ó4z=%I’$I’t.ØSH’¤˜“H§SxÿýiŒ|ôVrR÷/‰„ŠYÈÏú czQåÛEŸâ¼=‘Ú£l<õ”$I’$IÒ¹Ðè=…š5kÆ®]»hÖ̼I’ÔÄœD ‰ìÿ>ñ(]q3sÉžKþp—/§¨¨ˆE °xñ *"@h1S‡>³ßdpV" ¸·³Oê£Ì|8ÏüaŸ|=%I’$I’t.4zrsñųuëV[V’Ô$3÷w¥ U„Np«ZBÅ{×M&#8ýt§wÿÁŒš4}´Çs–óê” yT̬†²Â¥„ÎI{œH=%I’$I’t.4z(”––ÆÖ­[ùñljF£¶°$é‚ÌêM‡†ï+æ, ôD6 1kQuËNô>°÷Lí·L:üü|]@øÈ¿mÉ}j$}“÷¼ŠT”6¬—Hέ !Ld9sW„U Š Ò¿_?ú,`ùɦ5§UOI’$I’$ >|\||<—_~9•••„Ãaƒ!Iº€%''“žžÞ´!«/ù9SùM1P1•ᓺ3}xîѧâ©-僱£XØ %÷}œÜWNL„òbÊ*€Š9=Û›ÞiG('\Nho®Leo¬ÌL¯ÀGª™7v ù³F\þÞj,•±ïS•ÇIêvšõ”$I’$IÒÙF §mÛ¶¶®$]àJJJ …È$ÌãÌ4ƒ2 ì­¡ülA/v0ý»ç‘$‘0•¥åÍáÕ)ï²boHèÅÈó 2èÛ+•ï† ²˜QÏ0rÌ0úwÚ¿VøÛO™2n4E ¯sè¶¿Œ`/†?•ÃS‹¡â]†¬fdÁ‹ÜÛ=­! Sú髌÷Öž@ˆ }±×ÑC¬£:ÍzJ’$I’$鬻h÷îÝ»mIÒ©())!;;Û†*Œe船”èɽxqÚDvJláŠuL˜½–¢Û¦óÔ‡ª™þǫ̀ÞžOïâŸòéƒ)Dö•!B<:g36?›îI@x='–ÿÂÍäÇŸÄqJRFÙ°a‰‰‰$&ú³Q’$I’$IûÕ×׳aÃÚ¶m{ÁC±y Av°ðëƒ{ ¥vÏ"§z ÕV3lÎF²ú^Í´+šQ¾ô¹œ^ÿÏuä%Õ0gÆR^ïÀØ'º“ºs o®bÈÌÞœA@t;¯Î)¡{ÏÎ ï’tøÂõÇU,¿"‡‚{Z¨(aœMTǧ7¬pì} ~á&¿]DQ¿[™~U"ÔU1áõU]ñ_(¸'…àÎ-ÌšS̈ÏÒxÿž$žÒqú–¤-[¶pñÅO³f͸袋lI’$I’$±{÷nš5Û3Ï–-[HOO¿ Ž+&C¡pE%ßfdólt=Ó—‡©&žœîÙÜ›±Eë‚ôkšÉPx;¡ø†_{)¹AÈÍH&óª2â¡¶¢„W7·¦`D§†à¤9l§hZ)Eá úÅì"˜w79Y)ÿ[1‹ã/ãÍAÙtO²¯¦ r!C¾Ú³ü¸ûî-©Ù¾ÓÔë¶îä_{ÙžžA ü­„¡?FOù8%I‰DƒÄÅÅíû%/I’$I’$ûžÕÔÔ\0Çsñ@íº•<8í{BÉ-¹µg2©aùªb~³ „¢'neTvÜ)ï#±]6ù)Kñ¯ŸÑ­ó¥ô¾*ƒ¾[“™•U„v†yî_>9d«$Šwž‘âäfŽRz=ßÕh÷_ÈÚ—]őӹ†P(|¼}y;!™~=ãXþÝzf}WEÑ÷•,þ. Oý8%I{\tÑEB’$I’$I:L³f͈‹‹» æ¡Ž±P¨ŽÅó!€ê­,\ºõu"¼ûÙ&†eg*b^É-é›ß“‘íã€d?Ùæ¬dÒŒõTÇèvíÕL»;eÏÐs'"x“Ÿ®gÜ쵌šVL°m[ž”ì·«V8Þ>’Ƚª%Óçý'Cªò˜= 3c{~Å„™‹x+>‰n׿0qPcß^ň¥­™uÕQªqÌã”$I’$I’$IMÉE»wïÞK*ÿê+†ÌÙ´^¡Ã¸5¿“®MòìIÒ9VRRBvvöy[ÿ~ø–-[gX.I’$I’¤ÃÕ×׳uëV.¿üò âxbn±Ìk¯åÓk½Ð$I’$I’$I’S3›@’$I’$I’$éÂg($I’$I’$I’Ô I’$I’$I’$5†B’$I’$I’$IM€¡$I’$I’$IR`($I’$I’$I’Ô I’$I’$I’$5†B’$I’$I’$IM€¡$I’$I’$IRoH’ÔxêëëÙ¶m‘H„h4zÎê±mÛ6O†$:wîL4eÓ¦MÔÔÔ‰DÎêþIII¤§§äÛÕ«W{¢$I’$ñ{ I’ÔhêëëÙ´i­Zµ"55õœþòÍ7ßбcG.ºè"OŒtº$)é¸ë„¶„øá‡õD£QJJJÈÌ̤}ûö³Z×H$Bee%%%%dggõg£?³$I’¤óËîÝ»Y»v-¹¹¹1QŸ½÷hêlI’ɶmÛhÕª-Z´ˆ‰ú$&&útáÞ}sqhKˆÿùÆôíw'›6m"33“ôôôsRÕ@ @ff&À¾ºø3K’$I:ÿËRNçÞ£©ó®K’¤F²sçNÚ´i;¿äãã}À*]¨7_uuÔÔì8âòÿùÆû¾¯®®æŠ+®8çuNKKãÛo¿õg–$I’¤szïÑÔ5³ $Ij»ví¢Y3µJŠ-õõõÄÅÅóz³>Ÿ‘$I’¤¦Ç{cóÉ•$I’$I’$IR`($I’$I’$I’Ô I’$I’$I’$5†B’$I’$I’$IM€¡$I’$I’$IR`($IR ‡ÃÌ™3‡mÛ¶Ù’ÎÊEL5‰•6…$I’$](âmI’bK8æ7Þ`óæÍ¬[·Ž¡C‡rÉ%—œÛJmú—Æ•óëÿñK²¼YÏ‚×~ÏÌEkØqI®ô¿ê}O£t~«\ÄØAÏ17…˜8³€Þi1XÏh˜ïW,béòÕÔC ™ôvÝéÙ«;™çâÇfm)ïýyYùé‘âe$I’$óÏçòEÌyuo-(¢¢HÎ ·w>?õ(y™‰6ÐbO!I’bÈÀÎ;‰F£ç¶RÛK™÷Ú;”E[À²ßæ÷_¦pÿKcxé¡tVþ~4¯,ÝÎw‘¡pÃ÷¡yŒ4*{ EÙ¸ø=>.ª&=·/À½½»¬\ÌÜ–Põ4J’$I±ªrQï{ŽßÌm„ª+(š;•çî{±YpÆ I’# „’““yòÉ'iÑ¢Å9ªQ„Òé¿æá!ÿÌëßì8|ñöe¼·¨Žë_ø÷ôèJ¾ÏóB|Yø%UžNéü–ÙŸ‰³F’»·Û_,CÑM,+®!õ¦»¸¹K;.M»”̬îô¹û&R·®æ›©$I’“Êç0â¹w)R{=ËäÙŸð×ÿûWþcödží• T0wÄf•ÛTg‚ÃÇI’޵iÓæÖ*@æýcøwÔ±ýË—ùï¼4²~¥dñË+›ï[?+/‹„W¾d}¤7)Ž!'׳ò™< ž8¢ Á15”\=­‰å’ý76ÁŸÐçÞ¢) ïÔndù‚/XöCˆšú$Òsr¹é¦.¤í]\¹Š/Qª¡ž-;ô wï\šÔ®å½?C绺ñÃ狩̺ŸGnHp)‹,¢¸¢šú¤t~Ò³77uJÙW‡U«˜?¿ˆ„j´ü ½úÝJ§o½$I’$S4u +€@¯ñ̜Ҵ}÷ y ž2“Œa÷1zñ ¦N-¢A.A­QÙSH’¤sýçPLB{RÒ¹ì²Ë¸¬MóÖÕU•³#¡ ) ûßKHiCBÝ&ªvx^¥³á­›-Sûj,{‚¡í1ŸJœ$¶.ý_üyÎ|–|û=•;¢@")™™¤%î¹á\õñ\Š"—só½0à®Ë¿ pÞZvD7²xî”'÷ Ï½¸·oR*–2¯¨’}ýŒê«(Z° :õ"¯S2D7òù{óøG\wú x€»rƒ|¿ð=~_Û°~5+>/%½gp+?á,üüj½\%I’$¨-åƒEÕ@ßí—F¿á’D}@©H7:C!I’α¹sçî „y䑘„ާ®.—4ç ¸(МÀY…¤³ãÑÿöÓ¦M;è½C_Ÿ®Ä¬|&NéKòÞ7Bó1âSÎ}.”HæÍó@ßžd%UQ¼ðcÞýóÿäYðùÚ*¢@´rEUôé{Y—¦qi»îÜÚ§3VP¾cO—çÞJßÞÝÉʼ”̬nôh >pµz»ßMŸh—OíK)®ï@ï>Ýiwi™]n¢O·t¢l“Þ³7ÝÛ¥ri'r{¤B¸Š/WI’$ 7Ì!”J÷Ô£¬’ÚT€ê Â6X£s I’α;²²2Âá=ê¼ÿþû<ñă±ÝA:!!;¶E¶S8rœtö<úß`èСL›6GÿÛ#L:µñvP¹€I£æ±wîW¹¼8¶7±1‚\"iY=èÕˆÞø–±â³9숌›k7Q ññŒWÙ.™P:^’BÇÎql¬ø–åå›(ßô=?TD Ãë&‘‘‘Ôð}”pyõÁž¤&î¯CfÞÝdÔ†€$ÒS÷ÿŒ‹‹#ÎËT’$Ij$#¨±<½ôè#´œ@r†CdžB’$ciii<ñļñÆ„Ãa6oÞÌ믿ΓO>ÓÁPBJ&—Ô•Su@ T·£Šº„tÚ\ây•Φ½ÁÐÞMåÆÁÜPÃë@./ΚÌÀ¬Äs~ÌÑÊeÌ/‚Ü>=æŠ'xi'òînGêœ?óŪMD³€¤ÎÜÕ¿)%3q‚ÀŽïYðÞÇü#îrr:ý„.½ºÓeÅÌ?pˆŠ¸8.‰?à¶©~Ï{G z]_’$IÒ~‰YôÏKfî¼ Þšô)N9t¹J>ô@ ·/1pëqÁqø8I’b@›6mxâ‰'HNÞ3@See%¯¿þú¾ÞC±(pY²(eÑš½}…"¬ÿëê²®ç2» Ig]S „âã!T¶œÕ¡è!KꩉB\b€@j*š;A‚Á=_I;Vñù¢P…Úò"Š#9Ü›77÷èD»´dâjë©?ú^¹$#Ueìßm”òù³˜µ`#Q/CI’$é8‚ä>;Œn@dñh ›Î¢Ò0µÔ.]Äôaƒ½8¤rïà\{ †B’$ň6mÚðä“O íØ±#6+ܼÝz _¾6¿¯§ô¯3xe!ä=t=)žNéüV¹(¦!Rrèyy„Õ…s˜¿ì[J¿/§¼ô[–|úK·¦Ò#7•‹/íA–›XøÁ¾ý~#åk—0oÞ7„.I'9â. ˆlä?TÞQÅ÷Ëç3¿,B}M5GIx.iדŸðæÏ_Î÷+)ÿv! þáÒœ‡a$I’NDf>'?@ ´x*Ï=ø3n¼îF~öàsL]¼÷&$Ä»£&° Òæjl†B’$ÅCƒ¡;wÆêÿ=oN×_ŽåW]Ê™>îŸ=½˜+5ž_õhÎw‘¡½c1à:ö}˜¾W§þv)ó?žËÜù‹ùG$“›ÜK”x …ýï¥gp#‹?.dîÂb"Y·Ñ¿×¥Äñ™½èÝ9‘Ì{—·Þúˆ¢ªŸÐ·o-C_0ouÕ‘w›˜É­÷ßF»šeÌ+|—¹‹«¸ô¦{¹)Óq-$I’¤•–7ŠYïOæÙ¾ÝöÌ1R;{ï‹L~s"÷fs1d¬ÁP#»h÷îÝ»cµrµ›+˜ZXÌœïjˆO‡+/ã©{rè׿¦j­©bVájæ|¦¬zÉ)-ÉËëÌÈSötA W0pâZú¾p3ƒã×1pbù/ÜL~«Ó=Š:Š–|Oyvú·qŠYI–’’²³³ÏÛúÿðôlÙ’¸¸Æùù¼~ýz®¸âŠF)kóæÍrß}÷‘žž~ÒÛóÍ7\}õÕÄ;¯…tAŠÖÕíù·æÈ= §N @ß~w››{ò‹—ÎaÔØEä- ¿‘¡¢¢":wî|Øû«W¯ög–$I’t¾Ý—D£|óÍ7§t¿q\•‹;䢾( IDAT9æVgöœad5½ǩ¨¯¯gëÖ­\~ùåÄy‹Ù»®ÚÍ¥ ýíßY±ÿ£lM£[Eè…ž <™€åÇõ ›ºœÅÉmy¼_6¹É»¨Xó=¯~ôŸ ®ÎcV¿t›ß‚{óÚ‘sq£ ‹þÏZŠ’Ú I’NØÞC’t®$få3iz¾ !I’$éìKËc웓 ÁÜDgjL1 Õ² ðÀ@è@[ùÍëÿÉœh˜2‚<£ºë.Ö± p%‹Sr˜ùt6ÞÎÉ WÚ_¹ïý¿³à–žô;p“¤ös6I’$I’$I’Ή´½‹ʧ©øjc?­`Eõ.)­Ép5Ãsƒ\’$I’$I’$9Íb¯Jõ”._GÑ Ï©}ì!ÙjÜH)Íéq„Ô(©ýn¼ŒÜcö>«aÎŒ¥¼º3‘OäñæãÙd~·Š!3+Ø7¿U4Ì«…›Èº-—Ù/\C60®pa’üÂM<žÒŒnüŒ¦@E1Ãæl$˜w5Ó†æ2òŠZÞš¹œE5^Œ’$I’$I’$é̉¹P¨ò«¯8gÕ'ºÁÎL(¬ ´îhË£T“@ê)ÎT[Q«›[S0¨½Û· {NciGpM)EáýëeõéÎàœd2Û\Êã}ZÂÛ$ÒÔáí„âSÈ¿öRrÛ·¡ÿ€ë˜6(›,çÔ•$I’$I’$IgPlEuÛ˜ñi%‘“Ú(Jñ×ß0˜D>x°5‡uú‰'™í„vr@@³W=•›kˆ$'“y”ÒÃU„v†yî_>9dIÅ;¡_2@€îû›21G)/±]6ù)Kñ¯ŸÑ­ó¥ô¾*ƒ¾[“™àÅ(I’$I’$I’ΜëŸRKqõ©mY½¼”â­É=$\IlÓ†L6± ¢ŽþÁCÖlbôo¿¡ö‘>L¿â(×Éí˜ü䡽yšlÔñqâãN¬¢I­þOwðhÉ&¬Þȼ—2µ0ñ/\K¿ ¤$I’$I’$I:3blø¸DrR¹È`_ ?,aù!CÌ•ÿ­”"‚ôowôn:ÁŒ$Wo#tq™­ö|¥†×1áà Bu'_Êâo)X¸•`vïéÁô?åøMÌø®Ö«Q’Î÷_ªÍš±k×.BRL‰‹‹£¾¾þœ×#‰r¹‰í¯`pÚŒ{}9ÜÓŽÌ™þáwwù) @ôøu ²‹ðÛ©¬I!‘íÌ·žê‹»óhû8BÅ¥,¬Ð+ÅI…$é|wñųuëVZµjecH:ã¾ùÛߘ÷é'Ç]/99™7’™™yNë[YYIRR’'N’$I’÷çPÌ%iW]Ã,þÎØ¿gEõ‰BÎ5)p„ù„öjuÓF$1½p5sæ}ÃŒœÒ’Þ÷ý”á7´ ñØ·Ñ ~²'ÌYɤ멎ÐíÚ«™vwÊq¶Û+‰Ü«Z2}Þ2¤*Ùº2ñ–åLø¨ˆyQ$·¤o~OF¶ój”¤ó\‹-Ø´i]tÉÉÉÄÇøK:3N4HOO§¤¤„‹.ºˆÔÔÔ³þ?æ"‘¡PˆM›6‘íÉ“$I’ä½Ç9tÑîÝ»wÛ ’¤SQRRr^ÿ’ýá‡hÙ²%qqÌ××׳mÛ6"‘ÑhôœÛ¶mÛ¼@%йsg¢Ñ(›6m¢¦¦†H$rV÷HJJ"==ý¨aùêÕ«=Q’$I’Îø½Ç©¨¯¯gëÖ­\~ùåD;ù_˜%IjDqqq11|Üe—]æÉ´ÿþøøs>|ܱtîÜÙ“$I’$IgA3›@’$I’$I’$éÂg($I’$I’$I’Ô I’$I’$I’$5†B’$I’$I’Î/ïð‹‡'²¦ö÷kËø¸àiî¿ýn¿ÿŒý¸ŒÚX©sh>¿¸ý1fV„ùºp&—ÕÆv;‡ ùÅíQXq¾_0ÑÞ‡”qNÛ&Æ®ŸÓ½¶cùs{2’$I’$I’tþ¯¡pÒ›¬¶€%ža­4þÆi˲ Ï0îóp Ä–Ì|“ÂÃ"¶:r׃è˜|¾_4ÑÞ‡”qNÛ&–¯Ÿ“­Ûùô¹½0ÄÛ’$I’$I’b_-k&ÿœ'foØó²õ!‹ÃK™ùY„›^ÉC7.Œùú¿òüÌ/Ý|©6àÉ vå¡§»Ú¶Í™ãçö¬³§$I’$I’¤ó@"í½ÂŸþô'þ0´ýaKk×-a-éÓ%¸oýŽ}:Xû9ëŽ4Ux>Oßþ >þúcÆ>v7ý±¬áý•¼3êÜû-ÜrËý<]PxÀ0uµ”}\ÀÓ÷ßÎ-·ÜÂí?Çä%¡=‹* yìö_PÚ¿‹Pá/¸ý…„Úq3þ9³6DX5îî.XIí±Ê=¬ÞŸóôí¿àÏg2â±»¹å–»ylì|ÊÊæSðôýÜ~Ë-ÜýXóÖ,¼¦±¿Ø³ì–[îæ±Q3YÙÐ#ôù(î¾}ó÷§o¿Ÿ‚¯Ãúxÿi'»ßãµÇ)DZ­ ÔÞÇn“ïŇ—q¤¶YRHÁÓ7Ô}ìAC¨Õî;®Û¹ÿé‰ÌŸ?–ûž|øˆÇ=gG>žØ½¶¡âǸå–çXr„c=éÏ­N›¡$I’$I’¤óBbj:t }ÛÃÇìŠlYGu -­ûß ´nK ²-ÕG)0²Ž7'Ì„»†1ì®¶@…/=Ï›Õ=þÊüáåA´]6‰gFÏ'Ô®™ÆK¾ ù¡1¼ò‡—Þc ³GO`ÉItÕAúÛè2æóѨ®p²åFÖ2mZwyƒ?¿Ègãøù3Iô2zc$=·|¤7‚ڕLy~ËÚbÌ+à•ñƒh¿l£ß\C-zóp†uYƤ)Kbþ¤)¬»i$î žÞ~OD#–wôssx{'§M¿6®=¼Œ#Ë›“>§Ã—ùÓŸÆs'Ÿ1aÒ„j¿fÒ3ãXÚzãÿð #ûlaÊ„ÏØrÔƒ9Vý:¿.1tm'Éðàƒ}h{¤jžÊçV§Åáã$I’$I’$÷"‘$'sP\H&ýÙr„ä‡^fìCÔ®™É›ëz0æí§¹!p%Ç”ñÈ3ï°,Ô‡›¶¬cK  Ãî¼™kRŽíiÛgm'YÙ}Oñ6<érô6Œ>WáʇÐþ}Þé1’¡7_I"íyè¶)|¶v  ‘dn2’wÞE× @Gógòü†½­’Ê]#‡Qøó L˜Ü‘e«z2òížö~OD#–w¬6<´½Û&‡_ÖùhÚÉ R Ò…ÙÓÖ°…>D¾˜ÆgÜÉËcâšD ëHF~ý_yiÕÑJ:Ný_—˜¹¶à5ñÜ5ù¹Õé0’$I’$I’tÞ P]}ðƒäH5Žõè¼5=z쟜¨zí*¶T¯å¥{n9d½¶¬©†>]q_Ûçý_ï§ËM7qsŸ>ÜvÓ5d$ž^ÝO¶Ü@kÚ·ÝÛ õ•­÷=8âÄô¹/ÀÊeóÎ×+ùzÕR–.«†›(/c#‡òó)Ëè9æmn6Â~Oè¤5^y'Õ†'Ò&‡\Çך.“¸÷^wµlX²ŽHûAtÜW— onG …N¨~ǯO,\Ûgæs«Óa($I’$I’$é¼hÝžäÈ:¶Э$R½…H -Gm®a£©žzG€Ö÷ñò+ƒhÐéÉ×ðÜŸÿÂC_ÁŸÎü)Ï3mÒMŒùS}ŽP|$!r"•£ÜÔÓl˜Ð žy‰Ï=¹ó®> öÞyžq=…¯¥ºl aÚ-ÔöIåLd'ܧâdÚðDÚäÐkã¸`€@ ‘Zí„ÎÙñë×ö™øÜê´8§$I’$I’¤ó^bûèÈZæ¯Ú; J-ëæ¯"ÒñfÚŸà³úäŽIÞ²–-Éddìùj½¥IS>cK-„–ü‘‰3W‘|Mzn,|ûÜø‚™ËB{ ˆDˆì{RfÝ×Nh¿Ç-÷4„—½É'ÕwòÊ1è.n¸²-êƒè×®™Æ¸OZ3pøTÏžÀûtRN±=NÅɴቴI#^™´½¦-¬ûœµµûÛbíçëN뜬sumŸÏ­NŽ¡$I’$I’¤ó_°'CîLæ‹IS˜¿²Œ5ó§0î¸mÈMœhg›Ä®ƒÔ~ž/àã%+ùzþ=zk[w¡m"XÇ'ÓÆ1©p +×|Íç³gòÅ–Ötl› ÉmiXÇ;o~Ì×ee|]8‰IËŽþ?H„ê ë…Sîi ´nKrõ*æ/]CE¨Œ%ïŒcÜÕD¶¬cK-P»†7ǽOàÁ‘ 0Œá=70mÂÇœv.t’íq|a¾~g2“ ˨=Òq§ jïãµÉ œ³“‘zÓPnãÆ{‡%+W²ä Çl‹©ßÉÖå\]Ûá¯ßaòäBÊjÏÌçV'ÇPH’$I’$IÒ È5Ã_aduLyþç<3e]Fþ‘7O¢Œ z冶]Å”—žáù ŸP}Ó^Ö•D xÃpÆìȪ)/ñÌÏ3î-ôù û&Bð†¼“ä/&ðüÏŸaÒ’®ŒÞ“#Ç:méq[¶L{†g¦­!p¬rOSâ5Ãy_2Ÿ~‚Gy‰7Ëú0~ü´_;‰Ñﯡlö8fWßÉÈ!W’H›‡£Ëª)Lúü4{)T{œˆjÖÎföÇëŽØcæ˜çæöæ˜mRv”ý\FíI¶ÅÈW†ÓcÛ¼ôÌóLZÒ•aC;¤r¤ç[¿S©Ë¹¹¶kêµ…Ìž=Ÿ gìs«“qÑîÝ»wÛ ’¤SQRRBvvöy[ÿ~ø–-[çÉ”$I’$)Ö…—P0%ÀðQ×p^,V±„—èy×5 ½_jY3ùžY5ŒÿýÇ>Ķúúz¶nÝÊå—_~A=…$I’$I’$I1.Ì×3—Ðõ¡.œSÍlà £™T¸’Špˆ²%o2éýjº èa ¤³ÎžB’¤SfO!I’$I’¤ã«ø|2¦¼Ï² ­;rÓá ÐÕPèžMæw«ö-¯­(fØœó®fÚÐ\F^QË[3—³¨Æ‹P’š®æ:ç’$I’$IÒiŠážB»ˆìÜu½„ Ü73óÊïykisç1¤´æÞ~]~U2‘5Å̦3ñ‘,ò’€ö])¨ü†Y?F ³–¹;[3fP'úZ01ZÅ…%¬¸ûZº54WßG®f`vB·äî›¶–y?f¿³„W7·¦`D§=eÓ‚œG¶S4­”¢p½ÃÛ Å§0üÚKÉ BnF2™WÕïE(IMW©Pt"ÁPj‚6˜$I’$I’NCÌEµ¥Œ˜þwŠþOåK¶ðÜÄÿË‹ƒ¯a`FÜQ¶N S—lÆvÉê)_··>[Ë[o/" O}WM$¥9Iû×Ͻç:rÒ…Û‰¤t ûOÜÒÚ]JFt=ßVÓ µ ÷ûNÌH''~=‹¬§oU¡ažû—O©SÅ;¡_»lòS–2â_?£[çKé}U};·&3Á‹P’š¬ÄîŒúôÿ2jß/ÁE ½ñ¹=¿Éeò_§‘çpq’$I’$Ij$1 UóÖ¿ÿÅÕG[\Éoþ½Œ¼Ê&ëEµ%ŒšO=’Ý0‡O™í/cøà4r¦ü–neH+ ¡÷|­! Šu@r;&?™MÖA­ÚŒ`+€Ö ÿ§;x´d VodÞ‡K™Z˜Îø®mè™$I’$I’$I’tæÄÖœBuЫ޳NÕ6Bu‡¿Å«K™SQÈ’]„¢¸8‘ÖW$ÁæïÛ¾ž¢_HÿÙU$g4'Pµ‰åLØPùýF*â›Ó)yï;ÛXp@ùµGÉmG0£ÉÕÛ]œDf«=_©áuLø°‚PTKÁ­³3xO¦ø)ÄobÆwµ^…’$I’$I’$錋­žB ­)w' /kK¾âgolçÙ73°Õq¶msÏ^¹–ÑÓQÝ7›¾I£5,új-3*ƒ<ûXÌäNôe)£Þ.eÌ-­I¬,aìò:º?Ñœ´vÙô½x)ãÞþ–ľ¤V­gRáV2òòè¶oˆ·(sßþ†œülºG«˜^ø=á+®æÞ6È Nû‚q¯/‡{Ú‘¹s#Ó?üŽâ.?%#"lgî¼õT_ÜGÿöî>(ªûîÿÿóЏÙf1én즮Ú@È`b‘°*&S¼ùFÌÔ›NÑ™ ýœ)øû 0s:’%sYÌÌ×¢WºÆVâ·Ð$’¤0¥r]ƵFe“t7F6¦»³ëM~€ŠFaQ£Ü¼3;‰œ›ýœÏí9ç½çsì#èãh0Š˜I 3Æ3õbÚ~¶í>̶¶¯ F˜òø$ çÙ? Äo¢ôƒSxÏÁ4šÙs¦’÷¸ ½.BD«cÇŽ;hÓÿé§Ÿ2zôhFŒqKöwäÈÌñµ´´0iÒ$UT‘tþüy¾úê+~øá!q<;(tÖOÎ+^–¿<™©#ïlRBžVæ¼vò_?NÂH5PPèj ‰ˆˆˆˆˆˆˆ -C-(t×€NÝÈQL7†haDDDDDDDDDDDDnÊ¡Í(2>¤R¹IQÊ‚Èíq¼óÿ)DDDDDDDDDDDdpºKY """""""""""2ô)($"""""""""""2 (($"""""""""""2 (($""r‹Œ1‚óçψ´„Ãa ƒ EDDDDDDDD.QPHDDä1™L|þùç"-§NbÔ¨Q*¹DA!‘[äàäÉ“x½^ÂáðIC8ÆëõròäIxàŠˆˆˆˆˆˆˆˆ\¥,¹EƒjT±±±œßç5@ØKsÙêë¶Ëï\{ôu®6¯!DDM'""rGhk¨¥0Ä¥á4µlذƒfO«Ã‰ÃÄÓ¼ƒõöu½w(t˜²Uë¨jl'huâ´†»–¯ÛBÛUóÏ…;›(]_E;Væo,&=Æõlx©ˆ=­A,qI$Zƒ¸ëÊYµÎuå|áþ=U64€ íu¥”Öu¯:̦UØÕê#l²cñ7PYéÚEjcËšU”×¹ñáÀé´àoo¤jýK^š?§ƒšuëÙÑì#l²`òí¡¨´™ˆ.u{ËïËAfV„›©¬>üÝéûªËùvQ¾ÇƒÁa¿›=–ðRi#~“©;/Š(m D^weh‹´¾DZÿDäºÌŽTœž*^úÉVç—±ÅUO»!Ž´´4fL0÷}^ÑøÙͳ‹òº ö8'&; å«X_ßÝbû¼.Ö¯ßA³ìqq8-AÚ«X·¡Vc„ _½_ö÷<Íj; åk.·Ë«õÕN‡ã5„ˆÈ¤ ˆˆÈm¤aÍOº_û,«Ê[ ›æR\œF4ðw`rÆ‘”³•í¿ÛÂï*²°xâ A ¹š=~À‘Íö×·°å÷ÛÉq¾:jÛ{Ü–·Q»a= ~‰y䯛»®ÿêªiƒuéF*Šó(¨ØÈB à®ÁuÅ{idïü¿ÿýŸÙže ý€h¬b—°g±ýÍ×y}çv²C»Ô­Õìò–ùl~ówlÙò{væ8ºÊ³ªN t°Šj]Óì¼ù{^ÿÃNrœ‘~Ãõó{ ³¦d³Ô þ=å]S õ̳>êò%†D vþß¿¹™ù–®?9óvò‡ß¿ÉÖ¥V<‡}´E\wepð³gÕO®zAö2\}ݽ°¾tFZÿDäúléWd“â0~Ü{ØQ^ĺ—ž%yY õ}Ÿ—D2~^f'këV6•maûÆ$L@ÀC½2 IDATkUœ¿„<h°Î'§`[¶o%gn"‰–Nüjó2lÇÑ^Îç#'-Ìßü&¿ýì,HÄ@˜Öê®vyµ¾Úép¼†ˆ4}œˆˆÈ`²b5á >‚uTU§á\9>—âœzö¸ªX¿²w»ïŠ'Mü‡=Xéš•ÅFúïÞ#½{y¨­û|uÝ7é-Ø–‹Kñ5umïÛ±†vôL”v_ˆ®«AÀG\÷fV‡ð& „ð4µ`_”Ò=ýD )‹T–¶ÝËîƒí„KJ:Žîé/lI‹p”—Òî9ˆ'”Ž¥©{¤´îul¤d:)ßÁ/ ¯›ßœa™9)ìYß@Ue=I=õU—/{<Žh]ïF¶àt˜#¦‹/KŸåó¾ênŒæt,V¬=߇m°c2„hÊ}–õÍk‹•¥Û·³º_õL‘Ö?éUtü" ·ˆÂP'mîVZë÷áªkÆã©£´t›½Ÿ—tlé{ü¼ôû kIÝ}¹Ù™ŽƒFZ}Mø ¡1ÀèH#ÉÔL£oë^ØÉGRR:YÙ©šbT†Ù8Ú5öu~ùyZ éÝ7:qq4ÓìiÂÈäÊ7Jöu–×""‘‚B"""·‰”Û)œÜ}‡"p˜²—Ö°gWUi;É –óÒº:ü;IóÓÉYÔIMé.<Ý[á~ÜÕ4ÙM=>v•×±hK:¶—zެb²W\Ebqõ²õî.›®ü5 =æY7 ù£7OË"ËÑ@yózü=p°¤—ºÜ_gû®»2ÈX˜¿qû5^¢éŠÛRá®~¯ŸM)x°„U·¬þ‰ O]Ô¹ƒ˜œsIfB|*âS™ŸZÈ ëzþ‡Sö›?¯üw8]ƒh¸ç_/u×Ì©”¼éä` W}­­Ôíh¥nO=ÛKHÕ{…dØŒ£Éœ‰7tžfˆ¬=_»׫ÔDDM'""2`ñÃxö5Ò5 K%k3I±ñ_ZLj5¾kz$_cs÷´ ^\«g‘œ¼˜²ž/²,¤¢¢˜¹&À]EeS0cuvm ؉›6iÓì„Ûp ©=Âxë´®y<®F:B]iht í_øYâÃ>.ÎÒçmìzöiXF¬ñ]wÆ| ûºßïÔIcíp˜'ÝÆÜœùX®º1Ð{]î¯ÿ‡ÜtÝ•ÁÁÈ´²÷xkŸ?°¶ß?ó?Ë'·´þ‰ Sþ}TUUQ^TÍå×ÿ„ðµ{ºú]S,ãû8/é{üìñ}¾Föu¯ÔÙX‹»{»¹ïóoý& K«qÛ3)Üô{þüÇÍ,´ÁVhÎH‘«„"?Oó_Ù.[¬Ó°›¯^±¯v:<¯!DD"=)$""rÛiX¿„V@¿¿ûv¶%…E3¦ ¤½|+ë-ø[¯¼ámŽ[Á\Ó:ê<•¬Z\ƒvܾ0ØSXd7réç}&¦èxVd9©+wÓX^MÛöµLHÏĹ£÷ŽU¬iOÄâo¥¹=ˆ!.‡L3=)Ô†öJ^ZâÂŽh”MÝú%4_ñÃFY›ËH‹[ÁBk#;|»X³¤•8kV·°07{n×”9‰ÝùâÛÁª%C(_úfœ¼‚œÄ:6\šòËÐg]î/{_uW?{Ö-¡ñª_›œ9T”Ìàæ~Ô?’{nqýŽ¢“²Yh_Ã.ÏÖ?Û€Õn!ìóàX˜Ÿ„Ýaíõ¼Älï{ü¼²ñ±kÍ 4Ú ø=~ÂHÌšÛ5EUc€É䣹¡‘††FöÅ9±†=4ûƒ“V=M*ÃlÍîóÌ­çi]í²ÙnÂçñuµËì¹WM×%¦v:t¯!DD—ö¤ÐyN¼ÿ7æl¨ã‰KŸ²ßÞÄK–Ïòö–žû»øù3ÏÿçÞùò¼jˆˆÜ~A?~¿¿; d·‚ŠâÍ3?ìD+üx<’r²‰3ÁVê=!0Ç“¿}#KíünÜ>öÄ,6V¬¾æ+Uls³»^ÆîÛEylélÜšCŠÃ„§¹‘f‰¸ùylÞ˜Þý.€ãÉÙZÀ|§ƒßƒßÈÒ¥Ž!V6ÝŸ`0N`õÖ­äÌub ·Óêöcq$‘µq+ùñÆËù²9¹KW¾XRÈɉÈD3#{=gê³.÷×­¨»2°Û›ßÇwkB7ö[]ÿD†#ãdÖnÞLÞü8ì–0>?&¬qsÉ©ØJn¼¹ïó’HÆÏK w)yKàó¶8HÉÙLñŒèˆÆó´*òægOk3Ín?G Ùš:N4Ž^CÄçiÖ¹,M±â÷ø¾Û.û{®6”¯!DD‘ûöÛo¿0©9ë'ûß›ùðÜUKÕÿû #oh§¼½¥ž 8©Jƒ àì‚§ýlsåÃ1Ù•ËxÕ‘~;vì±±±ƒ6ýŸ~ú)£GfĈ*L¹5:Óäö¶8IœèÜ·’JÛ±ÌßÊÎÜ è·Ê"""W µmbɪ]øíÙì|}‘ý"""2 œ?ž¯¾úЇ~xHÏ›>î<ás×øó¹SdÖ]õGOÍK¤ìǦˆn®L&¦Øî½¼®} ùœgvz9ˆe¼¦‘›l¥rC¬$-ÍdFtµU퀕”4»B"""""""rG âw …ùpÿ?ø(ñFŸ ÃÝ#³—§t9sš»óZ[€Îs¦Ä;ÈK·óèH€óœø»›Â·½|¼€aŒ…ŒôÇÈ™Ø}{'ðå;ݼuü Á»ïá©ÄR0ç~Æ|é!ã?>aiîÉè>jzŸùÍãØ“mgì/ËsŒŒŸçC×>v>Éî9&øòsÊwÿƒ·ŽŸ!lÍì9SÉ{¼;v3i‘ïGL&¡¼ª–æå4bÀâHbiV6+&k‘;+jP§þÜ…~¼kèÑ¥ôÒyNý˜’w¿Âkcé³qlË}’ŸFäµã!¢m÷`8}’CËû>õÉçx£îáQS÷Î] téxÎrâø™^R6‚èGFÁŸsôìÅ¿§åÿ¼Ëó»Nc¸‰´ŠˆˆˆˆˆˆˆˆˆˆÈð4°ži!oÉ(ÞÝùÿu:’ ÌÎ|‚å¶7~ôßœ!pŒöGX>¶‘¢ÿ<ÏŽãÁo>gÛsÔù$¶‘æköîÿŒàÝSyÑ>‚Σ'x7hà©1Q˜m±Ì¾»™¢cœm#úôg”»¾Â6}:SFwâÁ¨¯y£þ3}z4k§ôøsý¤ð(³i&ç ’-O£ðÐY¦®º‡{o"­"""""""""""2< °(ÁŒÞP~üBß«š,¼˜>•—Æþ6ƒé^¢ù„×ÚBLÿ‘‰å?O„݇)í3‚Q¦<þU󺦥3NœLYò!JÿÔÂþs`0fvF"yö€…ÂÕñ˜wÿƒÂªãïEÂôªçtOW7ê~ò2"×uˆ¬ƒQÄLrP˜~Žœw{IÜ( «£t÷r«þAøn3³ç'’;yi‘áèß¾ýöÛo• ""r#Ž;Fllì Mÿ§Ÿ~ÊèÑ£1BAsù®óçÏóÕW_ñðÉã¹KE*"""""""""""2ô)($"""""""""""2 D) DDDn ŸÏ§L¬V«2áô¤ˆˆˆˆˆˆˆˆˆˆˆÈ0 '…DDDnýEDDDDDDDD2=)$"""""""""""2 (($"""""""""""2 (($"""""""""""2 (($"""""""""""2 (($"""""""""""2 (($"""""""""""2 (($"""""""""""2 D) DDDDDDDDDDúväÈe ˜4i’Ê\å+„‚B""""""""""JHHpijii麘6•ùÐ-ë¡P¾Ã¦¹ƒB‡K˜7/Ÿƒ¡HÖpÐUþŽP„û.dÞ¼Â÷-ßoÙ]¥ÓÅÊYËpy>šò™•œLòÊ}t”<‹xÝþµ©ïoÃ­í „¾)DÇJÖ.cÁ¬d’“g±`ÙjrKj9ØÙߺYÏÊY˨¹•íùûØçM¶Ç›j¿7C§Ï¯"·àìKç""rS4ü4ÕTãj++;ƒƒ´…é8Lƒý@¸]Í„Ú]4w<‹xÝ[ѦÔ._µ=LÍÚxiÃ>‚ö4² 6³us1Ù‹â0µW±î…Åä»:Э6õ™¢º"¢kŠ¢”""""·™y2‹VOüÇpãjc_¸î¸š;IK‹¾óy6TòWn½P5ëÖPÍB6¾¹–i=ªë„ÉÓHMÏdQíÖ•¯¡È²’ÑÊ3õ™¢º""""2¤èI!‘Û(Ðæ¢påf%ÏbÁÊBê<Áë,O&9yËòk8è fñKìð…q=˼’Äz]ÿ¢0¾†2V/˜uÍå½o¢c_I÷¶ÉÌZ¼–MM= ¦6e÷ÔK X]â¢-4Ê&¹¼ºFÙ°zÖJjÔ»l^×ö…õttÔS²ºkŸó–•Pq:›Î}—§·¹¸m“‹’Õ‹»×-S‚Ü.šÃvÒÒÓIw€ÛÕzÅrw,Ïz®{Ýz|6¨gõ¬•ì;¸ÂeóX¶¥ã†Ú%MlZ»˜yÉÉ$Ï[Fî–¦Ëùrï~zï›zÍÃ^û¦Þ—µUo *¸ŠÍ]!ïMä.›Ç¬Y‹Éw`Ë⨲æ±q¾ÆòjwW©Ð¥z9‹«Ë¨¯/dÁâM×îó®Û7z©Y–Ìâ‹ejcÓ‚d’o¡ãbú6- yY-—g¾Št›7x¯d³ÖÖ÷ȧN\+“Y°©íªñâÚãOÇ«Þëy?Ûw_}ðé3«~Õ¯"ß³Ï_¼.–ÍZ‰«Ç‰Y§k%³VºzôÕCë\^DD"§ ˆˆÈíÒy€¢5å4[QPQA^Z˜šÒF‚g~¦r]9­ÖL *6SQœ‰½µŠ Õm„ˆ!sûv–Z 8 ÞäOù“1öº~·`#¥U~Ró*¨(ÎÄê®bÍúîw¿ô±}¨­Šõ¥˜P±y#9q~vm(¥)àŵ~ÕÁDr*¶²yc&ÖÖrÖl¨§s0–M_yÙWÙ„Û©ªê ­`+Û‹S7ñÒªL™Ù¾5DåÕ‡¯=%U¸êòĬØÈöíÅÌ¥ÒòF:Óº§Ž³&‘c#.Õ îZZ;#¬ï·)Ï®_¯Ñ¦ÂªKk -›ì4ë µË²UëÙN!§b+9‰w­gUYã¸ú;†£>ú¦Þò°·¾©×~+ÐLÕ® )y+˜l„Îù¬*rŸ³?¾YÀdW;|Òœ6â33±ûÙç Aè åkŠh¶dR¼¹‚¼T?•¥ ø¯y`½õ-øšÝ]ÇtÓê|­¸;ü¸›ýXã°\Ú_¤ÛkqÁVxB¤Ú©÷™ˆKµcÄÃÅ fp³#DÃz\î3¦™éltÑnM¡`‚om$í1òñ*²zÞŸöÉx6ÈûÌAª?õ_ã«ÈmÉù‹·÷] ½syé…DDDn‹¾ƒ> ÎlìÆËWtŽ o|cHoàpë>jæ »™æÖ $]ï‚0‚õ R/!FÇ †:Ú}!ˆé}{£3“ùÖulxaΤ$f¤¦’’ÍínüÁvÖ?›|U¢¬´|’½æee`°`·š/]¤0`™`¹tÝn0zI€g·b W^æÈÝî¢9la~š½ëí©$švQçj%š4`ò¬·z|½ýÆÅYú×Îzð·{[áìÑ¢3°†÷Ñî‡xÓ5¾c8ê¥oê3{+Ó^–yÛ}`IÅj„Ðá}4ä$]ü’0¾ö Ö¤Dla?~,8Ma|û<„í™8.%׌c†®qS<ØWßèHÅI9õž–&¦ÄÒ}ÍTð0Àƒ“L»z<%aŒt£“ô8\nÓ4º•Ek Ù²s3ó Ô´vbr80ùÛñ›lØl]‹ßEyeþAø‚ÚÞó¢ï²~1nj›Ã˜’ غ};Û»?[ ’0ÑJmkxÀäYoõøæëÆwYv ¾Ýï{éNƒû>ƒ‡E=a$}S_yØ[™ö¶Ì2Á¾&Ên¸ ¹ki[˜»"‰ 1= ܺ‚K#u®VLy#Ï ½Ôc^Ѧ¢o¤n\Õ.£ã2I1­£´h †¬T,¾}T–»±.ÜŠÓºÓyÑõû&³¥÷< ÷R¦†àõ—™­‹ˆ —RÝÐI|Z*Y_ºŠjÌÍ.&ÇPNåš%48Éܸ•E]/@!:)‹”ÊõM /Ó îÊ[Ãלƒ*’¾Ñ—ˆ©rí–ù8-`´ÌÀÁ.òv=:iˆŽaêSÏóâ‹Ì|ô6½õ,ÔÁÞ;û½Yç‡ûñ†žçAÕ•Èó¼õj ÑÏÍÆöá^¼@ø£ß²"ÿAÞ.Ÿùý½ï.ôÙ?^ˇ=þ´ö™'®XåÝ…Oð O±éýJ¦«|‡4=)$""r»D§±qs‰þZŠÖ¬¡tdg]š²ÁŸMÞ| V±dÉzª;R).ž‹½½œ {:+q)NüUkXSÕ}®ëBŠ3 ì+]Ú¢|q9l.ž9‚ï3OË¡x©wåzÖ¬ZGQ­ŸÄ¼ r&2+*Ȳº©\¿†u¥u“ ¨ÈžÌ`Á<œ¼¹˜KY÷ÒÊ›&“—“Øczß¡u.?xœ¢¥2‹9ó³(}ã]>2L'¯¬Œ_%wvв÷r3çQø'nÇ“#Æ)üâ¹þÿôÂöÜ/˜¢Šr—Q³cíRJ÷n£è¿Æ“WüÜíûá‹q:•ïo"¡Ï&þíÛo¿ýVÙ ""7âØ±cÄÆÆÚôúé§Œ=š#F¨0ED†…NšÊÖ±~{J6Y‹q:b0…½xÜnÚÃRfÄ\yCÌÛľV‰iñÝ¿ÆѶi kÜÙ¼¹%ó;ÂŽ-‹y©9“¿K×6róYý¹Ž9BBBB?·ú'oå,¥ôÄLò~¯yy¹òiöfÿ––OØÚ~ZÌ‹¿åUïsTVe3µmKKK?ÓàŸ§œx#ŸÜ×>ŠàA_S~VFÉ‹ã1}°_c@KK “&MfeÞCècv¬]Á+™Ìäö cHx™²ŸžàÕ½É+ëß{…ú_Ö@è²~¼–¦P¶g9Ûncù®ÿŸËG$°éýª~…{ùFâüùó|õÕW<üðÃCâxô¤ˆˆˆˆˆ ÑLËÝÊÎÙ8ý.Ê×½Ä ?Iæ'Ï.aÕúrjöµâûÎ6>jK7Pî:Œ7ÐIGS5å{‚8ÓãÖ ñ@ÔP¾Ë‡sQ’Br‹ ’ú/"2 …8TžEé‰ç©ÚVÈLã fݯ]èìKFy …ã÷’ÿ6§¾×d¢(3—§–°§úW<ÝÛ)ÔSüªz%S?$?³ˆCz÷T?òù»!€pË+”}‘ªÊþ„nžƒÁ€ÑpÕURÊÞ)$"""""ÈÛ´EäO[ÔuÞéÅ K´ùÚötŠ‹;(­\Ç’ò0‹ƒ¤ì rÒ¢Öý_-¥0¤äPœ­b–[£—ú:¼‰õ•îëÿ²Ü`'³ ŸªŽ"2Ü…>bÛ^fªB¶‰˜;ÿ‹ßîÿîªÑã£12–™¿z™ñó_ãÝÎ!ãÁï1mGy#w>ïÌΣ¬fϽ’ƽWNÝó\‡Çý IDAT%/OäèoW0¿HP™F\ö×~EÙ/U0Fî…DDDDDdØ2FÛú|ªÆ6c-›f¬ØÇ1!—ß¿—«•[îºõòZ6mQþˆˆô=HOay†™¬ÂWÈØ–ÃÔG—órÂ^Š®~LÈô49/ŽNñvé+œxêW<ýàíI¢w)™<ÅË•Uì™ùE¥oÐB/æð³èw(ÊÌäÃNe¿ôªÞt»Ÿ¹LÓljˆˆˆˆˆˆˆˆˆ|/ŒLÍ©"oü[d-/áFóü¦ütJ÷ûÚ D'ü”â%Ì4~ÌîœLмÏQY8‡±·3™ÁyeÅBò[¦ðrÍ_øKÍËLiÉgáŠß* Ôoÿd÷Ú,^ L$úÄ~„dÀðA¡÷s6ÔñĆʽçû½}àèß™¾¡Ž'*?ëç<œgii:Æ[_tç™ÏY^ð.Û¾¸…ð°´à»¿¼Ù]•Ö[¶ß¾KDDDDDDDDDzñ Ï—ï¢læQ çÏaiÑ;ž/¤ú/ïóþû{¨þÕÂoä“1g;Œ/³£:›©wäåmA>zc+æ>Ã3sW°áªðú/t‚ý§°jÕe?½ôTúÀ…‡Ã„ÂWýW¥6¬ Ìéã¾ô’¿­žžÊ‹St£Ã|p4Àlï JßÁ/–OefŸãY5ŸêšãØçáÃÀCáÃs÷ð‹D;æcÇ)mösêq[×|œ_zÈøOXšûc2ºð§šÞg~ó8öd[Ø»±‘×N;ë™yôIÞ~¶kÎ/<äÿŸvöû˜ÆZÉY6õò3/(ßéæ­ãgÞ}O%þ‚9÷w}ß/ËsŒŒŸçC×>v>Éîé_±´ì¿œÁs_þg¶ž¼ê˜ üôå§É· àõPº«w|aÂD3)–ÂŒX¦Ž ²íê´ÎùšÝû͸¯¯t}Îòß´3;sG޳ÿ“3®>®K®þ®DÊù;Ù§'³ççÝùJˆÝ•áÕØéÔN=Æ¢FòR/°­þ3>:ÅÄI±dŒçÑQÝ»:s±`>g·o³¿#:ÝAþÛ!f?›HUæx¢?ù+j¼Ýïw:Ãîךyõ›±ä­šNõÏbyð¸ûÒò÷(Ù»?Ç<ý1ª²È{$Ä5‡øàŒ®ˆˆˆˆˆˆˆˆˆˆH ¬ ÐY?^ifÃ{_u?1s9±$Ü7ó}–gü.ðÑþƒ¬øÿ¦åìuöÕ=uœÍiÃØ&>@4_ñ_Ç#|mÖÈkgÑ”9SY:ÑÄxûCüâi3|ù5@àx;{¿±Pù(sbï%áG“(KMçßñÑ¥4^À<ý Jž~ˆéßy g$f³‘±f#Fo;¥Gò³åNFDñTÊTÊ2Æ33v ΖOˆ"ðå¹^ÓJÄé‚ñ©SY>Ñă÷ÿ€Ÿ¥Ž†/ÿÕý.§ÞóÅh³3=ê4»?éÚÙ)÷'c%Ãvñø¢˜½ä1–:ÇàŒ¥,sæãíìÿBÞc¼ú……’ÌG™i¿—©ÇS°dæ¶îà]àk:£ÆñøH°ßÏóéOtÄ¢ÔpEDDDDDDDDDDúkÈÞ^y?áÃs2ºŸXa¬§îî`o³ŸÀlÜØ+Û Lµ]Î2cÔ]ºÿ¿Óû5á11Lí±ã±ã~€íÜg|„„»»¶Oˆ5ôþ/ù;½ØæMç+#MÌIÁ¡ãŸ±ãøiZ>9ŇÇÏÁ¤¾Siº®<.0Dš%#G“ñÈ]ä4Ÿ&0ñ^ÞmþÛcúàa.ðÆ+ÿ—7z.:þ -gl̼ÆVászy5‚è¨7‘Û}l6ÈŽm‡84n*»~lº< \à ·´°?j,Ï=n#ãÙ2Þo&ÿ›[U F`¸áãÁÄD ìüŒ£_œa÷)#ÿËÔëúœÎ¦qlúùÕOÿÜ…ù> 9ÿû'¼xì$ïùœýlæ×ÿòqæ˜ÕxEDDDDDDDDDDúcÀ=)d¾ ï‹Â„ðñõ›|w=ólÆkïäìWìh»€iÒcTÍ1_ ®„¼GÉÚy’7ŽŸe¦ 8wйKqâø¿¬&Úv†Ó'9σÝ‹SŸ|Ž7ê5ÑéÕyíoá·A›~ncl%]SÀ=Dõ¯§2ud׺-ßôÀºeéŠ ÌÆcê¹ÿæÕ·¿âĘq̾¿çÒñŽ÷<3cGt——£çŒ¼xßÌwß‹)ø/:ïÅôî´…<“ûž‘œ%ã ÿ˜W½÷“ý´¥±6–Î>MIÙ_yíxˆ9?2ªõŠˆˆˆˆˆˆˆˆˆˆôÜ>î ûß=I°×u.ðởqâñXÆ_ciè“|xÎÀs©ðhÏw÷Œq0Ût²k ¹%£x0êkÞ¨ÿŒGŸ ÇÚ)=~Æ\^ÝÌ_~Í©3c®Ò\‹ù‘XfßÝLÑÎ1ζ}ú3Ê]_a›>½ëi¦>‚/£‡Èýà<ÏýÌÁTθŸŠ‰Á4 Ó7§Ùßö/¢ÇÝʼnÿ9JÑ‘s„Çé<Û5ÚõÒz³éºæ±öü®QÀ¨1dÇÞÿÍÄŒX¦ž;Í6×'yŒçî#°|l#Eÿyžǃß|ζ?ç¨óIl#!Ì×ìÝÿÁ»§ò¢}GOðnÐÀScôR!‘þºkà%iK—ÇóœÕÌìŒ'©žwyž°˜ÙORaeâX+Å˯‚ó|Ô|Šð˜‡Xj»jJ´‘÷ñø(ÂÇ?¡…ûÉËxó‘CdýÇ_)iCaúXL=Ò‘ð£Ñtîÿ++öÿ«ûý8½i¡pu<ø(¬ú€®“§'P=ç^ú~¦å<'þç„ÙûÚ»<óïõ—>Y‡Bc'Q˜Åþš˜_Ö«§l”e>DŒ×Mns°÷´ÞTº®]>ßý®‘$$Žî!Ã9êÊգƒ—2’½»ÿÊŠšvNŒû!U™Ÿ„2±ü牼|ßiÊ_û+Y»?#à|Œªyc0打)K¾—CjaÅ+Íä⩌Dòì#ÔrEDDDDDDDDDDúéß¾ýöÛorCÞ#,|¥/~úòÓäÛˆN¼ý. >žlû¥'…BžVæ¼vò_?NÂHå‘ÈPtìØ1bccmú?ýôSF͈[DDDDDD¤oGŽ!!!aÀ¥«¥¥e@¦ëbÚ&Mš¤2¢e=ØË7çϟ端¾âá‡Ç3àçá2Ú&ñVñЮTƒÚ™ -ÇOòêg˜’þƒ«¦Ž‘B/g‘›:ÝAaÃT'åSÊÒZZZ”.•¹Ò#ƒÖ€Ÿ>NDD.M'""""""""CÙP›>î.©ˆˆˆˆˆˆˆˆˆˆˆÈЧ ˆˆˆˆˆˆˆˆˆˆˆÈ0  ˆˆˆˆˆˆˆˆˆˆˆÈ0  ˆˆˆˆˆˆˆˆˆˆˆÈ0  ˆˆˆˆˆˆˆˆˆˆˆÈ0  ˆˆˆˆˆˆˆˆˆˆˆÈ0  ˆˆˆˆˆˆˆˆˆˆˆÈ0¥,¹5|>Ÿ2ADDDDDDDd°Z­Ê„kPPHDDD'""""""""2 hú8‘a@A!‘a@A!‘a@A!‘a@A!‘a@A!¹a±±±Ê‘ABA!‘a JY """""""""Ò·#GŽ(nÀ¤I“Tæ*_ ‰PBB€KSKKË€L×Å´©Ì‡nY…òn4}œˆˆˆˆˆˆˆˆˆˆˆÈ0  ˆˆˆˆˆˆˆˆˆˆˆÈ0  ˆˆÈ:\¼yù E²v€ƒ®öu„"Üw!óæF¸o¹c¼µ¬\\FÛ *§N\+“INîù™Ç²µ%¸îÔ„Ú([Ì2—Wõ@n"ŸCt¨¡dí2ÌJ&9y –­&·¤–ƒým&õ¬œµŒš[Y%¿}ÞÔ¸ÔÿõomWäbå¬e Öf/ê?¯]¯›Ø’¿’ų’Ižµ€•%.ÚCàœ×[OÙêÅÌJN&yÞ2r·4Ñ©Ú{ƒúwM ""r5…DDD ?M5Õ¸ÚÃÊŠ!sM߆«¼šÁZ¤†Ä<6oÝÊÖÍ›©(Î"‘FÊW­bÓÁ€ÊvÕƒ!“ÏÃÔ¬}—6ì#hO#«`3[7“½(S{ë^XL¾«Ý‚Hƒ´…é8LÊ µë¡r@^jׯgG»ƒÌâÍl.ÎÄÚ\κÒ ê‘5ÔAõº"êH!¯b3Ùqøv¬gƒ"ºº&‘;"JY """r»…hÛô«vùºþiœGa°ÚqL˜€€ÉÄÏHbrîŠÊ÷þz&1*èaQ†D>‡Ú¨Y·†j²ñ͵L‹¾¼hÂäi¤¦g²¨vëÊ×PdÙNÉŒheë@`žÌ¢Õ“•j×C§ÿìh ¶ÝÊÒíù¤Çt­yyya}53H¤]OÈSKÏIÎæÕ¤F8Èij`«•ÎtêQEDDn/=)$""rÚ\®\À¬äY,XYH'xåÝÓqå×p8ÐAÍâ—Øá ã.z–y%‡ õºþEa| e¬^0ëšË{ß>DǾ’îm“™µx-›šzLô8LmþÊî)–°ºÄ5x§nñºX6k%®‡×éZɬ•®î©Mn"/õ¬žµ’}÷Q¸l˶tFì™lß¾ÍYö!TãIZ‘‚ɳfo_u¬“úÕÉÌÊ?ØãÉ‹õkg1+¿©ëÑ·ºŽu6±iíbæ]cêšÐáB,ÞÄ}e¬^<‹ää¬Ì¯½4eO_ËUs{ ÑV½ªàB*6w„¼6‘»l³f-&ßu€-‹_ ÊšÇÆùË«9Üý}¡ŽzJVw÷é«Ë¨¯ïª'׬§×M·—šeÉ,ÞÒѽÓ66-H&yñ:.¦oÓ’—Õrù7õ‘nóï•ÌcÖÚúÓ4uMÿ¸`SÛUãȵǥþŽc½µ3X=k%µjÈ]6¯«O(¬§ãR>&3oY õÞÇ©Î}—§»¸ï&%ÝSTÍ[V¨é•nZíÑ{àRyÏZ°š’}=ž¦»‰>·ïóŒ›í?æq…¬ÎDfX/¯n¶Ú±&Ìåe™’гÇS}&‹Âaô¬K]ãšàZc_Ÿcí;—‘~QPHDDävé<@Ñšrš-‹(¨¨ /-LMiãå‹üÐa*וÓjͤ b3Å™Ø[«ØPÝFˆ2·og©Õ€³àMþ”?c¯ëw 6RZå'5¯‚ŠâL¬î*Ö¬ß×u1ØÇö¡¶*Ö—6bZT@ÅæäÄùÙµ¡”¦€×úuTÉ©ØÊæ™X[ËY³¡~HÎÓyöP]ZiÙd§uÝé1FÛˆ‰‰ÁnZóíÓ°ãã /ÔG‹&.ÝI¸ÕEû¥ú­¸ÜÅa¾Õu,t˜²UëÙN!§b+9‰w­gUÙáKí%ìÛEQ•ŸÔì *ŠaqW^ñ}½/W=´í-ÐLÕ® )y+˜l„Îù¬*rŸ³?¾YÀdW;|Òœ6â33±ûÙç Aè åkŠh¶dR¼¹‚¼T?•¥ ø¯yT½¥ÛBb¢_³»ë‚nZý€¯w'€w³kb\‡!"Ýæ âÓ1¸]¸/Rqµ[II³cìk\ºq¬¯vF¸ªªÒ ¶²½8…pC/­ªÁ”¹‘í[óHüÿÙ»ÿ ¨î{ÿãÏûm9;—©Y¢]´]ÈÜ…L–dî2F2Q´‰QcÀD1U’Ië¯(jErô[ ß©ˆQñGÐk1× ¶EÛ`L4f$ö+‰#†‘ï4Щp'ÈTÙÆBì°dfÓé÷PѨ ŠØ×c9çìžóùyÎç}Îçt¡¸¬wýþôs}™Í”Ÿ ,µˆ½{ó™A5…Å5hBË»T} lXžMµ‘LÎŽÝ¥Ú©-\Ná©ÎAhsý×õ;i?‡êqY"–±å­uDY®4Pœ*?‚ÇêÂeÞÇU›L˜¥ç˜Ú›ª)«îÀ1ÓM¨ªÙÝàšà&}ß­Ö¹¼ˆˆ\KÓljˆˆÜ#mÕ¥Ô3Ø‘ŸÒs±CιX~äòVOÍ$iÆL¢‚œÇÊYíé½ ûÊÑ¿õ{×™‘ŸCr”ˆÂekã…åeTž›É2»Ÿí;Zé0\¤Í˜Btàt`Oð`7À×TNY«›œß,ãñ`€œ9çxay%õí ½SƒŒ w’€‰5¹ˆÜäú0¬˜xMÓo ‰IÂé-åp³¨( õU41¹,ƒ^Æ:ëË8âu“™yêšòÍFž+.§1­Wo}‰ÏÉ!9úÚúRÝ–@¢¿å^•ƒáZß:«¨·Æ²Ù ¾3”ÖâHÿ )Ñ!€•·•R3wàsâ0¼tx¡½¦”jfP”“LO‘È$óÌsd4~ý;üíwì7ÖƒÇhµù{,no='Z}Ì4š9æ±âNp`¡•Ë‚£ŸÛ;“ˆ12¨jìdÊãÁ´×TÑl''ÂB[¥¿~i`ý˜¿zÝۇŤ¥‘ É$9RéÎdé”,8HŽ/¡º¹°ô«Ÿ»–#5“”ÇC€0RR]ì/m¢ƒ‚U³½>vÖ–rÄŒ%?'¹§\G¥“s.J÷ÎÛ\ï]>ÏÇÕÙÄáâl «Mâó—ö  ããò5PðÜrŽxÇ6šP ´77Òám&㙩×í”&/#îBòŽÒÂ`ÃíƘ^L l†á¿Œ†Ää,¤ìX+iQv«1b‹pYÀ;Èe¬£¹ÓžŒ«Ïv!®)ØÍÃ4wÐ;àådŠóëõå”ÇG¢qëåñ•ƒáZ߼Ͱ%`·€¯á05^'é±— Љ§Ù‹=6¦çnv³ƒl¸¬&žÃ­˜Ž®‰`œSÐx£ïð³ßÎ\s¬µÛ©V¬1é$yj)=ÑJ§q‚V\¤8,ôgÉÒßm,.’ÜÙUt>ª{|aø8ã¯_`?毞E[ÆÃ~9Dc```‹°]ã4 c`ýÜ5l¸œWŸ1Œk‡Le0룦3­˜ö¥8ƒ¯ÖèUˆΕßY›ë·M ÙÇÕ~æ-ò²+¨ÇÍÂÍ9,‹ùeq’¶{/É­õT–³:;‚ßl™©w Šö}u./""×RPHDDd¨h?EÁò ªfÌL )-™¤ÊÕäyi}àòð˜aôcûàhVý÷‡$Ÿ©¡æÄ Ž•¬¦´8–œ½¸MÀ–HÑæƵŸo!A˜}繿“´èìIðÃÅØ×zŠVì$Ø-ý(£!Ä$9).?†'5šªFƒø"'虎ê/c½_lr“‘å>ËU†m}3;û¾Ó¢'³¯|t{-•î¥=Sñ´UWÒl‹'ÓaàÐú+Ï.^Êë›i¬÷âXêÂíqÐQÕHsH#^gjÏ@nß9}‚û¹ œInÈ;Ló¹hªZm$å„ÃàÅíç CulpÝ´>æà0{Óün´¹w»ÂÇÕ~,‹—òj°ÎÈaozBï”kÃû¸|mM4›v¢Â‚  #84Œtã 5««¨ïœI‚å„ìðß÷]Ó×À¹¼Èоhjá@V˜MNÁBº§§/|’»U‡®>R:}eq< œ z§ˆˆÈ=aÁmÇlÎäÎg~AÖ;lsïv›:d«ó……µ8–îfoÖBCø¸:jòX¾ºŒ&_ßn çÉb=Í÷Íôµ:o‘ãƒô§yì±Çôótú»\PâÝ ¼»n!…8ËÙ?l$ui¾—õ®åÅ'#Ùòѧ|úé§|úÑ"ëJ8Ô¢œ $zRHDDä OÁ]ZHFv™©nŒÆJŠ\}%¹a³cõ6r¬¶ ›Ë µº”Â/¦«•_ÏÔIÁ˜x=­´wFaõ³~Ï5¼—#yyD¤§à2)/>ˆ7&Ÿ¡`xn½½•VŽ”ÁkÍ$ÙeÐQ[IM‡»KT )Ž—(\]iIؽ'(/© 9vöáx“¶ÕŽÝh¥²ì0ÎÔ—Q\oBï{z;I‹¯·¾dö©/îf„ ·^n!pËÁp¯oÁîdÜf!eÕíDÏL 'ç …?â¹J3ÒòI7Š)YþÕÎRŠv“ÜórBb—_’A^^™).h,ï9ŽŒpö§<ÛÜ1XKöÓlKÄe‹m NöSÝjg¡ûÆ·m÷{›`In“쎴ø+/v÷×/A'g*Ë8a$±4)ÌïúÁþêÙóÇo¿¨Út×ݪ>†8–Ïjòò¢ÈLqc´–SXíŵÙAˆëÎÚ\¿mª_×–]Ë09®ÎÚJjM íjOxúV\î(B,Ãó¸,1I8JJ(,‰ m¦££–òâZŒø"ÜzJè¶ô½&¹¾vÄË3¾ uÚWÁ»Çëø¬­çñW#$ŒGŸx– æ÷Ð=ª¾s:Ù>àÍÚO¥Í÷,ãTVn#Í[xwg!³§zòm€ùÙFR³ÆñAqÜÝ{¢ïÒ&¯âdŸ?­šöØ5«üaÞclà ¶|\Â$å ˆˆÈ½2“¢&……eä-/ÅêŒ'5)•y =gÑid&fSœý#öv\3–’Ÿo¥0¯˜ìƒn~•lÇt9ËÛv³wÝ­×ßáÃ>ü”Ê —SâµáŒMgG攞“M¿ß—NþÂBŠK2Xn‚asŸ¹™ô( FÊæÍPXLIƼ† ׌6§E1,σ'=sÙÅ…¬>bÅ›Jfº—ìòË‹(-À¬-fuí•Ñ®XÒw§“aég™B‰MrPRbŸäè“f·—®žƒÙ,?xíßìK÷òÛ”h²väc-,¡py^«÷¼"v,‹ÀBïDZF é©Vª —SÒaÅ›ÆæÌBú±<ËÁ°¯o!±¤§:x©0ƒ-ö"VMYǯ¦¬»º<á¿IºÉqdnN§°°”Œå&ö˜TÒ–zÈ+Á°ÀµóËùßo‹c në~ªSzä$8¡¦ÕÍûw½ÿÛãNrAmI±¡ýî—ÀKsÕ~ö[£IM Ãâo}Ë­ëÙ@ùmCâUî~u½U}Œ&sGÅ…%d//Á´:‰OßLzt0lni IDATpgmî×õëÊî09.O«ðP‘—}Ý;Iÿý¯H² Ïã",™Íùí–•‘qЃiµãŽÏaGÚã(&t;®»&X:ð¾Vç-ß”¿QW’MúÛu=§ aÓÉÜ0ß¾,6Ö£îÐVêí$lv&Å™Ï~·3ÃòKf‡ròwmÚ,töQA8ߟ©X•ÊÖ–‚Ãç’“?›ÂìžÀÐ]g™DÉÇ[X:yu·\q‚Bâ_þùÏþSÉ ""è/ù ßùÎwøÖ·¾¥Ä ôk´†\žË0Éÿ}Ñ–/—á®SV“q°G|K“cp9ðšm´66Òl:‰ŸrÝlÛ)×ÄÌŒîõÑ´å–7¦ñû·†Ü@ç¹·æóRm ¿ùU’ž°‘!ßæŠÎS”¤gEß³An—H`øÓŸþÄ„ ¸ÕÞM_HaK™K`k^+K~À¡´Ôõy’6ôù|´odgÛlJJÓxt'uuuܯN.ü­“–}Y¬{û³~<ÐkðÈË(XNðãt®SWWÇÃ?`yÞ·!í uÆÇqŽž51&¬dÃó-ì<I憽Whày ø>é =†ƒ‹Ø3o‹ö÷ù¸ŽÏ˜À–KîùÛÿøÇ?øûßÿÎ÷¾÷½qàowu·þH^Ê:N>ZÀÁ²µ<r«S¥'X[v‚GO’•’Çõó×BfÝV Ï. ´d`¡;gÁ0 ,Æu¿•SEÓljˆˆˆˆˆ`!ôñd²Oî¹~oo£+¶à_$‡&‘ŸŽÂ’Õ¼Plb؜Ħm&}fÈ:*Ÿ§’ÂìjŒøtòãC”Í ‚‰^¶Šh—ˆ ‰Îø3öèdzéJ _h$Áí¿cãѯ¯‚…ˆ[»’ðÄ·ùÃ…§™;î.î[ûYö­KäøôL6”ïgöÖt²»f•°Ù9¬ŒäìÆT¶”§ýÎû„Œ kÙ°ä!cä¡ ˆˆˆˆ͸é‹xyA.ei¡„´·œ£n_sœ„¸L*Êž%ü xùl_6©û”cwÄ×ÂÑ?‡“ûîùc©«~GC% äÃ4M|æu¿•kEA!‘»ê&¥íჹŸphÏ>ÞÎÚÃÙ6/FHNx–%e¹<ýP°’j$ð~ƺiKÙðQ‹9D±eåyBè3Ö%öL-|ýo  ‰ˆˆˆˆˆˆˆˆˆÜ–q“˜›5‰¹ßøŽ„3û +u'½ÚÌúÄìoè)¦á¨ŽuÓ‡ÆB–HÌ¥îPÛMW ý2*o‚‚B""""""""""eÏ–çY%Äà³L¢ôÓO‡ØN=@\î»|š«ìø_J‘‘OA!‘  ˆˆˆˆˆˆˆˆˆˆˆHPPHDDDDDDDDDDD$(($""""""""""" ‰ˆˆˆˆˆˆˆˆˆˆˆ…DDDDDDDDDDDD€‚B""""""""""""àÛJ‘þ©««Ó~)ϵ?2l)($"""""""""Ò?ü°Ay.2¬iú8‘  ˆˆˆˆˆˆˆˆˆˆˆHPPHDDDDDDDDDDD$(($""""""""""" ‰ˆˆˆˆˆˆˆˆˆˆˆ…DDDDDDDDDDDDÀ·•"""ƒÃãñ(DDDDDDDD†»Ý®D¸…DDDɘù%‚ˆˆˆˆˆˆˆˆ Yš>NDDDDDDDDDDD$(($""""""""""" ‰ˆˆˆˆˆˆˆˆˆˆˆ…DDDDDDDDDDDD€‚B""""""""""""@A!‘ðm%ˆˆˆˆˆˆˆˆˆˆg;:”·!ÒfSž+eˆPPHDDDDDDDDD¤Ÿ&L˜0äö©®®nHî×å}SžÜ¼ ùh4}œˆˆˆˆˆˆˆˆˆˆˆHPPHDDDDDDDDDDD$(($""ò 2ÏncöËë©7û³võGÏ‘óf??ûMf¿üf??[î¹/ϰs}?\˜Ì´…‹ùñ¶£4w ›ç`F2Ó’ûþ¼Ì¿çlãàçßP3?gãâdþýè*rélÒZû{ÞÈYÍó “™–¼çWgñÚ¶÷¨ÿr ßù1?^¸šŠÁ,’wã3ï¨_øúƒ›¯GùñÂÕüBE< }ñ?~u'Í:ß‘ÒQ»_˜Ìì7ð[ôïAß!""ËÞ)$""2l\¢öJêGMgÆxCÉ1¬}Áþ‚öuÅñ“ŒÅ8i¢bû.Ölͯ_‹Á:LŽ"Èý*›†ctwã½ÔBÍ{å¼ùÚYZs X5JÙ å`Ĥs×Y*Ö糫q4“ŸŠcÉ3Q8GwÑÚÒH͇åüdÉ{L^œÍϦG-ða„3ã™é8ÕÜ®®Ï9¸ë·üO÷d¥…/©­<Žwrÿ¹(J}’ˆˆ ˜‚B""""÷ÚùÙß2†›V8 ’×_màù‚Jj¾ŒaÆýÃã0Œ1ãq>ø`ï`D$¸òWðv%qós8”ÓQFD:›ŸS‘›ÍfñË©ÄôI{gd4ñÓç0ï½õ¬Ù•ÅÏGoâ1Êœ!aT$óR"•ɤ¹l ‹ß¿ØóßÑJ $ÝxÍ l®ì Š‹ˆÈmPPHDDäò~~”Û+©iéÂ>‘E³ºo²üÝÜÇ÷'ÎáõÏáužŠW×°ï"°i³ëóùÝŠHÌ›®õ¢ÑóñN^­8Ο.}m¹÷–Û›´~´‹7*>æO—º ã"qñVF÷†veÿ¶]TÔ·ðe÷hŽKfíâé8‡ãíŠ_åß×|ȼmE$ö^ÇÑ ~øáSüºh:¶;I‹®yuñ;$fÏ¢vçšc øÏI_ap;æê.XÇŽÇÆy¼Ýù„ßOlòdFe§ö‹çpŒ½Uû’ê¬%¼1:—C¯]¾Ëµ‹êœÅ¼1*ƒß½u°ËØ—gغiG/Òuß8&N_Äë)ÑØè™nñ‡›F³6¹›ŠÊãüéâ(þuâ^_ñ ÎQþ—« çúfÒ\YÄ®®YlÛ”ŠËOmËSq1‹áxg‹6±þ©l~²«’F÷\˜ç?fã¶=T7uaˆcå3]l-ÍúM©8¯?î›î÷T¬^ÁÁ˜Mü:e<˜Ÿ³uÅkšÃÛÛSp`Ò\¶‚ÅõsØ—{y仿Û<ËÏ#ð¾X¯ó&cë©ÌXÂ×z~ú`Ÿ~äÆýÒ@û±[Õ3ºjyuq%ñk&Q[þ§/À÷'-áó¡bÛª›.aŒ‹cmö âÇö£Ÿúò#~¼â7m&qTïgg{„¹ã´è>Ïžmï@Ü"VÆÁx0…M=ƒÊ½WàÔ¾sœ¿Þ‰k˜ßílŒwãà"õM?eì~ÜOEÐÝpôê{ º8ØDÌ3QX»Œ™gÙøZ»'³6w=o.qã}¯€ï<{¥¾˜ßçç—ˆ_”Ë›³°5íáÕõW¿ïÖËU†m}ëªgç{]L[1—µëùñ¦&ÜK6qh×\nbßÅpfDŒÅ=gß¿tºçÝnf³6Q;z¿ÈÏåõɗغínüê¡[í÷hbÜ£ùkýÙžcèj¢þp±Æ/.ÑX‰ïº]½A ßÛVDDF=)$""rx>)çtPÛ2žëœŒZÃÏί`ÅñËkŒ"fþ«$ÆM뽫/ããwXsñ«žÅW4þ­À}<±†y‘‰kôE~˜]ÉþóÓX2ÆÏö—.ÐÉʸÜ÷áã±Oºˆ=ÌÏßaÏù(~¶=…˜Qòúšóü0û=꿜LüH›YéNÒÂèÆúL6?{fì×?»ësŽì,â—Ÿ˜LËXØgàz˜ ºƒn¼f·ß2js?Å¿~UÁ‘W¤·áCƒÜ¬0½Œy*9Òåâõõ)½Û>È/Ì&æîz‡ÆE¯áê­/ñkÖ0/ªo}ù-Õ_L&Ñßò.•ƒáZß¼ R?*†M£Àl`ç¶z‹·±0êþž2ìÅ.srϾ˜á8‚ºèø :N—SMë×<ƒÛ"WðzÃbþ£éë_ëo¿cc\Œú𚻦án9gÌDþ­«š &3Œª/Þ‡{òx .\éýÜÆ>˜ |ží"6z§?äÆLægxÞó×/ ¬óWÏÜ=1‹ÿà(xðÇ}Èþ¨WYó ã™7yµ\ÂŒ~õs×r$¿ÊÂèûñ,œÁò:˜¬wtÝ…úè­/çˆ9‘_¬y¦§\G.ágç7±ÿb×·¹]vž!rGÐVêü^DDPPHDDä1ñ4\$(rŽ>ÁçÄp‚Ž_þïx⟠¢±á#ö76Q¶žÚƯ`âM>²?ë…ßgÚ#|"Πã4aÂø[ooDÎ!qL.ÿ{Ébž8‘ØÉ“‰Ÿ…Ý€Ž–&¾üª…ÿX”|ÝN¡ù+FÜE㥅0÷ ýèh(ççëßáÿábAn>K¢F@Âu…I6#ȽßMbøvö||ž•‘ciüð,FLvÏ@ý —±Ž–ótyWŸíl‘ùn÷qš/Ñ;@Nlø×ëKíE“Ä [/ÿBå`¸Ö7oË0zv̳ǩù*œµWÞÔ§¥‹ïƸ±t_¢ƒÑ¸î3ñ?O÷ø9}¦Ô…sâx¸APÈoyŸŒ‹]TŸïÂV«{1‰ëÙY{oÐiZ‰dáxƒ¾·|ýÝÆˆ 1*ˆŸ~xot85žç»“×àÀ¤Þ_¿4À~Ì_=s‚F÷y²#ƒ lᣯÜî`ëç®1WøÕ§FŒ Ò È]ª&Í è»ðêtoŒÂšhýýµ¹~ÛT N‹ÜV[©ó{…DDD†Ž/ÏðFvÕAnfÄM"qÑ3$¾ŸËÏ»iýžKÁž~l?*Š•›Ë™×pššÚZª÷ä²kçDþ÷¦×pw£Ÿâ—¹sp\3â„uìÈȳÛäÊ Jw’]@P6ãÚG?:>^Ï¿o:5n o/žÜgu˜§ÛùzZCü£eô~bž çÍw>Á3ßÅÁ³ñÙáô>ì1ÊXo¦˜Üdd¹Ïr•ƒa[ß̯º¯~wof_Yüe=û›‚p§ô¼Èóñ{4žÌëãMIæ·›ŽÓ|>ŠƒçG“¸füu6BúÅ  C/¾T7­kptAÆÝhsà7˜Ç`t™7¶ë×úÝ-TŸ¿ú³åcš»ÇàcøÝ¾ãL9ß„5j2óRÂömù¡Ã¦YÔmb^áâ•Eƒž]µ¼±­ÇÂõü׊‘ø’šÊéGÌØþ•Q»û)þõb-G>þzc"‰½wv³…'èbmïûVzóõìiþ4畇JZ¨i¹¾¾ŒÆ=Öð»\å`øÖ7[øhø¢žVŒ118ƒÙsôs¼]ŸspûNþ_÷(¬tá9SÆOË/1cņÝ5Ο¾úN,ºh>}þ†»à¿ïÇ7Ïñ£üb,±ãGapa;ÿ!_ÄÑç}B—õkäS¸ºëÙSþ­cž"~|ÿú¥öcý«gý7Ð~QßÍëc¶¨1p¾¶O0©óU~¸í,Ö;lsGäy†È]2¶2àÎïÅ¿ñAúÓ<öØcúy:ýÝ+ÚÊí¸À»ëRø‡³œýÃFR—Vðgß=üú–ŸŒdËGŸòé§ŸòéG[ˆ¬+áP‹r&èI!‘{Ä>iÿV¾×ŠÆñzrFÓ{l<~éÊrcôF}u–êúϱE´~RΧ¿¢;â<fÏ´Vºñ~qžŽ®H¬~Öï üŠ6m¹x®î&*v}ˆ×ÁŒ±`\¼õöVÎs¤â8ÞQ¯2/ £þ=j.&fÌ(ŒÈ9,·†_ænƒEOaÿê4{Þ¡yb>öá8°=j ö  ì¯üçœHhø-º¡÷®HãNÒ⣫ކ÷8Ý=žc/R[{u0œ Ñ¸¢"± “44/¶Ðx–žw]ÿ3ú)\£Áƒ“÷ùèÂDÝøí~o3*’Ĩnþ÷é‹|Ñäž©ðúÑ/Aõïý–š é,™>ÞïúVõ¬{`EÅo¿¨S‹»îVõÑ6>…iäòóM‘¼>Ç…qþÞø¤ WîxlwÖæúmSEä¶ÚJ#Îï‡0ß…:í«àÝãu|ÖÖóì±Æ£O<Ë‚s‰{(øíÈ9lðfí'Òæ{–qååÀÓ¼…wwÖ2{:¡'јŸm$5kÇq×rÞ÷ i“Wq²ÏŸVM{ìšUþ0ï1¶ð[>.a’òwDSPHDDä^¹ëó»yc{%?Ï®À>‰E Ù¿©çFÔ"^ªˆE¯q h Ç¥ð‹ŒQ¼±i?ý0Šÿ|f îÉTTdóêÅõü×’[¯¿=Œ1³x}Î%ölÏf[×hþuâb¶¯ˆéyá¶ßï[Ì/ælgãžVtCÐèâ_Íem¤Œgan.lßÉÖ‚ãtæá¸5lZɰ¼fÍÚqütçv~rü>¾?q>¯/ùŠŸ¾Ó³Ø=¸iÑqþ"p‘}›Š®[ÎOv‘8L±»~?©¿ü¿ûø~D ?Y¿˜Ä~–éñÀXb§cÛžnâ§ï“f·WÆþúa+>¼öoß]¸‰_?ÅëùX·íáìwèºo ÿöLÛSÄ w"­ 7?IÅÁíÙl»tߟ¸ˆM+&cëÇò@.þ¾Ý?‘µÉãyy{[Çf±2f ÿ³äêj“7“x“ãx=w1ol/ç?²»ù®;™•)ùù;£{¦è¼fÚÿûmŒÁ}ßû|>±wðmñáðñù(bÇÜøØú¿Í(ÜOE@ý%'Žíw¿]4}Ÿ£¢X4}<†¿õ[׳òÛ†LÒ©ÅÝvëúÅëkظm?ÍÞC÷}áL[œËÚ¨Q=Ëî Íqç"wÑ@ÚÊÁîce þF]I6éo×õLC6Ì ÓñíËbcÝ9êm¥îÐNÂfgRœù,áw{PÞòKf‡ròwmÚ,töQÀ`à|¦bU*[[BŸKNþl ³{Cwe%oaéäUÔÝrÅ ˆùç?ÿùO%ƒˆˆ¢¿üå/|ç;ßá[ßúÖ |Þ?þúW%ªÈ0ež}“çó»ùÅ®×p_.ÃÝ—ÔîÌå?>¼À÷'-bÉ3n\áã±vAëÙ&š»Ã‰í Øg8Ò`3íò“™&Íe+xµi¿+˜Ü|BZË_ååú9ì+š®'ldÈ·¹""CÙÙŽ&L˜0À­.ðnúB [âÈ\[óÚXYò¥m¤®Ïô|¡Ïç³ }#;ÛfSRšÆ£xt¤®®n€ûÕÉ…¿uÒ²/‹uoÖéY yy  ~`Ü€žj©««#Òf °<ïãr@¨3Ž8Žsô¬‰1a%žoaç¡H27 ì½BÏkÀ÷IoPè6\Äžy{X´¿ÏïÄu|ƶ|\:à ÐPÎßo}÷»ƒò9ÿøÇ?øûßÿÎ÷¾÷½ÑŽéB"""""àî'fIû²áºt”¹k˜›’ÌÓ‹V°¸`'Çð|m›‹ìß¾žGÏâéú’Ö3•lü° ×S®¡ê:O}íïÙøÞEž5Q!‘{ÎÇ‹—RØò,¥{r‰³´ÐJç·¯ ´·?ÀÜârrÑ–õ»«»õGòRÖqòÑ–­å‰[¬òkËRðèI²Ròø£O¹Úÿtþz@À¬ÛJáÙ”– , tç,†Å¸î·r* hú8 ìÑÏðzô3=ê_~A£°Ý?êÆÓæŒÎ/2ÎóÆž\ìê&ht8±‹rY;íþ!uTæïñFÑÇ“ó‹É÷+›EDDî5ßgì9ÐÉôÒ•< ¾ÐH‚ÛÇÆ£__5$< ·v%á‰oó‡ O3wÜ]Ü·ö³ì[—Èñé™l(ßÏì­éd:wÍ*a³s(XÉÙ©$m&(Oû÷7Ö²aÉC ÆÈ7BA! xFäO8ôöí/—X&îë÷©{L*›bR‡öq<¸„_W.Q†Ê°jsEDFË#,šÌÒÜ­ÌݓΣ-bå„Cä]ÿ˜õ¤/þÆ…[iyb-?wov±íh!)Ÿ<ÁÊ’RƽM^á>ê˜À‚Ì^9N^J 'Û••â' T¶å^?!$r•¦¹+,<š^Jfø»,]TÀñ !<»¥‚œç¡gÆ6ƒ Ï“_Q@œåÏHO!¯m6%¹OóÀ½ÜMïI¶¦Î#«îV–ÄGå+y¤.‹y©° Xµ”‘„´U@H†=)$"""""""""r׌ãÙâý„”¬#+ñiÆM_ÄË r)K %Ä褽åuû²˜{à$ÄeRQö,áßHÐÀËgû²Iݧ»#¾Žþ9œÜw÷ðÈ H]õ;Ú*!¦iâ3¯û­\ ( ‰ˆˆˆˆˆˆˆˆˆÜU0)mÌý„C{öñvÖζy0BÂxt³,)Ëå釂•T#÷3ÖM[ʆrXôÈ!Š-+‡ÈBŸ±.qÀ×~KàPPHDDDDDDDDDä°Œ›ÄܬIÌýÆw$œÙOX©;éÐfÖ'fCO1 Gu¬›–84ž²D²`v(u‡ÚnºJèì—yTy (ãx¶ä8Ï*!Ÿe¥Ÿ~:ÄvêârßåÓ\eÀÿRˆˆˆˆˆˆˆˆˆˆˆˆŒ| ‰ˆˆˆˆˆˆˆˆˆˆˆ…DDDDDDDDDDDD€‚B""""""""""""@A!‘  ˆˆˆˆˆˆˆˆˆˆˆHPPHDDDDDDDDDDD$(($""""""""""" ßVˆˆˆˆˆˆˆˆˆˆôO]]öKy®ý‘aKA!‘~ˆ´Ù”Ês‘aMÓljˆˆˆˆˆˆˆˆˆˆˆ…DDDDDDDDDDDD‹°Î)’IDAT€‚B""""""""""""@A!‘  ˆˆˆˆˆˆˆˆˆˆˆHPPHDDDDDDDDDDD$(($"""""""""""¾­$ÿùO%‚ˆˆˆˆˆˆˆÈ`WÜ‚B"""ƒu²a×醈ˆˆˆˆˆˆˆ ]š>NDDDDDDDDDDD$(($""""""""""" ‰ˆˆˆˆˆˆˆˆˆˆˆ…DDDDDDDDDDDD€‚B""""""""""""@A!‘ðm%ˆˆˆˆˆˆˆˆˆˆúÓŸ”·áá‡Vž+eˆPPHDDDDDDDDD¤Ÿ&L˜0äö©®®nHî×å}SžÜ¼ ùh4}œˆˆˆˆˆˆˆˆˆˆˆHPPHDDDDDDDDDDD$(($""ò ò50kVg|ýY»“3Uå>çëçgç2kVn??[îyÞ·còù<9u*Sg½Èº·NÑ>lö¾ªW¦2ujߟY¼¸ª€ª¦o¨ÀùšØ0g*/Vµ©È¤³s'Ê)Xõ"sžœÊÔ©O2çÅe¬+¨äÌ@3¦ý¯<ù"åƒY$ïÆgÞQ¿4ðõ·)ªâ•'_d˜U{lm•¼2M#å|§ýoe½Âü'§2õÉ9¼RPES§Î{äö¯ DDD®§ ˆˆÈ°ÑÁ©ò2ªšM%Åpç;GÙê<ŽOæælNsã©È {˜l1™ìؽ›Ý;v°9)1ÔPü£±åL§ò8€ÊÁˆIçÎÊW=ÇKÙ‡ñ:f²4g»wä“–ìÆÚ\Êêçæ“Uu Á ¥FÈÉÌyI8­JŠ€ÕÙDUq#çԨʌ *š¤äï`G~ öÚbVž`X÷¬êïtM ""CÊ·•""""÷–¯µ’#é;–‘à$ýT5««êiO %d˜‡awàŒˆÀ@ÑSb‰Z÷yÅIúï”ÕQFD:ûš(_½œ2æQôûU<Þ'ñ#¢'!)…äÊlV/'϶—‚)Ê!!8ŠäeQJ‡À¬Ù4my‰í÷ôü×6Bë\5•ÍvîÍ")¬§oÍÌ<ÃseÔ´Oaæ0mzÔ߉ˆˆ -zRHDDäêlª"÷•9<9õIæ¼’Ë‘VïM–÷NÇ•UNC'À9Êç¿D…Ǥ1ïf4à»åú—™xª7°lΓ7\~ëí}œ;\лíTžœ¿Š-§úLôÑÙ@eÖ+½S,ÍaYAÕ𺥭ŠŸ|…ª>‡×^õ O¾RÕ;µÉ¤Eç1–=ù ‡Ï&÷ÅY¼øÖ9ÀŠ+>WŸ»Û­6L“á}Ïg±©ñX[SÛæ¯ŒµslÙTžÌ:ÓçÉ‹NŽ­z’'³NõÜ=Øe¬ý[VÍgÖ ¦®ñ5ä2gþNÞÀ²ùO2uê^ɪ¼2e¿å*ù¾ùh*˦Ô;Í;zBm'¶°îÅY<ùä|²ªNðÖüç(µgR”hPS\FCï÷ùΣ`Yo›¾lÇŽõ”“–Ó›îwå/Neþ[çz?´‰-s¦2uþ[œ»¼[æ0õÅJ®ÞSßßmöñ fñäªc}¦iê™þqΖ¦ëú‘÷KíÇnUÏè<Á²'_¡òD9ë^œÕÓ&äãÜ•tœÊ¬ 8ÖÖÏ~ªýðÕéã.ö©* z§¨šõb®¦Wºc~êcÛ‰+ùýäœeîó4Ý´¹þÏ3,8R6³wï^v,uŒ˜ãò™Ø]1L±_]=ØîÀ†‰×Îù ýÝ]qƒk‚õ}~ûÚv./""¢ ˆˆÈ½Ò~‚¼åÅÔÚ’ÉÙ¼™Ì™&å…5W/ò} ”¬.¦ÞžBÎælÎOÁQ_JvY>ÂHÙ»—…vWÎïy?+ Ë-×ïå­¡°´ƒ„ÌÍlÎOÁÞXÊòŒÃ=ƒ~¶÷5•’QXƒ59‡Í;ŠHww°?»SmTe¬¦ÌCúæÝì(JÁ^_Ìòìc#r~ø;N ³•²Âr˜™FÚL;–ˆeä&f褽©š²ê3Ý„ó´²8LJ3ŸŸ2‚;É…Y_Eó•ýzª b’Ývó5°áG4ãIß¼›Íé1x÷gð£ Wê‹éÙO^i i›ÙœŸŒ­±äšï»õr•ƒa[ß:k)Ýï%>3•( ´ŸÈâGyD§ïå½ßçU•G…ÇÉLW(Ñ))8:j8Üêߊ—çQkK!Çf2:()¬¦ã†Gu«ý¶cÃSÛØs ÞFê;O=í4Öv`q÷y¢¿ÛAXj{÷æ3ƒj ‹kЄ–w©>úذ<›j#™œ»)JµS[¸œÂSƒÐæú¯ë–PÂÂÂpØ­#æ¸,ËØòÖ:¢,—÷´“SåGðX]¸lÃû¸Ôß –\Ü ïó/°ÎåEDäZš>NDDäi«.¥Ö˜ÁŽü”ž‹ýèrνÀò#—×°òxj&I3f àÄ8VÎjOï]ØWŒþ­ß»ÎŒü’£,@.[/,/£òÜL–ÙýlßÑJ‡á"mÆ¢C§{‚»¾¦rÊZÝäüfDàÌ9Ç Ë+©oOèd¹“´0L¬ÉEä&_7ôák à¹åñŽyìH®V L¼¦é·Œ†Ä$áô–r¸ÙGT”…Îú*Š\–A/cõeñºÉÌ¿fÍóXq'8°ÐÊåÁÑÏm‚IÄT5v2åñ`Úkªh¶Ç“a¡­Ò_¿4°~Ì_=‹îíÃbÒÒHˆ†ˆd’©tg²tJ$Ç—PÝÜ XúÕÏ]Ë‘šIÊã!@)©.ö—6ÑAÁ: ôúØY[Ê3–üœäžr•Nι<*=Þ;os½wù?¯k ¸sy¹†‚B"""÷„φ+ ‡åêsŠãòà›%Œ„Dƒ†úÃTžiàLc-µõ^ˆ½Ùa?Ö7œ$\ýB,Î)8#4{|vëí-®í«É~n®ØX¦$$M¨Ú›éð6“ñÌÔëvÊN“—w!yGia°ávßà_‹“´Ý{In­§²¤˜ÕÙüfËÌá=·¾éÅÄÀfþËhH IÎBÊŽµ’e§±ª#¶—¼ƒ\Æ:š[1íɸúlâš‚ÝÎøë—Øù«gÑVÀ°á°_ÑØ"lWÆ8 ÃX?w .çÕ§F ãÚ!SÌúè£éL+¦})Îà«u zÕ¢såwÖæúmSCFöqµŸy‹¼ì êq³psË¢CFF~©¿»‹nÒ÷Ý„7ÀÎåEDäZ ‰ˆˆ í§(XžAµÃŒ™ $¥%“T¹š<ï ­\3Œ~lͪÿþä35Ôœ8Á±’Քǒ³·· Ø)Úœ‚øöó­#d³ï<÷w’= b\Hñµ5ÑlÚ‰ &84ŒàÐ0Ò3Ô¬®¢¾s& Ãø–v_ë)Z±“`·ô£Œ†“䤸üžÔhª ⋜X g:ªo¼Œõ~±ÉMF–û,W9¶õÍÙÙ÷=™}å£Ûk©l4p/홊§­º’f[<™ï€Ð_yv‘àðR^ßLc½ÇRnƒŽªFšCñ:S{rûÎéÜÏm°àLrCÞašÏESÕj#)' /Žh?g†D7­98ÌÞ4¿mîÝî†ðqµË⥼¬3rØ›žÐ;åÚð>.õw÷â”åÚ¾Ïo_çò"Cû¢©…YY`69 yèžž¾tòIîBVºúHaèô ”Äñ€r&`èB"""÷„{´³ñ­WÆá|4Ÿh¾rqÖ3uÇ 6ïÞÀº”™<aÇðÞü¼ýZßlæØÕ/Ä×|ŒfÓN´ÝâwûöSo±¡¼ktÉ«ryë7;H4j(¯oÇêtbíh¦ÃJhhÏ­£Šâ’j:†ë jMÓ¼z¢ÜzÆseÑ`§EGMËW—]ó2_³÷ ›á}W{;5eÕx3‰ í_ IÂé©ápuõF,I½w!v³9ž½ï[éÝÛÆx Î+7Ö6s¢ùúúb#Únñ»\å`øÖ7[„ <§hõÅ>§QOÙÁ&:;›¨*,¦Þ´bÅKÛ©-d—v0#3…0KO›N뉫ïÄ¢“æ­7Üÿû‚{¦Ïá*ªÓuƒ;éû¿M°+ —YKYi9­ö$âÃú×/ ´ë_=ÀÅûE¹ ­úMë£Û×ê€3¹ó™_ЀõÛÜ»}ž1d«ó……µ8–îfoÖBCø¸º¿¢}íˆ<——Ûð7>HšÇ{l@?O§¿Ë%Þ¸À»ëRø‡³œýÃFR—Vðç{YïZP|2’-}ʧŸ~ʧm!²®„C-Ê™@¢'…DDDî‘ÐøÜ¥…dd‡‘™êÆh¬¤øÈÕW’6;Vo#Çj›°¹ Z«K)¬ñbºZéðõLŒ‰×ÓJ{gV?ë÷\Ã{9’—GDz .³‘òâƒxcò™ †çÖÛ[iåHé¼ÖL’]µ•Ôt؈±[±D¥âx‰ÂÕ–„Ý{‚ò’ šcw`Ž7i[íØV*ËãLqA}Åõ&ô¾§×¸“´¸ÁèehLŽ’ K"H›éÄ訥¼¸#¾÷0º[Öô4ÓØ@Ï;„<­œª*e½y; |ý(Ó„Æ0ÓQLIq+öy»¯LKu»eÌlj¦¡¡ãºìuæN!ÞºšÂ¼·0–&`󦤸û¼Ý¸®|^o}ÉìS_Ü9Ìn½ÜBà–ƒá^ß‚ÝɸÍBʪۉž™@NÎ2 Äs•.f¤å“nS²üª1¤í&¹çå6„Ä.%¾$ƒ¼¼2S\ÐXÞs7áìOy¶¹c°–ì§Ù–ˆËۜ짺ÕÎB÷oÛî÷6Á.’Ü&Ù5iñW^ìî¯_‚NÎT–qÂHbiR˜ßõƒýÕ³Fsüö‹:µ¸ënUCK‰g5yyQd¦¸1ZË)¬öâÚì Äugm®ß6Õ¯kË®e˜Wgm%µ¦ƒ…vµ'<}+.w!–áy\–@íï×!·Ñ׎¸sùaÆw¡ŽCû*x÷xŸµõ<þj„„ñèϲ`Á\âºGÃwŽC'Û¼YûÉ£´ùžeœÊÊm¤y ïî¬#dötBO¢ 0?ÛHjÖ8>(Ž»{ï@ô}BÚäUœìó§UÓ»f•?Ì{Œ­<Á–K˜¤üѹWBfR´Ã¤°°Œ¼å¥Xñ¤æ/¥2¯¡çâ,:ÌÄlгÄ~ÃŽkÆRòó­æ“}Ðͯ’í¸ã]”—.gyÛnö®»õú;\`Øç‘ŸÒAYárJ¼6œ±éìÈœÒs²é÷ûÒÉ_XHqIËM0l.â37“eÂHÙ¼ ‹)É8‚×°áš‘Ãæ´(†å¹cðã¤gÎ »¸ÕG¬8bSÉL÷’]~yñ §EX2›óÛ),+#ã ÓjÇŸÃŽ´Ç‡ÕËÐÍÚbV×^}ÀáŠ%}w:I–~–é0 ”Ø$%%&ñIŽ>iv{eÌs0›å¯ý›}é^~›MÖŽ|¬…%.¯ÀkµãžWÄŽeXèHˈ!=ÕJUárJ:¬8bÓØœ™@H?–r9öõ-$–ôT/f°Å^Ī)ëøÕ”uÿ¿½û ­òLô8þ³•s6†Bâb"¥fáXt"T-zëmÆ2–áFej½Å+C• æ &]$.Œ ÍbŒP#ÌX¸£ÂU™;ÚRf¨‹©÷ÏTz˜:-õÎ"–b\4B‰  VïBaZûG3mÌóùlÎâœÞç}Ο÷œ/Ï{þºýÓÿ‘Õ_3ŽžWºÒß¿//¿8‘ï=¾1í²ýPC*Õä‹×—»ý~WY–ÇfÍïæ-»ùƒÜ#yz^ò¿=–eßûê¡Ýù6uylõÂä³úÉÆ;þ\J.å/oÍÑY‹³qõÜTo÷øê7¿Î&ë¶ï!ËZÜý—ë7½§ççÛ2Ð?˜­/fbÖ¼,ïz%]‹ë’|»÷ÜožqËs÷>×….$¹ÃÛ·Þ²ÇóÒõú/³ºzŽ«ØÏ»»æ–ïí“ÿ¬vçò÷ORÜš®ƒµ§ sW¤g׊ŒéÍîÚ¹Ô†ö¦6ôjæ¶õd gešîödT›³©­1§^™Ôfm›Òì‰2yãæðæÙ;ܺ¦5Ù¶£-ý[o„¡»®º4ƒ¿ß“öØœÚ7>°E*ÄŒëׯ_w(ÑÇœ‡z(>ø ƒ¥Gûs_~òòDv¼¾3‹«“¿ŸûÝhNïz)/ÿ(,ïLûÚdzpÞÜÌšÉG￟¿LÌËòe·ü;r:¿ýS%ÿxñÍEÇó{žÏ‹ïwæõ_<=å~è<÷‹ÎOÿ°>¿úåj+l˜òï¹c§³s°’®ÞÅ÷ìGnã‚2|ðÁiii™äVçóf׿¤¸5=›’½ÛGÒ1øT†:w§ö¹•´ÏîȺÑÝyu¤-ƒû:³h'µZm’û5–óŸŒeøHoºž¹ƒ½•4¿°+;×5¥nöœIëÔjµ,X° °9ÿüéÍ 4֚֜̉³©´td׳Ãyuh~zvMî…&?×IÆß¹…š³ëø†xî@6ýÜíªîœIKöü~ߤ£Ðý>¿wâ³Ï>˧Ÿ~š‡~xZŒÇ …kÈÝÿž_ý¬3 /¾‘—~šŸüèó£z>ÿúò@ýöO¹ð¥m.ä×ý[3ðÆŸ326šs§÷gàø¥,\ýØÔ BcçòÇÿ9”£²pí“‚…ËÎÖ.œf«¦ë¸`ºÏ{íé^™}úÒZÎX]cÆŽüBJ’ÑÑÙY3p(}MCéì}+ŸÜÕÝz/Û×wçÔ¢9¾K–4|Ó©Ò’lÙ<;JïúíyÏOMâ89%ÉDmoúϮ˾ÁÉ¡o¯šJ¥’jå–[3U—H5O¬Mïko|ÉÅÌJ}CÝWIn\;Î¥ð¥'o»ª¦qÙæìY¶yjãûÝùÏÿî6¡ÜWï¹Æe\0½^DÍÙ°¦.í}{³æ@W=º!-CÙ~ë2¡YO¥k]S’OòVÿÞ /Ù’§æÜ›]9ÑŸõï,IÇà¾o=˜íýGRKKÖõlË '³}ýúœ5•“r› ´Ͻ^!åòqwE5‹ºö¥§éÍ´oØ™“ç²rÏál{¶ùæÿVÒÐòlvÞ™Öê‡9Öµ>ÛGÚ2Ø÷LfßËݼt*{7>—ÞZs:½·u¤¹Ö›ç6î„&í|ŽmnÏ«cóÓ0|BbʱRà®™“•GÓ0ØÞUÏdΊ ya]_öw6¦¡2–Ñás©éÍšc§’ÖžÞ¿2MßI4¸”3G¶fã3ö­ŒçćMé{ó@šßÛ™›_ËH¦JÏÄÄDÆ'n¹5kE…îªÙYÚy o­y'CŽä`”$©4ÌÍ¢–•Ù´¿/ÏçAªÎ9Uç|OåÔ›/Ÿó= ;vìã566ö¥¬+"""²$$$|)ë^.Æår¯ôò""""K-ÈÎÎC—^ÇÆÆ¾ô°{MÝņÐù–S‘ån¡<4;¨N_~1!ö˻ƥv@æZf±Ï]Ž€-"""rµ¹ÔÀ™0oîä¼Åô Ya÷š º ÍÙó/õ±B­ˆˆˆ,UË6—@gßÉux¿¬°k¼–Î\óç ´_$øŠˆˆˆ,åð»Ø :WÀ](Ì~a×x­„K ¹³îBË)ôŠˆˆÈr2_)ÂBÁôbË]ma×x­ ÅÛ…~^,Ø*芈ˆÈr º“§ÞÅÓÙË] £-\3Aw±u´ ±sýûRC¯ˆˆˆÈr»“ÿž^gÿœ+ä.6ìþ&ƒð’Gw¾p;ßãÙëÌr|EDDd)Û¹ÂîôÀ;û¹¹‚êÕØ³{Í£»PÈ>]¸ph4J<×§\DDDd &“‰¤¤¤wvÀ½ÃîUt{ÚbBî'Ÿ|BNN÷Ýw¹¹¹úÔŠˆˆˆ,™3gxíµ×øå/Éõ×_Ñe.µ¶÷7€¯ÙFÌU[;9ŽŽNý{xx˜Çœââb}ZEDDD.Ann.¹¹¹455qâÄ RRRHHH 11ñ3awzˆ¯¶÷7%q)€Ù½·ÓCî… ÈÉÉQÈù***¸õÖ[¹páÂgòÖìk¡®WmÐ…ʦÞh4Ê}÷ݧO§ˆˆˆÈôàƒF§Bî\aw¾¿ÀÏ—õ.7ãRiøù®jrEDDD¾¸ÜÜÜávv`½ZÆÏ½æƒî\¿5L¸£££úDŠˆˆˆ\f“+11ñ3¡M÷eßk¦Fw¡®ïùºÍEDDDäòæ²Åf¯ù2Ü•f\ ;Wƒ«GWDDDäòêÁžÅ®¶^Ý%5êÂä¿'ËÔ£+"""re²×Åju5êÂhèÙW¥ """"W6],ìÎÎf º „×éç{^¥ """"¿‹Vl±YnYÝÅü±ÐÑÔ£+"""råóØ\=ºWC[’5º³Ÿ‘å—½¯õFž«ÁtEDDD®lÐ+ä^-,q©4ô\ /""""W>ì^,—)è~Æ]è9…]‘+ŸÃ“Ët/Cƒëb4‘+Ÿ»iáj°d.Fe²k2èÎ7lÅìß..6ODDDD._.[lû2CpâRm|YÞ™+Q‡haºrÜîRvwG.¾ÀÀ1ªÜnжúˆ¨¹DDDDt—Óo""""WÜè0ç?âÂÌ'‰üê<ÿ]vY̨O„ˆˆˆÈR¹#ô¿{–_†Ç0 ߯𝮠ˆüÛ/8ó‹Aâ†0£¹«I7/Ÿ&¹æzt/å·õòŠˆˆÈ²áãáñì ½ËÙžþ·sœýÅ q€ø0á_Ç–USî•î¤iw å7n·›"O›÷{é›UÄé;ÎÞÍU”¹q»‹(­®¥Á70m‰>*Ümnc »ÍånÜ ô©…EDDdº¤›øÚoÝÊ ã£¾Ë™_üŠñhk䯝­á«+–×ót¯ˆ>6?Áž#˜ò˨¬|„B{ˆöúmÔ螺`-Ò¹Ÿ'|ŽÆNùÙXéÁha_Í£Ôzf¼b4Ô®š}øpRèr`R#‹ˆˆÈì`—œÁêÜL, ÓŸ5æXCöMIË®=T£{Er®—¦.°V¾HÃÖÆKaª¨«ª¦Î×NôÑ´³¿õ®Åe™X÷© v>ZCóžCl,¬%g²ŽÆßLhÓËü´zòõDDDD>k4~ØŒjQâñQFY~=œêѽLV,@¨³ßT­‚ƒê/Þ†j“a¸le8 OL8©¬´Aȇ/4ý5‹ÙZ©+"""ó„Üá ïþëŒÌxvŒpï~Þ?Âè2kõè^ é¶?ã¢f_=[¬'5ËEQQ1%%%æ§c"¡.BÀPý~·þb/b%žVÐksaSÊ‘¹\àçgß瓉‡×%—¯¥ðnw?¿fŒù¯üæ|²—Q®‚€0Dçš?{†™œªƒ/馽µ¯·öÆ}´4îÃVò/îö`™X%kÓ Ôæ[.úž6Ç´dk6«.WDDDæ–´‚•7ù8#ùæßâ6[ Fn%ç¶8gß 5ÝDÆõË+ú)è.‚Õfzèé‹Bþg»U#ÁNú«Ã:^ZÐÝVGžŠ<›!Ò‡wÏlkÞKãS6ÛœXi!Š—Ë1ãõÂÝ^Ú²Ôƒ+"""‹OºÜøÕÛÉI»@ò)S!/iÅWY“³‚__w–e–üT£»Wy€oÏf †aj›†§Ä6|;÷òĆGÙÒžFg=¾œT£+""""K’‚®ˆˆˆˆ(芈ˆˆˆ(芈ˆˆˆ(芈ˆˆˆ(芈ˆˆˆ(芈ˆˆˆ‚®ˆˆˆˆˆ‚®ˆˆˆˆˆ‚®ˆˆˆˆˆ‚®ˆˆˆˆˆ‚®ˆˆˆˆˆ‚®ˆˆˆˆ(芈ˆˆˆ(芈ˆˆˆ(芈ˆˆˆ(芈ˆˆˆ(芈ˆˆˆ(芈ˆˆˆ‚®ˆˆˆˆˆ‚®ˆˆˆˆÈÕÀ¸v²¯¯OGZDDDDAwé±Ûí:Ò""""ËŒJDDDDDAWDDDDDAWDDDDDAWDDDDDAWDDDDDAWDDDDtEDDDDtEDDDDtEDDDDtEDDDDtEDDDDtEDDDDAWDDDDDAWDDDDäjcTˆˆ, Ñh”ÞÞ^†‡‡‰F£j™b2™HII!33“ɤ +""×VÈ=sæ +W®ä¦›nÂ`0¨QD–™”ää9玎™8Oäææ.›°« +"²ôöö’‘‘AZZF£‘„„Ô0"ËÉØØœ³æƒú°X,dgg+芈ȵ!c³Ù0›ÍêÍY¦b.022|Ñùÿíïÿ+‹…¯|%sÙ´‰.F[H¤›Ý¥nÜîY“§œšým \¶·ÙK©Û»¢¾ßäîµÕàv»)Úì#¢£-rÍŠÇãF…\Yð—âåTï {)R­X­V¬V ñÕo¡f·¢ˆ\'ôDÒEDt?_Ê¥dÿk?~œãÇÛøéwËHzëéRÒQÐ]*,ùÑቿôy÷³¹Â3QÞà¡bó~Ú¦×6 ø¨ÛZEiÑ´ùsÔ)Dºë¨r»qÕÐOÒ‘¾ãì®)Çãvã.*¥zgÝ“!»¯Ž ·wénŽ7ÔRU:þU;˜Ä¼ì­)§ÈíÆSU;õÚ"""" º„éniĘ\eäY€@Û¶ÕÓÞÅæÌÃi¢§½ž-ÛŽ×ñF:Ù½¡†­~¶<òlÑñù5û? «¢mìÚr?6Ùÿ3 gÛ£ÏqÄÆê*¦Ð¦«yjšfÖô†Žðܾ6Â&0„¿y;›'–ˆt²wÃ6}A¢©YXC-ìÛ×¥Ã)""" ºËÛ-OÜ5Ñ[û»lØã#šZÆ /”“„C,y.Š·7p¸¡Ž†ƒ›ÈøF Ü~ˆ#!Àù ‡›ê¨;v˜íN ØL£ZÒúiض…–‰Â©uY4¢= ¶û9øÂNvÜO¥誣)0};<óš—cÇÚ8¼) ¿7H{в6qøxM¯æ§Ž¬ˆˆˆ,M^ìR¤Ú°Y€h˜`h†š9p¨œü­.,®Z^Ø~œ¦¦ýl©òÓé2ýšÆPçxµaÀNEÃÛTLÌtOü#ØÌ‘ €‡Ó:9—¾öžñÙõOpýô âï‹0^GX]¸&V³9Ó¢D€öñ7ɪ*ÁapPRédß.¿Ž­ˆˆˆ(è.ã”KÉþÃìÎ7? w²ûÑ'8ÒXËþ²×Ø<´‡Gkš ™²(®¨`{eˆº]ôLÕÈ%Œä‘š•ÊPOÆ=ÍTÖU`Ÿ™›^`“súÝLÌXóÍÖ‘/j–gŸâ¿öL.{î¼ý<_Yx¨ÿ;<µž=ôÇÜnÒQ‘ËG¥ _X˜ÐP„À1/!À¹õ {·VSâšFí®ñ~Ü ·}4Uáv—³{z‘®µ’ƒ÷R– tígo[°`ϳ¿[Ø«¨ˆ¢"Q¿o{7C‹ÚN3¶Âzš¼¨õÑÚ¤Þ\™)ií·øö_ýõío³c[¼ÅýÓ?¥îgŸ,:0wý!?\PcŠÈ—J=º‹6DËæñ™"„BñÒZB•ó,+0„ϪZ¬„|þÔâzвÔš{öQUÞ‚?]Á(d•På03‘~!Õ†%ÝÅS›óhÞÓEëžCtÞJNE5yõ{誯â !Övÿ&×vª-,ªG7Ý3± þ}<ú`YôÐÒ‘‘YA7ÃŽÃá`¼sÕÉíëÖqÛóOó7ßÿ1÷}ça¾¢&‘k„zt/)놅B!7›«’çnÇeGÅNž)´a"D `¢xû3¸LÀ–@,.vþ. ³0…ºè šÈ*ÜÄwnž¨—É^¶•G¬@°‘=Í}`¯`ÿËÛ)qZ´·Ò°àzd/~·b¢æwÌ.¶7<Ï#y6L¡B¦B6nÔÕh"²4îøE¤ôyéèæ“@ ßyöI6<ö=VÍÿõ«ø?xŸWŸþŽ~xwÿæ ª¿ç':ïò“.ðaÛ÷yîÉ ?ÿúQÞ÷~obÝÇØðôNê:§­ìçÿúYžÜð=ö$Ï}¯…@TGUd9HرcÇØÕ¶QcccŸy<ùÜèèèÔãÑÑÑ©)Oýœœb±&“‰ƒêH‹È’æóùX»v-FãùCÝxnƒóÛzÒÉŒrÙOþ™çžø[Òv¼È³·øÞSNÇíyòÛ¸þ“3üèoð{þŠïU;0Eßçå?ùSÎT}çïJƒ¨Þåñ‡§þ¼áw°ñé‡pDÏðê÷x'ã[zÞCÚBëêø“?õb¯úçšøðÇuümÛJj=GÁõý´<÷'4$=À·ªî"møgüèûõ¼eÿ#¾÷Ü]¤é£#KHìÂx¹Ð{ñEjjj>3÷óß ¤ô~\.×ç~Ÿšš¢ÑèÔmÇ'§ÄÄÄ©Ÿ“SBB Swnœ|<#ŒÎz|9©tADD–t=I\à“ €ë)øßâ>çõ’Ú^eׇ]¬S 9iâçËBñ³Äï9M€“ÛÒ>äé?ÿ!ÿø¾‡ +Xð}“nc£g·§ŽZVÞõ!+“ 8ÊßÏå¿·‚‰uÔÇÓþ#~6xw)éÊTùOÒI$4ðá²k ]YØ…O¸@iII`ú wÝ—„ÿŒ—üÙ»œy·ƒŽ3ÃpÇë.fù$wM¡Áä¸G’—À‡QøÊüë›n{˜ûVîâ…§žä¶;ÖqGQEwÜN† ~>îa÷ÍÚ¨•>AAW–EØ=xð •ð8PЙ-ú~ï³’¢•&ìà{Ïí¦-i-Ï]ÜWý÷ýãN¾3<ÇÊ—ºüxò±I‹XÿúÛ©þÎK<ð³·xë­·h«ÛEÃ÷ïà¾ó,·G÷Q»ó!ìI3Ò7×gè¸Êò»“?—#]YÀ oý°aû  >ùçÒúI1ß>ô4ãÃzGùÙðæL쓟-bù þùý(ã„Gm.¬äᕦ×ìx™ ¨zø.~ïö»ø½ªøþÓΫ?䇃” ^ŸAÁDïmÔÿ2}4ê?ú=®×¸½²L®‚®ˆˆp¡?À»~HâþOÇøÑ™•<ðíûø M[IÊð»´uHs&Ñ÷Ï |ï­a.Üö>ƒÑñ’ë¹À'¾Ïà'NRX~<Óú7ƒãɇ¸-ú.G¿ÿc†×nÓIοþõôámðòIÊÓ<àLb°ãGœþh+S09æaûŸð·;¿Õ÷±ò“·xµî(ußf¥B®È’gðx<;¯¥ ž>"Ãäè sM£££ ÊËËu¤EdI ƒÜ|óÍSW6>¿æÜñv÷¿Ðú“Ÿð“Ÿ´ròÍå“´;xüÏþŒŠìäñ/ŽŒßÂ>ø¯¾ôþááë|ë‘ëø×ãÿÀÿ{}%Ε$vòãÇ99|÷ßÿ;dγüzëÞèÌgóCøQ]=ÿp*@RÁÿΟýñ×É0,ü~¿÷õß!;ú.?>|˜æã­¼õËë¹ã?>Ë“®1p¿õ;¹$ýìÇü÷ÃGùÿò7ÜõòìÆÿ úÜÈÒ2:: @,vñ¿¯œ>}€ìÕ«±ÛíŸû}𛛉Çã3FW˜aaúH ³'øÍº áÅDD–€Ë3¼˜ˆ\Ë&‡¹xüäÅhËix1Ý0BDDDD–$]QÐQÐQÐQÐQÐ]¹F †©ÁâEDæ’šjÁdZ>·ÔÈâ""K€Åb¡¿¿Ÿ[n¹E!²Œ½ó¿þ-ÇߘsþmÎÛHIIY6í¡]‘% 33“‚Á ÑhT "¢;Cjª…ßvý67ßl#33sÙ´‰ztED–“ÉDnn.½½½ (ìŠ,S%¥÷ÏyŽHII!33sY•.¨GWDd‰%‹©VWDt~˜ ]‘%à׿þ5gÏžÅb±°bÅ Ô("2ellŒH$ÂÙ³gY³f ×]w‚®ˆˆ\zzz°X,$''c4IHHPØ‘©;66FRR ôôô““£ +""׆ááaV­Z…ÉdÂ`0¨ADä3 ccc„B¡e³ÏªÑ]H¤›Ý¥nÜn;;#Wö½ŽQåvãöìäJ¿•ˆ,-£££ …\™7è&%%‹Å–Í>«G÷jb¶`˲¶X1©5Dä%&ªïBDæ·ÜJšt¯&{›þáåµüá®oá¼Üðu6o-åæß$I¤¤À1‰IIjTùÒèb4‘å,vØÔ0_Ã|Ðýép0uáå7~AJάüIþl÷âëIïð†ÿ#R23Iþ¸—“ÓIOŸV|üO4¼ò6kØ0¹J¨GWDd¹J±’n<ωæ6n¹ÿkÐ}Œ &îĘÄ´ýC;ÃÉYÿµ$>þÙ :>¾Û­)$}í~î_µƒú½uðØ×±Žtpü•ãôü'¬I€Â®ˆ(芈ȗtó¨ª.äï^®g_{2«Ö–³qÃ÷Æäì ü_¥õ4¼²Ÿÿã _åŽ[Ùðµ$àfîßú Ô¿Ì+ûÛ1ÞÀW‹þ­} +ˆÈÕ"aÇŽcWÛF}æñäs£££SGGG§¦x<>õsrŠÅb˜L&<¨#-"KšÏçãÖ[oÅhTÿ…ˆÌ-‹ñË_þ—Ëõ¹_£¦¦†h4ŠÑhÄ`0LM‰‰‰S?'§„„HL¯–|<#ŒÎz|9©FWDDDD–$]QÐQÐQй¼Œ###WÝF-vÔ…é#/Ìuatt”X,Æè討²ˆˆˆÈeòë_ÿš .ǧFZ¸Ø¨ “#,|™£.“““¯Ù »Ððbƒ“ɤO¤ˆˆˆÈerÝuב˜˜¨áÅDDä7#11ñ3""³Åãñe5Þ¶‚®ˆÈ’’ÂǬ†‘y qÝu×)芈ȵ#++‹p8̯~õ+b±˜DDfˆÅbüêW¿"“••µlö[÷ŠY®»î:Ö¬YCOO}}} »"23ðSç‰åÔ£« +"²„ÂnNNŽBDd‚JDDDDDAWDDDDDAWDDDDDAWDDDDäòÒÅh""KD4¥··—ááa¢Ñ¨DD¦˜L&RRRÈÌÌ\VwUÐY"!÷Ì™3¬\¹’›nº ƒÁ F‘)ñxœp8Ì™3gÈÍÍ]6aWAWDd èíí%##ƒ´´4ŒFãEï'/"ËÓØØccc˜Íæ©óEvv¶‚®ˆˆ\Âá06› ³Ù¬Þ\¹(ƒÁÀ7ÞH X6û¬ »ˆ­¿[Cë¬r7“5‹ÂÊZ¶W»H_ª»ÞVÃ][|˜ òÓý.Ìú4ˆ\µâñ8F£Q!WDæ ºf³yYÕðkÔ…K`JµbµZI5A4ÔCë¶5õ©aDäê8¡'ê”."ó[n%M:+.šÊºã?~oÛ?ób¥ €®/Šº"""¢ « »D˜qzœ˜†‚„#ÐçÝÏæ n··ÛCÅæý´ |ºÆ@Û´ùE¥Tm­Ã·¨ùêÊݸݥìîŽa¼5nÜn7¥{»‰MU¸Ýn<µ>"ánšvVSîqãvQZµ•ºéÓWG…Û»t7Þc»©.¯`ow¼ì­)§ÈíÆSUKS ¢C-""" ºËK¿×OÀêÄl`Û¶zÚ{¢Øœy8mCô´×³eÛ1ú𨲥žöÈr¹È³†ñ· f[Ãxoð¼ómZ]]!ˆôÑߊP§Ÿ0üOä—81GºÙ_½=Í]q’—g%äoåÀ–G©m ÏÜP µ»ŽÐ‚h{7l£Ñ$šš…5Ô¾}]:Ô"""¢ »ôi¬.¥´´”Ò¢»x¢1˜(~ʃ9À’ç¢x{‡êh8¸‰,€€`"/~[µÏ¤îpÛË )´†-8ߌ£4ð‡Ý‡îe IDATýt…`ü‰vzÂA|þ(GIž…°ï=€õ^<Þ@]Ý1^Ûî†h9ÐÂÀ¬½rm‘7~úûѲ6qøxM¯æ§Žºˆˆˆ(è. Ñ¡¡PˆPHuR²ýEvz,X\µ¼°ýò»÷³¥ªœ¢Ð3m=³³ŒâT XOÍýnõ·ã÷{ `¥¤Â CÝt:ñ¬\éò÷4[K*pN “`/®Ä9¼{¦W#¤zxª,Ÿt Û»Ȫ*ÁaÌJ*•tEDDDAw°±ñðÛ¼ýöÄäm`wE ìÛÉ£žã@s€TWÛwTŽ÷èNJ/eïñ×8¸}#%.ÑÍõϱ¡|+Ç1ß’G‰µq¼ÅOÔ䤤¤=x[ZÖ"Ö÷aVÍ­Ù‚IVdä͆C4¼9ø™9±¾ãüý¡Wù¹Jõ/›Øy/uuÇé‹©-Dt¯Ǽ„çÖƒìÝZM‰#LhÚ}Ç÷R»ëŽjvÇ^¤{ž¢,µ†fÿ>}°‰,zè é芈ˆˆ‚î²æ¨ØÉ3¾Z´ l”m†ž½ûð ùh DØZ´›ƒ;ö²ïP >_;=˜°:Kظ};¥é@úó³£”<ÓZ£à(²cÆ„3?z†ÀY‚Ó2™»sØÜð2ö½{¨óváë2auS¹i;Õ®yîmfv±½áyLµhîê!d+dãÆõõêÕ‘ƒÝ§ðž>GÿHCª5÷¬§(3e|vä<ÞSt¼b$žL†ÓÅÝwç’n"?çÕ—ÞaÍ7òxïd;އyüδ™¯~þ'’¹Ç§Ãç§È„5«€bO>é§­ÈÀNµú„FˆcbEVO«Ì mß\óâtü ‘3ŽÇ¨º3 b´5¡Ë°–Ǫî$mé- òñ|,ý´8‰?8DÔ´‚[Öá¹3“æÞÇO·9ŠÉêÀ•§šÝ«ÙÅÞ¶·ç_Æ’OÕþcTM®bÆ#rÊk9X^;×›,0ÿâÛ‘¿ÓËÛ;/¶=9T쬣b®×²WÓôvõgßÂ^Jm])Ó·bóf}D–}Ì8ÍZ¤­[O™Í@øl­-^2¿ù™æ0g^oÆgÈÃSVLr4H×ÉSm1QùÀêñ Äçí`Un!EŽÔ‹¾G|¨‹§³XwOëÒq²£-ÉT–¯&%vžöæSôÙ Y_˜)¤Ó{šß-T¥Ã<Ûg Ï5¯„[2“9ýÞy†ïL#%ÚOp ÈùaHK¡¿w„ÔLɱóœlz¿e-ÅeÙ¤ û9Ýú:Mч¨¼gÕøéì}pâè)úmëX_fÃêàdkQC–>P" º""rÕdÄA‘Ó=°>€%;ŒÅ±|ƒ6ÖWÞI¦ ëúAúŽvÑ7¼šÕ€8æüXŸo™çMLd¯_O¾Ý¬"#9LãQç«ÉO6s‹«˜5Μ‰\+†ÌšÃÑ·oîyF’vLgÏŠä` §fa‹ ÆÈ1„87džF<Ø‚?j£¸äNV§ŒïcI¼Ÿ—NuÐ_X:Q6sÃoòžÁÉC%¬2öõ¬lä¨þH&¢ +""WÑEFkR›iyéÿ!#Ë#;›l‡‹†CýŒDC¼^hÖZ©„¢°: ›-yw±â°~ú•d´:°üô†cä[ÒX½ÆÀù`7}ýôõ÷ò^0Êäð6ómóͳf“ÁIÎ FHîÄ”ykÂïq:0HÄ` ÒŒŒœ$žšÏª”O·6e•ƒÔx7¡°›fïcŒp߆Œ"ÒŒŸ~ÝZV º" º""ò›a^Ì—„ÙNÑãÿù}ε7súT÷>VŠ=$¯á夦¯iÀda|TCƒã¥~ÝL¼XîÅûêëœ3Ü‚3'›ÜÂ|r»Žqbrè³y¶ouÊ|ó2ÈN‹Ò ‘Œ’¶.{8‘³ý„Rεº°š!º¨Íý<û("Wš†Y¶’I³ÀP°™7 ôO¶’l€áÞ79ÙÑɾšü¢õ<\ùk =¼Ó7ŒÉjÅ4bØdÁbŸ’‡Ïp²í#—tíUˆ@èÓb¡s„âÉØ-F"}>üQ'epOA™é©"qâËη}ó̓ìÎT†ºÏr6lÁ‘fÆ”a#yð,g»‡Hu®"H¶¦a p~øÓ­>`Ȇ5ùâ¿Xì©ÄûÏ1›Þ¦¡©m‘ß ýú)"²l™¹¥p-+ŽœâÕ…Y—kÇbˆ:×Åi”[Š]¬2B„Aü§ýDMò2 Œ¼×I`$™L‹ 㪠V¼Bë1/­Á ÐÑþ!ÇC¤añÉ.ŠÿÄ ¬ž2âýtœ÷>¦äð‡â´¶ú8qô4&k6®’utž8¯ÈoPÂŽ;Æ®¶ûÌãÉçFGG§ŽŽNMñx|êçä‹Å0™Lë7‡h˜Áþ0ƒ? Ðõ/k({èìæ‹eänZ›[9žµþp˜ÐðYÚ{ÏrÚ¾ŽòõÿŽôyÓrœ¡žÓü¶Fô™‘e&c³Ù0›ÍêÍ‘‹2 Üxãe³Ï_ìb´áŸó“i!×’¹†uwßKIɽܽn öÉ[)ž¥åT/‘‹­ßôiÈ5ed“·înî½÷nÖåecèU÷æÕc§ˆÍ½)Bg8ÕþËñ›daÅM«¸yåu—¯¥|ÔÕÖPQZ„Û]DyÕfvÖµ1¹_Xû©ö¸q»‹ØÜcT¹Ý¸=;éŒè?êåi«ÁívS´Ù‡šW®Uñx£Ñ¨+"ó]³Ù¼¬jø¿Pn8ð½!7£ð1ÊòÓ¦½àjr×dãýa3þaˆºèd’9Õ+;L µ•@ÀDæÝeÜ›;^â066«s)påÑùãfÚûâ0ø¿8ñ/N~ß}ÃEË>êî®Çñ;w³ö+ד‹Å.KmF$ÐÀ–ª}ø¦}.‚þvšýí´øvpx9—¯@"Œï@=]CšWF‰0[°eY [¬˜ôÿTDæê¹HÔ@:"2¿åVÒôΊ1†û'ë ¬¬ÉNûl¨4Û)Xë ÃjÅjM&>½¼!|ŽÓ)Ùä,™ ¹3×_Eþ}%dO¤»ð¿¾Ã¿ÍÓ«›±îß³îÖfmGì 6QMµ!×¹‘ƒo¼ÍÛo¿ÍO_ÜDmßÃßå쌤âÙº•r‡,ö6çXÝfrtc:QнÒA ¦ÉH9È»½á‹.“–_ÂÃT<ìÁ‘2-çöžeüÆÂÖØç¾XÍlãß9'VŒ~ÀŸÌµ1YÜ~kòåo¡¾šüYlÚ½WúøÓ–üJv>SˆÓ鄾ÐÄNuÓ´³šò‰²ƒÒª­Ôµ L{­:*ÜnÜ¥»9ÞPKU©·ÛCÕÎc"êÊïg—`ˆæ'î¢úxø³¥ Ó^Ç{l7Õåìýéw(w»q—ï¥io ¥EnŠJ«Ùíí#p¬–*Ïä{§ï"¹<Ò½—R·wÅ^švWO¬_EmS÷Œ?ç÷y÷³¹ÂƒÛ=þz›÷3}Ú¦Í/*¥jk¾EÍPWîÆí.ewwã­qãv»)Ý;¾ MU¸Ýn<µ%—ÐÞSíÔ/{kÊ)r»ñTÕÒPÁ‚ˆˆˆ‚î FÒ²³ qúZi|ý$?ïcpÁÜa°gp" ¦a5 3<<×ÅxSêÄzÃôÏÑC{ãW¸Ñxñíü""vzlåx38Žªý44Ô±»Ü‘nöWo`OsAœäåY ù[9°åQjÛfý:ÂsûÚ›LÀþæ]ìlîlx¶o§Ä `"oãólΟ§X!ÔBí®#t‡>}.ØÈž¦&DC]Ùö îò²¤N¼×sìò†ç~ÍžFö4‡q¸ò°„ü´ìÙÀ–ãá1ÐÀ¶mõ´÷D±9ópÚ†èi¯g˶c ô5±eK=í=år‘g ão=@Ͷúœo£°Ð „èê A¤¶ÀÄnvú Á?ñD~‰ó%µ÷´vŠv±wÃ6}A¢©YXC-ìÛ×¥3ˆˆÈô…R qU!÷ñF{/ÃŒ÷Ò¶÷ž¥0¤X±ßr _sæà°§Íê±3<<ùÏ^~ÒøÒŒ¹cccs¼cœ‘h.R¥k0%_‘Û¼EéÝb%užå¾C4öÖGxñµZòÍÐ×TŃ{ü´hᙢ Ò§–vòÌk TÙ!PWÁ£zð{ƒD*ì8ŠŠ)´î¡%dÂáñಛa`î÷um‘%N,¡CxL…<ÿÚ~J-ì~ð Ž„ oÇkÔ•[èÞÿ(ꃺúˆ”æÌÑ‹žÅ¦†ªfÂm[)ßÒŠï@3Òj¬¡–<ÅåÛÙ]áÀÜWGŃè øFʱ¼ølÔ>¿—%@Óž½xÃ!B°Î;ߌ³4Ó‘VÞáâ]!ÀÚé çãóGõ·ã÷{ `¥¤Â CÝt:ñ¬\é—ØÞSíÁöîñ8_U‚à ˜”T:u&Y‚ìÑ~™qŽQkŒ;¹Evr‹ >O°/HoO€÷zû Çá^N7¿=DAš0`š|­”<ùƒ"Ò§mÉìÝÉŽFGGçéñ½9×^ˆ Á` ¾¾jSÃ+DèÜý(5GBØ6¾Èžy_å Õ€š-W`†(‘Œ'çè´g!ìÛÉ£5Í„LYWT°½2DÝ®ÆOÃnz){çãkn¢©¥¯ÏGs½æ¦ž?¼—ÒççQ⟿ã-Q¢&'%%N:ëñ¶´¬E.¬@ðRÚûŠ´“È9Oç©vÎô…øh$Ž)5ƒÌüBîÎ_Ååºþu8àåØ ?#Ž2¾Y8ÈÑÆNÖ<ö8¹–+±Cƒ¼Ùð ç²£êδsb}Ç©o¡xãìÖŽ—Eì¼——^PòÍRìºßª\eèÑ1šì‰5‘jZx|F³eŽœî)y˜ÊÿøMÊÖNt]Âwºb –´‰×Š|tußàÁQBe€Ÿ½»èžÈPáî&ö rŠìØ\NL@¨¥ÿÄ2}­ãªwa»VN¨A/Í;0àm¤ «‡%Bà˜—àÜz½[«)q„ M[µïø^jw¢ÓQÍîƒÇhûé‹TÚ€!­ÁÈ‚ó!W‰ èáHslœNt5µ3D*.3`ý\ímÆV˜@O“wâÀ>Z›T· ËX¸›5¥}À‚cÝz¾ñ{Yç0Ð×~”WßøÂãÖLÄ\z}~¢Ù%TÜmÇh°âÌË+]DäJ™ÿw¯H®ÞÉ^½tiÓ ðæ­ô Ç1e¬ãd¦ì®»É>{”sQˆ‡‰bLjk–ÎõCü<þþ™ö¹’`„¾SÍüSÏ\w+ÅeE¬¼”ñÐcƒ_°‰ìTìÞDËèòícÃ]û0¥Bt¢Ž!µxϸ,X"OQik¥>ØÈúpÙÂøº‚€•²­e\;7"ÒøD)Þ,3¡žQLn.ـà áß³ª+!ŸF9‡ÅÒG[K+--^޹ò±G´S>Å63–ðüól……X!X]yX-ŠlÐÚ3¾\ÙD‚ÅõùÚ;Ýóe©54û÷ñèƒMdÑCOH'Y®"Nžâ=Ë:y¨àÓ¿¬e®&3­‰ÆSí Ê/CÏgœhÌ@Š-c¢lùw®Ró‹È—tcƒt·ž˜¸¡˜²×Îì%3!b0 „Ï\ç˜1|Ø”h˜‘ɬlN™ºŒÌœY@¦¡…Þx”s­§YóÈ·>ïãŸÎ†¬¸…FàR*Œ_ü.Aæœjê^s²Ï!¼¾.z†L¤ÚœUnæ™*×øEOæ67¼Œ}ïê¼]øºLXÅTnÚNµëúûXÖFvxº8Ôè#juRòÔvxÆëˆ;yÆWËö €²íÏгw¾!-[‹vspÇ^öjÁçk§Vg ·o§4H_`>`v”’g:BkEv̘pæ§BÏ8KpZ¦Êçko³‹í Ïcª=@sW![!7†¨¯W¯®,Cýt¼YßX3£| À’]̽ñ)ñO—m;qpˆ¨i·¬)ÂsgæøÈ;‘¯¾ä#»d !_çú‡0¬È¦°´˜œ´(gšiÿh}‰¿”±ñž0G;ÆKL?çÕ—ÞaÍ7òxïd;އy¼`püõÖgÓûfï}+²ï¦ÔÞvÎõ`Xáäî<¬þB¥1»Oá=}Žþ‘8†TkîYOQæÄ—Yä<ÞSt¼b$žL†ÓÅÝw玷Uä"Û=»Lâü O$s+N‡ÏOÿ kVÅžü©[ÚGÎpªÕG 4B+² ðx Xe^hûæš§ãœqL”mÄhk~Òø¿ŒCâ­÷òû…+IˆÇ‰OL±X “)‘ƒÿ^Gz¡~î½<¸¡‘PÖ3¼ÖTu õ@‹€ÏçcíÚµ‹/’Œ?ÁKG)üf9)ó.ÈÉÆ£ø-k)^—MʰŸÓ­]„QyÏ*Œ‘¯Ö·0˜z ÷‘m¤óx ])÷²±|5fÂtþàü•Tä¤Àp7MÓƒn}+马Ê-ÀéÈ&3ù=^­o!´ÂIñzéCü¨å,C+yë‹ÉO qº¹•^ÇC|Ó³ê"=6‹«Ñu„Ûx刟´u lÂgÛh=gáß|€Ls˜3¯¾ÂiCžuÙ$Gƒtl'v/•¬&%r‘íN3^¤}ÏOÎbÝ=X Òqò4Á´{©,_MJì<Þ—ŽÒk+äžü LÑ ÞÓô;¡²(æÞ>ÛœÛ^B²¯‘#Áu|³"‡”á34½tŠóarRœùA#™ðغ8íó׋ì£é=~ÔØB¿mž†P'Û{2dQ¶Q5º×‚X,Æ;#ËåúܯQSSC4ºíøä”˜˜8õsrJHH !!aêΓg„Ñ+x ã;?iæù–0eRXv߬;ÞœîºǹQˆ‡ÎÒzä,­HI1‹ ÏYÁYLñŒ1’VPBq­(„Ïqêè9NL$›Æˆ Gùtu¿SÊéF½lÖ""ËZ4B) ÔÊF‚>üQÅ%wN|¤Sïç¥Sô–NýbœæòP™¤QàÊ ëtˆV/â‚¶8æüXŸ?Ñ=?ïßRTÈêt3¤ç“»â,öbÖ9Ò1’F^v;çB#Ä¿ÈY~dCENöÀú–ì0Ä:ð ÚX_yçÄ­ëÓ±®¤ïh}ëYm¸Èv_üK”ìõëÉ·Ud$‡i<êã\x5ùÉfnq³Æ™3уkÅÙAs8ºàöÍ=ÏH²ÃŽéì9B‘L¡áÔ,lÑ Á9†ç†Lسӈ[q\gîc¸óMÞ38y¨¤€UFÀ¾žõƒÕÅä*5ÏùÁBfÞos‡+‡ô¹ÎR)î­(áô /]SÝ¿q†‡§ %f²’í*¤p”‹¼GNÉcX:NÑz:0^ž2<üim‚!-›uwÝAŽ-#0ªc&"ryþöî=*ªûÞÿÿffæ0ŠŒaÐ8= &  -—Vlœžšcbâ ‰m°ßŸxZãoyIl”®Ìw‰kE²VŒ9^ÖWINð÷=!ßsŒùj¼´Â¯ýâJ•V¥%UI…¤bÃÅ`€±Ì0ðûƒ‹ (hL@x=ÖšÅìÙ—ÙóÙÃðâ3ïýÙA4áñô× OS þ`;þÆ&ü¡3™ØçCÜ:ÑE¨ÿnj#øBÆäïó@ó§œt7ÑfrÓ„ƒx»™+í¸^}í4×´`r¤pµóÚL¸+“‚®ŒÔ »è‘¹|ÖÔÌ•fmAV¬F0vÇDlCVÆls‘²0“äæêššhnnáŠ×„jÃf³ã˜hd;Vœñsyj†‡†ÚêšZø¢=[¨»=Ç„®R†‡3ßKêâÿ›ŽŽü~×OÓÛ4}-GO¯UCˆŒ¥?öIØpãnlcºõšOê67¿þ¯ßàÿÁR‡šM˜Ì·Ù·j2a5ßÙoßûûer’òÃef·»ŠKqò·SøÁ¢y8ý@ðüó‚xìý2µ ÃFW¯ómí·©§O<(ÞÿK>6M"fúTbgÍ$öìA~Ý3BâMöošõfóLµ{)«mÄQëÅžìÀÙlçʇu4Z?Þ@xPß$¿Þc#òõ~Î9]Øï@A¦Ù6§m—؀• “§1aòãèê8‰ˆÜyÖÉ< ¿9QÆgéßéú*º[óÇg©%œïM "8ÈŽ©ÅÍgž™Øº{ÿ<Ÿ¹i1Ù îm#J0v´ÔÖÐŒ«…í4ºëð»6çÂï)mœLrü4f:§13yï¿}€j<¸ÂÃ1®4â1lôœ›ÖþÙï),³’òO3oa|áFÜí¸º‹WÛ?¦ÑÌL›™¶šR*¼1<öãÔî¶o§¦ÍÏÕóÿn¼Π37œ7mšgL(¿-ÿ¯ØxÀ„Ipɇ|x¾…Й±¦ð[=®flÎPü¥ÓÔ>¹wŸÝøqè÷IFfÐUˆˆŒÙ¤Ë´ÔïñáãÀ5ñ`üTœ6hrHÙ‡u„Îxœ˜ƒã™jâØ¯9y*ÁÍ”ü¶k¾Ãx®À IDAT<ƒn“f=HØ»¿eÿ‘f’cØLm4~|–“^&ÍI`¢Úh¢âd^#•W>=ƒûJ0“mæ‰ñćýÇCÊØÚÜ”•|@£ë1Boé5{©øõ¯ OÇᯣìýñFþ€;˜<6 ïg|üiV‡™¦Oq•¿£‰+íNŒ›ìŸÉ{ãyÁ‘“1JÎÒüŽ`0»ç,_åAgWôмõãj›OäÉcü²ÐNjB$¦º³¼_qE¿J¢ +""#m: ž²Qö~ å'Ã^0B¸¾÷³b'tý‘0;I]8£øÅ>Àk„9ãŸYø #öˆyÂwXø˜’’2J ?À‹‰à°HfÌM'¡{,Ì ÉßgîƒÅ¼_òK>öƒ)ØÁÔ9 øÞD3`'~Á#Pü>%¿¬Àk ÆóÌšxk¯Ù4‰ï%ñañJ®„M™Å#©ÓºÎYqÎ"õBÞ/|—³¦P1ÉÌDñ¯Ká‡NÒgÞxÿÌÜlßÁlwá4Îòq¸««n;SáªÉ‰+´§‘nã¸Z§óÏù9v¬”_8‰>•„¹Éœùõgú]’)`Æ #®2`(—îì줣££÷Ö[£{Ýðb»víÒ‘‘Qív†“¯Vûg¿æ?~Ù®KãÊÈz_ޱáÅuÈEDDDd4RБQI_¦ˆˆˆ|`'þ™™j‘á¤]QÐQÐQÐQБk˜L&:::Ô"rS>ŸÃ0tEDäîa³Ù¨««SCˆÈM566bµZtEDäî1yòd¨­­ÅëõªAD¤¯×Kmm- Lž¦†SÐ.\¸€ÃáÀn·c6›¬ƒ‘±©çܦ   ÞÏ‹±2¡‚®ˆÈ(ÐÜÜLdd$AAAêÍ‘™L&ƇÛí3¯Y'£ ¦á(‰‰$&&’y°áêãmçÙ2/‘ÄÄT²Ï´©DdXùý~Ìf³B®ˆÜ4è©~Ý[pvË/(mV;ˆÈý@×pŠ"2ˆ±VÒ¤OÅ[ÑRHî>·ÚADDDttG—P j÷Ž6 <¿¦x«ÓSILì*iH_½=˺·± 1‘Ä[Ø·e9óRI™—Inq îƒÙd¤v­“‘s”šîJˆ¶š£ä._@jb"‰)óÈÌÙÇyUIˆˆˆˆ(èÞY1d®Jo ¿Ø}†ëò¦»€uëöPRå%2f1‘-T•ìá™ué—‹kßæ¥}n ¼gywÝ£<±±˜F[(ÐBÅ¡õl,n††£¬{b=ï–6ž0‡Y‘Íœ=ô‹—ï£FCDDDDA÷NŠœûK"¡ñÝ—ØWÛ^s£ÛŒæ<_À;ùìZÅw)µ}S±1‹MïåàÑ7y<¼ë¡ÞãèÁ£¼µ$²+3Ÿ­¡âÐnJ¼¹d»^É!w×6ž Îæ£ê ‘Áix±[aL'óù¹ì{¦í[ Ií3Ë–Í+Ïeß¾m<“QÁ™ŠZ<§1<él8 €pfÆØ€ lÎîÁ›Û¼Ô–TP»g)íé»Z*jÚÀ¤ã!"""¢ {çØRV±:¦—JöPØçñæÒžX~ˆFc sÒÓyþ©Fò7¾MÕm=‹¯÷^̪WXÓ÷ê%A„ÏTÈ‘;¡‰Â¬§y½ß•gló3—1×5 WNòºÉ[ùsÎ=¹­sw_“Ö&kc +_]†ËÐ;Ld¸©tá–9yäùÇ ï÷XîƒÅ41kw±em&s]Í4Þös„9£«Œ¡¹ÙEBJ )).¼Å—œ§EADî ˃+xñå—yùÅÙ°.ƒxNñúÏNþ¹V5έhuS˜·—*¯šBd¤Pîmšù4ÏÏ:ĺ’žO³ l®p …Š—“QNciÅ— ¤SÒ3™±ç%ÎîÉ`iÅ,ÂK)©hÁHxžL›ŽˆÜÁ ëpâr¹èꀌ!.9™èM+y-¯ˆ´­ ‰R ‹;ÿgüüH}×d˜ZDd¤Pîm™@êÚ§»N6ëæJÏá¹Y‘4âvÌyþ9  ¥”B÷mŒ æLgÛ[Ï37Ɔ»ä%n oàÍKÇ© "_);IO¦`­)¦¬®ë‘Vw![³–±xÑ"-ÊdÍæýT´4q|ý"o>×缄VŽç,fñæ2ZZ+8¼9‹e‹±hÑ2Öï(Äýez=›ÊÈÏYIæ¢E,Ê\æ·Êhꉜ[Y¶2Ÿ“Åy¬_¹˜E‹–‘µù0îÖ¡Íg°ým=ÎúÅYŸ+fëšLÖ¼U 8nàÕW_åÅ }B‹Œ$æ––:::†mÚÚ®Nwvv^wëèèðæ÷ûñûýX,–/™içQpzÞõ»2Ùw:³Ï3ÉØvŒ¾Ë¤÷ZÍÁÓ«ûn€Ìƒ§Éì—m÷q:ýêtÐôtr Òõ.‘¯O'(¯÷ò°ÝM~Î뜋[³™Ñ„´–sdg›÷Ƴ#ÓE\Z4¾ü"ÜÞ8b  õE•â³c ¡ŽÂÜìµÌgņ•Ø=ç8’÷:ë7‡°cýlì·ºcÞ ò²r)v<ÆŠ ³±7S°3—,Ï‹ìX€¯þ¯½•DƲ dPÎþ¼=¬ßlgGÎl¬ƒÌ·e}5ìݹŸè´L2“"ºÚËî Ê­î½ydÔûüóÏñù|˜L&L&Þ®»Áõ­ø*/ba¶ÙlÃzÙÈ‹/2~üø~/r  ÛóXGGÇuA×ï÷_pïXЋ,!XðÑêó!Ä?¹‚´ÔTbBºþQ·œØÏÆú®nP{|S¬ó³Yó°Cï“ÂÂÂúÝkoÏý¾·'kö ¼_KÐ ×F7›ÍýÂöPƒnO¸ ì »×þç`6« YDä–ùZñaÁn±€Åì4 åÅ>WIyeeåHê^ÖOÚ”ì=QÃ’˜*‹*±$em€Ç]ÁeO¹K]ó¸[¹å Ûä®Á1Ÿè>ëÙ£“ˆðãn¢;èºHê3äáJÂe)¦¬ÞKšåæóg×eÈ‹³ë="c–Ùl¦³³sÀ {mï°Ý‘Ð`=1” ;Ðtßu®íí A^Dänã­.£šR" h*cÇú\NX$5u6i™óI;œÃVOoÔ$>m ¯8Ný“qUZ˜Ýur›Ç „¥‘óÎ~_°„|m¢ÝOì»z÷†óÛßVÀb`·hì0»zìJFRÐU ‘k4qjï <ÎTâÐzn/ÇZç°áåõ,[˜J¼+‹Ç×gÄopħ1¥þÅÇ‹8gI&­»ÇÔêra½ì¦)ÄÃÑu³7‘·ç8M·qBšÝåÄRŠÊ¦>{[yŠzK®ÞNV7§úœíæuŸÀí³a :ÿN﯈ /}¯/"2ÆùêÜTV€žújÊŠ 8RÁüÓˆ¼ö¬žJN”¹±ÇX¨9^ÀŽS|ÑÕ4yãp€#žTçëìy½†ˆù/Ós¡G#f! ?cgÎÈL#¢õûóàN~‘ˆ›tŠúªÜTT4õ{,Äá"*v!)ÖìÜú–ŒÙØë‹Ù“WIÄü—‰îÝž‡c[_õò1¢½•È+Âû,©Q@ÅÍç ²¿>½_DtEDäî º¼ÎÆz¦¬8£“øéËW¯ŒfÄe²"m3y¯üœ#–¢S3ÈZgeçk¯³¹(ŽÍG’ÒœìÙã#%ÍÉÕ Åœ °#üÜcx,aD§>KÎ’nöå}Ñ+¼PÔÿ±ˆŒWÙ±0Ž•›Ö²s;_8€ÇAìül6-î*•ðXä§OZ)Úñ{.[q&-aÊ®›»û+"#SÀÿïÿ½s8wàâÅ‹Ü{ï½_êd´¾#/ôq¡½½Ã0صk—Ž´ˆŒj¥¥¥<øàƒcþ\oÅVžÎõ‘µ;‹8ãÖ狌vííí|ðÁ$$$Üö6–/_Ž×ëÅl6ø“ÑT£+""""£’‚®ˆˆˆˆŒJ_ú;®¶¶6>þøc¦NJPPZTDD†³†üüÛŸ/"£Ë—êÑmkkãü#/^äø>ß8Õãæw¿-§Ù¯ƒ+"""¢ û%B®ÇÓ5bx{{;Ãûj¼_ðIùÇ ¹""""r{¥ ׆\‹Å·¿ýía,]ðóEùÿáý¿zºFg°èÀŠˆˆˆ(èÞ¡2Œ/ÃDÈÔïðýIí´ÕžæwnXÝ»>ävGÝ +¡–ÌÁêΑ±Çd2 ù˜ˆŒx>ŸÃ;ƒHßRnEEEoȘ1cƈ¹""cÍf£®®N !"7ÕØØˆÕjUÐÈÔ©SûýpþüyÚÚÚô®f“'O¦¡¡ÚÚZ¼^¯DDúñz½ÔÖÖÒÐÐÀäÉ“ÇÌë¾¥Ò«ÕÊ·¾õ-þøÇ?âõzñx<üáæÑDDÄ0 bcc¹pá »"rÝg„Õj%66vL•.ÜòÉh!!!|ë[ßê7÷Ê•+ »""#äÙÔ©SÕ""Ýnkݾýíoc±tøÕvGÄ#DDDDDøŒ¸6쎈 Fˆˆˆˆˆt3™•{Âîùóç™>}úˆ(]°D~—4‡¿ßO{»°ˆˆˆˆ‚î— »"""""£*芈ÈÈàõz¹páG£.ˆH?=£.Lž¦†SÐ.\¸€ÃáÀn·c6›  @ #"tvvÒÙÙÙ{.Õ… ÆÌP„ º""£@ss3‘‘‘©7WDd2™7nn·{̼fÝÁ´!gÞRµ <;rÉ;\íúê÷£á m¤"ôÞ<šÃÌæk¦u­‘1Íï÷c6›rEä¦A7((hLÕð+èÞŠÐpÂûJ—ókªq ²9%œf[8†Ž„ˆ 00P "75ÖJšt‡,œÇw½Göôaê:µ¥²e_êÕéfQнi€ùWĽ‰‰$.ØÂ¾-Ë™—’HʼLr‹kpÌ‘ÄÄT2rŽRÓÖµJMñ6V§§’˜Ø5/}õ6N4to¯á ‰‰$¦æp¦MÍ+"""2hÐÕe{¿bµoóÒ>7†ÞƳ¼»îQžØXL£-h¡âÐz67ƒ»€uëöPRå%2f1‘-T•ìá™uiP+ŠˆˆˆÜ2sss3Ãv/^¼Øoº³³sÀéžá1úÞ:::¼ùý]—¶X,wh/ywñlÞí÷ØžoéΛ¬fÌbÓ{Û˜g;Cî£Ky·flxü6Îo{‚Å{jqŸ­¡a‚ÛŒæ,xžÜtA5ù¤?º*w)µm ˜ ÷ªˆˆˆŒõõõø|>L&&“‰ÀÀÀo=Ãö½Áõå_e9…944tÄ5à@A·ç±ŽŽŽ†ÜžpÛs¿½½ýΈIdßÍ.B6N¬þGž)é9ƒ1’%ï¼ÃêÞu˜>ÀF×ykáÌŒ±AØzNdk[B6¯<”}û¶ñLFg*jÑuDDDd¤7n^¯·w¤—ÀÀÀ†Þž€Ûs²ì@c|•AW5ºCO¹<þoïpðàÁ«·}[˜7èI½xo£†¶¹4‡'¯gû!7¡ é<¿á)¦¨ÑEd´ª;LÖÊ<Ü7üÞKõÉýìÈYòŋX´h1ËÖ¬gӎÜkºÅçj:NÖâ5쯻ƒûÿUlóÚ¨ØAfæfÎy¿šå都B²¯¡°NomY4ê—DʶӜ¾öa÷-}œQu°˜F fí.¶¤O íL[Ô¸"2µº)ÌÛK•wö æW°s.åv’ÒRYÎŽõËX¼h1ËÖçqüøV–­Ì¸4â†û]Çþ5‹XùVuoèÎ_¶ˆE+ߢº7¨/cÑšÃ\ý†~¨ë¼Çïwd²8ç8W[°‰Â¬E,ËwãZÝ…lÍê~ Y[)®ñÜôð º|Sù9+É\´ˆE™kØôVÙÕçn=ÉúÅY>¹ŸMk2Y´(“5[SÝÛŽ‹È\³ƒãu=ߢ®å7ï§¢µç¹Š¯–.ôl»¬ëWvok+ÅÕ:óD¾~êÑLÐLrŠO“s«ë¹Vsðôê¾yð4™}q¦ïãtúÕéŒmÉè»ô¾S (8½ Ï~]3-"r‡yÝäî<…3ãY6ÄÔå³sóâw¯'>¤ŽÂÜìµÌgņ•Ø=ç8’÷:ë7‡°cýlì¾öîÜOtZ&™IvQvhuðwkoi%%ûIb h:¹™Ÿ¿ÖÄÂì­d¹ê8’³‘‚z+bĹâ,Úϱš%Ä8+É[ÿeqKÈz1*°cç).Ûç”îo²ßIÄLJQPVIÓâ(ìž Î](§² ¢ìMT”]&">{wŒû×ù&q)Á²±ˆŠÖÙ$‡M')ªŠ`öJ'FÓI6¯ÊØ žÍŒÅp oç)<–¤NÓI¶ÞlyoyY¹;cÅ†ÙØ›Š)Ø™K–çEv,‹é*ùðUQPàbÅš—ɬ;@î+¯ñ³SS˜ÿìz^u¸)ÈÙIÞÞ4’VÆ`x+ÈÏysqKx63šÖrŽì,`óÞxvdº®/!ñU±7ï —eójD5G6¿Âμ$’rf£êù:©GWDDn¦ªi²D“–šL\L<©Ë²Ùµ§¼îì­ŽeMÖb’c\ÄÄ?ÌŠgÓ°~p¤ÏÉb>¬ó³Y³0•ø¨Á«i[+‹(·&1?:¼çxkgQ˲XgÇqgg ±vÀî"Êâ¡©šNp‚9¬yöaâcbˆx+ã- 4tÍÍ÷ÛÀ™‡µæ8îVðºOQ‘D¬µšSÕ^hus¢ÞJlгO°ú:¡®4â-•U¶vgÕ"ª"RHsÔ/à˲³’CüÃÏòlZØ Ûj°å[Ë÷Rì‰eEÖbfǹˆ›IÖ²h. ²·],Ägf2Ûå *y>iNK]IF² ‡+…ù³­xjšðBü“+ÈZñ0Éq1Ä%Ïç±x+žúÖîcÔ“+Y…#*™…OFC½›&ýVÉ×L=º""2 #z!iyåéeD'%“”’BJRšÜ\öT‘»tÑ5kEàn…Ùv€0ââ†^CÛê®ûlx+Š9åq±,ÉÞšëÜ"’âqøšhÂNtˆ—ºâj|QáêMŸ!¸’œPqýsxÛoW Ñäq¼º{Y !ñËH«+£àT ­–STÍÂ(ƒîô×ÕNC]Lj&-ÎÂæ¢JZã]œ,ª!"e Qx9W^%:“«ÿ¸’\XŠj)/õƒ,ßä®Á1Ÿè>ÍoN"ÂWŒ» âB‹gDHoèµ`Á>ÅÞâ¾ãÐQÌN³PQ^Ìás•”W–QVî¤Í0¢]ÖÞ)‹,ú•]N^Ÿïj† ‰#së0ÿÜ)N:ʼnüä%ñìÖ,â¼@XÙ9áì—` B@+`1°[†>.‚¯µÏsãë_ÝšÊ8Ri!6£«¢îøÜöV8 Zoé²ßÄ0Ûéa¹›Šs­8GW礩¨·½ëÉ®‘úvM† q \iq°µwu,E5vÒÖDÁÝ0jzS;ÖçrÂò ©©³IËœOÚá¶Þ¨ŒØb`±hL ~*]Ë|>|½9«•šòú>Ùæ-òöW7›‡3×°iÇ‹¤YN±ÿ\V— ëe7M!Ž®›½©ˆ¼=ÇiºÍÜfwÙ¡¾Œj/Ž$\–rö¹imuS¸#r_!x¨+ËgsA©+e8â" úTŸÏZqŸªð9ßo;±©ÔQTA’3kLöš"ŠŠë‰˜Íõ}ÔC_'$:h_{ P‘FJTWŽˆÀWyœ«çkyqŸr÷í8îÊ[Þîrb©?Eeß +OQo‰ÂuU´žÛ˱Ö9lxy=˦ïŠÀâñÝ`ÿDtEDd¸…8ˆ°Ôpdo1窫9W˜GÞ¹«ÑÅB Å[É+,£Â}Ž“Gpòr®+FÌB:+Ù™³ƒâ² ΋͛à¶Gq›y!qó‰õbï‰&°Ïfͳi°ÿç<½&ªÔ,~šd¡è…•¬«žÔì—Y×õµ»=i1)cëk‡)«¨ ìðÎ~¯£_DÂ~Ûãâ±Öœ ÊCŒ g.ª8Qc')Î1pHê:!ѤÅú(?UODZ =s³ë;Fîæýœì~ ¯_î59w8ŸüÂj¼CX>$v!)Örvn}‹“n*Žç³9¯’ˆùO}ÇÇbÀê©äD™›º¦jÊ¿ÆÖS|MÕ·ýÈ×A¥ ""c6èÆ³lÅ6çídã1+Τ'Y±¬•Íû{f/#ë±äíÉåX¢IY‘òˆbaÎØ‘G~î1<–0¢SŸ%gIÌí_ÄÁžÄ²'ülç&ò#Ö“™¼ŒÍÉˮΟ½•¹7x+r~ÊÎä¾à#âÁ'Y’QÇkìX  ß×ëƒï·áL"Îz„®¤îðEŠ NUÇÒ=xÄõzÈë„— 4‘–Ô'ÛSÉÞäe玽¼öBÖ))<™•Á‘­•½A×]t„#!±<97 c°å8VnZGÈÎ=ì|ák±ó³Ù´Øu[ÇLjËdEÚfò^ù9G,D§fµÎÊÎ×^gsQ›gë×IF¦€ìììΑ¶S×M÷<ÖÑÑÑ;ÝÑÑÑïæ÷ûñûý½÷ÛÛÛ1 ƒ7ÞxCGZDFµÒÒR|ðAÌæ»½ÿ¢‰²¼r‹jp¦,!c~<1®(¬¾:j*+q{]¤$_sE´º2ŠË-ħÆu—xqç¯d}e&»7¼á¬ªßZÉÏÊcûæ¹8ôÖ•¯Y{{;|ð ·½Ÿüä'x½^Ìf3&“‰ÀÀ@L&Sïý¾·€€ ì*"è™îF¯™¾“Ô£+""#ˆøe/³=©ˆ½û‹ÈÛ¸‡Ë½UVœID'GÕo:ï,à”7›%³ø*“Wä!zYÜÈ ¹­Õœ;wнGê‰^–¬+ò5PБÆÀÿ0+ãÀÛTG!Øí!íî˜KÖºvîÙȪ×}X¦´dËRGÖå½õGØùÊq,)?%+E—.QÐÅ^»cÐÞOGr&9É™#ûu¸–±ã¿–逊|4ꂈˆˆˆ(芈ˆˆˆ(芈ˆˆˆ(芈ˆˆˆÜYæK—.á÷û¿ö'6™LX,BBBzÇV‘ÛÿLíèèPCˆÈMù|> Ã3¯×ý´š„„„aÿŒhhh ¼¼|L 1v{A·ý3Þÿ_øÐXà±}Ÿ‰ŠÌ""ÃæÂ… 8ìv;f³™€€Ô0"_¥ÎÎACî¿¿ñsç=4ì»jN§³÷ób¬ EE¯r IDATx›ñÔËeO÷]Ïeô™ˆÈðjnn&22’   õæŠ|MÚ}>®\ñ 8ÿßßxcÄíó„ 8þü˜9Fê‡ІR ¶oãíâ j[¼áSˆIHgíóÌ´©yDdøùý~Ìf³B®ˆÜ”acª†_£. ¦í [–.ç‡ÎRÛá‘‘Uœ-üKds¢YM$"#ä=Pé""} ­G·oMîujøå¿ï¾:9ÊjvÛÎæ³¯ˆ|Š7ßYËÌ  ù Û2—²§ªíÅÏ‘²`‚ÞI""""#­`h‹õ©ÉÌ(«Ùõ6·t½#œÞ*ÛL2s_aÆ <ÔõXC)ùk3˜—’Hbb*é«·q¢¦Ï†šÏ³/'“©‰$&¦0/c-ù'®êó[˜—˜Hbúöåf2/%‘”ydï;O[ßà]s”Üå HML$1e™9û8ßg†ÛXžJb÷üŒµù”6è.""" º7`fâ­aŒ¦+l1s™Pµ'fÏ#sm.Ûö¥"( :ÝmgÈ]¼œíÇ*hŽœÁŒH/U%{xfù¶®Úvžm™‹yéÐYj‰aÆŒp+ޱý™'Ⱦ¶ö¡êm^:ÔŒ+a¶Æ _ZÌ3G»“jÃQÖ=±žwK› O˜Ã¬ÈfÎz‰ÅË÷QP³gžÙCILIH`Fx3Ƕ³|]5z¯‹ˆˆÈ3´óD¾ÿã§ù~Ïtûýû/»Ã““þ×G˜Bz¦'ÌczÂ<Òçe3oy!-î2ê\_æÚ®™öÒÖuÝ¿ú¨··$$fÕ+¬Šé[ DøÌ °ÍcËÑ™”ÚǾÂBŠKK9´§”Cû ÙôÎæéœ9a¼;x:×CÖî,ânµî­©¬•GH{u+sjKÅÚÎûèÒ®oû|;,ƒ»ÍÝ>5»£¬&÷ú¤{íÛ·óRöî>C‰µQ{ÞM €m*ßHèêÇ­->€öe¦˜¸€Üóm„'Ä`…‡¨èε5ÇÞî*3p¥Ù÷ÍZ[Ì¡î…Šßæ À”Y¸l6œ3"hnv‘’BJŠ oE1Å%çijŽn!{ãnθ2ÉÝuÿçMžŠZJ9VÛ¦w»ˆŒ.©óÓp…¨)d´k¦ª±ûncÙtèn¯G÷ÚšÝQlBêZžš²”·«Þå™,$rJ8ÞÚ*½á<¾6WŒ“GB—s¨êd,($† ÎÖzaÊ\2\AØ\OóTä1öÔ¾ÍÒGKIˆl¦ôl-Î#kÁIß~ÝZÞ^:â)A4V5âÅ`ÖêGp¤g2cÏKœÝ“ÁÒŠY„7–RRÑ‚‘ð<™6°Ùj8QxŒÂÂb&ÌÄÙæ¦¤0f2'Rÿú‰È(ÃËcÔ"r‡ƒîX4“µùo³m;ùÇÎPUUF(‘ ©d>½Šô@Î;ÿFøÆ-ì+=ËYo(Sf=ÍÚ ™t•ÛNguÁ[8·¼D~ñYJÏ„ÇÌá©UÏ“™pM²„ ©gÙýv)Þðæ>½ ©Ý5Ît¶½/mÜMqÉ1*ŒH_ËsktÕ§ä²kÃ~±»ÒÒª0™Ë’çŸWÙ‚ˆ ‰·ú8y;ó9QéÁJæüVò ì¬5×¾¾ku’·c/§ª.ãÊ3i!+V,$&äÚù¬S’xòa_Ÿ•O²þ齤<;›²‚ý|PΔed= ûwæs¢ò2ç–e¯d¶h*&kåþ®Ò…îu³Òpï=À‰Êz,Î2³VeèÀŠ(èÊ Ùf² { ²o²Ì„VoKaõ ·1ôœ|Ò}²pVïâàêm&Ü‚m%ˆé ²ÙuÓ¹QÊ=GÞú×(‹[BÖ‹ÑPy€;OqÙ>ˆëWŸó:çâ–ðlf4!­åÙYÀæ½ñìÈta4dëúשŒÍàÙÌX ÷òvžÂcIºº _.V¬y™Ìºä¾ò?;5…ùÏ®çU‡›‚œäíM#ieÌões¾*öæbá²l^¨æÈæWØ™—DRÎlTÝ _¥·ÿײ|ùòëÏÝôâím°oMîuJyfvbŸØ šÝ›Ñ¨ ""@Ó©N0‡5Ï>L|L ñ¯`e¼…¡_(„ø'Wµâa’ãbˆKžÏcñV<õ­Ô/à˲³’CüÃÏòlZØ5Û°Ÿ™Él—ƒ¨äù¤9!,u%É.®æÏ¶â©iÂwƒ=ˆzr% ã£pD%³ðÉh¨wÓ¤C+_±§~ôCvíÚÕï±k§oMŸšÜÁ¨fWAWDD㥮¬_TRŸ…\IΡoˆbvZ,Tsø­<6çüŒ'<½Û¯/¯Ç=›«•®$–~9׎3"¤7ôZ°`Ÿbïí½5,–›ì@Ñ®«W7²XÀ¢+ÃvwíÚÅS?úá—Øš)áC\4|JŸ±øåZ*]!‚¦¯åèéµj¹{5•±c}.',’š:›´Ìù¤Îa«çkz~‹Å¢z\Þ°Û÷ç퇂™d=Mo!bÛ –Ï~†Rø·ã»HQ©Â¨GWDDG\TŸÂÝ[ªÐŠûÔÐ/ Þzn/ÇZç°áåõ,[˜J¼+‹Ç×]f`¯ò8Õ½Û÷â>å¾a‚ÈÝvEAWDDF{ÒbR8ÆÖ×SVQAÙáäz µØ#°z*9Q榮©š²Ã¯±õ”_S5M^pÌ^H¬ï¹›÷s²{û¯_VËÈè º~¿“ɤ#!"2ÜBâY‘óSâêö’ûÂFòÊ¢Y’1‹ag(F\&+ÒB8þÊÏYµ2—½5)d­›ƒÓý:›‹ªÁžJö¦Ÿßt˜×^xÅðXVNÒŠ ¢OÍ®jroIÀ† :‡sš››ñù|ØlW[ggÿ]êììì}¬£££wº£££ßÍï÷ã÷û{ï···co¼ñ†Ž´ˆŒj¥¥¥<øàƒ˜Í_âÔ‹º2ŠË-ħÆaÀ‹;%ë+3Ù½ICt‰\«Ý×õÇ•+¢oß¾€¹ó"!!aD}^|™ýùÉO~‚×ëÅl6c2™ Äd2õÞï{  €ÀÀ®¾Õžé~aôšé;)Ðï÷K#ûý~š››imm%$DŸ""ïŽÃ;7“WXA]kÕe{É+ò§+"w%sCCÃvM&‹…qãÆõ¦|F޹d­«a瞬z݇%l IK6°,ÕŽ·"ŸÜ=•7>qÌâä±5+I¶«EdÝñãÇ«DD¤+ë&g’“œyýŒ˜Lr6©}DäTQÐQÐQÐQБk˜L&:::Ô"rS^¯Ã0ÆÌë5니Üýl6uuuLš4I!ò5úàO¢ðè¯îšýmhhÀjµŽ™ã£]‘Q`òäÉ444P[[‹×ëUƒˆ(äöãõz©­­¥®®ŽÉ“'™c¤]‘QÀ0 bcc¹pá »"_“¹óÒr¥¥¥ÃþaµZ‰U邈ˆÜawêÔ©j‘n*]]‘»ÅÀ¥ íœxç=Î_¹æq#”{§ÏbNâ$îÄùzí¿ç÷ʹ–ÌÇaÓñ‘;dð]#˜àà`‚ƒMàmáâ™"~uº‘vµˆˆˆˆŒ`ƒœŒfð´'Hut-Ööéû¼Sô—ËÏPŸJ¤Ne‘»3èöqa|D½ÿ ^×ÚÍU§))=Oõe/`5äï%2©§¶ÁSËŸJNR^}‰+þîù³™4@B{ãŸ8ü^)™õh÷ÛÍ´7ÿ…“¿-å¯[ðš‚™0å›$'G3δœãð2¾¸g*ß™ÞÆ‡¾@Ó37yßšE°Ž¯ˆˆˆˆ‚îàÚhük9—Ó½ÓˆšÎñ›ßœá&BÇG`xë¹T}†¢ß„ñÃG¢±¶×qâ½_qþ ˜Â"ˆð_¢¾ú E¿‚Gÿ%‘°>[÷{>å·E¥\"”éi?à~»<á7ÿûÕ~ƒ°{'3áJ 5ù=‡¿èdá¼è«uÂû˜ß•Y°ZM€/.ü‘ÂÆñÝI´_ÒQ‘QÏÓÞÁ®óõ”6xFýkM˜`eùô¬æÀ1ÛjƒÁÛAdA×Ë_ÿOþÚ÷!ci?è ™mW.cDÜË}Óf1ç~;ææ?ñî;¥\¾|‘–öhLÕe]'´Oæ_‹ÃF3>ð%—>¢üR<³L=)÷å¿9É_¯˜ˆúÞC¤DÐôQÕ~ù17îï0ù/Qv°ëÏQy9šzvÊNüü4¦ûiúð(ÿß¹f¾øÌƒ’÷â‡:Ê"2êý?×ó‡FϘx­¥ þGg=Ï͘8fÛAm0x;ˆ !èF(¡à÷ÒrÅ Þ(-›FÄw" ŠLá³þÂùó¥¸Dý¥ü}V½R€Ð¨¨îlÜÿØRîïžßÞØ}§å#η6¾§à –ê®õ[Îa;ÕÂç-íôÓpƒˆ{ºîZ€füt~Zê¿ÐQ‘Qo¬›Á^ïXjµÁØ|½rGƒ®Á7Òþ¥÷d4Úê8ñ¿s¾ü¥Óž Á[ÂÿþÕG\1…qßôéÌŠ½Â™ß–s¹;¨úýCß#ÌÀ{¹…ò’xàáéØúDæñ ÿÈ·Ç™èììì¾rO¸ÚtEDDDd`·YÔâåŠ×Ïå>¡«2á!þé;ßäa^®ôÉС÷†ÐòI5M4óçCÿ/o¾¹—}( Žå¡‡~À4¨/åä§m@¡]ë{½aLŒŠbÒ¤0üŸ_àÓÚÏÚUÜMX#þNGYDdëh½Ìggk¨þS µ_ÐæW;¨Ôrg ^£[ôM~®\鎗Áß v|FX0àåRÉ{øk0W.^ê@ƒîgšñ+>º|’÷öþ•ñ\¢¾Åaß 6ÌLw×/¡ÖHâ"ø¨¤žOJÊhü—ï>}&gJ¨?s_6:¹çÊgÔ|î%БLlCêѽçÞé:Ê""Ã%x¯&¼ùÛÏøSç5óüttø¹\~‰ÎI ¾O먻LÔ½&0Þý—ï 0óý?¾7ˆv/§Ý ì®nÃ3ÖÚÁd0ïþŸ`Òáãô_êØQíÅ7ÖÚAFZмWúôÒ„Þ;„Y DÓ¿GòÅc”V·pùr(Óf%sùäI.z/ò×Ëí8Â#ùþ¿¤üÛ“œ¿XO½ß ,*žäï}»™ë.:a›–Ìô²Ãü¹¥œ’byäþûI{J~[Æ'5¸d ebt" O(t éNÐQ–pÄ#÷ÿ»~žÿo|vòŸ7w’~¡û›? æ/Tœ ä×dç®7aŽ–ßk惿ÔSj ã_§9¸Üô)o¶vŽ©vˆt:øo:øÕŸë¨ŸÎ›6ï×Õðߨz?ÈH ºæpR~´””ÁÖr7÷Iâú>v\ÿe¬“Hœ;‰ÄŸæ;ühéwú<à åGK™Õyõßþ ðû™óèt:»ëèèè®ÓBãxø©èèè ££¿L¿Ïcuà÷ûio×õÛDDaó‘ØoÁèðñá§ ¼ú׿áÁÄ7¿ÁÒIÁD¶óá§ lÿø — dêä ,¿/§ÙOͥ˼Y~™š NvÜoâtƒŸ&AK3ožmäw^ßq°ôÞ ,Þ6J?iäÍê6|al%ä†ûu„rùäfÅÜìÅÖÉ•¶ ‚þæáof÷N½ƒ¡fXÚÁKXh M-Íüǧ-Ôù¸šU¥ŸSÛ@äøPœ´ó‘§cŒµC—/·ò~£Ÿo~ËEîßÔr‰Rßð½dìÐE|EDF1·V‚ø‡¿GXC+»ÿÐÌïZáûîÁhoå}ÚÊÇ£¾)ãoDþ}0!-lý¨…;ðŒeýøP&5øøÍ_šùÓ•š.†ñ 3„YA bx1€iãÍpÙ‡Ç×IS{ç˜odê䉬ÿ{ƒ?ªá?Z;Çh;ø)=û)/OŠàç÷MäÇ Ÿòfs§~IEAWDDn3Ø4Ö±êw÷ð]g(ÿàÏ*gßýÓ§½æû<}ǵŽ}÷v_µÇs‰ì²–Þó‹}í~µCo;˜HxÀÉÏPòçvæÃ7æÚ¡ƒÈ‰ãø‡@kÛøSM35÷u—p4kHùj©tADdÔ `ê÷ñfò8œ--ü¤•VLØÍPS÷7¼æ~ä á»ßpóͺ§“Ú‹£Õʧ…’0qléЯ¨|åÔ£+"2juòñG üêžpæÅF²€jØÕÐÁåÎv|ê`é$«Ûùð“:޼܉‡¶þ%€§ï‹àgN?õ—.±ùÏW¸2aà£Ô{?޹Z¾àÕòV*Ú½ì uðãØHþ©ÃËé¿Ôóî |mŸ4àkõqåãNÚ|>>÷æÀQÐ0ÍÕuIûñãY>¾ko>*¯âOõc¨:ñ´ÔñïÖ~|_8‰í^NTÏ^WÂñuµƒŒ©÷³³³G\LggçuÓ׺ÐÙ;ÚÂÕQüøýþÞûííí†Áo¼¡#-"£Úýõ+Ý~ØD';î‡?ÑgH¨/Ë×Jmɧ\`ô1cÒd¦ÄZ1Ýdõÿ˜ó1ßÃÑwK;ÈWç'?ù ^¯³ÙŒÉd"00“ÉÔ{¿ï- €€€»þYé™îF¾ºo9Ô£+""ÃÃBä?L'Rí vP;ˆ‚®ˆˆ —ËŸÕðãÏÔjµƒÜ]Tô""""" º""""" º""òµùv¸U¯wŒµƒÚ`l¾^QÐsþŸû#ÆÌüo‡[ùîÓí 6¼DÌ---#n§n6¼Xß¡Ån4ÄXß¡ÆÚÛÛu”EdÔ³šynÆDµƒÚAm _9ǃÏçë7¤Ø†ë;Ä|ýË©GWDDDDF%shhèˆÛ©;}Á¹3¬Vë]sÁõ芈ˆˆÈ¨¤ +"""" º""""" º""""" º#XÛrRILø¶`›ûÎ<Íù-ÌKL$1½€š-ÔpŒÄDSs8Óv›Ïsb9‰‰‰¤¬.¥MGWDDDF1³šà„†Ô÷—S£:ˆˆˆˆ(èÞÕÂy|×{dORSˆˆˆˆÜTºp'Ô䓞˜Hâ¼\Žd“1/‘ÄÄT2râîSPS¼Õé©Ýe©¤¯ÞƉ†k¶å­¥$7“y)‰¤ÌË {ßù›–´Õ%wùRIL™GfÎ>Î÷]¡¡˜-Ë’˜HjF6ûÜ*X]¹Uï²þ'h6  …ŠCÉ9Ô]që.`ݺ=”Ty‰Œ™ALd U%{xfÝAúeÝÚ·yé]7Fd84VPøÒRž9Ú0ðó5eÝëy·´™ð„9ÌŠlæì¡—X¼|_WoÛ¶,^ÇÛ¥µxC§ÞXÈ/~qVÇIDDDt¥_ŠåÝų¯9-}ý΋á¹÷Š9xð﬚@Eq-m@s£ÛŒæ<_À;ùìZÅw)µý:YÃyüÍ£Üw”÷6ÍÂÀKéîC¸Ø#÷¡Ý”x!rÉ6v½’Cî®m<œÍgŸš‹·óv#0eïÝǾ÷Þá¹IT£{+Â#‰ì{î™á"Ô¼=óHïº3¨ÂÛ]x`KÈæ•ç²oß6žÉ¨àLEmïjýŸc.é1]uÀRž"JªJp7gâê·`5%UÔîYÊC{úΫ¥¢æ Ü%瘒1W€‹¹OÅð‹:–"""¢ Û£½î}þ³ÈË~øODºVµ>O˽±DÛÍCØv1ÿY?øaê¶=l)—ÇÿíOF«|íæÒžX~ˆFc sÒÓyþ©Fò7¾MÕÍVºé€Wcr̪WXÓwá Âgá-Ô\DDDÆ®¯¨tá ÕgÊ8ɯîþîƒÅ41kw±em&s]Í4´hc1‡*ºzŠß¦ r.Ûµ ÚpΈì ÑÍ.RRHIqá­(¦¸äÿoïþƒ¢ºóÏ?»Osl„4?ƒ` Š1_ˆŠÁà—|ÌU3×èÜìשݘ›­d÷îÌlÕdjkãìV’?¾ñÞ­Ivï7së»IÝÔ$÷Þ˜qG'3&Î×Ñ¿’021鄨ТDE: D¤vÓ§{ÿ [! Fh_ª†>Ýçœîó9çôyõ»?}º‰äT–pv÷¡È—â.P·[Õ\¹=¨ë¤õðÛ§¡nTA×¹øY^}f¢iI)H|œÚþC¶ìO§Ç} ߘãvòök9ÌògÙš«Ÿb½óiÞ;õ2›ÙÍ<Îr¶GkRDDDnó ëï9IC}#í½LW>KK­qîÄÂ$5¿Œªª%d%^âèoÞÁãêvðVÇ:[•…5îøÑ9ZøZóž»…®ûu÷û{šùë_>ãÜ—ƒà ̙[ÊŠ¥¸ÃÓ^nýˆ#žsô ±'§“¿ø>º¦8Çûzè•N{:û'5iÁ¦çù©{¿l褭-‡õÏþ”³/½ŒÛçf›Ÿ‘ïˆå¬çñ²SìÞŠ@z1?õÏ­Î{¦¹›xå-ØþÂkj¨ã”™Cù£ÏðÓg6 Xγ;þsÛ/yïØYzr*yüñÞ|SU]‘x‡ …B„Ãáën°Ùl×Ün³Ù°Ûí×Ý."lÛ¶m _wëÀYöï:Hwv9UeÙ½Ž´ã3ò©Ýò9tñÁνtd/£²43३ÞMwÑ#l^žŽ#x‰ßÙƒ·|3ëç'CðÆãÓuˆ{[ $峬ªŒ;‚xÜt8«xlý’†¾àƒÿï\¸ó~–-L'!àåÄáO¹Xø=6Ü—J¨ÇÍþØŠsq9 \à;s”O:’¨øÛròfñúë¿Ö𑏠…òòÙkÛ9v`þ+~††††Â YÃ/õ † ‡ÝFBB‰³Y¼æî}êY“°Ûu"™Ø“O>I Àáp`v»Ã0F®Ç^l6ÛÈêè›ë±Þpß,c–<û[ÝtE¬«YB–È©¦ºo{[¢c˜ä-­¢¤hA¤âêÂhõ°Ï5WcrãGÆ)ª©fQ–ƒp8“Ì$»ö6Òtiå³Mòî}€â»‹ÈH§aÏ9Ο¾ŠLå2W Kæå’‘`ár® 1ÇG¢‚—Z´EŠHÜ ‡Ãô=ÍŽ'×1+ Ó ‘àã0ÁN#r±ÂÂF0äghè+<¿û/|ôû_³åõ½¤«²+"qeŒ Äçõad.#Õqu4W¾ #šiÌ/1èòžæ¸·owÞä÷(“ßpQxõq¸òq-ôú‚šFa±.o '¼]x»/pá‹ÌLš~óg¤aï^îÈÎæÎÜr²20ÃA‚—¿ÔZ‘¸ …8þÖ+¤ógÛHr8°G«'€=’_CaG‚qÈ †9ó•Åñ·^¡òÙÿˆajL‰ßìsªó|ðÎ.öi¥Ï̤dÙjŠ’0¦jüáø:üמ¾þ÷¿eÿÇÃÓ/¨¨áÁùIWŸ¼™Å}µRûàæÎÂ{ì0>ðÑð1„´’E$þ…ÃaΩ'#ÉÎìY&‰¦I‚iâHHÀHHÀæ¾ 8H0Mrðc*w–Œ$;gŽÔ_ׯWDd¦sŒu“3Û‰ÕØJ_pîpׂô¶÷b‘ €ßÛHK ˆu­¹¿3`1ÞÉÄ&5¾ÕKk_¹Ã#ìm¥×rRætà÷~Æç»ùުȰ‡‡‡è X#v°ó3ŽõÞIiñ]ÜíÊ¥°¤O¼Ïç½~òæ¤j-‹ÈmÁï÷“<Ç#ÁÁD=²þ»ŸáúWOp|Ï#9Ñÿ²_ ("·CÐ…”Â2²Ýõ8˜JŽe IDATÕÒlŒî&ZGî7’œ˜nZ;zHÊ4èkuSßÀÊìc0˜CŠL,¾>üY˜ŒŸ@€–º:\•ed»ð44È«¡(ìýNÌÀEÚ:z˜•açRë'4œ`¥_投‰A?mžVüŽræ§Ùè<ןHF’‡«HkYDn 6À‘€Ýqƒ k³“ýøÿAêƒrá致¾ùïIOLÀ†Î{."ñÇXµjÕó×ÝšNáÜ$.ñpôhƒwpïwÓß>À]‹ç“ššEê`;ž?åèÉóôÏ.¥êÞºNå¬YÈÂ,'¶ÁNš9ÈçžÒî¸ÁøÅ³½œìÌåÁ2‹¦#Gøìó^Œ¼ûù»ê"Rì`wf2gàÇÜxšÏãK¾‡‹tŸ:ι„|Šçå‘ìá̉œþü,Þþ²WPši’`$óýï_kZDâZ(¢qÇ?‘;'‘YfÙÿŸØú¢›ÝÀf7°›³Èyz;s*×ÑÿEõÏ=IqŠ`ØÆ_Yúç3/ˆÈ„öìÙƒeYלYaôYƺÀwÖ…±O/v‹uþÇèmÑóCFÏ{±, ˲F®ƒALÓäõ×_×V)"q- ò_ÖßË}s<öîXóCBÁÿég œü›9‹œ§ÿ=³K—148À?ÿo?¤(à%ÁnÃ7dñéyÿÃ{Ÿápèw„DäÆfÒéÅôÖ]D$Øl6 » ÑÀ%ÿp7»Ã$çú8¯$ïýGf—.ƒp˜÷ÿŸmÌ t“hšØ Ž »M§‘¸£·î""ñò‚nØŒNÿæŸ$¦P²f#öÄ$rþ—_ŒŒã~ûÿÅÙú )³g] É!;VLDâ*º""qÂtرŠ2Ó8³ãÿ¦µáÏ×ÜßzøOôü5Ysfc3° `$`7˜D$ j‘ø†›#…w¦Ñôú‹$:ç[v?=m§8ñÆÿEiƧ\´"ÓŠˆ(芈Ètc³ÙHv¦ Û†«µ6(½3÷zŽàS?çèý”f:¯ï‡†`8H²3E}tE$îè³*‘81÷þUôøÁáGF‚Éâ¬ÿ銓Ã8Ì‘_H³9À‘ý~æÞ¿J (" º""2ýØl6æýëËÀ•!Ú;ºñ}åg0` ÛXœ›Abb"a»ƒ`ØŽß‚Á€…ï+?íÝ \bÞ¿þ·ªèŠHÜQב8 ºÉÙwQóŸpþÿÌùú}/ù°‚CXÁ V0€ápD. 8fÍ"Í&ænü1L]QБévf"óþÍ¿#ÿÿó¤§QÀ]™1WáUDD}tEDDDDAWDDDDDAWDDDDDAWDDDDDAWDDDDDAWDDDDtEDDDDtEDDDDtEDDDDtEDDDDtEDDDDtEDDDDAWDDDDDAWDDDDDAWDDDDDAWDDDDä›rø|¾i÷¤ÂáðuÃÑÛ¢×C¡ÐÈÿØ‹eY#ÿ-Ë" j-‹ˆˆˆL‘†††0 Ã0°Ûí#ÿc/6›mä¿Íf¸æzÔèá) ºN§sFÝhÀ/äÆÝ`0ˆišÚ"EDDD¦Hrr2@‡ÃqMÐ/ìFï­ºêº """"qIAWDDDDtEDDDDtEDDDDtEDDDDtEDDDDtEDDDDAWDDDDDAWDDDDd:sÜ yá­iÝø“››«5-"""¢ ;¶`×ì< æ±‡È™p*?'›ñe—² Í1‰ybç¨ylõ$æ-""""·Ü•.Ž;É…îË Ú’H»kËÿf鳦ÏS¼I}téð4ÒÜki#‰;ƒœùðCZ.§R¼¼šÕ+Š™íuó/GΘFÏR_F‘¯ÇwÖËÉ­ø ït‘ž½€ûïÏ#ÔqœŽÁéó4Çí(àï9IC}#í½LW>KK­qîÄÂ$5¿Œªª%d%^âèoÞÁãêvðVÇ:[•…5îøÑ9ZøZóž»…®ûu÷û{šùë_>ãÜ—ƒà ̙[ÊŠ¥¸ÃÓ^nýˆ#žsô ±'§“¿ø>ºÔBDDDdªY¡ Iwd’“tõ6sv ³è'šÌ‚\:Ý@½»•‹WBÎlJ*«Y>7yøîþ³|X„¯+)“Âò**¤ ×ó|X×@‹×GÀL%¯dUsIf¸;쮺$*—Zx[Ʃ蜥noI¥T×ÖRUdá©o'ͺÁ.ŽìkÀë,£ºvµ5e¤zÝlì!HK6n¤ÌiYý?\•…ã†ãGÚ©wRXUKmMÎn7{œf òxíÿ+_8Sµ¦–5«1§«‘÷=_bÖ—Gù࣠$-cUõJîM÷Óúñgt|¥­QDDDdŠ\Œ9%¬¬ZÂÕšb€Î“m|•>©>ºÁ7êÛ1K«©]·†ÊìAšÖsÞ?œûï=H«QJõºGX³ÔIGý^êÏû‡ïÛs€f«ÊÚG¨­Ì#Ðt€=‡»F2¥åk¢Î=Há²Ú±+ºý­n:Œ"ÖÕ,!ËäTSÝ·‹½-#™¼¥U”-ˆT\]­öù"½2FæjLnüÈ8E5Õ,Êrg’™äc×ÞFš.- |¶IÞ½P|w !Âá4ì9ÇùÓW‘é¯\æŠábɼ\2,\Î$æøH´CðR‹¶H‘)rñ dÅ–J‡ú8ûñ‡||>ļª%d“˜É`ƒF&ËŠæ‘3Û®Tœ…>œø;Ü´XùÔT/bn"UIu_M¾~o#-lªj*˜Ÿ NÕÍÎÝË"3’) ««Y”ã+èñy}™ËH¹×+ß…ÍŒŽ4æ—tyOsÜÛ·»ƒoòÇY˜ÉŒo¸(¼ú€8\ù¸Œz}AHM£°ØN—·…Þ.¼Ý¸ðEæF&M¿‡ù³Ò°w/wdgsgn9Y˜á ÁË_j‹™"—‡éZz¥û8îZè±e±põ –f'MjŽÌ2Jœû8¸ó×dÍ›G~a!…ù9¤8‚ôxû°œå¸Fº·&’³üar€KGû°œ¥d&_Wrf>N«…ÞA"A×E~¤ÔüÍ:±œçƒ½h5ò(**¤dY)%Mû¨ LÑøÃñuø¯1<}ýþD›‘Ëüù,¨XHщÔG§7³¸¯öQîöž§££ƒsÇÓdÝÉÒU÷qgH¤ˆˆˆÈT)Jp¥ã#ê>ý‚„üûy¸|i¦1ù™$æ°üÑÿžÒÎvÎ;Gë‘}¸ò©ÞXMª5)x®côÑuàÌvbu·Ò7Ò6Ho{/Ñ.ºÃeã"jy˜•K07݉°ïdb“ßê¥õêìm¥×r’ítà÷~Æç»yxýV,¾›<×lŒ€E4Ãv~†ûD/ ™wqwÙý<øw«˜g÷òy¯ÇœTm‘""""Sþà³ÏºqÞSÍß•Ï%åk¦Òósøh7fÎ|-_ÍúÍë(1Úñx$e;¡¯Þ˜Úyè7üæƒ.LW*†¯î˜yu·ã3Rq“{iLüY˜Œ?ü¼´ÔÕáª,##Ø…§¡™@^ E)`ïwb.ÒÖÑì ;—Z?¡á|+ý2W¬L úió´âw”3?ÍÆ@çi¼þD2’8\EÚ"EDDD¦H’ümtY³Y<@W§»ÝŽÍfÞLfv³í¼'ŽÑá(æ¾’4ÌQó0è£ÅÝBÀ¬bQ–ƒÁŽ&Ú“Èsš$§–SÈ>êê2©*ËÆèóPß ³6•äÌ2 Í}Ô×}ŒQ^H’¯…# Ý8K!3æ‹q-uu¸ªÊ0V­ZõüuKNáÜ$.ñpôhƒwpïwÓß>À]‹ç“ššEê`;ž?åèÉóôÏ.¥êÞºNå¬YÈÂ,'¶ÁNš9ÈçžÒî¸ÁøÅ³½œìÌåÁ2‹¦#Gøìó^Œ¼ûù»ê"Rì`wf2gàÇÜxšÏãK¾‡‹tŸ:ι„|Šçå‘ìá̉œþü,Þþ²WPši’`$óýï_[¥ˆˆˆÈxoÏ|šiïùŠ/;/pþüyΟ?Ϲsç8×þ%) n^áü_ÿÂÑþJ¤’`³`³Ù°Ùl8æd“nuÓÜØÈñ“ŸÓ~É$E •ùÉØ)ÌÍO¥ï̧|ÚxœÓ^;yËj¨,LÁaOaÞ<WÚÓø©‡“ƒÌ¹§š5Ù$¡¯Ú8~f6ËÊgqúȇضmÛžn ‡¯ŽÞ …F†C¡Ð5˲°,käz0Ä4M^ýum•""""SàÉ'Ÿ$àp80 »ÝŽa#×G.C4|â`ù9˜vû5A7Öèáo#Øuˆ,j{ˆ‡~MDDDD¦\oS' 3¸•?ߥŸ‘)f’}_9SX­UБ1Î;ÇÀÀ@ >¢”i’œœÌ]wÝ…iš·Õ²ß¬¶šéY«ùátEDDn«ÛÔÔDnnn\@ ÀÅ‹ijj¢´´tÌåŠ×e¿mÔGWDD$Î;wŽÜÜ\²²²â*à˜¦9²\çλ­–ýf´•‚®ˆˆˆÌ8ýýý¤§§Çíòedd000p[.ûT¶•‚®ˆˆˆÌ8–eaFÜ.Ÿišãö½÷eŸÊ¶RÐQÐQÐQÐQÐ]]‰oþ ~㶬]IEE«7°uÛÜo“åï÷°cÛV6E–õ†­lÛá¡:<·‹dËÊM¼qA›éè'€EDDd¬”‹ç¥'øÉ{é<úÌ/xvq N»_y™§Ÿîá­?¦$1Žÿ»üxË 4¤?Ìã?ÚJyºŸÎ†ßòÚËO°µç-vü¸„Dm$ º"""2sî1Þx¯‡âgßbÛ†ŒáÛJÊ(/N¤í‘WxóÔS¼X¯Q¯ŸCÛ·Óû#ÞúÕÖ«~åZ* ¶ðÈö—9´õUÖ¦h3™îÔuADDDÆü=>ü±7æ>Ì‹¯¾ÄãÃ鯿y7Û¶¬eeE«ÙôÌxú.òÇ­¬|Æ3}?|z%+Ÿ9<üñ¿‡ÏlaíÊ **Ö²õùÝ4û§Á‚_<Ì Pý£M×U­s~Žøéz2"Ïsüåú±uåvÞÍó[7°²¢‚Õ›¶ñn[ÌB^8ÄKOo`uE+×nåùwÛ®¶×tm]™Ñ‹Ùº>³¿ÜÌÚ-ÛxåÝÃ4_ô)”—S’ø=¼ôôvÜ9óâ«¿âÕ_l¥ÀýK~öZ3~2(ß´˜€{7§¢á¬ßÍo=&•[ÊIá»ü4¯ù*yöÕ·øÕ?>N®{;OüìÜê.ÀþÎ:Ú(`uñ%Û”ÖnÙ@yÆDË}·pŠ×¶¢à©Wصël`?/l?4ôý^|âgì7ÿžõ¯<•Kà [yáp?Lãö™IÔuADDDÆBù¶]¼µr7oïÞÏ{/ü„73§œõ?z–gÖH •O=Ǧ (K(Æ\ùO_ðQ¹‰bß/y÷”Ÿ²²DúÝ»ñ˜+yeq"þæ7x­­œßý1+SJ(~± ÷o㾸–µ·pÑûûñ‘BzÊÄmt£å*xê9¶®Ì xü©Å¼ýËSô°~É{þj~ñâ–á6({–Û¶±£³âöѪ +"""ß.ì–¬ÞÊó«·~.xöóök¯ñöϷГøG^Z]ÀÚM&÷»ìp{pk ÁíƒêÈä•l*~×ö·ñLY.žÝÌÕ¯°8úO£ÇwŠŸümŨÇÌá”[tSpÒFO?\ÿ3?Û: ¤›2ÁòNYLe81ÌÈ|.¸Ûäþˆ«w§PþÌ+”ß }œÚ:tEDDäñ7¿Á¶×à©£_ÆJ$·lϼRIñ–Z¶ïöà_ ÛŸø ûÍJÖox˜M?ݦ·ŸfÛÈù·2¨ÜTÌö7öÓùT9»=‰<üJ1‰@H”|u+fì#›¤äÞÚeOœWI.‡8tªŸ £Êºý‡øùæŸãÿ‡árÏßpùÓÄLçK{þáûǼw¢öQÿ…IQ]¹>ì%©º·Ù}Ê]ëñƒ™’B¿û5Þë_Ï«;^aÛÖ ¬,É!±ßO fìÜÊMwâÝý»q'V³©x8Ö¥ãì9E3—ÜÜáKzÏn¶¿´Ÿž[ý…«ŒJ/‡º—ÞÀ3ê¹\Øÿ6nŠÙP6¹å¿A “^žmuWû0ãǽmž÷`Nçö™ATÑ‘ë¬çG•¯ñó'¶àûÑV.Î%%pÃï¾Æ›g‹ùÑKŤôäâôyØßÐLúâDÚö¿Â u>‹Ûèñ—“›äV²~Þv^Þ~–œ¿‹ÈÉH,ÛÊÖy›yáéçá™Mäöâ—ßäTõ¯È¹åg-Ë`ísÏòÛÍ/ðÄæ6ßú0å9Ðvè·¼ùÛcäüý[¬Ï:'Xþ‰eåy˜§Ù¶m1Ïm-'±íMžßßOÙ«Ì™¨}úµ‰*芈ˆÈ7{¿ØEâk/ñÆ»¿dÛÙ¦“œ²Õ<û«gØT?åùGÆöŸý·Í¯ÿ¿øE ÏoÛÎÏv—³cKËêMóxùåo*ˆù˜¾€­¯¾ /¼ÈK?yŸ™ÎâõÿÀ«Ï”MbÈÝÀ«{rycûKì~åç¼égÎbV?û+žÙù±ˆò –ÑRÎsoüÛŸ™Ÿ=ñ2g1?û*Ï–§)Ó»}fÛ¶mÛÂÓíI…Ãá놣·…B¡‘áP(tÍŲ,,˹ 1M“×_]kZDDn[n·›òòòÛro‡eÿ®·‡'Ÿ|’@ €ÃáÀ0 ìv;†aŒ\½Øl6l6vûpoÙèð5atÔðTR]‰KŸÏ7ížÔ*º±ÕÜñªº±ÕÝ`0¨µ,"""2Eº¦Š;^57¶ª ß}Eב< 0<Æpô¶PÌp82lEþG¯Ç^´=ŠˆˆˆL™Y€1ÆÅ¹D¯Ûb.Ñ.Ñák‚îM|®êº """"qIAWDDDDtEDDDDtEDDDDtEDDäf1 ˲âvù¦iÞ–Ë>•m¥ +"""3NJJ _|ñEÜ.ßÅ‹INN¾-—}*ÛJAWDDDfœ»îº‹®®.:;; q³\@€ÎÎNººº¸ë®»n«e¿mÚýEDDâ›iš”––rîÜ9.^¼7Ï4M’““)--÷ãøx]ö›ÑV º"""2cƒÎÝwß­e—ÛŠº.ˆˆˆˆˆ‚îtðµ~&ÎfÓ™ò@6ùŒu+ÓØ¤ƒ®Õóoÿî0ÞI¡cïç'ié·&9ï¿òöïþ:Éy‹ˆˆˆˆLaÐýz®ÐÑÜÄ©K¡ïèM…íê; UqEDDD¾;1Ì6Ír˜=~Û܆"¯ˆˆˆÈMÈY‘¬5Ý{Ö…À¥ÏùëGM´_ÂLËåÞ¡qî¿‚E©y yàþ…d&ôãùÃ>Ž}üõw¼í­áßÜŸŽ5îøÑ9†ðû„?xÚè´]w ï ~|‚s—® ;˜“[ÌòûŠpÙ,úÏ壓è¹Äžtù%‹X˜¦“JˆˆˆˆÜ´À{£°; ‚ðØÝ+¼ð:f-àÁÕÕå‹äª\Íš%¤v烓—±l6¬¾ÔõbÜ˪,¹#@ëÑt[6žƒˆˆˆˆL]½z•QŸ¤Çt)µM6ß$c–<}ç<|x$è »¶ëSðØ×§GÐç] ɵñ§Ã'iïé¡ãôG¼ßvåjž•Œ9ÔC«÷¾+ýtœþ÷;†°®\f0’UM,_]fphrãÃ-~H“·‡îŽÓ¼øsÙeÍ#12ý}|å÷q¡å#þraËßÏ |´ü„OÛ»éí拾½•Î@"sf%`¤òî¯^Ñ–)"""ò-Ø·p8|}wÔ—ÏlÓ äUË—?Ý­Ž4 sfq©½™£'NsáJ*K*æÑß1ÈÜ’»˜ãÌ ÕcGqôóNú“ðÀ=º>?ÁY3Ÿ’ôdìWº8ÕÔÄ™¡<Í%íã/Hêæd׬*±8ñÙgm¿„‘½„‡VÌÃi[r:sü?zÏ/¾¤"V”8è>ÓÌys.Åss¹Ãú’ÏOæôÙótö'sÏRÊ2LÂ!ƒ+W.sál;÷?°J[¨ˆˆˆÈ7ð›;8ÒÐ@8Æn³a·Û±ÙíØíök‡Gue9+C4 À7ól ¶ÿý'? O·† ‡ÃcÇþ‡Ã„"ÿá¡p˜P(D( …YÖðÿPhx…Øíܽ`7ofÑ’%ÚZEDDD&áøÑ£¼³kŸŸ>M( µ†ÝŽÝ0†ÿÇ^›Ý><Ψª¯‚î$Ãnì%v£!7²¬«Á7x£ï>b.Xd õy8ði˜Š—nÿú÷K\l ôœçtÛyºúð|éÖ3«ˆŠ%sqÆŽ>xž÷ÿÒBòÂû(ÍN"Ô×ÎgŸµc_XEe®9}+8@Oo§ŽµZø L§ç&zͽ_S#y+š¥¢w¤’k#]û!÷VUs‡_gªhƒEðHY<Úo$:l·wDŽáà¨êïèàކêÈõè ¾f}k¿—[ù¢ë$0æRo/aû׿_â„ÍI^áBò€ÐŸ!$$Ø+½½\¹fädî.LåÔ鿲ÿX[B2yEÌŸåãbï4Ú¶ÚpëÁRsz=7ÑkîL~MïËbÑ~´£»D/öQÝF‚l$ÌFljýÁ[Ì|§CaqæVtUÝ °‘áh×…h  Å ‡b¦‰'‘ëc>íï"""2Sß_—wcª¬£Ân´ Âu!7f؈é“;ºÛÂtèŸ 3´¢k³Ù®©²†£ïH¢ÕÜpb»)Øí„B!ìvûÕw2¡áȸáPèšà|M°¾6mk/‘št¯?Çml ¦£*¶#_4‹dcæ[ÙµÝ⪮cæ¬ÛÈé,F*­£G9¦Á£ÓØív…® »¡6»}¤/‘y^SÕ½&ß*àŠˆˆH¼äÝQwtåuTÛëBîèªí辸£º-ŒWÍUÐh%ªêFßQØ#¡Ö µ±a7cƒ‘. ¶QÝ ˆ­äŽ®‹ˆˆˆÌä{m˜û×͸¾ CôúHÈ ¿×tM`úTsgtÐ]Iц GW`¤òkB±a7Zµt]`Œ¾¾£C®º.ˆˆˆH|¤Ü1~ž7&ìŽî[˨ ;Rå=W.1}|Ǩæ*莻.l×uÝ}atUwd%FC.Ã?ýŽVrcNG Ʊ•ÜðHž©ä*ÜŠˆˆHÜeÞ1ºDƒïýuÇ:]Ø5_>cìjîº-|_G¼­,ÂaˆVq°ÍF( ÁöèÏ ãjÀUÈ…Ýë*´Ñ.¡±ýxGN)rGÿ$ð4ᘉ+etU7ùB™mtØY{¤¢‡‡«»‘qÆê®0Ö—ÑÔeADDDâ(á^½¾æ?×~1m¬sìŽyú°qª¸·2ü:¦÷z°Ý°ª:º CxtØ ‡£—˜³+Œœi!&Ȫš+"""·Wæ½¾ª;ÖY¬Æ µã O&Ü~WáwÆžG7Dov¹z6bϰiÜØÐ{]Ð}@…^‰Ÿt{õê BïxÝFî‡ C®Î£{ÂîèŽY±¶Øî Ñp<’gÇ´ªîŠˆˆHüä\Û o³;è€;^¸N!wFÝu_/ìŽ„ÞØqU¥†Þè ‹vg¸šnÇ|ç#"""G©÷j¸=“¼eËHõÔѽl#kJö²¯¡‘®¼•d9 xé õGhí`f±¬4Àwk6.'ýºÀxÏ»Ÿ£¿ÝEsþF~P‘Á>ܵ‡&£Œ?¨ =îbOG›k“Fª>“›f5™G©óU²ù{ó#ož†»5f?Âæåé1Ç‘±K_÷8v£ý ÿYÞÛÙHau!n}ZXIÍRðÔ¡µ{#µˆÊ5«˜Ÿ2‰ãÔÀi~¿Ë3ÜuÁŒÌ»¦„ÞF­Ý>ŒÔB–ÕTéSÐo(o¸?öŸåÃú#´x}XI™–WQ¹ ò©Ç·xÍ8g8H-«ec‰E ý {›âc¹‚VgfùΘ÷sÎT’è#`MŸåûËhg©ÛÛ@GR)ÕµµTYxêÛ¯>ñ`Gö5àu–Q]»ŽÚš2R½n6ö$%7Ræ4Ȭ~Œ®ÊÂqÃñ#íÔ»)¬ª¥¶¦ g·›½N30áãA°ÇÍúvÌÒjj×­¡2{¦ƒõœ÷¿Èž<°Æ@•µ°nMNo{žžw¼íæß¶-¬>ë=P´ŒeENé<´zï½~zZil$µ(›™þµ#5T|x}Á ¶±d²K2±¼ÍôF7X¿—ænƒ¼Òl§z vqxÏš­B*k¡¶2@ÓöîÙ_,_uîA —ÕR[SJR÷‘kïÆ÷k;˜±û›¿wS€Âª¥d9`àìŸÙS×MvåF¶REÞ` ‘ñ'sœ‹eõÒØÐNêÒ5lÜXC­Ô7´ãWZ½9ûc°‹Ã{Òj”R½îÖ,uÒQ¿—úóþ)xÍx_w$§––FªÓŒ›år¤Wð½õÃo¤#FÎ{Zð™™d&MŸåó­c«›£ˆu5K† §šê¾]ìm©1·´Š’¢‘Šª £ÕÃ>_`TØ˜Üø‘qŠjªY”å²ÈLò±ko#M—Páœ`úÁ>L–Íþ†+g¡§Á}ÙTo®`n"@:®ê>vímÂ;0?òñ`ù6ma WÖÍÒ5¬^”r]øú`ç^Z@j)ëJâàÃ~ÃÄÀ"`Yn£Éy%¸nZzƒde9ð{›é6òX“é˜òmÌïm¤%MUMôãëtj¬nv6xè^ö™‘ý¥°ºšE9×î/­ýó)™èþ€¶ƒ™º¿ù»›ñšùÔf&B°w}©•›Y’“<¼ g›¸­B²“ ‹T#À`ÚÝ´RÄšêEÃ_Âʪ¢Ê»“Ýc|nü¼óó³1›[éõ/ÀìmÇçÌ';ॽ/È£—VŸIva*úF>8Lä4‰®òŒ4wû™77‘öfz…T§;è?>ÑqéëÇ&ÚÏr"ǰ¼e˘Ÿž饔¤6Ó”]Eù¼t¤RZx„ÖÞA,À1©ãܵR—V±dn2FÙÒLšÜ½ 2}k`ê÷G‡›+ŸšêEÃÛuV%Õ}u4ùßþ57p“sÆLX.§RßjQXS~oýr9Æ*%û¼>ŒÌe¤:®öppå»0¢/(Ž4æ—tyOsÜÛ·»ƒoòÇ+Mb|ÃEáÕÄáÊÇe´Ðë BÚ§wd–QâÜÇÁ¿&3?ŸüÂB ósHqÀ@o7ƒ^ìøÕ¨'å¤7@ÜÝoÕIÃÕ—ìì1ÞŠ9\,{d#¥}^šŽ4°ï ‹Íß[0³ûfZ, ’ câm49W=­},ËrÒÝÜ‘¿†L¦xìíÃr–’3]rf>N«…ÞA";±‹|×õûK‡/H‰qãû }Úfêþfõú ©§‚]-´\TæG[ßÂ×À™Ÿ7\ýµ$‰LÓÂ×Ò‡•ZÆÕM"W~*Œt'Üž]…dÒ@kŸŸ¤Ž>̼JJ|¸Ûûðíô‘IYªƒØ>-ŽÉNãȤ$Ûà`s7þ¹.Ú›ûpV“FΉŽK_ó86Ñ~–cF©ÎÄ‘ÂA’+iäÀiÆ×;Î]#‰Ì˜o¦ÆÕÒLõþ¤ÇÛ‡å,Ç•xuÈYþ09À¥£ßî5wÂ×Ôäø^®Î©;èÁK6eµÕTLò”/ßÕrýÿ C=ÓiªÜ¥IEND®B`‚glewlwyd-1.3.1/screenshots/g_2_user_details.png000066400000000000000000005036071322667720100216530ustar00rootroot00000000000000‰PNG  IHDRlÐ@çY pHYs  šœtIMEá$ö}ƒ“ IDATxÚìÝ}P›çïÿ/OÉÆ–âXJäœTÔY”t£ü²…¶4g…gœË3)¤;–»;¦3 žnðîðþÖxçΜÚ>À™Y<{j<¿¶335œNÐÌ6Ð6(ÍXí&Ð8¨Y[ÄäÄ’#Ù á÷‡xHØØŽí÷ëŸ é~¼îûv{ú½®+cvvV,/“&VFˆ¤@ˆ¤@ˆ¤@ˆ¤@ˆ¤@ˆ¤@ˆ¤@ˆ¤@ˆ¤@ˆ¤@ˆ¤@ˆ¤@ˆ¤@ˆ¤@ˆ¤@ˆ¤Mð éÿOÛþþ'—®ÒÀržØ²ñpõŸ=·M“þ*³³³4†ß^|ïGý™ÊuÙŠŒ úŸIÌÎÎÌNGfÂ7~üƒŠôs4'ÿtú79¹™9¹$hÀr2223sr3rrÿéôoÒ_‹' €ÇÅϯf)òh ¥,EÞÅÏWÑë™ €KFm¬ù“Bˆ¤@ˆ¤@ˆ¤@ˆ¤@ˆ¤@ˆ¤@ˆ°zÙêÆÿ¶ãÍòîíA˜_ØV©%Þ¹+mM€‡œjkaË«ÆÒY""r¹þË)ùÕ¯lõö4ú2¸²äŧÌûü3\Ä; <ܲÕû^}2ÒÿëÒá‰ÈÜ—yåÏÌ_Q6ýËûŽqÚtç;eQîõÞ?ÌKÐÔº–ï?k)XåöTÚ×ÿºìí#;Îþã7ß°h5ñ¯Ú-‡j_zçÈŸ¿Uû´Åôì[¾jÌNoÝ‚­o6—îRÅѼPúNÝVäï9ð-ÛÆ,ÓwþëÛÖ .ãF%€D¦E²7ýÇÊsþ Öµ|_$ýz´ì uÏW^=ø_}ÕcuÖçOç:wž¹ÉÞÔøý¯•\8wà_Æe듇¬jCžt×M¾§ë§~ô+õJÍýƒ{‡#\Á;J4€¨LuN²¯Õº–ï?[¦JkªmOUæ^9|Úí¸t tàgãÚçž4e‹f»Ñ"Ÿüé˜óâ5çÐðá?Ü\Zڴܺ˚Žþ¢Ý•›ƒ&He&ÍZ/N¥ÿl8>AàâgÞœ|£*SgÌW^þl4{M»?¼žöº4þ—!@ÔLp*Ù×A_Cû°óK3M§";Sɵºë @Ù"“W4¿û;[Ûqøy³D´÷ÓNоP¸àQ“jÌÑl}T?uÝšñŸíeîš‘lãÓù"WÒ[WD%’“©Œ¥8Ù†my\¯» <䣓ùU_És/™ 3U‚¦Ø¢.Þ:71fðjpìÂÇä ‡^5†¾@Ác ¯x‡Þž–È9wÿ_>äÕ/ÿr\¶>Ù¸-+>¢ÙœÐ2ëÊä„wJUýòcîÁqyò©ÆmYŸå (YêùšÜkI®ã•1;;K+ð`xvÿ鵆vX-ÕÖ–W¥³DDärý!—SÔÕ¯<æíÿhÙ-[ÝxàVõ‚ï¼ý¿ÚùËëR°ùuëöª'óÔ®÷~ßäðDDD±eë¡ÝÆ ]¦×ýñ±sº–}5G/Œ-Úì2ëêL¦£¯ßÝ~1 ™Å–ÚÊ ‚¿yg÷™ 3t®ÖT0ðþ¯¥¹0!B´/¯må¶çï®DD2Qvr빊ŽK!ZæÞYUˆÆÄwA^õî?m|aƒ.WQø•§_Èyï Ú}„1Ñî¼ñ‹~’ßü—/ô¾’~1ðó÷ZGÿËûÉ-†hþá~‡cÐév{PDDD¡Pi &“Ù\f©,7iWšj5<ÜR±·'$"ºº7{m†/_³|ù0Õ ŒÛùZw@Dt{Þì­¿ûG]ƒŽ>‡sÔðùQ¨4:½¡Èl±XÊJV¾ÔË·ïν=øŸ÷¶‘=mU»OùDDS}úLCÑ—r’à°×Õgïr x|‹¸KeUy‘šËàËÏwî£ÚsÑ÷©U‡hAWWkK»clIV‰„|n§Ïítt·‹®¬®¹ÑfÖÒÀ÷3ÿ°ýxó±¥×: Œ¹cn—£»Uteu Õ¥úÕdOa·Ý˜ÿˆ}Àc»£Ê…OÆè€£¯·w(s)T:£É\nµYË ·‘q‡»š›ŽúVxàŽ«Šw5¶4Tè•Ü´Ü!«-8t¬¦¢öx’m1ß`{펚c® -|Ÿò4[wìmM}­}ƒíûwîl°{Âio;ì¶,ìôí³÷zîèéxºÚÚÚÚÚ:{WqœéŸ§·ÙúÒkZ»GÆb…b"‘oÄÙ×~`÷KÖæþ[Ü­··¾jo’m‘ÐHÏÁ÷H¯ýD3zƺëßì¨Òs°öÒ¬D {ºêk šÂ¸ëÈé·{;šmU¥¦"ƒV«Öê‹Ì¥U¶æÎþ·OÚU_Ï×ÓÐ:DyÌ}%8ÔZ;— iJö¼q¦¿ëXSM…ÙdÐkÕj­ÞPd.·6ëì«ãõ2]|=÷©Ú¦^÷Òˆ}(¶uÝ®:³"v§8zGÃ÷ak…‡ÕÎ%h…–×ßxóí³g‡†Îž}ûÌé£{̪Ø/‘‘ãõí«;C¯½µ;^‚V\wòíÞcõ&ƒ^ â”Z}‘©ÜÚÔvæÌKlòêˆëØ17B´°§»áøH¬²FUr¨ëdSŲ㯫‹ªšºN×c†­÷e:òò47õÅk w½qº­~ùñδæšc]'÷įuÄyø€Ý›êféŠ×¡é¬5•Õ‰­¯ÏsÿÝ'Þ¾cñùæÆ7»ZjJã㟩õEåõý§_/Ž-ëënuøÓß´ÇawÇ>šµ-[ã§ÔWꨋåÖ¡ÁSôér2;K;)ÍÎÎdee¥¿|:!šßÑÚ/B+ÜÓq4uw8e‘íhc";°Ÿ!E»?„‡O´Æ".EÙ‘Ž¦Ò”sC¨Mõ•±R(9ÖÚ¿bPtu9cqlaµÅ 5[ͱ_Žû/Eó;íñ*´âÆ#Ö$†²¨¦%ñ(Œt¦¢=ñ‡Î\]¾òeP*÷Å›q¸×ÍÓ<Ô4òoF&h ¥™ÈäFu^ú˧-<Ú}Âû¬ÛÓ²¯(½aô•õ•mµ}! õºÃfÓê¢ ûG].·/ŠZ§7ŒÆ"=ã«-ô¸††=¾@PÁXZZt-ähW¡)JZ+Òœ]Umnh©ˆ^숳½ÏS±ìL›ÁáîD†f-׋ˆÙj§K$š¢Õ})f˜ {‡.·7Œ¨5ƒÁ`4%›`3ìðÄ>š«K–k-½¥º¸õàˆˆˆgh,lÕ¦u†Ao¼¢L¥Ó(R-­-*щË'"‘€?(¢¼SÏTÐ34ärû‚jS¥uífßýrpŸúáÞo~ïGý3’‘¡PfddÒ ÀR³³3³‘ðìÔä÷V¤¿VÊ-ì±÷Åf2×U§q(‹m {ÃAQId…÷úd/Å£½m­í=‰9 âTÅ•ûê÷YÍó;‡ê+öG“óÑ·;Ê¿|{:«v·ÇN¡ðõ3öšÅ¯ûk_:Í “nàŽìÅØkÝy|LDÄØx¦ËºÌ`ðáá–{£ýÍGÞêXjù]­ÍíK&nÔ•½ÞÒ\c¼•[Èë8áŠ%\ºêº’U„jó¾}…}ÑóñuÛG«’ß(AWw|Æšr}tÕj³¸b)šÝS×”|ÍðPí7ö»DDÌo¼ÓQºÌ2õߨï)>òvg…Z$ìiÛ½ûÔü&rÜñüA]Ý›½I³>ïᦦî‘EShÌÕ¯7ÖU,¬5 x¼ñö*.Z¾¹£FF" øWù$ˆHÈã Jª Zgi>jŠˆ¨êÛ~¦bí9zlçkÝ•åd‹Iéh®oê‹Îתª4›†÷ÖDoùØïËš¿·fÇa·ˆˆ¢ähÛÂGgͪҬUòßx¸=·MóãTüýÉ__ ~1}ó& ,•••µQ÷ýÏmÓ¤¿VªL:ìs8ãµIeûÊWSä¡4TÕ7555555XM«(+ {zë«^;¼ô½ZDB#}ÇkwÖ¶ Ï÷Im¬ŒGF£Ž¥ý£s!ʘcxɈQa÷àp죱²x¹]ë½èË­±a¬Üvçr㈅ÝvG´%Õó{V†G;m;k—&h"â<¾·ªÁXýäwõ%zíÚ¬«¬Ó[öÅ;-œ¾ä ]öxš±º,ªÍ»=:í÷¶/bÄÓeÛ½I‚&"W÷Áݵ] ®|8è‹OÁ©1®ôÐ…BñûA™öƒ 6èãõg#ÇŽ¤êªÔ›Ë£’äN«~¦–6LÄ?д÷@,«ŠÝ$åÖØ¬¡¡®›ßÙÛMQR½`¦Þ;rT¢2D2h`MT•hÁáD b´ïB‰‡¿¿Év817¤ÊXRZl,6¨=#®‘!§;úýÈ©½¶ÈÉ®†Xí‹ÖTe”·ˆ„†|b2,ˆÆîyºîp…Y¹àM~ ^UX¹BW°µÞ‹¾ÜZxüø˜ˆ¸íN¿ÕšdÏá‘îØü ãÿ½í#‰à@S\Vf64âp8F"¡ÁëmùðX¢o¢®Ü¬_íêZ“¥PF¢µh£A[’îAW·3ö±x^ïGu鮹Z´^wƒÉ´f÷™RUZ]ñIØ;ÐMUæÊ*£ZD¡3-‰½Í{}cUq¥ÍZnÒ«ƒþÑ¡žS=®XÊ3r¼Ùa鬊¹²¨áÍwêbŸ—?æ°»?QàW’v/EµÉjV8£™cÈq`§gWc£ÍbÒ+ïÊ3µø¼½[Á¬B¥ÑÔb(·¶·‰HÈÙë'¿nþÁx†¦²Øæghwꨀ‡Þo/¾÷£þL庌¼õ9tç’™ ܘüÞúüƒU£¥ÑÂ>—7¬ÝùTÿáñíÆ]-GÊ¡MžþÖ†ƒÑj©±îÇ,gš¢/×z³E'nŸˆøœ.o½a^ö ŒÌ/S‰Œ xÂæùUV‘¡@ü KWŠŽÖz/‹R´ª%)ZxÄ>m UyÍ\üàï?|8^Ï¥(ÞÓv´~.ú³54ºÚêëOD"«.Î Œzâ[5–êVí4&³FÆ"">—7¼tþVÿPw|p½â#ˆ©Í‰-ä°¯iЦ5×4˜EÂ.oß /""ú]u ËŽõ拈¢¤±ëèÜæòŠ[CÍÁèm9bw«*æ¥2å¡Î›ÀSg)7¤}èê’†:ãîã±*âî9¼·ç°ÊXb±XÊKJÌEéöZ¼µgj³õx$"Rhy½¡Î:o¶VKU,E özLIªýƒñ9F5–êy)ü<*à!÷÷'©\—™“KSËÉÈÈÌR®»)ò÷'ýïÿüJšk¥È¤#O¼TD£ÓÜéSv·Çâ!]uÇɦò…ïÅJCEs×ÉêX¾èiOôqÓ•”ÇÎíp/èÿ•¯T±C ;ÝŽXFM‰eåèh­÷2¯Gg·siw½ «k ž¡U'ZÂÓw"¡ivµµÕ/*žS›ëÛÚ*oáR…îø!kLš[$”sµ]_’z~W"C3W/œõSkÞï ¸§=:5•m-K&ÙÔW46$úªºWÕQ68ÔRÛ›ÀSQÒPmXMƒj:N¿nVÍÿ.ävö´ÞÿÚŽo”VÙZ:{‡Fýá;òL-üw "¢«îèl©Y˜Ué-ñ[80˜tnUo"CÓUÖ̵ë=*à!¸v=3›ÿ ¤–©È®b*Û!Z8˜(hR«—ï èµ[Ÿ_QEËhêd$ìî¶GûŽª,û’W#)MûËbâê Æ_º-ñ¬aÔ1?ƒI„WÆ}ûJ¢«-ÀÂnÇhô“Ê\aP¦5Öx/ ÆE[ÌÍc¹ „ÇÓkÅq*Ë¡zs²â@µ¹®±dÕ½9%’¸ÖjêVî=¥:q4Á¥…p~gw"Lª.]tÜZsõ—"E3îÛ—¼Ió:¦{t~W[mÕþžXwh]åÑ–òÕN©.ªéè=}dŸäŠD|#ƒñ<ÍZÌîò†×ô™ZDUÙ\—¤iænáÀ€Ã·ä¼Îx†Vh­š—¡Ýá£n³³³’Áxh@j™«š|#UïèD¢¸óÇîpÅ*¯J­Ë¿«Í5ñ„È3”†JsôËk`®"&숆Wºs‰ÅýrÁ¼¾¡áXŸ2SeÊ!ßÖ|/sÄÈâmnKe^i”?1FÆR½l#iÍÕ%Š»~ï)æíréÌ sš9É/HѺGîQŠVXY’¼C¯R©XM{†ýC U;jOÅnhQ•éh.½µ´G]TQßÒ5ðΙ“G÷T–$™Á 2æìn­ÝùRͱ!ÿÚ=S ¨,Öâ¤ÇÜ-ìsô.žOb.C3ÖÄŒ»rT¬½!šRÏ"ÁàžÏ?ꊽ„ëK Wx5VêÌñ~^c‰ÙÕ&‹)öå+ÑáÎ犾¬«L¥½)Ö24<7‘¦ßϤL•iÌ ºæ{™Ÿ¢¹æ Á¡îDw·ye†Çâ3y*Œå+„~jã*ߊQ$J Ã[ºÔ‘`"èP..[ôΛ¢1YKkÍÖDŠ6d¿7)š¢¨è¶»,‡½mõ;w쟛9USòúÉÞcúÛܰRo*·Ö7·uõŸ}ç­ÓoªÛµ8O‹¸»÷ï®·ÏïUy[ÏÔ|E¥Ë•iÎOÑ3SÄ.z"C+NÌÅz—Ž €5—bb…V£ˆ•£ùF’ {¶v½S¹ôëˆÏnÛ}|,ÍC %ÒrÞñüátV Â"ÑDFm®4ŠË-"cƒÃÁ½ZDü£± ËPfTŠÂlVI_HÄçö×´"‰Oªi´¤Õ+lÍ÷27»ÀH·Ë_ò~n þÂêù%<‘` VÛ¤1¯8 ”Ú`P‰;´Š;A©1hDB"">·/,«e*ìMŒ§*\tšsqŠD÷¿ô|Š;aÈ>6›ïz>¢V©nkýà°½¹©up®KU¼«±¹¡b­“¥¶¨´ª¨´ÊÖ$ÁÑ^{牞‘Ø¥9[N˜»êc»¼½gjŽJ£Y¶O_^c<Þê_ï€×fÓ/½èæóHÜ•£`­¥ªDKÔ‚HÀå®°`2jYEIS8ì]uýS8<·ŠÖ\«ˆŽ X‹…W…“ZDi°˜¢ïܞ؀e‰~˜RXY’ÞpUk¾—yµh=‰Z´¹¾Æšrý‚Ž_µzåÀG¡Zmr£6êc‘DdxÈ·ú[)èŽ×‰Þ¤[°wï@—{5› tÝ“Z´[»ÂÞ¡c¶Š½s š®¬î3ýMw¶VJ]T^ÓÔÙÿæ!K¢*m¬»-Þx·ûLÍ5ÌJi•¾ÄjŒíºwÀ»ô¢+JÎ#qwŽ €5–¢M4&“JÆB""nÇH°ª|5ã:…žÕLe˜HTÅeætúÕ) †yoÑs©FÆ"‘‘OØ\$ž‘Hô‡è¨ðj£Å N·HdØá —𔉡™tå¥éö¶[ó½ÌÕ¢¹z\ÁŠ µˆ0ž¡-ì'¢TªWJæ‰DV›B©åÑñ9]±*ºôGžØG]‰iÁºÞû\9¢b…ÑÅ"ñù"Î.WÐ\zŸ í¬ÝÛ>¿ …–ÆæF«é¶>8:4ä Š(Õsi‘:åƒPu¨#0º»}LD$2ÒÃõßæ3•}‰Õ(­n³;½5Vý‚‹®(±-®¿¼+GÀÚJ¢)UfEß`DDÄÙ9à/¯J?Z {úGÒ/9Qª5*‘€ˆ(Lõ-ÇVß™Oi°”¨ºûBÑËŠd$:l™ÂX«Òš,:qûDBÃ.Ÿ˜TñAúU%åº{·—E)Z¹Ú;¸L78…Zë^ðVêr9×ï3}Ú’ÊB‰ö¾uwv{¬õ†U¬ìèŒ â&šrË‚õ8š±ñL—uù¼Òo¯ÙÑê‰8íÃÁÒU¦h‘Hð® Og}k,AÓU}³c 4Qjô±‡.âMó¤æO ÿxÛÏTš´eÕ± çŽN‘ÈÐ4–ê%·ýÝ:*HCv¾Åúõ·ì8{äåÓÖÇ “Öeo:Ú¼ãì‘,¹ ¾Vm7¿sdÇÙ¿ÖÞ¾3ší¦7›w¼ýê&…jëéæoî*Qm9ÝüÍ=\Å»$eˆ&J“mO,ãß©¦iÆháÑÎÇªŠ¡ÔÆ²Ø~Ü× ïÖþ¡c õõõõõ ‹ŽEi¬2Å·02<0,""ºs"Ö˜°ÌívDP˜+«)†Yû½Ì¥hÃö¡aG¢\õÒÉ4&Sl,´±®yãO-æs ÜJž¤µÔWÆ6ljH3á;ÐÛŸÂ\Wm˜ÿ£§×'ÌX]–"aZ¢u'OÑ‘eÊ3<Ü=Ác'b aqcGs¹vÍþi4Åû/ŽuÛ=i]3¾œ®8^¢xûÏTºwNÉ\Šæô‡š®²féd$wí¨ •ló+/´ß¼dkz¼çŒ酕(Ê^È÷~ði²âƒ±îŸñ}îžÊ+ÙÝQØu>V§Ñ©”㟠ÇïÀÅϼ9ùÆT½üÔºmÞ#mÿGvœ=²cèûOhEiÌå"¯±Õö‘UêËë;Êmž!‡½¯wÈåñBÑ÷^…Jg0•X*«*ËMÚ¹×^½¥ù¨Æ+jÃü~~JSSÿ; ÑÉÞõåM]o× Øí½Ž—ÛŠˆ¨4…£Áh¶X­E+¾›+‹÷4îѸ#"¢0XLK—Õ–Ô½¾Ç鋈(4ƪä¹Kª#\›½,z|{*¬^f(©ñJͱ3–á>{ßÀ°Ç†•j½Ád®´V[Ìz¥ˆ4œy§nùHëZ—ÚŽõV{‡zçˆ'¿ØÑ«m.)/·XÊ—½JSóÀÙæ[ c¬]g­É6Xdmë/suµw:†Ýž±@HD¡)4•TíªŽÞa£íõ×½"¢7)¯Úpò Mk{·ÓˆÞNÆøkb¨ó}±k½\[%[F[Õu¶êŽ?¡J}©­­ßêp8®a/4—4©tÆ"SqIÙ¢§nž)¥ÞR÷º.("j“>»H[Z׸Çá‰ÝôæÔóuÜ•£€¤yH‰å‰X‚º üÏæ0¦´~{sÛÿ¹´´Š+âûÔ•ý¬U—ݹýQõÅßOʼ·÷™Ñ÷®È«ió¬Úˆýß®§:€™¹Tfj&0=s[g“#ü¤þ_/xæb½›Áq®òZß4·´–ÚPjm(µ6¤ó^m*¯0%yNí( å5 å5 «?8eQU}Ñʯú5õ¥©7³ò®Ñ^æx]±q­Œ5åéu3TjM6S…íÖÎ ÝæÔ›*jL5_–;Vk®i6×,w¬å55Ë_Û±RÛ-·ÔÚ´æ­RJ«l¥U‰Ã‹¬þpVýL©MU5¦U¦ÉZoúÒ,•_¾B×+Ý#†ìK#K{PN÷\È<ò‚6°5ÛÝ?¾(e ]¼8œý쾊Ãø'ŽäSô©Ëu™ƒfDD¡Ûb̉t_]œ|¡pÁ£&Õ˜/$"¢Ùú¨~êº;U¯Ì /T¯×LN8C""Š­Æ£/†ýt,4Í•^K™4Á—BØc}µÂpì@Xp{r4yËÿ˜—·Lßš™Ñ÷®(Ÿû[AÐ~aI@59n¿i~:Ï÷Þ%ß2;­zõÙê¯l(Þ^ØòÚêó£}K²¶Ð… ŽÉM‡^5–mU›¾zô•ïÐÇé²°ÈÅó— šÿÆTù• f“ñèkOƒã>´µÆ”§_ á‘N{ì 3W—0!wÔTpBd¹m"¼Ü Ø¡‹‡§-õ}âš\úã´ë½kbTØ?œXfŸ—[~1mµ–4¨§<ž«µ_J2]Ýô•ÃÿòÛ u{ó÷ŸTOL¸†Îîu¤3¦÷õSÿúžXŸn°•¨§ÂÿýÚŸ_‹p‘×ZÆìì,­p=ž J£ˆ¸5µFç±TYÞèm)UÓ6€[òìþÓ9j í’îOÿôäîG“•±„Þ|÷Àï&na›…–2»ñ|UûÅ¥•hŠ­ÏöïÉ<ð?R̳‰»l*xÿ×Ò\˜J´{Ç?дû°{áãfÛG‚ÀçûÝïvüní6—›oÞ¶y_iÞðÏ>óѸ(B´/UÙ¡6›và>£((<ô]]äƒß7 ÓòEˆvï( %ÅÏH "ªB³¥¦nŸÕÄhhÜ"—>ÜyðÕ¸øþKÿvº¿¢Ý;jS}g=íð¥—I+#DR DR DàÁ2;Kkþ¤¢ðàØºyãÌt˜vRº™ØºycúË¢ðਯ|v&|c&Ic!MÛ r·äí*, )Àƒ!cvvv…Ÿ›\Ÿ~ŠÐL¸O¨-æÇhðX©;§Ýs• ·ì“PÄî¹J;€ÀJ!š+pƒÂí 0x0¬¢Q††ÛôÑ5B4ð `vN B4 B4 B4 …ìÛ\½âÿÙúWëDfBG~}ùÜlüë å¾Rý‹Ù"“ãÿ›«¾É©ü³Ç¿“+ºü·®ÐµÅÞ†Usé#O‰ˆÌ¼ÿÁÅ^Yqé̯ÿiaÝú49åY¬ñò6¬ß¡ÍΙ‰ü»'䛽ÅöX“<„²àsÓj×?û˜¹ýñÜuWoܸ_O%cݦõUçˆLžû$ä»y7ð0z€C´lóãÊÄŠMë·gÝpÝÁähúÝ}ŸdgLE"×îÈò¸gî^ˆ¶aãÆ½†üíësòåæåñë½ç¯þ"8“æº99yO¼X Ð+2¯O†?þÛÇÁÿ\9ËËß±NDä²rƒ6W!y;6eº./Øãº ö=©~f}ÎÔä¤ë“ñç—‘û·ßÔ•dÊõÏ/ýh\õ]úBŬwüz¯ûÊ»’¿÷«æõ9ùÓSç.]éøÏ~‘ì¯?­›ëž™¡ØûõÇ^VˆŒÞäU¾úDþvU¶D®O'? ßXº¼ˆdd?£ß¸ëñ¼'r³rs<~÷“«=—#7$ëÛæ'¾§ŠVîß}s›×}ñ.eÆ·ÿÙÎg÷éÏL~^ûþÄTFŽÙ°q×–ÜBE–ÈÌõáwÿxõ§¾pòø¦S´íÜY,Ü Ï xȬQˆ–™ý_6åå$ªÌœGÌXñÄV]Ë“‰º°¬G Öï¹uÛG¼ÿ;º6l݆MÍ_Û ÿ™Ÿ«Ü¾EyxsþÏ~ö‹‰eGöÒmQ?""î9õ™]I¶lë Ö×>Ÿ÷jfNA¬ñr¶?þè?Dþø—•Öoj.ÈVD?+”%OmYùã//=ëÌg¾ªû‡Í‰Ë‘U Z·ãéuÛÏÚ|qÚ?~cL±®P!"3Þ/&?˜œ™›"Wõw_Ë/Ì™‘¬¯?­«Óf%¶™¿.ïecÞS™<øéÍdI»mìࡳV•h¹ß)Þ²ìJuí“J¿ôY³ûÆ5EÞ«ÏlÙ±.»ä«›~ñîås+ÇhŠ]OGSžÈ/?ô÷ŒÏ<²yãß>•_™÷½¯æ»~·ÌüŠ—·äˆˆ|ñÅaÿ•›%›³dýúgr®ÿ*šweåíýj~¾ˆÌL¾õÑ•_Nf¿ø”vÇú¤s•Þ<ûñåÞPfÉ“Úë3%3§ úñG_øªï~u½^D¿%O{qÊ¿Üñgfû¼—ziJTöó $óÙ'ò6\^rØ9ë^Ýœ-"×?ÿüÈÇײ_7>úW™…†Û½Ÿ}ðŸŸ_žyì‡OäˆD~úÁg®›"‰†Ï/œ¿ïøÇ§%Oõª6KD._ú¼ý“Ék™ÊªâG_ΕÂÇ×é>½–l#i·íü½<|îFwNí&u¡ˆH¸çü ÿ¬Hxâ§îëßþZ¾";ïÛªŒs+ –³Nýu…ˆÈåO>?qyJDüŸúÿ÷ú܃›³d½ú™œÐ¯¦VZëcïÄ5™½ñÇ×7«ó%÷åMY¿ú즈ä¬W?“)"ò±ûóŸ\¾)þÉHFaé#Û—në‹À‰O'nˆø<êÏä‰È9wàWgD¦zôëëÖ‹dfå¬p7®ü¯?„ü"¼Òóxþ÷Ö‰dç¬YrÒ±T,}þ37]W&ûG¼¯Ë™õ¯2ÎÜø_ï}æŠ%ƒ'G>Ë‘Yïø„ïfƆüŒœh*˜™“!2»ú¶N¶€‡Ï…h3¡#¿¾|.Ó$ÆÒÉØ°>ÚÁPù½Òmß[°Z–>7SVÑr£}'ožóÏ%:cŸOÉæ,‘ì§¿šZÚ£3ã‰Çó DD&ߺrSD¦BA×´úÅlyêñuÚÏ‚~‘ ër""çx<£šš<{C¶¯[¼­ÈäÍhv4K¡n^ŽÄö˜V¦47oÀ̵ª¸¦nô|>ýw›³%7ÿ;OçGäú‰üÁ·>¹žbÚPè\â8nF>ÏøÖë¿gÐþU¼éí´ít²½<|îÊı^’3ÞñðÂHhÖ›ºw`ƪw—¡Ü,·®t[ÝüŸTêg”Á_„¿„â¦ëÜàÍyK¾Y»NŸ-ùëòJžÈ+чþç»—?X¡mff.ÝÊZ÷ƒ¯?ú|¶ˆL»tíìø¤èý«õkѶó÷ðð¹ !ÚìµÐMÙœ%é¹ônlÚÇ,ݺ¬™½qãæÜùÉLMFÆ%·@²¶k³%Mr2ŸÚí@yóãH’‰Ö¬7/{ZÊÚì_|:}íÆtD Q”dõvSD$Gùüº{vrrrtŠ ™žì ýtTÖåå}Ë ý«ÍÙ’­ªXïÿàjZÑn.x>[D"ÿöÞ§}"’õ­ÇemÛàát7*Ñüþ—ŸT<"¹¯>•?öñ ¦â[ÆG¿§Í’™‰öw/ùW¬qšº|7²~‡Bybó¾þžñ½vÓßnÎùâ‹’¬›ùÔãyÑ®šo}xåƒD¥[fNÅÓšg3E¯Ï×~zÍÿÅ̬{>Sž2nþîÌÕ_F²^|R»ýÞ]†uÚ–§sEfÎÿüÿ»öOOûB7es¶ÈÍ32o<³L­Bdb™­dF+˲ŸÝ”ëòß,Ðnú®jþÏ‹7’ºm3x@DîRwΉk'¼ëêlÙüù9©{97sû“[Zžœ÷Ãã=_ÌŠÈÐM‘Å_½°íE÷Ń—’md|â²(‘ÌíOé~øÔ¼23¢Õe‹7â[eÛ<¬2ïÊ^fÎýÁû÷^{?4u]DfnzÇ¿øño?ýÑgÓé¬|ãÚ•ƒï^êõOz#3"r}2|î’¿éÝK¿˜HÒßpæõÏŠHl^ÎùfÇ.MDDDr^Þ’#"~ßg÷ÁøÙ/¦""‘HØùñ¥‡îÝu¸9yò¬·ã7Æ"7#""r=~ÿŸ7}ð…oVDäšßÿc$""2=>¼£åÔõ«GF®›œ‘ë7&þý#ï¡O¦DD²×Ud&ÝȪÚà¡•1;»l\òÝÁ 4nÓOʶÑà~—I+#DR DR DR DR DRX)D{"_Aáv|uC.+…hfí:·c{!x¬¢Y )FÃ-{"_a5l¤À cvvvå%ìž«çÆ'?º6Ic!M_Ý»½ — <0R‡hÀCŽÙ9€Ñ€Ñ€Ñ€Ñ€Ñ€Ñ€Ñ€Ñ€Ñ€Ñ€Ñ€²¯^½J+à!´qãÆ4—̘¥½€ÐH H H H H H H H H H H H H H H H H H H À½wþüyðeFˆ¤@ˆ¤@ˆ¤@ˆ¤@ˆ¤@ˆ¤@ˆ¤@ˆ¤@ˆ¤@ˆ¤@ˆ¤@ˆ¤@ˆ¤@ˆ¤@ˆ¤½¶›óøûýö‹nQï²>ßô´2ÍŸ€/³5­D›?n¿èž™ öØÏ O¥÷SL¨í‡oUõ‡æ>ÿÛÒƒÎþ .î¥ì;·éÀ…óõ?ûØ9>£(Ðî{e+m €ûÔšV¢å¼n}̘+’«®|Qyâ”Û9>#"‘qû©5/Æ~ÚeÝnÊ¡åpßXÃJ´©¡:|yƒåÛO[³st“÷-ø58$Æ}– ¡éë®§êS×wQ¯bã7=¿ý°¹ß7šQl²¾òlƒQ)"21Þeÿý©?ÓŠâ?}ªñ•'ŠrD&|¶ÿqÞºÇàüٹѧ¿n¯ÈK¾.žµ Ѧ®÷ýa"09ÑýóK"ê=¥K]9å¸àŽ~ÿÔ3õHúõhaŸ»Þþ™ÁòlǶLï{>=\òßž/Í›°ŸzïDvaó_›4“WºöáÞÓ9gl:­ˆL_?a?oza{ÃÓyˬ˥@ºÖ²-0™øteåº{îWuiö•îÄ_“‘શ¼È.hxîQ³ZÌ:•þ™ ]¶„}çO\ÞÔr ¨4ODÖ_½îê𸂺Šl™Q—>ßò< »“¬ ¤oíò¤Uåv…ë\D²7ì*}TŸ›mxu›½,:±@uÅcú«_Ô½¸~`èâÈ´h¶?fXͰhÊ­OZ Þ;ð?~Q¼ýÑògt–í›ô9â÷&ƒûÿû[óÌsOJ…JDæ'+¬ ¤o ‹²òª¾ûí*‘°o´¦ÝÝ#"¢0›¶îy!3â»Ö÷Ó÷""ù{êþ¼S—•týå†HSŠHÞ¦†¿ûóêóŸœûÌñßkÿÙæ#?xÎ<%¢ÚúÆß e+ŠŸ{¶ã/ –þþˬ kIe®¶•鉿#‘@Àës»\cñ ßkóut6˜éLþp»íŽÍGÃ@‚¶¼ñeh¿#$‘ÁþÒ*ŠÑ<ááæ{ûèÁ <¸bî<µyŸUç8åéôVYwüô÷vw÷9]Ãî@DD*No4UVÛ¬¥†¹>ðáÑ–¯õDeoô+M2¼š×^³³Õ-"ŇÞꜟՅý®¾S]½.·/…Fg0–TVÛ¬¥ú»1w¤Ø~ª3¾sQ¨tFsIU;J³vÑÞƒý¶—Žˆ¢¬ãícfñ twvÚ¢‡¬ÒK-Õ{lEêÛ]åVš%ìjx©v0"ÅGÞî¬Pû]]Çp¸CŠ’Ž·ÛÌJ‘H"Cà–IÀ§ÔYÊ5""âð, [¼ÍU;ö>åpE4‰„cngßñý»_²u†1XãýBíîp’½xöh/BsuÉ\‚öö6íÞQÛÚ=8â EDD"ŸÛÙs|ÿΗj;Gïpôãío®Ú±wÞÎ%ò ö´ÖîØÙÐë '_+ìëoÚ½û@{_âC¾Ç©ƒ¯UÕÎkÛZåV›%ìíoz­ö¸Ã½pÌ3¥ùØÐÙ„w:,*îzàÁB%Ü J½Ù Ý‘ˆÇ—ªã•NžÎú}>EaIeU¹I§QD¾áÞ>çXD"#Ç›ºKí6Ct#†J‹¦»; §}$l6/*—òt¹ED%{Jš¿¿©æð`HDDUl©*7ëÄ7ârô:Ü!‰¸Ú_³OwÕÝ™‚´ «yïÁXGÙR^VR¬ޏœCçXDƒ‡mMêÞcå‹ Å"îöÚAw@De,³””šôÁá¡ÁÁ‘€HÈu|ïõ™¶Å]bW»Ê­6KpäÔnG@DT…FƒÞP¢I~æ ÷<ð€!D€»B¡+Ôˆ+ ôD Ñ/ãöî1…¹ñÍŽy½<«¬6[oíî9\~›!) ÖJ]÷)ŸD†–¦hÞû˜ˆˆªÜfŽÇRþÃѨHUÒØÑb÷k¬°ÚöUw¨=îŠÈØ©'ªÞ¬7¬}ŒnkŠ&hËÑÓ-屫¢ª¦¡a¨¥fOBƒÍ­®Þó¢Í爢øõ“5±«Êjkòö7í=èHÄÙÚ:P¾8z[Õ*·Þ,cÝÝ"ºÊ#m%w5ð0¡;'ÜJ¥:Zœ Ìõ-ŒøÜUy]åâqÒôåÕF zç:* UˆHh¨wQÎx†¦±TÇ㯣ÍUå±¹¨(Jmª9z4ÚçÐgït‡×þŒƒÎ±m×ÑCå +ÇÔ¥ G÷DOÄqbÈ¿twœÑÊ IDATeEÉ¡£5 Áô‡Þ¨Ö‰ˆD;ü·±Êí5‹ùÐÉf4àáCˆwI’ÑíÕågÏž={v Å´4” #I¶b¨²Fç…ã¢yñ ÍjLdhÎèw:«Íœlïæ=U‘Ëå[óÓ »®ˆˆHá[’³SUÛ¢!ápßÒ¬JeÙW®M²Îž}Å""2Ò7¼åUn«Y–}fWF„hpW„ÃÞh&¦Ò¤*b {G‡zÛšö·º“ýj(O–¢ybš®Úš(Æ z¢}E F…?™ Ò¨‘Àp`ÍKÑãM©9ù¸aZsI´H̳4«2Y’—ziÍ–Âèùy÷¸Êí5‹±ÌHðPbL4¸+"_t€}µnIŠp 8ÝnÇã‰Ob¹,ƒÅZØÞ>&!g¯;lŠyyì>£ÍbH,D÷qܹ#ÅÁ#"k…ã½P5ÆåRCQ#â ú‚á…{×4Ë Ì¯1hEÆDâ­y «ÜV³(ÔZ¦ N„hp7„½Îh]™Â° 0+8ÜÕtà¸sA"¤Ðè SI™fàxtÚEôkaûñ1 özLEJOo4C+®.›7´Z$˜vyY$NÚßô6D"ѽ+ˆsJelç‹cC…B¹ÜJJ•B$"‰,Ì·Ò_åöšEͽ <¤Ñànð9¢A™¡Ü8—Ãø{£SAŠˆÆ¼kÏ®r³ÉT¤ýI¢‰¾ÜZxüø˜û< EEJO¯Ã'"b¶-L¡ŽÆJšêÓgŠîv'D…Z) ‚ËDOá`0¶äââ®``qmZ\$ˆˆˆ(T‹VJ•{Û,îWŒ‰w^pèD´TLŠ«Ëær.O÷ WDDæÆ3g:šj*J ÚÊôå5F‘€£ÏÚ>Q”íY8N¾ZoPˆˆ=»ÊJMl`1ŸË“¼ò+ìszEDDcZÜá34ìN~ÈaÏP´5†E뤿Ê=m÷-B4¸Óü­‡!UÙü$ƒ±õåû*õK+¢‚ಛÔÿÿìÝTSW¾7þOùq"õD1¨Mh ”p´ e qÀ¨-ÑQt•è*èÌ3E:yÖ¹ÏÖÈ]_̽EÚ"íXtYèuÀ±¡? öÂW/ÔécÉ\%m!K!­MZM„æXÌõùPDBü"ú~ý£9Ù9ggçì³Ïù°,Z7E;r¸£ãÃÃV"b—¤ŽZkRö«0""þÄkYáxqê‹+V¼˜Z|bÂ× Ù #× øüàñ±Žî:yðGD¹à†•ºù~ì϶± c$·û‘É-˜ªD¸›œ'ªUÛÃ8Ì"&f¬žf®1b5Îão½Õá~¿¿z)ŒˆÈúáë¯`'¢€å//ˆƤ-bˆˆ;\Pvc Ëuâ­‚¿wXív«0&ø.Œj ^·.ˆˆˆ?ª}ë†h”ë›·Š?䈈$/¤ŽqôŽ×µŸœ»1ÃCŸ XþÒ _öæ?2¹ÅSæD˜ö£ïí%ɵYºxÞnÿÞÚqüØñnnhSÐKeÅ+FNYFÂàH ´T÷ú‰…ê…WãkçŽïÕ¼~tp¢›Ù¾f/ziž$ûñãDD’RǘÞK¸Hýû°õ¯wõ臭¦øÏ/,œ- "rv}òÖŽÂ÷¬DD’—þ¼èV¦Ëwž8ø^u°û5*KÖ- $¢Àuêå{·æÈú^F:å翼dþl‘ëÜ7ŸïÓîœîý•ú¥1CUüçyé;¸‚W–G ‰\çNyK›÷÷n""&ò•´…‚;øÈ])xÀ!ˆ0¸ãï½~ÜýÛ’_ý¹¸ uáè˜LðK¯,z/ïsžºßKÿõá°È–·wuttÛy"6ò……ß|ø9G܇ë­KÖ½’}ähö¢u èäÉÁA/­ ëÀ‚à´ù'R rd=¬M?¬eØ!9íÜðz˜Ì‚?—½rk³ëó'ÿþúÉñD¿°$P@DÂMÙË]éû:ˆïx/Oõò<Ç]Mô’®àºµ†° "…'[k3k‰až»¶~gÀòâ¢ïì#w£Xàç!ˆ600pîÜ9žçPXp—°,û@~/† ^¸hù ë^X±pö˜)f¯ØYÍëvhÿÞÁ“½ãøÑ¡ñ›LÐruf]˜}ï‰õ¯wñÖã‡ÿçQݯf/ziå$" K]è./êj¯ölã9ûðtúLÐòWv¼².2ð.ÆŠ„ ³+kƒuº¿Ÿäˆˆ®EИ°4ùšÇT —h*ÕÇ ·ÿûçv¢á°€E¯ç§EΞ€Lj±ÀôÈ•+Wܽ700ðÝwßÍš5kúôé>>è³p—¸¾ÿæxGGWWÏJ‚#cb‚‡û¬¹ºŽ>Öa§€à…‹–¸‰ÄÝìAÎ}süøÉ.ë÷<( [0ö½‹9¿?qüø‰.»( x~ddäXë:?IûuÞI"É+µ¤¹¾?~äóo¬ßÛ) 8xa䢅7F¶nã#÷Q±ÀÔ1^Íf³ùùùÍœ9Å÷ÀèˆØÝùÀmou΋/ …˜UvãÑ._¾ìåå…2€‡bd ˆàÁx œ:u*$$e9ôDðA4DðA4DðA4Dðà.Ñø3Ÿ½‘—¶aÆ i¹o9ûKw¦êþXu溶—¨6ä}ván}[¾ã´´’v~œ$Ú¿?N¦‰ˆzçª^=ü#QÏg¹ªWßÿgÀnƒhÚß.(=Úù3ÑÏÝGß,x»ýÂT*£¾æÓ®þñ’ø/Yµ,x:N€‡…ÏïïúøXïÈ ½Ç>îú]x8ó•Ùô°Õª0"¢œ?µóçÏ÷÷÷_¾|¥p“¼¼¼|}}gÍšåãã3…²}ßæ•?säí7«ŽuööûΑ/ûÝ«i "¢ ½ùöûÆîÞþ™¡¿JùÝï–3D>ËûýûËv¬6¾½·ë¹¢×TÜÑ…®Ão¿QóE÷Ï=—²zD³1vuæý?þI–¨4=Íø—·þÖ?ôÙÞ~z4ð¹5øÃš°éD=Grÿøþ²ÿxm9ã)·ðà°Ùl@  4nÉ¥K—l6›X,žBq´‰Î(¼*fæG¯uF›³*øÖ»¡ñ]ÕÅo~˜š“/gÎ~º÷Í’7oå)¦ÿx¸¸°ÆwÕòÿèÿsûÇoÿ5¯dúy‹ý‰¨ÿûš7ß]––öÜœëvÔcx-ï¯òÔœ49Ó¥ûÍ/~ö}ŽˆˆÆÞÕšÿø ú_¦Ô7ŠûßñvÁ_ÛÃ_ÎI ~Áôñ›Õ%5Š7ÒÆø6nr‹ð s8Ó¦Móñññòòzä‘GP 7éÊ•+^^^ƒVsçÎ*Ùžà Ú….cWðšÔþ#ïëþ™ ŠY³$¸Ëؼ8ìCJ=gz|C_^îO¼cÎâ³s|‰ïÒל‘¿ú†J1ˆ‚ƒs¾ÿã¿~ÜÞ³x±/õ?ºjÇ««G—ûŸUÿÓ÷WÉ]Æ…çä|ÿÇ=BDîw5ÔÌ—ˆˆ¦+Rþ°lÉ’°éDì{ìý³n>·ð`ãy^(z{{^úàæ >IõõõM¡·lÕ:Ûi¨ÞwŒˆÞ7å¿ñ»[™ ]³lNáÎßÿ.ô¹¨çbbbž ŸËPOWGïÏÝÅéF$œÓuûÑÌððGPògMg}CÓ:2ü\°ï"¢ŸÇÛÕÕL<¾x™o‡éÈGí¦N£Ñô3=w ¹€Þ#<‚ÀmðòòòööžZLO`킱úÓ¡aœ½_|Ú9â­ÞOk¾H _<ª7š»Îi¾D4=<íµwWµñÅ_Û[Xýös9¯å†óD3—í(P^ëçÅLŸKtÈ—ñ÷½•À•»]Ôc|#¯ø˜ï3K–,^–¶jÙG¯ýìfocåv1fExÐa'ÀÃóH5q}(ø3_t¹·Ëx†µÉ?p5µÿ8b]_tôÏ ö÷¥cÕÛïwN_¼:íÕ¢7þ²Ì÷‹÷Û{ ~´·«gúÜAþ=Ÿ¾½ï³~œ<1säsú;?>4ßõE×àÊ7³« í5G/ü*ÿÿËûÝš%Šà9¾?÷÷»9̘¹Eex`L`O´Ÿ{~çͳ7¼9]‘¦ ü_Í+:«Z>‡¹ÐõÙÇÕG~æ)a ] ïT¹ðèW…ùö?6ôÎTÌy” [³&ðOo¼AiËæ\øâý½ú®¨¿ÌaˆúÝvîâ5òê7‹KÿCŠœéüøí#C]åÜîŠh:õ_8{¦çBØ£þsý¹ó˜±Ë?Ì÷ûÏªßøâçþÐ3=|øóÝùŽ•[œ[ ï‚‚wï?~Ö¬Y7»§K?}ÙÐô­»xÖ£¡+^|>Àûúcû?÷ÌLÛÿý¯?ü俚¿ìê\–‘û»Ås½‰qø¿ðŸÖÖ~øÉÑ/,ÓŸÛšû»ÈYÞ4ãÏË}Û?ýÏZý}i›±83÷åˆYÞDýß6}pâñe«1ã†ãN މœùmóû?Toì™÷›Ì8ÛŽÈÏõv³+šæÕsâÓÚÚæŸŸKJz~^Ïï¿{àP×¶€UøÍ´¯?9ôé1Ë¥ŽO?þú_’’þÅûÛO?6I“’žþ—1s ²Ÿ~úiÚ´i˜ àö\¹rÅår͘1cªdø‘+W®¸{ïÔ©S!!!7¿¯”ä½ùEïïÌ|îE¹Kæâü€Æwß}7sæLooÌnÇ¥K—z{{Ÿx≩’á‰\sî’Ü·—à€ "x€ €¢x€ €¢x€ €¢x€ €¢x€ €ãѼ¼¼._¾Œ2€‡ÜxA´iÓ¦õöö¢Œà!7^möìÙ½½½çÏŸ@IÀCËg¼÷||žxâ‰sçÎ9NÄÑàî …sæÌyˆ¾°½qËÚB3‘\sh÷Ê""Wç®[klBù¡‚pN €›¯Nú-kuæ«/Y©"6%[­ ½;õÈÕ¹sãVcúw•’ûâÛ[k¶ätköoÅe&æ o/^›ÕÀÞ,NÝÿ·Ì ;¨¦õ[ÖjÍlRù¡á܈ÿã¼˜à‹¿«»¹¶ª¦Þ`²8xF$•É䉪Œ”ˆ€›¸5ÝX™¸ÿ]Õí5nwøñQ¡\®èPq„àŽÒÜÑmÅÆåþû¥‡û‡·}|Äb1Š îªS§N=\A´a¦²²¶Ø‚!N€;ÂDiJ3d ÏsssM…n«©»´|Û_µœz]¥™OÀ ‰˜k5L*a²b©ˆcE àî]üíUy¹FQlòÊŒ…LÄYÌmÍúŠœµ5±ê’|e¢Ö7w½’­\¯”±(pËE0i¸&]]ú»ª ”ÀÝñŠ¥²ÐÁ¿Ç‡GÄņoßX¨«S>ÈUËÕ¹kóÖZ‘¿?L8Qré‰ìß(Œ+~7n¸áCñÜ…‹¿«³*'«’Ö—Ú=Üï,4<:Q©J©ÉËÑeŠöÇ oâzž’Žb€qx¡& Kd©,k´ÞnmÞ½}ÓªøøøøøU›¶ïnLн{C||ü†]ú]ÛÖ,_º&sg³µ»¾`˪øøøU[Š­.""—µqç¶ «âãã—®É,ÖwºPÌð° ˆMO`-õ+‘³S_°eÍÒÁÚ´£ªÝIDöÆÌø¥;Ú†+‡³qÛÒ¥;ZDäl¯Ù1˜úÖ«½u×`ÕQk]ík6ìj®ß™¹ai|üš-;j:ãm'wyp6f.ÝRßV_°iÕ¦ÝÝD©ªtÿþýåRüÞpÜ\4vûe¯ß¿ª¸M<<¬úMK·è‡ïñìú-ï\ÝõÅ™k–ÆÇÇ/ݰmW«}".þ®Îʼ n}iù¶è²6ïÚ¾iÕÒ¥vè›woX[!Ö”$3-ºÊÁ èên,ΪÄk6ìÝØ‘kÕ¦ø »»µkMüu/6ÕX‡¿ó¸ÉÞûïâUK·5Ž(’ø5»:]×Zê¥k¶4XÆ´»M3VãKÎæÌ¥[jš«¶oZ¿jSAc÷зŽ_µ©¸Ñ:jŸ#ïˆìõ[–nÒ[‡wÒª/Îܰ4>~Õ¦‚ún\€A4€É#Se(ˆ7”U^ÿXÑ]“—Wm°ðb™\&æ,†êܼúkq6[­®ÎÂ0Ä;Luy7k[,KÄ™ µ-N²7æm.¬3r"El”˜35è¶æè­(ixȤÑR²µÙ\äj/ËÑŪüÒòÒ"•ÔX‘WÙ颅RÎõæ¡G£ÞÄD¥(„dÕçæTrQêÒ=å%*±Q—•wcˆÛ Wûέ¹u|‚ºtO©:Š«Íݺs¨^ó¶Ú GbviiQŠÈTvuŸn¶»Ïo©ÔVÑÊìì•b"H‚‚‚¤b 8{kü6hüö ˆ\¹Ú6%¿´¼D­pÔæi[w|ñw*j¹Mz¸€ìÍ;¶š"Ôû?:”®/¬¶ÉVÊ%*•ÔÑRoq‘«M—Uh©ŠÊK5‰Ž2m“ctÇ̉(*Jd3˜ìDÄ™Œ"›Ñd'"‡ÉàG)†{ÅŸì—Ê(Ƥ7 ŪZôfqÂJ©ÀÞ\˜¥3ˆRòKK5+ù*m ÇßPjîÒ¸o|‰7WTt¯Ìß³¿(o*ܼµŠU•ìߣ‰r4 …ǾC¸o®Ô5¥—ìß_”DMZ]‹g0 ˆ0‰Ä Ù©brÔéêl#n„ݬ\«Þ³ÿÝï”fH‰ÈÒf»Úª3QùÞÿÛ¡òd‘\sàý¿Ú“*&"K»­³¡ÒÀ“8µ¤´H“_Z²^DdªÒw£¤á!ð ñϱÑéš"MJ\DxDÜzUËÙ8" ˆRÊ8c½ÙEWchr«³ªÒ¢È/ÊŒ  NÑä'³†ãÍœÆÊN¡)ÊLŒHÜV¤–;ªLCÕ–MÈÏO‰ ˆS%³ÆÊ&«ÛíãægSJ T+£1­ ÜuŽº­Ëâ¯Ùtí¯1ã¶AöñÛ/ "‡ÅÁÈ•IqáÑ+Õ%¥E*)s§§IodcSäBrµUh Ru‘*"@ ”E)X’&*ˆD2)Ã98²·T4QR~~JtxxtŠFÅÐõ+79H㬥Ñì$—¹Ù&ŽU°–f‹‹œæF«H”çÌC2¡ìZm0†¦ X›* LRI‘*."<:%??yŒI Ü¥·ñe¢²³C%Aq)J)‰’4q¡’Є”–³8x"ww£HÓ5ªè IPœ*]N¶NN`Àœh“ú¨ªR'Ôå6U”5ÆoFl/R7Öé+r·˜MfÛè¿Æ‰"dDÄJ"Ée,‘`ðñý?´ZˆÈVµ¶úêlf›‹ðÔ žã‰1 ‚“™vc}M[{›É`0r4XÓ¢”2me£%;\lÒ›˜Ø¹€8³ÉÁ™sWÇØ‘¸“£Ä›˜CÆa¶ðâùpÊyœ˜¯7;HND$‹“ U@,NÆ4´Ú\ÉÌØÛlnò ""‘BùÏà^‰ÅWW`¤,CCOÚãµAÄŽß~‘@®Jçä­]#KLLˆÈn¾£‹?g¶‘(Q, W{} 'SǶF¼Í̉c£$DÄ;$’³¼­ÞÂKUÃP'%Ó¨]¹É‰,QNºF‹SÔja£ÔJ›¡¢Ùâdš-$WIW#q‚ñ“ äJ“§79£e-z‹8!?ˆ\mm6Fž-½®=õý\67iÜ5¾,#’Š×bbD¡"ÁЋáK›»;„ë/…òá%†°4 B `2 £32dM:CuÓðg[ñæœ#MVªSìUÚZËÍî¬ðYFQ†ìÚÓHŽ<\\–V ‰Å²·gå61QI+•Ù)ÊšœÂ¡?3D)eºªF[z„ÞÄ$”ÈDO$J.)UIG,JÈNð ÷C±†îć·»Ëƒ“ˆaÔe¸7DÉ%ûG/,p pmÅ[o³ýxÀñ'Š•b[½^oÇI…¬\!²èõõ6ñJùõݵ=$Ê•rÞPYQe+‚ˆH Žó¦FËÕö°Ù|C'V·iÆm|=ç`|è‰0Éáéꨆ<Ã`ÛͰA""άۺ¥Qä0ÞZLªTÉ«u¦ê­Yæ(‘Ãh0sŒB­¢ŒáAN±™MíÄÏÙ,­úŠZ£x}yr‘K$f9S£¡S$g,MÚŽ—[®‰€HµRª+ÓYÄë÷ Ž„«TÒÍÚœbÊVŠ¹æª²jsl¹x¬¿@óæöökñV, R¨Ømán&#Qd«/Ó™Äë÷ ÷å C5*9oªÒÕqŠü¤ ¢ö±· ÈMpk÷”£.gcˈþ’¬\]šáñS¾Óï ýxаb1c©©¬—©äd¬Ôy1di¨hàXMŠœqjZ¢(1붺¹‹¿P‘¢àµ•Möˆ•‰ùùm¹Ú­kkäIÙEjFW–µ±I¥*Ù“.$¢€ØŒ„²ÜÁƇLU:#?ªgô8M¡HÅ–ÕšEÉr Dq2ªm²ˆS£;l{H&”+|^‹Mš0¸I’ RThsó‚4é ÆT£k¸Ú¼:Ûj*›e†2È]¡»Æ÷&Êqw‡€Süm3[¬Þ´ðÅ9}{KZöõh\Òñü'ë…Ö/MŸXOr—Ñ:å3ê0Npgb‡s^ê:a9>0~š±§$sÿ¡‹¦/‘\]ó›±bñã‘Â1?ÑwpŸá­‹³5[c*_ »Bˆ“Æ6Ã9aw²l¦pöËOÒÑN1Òóûÿé:NÂçÑOL(™Ár?Ù§ùÎò œåà´h?²ÚûoêPç:¾)>Ú+ ‘¤®VìÝþüo|~ÜwÚ…SîWçÎ5ñññ«ŠÛ'èâc¯ß2¡û""kÍ– ;;Q­à¡bo«)Îܰji||üÒ5›2 jÚ(4^u…iݽcˆ¥ññK×l)ÖwÞ——µqg憥ñññ«6mßÝjÇé7˜¸ šïŒ—WÌfn.mÀÂà°Ñ‘1ÁŠuá‘=§Ó_û²¬Õz¬ÃZ­7¤×õJb¾0kŒ=¤O¦Íî-üë‰:zŽÿÏ7Û«Nwý%ãŽÊÒeçù çúH@>=sïá¤÷ÄÔ*ÃwÆŸÐ~|üð1ìÌåë¢4Roœ 0… ãŠßC1LÔMtç®Í[kmDD"”Ü—œú2]U‹ÉÆ1"YTJ†Z=ÜvÛ[wkuµ+OÊVÚ´Z“P~¨ \`¯ß²Vkf“ÊíwTmÚXa%竸ªª&³ƒ•%eç«W P²ð ²ê7mÖ§xG@Dd×oÙ¨WxG@®îz¶¢Éäà±"Y¿m°9Ûk´º*ƒÙÁ‹äIéjµ2T@älÌ\[¥,IiÕ•™cËßÍ ’ªJ÷+y®%/«E žãx"bØ¡;épU~Q™ce ‘½­JWVc0;xV•œ­ÎŒ–Œ×l¹:wmÜZë®W+L• &ޕŦk4ÊÐÁæÈem,ÓV4m#’' WÆÁ†®¬Î`áˆÉ¢R²Õª<¿Â”䦲6ïÒ–5m¼Hž¡ºA³·î*Ô5m+JÎÖdF¹Ú 6ŠÔé|UeƒÉÆÊbUMJè`W”1Û2Übãu¯sèâbyTœxøQ],‘…ãï«2då ‰ò¡+ ±"†Ì<º¤Ã(^(€û鎫swÖV]ƒÉF2¹\ä0·TänHÓ]•“[m°ñ¬ˆµÕj ã5ꎺÂ2Ç0Dœ¹A«m@_txØjRE®¶…MÉ/-/Q+µyÚV'Yõ¹9•\”ºtOy‰JlÔeå5MwÂ[*µU´2;{¥˜ˆ’   ©˜EIÂCE(K”‘¥bó²5™;vîÖ7šÅÊ•+ãB…äjß¹5§¢Å̉år1o1Tçæìîtßl‘¥V×ÀIrÖanÒmͬsöƼͅuFN¤ˆs¦ÝÖ½u°ŽæV,$U(ä"ÎÜR‘“Wƒ œfÈÕ¾3+¯‰IÉ/ßS’.6h³´­NrµïÜš[Ç'¨K÷”ª£¸ÚÜ­;‡&¹åmµ…ŽÄìÒÒ¢‘©l¸ÍrÛ–ÝRãuïs(Íܵ{{øÐŸu­U 6V.Ý_9,.H ‘ÓÞÙTÙä®THp6Ãõ0À}Äi¬¬µ‰’ËlU¿e£ÎÜTÑ”­dÛ**-WGÙXõ™u¦qö$Ë>ðNŠ„º«6m®°˜›m.¥}Ñà!â°8yvR\D‘L*N´‰ruVUZù2£…D*ËïÞ˜Uc´'&2Dij)%)¸U†‡›DYTÊ—•U6™¦–:SK]5I“òKwD™*ëD²ìýï¤H†Z§†sz6ç¾ÙÚ©4cÏUÀÙºccn‹±¢¡;QE •žÄ©%¥*)Û+·æÔšªôÝÊt[³™ˆÄÉêü̶[¯+kæì¡ƒ£r*øØ¢ü”h!Q¸:¿»°ÆÆ9• œBS48„0´ˆ7­ÕU™²‹åDDlB~~J„€(\.²n̪l²&&snÚ²€©“Cgg½.OÛÄ'e„ ڋ×f5pDÒõåÉA8—aÑî§;®63O$JPÊDD’Ø™Nk¶´Y\JQ«™'Å®” ˆH’ ’ëòÜGÑD …ˆˆH,YxBWtx¸äªdqNÞÚ5òØØ¸ÄĄ؉€ìf“ƒ3箎‘PÜÉQ¢hDx¸D¤¼“Rà²wšŒÆÆz}ƒÁbiÐjãvÉ,D$ŽŠ’I”ïü·’ˆˆºw»m¶†¦TÇÆ ˆH(WʨÅhkµ9×S«…ˆlÕYk«¯Ùf¶¹²•±¬¡ÅV³¶š•*bc•Ù‰¡ˆ ÁÒ ¹:Û,¼8C64;¸0bÛ΢î* /N‘˜äqb¾Þì 9‘,N6T²8ÓÐjs%ØÜ´eS#‡ö¶Ý…yÕFR¤–ægŽ;Z{ÒÊP ËÞ³?Åb¬)Óåä…Ø…)!á:¢Üÿx"ÏóDÄ0ÌðӖ⸡ªðÃs—#¶½ûiJ[KKsscYN….6±‚'%—”ª¤×jÃJˆœD ÀàIvö6}ƒ‰cåIʈ€ÐˆÄЈÄäÄ‚µ9MœåÎIoµÙQ/]D‚kyâ« ,£(Cvµ62"¹€„‰Å‡äm z}cS‹ÑØPml¨kÌß_œˆGX˜rÆh†ò¥<ÃÜî 3T·ÜµeS!‡öÆ› [ؤüýêDÏÓõÞóº¬f^$J‚„’ 5ÓÖ’£7:W& qBÃ5˜ à>"Š1Dަz³‹ˆÈÚRc&"i´X GH‰ÈÖTßé""{K Å0ø„>9sZÚlC±€ÖÝ;«LlDbʶ‚ÝÊ“™–*£•ÉX‡ÙÁJ‰z]Y“Ã…樯¨¨ÐVÏiæ²™-±!Áb"²µº‰ˆ¬úÌ¥ññvvºÜ7[Ãû´µ ¾7ÔnI£¥B¡X.&"Î)UDGGGKysss«™#²6î*ÐVš¤ª‚]û¯Ê׋‰8c³ µ¦ž±š!N!&K³yèŒvµlØPÜÎʤŒ­Ùdþ ©ÙÆHeC}£Í×R›ͼ(B,˜¨¶lrèlÖj ÒŒ=ûw$ÞÌ‚W÷>‡Ž–¬œÊN×Õû Ž'µ†QÐ `²p ¹ ×þ/Ë(ß¹R‘¾^ÜRm«ÍÚhTˆ9£ÉF$JÊN’QTz›Ó`«Þº±EJ‹@ÄŠÅŒ¥¦²^¦’“±RgäILDÄ¥¡¢c5)rÆa¨iqˆ¢Ä¬ \¥’nÖæS¶RÌ5W•U›cËÅÂpg€A±Ùë¥Yµ–ºÜÕMb©ˆ·Y<‰’³c¥2q›Ó`)Ûº¡QFf“'iBŠT ”ºm¶†ŸCmµYk[¤ŒÃâà‰‰ÊH ""¥J^­3UoÍ2G‰Fƒ™cj•XÖfhjijj©WÈżÅ`#bäqbô…©gÌf(@š‘@9……á•‚±Ti›8y©4@®J`s´…»™ŒD‘­¾Lg¯ß# ß+†jTrÞT¥«ãùIA$ 7m™[ζšÊfF™¡¼.ruïsè4ÔxiªØfh¶ gB$W„î— ¢”Ò²2mYhöJã0Té LB‰ÝÐàz¢LÎ1"fãx"Ahæž=’2]U‹ÉhbD²Ø” µ*B@D$ˆP—k¨°¢ÉlqÈÔéŽ2E;a´Z“”§Óæ4°ÒØtšË«Ú\”ªÕ•åfñÄˆä šRu¸€(HUZJZ]YnLjäIù¥Ùáx:¸F¾­¼<´¢¢ªÅd±XˆaÅŠXUz†2BH±c‰H[Vg4™xV•ž­Q ˆÈ}³5Hšª‰5UÖy‘,!]£‰ "’(KöN[Ùbh13bErvvöJ Eç—jÊÊ*›ŒFƒ…‘,A¥Vc,'LÑÖi¬f(BSž¯Ó–åe•ñ¬,A]ª¬\åE¬¶L›UͱbÅú’òÌPÁ`š‰R§³zmV™ƒ•Æf—jkí¶eœY_[ËF¤_¢º÷9´YlD¶ê¼¹©½£Ü/9¤ ”Ò"»¶²2·ÎƳbEB~yv4bh0Ê#W®\A)Àä:uêTHHÈÔÊówß}7sæLooï{wH{{«ÉÁ‹äQá"{ý–µZ³(yÏí˜sî;®Î]·Ö:¤ÙÞÅ··^ƒÚ ÖæòE‡Š#îü>ÏÙZ\ƨwDC¸ÿ\ºt©··÷‰'ž˜*FO4€)‚3–åUXH›ªŠ 謩0‰VJqWn8ÛªZÃS2È!ÀD@ `ŠR•–®¢ÆP­k!F$‹MÍÈNÇX4pK‘¹-9˜ Î “Ã96Sn8§~3€ñ!ˆà‚h ˆà‚h ˆà‚h ˆà‚h ˆà‚h÷œ«½xUü6ìî¾uîZ¿©Æzã{öú-ñññ«ŠÛ]7½·ÖmñññK··¹ð3ÁÔàlÓWÕwã„€»ÎE0iX‘ˆ¹ú‚‘J À-r´VUÙä•A”ÜU¢LQréí¡xò˜0œà~b­Ú¿fgcMÁ–5ñññ«¶_©fmÞ½}Óà@ÐU›¶ïnµø o5ìÌ\³4~éš-úÎ1Ƕ¹¬;·mX¿tMfñˆDöæ]Û6,_µ¥ ÎÂãG€©£»jÃæjo*\½ª¸ÝålÌ\º¥¾­¾`ÓªM»»Éªß´t‹~¸šØõ[®½r¶×ìØ²fi||üõuÀ=Ñî?ŽºÂ2Ç0Dœ¹A«m°u×äåU,¼X&—‰9‹¡:7¯þZÍV««³0b9ÌMº¬ÜFûè}Úó6Ö9‘"6JÌ™t[sôV"rµïÚšWk´ñ¬Täh*+3¡øaêRíߟ*fäù‡>Þ. "ÞR©­¢•ÙÙ+Åî?eÕçæTrQêÒ=å%*±Q—•wc… A4€Éâ¨Ûºlĺ›ô×–eøøoû¯ýR"27Û\DNG7+WĪ÷ìg÷;¥R"²´Ù®õ %—úÛ»ïÈbˆ7V6ŒZ¤ »¡ÒÀ“8µ¤´H“_Z²^DdªÒw“³¥¢ÖA$ÍØèÝwìÏ–áw)eh<ôÕùy6¥¤@µ2Úýi®ÎªJ‹"¿(3.<4<:E“ŸÌjŒˆ¢€'˜ `òˆÄâ«ÏþŒ”eˆSŠ ‘X&"²ðÄ‘0b{‘º±N_‘»Ål2ÛFº%(e" ˆJQÁ`iµ8UA#â¶V Ùª³ÖV_Ýh3Ûœ–V3IS‚D”"+ÓšñËÀÔ­TC•Ç=ÎlrpæÜÕñ#¶‰;9J @éÀxD˜´§ýä’ý£°ºMíl+ÞœÓà`¤±ÉJuнJ[k3ÝØ+|ÅÜdE²kq;‘œáñCÀ„a˜±û ñ<Ï_­ ¢ä’R•tÄÚ¸¬e`8'À”à²Ô·8ˆdÙ¥ÅÛT RÎ1ê}GK½ÙEDö–#‰£¥Â‘o År1qN©":::ZÊ›››[Í ÄÑ2"²è[º]DdmÑ£<@®EΜ–6ÛàÿX™Œu˜¬dȡו59°¶x‚žh“ÅQ—³±eDÇ1V®.Ív—XÀ‰ˆ8³në–F‘ÃhæF'°Õf­5HY›ÅÆ•týÛAJ•¼ZgªÞšeŽ9Œ3Ç(Ô*!Ħ'±9 æ²ÍõR²Xø]`ŠÏÙ,vgøèᘬXÌXj*ëe*9+uFžÄDD‚p•JºY›SLÙJ1×\UVmŽ- Pàz¢LÎ1’ÅÆ“6(Y“%fÈa±0±êlCÄ-ÃýgÄI© b‡ÅÆ‹d êò¢¸¦w’(Kö¨d¬ÅÐb°°ŠdMy‰RBD‚õžüd¹˜qXLTj*V€©E¬H;*²²*:Gw&F«5Il‹6gs–®5\£Žb‡+“ª´4Cl*ËÍÊÑ6p±ù¥Ùሡ€G\¹re÷–µ¼nusV›|cÚþ¾cǾzýعî2Mó[”½:8Rˆ_àatêÔ©©•çï¾ûnæÌ™ÞÞÞøùnÃ¥K—z{{Ÿx≩’áÉê‰véÄÇŸokê[QùÊóë‚­_güõ›oúq À}gbƒhlZfd$y-Š™=<ÉhWæ˜ÝÐz÷~ɇ)¹#zÎB‰¤<¸8MvîÛ}ÖKøIà~s7ðbX/†ˆ7Oärö»H04 É,IñVÖ5Ç›ˆèüºƒ_pºgg._±Pó,+ "çYÝÓ§û¸iÓEý"ÅœÙD.‹1ù€@“xyo㙓=>aO…ä¯ žïGDD}=ÕÛ÷u:íÌ‚™F)ïKD—º¾4|b=É]füEë”ϨÃ0 x0IÃ9}…iÏ2݇[V”˾<ûó‘opˆh¾QOñî¶Ã>AÅ1e ~ŸüGaG?õ÷¿~üà€X³5¦B9Ûyì¸Jß38°«§{Ç'®å«£*TÁß~^e=GDÔwpŸá­‹³5[c*_ NDÿ}nx›cÛÎÿûç´ˆTÉ ØùΗ‡ÈCˆ.}o±½×d~ïÀ1»OüïOs¼ÿü0¿¡4‘«IÔuôï´pxíÎÙó“ œù†£DD3– ï\ ™æsæóó—–÷ôØ/:·ý¥aÄáü:.ÒŠy!ëü Ûÿ­iÁS-yZ²ü)Q /Îð`ƒhÜ{ÿùõçÜ›ÏýûvÇüéºå\ÖS;é÷Cæû‘w ôquÚì°²ÿ_kèMŸEäëu»•y õ±óvý6$øÚ÷óÎ""‘úOË^:õ㑯~8ü‘áuýÜ¢WŸ]!Äi㙸9ÑúùŽ7oõüdï¿nƒÀ‡:¾ê:xÝZœ—íÄLˆžô£³?t ¥¿tü?¾XÛÃJ¦3=?žp%=÷íVŸéóÙÁW?ÞËjíDÎòJf°ÜOöi~³ügù8-Ú¬ö~:×ñMñÑ^aˆ$uµbïöçãóã¾Ó.œ0¾‰ë‰æ+*.L*&""ש/½çÂ+ÛãRg¹I<çñWBÍyǸå!Ë%~¾c_š÷¾²IÈÎ_N†ºòãE‚s§ Nô/Ü:}ö¼åÓ …¾,—ôœÑé{%11 †Fb|xàŸaëBôìÕë|ò™怞L›ÝRø×´z^àÅö~tºCþ¼Ä—xºðáá3Ü´…/I½í]G9f‘?&E¹råÊÄïõ|׺×~ÌþßQKüܧéï;ÒôÕ^SOÇ9ž÷ñ‘Ì{,mù/ÖI}‰ÈuÖª=øÕáoy~špùò…šèB":ÿƒîàלîã¦ùEFÉ‹VÌ™Mä²WìÈ^%8Øt¦ƒó zJV°.xáàA޽Û÷v^à|˜Ï>U°JìKD®cŸœÐ;g †¹|ÅBͳ¬gÀd;uêTHHÈÔÊówß}7sæLoooü|·áÒ¥K½½½O<ñÄTÉðÝ ¢õ;Ô¯[Ó^ _x—§íwYŒ+ö]Öýïg#±>ÀT† ÀÃfÊѼîÊ^}ýbæù °„»4#˜ßºõ£pàÁ0µ§ÕHGþ~D¸»¼PãC ÀÑ<@ ÀÑ<@ ÀÑ<@ ÀÑ<@ ÀÑ<@ ÀÑnÓ#<‚B¸m^^S)0… Àí`æâÅ‹(€Ûãr¹|||¦P†D¸"‘èâÅ‹}}}—/_Fiܼ˗/÷õõ]¼xQ$M¡lûà—¸«§X,v8?ýôâh7ÏËËkð‘jjõDC àv/ >>sçÎE9< 0œÀÑ<@ ÀÑ<@ ÀÑ<@ ÀÑ<@ ÀÑ<@ ÀÑ<ð™¸]]êú¬-ããsö¡—Ì¢UQ;³‚›ýxÿ'»ó¾½.o’'W¯ [2Ë¿L¢‰ ¢õ÷ê_ ÿùá¯OFý2Ò÷Vv2O^¡ôg‰¨ÿ2×ãØ«ïØþ® 6;$?Lž‰ì‰Æ\¿aà\FAÈמû¦1,»@2c(Ô?Œ~øõë gH°¿LŸ{x¬[î›ÆLó%êg_ôõTlß×é´0 "d¥t¾/]êúÒTð‰õ$w™ñ­S>£9Ïê˜>8ÝÇM›¾(êù+æÌ&¢ó–u¯}›º}ñ:!ѹÖÏ’ óê²¥³û¬iÿvjÝËÁŸë¿úFþüÁ,ÿAwðëN÷ñìÌå+jže·šx€ÜÛ….»<¤¸ÄÿÇyþì[Ÿ8ØÐàH!õÜgxëâlÍ֘ʗCO›Ò«¬çˆ\ÖŽìƒ?cž©ÈˆÔ<éz¯êı>¢þžâ×k¶ÆT(g;Wé{<wàÂ[OѳO©Ÿõ£þžâÝm‡}‚Š3bÊü>?øÂŽþ[Ëþêg‹R¤„ |ºOâCÎÓæ/ŠòUóW‰hÆÎž$ý©õ­  IDAT“«žïÈ—…1¿,^ìGDNSLJswn Žñ#’†Ÿûgõù[Ê<`&>äUñlßëµÍÛmîÒD<_·ÞŒÛ ¨?š÷Éz§µÇ~ѹí/#gXóë¸H+æ…¬ó7lÿ·¦O=¶äiÉò§D¾Ôe½Àû-žFmö¼Ç$g¾áhÜ 28lôÒ÷§9Þ~˜ßàvßÈÕ¿Œ$:÷å-d0DcŸz¦,ª¯ðõŸ¸O4mîŸWøÙImÔÂ’óg’ ?XÉŸí'bçíúmHðµüz g‘Hý§e/úñÈW?þÈðº~nÑ«Ïο¹¬ò—ùkÅààã=ôÿ"_¯ÑÙ»• ¬À2SÖÀÀÀùóçûûû/_¾ŒÒ˜t^^^¾¾¾³fÍòñ™äÑyxöÉ'ËV öþÕ0^„¯üö™› 3 gùÐEÞÙOÉ –ûÉ>Í/FHDä²|³ý¿êÁ®Óß¼e“ý+Ijˆ$uyOñÎì;íªLgz~<á \@àÛ¬>Óç³DÑÀe×PÞú»N9{™wÀ“~ô??tôK"}‰èÒñÿl)ðy¦*ê2°âi¬-0% Øl6@  Ü/.]ºd³ÙÄbñäÆÑ&îØ¾"ÍF¿£Žý½gœDÌrÕ/Ó$Þ·»‹}ÎHŸL›ÝRø×´z^àÅö~tºCþ¼Ä—xºðáá3Ü´…/I½í]G9f‘¿P²|š¡ðÀ7‚å’€ž3:}¯$&f/Ñ4¿@Ÿ ï5ž™ÿ«™tʬ=}™üÇ8æìÐùËɰã@W~¼HpîTÁ‰þ…[§Ï¸• à䘢ǴiÓ|||¼¼¼yäÀ¤»r劗—×à#Ûܹs'1'ññX¿Öv?н¤\øŠüúw0ìŒúv_§+æi6í·Qt°]·ï çÃ,xö™ŠUþ"AXøÎøÚ †¹|]”FêM$*ÈŒüº â47Í/2&²rÅ ùÍѬ{|»þDF›OÐS²å€úèXGõåg>£=øÕöНùiÂåÉQš_"ß[ÉLI<Ï …BooïÁ 4ÜŸÑúúú&7\¹r?L®S§N…„„Lz6¾ûî»3fLú0{e``à§Ÿ~zâ‰'&1èmp FqàamL¢x€ €¢x€ €¢x€ €¢x€ €¢Àÿcïþ£¢ºïÄÿ¿åN3•ê&Œg°›!i 6Ø ŒAM¬¢[ÑSѤH»H?‹|Îýàœ {>Êgƒ$Q’X’c  nŠM*µ…5…˜Bj™n ÙÊ#“˜™ªL13ÆÎ“ï€òk˜EPŸ““#—û~ß÷}ß×½¼ç5ï{/ð$àI4À’h€$ÑH¢>D| ‰ø@ ð$àI4À’h€$ÑH¢>D| ‰ø@ ð$àI4À’h€$ÑH¢>D|˜¬$šÇþÁ“yußÈk(±_ñg}ש?.Ë«ûFÙÙ ¾×í9Ù|ú—篈ˆ\þë–ü·_=?ÑVºlóÿm¼Å5`‚5x¯ÓÏN¢ýÍžû¹ì>uêB—ˆˆzâ”ëý?Z6–½Ü5F±ž÷[.¨"â°½ëò¹ ωßYÛ?¿­ù•§–Ý·øËã-6¨¬aÒö“`æ ­Íýê«:vAäðï ,ê<öûTÙùªîHÆÂ£–»Ü}¸ãóe÷kN|x¸ÃóG47iïgn|2pŠkÀ´wc“hÚ§âæ¾tè‚:ʯîúÖãÁ ¼s}ôÑ»½³¿iÔþ°¸Åyá‘à¹"ò7ÛÚç>Ú¸ó±µ:‘ Íï$´Üw$Cÿæî¦×ºEÕ/?õÍ_¯é:oËýÖcU;×µé¡ïÌ›!"â:_r¨ý—^vyö·"ÿ1ÿÉysEä²}Ë¿Ÿ^û½…ïÖ~ðó7/»¸qÏéµ?Š~êoüösƒš­üÓ¿<ž<Ãe·×X;TUf†<°¨`í¢‡f¹_Ü€'/¥î9½öGÑk¿êm‹ÝòïÖ•)÷jøðØG—•Á-ì7¸ÂÈùcFwØ‘g‚犈x—ý×K‹–U?t:ù&'îóWëÏþ¹{æâå¯]øµY""r¹»êpÛk®®^åÁSN¢ñk"råÌÛ ~mÿ³ûs%P¿6ñá¬Åb`ÂnàíœW.Ø'í=}?(÷/.ß÷_;#ÿåþþM¸þÖýþyg”‚=ï·\Pç/Ÿ7kÉ×gÉGgNŽuG§vË¢¾x׃¾}|] FDz/ÿ¬ö܃OFÖ¤=´R…µ\"ÒÓ]ôüÉý†œmËÊçºNœL©íîßt綾Ÿ–GÈzdÖÕJ5‹úõ¿}»îß¾]÷oï‰PD;ïÉÀÒÓ]òJûɯ.*ÚöÍò”E ?<µ³áSÏÈôïÄ[t½T{naì’šE|G…µç\^÷Hÿ`ä\å£þ|¹¯ËþzØ1kå#³5"žîÎÜ_{V®‰,OYôÑÿ¤VÚ/ˆˆ\>üZËKŸ›³mYÅ÷-ø°½o¹Ç~*ãð_uË.O[’s¿çg•L¨LÜK¢õ8óžoÉûÝEUDdvÖÚEK¾ ûª~ËÚ ùüÏÇZSŸûÓÉž/wîø<Ø,¼x~\üÏ=cm(`xË|ò¡‹µ ÷|ÿqüíR—ˆëCë›×ç§|íÉE_Yòõö$Îéúãé?÷oúsݲo=~ϲ!ÓÁt:Í\Fc··|o‹yÉ,™ù­Ø‡ö¬]¸|QàsȖЙ®¿õŽÚñ±EY÷ЖÅÚóþá{qsäoŸvyß#M°qÙÌîÃõˆÈ…öNÖ÷µsæÊ o4.1/Ú“rŸîC뱿‰Ç~ú¥óú¢”¯-7~å¡Å ó7ܧë8sÒ%âºÔ53pí#ÿ°Ä8ï;‰ß(OY´p&¡0qSŸ\ñØ?z·WYûÈlˆÌ þÖ—;ßlqº¾¬ó·å¡àþ½Ð̼K‘.û%50ä¡*æÞ÷Á½gÿâ–%_eÉ"eôš\öÜCöàÕ˾ߗ· Ð>9ãýÏV}Ø}ò£ ï~Ø+xmÄØ[ÔBQÆÞ›€9kï¿+«¥Ûµø+o·\ þúà E<""_YÞŸMMðüÅ3Ͼû·++»»»þîÚñ“ºAågú» _@¨7OWÛÑŠÊÚv«Ãæpª¢ÕF£9.9%>"h זּ×nÚPbSbKß*ˆào¯—D ˜·çGß|¿ýÔÎcNU.•>³pÃ=‹{]¿<ü?""w=¸òáŒÅÏæ\ùó‰ ª|þ³çó³«Ë>üèäåàåC×S{?WG߃A3gŒg½¬ßã®zõý÷ï{¨æ1mÿÇK×ù‚ý'ÍœûÔ#Ákׄ¬}§%÷ïëãÊ8Z8cq¤^=uþòá šµÿ¬u‘^‘í}{Ÿ<Ñì.ÝWEDŸõ¿žøîésÇ?øë±·Zž¯¿ëG<©#ÚÉçé¬-Ì,irZävÚÚ¶vKSMel~iA\0½· 9M7/pñWg*"ªˆúáÿ¤ýûÿ ù­.pIðˆÙ=«:>×>ðpù“º¾ßyì§ÒûÙ‡=˃Ez?÷ôö¯wæÃq<Ö+(x¶Ò}î}×Â}/%øè¯ö™³¿¦éõVâÊûÇNþ_wðÞþ'ú‹ôß¡yOÅ¿=ôP€ˆ\9ùw/Y¼ nÑ{7ÞwßC½zé×ÏÞ·rÞÕÅŸ·_Y¾h†ˆxìöS½šï~u†îË_Ѻ?íúò¬e:í/;§ÉÚ°Ðóá_^²ÏËx¡,дR{îͧkì3/ý¬þìן#§­Å~.ý«èäs×ß.]¸8×K;t÷/Zùå–ÂCѬ ê>[R{1xÙ²¼¦´\§ÞßyâÊSß3=$=®¾dÝÌE;Kû÷îcŸÝw×™ÿ>UøA¯zŸ»«G¿ `”Œw‹Ã|µÂY"³×ÞÿùÎ.‡¬ü>ÓÞ7ýiñÚEõv¿Zû‘ëþ‡Ÿš'¹ËܦÂWÞ—5÷-øû__}ëÃSæoˆ*—Þ§ëØïS}êõú‚íkÅQP~"µöœfÙ’Š'¿â}òÅ•3ÿ}¡KÔ7_{ûÛ?©ïû/í}fÑ‘3UžHØsò¥ Á{Rî ±·ïlqÞ€ñmqx¿ ­0`Id Èìµækï•™ssbÞ<üûÔJë™ûþ±<¥oÆœvË3‘ÿòÕî’×~Ÿvø¬Ëüpùê@ˆnqØž˜¯¼ÿ«“©Ï·äžð|kmdŽq±L6£Ñ&"JxrTЈ_jBÒ¢µ½Ñᡯà–ó¥/¾øbR>LÚ?X÷|§]”ú—ÇsƒÉàŒÏ™_¿½îÔýG2Œ}3Ñ<6Ë“¯}^òo,áý¸M>}zÑ¢ESÞŒ?þxΜ93fLð’åiݹ&³Esþ[ûãF™kæj­=ÒîVŒ±ÉуŸ‹ÖÕV[QQÝd±9UQ´STbJʺ衷|z:+Ê+›Ú­¶¾7˜"SÓ†¾§À×:]G·>]löbWG}EEeC‹Õ©Š(zcxTrjjbص$ §yÇÙ}ÂC;õ–ʲòê&«S­ÞŸš‘=ø&} råÊ•‹/Þ{ï½S؆ÉJ¢a‚.»O~xî¥C§<‰ß~õ‘þž$ÑpÛ»=’hÒY¹is¹MD•Uš“êÇ=›žŽêÌô²ö\4ÄïÚ—ÝŸÊr5mήëW¢ˆÚ·ºbÎ:¸?1ØïuF&Ñìõ¹é…C^‚Ð_(c_irhÿs*û’hñù)Žâ2‹*ŠÞ u;œªˆˆ™shϪ ¿ 5’hwq¦OwgAåé ˜ bòp«é¿cSÜM%ÛÖ$mÏÝ[]ßfwy_ßÕZ’]Ö®Š!*cß¿ùÝï~÷»ß¼Qš¥qÔååÕÚû® ­%…uNc®ƒ¿ùÝï~ûÛßýæÐ®ƒˆÚ^VÖêñ{:«ó ›œ"ÚÈþ­ÿæ­ùñ}…²ËÚ†”r6–µ×í~ãw¿ýÅÏñÛßÈŠTDÔ–òŠÏ„·’hÓ‹&8ì—»VþgãÂA“Î4ÆðãÿÓЀéO 'Ö¨ˆˆ8Û›jÊ Ó7¬‰Y½iGÁÞêÆŽ®akÛëÊꜢ„g•%‡õÝô¨ ŠH.Ú—e‘öòòVˆÇÖhq‹(‘·xj‚£Ó²¢ Z­ÖmsŠø·ÎpžÖŠ «ˆ˜³ìéߺF—{`W”VÄy¤¼iHsU%*¿tÇÒþ¹qšÐĬ £ˆ8­u‚ €[ /m€G²ªàõØŒŽ–†£õ--›[Äm³4Ø, 5eŠ)>gWV\ÿsÄì-µVmTjü°»ƒãÓ¢Ê2›Üí͉Q‚QmÍV×Ò°;DuK‹~þ«kõca<Öú·ˆ•;tëºÈÔx}S³ý¨ÕtõŽTmlJäÛSõƒˆmâ €[ I4¸Á4A¡ÑÉ¡ÑÉ"â²·YZëÖ5´;EµÖnvª}Ïó8š"â¶”enW†Uà¶©"âvº="!Qɦò2«£&}Mƒ96>qUt¸9,xèóÖüYgøÚÝ"bŒ6 _KcŒ6+5MªÍꔥWi3Œu‹ùø·’h0ytÁaщaщ۳:Ž–d78Õ–²²ÖØ‚êì{:¿ÓÚîåvGÕ­Šˆ„$—–JqqY“ÃÙÞPÕÞP%"ZST|JjjÜÀË üYghÝ}×ëµ#§ÕkEœªÝíÈœ)ZeÌýwàVC nˆ®Æ=%µeiFNrÈÈY[ºÐU9»;,ÛjœnK£Í*Š""bÌ8ôz²·Wê"’‹~žìêhn¨¯o´X,í·µ©¦°©¡qׂþwxú³Î`}É3UU¯%ʨ}oÖT”qíþx·^,7„ê´4µ´4mw{YAc3ô­)"¢è Zqv8Gyy¥Çår¹†-×….MÜž»gÿÏûÖÁ]õ"Ά’ÊÏx×­^/"âå¡ÿn‡Í-"ÚíÞìwàVC n½9\/"Öro9#W{½MDÄaЈhŒÑ&q7ÕZ‡­îiÛ³aÍš5JÚ<"ö£¹›Ö¯ßZÔ꺶‚.$z{VŠADœV§êß:ÃèLÑFqmêö›.Km»ˆèÃÍz¿w} €[ I4¸!4¡ÉÉFqÖd‘GótÖæ5¹½çRž«q×– N>yÚ*Š8EôQ‰&ˆVë¶9ֆʖ®ÁÕÙÛ›"¢7êÿÖ.86Å,"¶òâÁ9?OçÑ⋈â“CýŸˆ6‘À-†g¢À ’²;§m[q“³©xÛåF³Éh4´ªÛé°YZú^ ÍÉxç¥niFVTKa“ãHæÓ–ÈØ¨¥aAj[cuÅ)¢OÈÏÓHªÍÒàn)|zS}BTDh°âîl>z¤É¦Š˜R’C5"?Ö!(6'­zs¹µ½|Û†æøØè°à®¶æ†º‡ˆÖ姆ŒcÇuiÜZH¢À ¼ªè ¡º¤¤¬Éæ´µ·ØÚ[®ýNoNHÍHM ôŒý ¸üR’]\g³µÔUµÔõ-Õš×åä§E\Mµå”f¨yeM[Ó‘ª¦«eQ99É!~¯3‚&$¥tŸæ•·8-u5–þ‹Ö¼1×ö°ñ¥½&Ô¸¥|é‹/¾ L­Ó§O/Z´hÊ›ññÇÏ™3gÆŒ×_•ËÞj±ØN{—‡ £Ñ¬ó²²§«­¥¥ÝÖ©*!F£É42…å±·¶´;§ªè F£9<,X3‘uFijgk‹Åê°«¬7™#GݺŸ&ÖðéÊ•+/^¼÷Þ{§° $ÑL½Û/‰¸¦C >D| ‰ø@ ÀÔ›D` $ÑH¢>D| ‰ø@ ð$àI4À’h€$ÑfÒpC\¹råÓO?íéééíí¼­\¼x‘®&àèíí=wîÜåË—UU½áõ+Š2kÖ¬ùóçÏœ9|põÁÐÿ`º nòXeŒÁÒ-„$ÜW®\9þ|``àܹs'õ¯‚Åb1™L_úÒ—ès`°»gÍòö«.g×ÇŸííí=}úô‚ ŒF£¢(7¼ªª^¸páôéÓ‹-yà´Ójh4lá’%K&»Ic–n$ÑàøôÓOçÌ™s¶¥Ñhnéoo€IñÅÞ†‰?=p`å“ñçÎ[°`Áüùó'iûŠ¢,X°@Dú6Äi ¦óÐèæ·hìÁÒ­‚ñÜgò>œ¿pϜɧq`˜Þž¹|ù³aËzà@ß?Ün÷ý÷ß?Ù͘;wî_þòN[0͇FSÅÛ`éVÁ‹àøüóÏﺋ+*0}]¹reÆŒ“½EQ&ãk·‡[}°ÄG>À’h€$ÑH¢>D| ‰SÉårÕÔÔ|úé§t0]\8Q–[rü€!H¢À”q¹\hmm}å•W.]º4éÛ;÷Vö_>3øÒêÙã/ä=›²>åÙì玟U9$À…);^;ö³)¹SšGë>ž½~¤˸OSõÔs[¶<×6²\÷;Ù)?úÅ9ÿëyaË–Ým7ô2áO×Öé>–ò£cçnŸÝà–äùäÄ«ißYþo|ãßX¶|mFÑá“<"žONüúämÿ-äL¦D_íüùó"âñxz{{'w{—Î{¹ºS}lð"Ë‹y/Z¾—Ϲ_½ðb^éÝ/dGÎæÐàŽ¦vu¹DD¤ëØÎÙSY´|%àáä¦,|NÞ=O¹sMÀÂ嫟XÈ% €)táשyoÚ¯œÜïþgñ»ÿùêãO½ûæŸÚ»¼|®ævî’h0gдZí3Ï<3gΜÉË œyõýï_¼‘K–_œèy4÷kÂg‹„þ¨ýû…µïuG.äðàN¶à;{ªÔ‹OªSŸG \ºp¡ÂAé3{ñš”ÅtSÆó~I_-è[ßû×ï¯]¶8Hqy÷Í狟×þö ÌÚíŒ$Ül#3hóæÍ›Ì * ’òÿ㉞Kïíþñ[×–ªg-gd᳡}ó:”…Ë”¾wV]ÈGvÜÙ4 ×î­’i’GÅ¥–¼ïW/Ë~âLu퉎ó –mÉþÁò{é›oúBõ{{äî&ýàI‹ûçmõœ?ñr^åñŽ‹C—_­óÔ[/¾ü KçÅž9¡'?ûìʾÔÝ@…ŸÝòhòšžÑ›3êF}7ÒŸ:‡®Ó}<û‡¿xâ?ž[9_={üå+Ot\ì ˜g~âÙm œªÝàÎñÉáâŸÙE‚žÚ[S°L×?núÚ·–/_üÒ»ïÞ)<à™hpSÝô šˆˆ8ÿž{î¹gÞŽ=ÝŸ|0/0 ÿÇ€Ày=çº?ãáö•9ƒÿûÙÿ;4±z4 ×î­ÊYÒ—Pî:6ÕÏG¡§³úå÷îIÎýÿع\N¼øò{—DD=õjÁ+mó“2ó’¿3éž¶ªÝÕ@üì½+»—ý0?gÒ¼SU?.:Þ=¤ºsÇŠ «/…?›ÿ~’›4¯ý•¼Ýït‹HwËsy¯X×dæçÿpyOí‹ï}624ÆFGm¤?uúZG=SUôâ{w¯ÉÌÿIî³æî_í~ÁriŠv€;ch$""Ÿ?|JDùVNÖ@MD䱂â«4E«¹Ý»”™hpSýò—¿ìË ‰È† nBÍëÇðUîž}-¯¦Ì¹Ä­¬¼¼<--íê¿¿ûÏžþù‰U¥Y¸vOÙÉï¤s‹H×±;¯{õÉ›<í³·¼éíÁ l|þ¹¤Ù""÷$ÿ0)wÈÐHD<'³¾ööÀ›r×öL IDATæ×½úkß0ºŽg<¹ó]õÁ]7æþMÆ3Ñàf›7oÞ¶mÛ´Z­ˆ\¸pá•W^雘v“)÷„/”3':ú梩gßéèYøè=LEÃí2Xœ¸é‘A¯KmÕo_z<ÿÿä=›´<|á¼€Ïz®=«çÌ;gûǼê™gzæ™ç];Õï^¸ðî‹gºgÏïØý›—_{§[Uæ™çõt *÷Þ™žqmt´«Žuú^§ÛRùò/:f‡=¶fËv½ð“'ÞûE[÷”ì>wÄШŸÇ}õÑgßÊ)X9(Wæ:QRü®*²dí’¹·{g’D€)0oÞ¼gžyæjíå—_¾té¦?Žlvxòãw¿÷ò«ïœ:{æ×Jß–eÉrlp‡»pbúdÐzºÏtœâÌ9¯¯¾ œw÷g',gÎuŸµ¼UúÜ{ŸõtŸíx´þÛ¥¥oYNjy«t÷o>{xãòù× *‹“’t¼XðÂqË©¶w*wï®=:O‘ù%™{Þ.Úý‹–S§,o½Xzüâ87: êô¹N€|r¼ê¹—YNikùUmËÅ9 çÝ=%»ÀI=uü—ÇÿrÁãñ¸>ùËñ²Œu;Þì ù—]yÛçи¦H_í•W^q»Ý§··÷¦7avس?xùÅW ÿ×gw‡<úƒ]?ŸÍqÁ?*ìêê›: æ õüé•Â? Yr÷²Ÿ¼ôìè++a[~ðÄî—÷üï_Ì ]¾1{çÝ/–¾²û7a»B%`Þê‰ÝÕ/üøµÏæ„<úÌ®D=ÕïI*È—^~µèíÏæ„.Ï,øÞbED—çîR_|¡ºôÇUw‡,KÎÞø«ç:üÜèîå^vÉ:}®3;üÙìÄ^~­èÇ=0'tÙ ž]¬(2»ÀFyð©ou½ù¶ýÝ×òÞ}mð/Bþioù–¯inÿøÒ_|A€ˆ|üñÇsæÌ™1cÆÊ~òÉ'÷ßÿ ž?¾¶¶6!!aþüùþ¬o±X~øá™3ù ¢·§GD._þ¬¾WP­|2^D–,YâOUž3‡s N,+(Z;¡ ÚÉ“'xàÁK>øàN[0­†Fƒ‡+|ðä 'y*xå²òɉÃ/½vøøÉN·ˆhC–,_û½ï¯]¶ÀïqÓÈÁ’Ÿ®\¹rñâÅ{ï½w ;–ñL¥¾ùhô0}h®-yu-ý0ÈÜ%ýoX°lcÁ²wh/ðL4À’h€$ÑH¢>D| ‰ø@ nÄÅô®»>ÿüsú˜¶f̘qåÊ•ÉÞŠªªŠ¢ÐÛ·å`i&‡®ŸF£¹xñâW¿úUº˜*úïÿ>öë:o¿Õjµýë_,X0©m¸pá¬Y³8`š¦Ê­>Xb&Ü_ùÊW>ýôÓîîîÞÞ^z˜†ÃÄùóçŸ;wÎn·«ª: PUÕn·Ÿ;wnþüù0͇F7ßí1XúÒ_|Ax€ˆ|üñÇsæÌ™1cÆÄŠ_¹råÓO?íéé™Ô<ÚÅ‹9RÀ<ðÀ½½½çλ|ùòdäÑE™5kÖüùógÎ>Íÿƒ> ÿÀtÝä±Êƒ%ÿ?p]¼xñÞ{ïÂ~#‰ý®3‰˜$Ó!‰Æíœ€$ÑH¢>DàF³Wo]¿§Ã3h‰§óhÑö¤1+’¶íôÜœftÕo]±©Ò."®ÖÚÊ›¶ÙͨݺbS­}º¤ ôÉ "“»S7ñx7H¦$’§’hÜP®ŽÚ’ ë×A»š‹Ó‹›ô)»Jw¥,Åé…®›Û&gseE­UšQL«Ö%š´Óí8M O™Üš’ãåÏF§<’§ÒL7†§cïæm5ý Å®–Ê5jwNòRˆ9¿õéÌʦ®èUAwH¯èÂ’·‡±S·ƒ;;’™‰À¢1¦”ÑxÙ¡å‘!E†6¬¢¤1$u÷Áƒ»â¥¡¸¤É%"žÖ’ôÂ}Ê®}¥9qβâç(-u»!^7t³‚D#¢5%®[g¶q?#ù6ÅíœL.UUE«½–WS´ŠÈh™U›¼» 9XD<•¶ðüCÛ—êD$Ԕ߹!½ÚÒå´9sF|tDˆÉhˆs?ZП‰QDDüªA‰ÌȈ ÕIhr¢ñHuxNZt¨FŒÉ±e V§*¢íÒÔœÄøUa:1)õ•™Ž¾ Z•“Q»¹¸x¯ÉÒ™sh©nÜ5a¢eGÝåÁ}âuw†”«Í¹cjNÊÒ ‘”TsMy‡SâÔ¦ò‰ßŸ¡ ËÉi}:»}d9/ÛÕxÝÐM ]DòŽˆ Gòí‰$“KQq»¯åT·:z‚DÞÿ(5·µÝé¶f¯‰ô[C‡[âÌ) †Ì¼§“ÌQQÑqq±QÁšñ5FãO ŠÞhÐõ·]}¨^suGúk ‰KPÚ,G«[ÛZÛ[Z,n‰(œ˜“V»¹Ì™(Z7þšÇêÇ –õ½ËcìΠƒâÞ<ðŠEé;²G³M5¦˜ú7¤3Eedm¬ízÝÖM’ëŽäÛI4&—¢7jUÛÕ¹RªÛ©*ÃÈ;*J2íPEô »KSŒ×RŠ6XD"v¼þ›äÖ¦¦ÆÆú²Ìò’¨üƒEqC«QUu¬7,êF«a¼O†ïj.JÏnP"ãWÅ%f$'Vg^ˬxÜNÕÑáôÄ]göÆÇ¾øÉç.±;ƒŠ×¬(Ê„vt¬nôº­›$×É·)ž‰ÀäÒ—šÄZßÞ÷`*­¾]5EÇ̺hM&­ÓêÔ÷Ñ;kKÊœéjÞ¿§²]—¼£`ÿ¡} JS¥¥KdpRÄekuŒQ³×ÆÃe©¨sÇ—س3eÕÒPƒâ¾–‘ñt”Öé7fÅ»kŠØ'Ô_~|îò»3ácnˆ0ˆ­ÑÚÿd5—µÑ6®nôÇäÉ ŒäÛ I4&™.25^ÛTRVßÖÙQ_VX'±©QcÏýÒ„¥¤Û‹3‹Ž6·µÖïÏË«²êÍ(b«+/,©mnëhm¬©lrêM­h ÅV]q´µ³³µ¶¤Ä2J*F'ªÛaëry©aœ½Aën¯oé°wu6W6¹U§ÍéñtTQÖå¤&fdE:Ê‹Ž;æÇ¾xçj­Þ»·¶sØK¼íòµ>ñ¶;޻ѧ ¨´X©+,¬nnkk®.uGÆØ®?š¼ ñÚ•ãäÛ I4&›."«4'ÜV–¹9½¬Ýœ³/gä÷‡ I)-M3´—e§g×¹£òK3Â4"º¥Y»6šÚ˲ӷeV;#sJ³Â4¢[š•¯m*ÎÜœ^Ò–“9"+f5;ËÓÓË;”Qk'MDFN‚¶!oÛ† Ùq»vÅ­%yG::k kÜñ9©¡ÑEge˜ÛËJÇ9ÍÍ÷¾ŒÁm­­©9jSGT9Ú._ë}w:Å{7züØ‘œÒ¬pGEvzfIsXFši䡯ÛõsC“$žþ®¬wÜ€H¾}|é‹/¾àb"òñÇÏ™3gÆŒtp«r5•)Y¹S‹¡½ù¨E‰\$"â騻!½=ãýq:ŽÑ„\¹råâÅ‹÷Þ{ï¶™hàöàj­lK6O‡t9ª‹óJjÛì®®ÎæŠ’#nsb8´[3Ñ 3ÑÜ@öƽÅeG,UÑ›¢R³²ÃH¢MØt˜‰F ú‘D€é‰Û9€[I4À’h€$ÑH¢>D| ‰ø@ ð$àI4À’h€$ÑH¢ÀäsuݳsëúÕ111«×oݹ§¾ÓãeÍ®£[cbbVµyƬðÆ®6~žæ111+v¶¯Ø^¹)&&&fG³GÄÓš»"f°I›r+[»FigkuÑöõ«Wô­³½ ºÍEÐÜ:ô›Îk(^ƒ¦cOÒä\I‰Ø¶¢Õ1#­ßß9‘Ú&m`LRÐz:ö&ÅÄÄlª¶ßˆxfØ€ëG &;Åp4wó¶â#-V‡[DÜkË‘ÂÍ›‹»F[YÑŒzƒQ¯Œ]ç \m`lRiŸ¬P´z½^¯UDuÚšÊ3ójíÃFZ{Ó3ËêÚnÑ ŠÓÖÞP–¾¡ ™<&ed?é ˜Zý c°2±?É~8G0}‚˜ffÒ0™ºŽ79EŒ »vgDk<öú’ÌÂ:G]aqô{¢uÃV×E½í»Ö»Úä2¬Û÷óí!"âiÛ»9½ÆÑ^ÝdOL¾:Àn¯<â1¬ÛwpG˜FÄÕ¶?=½ÊÖPÞ”±tU€ˆ>¡ôÐÎPÍõV3- h[3Ñ`2Ùë*-"bLÛµ3:X#"šà¸¬]ë "jKES×À­pI{îÙ¾~ÓÞ?2/½«yÿÎõ+bV$mßSt犘˜Õm:}} †úê‚­I111«·í¿]tè,w{ãþ›ú¦×¯Þ´ss—ˆtVnÞVã[ù†þõ<öú=;֝މ‰Y‘´½¨¶ãê|÷®Æ½;Ö¯ˆ‰Y½µàˆM_hLÑ&EDÜv÷ 9ôªÛ­Šˆ¤í߇¥äïÊÉÉI5)""®ŽÚ¢íý­Ùš[ÙÜ?oØÜþþíëœa]Úá‘®ÖÊÜ­I+v|àûp¯{ŠëÐÕ<f+’¶º}wÔåcÇëE?ð6ÞØG8y;¼öèËǸƒp­Ý“´§Í#žŽ½ëcbbb6Uvz.­{k÷lOZ³"ikÁÕ@müpõÏ¥·àôÌ\r1þ¨ëšæí ,"¢Ú[FÆóP“6‚H¢ÀÍâ²6ÚDĘ2(™šk[½uàÏ»³¡°øH»Ã=´tgefvU‹CÕ굎#…Å-cýÙw),kq+ŠˆÛZW\\7âÆ‰Îê¼¼ª›j0™M·­¥*;ïh—¢2ÒÂÑFeä$5ÒUŸ·¹ðˆÅ­Š4¸ÛëJ¶eÖÚEÄÓ¶w[^Å¡jzgCYYûø;Ãcm´ª"¢ÕúVRgŠ3‹ˆ­|óIÛs÷쯭·*á«V­ŠÕ‰§cú¶’ºv‡˜Ìf½ÓÚTž½Ùßû<¯viÏ{¶e–7Yݳ٠ÚZª²3÷wxÄëžâú>ÒegWµØÄnÖ»­Må™yÕö1–á:CÑÏ€|‡·3œ¼Å¼·ÀûŠäó ;Rp|NšQÄy¤¬®­¡¬oVwþºP´Õ”Ô¹áf­ÓÚP²-»¾ËÇŸË‹ÿ5zúsç’‹qõšæí ÜÇQSrĦôâ´6”¤Ï“8‚† ‰“ÈíTED´zíÅÚ­\ƒÕ'aß?Ý¿ÿ燲L"î†ò†.ÿ6Ü×¥)]¯qŠ˜2¾¾ÿÏf™DuÕV·=ÅõðØ­"bHÈÊß»ÿà¬øÈH}—ÓãuùXÙŒë E?ð#l¼ðXáä-æ½¶¯+’+<ö'=¢}S­]D².£A¤½$³Ø¢Š>!?mð½sÆ´öîÙpw”VÄR^×9æŸËUy}Ô ôçÎ%þ­÷kš·+ð}B߀8?RÕR1<ž'a ŒŽg¢À$Òö=º×ít‹ =º;Ý""ZíÀVµQ©ñaA‘Aù!G³UÑG­2iD$86Å\’çýÛ3}x¸^DÄ`Ò‹ØT>kM±sWVý‘Úòì­Öv«Ãˤ6£Ù&"Žªô§«®5ÄêpÙš­Ò7£N#"!±É¦²b«Ÿ ºÎþÝ4Ŧådx\PDrÁO“ <]íKýÑÚº›­®¸8z¯ÉªŠècM‘à¨dSI±ÕÖjó$š}w}—v¶ÙDÄ,"œøÓß%ŠˆxšËGÝS„ðUùÄiL«¢´-MŽªÌ§«´Æð¨¨Ä´Œ¸Pˆ—åÞ׊þ<àWØx lÏxÏO³—Àöð1úu…ÇAo0\},»bìAhBSóêÒ8E´±9iaƒÿ‚¢¢B4"¢3'š¤Éâhv¸RB¼þ¹ôX½¡×øç’‹ ­êõšæ#ІƒA‘ÉáÒÒbk¶ ‰çIÁ£"‰“ù‘Ìm”v›mȳô=G"bŠ6iúŠvÄûŠ<ªªŠˆ¢(#Õëz¥‘«µhsfS1F%$f%wUרFY«ÄbJÛ•fº6êÑ›µ~Â[6l<Ø÷bÑuµÖÖµ»µæøÄˆ Ðˆ¸Ðˆ¸„¸‚§3ܶ¶‹£[èß༿K=ª:V%#ö” Úõ Š+zÃÜZW[[ßÐd±ÔUYêŽÔç,Šó²<ÊkE׊þ<à_Øx líxÏ…íè-NoW$7‡ý)„„ÝG{F»ªüñ÷NU="škWTu¬?—Þÿ,ê¼]عäbüAk¿î?Üʤ ÿq;'L¦ø³ˆØÊòö6ÛûÛ_’WåQ"ScÇzù¤ÆaGÃшt5U_ÏC<¶£MNSFiÑŽ”X£Û9r𡊈Î`6ˆˆÛe _ºtéR£jmll¶ºEcXj[mS§GDìMµ7îK<çÑòòò’ŠgyV›[D´!÷D˜gÃѾgÇÙ›ª­"b\jЈFQqv8="ÒÕÞèðÞq4µtŠˆØk·¯ˆ‰Y¿§Cñ²§¸.öú½ÅíÆ”‚½?ÿí[ûÖDÜ–F‡ÇÛrïÇñ:CÑÏ€ü oûƥƱn¨ô„¾âŸK.&÷ <0\¼Ï1 ‹ç©ÁâNÅL4˜TA«òsÓ‹›¬5Ùj®-6ÄççDýx]dj¼6³ÎQµmC“Ql6çõ4C£ Ñ‹¸­%Û¶Öë–AŸÍ4JVÄé¨.ÛkÌÚ˜b®*i¯Ú–nÔ;--V·ž•¢“ ¨Ôxmfµló†ÚënÌЊÊXgL¯±É^Ó`0êU‡Í©Šˆ>!#Êh6­34U9jÒ7X nK»CDŸ,"ú“Råp×¥¯iÑ‹Óé}t® O×fÖÙʶ­¯7‰µÝ¡Š16Ù¨ ñ²§¸Z­£¥¡©¡¡éh¸Ù ÚZ"Š9ڠѺG_.Š×ãr]¡èwÀsÐîXîºì -׿+˜Òöí1{ o=F8y+â-°ƒ½]‘H¤a …p$sCÓ 98ZsVi¾¡²ðˆS$<§4¹1=¯©¡¸<ùÐΰU5éO7§Í©Š™2æ¼§×øç’‹ mÆøGªƒâ¹Å¨uت(‘Ãã9ä¦`qÇb&L²àUEdŇõŠˆh ¦È„œƒs£ƒ|&¾"²öåÄ›ôŠÓæÔÇfe…_Ïýœ! 9‘Eœ6›••®ˆ¸-õ6HHlj¬AgKK«Û#Á‰»dÅš´¶–¦›6D| ‰ø@ ða&]×ÏápÐ à“Á`¸E[ÎL4Àf¢À pë~—ð3ÑH¢>D| ‰ø@ ð$àI4À‡™tÀ´ÒÛÛ{îܹ˗/«ª:õ+Š2kÖ¬ùóçÏœIjÈ_ôÀ4ÒÛÛ{úôé FEQ&cªª^¸páôéÓ‹-"æ'º `9wîÜ‚ æÏŸ?y›PeÁ‚W·EŸûƒg¢L#n·;((è&lhîܹ—/_¦ÃýD n {õÖõ{:<ƒ–t5ïÏݺ~ELÌŠ¤­Eµ.Wýö˜áVä¶z†×æéÞ– *íWYo»æé¬Ì̬pš3v—æ'è[J2ËÚøÈBÄNƒˆõRVÄisk£²v tZi†YC<Þ*ëoÈq…ˆ8›++j\â6Å3Ñ`Ry:önÞVãÑä5T[ æ&†ˆHXNNëÓÙM]Ñ«‚B—^›µm¯­°Ò¬6ÛÕRÙ FíÎI^ª1ç·>YÙÔ=t-ÖñÖ6`\¼³â-½ž?Á?Fl{=§ü*®µU×9ÌYû¶Ç‰ˆ)«¹!³ÖÒ•ìÏ)ã²TÔ8Ì9û¶G‰„…í²[6WÔuÆ¥„Œúñ®¸ÂiPÆWÖÛ®iÛ+*á9‡vĉD˜´ÎìZ«CÂBˆI"vj#ÖKY§Í!†”¨è¥A„á-±þ…×X·?f¢À¤ÒSJ<¸/Í8dœ¨º æÈhCÿ:ƒQ/ª{è7v®Æ² wBNBð𴜭Ù*¦8³®¯~SœI±6Ú<ã^Ç[Û€qñÌÞƒÐwày þ1bÛŸsjÌSCkŽ3kûWÓê密Ñ[î¶ÙTƒÙ8PְԤؚm.{õ¦Áw¬uVW¨)9Ɇq•õÞÃõ·)1²ÿC¨niîþ¢D>ݱS±ÞÊŠÇÙáV -Ax+F¬!Ç5"ÒY¹~s•Cm/\³º¨Íãªß¾bëÑÖ£›VoÚß)öÚM+¶ÖLìªÝzí'W[uîÖ¤111IÛ‹jy̦-f¢À$gÑ‚‚C‚Äeò±Aº}ïþk£ÙæÊ:‡6Ò<øcOGÎ ri IDATe™Å”‘:âN Õis+ýÀ÷¬ŠÞ ¨V§[D3¾u¼µ _„{ fÕê5}ž÷à#¶}ŸS¾Šô—íêhªhp“Ãý;­"N‡óêg6‡CÕáщ֔¸nÒÿÑÌ^]\¡¦ì[g´WÙ1zØ©hÝu[+›¬n­)*5'+1TGH±S±ÞÊŠê´9Uµ23)»Ý©̱©9«B¸ŸóÖ‰XBŽk,DBRtmÞfI;´?.H\QmÅ•æÄŒŒ(ƒ÷RöÚìÌ e]NiŽÞm©.)IÏÓÚÇ´UD åê8Z’WÜ ÆîJ 4œuµ”‘øÒÈQªªŠV«2B÷ø×&5˜»&„c¿_±íåœò«¸§­èéô:·ˆqݾ'E¦„KaYy³1-\±Ö—YEú§Qè"’wD |¼+¬p§ì[¢qZÆ[Ö[»Eµ–ÔÆfåì6ªÖê’’ôbý¡¢h>r±S±£—§Í)ª(qY»3´ÎúŠâât§öPQ4I‰[)b}…×Xˆ\ýÊöê}µª6ywAr°ˆˆ—Gáy:*+láù‡¶/Õ‰H¨)¿sCzµ¥+Ž,¦!’h0eºZ÷æUY$|ciþöˆÁÃ{C…EŸ<ú·ÄŠ¢ˆÛ}mHªºÕAãÿ×&5˜'„ÃßÕ¸ãé<‹*"Ú¨Ò7ŠLcV;²ã*.SƃÉ6KuYIf^衽«ü½ÅåïjËÎËÞP#"†¨u‘Ú§vè®Úk +Ü ¥ëFL»ñ£¬×EİqWAbˆˆD˜”þçø$ò‘ƒˆÒˆõZ6dÝ·Öét}‹ÃLŠí鼊"ö–ŠØ‘!§p…oúðpßu[Ûnköš˜AË n!‰†iˆ$LÑ€¸>wsa“6>ÿ`VÜðAŸ½©ÚjHŒ µ ¢7jU›Síÿ¢Ou;Õ™ñg`Rƒy‚A8"øu‘ù©""ŠV¯ñ^í¨Íð³¸ÇÞaU a!:]pˆ.8$Kimʬµ¸VÅù7I&h鎟þ6Íew+ÁAjóΧëŒC÷Ôãh¶ºmíÛž¨XRµ9¦&ªô­¢¯²cô°^Q´WŸãcŒ0HµÝ-ÂG"v*#v¬²ºAÍÓ™–±·PÄz 9®±ðIQ‚”ÑïÜV¯>OÑ'ì.M1^Kq*Ú`ún\\' 6îx³²_ðÊ=EËçÒ+“€ À”ü™k,.n1¦8˜7ò‰0ö¦Z›q•—šhŒKMb­oï{“½ÇVß®š†¿¤ÞŸu€I æ‰á(Á¯ î¤ÓŒQ­·sÊ¿âΦÂôÌŠ«1VU·*Š¿“7»ê÷ìmuitÁAqµ×¶‹9Î4dO5æ¬ûؽΠúø]d™5~”£‡£ª­yà!.[«Cô¡äʉØ)ŽX¯e»s7m¯¼Úf"öÖŠX¯!Ç5ãu-sæ²µ:úþ¥5™´N«SÛMzgmIYƒ“w ŒË™Ã%ï.Þû_øÃþð‡ÿÚ»ødÙ›gè”IÁL4˜Š!±¥ºE5n48ZûG¢èÍáaAéj¯·iÍÃ&¾»Z«+•Ä´Ä.25^›YRVŸŸbtTÖIì ¬ÃaÀ¤³× ë£ÒhÁ?”—jÇ<§|—ÈDcYYqYhÆ*“âl©,iQbw‡ûù¬&­A,…y…JVÊR¥½²¸I›p R7ì¼ Øy%DEo í[໬ÞÛ®E¥E•eç‡d%›TKEq“6¾4Š)DìTG¬×²¦h½µ8¯X›•lVœ-•ÅMÚ„}Dì­±þ†×Xô‚¨n‡­Ë4âh[uÅQSŠY,%U ""š°”ãæâÌ"ÉH4¸+˪¬Qû Uýá9‘ñØŽw~Úñío\ýÍÛë¾ñ¼ˆÈ·ö¾S¶ŒÎ$‰·4§Í!â¨*Ì´Ì”õÆO5"[½UŒÉþNv[kkj´©‰!ÑEd•æ”—envkMQ9ûr–ê&´0©Áì-ÇŽüÃGæ£V;Ö9åGq I.ÝÕU\Q‘}Ä¡j á±ùû2–úû¼sMXFiŽZXV˜Y¥7E%ìÞ·}àiCnkmM~iZbÈu”ï=¼4_NIqE^ºC á »ö¥Ep^±S±^˯Ú}@JŠ+ Ón­12a÷íaDì­±~‡×Xˆˆ!<Ö\Yžžn?p0mX€,ÍʉÏ+)άÓ£Rs²Üy•}¿I)-•â’²ì:·¢7Çç—fp}ðóYVöÎÞ´Çvœý×KÈ Ýp_úâ‹/è‘?þxΜ93fÌ +L¡>ø`É’%¾×óœH{lÇIypÏ‘-¯®{uKÍÀÿvþY–ì}§ÜŸ$ÚÉ“'xàéß'W®\¹xñâ½÷Þ;…mà™h·.¢(eÐÿé’ÉA ð$àI4À’h·.ªªuÐÿé’É1“.¸eýygÂNüLf¢Ü‚4‹¿ûT𨿠~ê{ñ’Ιh·¢¹Ë ~ù‡úá&a&àI4À’h€$Ñÿ?{÷Õçûÿ3_éCi·hÓB¦!.P•î{kÚšëB)Êè.’,d7Ì 3ø3FŒÁáG&¶™FBÒ„ NH²ÌD˜x—ÈÄ+ã-l‰IÑ[µ0UÂDä! ­)ºMqˆ•ï‚òëô9mÒ‚™ç£¦¬¡9ŸÓŸóáõé|λOŸ¨ ˆ¨ ˆ¨ ˆ0‡Ì›7ïæÍ›÷à‰dY–$‰׈"Àb0¾üòË{ðDW®\™?>®E4€9$,,lpp°¿¿_–e?=…,Ëýýýƒƒƒaaa ¸F ÀܰxñâÁÁÁ+W®ø©Ž&IÒüùó/^@iHóß…!˜SÂÃÇ9…s*(¢*(¢*(¢*(¢*(¢*(¢*øîPe2™îÓžSD€¿éÿ ´à㜀 Šh€ Šh€ Šh€ Šh€ Šh€ Šh€Š†`Nùæ›o¿þúkY–ý±I’æÏŸ@iH+F `ùæ›o>ÿüóððp³Ù,I’?žB–å+W®|þùç‹/¦Ž¦Ã0‡ †‡‡‡……ùï)$I ¿ý\Œ¹Ü `q»Ý!!!÷à‰|ðÁ¯¿þš׈"Üý ž~£kdÂ#WÏ,ØðôªÄÄU©Š›º†…bøÄæÄ©V´LÝÛÈ¥cÅ›SW%®JÝ`?vidÆgÔ²RߟÌfõNžÖð{Ù­R7´5é?ñÆæ§W%&&®yö¥ƒç®ú:_zvMbâªÔ ö&•Ét©aê§^ò©­â¡]m¯+Øœº*1qÍ{Ó%f1‰%±$Öo‰Õ9 1ÜÞTwŒñúÎnÞ¼9oÞ¼{ðD’$ùéžk?HÑà¬%ºšÊjºåÉ+ÄÜÜúîèÌ¢ªª¢LS[ÙŽ’SÃB,´í* h»Í Y3NÙݹ’-%§™EåEëMÎ’-{OM?÷Ò²RߟÌf•N ž¶ð{Ù­R7´5¹T³co‹HÊ/¯*ßn¨Ï-lê×:eFºnÉmt'äWU•®î.Û’{⪗ӻ½Zkj«th#—êvì¨qY¶—–ïI1¶•í¨èà”…Ä’Xë—Äj‰…Âu®®¦‰Å%~ ¸'øÕH×ÛÏý²q@!Œy­ ݦŒCë"…Öüüö'skN_}쉘ew®Úîoªé6mzÿ‰)×q·ÕµÊ ¥ùéË aÙÓþ䎺ÓW›¼•–m”úøD)Ì’R‚§%ü^²­8§457ô6´ XvUm^"„ˆÞu®uG“óêºEZ¦Ì°³¦qÀ’_µù±!¬Ö¢~çs5-—VfFÎxzWRã2I¾µU:4CgMÝ€-ÿÃV†±$ÚàÊmêÖH2IbI,‰ý¾«-r$ÀW¢€_š3Ë:TµÉg…<àb¡0D¯KK“ÆNÍúJjä̪4³ó˜Om½Œ°K2¸[ìêNw» Ñ ëów­‹YH$I,‰%±~I¬–È‘X™yèÐðs¿tnúðàÊ1< äÞš’:˺íÛLÊ­ú›rwÔHiùåùF·³¡¬lK¡áÃ7V†0œ ˆ˜d¸ëXYaI«œT´É:a9;Üö»£buyÜ ‹Y–…Á`˜´Bnß·üæ«wB/á×”m…9¥©ùHGñ“[ZÜB˜ÓªR´^p—i{+~wμÉ&u·”Tt 1vÅÂ%é/,?½Û[ãάJ‹ t9}m«4Ân!w—5%íÊ/5ËÝ ee[JŒ?Æ)‰%±$Ö_‰U‹‰…·ß²½ý¹ZÙ^jO_$„ ·Â骫éµíùpó²…Bˆ˜è=—þyKƒóêJªh˜ƒ(¢À¬¹Ú~poa½SØ2Ê÷l^2q™ÐßZã4¦Ïü.±$IÂí¾³$•Ýò„uŠöm¿†ùnC85üç^x²Ð) ! åG{ÝíônøÔ\FoÿPz¯³¡¢lGȧo?¡iõ²rOQGnaî?7 !L iq†F—aò¡ö7í­q§”§EúÞVq„…$„)£È¾.R±$Z»Ï:N9H,‰%±þIìôÈI$êŒ6›ÊÍwÝÝ.wwîÚÄ ™ºÜ‚"æ Šh0K âÏí=mX½çЮ•S}ý§ºMëÍØP2š r¯K{£Ov»dÉd2ø¼ à×0ße§…aÜžCÊB!ŒB(ïvÆnhl>ÒßÕ-›¬‘ .Š\¸(r—Ô~zG“sø‰•Ú>¹²ì…ý?›†ûÝÒ¢ùÜKO¶˜'éÈÀ¹nwoç/¯¤þ¹ÄÆ„òæâ%jm½Œ°Q’ KnßÇǼÄ$úÝBpÊAbI,‰ý¾«9 U’"Îøùö­ñd!Œ)¥å™æ;%Nɰˆ±óÉðY{Æ ÿ1v±ß¢ä7jŠ—?Ȩø_,³òŸ¹S%%mæMï*˜VA¢ÿtS¯ù …š4/‹Ý':o}“ýHï‰N9zê—ÔkÙðk˜ï.„3„?0dÑ-! ½ìViNikî:½wËŽšÛ·1–e·,$­o^=ñ†ýíöáÀ…‹BÅpgS§°¬Œžt¤–]ïó~išIW½ÿþ.K †¶^Fø1³Ü{nüC†{Û„1†Z9‰%±$Ö‰UŒ‰…¯îTΆ{Ûný?Ct´ÁÕí2Œ¥Éèj*«huñÝ>éùcÙƾýçO?ýôÓOÿüvìgÿÑàøW¢Àl,‰ m²9Ã4Ðvjlõ $£Åf B\í<Ñk°L¹ð}¸½¡æ”´nÓºÈÀ…qëWv”UœØ“ihØÛ"’JBîbþ ðk˜CèíTi¦ðO¦°[¯sJ½¹ˆ[g®¨(©ˆÙþD´äj«+k“’Jmo m0 çÞ½ҮÌeRg]ÉiCÊûq §ÌÛÈÈñƒ—"%!Í1·PokT:´„M ¹…%‘»Ò£egMÉiÃêò.‘ ±$–Äú!±Z#Gbq+Bvô^¶†Lûkš¤Þ†šcÑ™á¬)sÊÂ$„ÖÌLós%;ŠÅöu&÷©ºŠúî„*KU-FÎná?ÇzaÅßßþÍÿMûûw„â½}¦âQ“"Ü×\½B Ôï-œðXô®þu] #½'º…9}ÊÛÉîî¦ÆFÃ’õë"ÅÂ%»ÊóËJ*v<ç6D'äWå/[xWÛ~ ³R½,g ÿÔ•ùŒ»õ6§44‘éåEWKjjrÈ“-iOÕöeZ¿„-к½<_Þ[±wG½1:!¥´jóøÝ†ÜÝMÆe›ÖE~‡¶By„—í©Ê/+©)Ü2 L¶”¢ªMK˜×$–Ä’X$VsäH,„&[’¥îw[¶ô¿hÓ”€,Û•¿º°¬dG‹Áœ°>—»°îÖ/"3ËËEIYEn‹[2ZVï)ßne´µMG+μ½)þ…ÏfþõϨ }ï~ôí·ß2 „øâ‹/xàyóæ1fÑ_þò—ŸýìgêÛœÝÿÂgâ¼q4«6­6«qüß”—þ[üìí3¿ÓRDûì³Ïy䑹?&7oÞüꫯzè¡Yì÷D¸J’(Mø—!ñŠh€ Šh€ Šh€ Šh÷¯Y–Gä ÿ2$þÀÜ·þû¥”—„ÿ…?p%À}(0ö™X4ãoýÃ/þ'_Òù}ãJ4€ûуËíÿûS;ãpp% ‚" ‚" ‚" ‚" ‚" ‚"À2oÞ¼›7oÞƒ'’eY’$\#ŠhsˆÁ`øòË/ïÁ]¹reþüù ¸FÑæ°°°ÁÁÁþþ~Y–ýô²,÷÷÷†……1à0sG@@ÀâÅ‹¯\¹â§:š$IóçÏ_¼xq@¥!͆`N gæ>Î ¨ ˆ¨ ˆ¨ ˆ¨ ˆ¨ ˆ¨ ˆ¨`à»`@•ÉdºO{N ¾¡?úƒ?`|œPA PA PA PA PA PA PA PA PA PA PÀÀ½0Øü+{_žcc´4þȵöw«ë[=_Š ¿‹OÏËJŽÖ ÷™‚ttMn©‹·×¾f•&=&÷µTW¾{¦Ë­JÈÈÉ[!MF-Û(õ ðÉLaVáäài ¿—Ý*uC[syðÌ;Žº–®¡ÑáK“³ò2—}šÎj:/ËAQ é[ó’ö2™z›sÕl{ï@¦Y{Û™Mî®Ù–ýñõ;›Y þ´w ó˜Ä’XëÄj‰…®¶ÊÇI×Rû¿ï´Î²¯N$„OY~xÚ* ^wZ·åÚÍCÍû¼ª?ðZœÞ÷m”úøD!ÌÞC8-xÚÂï%ÛJÝÐÖ\;Z‚RóìKƒ'ߟž—µÂÌ'gH,‰%±þI¬–È‘XœRZ)ïÈiI­|oE°/¼i¯vZ³^ÉŠ1x:+ë_>lûÃú;w¦“/Öí>ÐfÎÈy˪8^ûzé¸êÂ8ýàÑ"{­nmž}«ÑÓÙX]½µTÿ‡Âx#£ Šhð·Îs±åÝÒ×ÏÊ+r3,VfngýQ±Üa›áòè¨ÐëïÜ7G·@Âíû6€_ÃìºÛz ¿¦l+Ì)MÍå û² ÿtCˆð5•ÉÛhKý©p¼S×¾?Ó*õœÜWÛ#ÄØeëÚç­c§wŽÃîÔâ´ÉÕák[…Cês‰Q¡‹±0ËpýLmå­×õ3ÝT $–Ä’Øï)±j‘#±˜F÷ôÖ”å+,z!D”tæHÎÐI¿¿~Ù¥‹}~yœ-Xˆ¨Ó£C&/©í³¾r 3N/„x8/§ï_ ›×â“ød-æŠh0k\u¯î?ò_ÂòŒ½h£uâº`°µ¡Ã¸væw‰%Nx65%Ôþ›Ù,]šŸ´Ôj’„«§ëÚž_g¥OØ0´û† ˆŠhð7¼ >³ÿçŽó†å9dÇOýtÀàùƞД¥3é·¡ísŽ-KeÏuY:åÖ­Z¶üæ» á´ðl9ÿV9*„:½QBy·3vCcsyðb÷h˜%Bo‹ˆ‹xQê8m?îô¬HÒ6kŒKÖ¿WŸéôHaÁr{ÑS'Ã'©<àìñ\îÊÎ<2þÈ‘_¤7ÇÛk_³Jjm½¼\H† [¢l&Ñp8>pì}M¨ZþÛý¥/ÆHÚ*š«mÿÏ >ºÝgw_Ç€Š^@"I,‰%±ßb#Gbá•»³áOžåŽÒŸ\÷p¨ä‘§|C€«½îͺ Öø´õ;Tý£t¾¾óš!*J½Çµ ìVºŒ×¿Y{ÖÅw `nàJ4˜%EGóùшg†ÚÚ†ÆÒY¬±FIq­óÌe}¬uòg<ÎæÃ§uÉ“#$½-k¹~gumkNªy¨ùÕ“bEAœñ.¶áÏ¿†Y1„ÞN•f ÿd »õ:§Ô› [òOjk÷ÕF=¿n}ïѱ K²_K=ðfmñ¶Q¡ ŠIÚj1V""ÃnÞ}§ø¤GôÈòGƒ¹âGß~û-£Bˆ/¾øâ˜7oÞ]´½ùå— ¨š÷ãßÍ9×Í›_}õÕC=4‹=çžh€ Šh€ Šh€ Šh€ Šh€ Šh€ Šh€ Šh€ Šh€ Šh€ Šh€ Šh€Š†¾»¡o¿e@•é¾í9E4ø„þèG ü€ñqN@E4@E4@E4@E4@ßÎ ÷Ä`ó¯ì}yŽÑÒø#×Úß­®ouö|)‚þ.>=/+9Z/Üg þÑÑ5¹¥.Þ^ûšUšô˜Ü×R]ùî™.·>*!#'oE„4ýµl£Ô7À'3…Y=„“ƒ§5ü^v«Ô mÍåÁ3ï8êZº†F„/MÎÊË\bôi:¨=ê¼,E%¤oÍK~ØËdêmÎýU³í½™fímÕmê>Abg7± m}è3æ^bµþùx…®¶ÊÇI×Rû¿ï´ÎüǺvæWÛ'9Ê3Â-Üg¸ üÏsñhõ῎NZ!6ÿ¾'*#·¨27Õä¬Î©ls a°d¿^Ppû¿Í²èu1 áS–ž¶Ê‚×Û‚2rí¯¥‡:¼Úæ™þ”¶Qêà“™Ã¬ÂiÁÓ~/»Uꆶær_­ÝÑ"âóìEoeYŽ¿üÉ Ö)#_|·°¸Ñ—WT´?=ª»ºp÷™kŠ£Õ×üjmϨomÕmÊ>Abg9±Jm5÷s0±Zÿ|¼ÆBq­­á¤;>÷½VÞŸÅW¢€_ÉÝ59Ù !DÐÄٙƞÐgÛR"„±y[;ž*n8}-nuðÃqÁwVuGzL™¥«ƒ§¬/õgGã ¶¥-Ñ óJGöÎ#m®¸F_·Qêà¥0KJ!Tž–ð{ɶâœÒÔÜÐ×Ü2óbQfR°Ö¨gvïp%‡i™2ơ˜¼¢Ì„`!bc_êøÅᓽñOÎtÁB_cåaW¨Î·¶*‡6uŸ ±³œX…¶²¦>cŽ&Ö ñÏÇk,„bÔ-댖“ž¡ÀW¢€_IæTûGeFø¤u¢|ÃcKûÑa²{ò»œî¶ÚZOrÞãS/s—ûœÝ"*)öÖÂDŠŽÒõœï•}ÞF©o€O”¬Bõà)…ßK¶µÌ)¯SCoy4Þ2¾Ü7IB•µMg÷å¾ÑÐóx[“-JwÙÙëBˆæ+Ò÷´ï¨·¹²v45om¨Om½Úô}‚ÄÎnb•“©¥Ï˜£‰Õøçã5B\;š»­òòè_lLÞß! á¾øÉ«¹ÙÉéé+ÒñóýuNýh„ÜûçÊ­Ù+ÒÓ“·îy§}üRAÏ…Æý¹Oe¤¯HÏÞZùI7/˜3¸ ü\E 3 wؤ7㤇3Å·ò´9ùå›eâ;ÆòÅúÚŽè¬ìé÷)“¯÷yt¡Æñ÷D¥ 0i´ÇåBòm¥¾¾%\!ÌrbU‚§~/ÙVŸSjÍ_Û9ÖÖu±­öìõŸ¬±š4Nç’¸>äº}Î684*äzaˆJþ§5º±ý 6ï;<šQ¼ÖÜqÒ§¶Þm¦}‚ÄÎnbÛjë3ælbµüùx…Á)¥•òŽœ–ÔÊ÷V ù›öj§5땬ƒ§£±²þåö?¬¿sg:ùbÝîm挜·¬ºãµ¯—ˆ«.ŒÓ-²×êÖæÙ·=ÕÕ[Kõ(ŒçÂUPD€¿yž‹-ï–¾~V^‘›a™°œu;ëŠå[ð ÜÑQ¡×nÿ¬[ áö}À¯avÝm½„_S¶攦æò…}Ù…º!DøšÊäÇm´¥þT8Þ©kߟi•zNî«íbì2 ƒuíóÖ±Ó»FÇawjqZ„äêðµ­Ò¡Í¼OØÙN¬×dÞUŸ1W«öçã5ÓèãžÞš²|…E/„ˆ’Îɺ1é÷×/»t±Ï/³ aztȤòÅ#µ}ÖWdÆé…çåôýKa³óZ|R0ã‰ÙG f«£îÕýGþKXž±m´N\ ¶6t×Îü.±¤Ó çÎ’tô†<õ 3MÛ~ ó݆pjøÝm{ž*íB,XúVõîh¯»Þ Ÿš )êùRGZ_GcmuÎþ¨?ì]¡éMïàøWr/ì.-~æc!Dhü›þãë†É÷ÏøÄQëIv¬ö%¹Ú*šâ>Abg5±*ɼ»>“ع‘Øé>‰×Xx'E$=®ëìøscg—ó‚³­ó†X:ù÷±©)¡ößlÌ~déÒ„øø¤¥V“$\=]×nôü:+}†¡Ý7E4ÌÑ`–ÄgöÿÜqÞ°<çƒìxó”ÚàùƞД¥3é·¡ísŽ-KeÏuY:åÖ­Z¶üæ» á´ðl9ÿV9*„:½QBy·3vCcsyðb÷h˜%Bo‹ˆ‹xQê8m?îô¬HÒ6kŒKÖ¿WŸéôHaÁr{ÑS'Ã'©<àìñ\îÊÎ<2þÈ‘_¤7ÇÛk_³Jjm•ÍÛ>É$‰½Ä*¶}%´ï»ô™ÄÎnb#Çk,¼»Ö¾¯°¸Ug[½üÑ”¬µ)Û_rO4½õùòº´Žó§ÛÚZkíÕï.ýc·mTˆ Ç_·§šïT)ýõYëo R-’†¶J‡¦¼OØÙL¬b[×ñïÐg;Û‰UŒ¯±ðÊÝÙð'ÏòÊêmI!;=ò”opµ×ÕöØ6>ŸfOË\ûæ¶ÂúÎk QQúë=®a·¾RV¾P÷ò‘ çsÖ~PD€¿Ñ%EGóùшg†ÚÚ†ÆÒY¬±FIq­óÌe}¬uòg<ÎæÃ§uÉ“#$½-k¹~gumkNªy¨ùÕ“bEAœñ.¶áÏ¿†Y1„ÞN•f ÿd »õ:§Ô› [òOjk÷ÕF=¿}=(.T/Ŧf„ç¼n¯Y›nœ¯¯=Ò½´ÈÄÊÑào–«oHˆ¡ß;J'<µóÝÒIùrk0O½‡§û“ÿ¨·f%GHBo˶ÿººò{Ž[•°µ8o‰þ®¶üf¥*›9üÓNÑfÚ­·9¥¡¹ˆXëȽ¾¯¡a÷ñ¡Ñ¡?Ï9µÄ õ!öyûVÙQû[û‘ਥ)Eǯfp÷|òǃâ2“Íß¡­Ðzh ±s"±Šm¿KŸIìl'VóŸ×XLþ X³ò/}³t÷u¡,Ï|-W¿ÏQýòqë{Žm`X’ýZê7k‹· ]PLÒVû‹±’v»8ðî;Å'=º G–ç8²bùƒ`ŽøÑ·ß~Ë(€â‹/¾xàæÍ›wmo~ù%ªæýøÇwsÎuóæW_}õÐCÍbÏÿ?þx€wÑÑÑÑÑÑÑÑÑÑÑ |wCß~Ë €*Ó}ÛsŠhð}ügÀdbàŒs*(¢*(¢*(¢*(¢*(¢*(¢*€9å›o¾üúë¯eYöÇþ%Iš?~XXX@¥!­)€9ä›o¾ùüóÏÃÃÃÍf³$Iþx Y–¯\¹òùçŸ/^¼˜:šF À288æ¿§$)<<üös1æZpO4€9Äív‡„„܃'zðÁ¿þúk\#ŠhpOô7lxú®‘ \=w°`ÃÓ«W¥n(nêBˆá›§ZUÐ>2uo#—ŽoN]•¸*uƒýØ¥‘ŸQË6J}|2S˜ÕC89xZÃïe·JÝÐÖ|¤ÿÄ›Ÿ^•˜˜¸æÙ—ž»êët~éÙ5‰‰«R7Ø›T&Ó¥† «ž>xɧ¶J‡<ÜÑPðìšÄÄÄUO¿ðö©~¢HbI,‰õ[bµFŽÄB ·7Õy_{B‹›7oΛ7ï<‘$I~ºçÚE4¸k‰®¦²šnyò 17·¾;:³¨ªª(ÓÔV¶£äÔ° m»J'(Ún3H–ÇÌSvw®dKÉicfQyÑz“³dËÞSÓϽ´l£Ô7À'3‡Y%„Ó‚§-ü^v«Ô mÍG.ÕìØÛ"’ò˫ʷÛês ›úµN™‘®ƒ[rÝ ùUU¥ë£»Ë¶äž¸êåônoń֚Ú*òÕ{wTôÚ¶—W•çǹ së.GKbI¬_«5r$B×¹ºš&—øâžhàW#]o?÷ËÆ!„0N\äµ6t›2¬‹BXóóÛŸÌ­9}õ±'Bb–ݹj»¿©¦Û´éý'¦\Ç=ÜV×*'”æ§/[(„eOû“;êN_}lòVZ¶Qêà¥0KJ!Tž–ð{ɶâœÒÔÜÐÛÐ2`ÙUµyeˆ"z×¹ÖMΫëi™2ÃΚÆK~ÕæÇB„°Z‹úÏÕ´\Z™9ãé]IË$ùÖV鯶յI««¶?a ":¿ýô/îÏŒ\D&I,‰%±ßwbµEŽÄøáãJ4ð«@sfù¡C‡ª6™'­åa“%î1ÓØ Mf£Ý“ß±>UQãNÉO™ºZé=×-¢WZÞÚôÊh©ûTïˆÏÛ(õ ð‰R˜•C¨<¥ð{ɶ–9åuj,I+-†±Í FIÌðÁ†™{îîí•Móx[Ó²h©÷\ï°Bô7<›˜øÂ¹‘ §wrf~ºÉ§¶Š}–eYH†±³Å@É I’Q"‘$–Ä’X?$V[äH,„—êž~®~@îÜ»vMqÇÈð‰Í«6k?fvͳ/‰þ¦gWmh¿ðjÓ†;? w4lH]•˜˜˜º¹¸‰ÛŒ`ÎâJ4ðs-dQdˆî6Lz0fóÛï¬fÏÕµ â,ß1骫pFoß3퓲«×-™n¯ã$£I’»]n!}ÛF©o€o W³Ü­B•à)‡ßK¶Õç”ZóbûXÛ«]§kZ]ætÛ"mÓY2HÂ5àº}Î60 yÀ-ÄBaˆ^—–&Ïõ7”ÔÈ™Uifç1ŸÚ*NçEqë,55­ëö7 –DIKbIì÷œXÅÈ‘X¨’¤iæÒ£|ûÖx²Æ”ÒòLó§dàK|3|ÖžñÂŒ]ì·(ùšâå2*~À À¬ügîTII›yÓû‡ ¦UЄè?ÝÔk~B¡†&ÍË¢E÷‰Î[ß¿>Ò{¢SŽžú%õZ¶üæ» á á YtKÈÂ@/»UšSÚš»Nïݲ£æömŒeÙ- IëÅ›WO¼a»}8pá¢@1ÜÙÔ),+£'i e×û‡Æ¼_šfÆÕE￿˨¡­bŸe1å®Ü²†E\qJbI,‰õCb#Gbá«;•³áÞö[ÿÏmpu» ci2ºšÊ*Z]|·€OzþXöŸ±oÿùÓO?ýôÓ?¿ûYÅô0(~Á•h0KbgC›lÎ0 ´[=Éh±YC…W;Oô,S.|no¨9%­Û´.2paÜúÕ†e'ödšö¶ˆ¤Ò„»Ø†?üfÅz;Uš)ü“)ìÖëœRo.âÖ™+*J*b¶?-¹ÚêÊÚ¤¤R›¶K$„Á$œ{ ÷J»2—Iu%§ )ïÇ-œ2oC"#Ç^Š”„d4ÇÜz@C[¥>'dÚ*Jö–ÄìJ·Ü eGå„¢Þ·'±$–Äú!±Z#Gbq+Bvô^¶†Lûkš¤Þ†šcÑ™á¬)sÊÂ$„ÖÌLós%;ŠÅöu&÷©ºŠúî„*KU-FÎná?ÇzaÅßßþÍÿMûûw„â½}¦âQ“"Ü×\½B Ôï-œðXô®þu] #½'º…9}ÊÛÉîî¦ÆFÃ’õë"ÅÂ%»ÊóËJ*v<ç6D'äWå/[xWÛ~ ³R½,g ÿÔ•ùŒ»õ6§44‘éåEWKjjrÈ“-iOÕöeÏïD u{y¾¼·bïŽzctBJiÕæñ» ¹»›Ë6­‹üNmúòDQ•\QVS¸¥B–L–ÕùUÛãî1$–Ä’X$VsäH,„&[’¥îw[¶ô¿hÓ”€,Û•¿º°¬dG‹Áœ°>—»°îÖ/"3ËËEIYEn‹[2ZVï)ßne¥ªm‚ÿã£YµiµYãÿ¦¼ôßâgoŸù–"ÚgŸ}öÈ#Ìý1¹yóæW_}õÐCÍb¸'Àý+P’¤@i¿ ‰PDTPDTPDTPD¸Ȳ<"Oø—!ñ†à¾õß/¥¼$„˜ø/ü+ÑîC±Ïüâ³è~ñ?ù’ÎïW¢Ü\nÿߟÚ‡{„+ÑÑÑÑÑÑÑæyóæÝ¼yó<‘,Ë’$1àQD˜C ×_~yžèÊ•+óçÏgÀ5¢ˆ0‡„…… ö÷÷˲짧e¹¿¿pp0,,Œ×(€!˜;/^<88xåÊ?ÕÑ$Iš?þâÅ‹( iþ»0sJ@@@xx8ã0§ðqN@E4@E4@E4@E4@E4@E4@ECßÝÀÀƒªL&Ó}ÚsŠhð=ýÑøã㜀 Šh€ Šh€ Šh€ Šh€ Šh€ Šh€ Šh€ Šh€ Šh€ Šh€Š†î…Áæ_Ùûò£¥ñG®µ¿[]ßêìùRý]|z^Vr´^¸Ïü££krK]¼½ö5«4é1¹¯¥ºòÝ3]n}TBFNÞŠiú3jÙF©o€Of ³z'Okø½ìV©ښ˃gÞqÔµt ._šœ•—¹ÄèÓt>P{ÔyYŠJHßš—ü°—ÉÔÛœû«fÛ{2ÍÚÛ*Žä5çGÕï~ìüËuÝß=šùʶd3³˜ÄÎ…Ä*‰½«5r¼ÆBW[eŽã¤k©ýßwZg³kg~µíp’£<#ŒÑÂ}†+ÑÀÿ<Vþëè¤bcqñï{¢2r‹*sSMÎêœÊ6·Köë·ÿ÷Û,‹^“>eùái«,x½-(#×þZz¨ó@Á«mžéO©a¥¾>™9Ì*!œÏ^ôV–uàHñËŸ j2òÅw ‹=qyEEûÓ£º« wŸ¹¦8Z}ͯÖöŒúÖVéåÞì;®[² ßÊI6:«sj/Èä‘ÄÎ~b•ÄÞωÕ9^c!„¸ÖÖpÒŸûÞF+UGüðp%ø•Ü]““ýñBM\äiì }Ʊ-%B›·µã©â†Ó×âV?|gÝ|´¡Ç”Yº:xÊbÏYv4¾`[Ú½1¯tdï<ÒæŠ[aôu¥¾>Q ³¤B…ài ¿—l+Î)MÍ }Í-C1/e& azÑyfçñWr˜–)ãîhhŠÉ+ÊL"6öµ¡Ž_>Ùÿ¤y¦Áj¬<ì ÕùÖVéå®Ú#C?Ýf>>Xkô‚ë»÷ ˆX3™$±³›X¥CÓ“Øû8±Ú"Çk,nuË:£%Ƥg(ðÄ•hàW’9ÕþÃQ™>i(ß0ÅØBÇ~4„E…ìž|9˜»­¶Ö“œ÷øÔËÜå>g·ˆJнµ0‘¢ã£t=ç{eŸ·Qêà¥0+‡P=xJá÷’m-sÊëÔÐ[·Œ/÷ A’GemÓÙ}¹o44Æ<ÞÖd‹Ò]vöz„b yÇŠô=mã;êm®¬MÍ[êS[ÅCî;㼕b; 6,Ùv`w2gw$vö«8Â$ö>N¬¶Èñ !ĵ£¹Û*/þõÀÆäý²¼š›œž¾"ý?ßÿQçÔFȽ®Üš±"==yëžwÚÇ/ô\hÜŸûTFúŠôì­•Ÿts æ ®D?WÑ‚ÃÌÁÂ6éÍ8éáLGñíŸ2Ð IDATã5ÓèãžÞš²|…E/„ˆ’Îɺ1é÷×/»t±Ï/³ aztȤòÅ#µ}ÖWdÆé…çåôýKa³óZ|R0ã‰ÙG f«£îÕýGþKXž±m´N\ ¶6t×Îü.±¤Ó çÎ’tô†<õ 3MÛ~ ó݆pjøÝm{ž*íB,XúVõîh¯»Þ Ÿš )êùRGZ_GcmuÎþ¨?ì]¡éd)8þ•Ü »K‹ŸùX¿Æ¦ÿøºA7i“OµždÇÚi_’«¡­ÒHJB'Dè3»w¦D!¬Ñº±;%¥pŽAbg5±Š#LbïÿÄNœÄk,¼“"’×uvü¹±³ËyÁÙÖyC,üûØÔ”Pûo6f?²tiB||ÒR«I®ž®k7z~•>aÃÐî‚"(¢Àßð‚øÌþŸ;Ζç|?õÓÏ7ö„¦,ùK¿¥ ýhŸktlY*{®ËºÐ)·nÕ² à×0ße§…ß`Ëù·ÊQ!„Ðé’Ê»±›Ëƒ»GÃ,zCXDtXÄ‹RÇiûq§gE’¶Yc\²þ½úL÷ G –Û‹ž:>ùHågçrWvæ‘ñGŽü"½9Þ^ûšURk«8’RPN§·Ý¾SR„Õ$šnÁ9‰ÕÄ*0‰½«9^cáݵö}…Å­:Ûêå¦d­MùØþê”{¢é­Ï—×¥uœ?ÝÖÖZk¯~wéo»m£B=þº=Õ|§â©3„1š˜øb˜ ž¶}•NsÆþÛ6­‚&ÄÀùOþ_øò…µ‚a‹=­Æ¿ýì…Ѩ¥Sv¢eÀ¯a¾»Î~)Øf 3ë%/»UšSÚš»Î;¶Ùß¾o±,ß…N댹væÍ·jœÉ, Oçñ "6~òe¤’%»ô‡ã‡ãÇþ×ׄРå¿Ý_úbŒ¤¡­bŸ¥ð¥æÑ¾¶¾±N»û:DPôIbg9±Š#LbïçÄ*FŽ×Xxåîlø“g¹£´ðÅ'WÄ=*yä)ßàj¯{ó£.ƒ5>mýΕEÿ(¯ï¼fˆŠÒ_ïq-»•.ãõãoÖžuñݘ¸ fcIÑÑ|~4â™°¡¶¶¡±‡tAk¬QB\ënß~ ³b½*ÍþÉvëuN©7¶äŸÔÖî«z~y”tÝY_í”-°i¼xS*:/;¤SmÒ…#ûÎëSöÛ ãƒSÛ¦KÉL6G˜ƒoŸ°é„.Èüp„Q!4´UêspÜÆ¥µ¿.­4g¯í¨­—|çk%$Ñ×RÒ­ßš#¹œÍ§¯Å…ê¥ØÔŒðœ×í•"ëqÓóõµGº—™X¹‚"üÍrõ 1ô{Gé„Ç¢v¾[š" !_níæ©÷õðtòñõÖ¬äIèmÙö_WW¾cÏq룶ç-ÑßÕ6€_ìBe3‡Ú)ÚL»õ6§44k¹×÷54ì>>4º ô§ñ9²–´ž"Ä>oß*;jk?µ4¥ hãø×޹{>ùãÇAq™ÉæïÔVi$õq9Å¿®®¬--üR„þôñÜ™Væ5‰õÄ å&±÷ob5GŽ×XLþ X³ò/}³t÷u¡,Ï|-W¿ÏQýòqë{Žm`X’ýZê7k‹· ]PLÒVû‹±’v»8ðî;Å'=º G–ç8²b|Ì?úöÛoB|ñÅ<ðÀ¼yóî¢íÍ/¿d@Õ¼ÿønιnÞüꫯzè¡Yì9÷DTPDTPDTPDTPDTPDTPDTPDTPDTPDTPDTPDT0ðÝ }û-ƒªL÷mÏ)¢À÷ñŸ“‰A€0>Î ¨ ˆ¨ ˆ¨ ˆ¨ ˆ¨ ˆ¨ ˆ¨`æ”o¾ùfppð믿–eÙû—$iþüùaaa”†´b¤æo¾ùæóÏ?7›Í’$ùã)dY¾råÊ矾xñbêh1LsÈàà`xxxXX˜ÿžB’¤ðððÛÏŘkÁ=Ñæ·ÛržèÁüúë¯p(¢À=Ñß°áé7ºF&Q ³¤B…ài ¿—l+Î)MÍ ½ -–]U›W†!¢wkÝÑ伺n‘–)3ì¬i°äWm~,D«µ¨ßù\MË¥•™‘3žÞ•Ô¸L’omU¦óÔ}‚Ä’Xû½'V[äH,€>®D¿ 4g–:t¨j“yÒ:Q6Yâ3ý¸Ðd6 Ù=ù»áS5î”ü”ESËr½çºEôJËÂ[û^-uŸêñy¥¾>Q ³rÕƒ§~/ÙÖ2§¼N ƒ%i¥Å0¶™Á(‰>Ø0sÏݽ½²ÉbokZ-õžëBˆþ†g_872áTLÎÌO7ùÔÖûtž¾OXKb¿÷Äj‹‰…âRÝÓÏÕÈ{×®)î>±yÕ†cíÇìÏ®yöà%Ñßôìª Mã—^mÚpç§áކ‚ ©«S77q›ÌY\‰~®¢…,Š Ã݆IÆl~ûàÕ칺–Cœeâ;Æ#]uÎèí»b¦}ÒBvõº%“qü=QÉh’än—[ˆ@ß¶Qêà[ÂÂ,w+†P%xÊá÷’mõ9¥Ö¼Ø>Ööj×éšV—9ݶHÛt– ’p ¸nŸ³ ÈBp ±P¢×¥¥Icç^ý %5rfUšÙy̧¶Þ¦óLû‰%±$Ö‰Õ9 !"3~î—ÎM\"†„Ü[SRgY·}{‚—ZdSîŽ)-¿<ßèv6”•m)4|øÆÊ†Ñ“ w++,i•“Š6Y',g‡Û~wT¬.›añ ˲0 “VˆÂíû6€_Ã|õnCè%üš²­0§45é(~rK‹[sZUJ¤Æã‰Ë´‰½¿;gÞd“º[J*º…»Œbá’ô–ŒŸÞí­qgV¥Eºœ¾µUÉ™÷ KbI¬¿«9ûÿ³wÿAQÜyþÇß[BO†Š‘07o°*Ã]VV¬ Hù+–Ñ= û…ì7oÕ¬AM$'²·@6@"! ƒ‰ë{ÜØïo\rš\‰nI´˜oÕJªÂ\ÔùÆ0AM1$E+ß?åWÓ=à(¸ÏGY” ýééþô«{>ýžžˆÜ|Ëöæg`UsFYaF”ˆˆÆ­ðzÛkžø‚C›†‹H¬½àâO7×»º–QEÃ$D îš®Ö}Eùu.‰_SY°iþàaBÇq§Ë’1ú»ÄŠ¢ˆßkHªúÕAããÓA óxC8<üÝ'¶=‘ïREÄœTùÇû˜³¹5“}ëƒW}Uyv~ì¡=½G,+(>—›ŸûÓ±&¥'˜|æ¡«ÚÑXäô§T¦Ç˜o«Õ“šó‰%±$68‰9…ÄBŸ%>^çæ»~w›ÏïÎ]<è1k»_(¢a¢ˆwi@|l×Ú¢fóÊ‚ƒ9ˆÐ:šëÝÖÔ¤¨Q*›YõøÔþ7úT¿OU¬VsÀÓA ó8C8"üá ©""ŠÙbÑží¨‹a°yoG»[µÆÅ„‡GÅ„GÅä(­ÍÙ®îÇ—…ꈅÛ~û_YÝ~%*B=½ã‰&ÛÐ5íõžvû=mÏe¬¹¯¹hs¶óæmŒUÕ¯ŠbôâÍ®c¯îií6…GE˜¤»­±MËìCÖÔäÈ9p°ß²t«XV8ã0h«µÌÚó‰%±$öv'V3r$ºU9ëö´zoüÏl·›}nŸ¹?M_cyÕqß- (ÿó¼=9sæÌ™öÌ;[õ§ tJPp%Ü!±«¾Eµ­±z[NôD±8âã"L"ÒÕvÌcv »ð½»µÞyBIÍJ1…'¬_iÎ.¯:VióÖ5ÉÒ²¤ˆqLÃf@Pì±N•F ÿP³sŸÒo. ©¶ªªÒªØ­Û_Kmy‹²´,ÞØ%b¶Š«(¿HÉÉ\¨´Õ–6›S$„Ûo#bbV^‰QD±Øbo<` ­Ö2kÎ$–Ä’ØÛœX£‘#±¸Qý^OWw\Ĉ­iU<õΣöL‡¸œå.U¬""¦¸ÌLÛÚÒìÙšjõŸ¨­ªs'U[ªÑ{jkâ¶?ü¶mÉnþå¿Óô¦ˆÈ?î9Yõ(I ¦4ŸÇ+â­+Êô˜=ç¿M5‰ôz޹Ŗ1ìíd¿»±¡Á<}jŒIÂççTæ•—Ve¯õ›íIyÕy ÃÇ5 Ô0k…pŒà¨á>2u¶cíSšKLFeqW©Ó™{Ø«š­ñK ª·.4x~'¦¸­•yjQUQvÅž”RV½iànC~wcCƒeaVjÌ„ÚÞ“ ±$–ÄÞÖÄŽ‰…ˆXã—:jßÞ¼¹ãÀÁ¬aY˜“·2¿¼4»ÉlKZŸ—ãϯ½ñ‡˜ÌÊJ)-¯Êmò+ÇʂʭqŒTí VÜ“•¸íìè~„ Úm÷ƒï¿ÿž^ùâ‹/î¿ÿþiÓ¦Ñî¢O?ýô‘GÑŸ®÷TVâ¶³òw¯^W“^³®aàgÊŽ¿È#{N¾m¤ˆvöìÙ‡~xò÷Éõë׿þúë|ð..÷D˜ºLŠ¢˜”A?é’ࠈ蠈蠈蠈0uõªªÚ«úI—G]0eýeGÊüÁÀ•hSiÞS?Žõ/Q?þÙßó%·W¢LE,.ü3…ôÕh€Šh€Šh€Šh€Šh€Šh€Šh“È´iÓ®_¿~žHUUEQèpƒ(¢L"f³ù«¯¾ºOtåÊ•éÓ§ÓáQD˜D"##;;;;::TU ÒS¨ªÚÑÑÑÙÙI‡BL!!!sçÎíìì¼råJêhŠ¢LŸ>}îܹ!!”† oº`R ‰ŽŽ¦&>Î è ˆè ˆè ˆè ˆè ˆè ˆè¡ `â¼^/º¬Vë]rŠhðWý20‚s:(¢:(¢:(¢:(¢:(¢:(¢:Bè€I¥¯¯¯««ëêÕ«Á{Š™3g>ðÀ!!”†Œ¢§&‘ï¾ûîüùóÑÑÑ>ø ¢(Áx UU¯]»öùçŸÏ;—:šA|œ`¹råJdddddd*h"¢(ʧ¸rå nE4€IäêÕ«?üáïÀýð‡? ê'Fï1ÑàŽè¨ßðäëí½ƒé:½o׆'—''/OÛPÒØÞ-"Ò}lSòpËwµöŸ[ïÅ£%›Ò–'/OÛPxôbï¨Ïhd­e2Z˜õC84xFÃ?ÆlµÃXóÞŽc¯ozryrròª§wì;Ýèî¼ãéUÉÉËÓ66êìLë7,rßÅ€ÚN|™AbI,‰Xbn> énm¬{ì ƒ¦M›vÏ<Ë=ƒ"ܱD{c¹Ó­!ææÖ¹í™ÅÕÕř֖òìÒÝ"áñ9eƒo7+ŽE6Ó°Ù.Ý\ÚlÉ,®,^ou•n.:1òÜËÈ4ZËdô0ë„pDðŒ…ŒÙj-†±æ½ÙEM²4¯²ºrk¼·.7¿±Ãè.ÓÛ¾osnƒ?)¯ººl½Ý]¾9÷X×§wEUƒZj;áe‰%±$v‚‰5ºùH,DÄwºÖÙÈà÷(nAÕÛ¾gí3 ^ËàAÞñz·uÍÁ]©1"——×úD®³¹kÑã± #n›nkÖÇ#† öZj«Iey ÃE­Od×6w-:•‘i´– ˆV˜­jÏHøÇȶæ>e¨¹ÙSßäuäToZ!"öœÓdz]]©QFv™n—³Áëȫ޴(B$.®¸ÃµÖÙtqYf̨§w¥NŸU ¬í„–$–Ä’ØÛX£›Ä¸×q%•É–YyðàÁê,Ûq¢Úmu$,²öÿnµYDõ}Ç®ûD•ÓŸ’—5¼,ç9íû2GøùÛ—Ù÷ OoÀÓh-­0k‡P?xZá#ÛFö©1w ³cé2‡¹2³EUUíÎ~Gµ:lm­ íŠç´§[D¤£þéääm§{Þ©™yÖ€ÚNl™AbI,‰½ ‰5¸ùH,D.Ö>¹¶Î«¶­^Ur®·ûئå޶-|zÕÓû.JGãÓË74\ØÕ¸áÖoÝçêwmH[žœœœ¶©¤‘ÛŒ`ÒâJ4r-"*&BºÝæ!ÆnÚ³ïÖhötm“לàüŽqo{m•˾5'vÄ'-TŸÇ¯X-ï³*«¢º}~S`Óh-XÂ5¬º5C¨<íð‘mý}J¯yIaÛ®öfçqŸ-#>ÊØî¬˜ñy}7ÏÙ¼^UT¯_$\ÌöÔôt¥ÿ|®£¾Ô©fV§Û\Gj;Áe‰%±$ö¶$ÖÈæ#±‰ÉSÚb]Sy°pÑàaBÇq§Ë’‘1ê»ÄŠ¢ˆßkx§úÕAããÓA óxC8<üÝ'¶-¿ñ=r«vµöêÌväbÔ\Lö­(ËY) ÙùG~[IJ‚âtåpîO{ì‰ÍµÊÊó“°ÁkÕXäô§¤Ç˜o”e&±$–Ä’ØÀ;ró‘X`‰×¹ù®ßÝæó·ä®îÿâØÇ6ö‰¯·1)q%Ü¥ñ±]k‹šÍ+ æ,>èëh®w[S“FÿЀb±™UOí£OõûTÅj5< Ô03„#žPpð*"¢˜-&íÙŽº›÷v´»Uk\LxxTLxTLŽÒÚœÝèê~|Y¸±S¼…Û~û_YÝ~%*B=½ã‰&ÛÐ5íõžvû=mÏ}îܹ!!”† oº`R ‰ŽŽ¦&>Î è ˆè ˆè ˆè ˆè ˆè ˆè¡ `â¼^/º¬Vë]rŠhpÌúÁ踇ñqN@E4@E4@E4@E4@E4@E4@E4@E4@E4@E4@G]wB瑟^ÚYñ¬]xäjë;û뎻.|%3þ61cçºö0ñŸÜõOíC[†&Ö¼§ yL½Ô´ï;'Ûýas’Ölß¹d¶2òL£µl@@F ³~‡ÏhøÇ˜­Öbk®vž|³¢¶©ýrß}Ñ V¬Û™9ßÐîüVÍa×—êŒ9I[v®xhŒÉs$÷çGâóV¦ÍxÛ‰/3HìL¬Æª‘Ø)X£›c,D|-{·W|ì[Pø^ˆ}c]=ùóçÞ]ZQ¹&’ÞÂÕh|=çï÷ú†ŒJJþýœ5¹Å{sÓ¬®ýÛ÷¶øEÌŽ¯íÚpn”B IDATuó߯Ö9ÂBc“¢‡ ?zZöîz­eÆšÜÂW2f¹ÞÚõrKÏȧ40Ö²=Ì:!§ŠøÏðrîÆK2~öÏ»ÿØ6ü£ªç£½[6®Y’‘±bKÁ›­— ö|Ö°;÷'k2–dlܲ÷7]Iƒ+Ñ ÈU´™‘¶™âòfœòPfEÉÍßzZÞûø«ûâƒß1VÏ×Õœ³¯Û8ò>eêµK=¡³,ï³*3"•¾ ¾%°i´– ,áaV/h†P'xÚá#Ûúû”^óW^èoë;ßRsêÚ߬гÜïSäÚeßÍs¶ÎË}¢z{DÂÄŽ±™™R¶WÍÞÞ”¶÷7KfŠúÙ…û]që~¹.ÖÜs®aoÝ/Þÿýú[w¦SÏ×¾ôV‹mÍö_Ç…z?¬y­ì­„ýù a‡‹ kBWï,ÜbéikØ¿KYØïó¹ Ñà¯^Ïù¦wÊ^;¥.É]ã4œõ»êËâŠø™£ pûú$,Ì|ó÷ÐûàÓA ³o¼!#ü†²­±Oj®~öêÆüÿüF$zÕÞ³ ®·%>í¤âÍÚÖÝ™qÊ…_­¹ Ò…9nõóqý§w ïúÓJÒg+¾sµõa™Abƒ—XU#±S:±z›c,FKxrKÊâ%Ž0™£œ|oûåo†üýÚ—¾ÐyÏ/NˆŸ)2g¶õÑËÖPQÏ¿Ws)î—oe&„‰ÈC;·_úßùG\W—Τ?q÷QD€»Æw®öåÝïý_qsµ´}# †þ}^ZʬÂ}vãà $%&.]gUÄw¡ýê7þe]Æ  g¹¿Šh ˆÅâ“»ÿ¹âóâí¿Û˜h6èëü¤á¬”£é·2cvXß%__ÿOí¹¦†ÎvëV#ÓA ó8C8"üæøíÿ¶·OD$4Ì¢ˆhÏvÔÅ0Ø\í<ïî‹tÌ3GζGÎ~Q9×\ø¡«gÉRc{eþúßÔeú;{”È™jkñO>Žº¦ª×u¡çËö™ï <òÞÏ2Ž$Ö¼§èµÕìÉ .3‰%±AJ¬Öª‘Ø)XÍÍÇ1c»Úúj~ÉñÐø•‹MY·:åý—‡Ý-,îùÊÚôsŸ4·´¯)Üÿ΂­x)¾OdÆc¯¦ÙnUøÑ‹“4Æ Êìx»\8þÙ1ˆê9õYßœÃfbd ¨a_G ¿2ÓiŒ´Î SƘ­Ö>e¬¹ï“Šç ß½yßbUýF•P£{ÌÕ“oüÚéêQÌ‘3éiûð3™—8ô2Rű±ìw¿«¨ø]Åî×VÍ’‹µ»ìÅXÅ@Ûà,3‰%±AK¬Öª‘Ø)XÍÍÇ1cò·ÕÿgÏ⊲üŸX’ðÐ,¥Gö ¾ÖÚ7þØnŽKL_ÿÂ[{‹ÿIù¤®íªyΜ°k|÷EÞH—åÚ‡oÔœòñݘ¸ îÆâÜ‘Oúf?y¹¥årÿC¡3qó,Šˆ\m;ùeؼ¸¡Ÿèqy·9tų+f+añ뇽°¿æøö4Ûå#/,Kv%XÆ1 ›A ³fÇ:U-üCiÌvÌ}J¿¹Ä¯ø›ššWkæ<¿xŽrÍU·ß¥<º+Þàåa³¤­âÊ‹iñÊgï½úIXÊîxó@çÔ´„¦d®°Íœm›yó„-TBgØšm1Ð6ËLbIlÐkÑX5+‰Ê‰59ޱJ™1+ì›ÏŽ»Î[bÏ©ÚW?ù¦/ö’O½õ Š\jªûض%=Vñ¹Ž4_›‘0+L™—¶&zûk…{eÝcÖo>©«yϽ ØÊÈÑ௖ïÒe‘Ëÿ^Q6è±9/¼S–¢ˆ¨_¿ ¶á÷õèqðþÂâÖ­˜­HXüÆÂÙ¿÷ÍÂíþ°9I[JvÎ×4@PìBm£‡Ä)Úh³kŸ2Ð\f¯®È½öj}ýK^î»oÖ?$nkÝ|³ÑS„yÏnQ+j~UøÞÌ9 Rv?;ðµcþ üáý ™+lj„e&±$6h‰­U#±S9±†#Ç1C·@ܺ•½QöÒBg=¼8ó•ܰW+öÿâøß<Ú?yþÆWÒÞz£¦ä¹> »tKá‹ó‘Ùk å­wÞ,ù¸'tÆÃ‹·W¬›ÇÀ“ľÿþ{zDä‹/¾¸ÿþû§M›6Ž¶×¿úŠ]Ó~øÃñœs]¿þõ×_?øàƒwqɹ' ƒ" ƒ" ƒ" ƒ" ƒ" ƒ" ƒ" ƒ" ƒ" ƒ" ƒ" #„.€‰»üý÷tè²NÙ%§ˆ·ãeÀj¥àÆÇ9ÑÑÑÑÑÑ!tÀ¤òÝwßuvv~ûí·ªªcþŠ¢LŸ>=222$„ÒQôÀ$òÝwß}þùçÑÑÑ6›MQ”`<…ªªW®\ùüóÏçÎKÍ º `éììŒŽŽŽŒŒ ÞS(Š}ó¹ès#¸'À$â÷û#""îÀ=ðÀß~û-nE4¸#:ê7<ùz{ï GºNïÛµáÉåÉÉËÓ6”4¶w‹ˆtÛ”<Üò]­½ÃçÖ{ñhɦ´åÉËÓ6½Ø;ê3™FkÙ€€Œfý žÑð1[­Å0Ö¼·ãØë›ž\žœœ¼êéûNwº;ïxzUròò´ …:;ÓÅú ËŸÜw1 ¶_fXKb'–X£›ÄBº[kÇ{ˆëׯO›6í<‘¢(AºçÚ=‰"ܱD{c¹Ó­!ææÖ¹í™ÅÕÕř֖òìÒÝ"áñ9eƒo7+ŽE6Ó°Ù.Ý\ÚlÉ,®,^ou•n.:1òÜËÈ4ZËdô0ë„pDðŒ…ŒÙj-†±æ½ÙEM²4¯²ºrk¼·.7¿±Ãè.ÓÛ¾osnƒ?)¯ººl½Ý]¾9÷X×§wEUƒZj;áe‰%±$v‚‰5ºùH,DÄwºÖÙÈà÷(î‰AÕÛ¾gí3 ^ËàAÞñz·uÍÁ]©1"——×úD®³¹kÑã± o]µÝÑèt[³<>ì:îî–ÚãjRY^ÆÂpGAëÙµÍ]‹†Ned­e¢fE+„Á3þ1²­¹OjnöÔ7y9Õ›–Eˆˆ=çôñìFWWj”‘]¦Ûålð:òª7-Љ‹+îp­u6]\–3êé]©ÓgUk;¡e‰%±$ö6$Öèæ#±îu\‰Ae²eVQåô§ä¥D /ËyN»Å¾Ì~cþöevÅ}ÂÓð4ZËD+ÌÚ!ÔžVøÇȶ‘}jÌ]ÃìXºÌaîŸÌlQd”6Œ¾ä~Gµ:lm­ íŠç´§[D¤£þéääm§{Þ©™yÖ€ÚNl™AbI,‰½ ‰5¸ùH,D.Ö>¹¶Î«¶­^Ur®·ûئå޶-|zÕÓû.JGãÓË74\ØÕ¸áÖoÝçêwmH[žœœœ¶©¤‘ÛŒ`ÒâJ4r-"*&BºÝæ!ÆnÚ³ïÖhötm“לàüŽqo{m•˾5'vÄ'-TŸÇ¯X-ï³*«¢º}~S`Óh-XÂ5¬º5C¨<íð‘mý}J¯yIaÛ®öfçqŸ-#>ÊØî¬˜ñy}7ÏÙ¼^UT¯_$\ÌöÔôt¥ÿ|®£¾Ô©fV§Û\Gj;Áe‰%±$ö¶$ÖÈæ#±‰ÉSÚb]Sy°pÑàaBÇq§Ë’‘1ê»ÄŠ¢ˆßkx§úÕAããÓA óxC8<üÝ'¶-¿ñ=r«vµöêÌväbÔ\Lö­(ËY) ÙùG~[IJ‚âtåpîO{ì‰ÍµÊÊó“°ÁkÕXäô§¤Ç˜o”e&±$–Ä’ØÀ;ró‘X`‰×¹ù®ßÝæó·ä®îÿâØÇ6ö‰¯·1)q%Ü¥ñ±]k‹šÍ+ æ,>èëh®w[S“FÿЀb±™UOí£OõûTÅj5< Ô03„#žPpð*"¢˜-&íÙŽº›÷v´»Uk\LxxTLxTLŽÒÚœÝèê~|Y¸±S¼…Û~û_YÝ~%*B=½ã‰&ÛÐ5íõžvû=mÏ}îܹ!!”† oº`R ‰ŽŽ¦&>Î è ˆè ˆè ˆè ˆè ˆè ˆè¡ `â¼^/º¬Vë]rŠhpÌúÁ踇ñqN@E4@E4@E4@E4@E4@E4@E4@E4@E4@E4@G]wB瑟^ÚYñ¬]xäjë;û뎻.|%3þ61cçºö0ñŸÜõOíC[†&Ö¼§ yL½Ô´ï;'Ûýas’Ölß¹d¶2òL£µl@@F ³~‡ÏhøÇ˜­Öbk®vž|³¢¶©ýrß}Ñ V¬Û™9ßÐîüVÍa×—êŒ9I[v®xhŒÉs$÷çGâóV¦ÍxÛ ®2HìNìØ«Æ‹ÎÔL¬ÑÈqŒ…ˆ¯eïöŠ} ÿÏ q£o¬«'þÜ»K+*×DÒ[˜b¸ ‚¯çüáýïþOßbCIÉ¿_˜³&·xonšÕµûÞ¿ˆÙ±ñµ]»nþûÕ:GXhlRô°áGOËÞ]¯µÌX“[øJÆ,×[»^néù”¦ÑZ6 £‡Y'„#‚g,ücÌVk1Œ5W/ÕV4IâÎÂâ_¯‹ó¾Wò‹:î2êùwòKzvïΘãÞŸÿÒÉ«š½uéÈË5úk;ÁU‰½Ã‰sÕxÑ™¢‰59ޱ‘«-õûsól¥rÜ{¸ ‚Ju;·o|ÿ²ˆÈŒÁƒ¼“ f=Uñ\Êl™·s˹Ÿ”Ô7_MX9ó¡„™·ÆÍ‡ë/X3ËVÎ6ØsÕêKÜõ\úü0‘Ø_žÛøÂ{-¾„%–@§ÑZ6 ZaV´B¨<#á#Ûšû”¡ææKGš.ǾXœ¹t¦HÜœ]'_øðœoE¤‘]Æ®¾árìÎâ̤™"óæ½rùÜÏÞýØ“ø„m´ÎjØû®oVh`m'¸Ê ±w8±š«Æ‹ÎN¬±ÈqŒÅ }~5Ô∵ráîE\‰A¥ØÒ WQ±wMôq¢ú56>iVÿ¯æÈÙQýCß™÷·ÔÔô¬ØùØðËÜÕK.·ÌY:ïÆÀD±'Î ½ð‰G x­e¢fíêO+ücdÛÈ>5æ®æx4Ñ10Ü7ÏPDíSíÎþ//õÍŠµ ´µÆÏ ýÒåéñÉ^’QÐ20#Ï‘½5}i;WÏ ¨íW$öN'VsÕxљ‰59ޱ‘«‡sŸÛûeßÿ¼õìŠÝçTÿù^Îݸ"#cIÆÏþy÷Û†4Bõ|´wËÆ5K22Vl)x³uàRÁžÏvçþdMÆ’Œ[ö~àVéXL\‰A®¢ÍŒ´Íä7㔇2+JnþÖÓòÞÇ_Ýïüޱz¾®æœ}ÝÆ‘·ŒQ¯]ê exŸU™©ô]ðõˆ(M£µl@` ׳zA3„:ÁÓÿÙÖß§ôš¿òB[ßù–šS×þfUœÕàî|Ÿ"×.ûnž³u^îÕÛ#&æ9+þתÐþùtyõݾ5%«mç>¨íW$ö'vŒUãEgJ'ÖHä8ÆBdfJÙ^5{{SÚÞß,™)êgoîwÅ­ûåºXsϹ†½u¿x7þ÷ëoÝ™N=_ûÒ[-¶5Ûêý°æµ²·öç'„u..¬ ]½³p‹¥§­aÿþ-ea¿ÏO´Ð» ˆízÎ7½SöÚ)uIîÇ á¬ßUwXWÄò™µ¯OÂÂÌ7½Oñ> Ô0ûÆÂ1Âo(Ûû”¡æêg¯nÌÿÏoD¢Wí]1Ûàz[âÓþA*Þ¬mݧ\øøÕš "ý—Q˜ãV?×z×Pñ®?­$}¶â;X[ßÄV$ö'–dÞˉՋÇXŒ–ðä–”ÅKa"2G9ùÞöËß ùûµ/}¡óž_œ?SdÎl룗­¡¢ž¯æRÜ/ßÊL‘‡vn¿ô¿ó¸®&.å³´˜(¢À]ã;Wûòî÷þ¯8ž*,~6nð¸ óxý9ËêÑß%VBC¥§çÖð®ïuøf†¦‚æñ†pxøý-?)kë‘ûüzÿKö1g;r1j.ÊœçË*Ò/k¨Ù¿}÷œß-1ô¦÷ÌÄ_æ~öRYÉSï‹È¬ÄUñaï_3‡™ÄûAEMÏŠŠÕ#¾$×@[%ÀU‰½»‰%™÷pbGFNዱ)³—>Úv¶v×g®–¶odÁпÏKK™Uø¯Ïn|xÁ‚¤ÄÄ¥ ⬊ø.´_ýæÂ¿¬Ë4á,÷7B “E4¸Kâ“»ÿ¹âóâí¿Û˜h6èëü¤á¬”£é·2cvXß%__ÿOí¹¦†ÎvëV#ÓA ó8C8"üæøíÿ¶·OD$4Ì¢ˆhÏvÔÅ0Ø\í<ïî‹tÌ3GζGÎ~Q9×\ø¡«gÉRc{eþúßÔeú;{”È™jkñO>Žº¦ª×u¡çËö™ï <òÞÏ2Ž$Ö¼§èµ«'Ç:Œ€ÄޥĒÌ{2±š‘㋱]m}5¿äxhüÊŦ¬[ò~áËÃî‰÷|emú¹Oš[ZŽ×îgÁ¿V¼ß'2ã±× Ól·*ž¡æHz“_,wCOË«{]¶5»ÿí¹Q†eÞO>øÑ‹“4Æ Êìx»\8þÙ1ˆê9õYßœÃfbd ¨a_G ¿2ÓiŒ´Î SƘ­Ö>e¬¹ï“Šç ß½yßbUýF•P£{ÌÕ“oüÚéêQÌ‘3éiûð3™—8ô2Rű±ìw¿«¨ø]Åî×VÍ’‹µ»ìÅXÅ@ÛÀW$ö®&–dÞ“‰ÕŒÇXŒÉßVÿŸ=‹+Êò_|bIÂC³”uØ7øZkßøc»9.1}ý oí-þ'哺¶«æ9s®]ðÝy#]–k¾QsÊÇw `ràJ4¸CŠsG>é›ýTäå––Ëý…ÎpÄͳ("rµíä—aóâ†~Æ¡ÇuäÝæÐÏ®˜­„ů[öÂþšãÛÓl—¼ü±,Ù•`Ç4l5Ìš!ëTi´ð¥1Û1÷)ýæ¿âojj^­™óüâ9Ê5WÝ~—òè®xƒo†Í’¶Š_T(/¦Å+Ÿ½÷ê'a)»ãÍSÓš’¹Â6s¶mæÍ¶P a{h¶EDÄ@Û ®2HìM¬…dÞ‹‰59ޱJ™1+ì›ÏŽ»Î[bÏ©ÚW?ù¦/ö’O½õµŠ\jªûض%=Vñ¹Ž4_›‘0+L™—¶&zûk…{eÝcÖo>©«yϽ ØJσ"üÕò]º,rùß+Ê=6ç…wÊRõËãÄ6ü¾=îÞÿCXܺ³ ‹ßXø/û÷¾Y¸Ý6'iKÉÎùaãšj˜µB¨môð8Em¶cíSšËìÕ¹×^­¯éÃË}÷Íú‡Äío­›o6zŠ0ï¨0‚ IDATùÂ-jEͯ ß›9gAÊ®âg¾vÌáƒ?¼?#!s…mBm'¸Ê ±w4±B2ïÅÄŽÇX Ýqëv>VöFÙKõðâÌWrÃ^­Øÿ‹ã~óhÿæù_I{ëš’çú$tFìÒ-…/ÎSDf¯),”·Þy³äãžÐ/Þ^±nIâßÿ=½"òÅ_ÜÿýÓ¦MGÛë_}E€®i?üáxι®_ÿúë¯|ðÁ»¸äÜ ÐA ÐA ÐA ÐA ÐA ÐA ÐA ÐA ÐA ÐA ÐA ÐBÀÄ]þþ{:tY§ì’SD€Ûñ2`µÒ pã㜀Šh€Šh€Šh€Šh€Šh€Šh€Žº`Rùî»ï:;;¿ýö[UUƒ1EQ¦OŸBiÈ(z `ùî»ï>ÿüóèèh›Í¦(J0žBUÕ+W®|þùçsçÎ¥ŽfÝ0‰tvvFGGGFFï)E‰ŽŽ¾ù\ô¹Ü `ñûýwà‰xào¿ý–7ˆ"Üõž|½½wÐ#]§÷íÚðäòääåiJÛ»EDºmJnù®ÖÞásë½x´dSÚòäåi ^ìõL£µl@@F ³~‡ÏhøÇ˜­ÖbÜÆæã[Ó¡.ÖoXþ例-Û÷¤ Yém§{µ  Ç`ü°¼ãéUÉÉËÓ66þKWkí®MiË““Wm(l¼µ5§ÿ«À(í8öú¦'—'''¯zzǾÓ]ã8€°¦ö”‰¼²§`²cu¢È1·t·6Ö²‹OÜõë×§M›vžHQ” ÝsížÄÇ9àŒ%ÚËnué±mnneNqŽ]ÚjK˳K-‡J…Ç甕ùnN¤zjKß–E6Ó°Ù.Ý\Ú¿µ¸Òæ­/-Ý\d>T²(<ði´– °1j˜Çáˆà ÿÙÖZŒÛØ|\k:⭨ʭZn>àóøÍI9y©Ö7;Q,“öéÝආ{ Æ˽íû6ç6XÖT/2»ËË7çšíY!Ò{±6;ÛiNÏ+Ë’ÓµååÙUöC;âLšÓOìU`D=™]ÔdY“W¹Èâ=Z^š›uh_jTðÖÔÈž2‘ @öL¶cìØQä‹!|§k.sÊã1t(¢ÓÛ¾gí3 ^ËàÚñz·uÍÁ]©1"——×úD®³¹kÑã± oÈt4:ÝÖ¬?µi©=®&•åe, q´>‘]ÛܵhèTF¦ÑZ6 ZaV´B¨<#á#ÛšûÔíkðšŽvŠVêôYߨçñŠ53iÑBÝÏkŒhk°Ç`ì°Üír6xyÕ›EˆÄÅw¸Ö:›..ËŒémsÖzãóm[!2ßnöå6º½gÑš~¢¯C{ê›¼ŽœêMË"DÄžsúxv£«+5*ÂÐ<À55²§Lä¨Ûøž‚IwŒ5kF‘c,€¿.|œ‚ÊdË¬Ž¶˜üÇXí(rŒÅ0kŸ\[çUÛŠV¯*9×Û}lÓò G[>½êé}¥£ñéå> ÜÕ¸áÖoÝçêwmH[žœœœ¶©¤‘ÛŒ`ÒâJ4òéZDTL„t»‡ àL±›öì»56;]Ûä5'8¿cÜÛ^[å²o͉q!¼êóø«eà½RÅbUT·Ï/b l­eK¸F˜U·fu‚§þ1²­¿OM¸ù8ÖÔlOMOW¬gl¥N5³:Ýæ::d|ªZ›–ÛæS¬Ž¥ëó¶öüE¿­±ƒÁòbVÄç½ùÙ-¿×«Šêõ‹êõø³¿©pCm³Ûo¶'­ÏËI ל^ÂoÓ«ÀÀd%…ýÓtµ7;ûlñQ†à­©„ßJÖž2Æ‹ËDÚbJcµ¢È1CÅd<ؽöWÖ¡}Ë"¤Û+ªÇYZëHݺ5ɪݪ£17Û©¤çUæYü®úòòÍùæC¯/ãÊ?PD ÕÝ~´<¿ô¸º´8+nÐ଻åíò²2a”Áƒªªb6›‡œ‰?ði€ †¹k¼!#ü†²­±OÝ–æ®iøüŒmóNÑŠœþÌêô“Ï5hV>OTQ–å”m5ûŽ9KK7ûúoö£ßÖXÁ ˆ„Ìx)ªzû´-+^q7•V¹El"¢ª~QÝåKsòÊlª»¾¼|s©åPÉ"­éo׫ÀÐsøs%Olnò‹ØÒ«Sb‚´¦ƒ«•jÕ@ÚÇÑSæ«Eޱ¹Y¿ùÙXÕœQV˜%"Ò¡qk¯uzâ mZ."±ö‚‹?Ý\ïêZF “E4¸kºZ÷å×¹$~MeÁ¦ùƒ‡ Ç.KÆèïy*Š"~ÿ­!©êWSŒO5Ìã áððwŸØöD¾KsRåKìcÎväbL°ùíZÓŽÆ"§?¥2}Ä=–cÒI¿ñpœ]ñ<‘ï<Þµ(5Â@[‡ R[ZVP|.7?÷§ "bMJO07øÌŠ(¢ˆXצƈÈ|»ÒŸ¦Té‡En¾)°gôæ&ûÖ3<®úªòìüØC{&v_&%7ò"2‘ ^˜îcìÈ(*c¡Ï¯só]¿»Íçwç®Nô˜µÝ/Ñ0 QD€»4 >¶kmQ³yeÁÁœeÃnÍõnkjÒè·ÞP,6³êñ©ýoô©~Ÿ:âvF¦‚æq†pDøÃ RED³Å$¢=ÛQc‚ÍoÓšözO»ýž¶g«x¤nmrCRå‘’ù¦ðAŸþ ·/´J}‡_$ÂP[ÝÃ+.-ÜöÛÿÊêîð+QêéO4Ù¬fQ,E1Ï¿yŸ&Ûü›ÛhÔé‡G.ÀgXóÞŽv·j‹ Š ŠÉQZ›³]Ý/ ¿ýkjäEd"/@¼0Méc¬f9ÆB—¢D(£orõæõTKJYe¦íV}T1Óëé>U¸fÛŸú/ö‹Zñº³dñôJðÅpW^æN”–¶Ø²Ü5ÊP²£¹Ñc{\kÀf²-´‹ûXÛûW÷z޵©öá_¹nd ¨a_G ¿)"ꆈpÓ³ÕÚ§&Øüö¬©É‘sà`¿eéV±¬,>p Çaê:±ëéMµ7oŸÜíiõŠ%Öl¨­‘Ã*T¼^¸§µÛa’î¶Æ6q,³›Äd[dS=§n€kiL?,r¿ mîk.Úœí¼™Uõ«¢(ÁYS#/"yâ…iJc5£È1ºU9ëö´zoüÏl·›}nŸ¹?M_cyÕqß- (ÿó¼=9sæÌ™öÌ;[õ§ tJPp%Ü!±«¾Eµ­±z[NôD±8âã"L"ÒÕvÌcv »ð½»µÞyBIÍJ1…'¬_iÎ.¯:VióÖ5ÉÒ²¤ˆqLÃf@Pì±NîG ÿP³sŸº=ÍDZ¦·ö·ˆ˜˜•WbQ,¶Ø˜±/²¸KóKÍ9Å×R[ÚlN©¾¯jµ5Øc0ÈlWQ~‘’“¹Pi«-m6§H‘ˆ¤¬¤ªÜüÒ˜œ »êr–6›WV&EˆôjL^n‰JHµUU•VÅn}Ü®øZjË[”¥eñáÁYÓÁ©ÓJµ‘´Þ“ÿ+£È17‚ ªßëéꎋqü±*žzçQ{¦C\Îr—*VS\f¦mmiv‰lMµúOÔVÕ¹“ª­ Uè=µ5qÛŸ~Û¶äG7ÿòßé?zSDä÷œ¬z”ΤˆSšÏãñÖåzÌžóÇߦšDz=ÇÜbËöv²ßÝØÐ`ž¿>5Æ$áós*óÊK«²×úÍö¤¼ê¼…áãšj˜µB8Æ@pÔð™:Û±ö©ÛÔ|kêw764Xf¥jÞ >êñ²R^ê,Úìõ›m )e6õßk[¿­Ñƒ1¦¸­•yjQUQvÅž”RV½©ÿHá ªóÊKù›½bO)®Îšokú ¿ “QYÜUêtæöªfküÒ‚ê­ Ãƒµ¦ƒS§•j#i¸-&ÿ1Öp9ÆBD¬ñKµooÞÜqà`Ö°€,ÌÉ[™_^šÝd¶%­ÏËñç×öì2++¥´¼*·É¯X+ *·ÆÑíÆéVÜ“•¸íìè~„ Úm÷ƒï¿ÿž^ùâ‹/î¿ÿþiÓ¦Ñî¢O?ýô‘GÑŸ®÷TVâ¶³òw¯^W“^³®aàgÊŽ¿È#{N¾m¤ˆvöìÙ‡~xò÷Éõë׿þúë|ð..÷D˜ºLŠ¢˜”A?é’ࠈ蠈蠈蠈0uõªªÚ«úI—G]0eýeGÊüÁÀ•hSiÞS?Žõ/Q?þÙßó%·W¢LE,.ü3…ôÕh€Šh€Šh€Šh€Šh€Šh€Šh“È´iÓ®_¿~žHUUEQèpƒ(¢L"f³ù«¯¾ºOtåÊ•éÓ§ÓáQD˜D"##;;;;::TU ÒS¨ªÚÑÑÑÙÙI‡BL!!!sçÎíìì¼råJêhŠ¢LŸ>}îܹ!!”† oº`R ‰ŽŽ¦&>Π蠈蠈€ÿÏÞý5yç‹ÿîh¦&L!,œÝH»™’{§aö€s2VÏ"푞Siw©[üY+j±üèÖØ°Rl¬»Ré:°­°§ê=X·^]ïT=#¶cÎ̶RnQ 5Ò!±ã“:½ÈxÈ“*v߯Ùé¬áû}ò|¿ù|<Ÿ$OàI4À’h€$Ñ?H¢~L§ tÝÝÝtøe0îÓ3'‰×Ë@ ¾Î øA ðƒ$àI4À’h€$Ñ?H¢~L§ ¦”ï¾û®§§çÛo¿•ey2Ž/IÒ<3}:©!µè)€)ä»ï¾ûüóÏcccF£$I“ñ²,ýõןþù#£š2Jçd¬`ö„#OmðsX¥Ó˜ÀêÁµt¤/V/~ê/k¶½•5¢Ñ/^¼­®n=õÓòKÏ,›7oqÖjë1ï¿Ü¸\W¼.kñ¼yËV[ ¿ÀŠåƒ_ÆØë§ßX÷Ôâyóæ-{æ¥w.Þb ¥*FJ( P #SmŽõŠÌ±ÖùXC|`­qÄ•ÜoHJkøg¸Á¨²käǨû?Ù_ëÊ,Êô}›÷vçÅvaZ”t÷=Ø0Ó"“ÔþIçí€Ë(XBB!˜•ƒÐà)ÿ8±­fL…X=ð–Šë Ïxw苆òZ9§(ÛàuPg›K2t£[ê¿®ºƒÊiÙÕÙ)’Œƒ/…a¶Iê¼ØÙ/nwžv¸L+R.Ãg¿S¶b–rù \„Bè’.J|^_¹Q3ÖRï¨S)*¢=ˆº˜ús¬r(2ÇÂÇuO=[ß-·î\¾¬¬åvÿéu‹Wtù#ë3Ëžyç qýØ3‹Wü2ðc«‡ÿÕßÒP¼:kñ¼yó²Ö•ã6#˜²ø$LòåZÔÌYQ¢¿}Ä.,aÝ[ï ïÍ.ÖìÖ¥&y¿c|»­n¿Ã´i[¨ÂËÎN—dоW*é ’Üît X¥s‹p…`–ÛƒÐOà)ÿ8±íL…\=ˆ–êL+V®” ƒWlåµrΕFÇG#NÈ)Ëu›³ Z’!iásE›¾þâ¿®ºƒÊiYÒIÂÙ=ôÝ-Ww·,än—»;’ÎuÒººî\»KgJ®hÛŠ„pÅò"|‚VÁbeÖ27ÚÎÕžq³-3UOàµT„GÒHgq ¥.î‹9V)™c1Ò¬œÃ‡ûŸýcíï,ŠýÝBî¬-¯KZ±iSºA¹Öõc›k¥•EûŠô.GCeåúÝo,â“ ‰©¿í£Ê’ò3òÂÒµf¯ÍYóï‹¥ûRÇØ<Ȳ,t:݈ë!á ¼ 0©Á|#Ø 'øUŶ˜šê¶4<9ûÅäÁK´µ®œ+g…9^‡rv:…,¤EÛ*6霧kËË×;nöã¿®ºƒJQ©9±sÿï/×Z¤ö“åûÛ…0 !dÙ%äöÊc ·Uåö†ÊÊõåúÊæ*•Ÿ¨U`ä5|KÙëOº„0®<9k’Zê±JQ-«ˆö êâ¾™cý…"s,„ÊŒ}7VÖeWX³g !Äu…I®­®¶Ó²ãƒu³Ã… ¦_üËúÇEdÑ0‘D€{æÆåwv–Ô;„eվ뒽· ×ÏÔ:ôÙc¿ç)I’p¹†·¤²KöÚ§¨/Lj0„¾ÁßÿÉ‹O”8d!„.}߇e¦q;ú4B¬>Q-½~lg­+sßÊQ÷XžµòPÓÊðð»›MRç%µgnÌ]¥¢®Šéä–í(m)()ø—F!„!}eª®Ñ©“„$$! «J­+f !’MÒÀ}šV(”÷ ¹ä°ÀÎØÕÃL›Îît4ì¯Ü\’ðÁ[¡Ý—IáÌÕ,"¡,@,L?‚9vt(J̱ðOo±ø¹ù®«½Õéj/X>Ïë1C›KDÃD îцøtñ³;Ïé–î8¼m‘ïÆíú¹†vÊô±o½!é:¹Ó)¼Ñ'»œò¨Û}¨)Lj0„£‚?sVøÌYÛ¤Ëç6sô?¾(|â[ªf ebaº¯çXÅPdŽ…_’%ý’ËCwÖ“…ÐgVìË1çG%½˜þ ÖU/þÇÀ‡ýff¼Q[6ÿ§ôÊ$à‡àž,sŸ”—7×:\<ÆVòú¹cÆÇ•6laÆÙ&Ñ~ºõîý«owžn•M¾?¹®¦ 0©Á\ŽüaQ3ïŠ ç°Jc*ÄêÓÒ°¤m‡8T±Ò ôKKÚ–vã“âgÖÕ Ý>¹¿ór·Ð'èTÕU3]  DÅÖ·.÷‡…ÏŒ ý­ÇZEÒ"S˜3Î5Êo€?ü)”÷ ¹€W‘Õçv®ß\;!²ì’…$MNKÕ,"¡,@,L÷õ«ŠÌ±Ôp欿ór÷Ýÿ§3™tÎv§n šôÎc•ûÏ8ùm€tü©ò?ßú˧Ÿ~úé§y+ñ³ýÿÑA§L >‰÷bKìhh–« ÝÍŸ 설O²˜£Â„7ZOwê’|>øÞ¹¡öiÅÚ³ÂÂSŸ[ªÛ\¹ÿôŽcwÃΓbaEzTex0©Á¬„ã]Üü#)vÜ151Õƒhéðx‹š5k°ñÒ,IHzc¬(!„i®¾½¼¤\·-;Ir6וŸÓeð«JuUöTÒ„cgÉNi[Îl©µ®üœ.óPj¸"*}múþ‚’òYÛ²M²£¶üœné¾ô(!n+”Ÿ€U`ØÌÔÆýûË÷'lzÜ$9›ë*›¥…–ðÉi©wÔ)Eµšh¼.¦þ+T†"s,î‚]Ý7úÍQ£æƒÔÙPû‘)'I8j+²0!D˜9'Çølùæ2±i…ÁõIÝþúöô¶ªjܾ°)íÅÿü׋ þqè/ÿwå?¾-„ÿë­óûçЙ$Ñà¾æì좻~g‰×c¦mþÛŠ0!nwžnÆlŸ·“]íÇuÉÏ­˜&“·í+ª,ß¿ùY—Δ^t hvxPe€I f¥ g#8fðûîÌÇ<ìxcj‚ªÑRWû±ÆFýìµ+o?óñŠC¢²¼vçún—ΘšYqhÝÀ½¶ý×UÛcP'̼i_‘¼sÿÎÍõzSzfÅu÷@ Ÿ½ã@QeymÉúna°d–X›6^ùWo³²÷•Þ(¯­-8Þ-ë –…;lš>Y-õŽ:¥¨Ví×ÅÔŸcU‡"s,„ˤºß¯_ýÐáµ>2{[ÑÒ’ÊòÍ'uÆô状¹Jê&»œ}ûDyåþ‚“.IŸ´tǾMfº]Ý”>gÿù·Ö¦½øÙØþ´ ÷“ï¿ÿž^!Ä—_~ùàƒN›6®pýõ¯ýÅ/~á¿Üí kÓ^üLü7ŽçÚWÚsÿ›ùÒ‹_¼uþ÷j’hŸ}öÙ£>:õûäÎ;ß|óÍC=tÏ{¢Ü¿Â$I “¼þK—L’h€$Ñ?H¢~D¸Ý–eù¶ìõ_ºdrL§ î[ÿýRæKBïÿb2ðI4€ûPXâÓÿ4sÌ¿Ìü§_ÿO~¤s¢ñI4€ûÑOç[ÿ÷§VúáÂ'Ñ?H¢~Dü ‰øA ðƒ$àI4€)dÚ´iwîÜùžH–eI’èp•H¢L!:¾úžè믿~àèp•H¢L!111===ׯ_—ey’žB–åëׯ÷ôôÄÄÄÐá*M§ ¦ŽéÓ§?òÈ#===_ýõ$åÑ$Izàyä‘éÓI ©~]è€)eúôé±±±ôÔÂ×9?H¢~Dü ‰øA ðƒ$àI4Àét„®»»›N¿ Ã}zæ$Ñ`Dÿä'tüˆñuNÀ’h€$Ñ?H¢~Dü ‰øA ðƒ$àI4À’h€$Ñ?¦ÓðCèizÞÚUh[c’¹yù`MýGÇW"âçiÙ…¹&­p/þ¥­mdMMšÕ¾Ë,xLî:YSuð|›KŸ¾*¿pAœ4úÕ”Q:7 c³ÿ xjƒœÃ*ÆV®¥#u6<ßdy·:Ç(„r{íÆ¼}ÃN*þóÎd|ìÙÀ IDATIU]!ÄMLJ5O8þÚ§ùùœœW7fÅ!NËÕöãŽkrD|zö†ÂŒ‡¥ñûY±|ð«ÀÛsþm[Ýɶ^όؔŒÜœd} x-U1RBY€)˜js¬ŸPdŽ…gsU¾í¬3Åúï[Ìc÷ÙÍóÏo<²Ð¶oU ½…û ŸD€Éç¾z¼æÈß<#ö¶eeìˆ_UPZUepÔäW5»„Ð%å½^\<ô¿ßå&i5 é±>ÛwsUñëÍ« ¬»²£Õů5»G?¥Š2Jç–Š3˜ýá¨ÀSüãVé4&°zP-õÑÕôš½Ã{À9¯¹µ)y¿lø›¹‰’Úºrç‡Ö- }I¹%oægè5ùö+2ñô´,_=XRÖèN-,-Ý“ß^S²ýüÍñúY±|H«Àè|„Ýj;)Ò ­¥oæš»–½òqO`x-U3RBY€)˜jsìø¡È‹‘²æ†³®´‚wטÉ:âLJO¢À¤’ÛkóóNô !D„÷Fí|cGôÓ¶™qBˆÄ -O–5œ»™º4òáÔÈáÝäñ†CNÅÒHŸ ª£þ‚'­xãÊd­ ¯¶äm9ÚìL] ´ŒÒ¹Q fI)OMðÛŠcjâªÜÒ1:«±êˆ3ZãõH_g0d¥¤'Gúíhߺr›ýhïc­/¤E a6ÍèÛ~ª£[$‰É ¦eWKCcoBaiNz¤‰‰»z[~}älgÚF…~Ö+•uðÉ¡5ìMØZš³0RsüVÇù-§Zœ1zUx€-U3RBY€ÜêG ¦Ü«S EæXŒæqÉ}R‚AKWàGˆO¢À¤’ŒYÖ÷l¶ªU±#®lä[†KzôÀ?u1qz!»F~šÀÕl·»3 —ø~Ì]îr´‹ø…‰w7&’)-^Óq©S¸ŒÒ¹%$‚Y9ýžRðÛjÆTˆÕo©ènÚ¼ {GóàÐëlª²{² —G{´¯ý–Æ3Æu†ßºr×yÇ­øLËÀ•¡.ycõö ®î‚ž–]׺<Ñ ÆÁ—Â`‰×\stºûY©ü®B!´IsÒ’ŸE! Ù#«Àk©wÔ)ŽÑD]Lý9V9™cáãæñ‚U×<«^“±§EÂuõã× ò2²³dÿúW{>lõ'åοTmÈ[µ ;;cÃŽ·/~0Ö}¥qOÁ“«²dçm¨ú¸¹SŸD€I¾\‹Œ1F ×È œôpŽ­lè_îæ£g¿šaIò~ÇX¾Zoo1åæ¾ÍÜ×åÖDëß+•"b$O‡Ó-„X¥s‹p…`–;ƒÐOà)ÿ8±íL…\=ˆ–êâ3þy™Æp÷=M»xV•-7¶œ>¨§¯³Ï#µ>YÚvSýhZvaî‚»÷Üñ[Wîíº©ÑºÎ¾ùüÑKskž’]¸Fá6pP3-ÏD_¯s(ËÐÓër·[±Ÿ•Ê í­ƒÅvm(ã¼Úl¿Ð÷³efƒê < – ípÔ)”q—Pê⾘c•B‘9#EfVTÉ›óOfU½» RÈWöZkæÜWstî–ÆªúWŽXÞnø>ŒòÕºíÕÍÆUùoš5ݧì¯WT§Ö”¤j{Ž—Zíšå…Ö zwkcM͆ íû%i|p$ÑàïžûêɃ¯_¬JòÚκõÇÅ|›eŒoÈÐjuCÿÖÌ„p^˜Ô`v„㿪ØVSR=ЖêÌË_0\¢5ÚŽ¸²ÊVÆIίCõu9…GhÒ¶–äêúÎÛ«ª7ôißßžªSQWöÜžÖ7?ž³eC‰ÑÓÑXS³¡*âýí©\cGoÉzLØÞ®»¼'Ç,uœÝmï"v¼~V(?Q«ÀÈÀ½²;¯äÏ·„ˆ]V•7I-õŽX¥¨–UD{uqß̱þB‘9£hSŸÚ9A’V/?šß{kÄßû®95‰/ÌOµD g˜ÓkÐùêQ{—ùÕêœT­âáÂü®-irÜL[IâÞ#‰÷Œ³¥îµ=GÿK$=m-]cöÞôœihÑ/û]bI£n÷ð–ÔsKõF¾š2À¤s°Aèü®æOV´z„3RÞ¬Ùn÷°£O#ÄêÕÒîmvw†mù¨_”‹[þ®}¹N{÷áÄ]škOV4œ¹™šé¿®$4BD?½}KfœÂlÒ Ü?(“kŒàD¦½Zpe{EÙÓ'„ÑiË,Ú}:Í8ýYísëV5e€I æ ƒpTðë,ù¨ò!„F«—„P>옧bõ j©Üíèp_kËË9:øÈÑ_g7¥Yí»Ì’Ϋ¤.ÞbMÝ·„ˆô_÷ÕˆFkºPœyT]FŸüÜ»õ9®·)_.}òl¬A+$å~³¼oÈ8p|ªË=WÛ=1IqZ]Lœ)&n«ÔrÎzÊá^°P;ñ-U³ˆ„²±0Ý×s¬b(2Çb|7/ï.);£±,?'3wyæ ëk>÷DÓš_ØW·²åÒ¹ææ3vkÍÁ”ßÚ¶[-¹eŸ_p^®Ûûa›Îœ¶ò¹-ÕU¥¿”.Õ·ÞÔÅÇkû:œ3bîF—¾ïÔ^û'¿-€©O¢À½ØR´4]òÄ=ÓÛÜÜ;ð&"Éœ¨—„7[Ï_Ó&šG~[Çíh:rN“±&#NÒZrçk·ÔØÏäg{›^;+ß½CG€ex0©Á¬„ã]Üü#)vÜ151Õƒh©«¥ÉÞ¬ÉÌÉ0FÆ#‡.5Ba|8N/„ˆOÑwT¿R¥Ýº¦ˆŸ|ÿý÷ô!¾üòË|pÚ´iAÔ½óÕWt ø5íþ!˜k®;w¾ù曇zèž9÷Dü ‰øA ðƒ$àI4À’h€$Ñ?H¢~Dü ‰øA ðƒ$àÇtºB×ûý÷tøe¸oÏœ$L€èŸü„N€1¾Î øA ðƒ$àI4À’h€$Ñ?H¢~Dü ‰øA ðƒ$àÇtº~=MÏ[» mkLÒà#7/¬©?ãèøJDü<-»07ä®óÅ¿´µ¬©I³Úw™¥É]'kªžosiãÓWå.ˆ“F?£š2Jçd¬`ö„#OmðsX¥Ó˜ÀêÁµt¤Î¦‚ç›,ïVç…Bn¯Ý˜w¢oøÏIÅÞ™,MB]¨š–«íÇ×äˆøôì …þå¦ãÚƒ'íÓü|NΫ3ŒÒøåƒ_ÆØžóoÛêN¶õzfĦdäæ$ëÀh©Š‘ÊÈHÁT›cý„"s,¼8›«òmg)Ößb»Çnž~ã‘…¶}«bè-Døp_=^säož4ï½mcYÙÝó·ä™D[}uM~UÄûÛSuIy¯o×äkGw׉ôXŸí‡»¹ªøu‡ycÕØÛ´»ºø5mõ®Tmàe”Î ,1v0„£O]ðÛJ§1Õƒj©®¦×ìžhËð•Æ5·6%¯pIôݦJ‰ŠWh¡Ô…ß©O¾z°¤¬1"ëÕÒ]Ç©½5%ÛµU¶´H!äέ[´ÿ¼±dpԬɷǿ¿&QR,Ú*0*a·ÚNFdZSô=g÷V—½]UÀ@KÕŒ”P @F ¦Ú;~(2Çbd†¬¹á¬+­àÝ\3=’h€€Èíµùy'z…"Â{£v¾±#úiÛÆÌ8!Dbᆖ'ËÎÝL]ùpêð…LÏñ†CNÅRßKGýOZñÆ•ÉZ!^mÉÛr´Ù™º@h¥s¢Ì’R*žšà'¶ÇÔÄU¸¥ctVcÕg´Æë‘¾ÎaÈJIOŽôÛÑ!Ô…ÿ©ÏÕÒÐØ›PXš“)Dbâ®Þ–_9Û™ö„Qn³í}l£õ…´H!̦}ÛOut‹D½RùPWŸZÓÉÞ„­¥9 #…0ÇouœßrªÅ™£W5ØR5#%”È­~¤`Êͱ:ÅPdŽÅh—¬Ñ'%H’ãLj{¢À¤’ŒYÖ÷l¶ªU±#®lä[†KzôÀ?u1qz!»<#jºšívwFáß·yå.G»ˆ_˜xwc"™Òâ5—:å€Ë(XBB!˜•ƒÐà)ÿ8±­fL…X=ð–Šî¦Í ²w4½Î¦*»'«py´×AûÚoi 1c\g„RALË®k]žèã`w,ñškŽN·»Î;nÅgZ®¢uÉ«·g•ËOà* „B›4'-iðYt’=²Ú <°–zGâHQíAÔÅÔŸc•C‘9>n/ØXuÍó·ê5{Zd!\W?~­ /#;{Aö¯µçÃVßyRîüKÕ†¼U ²³36ìxûò͇ÝW÷<¹*{AvÞ†ªÛ™+0eðI4˜ä˵Èc¤pÜ„IçØÊ†þån>zö«–$ïwŒå«õöSnÞèÛÜÈ}]nM´~ð½R)"Fòt8ÝBH•Q:7 °Wf¹C1ýžrðÛþÇTÈÕƒh©.>㟗i wÿÐÓ´ûˆgUÙrcËÙáƒzú:û<òQë“¥m75Ѧeæ.¸{¿­Pê"˜iy†$úzCY†ž^»ÝBîíº©ÑºÎ¾ùüÑKskž’]¸&äU,/´´ Ûµe Œój³ýBßÏ–™ ª'ð€Z*´ÃQ§4RÆY\B©‹ûbŽU EæXŒ™YQ%oÎ?™Uõî‚H!_Ùk­q˜s_ÍMй[«ê_9byÿ¹áû0ÊWë¶W7Wå¿iÖtŸ²¿^QZS’ªí9^jµk–Z7èÝ­55*´ï—¤ñÁUD€¿{î«'V¼~A^P°*ÉkgærÔóm–1¾A {A¡ÔEô–¬Ç„ííºË{rÌRÇÙÝö!b…²ç–ð´¾ùñœ-JŒžŽÆšš UïoOU*?Q«ÀÈÀ½²;¯äÏ·„ˆ]V•7I-õŽX¥¨–UD{uqß̱þB‘9£hSŸÚ9A’V/?šß{kÄßû®95‰/ÌOµD g˜ÓkÐùêQ{—ùÕêœT­âáÂü®-irÜL[È7k1D€{ÆÙR÷Úž£ÿ%’ž¶–®1{ï zÎ4´è—ý.±¤Ñ·{xKê¹%z#_M`Rƒ9Ø ô ~WóŽ'+Z=Bˆ)oÖl7{ØÑ§bõ‰ji÷Ç6»;ö|Ô/ÊÅ-×¾\§½ûpâ.͵'+ÎÜLÍŒœ˜º@dÚ«W¶W”=}B¶Ì¢=ѧÓIh„ˆ~zû–Ì8!„Ù¤¸OS¦ByŸ³H œ±«Kñ/TØVvµ4Úkò÷Ä¿¿3´ûˆ)œ¹šE$”ˆ…éG0ÇŽE‰9ã“â.Ñ´¶ü¥±µÍqÅÑÜzK¤Œü{bVf´õ·kòMIIOK[˜b6HÂÙÑvóVÇ˹Ù^£Ûo ’h ‰Çâó{~e»¤›Ÿÿ^^šï·z.5vDg¦Œý£ßRDœÖÓåô l!ewŸ¬‰ö¹u«š2À¤sA8*øu–ü?Ty„B£ÕKB(vÌÓ±úµTîvt¸¯µåå|ä诳›Ò¬ö]fIçURo1ˆ¦î[BDNH]FŸüÜ»õ9®·)_.}òl¬A+¤ˆFkºOSœy¨ŸÇ,ïrŸêrÏÕvOLRœVgЉÛ*µœ³žr¸,ÔN|KÕ,"¡,@,L÷õ«ŠÌ±ßÍË»KÊÎh,KçÏÉÌ]žyÂúšÏ=Ñ´æöÕ­l¹t®¹ùŒÝZs0å·¶íK^·f‡óû] ½‰)€{Áݼ»Êa\µçÇØJv_úøÿÅÎOWØ+Hq“è8såîDî¼pÅŸâs5e€I æà‚pŒà—" 11†˜C¤Vç°Jc*ÄêÓR))¯â=›í=›í=Ûž×—E‹ˆù¿ÛS±5Ar6ïùUñ‡C÷Kvuµt‹ÓŒ‰ª‹€®ôÎï}³Öá–t1‘’p·žº"ÓL’bSŒž®æ.Ù·ŸÊû„\À«ÀÈêÎK¶Ö#C¯²,ß’…Fšœ–ªYDBY€X˜îë9V1™c1.WkßÝóm%[ŸXúp´ä–}~!Ày¹nï‡m:sÚÊç¶TW•þRºTßzS¯íëpΈ¹]ú¾S{íœü¶¦>‰÷bKÑÒtÉ÷tLossïÀCšˆ$s¢^BÜl=M›hùm·£éÈ9MÆšŒ8IkɯÝRc?“Ÿeìmzí¬XPœª¢ /&5˜ƒp¼‹û±‚$…ÃŽ;¦&¦z-uµ4Ù›5™9ÆÈ8cäСFh"ŒÇé…ñ)úŽêWª´[—'H}ŽúªKº%¥é‘¡ÖE0´Ñ¢ÕöŠMÚše‘®Ý}I›¹Ç¢BD¦®I±¿\QeÌ[nò´Ø«.éæ[Ó#…ÊOÀ*0Ì`Éø™Ý¾ÛÿÂüx©ÏQ_ãæ[´“ÓRï¨SŠj5Ñx]Lý9V¨ EæXŒ$EDko]9㸪O:/Ôí¾tË“Ð唇•B]'ëϺ´V&HNGÓ¹¾ˆÔh­”˜µ*6ÿuk•È]b¸u©Þ~´=¥ÔÀÎ$Ñàï–³«WˆÞ?Ú*¼‹ßr°"SB¾v¦C}ïÍánÿøÄŸ´æÜŒ8Ih-yÖ—kªÞ¶æ»´ñéÊ “µA•&5˜•‚PÙØÁ?êm¬ÃŽ7¦&¨z-uu|ü§©9F¥ÖÄ,ØS!öV5¼VÒëž›’QünN¢r]u©—ø‚uƒl³ÿÎz42>%³¸tÍÀÏÇiSóË^®©²W”|%¢[RPc–Æ+ò*à-n¹­ owCÃöS½žÑ¥åWç&ë&«¥ÞQ§Õj¢=ຘús¬êPdŽÅÈùÆœ[¸¤boÅö?i¢Ÿ³«@»ÛVóÊ)ó»s è’óveUïµ—môMD ֭‰’q«¬VQ}ðí²³nMÄ£óóm¹t>¦ŠŸ|ÿý÷ô!¾üòË|pÚ´iAÔ½óÕWt ø5íþ!˜k®;w¾ù曇zèž9÷Dü ‰øA ðƒ$àI4À’h€$Ñ?H¢~Dü ‰øA ðƒ$àÇtºB×ûý÷tøe¸oÏœ$LÄ2`0Ð ð#Æ×9?H¢~Dü ‰øA ðƒ$àI4ÀétÀ”òÝwßõôô|ûí·²,OÆñ%Izàbbb¦O'5¤=0…|÷ÝwŸþyll¬Ñh”$i2žB–寿þúóÏ?ä‘GÈ£©D7L!===±±±111“÷’$ÅÆÆ=}®÷D˜B\.WTTÔðD?ýéO¿ýö[:\%’hðƒ¸Þ°ú©7Ún{=rãâ;Å«ŸZVÇÝ;w¦M›ö<‘$I“tϵ%’hðì%ÚŽUÖ¶Ë#÷¶õí¦œÒJs Í•›Ë?é"ܲ­ÂKé&‹NJšk ó9ÜÅòõåçô9¥ûJŸ38Ê×ïüdôVTM¥sLEŒÌ~‚pTà© þq«tX=¨–Žº¼Û¹Ä€svºtéÛJ¾oSR˜Úç½qzçæý–Mûì+Ju5–Ô}A8?-ßn{g}A£+½èÀŠçLí•ë N߸|¯Û¼¹Ö™´©bߎL}såæý-·Ç+Ò*0:Q»yçI±°hß}›,Ýõ%Ç®6ÐR5#%”(‘‚©6ÇŽŠÌ±Áy±®ö›KüHqO4˜T·ÛÞzö7ÝB¡÷Þäih7¬:\¼b–Â\Ttù‰‚Ús7æ>•0{øSÛ×Õ¶ÖzÜçsÜýÍugäôŠ¢ìÙáB$í¸üÄæºs7æŽ,¥¦ŒÒ¹Q fI)OMðÛŠcjâªÜÒ±.ïÊkiÄõ]·0ä¤Ïp‹æºfiéM›Ã„0]>÷›Î]Ï™5“˜ jZîwÔ6v'X77J³¹ôºãÙÚ“_,Ê™u»µ¶®ÛRôÁ‹‹¢„H6éœÇÚ»…Y¯T>ÔU`dåΆ“ÝIÛ¬[%„0m»xfó1Ç3£TMà¶TÍH eêW?R0åæXb(2ÇøûÂ'Ñ`R…sö>|øÀZãˆ+¹ß”:×0ðÏpƒQ/d×Èwìú?Ù_ëÊ,ÊôÝ­Ýî¼Ø.L‹’Âïß´È$µÒy;à2Jç–Pfå ôxJÁ?Nl«S!V¼¥âzÃ3Þßú¢¡¼VÎ)Ê6xÔÙæ’ Ýè–ÕU<7Y–…¤¸Z “t’$é%"2ØiÙÕÙ)’Œƒ/…a¶Iê¼ØÙ/nwžv¸L+R®ÀÃg¿S¶b–rù \„Bè’.J|^_¹Q3ÖÒQ§4RTD{u1õçXåPdŽ…/êžz¶¾[nݹ|YYËíþÓë¯þèòGÖg–=óÎâú±g¯>6øá×ÇVÿ«¿¥¡xuÖâyóæe­+;ÆmF0eñI4˜ä˵¨™³¢Dûˆ \Xº·ÞÞÍ^¬;Ù­KMò~Çøv[Ý~‡iÓ¶„Qß:.É0´“ôInwº„ ¬ŒÒ¹E¸B0ËíŠAè'𔃜Øö?¦B®DKu¦+WJ†Á+¶òZ9çÀJ£ã£'ä”åºÍY­NÉ´ð¹¢MÏ B ×U<·°ÔIûkkϬØñ¸Áyº®Ù¸¶h!ê zZ–t’pv;‡2MÝݲ»]BîîtJ:×Iëêºsí.)ý¹¢m+ÂË‹ð Z‹•YÊÜh;W{Æi̶ÌT=ÔR>uJ#eœÅ%”º¸/æX¥PdŽÅH³r-¢ IDATîö7޵¼³(Jôw ¹³¶¼.iŦMéåZ×l®•Ví+Ò» ••ëKt¼±ˆI4ÀHýmU–”Ÿ‘–®5{mgû›\,Ý—:ÆæA–e¡ÓéF\ Wàe€I æÁá8Á¯*¶ÆÔ„T´¥áÉÙ/&^Þí¬uåX9+Ìéð:”³Ó)d!-ÚV±Iç<][^¾Þ©û lnøˆºJç63»híGÏ–?»¤\!t–Y²LB"hQ©9±sÿï/×Z¤ö“åûÛ…0 !dÙ%äöÊc ·Uåö†ÊÊõåúÊæ*•Ÿ¨U`dÖ£¥ì‰õ']BWÈœ5I-õŽX¥¨–UD{uqß̱þB‘9B uÒÐçöd]v…5{¦B(ü:Ãí¶ºÚNËŽÖÍB$˜v|ñ/ë7‘EÃD î™—ßÙYRï–Uûv¬KöÞ&\?SëÐgý.±$IÂåÞ’Ê.ÙkŸ¢¾ 0©Álúÿ'/>Qâ…ºô}–™Æ=ìèÓ±úDµôú±µ®Ì}+gùŽéY+5­ ¿û°Ù$u>QR{æÆÜQ*¦‹ŸX×ïw-ÜT‘mѹZUVþ¾`Ò‡ÅÉ\â™[Z´£´¥ ¤à_…†ô•©ºF§N’„0¬*µ®˜%„H6I÷KZ¡PÞ'äÆ9üFì@õ0Ó¦C‡³; û+7—$|ðVh÷S8s5‹H(  Ó`ŽŠs,üÓ[,~n¾ëjouºÚ –ÏózÌÐæ$Ñ0‘D€{´!>]üìÎsº¥;o[ä»é»~®¡Ý°"}ì{×Jz£Nît¾*»œò¨Û}¨)Lj0„£‚?·ù˜£ÿñEáßR5‹H(  Ó}=Ç*†"s,ü’¤(iì—\º³ž,„>³b_Žq8?*éø‡Àô_°®zñ?>ì73ãÚ²ù?¥W&?,÷d™û¤¼¼Ù¸öÐáâ1¶’×Ïë4>®CaÆÙ&Ñ~ºõîý«owžn•M¾?R¯¦ 0©Á\ŽüaQ3ïŠ ç°Jc*ÄêÓÒ°¤m‡8T±Ò ôKKÚ–vã“âgÖÕ Ý>¹¿ór·Ð'èT=¯,|nê- ¡›É{BHT¼a}ërXøÌ¨0Ñßz¬U$-2…‰0ã\£ÜyqðøÃ¯‘ByŸ xYÝynçú͵C"Ë.YHÒä´TÍ"ÊÄÂt_Ï±Š¡È‹@ gÎú;/wßý:“Içlwê¢Iï8mÚ4ºÀ=ô׿þõ¿ø…ÿr·/¬M{ñ3ñ?Þ8žk_iÏmüoæKÿ-~ñÖùß«I¢}öÙg>úèÔï“;wî|óÍ7=ôÐ=<î‰pÿ “$)Lòú/]29H¢~Dü ‰øA àþu[–åÛ²×é’É1.¸oý÷K™/ !¼ÿ‹ÉÀ'ÑîCa‰OÿÓÌ1ÿ2óŸ~ý?ù‘ΉÆ'ÑîG?oýߟZ釟Dü ‰øA ðƒ$àI4À’h€$ѦiӦݹsçx"Y–%I¢ÃU"‰0…ètº¯¾úêx¢¯¿þú ÃU"‰0…ÄÄÄôôô\¿~]–åIz Y–¯_¿ÞÓÓC‡«4.˜:¦OŸþÈ#ôôô|ýõד”G“$éxä‘G¦O'5¤úu¡ ¦”éÓ§ÇÆÆÒS _çü ‰øA ðƒ$àI4À’h€$Ñ?¦Óºîîn:ü2 ÷陓D€ ý“ŸÐ ð#Æ×9?H¢~Dü ‰øA ðƒ$àI4À’h€$Ñ?H¢~Dü˜NÀ¡§éykW¡mI|äæåƒ5õg_‰ˆŸ§eæf˜´Âu¾ø—¶¶‘55iVû.³4â1¹ëdMÕÁóm.m|úªüÂqÒègTSFéÜ€€ŒÌþƒpdà© þq«tX=¸–ŽÔÙTð|“åÝê£BÈíµóNô ÿ9©øÏ;“%Ï@Aý´\m?î¸&Għgo(Ìxxð/7Ö<áøkŸæçsr^ݘa”Æ/ü*0FÀöœÛVw²­×3#6%#·0'Yè@KUŒ”P @F ¦Úë'™cáÅÙ\•o;ëL±þû…þºyþùGÚö­Š¡·@ àÃ}õxÍ‘¿yÒ¼÷¶eetÏßRgmõÕ5ùUïoOÕ%å½^<¼Õ“¯Ý]'Òc}¶îæªâ׿VcoÓîêâ×´Õ»Rµ—Q:7 °TÄØÁ<~Ž ºš^³wx¢-ÃW×ÜÚ”¼Â%Ñw›*E$J*{XmAÝ´,_=XRÖ‘õjiŠ®ãÔÞš’íÚ*[Z¤rç‡Ö- ÚÞX²F8êÖäÛãß_“()–m•°[m'#² ­)úž³{«Ë^‰®ªÎˆ ` ¥jFJ( P #SmŽ?™c12CÖÜpÖ•Vðn.GDFn¯ÍÏ;Ñ+„Þ›¼óÑOÛ6fÆ ! 7´ÔUÀ'‡Öt²7akiÎÂH!Ìñ[ç·œjqfÄèUMà¶TÍH er«)˜rs¬N1™c1šÇ%kôI ’äø1âžh0©$c–õ=›­jUìˆ+ù–!Á’=ðO]Lœ^È.ψš®f»ÝQ¸Ä÷m^¹ËÑ.â&ÞݘH¦´xMÇ¥N9à2Jç–Pfå ôxJÁ?Nl«S!V¼¥¢»ió‚ì̓C¯³©ÊîÉ*\íuоö[CÌ×CuC™. ~Zv]ëòD'_ ƒ%^sÍÑér×yÇ­øLËÀ¥³.ycõö £rù \„Bh“æ¤% >‹.B²GV;ÖÒQ§4RTD{u1õçXåPdŽ…›Ç 6V]óü­zMÆžY×Õ_+ÈËÈÎ^ýë_íù°Õwž”;ÿRµ!oÕ‚ììŒ ;Þ¾|sàa÷•Æ=O®Ê^·¡êãvæ L| &ùr-2Æ)\#7pÒÃ9¶²¡¹›žýj†%Éûcùj½½Å”›7ú67r_—[­|ŸUŠˆ‘<N·R`e”Î ,‚YîP B?§üãĶÿ1rõ Zª‹ÏøçeÃÝ?ô4í>âYU¶ÜØrvø ž¾Î>|ÔúdiÛMMô£iÙ…¹ îÞok¨n(Ó˜–gH¢¯×9tÍÜÓër·[Ƚ]75Z×Ù7Ÿ?zéoníÏS² ×d˜´Šå…v‚VÁb»¶ ”q^m¶_èûÙ2³AõPK…v8ê”FÊ8‹K(uq_̱J¡È‹‘"3+ªäÍù'³ªÞ])ä+{­5s :wKcUý+G,ï?7|FùjÝöêfãªü7ÍšîSö×+ªSkJRµ=ÇK­vÍòBë½»µ±¦fC…öý’4>¸ ’hðwÏ}õäÁŠ×/È V%ymÎ\Žúãb¾Í2Æ×dGhµÃ·ÑÌ„p^˜Ô`v„㿪ØVSR=ЖêÌË_0\Þ5ÚŽ¸²ÊVÆIίCõu9…GhÒ¶–äêúÎÛ«ª7ôiïÞ'È«nðÓÔÓ[²¶·ë.ïÉ1KgwÛ;„ˆBÈž[ÂÓúæÇs¶l(1z:kj6TE¼¿=U©üD­#÷Êî¼’?ß"vYUFÜ$µÔ;b•¢ZVíAÔÅ}3Çú EæXŒ¢M}jCæüIZ!D¼tþh~ï­ï»æÔ$¾0?Õ)D|œaN¯A#ä«Gí]æW«sRµBˆ‡ ó»þµ¤Éq3m!/¦’hpÏ8[ê^Ûsô¿DÒÓÖÒ5fï}AÏ™†ýò±ßó”4ávoI=·äQoä«)Lj0„¾ÁïjÞñdE«G1#åÍší¦q;ú4B¬>Q-íþØfwgØ–úE¹¸åïÚ—ë´wNÜ¥¹ödEÙ›©™‘3] ‘i¯\Ù^Qöô !DtÚ2‹öDŸN#$¡"úéí[2ã„f“fà~I™ å}BÎ"6pÆ®.Å¿Pa[ÙÕÒh¯ÉßÿþÎÐî#¦pæj‘P ¦Á;:%æXŒOŠ[¸DÓÚò—ÆÖ6ÇGsë-‘2òï‰Y™ÑÖß®É{4%%=-maŠÙ gGÛÍ[/çf{Œn¿%H¢a* ‰÷hC|~ϯl—tóóßËK3úìÌz.5vDg¦Œ}ë )"Nëérz¶²»OÖDûܺUM`Rƒ9È ü:Kþªrô×ÙMiVû.³¤ó*©‹·DS÷-!"'fº@@ôÉϽ[ŸãêqK1‘òåÒ'ÏÆ´BŠˆÐh´–¡û%Å™‡^£1Ëû†\€ǧºÜsµÝ“§ÕÅÄ™bâ¶J-笧î µßR5‹H(  Ó}=Ç*†"s,Æwóòî’²3ËÒùs2s—gž°¾æsO4­ù…}u+[.kn>c·ÖLù­m»Å#DÄ’×­YÆáü¾FÇ‹€©€{Áݼ»Êa\µçÇØJv_úøÿÅÎOWØ+Hq“è8såîDî¼pÅŸâs5e€I æà‚pŒà—" 11†˜C¤Vç°Jc*ÄêÓR))¯â=›í=›í=Ûž×—E‹ˆù¿ÛS±5Ar6ïùUñ‡C÷Kvuµt‹ÓŒ ›.È•Þù½oÖ:Ü’.&RîÖSWDbšIRlŠÑÓÕÜ%û¾F å}B.àU`duç%ÛFë‘¡‘å[²ÐH“ÓR5‹H(  Ó}=Ç*†"s,Æåjmø³{¾­¢dë RޖܲÏ/8/×íý°MgN[ùÜ–êªÒ_J—ê[oêâãµ}Î1w£Kßwj¯ý‚“ßÀÔÀ'Ñà^l)Zš.y➎émnîxH‘dNÔKBˆ›­ç¯iÍ#¿­ãv49§ÉX“'i-¹óµ[jìgò³Œ½M¯ ŠSõA”áeÀ¤³bŽwq?Vð¤pØqÇÔÄT¢¥®–&{³&3'ÃgŒº ÔM„ñá8½">EßQýJ•vëò©ÏQ_uI·¤4=rD]}ÀÓ‚¢­¶WlÒÖ,‹tåèîKÚÌ="2uMŠýåŠ*cÞr“§Å^uI7ßš)„¬P~VaKÆÏìöÝöøæÇK}Žú‡4§Ø¢œ–zG¬RT«‰öÀëbêϱBe(2Çb$)"Z{ëÊÇU}‚Ôy¡n÷¥[ž„.§<ü«’è:Y֥ݰ2Ar:šÎõE¤Fk¥Ä¬U±ù¯[«DîíKõö£í)¥v® ‰·œ]½BôþÑVáõXü–ƒ™’òµ3Âè{_wûÇ'þ¤5çfÄIBkɳ¾\Sõ¶5ߥOßPV˜¬ ª 0©Á¬„ÊÆþQ—hcv¼15AÕƒh©«ãã?ˆHÍÉ0*µ&fÁž ±·ªáµ’^÷ŒØ”Œâws¥‘uEÀÓ‚»ÔK|ÁºA¶Ùg=Ÿ’Y\ºfàçã´©ùe/×TÙ+J¾Ñ-)¨Î1Kã•yð·ÜVз»¡aû©^ÏŒèÇÒò«s“u“ÕRïˆUŠj5Ñp]Lý9Vu(2Çbä|cÎ-\R±·bûŸ4ÑÎÏÙU Ým«yå”ùÝ9tÉy»²ª÷ÚË6z„&"aáëÖDIˆ¸UV«¨>øvÙY·&âÑùù¶ÜD^L?ùþûïéB|ùå—>øà´iÓ‚¨{端è@üöî?*ªó^ôÿ'ö¬„!ê逹ƒõ ~WàžUX©°ND¯AãWc˜V’o%žª©“"¦HN€Þ½IChEê¯Xнh ôD¼5Ò¤ÒœJÌ“ãœõ-t0'ÕùÆ0A™hMØhüþÁ¯áÇfÏðÛäýZ]6Ì<ÏÞûy泟gïÏì½€®Y_ûÚXιnÞ¼zõê}÷Ý7[Î3Ñ$Ñ$Ñ$Ñ$Ñ$Ñ$Ñ$Ñ$Ñ$Ñ$Ñ$ÑtŒß¥[·èÐe¾m·œ$LÄ4`6Ó ð%Æíœ€’h€’h€’h€’h€’h€’h€Žº`F¹qãÆåË—?ýôÓ›7oNÆògÍšuÏ=÷Ü{、†|EOÌ 7nÜøàƒÂÃÃï»ï>EQ&cªª^¾|ùƒ>X¸p!y4ÑM3H{{{xxxhhèä­BQ”ðððþuÑç¾à™h3ÈÕ«WCBB¦`E÷Þ{ïÕ«Wép‘D€)ÑV³å±—[»¼^é8³?wËc+—-[¹nKq]k§ˆHçÉôeC­Ì=×5ti]N§¯[¹låº-'.t¸F_Êhmà—‘‚Y?ž¯Á?Êbµ6c«­¥ƒ]¨Ù²ò±ýúj¶î^7¨ÑÛÏtù¾^é8W•›¾nå²el)¨»À^<þayç,[¶rÝ–‚:ïw4úY³üØg¶íäËé­\¶lÙ#Oìܦc ¸-õaOÏäÏž‚™6Æê„"c,tž««bŸ³fÍš‚µLÒ½¢_V$Ñ` Ž%ZëJ+êàcÛììj‡5µhß¾¢TsSi¦íT§HpLV‰—¢Œ£µÔb²¸3¶m¶FSjQYÑf³Ý¶­ðÔðCQ_Êhmàg*b¤`Ö Âaç[ð²X­Í˜Àêcjé°Ó»ÂòA;œÛé1&dõ5¼,#Êàëz».TefVº£2JÊò“LM¥™åÍœ²Œ}XîjÝ¿-»Ö“³o_Éf«£t[öÉ¥Ÿ5Ëkž¨Ì,¬—Äœ²}e1®ê켺6ÿp?ZêËž2ž ÈŸ=3mŒ=c1ˆûLUe—ø’â™h0©ºZwo|²Ö%"bò>Èk¨q˜7ÎMŽ‘蜜sfW6v,]?pÕv[]¥ÃœV±fÈuÜMU jBINJ|°HTþ¹G3«;–.åK­mü¢ÌŠVjž/Á?JlkîSWÝï–Žtzg«t›•Açw.1§&,ñ»‡-•U®˜œ#ÛW„ˆÄZîì:‡K¢#ˆÉ1 ËöÊZWTξô¥!"ÑÑEmö•õV¤FtÜÏ&­òãWvÖÔ»¢²ö¥¯kÖ™†Ì:{GrXˆO¸Ÿ-õeOÏÔéûž‚7Æ5C‘1ÀW W¢À¤2XRË>¼/Í2èÌFí4GÅ-5÷þl¶˜Dõ þÆ®óTy¥')')lèY‘óŒC¬+¢‚{–o]aU§œ]~—ÑÚ6À¿„„F0k¡~àiÿ(±íË>5Îêþ·TÚjžð¾wèB­RMÍI1{-ÔÝêQÌfãð–ö×Õ^ïI»Çš×{fŸ»¿8™³»1˧S5GYú> s¼Uqžqvjö³Vù œDDÄ•¸"ªo-F“"ªªú:€û×ÒAQ§µ§øíc¨‹™?Æj‡"c,†¸PõØÆj—ÚR¸ö‘âæ®Î“é+·œ8w¢à‰GžØAÚêžX¹¥®ïâ׎º-u6×änY·rÙ²eëÒ‹ëxÌf,®D€I>] ‹‘NÇ 8CdúîýG³gªê]Ƹ(ïoŒ»Z«ÊíÖŒ¬Èaw¨n§G1›ú¾gULfEu¸="ÿÊhmà_„k³êÐ BÀÓþQb[Ÿwõ1´ÔhM^¿^1÷±Ù*ÕÔ}ë-öƒ6È­ªU™ë²[ÜŠ9*qsNÆšƒˆ Ôe½nÅè©/ØRÕèð­ ›s²’#ƒ É1ËŠQ·ËÝŸir¹TQ]Q]#÷³Vy ž Y ¯XqAo™ŽÖÆÊ·%%&Ìçܯ–Jð@Ôií)£L.ã©‹ÛbŒÕ EÆX ‘zøpçÆ'íiGö¯‘N—¨ÎJ[UTrFF‚Y»V[]vf¥²>§,Çä±×”–nË3yyWª‚$`°ÎÖ¥y¶5±(-Úëp¶³éÀ1Y]7ÂÁƒªªb4‰Çÿ2À¤sÇXƒp”à÷)¶5ö© ©îoKƒcS¶ÇöÞVzR÷­0¸í^‹r;Ý¢Š²"«$Ãè>Yi³ms/ TWk½Q¥u‰Y9%ÕQSZºÍf:R¼”Sޱ ‰K‘Âòg,i1Š£ÞVˆªÕÏå'jœõh.~t[½GIJ~_RÄ$µÔ;bµ¢Zõ!ÚÇP·Í«ŠŒ±éÏŒ÷ßW«SJ RÂDDÚ4¹ÖªJgLþ‘ôø`‰´æ_x|[½cY4Ì@$Ñ`ÚtœÛ_˜Wm—˜ eùé±Þ‡ m •vSÊÈß+Š"ÏÀ!©êQ½ŽS|/Lj05‡ç©íæÙU1&”½Vlu±Ã7cœÕ'ª¥mu…•ž¤²õC÷éˆõÇ×÷¼mUœæU6t,Mña½¢ˆ˜7$GˆH¬Ué}ŽO2§cÌ-­È/jÎÎË~¼VDÌ ë㌵n£2J?\~HÈÅüÛqF®n°fTNqÚkÊK3ó"ìßsÄ4¶Ü—Id<Ó—`ŒŠ c,ô™bbt¾ëq´¸=ŽìµË¼^3·z„$f ’h0MÄ's76WçÎZ1ô ¯­±ÆaNN±¢b²U§[íý¢Oõ¸Õaûð¥ 0©Á<Æ üÁqù‡¨""ŠÑdÑ^숛1ÎêÔÒ.ׇÇÙòäÃÕ}¯To\V›Pv¼8ÖìusP°5Þ,5m‘_ÖkRclÿs|,±#Ö…É¥øí¿úcZg›G QÏì|´Þb6ŽÖÏ#–r~î8Cªwµµ:TstDppXDpXD–r®1³ÎÞ¹fEðÄ·Ô—Id<Óm=Æj†"c,t)Jˆ2òGø+Ñ# IDAT®ö?YO1%•”¥Zò£Š1Œ¾óKçé‚ Ûß{±_ت—+‹—ßK¯L~X¦eš;e³5YÒ*çŽp(ÙÖXç´¬ÑÈ¡‰ÁoÇÉ–žçWw9O¶¨Ö¡?RïK`RƒylA8BðBÂz„FY¬Ö>5ÎêÓRCTVÅá^%ëÍbZ]TQ‘eè8•ûDzUÿã“;ç\bŠ4ú¸Þ¥Õy¦ïÁì#×…?‰Š— vŸë4‡…¤³¥®E¢VX Úý¬Q~HÈù= ®în,Ü–YÙ!ªêQEQ&§¥¾L"㙀˜˜në1V3cá¯ÌY§óœ«ç¿ŒV«Ñíp{£Éä®+-opóÛ~9ÿ»ÒwíþÓ»ï¾ûî»Ú½è½òߟ§S&W¢ÀtÛkšT˳«éTïу(¦¨˜èƒˆt´œt£†\øÞy®¦ò”’œ–aŽÛ¼Ú˜YZ~2?Õâª)¬—Ä’„1”ácÀ¤³fŽvr?Rð¦±ØQ÷©‰©>†–ìo!}W"QL–Ȉ±.59ly6cVJ”ânª²5“ö ÙWMZë IHK(ÏγEd¥XU{¥­Ñ¸º,K$ÆÌh{a^¡’•¯´TÙIqÁ"¢ÕÏ]å'`—l)/·•Gf¬±*Ò&%±$&xrZê±ZQíK´û_3ŒC‘1= ªÇåìèŒ6þ˜gMå kj”Ø+Kíª˜ED Ñ©©–¶ÌbÉH6{NU•W;ö™9TõE×éŒ%ÛßéûkûCßìçßÖó""ÿ°ûíòéL’hp[s;]"®êÂ<¯×¬Y¯ý*Ù Òå<éKʯ“=ŽºÚZcìæäƒÇf•å”ÚÊ37zŒÖ„œ}9ñÁc*Lj0ká(‚#ÿÐ#ó;Ú>5AÕÇÐR£®¶ÖŸ–¬ù(ø°5%Rj«,Üæò-qI%é½ÏÚî¯+ÚëÏß—Sj«ÌÛæsLRѾ´Xöë±3Dg”娅兙Õ&kBRɾôÞ§Fiô³fùqÏÞ"RÊŠ:l••ÙÇ\ªÑ“˜¿/#>x²Zê±ZQíK´û]3Œõ9c!"æ˜Ä¨ªÛ¶µUN ñY9«óJm™õFKÂæœ,O^Uï`—ZV&¶ÒòìzbŠZ_–Moû6¤?Xþöî´%ÛßùíÈ M¸;nݺE/€ˆ|øá‡³gÏž5k]`ýõ¯}àôËuN[²ý=ùï/Ûthý¡Mµ}ÿ&íü‹<°ûí¾$ÑÞ{ï½ûï¿æ÷ÉÍ›7¯^½zß}÷Mã6ðL4€Û—AQƒâõ/]29H¢:H¢:H¢:H¢ܾºTUíR½þ¥K&G]pÛúËΤ"âý/&W¢܆ ‹¾û­°ß ûÖ÷þžéœh\‰p;ºwyÁÿy·€~˜"\‰è ‰è ‰è ‰è ‰è ‰è ‰0ƒÌš5ëæÍ›S°"UUE¡Ã}D `1üñ¬èòåËwÝuî#’h3Hhhh{{{[[›ªª“´ UUÛÚÚÚÛÛCCCépÐ3G@@ÀÂ… ÛÛÛ/_¾ûŒ÷I4˜m5[{¹µË땎3ûs·<¶rÙ²•ë¶×µvŠˆtžL_6ÔÊÜs]C—ÖuáDqúº•ËV®ÛRpâB׈kô¥ŒÖ¶~)˜õƒppàùü£,Vk3&°úØZ:Ø…š-+Û¡¯fëîuƒ½ýL—¯ëõ­.ü–w>ñȲe+×m)¨ó~§ã\Unúº•Ë–=²¥ nàÖ,?öY`„€m;ùrúc+—-[öÈ;÷ŸéÃîGK}ØSÆ3ù³§`¦±:¡È‹çêªØÅÇïæÍ›³fÍš‚)Š2IÏ\ûRâvN˜‚c‰ÖºÒJ‡š8èØ6;»Ú³:«(Ë*-U¶ÒL›éHñÒà˜¬’w!ÕYe; K-†!‹;cÛfkŠÉ(*³¸jl¶m…Æ#ÅKƒý/£µm€Ÿ©ˆƒyô x¾ÿ(±­µX}L-vzWXîPÍqý/¸cBVN²¹ça'Š)ÊàkûR>Ë]­û·eך6äï[jtÔ•–nË6Ù½"D¤ëBUff¥q}NIšœ©*-Í,·ÙmÐ,?¾Y`X>¢2³°Þ´!§l©Éu¢Ô–vdr˜¸-õeOÏäÏž‚™6ÆŽŠŒ±Ä}¦ªÒnLZA‡$À?]­»7>Yë1yä5Ô8Ìç&GˆHtNιG³+;–® ‰Œ8‘i««t˜Ó*Ö =µiªjPJrRâƒE¢òÏ=šYÕØ±tp)_Êhmà­`V´‚P#ð| þQb[sŸš¸ê~·t¤Ó;[¥Ûìýl`·Ó%æÔ„¥ñ!~÷pˆuáó°Üi¯¬uEåìK_"]ÔfßXYaEjDWKe•+&çÈö!"±V£;»Îá’h“Vùñ΃+;kê]QYûÒW„ˆˆ5ëLCf½#9,ħÜÏ–ú²§Œgêô}OÁŒcš¡È à«…Û9`R,©e‡Þ—ftf£vš£â–š{ÿ 6[L¢z_FÝyª¼Ò“”“4ôkÞ.ç‡XWDõ|k°®°*ŽSÎ.¿Ëhmà_BB#˜µƒP?ð´‚”ØöeŸguÿ[*m5Oxßÿs¡ÆV©¦æ¤˜½ênõ(f³qxKûëjn›v]ŒaXö8ª9ÊÒ׿x«â<ãì”.çI»Çš×{Ÿ»¿89B»üÎ""bŒJ\Õ·£I‘Þ[n|Àýké ¨ÓÚS|ˆö1ÔÅÌcµC‘1C\¨zlcµKm)\ûHqsWçÉô•[Nœ;QðÄ#Oì¿ muO¬ÜR×w3pGÝ–¿:›kr·¬[¹lÙ²uéÅuܹñI{Ú‘ý+B¤Ó%ª³ÒV•œ‘‘`Ö®ÕV—Y©¬Ï)Ë1yì5¥¥ÛòŒG^^ÁE€ ‰¬³õDiž­AM,J‹ö:2ël:pLV—Åp𠪪ÆAçCâñ¿ 0©ÁÜ1Ö %ø}Šm}jBªûÛÒàØ”í±}§w…•žÔ}ë# n»×¢ÜN·¨¢¬È*É0ºOVÚlÛܽûñª«±m.ͺƒ¸Ô),?pÆ’£8êm勈¨ªGTGi]bVN‰EuÔ”–n³™Ž/Õ*?Q³Àà¬Gsñ£Ûê="–õû’"&©¥Þ«ÕªÑ>†º¸mÆX½PdŒ…Hf¼ÿ¾ZÕ˜RR&"Ò¦1ȵVU:cò¤Ç‹H¤5ÿÂãÛjì+È¢a"‰Ó¦ãÜþ¼j»Äl(ËOõ>Lhk¨´›RFþ–XQñxIUêuœâ{`Rƒy¬A84ø;Om4Ï®Šˆ1¡ìµb먋¾ã¬>Q-m«+¬ô$•­vCÄúŠã냃{^޶*ÎGó*:–&‡ø0\ø\¾å–Vä5gçe?^+"æ„õqÆZ·QE󆢂䉵*½ÏKJÖ(?$äb þí8#W7X3*§8í5奙y‘Gvï9b[îË$2ž ˆ‰éK0ÆE…1úL11:ßõ8ZÜGöÚe^¯™[=B 3I4˜¦⓹ «óg­zÐ×ÖXã0''„XQ1YŒªÓ­ö~ѧzÜê°GvøR˜Ô`c þà¸üÃGTÅh2ˆh/vÄÍgõ ji—ëŒÃãlyòáê¾Wª7.«M(;^köºª!Øo–š6Hˆ/Ã…OuáGr)~û¯þ˜ÖÙæQÂBÔ3;­·˜¢˜LŠbŒí^’%¶¿ŸG,?4äüÜq†Tïjku¨æèˆàఈఈ,å\cf½sÍŠà‰o©/“Èx& &¦ÛzŒÕ EÆXèR”eä\í²ž*bJ*)Kµ äGc}ç—ÎÓ¶ÿ¾÷b¿°U/W/¿—^™ü°LË4wÊfk²¤UÎáP²­±ÎiY£‘Cƒ%Þ*Ž“-=ϯîržlQ­C¤Þ—2À¤óØ‚p„à7„„õ 6Œ²X­}jœÕ'¦¥†¨¬ŠÃ½*J֛Ŵº¨¢"+ÊÐq*÷‰ôªþÇ'w:ϹÄiôi½>Õ…?‰Š— vŸë4‡…¤³¥®E¢VX b°,µ¨Î3}ÀègòCBÎïY`puwcá¶ÌÊþOYU=ª(Êä´Ô—Id<Óm=Æj†"c,ü59ëtžsõü—Ñj5ºnco4™Üu¥å n~[À/çWú΢Ýz÷Ýwß}÷O»½WþûótʤàJ4˜ŽCb{M“jÙ`v5ê=zÅb‘Ž–“NcÔ ß;ÏÕTžR’Ó’# Áq›W3KËOæ§Z\5…õ’X’2†2| ˜Ô`Ö ÂÑNîG þÁ4;ê>51ÕÇÐÒý-$"¢¯ñJ„"ŠÉ""Ö¥&‡-ÏfÌJ‰RÜMU¶FcÒ¾!ûªIk½Úu1F³Ø ó •¬Ôx¥¥ÊÖhLªˆ ‘„´„òì<[DVŠUµWÚ«ËBDº4ÊOÀ,0 ,.ÙR^n+ÌXcUÜMU¥MJbILðä´Ô;bµ¢Ú—h÷¿.fþ+>†"c,zATËÙÑ2lü1+ΚÊÖÔ(±W–ÚU1‹ˆ¢SS-m™Å’‘löœª*¯v$ì3s¨ê‹®ÓK¶¿Ó÷×ö‡¾Ùÿο­ÿæ/DDþa÷ÛåÒ™$Ñà¶ævºD\Õ…y^¯Y³^ûU²A¤ËyÒ!–”!_'{uµµÆØÍÉ ŽÍ*Ë)µ•gnô­ 9ûrâƒÇT˜Ô`Ö ÂQG þ¡Gæ#.v´}j‚ª¡¥G]m­)>-YóQðakJ*¤ÔVY¸Íå1Zâ’J*Ò{ŸµÝ_W´Ö«]caˆÎ(ËQ Ë 3«MÖ„¤’}é½O ŽÏß—Sj«ÌÛæsLRѾ´XÃhåÇ= x‹H)+ê°UVfs©FsLbþ¾ŒøàÉj©wÄjEµ/Ñîw]Ìü1ÖçPdŒ…ˆ˜c£ªlÛÖVq8mH€Ägå¬Î+µeÖ- ›s²¶­-.þ͵åÏfoµJkõÞƒ;öÌùísqƨ­?Í8\S?:úb•$„9ü¸Ö´'÷§öèg² ,—Ž¿¸7÷'A{_ˆ ò¿ŒÖ¶þ¥"FæÑƒpXàùü£Ä¶ÖfL`õ1µtˆ‹Çrè|÷¼˜3®-ÞúüÃózšªÌY¤øÚþԅÏòú·WòŠkç¬ûqÑbãù7v0ï¹ =»–ÌQ¯<[ôgòž{õ+wZðÛ§)šåÇ7 ËG*ØU?gÝó‹MíoýloñæíÙ»*ÔÜ–ú²§ŒgògOÁLcGEÆX Î5Õ¼åY’ýËMÑôH¢ü¢:*wl}ý’ˆÈ·kÏÏûî®g’æ‹È¢çŸnþvqMã'q«ç~=nàD¦ýXÍysjÉê¡§6öêÓÝKrŸY$ùãæ­ÏmrÇ=dò·ŒÖ¶~Ñ fE+5Ï—à%¶5÷©‰«îwKGè¬Ú=¯ºçz½rÅÙ.æu‹bçúÝÃs}¨ Ÿ‡eOsMí¥Èç‹RæŠ,ZôÂ¥æï½ú–sÉ£µõÐÑKßx¦àKæŠD[ï¾òÜ›ç]²È¤U~¼³ÀÚñúK‘?,JMœ+½à‡ö·Ÿ}³Ù½*ÔäÓîgK}ÙSÆ3]ó}OÁŒcš¡È‹áº=j )*ÒL’_F< &•bYWðë]»öltf£^7GÆ$ÌëýÓ:ß$ª§{PMOÓ¡C×V=ÿðЯyÕ‹v‡,H\Ôs`¢X—,<Ö©ú]FkÛÿÁ¬„ú§ü£Ä¶/ûÔ8«ûßRqÏ|(%¿©o×sßs¨{Ýókçy-ôŠãz 9t„óŒþºšÛ¦]c–=]ìžiéëNsÌ‚ÀìÎk¢^|Û~}ARLïY´1ö™½Ï­²h—ŸÀY@DD‚¢\Õ·ãEÔnÕ×Ü¿–Š:­=ŇhC]Ìü1V;c1Ä'DzŸÙóQ÷í}jÕKͪˆçooü${몔”‡R¾÷O/½Ö2tœTÚóôÖ ¥¤¬z:ÿç>é}ùÚûµ/e{CÊC)[ŸÞ󆃱3W¢À$Ÿ®Í µÌÏàƒ0åë©»ŠûÿºÖtô­ïމòþÆXý[õ¡f릭Ãs£^¹x-pž©ï{VeN¨Ò}Þ}MDñ¯ŒÖ¶þE¸F0«ç5ƒP'𴃔ØÖß§Æ]} -5.XõGÍ=o´ñÕî Åk-Ío ,´ûŠóJ·z´àÛE­ŸλIÊó›êyÞV]ÍmÓ®‹± Ëw+rå’»?ËÐ~©[T×5Q/]ü$0ÈóÖÏ¿ôì] ú»Å)Ï?µÊ¤Y^‚&hè+ö³½eÜk:túÊ{$ÚìóîWK%h ê´ö”Q&—ñÔÅm1Æj…"c,››T²GÍÜQ¿nÏ/š+êû?+8hÞôãM‘Æk͵{ªôjÌo7<‡Qý[Õs{›,vü<:Ðõ桟–ì;˜Ô~¬¨àPàÚç ž6]k©=xðé’ ßæ-áÂUD€¯¼k«¥ä§§Õ‡²7Dy™yìÕÇdù®˜î P»»%(hà1"w+"ÿË“Ìî±á(ÁïSlkìSRÝß–£×þ º÷ô®v׫žuÅëç+îf¯E]¹è–n \òüMÆ+oÚ³÷é+A=Ïâñª«±m—4ëb L1ë¾!»~Quî¥Ôhåü[/:/."j÷uénùù>ûtž¥û|íÁƒOï™óÛçâ´ÊOÔ,08pßqkÞ®‹„?²gÕüIj©wÄjEµêC´¡.n›1V/c1LPÜcO'-(*HD(oÝqéú ÷¯|ä\ôƒåq1sEÌ7?xÉ(êߎºý㽩qA"òõçw\üòŽÛ?Y’ȵ˜H¢À´q7Wý䥣ÿ!Qß-(z*Úû¸ ½¡¦Ù´väo‰•À@¹vmà´ûº:ì‹|_Ê“Ìc ¡ÁïiÊÿvIK·ˆÜ½øçŸ³ŽºØá›1ÎêÕR×»][µkí°_”›¿ö—‡Öƒz^^ôBàGß.©iø$.i®Ã…ÏuᓹK~œýþs%Åß}]Dæ-y$&èõ+Æ@Q$PdÞwŸ{6i¾ˆD[{Ÿ—”¤Q~HÈÅ(þí8#WWü d×ú‹Íµ‡îxiÁo Ç÷1-÷eÏÄÄô%c‡‡¢Â‹Ñ)óliþSmK«ý}{SËuY<øýEë’æüϧ¶Þ¿xqÂ’%‰‹£ÍŠ¸Ï·~rýü?oJñ*8Ïq]H¢$|…ˆß~éŸv5.ßñë­K†ÞÐ~¶öü¼¤Å#ÿè·2g~P÷Ewwï!¤zíŠ8oÈ£[})Lj01‡¿1fÇÿÞÓ-"dRD´;âfŒ³úµTuÙÏ_û¨ukêѾWŽ~/åø’‚C/D+F¯’Æ1f9îº.2ח᧺ð)vó/«S=íהй깢o¿neΜÀÀ ˜þç%ÍîïçË 9?wœ!ÕÕö¿9ºC£æCç[CçÿPin,xÓ~í¡Ä ‰o©/“Èx& &¦ÛzŒÕ EÆXŒî“s/æ7Ƭ^þ`Ò¦µI¯üdÈ3Ñ‚¢PVµ¾ùlcSSႃ¯,þŸ»ž‹é™óðO ÖYòûÆPz3?,ÓáZÓ‹{ì– /ýïgF8”t}ãÿ _ž q¬ Ì±Êù†÷{ŽATçé÷»,²_Ê“Ìc ‚_™k 5‡†šç)£,VkŸgõ‰i©µµä×»výz×®_ïzé§Ì“9Ëÿ×K%?ŒTÜM/ýSîkýÏKö\lvÉëÝ>­×§ºðãLïíŸý¼Ò~M1†ÎUäZË›ïË¢%VE”ðÅ–î‹MÕ¡ý¬Q~HÈù= ®î>»ë™‚Wû?eU½®J 29-õeÏÄÄt[±š¡È‹QyZjþpmù®’¼>úPÜ×ç)×Ô!¿à>Wõ³×ZÑKÖo~vTÎV·|b\° èÊy÷Ý¡=ÑeºòæÏvóÛ˜¸ ¦ã¢ùøÙîùß ½ÔÔt©÷¥À9QÑ‹LŠˆ|ÒòöGA‹¢ß­sÍ~üÕÆÀUO­š¯ÅlZôìÁC ;ÖY.ÿÉ[òPnœi eø0©Á¬„£Üüƒi,vÔ}jbª¡¥žæã‡š“RWYæÎ·Ìí?! ”À9–¯Ï7‰È‚Ŧó{´'è‡k#•+öê=g%ÌTפµ^íº‹ yÒ²ëG»”®‹QÞ?úâÙ ¤—bŒ"27î©Å‡þ¹deëZkwó¡=gË 抨å'``ŽYõßzñЂ,_ \±W´+æÆMNK½#V+ª}‰vÿëbæ±âc(2Æb0eμ ëï7ØÿfŠTœ§«^<{½;ò¢[øU E[¯¸ç;6hLe€I f­ Ô6rð;Ei±£íST} -õœãw¯Ï‰K]eÑjMèC/•ÈÏöÔü$ïÒµ»Ã¯Êýeê"ep]ÑZ¯v]ŒéToÑ žVwú_Gç.Xœ”[ôTïÏÇÅí(þçƒ{•ä},ó¾ñpöÞÔhe´òãž¼Í_»+ûÊ‹55Ͻy©ûîyßX²cï¦XãdµÔ;bµ¢Ú—h÷».fþës(2Æbðx½éù‡K~VòÜïçÝ¿<õ…ì wüћѿ|°·€1vë ëöþìPñ3Ý8'2ñé‚.RDæo((½¯ü¢ø­ksî_¾c×&:3Å·nÝ¢@D>üðÃÙ³gÏš5k uo~ü1ºf}íkc9çºyóêÕ«÷Ýwß4n9ÏDtDtDtDtDtDtDtDtDtDtDtDtÐ0~³¾ö5:¾Ä¸ ÐA ÐA ÐA ÐA ÐA ÐA ÐA ÐA ÐA ÐA ÐA ÐA ÐA ÐA ÐA ÐA ÐA ÐA ÐA ÐA ÐA ÐA ÐA ÐA ÐA ÐA ÐA ÐA ÐA ÐA ÐA ÐA ÐA ÐA ÐA ÜqÇtp²6I4è¥(ÊçŸN?ÀLóùçŸ †éÝ’hÐËd2}þùçŸþù_|AoÀLðÅ_ôœ©Í;wz·äŽ[·nñy@7n|òÉ']]]t̃aîܹÓ»$ÑÜÎ è ‰è ‰è ‰è ‰è ‰è ‰è ‰è ‰è ‰è ‰è ‰è ‰è  `¸7n|òÉ'ÝÝÝ_|ñ½ÓîÎ;ï œ;wn@Àô¤³î¸uëx»qã†Ëå2 wÞÉåº0SܼySUU³Ù<-y4’h0T{{ûwÞpçwÞqÇtL»[·nݼy³»»[DBCC§~¸†RU588xÖ¬Y\‰3GÏ9ÚgŸ}6=kç€áî¸ã2h0£Üyç³fÍš®GWsŠ#à.NàdÍI4@I4@I4@I4@I4@I4@I4@I4@I4@I4@I4@I4@I4@I4@I4@I4@I4@I4@I4@I4@I4@I4@I4@I4@I4@I4@I4@I4@I4@I4@I4@I4@I4@I4@I4@I4@I4@G]­­æ‰ÇË#¿g4YÌÖ˜”Íik¢ƒÇ²ì®Ö:›­²ÑáV-W¤G¦ =]g¶?œm—¨¢ãû—O]7vË]›Ù¨Zs^ûÕš¢ ÀôâJ4˜R·ÓÑt̶mí–ýÍ~×î:WšYÚàp«¢˜Í!b ?`jp%LsÚáWS#½ÔÕÙæh¬´Ùêâ¨.¬Zq8=ÒŸDX—óT“GĘXr¤ >øöè…ÞëÉ¢òï_LP¸]q%L!CpXôšÜ’¬(WÃI—ŸõU*"¦h é(˜R$Ñ`Ê…Å­±Šˆ¸î.znÜÎ SOéù?£É8èåŽæºÊÊšF»Ó­Šb4[’SS×/íù퀮æâG·Õ{DDÄYþø²r1­¯8²=ÒÐy*}m^‹yÃáÛ¥±ÜV~¬Åí}ëähËìÓuáTåªÆ‡Ó­ŠÑd±Æ%oNKŠ ~§iWÛ©ÊÒÇìN*F“5fõæ´ÍK5Ü ÷ DD¤¥pí²B±dù—ä°Þ·;[OVVV549ܪˆb²Ä$¤lÞœ=êotµÖdn+oQÅš¶o_j´Á—®ØSRÅ‘&{UùšF‡»¯ ›—†ÆÒ¾J¸ ¦\GÓI‡ˆ(QKÍYžÖšôÇ·•krºUÕãj©?·qcñ©ƒ)61!.Ê$""昸„„„h£W^GuÖç=Yx¬Åíµ½eŠˆHç™âÇ7æU7¶8ݪ(ŠxÜN{}yæã™umC6[m®Üöx^u“S5šMŠxÜŽÆê¼'óNvh6ÔŸ˜eQ¬q ‰ –¾´aÛÉÜOÖ6:z6MT·³éXé¶ÇÓkZ5¯ÎëºP“Ý“AÛ°¯l ƒæS3ûzéØödz48<^Mؘw¢ÃÿÞðC ¦PWg[ó‰âl›]D‰ËÊèÿq€Îs¥Ùå-ª˜2ö½öæŸÿüç?¿ùZYF‚IÄUŸ—W×&"akveÄEÄ’’órqñÎa vÕÛJ›”¨¤¬’}‡‹‚}[¦H×¹ÒÂz·ˆ%©èð›þóÿøç7%™EÔ–òòsƒÓYŽêZgÔ†²×þüÇ£¯ýãñŠŒEDm*¯ÒJ{"S Š‹Òb±¦æ¤Çö´øBM^a£[Ä×»mo¯È_ݳÚìòæ‘–×u¡.ïÉr»*–õeeéÑý…ó©™½Ü …å-–õ%½Mx³"+NQ›Tö4ÁŸÞðC &‹ëÀÆeC<¼öñm¶z‡µ¾èpÑšþ$X[}y½[”˜¬²â”èžû !±)Åû²¢D¤åÀýŽÇ•U±gr|tdDˆÁ×ev9OÙ="J\FFß½†°¥iY f£Ñèqº¯Ã˜XT’Û{»epdJNšEDÜ·ŸÓu®²Ò!"QY/÷n›!8rEnEQ‚QÄ}ì@ã°‹ÛÚNn+mRÅ’T¶o{¬×Ï*ø×uª’_¶=¾· †È䬌ž&¸Tñ·7|µD€©§:[Î9=ý¶5Õ9DŒ ›W‡ .¶:-Añ´œÑýO%1mPmß–iPBQgE‚ã‹_}ýõ£»“W5%¦Æ úUP£Ù4–Öw9N6yD”„͉ƒW·yµIDZNxo¨®“¹OÚ="–Œ’±ƒ6ÁÏ®3&¦Æ ªo2›þð«7|ÅðÃ0YÌi‡_MôRWÇ{Ã[ycKmv^Ä‘ýÉa"Òå:ã½<3]² SÛÓ%2ê“í-ñï÷}]fDBŠõ@¹ÃU»mmCTâêä5Kc¢¢Ã‚GnO¬yð&(ʘúÅãlñˆˆe©uèz –¥QJm£êt¸¥ÿVWÇÌBOσӜ55ÍIÛ~NÀï®3G›GëEzÀW I4˜B†ˆø”üüÖG3ë=-uöŽä°ÕÝó@|·£EãŽAµ7‰4 Å8(‰äó2#RÊÊÄf+ot¹[ª[ªEÄhMXºyóŠÈ!é#eb:AíÙ4Óß&‘Þ,u«m¯›0=ªX7%·–Ú]µ¶ÚäŠÔþ_Ýô·ë†ôÒ0þô€¯’h0Õ Qkb”úFÕsÁ#"}WtY2ŽüKÊ„Ý2èû2ƒcSŠ_Mél=Ópòä)»ÝÞâò8k NU, ™„èIž©ª:üê:UU¶¾—uþ²ôèà¶Œ—¶8Øê÷÷ßZ9á]7õ½àöÀ3Ñ`êõ\Õs§¡ˆb2EÄÝêáçº:;;;ýÿ]H¿—ŸœžûòþWÿxüpц£ˆ»¡Tów7ÇÅh2‰ˆ¸FxR¿Çåôˆˆ1Â8]³¦¤D‹HØêœ i)/=Ù1Öfúh {Àm‚$LUdàNCƒe©UD,15JDœlÞwu]8a+µ‹ˆyuJäÈí5D§å$E< ¶=ɱ íºéé ·ž‰SÎ` 3‰xÄy²¥si|°Hp|FVBSa£ëXæ£ö¸Ä„øèµùTM½Ý-bJÊψ6ø¿Ÿ–“šh´7xš }âdRBld˜â¹pæÄ±F§*bMÕJfùGqÔUPbÍÖ˜Ø0ƒ„$æ¤Õl<àh9ðäãgV'.ëh>ÓPßäóúüÍ£¶*®±°É}ÌV™R‘a˜È®›’Þp›"‰SÏe§ÇÓ`+O9’m Y‘_!¥Ù¶z§³©¾º©¾§œ1j}N~ZìÒ—eÇç”e¨yå.gã±êÆþº–„Œœœ”ˆ h«Á²"NihTíÕ6{µ%ëÈ¿$‡‰"RËöIaÞ&·½¾ÖÞ»ibŒÚ_”>zÞ+dEVFÍã¥-ÎêÂcÉ¿J ›È®›üÞpÛºãÖ­[ôxûðÃgÏž=kÖ¬©_uWGsSS‹ó‚ªDX,Ö¨˜ÈÔ,³«í\S‹Ëår«ŠÉl±DÅD‡MäUWÍ'ì­ªaKŒðZrç…sMv‡«M•0“5*n<íÀ®›äÞ0v7oÞ¼zõê}÷Ý7õ«&‰CMc 0ŠiL¢ñÀ’h€’h€’h€’h€’h€’h€’h€’h€’h€’h€’h€’h€Žº&ÖÍ›7?ýôSUUoܸ1ykùôÓOéj` î¿ÿþ7n´··öÙgªªNøòE¹ë®»BCC†eýõ¯¥ÿÀL;4šâc•Q–f>’h0‘nÞ¼ÙÞÞ>wîÜIþã?þÃjµÞqÇô9àíî»îÒz«ÃÝñá‡oܸñÁ„‡‡[,EQ&|TU½|ùò|°páÂ჻-˜Q‡FC^|à&{“F?XšáH¢ÀDúôÓOçÎ{Ï=÷LÁº Ãíøí 0¹nÝÒ:LüUEŪÿ{u{{{xxxhhè$­_Q”ððpéY»-˜É‡FS¿E£,ÍpÆÀDúüóÏçÍ›7E#x@gãÀ7º»Eä³Ï®yýW=ÿáñx¾þõ¯OöfÜ{ï½ÿùŸÿÉn fø¡ÑtÑ:Xšáøa˜H_|ñÅw2´3×Í›7gÍš5ÙkQe2¸ðåp›,q¦è ‰è ‰è ‰è ‰è ‰3Bggçï~÷»O?ý”®fŠË§ËsKߺLG@„$Ìÿþïÿ^QQqýúõI__ûñìgž÷þEiõâ[{ò¶¦>–º5{×[U>àòé‚Ôí¿~ã7;Ss§5vå­ìdž+°û½›ªïïÚ´iWóðzWÞÎNÝq´Ý÷åìÙ´©¤yB‡ _–9PæÊÙ©;Þhÿò4€ÛR×G§¤ýãòo~ó›ßüæƒË¿“Qü»÷.w‰t}túï}Y¿… às€éÕ“A»té’ˆ|þùç7nܘÜõ];ÿÆÁš êï—ì{óöÚ£¿—?¿ýõ={óÊîÞ“ÄGƒ¯4µ££SDD:ÞØ™*/W/¿wÚ¶%ðOç¦.ðÞ'ïž§|u?šÀËyxCÓèò 6çý¾màÈÉsáµ½ó¯‡þÇ·BÞùý_þ~÷ò÷¾„í&‰ÓÉ;ƒf4¿ÿýïßsÏ=“—8èÙç^¿$"2Ûëåkö£§»ç>½6&H$rGËS…ug¯Ä-ŸÃǃ¯²ð|¹ZݾÁöž:ýy´À9á‘ (|(=‚­M]D70mºþßÒž ZÈ?|ï‡O}çÁE!Jçùw~ÿ Û/Þiû7¯ÌÚ—I4˜6Ã3hóæÍ›Ì*áëòþp÷µ³%?:>ðªzÑ~^lì¹®CYðà‚À²³Õås8eÇW›aÁwvWË É£àZSÞS5f?|¾¦îtë¥Àð7e?½|¾"=×›î©9{áj·Ü¾xÝÓO¯[Ô{ÝV÷¥ÓóªÞj½8øõþe¾|ïÁ£ö W»gGþ”­[Wõ¤îúxýîˆÅ)k»GÞœWª¿‘¾,sp™+oe?sôáŸïZª^|ëàÞªÓ­W»çE=¼uǦ˜9ÓÕ|¾:>úí7m"!ßÚ][ð`pïqÓÿõË—/zåw¾ä<à™h0=¦<ƒ&"¢Ì ?þüyƒN»¯|t=pÞœÀÞ?çÌ ìn¿r·±{fÏñþßo~{dlË1,øÎîêœzÊoL÷óцé¾Psðìü”ÜŸÿ|çr9½÷àÙk"¢¾¨à—Í¡ë2ó_Èß¹n~suIMß#¯ŸÝ[uåÁgòów®›÷~õŠßº2hqíoÖ\‹ÙšÿÒ ¹ëæµü2¯äí+"r¥iWÞ/ísÖfæç?³¼»nïÙëÃóH£¬tÄôe™zeÔóÕÅ{ÏÞ½63ÿ…Ü­QW^/Ùc¿6MÍàÿgïþ£šºóüñ¿º6—Vˆ&J'Æ3ïi²ç4|æžd•EÙAj‰‚âüµ`)?º%:‚V¤âh»¦v*t |eô#e¾‚{;‡Ì眤g!sÄ|ФP »ÜL×Ï€ò#7 ?äWŸ3çL¹Þ÷ýñ¾¯¼îû¾rïÍ÷chDDD?o'bþ.;c¬‚FDôí-ÍÉ'4FàµL{w¢,Œßþö·#4"zíµ×æ¡‚Æyî`É›ÿ´®ÆðyDv!XÊ.]º´ÿþ'ÿýúÏ_»xñâÌå%}õÌ…?ülÿ-õÝz÷Ý¿¯×þÃ<ߎ6ôû÷vþ~ü„5‰‹ãùDDêCñJ_¢€xuàŠÎ å_©NÝÄ'")ï^õ±Þ'hï¿ÏL‹ bˆ‚}{½WYב4öág;k*»äé%IJ>I¥i½wÃ0Ø\ñGÞߟȌbˆii½×8u]¬ÔÉFÚ=XfÛyºxoF¨¾DÒQh¯ˆçzKžÝî|_†FDk?ÿ÷Ä)Sø3í¿ÿlù÷$Šh cóæÍ<$¢ÚÚÚ={öøøø,È–ðx ÙŸ^ï²vå„%íõŸ¿FDû÷ï&ÎjYß6åܲü7óÓw4 ð@ç”àùú9ˆhe Ô{ìƒL£·“2¡›yíÆÆ:C‡±C¯7QÈ“vÒЀÑ7# ‘ò;{Y[îPgû£¡»vŒ[³¨ÓÎú{yÉÛMÙD+u²‘l¯ûeºŸ‡ Œß,:vf_J`ˆ*dýúõ! †ˆb÷¾?C£ï7ÑÆøÃ={ö|òÉ'ƒƒƒ½½½W®\Ù»wï‚ÔÑx¾k¼Æ*gŽ¡Ï_äCËa°8û š&éÝßöóÓw*Î'J½äCêä‡D<†Ç›RñЗäÜ㽺9yëæ:M±ó§³yDÄðÆM`‰VnÎÑl[ót"Ã÷§NO6ÑÅJnäœà+’‹½ÕÐÚÚÚzO{¬¢,$­83”b÷¾'C#"þCFäþß=¸ù·yõÚŸ=ý†q°ñð?¼ûoìßæÏÿûóïDX0"‘hÏž=€ˆ¾ýöÛ+W®ŒÜ˜6Ϙ¥”:ïuŒÜ‹Æv5w8¤!¸ –Ë`qæGmºì†ÊßÛÿ>ïtnJ|„R*â 9ž¾ÂËÑÙÜ5:æe;ïu:DrÑÓº·Têý¨s€ï?ÂwàvÙ§Í,#’‹ãÚµv:¦µRgYǃeºŸg@_^VÝÁW„Æ&§ç—œØÌk­6 ,Èî|/†F£†mO^}öwÙšèqµ²Á{E'ÿ%úé«?ýá2íCÑ’H$Ú»wïø:ÚÐм¿ÒŸ¯Tÿ½wk™¶¹½«³ùÓs¿§õê_øžûöÞâ© 9:;Ú'èìáüé+ž¯È{¨ãž¾³g K_w®¸uÈ1Ð50öjýߟ;W§oo×Õ+¼=ôRb„ÿÓ†LP|üšŽRMI£¾ÝÐ\^XXÓé(bÈ?4^îø}Aaµ®½]_Wz®ñÑ4Wê„'Ët;6V—ÝÒ·wt7jtVJEÞ ²ûßOl{ãÿjüo‡‡‡þGã…à oÿ¶hí[ïD/×çXh#u´+W®Øl¶ÿú¯ÿúË_þ2ï›ÀW¤hRËJµÇŽ y¯ IÍOUòq\à{?*ìë¹1t܃æøã•cœ0Å{ý‰Ë)ÎgfÉ©› ËνÁF$f¾ë]zîJámE~ ñD[ßÝ6PYòÞ§C+׆ìÍOUMü¨Äkò¨¤L[ðû!ÞÊÀˆ4Í›A ùFää³¥%•çÞ«ð^»^™x£¸ÃÕFpì’Ët;_™’¹­¤ìÓ‚÷Ä[¸>U“Ä0´»ð}Ãüí?þ]ßoßýoŸæþÛ§ãÿaíöó—’ÿ?¯e»ãÏ=~ü‡`¼¯¿þzåÊ•+V¬˜AÛ®®®uëÖÍ aoooMMM\\œ¿¿¿'óÿñ|饗žß…Lð‡ƒˆþó?'ßÑ9òTÑÿCD?ýéO=YÔpçç9š{ë5¯Î¨‚ö‡?üáÅ_?嫯¾ÂÇÕÐhüp嫯¾ò`˜ôíþWûêèõkèá½Ï/úyã؈H°ö§¯¾¹ïÕõk<7M,yè»ï¾{ôèÑ /¼0ÿý‰aÀ¢0r?ú`ñð’¾Z¤}ý0Î:úKkÖ'jÖ'~¿vïDpE47PDpE47PDpE47PD˜Ó¬úWõßÿýßè€EkÅŠß}÷ݳ^ ˲ à·–Ó`éy9€9ô×ý×=òóóCW,”?þŸÿsëwõ\ÿ*¾ùæ›5kÖ<ÓmøöÛoðƒàXÀ"-”%:XÂhséoþæoþüç? üå/Ao,Âa¢¿¿OOOww7˲ÏbX–íîîîééñ÷÷Çá€E>4šKz°ôÜãÇUã}ýõ×+W®\±bÅÌš÷ÝwþóŸY–}¦u´?ÿùÏ8R3ðâ‹/þå/éééùÏÿüÏgQGcæ?ø¿¿ÿóÏO¾ßÿ«¯¾BÿÀbÍóXÅÅ`Éó ®G½ð óß](¢L6Ë"<# XDÃãœn ˆàŠhn ˆðÌtWîÞq¦cxÜ”á7 Äo ß¿[sóÁðülFßÝ›v–wÑ`[Mù¼­vÊfÔìÞ´³¦{±¤ôɸ&Ïv§æñxM7H$’ŠhÏÆ`GMÑUÓ„Ÿƒl9yðd“0)ÿ\þ.±þäÁcwçw›¬-åWkLìÂt#Û’°M&XlÇi}2®É³Ý©9^ž¬tÁ#yD(Ë{ðÚÁJ}߯0«ÙÊÈÇl^E$“ˆ7ZÄŒ[0Z‰aˆˆD$cî”§YFvhÕ–ìÃ5oœáÜ åÉfL]ƒdWvÒË«ˆÖ&í’W]ê°ÒF¶éRÅ橃½ˆÙÙm¯d§¶ãX¯çŠæ)Hˆ|‚ÕoÏ8’—Ñæ Ã0d³=­5°6ÖyD¨T޾JÍf2Zm¦ÌØðqÿ*î°ÑFyRœ8-÷•xyX؆£Â‚W{Moc¼ÎÍ­0 åb/bÈ\éXQM‹¡£ínUy“U( H 3æÊ«7Û·_BDæ6˰×Z•J& "¡"lC =¨¿ªcIœXx.?;ï\a‚ÈX^ó€›.UY‰$û¯}ñë_ví°Ìó>°TŒß´ù`•…ˆ Û6á)ÍÕÛòÏŽ’ ˆ¬Æ¦ÚŠ¢cioĆï,¸ÓGƒú«Uf"aÜG_üóÇ_ÿ,CFdk¸ÔÐçÙŠGº4©ï×µV"Ùák¿þøãë×2dD–úJÓ0מ.e–› "j‹l•|›’ˆL5îªh“`Œdÿ'_\¿þÅG B"2µX†É£Ã15ŒW½üvÁ™3gÎdo؈ˆä‡³£VyØýÚ]&/|•J­$"ÓMý ›ïèljhD’ýŸ|rþÌÇ× ÃDúKõˆ–YÌ ›ïšˆH—‘wþãkŸdĨTÂ>ë0çtWÅ“ÙåÄ,BÇ‘+¢\_® äŠ4wŸM7çGX˜:Ǟ͓ïQöZ›—(&2¥Ô³$ŒËÛ?þi='iÙÅÙËüÚiTx’â”–jqä¹ÔaÜÈh;OÅ«¿:9ºžÁð–¼ `>FÞuk³ÚˆÆ ·llDDÁØ;Pa»b«¼ˆÆ•,-&–H¶EæED«£’äE¹Ü_p •J!‘X&$2³4ù®5Ÿàwó3îÔÖ\ÊÜm2š,7µ [ZÌDd©8øJÅÓ 1YÍ-&¹£Î‹ˆÖF©eNš<ìÖf}M—@µ?;cÊ‹àV«5ÿ¬Ö ÷uõú;7kêufsýÉ“ÎËL,‘0j›Ì‹ˆhu˜ZVtÒdn3o“»ïúÑ.}`0‘X¥Z=R±ûçÿÑpË%§{:Lk—ìwËn6XˆÕ™y)·ÈIo4Õèú¶m›þ«år¥Ä‹ˆÄB"ëH4YÛ8Ç*î0‰«•™¹M6„åç«×zyËn×îî#0™J­$½ÞxÓØ'7ë¬c5´Ñµ8,l­ùȷɨIoi± &P˲Š/Ù–0®ÉR‘öJ…@¢ Û¶ÿðÆ@/"ŽéÜu‡Ùæ ŸéÇ,B\Ç‘3Ò†§œÃ-‘fáúlJf”`~Åâ'/‚g$#"¯À]yqõk­D‚¨ìýŠñÉÕIZNZËyö6qDg@")-ƒb9?ònŽéØðb•J­$ÎÜbž]Ïdx (¢€³‹ É Íæ ïÒî¸Ù`!"Ù™×èùžLùI¡a–e‰ˆa˜±¡Ý¬~uh°­à´z+# ‹Û–¡î+?YevVïù?Ùþüý²§¡œaïÌxÍâÄk#?,à\_[M½Ñ&Çl ^¼10xcÜFÍ+i 6³á‘ó/ô<ÍŽvé0˺ZÈ”=]ÂOgŒÔЈmHÛÜðd¢é¦®oÛÁ3\-;¥Ï§ÆÞ…´ &"qBaÞ†UžGã4×>ýO§R­bô:}®Éb&RŽ¿ˆe‡‰¼ž®‚%–Yf1³jcÁò¶úšš; Mz}}…¾¾öNÞµ‚ÓÃÜ…繋XHœÇ‘+ÒÓ ÎlóH#+×gӆòxëq…ל½žeÇNÛSNßSÓ²‹³?÷YÞ‡+õ!)-ýêžõ‰†y&§9Xð8'À¼X“$'"ó…Üó-Ý£¯í/Ê­°1ª]Q®îòKˆÈÒp³c˜ˆúš*góž…aóÍ&+‘ì𹂷“¢$6ëÔñKD>b¹˜ˆlƒåË/¿ü²„5ݽÛb²‘—øe™kš QwSÍÜ}Ïf½yéÒ¥¢cWÇ^o5l1™mD$X,cˆ¬ 7GÞ×ÝTi""ÉËb/òb†ˆ¬Öa"ê3Þµpw£˜ˆ,MºDDÝ56…‡ï8ÓÁpìéÒ5ZC÷‹ï""c®Ï“îrs†ûp¸Ò}óXf­•yƹ·Go*ð0çbíN‡Âc ÷QnS2Ä6]ºd"Rn›PC³4¬iôƒ'yYâã³Ìb¦ûÎyÍÉ«FI’æüõÿ]÷Q‚˜È¦¿kæšÎE³Ì3‰X|8#WD¹8¾M¸ò¶Ï²Ëçßã02\:Vo#0dk:Y4á%¨NÒ²‹%qF…»€DRú~%¨±±èÓèÒ‘xRt-Äð܉0?VmÉ˾{ðd“©*󵪧“Å1yÙ\¿OÃGµ+FVo©ØóZ“„Ìfël6ÃK°VHd3íÙ}GhÕ»ºðbV ˆ¬–Ê ç%ooØ–$¯(2Vì9hR ­zÉÆ(3’|hUØ®AZ½é¯ÕÌzc&vPØáÉÁ*smflƒX"d-f+KD¸Ãa¹,AÜTa©:øš^)¶é"aÌá˜Õ£5• ‹­þ`¬NHV+÷pÖG¹+FVo¾°gÇ™Œ–$Qj‰×ZŽ=]Ú54FUøÙ™—G÷¢»rçkÌÆ}ßwwM ÆUOrNƒw‹F~C@w/ä´ 7V{Ì,×>éC0qá«GïEÓ5YÙ)54"KÕÁWš$ŒÕle‰QíYKDË+f‹®¡©¡¡é¦R.fÍ: #ß öØœO'†3ŠÖÎ*oxœVㄲxØê3_Ó=½!C¶ÿ£3rŽãÈi.Ž/W®H[ÍõÙD!mñ²Ö¦½Ö4.É äçòÄåÇj­DÊìsê»s›N^Rö®ÂUZæÆ-œ‰¤´ Bèðô‡Áã¢K'XÌ–ÕáÉѵvއǰáN4€ù²zKÁµO2b”!CD±L—}íZη/ªò Îø(;F&d¬f«0*#C9›ç9ׯeV‰²šÍLXÆa%CdÓß1­Ú%fȪӵنiõ¶ÂO2¢d³®Ig(ã²?*ܶzdc>É‹“‹«ÙʨçîÕ©^Š·?ú(;N)²³ÙJ±2&ãÜ'ïûWàO>Ɉ‘‹Y“ÞhÊÂö~’ìEDäórF^‚\HÄÚYBÆ~îíñ ιV˜¨’0V£ÑÂHTû ÏXëEœ{ºDkhM "’o“?­é¬Vm‘±F?誻&€«#Å}8¸±£U«Q×4¢Á`{³^û¤Á”…ûÈ·©""å6ÕĤ$1;QF++”Ee|”?òq]^1ãórÞ¹ì8¥˜ÌzÎhÊ¢ŸËÛ¸Šsº«ÝìòÆÚÄ,|Íú”Åbc9#gDq_Î&\‘¶¼>›ßDzZÍ–¯«ŽUYˆÄ ‡£7ìß%!²Ö»Ô1ì*-»}9 î€DRZê!d›Ñ0˜ˆˆÄ1‰Qb«ÙÂ]ó?<†Åç¹Ç£Æûúë¯W®\¹bŊŲA}†£•ÊU#ïj¿¹û•“&aÜ'Ÿ9{‰Ìăw¼QaQæÕß8R~î8ÿÚž*«äðg¿Vã"`Á!-Àß}÷Ý£G^xá…ù_5çXôlú ¹—Ì$KLÚ°ª£ò’‰HµE‚ À\l+¿p©²ÞBŒJ­òAѽµIç ©èR¥®¢¨‰¡,,qÿá] ÔÐæ„Ít³ÞhÊcgl@ 8áqN€ÉÝãœ@D ú8'~XÀ ÑÜ@ À ÑÜ@ À ÑÜ@ À ÑÜ@ ÀçÑsÈb± Ü‹ÅKkƒq'€¸ `.‰ž{°üàN47PDpE47PDpE47PDpE47PDpE47PDpE47žGÌ«žº½š®¬â}2flJÛ岊}ç7äû“PuVr´ŒO¶æœŸwLlÉ ÕhO(˜ ÓØ®ú²’ËÍ6¾4,1=+2€™ºFOæáÚ6€g‰m/Ùžo?QvT‰›Î2ûŒ11Kxš©\,–k3¬>UNak&캒œôŠC™IoݩҜãüÒ*þôçáÚ6X®82ëŒ1%Kx–©\$"®Íð¬9Û¥Õ×ûÆgiB„=–¼'*)ö÷(¿±÷/çTùÆ¿Ÿ"è¼ýaYîQ~Iq¨ŸóÞêª;®ítˆ”sЖÈúÐÎIÉÚ,é&Æ7ˆA!„B‹=„f¹ö ¡ÙŒ0—„~]e£-4óJ²ßÄŠhËkºšžr£—ˆÈwü¨¨¹ªSôzñ¡¸" ÊJ5l/¨lêWÅø­S= õÔVvŠ“ c&ŽìúŠ{ŽÐœC Á|¢À÷ )GªuVU¤pºópm,W\™‡áÊY“Lå"q&@š ºêê{ßÉOŠò#RHßÑ7¹m°Fû{’ßl†ÊªÞÀ¬ü¤0?¢  ½†7¯7šC_‘8묪’ëVoNÚ ˜{Hì‡B!„–LÍjí B³a. ËÊÅ|œÔa^áhóƒ‘Äk>-..I\3a`ʼn•a¢Ñ?þBbmŽ -m:­Öµyòwãl—ÞDÒ¨ ‘±# •ò:[Íì´çáÚ6XŠØö³ÛS¯6}y9551R²÷tÉ>H÷oÏL‰V«#ÕoþâôÆÑé¬ùË’Ô”ÄHµ::5ïb[?ÇÄžŠ4õÏË»ˆˆØûSÔ‘©åæÑkƒ”È´: õ·]ÌKýGµ:òÍ´£åmÖÑë–æÔÄÌz×ÇÓÞüEy׸ÍHÜžy¶¾ËŽC¶0q‘y¸3†û,Á•©\$"O Ë<Æ—¯•]> |b¬g¹×ö°Ë! ”Œµ+¥¼‡z³ˆÈR—©ÎÓ-È\W¢uÄgÅŠæ¤-±¦!žØŸB!„–PÍní B³a.ýµ™‡J:þTº/ú´åä< g£"{{ÕéÌí‰êHuJjÉ-‹¸‡;Ñæ«Šæç/ñ#ÛÄ/³.©¸àÉ_v]uã7ÞJùø/9ÙûZƒ,9eê{ÊØ.;O$ûb’ñõgV;3½y¸¶ –ê•Iïã!ûR4ûÈPQ¦M=íû›c¡B¶ý¢¦L¯H~?9P`7T•T¼w]ù›]ëè~ùÑR$1ý¬‚g¹­ý °TU–«ì™:1S¥ô-Ó·[“„öýŒý$ñ0ê~¤” ÙöÔ‹â³4ë…—K öÚó³/ˆ!"G—¶¤Z¾9ù-•ˆúuÇsËŒŠÄ÷5 ¦³úÃÒV;/‡lÒGæa;93†›,Á©\$"÷ Ð]óGFÛZïë´÷~¼U!ö0÷z34Ðk}r%ÙÓë Öb'â“@ýêVÞèrzêN]w$ÄJ sÒ–æ[­ÙžßÑϽªÎJŽ”0!„BhQ‡û‘’˵/HÍf„¹øÅ–°iéõñ%W"ýˆmÿÐÙ ‡yº¯NF;*~Om¾FË‹ÍÒ¤ íÆª²²ÔBþorC…%ŠhK€ý~ýåÂ™‰òq£›¾¢–"Š•Nî³gâ󟾶ƒçÍÙ¦?,;ÞQéé †(HîÛûóÜë =¡ ¾|ÕŽÔ¸ˆH9Ÿˆ¤LsuzïÑÀC+/è­•ÒH ^ß+æ9ÈUrþí{&{¤²³Õ" yÉnhzÈÆ0 ½ÞÊÐÖPXo—gNŠò#¢u'ØŽW˪ÉG•DDAlîû±þDd©+oåE”d¾"g­GG IDATˆéïw:Ԉ㵈2u¦ÃE¦ò(q$@š³í§Rr7D´fkIt€‡û-TÆ¿DÅËÛN')˜ÎÆSÚN¢Ñ›DŠØ·£¯UÅ×mñ ŒÕ07mi ËJâ…¾“›,hÖ–”¦ð9_À„B!„GÍrí B3a.Aƒœ§'£ö~µ¶Kñ~i’ŠODë²Ò»~ž[§ïZ](¢,cVCùñÓÕ$ùëšü}Šñ§îž†Jƒ0–ã‹Mìö§C@Ç;ù3æeG&=ÈŒ4DÆkÔõ² þQ›yF×UÆ}»^g¢""&(>N¤ù§})/†„„…†F…(Ä ‘Ó‰ÒP9•5tÙ…ú.2%®WY×e㵚)(1€±ÞêrˆbåcÁ+ ù‘£Ñ4@J>ùŽ}÷ÍZ ½¼ ä±›&Yˆ”‡"ÚbÊ<3Í“3•M—·½Ðè "ï³eGe.;u3¦Õœé[…Å ]†*mYúiéoŽEzt_èû™íG ^¿AD¢Ð­JþoÂ,–[ÅZ{tqì”_4žMÛ€Ø+ÚXdrÐ ÞÃí…• ýª8?„B!´xCÈÝOH»­-TÍf„¹ô0Î9OÿÝÙÀÆÚÙÑ?ÔùËdõ¸E¦!B PDXÜ#ÈæÓ¿(nD¤š:ù‰ŒžÖªNQ\ˆówU0¾|G—Õ1: dí,O4éíªžÌËÚÈ'êo;•[ÐÀSÆD¬KŽ»¡9>òº¾â­så †Ö&®A«)»òOÅG£üœN Œ °W:F»$1HÙ`½Ýaòm·IwÈø.oàñ„ *·K#óÌ0cLÉTeúÿ,qñøB†ˆ{±N7ÃÃælÏ}“Ã_ÀøÈüÞa MšÛz{d”g)N¼ëJE’­ÇÎøû±mùÛ×LÜSÖ¢ï´?ìHIª›Rý¦º.T£=¡`fÓV0nNT)¦:Ë‘B!„ZÄ!4͵{èY†Ð¬F˜K× ç g£¥ƒÈwóšxÉÓú#O°\ºPDX¦ìºS%zIâéâWÖM¤YZoýß5a§s&@)£æ†v{T0Ÿˆ5ßkwH“' ’<™–ΦN6LÁÛÙlrø&ø36cåïì%e‡ä ±z;;òò\k[¹¶S¹ï•ÐEhBR쇇r+ŒýJïS'F…ú)#DÞºU;àÀøÊ…ÚÛµ½âØ@!# àõêŒý±b?""k{ë7¼™/Ñ„w3b…Èqýž™ Ù Sk§ƒqÀOæ™YÆp’©?ñø?¹Ë•=knm->T­,+Ù5r'˱Äó4½õ7¨mÚ·KéÏÙõ·Û)èÐÄ;2yJá§Ic—²· yOñ«œxy3›¶VÝéôêÀ÷5¯ŒÌoë2XÈWæB!„wMwí B³a.9\ƒœ'œŽv¤Rþ@§ÕÛäçJÙöò÷ª}ßJ`œ (¢,Þ³¾¡®Õðº¯N×;:‰ç+W "ê76?ä)&>Wb××]oâEï‹`øÊäþ‘2mCz¼¤·îx#E樄3˜‡a¹ú]q±,5^îè¨(»m“§Ç3 âµ7èï ó½òS­CŽÀ.+«PW}E£ŸšÈXõuM¾*Ÿ±;™HDB¹R ½ñ'ßÍr_b|U2ºñåCÑë "(â£øšSÅåLÒzaoãŲŽÅž–3“Šh$^ÿRyéÑÂ5YjÓQ÷aãŽÖâÊ<œÃÕ… ³L5Çb]&@÷ÍIýc­ö”VúV„”ÐW”é™õ9Jï´å‹ÈXü^1óN¼’i¯>ÕÊ;­ŒuŽVÇ‹KŠ–øHüž\Øóˆç+Y $"šE[iˆ°³ô½þ;±Ì€¾¢¤U°9?Ì!„B-îšåÚ"„„Óa.aŒ¯óAÎ“ß aœŽv‚âפ )¡äÍâ¡Ö mµ)$_Œa1 ˆ°˜Y»z‰zÿ¥¸pÜ4é‘Ë…q û°¡“$“_„a7ݺñ9_‘À_™¢ùeYÉEMº/ K-È æÏhX^xÊ#j~minÉ€÷C’‹… ‰H‘œµ¹ðãŸóD/F$ÈäŸ*.{ï¶âJlʉøÒµ‡Äó ŒJÕ¼Ä0äd"1*¥÷/¥!b†ˆÖDI©¹K&Ÿ*²ò3%ÚS¹ÕvoÑK±9¥IN¾ú&¿ÈÓùŽS¥•Çs+ÒõÉ™‰UÅ8b‹)ópe nÎ3Õ”ëWg‹u•=hN±Å™§*+Þîux‹^ M/MöôõêLÐ[šT¶Xû+MµŸ4$.'ßXÀÚ:o}~ÃW•-ymý#OÒ‡%•Çs{íÞkB¢s®$1!„Bh±‡Ð,×¾!DÓa.å"× gýè ‚`§›€D†J/_,h´ó|_ŒH/N¨ÜzîñãÇè€ñ¾þúë•+W®X±bm¿ûæt , ¶ýìö|Ç ÷oAX`+~ô£™\s}÷Ý£G^xá…ùßà¿Â1p E47ðN4€åƒ :òÛOÑ sw¢¸"€(¢¸"€(¢¸"€(¢¸"€(¢¸ñ<º`õ>~ŒNpK¼Ô6E4€¹$zî9tÀòƒÇ9Ü@ À ÑÜ@ À ÑÜ@ À ÑÜ@ À ÑÜ@ À ÑÜx]0¯zêöjº²Š÷ɘ±)ým—Ë*ôßïOBÕYÉÑ2>Ùšs~VÜ1±%/T£=¡`&Lc»êËJ.7wØøÒ°Äô¬Èfê=™‡kÛž%¶½d{¾ýDÙQ%Bnþ9Ë<î3ÆÄ,ái¦r±X®Íð¬9ÛÓ|±¸¼¾£×á½&$:9+)X8­Ü[ª­Õ?d}¥aêÔ¬èu.ÂÐ\—¹·Ny¥4I2û¶î¦#„B¡ÅB³\û‚„ç®õë¿(»|CÿÕï'ë“Þ?-Yšga«®$½¸Ñ¢ù×# ç{Ðß¼÷Ðõ¨âs‰þ8ëÜÁhóÈ~¿¶ìúŸ†TUÿÒ)MÌÌ/ÉŒëËÒKt6"<僜œ'ÿûU²œÏ [3i„`וä| óMÌÔœP‹ô¥9Çuö©«ô`®m€åÊyæq“1¦d Ï2•‹Årm†gÍÙ.­¦¸žB³4ùg“–ê‚÷nõxšßØû—s ªìª¬üüÓj©©,÷hs?gouÕ×v:椭Ûé!„Bh1†Ð,×¾ !ĵk¬ù Í‘ÊyrîÙôh¡¾,]ÛÎ.Éê×U6ÚB3¯ìSà›8˜O¸ `~°¦«é)7z‰ˆ|ÇŠš«:E¯Š ¢ ¬TÃö‚ʦ~UŒß:•ßÓaPme§8©0ÆoÒ€L_qÏšs(!˜Oø¾!åHµÎªŠNw®m€åŠ+ó0\ƒ#Kx’©\$"ÎèQsAW]}oà;ùIQ~D é;úæ#· ÖhOò›ÍPYÕ˜•ŸæGt¢×ðæõFsè+Îîèéª*¹nñ椭»é!„BhQ†Ð¬Ö¾@!ĵkümuïK‡4o…ú)dÞGowZ(h ÞÏè°±<¡+V4'm]OG!„B‹3„f·ö… !înÖI㔣¥>Að¡Ò£ÑK°‚Ö_›y¨ä¡ãO¥û¢OXÎAÎÓp6Ú!²·WÎÜž¨ŽT§¤–Ü2±€"À¢©¢ùùK$þ¾/cÖ%ì“Þ†n×U7~ã$ÿ%'{¿Bk%múž2v ËÎ Ǿ˜d|ýG¯Õ>íy¸¶ –ê•IïãQÉš³™[…ÚÔÓÍV"bÛ/jÊô¢ø÷5ùg3ã%†Š÷®ßg‰ØûåGKu‚­égósÞQ |^Xª³;è«Rú~£o·‘½C?@Ôk0öÑ€Q?ð#¥\ȶx´ ÖúŽæôÙ}J[]ÁÞËc‡8º´%Õ‘üV„ˆúuÇsËt¾[ß×h²"¥­v„¸{xMˆÄQ©ëbUë"²u,ä+ó^Úç4®AÎNG;aR) Óêí?ò«l{ù{Õ¾o¥Ç 0NÑïYßP×êxÝ¿W§ëÄó•+‚„ õ›òƒŸ+±ëë®7ñ¢÷E0|erÿH™¶!=^Ò[w¼‘"sF^i1Íyp–›¡ßËRãåŽŽŠ²Û6yzL1"þP{ƒþ¾01ß+?Õ:äì²² uÕW4Úø© ŒU_×4à«ñ»“‰D$”+ÚòÝ,÷%ÆW%£_>½®ð'"">Н9U\Î$­ö6^,ëøQìi93©ˆFâõñ/•—-\“¥V0u6àh-®ÌÙ1\]:ËTq,Öetßœ”Ñ?ÖjOi¥oEH™}E™žYŸ£ôðN[¾ˆŒÅï3ïÄ+™öêS­ü¸ÓJÁXçhu¼¸¤h‰_€ÄïÉ…=x¾’uB"¢Y´e¸–‰B!„qÍrí BB®]óSí Ñþ²°D’+s´%­‚MØ€‘ñu>Èyò;!ŒÓÑNP|âšô4%”¼Y<ÔZ¡­6…ä‹1,Ñ3kW/Qᅫ›&=r¹0Ž!b6t’dò‹0ì¦[7>ç+’£â+S4¿,+¹¨I·ñ¥a©YÁüÍË OyDͯ-Í-ðþqHrñ¡P!)’³6~Xxôsžèň¤™üSÅeïÝV\‰M9_ú¡¶àƒx¾Q©šw‚†œL$"&@¥ô¾ñ¥4DÌÑš()5w)ÂF aYù™‚í©Üj»·è¥ØœÒ$'7W’_äé|Ç©ÒÊã¹éúäÌĪâ±Å”y¸27ç™jÊõ«³ÅºJ€4§€ØâÌS••Go÷:¼E/…¦—& <½ä zK“Êk¥©ö“†Äåäï X[ç­Ïoøª’¢%Ï¢-B!„Z’!4˵/@w«Ò ~YV¢-Ìý†D/mÎ,MR,õ¡ Ã5ÈY?:ƒ ØéÀ& Q£¡ÒË í<ß#Ò‹“ƒ0*·ž{üø1z`¼¯¿þzåÊ•+V¬˜AÛï¾ù ˆm?»=ßqÂý[ØŠýh&×\ß}÷èÑ£^xaþ7ø¯pÌ\C À ¼ `ù`‚ŽüöStÀÜÃhn ˆàŠhn ˆàŠhn ˆàŠhn ˆàŠhn<.˜C½£Ü/µ F `.‰ž{°üàqN7PDpE47PDpE47PDpE47PDpE47PDpE47žGÌ«žº½š®¬â}2flJÛ岊}ç7äû“PuVr´ŒO¶æœŸwLlÉ ÕhO(˜ ÓØ®ú²’ËÍ6¾4,1=+2€™ºFOæáÚ6€g‰m/Ùžo?QvT‰›Î2ûŒ11Kxš©\,–k3éýCÑfÚÂÃs¨“r*žœþfB\‘?›Ó·ç§ud¡9ÌB³\û‚d!®]¶·W•”h[Úy¢—6'gíR‰—fYu%éÅÖÍ¿áÈ¡ýÍ{]*>—è³>Ì܉0ì÷kË®ÿÉ1aHUUPð/ÒÄÌü’Ìx±¾,½Dg#ÈS>ÈÉyò¿_%Ëù¼À°5“Fv]IÎ:ßÄLÍ µH_šs\gŸºJæáÚ6X®œg7cJ–ð,S¹X,×fxÖœíÒjŠë)4K“6Ya©.xïV§ù½9· Ê®ÊÊÏ?­–šÊr6÷söVWÝqm§czmg“Û—òI³sXóš#•òäܳéÑB}Yº¶îðø:µ”à*T<9ýÍ0„¸"6§oOëÈBs™…f¹öÉB\»ÜßP¬)éR¼¥É?{Hi»Qxô‹®¥BýºÊF[hæ•} |ó w¢ÌÖt5=åF/‘ïøQQsU§èõâCqD”•jØ^PÙÔ¯Šñ[§ò{:Ь­ì'ÆøMé+î9Bs%ó‰ß7¤©ÖYU‘ÂéÎõm°\qe†+cpd O2•‹DÄ™=j.誫ï |'?)ÊH!}Gß|ä¶ÁíïI~³*«z³ò“Âüˆ‚‚NôÞ¼Þh}E⬳ªJ®[E¼éµMn_Ê'5ÎÎa;´Õ½/Ò¼êG¤y½Ýi¡ ¡§bºçÐI54®Pñäô7‹âŠüÙœ¾=:­# ÍušÕÚ( qír¿¾BÏû‡üä˜ †HšehMiÔY^ye ތ氱<¡+V4­¶³ÉíKú¤ÆÕ9lW³~H§­.‚•–¸ì̹:‡¹ON3!ÎÈç>5Ϧ-²Ð³ËB³[ûe!®žt8Xb£9†áóxŒï¼“«¿6óPÉCÇŸJ÷EŸ6°œƒœ§!àl´Cdo¯:¹=Q©NI-¹eb À-܉0_~þ?²ùOø¾ŒY—T\ðä/»®ºño¥|ü—œìý ­A–œ2õE-ì@—'Ž}1Éøú3ŽN«ˆ™Þ<\ÛKµ>Ò{ãxEȾÍ>2T”iSOûþæX¨m¿¨)Óÿ?öî?*ªûNüÿ«Õ¹lœ±¡QÚ‘¤ç“™Ïn†“÷#è*þ8&ì"¦6´ä‡¿0FƒQéê `$&¨Ach Ý|a“@?U·j>÷ø£Gh޳ç,ô¡•°%ˆ#-3î‡;õ“ï€ÎeðàóqzrÊå¾ï÷}ùš×¼¸sÇ–¹=3Êài¬.©üÉGöž¾_.TlÞ_oNÏ~Ë¦ëø¤üõ¢ýq¥¹öÎæÄÙƒKç]FO³³[D›.‹9¤»ÉÙ}ŸÝjTÏ¿¹¹ 6,e‹cž±ûÄ»%Ïyò?X­ˆˆ·½¼äuiæóqar¹þÕÜÒ&[úv‡Mi=ôæþ.–KvÒ‘FæQ[53†Ÿ,¡©FHDþ ¿á¯½Ø?Öu¡¾üL÷wµ™̽3éîr]{GÚÙåµÃ#¢Cä²ï?ªëßNgÍμéIæÆ£;žÜ>¹_Ô4&Gíj¿¬Ó»O¼õÜ¡†ß{ôß‹MÛ²z™E?ÒdÞœ×ÐÕ´B%—¿1‡VèŽðÒ<ž±d¡[—…ü‡Êˆ{¿#YH3TÂíÉQååU§“³™ºOW:#VgÅO¾;%$¹¨Dݘ]›RòÓE!¢žÓW‘£\¿>>ª8}ç‘|G¹.i‹#Ëèiª.-Í*Ò;g4Ñà.ä¹PûnÑëgÔE9éÖA˜ÛYyDÛ}|ÚGõzE¯7\ûY7Cq~L93³³SmŠH´5¸ë‡¹ÕuƧëãÏJ^¸Èª‘Håô¡ì®+""Ý_¸tÑÏ/Œ³‡ˆDF˜æu™t>*Æ8«þ“3-žEöÖ†Ž°Ø‡<§¾P—+­u]3ìñjcQ­ÇºeWFbˆˆÜÿšÚüýÒCM™›í""^CRhT“° IDATîö¤p騩hÐ-,ÉYiUDlÙÛÛׯ?Áõš@™Ç5ÖŒ1B¦ (i$À€†«çw®Êýõ‘Ù–,‹ð¼ö”‡¤øíŠs»2lJë‰å­"ý7‰lIÏÛúß¼VäN)HP\£;öÜ>©iMŽê½"Þ¦·ŽÍ{1+×ìm­.-Í* þ`sÜ“yS^C‡FÒXBe£6{ÿ3ö‹ˆÌ°š½ÞÉ×…N£È¹ÆWµ£^8TÞnÛ¾?#N/"÷oÉnÿanór|âTKÌ ‰SŽ«±âÕ]‡þC¬O8òWÛ¿twÖU5“4þ°©Ó‰Çs½ô^Qo(‚YSNdBdÿEV"c-ºõ]jjxDâR]Sã§ÕMÍÎóÎú¦++"¢D§$‡9þiõªccâãcm&EÄçÂÈx«”Öµ{ŒÎvƒ}Ur—óÝúv·®¡M¢Ó#×±voX’u xѱ÷yO´t‹]/"ÁÖW;»tљ棳ÄFêh¢M¤Ì3ÖŒ1êxµïq!zÛó{*RNÕ×ו;Jßý§â͉!>F%Fx*[›š<æôh{W„ë“æ–àóîÈÇ-úoÐéŒ ÛÉ‘yƘ1nÈT{ö¿”xEDtz£"¢½YŸ‡àpµóB‹7Ü¡7„GXÂ#^RO9>qz%–âŒ1Oÿ´2ÃÝéQÂCÔsù˜=ôLÕg«ç‹æU‡–úqZM¼£ü5›âoì¸rûdçsr”à`No¿öä©›Ij:®ˆ„ø^x Œ2’‡ g¨Œ5„4ÿAçå{*½¬O¦,4ʽߤWÒšI׉ªOeaÉú$«""÷[rÚë77Ôw‰=b2ç­"ç_ÕŽÝ+¼ôuGŠùzÿQg˜š‰7_,w”§~g‰Óœ¾ë_Ößð.K¤£áØÍ^˜ ñr®DØ-ÒZw¾¯LPÛΜ÷FÆÛH ë`Êi=ÕÚÿh\µõt‹7Ø®¸›ª~íYX\”ûÒÊEq÷‡)µo ×¹Š7Ùl°Å§>ýâþ’üT*›.û\(b_ÖqâØ‘Îð„½!Êjlÿäȉ.ÓÂ(£ˆ12B×Uß4ð ^×ù†/u–á•QL¶0ïù3ÏÀV[Z½\®‰”yÆ–1|d*%Än 7…è•6«•îj(^ïøèÚs UõŠ*º@ÓÛåÓo¾Uæô(†ðEÚ6ôó&gÍG§tËV/‹PôöÌ…úKËë²SÌ]5¯žEÛâŒcX‡Ë0Õ\ùuq±%+Åêm®,ýÄmÍ^!Jw˜þÊù:çc”Òv¦bgÃoT»Kµ¤½¶ò„[Ÿ•¥¸œ5§ºƒãÂôŠÇÇB1Zí†ò£¿^j %8Î"G?ý"ì [¸ˆl)‰zÇÎâ %cž±ëÄÛ¥Í÷%í²*"C›d¦y)Uìß\4{KšMi®yóD7WkbeÍŒ1ÒA_™j(ÍŽ˜ýû²ï–—ï,|~a¤Òí¬,u*ó¶Ù¼%G&MÅ?)V^J±+çílÐ'ï²&§¼^—œ±Ìa¹övT'º`óýFÿc£ÎíS…ÖĆĭŽ-¥¨Ä¼*Éâm,/i0,t$„ˆ¨š“9î×ÐA™g<¡2žÒ ]íhãKº…Yhœ{¿YH3„bS*ßÿjIäKIVƒ§¹ºô56g²÷ô•`ßEε¯šQ|V;Ñ)é³³_w”HæRÓ•†ÊòC-±ù&ÊbÐD€‰ÌÕÞ%Òõ¯ÅEƒ–E¾ønQ²"¢~Q×*æáÂð´;ú ½-sY„"zû*Ç+¥%o;²ÝúÈ„¬‚-1ú1­ƒ©Eg1MdnI÷ŒïÆf¯7Šˆ-sËÒ¢7‹6ÿBöàÂŒ×rô;‹Kò‰í§I«^KÙÿfyÁz¯è‚£³/E+ŠøX("JDœ}ÆÑO#cMŠˆÌNŒ”Óí¶„¾Ïg)¶-ù9†’ò¹‡<3ÂJÚ¶?ã~¡²hW¾wçþªWs+ ‘ó2sÒ«‹›¹b)óhe m¾3Õ ï_}mv¤Àp‰H*ÎéÞYUµù“.‡â³÷gÆÚQ¢Ÿwd©Ååÿì8›¼-õ@Àº[ýâhp\Æ2ó8ÆÊ¨sûT¡99ú¸ì‚WJKÊ‹r¿”°‡–æìϰ)#Næx_CO¨Œ+„´þAiþCÏX²Ð­ÌBãÜûÈBš!²èµ|ïÛ¥U?É-÷êÂ\˜µ?3n²÷ô­"g^ÿ †Ÿ…MDºÃ!ûß}»à„GüàÂìâÌhªbøõ¯¿þšY€ÁþøÇ?Þ{ï½Ó¦MÃØ«_~ÉâRÏ¿õX¾÷5ÿOAî°i÷Ý7–÷\W¯þéOúÎw¾sû˜g¢~ÐDüà™hLJô‹¿ú9ÓÜ|܉øA ðƒ&àM4Àšh€4Ñ?h¢~ÐDü ‰ø1)€›¨ë믙ðË4Ù˜&ÜÔ—“‰I€©‡s~ÐDü ‰øA ðƒ&àM4Àšh€Ó™€Ií/ùËW_}õç?ÿùêÕ«·bûÓ¦MûÖ·¾õío{úô»·•D `óz½.\˜={öœ9s¦M›v+vqõêÕK—.ýáxàîÚ>ç˜Ä.]º4{öìððð[ÔA‘iÓ¦…‡‡‡‡‡õÕWwí<ÓD˜Ä._¾zvtß}÷]¾|ù®gšhp{]¬zæñ7š{-¹tömÏ<¾dÁ‚%)Ïnîé9¾vÁpK¶ë¾µÞÏ?.X›²dÁ’”gÞës¬£ul¸›ô6<ú¨(ÃÔä+óøÏC³D ™j„ÍjF`Ã{/cíãK,Xðè“/¿söÒhsïËO>º`Á’”g‡ýd¾Ï«žYòø;Ÿj¬Ö©xÊ„!DM¨çÞïHù«‡os’é9w¸bäÂö.tëîA»ý{™°h¢Àí|¹o>¼»¬EZRåäT¶X2òÈÏ0ÕïÞXx²Gd¦}SÑ ùìÅ:ß4lsg מ2fäïÉÚä,\—wòÆÒ/u´Ž ÀTå;óøÉ7d‰À2Õ›Õ:ŒÀ†÷~^¶1¯V·î9°gƒ½£2'÷ðÅ@ó[oó;ërªÝ [(zÚÒ²{]ÎñK#¼yÍÛ7ht@cµN-ÀS&„!BhB…Ð8÷~GBÈ_8l›“ëlEÙa*WÜv|±Ü½Í{Ÿz¶ºCDÄ8¸‚©«j1¥¿¿műmÝzneNÙ©Kó š{ýv싇ËZLkÞ{dØ Ú=õujBÑÖ´¹3E¬;έÜXqêÒü¡k²ŽÖ±˜ª´2¢•14²D ™j„D¤™nh«ªí°n:°vq¨ˆX6­ÛxØyiŬ@ò[³¬ºÃºõÀÚù¡"6[þEçSeµŸ/ΘãóÍka™Ë¤Œn¬Ö©¹;eBˆ"„&Tkïw(„üT€Ã· @܉·G9cÏûï¿`yHa¥ö˜¬qóMý?Î4™¢º‡þQ­çä¾2wòÖäY˲¶³-bYlÙ·}Ëb‹Òr²­wÔëh&«‹'÷¾ðø£ ,IY[pís—Îö-ö‘¥žæÃŽgú?êQÛævUÛžIY²`Á‚”µ‡ùy´3†ÿ,¡•©FHD$Àó˜Áš¸Øjè_Í`TDUÕÀr¯»­M5YÍcMs-JÛÙ¶þû|ž\°à…³½ƒÞhª[ÓL£«9Ã2!DB*„Æ·÷;B#V€7ns²ù¼âñ§*;Ô¦¼¤G {{ޝ]òÌÇç>v<ùè“ï|.?¹ä™ÃµÎ¥ÃÏ\ÿ‰òãÆhp»ºh¡³æ„JO‹aȨµ{ß¹^€­¨í0ÄYÿ‘³·¹bŸÓ²aSÔ P]mnÅdø#¢b4)j‹Ë-4ºu´Ž “³;񿮼ÜS– ;Ø•–мÂu…Æö¶7žÍ©5¥oݳØèúø`aγî¾l ºt2oÝî&ûš{ìJKÅîÂSn%¡¯w8gc™’ºuÏV£ÛYµ{÷º\Ço,ez§L:ÒÈ+°Ü«qu¸®½#íèPEíp‹ÌƒeEjªÒÿÎòbUa™šq ÕìüxTcµN-hV@§LB„Є !ÿ•Òˆ{¿#!4Rèk›“ÍœŒ÷ßïyêYçšßY*=¢¶•VXWlØ0Bgò4Ñ`Êèiþxwnaš˜¿Æ6¨ë©?xD–ï‰óñú®ªª †!%•¸G¿¦TÕ¬Uòw¤Í)bÛ´ãó¼ªw³¬Ömßšß÷‘¥¨|µiå ¦ºƒõÊòù¶ ‘˜;>ÿÁºÚþ÷emö®;SD¢,;>ÿÁº*ç¥Å”™S>ó\kÆ!S”ˆ4`@Ã{ V®«u‹˜S$Ï ð¼Cã2ì’·ïàYó»ÒR[¸¯E¤ÿ&‘™1i/Ä ¼yÍ+sgHärŽv¬¿Sñ” !BˆšP!4νߑÒžIßÛœ|ú/ÓµO¤ª†´"GÚ,gRÞঠ‰wÞ¥sïäåV:Åž¾gÇÚ˜Á¯äëÊœÆ4ߨTEÜîë% êV•¯ƒ)¤·ã\›jZc™9PK¿ðFŒÈçmª)Í:Y¡Öù&õãW¯œëP¬ž€d™oQjEDÜ-M.wKNÒ‚A[65»…*sÊgž±fŒá™ªçä +sªˆöü²À2âfo<ŒQ — ˆ÷ÞOksVíÛ½17êý=*tñŽüƜܜT‹ˆ)!5ÎPí2 =Õ‹‡óÊÜÉ{Rç~ìȹ];çB„!4C(&ht{— BZ3©¹ÍIÏh·û¹'“ò4Ñ`J¼=¾í©¼S†å;Þß´xxEsñTU‹iEÂ,Ÿ£Ù ¶¹Ôþ¿Å©n—ª˜L†Q¯ƒ)Eí+œÇ½crÑž óõ )†YLîÔϵs>!DB3„F½÷ B§¬½Í)æz笧í\‡PÞܨõ»½÷Óßþö·¿ýí§{£?Û÷«VÊ£€p'ÜÑÒYU¯šÓMõ'û_àE1Zí¶Ð ¹Ôt¼Í`vozϹª²“ÊŠ5+æÍŒ{z¹aãî}Çwd˜;ªòj%±(!t ëp¦Ð¸5‰²1/϶5î´UÖ¹­{̡֌DÃÆÂ¼w”5‹ïÛÝdJ}Ï$A‰öƒ…9¹s¶>mWšªv×ö?¤8È–‘a~ªpclXarŸ¬ØWÙ’pÀD Ü ™G3cŒôFÐW¦Jc³#&@ÿÃ%n…yß¾Â}Q±(®úŠÝõJb‘=°{ˆÄ`g^nž²)c®ÒTQxÊü^ÜÌaI6tΜ“Wæ(¢ÍQ} ü5jœšà)B„!4¡Bhœ{¿!4Gk&5·9ùÌÕÝÑv©ÇzÃÜš”¶ª²-Vq–ívªb¢¼Ð{fCü ¿øé…E{í7ÿžú·o‹ˆü¯½§÷ͣ꣉“«­C¤£2/wÐ2˦_þlEHoÛñ1§ ûû«»åpuµ!æés‚df̦=[wîÛø”Û`IØz`ëÜ™cZSÈ̘­vì.Ü—»nŸj°$nÚ³)f¦H̶ù†Â}…ë*Ý“=µèÀÚ¨  }¤è€ZXX–·î Á’øtþšª¼F™“±gîÞ—SëVŒÖå;öl°'wGæÑÊ#”ã>3Õ qék³#%À†Ëœ´=ù— ËÊrŽt¨“=qÇ sl€HmÞ­jÞ¾¼•FKBòÀ¿‰ähœ»fÅœqŒS³zÊ„!DM¨çÞï@Í‘ÑÏä$c²'Z+®[wñ½÷× »Ús7m]ž»»pc­ÁœðôÖMîÜ ¡¼žyûNï]ÿÂg¾ý04¿¾ñõ×_3 0ØÿøÇ{ï½wÚ´iL€‰ïw¿ûÝÃ?ì½Þ3kâ_øLþçG2ËSË3«þ›üòÊÃ{O ¤‰öÙgŸ=øàƒwðd¯^½ú§?ýé;ßùÎíß5ÏD¸{)Ф ú/Sšh€4Ñ?h¢~ÐD¸{ôªªÚ«ú/S˜éLÀ]ã?_N~YDÿàN4€»@Pôÿ0ËçofýÃÿš/éô‡;Ñîß^èø·ß:˜‡1âN4Àšh€4Ñ?h¢~ÐDü ‰øA `›6mÚÕ«WoÃŽTUUå®gšh“˜Á`øòË/oÃŽ¾úê«{î¹ç®gšh“XxxxggçÅ‹UU½E»PUõâÅ‹áááwí¼»¬EZÂääT¶X2òÈÏ0ÕïÞXx²Gd¦}SÑ ùìÅ:ß4lsg מ2fäïÉÚä,\—wòÆÒ/u´Ž ÀTå;óøÉ7d‰À2Õ›Õ:ŒÀ†÷~^¶1¯V·î9°gƒ½£2'÷ðÅ@ó[oó;ërªÝ [(zÚÒ²{]ÎñK#¼yÍÛ7htàcǹ_Bˆ"„&Jsïw$„F7““ëlEÙa*WÜv< nÞæ½O=[Ý!"b\ÕUµ˜Òßß¶bŽˆØ¶n=·2§ìÔ¥ù„Fͽ~;öÅÃe-¦5ï=2ìížúŠ:5¡hkÚÜ™"ÖçVn¬8uiþеYGëØLUZ™GÑÊY"L5B"ÒL€ 7´UÕvX7X»8TD,›ÎÖm<ì¼´bV ù­ÇYVÝaÝz`íüP›-ÿ¢ó©²ÚÏgÌñùæµ°ÌeRF9vüû%„!Bh„иö~‡B¨g”3 0܉·G9cÏûï¿`yHa¥ö˜¬qóMý?Î4™¢º‡þQ­çä¾2wòÖäY˲¶³-bYlÙ·}Ëb‹Òr²­wÔëh&£ÞFGÊã{O~Ü÷ù¤”g¶U]ûdJOóaÇ3)K,X°àÑ'·U4ö/ø°Ç‚Kaoÿ‡™n\x±âÉýŸ#émÞ›²`ÈOV]‘Kg÷¾ðø£Ã>Õs|í’g>>÷±ãÉGŸ|çóA‡±$åGm››KvgâD#óhg ÿYB+SˆI€#æ1ƒ5q±ÕпšÁ¨ˆ—ø>rw[›j²šÆšæZ”¶³m=""«ž\°à…³½ƒÞ¼ª[ÓL£;êýB„!4aCh|{¿3!4ž™œ >¯xü©Êµ)/éÑ‚ÆÞaÅÆÅÃO.yæðÀÍy—?sý§žÆªm}ÅPÊÚ‚Ã<ÃcÀhp»ºh¡³æ„JO‹aȨµ{ß¹^€­¨í0ÄYÿa°·¹bŸÓ²aSÔ P]mnÅdøÃ¤b4)j‹Ë-4ºu´Ž “”ÚQw0aͦ=kÄY±{ߺ\ã‡{‡ö6îÛ¸Ûiß°cƒÕàvVÌ-‹ûð…(i>˜SxʼfÇ»Òqx_anáÜ_¾aï¸qa~\œñ`}Ó¥µsBÝMN—ˆ8›.ÉœPWS½Ëg7ö6¾ñlN­)}ëžÅF×Ç sžuøðe[ˆ¨me…Ö6$˜äÒɼu»›ìkvì±+-» O¹•.ÙHG™GmÑÌ~²„v¦!ùO€þ†8úÇ^j>UVç2§Ùg–{ƒ"®×µw¤ª¨n‘™b°¬HMUúß­^¬*,S3¤švìh÷KB„Є !ÿ•Òˆ{¿#!4B8%ª¾9ï¿ßóÔ³Î5¾³8Tz:†š.ÎÙX¦¤nݳÕèvVíÞ½.×ðá‹C ‰“NOóÇ»s ëÔÄü5¶AXOýÁ#²|Oœ×wUUÅ`0 )©Ä=úu0åwìH‹ ±Y°®¬îââ4£aîÓ[W,Ä6SD,ÊñŠnW›K±nX>?&TÄb6-î0)>çÛ GŽ·ôÿÁº*ç¥ÅtÑ@ &™KçÞÉË­tŠ=}ÏŽµ1ƒ_É/Ö•9i¾ÿ°©(ЏÝ×ë!Õ­*%_SŽe¾¥?b‚,ó-JíÙŽÞ´Ys'+ΫÎ5žkª¯wº%AD$Èš‘lÚ˜»2Åš0ñâÄ„˜YA">Z[e÷ñ¶ãÙ6CܦõO¶õ('ÛÄšariSMiÖà µÎ7©·¸$Æ "F»½ïÏú½ç:ëó£ãzM Ì3ÖŒ1>|¸Ã4ß<Ó`µÛþ¸Ãôˆ5TÄh1+'›®=Ä·éd‡b¶ ÿ“p)Ƥ6o»vt'ùjú‰•yÆ–1|dª ÐY}Bg°Y­Øpש¼uË®=ZUݪ(Þgqéø޽çz‚fÎ ’ž¦ÃMb]lr¦AÖMï½ßï½¢T“—ç¿÷Þ&kPcdz_Bˆ"„&\zï „îö ðz笧í\Gßÿ3X,W‹ËÐm®Ã»÷Õ¹îÚïhýÅîßDïýô·¿ýíoûéÞèÏöýª•ò( ܉w´†tVÕ«ætSGýÉþxQŒV»-4HD.5o3X‡Ý›Þs®ªì¤²bÍŠ9A3ãž^nظ{ßñ措¼ZI,JÃ:\†©Æ]›—µ5ê6Uì>â¶ïX>G—Éàn:^ßl´*mu O¹Uk›«7Æ mµk݆­iVÅU_uÊeŒ3·…"b´ÇöU·“­F 2ηHu]›)Ý>KDfÚ3  óÞQÖ,6v|¼ow“)õ=kÈÐ&Ù¬Ä ûÁœÜ9[Ÿ¶+MU»k]\­‰•y43ÆHo}eª¡46;bô?\âV˜÷í+ܵá‹âª¯Ø]¯$Ù|¼ºÁ$μܓÿùÆ‘ÌòÔòÌêÿ&¿üŸòðÞÓi¢}öÙg>øà<Ù«W¯þéOúÎw¾sûwÍ3ÑîAŠ¢)ƒþË”†&àÏD`ê²9Že€›;Ñ?h¢Ü=zUUíUý—) ç¸{üçËÉ/‹Èàÿ"܉pŠ~âfùüͬøñ_ó%þp'ÀÝàÛ ÿö[ó0F܉øA ðƒ&àM4Àšh€4Ñ?h¢LbÓ¦M»zõêmØ‘ªªŠ¢ÜµóL `3 _~ùåmØÑW_}uÏ=÷ܵóL ` ïìì¼xñ¢ªª·hªª^¼x±³³3<<ü®çé„Àä5}úôx ³³ó«¯¾ºE}4EQî¹çžx`úô»·•D `r›>}úìÙ³™‡[Šs~ÐDü ‰øA ðƒ&àM4Àšh€Ó™¸‰:::˜ðËd2M®¦‰7SØ7¾Á$ÀÔÃÇ9?h¢~ÐDü ‰øA ðƒ&àM4Àšh€4Ñ?h¢~ÐDü˜ÎÀmÕYóœ£}Kñj‹2°äò¹wK+뜭_Jð÷âÓ¶d.³èÅ}zÛ?7©‹w”¿fS†,SÛkKKÞ=ÝìÖG&¤goY¡Ü¸Ç@ÖÑ:6àVRÏ—<–ïy­t³»ý|eÿch–4S°Y­Ã¸‰ÃÇv¦CµÕäáŠuüï5ŽþòéçÖ”X¼'=œW}Ü4Ó³ƒýùÏþ«¿ú«o~s,÷ê~íñŒôkÏ…#ûKŽºÌÉI§õ—cÕÛ·þ¬Ë¾zê§âÃ/üÛÏÊ™a˜ù€õ¯c—Οß÷¿¿ÿÞ¥úÆÐÔ.±Ü3dsõ{_r|f~vÓê•‘íÕ?hŠ\–8¼ d­cn­«—><éMLŽ7r·›ïÌ£Œœ1nÈJ@™j„D¤u7qø˜Ît˜öšM;O|¥ÿ+“þæ^µí—¹k«þß߯^¿úïô-5••.ûʇC§tÌŒ%„!Bh¢…V¥Èå¸!tµåhÕo¾ûìöÌåËçÏ_:~ÒßEG„46à›ø.ÿ{ñ¾ßüMÎÁgcîÕjþßÿ:r´ñþåüµž×ý‰ë›ÃXÞs}ýuooï·¾õ­ÛÀ܉·‡ÚR–½êh—ˆHðàÊætukØÅë“#D$zKVãcU§.Ç-¹?.äzùu¤ªÕ”Q´5F/µ½qÕ‹‡ê]q‹Œ£]GëØLUZ™GÑÊY"L5B"ÒL€7oø¨ÏÔÇdU—|ä Ó J™Í出Zïx>>DÄf™Ñ½ù“Ö‰6rÌŒ%„!Bh¢…ÖÞ¹·"„¤»­SL)± 1!~'zøØglðºUÑe¢A†ÛÜõc à¶PÌ)ŽŸ—¤ÏR”©WLQö„°þ áFQÝÞ!#Ýõååže[–¿]mw¶Hdbt_í Xâ#u­ mê¨×Ñ:6LFêù·Ë*;õé»YYé‹ÒV=·«¦eàæH÷…c¯æ¬Z––¶(íÇ?Úõ˦þåjÛ§%Y«Ò¥¥-ËÚñö¹Ë ;+7¦ý°¢]DD½ðöª´EYmýï+V-ÚXÓ!"—Ͻ½#ëÒÒýxãæŠs®þ÷-§³Òsj?}uãTÑ>è0ÒËy«¶ÝÃ%»3q¢‘y´3†ÿ,¡•©FHD$Àqý™JGÍÆEi;êòd[MI¹7eKRØ ã9í¼™lïÓiˆY¿ó²¾÷Ìׯj³öXBˆ"„&liVq\Ž[B¢v·\Ñ™Â}tü lÆ&¼ËGrÖ—|áýýþÕËv5ªšEÎõ)óUíˆxÎWïÊy,=mQÚª¬’c-*üãN4¸]]´psˆ¸‡V<ÊýÅ×~òÔ:ñå »uÈ9/T–7Z2WÝøœ2µ»Ý£ 3üqQ W¼­.ˆ2ºu´Ž “µ?ÒuôÕÊØÕ««¥±²´»Õ¨žssAmXÊÇFÆ[¥´®Ýct¶ì«’»œïÖ·»u m¡¸Žµ{Ã’¬ÁkŒŽ½Ï{¢¥[ìz ø³¾ÚÑØ¥‹Îøæ2Å©£‰6‘2ÏX3ÆðLå®ßñXQ“WDfľUºÙ2âfo<Œq¿YgÚq¬¸Ü³¬8iøƒ¾щ„=±ùÅä±YtýO8JñŸ{KB„ÐD !­¯ürÜÜ’ˆ¤Ÿ–'ô}‹£_Ó}ñXQUÝÐýjŽ  Âœ|ßEÎõßû*l\­Í—¯´¾’™6hŰ–+B 4Ñ`bW§wý¨¸Á°0ûç«â‡-zgCukXr¬ïgU(Ázo»ËÛ_s©žnU6ì骬ƒ)­ï‹\>·3· Ng_¾p^rfRòQÇ«} ÑÛžßS‘ÚØpª¾¾®ÜQúnì?oN ñ¹0*1ÂSÙØÚÔä1§GÛ»"\Ÿ4·ŸwG>nÑx›€NgTèÜNŽÌ3ÆŒqC¦2سÿ¥Ä+"¢ÓíÍú<Œq¿Igªv8[=_4¯Ê84°äÐÓjâåÛƒƒu:½ýÚŽ"l&©é¸"â?÷*Œ%„!BhÂ…ÖKl`—㦇Ðk6Å0hMC¤ý†ýŽ4Öo…9ùh9×øªvì^‘९;RÌ׿wAg˜*Sšh0Eyêw–8Í黊WÞc‘ÖÑpì¿f/LÐx9W"ì9]wÞ“£QÛΜ÷Ff{È:˜rZOµª 6EDÔÖÓ-ÞàÔpÅÝTõkÏÂ’ÒõVEDT§Gí{x®ë\Ey«}õÊøT[|jFÒ›ës+›.Ûg½qab|ˆ}a؛ǎéOŽÐ‚­ÆòOŽœè2%EE”È]W}Óå$Sˆˆˆë|׺K°ÈÇ3+&[˜÷£3mjLßa´4´z%Š 6q2ÏØ2†L¥„˜ÿ¨µY­8Îá7çL몢Ÿg ¼=VôÊÛ?oK±F(Š'Öì­ªoWãîWDÄÝÞØ!Á–å^e¶ÿ±„!DM¸Òj¢r9nA¹êweŠÚîXÙw™¯ýjŽ ¤Âœt´Šœk|V; ‘‘úîV׌ð¾¯+UÏWüäPðóÙIêdÐD€‰ûªßXÓàx"¼«¾¾«‘.Øj‹6*"r¹éôúhÛÐ'kxœ5Ò-[½,BÑÛ3ê_,-¯ËN1wÕ¼zBmë{ Ç(×á2L5W~]\lÉJ±z›+K?q[³—GˆÒ¦¿r¾ÎyÁ¥´©ØÙpÅÕîRmi¯­<áÖg¥F).gÍ©îà¸0½âñ±PDŒV»¡üèZƒE ޳ÈÑO¿{Â."[J¢Þ±³¸Bɘgì:ñvió}I»¬Ê°&š˜æ¥2!«`KŒ~Lë`jÑÙ_LÓÙŸ[Ò=ã»±™Åëã"bËܲ´è͢ͿЅ=¸0ãµýÎâÒŸ|bûiÒª×Rö¿Y^°Þ+ºà¨Ä,ÇKÑŠ">ŠˆgŸqôÓÈX“""³#åt»-¡ïc,ŠmK~Ž¡¤|gî!ÏŒ°‡’¶íÏðugGÈ¢]ùÞû«^Í­4DÎËÌI¯.næŠM¤Ì£•1´ùÎT7¼õµÙ‘àM>†3u·ûÅÑฌefíÓ‰Ë.x¥´¤¼(÷K {hiÎþŒ¾ÏG «µ}ͱ„!DMàõ¥¼µ!¾hW‘¼YRõjn—gÆìØeÛ~š­~ÎØ¤j¢i9óúW0Äø,l"ÒÙÿîÛ'<ºàfgFSïo|ýõ×Ì öÇ?þñÞ{ï6mÚÆ^ýòK&wzþ­Çò½¯i?˜ ¦ÝwßXÞs]½ú§?ýé;ßùÎí?àorÍ€‘ÑDüà™hLJô‹¿ú9ÓÜ|܉øA ðƒ&àM4Àšh€4Ñ?h¢~ÐDü ‰ø1)€›¨ë믙ðË4Ù˜&ÜLaßø“Sçü ‰øA ðƒ&àM4Àšh€4Ñ?h¢~ÐDü ‰øA ðc:S·UgÍsŽö-Å«-ÊÀ’ËçÞ-­¬s¶~)Áß‹OÛ’¹Ì¢÷émÿXÜS“U]ò‘+L7(e6—êzh½ãùø›eF÷æOZ;$ÚÈ12–"„¡‰BZ{ärÜŠ’î¶N1¥Ä&Ä„øèácœ±IÀëVuFk”‰ns×)€ÛB1§8~^\\’>{HQ¦^1EÙÂú4„GEu{‡Œt×——{–mY:üNtµÝÙ"‘‰Ñ}µƒb‰Ôµ6´©£^GëØ0©çßz,«ìÔ§ïfe¥/J[õÜ®š–›#Ý޽š³jYZÚ¢´ÿh×/›ú—«mŸ–d­J_”–¶,kÇÛç.k,ì¬Ü˜öÊvõÂÛ«ÒeU´õ¿¯XµhcM‡ˆ\>÷öެHK[ôã›+ιúß·œÎJÏ©müôÕ?þQEû ÃH,ç­Úv—ìÎĉFæÑÎþ³„V¦!’Ç9|ôg*5¥í¨È“m5%åÞ”-IaƒŽç´óJd²½ÿM§!fýþÍËúÞ3_«yÌÚc !Bˆš°!¤YÅp9nE‰ÚÝrEg ÷Ñ=ò?6°›ð.ÉY_ò…÷÷ûW/ÛÕ¨j9×§ÌWµ#â9_½+ç±ô´Ei«²J޵¨ð;ÑàvuÑBÂÍ!âZñ(÷g\ûÉSèÄ—3ìÖ!ä¼PYÞhÉ\uãsÊÔîv.Ì8ðÇE%8\ñ¶º<"ÊèÖÑ:6LÖþH×ÑW+cW¯r¬–ÆÊÒò¬]ÁäÅÕóo;J¶Ìí™QOcuIåO>²ðôýr¡bóþzszö[6]Ç'å¯í+͵wÞ¸0'Î\ê<ïʈ0zšÝ"ÒØtYÌ!ÝMÎîûìV£zþÍ͵a)[óŒÝ'Þ-)xΓÿÁêhED¼íå%‡¬K3Ÿ “Ëõ¯æ–6ÙÒ·;lJë¡7÷7xt±\²;Ž42Úª™1üd íL5B"òŸÇ=| gjˆ\öýGu¦¾_tÖìüÈ›^dn<1èŸXûeÞ}â­ç5üÞ£ÿ^lÚ–ÕýO8º6Vë˜GKB„Є !­J)Ëq+BH¼ÝmÝ^õã±üæËº°ãÓ¶d.ê{›ÿ±ÍØ„’\T¢nÌ®M)ùé¢QÏ¿é«ÈQ®Ÿ«j'Nßy$ßQ®KÚâÈ2zšªKK³Šô䯩@ &Ï…Úw‹^?£.ÊI·ªfÜÎÊ#²°Øîã>{Õë½þúSt3÷è×Á”3#1;;Õ¦ˆD[ƒ»~˜ûQ]g|j°>îñ¬ä…‹¬z‰TNÊîº""Òý…KýüÂ8{ˆHd„i^—Içs¡bŒ³ê?9ÓâYdomè‹}ÈÓxê u¹ÒZ×5á6Õz¬[ve$†ˆÈý¯©Íß/=Ô”¹Ù."â5$ånO ‘ŽšŠÝÂ’œ•VEÄ–½½}ýú\¯ ”y\cÍ#dª€‘F¼)ÃG{¦[Òó¶þ7 ÕŹS R#Wãàã¹"Þ¦·ŽÍ{1+×ìm­.-Í* þ`sœqÐX­í0–"„¡ BZFw9n^Iw»K¼¢‹)7ÓÐ}º¼dV·þƒÍq†@Æ6c“F‘s}Æ|T;ê…Cåí¶íû3âô"rÿ–ìöæÖ8/Ç'N)M4˜Â\¯î:ôb}‘¿Ú6ø¥»³®ªÑ˜äû„ŠN'ÏõÐ{E~‡Y@ë`ʉLˆì¿ÈJd¬Ew¢¾KM H\ªkjü´º©ÙyÞYßtEbED”è”ä0Ç?­^õ`llB||b¬Í¤ˆø\o•ÒºvÑÙn°¯Jîr¾[ßîÖ5´Itz„â:Öî K²¯1:ö>n±ëE$xàÏújGc—.:sà›ËKl¤Ž&ÚDÊ2•bü£Öfµà8‡ßœ3U¬«Š~ž1ðvôXÑ+glÿ¼-Å¡(žX³·ª¾]»_w{c‡[f”{•ÙþÇB„!4áBH«‰Èå¸!äªß•}(j»ceß}d¾ö«96 sÒÑ*r®ñYí$DFê»[]3Âû¾®T=_ñ“CÁÏg'¨“A &î«~cMƒ7â‰ð®úú®þEº`«-Ú¨ˆÈå¦Ó_è£mCŸ¬áqÖ|tJ·lõ²EoÏ\¨±´¼.;ÅÜUóê Y´­ï1£\‡Ë0Õ\ùuq±%+Åêm®,ýÄmÍ^!Jw˜þÊù:çc”Òv¦bgÃoT»Kµ¤½¶ò„[Ÿ•¥¸œ5§ºƒãÂôŠÇÇB1Zí†ò£¿^j %8Î"G?ý"ì [¸ˆl)‰zÇÎâ %cž±ëÄÛ¥Í÷%í²*Úhbš—òPÅþÍE³·¤Ù”æš7Otsµ&VæÑÌ#ð™©†ÒØìˆ ðæ ÙºkÊëuÉËÌ!ækowu¢ 6ßa%nulù+E%æUIocyIƒa¡#!dèX­í‡hŽ%„!Bh↖.Ç- ¡ÈXcëþŸ”è_JŠRº•% †¥ùÃCHkl€36©(Á¾‹Óµ|V;Ñ)é³³_w”HæRÓ•†ÊòC-±ù&ÊbÐD€‰ÌÕÞ%Òõ¯ÅEƒ–E¾ønQ²"¢~Q×*æá³ð´;ú ½-sY„"zû*Ç+¥%o;²ÝúÈ„¬‚-1ú1­ƒ©Eg1MdnI÷ŒïÆfÿÿíÝPTgºàñgÖô¡Æn+Ф#™–Ì4T¥{·ÒÔ\°V0%ddM˜‹$2H&˜Ä_#jp@rcë ŠQ0J\:ׂ›²Qw4N¬·ÔÜ &eoÕ…©&!lP"cKÊnSžNÊýCPÀ>tóCÅöû©Tª<¼ï9ç=çáyßóöáí¥IF±åÍ©Ø\±ú]äC³s7ê7VÕ¾zØövú‚ ™5›eK}¢ MÍw¬ŒSñ³QD”èDû䃟Æ$˜™–#'ºlÉWÿŒE±•ªKöz'G>œ¾¦&×ß›)›J}k×—4bfææ4UµqÇ&RæÑÊÚügªž_ýív¸8NÕGÑROÇÇ OÌM3k7'± ìOµÕΊ’ï$òá9…5¹Wÿ>j`]­ýkÖ%„!Bh‡ÐˆoåÍ ¡¨”M²¹ºq}Iwò´„´5oçÆ)Á†_W쎚DÓäÌì+`ˆ÷;°‰Îq8¤f×ö²£^]øC³ ªòâ# Ÿ]¹r…«}ûí·÷Þ{ï¤I“FQ÷§ï¾ãâ6ROoy²Ô·A{d`‚˜tß}£yæúé§ï¿ÿþ¸õ'ü_¸gÀð˜D`M4B‡·â/ïp€ñÇ›h@L¢0‰À$“h@L¢0‰À$“h@÷p `õ\¹ÂE€€LwÚ 3‰ã)òg?ã"@èáÏ9€˜D` €I4 &Ñ€˜D` €I4 &Ñ€˜D` à.ÜRç¼èè*ªZhQú·\8µ«¶áˆ«ã; ÿuRvQ^šE/žkþ¹ªmpM]’ùÁ¦ Ú¦vª­Þu¢Í£IÎ)(J‰Vn<'¯h~¢)ô:µç~×5<&9;¿(íÁþŸ\p}X»ë ëo½º_ÏÌ}mišY¾üèûP?tîÄöªúCm=¾ÉÓÒòŠrã#íþFÐÒ Bw,Ý÷HB—,4nYH3T4{"d!­ãŽè—ns7WTu'8þ× ›ÿ&\8ñâÒ÷S«¶æDÑëcÜð&ÜBÞ¯÷×¾ÿwß áXSYÙ¿wÄä–Vfš\µÕ̓uÁëkÖ\ûïÏyV½.6yÚ‚·¹zÍëÍá9…Ž Ù‘®š5뛽72ˆ2Zç TùÏ<2Æ Y"¸L5ÌnµNc«ª¥CtXïì˜Ýg¼ú„îoø–¼8%غŽT9ª»l/9J·,µ{V¬þ°+¤:5õë]%eMÞÄ¢ÒÒMÙ1íµ%«O\¸úƒÎ+{­y%[ ÒŒ®Úçiu¸òcêCoœ=q:ªIR‘£tKž­{oÙ«ŸY÷7‚–ºcé¾Gºd¡qËBZ¡¢Ø" iwD¿tÚ…æÆ£ž¤Â·Úø$·o¢À­¡¶×,8Ø#">pTt¢©#ò骥Ñ"W”ßòdYãñ ‰s#LŒ¸> ÚߨaÊ­˜1d0çjøÌ—´fiV¼^$öµ–+ö6»SŒ#-£unB•VæQ´2†F–&S “ˆ4àøUqKý\¬¦ê÷Ý‘º[z;ω)3!9>"à…Z÷‚«Á¥û¥ys㑘¢–“ Ž6w?ñÄø2šÿð´46õÄ•æ&GˆÄÅmèiyîý£IO˜Õ6çÞž‡—:^JбY&÷®>ÜÑ-qF­òcíC‡Ì¡8Ô»²475BijÒubÅáwZ”1¨îo„- &tÇÒ}{ƒ]²Ðøe!­£k¶Y&@Ò8nrG¿tŸÏ£êŒÖX“žN·o¢À­¡˜3ïTUUçL4(S/™bíÉ‘}ÿ4DEEõ þ<ÜÓìtzÓŠæ }]írµKLjÜÕ±ƒbIŠÑuœìTG\FëÜp'ROoy2¿îø§»òósR²¼¸é@{ÿÛž¯?^_¸ -;;%û¹?nú°µo»Úùiuþ‚œ”ìì´üµÛO]ÐØx®ayöê»DDÔ¯·/ÈNɯïì{®X²ü@·ˆ\8µ}mþï²³Sž[¾ºþ”»ï¹åD~Ná¡–O×/îõ]N#çÉÂ-‡º¼Ü²Û'™G;cÎZ™j˜DLcõ‘·Tº,OÉ^ÛÜŸ';T;}™Eé‘vÚÛ~IgŠòóܸ®Ï§Šbè{V½N§„ß™ïPø Ï™._d¬¹ÿÚ˜ì1º3®N¯¨]'\—b2ì}ü†ø¥5«ÓÌÚåDZ½uf’µÿ(†pETŸl÷7²– ÍÐ "üFQ—,tó²fjöDÈBZÇ ú—n‚»°¿piõßßk¦mjQ59×/™¿ÑŽˆ÷tÓ¦Â's²S²äWÜ® o¢À­zàˆˆ2GˆgðˆGy0·ªìÚ¿¼Í{~7Ùnô!ç× ÎKÞ‚jQ{»¼ºHcÿ“Jx”âëp{E”‘•Ñ:7Ü©ó#=×7$,\àX(- µÎüMáï®K2ª§·;j]¶¼×òb Þ–¦ê†Wß·¿;ÿAùº~uM³9§`‹M×}ØùzEMbm‰ýÜ íáµ®ÓîÜh£·ÍÕ+"-­ÄÑÛêê½Ïn5ª§7¯.;™Yä˜iì=º«ºìEoé» ãñu9«÷Zçä½”)š×—Ô¶Úr^sØ”Ž½›kNzu ܲێ42Ú¡™1d íL5L" œÇ\}-5ĤýË㺾WÃÎØø¾/§,ÝÜrtÀDXog¯OÝëx²´í‚.ò¡¤ì¢¼”«« ®eψu:Od¤˜zO4¸¢æ'ïÐ(òÛ©MV¤·Ç}mRã\OÔn¯¨=]tzÏÑ-/î=ùw¯þ× ÙE Ó,zÍò¢§>´¿Ø†}eÜ_7;?ëýåã6SÐÝ߈Z*úëa ºÃtÍc©KºyYH+ ´{"d!­ãÿK7±EdTT«Ë eV¿!êéÍþ9Êõèð3ÚIÔŸÛ_êpêÒ‹ùFokSmm~…þÝ’;5'ƒI4¸Ëx¿>´«âõÏÔ”Âë€ñŸÇÕ°_fWÙý¼®¯ú|¢×®ý[7YñŒ¼ BÎäÔ‚‚,›"g ïùCÉûGÎ%e…ëŸÊϘbÕ‹HŒrboAÏ%‘Þ3n]ÜK³í"1Ѧ™=&ߊ1Ѫ?üY»7ÅÞq²;2áaoËñ3ê\¥ãHÏd{R´ÚRqÈk-Ú”›!"nPÛþ¥vokÞj»ˆˆÏ^òZz”ˆt¨?©›]]ø„U±¼ÖµtéQî×Ê<îÑfŒa2UP‰H#ŽKõ‘¶Ô`KÉÖ÷ðÚTõ¾'³,+Zq· ØUo—[|¢KZY’gè=ᬮÉïÕ¿»:ÑL]‰ÊZš{¨ æ¹Ü‘ÉV³ÏwçÍh3Ú3–ªíõ§6åÚ”Ž£"ÓDDõ]_ë–g®È/1û:šjkó«Ãß]¨U~¼úÐÁ‘tzã‚’¿^™öxuZôMjéÀÒ 35ˆðE]²ÐÍËBZ4{Bd!¦×/ÝÄ¢1ȹ~ÅüŒvÔ¯÷:»l¯Õä&êEäÁ¢‚®?”p]HJ€I4˜ÐÜ-õë7íý¿b}ÚQºÐ6°ë>w¤±Å˜îÿcUE§¯÷úÐwI½áQ,˜291É1}7Y‰I°èŽ6÷¨YQÑ©st­-Ÿ6µ¶¹N»š[/I‚ˆˆ—™éø×… JHHNJJM°™¿c’¬R{¤Ëktuì 2z\»š»<º“—­¸?îòE¦[ûƒ×—pŸïh{¯Øõ"Þÿ±¾ÚÝÒ£‹Ëëÿæ2Å’£cm"ežÑfŒ¡™ÊÓ¼öÉŠVŸˆLNØR»Ú2ìno<1V¯–v\åô¦U¥ßð}yÑéo;Ó ú«›ã6èÎÜÖ~Úó”E?ìk:QaæöÎÈ<£Ì7d*ƒ½àߪ}"":½QÑÞ­ßÓcõqj©Úíêðži[»·ËÞç²$9œlŠa@ICŒÝ$º/‰D®»²«ñS™]½4ݪˆÈƒ–®æÕ'›{Ä:¡eŒŸÿvC®çœW‰ŠPO•>ytšI/Jx¸N§·_[ž)Úví¢ù-?4FÉCª«ç¾n÷EY£õ†¨hKTôJ¥å¸ã°Ë›’ªÿ–Ó¥û¥nýNÊBZ]¬v`ßî,4\† ºw­AÎ5þF;vŸHøœ×™æësˆ:CÀ ÀmåmÞXí2çlú·¥~ž»O~üÿ¦ÍNÖèΕh»E:Žœ¾:LP;?;í‹I²“`Ê ätïè[Wí8Ñî ·G)žÖÆ¿zgWU”¬|"%ñÁHÅ«^-á>U¿ùÃ6ƒ-)kþŠšêÒVN6´^ð»Q$Â>;²ûèÇûÏE%Gë ±Vc×áýG{L³c"Ƙh]OskÿB½îÓ'¿ÓE[†.+£˜l‘¾ÓŸõ¯­¶Ÿìðq»&Ræ]Æð“©”ST”)*Ê¡W†Ù­Vcõñi©b]PñNUÕ;UUïTmzýñH ŸýçM+cwó¦?®ùðÚúÓž®–n ·Lª®*C–­ö‰èMº ­ '6o©syCT„"ÞÖç%.É¢ˆ2-ÁìëjîR‡^4òCb`Ä}èàêî“UKï_»eªzIrsZL<–î;tºõ;* iN¢iöíÏBÚM "tï8Zƒœkül 11úÞ÷䨫÷ÚØ{x³ó37ß-€@x nk¯ßrà¤/úé¨žææž¾Mºp«-ΨˆÈ…Ögôq¶Áoâuxÿ¸.maZ´¢·çÍÖ¯¨u)È4÷XTRÖ\]†c„e¸ ¡æÒ_«ª,ù™V_[Cíaµ`n´(½‘úK§¸¾6Æ*ŸÕoÕGÑROËg³.#7Ímޏö¸«]¸ùÁh£ˆÄ$;j^­Ö¯LUz] Õ' sJ“#‚«›ù°³f}uÌÊt«ÁÛÖT{XM(L¥ô‘ÒZõj•²2Ó®œÞ»ñ¤>c“Ý "‰ œª¨6/H·øZœÕ' ³É"ªFùqèCd{Ú/ÎΘ—fÇ(½®†Z—2s]sZ:0 ´Â,˜ðy]²ÐMÌBZ´[n2jwL¿t“îcºVÀïh'.3gZÁëŽjÉ›cºt²Á¹·=¡ÔİL¢ÀDæîêéù÷ªŠÛbVìªÈPDÔ3G:Ä]äC³ókòCê›à”¸—ùj•óÏŽ½1 kJöe}bAÙŸj«%ßIäÃs krmÊpåÇ܇^UØ»±±qõáßäȇ“ jòâ 7«¥Ã@+Ì‚ ¿×% ÝÌ,¤¹[ÿ-·? ‰Öq#ÆôK7AÖ gf_C¼ßMtŽÃ!5»¶—õêš]P•ǨýìÊ•+\èÛo¿½÷Þ{'Mš4Šº?}÷·‘zzË“¥¾ Öán»I÷Ý7šg®Ÿ~úþûïxà[¬‰À$k¢:”¸y‡ËŒ?ÞD` €I4 &Ñ€˜D` €I4 &Ñ€˜D¸‡Kã¨çÊ.dºÓN˜I4×nÀdâ"@èáÏ9€˜D` €I4 &Ñ€˜D` à.ÀíǾQ;ëËwÊ,óQÂÅÏË—”7Û—•n5w7–—/Ygx¯lÖ”‘—Ñ:7¡J#ó Ÿ1nÈÁeªa‘ÖiŒcõQµô†‡×uÛÚUSâµ îN!yUñ<ÓÕ%g£5LûÁwôu !Bˆš(!¤5RºüMýòåu†¬âŠEòy}eåòm–÷^±…MˆÒlZ¨„ûóú:—!ƒI40‰!érۛϾÐÔ-"b8*:ÒØnÊÙ³fÞt±Ÿz¢°îøùYMqýuì³ûêÚM‹v?6äí‹ÍõGÔäŠâìSD¬kO=±¼þøùYƒKSFëÜ„*­Ì£he ,L¦&i&Àñ«>â–ú{x-¯s›®ÐìîìSnò¬ÿjf,u !Bˆš0!¤uôË­uõÝöâ÷^~tªH¼Åà.Ü×Þ-¶é2BH³i¡BÀmšhpk„™s·îÙ³gÇ"ó A™zÑdMœeêûç“Ù(ªgðûÑm«ódgÜ?t@×ùy»Xµ^ýÐ2Ìò¨Ei?ÖyyÄe´Î wª³ÇÞ|ù©Çyä·™‹Ë>ú¦ïnŸÿüêÆGæ•·>?-ºÚö9žÏüí#¿Í|Þq¨Ó3 ìZ×<ŸùÛGy$sqÙ¾¶Ë\Ö¢•y´3Fà,¡•©†IDÁ$À1VyKålã3<òòç—<¼ª¹ÅÙ¦;u·y“Éàç—o u !Bˆš°!¤9ŠëüÄå±ÌK웚2cÍ[eó¦Ë„!ͦ…H}SÿÔ³ ÝjëºôÇËZ._üdñoŸÿèÔGŽgæ­oäì¾g~ûü¾þ±Îù}Ï_ÿÃŒo¢À­šE›zÿô©r±}Ш%,vñ›o]þ}^¨Ûhô!g[ý6—eÙª×)SÝÅdìÿ`R1šµÝí Y­sÃù\ÒòÆ’’ã–ekwØ•öúuåKÊï9ìo¼PxÈ”S¼õQ£û£å…/xv¼÷Š-ìü±uK*[í‹Önµ+íõ•åÇ=JòÕAø¾ÂåuJVñÖb£ÇÕXY¹¤ÄðÞò™uè¤#Ì£¶kfŒYB;S “ˆ'À1WEK –yYYŠ©ÿy´¼NÍÝ‘ev}4è„ܪZ¿<³°Õ­˜¬©ó‹—õý9ÑXêB„!4aCHk¤¤vwºƒçãùúãíƒ%y~ñª¡KªÝ®ÒlZˆ„ÐôÜ={.>û‚kÑ{o=:U.v‹ÚYW^o·lY²I»Ã0‰!ãbÛG•%åGÔÔÒE×Ҹؼs¿ÌÝšè§WUU †ë£9Å ˆxF^!GÍ;©É¥k³gL±­ZûͺÆnÏEWÝ!½¸tñ£SE$¶Tm}¢²¾uY™éÈÎfeîŽÒ\[˜HüÚµßü~É¡¾'‘ºNûÚ÷Ϙ""±–µßü~I£ëü£ 3C>óœmÆ&S•ˆ4à¸TiK§Äg¿ßÿðº®Î“»#kz˜Û5`WîN·¨¢<ºªb™ÁýI]yùwßRFc©KB„Є !-ªêµ½r_êªâ ³ÚÞXY¹¤Üø^Ù¬©"„4šÖ*!Ôw›®ý•«jÈ®pdß/"rÖ †7` BÄùSo­+ip‰=gëÚÅñ{ò³Gê\Ælÿ«*Š"Ïõ! êQ %‚/ƒr¹ûT§j;¤Ó6IDATZdé O‰ùx‘oê;US¶µ?²¦Zg™ÔÚÝ—åT·b]Ö¿þr˜e–E9$"âiou{Ú Ó°gS›Ge†|æmÆš©.{ù‰—*"†ä­–Y†Ýí§1ÆêãÕÒ³ûÖÕy2¶fÝðŠÆô¬Ý²¦L¹ºÙfQ:Ÿ(©;r~Ö¼©ãS—"„¡‰BZ_Z­ˆ"bÊ)uÌ›."ñ¥oݱoÇ­!Íð­Àh·XÙ—á ˜D€xŽýdͳëŽæ®Ý³êÑ¡£¤³ÇÛMó’ï÷?t3š j§[íû,Nõ¸ÕÖ¸¦ BŠzu`>æ3*¶æš¯ïH1ÜÏÅ ýÌ3ÊŒqC¦š’¸vÏ{êÕÀ1†‰hïÖïiŒ±ú8µôr÷çížÎÖæ4ôoixö‘¦ä­Êâæ xgcŠe†IÏzD¦ŽK]Bˆ"„&^iPŒFE1Ä_[wÌï÷vÜŽ&¼C'„ß eªâÿV©ªª2¼ñãâgŽœ—ÿÒ÷ÚÞýioÔ•Íþã ðÅp{û¯cååÍæE»÷¬ñ3|?{|_§ù194 3ϰHû'­¯Ž´:?iU-C¿Õ=˜2!aÆx“tkï[(÷ò)ÇSO•µ,f¥ûXëµv[u+f‹1ÌoR[?éÿ¢‰ËíÇÚ¯Ž2 ‹ÁÝî6Ü•ѽ¯rÛ7‹ïÞ™gtÃO¦ ›Ú=S§„ ³[­8ÆêãÓÒ0ëªÝ{úì®È2‰qnéîÝ«¬aç­yfqýµå¨/vžêc¬a¼êB„!4áBH³Ó5Ï2«Ÿ÷÷£þoÇí !Íã†N ïúÌÙÅÎSÝÂðæFTþGÜ›Ÿ~ñÅ_|ñé›q_nûKã ð&ÜÖ1¤«±Y5瘺›õuð¢­vÛÔ09ßúI§Á:äÝô‹§ëŽ)óÍ›6%qþ\ÃòÊmŸ¬Í5w7®;$©ÉSGQ†ÛB¦&.J•åëÖÙŠsíJg}ùu«yª57Õ°¼|Ý[Ê¢GÝm«l5eí¶†IXj®}gyaÉôâùv¥µ±ò»oØnËÍ5?[¾¼L–Í3yŽÕokhOÞa"Pî†Ì£™1†á7S ¦±ÛaàøTEK¯'ǩӧ÷7^™®ˆb4ÇNŸ*"–YÆöò’rêl«ân®/?nÈØ14±Ž¼.!DB7„4;ÝäEÉÛ Kʧ¯Ê¶¨®ºòㆹ[‡œîí !£ÖqC%„DdЍžîÎómCOß`2)uYr­âª«t©bbxÓïògË’^þþ½œòO×~ò²þi»ˆÈóĶ™Œú˜D€‰ÉÝÙ-Òݰ®dÀ6˪ÿç¼0‘ËŸ´‹9{È篞ö}MM†øùó¦‡É”øU[‹+Ë·-Öc°$ï(ž1eTeB¦ÄïX[Y¾­dÉ6Õ`I]µuUü‘ø5;J åÛÊ—4x &{VŎűa"2õ±Šjyyݺ%; –Ôù¥‹×µˆˆÈôÜ­[¥¼r[á!b´Î]»u™8¹;2VÆf8î7SÝ—þv;\§ê£h©§}_S“qÆ¢yÓµZsÿc»¥²¼nÝ’nÁœ˜Q±{qß/ÈXêB„!4CHs·3Öî(®,¯+YÒ-&{FéŽEC×O»]!$ZÇ •1ÙS­õ;—,9»{Ï¢¡·eUñÜ’Êòå‡ æäùÅ«<%õÂð¦OØÌm'Þ\”ôò—þüfÐúÙ•+W¸ 0зß~{ï½÷Nš4‰K`âûÛßþö›ßü&p¹ËŸ-JzùKù¯oìÏsf9óšúÿŸñÊÊoÞ<±3˜I´/¿üò¡‡ºýé§Ÿ¾ÿþûxàÖš5ÑîaŠ¢„)þÏ% “h@L¢0‰À$ÀÝ㲪ª—Õÿç’ç.À]ã?_ÉxEDþÁàM4€»@XÜÓ¿»ßïOîÿÝsÿ/é „7Ñíøß_8¸£Ä›h@L¢0‰ðÿ·ú1çaYåcIEND®B`‚glewlwyd-1.3.1/screenshots/g_3_clients.png000066400000000000000000001652301322667720100206260ustar00rootroot00000000000000‰PNG  IHDRsjð°µß pHYs  šœtIMEá2Tó‘DtEXtCommentCreated with GIMPW IDATxÚìÝLÛwžïû¿lvBb7iSœžŽizp;;î혙B§÷˜è,t¤8R:«îUi¡š-™Õ Ù««rµ“äŒJŽ´©öLÝ)ìHiKîª ív§ÐÅ3w ÛO·5ÍÔN;!5 ØIàþÁÂoHâ´Ï‡©à/¿ŸïÇßÑ|^þ¼?)ãããã@RJ¥ ’a@#ÌHb„9IŒ0 ‰æ$1€$F˜ÄÒéX½ß~Ö_Ÿúµ®DFtóÖ-:À¢ÒÓÒ´Ñœ¥¿Ýó]}k›eÞãRÆÇÇÇé.X¹ß~ÖË?ëPªqRÒ JI¡(€Åi,6ªñ£úùKç tx¢À*ýäÔ¯•j\§ÔŒL‚K–’’ª4ã:¥ddê'§~=ïq“u¿œ°\ÏlS™•(à¾ztà«Î´5O/:T´1mò7—T{Ы^e«â[èøPÝÃ_µ«6ªðÙÇä¹ ³¡1Á}Œ0ðÕ–nÖÞU¬ã×*êQlÆkY*ù–]®oUÿw¿WçÝ…äÃÚ*ÀWœQù™×Ôþ‡YAN"³M?zJîœU¾•ɪWÿ¢XïÞ¡só]½æ¶Ê’ð²ÁºE«ŸÓ»‡ÿ«Þ®~BnçSz{ßãr¤¯ ½œ­z³¡H;MñÃ-ÏéÝš­²([»÷}OUÓäü³ÿUïx6ÈÀ@¸o±2ðµ»))}“ŽþÍ3*ɘã³M?’´Ò:é´¿æi•]ùX‡þ>¨°é!ÕxžÖ™½zá­«Š¥oÒþ}S…Ÿœ×¾¿’¶>ªƒžeö¯¬½OæšÎüì_eþq‘\ÝÚÓcÜÇX™øI•9c—'Wè›–ß²iÛc*˼¬CoøÔùIDÞ¾µï‡dýÖ£r¦K–í¹õ™ürP½®ª·§O‡þpkÞe‹µ·¨›SÿÁ~9÷ÿ¨ Æ´’u,›IÆ¡ÏÕ7ÿ]øÂç ddËaJ•Í‘-ã¥Ï50²Ü”ïƒk+l»ôuB˜øSäÆ/G‚ª;ѧÞáûóê é©2r“¿rØ3ðµ`H—4zYûÞŽÿ2ݪ“‡ž–Kš r~¯î9áà°¢9ÊiTp² ËÖ•{ãš|Ãc ~<"mPùé_È{S’Òåx"[Òå´'É$)#UÆé™þtÙ·eq£¿‚s_qQ Œf«üYêí™»„Ú2‚ó ¶fþù•ˆ?ùD£Ïèà‹E;ƒ ç<¤ºä(Ðó®únJ±ó>uüéÓ:üâ—:ô/CÒÖGµ[ZÂÞ63 /ÒžFG¸aRÅóÉ×=$=úØD{C ç¥4™7fË’yUáQFÂý*e|||œn€•{ê•7”a¶ÐIÌ´5O/:T´1mò7—T{Ы^™Uñƒ‡èøpñ 'ݬýû¾#ùö—ÿªþåš”³Y¯z¶«üÑ,™GFäýÍ¿«¾3¤ðäq†-[up—C¥¶T|éØy›Ÿ ªòè'œë=iÏætêèR~Ö ù?øHGÞ·êhñÚuâ‚ÂJUû5ç(òoïj×[‘í„»ãF$¬ß¿öÒœ¯æÀ*æ`Ir¬*Û6¦Þß]ž cRåøoÅ:µõ¼JO^Ô0=ôµ¶P˜“J÷p7d©bןhÿ3dË4(ïiÿ3éêÿÍe‚,ˆ=s¸†.hß/²Õð§Ï¨ýiŠF¾T×?ýFG~Gñ3,쎆9¡¾uvv«×Û'_ ¬ððä€4d²Øåtºä*v«¬Ä)«q)-FÕ×Xª=m¥­æMµWÙ¿·á«z]Ëèczᥖ‰¥…¶Ýz³½Vö5îãЀWÝgÕÙ; @8¨`xb<LÙríÊw¹åv«Ði•q-Þ±¯Q/ìi›®]y?Ý[S¹v J’,oè­ºü5é“dø¬¼gÕÚÞ#o_¿üÁ°â%“,v§œ®B¹ËÊU’oæ!°æ‚ç?Tõùé,Ë s"Þfi<¡ÎÁyÒÄXLÃAŸzƒ>õv¶è„l*®iÐþ*—¬Ü¬±P_«Ž7›w<ƆÃô…5èóª³åˆd+VÍþ:Uå®"ÀˆÊ×Ú9#È‘¤`k—üUUkTÝo"èêÔÙövõôû Olºf0ÉæpÊUâQ•§Dö5ÎR"}Íj¨?®îà|¥a}½ úzÕÙr\¦‚ÚßX§Ò\#"÷Ôï™QϱJ•VŸ?È™SPÝ'ªµ£ò˜¼n ÖJH] íØsdyã1Ø­¯¼ êZå®ð­£>µvÍQå2تvÿ½ì“€ºš›ÔÔÔ¤¦Óí+¿¾•v‹¿] žçôÒ¾#jéî×àT#I±aû{uöÄ>ízΣ†¿Öêôíµ*ß33—áþ6x¡RÇx(¸ÇÖpeND}ǪôJËàŒßl.¹=er»ʵYdQLA¿üŸz[[t¶?a킯EÕ•Ql®—‹ GX¨_­ûªt¤wf brË]æV©3_6›EfEåïïR{{§ºÆc¸ûˆví èÔÉZ9—9£ý-êšsDz :Ûýª­µß£~ ªýÄuÇ$É!GY¹ìÆ»uKšU½ë¸úo{Å ƒbš· êìJùÃÍ:Yi_U‰·hß1U걜­x·jªÊå´Û”k6JŠ*ð+èëW{ëëjë OŸGKí>9Þ<©ò\>Vî5Z™•¿¹VÕ‰AŽÁ¡‡ßÐ;í'ÕPU®"g¾ìV«ÌÖ\廊TZ^¥†ÓzçƒÚ™—ÐT°MuGzÄwá±rõ©žäX µûµ·ÔÑ|Lõ•¥r9íʵše¶æÊžïR‰§NÇNwè퓯ªØ–ДëÛZæç¡¿µ'ØvªÆeˆñÎv D¿f·$Ú§cÕ3ƒœ<÷«zíÍwtî\zÎÓ;o½¡£»]2MSÿñZXUgÔz¤Eñ9ª9õŽÚÕªÔiŸ r$É(kn¾œ%Õ7½¥·»e™> ¯Žã™àÞY“0'êoQÝñþø7ëM…:Ø|Jõ¥‹ošnÎ/W}óªqÄ7ÜyD§¿v³ÝX+¡®ÕŸMXñ•·S¯½Ñ¤Ú%ìcuUêXó)íN±ÞCÚ×XÆ¢_Í ËrlžJ•U¸4çÏê¬ÿë5¾g©mú–äÚÿ¦š+U”°1Ž97_%µ'ÕñÆ«*˜þmP-G:—¦%ðwªÕÿÑuð¨ª]feTnéA¬‰§ÌÃÝg( ”’’"ÓVd||Liiió¾¾aNHGN(¾&'O»OUùrj7óUutÿŒ ÜÖ3ý"ÎÁ²Eûôú‘îøªC±Ÿ¬W‘um˜ª=yRe–ø¯úQÇ…ˆ·Y½±øç¡Âm—Õå‘kúˆ°:Ïú¿Fã;¤ÞÖ„59ûuØ3é4c~¥÷$t~‹ºW˜æDü] Ï&—*J–:Œ²—íM¸g}j÷ñDó³lÈÖ­Ø`EÆb£ÚhΚ÷õUï™hÑëÞøÏ¶ÝÚ›¿‚.rËT[Ö¤ê³ÓðÃ=íòE]r®Á~ÑЀ¼^Ÿ‚á°"2Ë–k—ÝáP~.óÜ5¿¼=}òÃŠÈ ‹Í.GQ‘ò×ø„ºNèlÂ ÂÆý*µ® !³Kueêª>; Åzuâ¬_¥UöÅ.T}-½ñUjy•äJ’K—Ô;ùY wž•¿&_ùÆûíFFèë•×P8“Ùb—Ýn—Ãi×¼·2êS—?þ£«¢P‹Ý’\w… Ž˜,ËæWÏ`Tëò;+HXNc²ÉbXÆ[óUh“¼AIŠ)ŠHKؽ玑© L{k÷Êãš]~+¢žÚR½2µ¼ÂuTïœ,™{²ÚZå»NÄû ïU½ÕZ©9÷Jt¨ú¹šÊ¾\GßÑÉ’…&Fïây8Úåyáøä*‡ö¿Õ,Ï"¾Gûõž6…'ïýá·OÞœ„¼:}¤A'ºƒs¶a+~U •r¬É°¨óuo9*K&ïY® —äNsÔê¯Qý‚EÕSý½2ù'®×ÞÕÉ¢EޝýŽ^éø©àð;:]jžøœ6íÒ®3³ïOv<­¥š7ÛµPVè9¦úúõÏñ¢Å¥ŠW÷«¦tŽ7a¿ñ›¢‚ü%܃]‹4ñÑ)ZåÃ@’†ýòG´Œ€Ø&wÃQÙ'ó ³Ã|‡ž7ñû7pì½Ô–d’ûT‡FºT[Vƒ“}h*sÉÙ·G•'&ï§É­S‹_W¨]•;i¢êœA…G;Ô4Çóçn^G™Ëªû.Ï`ßÚfÑÏ\ªŸœúµ®D¾ÔÍ[·è‹JKKÓFs–~º§TßÚf™÷¸ÕÅÃÑ :{ã~†â½*YÅ­örÕÖ׫¾¾^õu9Wüð¨üíµ*éм’’4ÜVÇ«_PuS߬ÍÍÍr”%Ä šo‹“Ð@—fL‘vªož½5¢¾nõMÿäPYÁbxÏ#·Džé-B|jí ,ÚǾÖNMõ®¡°â¶RfÑÓªz¡zÞ G’‚Ýǵ§¼Ná5õ!¯ÎÆkj)¯Ê³Ê•/¹rïM(÷îRopῈx[J¬9TQOÄÌ®3J­u·úî“Rk1ù›«´ë•y‚I {Õr`—ª›o/ã›,rX–òžÃN¿Æ> ÌöÜø^Eê×±ã]ËØǨ\W‰JJ&þ¹rwèy3_·Çêª×ž}ñdzl—xd›n¸G­K(êmÑôöA†BU¸Ì÷ü:ø*J™ükùÌXÝÊœHߌÉm‡Û‘ß²uÔ«êPo|ß™ä(,R£@v³_ýÞ~õôú¦_ï?³GU±Sj®sNŸ¿ÕY.‡ú'&?‡ûÔ”œöÙïÕ`§oÖï|êôEUê2Þv¬¿+aÕH^™–RaèîG®J¹ Å×Ú«Ç39¬h¿Zº¦zР ×ÌC¡íÛsBý‰“·–»ä´[¤`¿º:;'V^ wëÐ>êï{t°KþéŸl*q宺M«Ó­<õO®X ªk ¢*û|ÉBDÞ–Þøš±0È\¤3ç´ËWç\“R‚ 3ÊTT¡ŠXPŠÔÕÖ=ü™ä*+—Ã,É`“sž%ÜÕ =ÁAÅ4±*£ÊS"g®Y‘ЀzÚΨÍŸøï?Þ N÷i•'\·1¿No¾[ÿy ×õuÈ›°š§p…¥½ÌN\†Þé€m¸sŸ^ðïÔþýUr;s×äyµÏ›9û ЮGâ©dÉbQ¾Ý,ÙKäÉ;¡ƒ’4¬ÞvŸ¢Î…Ú ©»%þŒ0¹«4;˹'×ÀWÈo? ëåŸu(Õ¸N)Yë•A™5K0>>¦ðõQ½ü³ýüÇó¯ÎYU˜ z_¿aSI~LÎ…:tèP÷ô„£Á±SGëT’ø­ú*)êïБºÓ+9[öé˜û-ÕOͬçºä¶I¾ $Õë ¨Ö>+ˆúÕÕ?û«æ1õwùuÍ.7VO|:ÓVR¤%E wñYjÍתÞgƤüŒ·ìoUÏT'›JT9cf8¤ŽC‡V¨T°»IGk]3¡ªºýò6ÕªöL¿b±Õe?<à‡T‡Šlk0ž,N¹,Òàd—½EKç)%êQKÂþQ·í c–+1ÍîT«¯NÎ;ŸæÈêªTKRÔ«ÀÙnc’”«5u‹ï)TLîoÖQOb5—JJ+UÕQ§ÊSŸ¹~µz#*/ù,0—s=ÖŸü·¹Ub_á…› UWãЮãñ #ækÓ¡=m:dr¨Ðí–»¤P…®|Y÷ðys›aõ9®XLRž[¯ÖÕÈS43|r—çéÄDš£pw»üuÎùW¢…ºÕ:ݹ+fï÷ð:øªøÉ©_+Õ¸N©™t€%KIIUšqnM>GþùÿüÁœÇ­*Ž…ý ßâ¶Èf¹×—Õ@ˉxˆ`«ÐÉSõ3'$'í¥jh>¥Šé ÿ°ÚN$–`²©°$~A¾Nßí%…ÂýšÎELñcÃ=ýº­HQħÎÁx_º—š4ÜÅó˜Uj­¥w¾‚Ty›»Ïr*TØÅþ³z½7¡°ÖÎ&5Í r&˜åªmRS™eMî}Ø—pµ§,k1clœ¹b%œ¿üTÈÛ¢x–ãREÑíWluíT¼pÛ°ºî“Rk–²&5zìsNÂç–îW]b5:ßjjæEÔÓX­#ýS?TXW!ûÊo ì•'õÆ«.™f¿4ìSoÛ zå%íøN‘Ê«êÔxº]=¡%Þ“µ|ÞÌñ|M¶yºQ•s ¹n¦?®ánõÏÖîÖx‰5[™*íÆ¤¹¾*ÂW¯)5ÿç `eR ™ŠŒÌÿújFWS˜e^B¥¬@«GO?ýô’þ•6,o¢;êSKëTÝ7“Üû÷.\ÂÊèÔÞýÅñ=5¼mêŸNJŒ²»&€:5{[Šˆ¯SS¹ˆcï^N54Ø)_dö©uj`ê“K¥ö¥>ØïæyL”Z›âkí{’6Ò§–é™ßÛ¿åïoo>™Ü:X;«Û f¹jöÇÏyb‰ãÑl¹}ò~EŒ2'ž|$¦¹×…ÔÛ2@Lì!4×E[]ªH>†»ZåKú4Ç¡½{¾‡ŽY5ÚVtI!¯šªËõJ[¼v£­ì¨W³×äùåWžTû‡µÛí˜g\ÄìïVÛ‰Czå¥úN‘GµÇZå DïÒóf.&•5ÔÜV-þqM _Ãêê ÎÓïõÆ—å(ÏS®™YÎ=¾¾"ÆÇÇ¥v˰2))©ºyëÖ¼¯¯®pc⬶! ®6Ø%ïôr‘"y–0{hvU& ~õ$LÞíerM½6ìU׌o¾GåEl*tÊmŸzm@³¾%ìé‹—0r–ɱŒþnžGnI·ýû[5×✈·%¾Ÿ‰Å-ÏŒ™áú6R²¸+ŸÄµºTQhHÒaÖОgr?Ô«–„Õ$®Šù«\3Óµô'yš“W¦Âke4¬âþECê9]§òÕ:ãMر¥ø°N6i­2s~©j›Õõî[:ut¿v—Ê1ߢ°Ø z[ލú…çTy¬gîPsŸ7·1¹å)XèA13| v¶+8×aÞ„kUÆIr³ª0ÇhJ˜ÀE‰ÝÛ‹ xã“™¹…Ê[Êü¡Ñ&WBÉ Á`âê§ÜÎøk=ÞÄòQAy§f@MNÙsåœ.Y6¬¾®ÄiÕ¼ ‡³Ì¹¼ ê»y3¾í߯VïìiìˆzZz¯È䙹OGtP½Ó)ä(q,¡¬’YŽoŠgH\ km†cL‘Äyj£yÎÜ2ÐÝ/ce(T…sþ;luyf”ZëiíOêRk†ü|Ý™ ŠQºšTû½r¢;!ˆ°¨ðÕSj?Vº´}¥–ýàÊ•³Ä£Ú†&5wœÓ»o¿¡×Öhg¡cŽëŒÉ×òŠvÕ¶jv³5ÞÌ–_¤ÅðÍ_ƒêòÏ16{J¬T¨87ù®ÀÂÒWóÇ«EM-Ð ª?Uiþ³v¹žf½[6ß«1[«´ëøàŠÎg8q?ß!íxúвۈ„£ÒtÄa–«Ì!y'¦B»û©Ìx54 éœÄ^,‡Q2¸\2鬆%{ûªµOìéWgÂ7ãÝË®7t7ÏcâÛþÇ'ïA‹W¡ÒÒø~7¡µLo “§ŠÙßòEž^\a‘+wi³¸f»]&ùö`Z.£,v‹4ÕBЧ`TÊ]í$r4 þ„aeÊ›«Ïf–±R¬[¯<÷ôÒÇmO«ú£.¹’tÂÛl2­}£‘>µ6ÔëH÷̵$¦‚ÚßP·Œ2„«g´æ«¨<_EåUªWD]íj=ýºÚúã£q¸÷ˆê^w©¹6¾oÐÚ?of2Y,‹/xÌ-Q¥ã¸Žø&žÁí]UUåÎ;6]…·í]•×`A«[™csiúËÙ Ëë‹,å¯d4Î÷Ï,…Wºž"ªh`õk1¢Ñ™mX]eño¾÷Å÷«‰vNÛ=Ï=±ÂÅhwË95kéïWõwÅ÷©É+Sá ¶¹›ç1³ÔZ›ç„z[4]MÌQ©’ÜÛ:PñQ`–y©9€Á´êÑÍŽÜø¤q¬O=Á5ø„D|ò&´“ë´Ý~ž.5ûVñÃ]jNæRkkš«Dè9¦ªÒ=3ƒ[±j^{K§ëïj3Ç(R~I¥êOwè̓î+u[š¿Mwæy3£Û-K‰@rUèqÄϱ½KùƦ¡PEÖ»òÜ\þuXȪVæÈâ”Ó$ N~Ý×Ù¯HyÉ*ö¸ˆ*ì¯ü|ç€M*vY–Ý€Ý>kâÑâR‘E KŠõ«Ë•+_òwõO®H²È5µù»Ù!·]êõIŠõ©ÓU‘Ó¨`—wzʼn­¤he¥£îæyä–È“w\‹s¼jóFTZj–Rw|cTßކјpÿ£Š.už8[u©1³£DvõN†[AõzCªµ[WÕf¤¿SþéŸl*tÞÞ^ «U3Ö’ KX‰S,ÿïÞf¯"®µÛ&9E5pºZ{Nô'”ÀË“{ƒö{œkí‘õôø‘d4Ûå*Ê_Æ{e/?¨“áí:1ywcýêðEårïÜófr =rèÈĸlUo RžÜÛǦ¡°jîý«’ä:ÌouaŽÑ¡r—Ag»'§f{O«+T¢ò•ΟGýêè_é·Ä2[L’& ƒ³VÇ\«_T`´Ë]hRËÙaMíWS—/õOí[cp¨dz%ub¿_PÒ°ú¼AÉiRßô>5&–Øîƒó˜YjÍÛæU¤´Dæ@wÂFê.U̵´Ç`–iºö^XþðÒjÅ"áU”X›ºìB•åISUú|§[ä÷ÔʾâCê:ßH–¹oë6¿:[¢Ç~½ÕìYB`RkåŽÉòXR¬·U}‘"­*ш)IÞ‡M ufcríVãáZYïÌûEý­ª?Ð61® Å:ùαe–²3Ê^V%ljC“aXƒá˜&Ò;ô¼Y‰ÜbyG&ÇÒ Z{òxr%Ô5=6MrWÌf%Ñu˜Wêêþܨ‚ª²„RDýz½e`Å+,"ýgÔ¹Š…9æ„U±°_k3¯m”£Ü5½Òb°³O¡ˆO]S¡†½DŽ„R›Ë¥©Êbƒ] E|ñ}j E*uï‹ó˜QjÍÛ"oD t5+^±©bîIø£Ëë[Ê *Ðë[ƒ{•+wUAüÇ`«šzV> ¢}¯ëDBŸ–ytÛ–Pþ.ÍÈr<ÅK\yeUqBy,ÅzÕÚ·ÚÖj¶ÝQþÓª=rleGõæÉ;äH’Ñ’6ÅüXIßg­²2îðóf%¬*®ˆ%_«W!I $ŒM‹[ó|æ“ç:î€ôl¹=ßÖ;‡wèÜáçõ†ç!å-´Ä!}“Ž6ìйÃÏÈyû˦í.½{x‡Îý…5iö ¶lwê͆zçÅM2˜¶ê†ïjgŽ$Ó½Ñð]íÎa|¤®¶£³J»óâ?ÏÔëõÄ9Ñnì\Õê ³£8@ø:å]ʬd¨GÇêjU[[«ÚºÓšëÔŽr9ÚíïëRßä¶B׌ ÅgìWãëT_çô±W™«øÊû]=Üyâ›ô¨µ§/aŠA…®yJVYätÆ7Êlžµ‡Çœ‚êìZ›Âê®UÙôÛ«»þˆºV2;íÓ±}mš>+ƒK5öÛó··*¾ó‹CÅKO'¬Åŧàcêmé[p"=[dÕZh@]Ád|ÌDÔuìõx)º‚ý:ÙP"ë~[‹Sñê_ƒjiõ/ø{g”Ù+HXev§ž7+÷…ñ±äkUo(:£Äš­¬òö 2 ¯`m¥ËõƒgÔø­œÉ¹Ì åË©“?ؤŷúÞ$϶ôÛÚs~kS’U51¨ðù‡dêû­*ÿñ²b7¿ÔÙž òr÷¿jRWßD®Êëw&¬ÎÔ™W©#°œ6Bê:T­3ƒ«=•"•O¯ ñêÄéÅV E5pæˆZº{ÕÛÛ«^¿Aæ¹>¸Íš4 IDAT‰æ•M-øˆyÕÒÒ;:ä,šUwkr¿šÛ•eŽÕí rWÏc¢ÔÚdê=qD§§+6•¨Ò5_ F9Ê‹âÃÁ×ub‘Õ1‘®&µ¬Uat©¦®0žŠwj_uÓÒ&¨§‡Å€š_©V[B¾äØ»_¥·íïW{g‰T¨p9 …µX3çL®€š·Ÿ _D óŒú“ñ)êÑéÞé59ÚÝàYÙ¾QË y ãßžiP³?º¼çÒ‰„€yv™½;õ¼Y k¡*¦¥õ«µ×—¾æÉSn¿ûÏM€{-}½*œ·O\XyÊ_d’@ð†ÏÌ }Ò׫lÛ˜üWn%ÑE¦Éœ~Kᇕ4zU-ƒê'ÌùÊI]‹FÌ®:­H˜å wêÀ®*5u/¹òêtõ.íë^ƒ3±«lo¼ÌVðÌ+:Ôš÷èˆ÷˜ö%¤Uîy&™­r¹§‚ay{§fù*¾m‰Ëä~5s[îZíZ„»{3J­}Ó“Ú¦’ ,0yk,Ø­òétoXûö©užIô¨¿Uûê»[ÃAm-?¨FwÂcÖwFÕ•ujî -ú·‘v5T¾¤ãÞø\ûutŽU9Q«Î&f9žÂe®6™]jÍ«ÖYiŽÑ#ÏœVß<¨¨¿UõÇ—_ª.v2‘þ¶xÈdr(7ܧ¾¾åüP`E+?Ìrí­PüÉÔ¯ãU¯¨y`)É^DÞ¦Wt a8vWÌZÝr§ž7+{6zâçÒŸ¾:*ãÁî]}nܯnÉÿþŠl}H΄RkÛV¹n†Ô›üMª <Ïëݿؒ°ØÁ 5;ôö3ßV†Í°õ)½½ïqÿÉ:µï¿êÜáçôÆKyrL½Gæj(RÙ¶‡tøÇÏëMwöÄïMV½úÅ¥âþæ»zÍm|?ƒvÖ«î4åïú¾Þ}i“ ¦‡âeÖfËÜ Š—ŠôvÃ;üœNy¶Ê‘Îݾ_¤®M3F9kš´¿0a=Ö¯3û^ÐsžZ56wÈ;P(•U$Ð@O»šªT²£Z'¼“1c·Nu/a‰Ûü¬îÕL'auî{AUíò&ÎGüêjªUeu[¼D–­Buîù§âs‹Jd›ý˼9çX ’¸_MüX÷òVm$ÃyÌ(µ6Å"w…c᥄Æ|í=˜pc^ÙµKuMê DF ¨ët½*wÑÄ|¹a kLZUrð¤j\ -»u|Ï•VÕ«©½Gþ€"Ѩ(ä·ã´ªËõÜK‡t6q…˜c·N¾æQîm•¿µ3^†MªXÁ ¾½Ôš7¡ÔšQyÅ aO¸Mµ¯œ–74ó<]Mz¥òˆú%,Ëy÷°ú‚wº>VT¯?þãp·ŽTïÑž=ËùW­×}+;Ocþ^­IèÃa¯Ž¿ôœÊk©¹Ã«@hrD ø5Ð×£ŽÓ ª*yNÕg±¼Ý:èɽkÏ›ú MG2áxøZP±ø>NÉtkææ—j™ãÛÑ¡¾A Ü\øOcÁÏÔ{s“<¶©)ôT9žÙ$ýá3ù¦ÿvL¾ß„Ûúˆ ¦ÓƒòØFÔùÛks~‘ڸѮÆR£:ÿßߨú~…·nש— Œlíõl“~û¡ŽývDJß ý5O˓ԑ¿WÕÿ’¹èi½ñÂSÛ‰n»tKoþJßyãò_ÞÎÒÎÝÏhofHGþ绪:ý±ÛþóÌ÷FR[»ÜÍh—§©Y¦ú=:П⎠öªíx¯Úùs“ëU|­Rù±ÙÕ¹òrQF»ªšÊ[yH½Ã’SÛ!U·ÒD`»}@ ôêÑ9J(l%*´œ™QzËätÍ9Ð'ö«9«Þ„7²®Í‡â®žÇD©µãÇÒ ›[ûâ5•ÌEûÕT1 =-ST÷™ê>3×Ñîo”íõ}3®kuã1_U¯½)Ë¡=:”0Ãý:Óß©3KhÂäªÑ±£Us‹¨O­Ý 'ëªÐŠ^Y‹åqÑ‘©ÜÀÛ"o¤D%“᜵¨Ve¦jœ™öžPõŽ2Xòd·Haÿ ÂS÷×Q£¦Ý]ª>°Ð§Ç ‹A“KrÂjÛS*¯#WŠZTÙÔ$Ïš/±ˆ)ì ßÃGœQùU'u*\•0¥`o‹Ž÷¶,­ ‹[GOÖνçÌzÞ¬„Õ¥Šiæíw©¢Äzïž›÷i‹UŽàÇjzÿ!U=¹^fÝÐÀûëlЬ¢­_ªó‰ÎÍaµ0¦¦grdøä²béÙ*ÿFª¼¿üR‘gâ‡Å‚ÔsÓ%ÏÖtuÿá¦,OlUþ• ê/ŽÍÓð uþò÷jùdLÒUõ gé­=&wÎEµŒJRš"=^虸†o<¦²ÌË:ô†OÅ­>Ô¾ôuüàQ9ÿéwòÞ\Z_¶lÓÞ.«þ¨O½£’Ñ¡_fËõ#»\¦‹Z“ÂY¸£R×¶¹\•6¾¥·Žî–k©‰Á¡‡ßTÇÉÉ ºÍN¹óV{åjj>ªŽÙk=昴¹u°ù¤*ó™‘4:TêšÙžÓmŸ{…Jâ~59ÎwìrÝåó˜QjM’ÍãQþ’0ËYwZ§^-^$<²É}°YGËlk¿q˜1Wåoé­×jTl[ÎS¾@eûßPûÉ*Í·5PÔתÎÄ,gg‘V¶>aV©5yÕ’¸ÇÙ¥ý'÷«pV'ÆÂƒòùâAŽÉU£S'«ä0.>~<å‰1¬AŸOƒƒ~EîH͵¨Â‘{ý˜3ËY׬·^«¹­y8)Ͻ_§ÞlÔ‚yÈxÞ¬p,¹*\3¯ p·ŠÌ÷ð¹ p¶>¡7k¿©º?Ý®Úmcòþ›_ÍÿvY±mùªûÓíjüÑ÷´ÛBÓã7åû]HÑmÉ‘.¬©0ý²Îg¥'7‡ÔöɘœÏäÈ$ƒŠŸÉVàýÏ4ÿöðuãAO,ø…|7²T¸qê\¢ò~_Md±™dú\} aKøÂç dd˱ŒWf[ެY¨éÿØ¡s‡'þõüèYeŒ—yCR»ñŒÊ-©ÕÉ’*ù{:Õz¶]=^¿‚ááé AƒÉ&»³Pî²r••8e1˜+wÃQY’Ùž;k‚ß(g}‡Þ­›úq‰ÄÜÕ7¿£Ê®Vµ¶wªËëSp8&É$Kž]»C.·GžÒ|™—x]»÷k·Å7q»ÜÎùþҪšWµ»7¨˜$ƒÅ¡ògÙ—q]wô<æzêîAž*Þ|cö#BÎÊczËݧ®³­:ÛÕ'0¬HÔ(s®]NW™<n¹&k˜Õ½õ®j&¯Ñ¸–㱨JÇÚ+èëRW{§:{ûå‡5<=CmÉf—ÓU¨’·Ü%‹ £³A]çÖä ­žfó,ð^ù5uËÛ|B§;ûäó*<,É`Qž³På;+¦ÇqÔQ¥W_ L|œ†9û#¿î”^³щ–^ùÂSŸ ‡¶ç‘½öM½»7>»óoUyó9•ßóGÝÄ8hêðÈßÓ¥®ÎNuzûäÏ *L69ò*(,VyY‰œÖ%ŽÄ5yÞ•ë®Ñ«¶‰ôËìÌ]öçÀZT£ý»;åŸøÀËQî’y9 $Éu¬Nº ÝÄ¿|mÎQÉ™½‰ŒQžïoVÓÿ¼¨ù¥Ä‚ŸÉ›þ”<¶tÞþ Ìþ]}£’}ÆQcøÍeéŇ”oÍ’ÇSë?\[ƹŽMò„c ß[û.ÉùTµÿ‰ü3ò¨[Š 1bîQ}ǘe/ò¨®È£ºeþ¥ÕY¢Rç|¯Î:fk/©T]Iå²ÏaÎÖòËU›¿Äk(ªTmѲZ_òuÝÙó˜)ÐÙ¬éC•*YA.£Õ©Ò*§J«;Ðx'}Êu–ªÒYªÊûò£j•«²A®ENÞ˜[¢ÊÊÅÛ*ª:¦¢ªµ+;þ^1Ë^T®ª¢r%^~TZƒ±·úçÙY®Jçj.Ï)O­óþ¿€ÕHÏVÉR*õØ=ý¢úç+UvsHmŸ¤êð3V…·¦Ë×14gð3|á‚úÒŸÒÞÒÙ‡>Ugh¡75«Ä–ªîO&ƒm‹1µ\™;À ‡ÍyPNÓ ‚“onÙú ro\“o¥Ñ"Áˆ"æõ²ŒŽL–Ù— [:úlTÇ~9¨á› ›d—J`^Q¿ZöYÊFêÀýˆ•#_%²d-á°¬¬EªšL¬º1~ë?«*'¢ÖOæI¥ŠolPÁö<5¾ôˆÌèì<Ðð'Ÿ¨st“¾èPñV³ œëèrèùH}Ë`b>ÖéK9jøßœ*ûƹœ}éQ9"C äÜÒéÌ'ÚZ­ÓO—* ­t €$wC‘I‹:#Q-¶Ýóð… ê»ñ Š‚ŸÊ;:ßQ7åýÍUÉaPë#‹œÚ%5þê¦<žBÕ™oÈÿÁyU·^TxÞ¦/ëÐßýVÏv5üèQ™GFäí9§=-o ìk:ó÷¿‘¥ŽÝ©Ú÷ÿN^VÃ`7"aýþµ—æ|•9ˆ u©~סø9ñG‘ªöä¸?÷;íøÝ]x£Ìl¹¶mÖÞ¢,õýãç‹”XVŽ0‹0©ø`“ªìô$2ääéàmнÿïªë£`îÂÄí*,°ÈßVL&å¹Üª¬Ù+“½r`¶ØÅô–vì…ßë¹ÿ‹>ÃÊæ ÎìTíéÕÒ$Tº yæ$1€$F˜«”’’"ÓVd||Liiió¾N˜«dÙ­[±:ÀŠŒÅFµÑœ5ïë„9°J?Ýó]ßÕXtDããct€%›xnÜÕO÷|wÞãRÆÇYû«õÛOÂúÉ©_ëJdD·nÝ¢C,*--MÍYúéžïê[Û,óG˜Ä(³Äs’a@#ÌHb„9IŒ0 ‰æ$1€$F˜Äs’XújhÒù¡¥7ñ•·='SÛs²´3/‡ÎÜ)ãããã+ýãzïgút8F/âkç“A®‡èÀ·â2k­þ+9øÚút8¦Vÿ:pÇ­8Ìñ†¯Ó{øZ£´ ànXq˜Ãª|Ý}x•0pç¥ÒÉ‹0 ‰æ$1€$–~·Þ¦ôÙª?_'ilX‡}IçÇ^N1joQ®žM—4:¤ŸüÛ—Üv†ÊþËÃú³LI×ô—Þa]ówk,䆢ô˜$iL¿ÿ‚~zel‰œªoÿIžjÖ¯äz—Ówïï7lX¯ÖteŒÅôÏþaÇ×®«ïdÛ$»tº`e¬Öõ“AŽ$¥jûÙZw庮-{#Eë6­WùÃ’FuþÓaoÝmüsVØm®‡3~cØ´^ÛÓ®Ë{Ï‚†›z>MOÑXl+‘Vû÷àNHú0gÃÆÚcÏÖöõÊÖ-]º¦ö¯èW‘±µ—‘‘¥ÒÇrôlŽA¹†T]êÓ¡ˆþᣈþc©ALV¶v¬›øÏK¡Qm°fÊ ,íØ”*ï¥ÛÏk݆ Úû¨YO®ÏÐÑQy?ÒG³w+JÉÔ_~צÂTéÚõ³!“~h_§<øC×Ô÷”­=çȵ>CÙ7oèüÅË:ùך¼•ß~Â6³LZŠA{¾ýž7HúBõ£^|$[ÛMéR,*ï§aú,:¹šhŽ¿—¤”t=™»Q;ÎÒ#™i2è–††£zïÓ+j»Óu¥éû®Gô²iêB2õWßݦ€ï‚þúbjÂû®œ®>±QOŽ~¡êßèFJ†\öÚ¹%Sy†4Icºv=ª÷þxE¿ Fn;xsé÷sF?Ìq<Iìî‡9©éúO›²”‘˜y¤fèÙá†RôÈV›M\“¦rÖëåo­Óöþ€þGxyË`Ömؤ†onPnÂï²3ھŨC›³õósŸëW#‹oÈbÛbÖ’¤¨Ú>¾¢'sl*L—¶?œ¥ —®ÍXÕ²áÍúÛ'²•=ù³!3SÏ:¶èÛ ´Ÿ½y‹lŽÿœ›³^ÕOgéÅÔ åLß¹ møAýuìúë Kˆ#ÖoRCNº S?Œ*|l‹ÖÅþ¨Ÿ^š¯Sõäã6ýõæô÷ Ç´N;žX§í¦† 7º®AÃ:å$iL/Gõþ蘤„›šiÒ_}3[y©’F'Úùö6ÕXÓf¼_öº,=ïÈÒc©ÔÏn-Ðö ïçmç@r»+s2õg[?ÌhVõd3tñs5ø®ëª!K/>¹E;Ö¥«ðñMúÕ{—t~©yNŠA;Ÿ˜šøé_>©mhLlÞ¨¿|,[9©Yzùñly7¼p‰±ƒžß’1ñß_~©÷G¢ ]¾¥ÂÍiÒúõz2ãšþu*[IËÒžÇ'ƒœ±Q½ýáeýËhºž}̪ëSx“[:÷Ñ%µ§ªðÑÉcS3”ÖÏ?üR!ƒI?||½r%ånÉ’õÂÉÕ9 HMW0pI¿¼xC2mÐ^G¶r”ª§ÉÒ†Kó\sÆ:½8ä\ûâ þhDWÓ ú¶ãAýyNªòìµ=ð¹Þÿ/tiì!ýô‘ I1ýòýÏ'ÊÍ¥$ÞölåÝŒê÷¡˜BC7¥,“^œ r.]üB'>ÕÕT£Ê Ôó™RÞÃëdûìêm¯ð~Î>’\Ò–Y³n2+OÒÄê—ë KŠŽè—¾kúþ7³eHÏÒ÷M):¿ÄÍ]2Ö™õíÉe)—>ýB¯_šH\BŸ…ô?ÖgêÀæ4i½YOf ÇØEÚù(0¢«×õ?^×µÍfe+SÏoJÓ¿~>‘0e¬7ëÉÉÌæ#ßúÅ¥[’¢úEŠòŠÐöùÞä˰^ÿlD×%ýfíx2K’tÞÖ¯®ŒIº¡¶ÜõªY/)5MKé€ë—õßÿ0<úD.«íál½¼NRz†ÖIóXñ4&{}¶žÌ¹%ïåQuôôѺTIã -5L»®ÿþ›ÏåºFtªÿseh\¡o¥hCvŠ2¦2®Ôte¤H_ƒûysó ÉÝý0glX‡}Iç'é÷4™ø…6¬Ÿ*¿eÔËEÛôòm ¥)73UZj˜“9U¢ì–·fÌîkð‹Òæ4IézÌ¢½1_©µ=òpöd;£zûòD’qc8"ïM³žM—{x¬ŸG’´a]ÆdY³˜z‡R£:w]Ú¾nîw‰ÞšÞÇåÆtšqK—bñóZv‹%tÕ˜®.eQÊëjûâ¦þjsº”™­?{"[&éÚõ½ŠèíO¯-µû¥áaO<é[1½?”¢ï=²^/Û­úO¦„pk}?o.p$¹¤]™ßneL¡è¡Á¸˪’•²úsJ1jÇô/™ª)Ú¦šÙǘÌzÒѯ¢_…áqKÞóÔÙz~K¶\ÖuÊM—²×e©ð‘,æëoß»¤÷—²:gllf•¶N?þöƒz:]’nèüÅ«:74*å>¨?_ïçìó É%i˜3®«Ã·&WWÄÔÖQïM)i²­KS†Æuýú-%¤> º1Ó2•£4m·¦K‘©)ýT=¶yªPÙ-}Ÿ·u9ëåZ´ÇŒÚaMׯ>»©«×o*&ƒ 2¨0'M“å×”aÔÓë’pdddÈfH‘nŽª}`X¿Öeeé{v«þ|sº”nRéúÞ¿²ü¶­›s&ƒœ˜þá7Ÿéìˆ$¥é{ë®ÝOîI»2'º®Kô€2õâcÙüèºB©}Ïñ ^¶¦Ic#:ñÞE…–¸ÌâÆõˆÞ‹­×ƒôÀ#›µ÷zHmCcʵnÒ_nž\móå—zÞöRõØÃYÓeÓÞþà²ÞO\”š¡Ò',z*UÊÍÍ–õ³« }ù¥Þ[§§S¥Ç›õñ+ú—Xšž}Ô:ÿ~9Id]ŽUOdJÓù¿Ðÿs1ªÐÍ› ß’6§Kº¥ëcÒÌmRe5HY¤ñÔ”é!øÔ¦LyC·”cݤšf8wÛ˺Ÿ)|Ð÷¯ä-³6rU¯Öé@®AlÙ¬ŸnI|ñ–ÎùBzo9õ²ÆcjûઞüæåÊ gÏÕ³‰¯ßÑÏ?\`˜´L•nš\ôåUµ_™uì¨n„6ê©Í©Ò:³¾uUgGFô‹®ëIÇ:R3µã ›vÜGƒãêå+úçQ›žÏLÕöG·¨ñÑY|9¤¶/'–ë÷$eH2èÏŸÙ¦g}tàâmè’ z@©Úþ˜M?}lÖ©)šZ_3gÛÁUÞOî©É{jc:ÿ‡€~òÁUý~ø†®IÒØ-†¾ÔÏû™~öùÍe·xýêexï¢ÚC£ ÄÆ$I×F£:1¤ú÷.êW#ó—äÚ°i½žšüï#sîá3xqD1IR†žß2E„‚Ÿë¯ÞÒ¹/o(&)‹ª÷£‹úùð}0:nêÔ¹€Nþñºc·&¯Mº‹ê÷üBõï©àd—] …ôóPlò˜›º¹py³×®èpÿU¼×GôÏtðÓÉ„.}ÊsRl{5÷€ûEÊøøøŠf¼Øý ½‡¯½_o£wT*]¼s’a@#ÌHb„9IŒ0 ‰­8Ìy$Û@ïákíñ ™tàŽ[q˜ã²®£÷ðµ¶=‡0pç­8ÌñØ7²:_[dä±o¤#w\Êøøøøjhõ_Ñù¡Q}xu”ÞÄWÞã2µ='“ p׬:ÌÀ“J$/€$F˜Äs’a@#ÌHb„9IŒ0 ‰æ$1€$F˜Äs’Xú•+WèÀ“‘‘¡7nÐøÿ6,bãÆsþ>e|||œîHN”YHb„9IŒ0 ‰æ$1€$F˜Äs’a@#ÌHb„9IŒ0 ‰æ$1€$F˜Äs’a@#ÌHb„9IŒ0 ‰æõñÇÓ À=B˜øÿÙ»÷èªÊCßû_I²b0K ‘…H1T4ˆ%ÞØ¢à á­èB½`« <ão {lÁnÚâe£v_‰G/Äޏ£Ø–@1AI²0°!+ ¾î„„‹d¡ßÏd­9ç3Ÿù̹æüåyI’$IQÌ0G’$I’$I’$)ŠæH’$I’$I’$E1ÃI’$I’$I’¤(f˜#I’$I’$I’Å s$I’$I’$I’¢˜aŽ$I’$I’$IR3Ì‘$I’$I’$IŠb†9’$I’$I’$IQÌ0G’$I’$I’$)ŠæH’$I’$I’$E1ÃI’$I’$I’¤(f˜#I’$I’$I’Å s$I’$I’$I’¢˜aŽ$I’$I’$IR‹mÉW¬_ǘü/)&Èݹ½™Ð#þ”Ö‘$I’$I’$Iú¡j¹ž9µ•<›ÿ%Å{½a^Íÿœ¢ÚSXç *f>óƒ–V³¤fó'äL\ÅÒjO¸$I’$I’$I:·ÄFSeB_lfôâM¬ªÜG )…‡_â’$I’$I’$I?j-×3'.‰'s;’y>p~;oˆç…yŬªÜ@¤²‚Yó6‘|áuîÎíNVœ'M’$I’$I’$ýx´PÏœZVþçJ¦loÀ›zGÚÞM,9f½0+Éäám¨ªÛMá²ô·,üs{‚§¼ïzJ>YÏä¥å¬­ÚG ©¹ƒ¯`lfÃ\<Õ•,È_Ǽ´uÙ” IDATaBuz^Ù•ñƒ;Ñ-¨.gÄ¿n&÷þ V-þœ =~FþÀ„—'I’$I’$I’tZ&Ì©ÝÍ’Õ„öV³ð­¯ ÷ç4²nÕæ|Añו[)©mÊ=tjÊ‹ÿ ®`ö¥­([ýw¦Ì/¢ïÿìMNB5ùóVóBlg&?EòÞ,\¼ž‘óãx}D)u»y!3Y}º3¶GBåyI’$I’$I’¤ÓÓb=sB{¦0¶3™ì>Ú$'v ko„ðéì:¼›Plc¯ºˆì d§%’þÓjÒb¡¦|3/loGÞ¸n AÌ…dÞ·›ÂÙ%†Ó °`Noò®ÝŸÔÔ7^ž$I’$I’$IÒéj™È!.‘;»(ü<±m¸;ç"ÒÏ%ã¾KÉ_ZʪÊ}’R:°#éßîâ±.dùÊ/Y[ÉÝ;’qóæÄ_҅ܤՌû×÷èÙý"úý4ÝÛ‘å•„ö†ó»wŽÚ*â½00 @v—@³Ê“$I’$I’$I:]-Ô$A¿¸‰A@Mù†Í*æUdg]Âý}Z)ßÉ’¿~F€ ¸ÿ±[˜›sÂR›šG' ¡cs C7ocùçßPðæjf-Nåé'®"»H¼„v!㈖iE°-P ÄÆ{X=NPÞÀ ˜$I’$I’$I:=­Zv÷µ¬ZZJéÁ× ‹J™Wð ‹v49»Y¸´¢‰áÕâÉh å_ì ìˆ÷ë)þ¼’Hâ…$ÇBEñòVì$Ø%awôbqwì6æ}QC0íB«v:?ô¶û¿’Ã[˜úf9¡ÚãïõDåI’~È”,Ïgú„QäìGNïÞôîÝ›œ~ƒ6b4c'ÏdiQ'ümPSÈØœýÛõ›\täºáåŒh(sÐÌü­"I’$I’ôãÕ²3»Ôîfeù¾f­ù²‚’Ú‹Èjtø²8úÞq)g­gäÜjëÓŽôØ:6ü­„YŸÖÑ7·+Yqf7K ¶Ru~C;Å*.aEU€¾I±Äwº”)0å¥"¸ãÒ÷~ÃÜ7¿ ¸ÇÏH‹êŽÝkü Ê“$ý0…‹0y³¬(?Î﫪rŠ×–S¼v+–Ì#¹ï“LËF–½5%I’$I’tŠZ8q¨¥´ª™«îÝÝDψOëÆÜQ Lë ¦Ïÿ‚*Z‘œÒŽ¡Ãsx¸G<ÁÌË™vCSß*¤ ‰mÛ‡ñb€DF<Øò×1}ÞVªbô¼ê fßž´ˆ¶ã8qy’¤šŠå“9n ‡rœD2ûö£gF2A”—”RR\HqC÷ÒЪg9¢œ9sÇþ ²¹Üõl)ÉÓï,``Š×ˆ$I’$IÒ™ÖÂaN ɱ·Ç˱5 4¨.Ø©“ét‚5âÉØ›76V@;FŒ¸žÇ[–ÆÜ)i'Wž$飦d.c92ïžDÞØdó ª†’å/0}êü¹Ù)‡•SCÑ„Œ,8|â»b&ÞÚ›‰@ ïlþ÷ÌìCë×”±2ÿQ\RJ¨ ‰i¤ed’3ôaØ ;I’$I’$5Î0G’¤¦T¬"¿¸áûÎCqÛ¦ ÿáÔÄǟѹojÊÞ`ʨ)”ù~$TNñªWyvÕ«ÌÊ~Œ9ÓFÐí„iI„²¥5±€#Šª*§´p ÏŽZ»g°`BÎI‡.ᙌ=µ‘£öXUNéÚrJ'®`á w3{î²Mt$I’$I’ŽË0G’¤&Ô/§¤áûäìl’O¶€3âP±” æ°¢¡sLbÏ ê—MÏ4(_[HÁWA¤pÃG„™¿`4Ý©D¸h£–PNgÜ?Œs2I©)cCÁ4Y0›û%S°0U…–CVÆqÖKÀО”’B'_Ï@0¨JX²ªŒAƒÒY'cØtæó“$I’$I:ÃI’šp(”¨"Ôâ½G”,/m¨X™ **_;>3ýILˆ¢P d'ŽÊÈ>îÛ ;9ÅzÆ“1àF’¾Jˆ…SîbPÁÝ ½s 99Ùd8œš$I’$IR³æH’tBñ$g$s kJEyHoÁúÔ:ÐK&²Š‰wÝÚÌí"„Â8^ߢ`ïcð¸ø¬±Ìx²œ1Ï®"”¯z•gW½Ê³@ 9“ì¾}0hý²30Û‘$I’$IjœsæH’Ô„`f& SÏP¾¼„ðImfù¨Þôîݛ޽û1¹èt»öDŸb‘šãoøý O·a3yýõÙŒz#™É‡Õ%T̪%ó˜2êþiàhæVx¡I’$I’$5ž9’$5!>cY%¬Š@¤0Ÿ¢p9ÍíJRSÂò ^dÐ7ítƒ“ÁE$eþëcéåí—žMîØlrÇB¸¬ˆÂÂBV._ΪUk)¡UÌ5ÍaDF¼œ$I’$IÒQì™#IRS‚Y í×Ð7'²‚ Êš½iÍÚ|–W5¼è<€¬”Ó® é ƒ¢…KkM™žE¿A#˜0}.o¬|‡Ù÷g6,)æ…™k©ñj“$I’$I:†aŽ$IM ’óð:7¼Z;} ùÍÊsÊX2s ³œÜ~g`¶x2ol@"E,Y{¢AßÂæ cÐÀ –GÑÙLJj60sÔ0rss1yy#CÓ¥ýðxÈÉÊOv;I’$I’¤ÃI’š##— w§íÿ>RÈÔ‘cy£äDéH˜Â™ã˜º¶áe⌔~FªÌAß@“gRØHRSô“_-¦<¢<˜ÃYÁ,>ÊŠ)--emA>N‰.#t í &ã k’$I’$IÇ2Ì‘$©Y‚dÉ“=^†V0åž»•—Ïò ‡« —±aù&ĨyÅ ï&rãøñÍŸg§Éªôeìà ½sÊ_eÔ° äU6DY˜’¥Ó9j!å¤1ôɾ¿×ö S^uøë4ôMÞÿmdÆäñƆ#S§ð†¥ä™HaÃëì»{~Ïu”$I’$I:7ÅÚ’$5S|ÃfÎq£y¶° QøêT _z‚é;~.ySÎdEÈ1IEز¢ Ê ˜:²€©D’ƒU9¸n€žOÎä±nßOŸ—@ð@¹åÌ6‚Ì4‚Yã™1¶ÝÏãXQ‘âW™2üU¦ 99HM8DUä°rúNbÒm#I’$I’¤{æH’t2‚Y ›ýs&ÝMvò‰WMξ›Ióß`fnÆ÷0|X:ƒ¦/böc7’và­H¡Ã‚œ@ç<9{³‡e|o×¥ô{Œ;´C$DñÚµ•TXHÞ‚i í™xØB¡Ã‚œÄL<9›×§ "Ý«K’$I’$é¸Îûî»ï¾³$I'²yófºtébCG¸¬ˆÂÂbÊBaBa&INÏ$;;‹ô³5fXM Y[RNY$@zZ™ôì–rvæ ©)£pù*ŠŠÃžLFf?úeZekKJ(+/'LK'-=ƒ¬¬ ‡V“$I’$Ij‚aŽ$©I†9’$I’$IRËq˜5I’$I’$I’¤(f˜#I’$I’$I’Å s$I’$I’$I’¢˜aŽ$I’$I’$IR3Ì‘$I’$I’$IŠb†9’$I’$I’$IQÌ0G’$I’$I’$)ŠæH’$I’$I’$E1ÃI’$I’$I’¤(f˜#I’$I’$I’Å s$I’$I’$I’¢˜aŽ$I’$I’$IRkù0§¶Š¥‹VÑoâ;ôžøÿ1lÑVJj›Ú¨Š™Ï¼Ã ¥UÇ,©Ùü 9W±´ºe§fKýþŸO(¬mÖÁSøÑfÞØ^ß¼ÂÃ[6é}ò¿Âå ›ô>s¿õ"–$I’$I’$釬…ÜZ ¯fâ§;ÙËÔQüi£ï ü£hþVþŸMä—ïkÞê±rgÎ%džï…+I’$I’$IÒEl‹î½6Ì‚¢È1o‡ŠJ(ÜŽì8OÐ’60iÿ÷a›C’NF]]ß~û-µµµìÛ·Ï‘$I’$I­Zµ"..޶mÛµõŒýaŸ†zJ>YÏä¥å¬­ÚG ©¹ƒ¯`lfüþÅÕ•,È_ǼaBuz^Ù•ñƒ;Ñ-¨.gÄ¿n&÷þ V-þœ =~FþÀÄcö.ßÂÔE›XþuÁ©<|íQÝGsŸù€y•À_—ѯøg,½'‰ÈÁò"Dˆ¥s÷.LÎíBVÞʰi›É}âzrcOâ8%éG®®®Ž¯¿þšøøxâãýÙ(I’$I’¤Cêëëùúë¯éСCÔ:-[«¸ ò¬øôÈÞ9ÉYdž^95åÅŒÎÿ†ŒW0ûÒV”­þ;SæÑ÷ö&'¡šüy«y!¶3“È"yï.^ÏÈùq¼>"€ºÝ¼¿™¬>ÝÛ#áØ„¿aŸÖSti&yw´#P¾™©ùÛ¨ŠMmXáÄûñÄu„ÿ}%…odîOã¡¶’©/­§ðÒÿFÞI÷î`A~1ãÞKáõ;.$þ”ŽÓ¢$íØ±ƒóÏ?ŸØØXZµjÅyçg£H’$I’$‰ï¾ûŽV­öÏH³cÇRSS£²ž-æ„Ë+ØÖ…Çê¶2·(L±dfuáδ]¬Üd`§ÓLt» Å&1öª‹ÈBvZ"é?­&-jÊ7óÂöväëÖx\Hæ}»)œ]Ba8±ûæô&ïÚã'"e+fUlGæ ïBVÐå ò*V0ò“ýË›ÜGð@I­žŽ¾7e‘{UÇý=qøÛfF}[wÊÇ)I‚H$B0$&&æà/gI’$I’$ 8ø¼¨ºº:jëØbûk¶¬ãžÙ_HlÃ}:“N5Eë‹y¶`3…ÜÈ„.1§¼øKº›´šqÿú=»_D¿Ÿ¦1 {;Òã ¢¼’ÐÞ0c~÷ÎQ[%P¼ö¨ »K ‘Òë)ÿ¢šÀ%ÿŒƒ™S ™Ý/$Ðæ„›ÚGð¨·ãØ'†¢/¶²à‹J ¿¬`ÕuÐýÔS’´ßyçg#I’$I’¤c´jÕŠ˜˜˜¨žg¹…œZV49U;Y±zçQëDxõ½mŒî’Fð8%›ØC<@B;Æþæ†nÞÆòÏ¿¡àÍÕÌZœÊÓO\Ev-x 3ìBƭЊ`[ ˆ!96ætóÄû8Zx;“ÿTHAl w^•FîÉýp5ö6±ŸçÀ DIZM’$I’$IŠögG-ó'ʵ»Y^ÞŒõÊ+(©=Þ‚x2ÚBù;(;âýzŠ?¯$’x!ɱPQ¼¼; vIcؽ˜;îgÜ»y_ÔL»Äª]„ÎO ½íþ¯äð¦¾YN¨¶9CÚ¥ D¾üú°:ÖSüù.Ìt²û±‰%{;2û±ÞL¸±#9i ÄïÝG¤‰šœè8%I’$I’$IÒ¹­Åzæ„ö6cµ½Õ„» ޾w\JçYë9·šÇú´#=¶Ž +aÖ§uôÍíJV„ÙÍ’‚­TŸÅÐN1„ŠKXQ oR,ñ.eDÊLy©ô½ß0÷Í/(îñ3Ò›¦«—þÓ.d1zþL¾©/K˜úÉ¡è¥É}Aöþv7ÕIHÜ[IÁÆ]$_ÒŠ’¿3åó:"—TªmGz#õˆ?ÁqJ’$I’$I’¤s[ =í#x>ÐT s~ ÑáÔâÓº1wTÓßú‚éó¿ ŠV$§´cèðî@0ór¦ÝPÄÔ· )¨ƒ@bäöa|§ ‘öüuLŸ·•ªØ=¯º‚Ù·'í¢­9‚™ñH=SmbÂìb‚:ðððLüµ²a…¦ö‘@öOÛ0·àÿ2²2‡Eƒ»3¹Ï'L¿’…± ô¼*“iÃã˜ü×õŒ[ÝŽ?m¤'ͽ÷ø¡1Ì‘$é$íÚµ‹¶mÛrá…FE}âããT‰"ýÈîšN¸8´#ļü2ÞʶmÛHOO'55µEªHOO8XfI’$Iç¾–‘ätî=~h¼‹’$é$íÝ»—öíÛGÏ/óØXŒJ?Ô›¦ÚZª«÷wù¼üòÁ﫪ª¸ôÒK[¼Î)))lذÁŸY’$I’ZôÞ㇦•§\’¤“³oß>ZµòW¨¤èR__OLLL‹×#œõùz$I’$ýøüØî=|%I’$I’$I’Å s$I’$I’$I’¢Øi V]WWGEE‘H$ê&A’$9‰‰‰6‚$I’$I’ÔBN9Ì©««ã«¯¾¢mÛ¶¤¤¤8‰©$I’$I’$IÒ÷à”˜ŠŠ Ú¶mK›6mlEI’$I’$I’¤ïÉ)Ï™³wï^‚Á -(IÒi‡Ãäçç³k×.CR˨XÉÌ ÓY^aSH’$IR´:åž9ûöí£U«V¶ $I§(óòË/³}ûv¶lÙ¨Q£hݺuËVjÛ›<5¥ŒGÿÃÞleù‹Ï3åFö´îÌÕßà×ý:ð4Jç¶Š•L>†%! 0Ä´ùyôK‰ÂzÖ…ùríJV}E¨º‰¤^’EŸ¾Y¤·ÄÍš^ûËJ2r‡Ñ+ÉËH’$I:áŸËV’ÿÂ<./¤¼ HL#»_.÷?<”œôx¨™Lc$Ij‡9°¿Çk]]]ËVjw /¾Bi䘬y~"Ϝħ&ñÔ½©¬{~"Ï­Þ퉔Îu‘¡pÃ÷¡Æ Ÿ…=têøfÕk¼]XEjöß=˜;ûe¬XÅ’7>¢¢ÎÓ(I’$E«Š•y »k Ï.irªÊ)\2‹1wÝÃd‡h6ÃI’⣃œÄÄD|ðA.¼ðªQ„’¹òó‘ÿƒ—>ÛsìâÝkxme-W?ñkîèu9½<Î9ðñâ©ôtJç¶ôAL[0žìÝì¢1Ð©ÛÆšâj’¯»ë{\ÂE)‘ž‘EÿÛ¯#yçç|2Í‘$I’¢RY>ãÆ¼J)Ü÷1f,z‡ÿëCþ÷¢<Ö7(gɸq,(³©š#Ö&$éìi,Èiß¾} Ö*@úIüþ–Zvü ¿}óÈ¥‘­k(!ƒ‡.»ààú9Ä=÷1[#ýHr¬5霟‘ËŒ0fØT #4:DÕkõ@]u„:Zº þ„þw&Q—ÔðNÍ7-ÿ€5_…¨®O 53›ë®ëAÊÅëù`E!%¡jê Цs/úõëÅEñ@Í&^ûËgt¿­'_½¿ŠŠŒ!ÜwM„KX¹|%ÅåUÔ'¤ò“>ý¸®[ÒÁ:ì©\ϲe…ü#TM ÍOè;ðFº%y‹%I’$A˜ÂY3Y ú>Íü™I9x’È™óI}W­eÖ¬Båe´ÑNÈž9’$­ÿÆDe³_ )•Ž;Ò±ýÇ,«­,cO\{’â½—Ôž¸ÚmTîñ¼JgÃÂÿü+¶I:æëLÙèDiØdze&°sõÿË_ò—ñц/©ØSÄ“”žNJüþÅõo/¡0r1×ßy7ƒoëE°ìlb@Ý7¬Zòe‰½èç`îЋ¤òÕVp°_O}%…Ë×@·¾ätK„ºoxÿµþ“EÿÁws[v/W¼ÆŠ/kÖ¯bíû%¤öÄÏßÈOø+ÞÿŠ/WI’$ jJxceÆÐ±‡‚œCR8v(i@d唸é&æH’t–,Y²ä`pß}÷EEÓ”ÚÚ´¾€#bžÀÄΚ#Cÿù>fÏž}Ä{G¿>]ñ¹L›9€Äo„ 7n)-ŸçÄ“~ýϹ{@2*)^ñ6¯þå?xyÁ¼¿©’: ®b …•iôp ¥pÑ%YÜØ¿;¯ÖR¶ggßÈ€~Yd¤_DzFOz] >|’°zâ³n§¯n\’KÍW«)®ïL¿þY\rQ é=®£ÏTêÛ&µO?².I"é¢nd÷J†p%Õ^®’$In˜#'™¬äFVIÎ" ªœ° Ö$Ç$é,¹å–[(--%Þÿ_”×_x€`0º;ÇÅ`Ïî#ƒ›ÈnjGX“Ξ¡ÿ|£FböìÙ ýçû˜5kÖ™ÛAÅr¦O(àÀœ¤²yrr?¢c¤µxR2zÑ/£PGø›PTXÈÚ÷òÙû ®¯ÙFu$ÄÛó^8j»DBèÚ:‰®Ýcø¦|EeÛ(Ûö%_•G óáë&––Ðð}á²Jêƒ}HŽ?T‡ôœÛI¨  ¤&ú)CŒ—©$I’Ô HZ"P¢(ýŽ÷è#TD 1Í!ÖšÁ0G’¤³$%%…x€—_~™p8ÌöíÛy饗xðÁ£:ЉKJ§um•‡¥7µ{*©K¥}kÏ«t6tü{ÆT,gòðq, 5¼dóä‚ ˈoñc®«XòBÈîß«aþ›X‚u#çöKHÎÿ ¬ßF]ÐÛõ"éˆD%†@Øó%Ë_{›Ä\Lf·ŸÐ£o=Ö¾Á²Ã‡rˆ‰¡uìa·Gõûßk4 9z}I’$I‡Äg0('‘%å,œ¾”¡3j­‚¥ÓR²·QÏaÖ$I:‹Ú·oÏ<@bâþŒ***x饗öÖ‰FŽ½È „•ô͉°õÃÔf\MG»æHgÝ)Ȉ…PiŸ‡êŽZROuÄÄ$'¨±'$Üÿ•°g=ï¯üÕuPSVHq$“;soçú^ݸ$%‘˜šzêß+­Ó‚PYÊ¡ÝÖQ¶l –C—¡$I’Ô„ Ù¦'Y5‘á£ç²²$L 5„KV2wôp&®ŠÉÜ9"Ûž9Í`˜#IÒYÖ¾}{|ðÁc={öDg…/èŽ7¶æãçòañVJ>œÇs+ çÞ«IòtJç¶Š•Qä”IŸ‹#|¾8Ÿek6Pòee%øhé¬Þ™L¯ìd悔ÚlcÅËÙðå7”múˆ‚‚ϵN%1bZ D¾á_UÞSÉ—EËXV¡¾º’êF’™Ö—ôá'üƒeËŠøò› Ê6¬`ù?"\”™äð’$IRs¤ç2mÆÝtB«f1æžâÚÞ×òO÷ŒaÖª7!!^0•å6WS s$IjG:{÷.ZÿÖû.h2¿îQÆÜ)¿aâÜb.ûõÓüº×žHé\ :Ð10ƒZÓuÀÏpEá «Yöö–,[Å?"é\7øNz%ÅIôt'}‚ß°êíÅ,YQL$ã&õ½ˆX 6½/ýºÇó‚WY¸ð- +€™´ }@Áç•Çßm|:7¹‰Kª×P°øU–¬ªä¢ëîäºtÇ$I’š+%g ^ŸÁcz|] IDATC$w&ûÎ'™1gw¦åK7r²NÎûî»ï¾;• 7oÞL—.]ÎÌ=äÖYðâÞ]¿ZZ“~E?î1ŒkOeì–Ýżùâ<Þ]WBÙÎZZ·¿Œ^·ßÏCwdr@å‡<õè+\ûûgH €§}‹[~ÿï H=Ý£ØÍº‚wÙ~ùíôsÌIŠ*_}õmÚ´!&æÌLM½uëV.½ôÒ3RÖöíÛY¼x1wÝu©©'ÿËè³Ï>ãŠ+® Öy¤¤ºÚZª«ßsoÖ¬Y x+ÙÙÙ'½š’|&L^IÎäÿ"¯­)egm.»ñ^zhÀþòv¯fâïóÔ-”¼²˜•·—žÃˆ§~M¿ŽÛyíÑß°x;ðÜHF¬ù/<šÁöå/òüü•lÜYK\ûÜòÐŒèåTÑ’$I’$I’$©ùZp˜µ[W¾ËºfJwâÒ¶}ÌVÒ¹úxc¦]Áµwôãòæ(Û(È›Â+»{ñФãw†Ð~ýKL|æCN‰Z[Ê+/~LÇ{'ðûߣ+yþÅÙMG†üþ÷ nÇe¿ÀÜG3¡dyÏLë;gÒï&ðPJÞzæ¬ÙíE'I’$I’$I’š¯ÅzæT.†ÿñüg4;ËÙó1/¾ø!O‘’ż²µOüa8½.È ãñ2ýí[¬«¼–k²¤Ž÷>Ê^I@G†Ü{o-(¡’k¹à`V¬ÜJeÜeÜ߯Ïþ)cí¯ÝNû8/:I’$I’$I’Ô|-æDJxmþI9ì¡tÅsL$‰?ÌÚ‰tïÞÝ“$I’$I§ •M I’$I’$I’½ s$I’$I’$I’¢˜aŽ$I’$I’$IR3Ì‘$I’$I’Ê_á—?ŸÆÆš£Þ¯)åí¼Gró Ü<ä—L~»”šh©sh¿¼ùÌ/óéâù¼]ZÝíZÌ/oþ‹ËÏõ æL´÷Qe´hÛDÙõsº×v4nφ9’$I’$I’¢Ox#‹§ÏaSä˜|4õWLý ß~ާGv`ÍÔ_1åýpÄ>š?‡ÅÇDt tå¶{Ó5ñ\¿hÎD{UF‹¶M4_?'[·sésbmI’$I’$IÑ£†3þ…}½ÿe»£‡W3ÿ½×=3ž{¯ =˜ôéçñùºþ6’mÀ“¼œ{¹Üv°m¾?~nO›=s$I’$I’$E‘x: Ž?ÿùÏüqT§c–ÖlùˆMt¥àÁõ»öïJ`Óûl9Þ˜Máe í_T¾˜_ÜüK‡í"´ø—ÜüËńިq)óþ/,ø:Âú)wp{Þ:jNTî1õ~ŸGnþ%¯¼?Ÿq¿¸n¸_L^Fié2òÂÍ7ÜÀí¿ÈcÙaÃ…7.fò/÷/»á†ÛùÅ„ù¬kèøz·ß<ŽevW¾˜GnBÞ§a½}h(±“ÝoSíq ÇqbµáñÚûÄmrìµ±êØ2Ž×6-&7Ô}òCÕ<®›òÈ4–-›ÌŸÏ8v¨À&ÏÙñ'z¯m(åÜpÃ>:αžôçVÇ0Ì‘$I’$I’Uâ“Óèܹ3:;¶UdǪh8ô^ ]‘¯ÙQÕH‘-Ì™:nÍèÛ:å,~êqæTõaìs/óÇg†ÓaÍt~5q! fãlžšú‰÷Nâ¹?>ÃØ^;X4q*ÔˆPþç?3¬C€“þoM¸N¶ÜÈ&fÏ.å¶I/óç§o"òÞþåù$†?¿<ž>;Þaúœ†‡ü5ë˜ùøtÖtΤçþÈsO§ÓšÙLœ³‘ ùú±Œî±†é3?"LˆeÓg²åºñŒ¾2xzûmŽ3X^ãçæØöŽo¢M޽6®:¶ŒãËœéïÓyä3üùÏOs+ï1uú„j>eú¯¦°ºÝpžþãsŒï¿ƒ™SßcG£s¢úunº.Qtmlj]sÏ=ýép¼jžÊçVGp˜5I’$I’$IçŒH$‰‰ó ?Žxï3L¾7 €šó™³¥“þú×.£ë¤RîûÕ+¬ õçº[ØèÁè[¯çÊd k':ôÿš“¬ìÁ§ï žt¹úŒMÿË‚pÙ½ îô:¯ôϨë/#žNÜ{ÓLÞÛ´ƒO"׌Ïà[oãò @WËæóø×Z%™ÛÆfñ¿Leꌮ¬Y߇ñ½†àiï·9Î`y'jãۻÉ69öÚ8¼Îé4r<ïI:3|dÍÞÈúù`6ïq+ÏLº—+ãËÇ3þÓÿÎSë+©‰úÅ7]—¨¹¶à•÷2æÊ3ù¹Õá s$I’$I’$3TUù8RE„=ònG¯^‡&ߩڴžU›xꎎZ¯« áÜÕáq&þ÷!ô¸î:®ïߟ›®»’´øÓ«{üÉ–hG§â–´»¬ÝÁçèÀaGß™þwX·æm^ùtŸ®_Íê5UpÝaå¥ fü¨ÅüËÌ5ô™ôW®žý6뤹òNª ›Ó&G]MkG®‰‡]®»¾þh ‘NÃéz°.Aº^ß  sšU¿¦ë ×ö÷ó¹ÕáN9ÌiÕªûöí£U+Gj“$I’$I’tvÚu"1²…‡uãˆTí èÀqFekØ(@rà°§Õ Ý]<óÜp:ñ$9@bÀ•ŒùË»Üûé|ðþû,›ù8³§_Ǥ?çÑÿ8ÅG""Í©|ðåžî ð¡ÈûÕS¼èí·õgðè{üÊãL9âéy U¥;€_oÜAMÿd¾gøÍnSq2mØœ69úÚhò œ¡VkÖ9kº>QqmŸ[ᔓ˜óÏ?Ÿ;wÚ‚’$I’$I’ΚøN×ЕM,[`’¶,[O¤ëõtjæ3öÄ®]Iܱ‰‰i¤¥íÿj·c1Óg¾ÇŽ}ô'¦Í_Oâ•ý¹wÌdþô×?rWàæ¯i˜>!rð w˜-Ÿ~ݬý6Yîi¯™Ã;U·òÜËÓ7ü6®¹¬ª#Ä×lœÍ”wÚ1lì­T-šÊëåg褜b{œŠ“iÃæ´É¼2épeØò>›jµÅ¦÷·œÖ9;Y-umŸÏíÝ)‡9)))ìܹ“o¿ý–ºº:[R’$I’$IÒ÷/؇‘·&òÁô™,[WÊÆe3™òÜ4ò:šÛ¹%þòá ï´ž©çñöGëøtÙŸ˜8q›Úõ C<ØÂ;³§0}ñG¬Ûø)ï/šÏ;ÚѵC"$v C` ¯Ìy›OKKùtñt¦¯iüñ{U_o!n¢ÜÓh×Īõ,[½‘òP)½2…)TÙ±…5@ÍFæLyÀ=ã9x4cû|Íì©osÚyÎI¶GÓÂ|úÊ f,.¥æxÇÙDÑÞMµI3ÎÙÉH¾n7ñS¦¼ÂGëÖñÑ+SOØÍ©ßÉÖ¥¥®m€ð§¯0cÆbJk¾ŸÏíÝ)³ËÅ_LEEápØ@G’~ÀIMMµ!$I’$IQ È•cŸcüô©Ì|ü_¨JìÊuãÿÈøk‚'QFg†?÷LÎ̧ޡ*ÐŽ·Nâ¹Ñ—Ä_3–§‡Meú̧øUízpÓøç{y

ñ:ÐãÖQ<ýt"S§Lgâë=˜™Â¢ª[ynäeÄ×Mûf2ýý>Lëq:§ãdÚ£9ªØ´x‹¯däàÎÇ <á¹9º½OÔ&½ø[›qÎFž\[Œn,S§Îæ©_EèÐg$£G}Í”ùÉod¶Ÿ³^üǽGÏeͯ¥®í˨ڴ˜E‹ÚqͨÁtþ^>·?nç}÷ÝwßÙ ’¤Ù¼y3]ºt9gëÿÕW_ѦMbbb<™’$I’$E»ðGäÍ 0v•œS#p•ÄÛkô¹íʆÞ&5lœq¿Z?šÿõ§þ[D·úúzvîÜÉÅ_•õkå)’$I’$I’$E‡0ŸÎÿˆËïíÁ¹7•Ê×¼2u"Ó¯£<¢ô£9L½Šƒ{äè´Ù3G’Ô${æH’$I’$5­üýLù:k¾ŽhוëFŽeìàË sÎÑÞ3'ÖS$I’$I’$IÒéK»~ 3®cCèŒs˜5I’$I’$I’¤(fÏI’NA]]Û¶m£ººšH$rÖ÷HHH 55•ØXK’$I’$ýùôG’¤“TWWÇæÍ›IOO§S§N³^‡H$BEEÅÁùŒ t$I’$I’~¸|ò#IÒIÚ¶méé餦¦¶XéééGÔG’$I’$I?LΙ#IÒIªªª"999*ê’’’Buuµ'E’$I’$éÌ0G’¤“T__OLLLTÔ%´Èœ=’$I’$I:{ s$I’$I’$I’¢˜aŽ$I’$I’$IR3Ì‘$I’$I’$IŠb†9’$I’$I’$IQÌ0G’$I’$I’$)ŠæH’$I’$I’$E1ÃI’ζš"òö¦wïÞô˜GQM"I’$I’¤ÆÅ¶Ü®«˜;óf}}œE2Y4º mZ[ÍÊ•Ÿ3keÅUûàüz^Ö™Ñwdô¤J’¢]˜ÒP÷¡RÂ6ˆ$I’$I’Nàì™SOÑ[«ó^5=oº’9ýŒÙ¹I/ÿ;£^ÚÀ†ZOª$I’$I’$IúáhÁ0'‘d“M+úæ¤8ø~;ffÿëo¿azþßyã‹j"‰m00‹ñW%î_?¼é]Ï_TSuþôíóߘ4°=)@Í–5Üõ×xÆ÷ßÇÜe[Y[Kf÷.LÊÍ [Bþª+Y¿ŽyÄêô¼²+ãw¢[@=%Ÿ¬gòÒrÖVí#ÔŽÜÁW063Þ«M’~¬jŠÈ»k$¯†Ž·°1×ö>ô2ùnæ¼>,mH’$I’$©Á¹7ÌZ\W(-ø€3×0ó“íl×qdti·?p©­$ïOŸRÛ™¼Q9̼)Uùÿ—)ŵû—Í*$¿®ãÈaöàÂ+ ¾¸’óO×T–2ai îèÃìá$ùwFÎ/§€jòç­æ…½)Œ ‡9÷w!ý‹õ—×”3:ÿ‚9W0{T6ã/­aáü"VV{±IÒ×asä4Å9t$I’$I’t”(虳ÈÞ}Íî•qd¾žù—}ÉÂÕå,É/dHjÇ{0ö§‰D6³¤.•i÷e“tºœ¼ŠÏXðma6±do;& ïÆÀ À…L««äÖÅ›Y{ûUôlh–÷]Á°.1@=«¹kö& ¾M#wïf^ØÞ޼qÝö—Í…dÞ·›ÂÙ%†ÓèÞM(6‰±W]Dv²ÓIÿi5i±^l’ôã¤s26'ÐIîLГ$I’$IÒaZ,b¨)/aÜÜ¿Sð*[²ƒ1Óþ‹'G\ɰ´˜F¶Ž£[.LîѨ§lË×,|o ÿº’Pì <üE‘¤nd&Z?ûŽÞd%+vIêLÖaOÊR.¹ˆ´º­l¨¢!̹~‡í;>-•ÌØ­¬ú¶ž••„ö†ó»wŽªSÅ{aà%]ÈMZ͸}žÝ/¢ßOÓнéq^l’ô£ŸÅ„¥ÿÅ„ƒ¿W2êÚ1û’ÍŒg“ã°j’$I’$IjD …9U,üÏ¿³ªª±Å<ûŸ¥äü¦ G-ª)ßÌ„eðð}]樉!½SGÆŽH!sæÿfêêŒl ĵâÌ=kvê€Z ñf<Ø…Œ#Z¯Á¶íû›[ºyË?ÿ†‚7W3kq*O?qUCO I’$I’$I’¤æk™9sj#W6±Nå.BµÇ¾ ÅŸ—_^Ô’}„ê p~<í.M€íßP|pûz ÿsƒU’˜vÊm6!AÅ—ßP{ݼ³‹å‡•_S^Nq]<Ùmc¦]HbÕ.Bç'ÞvÿWrx Sß,'T ÅÈ[±“`—4†ÝÑ‹¹ã~ÆÝ±Û˜÷EW›$I’$IÒÿÏÞýEyÞûÿžˆ÷Æov³˜t7‰‹aÐÔ56;˜X¤©R%sýVÌ4jç(3Eûù 3E¿ßfpf„ó=Hf”̱š1ØUO6-Äsà4•&…)•#6¨l’Ã&•v7cvý‘ï»*`\dÁ×c†I„û¾÷º¯ïëºïkïë‘A™'sÆ[))ZDIèŸþ³â{{¾à'[æ²úá0û>ò8?™ÚÁöª÷ð-Hd}–«—yïO¼qÁÂOÖXxÌü hfÛÁó¤[1]8KáÉ+Ì\ÿ“&'²àþfŠ~ˆiø‹ŸP^s ûœ9<}s)´«¼}ðÏL[žÈÌ«ÙWóÞ'Ÿá¥GÀÄ“¼:©‘¢= /Næ±/?e߯ÏqÆùöñà Þ>ö ¾ûgòCÇ8ºÏœç]ŸÁóõÒ¹¡Ç;tôŽ ãï¾úꫯF<ŸŸgù¿|FîÏRyaBÛ_¹ÌoN³¯í"g.ÄÅaŸü ^]ðM–;‚32þ¿vQzä4Ç> ¸ß‚3ÉŸý`ð†ÙçŸR~ä/üêÜe|÷O`Vª“â…0 ð»ZY¸ç*¹KLiø„3¾8¦'Q¸| 3o¤Íëaß‘Sìkÿ_œÁÓÏN§p‰)ãü¼÷ÎIJß»@×U0̱`áLòŸ5£×!ˆÈhuöìYGmú?þøczè!Æ•ã>}šY³fÅÌùµ´´0}útUT‘!ºví—.]â‰'žˆÉôÅÆdÎy¯uñêOf0süÈ&Åïjeá×)ÿٳ̯ ,"šÌéM“9""""""""cK¬OæÜ©?9“'¯É‘ÛÄÈ‹\&°|Åã* ‘^â”·39’ùíÿ«|‘ØpŸ²@DDDDDDDDDDD$vi2GDDDDDDDDDDD$†i2GDDDDDDDDDDD$†i2GDDdÆǵk×b"-@Ã0T(""""""""c˜&sDDDÉl6óé§ŸÆDZ.\¸À„ T(""""""""c˜&sDDDéÑGå³Ï>£««‹@ 0"ituuñÙgŸñ裪PDDDDDDDDư8eˆˆÈ ;ϸ8ùì³Ï¸páˆLè†Á„ HLL$.NݹˆˆˆˆˆˆˆÈX¦»?"""Cé@ãâxì±Ç”""""""""2ì´ÌšˆˆˆˆˆˆˆˆˆˆˆH ÓdŽˆˆˆˆˆˆˆˆˆˆˆH ÓdŽˆˆˆˆˆˆˆˆˆˆˆH ÓdŽˆˆˆˆˆˆˆˆˆˆˆH ÓdŽˆˆˆˆˆˆˆˆˆˆˆH ÓdŽˆˆˆˆˆˆˆˆˆˆˆH ÓdŽˆˆˆˆˆˆˆˆˆˆˆH ÓdŽˆˆˆˆˆˆˆˆˆˆˆH ÓdŽˆˆˆˆˆˆˆˆˆˆˆH ÓdŽˆˆˆˆˆˆˆˆˆˆˆH ÓdŽˆˆˆˆˆˆˆˆˆˆˆH ÓdŽˆˆÈpè>Á¡’¬\’Azz:ËÖ°±ð§¼Êšhåouá&Ö,Ë ==ƒ•ë¶PRÝD·ÿÆßkY—žNú’Nùûø÷ÝÒUÍšôtÒÓ7ÑÔÏçú›6ëÈ–øc>ßëƒù˜žÎÆÚî'ÑÎÎe餧/¡ð”_õs¨ü'(Ìæï­Ÿ%,[³‰’šSŒhøˆV©¶(2\ýMyOífã’tÒÓ3ØÒ䨽ܵ>d°m7ÛºÆf®nßɲPÿ»²º3¶úÏ‘hgw¥wR½²÷ØçöŸõj¤w§œ¢dIÿå°rwgtÛÙšCt cÝU×X"ƒ É‘aïÌÙLe]nXm6 ‹¶†JrVÒ¤ë‘;ËÞÎClZµ™ª†V\žÀÝÑL]ÕVVm¯íû¢À0csX±9¬Ñ»âM`¬¡ºëÞ+‡¶ÊJN¨.³«ÕŠW+uå9l­ÁŠ6”6ÔW޶(KýÍyi­:@›ÌÎEÌ·`{‹mWc3 _IpÕ6à ýË]ÓHg4ÚN¬õÍ1×î ¬VkpÜsós kèwlfÕΑ‡Þú±á°kä& â”"""Q¾l«æ¨°­`×þMÌ0ÞSìÎÉါªÆ\f/ŽWF IG‹*i I«©Ø±‘”xðžªfkNmÍåT˜G¡£×n–¹”¼9WÙM¾Ê®åÍìåEÔYYQqMSM€—öê­¬¯j£­²’¦y%̶Œ@’¢Õ†Ôe¬õ7)¦(}^ŸÀLZn.‹L@ µ—QÞv56“ð•ÄEmƒçֿݵ4we“`á4w»¼+íÞÎâ²_²/õ_¤¨ ’òöðsµÉ‡.­8È–©&e…H Ò“9"""QðùñÜü"™eÙÅäçç³6)ô­&o;5%YZReÙºmT7ÝZºª¯GлkבžžÎ’ÂSÁÇÅo,㵬Œãµel\¹†íþà²0ÛÖ±,#¸LÓš-»iêñ AW=e›V²$=ôŒel,©¡}4<ÞÕ@M€ƒ ÁkÁì]A~n*IIIàö|}¿>Õ0zäký¡BÖ…–[WRK§ “êWÖsØà¢jÕJ"] û8;7­$#=%ë 9ê ŒÊzn\{+©ïŽïfËš%7— [³e77«wçnV¦§“¾r'5;7±,#Œe);ÞEgm!ë–ÜÈïzºü£¼ÎÞù¦®Èc©4SÓæ(?º›zäÆ2Öm«æDϲ(FôWþxô¶6t+>í¤¦lc¨ ×QXÓZÊ¢Ÿ6Òײabaøö(2ÂýÍ×áNªW¾Li€ºœï—꫽DЇ KÿÖGZŒó£ulfüùØ åÁ( IDAT­¿ØHtb¸DßUKƒ°.bC²¸¨iìĸ<ÜØ0€«®$Ôæ–±±ì8·é âH}sס5}.µ&ôdoÿm6Öûìnj7†ÎåÐÜ÷Ò´-#´ [·ÚÞ]ë#+߈ú‡@͔ՠú¶1t%Ž&sDDD¢Ì’4'€«ŠW¾¿ŒÛÊØ]SO‡‘ÌâÅ‹™;Õþvv笧¼® 7I8V<Tm}…¡¬õái ¨ô(mn\9MÙúÍT5và³9qÚ¸š°uóîà€·»ží¯q´Õ‡59T›¶ºrÖo®!ÖW ó»špØ“vÛ!&²ÊøùÏwS¸8‚¯PFšž£U6ã3 ÀGG])¥u]€´Ü $üu>Y޾½æ?ÅÎõÛ9Üê&`v`õ4PYÙ6 kyÙ’!ÐLåÞS_¿ðê<Äöíhv°%9I²ù‚up{íí7.܇)?êÂ0 àiãèöU¼RÚˆÇlåw¥ÞQ]g£Âdc®#t#¨Ã>?ºjغõÍ.p$'ã´úèh¬bóöÐ (ÿ©cD_q¥?®Ã”×ùp$;1{:h(_ÏÖúîÈÛÈ`ba¿íQdû›¨Ôaiyy̳8W°Ái ­¹[ý[¤q~TÍÂÄÆÁ”u¿±‘;á2-w}#Àš–É¢,g°k›‘çaÚŽ¯ÒòF|†ðÐvt;E7êÄ âHÿ}³áH%-5•ÔÔTR“m7o6Œ0m6ÖûìxRo–Ik0Æø]Ô·'YÉñj{wÛ@å;Øë›<4”çÜ*«Á^»™k,‘ð4™#""möLŠ+r™—ºXk<Êò"6¿ò"ékJ¨ïoë^»ëRv½õsvïþ%ó’ U Cº’œ·‹·~}ìî79ê’rÙÿænvÿr?yI€»ŽC~:ëöÒÛêTçSP±ƒV ­ššÎØÎÚ€/ô +³•;Y>;òSÃÆ¸ùõÓq¥ßf[i¡ü·83I¢‘Vwno6 ¼'×s"|,¼ÙΣÚE¢Óßܽ:Ir÷ú·ˆãü¨› ;wbìÖol\wÃetÖÒàŒT'™À”Ìb'´¶uPÓÜMffÞÝbv’zÚÅ6Õ x¸ÑhGÂöÍ~:me{£ÌigãEÚìˆöÙ–T²’¡µµÚ¶nœ®f<€3+™x¸5I¤¶V¶žã8ÃìáË7òë€yd†*Rp²®™fW.o6 ƒºvóŽ­k,‘04™#""eÝ'j¨kóav."3%ž©)ó™š2Ÿ¥ó yys>×). øM¡!\èfŒÐ`7ˆìØIŠÙtÛ(«3¶¯T,¶ÙØhÅí®§õ¶—Òú9Uö ›z°­ÞÅž¬;ÌŸêqDå1{’(o>@Cß{O”ðÊæ:<†ƒ´¥™äeuS]z8¸dÑ ]Õu6*üîÐýG’šÂä‡e>%o99QWCM}­­Ôh¥îh=û pWnO?`º½mE禮&j$öû›‚˜ªÃw¯‹nœ…±ÙsÁÍxÕ_l ÜŒ«C‹á%Ì×;ᣮ³¶7@ Íßo¸íoµÍtg.¾£'£Ú†é›½'*Ù\ÙØX±£€¹ñw«Íw¼³œ•ŠÑÚLkM3n|ûkj{QbeéŽýlék+‚'Õ†T׌;éÛ õŠcrïÐ2k"""Ñæ©¥ªªŠò¢½ÜZ>ڻü‡bNàñ”$ ÀÓPËUºíwÌÆf“aǵžöУýÝ´w‡ùp¶”àòTîÆæÐcê]ÔlÌ =}%eí6gðï>¯ƒäÙ³™=ÛA ã8Ç›:b#aY€*KÝ|¿‡·ý(•GƒßúJšmÃæb0ºyˆðúÕ„mvpÏUÓzIh5£ùcvå-ÅÚ+?\µÁuç“r+(Ù”Í<‡Ï?ãÿ⣹ÎÞ1?íG˃Kÿ©d:ãÃÖß®ú–î¥Í‘MáÎ_òŸ¿ÞÅ àk帛01b눸© ±îÆC´…b˜ÃY±F Eb¹¿±Ýµ:Ir·ú7”ã|,ŒÍ™&6*^õ-wõÎZôu†–XÌV¬Ö?¡é›¶š»;. jn#j}aW-E[âÁÀ™WÁ¦¦!´ÙØí³-É™$h¬¢ªHÎäks9j{#>n¸®yn/«V[ï1d$}ÛX¼Æ韞̉²ø´\V8r8ì:ÊÖ°9¬Ü.‚«$YYš›†Ã™Ä [#܇ÉYÕJ²ÍGk›°²(wQpyk IÆܾ:r^lÆŠ'tŒp:kYdÞL«’õ+ëI¢ƒ6wóÈr˜HÈÌÆy œ¶ëÉéHÅêi¥¹Ã‡‘œG¶%Ös×ÎÒ‚ ÔçTÑÖZÉúïWb˜!ºCeNË'7ÅB¸—…̓Hîx™ âÍ€ÇÍ¡Ê8ò61×®n„ʦ£’WVÕàÀ…Ë3ºë»iÆZòRëØÞ|£r˜¬€Žòõ¬«·âi½³IǨ®³CááðæU4ðxnæsC.³-@˜ü0›Ý474ÒÐÐHm²[ÀE³0œÌµ™°8Žƒ»#ëæpÎË4: <. R7, .ÑW1¾¯ÂÆB‘îo,þ»W‡#éC†­»­íš¢çcbl–d06ZáËÚIl¼Ã.QÖc‰µË‚ý,]Z³ŠJW5­Ý,N`\A¿×ߨýÎ㈗ã奇cf8^ɶГ¼Ö¹¹d…k³£¡Ï¶$“•jÐÜè!$g&÷±¦Ú^4Æ¡G7¯¢±Wù›yTä†í@Ñ?˪ÙaÆírË*wQ¯%Ö"ëÛÆâ5–HFèÉœkœÿýY¸½Žoßüi ÷÷¾;xéÞÙÝóx7~þ“üëi~ûù5•¶ˆˆÜ¦lÚµ‹ü¥É8¬Ü.ÌØ’‘W±‡-)0Meãž=ä-rb tÐÚæÁ𔯆{Ø–ºX°Ì&¯`N+ða$­ oCor´¤°mÿV§:0Hê;`Ü?¸ÂÍå/_äÀ‘S¼Ñî¥ûªÁÓ)Iäg:xj<À5Îÿ©ÂwºøÀwc¢•å™Ï7-4=äý+åÛøÕ¹Ëøî€çS¿IÁÂG˜ð¹‹åÿò«·|‡å¡^åBÓïYÚ<™£¹&]îâÕ:ËòMáýšÓ|è|Ž# Íðù§”ù ¿:w™€ù!,œIþ³¡É«;I«ˆˆˆˆˆˆˆˆÈ¨æ££¶Ž6Ÿç¢\òæj*GDîMq£"•W¯â]:×@èÉœkx?÷°ïæ©3™e¸Ì‘7šy=.Âõ3‰ÿÒÃ/jÚX[=ž£¯Ú±t!÷ȧLYð UOÞÇÿ4ÿ…¢ê“<ÿ³o3'î"%¯µðöÃOR°ÞÎ$ß'Ti!ûËç8š91¢'‡¸ú¯9ËÌÔéä9'À•‹”ì>Á»öoR²ÁŠ©ë,ÛŽü"ów)™vuèi Ê-""""ÃÃ4uÿþ»MÊÅF‘»ÀNÖ›¿#KmODîq11™cŸ>¼ùó¼ÝÄ>S8ÝÂ÷¶÷ú¥ùqª~lgàï:ËëµR²å©Ð„ǃL[õ-UçiñÚyÁûÝqÉ{ö̲À,»™Ç¾u{xÏuðö—V ²Ÿb¡%¸oÙÕ‹,ª9ËKžeVD)¼Žeη)ùNp¶ÅÛv†·¯>JÙª)Áô8fPráÏøüê¥UDDDDDDDDDDDƆ¿íŸ0'•ªg/óÚáãlq_ »}|Ês]1ÀS0“TeNÄ på:¾‹öÕœ!ïדygÅD¼]éþÒ˦ìýnž œùNNdùÄf¶üSOOÿ/|Ë΂éV绾 01™=žæœ4ùد~‡>"œÌ1˜•xcÁ·küÏ9‰O1íæ“4ã™õâ·™\øÓÐÓ*"""""""""""cÈN昧?CeêeŠ^;ÉûW#ØáþGùß ^ÎÌ0›yÚþà­m±þ K›?¥‹‰˜¯æÉìüq"Sn;ûû°< `%ï}ŸžýŒßžþ”c¿n浚G)þé³<5„s \½Nà¶G|ܸ[ÿ¾ Œ¿¯ïsºƒ´.Ôò¡"""""""""""cÂ}#õÁæ'Ÿ¤òEûöE8‘ƒ…Ÿüø™!MRXŽƒ/x¯€Åþ fßßè¾=ü‰÷º(ýuÝWà™)y÷–D;«_Lfß–çøû¸Ïx㜟xû?ã¤÷Ö±/|ô)]qð”9ô‹«×ñß<Ÿ+œ?wy€”#þÉ ð×O9såÆï®ÑòÞå‡/bÜAZEDDDDDDDDDDdl™'sÆ[É_5w¾Ç¿]ŒdƒÙßæUû¸¡Ÿå——ñ^“ãI^ÔHÑ¿ž„'óØ—Ÿ²ï×ç8ã|ûxðoûßý3ù¡cÝgÎó®Ïàù‰qXì‰,¸¿™¢ƒbZ`'þâ'”×\Â>gOîŸÀcq_ð‹úOxê»ÁÙJÏ]‡‰ý'mÒÔ§X@3Ûž§ ÝŠéÂY O^aæúxðÒ*"""""""""""cÃÝõ‡©ë/”Ÿ»~S³•fÎä'NÓ?Í0?H<ñF»Ÿ9ß2óêSáÈ)Êßø_œÁÓÏ>CÕ’àòm¦i3(K?IéoZ8v óC,XžJ¾c`¥pc –#¡°ê¾û'0kÎ,ö. -ë6áò—?Ζš“l8GÂô$ 3¯’÷`¥`ã3”9Í–ª¿¸ß‚¥©ä'ŽÆßAZEDDDDDDDDDDd,ø»¯¾úê+eƒˆˆ äìÙ³$&&ŽÚôüñÇ<ôÐCŒ§Énùºk×®qéÒ%žx≘Lß}*"‘إɑ§,·Û­L‰6›íž8O=™#"""""""""""ÃôdŽˆˆÈ Ý+ßø‘Ø 'sDDDDDDDDDDDDb˜&sDDDDDDDDDDDDb˜&sDDDDDDDDDDDDb˜&sDDDDDDDDDDDDb˜&sDDDDDDDDDDDDb˜&sDDDDDDDDDDDDb˜&sDDDDDDDDDDDDbXœ²@DDDDDDDDDDäΜ>}Z™ÆôéÓ• C¤É‘(˜5kV̤¥¥¥%æÒ#C§eÖDDDDDDDDDDDDb˜&sDDDDDDDDDDDDb˜&sDDDîÿ©–,ÙÆ $[{9QSMm§?Âc²dIa„ÇúëY—±†ê. »†uk¨éŠÆ(®C¬[YF»_u|Ô䘴 ®­F=©Y—NzzÏŸ%¬ÙTBÍHU²A•e¯²Šj=è#iÇKX“‘Î’ÂøU¿e¤ëXÏ:""óG%vòš }'Ë2¶Ð¤~CîB}‘‘¡É‘˜ã¡©z/5eÅPI,^‘I’yËÃÛNMù^TL£,ÿ£š¶aʾÔ|víÙÞ]»¨(Þ@*”¯_ÏÎÞ/Ë^e5¬yÝMóÞ:|óŠÙ“—‚Iõ[ÆRÑ5¨¾‰Hâ”"""2æXfµqÆ0ÜOûÎWXØü§UÙ=ªòXÓ†ÍAÒÔ©¡›Ç3H™›ÆŒ-«(*?Jæ›Ù$Œ–²Ö¼à XSœØ-ªß2Æê˜ˆˆˆˆHôdŽˆˆÈ0ð¶×P¸né,[WHË×ÏßCË(m«æ” “ꕯpÀ ­èE–”œÂ?àö7p7”±qYFŸx?µ%¡}ÓÉX¹‰MÝ=v>Å¡mëX–‘Nzú26–ÔŒì²?]ÇÙ¹i%KÒÓÉX¶‘’Úί/Ó]{û2Hƒ÷83Öq¨©†’+ÉHOgÉšÂÐ}•‡ Gvû÷ïg×ǽW¹G{þ÷J[¸¶âI[;³«–æHò4\›î¯ ½õlÌXGí‰Z ×,aÍîÎÛò˪e+wr¼¶Œ+3HO_ƺm‡hï/võ®ÝM7?7}ɶìnâfª¬_+DjÖ­¢Ò £ôe2¶…–Àðø}œ›â‹ô(ú¬cáûâQÚ¯ŠÜëŠýõ-‘Œ#†ÜÞû¾&—žÛâPÍ&22ÖQ}ã‡Ü_ÉØ×G}ëkìÔUÚŒuÔô¨tÝ5ëÈXWÓcÌ¥>Nd8i2GDD$ÚºS”SN³5‹‚Š ò¨.mÄwã‰uÿ)*7—Ój˦ bÅÙ8Z«Ø¾·? dïßÏj›³à-~³m¦·ñ5RZåa~~ÅÙØÚªÈÙZT‡Ùßß^ÅÖÒFÌYTìÚA^²‡ÃÛKiòtQ³u3{}©äUìa׎ll­åäl¯ïçÂq˜ùOQ–³#‹‚]{رÖFsi¥M-?Á9:Ø[~œ„µ;Ø¿¿˜E4PZÞˆ·¯òLñvpØÌ÷VÝkù®­Æ“c6ÜœpûÃæé€m:\\ì-­†Å¹ä.¶}-÷aŠª<ÌÏ­ ¢8 k[eèsû.«ÛêÎú­ Ì#¯by©øoe}Ù©[q¬ßzÐ[<™??H®Ã )ÿ-þ³$SDÇøÜ_$\ ÛߨJ£©_¹× ûÃõ-aÇwÒÞû¾&Û×ÝâÔ—²¹ÜÃÒdO5Ýa%c_?ã¸pc§¡Œ‹DäŽh™5‘(ëj¨¢ÙXÄ®âlf˜€” :W‘Swc 3³×擹h13,IõÕlv‡¾Éwó¨Ùö¡m5ÃÌÀiíbUÎ^u.f£-ÌþÃI¤ÄIlóÝØ ð·W³×•LÁÁ̶L%© “U9‡hížÏüø»›·Þæ*êidÓ3#‚Î"¹}ÔÏ5z¸se³cm>Ù³ãƒ3k®jÇÃ|,_+{×XËÿðm5†f ø°yš6@›° ÌY;(̲‡îõNˆ™yd¥Ükºæsc—¾ÊÊÛº—:_2ùÅCqc*Å6^.¯¦-·„ÂÔƒpu3¢ã÷:7Å”HúbF]¿*¢±Mÿ±?\ßb 3ޏãöÞ«—g¨¯ó5—‘SÔŒ³`?›R,Ñé¯TUƾ>Ç$½ÆN]B}œÈðÓdŽˆˆHTùqŸpc8sq˜nŒ“æ&aܸAlJ`þRƒS­µ:qŠmÍ4·ú ­¿uÛIÌ¿õ˜’æ’dÔÑáöCÂÀû›œÙ,µmfûËËp¦¥1wþ|楥`7AwG_[_Lï•(í>îò€Üû„‹€mI7¯(-¤l* Þ¨ínës/_¸s°Xqöx›¹aèÖêØÏÿÚj, ø``5ŒðyÚo›öÓ>PzÛ+Éɽ¨%‰¹I_5Mn?ýÌ‘àép°eáì3âs±jéð@ŠùÎêA¤ÇïÿÜ_$ŒAôÝ£§_ÑØf ØßY=Pßâ‡0ã_”Û{¸¾.øŒVж·b.·ˆW%w ܸpã"õq"wL“9"""w[w%9[i0RY´x>™¹YdÚL‘/JÛ/¿n^„…Ýߒ¦7ÿƒ¬4?N}åfªÊÓ(Ø_Br°.eGE6ãöã›í#wàIƒÝg sð†Ži˜T7•ÿ1ËïjÂ…ù6¸ÂµËþÚtŽpehĪ,Œ[å|§†»„;7Õo‰Vß=šúUmû£ÕG 3©ù»ÈõñJU9µ‹v²8^ý• ÓØ ·†êã†éBàu—ã… Ã00½þ«’1šÌ‘±qísj'[+Ûú_öÝp]°¹ñÊ+iR6n"E!"ÐïD€1ëSöOiE4™#""""cƒiÆ&vîV> _þò›ß(DDDDD¢*ÌDÎÞƒ[ZMÆ.M戈ˆˆˆˆˆˆˆˆˆÜuÿÑMxÝ;øóÇ8Öc™MäHo÷ÅJBü]§Y¸½Žooo ¼ëÚ ÷÷žùs¶×ñíÊO¸0¨=¯ÐÒt–_ý5ô™—?åÕ‚wÙ÷×(žœ×Åê‚ãùüNÔ+­Q;nŸ%""""""""""Ñã?ϱ§PXµ½e=ôëØ˜ÈñðzýW¥6bFv2çó.¶ýÇÙö§‹œ9sn¼wÆËÉ?µ²ºò$¿õFr +œl¾\Ýíâ}ïà*å{¿ëàH×õá;ϸyiÎd¦Ýç è¶´Fí¸#”/""""""""""÷2ßlùÞ>˜ù*¯>mÄÐ9°eé>ôú¯JlÄŒà2k>öíû3Ç.GþÀ±é<öÖ†þË> Gs§ðØ@‡º|‘#í×I˜ó$¦÷Îq¤ÝÏž¡çÏ&Ldõ‰£ç¸""""""""""r—´°å{Kcc"Ç4¾d§åí®~7±¿ô#fjù·»n's̼4¯ =QÓ§ûxþ»ö'rïGñþÕø‡T–³ç(möpáY;“>w±ü_>bõ–ï°ÜÜþBÓïYÚ<™£¹VÞÞÑȃõ¼pæ9Þy1¸M÷_]lû?s0O²‘·f&?xd\èÿJùÁ6~uî2¾ûàùÔoR°ð‘àç]îâÕ:ËòMáýšÓ|è|Ž#s.±ºì,Ë:——>ÿßÛóY¯s6øûŸ|—möqx»\”îà·îâH˜žHáòDfNð±¯wZ~ÁÚÐq—?.]Ÿòê?u° {2gÎqì£Ë½Ïë¦ÞŸ•J9"÷â Žþ8”¯ø9Rù_¼ž8‡C3Ï’uÐDþüëì«ÿ„.Æ1mz"˧ðÔ„Ð!/_äÀ‘S¼Ñî¥ûªÁÓ)Iäg:xj<À5Îÿ©ÂwºøÀwc¢•å™Ï7MADDDDDDDDDÆ(ÓªþøÇKÔ$^(ü,TñÄšZfíº<´t]¹ùãÉiTm™ÏmIå'OÞJ–÷ó‹œü«€µøBK¬M|”™À¬oM€ÎÓÑRkf^ýi?šxO¯ú¿]1ÀÕËü¢æ3ž^˜Êá 3Y€›¢š x®\¤äµŽ\µ‘¿~U™“ð¾×BvÍÅ[i¼ú¯9 ÏN'ïÙ ··ÏÄ™¼ó³ïQ÷³ïQ÷³ïR–b€ùNW.Rþ¯m´<œHÉúç¨ÊNdʹ3liøþþÒz3"I——×k>cʼYþi ?ÀMQÍgxÃæ‹•§S'a|ô\¾Q0ŸrÄ=Ï>€ ð_ìdÛ;~¼˜JUöâ?ú k«»Bï/ºÌ‘7šyýËI䯟ÃÞ%òع¶›÷w!÷ȧXæD÷ŸÎòÁÍ4^Ç2çÛ”|÷qæ|í©—ñX,&&YL˜º:(=1ž½êdÖ€8žŸ7“²åSx!q"³œ ¼:5ïçWL+§ ¦ÌŸÉ«ÓÌ<öÈ7øÑü‡àó¿…ÞU4p¾˜ìæÄ]äÈGÁƒ]hûˆ3m,·ß8¿8¬z†ÕΉÌr&R–=˹Ž}þ®³¼þW+%ÙOñ‚ãAfN›BÁªÉXÚC“nÞ/莛Èòg¿Á,Ç#ü óÛÁ‰¬85P‘Q»Üßõï_5XzB„Ivž¿¿“·›=x¿eÇ2¤£Ì´ßÊSÜ}¡ÿïîú‚ÀÄfö8ð¤ÉßÀ~õ>ôÁ¬ûƒûÏJ4þoÛva_2‡¸1!2ÞÌÂÔqœ<÷ Î]¤å£ ¼î*LŸâHÓuûyi–ŒˆåOÞG^óE¼ÓäÝæ/°ë¦@èÉŸyÁ~kâÊd”iqŸðþç×Xpñ"Ý_zÙôu½:3_ÂÂɉ,ŸØÌ–jàééßà…oÙY0ÝÊcãÕ@EDDDDDDDDDDFf2gü#”ýô9N¶aË1¾ üÈy¦¬zœiW½üêÈ_èà>ž^ð ¹Ó&òtŸ7ö¯ñÁ{p_¼öü¢çŸÎ}DËe;/ô±WàêõÞÓÄ#>nÜäj˜ý¯ø8°ï$''ÏäðwÌ·–Kóþ•ÂÝ-‹›ÄKÏÚYþbËß̶/£UÚã0†|^㘖j…ƒŸp毗9rÁÄòÿÛ<àö\®æÉìüqï§mîÃò0€•¼ÿõ}~xö3~{úSŽýº™×j¥ø§Ï²Ð¢F*""""""""""÷¶{2ÇòÈD¦=‡€À¹¿°áŸþòõí,™e7õ}+—8Ð~óôg¨Zh¹9)âï:ƃŸñ‹sWxÁ\½ŽÿêÍ8nè/c‰·?€qñ3Nz§ðXh¢áÂGŸÒ÷O™ N^ è'µðÏ>;;lgR¿—J{œ½?›ÉÌñÁm[¾ 3ñµtEPf“'3óêŸyýKœŸ8™ôüëßøm×5^H*ƒ.Î\5ñÇÇa¹ÿA̾¿Ñ}ÿæ„Òæw}È–ß™È[5ÿ¹y½ër¿kgu¢Õ .RRöÞ8çgá·Lj¥""""""""""rOÁeÖ.sìÝÏð ¸ÍuÞ÷Î?›È”>þêÿè<ï_5xiþ£<ÕóÝ4“X`þ,¸ÔÚª <÷¿¨ÿ„§¾ûœí ôÜu˜xks ×ñ~þ.O¼mr¥/–'Yp3E?Ä´ÀNüÅO(¯¹„}ΜàÓCa&M¼gN²å½k¼ô£$frïy¥¸ñæ ˜¿¼È±ö¿?ù>Îÿ÷ŠN_%0ÙG÷•à²cý¥õNÓÕç¹öü¬ À„‰,ò:[N_&a‰ÇnÛú*oü3Ó–'2óêEöÕ|„÷Égxé0ñ$¯Nj¤è_O‹“yìËOÙ÷ësœq>‡}<ø‚·}‚ïþ™üÐ1Žî3çy×gðüD½4GDDDDDDDDDD侑ûè ¬~5…—l,޽Kn­§•°à9ö.·1m’âWûžÈk|Ð|ÀÄÇYmïµtØøXþìç>¢…GÈ_þ8–Ó'Ùð/ ¤}"…™“0÷HǬo=D÷±?°öØßBïÀx+…SXŽ›Âª÷X[ó¦9³Ø»ðAÂ?Cróÿ}n¼ýÆ»|ïëoþl8éÇ”8ÂÔ8ŽU¿ÇÒ²^¿`§,ûqºÚØÒì8­w”®¾ËçëŸ5žY©Xîœpûæq“ÈŸ7ž·üµÕœŸüMª²o_OW‹U—}´œûŒ×ß»ÌÓ™ßèµÄšˆˆˆˆˆˆˆˆˆˆˆ ½”D"â¿ØIauÆL'å3MÊ‘^ZZZ”1³ÌšˆˆÄ.-³&""""""""cY¬/³vŸŠHDDDDDDDDDDD$vi2GDDDDDDDDDDD$†i2GDDDDDDDDDDD$†i2GDDDDDDDDDDD$†i2GDDDDDDDDDDD$†i2GDDDDDDDDDDD$†i2GDDDDDDDDDDD$†Å) DDDÇív+DDDDDDDDb€Íf»'ÎS“9"""$ˆˆˆˆˆˆˆˆH Ó2k""""""""""""1L“9""""""""""""1L“9""""""""""""1L“9""""""""""""1L“9""""""""""""1L“9""Vbb¢2ADDDDDDDDd„h2GDDDDDDDDDDD$†Å) DDDDDDDDDDDîÌéÓ§• aLŸ>]™0DšÌ‰‚Y³fÅLZZZZb.=2tZfMDDDDDDDDDDD$†i2GDDDDDDDDDDD$†i2GDDä.ðŸ*aÉ’mœðG²µ—5ÕÔvú#bWïzÐÝtós¿¶ä΀õàk…HͺUTºt”¾LƶÐ2k¿sS|‘~õQŸûªC]5¬ÉXGMæÕ]³ŽŒu5=ê^Œõ¡÷¬!ÆÅ0±e฾ø^lÎTæÚnmn±9°À½çÅh‹e#ûýw’Æþú·0±'ìø'šç×ïØ«¿ëšë÷`bx¸qBïÏ­ÙDFÆ:ªoœôóCýžú=‘èÒdŽˆˆH´u§(§œfkä/P]Úxë¢ÜŠÊÍå´Ú²)¨ØEEq6ŽÖ*¶ïmÇOÙû÷³Úfà,x‹ßl›iÀíC|”Vy˜Ÿ_AEq6¶¶*r¶ÖÕaö÷·W±µ´sV»v—ìáðöRš¼]ÔlÝÌ^_*y{ص#99ÛëGfÝsÿ)Êr¶Ó`dQ°k;ÖÚh.Í¡´i ÅH"8‡@{Ë“°vû÷³ˆJËñöQ–©))Ì"Áॻ½½ ‹“±ù{ac,ÿõÕbrÌÆ›nØ<°M‡+À‹½¥Õ°8—ÜŶ¯¥#à>LQ•‡ù¹Tgam« }n±«wÝY¿•£yäUì¡"/ßá­¬/ëq«ßzÐ[<™??H®Ã )ÿ-þ³$SDÇøÜ_ä–~ês¸:4”ú!w§ûj\Œ ¶ôÃ×ÓÔìܽ…7¦—¦ê:Üf'Nëè>¯QËb ö›î4_‹MaÒvü3ŒçÉuM$õ{°1<’qÂáa})›Ë=,ÝQAöTÓæ‡ú=õ{"Ñ¥eÖDDD¢¬«¡Šfc»Š³ƒç)t®"§îÆff¯Í'sÑbfX’0ê«Ùì}#îæÙö¡m5ÃÌÀiíbUÎ^u.f£-ÌþÃI¤ÄIlóÝØ ð·W³×•LÁÁ̶L%© “U9‡hížZ:ãîñ6WQH£¸ +˜žytqÈ탤þnt„9‡P6;Öæ“=;>x1³ÖÉáªv<ÌÇòµò¸u1Zòru>À±‚]KÆ|Ýkù¾­ÆÃŒA_ 6OÓhÓ–¡ €9k…Y¡Ûm_»ò63¯ €¬”ÛcMC×|²ìý”àmÝK/™üâKîL¥8ÐÆËåÕ´å–B˜z®nFtü^ç¦ø"é³lzÕ¡0¯ÿˆµ>ôž6ĸ.¶8ÃÄÅ¥¾AÔo;µåÛ)m0¯xC žQ|^£ –ÅTìJûè»Ã¥Ïfü3¼çÉuMøú=ØYàk.#§¨gÁ~6¥X¢“ê÷Ôï‰D‘&sDDD¢Êû„Ù‹Ãtkdœ47 ãÆ bSó—œj­åЉSœhk¦¹Õiý ¬#ØÞHbþ­Ä”4—$£Ž·ÞßäÌf©m3Û_^†3-¹óç3/-» º;Úðø:Øúbz¯DÙh÷q—ä~Ü'\lHºyUd!eSYðFmw[Ÿ{ùƒÀгÇ[Y #‚ËkS¹{ö“åjåPe9›·OåàÎÅcøc-ÿ#h«±$à#€Õ0Âçi¿mÚOû@eèm¬$'ôuð$æ&}=Ö4¹ýd ðukO‡‹€- gŠwÎŨ¥Ã)æ!ÖƒA¿ÿsS|‘H„kƒ¬*лÆ4ĸØY=plq†‰‹óÜ‘Õî»)Ú~€V’Y]QÀÆ”ø1q^±Ëb,ö%}ôݧÏ5ÌøgXÏo×A]£ V¸qBpN¬•¢í­€ËíƒPM½»å­~OD¦É‘»­»‰’œ­4©,Z<ŸÌÜ,2m¦È¥íƒ—7/$ÂîoIaÓ›ÿAÖ‰F§¾r3Uåiì/!9X—²£"‡qûñÍ#±NF xRÆ`÷輡c‘]ú»Úéؘ‘`ÁbOÀbO Ï8AãæZ½‹™ÿÿ·wÿAQy¾Ç?ÙÈéªØTL;:͘‹¦™²™©…2b]•¢“«Æ‹$+É’M&Q4¢$7ÈîsÈDI¢Ý ìäâÜÌ&˜ºÎÕ˜¥àV ©·‚TLØXvLÑdÂq2¹€ŠÝͯî¼_U)"}ºû9ßç9ßçœóåœ:ŽÇ.ñÞ馶µÉ©åN›Ôæk»h›ÎR¸¯>4 M5s–ĸÙÏÃ5ˆq0ÔÏ÷ºnŒo w I2{?ÄjsèD:Œ¼8ør³ÿýWNìÔ9Õ²¯ÌÒiË{nM6¶×kLå2 äþa·±onòѾ–`®ß`Žk¼£ŒNQÀ®ØŒýÚêÉÑ%:º²H«¦¡¿™÷pÛb«ÞܹSoj²ò’ôÀµÉNRê»7/Ë {`·Jó–ê{ôLPðÌF”MΧ̦jëõ0ò–ª–;¹Ý—ù¯Tá뻵#y•æÏvÊð ü@X¿–7[tâæª«å„ZL§bœ6Ÿï¿Róšv—7ɳ\‰©Ùzí÷ûoT«¼áŠì²»[䶇),¬û?‡»RÅ'åî |l1N©­J-½b[ŸýˆñòðØ‘^wuŽR¶•Þò O³çª cœíñßÛªu\QuéIyÂW)6ÌwLÞ¦=CêÃ[µ¨ª¥o®q(Æéý¨Ò.£½JM½˜ÛT¥v#\ŽáGhøŸO~Á™¦Lóæ ¶úöQFb^´û•[΋>Ç@G•òók¾ñu½±s… ¯×ØÉeÖÈý#ÝFïíó½ÿ3šë7˜ã oÇ(£²Ÿ`¸”7S3ã3´ÎÑ ââuË™÷‚î3½³#Iù^Ð…_Ö†‡ôq cÙú¦ þ©¢Îéܹs:÷A‘"ëŠõn+=,\™À ‹KVtI¾Ò3g*cC´Œ¦ sßxÝp8e÷4éDm³.Cm'K”_í‘éj“»«ûÖ¡2åioÓ•Ž(Ù},ß}üáѱœÍNK–ËlRyÁybsµ2L2Ú½¿ß®6+9&=C‰.CîÚ U»ŠuÚe‹JVrøÊß–'m]+§§JåŇԲh¿œAøã³©±§mÊɉRFr´Œ¶råŸôÈU.›Úû?öµ~œ¹ïÝa±k^\¬üâÙÚº*B†»Våµ2âv)zœÿÕüx‹¿¯m5hÇÈí-jjT÷3rÚÛTSY¢Ã N­Û¯™’ä#¦¦—mzjøàûðV=¹&£W®‰ÎÒÊ™·÷Uï?š NVœ}›òs^“±q¹íGU\Ð$çº×åòsx##ðùäxë›~ÿÜî”ÓhSEéQE$»¤†R4˜’ÓÏñ€1†˜§º|äyÑ&ïc £¶Bµf¸’œíª­ê•g ‡\ÑQšjëP}E©ªŒµÚ¸v¦lcd½lc(—Y!÷O Ù6újŸÍÇþψ¯_ï1ëë8ÈÏñ-yß6nkC´?cþzfkCZœŽ¥¨4ù ¥Ž@<˜÷˜÷†¤«Uï¨ÓÔ5(ìOïêsIæù—µaçôïKGïyL]g´uaªþÔëW©Ëî¿e‘×ݯW%IÿUE§‹µ€þ Š9ŒøQá*íÚo*?¿T9)%²GÄiCîFUä4vïäÆlUF|¦ 2ŸÒaÃ)×ÊÊ͵+?§@™G¢õ›D§¢ã\*/IQÊç¯ëÞ—ßï’ ç:å&»UšŸ¢bC‹Ò´?cq÷žÏïKSnR¾ ŠÓ•bJ†Ã¥¸ŒB¥EÙ$ÍTra¡”_ âôcò¹Vf©pk”‚²¿£ŒýY*È/VfJ±L{„âÒ •Úσگî:ôíDæ^Q~i©Ò´Ë´;—¥ý[çkÜŸkoñ÷±­‹Y[ mµ7ŽšîZ¤´×Ó´v¶Í¯˜Úæ{Û¦½ôa‡?gDc•¶Á®Êü»í _´U…Ë{øûôÕ†Þ'Fb´s®ìùÅÊO9$Ý©èu»´Óì‘É%#ñùäxë›ý™ùJËX©Ì‚|m;fWø¢ ÊHó(³|¤ÆFlúj^”÷ÜÒå3/zímí’Úu('³O‹#”öÖo´ÖæQKåa¶ÇhC?'¬­º^š9†r™%r¿¹*t°s·öùÜÿáõÛÐ{ºöq\çïøv{Ý6n±cþ–mk«¶F?ªüücJüÍÚ ’Ë™÷,¥ëcJÝ W[§*tÖß++wò3» :£Î¶@ŧ‹´qaªê¼.8—BNÜñÝwß}GãÙ§Ÿ~ª»ï¾[wÞy'Á€¡S6fë¡tS¹oå)†ƒ6L^ì¨Q^±¡´1;J¾Ç˜„mðÇG}¤¹sç# ÷r:–j©NéøSÆÜgµûáVx7R»÷ÜœºººÁ·§ëLO1çGÚ}d½ÊÖ•iýá^?ãwè¼æªètÉ ‹9uuuš3gŽeûïÛo¿ÕW_}¥{ï½×’íã™9–Ó¡úòE%º8Y °m`"è§#Ifݫʿð˜JŠWÈ>› ÃÍèó“ž n³€ñqìÓX¤ôâ¦o]n„+9k§O%V€± T1›RC Øwaß…m !ô_È‘$cîsÚýÌ)¢€bÆ[TªŠ^#£ßl½ÿ>q€ñžÉ÷ì»0…œÒ¢@_‘«¢˜@À}¦7S7ê@G¤¦¶×ñ^—êQÈA_<3€@ëjÕñg)»¤L¥»VXϯ­QÈé’išê2ûü¤×‚†bÁà9¯Ë6êü×ký ]‘s^;âwè¼Ùç'=4sš:íX¯Û³Á/äØ"õØš0¯‹„­ù‚†F IDAT™~Ìíߎgæh¶*9wÎbúž–f¿£sÙtÕpe€…Q̰0Š9F1ÀÂ(æXÅ £˜`as,Œb€…M" _]]íÁ¨ ˜À0Í™3‡ `Ôp›5 £˜`as,Œb€…Q̰0Š9F1ÀÂ&§½½ X€ÓéœëI1v`aÜf ÀÂ(æXÅ £˜`as,Œb€…Q̰°I„€áù裂sæÌ!CD1€0wî\Ë´¥®®ÎríÁÐq›5 £˜`as€®Æ<­^½Sõ]þ,Ý¡úÊr½Øåçggkõêl??›ØÊ•J=¹âqU~Né¿êhÔÑÝ©z’ë6Ÿ9’ýÌñá÷²ƒËß~}y(h®TåéñK´:»^]Ø~Œóý–á4)aÅÕpL€Œ7ÁA1Ëq«¦¼T•-&¡6#B«Ö­U„PÐrå„v>š¢ü“RtršrwíRÖÆE²7kÛSÙªºB·e|ø½ìHäï>ŸA ÖÆ¨ÚÒcòÄåêõ´ÙŽ Àxd“ÀB£”¸)Š8ÐrE'òóUm_§Â×Szý÷óµ8n¾²MWAi¢bwDqb9Ðã#˜c‰<$¦<¦!GŒKa¡DÁÇ•9Œ‚ŽæJe?™ KV(áÉlkó ðú-Y²Zï,Wc‡$]Tù#OèP»©¦œµ:¯Q]^—¿ÎTûÉÝÚ”°¢ß×½¿¿Kæõ¼w‰V<’ª¢š^þßѨŠO*aÅ-Y’ My•jî²Bl—øX×~bßQ¥M+žTEU¹v<¾ºûýÙ'tñâ åmêþÌÕçéÄõÛä\9zóöF×ß[S©¼Mô,›íõVÞÚÚÕ˜­„GŠTut·6=²BK–$èÉjöóõ`麫JØ´['Nt·Óß11–ú/à®T«¼VZ”¶¡W!§Gè|¥îRÆ*çh;ý\å/Ñ#¯]ìéÀf%,Ñ’G^ÓÅží¿¹(AK¯ÐÍ»Cùûžßé?òVkEê ÝÌWTùä%5÷É]ýçÂ13>z/;`Îì'wœÐ¦OêhýQe?¾Z÷ÄtPsÀ-ß-éJŠRÑê%K´dõãÚñZÍÍø“§FjcT哪¸ÍTKþCZ±³ÞϹxlΫÀ„÷yÕ¼º"a“òŽ^¼ykEo9ןynÈÛ{ÿǾÚsKªLÕŠOªüúzkËXØOÂ(òsæóJ=¾âIUötW*ŸÔŠ'+{í‹0Ç£‰b#íJ•rR TëHTVa¡2V™*ϯ–çúë]*ÞV g²² ÷«07Yá %Ê,mV—f*ù7”ä4äÊzKïÍëò=<ÕÊ/qkyF¡ s“ål*QJúÑîjïïj.Qz~µì‰Y*Ü¿KiÑnÎÌWM‡$}®Êôm*õÄ*­ðuíß•,gCR2O((w{ò _±—$³E%%µ*ëu½‘'ódŽžxª\öä]zãõ ź© ´±ÿç#˜-*-¨ÒÌ »ôƹZ©“Ê/¨VÇPÚ*Él?¬œ·–o-Tan¢MÅ·ÄÖ×ë½ RrTëHVîþBe,w«8ÿ¤Üã±ÿ‚Þ–*µ)B«\ý_:{¾æGMíçªoÛ©C±±µ×6uO“Ü’ÚÔtE’ÜjªuË-ÇÏó÷=÷+fm¬Œ¦J5]â•jU¶8·*\6ús Žsf?ù[’Ì6•æ—K«¶jë*çàç€>1ÚýTºŽ˜qJ+|]…i±òN×S»{­ÓDÏS#bªÖþæ÷Ún("ã-ýŸ¼ÿæbŸcÄ‚ó*0Ñu5jwJ¦N‰ÊÚÿºvmpª6?Eù5¾s®Ïyi8Û{ÿÇ>ç€ëÓñ‰|m+p+~W¡’gÛük‹Å÷“0šü܇ñ‰9mÜf €öùÉÕ+µ?7YQ6I1Yʺø¨RŽ]_®ù2´vå*E…JR„ŒåÚÖÞó—|7ÎÜþ-ß³ÌÊÜ,%FÙ$EÉåø\¦”ªââ*mrúx¿»MnÃ¥­++fª¤ˆp9—·ËiH]Íå*m‹VÖï7i~¨$ÍVDÖE=šR¡†+˵|j £ë}]|Ǿ;®±[·jùìPiv¢Ö†QEt†6.ž-›Â•W¬“-n™½»¢—ð Jž?µû gƒK‡KšåÖr…²­×—‰ËÊRbÌ­ývòóåŠ÷ñzbXàÇö•êÔJíÊJTw“2”QÿÒ›ÆcÿžéñÈ4²½Î1Õ¤ê'é ½V?N…ïe+¦÷y(Ûé¢ÅѲ9¡–ŽU²·T©Ý¹HÑžUµui•Ñ¢ívE/—Mmºž„Âý|OhÄZÅéªlêÐâù¡ºR]©gœ²fÛôy…?ý9LJ—œy{þ–$SöÄ]ʾ¾Ñv v¸©£¡TÇ<ÑÊÈÝÔ“g+×lÒCåjÚšwc\Lä<¬ùG~ŽëÍ«ÀÄÖQ[¢cæ"åf%vo“Qiʺ˜£ŠvÏœëô1/ {{ï3øj«gÎñÔîVJN­\Yo(µçR_Ÿm1¬¿Ÿ„QæÏ>ÌçÞ?‚9}sQ]j¯o—áÚªpÛÍ=ãˆÅ2®Ÿp´ÍÔòxC GUQߨú¦ZÕ6x¤EíXû±¼¡å7¿P¶ˆÅŠ0Ž©¥½Kšéýý6W²âÛ”ùP‚\‹iñòåŠ[£0›t¥¥InO‹Ò\Ò§QN5{ør¯±ð#ö’d8î ½q°bÈc¶ãÆñ‹a^à«×SÈ £¿Ó­ƒéç-ޏ½ßjÚ»ox=1Ìø±]Ó&3ÑóT°æÿLjåæU`Âï··ÉtnTDèÍ}›˜ÔÝŠ‘t±Ü[Îí’|ÌKžÞÞ}Í.I2”“Ù CR[»GÒTÿÚâ°þ~‚¡Ï>Œæ8`ÔQÌ ЮÔ(/%]'X­\µ\k·&jmÅ6åxFhùîïa>ߣÔÿõG%ÖW«ºªJ'Š·©¤`‘²ÞÈS´)ɯ]…É 7ný|{؈ÝH3 †mÛÚdS=÷z}"Œý`ö_ØÂ+\%:ÚÔ¡åó{Î*…†ivÏÿ^iñÈ#ûíoô¹º´<Ü£ò†55x¾Ñ¥èöp¹+›Ô2µIžˆ Ý'±zßÿ"ÔÏ÷ȦˆµÑRÎQµ\ŒQe›Ck³fJê¿ãÃKÎì÷$…ahjïÏíõ$O?¥y˜èÌž¼9ZŸðíݮ،ýÚêÉÑ%:º²H«¦úÑ–ëï'!úîÃô7ÌMóæ”Ï7:ºZõæÎzSk”•—¤t3íЙì$¥¾{󲬰v«4o©¾GÏÏÌ`DÙäŒqÊl:¡¶ç2»ÔRÕrc'·û +UøúníH^¥ù³2<æ€ç½üZÞlщ›_¨®–j1ŠqÚ|¾ÿJÍkÚ]Þ${Ìr%¦fëµßïW¼Q­ò†+²GDÈîn‘Û¦°°îÿîJŸ”;²ô¾.¾co¶^×¢ª–¾ýæPŒÓæçëÛj«ÒÍ&u¨¥ªm\ö_P„Å)Ùeª¶ Tõ}oPßQ¯’’¦~OûÞN§*z•SíG+UÙîÔâðPÙ]Ñr´Uªòh»œ«\º½áÿ{B]kå2kUZR®6çZÅÍZŽ•ñá-gŽ\nèŸ#"\F{Uϳ‹zÚÓT¥v#\òTðsúØ›W‰¾ßî¸mߦKõÙ葼FÙ½æ\ßóÒHoï~͆K‰q353>Cë *.®QÇ(´˜iÊ4o ´Õ·bŸƒ÷™ÞÙ‘¤ü/è‡/kÃÆCú8±l}SŠTÑçtîÜ9û H‘uÅz·•ž Š9Œ°°¸dE›Ç”žY®ªÆFÕTä+çØÍGħìž&¨mÖçW.ª¦"G9Õ™î¶;¹¡2åioÓ•ÿ–—<:–“£ŠšF5VU('óˆ<±µ2Ì÷û µéXIŽ *kÔØ\¯ªÃåªv;á´Ë•¬äð&åoËÓÑšFÕŸxM™™‡Ôâp)çé|­‹¯Ø[©­ö[ôF­œéïë5uÑFÅé˜rr*TÓß‚s\ö_"¬UYZdÖ¶GSµ»â¨ªjjt¢²H;žHWƒ3â–çéÜ8åÇvꈎ•½í¤Z —\Žî«€"Ô¢“m-ŠîÿO%ý~O¨Kk£M5T·Ë¹6Na~æÂ±:>¼å̾ù{¨¹a ÏNVœ½Aù9¯©ª±Y'Š”YÐ$çº rÙÈSÁÏé¾ÇˆÕæU`¢›»Qq:Ù³oÓ¬ú£ùÊ?é‘kU¸¦úȹ¾æ%ßÛ{‡ê+ŠTTyqÀëY{σšl³µ!-N:Y Òæ.rüâkFv§œF›*JªþâEÕWÜr,À8a]­z§øOšºæû׿ù—µaç)uŒê÷žÑÖûï×ý÷߯û×½ª‹W>T겞/KÕ‡W.êÕu=ÿ¾«ÎP¨ (Š9ŒøQá*íÚŸ¦Xw…rRR”TJÎÝxãRs[ÌVeÄÛu2ó)=úhºJ/.WnîJ…·(óÈEINEǹä.IQJI³äsyÉp®Sn²¡£ù)JÉ)W{tšöç.V¨ß:?M¹Ij*NWÊSÛ”SáVlF¡Ò¢l’f*¹°PM*NOѶücò,ÊRáÖ(åÚ_±ð{KµU’ŒX¥m°w÷[f©Ú\[U˜»üæU¾^øÞ|e¦)º½Té)ÛTP¥­#dSåÏ]9ÆRÿMØ*å½±_i‹¤†òe¦ç¨¤²MÎûõú® а÷÷&ßÛ©-|±¢í’"wLÛµýôSÝ}÷ݺóÎ; ¬³Þ˜­‡ÒM徕§Ûà_ŠÏkt´ÁP쪘žµ]j.zT)M[õÖkËJ·NX_{DOÔ&ë÷¿Y+n‰Nžø©£FyņÒvÆp²'>úè#Í;wèÐõ±¥nЫKµT§tü‚)cî³Úýp«¼©ŒÝƒ{nN]]ÝàÛÓuF¦ªN?Òî#ëU¶®Lë÷ú¿Cç5WE§K]Ì©««Óœ9s,Ûß~û­¾úê+Ý{ï½–lß$61ø§]ù%ª2wikœSfS… ŽxäJ‹¦3Qu\T}CµJ·Ë•¶ˆBþO¢ª/¯QTâF 9ºõSÈ‘$³îUåÿ¨\‡‹à|a“a²}~ÒSAC1þ [«ÜÜ‹Ê/Þ¦G LŽ-ÚZ¨´USÕÕX¤ôâ¦ân„+9k§O%Œãêx³½Bù™'eÄ¥)7ŽÎÀ¡ŠÙ”ª@°#IÆÜç´û™RDÅ€`°Eeëý÷‡þz°„-NUÑâÔÛ_ˆJUÑkôë„dzwèÿ±ƒ@§0T> 9¥Eƒ»µÆ/Š9Ügz3u£tDjjëqïu« 9èëoÖÕªãÏRvI™Jw?|ã”Ö(ätÉ4Mu™}~ÒkAC1€`ðœ×ŽeuþÇëµþG†…®È9¯ñ;tÞìó“ Š9Mv,‹WíÙàrl‘zlM˜×EÂÖüL?æöoÇ3s4Û•œ;g±F}OK³ßѹlºÇj¸2ÀÂ(æXÅ £˜`as,Œb€…Q̰0Š9F1ÀÂ&†¯®®Žö`TPÌ`˜æÌ™C0j¸Í€…Q̰0Š9F1ÀÂ(æXÅ £˜`a“ƒÓÞÞN,ÀétNˆõ¤˜À M»ã‚€€á6kF1ÀÂ(æXÅ £˜`as,Œb€…M" Ï·› øép„!¢˜À˜;w®eÚRWWg¹ö`è¸Í€…Q̰0Š9€ya¯Öüì%5˜þ,Ý©†ãoéØ%ÓÏÏ~Ek~öŠŸŸ=Ž}yZ?OÚ¦C_Húò¸~ž´MG¾‰î§?¾¬×—ÒõÓ¤D-KzZ?ß{\-ÄLÄßGÛ·­Ž’Î :üÊNýÃÓIZ–˜¨5›wê—ï]'±¾-~ÃûA‹ï âÔ'#cŒ%îÚ½ú‡¤D­y¥Q>‡lïíŠ/ÞÓÏ7P‹I(&Î>ÿ|Rª‡“rUËó0nQÌÀr®ªöí i½F(†Ê˜¥•> ˆÉ£Ñ_èp^ž~×:KIé¹Ú›ž gÃAmß[{ód;ñ·nüG´m£à‹ôüæLím¦EIÛõëÛõ̼5”ejsù'·Xj¬okÜØûƒŠSŸ8X}Ì`”|©ÚŠSò,L׿<%ƒ€`4u~¢#ÿ ÿÇ®8&ó/&0îLŽÔºäÈÑùìK§u¸ušÛ³Eñ3$)R/lnÔÃyªþ2V+ï!ü–Žÿh¶mØ:U}ð ÎNOÒÁ܇qý(:f¡bg¤ë±ƒeªNÈQ\°Ög,ýáÄÉÒc£çštJ] ¹íu×÷›jûà ^¤-¹Èíóû$ó“r=¿¯VöÕÛõJîN=uUoîÚ§ÚNIúBGr³UÖ­ç²_ÒÞ r6Ôæ]§»?;àçb.èåÌ]:i<¨_侤—§©vßN½Xïí¡~¬ÃµV•<«ðÄLývOºVêŒ~}à¬<ýô‡ý¾díÉ{F®ª}û”þó®H¹Æû_ÔŽ·øûÚVÞ˵jÓ -šÕÏŸCN¾Oq.S´×«_F6Ö}¯ÁÆÞg|½·×knò5¯]RÙÞ·¥¥ëõìÒiýÄú}ýòÐUÅ­ÏÖ+é«åh.Óæ—NËí+æ½ü|žŽ\[¨ç²_Ò+ÏDËó^ž~~àÂÍ|<`Œ1vÜ£ø]{µå!úÛÍtüù(ÿæâëÃd,Í«Äó‰ÛüÀùÄ¿þ6î™®ð3>?…·Ü¾¯þæ<ç]ÿÇ>ç îÓ{µýàUÅgfwr†µæ=æ=À*¸2€Ö~¦\gC–joúCÝ'=£¶ë—¶hË©ëKLVì#›¿tYÏ_5Í’qúmm¿üuÏQýõå ÿ–—$Ý¥ÿ–¾]ë" I‘rM¹¬ŸfVèð¥ezfš÷_ýLîH=»4¶ûDñ¬r.¸,gˆd~ò¶Ê.Eéû’;Y’îÓ Û/é§™ï©áË…Š ðm•< å:fÎÓ¯¶?ØÝžÈgô‹K{tør§4k 8>Ö¡'Ìቛ•sO÷Áó#³õfy«ÜZ(ûmýÑKç':v`—~}ÆÔ²ô¤^'¹Ç§ñßÛj€u~­NÝ%ÇÏçj¬‡{_ñõÕÞE^r“×±)I×d0S¿xpz÷—}Ù·uw)nûv­‹ê3ÿ “_,ÔºéÇÁÓX¡c.½ðRrOþ»O¿2›õ÷ßVÓúç-1fŠÃü™‹5ææÕ cˆùÄ×6ïò‘Oâ;éï±¼oã«ÿÜç|öŸyÙ¿ñhÊÓp@›÷4ȵ}žš<2û æ=æ=À(æ0¢Lµ7^VHäz…÷:‹˜7K!§®ÿs†â~¢¦Æt¸©Y TÛôµ4o 9?–™¥¸^·@0fÍSDÈ)µ|aJ3¼¿ßˆLPü´lýó3OkμyZ´p¡âæEÉiHîÖf}ùu«þÇúÄ>𦖝àoSíŸéÚô¤^"Ÿ¬è ™Ý'P¿lîÿ Ý×:’4E®^WC!RˆÖ¸ËõË—ÞÖÿ•KeçꙨ{&ÀØOñ÷c[ 4ã.MÖU¹;ÕOÁ”ûÒe™SfÈ9Ð ©QŠõÐbï;¾>Û;`n2Õâm,v6Kš¢h¯—jÍÒ¢Y·çÌÚËf¯bN?ëÞzIצ=(W¯UvDÎÓ÷¯RËU)zòÈÄ4ˆ¹{ìÌ«¨û†˜OÚÞò¾Í»|䓸/èï±¼oã½ÿMi¸óÜ ûß×ä’¤kMúŸ»š"©í‹¯%ÝÐ}0ï1böe½^ÌÌÓÉh­\º@ñëTüûÙúeç-ßs0)I†áÇû'GéÙÂr­k<«êÚZ,ËÖÁóôÏ{žWô5IS~¢_g'(ü–£¹Ù§!v×$…2ûoëÐ))$D†áÿ§ºO¿¤ØsVö¥Ûõ¯O/ìu?ÎÿÑ=fþA´œ:«êÖN­¼§Ïå9gõËí{dn/Ó>Wàb=ª±÷™_ÊMÛîk,†„È1¨õìYÖŽfŒ1æî±4¯N“‡‘OŸÍoæú{|îÛŒØ<7îÒ¼Íyzöë=úYù[š£•÷fÌ{Ì{£¤«UoîÜ©7µFYyIú¡-_Þ¡3ÙIJ}÷ó¿ {`·Jó–ê{ôLPðÌF”!gÔ4]»pFm7N šj9Ûªë·Ïö4Uèß;—jÏ®L=÷Ð2ÅÞ7MF§9à9D¿–¿Öª“—nþÆl=­–kÓ=Íðù~w}¹^~«Yö¨…Z·áµoo®þ»qV‡š¾”}Ö,M¾Ú*÷]ÓåœÞýŸãêõrÙ¹ÍÀÇÖ5MºT«–^±mxe³~º÷€ññuè¬Õ‹{žô’~»erÆ]ü}o«wO´’\Òé²·ÕÔ'6í§ßÓÿÕ,­œ=ð=ØF}{Tì}Ç×W{ÎMC‹·jUukßœ9EÑÓ½(Ǭ ¹\«¦^·ms_8«ÿ ™¡ˆ)Â86˜¹{ìÌ«ÇPó‰Ý¯m~à|Bí}ïý?üyn°üšƒB"µná …ÿd³þ~J“^-«—'û`ÞcÞ%ŸéIÊÿð‚.|ø²6l<¤»øõ­oª-&L ¾IDATàO‘*úàœÎ;§s)²®Xï¶Ò3Á•9Œ0ç‚ý]ù>=¿ëz!1JFó{zùÔÕ›‡S¦iò×t²á9fj;S®Ï~­k³/Émv_Žn×5y¾¸$wg¤ì>–wH’¾Ö¿ïÙ£ˆ§äºÖ¬Cÿ(OtºVN—ŒËÞßo×%;tJžÉ›µn¶!wÃ{ª¾:E±Ó&ˈLPÒ¶ë×Ù{¥õ?‘óë³:Tö¶ZæåÊ„"†#:YË”­_î‰Ô .—ÞÖ‹g:åÊž!C—û?L÷µ~œ¹ïÝFã{:{m†›~Yµµ½¾3dŠ\Q‘rŒãâÎx‹¿¯m5ðîQÜ–§udû>mÙ~I%,Tô4©íìqúc³¾¿ú%­œ®~žÿ2:±îûìÏ cï3úh¯é%79f ~,Þª'gnî•3]ÛµrF?q蟨ÅMÎÖ‹{Êe$/ãò)½z°Yßð¥îç%\c¯|Îݽ—Cóê„é¿!æÇlÛ¼|bˆþËû6¾úßæ<'uªá½?¨:ä=óÀŒ~¯ºe>Šòg<^ÿòû´þé:–wPe {ôìì#€yy/ÀºZõÎ:M]ó€Âþô®>—džYvþ@ÿ^°T¡£ö½g´uaªþÔëW©Ëî¿e‘×ݯW%IÿUE§‹µÀFw ÅFÚ=ËôRî5½¸¯B¿Ì<$û¬ZŸž¤Ã{ºŸ)bD­× ?Ù¥—w=¯7C¦iÎÒdý*}²^ÜsPÿôÇ(ý˃Ó½p¶ÊÔæË/é·Ïx_~ßlɘ¶Z/$\UÙ¾Lí휢¿÷´öm‰í~X©Ïï{Z¿Jا—Ëò´åš2e¶â6gë¹HCÒ %egKûèÕ¼Sê ™¢9K·kÏúHeß{r”^ÈÛ®—÷–éŸ2Ëtí®YZöt¶ž‹š<à îá¯Ã­ý‘;í²¤ËúÝž]}–›¥<°Kñãù d¼ÅßǶÓ—iÏÞé:t°LGÊ÷èw_K“§ÍÖ¢§sõì÷ùˆÙÈÆú·ÏÜú}îKƒŒ½Ïøzo¯ã-7y‹~¬jH´þ1q²ŽìËÔÞ«wé¿Ì[¯=[önúÄ¡÷-Þ(½›.ûÞ2½˜ù¶:¿{p§ö%ß'ÎGŒó“Z¾æÒ7—µÇŒ¡yu‚°5ŸÈû6oúÌ'ô÷˜Þ·ñÑÿÃç¤Nµ_oNŽÒú~‹9}çe?Æã-ã~½žumѯ÷Òº]0Á¼7–t}¬C©ôjëT…Îú{eå®Q~fwAgÔÙ¨øt‘6.LU×çRÈ ‚;¾ûî»ï`<ûôÓOu÷ÝwëÎ;ï‘Ïûö?ÿ“ Àe^xEç^Ó¯>¯hÎ" Ÿ ˜:ëõb™¡ç¶Dqb'.¸Ýš;wîÐ?àz!§c©–ꔎ_0eÌ}V»nÕw#•±{pÏÍ©««|{ºÎôs~¤ÝGÖ«l]™Öîõ3~‡Îk®ŠN— º˜SWW§H‡cÄã~ç÷¿?"Ÿóí·ßꫯ¾Ò½÷ÞkÉñÅ•9@@uªáí¹V'SÈЭŸBŽ$™u¯*ÿGå:\üCöB› ÃÍèó“ž Š9Ì ¥z¾¬Y>K5d†’¶oÑ¢{ˆ¶ÉŠNÞ h@°#IÆÜç´û™RDÅŒFäíÉ#ð5NþQïþ+q@>X„BNiÑàn­†ñ‹b÷™ÞLݨ‘šÚz\Ç{Ýf€BúúB@€uµêøÇ³”]R¦ÒÝ+¬ç×Ö(ätÉ4Mu™}~ÒkAC1€`ðœ×ŽeuþÇëµþG†…®È9¯ñ;tÞìó“ Š9Mv,‹WíÙàrl‘zlM˜×EÂÖüL?æöoÇ3s4Û•œ;g±F}OK³ßѹlºÇj¸2ÀÂ(æXÅ £˜`as,Œb€…Q̰0Š9F1ÀÂ&†¯®®Žö`TPÌ`˜"‚€QÃmÖ,Œb€…Q̰0Š9F1ÀÂ(æXÅ ›Dœ;¿ÿ}‚€€áÊ £˜`as,Œb€…Q̰0Š9F1ÀÂ(æXÅ £˜`as,Œb€…Q̰0Š9F1ÀÂ(æXÅ £˜`as,Œb€…Q̰0Š9F1ÀÂ(æXÅ £˜`as,Œb€…Q̰0Š9F1ÀÂ(æXÅ £˜`as,Œb`B¸ãŽ;ô7cÝ’ ÅÀ¸g†¾ùæ€~uuuiÒ¤I–mÅÀ¸çp8ôÍ7ßèÏþ³þú׿H’þú׿êÏþ³¾ùæ9˶óŽï¾ûî;º 0Þýå/‘ÛíÖ_þò :Ô}kµI“&ÉápXúÊŠ9ÆmÖ,Œb€…Q̰0Š9F1ÀÂ(æXÅ £˜`as,Œb€…ýBþ ØòòIEND®B`‚glewlwyd-1.3.1/screenshots/g_3_clients_update.png000066400000000000000000001516521322667720100221730ustar00rootroot00000000000000‰PNG  IHDR¢çR”%, pHYs  šœtIMEáæ9\tEXtCommentCreated with GIMPW IDATxÚìÝ}TTg‚ïû//U$@E’:`h*I[tPW¼C‘3–³Zzú.£‰{„{—¸n”ÛA£Qéi1÷€§#vw$1ñ¥š;µF<Ó[#ñ4xÒƒ3¸Ge.9¢iËI¦ˆ-¤•šÆ¦Š—û/) ‚¿ÏZ{Á®ýR{?µ)>ûyž——׃ˆˆˆˆÈ Tˆˆˆˆˆ‚¨ˆˆˆˆ(ˆŠˆˆˆˆÜIÁ÷Ú÷ô¨I«ˆˆˆÈhD6EDDDî®,u7…Ôà{¡ÀDDDDdü3×d‡Ò໥ DDDDdj…ÒàÉ>i…W‘ñu;¡²?cMd ð z«AòN¯/"""âoAshº•pÙÓÓ3aatBƒèXCâhë)hŠˆˆÈTw³<44HÞê-ø‰ £ÁwK´ÎX_,"""r·¹Õ@0jèXoÁOD z³ 8tù­Î+tŠˆˆˆ¿.ÛÜJ@Lû·K ½Óa4x2 o¤å#ÎoLEDDDü9œŽ5(Ž@o6ïd ž¨Bº•:4€Þl=…R™JF»Õ~³à8Üz“F'mѱÏ›ý.x*ˆŠˆˆÈT ¢ýó¾t,ÁqèzÙ[þŽѱ¶ã.dŽôû­†R‘©Fû÷ —CŽBÇFïDPÔqDG Ÿ£ÍÝf¤ª`*"""þ>ž… ’ «JDDDd .\¸Àûï¿ÏçŸNXXذëÜjÛÒñ¨> ýHm;û§îîîßÛÛÛùÑ~Ä‚ t5‰ˆˆˆÜ‚„„(++ãÃ?$44”€€o£¾!s´¶¥ã-p2 hhí§oõz½ÄÇÇ+„Šˆˆˆ|iii|ûÛ߯ëõÞ·†öÅ™hãDGë4t³Ûð¾Ôãñ°páB]=""""ßÐ3Ï<ƒÇã¡#…ÑÑî`–õnWðdÌhaTmBEDDD¾¹„„„Aásh œèñC'-ˆŽ”º}hww·®‘qÖŸ±oè¤äk¢‚éo#z³ªÝѪ…EDDDd|sÙX³×hn¼OæÉT ªÝÝÝ5 ¾Yl²jEïŠ^óý¿÷ß–W¨ˆˆˆÈÉ^õõ›^ó·RC©nÍ‹ˆˆˆÜÙü5\šÍîÉ :ôFj[p³aœtk^DDDdüuئ±f¹»*ˆŽ%ßìÉJª¹óyl¤щÌcwUÑ¡¯‰ˆˆˆˆÿf¯ÀÉ*„‘ DATDDDäÎÑ‘BèDg°ÀÉ.ˆ‘ FDDDDî|.—ùmË3KFEDDDî|»ÓÏ’¿ë‚èH'«ÎJ""""w>wݬ§üDšôÎJ""""2ùÕ/ƒèhà MçÃ-‘ñËecÍcRï¶Â‘©‘¹§Di7Ÿ£¬`YéKI¶Ù°Ù“Yš¾ŽÂ 'îA+6RšfÖ~œfœì^jÖY1d=¹çƒèNäKÉzf;Žœâ¢ÛÌœ”%¤$ZÀYá­Ïó|~õ¨!Ód2b ¹cÇç,^ŠÍ–I…’®ˆˆÈÔÕÝNó¯ãü"ú#ÿÑqg}>™µ£Á~ý¡ºk)|ù j=q,ÙYD~òtŸ„ê¤ls:;Ê7“ŸRA¡Ý4Ì,d–V“©?¹c!ô+®^ú„ÏÝ=ÛgòÄ£Ó0ÿñ>k¡+ÈMwÂw˜â§>¡ÏšŸèdÞXYÈ—‘ÄíCB(@ˆ…´¼MXñpjuß­x‘ Öõ_¶÷fëŸ4\§ý?>å“ÏZèèjÇýçÎ{6ÝAtâ5RUê€ðdÖ ¡ý¦§·3¼Ì†ÿO†“âaÚˆv4VP¸.¥v6›ÔÌ\Jk}£l3ÇÓmØÖUÓ|±ŒÜôdl66ûR² «hìè]§,ÝÆó{š€z¶~ßFrî9:ôç(""2µâ±ï~›zg=×.qá³?Ñ=ƒyð±'xtšÞÄöß êvpªˆOÁ:bU¶‰øä¥,MžƒiŒ»í8·›UÏlåÐ9#sÒV²rE2ÑÎJÞÈzžÜª!õªÎC¼œµ›Fk7®e‰ÅEí¡Í¬ÛïL,È{›¼3ÍŠío³{…ý9ŠˆˆL9÷Gñ„XL¾¯ay‚Ç2øíyûoQw#Í@x´ã¸í´‘²üæç(:œKbz]“FþóY”ïØÏÊy¹Ä÷§É¦LyïS´4¦w>mžÔ,*kji^—Æôx;s¬F¨43ÛngŽIˆ"""SUw——ÎAwûéêê¦ÿ­9 ÔÇ~+9´Š²ˆ^’†7nwß„•+¢ÁUK­ËgýðÖ¤Ä|=Gb ÐÑG¥)"""ý‘³½‰K¿ÿ‚¯½ÚƒûòþíêWtûéyûo¨)ÐÐäÂ#Þòv_¬åœ ,‰‰ÄÜä¾x‡«ÐZ’Á÷K†[ÃŒÓíÓÊÓ<›è!û4êoMDDD|y›ù·O®ÐÖ76#Ç›¹tñ*¦‡/?ÿ=ÿ2‡Çý°¨Q ÉÑP±GG2‰Ã†Ìfªvd±­ÞJÞoKoDû«1ãÖî$wØûèF¢-! áïEDDd¬ Óˆ|(˜/]Üÿðw™J0ß&~fŸ\rá1>DT˜:+Ýc,$§ÅAk%û+Gœ©¹†²z :…9Óo¾Çh+fÀƒ…ÄÄÄA“5ÜMs³£z‰ˆˆÈ­%Q|tñ'ÿHø@-¡aÚ£<ÿñOÄaòÓªC¿n#jIÛDJ8Ôn[EnEãà¡‘:œ”mÛA=0{Í,cÙaL2ÉÑд¿ã>¯»«Ù‘µ™­û/ªí§ˆˆˆÜV5=zíjƒé!LþÛiÞÏŸ¬d²“·{%ÎU%Tn}†ê=³™3Ç‚Éå ¶Ö 0/ØNÁÒécÜ¡…Ìüç¨Ì:¶çÓ¨L±c5»©//§¶5š»—s‹‡h4Gö—AÊRçL×ߢˆˆˆL ~ßk>dÎ:Þ}ÿm6.™‡ÅØDme9•ç\„Ï^ÀЇy¿0õ–£)1—ÃóX2•‡()©¢1z [Þ-eÓmŒ¿“œIŠÕHí¡ì9Þ¤íEDDdÊÈËË·ç7 }TOOÏÀkÝÝÝóÝÝÝSWW×ÀÏþ©³³£ÑHQQ‘>!‘q••…Çã!88˜   )00pàgÿ@@@½u–ýóƒBäùÛ¡qDEDDDdR(ˆŠˆˆˆˆ‚¨ˆˆˆˆ(ˆŠˆˆˆˆ(ˆŠˆˆˆˆ‚¨ˆˆˆˆˆ‚¨ˆˆˆˆ(ˆŠˆˆˆˆ(ˆŠˆˆˆˆ‚¨ˆˆˆˆˆ‚¨ˆˆˆˆ(ˆŠˆˆˆˆ‚¨ˆˆˆˆˆ‚¨ˆˆˆˆ(ˆŠˆˆˆˆ(ˆŠˆˆˆˆ‚¨ˆˆˆˆˆ‚¨ˆˆˆˆ(ˆŠˆˆˆˆ(ˆŠˆˆˆˆ‚¨ˆˆˆˆÈ‚ïæƒkllÔ'$"""¢ :ñbbbô ‰ˆˆˆø)ÝšQQQQQQQQQQQQQ¹s‚U""“ËãñpùòeÚÛÛñx<*`4 %66£Ñ¨ *""ãB/\¸@dd$=ôAAA*‘)&ôþûG\ÖÝÝMGß÷DBB‚ß…QQ‘Itùòe¢¢¢ˆˆˆ 88˜€€T0"SIOψ‹iooç‹/1™L<þøã ¢""2>Ün7ÑÑÑ„„„¨6TdŠêôzøê«öa—ÿÝÿó&“‰3býîÜý·³RÇE RmØlC¦ä¥dí®¦yÜÞ¦T› [Z)yzÕYØl6ìëjéÐß°È=«««‹àà`…P¹éZý± ùÔè5nÆl6c6¡µ‰Ú’—ÉÚ}QNDîŽ/â@ `""Sôûo ¤PRv¿OEEÕüãÛK•P¯$*"""¢ :QLs’±x\¸ûj¸«v³.-¹ïö}2iëvSí{ï¾¹–âMé¤Ú}–p¾ãb1é66{eÎÞ¤ÛÑXAAÖR’m6löT2ó˸Ø‚‹I³Ù°¥PQšKzjï{¤çÇé”›«(ÌZŠÝf#9=w`ß"""" ¢÷7+ጉK˜mœ¥lÞ\BMƒ‡hël¬Ñ­4Ô”ðòæã½íH;ÎQ‘ÅžSÜѳ™íé]žµûë0ÙÇÓ\Ͷ—÷à šçvï$ÍÍl~~+Gjݘ0/ÚM}ù2²Ê·)uaëÕ¸F Gù6òËûÖè8GaÆfÕ6á Ãìªä7êuõŠˆˆˆ‚èÝ­•ÊUóûj;¿OÆŽZ<áKعs)ӷˉiv" ¶”r¸´˜Ò¢µÄ8kiêwÍ~ޏëF—S|ü0[¬@S9‡>IÔã tóËTºŒÌË+"7Ñ€³|?5ˆ^¹›¢ùíf…¨/¦Ìé{œV6¾_ÅñãÕ^€£ª‰À]µ‡C. n-‡+Ê({ÿ0­ºxEDDäÞ65†o &ÚxÜ4¹Z¡µœ=û—2gS"¦Ä\vn© ¬l7/§;8çh·Ošë\oZŒžg'€ÒJÏ’Ö·¼ãbß/Måi0c±šû—ÒXÓл¸d‹J|ª Gc½ís"‰}›E[§ xè:pÖô¾I\z – )+¬¼±Í¡+XDDDDïâJÊîÃÌ éuŸ£àùU9”Ëî%ï³®uÏg•ã2Ʊ --+\o;DC_츅‘ÂãÂimhâÐŽrV§ãi­kw²Öêû4„ÌsBÀ­‹PD¾©*sÖðNƒïk¡Ä$$±8s5)–±>‰¥ó•'¹6k1É3n¾Ç±‹5³³ŒúDäÖMá1CܸZ;p¯ÂX7Q¸)“‹—OXŒIì­mªªÆ @#e™vl¶¥ø65¯ ¨¨%á@ýn «Ý€‰˜ÙÑ½ïæ¶h·c·[ð8ª¨ª¹H똎3„èyñ4”Uõu`jäT™jCEd0Ó/ñÚ/É/_{¼ÍéÌå ïüä'Ÿos ­;ö'^¦ˆLˆ)P#ÚJåºg¨ èÀåê‹æÒ­`²˜V;2H¯4ãªu ˆ¦Ä5, Ï¢¼á Ò—VbÅA}“âRH·„ЗN!<ÓôDÖ¬›MùŽzNíØÏÅÛˆOËdvÉêKÒY嘇ÙUK£câ2MŒ©Ftzrß18Þàùgʈ£—.^D£b°X,ôVNZ™õÔSÌÜžÍ[N²p×2f¨ˆDä.35jD[]¸\®¾Ntâ ¶m!Ñ–´|6΋ƈ §ÓÈ‚-I4­µT:;À”Hþá·Y9/£«žú&#qóÖòvѺ¾öšƒÅ,ÙÄsf é;Ê!&Ý·b5á¬9EÓDâsy¼ûvZ_›Ó1IdKévž›ÑÕ€Ë8•+Õ[IDn&‚¤ì„6VQwµ÷•6g%»rV“±|9Ë—g²áõ£8Ú®p4ûŽ]óré­Udîuàuý~^®U`ëêŒa—¾½‡+U{û¶]NFv>Åu->;øàõVg,gùòÕlÝ[‰Ó£OUÄŸäååõŒ×Îzzzn˜ï­»»{`¾»»{`êêêøÙ?uvvb4)**Ò'$"~­¶¶–'Ÿ|’ààorƒª·h©õ5ö¯¶2¨¹fÛGl]µˆ¼wÉ™édïšW©›µ’Õ‹gÖvûJq$ÿ’½™Œž+|å'\HßËöùàqŒº>Ž]¬yµšöiI¬Ì~‹çG”òqÔKìßžLÄͶwóÊOªˆI‰e F®,f_u$¹û·27ì*•[_¡Ô°˜—ÒçÑ~žJ8³ž½[ç¡KGüHÿ³æÿîÝwÉÊʺayÁö×HI]Dbbâm¿OVVgà±ÂýS``àÀÏþ) €€€€'¿õÏ ‘CæoG°>~?fÀ—6¯cî /±09k€CõQ¶]ë«¢H°†¾Ÿ7Y€Pä¬çi«°23âÙ¯¾ÇW’Ɉ¼Éö-Wh1ÌdeòSÌŠ,¹DοF¤<Îc¼w% {3˜Û·­e}#Ù¯žà|Ë|æ+‰ŠZñ7?ŒýŠŠŠp5_óÛsVñgÞ6¼ˆ0À8ƒù 8.TñÁùK\¸TGÝ…vHaÛ±¬o°0ß§‡½Ñ’„ÅP…óšfŒ¾½qæ2FncçšÕÌLzŠ$»{Ò,¢ŒÐâtp½½‚UˇT$Î6DeJ„Ñ¢¢"VüÍØ³g‚¨ˆˆÜ{†3gÎP]¼ÒI¬ß•Ã,0m!¹ùÏc”Ž ‹Òç*S#Œöÿôg ¢""~«…3ïUÓós£ í£÷8Õ¶€×ögÓ;¬±‡óí^F¬©íüÖ÷:ù芇¹}ã${œÕ8½‘,‹4Þtû–ºƒ¼çœKú²ù<=k>O§/æ@ö«=ßB’ÅBèu'-aQÌí«ýô8òú±2×?M˜Æ-•)FDEDäžà½êä’ xi¿v…º“¥œ¸Éâ×2ðDDÚ~‰ê:'V•²÷L;Þ™WhñôÞÃKÛµ+´´Y ½Éú½ù°So½…eõ³Ìô\âØ“´?¹™ä(0\}û0©*­¢-4›ÅV-u'8}}s#C1Z—±,æöåï…Ì…D¶áhñ1œO½F¤B¨ˆßJNNΟˆ7òíQßß{~¤©»»›   –.]ªOHDüZSS?üð@ÏÔÛóg>=yœ³ÿ•S¿û¿ûÝ)þùþž¶ˆ$~ôÓŸ’öøý½_øQß%¦å GÿþøÍoÿ•/Ì‹yé¹ûø}ÅoøÃì¤X# l9ÇÉÇùçö$-úKbGYÿæ üöÜÖ=ëåDq ¿ù'†¹ÿ?Ýð=¢‚nþ~Oï/yÜs‰“‡S^qŠ3Ÿ‡‘ôæ°:ñA‚x€ïþe†ó'ùo‡ñ?þõ ˜ÿ‘³òãÁ ]7â_º»»èìþþÄéÓ§xü;ß!&&æ¶ß§¼¼œ®®®A½ãû{Èûö”:Áë5¯á›DD&Ñø ß$"÷²þ᛾újøØý•üqø¦@}ü""""2DEDDDDATDDDDDEDDDDDEDDDDATDDDDDATDDDDDEDä6 f-"2’ðpF£ÿ=VL#(‹ˆL"“ÉÄÕ«Wyä‘GT"SØÇÿëQYñÛ—Ï´Î$44ÔïÎ[5¢""“(66–ææfšššðx<*…ÐAÂÃMüEâ_ððÃÑÄÆÆúݹ«FTDdF¸|ù2ÍÍÍ £"STJꢿ#BCC‰õË[óª™dÝÝÝtvvª­¨ˆL¹ïÕˆŠˆL¢?ÿùÏ|òÉ'˜L&¦M›F@@€ EDôôôÐÑÑÁ'Ÿ|ÂO<Á}÷ݧ *""㣡¡“ÉÄý÷ßOpp0 £"2B{zz0 ÐÐÐ@||¼‚¨ˆˆŒööv¾õ­oa4 RˆÈ ‚‚‚èééÁårùݹùÑæZŠs³HKµc³ÙYš¾Žüâjš;ú—'Ýf֜ϹŽaæ'Jc1i66[Õ#¼oGu6› ûºZ:ôw)⺻» R‘Qƒ¨Á` ³³SAô^Òá,%ë™,öTÖÒàòš5”ïy™g6§q¸BLDÇ™‰¶˜·¾i)Lµa³¥Qܨ?(òE¨~£"2:m²ãÇß~”å¾A­°®¤è·g9{ö,ÿøîZfžšì©¦^Ñ”LaYNjע _DDDDDo9‡VRæˆcmÁ:§÷åÌ9+Èß8«Õ ôµæÖ|GcYKI¶Ù°ÙSÉÌ/ãb†í¿¥žZ@Ei.é©6l¶dÒóãìpRü|‡\ ìy&™ü±Þóo®¢0k)v›äô\Êœº!/""" ¢w½g ÑKI¶ø. Á’¾›ÒÒb –ÆŒ! V°ùù­©ucN\À¼h7õå;ÈÈ*|kßu„­oTã6VåÛÈ/o¢IÞ´–D#@8 6æ³Â2†ªÖŽsflæPmžð8Ì®JÞx£^W¬ˆˆˆ(ˆÞí<î¾ÚC“™ðo°gù~j<½r7E;ó)(ÚÍ 3P_L™ÓwM+߯âøñj¯ÀQÕD!XæÍÃj03'9™xÓÍß×]µ§·5n-‡+Ê({ÿ0­º`EDDÄøïðM¦¾ZG·‹V`úmí¤ƒÆššJV±¨ÄwYŽÆ°ôÍšI4÷þm4à¹í¾í8k.—žBoª…”VÞØæÐU+""" ¢wu™G4µ45URÛ˜‰%æëw®ày²Ž¸ˆ^ù.¥+FÛË×Ï|¶®ÝÉZ«o?úÌsBÀ­‹HDî"×Ïð³Üã$mû¯,2œâg¹ò½mÿ•Ó¿éŽÛ¹xêŸpÅÿûƾ÷ªçÈÁßpöüpñ$-!sùbCÇrœ£›÷³brÞnçǯ¿D¼A«ˆ¿òßÎJ–VÄ8(ÜV:йÈ}±ŒÂ#Mx€x{ £·Ö43;ºw;·…D»»Ý‚ÇQEUÍEZoù <¾Ùv!DÏë}rBCYU_§§FN•©6TDn!ûÆ oêKÎWçŸ.{ûæ›ùðíÝTü!–Ôÿ-ûãE˜Ï—RX\Gû„›ˆÜ«üøÉJ1¤¬¥rÕêkß cþÃÁÓ—Ãä±1ÑÍ7ɳi™Ì.ÙA}I:«ó0»j©q´bLÜB¦‰±Õˆ†„`\M*,IJeÉ7é'5=y K³(w¼ÁóÏ”G .]°"r BãÏ=vgöýÅY>üƒ™Ôm™,xà12W^$g÷qê®ÏÅ>mMDî~=ŠrH|&Åï¿Íʳ‰ O«‘ðèÙ¤l,âpaêØÚƤ±ûàR¬&œ5§¨qšH|.wßN#fÌGb!eM ÑFpÕTSëCÛÑD¶”nç¹ÙÑ] ¸ŒóX¹R½•D¤OsÿP˜Ë†¬,²s~Nqõx‡®s½šŸeÿNõÿ‡»ý3>Ü÷3r²³ÈÊÊáçŧ¨àl¯ãçÙ?ãÃúSÿ<—ì¬,6ü—Tá¾à·¹yT¸:ù÷w^aCñg´{Û1?:‹¹fŸl9ýa¦áå+ïŽȱµ_>ÅŸå•MÎÏPýE»>c‘)ÀÿŸ5?ÝκB;ëF\¾”Ò³K}àyÀŸFAiÚA5“²³™ƒ3¤½ˆ³g‡¬–ZÀñÔ‚Qï0û‰I%·8•\Ÿ×Ö­ÓE+2åy?ãà/~E]ìr^ü[+†Ë¿å’ŸSü@«cGL®œz»ã†¹)“Ú|XZÊÏJÁËILèüÇK?fQúËl›þîû%ç2wS‹¶m£=ïg8~XÀO“¦±é§¾ûo§þ·5¸îŸÅ£Ónñ|®×ñÎÏKù,þ‡¬^n%ø¿¥´äc¾ ~RŸµˆŸÓsåDDî1íçCµ÷IV¾øf?Kü‚ ^üëÇðºF®Eô^® ü‹x^üñsÌ},–Çfÿ€Ì¿Gèùq\ÿz½‡—¬dÑ쇙þð\-}\—ù` ÃÐ0=‡Ú/S}à5v×x±eþÇn±sQóÙ#œ7Ìãå/bnücÌþÁj^üÞú E¦€`ˆÈ½Ä‹ëâtšèÓÑ'”ø½L<Àõ>¼^þŒ/¿ú»_ɲÄÌå¯ Éðúô2nþÄõ‹GxçW8°’ºñoy.~Úmœ‹àÇ–ó°OØ}2–àj}Ú" ¢""rwéìM‰·Tñèøë6¥òð o~¡Óv Ø€Á0ö½^?³¼w>&tÞ‹lËHò ’""c£[ó""÷XÍðEÝ×ðrñ@.¹ÅŸ1R?¡ÐØXîÿò2_Þ?éÓ{§i_þ¥¿>Ë—ÞÛ8Œö:JŠÏóð_e[æ7 ¡Ìñf:?;Ë>çsùãËtêÃñ{ª¹ÇL›õCl¼Á;cå"+†/~KÉÙvÝø0†çÍðØ"}+’ÂbXþ=Ì_ÕQñë .Ïý[Ì` a4”NÚ]_p½ý1 Ž9ßù0©fçë|Þ3øŒi·L§Ûa=RÂÛ¿z˜Ì%V‚ÿýCJ«¿Ô-¢ *""wÐx2ú"‹ͯ~ñk:ï[ú&2âCáúH=Ì¢M¡ä ¿Þ]ÃWÁð¨ýE6-lŒ·øÍXmòÛßü‚_¸^åÇfà¢â_ YïÒù³àVšŠN³óòO½—sà¿!ôK~üC>|ç3}Ö"~. //¯g¼vÖÓÓsÃ|ÿkÝÝÝóÝÝÝSWW×ÀÏþ©³³£ÑHQQ‘>!ñkµµµ|ûÛß&8Xõ"2²ÎÎN>ÿüso{YYYx<‚ƒƒ ˜~öOØÛг~Pˆ2;ÔFTDDDD&…þ .""ãÊûÙ?ðö¯ÿ}äf§†‡Yôb&s§©¬DDEDDƑᱠyêøSâÞ IDAT’ˆÈðtk^DDDDDEDDDdêþꫯÆmgcí5ïÛs~h¯ùîîn:;;éîîÖ§#"""2Nþüç?ãõzéêêè)?\¯ùþòÑk>øþûïŸð z³á›‚‚‚0ºbDDDDÆÉ}÷ÝG`` †o‘¾/áÀÀþ/"2TWW—_Ž7¬ *"2‰BCCùòK=ÎRDF×ÚÚÊ}÷ݧ *""ã'..·ÛÍŸþô':;;U "2Hgg'úÓŸp»ÝÄÅÅùÝùiQ‘Itß}÷ñÄOÐÐÐ@cc£Â¨ˆ jÁÁßþX#ª *"r„Ñøøx„ˆL9º5/"""" ¢""""¢ *""""¢ *""""þG•DD&™ÇãáòåË´··ãñxT "2Àh4Jll¬_>uRATDd’Cè… ˆŒŒä¡‡"((H…""ºººp»Ý\¸p„„¿ £ ¢""“èòåËDEEAppð°Ïs‘©©§§‡žžBBB¾/üqQn·›èèhBBBT*"à âÁÄétúݹùog¥æ Òm6l6™Ç›¿~½ã"…©6l¶drÏuèê‘IÕÕÕEpp°B¨ˆŒDCBBü² ù”è5__øµn]È"r—~j¿6Ù™ß~­•”9u‹ˆˆˆ‚¨‚èÄ öRÑ<üòƪݬKKÆfë½eŸ¶n7Õýë:w³Ôfö´²Â,Rí6ì©™T5â<žKzrï6éù4öÝéïh¬  k)É66{*™ùe\T+‘©D­d®MO oì?Ç yÐYÊæÍ%Ô4xˆ¶ÎÆÝJCM /o>ΠÜÚtˆeNŒFð¸ê9²ùžßV…Ë´â(ßʶ*74W°ùù­©ucN\À¼h7õå;ÈÈ*£Q×›ˆˆˆÈT ¢²‘•Ñà:²ƒ²¦ÁËÜ.'¦Ù‰,ØRÊáÒbJ‹ÖଥÉ7µç±ýý ŽW¼ËsæÞ—fç½OÅñ ®ŒîÍ´õ8Ê÷Sãè•»)Ú™OAÑnV˜úbÔ:@DDDäkScø&c<™[R({¹’=…•$û,2%æ²sKee»y9ÝÁ9GÃöI3'?ÀDŒÀÌ« ÁÓ7¸l‡‡¦ššJV±¨ÄwM8;À¢«NDDD„)4ލɾ–uÖJvÔ”Péóº»6Ÿç³ÊqãX–Æ–.Š·¢á¶ÞÅ;ð›uíNÖZ}Ÿ~‚yŽB¨ˆÜa-‘“ýóßÜÅ2c%9Ù'Xøæ.R¢¾éŽÛ8_y’k³“<£ï»­¥ŽƒR]×À5¦gìÌ,aúDdl¦Ð˜!1,ÙòæA¯uà<^… °n*¢pS&)7®Û~0¢g÷Þ¦w»-$ÚíØí<Ž*ªj.ÒªëMD&’ÁBòâ…ã [¨;ö'ýÿá¾ÊÛ 8æ´ðlÎk¼–³Œ¨ºwÈßwš6•¼ˆŒÑ”z²RÈœ5l™WÎæšþ›ï!˜,f ÇŽ Ò+͸jß(0Æ¥e2»dõ%é¬rÌÃ쪥ÆÑŠ1q ™&]p"2¬?°’¿ÝwÿmÔ­âZè\fª6TDÆHÏ•¹Ç´Õ•RåM"{ÃÓ̵Z˜•²š ‹gâ½:rëLóï]I`CNOY-Xç>ÍKëúñ η|½ÞŒ²Y6wQ3žbÙ 3áš“€¾—†aÈIÕ®ŸPpÊ‹ý¥ õÓE°Š@Dä^âáÚ…+x#3|:!…1+s+³Z. »U»ÓÁõö V-²$g̘ÆLKèÀƒaØØ9HËùƒìzýHàÙ¼ídÌRu¨ˆ(ˆŠˆø//`4Ü4$ɯ0m!¹ùÏ3hC#aQ@`0b0Œ½:³å£×ÙðÖ¬çÍÕó™¡šP¹Eº5/"rO1‘WÎ|ÝÑçwe“½×ÁHý„B-B¯;i ‹"*ªwŠh9É’h¹ÎEm§Ù»¯Žé¿äÍl…P¹=ª¹ÇDÌMÇÎ6v½5“ìggah<ʾê6fæÍÀȵáã«uËb^a_þ^È\HdÛŽÃùÔkDñ}LjÂðÒví -mV çOð±7†g#¯RwúªÏE`M°¡`*" ¢""~(l/m_Ï}żþj ÞÐ8ì/æ³zV´Œ´Ñ –åçÁÞœ¢Ý0™ÉëÉ_iel™1’ûLŽ–¾ÊÖk¿$'òpcoí²^/îQƒ€¼¼¼žñÚYOOÏ óý¯uwwÌwwwL]]]?û§ÎÎNŒF#EEEú„DįÕÖÖòä“O¬zYgg'ü1‰‰‰·½¬¬,<ÁÁÁ L?û§€€ ìmÅÙ??(D™¿j#*""""“BATDDDDDEDDDDATDDDDDATDDDDDEDDDDDEDDDDATDDnCPPÝÝÝ*•×ëÅhô¿'E(ˆŠˆL"“ÉÄÕ«WU"2*—ËEhh¨‚¨ˆˆŒŸØØXš››ijjÂãñ¨@DdÇCSSÍÍÍÄÆÆúÝùé™r""“Èh4’ÀåË—innV‘¾#BCCIHHðË[ó ¢""wÁ?4?þ¸ BD¦œàâª?ò¿'ëëDÚáähI%WÓ“Ëyá?E(­ŠˆˆˆÈ¸SQQ‘©ãÆ»î!²b]@ѤÛò""""2AA”`BM&•ŒˆÈñx<\¾|™öövõš‘Aú{ÍÇÆÆª×¼ˆˆŒ½pá‘‘‘<ôÐC©PDd@WWn·› .øåN7ÑÎË”ÿݧ‘›ôšïl§ÑQG½£F—OÞN„ù¬³çòD¬‰a¿N;¯òOÿí>óôðàSi,zÜHç— œ;w‘Ï›\´yz ø~x(JWŸˆø½Ë—/EDDÁÁÁ ‚zzzèéé!$$dàûÂ߆z»­ÑN÷EN•ŸâS÷ÔÞîÆÕþ 5—?átÌS<óŸŸÄø N§ÓïÎíÖƒhû¿ñ»²S8ûš1£Çj‰&*ÜläSǧ¸<ÐÕxšß¼ßÁ²eILá]¼Íÿ~Ú@ðíï~‡oE™0zÝüés¿¿âþfgÖQKî÷³¨ÔÜ*s\<óÒײ)m“Ö¶ù8é‹¶á_»ùÌ ™äýˆÈ¤éêê"88X!TDF ¢!!!~Ù†üƒh;ÎSý!ÔHì_-᯦ӟz‚¹‰³9w²œšÆ.hù˜ÿu&iOE ;NTëg ôÜǼ$ñÈýtuuÑÕÁƒæhf˜ÿyüÎ2ÜŒ9:\.\ µ”ïX…“÷)N‹™œR1gÆm23æ–)|&ƒC®8Ö¾_FfÌmîGDî:IODFç¯Mvn-ˆº?åôå.ŒÖ”A!ôëõ-æ,Láê¡ÿΧpÿþc\±€Èa¿g ÄÙ“ˆ ¦««kÐÓ·gÓ)šYQô>›âC7‹×‘±§žúÂBªS ±OFµ¨)™Â²ä»g?"""¢ :ÿ¿¥zùZzOÌaÄ;Á!Ñ»m®¥xS:©v6[2iëvSÝØ·¬±˜4› [jUÇ È\šFáÿü é6¶ä|Îu@ÇÅBRm6li…”d’j·aOM'·ì"½‡á¤øù ¹ØóL2ùç:zoÍûì§÷CºHY~&K“mØlvRÓ7Q\ís°>ÇSQšKzjï1§çÇÙ¡?t¹+ƒh- ½1” ÌAí´·4y6‡÷m×ÎÕöÎáw9-ŠFlu‡ÚK…Älðàt4As›ŸßÊ‘Z7æÄÌ‹vS_¾ƒŒ¬2Ëxùåj .1‘Ùf7ŽS{ÈÚ\Ú»¼ãYì9åÀ=›ÙÑjJx9k÷ 0‹«’ÜmG¨ojùر£Ü%q6&—ƒÊ¼\Ñ D“¼i-‰F€plÌg…e˜ÿt\dwf;ÊëiÂÊìÙf\ŽSìyùyr«‡´¹uaëÕ¸F Gù6òËõ!"""ænÍwÑÞÞÿëe~wèïoX£Ç·ç»ïvž®á3¯1„‰ožo$Äl<´º:p”ï§ÆÑ+wS”i!¤ÃÁþŒ,ÕSæLcMc€è4r·¯#Ñä¤lG!Un®0Õìçˆ °näpi:14R–þ ;år¬!ßüõ;'ny—¼+¦ŽJV {lq¬--%Ó‚»zK_>Eížrœ©™XæÍÃjÚC­ËÌœädâMÀLwí~5æçx÷ý\æ„@cY:ÏìpP¹§’ö4¦¬meãû¥¤Ç€³8ç÷4à¨j¢#m”šn‘qt 5¢]xºnïMº:‡ß0hRuï¡ÃÕÛë,Ü@sMM%«XôýïóýEY}·À›p4vb]‚p ©„¬E6’Ówpμ„µù똮sN¢çÙéíúCZéYΞ­ ß·{x2k–Ìaº)dä Lr_M§iNñM54ŽqW­`NIÃÚ÷&1 V`pÖÒà\͉$ö…ähëôþ’Ñ_„ˆˆˆL˜[¨ ÂØ_}:›çþÆ~ðLCkDûbèîî¾;裑'€‹õ!¨é}Ùºv'k­¾íUC0Ï S*…s¨-/£¬²’ªÚZÊKj)/«dûá,cI!Ä4†ží:: 7©z|^—×Õ.âoÚ|p „“ç4^÷9“¹‹W²úi+a-‘“ýóßÜÅ2c%9Ù'Xøæ.R¾ñóBÚ8_y’k³“ËV.—‹VÂ1Ç%²dË»ìNï‹e1iì>¸…« gÍ)jœ&ŸËãÝ·ÓˆLöŠòž#1jk¨©wa¶¦°±¨€Ôé€)‘üÃo³r^FW=õMFâæ­åí¢uXnµ2n%y+ã¡É…Çl%eË»ìLîï^d!eM ÑFpÕTSë¦ðCâYWz-KfÝá ¶Þ…Ùº€µo$?QÕ¡"~£¥ŽcCRÆÂ¯ChŸ¨ùÙ¬_™LÄÐÊÊ–*r26Pyµ?Ë:øàõVg,gùòÕlÝ[9ðÄ<ÚN³5#‡ê*Ù»5›ŒåËÉܰ‹ª+à G³_áØ5/—ÞZEæ^Ç µ¯o‘3ç’é“Ñ"cˆÀKÛwtÚœ•ìÊYMÆò Vç좪±}È £/®Tíeëê –/_NFv>Åu-_o{õ4ÅùÙd._NÆê­ì­ºÒ{Ìm±5#‡ªóUìÚɆƒW•“DZ‹ÕÙÅœ®:ÀÖì –/_MÎëàlcørZÆ-uﻊcHß–«àq,˜9òÍÝP‹…ÐëNZ¢ˆŠê"ZNr ä#ZÆ£¯LÛiöî«cFú/y3ûf!ÔHdB$ÞKqŧó‘óŒs ëÝìx[êràè%ÂfÍçéÌ lßû g8z¾ˆ„(¸rfPǦó»²É¦“ÕðœœqúŒëì¬Æé`Väè2ƒáÚ.ùÜêo¹t†k†X"t ‹ DIˆÈ=—D™ÿÒjN¾²W_iäÙgíÌŠ‚+gNrôä%"ÿ’ä(Fì¬d´.cYÌ+ìËß ™ ‰l;ÃÑâc8ŸzH#cªí ÃKÛµ+´´Y‰Z){þ{cx6ò*u§¯ú¼qÖ+7ôô_FBé> ^ŸÁK/$`¼t‚U×Ç|¼^©*­¢-4›ÅV-u'8}}s#C‰˜‘Žmìzk&ÙÏÎÂÐx”}ÕmÌÌ›‘kc(ëvNíz Kö³Ìô\âØ“´'¬'yÆ0åà[> ˰‡ncß®ƒÒçq­Š’½ŸÍÌ1–±ˆ‚¨ˆˆÜ¢’ÉßÉÑÅœ,}‹cí9“¤_#3År“'¹Í`Y~ì=@qÁ)Ú Ó˜™¼žü•VÆv£8’ûLŽ–¾ÊÖk¿äÍՃ߯¥ñpcoí²]/o‘Lîvûö¾Ç[¯–gç…œtNìº4¦ã5Î]Mγ{9PRÀ«^0L›‰ý¥|V÷ö|â¥íë9°¯˜×_-Á‡ýÅ|VÏ cL£ëžäÅB9¹÷UJ®‡“´’¼—úFZ/ø¦ýYdoßLؾö½zŒöÐHç²=ÂnÆ‹|- //oÜzÝìŸýóÝ}íCÚˆöýìŸ:;;1é¿V[[Ë“O>Ip°êî6Ç.Öx'þ1£"Ãèììäã?&11ñ¶÷‘••…Çã!88˜   )00pàgÿ@@@½­8ûç…È!ó·#P­ˆˆˆˆLQ™º$""2 £uÅÅ*‘;I5¢""""¢ *"""" ¢""""" ¢""""¢ *""ã(((ˆîîn„ˆŒÊëõb4ú߀¶ ¢""“Èd2qõêU„ˆŒÊårª *""ã'66–ææfšššðx<*ÄãñÐÔÔDss3±±±~w~GTDdF¸|ù2ÍÍÍ £"rÃwDhh( ~yk>øË/¿·ö¬yßçÌ}Þ¼ï³æû×—±ˆL¥hüq„ˆÜQ­­­tvvz¾üÐgÌ÷?gÞ÷yópçž5<~•¢£Ñþ8(ˆvuu :É®®®þÓ#"""2N‚ƒƒééé@‡þô  ýôŽÑ    ¢ó===ƒÞ÷÷þåý'.""""ßÜКϡ5¢ý¿OhÏÀ7ZõïîîtrýÁÔ·¶TATDDDd|ƒhÞò œÃÍOTUÚ‘É Ç*QQQQ½ç4×Rœ›EZª›ÍÎÒôuäWÓÜ1þoå>·›Ìd6›uÕÐ|œt› [r>çFx¿Žê,l6öuµtÜÑr¸ù±|£õEDDDD}Bž³”¬g²ØSYKƒËxhrÔP¾çežÙ|œÆñ¡Ôî)¡¾Âg/!%1g&ÚbfBÊÕq‘ÂT6[Åý'9YÇ""""2?~|Q#e¹oPë¬+)z{‰ÓÁ}®˜u«öP_³ƒ=µ)$†ŒWúÃí'yÓ&–ZB€d Ë’ïŽâ0ÝEÇ""""‚?׈6VRæˆcmAo0ÍYAþÆyX­Vhtõ¾è¾HY~æÿÏÞý5}íû¿’QJ„š°œZ#U°~›h¿nÓö Þ*ÝýŠ{Ÿþ!NëÌ©zzÔÞðÌÔΜêÌÙÅÛ»µ{ÆîÛ#Þ™âÜ©øm{…NÝa÷nmüÒ‚VBíNt¨K IÜ?-þ~?f2&ù$Ÿ¬µòÃk}ÖúVÏ-ÜLY]çˆ}•‘oµbÍÝNuy …¹V¬V…Û*qù\”å-ç'@7U¯,¦¨Ú7öðv§Òuyd[­Ø K¨p]?îí÷T³}]6«kv.EÛ*hößBYV¯a¿ÀÍî—llkû0}òmX­á}äoØÅÈj !„BH½ ~W=nC6ÓÈ-L…»(//c{žüÍì*ZÃŽª&Ú0“‘¡Çë¬e÷ÆÕ”ÔùFïÔ{­;ëð©Õ@7ΪwØVå ØŠ‹ÉѨÉXû.2Ç÷7Rºf ûmâÒÐ{kع³iôc:«Ù²z+>ô–¥d|4Uí`ͺŠÑ‡ŒW–Í뱨âXºi¦1z}]ålÙ²zwƒ9³¡wý>°ÉÔ¿ IDAT6n©D²¨B!$ˆþ_¤ÛO§'nœÇù²ß èW±·ºœ²²J›njv×\ÊÌl:d§²²ŽëÓpÚÛð£Á”½”¬H5ÙlXŒ×‡?Ÿ}w¸§2m=ª+¨8t€MækòaÕ‡ÔÀ°v{ÞÛÆö=»(ÐMeT¸&X–¬,Ì:=™6³ucÔÛëB—aaiq9ÊË(ß³ž4—ƒ6™œ$„B ¢¿€N3”¸èça^‡“ ÏÉÇyŠqiæH(s ez }øªÁëLx®»W}3i…9˜4€ÆDNyÔc<õnÚö½Âòçžã¹åë"Ãìm8=þI* è,%¼W¼ŠÌæ]l,Ì#û¥Ýád!„Bˆ»ä¡¬¤3faÀA[[ O&ãհ׸}5ëz1¬ÝËŽ›„Ç»+0|ͼþ=Ö›GïkÐgjÀ79¯äslcõº*¼ê4–æçS\à¥ìýF…Bq×<¼=¢¦ Òœ”¾S><ÙÇ×\AéÁ6Àìl#‹5à­©Â94‰§v?NS6†ÉšTCÖlÜöÈÄ"µáUCñc†!\NŸ Kv6ÙÙ&N;öúæq{volclW¥/`Þ¼‡ÒÍEä˜|xåû „Bˆ»è!^¾ÉHþöõÔ¼²›&ÇNÖ,Þ‰:‘4·ôm6Ytèü¯S`¨e_Û~^yÉÅàÃÑÔèY¹y%ÆI,ÑtÛ묌[G•s'«_ª 7îkÒŸ)¿ˆŒ};hÚWÈ+Î,ô^õÎnÔ–bŠtL¬GT£AxÛØ_ZŠ©x36õèP¬3énœ;ÖPX£ÇëpÞFÐB!„¸}õ‚öšÙE”úk—fn5q† r6íá@i.ÓÃbCùǯÌÀàwâhò¢7/eý>fÛ¤­1:T Ååï²*ÀÚëÆ«ÎbíÚkf+óÙõq19f®úZê]:,«Þfïòo!›Èy=ƒ¼õu8|×b`Ê߯¦,j¼¸\j–o Ï´ïvPã’ÙJB!„¸ó¢Ö¯_?x;Oôû¯+ƒƒƒcÞ¼î2000æ%  …P©TI\\Ü GƒFþàuF¾ÿþ{ ¢Bˆ ç¶¡py³ËD…Bür½½½ÄÅÅ=áöèèhâââèíí•B<¸áXš@!î­ÁÁÁ[ ¡Àð!L׎2 !ăDzD…â> R©ÆúºÙs„B‚¨BˆÛ688ˆJ¥º¥c㣢¢P©TÒ#*„x ÉмBÜcC³Uoù<2ÓU!TÒ#*„÷ú‡8²\ÝíÌ@•¥î„ôïŸßïG£ÑHK!Ä=2t|è­„ÑÁÁÁááy!„xP)N:5| ¹{ª×Åñÿ:ƒ/$oŠâÑ ¢·s¬çб¥BñÀÑþþ~îm)—9朄P!Ä#)66–¾¾¾1Ïï<Þ¥¯¯ØØXi@!Ä+ú™gž¹‡Có!.Ÿù3_ý­7Ü Ø !Aiii´··“˜˜Ü|x~è,tííí¤¥¥I !Ü zoÿšV;óY–üªÛ×wÉ"„xô$''ó·¿ýS§N‘’’‚V«%::•J5<©¿¿Ÿ`0H?}}}\¸pŸÏÇœ9s¤…n½×PjbˆS =EºC…&FÃóÏ?O[[çÏŸÇï÷Óßß?|ðìø¡‹F£!%%ƒÁ0)çzBˆG6ˆ !„ÇFŒF£4†â‘! Ú !„B ¢B!„â ¢~¿_ZA!„BÜý zß,h/„B!­ z_,h/„B!9÷xAû«T†E,K  …ˆ¬V"„B!b 9=œB!„¸'ATš@!„BHB!„D…B!„ *„B!$ˆ !„B!AT!„BHB!„B‚¨B!„ *„B!ÄX¢úé§Û~r{{û¨ÛƒƒƒcÞ¼î2000æ% ŸæS¥RÉ»#„B1I:::ƒ(•J”J% …bÌKTTÔu`øß!×Þ¾­ :uêÔI«àXAt辆Сð9t½¿¿µZ-Ÿ!„BˆIòØcˆŽŽ¢7 ¥CT¡P ‡Î;DåmBˆ{«¯¯·ÛM__ýýýÒ Bˆ«A-:­VKZZZ­ö᫟¼ÅBqoCèwß}‡N§cÚ´i“Òà „xx â÷ûùî»ïxê©§º0*AT!î!·ÛN§cÊ”)DGG9ü%„xtCèàà *•Ѝ¨(Ün7³gÏ– *„brôööòøã£V«Q*•Ò Bˆë(•Jñz½]ÝÞ êw°ù¹uÔFß­Ö§‘UPBq‘…ékÕëÖ±x£uÖþ¼Ë‚F¾ÃBÜ·†' !Ä‚¨J¥z(!$ÖUÇéÑëõÄ©!àuS»{[*<òÉBÜ?Ä YÒY1¾‡õGà×Ï@AY5ÕÕÕØëŽ±·À@S¹‰¢B!„ *Aô.Ñ`¶™Qt·áóƒÇ¾‹ ù6¬V+V«ü »¨ë¼úŒÎºÛ³s)Ü\†cBÛ]”åY±ZsÙÞì|Ø×Y±Z­ä–6ã:+ ±Z­ØJø|ÍTl+"ÏfÅjÍ&·p3e# ã)#ßjÅš»{åvŠòò)möC§Òuyd[­Ø K¨pùå+„B ¢÷?N»“€ÞŒ¾­œ-[öQï`0g`6tã®ßÇÆ-•tx*ظqõnH³XÈÐûpÖîfÝ–òpoê¸Û deé/MM^ð{¨s…KámtâÃ3rGfŽ¿™]EkØQÕDf22ôxµìÞ¸š’:ßèjxk(yç MmÝh¢tÍö;ÚÄ¥¡÷Ö°sg“|²…B!AôÞkcQ.¹¹¹äf/æ•ým€š¥¯ÛÐx]è2,,-.ç@yå{Ö“àrÐæ¿ËŽÀOÉ»{(;PNñÊ,²ô^¼7Ý®Á”›pÙ]ø|Nš¼¾£·¯ ‡3d“¡Ãçøýn@¿Š½Õ唕Ur¨Ø tS³»†Îkje)ÞË‘?b­çCö{´õ¨® âÐ6™åƒ-„B ¢÷…@·¯×‹7Ä™É)ÞË6›¥„÷ŠW‘Ù¼‹…yd¿´÷ˆçiÌ+Y´ícÝr+¶Â4êW²~Û25ÙžG&pÖãtÚq¡''ß ÝÍ4ºq´i9X¦ƒ×î©ÕçäcŽLs7.-À Æî‘£íq6^_™Ét´Õ7V˜ƒIhLäHB!„Ñû€µ¾æë¯#{9Ûóg£|Žm¬^³•ÝU.â,ù¿]î2=—ÒêCì)^KŽÅ@Àí jßVÖäm¦ºsÛuä˜oÕ5Nj399Ypc¯©Áè³-èoZ‡kŽùÔèÂǹ !Q—ùöð'þöòu[BQñÉ—œH+M–÷Ÿ~zŒ‹!i !$ˆN?®J;^À¼y¥›‹È1ù¹T¬§º”’w>¤ÑTÄö=•Ôýy/ ÛAm›ÿ¦Ûa:–àæ`Ul˜MÌjhª¨§›8,6@o O¢òÖTáŒäNOíþðп)Ø‹j0d…ϰரž£ä¡¶Â)Ÿl!„BÜ÷á3+iЙô@7Îk(¬Ñãu8éñÎC]M-55v*-™ý.êÛu&K t¾ñ·²²Ðï>ˆÐ[2Ðëtd Ö~ÜÊÈ8¼Îò:†Zöµíç•—X >Mm€ž•›Wb¼A-¦Û^geÜ:ªœ;YýRi¸q{åƒ-„B ¢÷5Sþ669JØ]߆Ëe`eñ&Ü¥;qt;¨qùÙœ½=o—²óÃŽzܨћsX[\Lît`úM¶S.êƒÔÀ”mDƒsf¸»ÁœƒY7”‹g³¡ücŒ¥;(³7áhR£7/¥`}1E–qΤ±P\þ.ê’ÝT5¹ñ²X»Ö˾}Ò+*„qÙåàä·¸ä@“ÈLË"æÏІ7¼8O:8Ûþ3þ is±Xf¯çù²ò,3—˜i?Õ@—ñy–Ï›:zïÞã>®Å27ÄÙÓ..õª˜fLgá3ñ‘ã‡]ç8uâ4­?û@…Θ΂éèÕ7+ß¶…8{äsÎsY1o*„ºh8ü-ÊÙ䮘ÇTBt5æ‹öt^\n&¶¯†ã\½U:b> çÍ@ËëxµÌATÓ’™k–1y!’’’ÁÉÚÙàààu·‡î¾=000ê ……BÃ×ûûûQ«Õ|ôÑGò !j‡ƒÔÔT¢£o¥_à2ß®æBJ$Œ ‡ñim ~óɽ ùÂ….sé‰JzÏ5pòB Kò~Í u羋¼T:Î⿘$®¯c³‘•i<¿8½HZÄ"ßaŽºäã$Ä AT!RÊ„tfÆÖRWyˆc2É))¤$'«„¾./þàÏ|õÙ'×<+†®‘à¦!)I{“W‰'9þj7¡2>™x…‹öžæØ©¤ÎTâípá¼è¥ãR;íA†z¯|Œ·->…œ÷жûPͰðDO;e+—I ]§¤ï±³Ð¨‚6!™˜]}¤º¶Ž!z:zP$ÌG7\%%ñÉñ($ˆ !AT!DØÍ–pS¨“˜¿|³.¶Òêñp¡¡–ÆSFž]¾˜¤ y‚%¶ô¡+üLU,J´Š[‹Ž,Æ2ôµsâ˯¸ |“)•™óg1Óiçxp¨7._ªv¼mzRuAÎvtá½D7/¤}ç¼ti/ŒŸC¼:\…›÷vê(„˜´ ÚÑÑqka+•¨T*bcc‡Bq7iÑÅBoG=LåêÀyˆ.—M2Z%ôµËé®d¦§bNJÅœ9 Çᣜ½ØGr|<*}êX†æ.…¼ßr쬖ù‹Ì·°Vq­]!’#O†º.Ð5 Å£$pñ4î`Ï/_æ&ÄÅàCSÆ+_’ÚyÃm©©ZM±8~øs}1ÌÔ©Qi“Ð6œãW±³ôhE¼EoŸ™ØHû.µÒ«Ðžu]|MŒeàÌy|¡Ãeîjíb`+> !n#ˆÆ[zB(¢··—Ÿ~ú‰Ç{L¨BÜujfÌŸî‹S|ù—æÍL"F ë| î /˜‹^ |¸]U ™¥WÐ×ÞB«_ÃŒXJ}:éºjNÚOÀü™ÄZ9ÛÐLWòóááï Oâ>~œø…éèC^Î:~ ˜ø,¦© ì‹E¼Ä…ö.´z¾óœðHðÑJB5NùÁoÐ&Í@õM ?kž@¯¥ÖH<-\ðÅ0;1ÍՉ館j9yü[”™©h{\48.3kY8dŽQÇØÔtOòÕ±©,˜›ˆÒÛ‚Ãå—œw*ˆÞê”J%:]xÍ¡žžžáëB!îeü<ž>–††³4Ô5DF—ȬìeÌMwÿ©gXX<ûކ¯¸0 M) lXôJ`*é¶¥pâ _¹ *4$˜žÅ6_Ï- T+癹*Î8Ê7~:ãÓØ¤†—GJšÏ‚'Žá¨û‚E ¦Lg«8yüÇÎ%’c¾qù”ŒWvPêŒ$©Z¸ŸLŒ`*)ñàñ%’<ÔE¬Lbá Ù¨O6pòh3AU ‰³–ð¼ø×QkbÉ !Nž8Íñ£¨¦¥0wq&-Çef!·ß~û¶–o …Btvv’0|Ÿ,ß$„·æö–oº?„¼Ç©ü*Dvž,k$Äö°.ßtÛãêJ¥’PHùB!„w9ˆ !„BñKÈòMB!n‹R¿ˆ—_–vBÜ>éB!„D…B!„Q!„B!$ˆ !„B ¢B!&óGX¡¸n f!„¸V(z ×– *„÷±˜˜._¾, !„Www7Z­V‚¨BˆÉ“––†Ïçã§Ÿ~¢¿¿_D1J??ýô>Ÿ´´´‡®~²Ž¨BÜCZ­–§žz ·ÛÇã‘0*„Ô¢£‡'ÆÑè?ü0|-æ)~óOKx\¢©BÜõ0:{öli!Ä#çêÐ|ïϤ=„B!Ä]¢1ÓPK{!„Bˆ»$úõ×_—VB!„wÌšB!„÷„LMBˆ{¬¯¯·ÛM__ŸÌšBŒj‘Yóiiiç¬yy‹…âÞ†Ðï¾ûNÇ´iÓˆŠŠ’FB Äï÷óÝwß=”K8IBˆ{Èív£Óé˜2e ÑÑÑDEEIB ‡ÐÁÁAT*QQQ¸Ýî‡n©7 ¢Bqõööòøã£V«Q*•Ò Bˆë(•Jñz½]ÝþÉJÊJÖ‘Ÿ›ÕšM^á¶•ÕÑéŸü—ò5î¢ÈfÅjÍfC:+)´Z±Ú¶Ñè—/Òdó×­Ãjµ’½Á4¯xP  T*%„ !Æ ¢*•ê¡<†ü¡îõ»ÊÙX¸Lj•úÛœõT9ë©q¼Í]y'/†âؽ¦nˆËXIŽÐè0¤éñéô²F«âÆ= YÀD1¾‡õ‡ø×ÏCEI$„š×²çÈ×|ýõ×üyïz2€@ýv;&³ÍχmófòLÐÙ(­¨¦²l³5ò%B!„ÑG#ˆzj¨p¤±~û,ÓÃwë2 ض) ³Ù žÈ±¾f*¶‘VÏ-ÜLY]çˆ}•‘oµbÍÝNuy …¹V¬V…Û*qù\”å-ç'@7U¯,¦¨ÚwýÐüˆýØ+·S”—OéŸß'ÏjÅšWJEé:r³­dç±ÝîÁUYB¡m赪ñŒ‘›ýÍ¥äZ­XóK©Ø^y~!%Í£†«=ö]lÈ·aµ†÷—¿a#«ØY7b{v.…›ËpLh»‹²<+Vk.Û›ý€û:+V«•ÜÒp:+ ±Z­ØJ"Cè·ÐÞÃíÔì‡N;¥ëòȶZ±–Pá’y!„B‚è}ÈïªÇ `ÈÃf¹Eƒ©pååelÏ3‚¿™]EkØQÕDf22ôxµìÞ¸š’:ßèz²ug>µèÆYõÛª<€[q19z5kßeCæ8ƒñÞJÞ9HS[÷ÕûÚö³£Â…Z o·¼Äêwìxuq‘×ÚÊ;vß÷éÞÏŽ*&K:¯“škØX w®r¶lÙG½;€ÁœÙл~·TÒ à©`ãÆ}Ô»!Íb!CïÃY»›u[ÊñÜt»¬,=à¥©É ~u®H5øðãŒÜ‘™cFsKí=¢M”®ÙÂ~G¸4ôÞvîl’o°B!AôþðEzËtzâÆyœÏñ!ûÝ€~{«Ë)+«äP±è¦fw £mfÓ!;••uXŸ€ÓÞ† ¦ì¥dE‚¨ÉfÃb,ÞR¼—#>ÄúˆLPPgñî¡j*«÷²J¾+ãíCTWVóñZC8O6yÆ™”“Æúòröì*ãÀ–8vWá|^º K‹Ë9P^Fùžõ¤¸´ùÁï²ã0äSòîÊ”S¼2‹,½ïM·k0åf \v>Ÿ“&/„ï¨ÇíkÃá ädèn±½¯¶ÓZχì÷ië9P]AÅ¡l2ËX!„x$ƒh(º¿gyê"AÐç¥{œ‡yN€>'sä)Æ¥˜#AÍ=2ùé-X"!Ñ`õng¾vœ×Wf2]§A3bß³§F5€žL³Р3FzWÇ{)ƒ ›)¼7]f>³Úêñø@g)á½âUd6ïbcaÙ/í÷GhÌ+Y´ícÝr+¶Â4êW²~Û25ÙžG&pÖãtÚq¡''ß ÝÍ4ºq´i9X¦ßb{·´Õ7‡ãva&  1‘S IT!„x$ƒhoo/*•êþÍ¡Æ, m58<#·øiÜžG¶5›ü]ÍÆÝË:Q£»³èøýW¯¼æslcõš­ì®rgɧøí‚pèé¹”VbOñZr,nUû¶²&o3ÕØ®Ë Ç x먮qP›ÉÉÉ€{M .@ŸmAÓ:øïB; ñ xqÿ’#‡*øä“Oøôð—wzoò»vkúZOp¤â>=~‘Pß9j*Žp®çNUè2ßþ„Ãß^¾¾óãâ1*>ù’óyÛ'KÈ{‚O?=ÆÅ´…x€‚h(ÂçóÑÓÓCllìý[3SiNJß)§9’q|Í”l#ÌÎ6b°˜QÞš*œ‘Çxj÷‡‡¢MÙ”Ùîmvª"è´ï§ - “ΫҎ0oÞCéæ"rL>F.‰ë©.¥äi4±}O%uÞKèvPÛæ¿év˜Ž%Ǹ9XÕf“³š*êé&‹Í„ÐßV{k0d…Ï$á®°G&ˆy¨ ÏFâÑÔãâ/Ÿå›®XŒó±dɳd&+¹øÍQŽ~ÛÅäd‹>ÚO» ¤d³ì™$”ŠxL³ž ^%Í/„˜Ñç–ž0´¨êc=vŸ¯}g$ûzj^ÙM“c'kïDÈ8}ÜÒ·ÙdÑ¡ó¿N¡–}mûyå%ƒGS gåæ•“¸ÎèO¢ì%{š¯ÛK5YVbBƒË¤ºqîXCa¯Ã9êpÎC]M-55v*-™ý.êÛu&K t¾ñ·²²Ðï>ˆÐ[2Ðëtd Ö~ÜÊÈ8¼Îr{í=Ýö:+ãÖQåÜÉê—*HÃÛ+_`ñ¨ ÐêpðcL&Ë^H'~è(©©ÌÐÕðù©ZÓm¤þâ!…Ú$=±‘C†ÌóôÒüBˆÉ ¢‰‰‰må4³‹(;df׎±;špw«‰3˜É.ØÀ¦B ÓÃbCùÇKwPfoÂѤFo^JÁúbŠ,ÐâŸikyÛÖćûôfr^›·máãXMùÛØä(aw}.—•Å›p—îÄÑí Æågsövö¼]ÊÎkp8êq£FoÎamq1¹Óé7ÙhL¹d¨RS¶ jÌ™qàîsfÝð›r{í­±P\þ.ê’ÝT5¹ñ²X»Ö˾}Ò+*A}íœýŒKž¸B#bSòl¨ íÀÕÇ6wàêè%¨ÒñøóY8oZ€@+_Vž&eñLºNŸåÂ¥^”ºæg/À45ȹšÏùÆœ¬¤¢u)/[zùòðYf._ÎLÕy¾¬<ËÌ%fÚO5Ðe|žåé¾ðþ¥ÒÞx–} Ky†ì9pöd.ùQêÒxfÉBRÑ€ZˆË.'¿½À%ÿŠ˜DfZ1†6’Ó½8O:8Ûþ3þ is±Xf†Û*0F¹çM½wïq×b™âìi—zUL3¦³p™øH¸tãÔ‰Ó´þìg:c: ¤£W߬|7Úâì‘Ï9gÌeż©ê¢áð´(g“»bS ÑÕp˜/ÚÓyq¹™Øqß×±ëxµÌATÓ’™k–1yqïE•”” NÖί»=tßÀÀÀðíQ—P(D(¾ÞßßZ­æ£>’wè&üÍ¥¼´f?Þ´Mª(|€zp…‡ƒÔÔT¢£'~¢»÷8•G/3?/“vÜâ8|Wìld¦¢ísÑx²…Óó¬°èQZùò³:|1“n™OJŒ–º:Z´Ïò[*jzp9‚+}9&-ô¹¨D?;I_L,ú™é˜Œ)ÌжóågutéÒX°µˆm IDATh.ñ=gùªîzÓ˜µh!³b»h´Ÿ¤ÝøBÀmgŸ¾Ëô)˜oJ&I Ä/!&µ‡X%„ºÎrÚ—È¢ç1C Oü"¶p±/•TÅ哊”E‹0')=zm‡žá|O*f­Šs0ÓdŠô€Æ£¼p{Oà¦å»ñ6%Zcªsçé ˜Hìj¥7ÆHb°ƒÖË!LŠ..ô¨HLÑê86÷ut{œü¨LãùÅéè•@Ò"ùsÔ%_'qoIBˆBŠËôÇJs!ú.÷ÒN%Ôåc vú½¦Ú„db\tõA’ @ƒ~Äì#…òVf±jHJº¦KV¡E3a•(P ×S©üås ” éÌŒ­¥®ò Æd’SRHIN"V }]^üÁŸùê³O®yV ]"ÁmŒr_'žäÇ=(㓉W¸hï aŽJêL%Þ΋^:.µÓÞdhHj¼ò1Þ¶øppÞ@ÛîC5ÃÂ=í4z|”­\&t’¾&ö¾^­cˆžŽ óÑ WII|r< ¢B‚¨ø%4³7Sýõfi!!Ê©3ˆ¡•Ö®¦×ô[Z9^ýWBÏþ† µJŠÛì›T(Ñ*&wL÷f½°Juó—¯bÖÅVZ=.4ÔÒxÊȳË“4O°Ä–>"t…Ÿ©Š%Ük{[åŽè ¯_~Ååã˜L©Ìœ?‹™N;ǃC•¸qùRµãmÓ“ª r¶£ ïÅ ºy $õèè;ç¥K{‰`üâÕLly®;ðÞqGþ®–&BˆŒvé‰ài8‹÷šù&=Zè`&½m¼EoßÕí}—ZéUèˆ×Þ—C ½Œ^ª4D—ÇË€&­úÚ¿ÅqÖ‹*)óüE¼°âyžPx8{±U|<*}êXbcÃmß9 ç黥¹9]´v]}B¨ë]Z’b”.žÆLöì×XÒM̈E^2k¼ò· ´$šbéqýÀ¹Þ’ujTú$´¾süàê!Ö¤G ·ñ¾*‰MŒeàÒy|¡mÚÚÅ€|›Ä=&=¢Bñà%QRXøáÈIŽñ1;=…¤X¸Üúg¸D̬e˜bA©M'EUËÉãߢÌLEÛã¢ÁÞ®W÷ݤi53æÏF÷Å)¾üKóf&£ Ðu¾…FwÇÌE¯„>\.‚ª…ÌÒ+èko¡Õ¯aF¬ ¥>t]5'í'`þLb­œmh¦+ùùðð÷„ëÄ}ü8ñ Óч¼œuü@0ñYLSAÙ‹*x‰ í]hõ |ç9á 2à£/”„jœò)‚7Þ Mšê›~Ö<^ J­‘xZ¸à‹avbøxOuâ­¿¯±©é$6žä«cSY07¥·‡Ë/_%!AT!Ämˆ5a[ÃYGçÿJsT1 Ÿyžù3ãÃCØÊ$¾úd'6TÅ8k /Ì‹ç~´UÆÏãùçcih8KC]3Aht‰ÌÊ^ÆÜäpwŸz†…ųOàhøŠ  Ð$²À†E¯¦’n[ 'NÑð•› BC‚éYlóõ·VgÅã<3WŹGùƯBg|Û‚ÔðòHIóYðÄ1u_Тˆ!Á”Éâl'ŸâعDrÌ7.Ÿ’ñÊJ‘$U ⓉQL%%<¾D’‡æVÝÎûª5±ä…'OœæøÑFTÓR˜»8“–ã² ³¸·dù&!„¸‡ngù&qg…¼Ç©ü*Dvž,k$îëòMrŒ¨B!„¸'$ˆ !„Bˆ{BÆ‚„Bˆ”úE¼ü²´ƒwƒôˆ !„B ¢B!„B‚¨B!„wTôÞ½ÿS’™cÉbÞ¯bè÷þ•‡ÎpeÚBV¯š‹èmùŒÿ÷¿.¡þ‡ü£-‰hß·<ààç)³yÞ íL.g§tðmý δ^âJHÍ4£ë" ÆÈúgýÝ.¾®û_¸ì& Ô’ð«9ÌŸoB'ï…B!ÄºÒÆ™F'm—®TjѧÌÁb™…>r~Ý+žþzê{<—DEOá1ã.ÊÄ{gÊ£HLœÂ•Kçq|ñ?±ÿý6βpåoÔþW3Ýè¤îÐç/ˆK$1.ÄÏž&¾¬qp©¸ââ/•ÿÅ÷h“~ÅŒ˜ ^—ƒ/ÿò½òÙB<‚ Åuk0 !Äu2úåë ÷ýSiÀí ¢ÑÏàñ˜ —Üÿ‹/jÏÑ Ðó=vû<—aÚã3]ä§ §¨¶ŸÁw§~W®ü-«³€süí¶ጬücáj2{¿¥ù °ÿ±j%+V¿Ì¢ ûßýÔÏÏç¾Å‚Ø9Ïñü’gÉzî×ÌÒ—šù›O>dBˆGOLL —/_–†BŒ«»»­Vû‹öá»à¤sbž\Èâ…ÿÿ=›'µ€÷,ç.Cèòßù v —äð¿¿´‚E3µW¸Ògê  KCBýqéçv~îO'ñVö Neþ“IÄDÃO?—œŒDÇì¼µÌüýTx{Ï™>=îwôòsob£ä“&„x¤¤¥¥ñÝwß¡P(Ðétr†%!Ä(ýýýø|>|>O=õÔ/ÚWïÅîð¿ß£ú\8s…ÏŽÔCWOeÂ?ð+U;ï9ÍN£ž6ƒÔT3Ï,x‚éwè§éšÝ†n}Juäܶý„Æ}úÕ=½„yñЧùŒB¯ä'„x¤hµZžzê)Ün7‡þþ~i!ÄÕ =ü;ñK{D‡LM·2÷1ÕˆSzªˆÑ+A›Æ¯W%rñoçøÞíæïä\ÓœsºøõË/0ó' à;†KÓ’‰‹†h¥2.¯\âJ?è¢{é8ß}Ó]Å͈ƒ3ÝtŸo¥ËÏ4|4þ)Ç;¦0kEéÓãàÇnÁ©$tD \æüéïh¿‹1>A>mBˆG6ŒÎž=[BqGÅ<=ô÷Ç¡<µ¢¿ÿžvÿTÒgÐã>Å·ž Ͳ²$ç¢|ýù¾ëþ‘ ÝýÌŒUM~ýÿª>¡½£˜Â“ Ÿ Ï^Ÿ2ƒe#Ýï9\ÞÊ®pe¥šóyR}„ï>Á¡OþF—èèÁ4OMfªy.ÓOÿ•Î3GøâÒ 4W~¤í§ÊÄÿÆ“*¤CT!„âÑ¥=I|Ë7t}ÿ_ù’˜â÷rñr?Ê$ O©A¥îÁãnÅínåoO'nà2žn@9”¸;36¯hï¸Â”„T,Ë^b‰!ò"š_‘µt‰S€Pe²,è±ÔXò?–‘™< å•:º•L3>à 9¦Eqfž{q!i©¸ÜöwÚ}j’f.À¶ø bäó!„BqçÄš°.ž‹qj4ÝÛù±[EâVžÿï3‰Ô†lþ·EOòx,üü£OgS3± ÷ןƒÁ€F£‘ÞP!î’þ`€+WÆ>±ùÞ‡“¥§OŸNssóC÷^<“•üÍ¥äZ­X­VòÊ\“³ÓÎJ ­V¬¶m4ú'¹ÀwrßwcÿBˆ …BÃ3X…âFÔjõCy ù#Dý¸ªjðFnµUعå(êo¦4׊՚O™ç.Y£Ã¦Ç`Òó‹«ì“¹ÿû©Ý„xPˆ²€‰âÑôðÍû]TÕx¯Þn«¤ÎS„Éx—Yg£´Âöàî_!„b"ˆ?ü9´Š/ _Éz‹pSa¿Ú=7êÝ æ ̆nÜõûظ¥’Λ•ýj¿…rdëÎ:|j5гê¶Uy&ØnF² 2"ï#Øý.j ƒËô«OwïgG•“%×IÍŽ5lj×Îj¶¬ÞÊA‡½e)YMU;X³®"ü¾z*ظqõnH³XÈÐûpÖîfÝ–rä!„B‚è]ÒFeMGVž™é«°8+¨Ÿp"Ñ`ÊʬГi³1[7r{ë?®¦²²š½zšëÛð>LJìwúUì­.§¬¬’CÅf ›šÝ5\ÛAg)ÞË‘?býÌÑGLLÏÞLé®]ìÚõ6ùq‘`˜±‰m9Óñy]è2,,-.ç@yå{Ö“àrÐæ¿YÙÃn­œf6²SYYÇõi8ímø'ØnÓ³ "ïAø]5ÔwŒÌ¡Æúòröì*ãÀ–8vWá\URÃÚ]ìyoÛ÷ì¢@4•Qá¿ËŽÀOÉ»{(;PNñÊ,²ô^¼29K!„ zW¸*©iÔÙä™50ÝÂÊ 'õ“4N—‰Å¤4Ìá JdR›×á$èsò1G:"K 0G‚¢{d(гñúÊL¦ë4hÆ|!?®òl©í†¸¥¼÷^!& è,%¼W¼ŠÌæ]l,Ì#û¥Ý¸o± ·TN½K¤šóôHuo!Ýé²)°4RÕØ‰×Q‡È(°0*‡lØ"½·ºÌ|f´ÕãñùñÔ‡kضï–?÷Ï-_9  §ÇƼ’¥q@Û>Ö-·b+ÜA£~%ë·m S#_z!„â~ÝÝÝ=i;¼fØÁÁÁáû†® ÿ;ò …†ÿ …Bô÷÷OB­¡ PúÅ5£¶9+ëéÌÏCwÏšþšð¦Ñ;ƒÝç(eÝN'` `×vlÓ‡î߯êuUxÕi,Íϧ¸ÀKÙ;ûo9ŒN¸œ¿˜KAjG=ŽŠzìmnÀ2zX~(Þú!œÊ#î ·“yý{¬7l5 úL èr)­ÎÄQUAEM v‡ƒª}ª*jx÷@)¹Óå‹/Äh=œ®ù‚޹/bKVCÏ ¶¾¾ÿñ/'OÒKtÕðÖŸ³ìÿ|Ÿœ¤I,ë¤í÷î 8?àõí½¼õá[ÌU˧ð¡äodûK¯pÐKxÔñPÉ=íéíí% ¢T*Q*•(ŠáG^¢¢¢†ÿ:ÁÆX'Û˜Œ“o<Ä=¢®È°<§G¯ºÄ…ïkª ¾4u8Øx‘aÛNšì7·ŒÌD7¥·˜QÞš*œ‘<ç©Ý66ec˜è‡ÑSIɆƒxQ“Q¼‡Íßb?®Êð1°æÍ{(Ý\DŽÉ‡÷Ë>iå¼ñÏí¨×ÖYò±¨!P»›ÝNÀ²Šërh›ªHa:íûiHˤÓaÌ'ëó™°dg“m"à´c¯o¦ðT—Rò·4šŠØ¾§’º?ï¥Àt;¨m“±y!ÆH‰4|ö _¸‚wî%T&l/.Ã;Ée´ý q'øpý§ìu㓹Nt\\ܤíl¼Ñ¡žÐõ†ŽìíïïÿåçR–Ïâ•»ÈîúôPžÿ;ÝMT8:É˶`V»ŠWž«GïµM£AxÛØ_ZŠ©x3¶ OgyC-ûÚöóÊK,ަ6@ÏÊÍ+1NðClßñõØKÙ\ ¶Íšô@7Îk(¬Ñãu8é¾Å²ON9Ç0Ök…‚,5õµ^€eÕ5Ãòá$ÊþWr±§iðº½P“µa%&€ü"2öí i_!¯8³Ð{Ô;»Q[Š)ÒNç¡®¦–š;•–LŒ~õm€:“¥›➈5³bùÁÙ¯¡˜˜ÀðI4†zDoÔ+:Ô3 Ò#zë9Ô–ÏÌ'sÔø»‘ì¼pZÓA>]6ÅÛ ÈÐjsÅë¯ýQ3‘óz5xëëpø&Ø«¦™Í†ò)^™ÁïÄÑäEo^Êú?|Ì6ËÄ‘øO(/MõµÔÖ†/5^ ùÛØ”e@—KÍÒâMá™êÝj\þ‰•}’Êy½½¶ŽÌü¬È»…UÙcŒ•§­åíµ³¡ÍK@o&§x/ï `Ìg×ÇÅä˜u¸êk©wé°¬z›½ÈÇè²·³çíUX àvÔSßäEoÎaÓží2,/Z=®Þë5ÖüîwüîwE¼ùûOqöD6^¬áÍ5oQÓuõñ]5o±æ­ºhåÓ7þ•Ï:‚´ü_¯Pôsx£«5¼Ïßýîw½ù>öÖ¥w5P¶í Š~÷;~Wô&ï~ÜÀðî{ޱuÍ[ØOÛyÿÍ"Þü¸ºì¼µæMj.Bàôï#åyy?¹7©Ëe±ß›—ë[×¼Åá†>Øúkƪ×Í\<1¼ÿ5¯må{ëÕŸñ^{T½ÖðÚ[ïc÷\szÉ'‡ÿ¯­ ·ÇÖjpä³-nQ%%%ƒ“µ³Éîýè><׫˜¬¿v‘·zm–wùóžÜácuýÍ¥¼´f?Þ´Mª(Ä(-%r‡ƒ§Ÿ~šèè_p~‘€“^ÿ7æ®åµgÛs†ÏÿXŽÓö|PdB}±†7ÿõ ^üà÷äÄ_ ¢o|±Œ~ŸC| •ÿõÿàLá¼»8>Ø^y–iO³ö"æÇ´ðùÿÈñ[Ø»m!±'zãß°'ý†.\L|—ò?~ÎEÛ¿óÁkfÔ=ÇØúÊéJLdÖ²—±-Èf~lo½ñiäXÎzº‚„×8?ÞÊ{ óyûý7˜«ºI]®-k—ýê~ãoV®p½ZŸæå׊ÈNlåóß¿ÇçñÿÂÞm‹‰@;ÿéã„i-oüv.*×§¼ÿ70·äÞœÓ:þkwàÝ7Þ£eN!ÿüòÔ®ÏøÓ¾“t¨ðöÞ·˜«¾HÍÖ¥\õbøù½§ùüOû8iü>غ˜xùªLª¡sÍÿçÞ½¬[·îºíÛßýwrr—c±X&¾ã‘Ç„ÞÌm3êp8n­<×xõÕWï»Ñhù8Š»Ë‡£¬”]û«hCMVAö=œ0&ÄÃ"–ù¿ýg–Ùl˜cL¨ê>厞‰=}øpÕ¨»g­yƒóãd~ûòa¾øÄîá;ó öÞ9üó[kXPÄ[Á^ÿÓg´¬}‹¹‰y±„7WDfu.ol$Yõ4|ÀŸjcùͼÆÜX p“ºÜ ¬=*$ÿö ^ŽÔëåßÎâór]Ü<ˆö4”c.à­7W0?0¿Æ›ž÷ùüb=ŒÿÚ‰ÇÊùFµ”ëeÌj`î¿ð/ž7ø7{$ãº>ã“Ö9¼ùÁšð¾1aúoüÛçœîZÙ§˜lÿô£Âèž={ðvvÜöÿqnï*ÇŒJ÷&ˆ6WVÑäÓ“±rÅ6‰¡Bübêd/Sá#…_Sxƒ­šÙ›©þz³4“·¢«¶n§Nõ46Ûb–½È²ÃÛx¿wœX¿•šxÕ/˜4z³çZ9üîi™õϼ¿"ùjGçmÔåVË¥ºÝzµj‚Áõ€iË(ÙöŒ£^@Ml’|ÄïVú÷¶i2)©þš’¡Ûþ:Ö-Þˆ 8¶‡l™3;ŠBš@!l=§?¡¶g)oÿÇV^{ÙÆ|S"ªÞk‚f0HpxâKž3·ýzñ&#ªŽ“´ŒœüÔr’U2¦ õÜp–og_W6o¾9úøÇ Õ厕kÏìÙùÌóì½{C1õ¡.\®Ž[Dý'¼µf;õ:a骆QQ‘¯ 8"{Ër󋩪/#ãoxmW íõe!&ÔEtp9¿—Íþ²2ög½Å[ûÏv¡´Ó\]F}+ M¾—tûÞ|í]vS¸}5/¿u„è;¿ÇØ>466ç¿ÉËd<þ=ÆÒLssçÍèCY¾d]ÿÑõºdмˆtryí7É/,fö›¼™ÛÌØÌá ¹Ä²]·ÞKr{Ë_þ……äo|“ßd7œ¹I÷roìÞ\öÙù…ìßþ./¿ü'Š#Æ­‹Ý˦®y‘ëœuâb»ãeÞúÕ/ø88𱙋xæçvÞüÍñò'yù®Éüð± ^~ëM^ȱ;å{<öÃf^þ°kÑ$§åõ¿ä¹êÿàÕE—\ ¿øsBß\Û¿ü-öh’ï\Ê‹ÄséÌdP¶=ŸZÈYþ9=†Ä=¶Š—3/U–^ëú½Ëµ^}:‘Ç^ü1o½¹š—¹†v{éÿ¶ŒN .±ìˆL–¾hðæïñ›_®Å—Î÷žYÄǯéœùpî]ö<¼ñ«—çÐÎØÌ³ì¡$”C¯g=ŽÕ1¡¤Ë7‰ˆô£Ërù&ùJº.ßÔÚz჻NVúÊ—oº û‹vù&uÍ‹ˆˆˆH¿ÐWpùÆ3 W³|Í‘‹ŸË=?yœ©ºŒ’È• ¢*¦iX2c#.Q½UÙüá˜u_&1Š´""r²&-fÙ‹ª‘«­W×|+eù®ó©fDDDDäjQ‘«ÃòÁ§{™1ã\¶zö¾÷G š€œµ¼[v÷Ítá«=DÞ¶|NÔµâÃJø¨”Îñ»fᣩ(— î£Tµ˜Îî©=ÌŽí{8yºo ˜Á#’™6-™HKÇ´gŠv±³à$µ­^Lv'£&ÝÄøHõ󋈈ˆ t¦ðJ7[òkñÁ ßù)3Ñ÷ñÀLo;7åQéH!cî]Ì•ÂÙñ;'ØæneôŒ¹Ì•‚£ÚÍÆOŽÐà­bWÖN9&1㎹ܑ9‘ÁUùü½à4>Àwz/[w•œ8•™éÜèôP´{ÕíÍzwDDDD0KÊp+›š:®¢»!ÒÜyoeøäŒKÛÙ‰¹¨àìøã$ÎÊ`¢ËB MtHïoÌç@ýXRC­ ¿ñV’‰ öD`ŠÙÏ_›;§o;C›9’âb‰ ö阆-¦ › ¼õGõîˆÈ€g6›ñûýªùR†a`µ¼Ÿ7°l*2`ÔņF0fœ™ªÊ#쯬¦²ºŒ²Ê^ã›#~¶+Ý9ŠHóQêš¼Áè$U•G9XYEeu9å§ Ñ9©scB··q#C† chl 1®(¬/Þ3§µÕ‰È€FUU#FŒPeˆ\E{öî%kó¦ëf}kjj°Ûíî}0ÍJ énÿ›vÑ`fÜÔ;øÒñ;âeç·üŽé·ýé²vwL?6m· 9{†”ÕÅMs0÷¶ÚNå¾\>ýd@ "ò 0räHjjj¨¨¨À0 UˆˆBè9 ࢢ‚ªª*FŽ9àÞ ‹Ùðq±‹5y*ó9j$r×|­· IDAT}3qY¼TôßWGQƒ—#à­+¢Îç ÅaÁS¹‡cFßþÞ ¢L~v* _wÆl­ØÃ¾º¡$'$!2–ÑãFóÅ'çX‡áƒÃõI‘Ïjµ’œœÌÉ“'©©©Q¹JfϙۧñÜnw¿ï#ìv;ÉÉɳk>ç„/ºVo a°âÃhj ÅãÂâÀjTSTVKH´™†"7ÛzŒÒ‘Õ9š“Cäô¢¼UäÆ>‹Ä005:°5—Õ2(ÊD}Ñç䕸œghóEc¦‘â‚"<–TÆDÑRq„J¨ –ÈD}JDäFT"òc^xÏM˪í¥Ä:šñ.A­ÎÏç¸1Š Éñ i=AÁî/Ø{¨”ÆÐdfÜL×øI¡•ªˆå¶vîdϱ:ÌçðO‰„™ÀäˆfpËIö¹ó)8\J“}Ó&Y¨.ÜÏÉàQ$Å 'Â[Ëñƒ9r¬„ÊÆ`†MJ#9ÚJ°ÙÎ=÷Ü£wHDDDä2øóŸÿŒÏçÃd2a2™ :çñÅnÀ9»ô~þu-]º4p¹ Î{Þõšßïï~î÷ûϹù|>|>_÷c¯×‹Õjåí·ßÖV#"""r<òÈ#†ÅbÁl6c2™0›ÍÝ{Þº‚§Édº¢AT¿¬$""""ýBATDDDDDEDDDDATDDDD䊲¨ DDúO‹×ÏÊÃÕ¸kZ®»uO²³d\4v‹i@•«¯e‘œ>Y""ýèw‡®ß°æ®iáw‡ª\¹úZFQ¹®}^Û2 ×ÿz/×@-‹ˆ‚¨ˆˆˆˆ:FTDD:ù›¨.jÆëÓ ‘ ƒ±™UN¹rÔ"*"2à˜™•:šß§:ïËè>?þövÔpF9*‚P£ŽªÊvü>?þ˺j6fÂÌ/ÿE{t ¿ÏÎ,Ûe\öÕ,§ˆô‰ZDED¾É|mœÚy’Ó1ìôI껆•§p¿‰Añ#•4èò´\X1wT-gØÚ¸åQ‘ë—™FGóðˆ¢M^–Ö°âX+ ˜HÅ’Q¡ÄZ|”×5ðÎṳ́Žuñhì hjæ¨0€ Ó’\<<ÌF°áÁ}¢–wÊs""× »3ŠŸŒ²QS\ÅŠ^F¸x0<û'¿J{U5¯j¢=2’ŸŒaXt4ÇZ©(­á÷u&&X;æëâ W€-û*YU 5q(‡_¸[Ü:"’Ð0;‘qvl®HÂC/s¡¿Ï¯£8º¯œ?´rÑò„tNÅ/ƳçP%ï4ø‰úÒòX˜0È`ÓñFÊ­!ü`Ì ìýQNé3µˆŠˆ\s‚ˆs ÂêmæJ›9h£ºÞ†µ-ˆ˜1!„ú›xíhA´D:x.ÒAª%«q†ÿ>ÞÈ Úˆu`>AŒfÌOva˜LXÄH 4´÷KÉÚýÐÞ£œ1Ã.\ž‘ÕVæ'YÁ8ÃTy3.Vž3íl)¬cs«™öaaü«ÕL°6&QùŠzõWµÓãxJÿÆíùZïC/[êXšßDC×¼¼¾k«¬þ‹—½þŒûàÁü³«žO}Iy"; Þìïª/¹wu""Òÿ”WµaXBùA|(ÓF»XvC4s¨¨l£ÙâàÁD©C#yÐeƨkÂ]ÕVÿ:ÆÁÌÑNæ ê˜Oq•v·GçŠâÅ©ÃXàêײ„&<èâå90øà@¿o‚ ‰C˜`öqôš+ˆ(ˆŠˆ 0 Õ5¼Qj3ÂÅ£,;QÅ; ZN×ðÚñì®h~:>{]/j¥²ªš•íÄŒˆæá(8æí˜Ï©Ò*VVÁ´ä~1ÆÂÑâj>hìÝdÚä<'j8ÓØLͱf<•5œn¾ÿ&Œ6þ^ï%zT3qÑò´vOàeka#õ–0LMŸÊs1W±œ"Ò·OåÒ¥K/Ûõ3ÀyÏ»^óûýÝÏý~ÿ97ŸÏ‡Ïçë~ìõz±Z­¼ýöÛz‡Dd@{0§¨ÿW¢½™Š¼RÚÎd1’¸d;_v½÷ßgŒ¾6ËuËy¡2Š\oyä ÃÀb±`6›1™L˜ÍæîÇ=oAAAa2u|Iëz~Nˆ úÇ{#tŒ¨ˆÈ7]p(1·#Få‘«L}""""¢ *"""" ¢""""" ¢""ÕÍNû€\ÿë½\µ," ¢""ÒíG㣯۠s³ÓÎÆG¸rõµŒ"òÓYó""ýÈn1ñ³ICU.ùFR‹¨ˆˆˆˆô KSSÓe›Ù—]оçÅì/vQûž·÷z½zwDDDD.“––ÚÛÛϹˆýÅ.fßó¢öp/hïp8®Jý:¿¬$"òM`'Ož¤¥¥Ã0T!"ÒÍjµb·Û9rä?œìv»~YIDDÎ ¡ ::šÈÈHÌf³*Eä ³‡„\rœÚºZJKËHMMí÷}DMM  99yÀ5Ô)ˆŠˆô£“'Oâr¹ˆˆˆÀb±\°ÕAD.³^=¸ ¡ÿýöÛÌž3·ßWÕjµÛ½¿HHHP‘Ë£±±‘˜˜l6›ZCE®o{;­­-þßo¿}Í­sTT‡pïÅÀ¢5nÖ®xuÙ…T4Xq$¥.äég‘¦¢ˆô?ŸÏ×}¼–ˆÈÅX­Öy ùÀ½|“§€W^¯7죢 œ11XkKØ—õkž¿”ÜFmÔ"rìˆMº’žˆ|C÷6‡î[Íú æ~ÞÙžËæ>"ûoïðPДŊì½û"""" ¢—ŸÑØ„`uÒÝ –Ââå¿âùçŸçÑ$[Çk5nV?½ˆ9éi¤¥e²ðÉ×É-ï1£ÆÃ¬_¶˜ù™i¤¥¥3gÑÓ¬Î=b=‡_aNZi _aýòÅÌIO#}Î"–®?Œ§g0.ßÌò%óÉLK#-}‹—­çpjr_çÉ…™¤u_ôôjÜÊÊ"""¢ zý KšÍ$€’|÷Ö9,~z9¯¯ßL¡-•ùóç“9. <,` +r iŒ™Ä¤ƒ’¼5<µäõŽè9Ìë‹ॠû¨ ‰I“œÔæ°â©ï²´wß~É:^ÚÐH|ê$Âj ÉzéžÚÜ™$k6óóï>ÇîFœ©Lid߆—x`ÉzÊÊ×óÔSkÈ+¸ÔT&9)ÌYÁ’Ÿ¯¥\Û¨ˆˆˆ(ˆ^gbò«•?cv’¨e_άyé9–|÷[¤-\ÆæhÌ[ŵ@ÒÏxýjVô>Ï&XWè¡Ñ½Šu%€sïl^ËêÕñçg“€&²VdqnƒeO¬]ËÊ×Wóþo3pî(Š7¬"Ï€˜‡^g寖±|åëÜïö­f}1xг)ˆYÈÒW²úýµ<;o:ÓµÔz´‘Šˆˆˆ‚èu'*uË×f³{û&Þ]ù"?[08+P²^ÈæDA11ÓÓé¸BW, ×îf÷îÍ,K±Që.Äœ³ÒÕ“›q?IÅnJz†Ä˜L2ã;F KYÈ8€Š<Ê=”ç•P±æaæ~ë[|kîÖÕTPXîÁ–4 P±†%sÓÈ\ôÎy<±ìIRlÚHEDDd`°—oªq¯gCA#a)óX˜ŸÔ9ŒKÃÂ9K™³$‹¦â|ªâÿ‘%ônª4ðx[Ç㳯týBҿ≤ž¿ˆ`Ùbƒ°9¼²9÷†õ¬ÏÊ"ÛífÃ7Ögñâû¯0'Jªˆ\[ŒÂ7xty Ϭz†‰_õ‡^ê³xæñ¹ãÕטíR]Êæ)`ùÝwô¾:ðΟ—ª©SïpUqh/Gê½}šØ[•Í»ïfSá½KVó+V¬à¥¥«z\ªÉCÅábšÂÚÑZ‘K1å¬_œNZÚ|–öàLM Ôfm °3w–ç¬ëèFO'¦çÆT‘͆Αj²×Q7ø°0b'ÅÐØOjz:ééñ…Ùdç¦ (ßü K_XEAüb–¯üˆÜ¿½Ãý1@“›œ õÍ‹ÈOæwªª®‘’Ú·µ%\sWŽl;ž¼¿²qýÿò‡÷ÿĦG9}•/UÚ«E´•²‚|*­ãq}7–Fe>Íýq³®äžúV1qNŒŠj ' žÎ$>)–yŽ%l(ù5‹æg‘D!û* ˆ›Í¢xañrLk*ÖñðÝnRcq﫜Ì{z±ôl­`ÝÃsÈŽ³Q[R‹•éOÎ#`áb&­y‰}kñpátœµnò ›°¦>Ëâ0 +'7+‡¬¬l>JM!ÖSL^`M!#F_Dd€ Mâ®’T"ýª™c¹¹öÆ“šžÊÓiïÚÅ_w„pofƒú'ˆ ¶ž^ýI¯¯`uN%%%`u“šÉâGŸ`ajʲ÷‹ó…WXïÞÇ>ÃAÜôGyúùÅtî9Ž'×¾Kì+/±:{î}VœIÜÿij,NíãâùÌ}¬ZçÆp&1ûÑçy>³³O=v!¯¿ /½°Šì¼ ­1¤.xšŸ==¿ãØÔôå¬|þ~½* ·;¬8“fóгϪ[^DúÄ(ÛÎ[o®&÷H ö±™,¾³™Õk#xîÕÅÄ÷¡ë¼¹8‹·Þx]% ´c'vʽ<öؽ$…öÞ‚=n ß»«½ÇÄ;yîÑ÷Hÿñ­ä¯ý=å›þCžù|øæjr4›Á—>έ. >›gÿ°£k>´sÚgî ø½?‘{¤šàØt?ó™Ã­zcE®”Æ2Ž6Ø7'„3&“‹ˆ[jøSÎ>J[âH¼J=–>ÝËŒ7à²Õ³÷½?RÐä¬åݲ»¸o¦ _í!ò¶ås¢®VÂG¥tŽß5 ME¹lp¥ªÅtÞpOíavlßÃÉÓ­xÁ ‘Ì´iÉDZ:¦=S´‹'©mõb²;5é&ÆG^¦|–Âü¥+™¿ôKƉJçÉ×Óyò¢óÇÂe«YxÉ…9I}r%=y±Ù,dùÚ‹ÍÅÆ¸ùKYù¥+*"r±ºŸ·žû ùâ™ GþÄoî¢!âÎ>N_ÈêeÿÅþ‰ñãÅc m>ÀÇo®åå÷&óÆâx¬õ;yí¹ÿâHò"~¼8kñŸxëÍ]´O9;ö֮籟ü‹«þÄò_ý†ŸîŠãÎ?Ç«®bÖ.{“·Þ»ƒ)'q^¼l/á½·vqï—òjt¿ü+Þ|k S–ÝŠzïåJZ÷?`É’%ç½¾üÅÿz3ìyLèyÜÛ¶“£•MøB¢:ƒéc#:Z@[Jù,'£•M˜Â+ÝlɯÅK7|ç;¤8ÌDgÜÇ3]X¼UìÜ”G¥#…Œ¹w1wV gÇïÚ`›»•Ñ3æ2wV Žj7?9B €·Š]Y;8å˜ÄŒ;ærGæDWåó÷‚Óøßé½lÝUNpâTff¤s£ÓCÑî=T·4ë""Òõ»Ö’K?ùñ]LNJbò]ñøäàžçM^B(“¿÷Ï;oµÓR^OûEÖ`ø÷çÞÉÃq ŸÊ½ß ÕÅÔë­•+ìþÜÇÊ•+Ïy­÷ó¯¦Ç1¡—ÒÇŒ†Ôî%ïó ÚKÄDffLÆiîtT(¢9ØITúå½µn>ÙvkrsﺃéÃZ9°e¥žŽü—»q Eæd2;&;(Û¶‘m¥žŽaþ„þÑLŸ{7–”áV65uî­º"»ÖÊÊðÉ3—8¶³…3sQÁÙñ;ÇIœ•ÁD—…@ šè&ÞߘÏú±¤†Z~ã­$%$ì'ˆÀ³Ÿ¿6wNßv†6s$7ÄÅì#Ò1 [L6xëê""rIUùe´¿§G|(ñSbé8³²¬Ã¹õŽ` d³qÿÉ'ÿ@ Lé˜õj‚Ç.ælO¹•ø)ñg÷Ì¡ÄF‡v‡Ò`‚‰ˆ‹èný´É „36þl³Lp0ë•«F–,YÂÊ•+¹ÿ÷±bÅŠ¯9·0âœàîKuÆýåÇ«dòÍqTo-¦¶m$¡=»ŒÓ}‘ÇÎ>âo›Lt_:¦[h5G351®£U52Çè&fð”¹9êŬŒ‰Œ°®éd4äp ÉÀS™ÏQc3f¥1Æ–MEŒºÈB,Œg¦ªòû+«©¬.£¬²×øæHF‡Ÿ]cKä("ÍG©kòBx£“LTUå`e•Õ唟2`Dç¤Î Œ ÝBÞÆ 6Œ¡±1ĸ¢°¼xÏœ¾.6`Û¸§Ù¼ûi}’EäúUŸÏÏ-'7øF23oåŽÅwrÇÆe¼Ör•–l%8XǃJÿ‡Ñ®û¯ RXºy7ÝÚyrYrëS¸Hå·ÛW’Þç ¼­„ƒ8Ó£k¢­z»v¦š¡$ßžÎMÃBú4/Kt ã›Ùò‡ÿ!zÔ(FÍèQ1„Y¼ÔV6às¤Ù]V1·Ì&¨ßۀϑLtçwOˬÄr.Ö}ÓRÊÖŸPdNbâhÆMMfÜM¿#^vü5wL¿íã¿RlŽe̘xƦ'ñà'lëšÞê⦹ H¨,¥¬¬Œ“ûr9àÊä™71Ô¯†ˆÈ¥YqMŒ†]»(6¦v^Ó³™â]åÀÄ>Í¡yÿ{ä4gðï«§ãRÇû[Ú;»Ñ­D'GÓþÞvÊŒÉÝËwÓŽÎ|—F²Ûo¿¯×­³)¶­tŸî®Ä?oO‰'"ø+üΑ-†[ü3É'8qâE;7áÎEÆw2÷uAsfc2>|ØÑ|šÈÜ»g“~ÃXF8œ7¾¯Ž¢†³õÖQçs0ÌaÁS¹‡cF³çÝÁ´I Åløèʘ­{p¬#8z$ )S¸íŸfgªäXËàp}*DDú bʤ“Ãk¿ÙH~a!ùßä­ýí}ž>8"{Ër󋩪/#ãoxmW íõeÔàºõ^’ÛsXþò‡ììœÿo²Tñ"×›§„}*ðø£œÏ?¯"lÒíÌ™:ŠÁæ¯6¯–ÒÝäî­Æ3†‰·d2ï»w1Î|‚‚Jƒah8A]w<ôR‘ýïm­Â޹éÕ=.¦œ¾ÖZ½]ß­}M ´xÀâÀjTSTVKcK=¥ûsè=>ÍÉaiU%ûÉÙrcx*‰a]Ó×P\VKSke·±½ÔÀ×z†6˜i¤¸`_¯¤®¡†òãG¨ôØbÁ™¨-FD¤/B'óزcbÕ{,ÿå ¼•?–‡Ål /=ÞÖ‰‹yìŽP¶ÿê<ñørÞ+O癟g[ü_¼üIDd²ôÅcrýF~óË_òF6ÜóÌ"bu §È%t3 ôË1¡½íÞu”3¶ìf0jŽsÊç ÚÞBei)¥·“å5´x;ò]åÁ]ì<\Ï…~·ÈLGÝ9ä*¥ª¶‚’œh !ÒaÅ><•Ñ‘“³ŸÒªZ*Žlc[‘Atb8öa)Œ¶V²-g7%UµýÛ3ÛrŽbNý÷LtPµ{ŸTcw7ßI¡,w y‡«i5;ˆNLeêð2ºÆ¿+:Ÿ÷sB˜žÒJ~~µžADŽšÌŒãqZ h¦$÷oì(¬¦ÕJÔ˜›¸9¦Œ¼mÇ1Ýp'³Çš)Ëÿ ÷‘Jš½L¶!ÄŽ¿ 1!„X­¼ýöÛÚ†Ed@s»ÝÜxãX,ÿÀeëªòÉ>Ìä̉Dt6¯~œçŽ,fÕ‹º’HoÞöŽƒÖÖ Ýu²Òì9sIMM½¦öÿÈú$¥Íab’‹›…–c[Ør°…   €÷‘L]pãB›9ôçÙmÍäwÅ1((¨{œ-”¹·“w Œ&˜{]¢É[œ¼m;)ªnÅgì6ÞÙñKè=.í´téÒÀ媠@ pÞó®×ü~÷s¿ßÎÍçóáóùº{½^¬ ¢"¢ ÚÇ šÅ3O¬ÅõoKyèVíG6òæËüÃ7X–¡JQà‘GÁ0 , f³“É„Ùlî~ÜóDQN®Û´1ŸD9ïù×aÑæ("rsÍæ™Ÿ—óæšxâ¿Ú cÊCÏóÃÌŒÂÕ,_sä¢×ï$8–{~ò8S•WEä•ûˉžzE₨ˆÈ@È¢S³lêâó$-fÙ‹ªùª¬ »y ±&Ó]ŠI-""""ýAATDDDDDEDDDDATDDDDDATDd 2›ÍøýúMcùr†a`µZ\¹tÖ¼ˆH? £ªªŠ#F¨2D®¢={÷’µyÓu³¾555Øíö÷>¨ETD¤9’šš***0 C"¢zÃ0¨¨¨ ªªŠ‘#G¸÷B-¢""ýÈjµ’œœÌÉ“'©©©Q¹JfϙۧñÜnw¿ï#ìv;ÉÉÉêš‘+ó&!!A!"ß8êšQQQQQ¹~éòM""ý¨ÅëgåájÜ5-¾¬©Qv–Œ‹ÆnQˆˆtÐÞ@D¤ýîÐ7#„¸kZøÝ¡j½é"¢ *"r-ø¼¶EåQ‘«IÇˆŠˆÈ×âon º¨¯LƒD& ÆfV½ˆHß©ETDDÎ2„Wg冠 óùñ··Óp Ž€3‚ÈQ„uTU¶ã÷ùñ«öD¤Ô"*""ç2Û˜7~0Ѧ¶ „Ð6Ní<ÉéÆÎ¸yú$õ]ÃÊS¸ßÄ ø‘ŒJ¤–Q¹nÃ`r4 "ƒ±úÛ9XZëEm´`æ†ÑÑ<<"„h“—ƒ¥5¬8ÖJ&FF±dT(±åu ¼s ò¨XÞofw Q6hjä}µì0ÌLKrñð0Á†÷‰ZÞ)óÐÍŠÉB/º^ƒˆžà aç·ci4°„hõذµµÐf cX‚B¨ˆôö""× (—“D±ãP%+J}$ŒŠfAhvg?e£¦¸Š'¼$Œpñ`xö!N~1&”öªj^=ÔD{d$?BHg›Ãyc_-G…ñDr(£c]<á °e_%«*¤&åáð ÚjùiîI^,÷^r­#" ³gÇæŠ$ZoºˆtÓÉJ""ýÈn1ñ³ICU"ò¤Q¹‚¨‡ŠC{9RïíÓÄÞªlÞ}7› ¯*RDDDD¾š^]ó­”äSiÇØõÚ‹ˆ\ Í••äÿ盜>v”–Sºè§ˆœe:”! ‰Lþ?:lØ@¢""rµChÖ%éþEŒý—‡­“yD䬶êj*r²ÉúÑ£ÌþݪF-|º—3nÀe«gï{¤  ÈYË»ewqßL¾ÚCämËçD]+>¬„Jé¿k>šŠrÙà>JU‹é¼ážÚÃìØ¾‡“§[ñ‚<"™iÓ’‰´tL{¦h; NRÛêÅdw2jÒMŒT>‘o†/þó Æ-z€øyó±X,¤ŠƒFŽÄñƒû»÷3^ø¿+ˆ†WºÙ’?œïÞâä†ï|ã¦2õ»Ìcoy›ò¨6•Œ©ÑXJl;;>Æ [Dg IDAT¶¹G1uÆ\nöVPçfã'!Ü7o,!Þ*veíàÔÐ)ÌHslTr0÷ þ^Ãü›ÂñŸÞËÖ]å8&Mef$4ßËç»÷àüV*íÍÚEdÀ«Þ³‡ÉOý›Í†ÙlV…ˆÈyÌf3#oÿ'rŸ{vÀ•Í’2Üʦ&£óYw‘;ï­ Ÿ<ƒq‰c;[8#1œ¿sœÄYLtY¢‰iâýù¨Kj¨•á7ÞJRB"QÁ~L1ûùksçômgh3GrC\,QÁ>"Ó°Å4a3·þè?V2Ïa–ßýÔž?È“ÊýË^äÉÔ¨¯7ëÜ%Üú”ëô•üíõTl5±hî :æñÎæe¤ØúéÝô¸yú[KÈ1bxèýx2þ"¯Çô±nÊW³ðî”Êo·¯$ݦÈåÖÞÜŒ5,L!TD¾4ˆ:bbä1ä¦MEÆ—ÄÔÆŒÕGØ¿;—OÿòGÎßÉèð³]é–ÈQDš[©kò‚%‚ÑIC¡ú(?ßAvÖGüµäìôfçÆ„V’·q#9;ò)¬lÁîŒ"Ä Þ3§/_)NœÎŽ›0*ܬyò%r/ÓümaÄÄ9‰‰ï˜ÿ• ™‡yeNii Y]ÎõS7"ré±IWÒ‘/7PÙ±ÌJ !çbY´¥”­?¡È<œÄÄÑŒ›šÌ¸›.>~G¼ìLïÓoûø¯›c3&ž±iãI<ø Ûº¦·º¸iî*K)++ãä¾\ø†2yæM õ_¶¤Å¼×ÿ̲®fÊšlž¼ûçäy¬/ôžzšùÂ2ye}æuøö_¢nbôÁQ½‚_Ä͆ßEz*ó9j$2÷îÙ¤ß0–Nçï«£¨áì…D½uEÔù sXðTîᘑÀìyw0mRÃ#C1>º2fkÅÜëŽIBÊnû§™Ä™*9VçÁ28üÊ”8*žT'€áé,gùf–/™OfZiésX¼l=‡==¦©Éæ•%óIOK#sÑRÖ{ÎgÍG,JK#-s:º´ÓÒH›³œì–³xþB^9ìéÃrܬ~zsÒÓHKËdᓯ“[PÌêï>ÀºZ€VÜɲÏU©›Þjr_çÉ…™¤u–aÑÓ«q×h!"""_#ˆæœ0ðµ6ÐÚ™%­ø0šhñ€9ÄÕ¨¦¨¬–Æ–zJ÷çÐ{|08š“ÃþÒ*ªJö“³å0ÆðTú¦¯¡¸¬–¦ÖÊnc{©¯õ m>0ÓHqÁ¾8^I]C åÇPé±18Ä‚%2ñЏñp6Y“˜dƒšÍüü»Ïñ»gjÓcÙ·á%X²žrO¯<ðsÖ¹+0q8k³øõ¯÷õmaµY,}áöU4Aý_/¹œå,aEN!1“˜cP’·†§–¼ÎaO ™O?AªÀAÆÏ–q¼íÊ×Moåëyê©5ä•@\j*“œæ¬`ÉÏ×R®Ï’ˆˆˆ|E–Y³Ù–“Ç–Ãøg¢ƒa££)podcÓÝ|'}*3Æm!oËŸ9`v˜Ê¬YÖîñ#™Y)­äoÛÈgžADŽšÎ]3â°˜)Üšô7vdoà 9”¨17q[F0yÛv±õh4³Ç¦’>þ3Ü{·sÒÀdBìäéLˆ0!—©ˆMlxøV6œóZ ~õ+æGAñêUäóÐë¬\ÍSȪ–°nßjÖ/dñá-‘qOðþÚÅÄSÌÚ‡¿Ë¯ û¶ôÔgßáùÙIÔ­_Ä¢/[NñªŽ“‡’~ÆûkK9ëÝÍK…XWø(˦O')lîZ')™™Œ »òuÓ;]zг)ˆYÈÒŸ$5¬˜õ/½Bvc-µˆÕÉL"""òU‚¨+n& þef÷ ®´y<Ö#–¤Ï#.½ç$czŒŸÉ¾×9ÞøL@¯ÙÛ5ýNFM¿ßO  ˆcÞ}Óðûýøý~bn¸oOôáóùðûýø|>¼ÞËü›¡'Nài¤¶É*ØWP‹'3Œò¼*Ö<ÌÜ5='ª °ü Åy‡;Ê·h6ñ̾?‰_¿Ð‡$êÈäÑy)DÙ<~ér<Ô3=XbY¸v7 »SàÚ.Z7QôΕ¶¤yd8òÈ©XÃ’¹kpÄ¥’™¹€'žžÃ8…PùªAtàñÜrÝËùî’(\¿ŽÂGŸî+é‰_ñDRÏsÞm8SlYÿÀ¢magÑ—Xxò.OimVÀ0hôx +Jº®¸ÖçºYFJï™GÍá•Í)¸7¬g}VÙn7Ö¸Ù°>‹ß…9Qú@‰\õ|¶ö9–ð}ÝqÎoùfÖlh%ã¡{I´y8úá¶TõžÞŠ#&‰ô̩ćY/埮aCý \8»*XD®’oÜ5CÂâÆáhª ‘0b'uœÞØOjz:ééñ…Ùdç¦ 1ÓÇP²>›Žs”ÊÉY_øU—zÉåĦv´ƒVdçRLÇrÖ/N'-m>ËÏ9£Éè™k{¥Ð&9jÉYç¦ã"ÅÙë( žxg_ëæ|å›_aé «(ˆ_Ìò•‘û·w¸?hr“SáѧIäZåšÁ¼ X°` y³&Q»¬¬}Ô«vD¤}ƒKÓC£ñ 3iÍKì[³ˆ‡ §ã¬u“WØ„5õY‡ATæ£Ìs,aCá¯ùîÝ뉣„’Ú¯¾´K-',µs9%¿fÑü,’(d_…q³Yo› §¨­`Ý+¯ÿìÓdÆö^J,óŸžÍª§²¨Ýðs7X±btçÖ¸‡ž`z}èæï¨›ó‚jX9¹Y9deeóQj ±žbò*k 1꛹V™C"pEEÝናbÖl9Æ©–ÉD¨ TDúÉ7ï*ÊañÄX Ù[± yýÝg™Fq^yÅa¤.xžw~»°ãXM[*Ï®}‘“b°Ö–PkÎC%}õå^j9a©,{ÿ·<4=kí>öUX‰›þ¿]ùäÙcSMŒjórq7^8M†¥/ç£wže^jN«gÜtîñ}Ö>9ÛW©› Ì{åó Hwyûjq&Íæg+—«[^äz §6+`F¿ç$"ý)héÒ¥Ë5³Þ'+uœœÔñÚÙ“•Ý'*uÝ|¾óOV²Z­¼ýöÛz‡Dd@ûß;ngÁ_6c±|•ª¯vŒhNÈ·ypÎÈÎ/¢^<ägeq0$ƒïß™ˆ]LjŠ\ó¼^/|{ßÿäÓ¯=GyÃ0°X,˜ÍfL&f³¹ûqÏ[PPAAAÝ¿üÖõüœy.²oÑ[+"2°ùJþšU½^ IbÞ¼D…NéW ¢""kóf¸:®âáóa4V¿m'Yyx0s¨þˆˆ‚¨ˆˆôÝ¥Nì¹s¿ÐÉJaM‡Yw ˜&†¡ê‘~bRˆˆ\oBˆƒ¦Šò^—ZóR[\…/ÄIÈ%ÎB²:l`´âñª6E¤ÿ¨ETDäºccÄô ÿ`~ÜÈÔäXÂÌjícg¡ÁˆŒT†^jïnŒF Ÿþˆˆ‚¨ˆˆ|•wÔ-Ü{OyyùäeíÁÀLHx “f/$5þÒ§ ™Cœ„pü“-ŒL´ªBEDATDDúÎ64™Ì{“¿l ï}”Ä íü‡ÎäŸÙý<ööGxTU*"W™ŽQQQQQQQ¹^‡†âmnVEˆÈ—j9u »k¨‚¨ˆˆ\>Ñ7ÞÈ‘?~ Š‘/UòI‰ ®\úe%‘~tÓÿyœ¬=ŠÉl&þŽÙ„¦J‘nÍ••’ÅÑÿÈìß­R‘Ë'tØ0fÿn_üçmÚDKÕ)UŠˆt³»†‘˜Àìß­_TDED®AAêAäZâúÁ"F}ë[ýºÁÁÁX­VlN瀬cQ‘~Ô\YIÖ%éþEŒý—‡­J¹¾xÿ}ƌӯëáõzill¤¬¬ŒáÇc± ¬è¦ *"Ò¾øÏ7·èâçÍÇb±DPšFEú›×ë½6‚šÅÂ!C¨­­eèÐuæ¼¥©©é²~{èý¼ëµ®Ç~¿¿û¾çÍçóußû|¾kf¹’ª÷ìaòS?Áf³a6›U!"rAaaaTTTüCóhii¡½½³ÙŒÙlÆd2uß÷¼ußw}1¾Ð—äËñ¥Ùb¿Œ•¸Àó®×ü=ž:Ÿû:ï»÷¼k›‘o€öæf¬aa ¡"òåÍb¡½½ýšÇ À|›©óÖõ8¨Ç­ë:Ÿ]ÏÏ ¢—¡\ºŽ¨ˆH?3™´+‘oèþOU """" ¢""""¢ *""""¢ *"""" ¢"""""—ƒ.h/"r½ñ–³yÍJSùþ}“‰è9¨&—uT0ýÁ…$ÚUU"ýíÕW_¥ººšèèh~úÓŸªBzQ‹¨ˆÈõªa'[·¨D®aÕÕÕçÜ‹‚¨ˆÈ€àp…P‘·•bêBD®Oêš¹.™‰˜œÉÈ­aëÎSŒ˜9ô‚;tOͶå¸)®mŇ•ð¸ÉdfNf¨ ðóáïÝ$ÜžÀÉÏò)m€ð„ÌI…üì<ŽUµbObÆ™$†uÍðÙÛÈ/­¥Õ‚+)•3’‰ÒQù&eQS38ö—lÜrKï4è=EÞ†m”ÇLçöé.¬FÙ;Éràþô¨Ž¾Zv~æ$ãö…¤7åóqÖþ·ØÉ¤Û¿Í÷µìÜÃ6÷â3‡b¡‘Ù€Û<‰Ìy„ìÛº?eY¹ÿÎDtHªÈÙcB/déÒ¥ÝuÌh‡^]óíT;ÄÑF_Ÿ&öÕî`݇;¨ôiÃé‡$ŠmätfÄ4±g[!ç ·1"5ƒÙ™)ÄÇ%6~“GZ1sæ1"}:‰QaDħ!IL",*I VŒúV|€·&w} ·Ï¾…ø¡Q ™BÆí°–î£\‡ªŠ}?ôš:f´µ˜O¶pÚõÝëëse‡pÊš@b˜Y[“ˆÈ5ÏNbæTö¬ËcëÑxf÷<…ÞAâ3§*SP^EyÕIJ+ ˆë™CCˆ³u‡R3fìN{÷?³ùìÿ£¶ŠV£–¿¬YÕkÔè,}:Z:û2£££¯öžáø¾Bê}Ãûeñêš¹Þ…M ãÆ>Ø–GélëÙ×[N’ýá_8fAÒ¸’§§¼ï#>ýº'7ù€ |{þd"Îi«0c ÓÛ œ×ÝÞ³;~ùòå×Кúh8´ì­ Ꟶ°|˜{ˆ[§Œ':¸‘‚7±¯Øñ!ë*gñý)N|õÇØ±ë'êÛðLøðñãwÍÂOÓÉÏù¸ ˜ªÖ ó† Çùl÷ANÖ·á X›Ä-7%i꘶±t/»•SÛæÅ2„QI¡ÖX‘¯Ò¦59“¤Â lÝé¢ëh)O¹›B#‰{Ìd¨ÀK¹ÇÇ×=šÊêtbm­¥ÅÆÈÎÖOï©ÏÈÊ·“~{ 65mˆ\Ó¶(e|ÂP†˜;¾@:ƤqG|¾ªÏù[qÿ¬“)¼ª€¿í¯ÇG)sæ2)ÔLô´ùÜ?ʼnÙWË®ìÏ© Ïm™³˜“>ž³ãwj/c{AñS2˜“>Gmo-¦ÀWËîœ/8eÇ­33ø§iI ®ÞÏÖƒ øÿ™ƒlÛSIpü̘–Ê C< Ú tÌADDúÂËÔ™qUUtj¶‡a5Nq¬´†Æ–zN|ʧ%¾ÖzZ½_#îÌäð*r>ÊæðÉS”ýŒ¬¬=ÔÚ]8BE®y!§±c_]"fka¡¡„Ùƒûïkô¤aÁlniï\£®—»X‰8…¤øøÎÎÌ'€`Óo!Ùi&ˆ$zP ë·à@c<7‡X‰MNcl\NK€@ Si!Ÿví=Í´™‡2|(QCÆßŒ-º› ü%ÚbDD¾{|:Ó]%l«êÜÁÇN'sB[³>`ŸÙ+i*³gÛÈþtYcY˜ôU—Áäùó {+y)Ä0‡àJšÅüéCuœ—ÈEt3z-:yÒªw–RkÄ`¹6êDzùd;\ìøTs£Ç˜¨®.æ@u§j+)«î5¾9‚øÁæOc‰4sºÙŽ0âG›¨®.áPu-§êNQ^Ý1㚆$0&$—[¶0ÄåÂårãŒÀðÑÞØ ­WDä‚{îXæ<òÈ„‘|ï£$Ÿ¦Äϼ—ø™=ÇIä¾G2»ƒå½ÄŸ3}Ê}rvAD¥ÿ3ž“vc™|ç}LÖ» Ò'×Ò%š>ÞUJg¼×NýX¾?ˆ¿·_dh[%Û·l¥È4ŒÄø‘$MKÒ‘ì‹ßE;þš;¦ÏýÛ6ŠMC3jcSH8º•í]Ó[œÜ˜ñmÆÔTPVQIéáÝôEsãÔd†úµñŠˆˆˆ\.³n½¯×íºÂ…ÅÜ~ñ×ê5â¹sþ¢Í>*{ï«§øŒáNsçÓ“ÔùìL²›1jr̈cî]i8M/•^]³­úû룘0:†„pñ #سm'Çë¦S0EDDD.—AFŸ731%ŽA×Èyᦿ—µãk;Ckgº´âÃh>Ck;˜Ù±¶×RTYOS[#eG>£÷øÐÎÑÏ>ã@e-ÕeGø{î1Œa)$†‚ÙfÇÚ^Gñ©zšÛ©8º‹Üòv|žFÚü`¦‰âC_¢šºÆÓTž(¡Òccð ¦ðxm1""""—Éî=Åœ±ÆnºvÖÉô­ôxÂë?çoÇ;ÃF:i-ØÂÇõ=™[¬ç~Âú·²§q$çŽæÐ±|kœ‰c»¶ðñg‡hо™;Ó‡cÌÑ7’>ÆJIÞ§|¸y;M#˜yË(7ìa[I3ÁÑ)LOLÝ¡Ýü=w'î\É73q° ôcq""""—M»+…©‰ƒ¹†r(AÿÏSO.×ÌÀyÏ»^ów>øýü~?>¿çÍçóáëº÷ùæuë´ÕˆÈ€ö¿wÜ΂¿lÆbÑyç"ׯ×˶5kȼà‰ýãøñãŒ3ækOÿðý÷ÓÞÞŽÙlL˜ÍfL&&“ sç}PPA÷¦  ŽÀDPçãîÙëù×aÒ¦&""""ýAATDDDDDED¾i‚CCñ67«"DäKy½^‚ƒƒ\¹DEDúQô7rä¨"DäK566bµZDEDäò¹éÿ<ÎÑÿÈþÿïÿ¥¹²R""çðz½œ>}š3gÎàt:\ùtš¦ˆH? 6ŒÙ¿[ÅÿùE›6ÑRuJ•"rpý`Çï×uÆjµ2|øðyu Q‘k ŒÎxáÿª"DäG]ó""""¢ *"""" ¢""""" ¢""""2ðèd%‘~Ôâõ³òp5îšU†ˆ\Tj”%㢱[V¢ZDEDúÑï)„ŠÈ¥¹kZøÝ¡êW.µˆŠˆô£ÏkB{ò77P]ԌצA"c3«^DêþB-¢""Òÿ|~üíí4¨#àŒ rT¡FU•íø}~üWi5‚C‡ðÓ]Ü`†à!Cù}ÆH :w$³Y£‡03$èÂÏ/‡ O #ª÷ã+Ê̬ÔÑü>ÕAø•¨Û‹ÕçEÊž:v+Æ Â®OÇ€¦QéçÚÆ©'9ÝØ7OŸ¤¾kXùq ÷›?’QIƒ®p뉙iIƒ ®,ç ïËþsbî¨ZÎ4°µ5pþóËÚvìõg¨éõøzÖÞÔÀŠC&ÊÛ}*»» Lu2ëDZõ1Q¹"ùoÑ4ì<áv,–ð­¶¶Ú,a KèBÍ6æ%G³ 2+^Ž–ÖðÇZ Ëãÿÿöî/¦­3ÁûøÏư“6Lí …™Î’‘ì¾kk÷…W3á‘Â^„^„H3¥•Bv¤°ÒÒh¶É;z¡! ›dÞº Í$‘šdG ¹(¹hu–îH¡Ú£ц¤)HS;mjBðÁÞ 01Žù Ì÷#q||Ž}žÇ'ðËóç8KôGôB] êôõ€>|Ê•rûû¡„P´Á¡êa½Û?¡ IÙ’$‹\Û¶ê[sµ%<¦ßüù+ýõf¹%©Ì­pW¹‰ÿë3½³1õ9¼6stB~æ×/nkLÙúñßoSu4 Ÿ}08 ž²iä«°”¸¾eV–<µUÝ9ÒèÝ2$™’dÕs…ª6On[DÃ÷îëtÿ} nv©½Ô¦?û#ú^]úú¾~ëÏVuq®¶„ê߯}®ËãFÊóœplRÃó†ÞùãC]ÊyFíe6ýñÎ„Š¶nxtìƒØ£ò†ÆôÎh~¼Í®+7Cšà_JF¢k°jÛ6+Ï™«ÍE¹²oݬMy©÷+x¦@?ÙÓ>ú\mÃ1}oÛf}ßþ¨åõo׺•ãTCižœ³lOì‚ÞôTžÜ渮™3¯^È™Ð;¾Q}aäê•ïXôïÿ}O_Hºu}X¿3õVâㇳŸÃw¶æë'›-zÿ£;z󳈞{v‹öæY$EõáÝ þ󎩱ø±OEÔ;›±¾,eÞ²Eÿì64ò™_oݳêc*“?¯Ÿ7Ow¿Ð/>ÕÄæÍúÙó´aê5Ýz KŸ+{ã&ýã3Q½ûÉ×66ho±]ÏÌyž3ÛÂ^È1õÎ'A ô“ïæ(wFÙ#úÐoê©Í¹+0,QÈ?<¢ÿóß÷õÅF‡~T-ɪ-¶øØÃ ýþ“ ®‚úí°äÈS¡%õö¢éáŠmrdI¦©û3zŽÃúí/ueè+½;.†U–¨f´ÎM$=ží &Âz ›~ðݧõ}Û˜Úÿô½õ`2p]»íWûÐødͶkgtLƒ±™ëK_f«ŠÜd˜£úÍ'AýÁЕñÉg¾õÌåEGõÖ­Qõ~þ¥ÞºQÞSŽ©×4õέûºòÙ¨ü’?½§ËùZ½ã’a³(0çy&ÕÑÀ=]ùË—zgT’‘¥ìIJK‹H†¡§,\óQV W±Kÿú7›T4þ@ŸŽÏýWÎj‘,³l_À_ÁoÜ%<õ^¡/ïªáýµÝ1elÞ¬†¿Ý¦Ÿ=ýø ä:r•íi,i}éËÓŒY`ÉC7£³'†™A|æÏ,ô<ÓƒèÌ×ÛP^¬Œ¬1V¹7Rô¡Ç-za›‘”š²UUò´†ïZô£glÒW÷4Ý”rû`äQ(º?‘ m²(©Uôñ%I›6fkÓ½î'=ží,%ÏêtÁ„:?úRãV=[’§§l’”¥ßyZÿ3<ª·†BrXuí³ˆ$KÂúÒ•ù/ÆFxÖ¦[¾{ºvw\ÚìÐ?~7¤w£UåH•>¿3®[zå{uék»önÍ’éÕPì©y>‹\sžçܾ5]Þ©Pž“%™cú*ÆUŸ¹ÿšH»Éæ»Ð§~}| ÿǺã×—Rý©ŠêCß} F7è'Ïo’k|B¦¬råÄ÷›P¯™£WJ6É5öµ~Ñÿ@ÁY¶ßOxÕû_=а‘£9óœª9®ÿü*¬-Ïèû9)Ïò^¾å×;£6U•ºôó’ ºï÷«Í•dÕ [úÁ3†r-Ùòæ˜úp\Râú–ùëœ\ýè‡vÝ¿û…Þ¼3!×¶-:P }<9?J¿ôëÿ}2¦Ü­[ô/Ïç)÷Þ=ýëG5ÿäõ˜>šó<ç’¥¿ž.ïäã¶ÚôÕ½±5ÇÌñ/ÿÿ:´dÿψÅb=Žo‹N­Ç¢QÅb1E£QE¢QE§–H$¢Hüg$¢ììl¾pO@F{å½ÛT‚$M<ÐHÏgºŸ¢'רV¨¢Ò\-ä¾ö›¾åÖ¿=/ýæê°~?1ÿöä ôýÿ±M{¿ÖÏoO,ºK~aïµt¾Y™W1»SoüÝFõü‘Û7%zk×w}ì—^ÒÄÄ„²²²&«UYYY²Z­²Z­Êšúi±Xd™úiµLþ'Ñb±Èb™9Þ#ùñbÐ5H¿ì<¹~°]®´žDDïµwçÓzáÓ»ºácI‹ž{v“6Ýõë÷„ÐŒF€4úÛü\¾æs Ýÿ|X¯|¾ðíÉ&ÜÓ¿ô,Ï9¬Ö2¯N1}|ó35pI?öû"Ó0FÒ蟞ߒ‘\,}ý§ç·d\¹lV‡céþÿ2ÇQM µD£²F£“Û#Y"Y§Ö£á°¬†ÁU ãåÚ¬z­ì[T€egÍÍ•Å4eµÙdÍÊšš•%ëÔ8QËÔ2=NÔb‘Õ:Ùf¹\cDi@zÂ1U‚(¢AQ€ ‚(@•¤PŸš+½òzS/Õ­¾¥y›'UåõÊ[s^óíäïT­×+oe³úB‹|Ÿ«õòz½ªxµW!®[ÖÇwÍ;ò•oOÜ`¨ØÍ77D—U¾ö¶½­¦ív>m€Ud}>£¯WÞªãºr¾IµU^y½•ªmî”/¡ÿ{¸»U¯ÖTNuëWªæÕV]õ'½–9¢žãuªªðª¢ªVM7æìB _ÑñújUz½òVT©®¹C7ðwëd}µ*¼^UÖ6©ÃG‡< ˆfžÀ%½~ꪂ†!iT—©ùòÔˆOßy9rV=ƒ¦\%e*qj°ç¬éÔŒ,:rA-—|2\ùR`@]-tèŠ?õûù¯èȾ×u©7¨|Ï.•»‚º~¹E/×wµ8ÖÜIDATLŽ3 õéäËGt¡wD¦£Hù.:uÏ D×XÊÔ¥—ÿWÒd¥u̘YT¢×ÞîVgçU]l(’$ t($)ðÉYæÑ®ÆóºxþŒÎ·5¨H’|½™ÑH™¯½§¯¨³ãŠÞ~£\†Lõ¶_–/Åù.·«Ç”\û[Õv¢YÇÛZõR¾¤ëgÔá“‚ÝoêB@RQƒ.^éPÇÛõZ +È,ëc²R¾K®Ä¹IF±†$3þ¼GžüÉUWI¤A™SëNO“N4^QGG«Õ¨o`dú°™ï±[5%“ãP *^’G=êì‘/X§â;†4Ü3(I9{@ÿp6ñ¹ -_Ï IRQínÛ%©X»_*Ñ©c\±€ º†R¨öþêbêÉJÃóìmÖ¾úË EÚUS£Æ—:sì‚ç:hÎ ùblIà 5”$îlWþ»Ì..Lù#:§|Ý H*9ܦ“‡ë´»8¨@ª]ݺ<0ÙŠêï¾ ^Ir•«Ø™¼£Sî2×dÈ ËSQ¡ŠŠb™ÝêQÙå*ß.Iìèžš45¬÷:h ™e´ˆt©þE½—Ô ê(kTÛáù޵ËYœ/iT-/«¶+_Þ¦ÜwDTéj‘S#ƒ#2e¨üðž¤nùIÅ5u*;Û¢ëgku` \ù^õ ŒÊð4ªÎ)TÔG½.œÒ¾;T¤A ¸X@fY-¢£3—Á‘à‚-®iÖkå. Èç3´«ñ5y I£½êJ¼¥’köïv+08"3¿D»OëDeAêuרõ\£v—8åëyO=>§<{êô¯jä–$»GçßÐÞ2—ŒÀ F¹öïg¶È,–¦¦¦ØR½X,{ìq|[4~Fg,‘HD‘Hdz=Ë0 ýú׿æ°.Äb1ݸqCýýý—iš2MS’¤ììl†!Ã0”““£ÒÒRmß¾]‹…ʰ ?ýéOeš¦l6›²²²dµZ•••5½ž¸X,Y,Y­“m–ñÇ3Bäüþ±ñ±@z=|øP/^”ÃáPaa¡rrr¦ÿPØl“¿¦ÃáðôÔÇÇÇõá‡êƒ>о}û´aÃ*ÀšD€4»yó¦¶nݪ;w*77WYYYÓ­ñ‡xR,S$ѶmÛtíÚ5ݼyS;wIÌš€4ûøãåv»åp8d·Ûgt›%vÅ[Hív»‡Ün·>þøc*ÀšE‹(¤ÙØØ˜‡l6Û‚Ç\Ùl69QÖ,ZD Íb±Ø…Pir’€Íf{l’(¬%´ˆÀ*rVê|ÇA°h±XLÙÙÙÓ·IY‹Å¢ììlZD¬itÍ@šÅ'&=ñ/ð© L°VÑ" éþE>ôIÂh,›îž€µŠ®yXAt1c=ãcK€ X”¼¼<Ïø6¥…,ãããÊËË£D‹STT¤;wîL…ç|âûݹsGEEET €5‹1¢fßþö·uûömýéORaa¡rrrd³Ù”==)kbbBápXãããR0Tii)€ X»Ý®þð‡ѧŸ~ªP(¤p8<½H“³ãã‹ÝnWaa¡\.×¢fÚA0Íb±ÈívËívSÖ Æˆ€ €õÃöðáÃ%{±äÙž‰3@ãëÑhtúgâ‰D‰D¦×£Ñ(ŸÀW8V$™þŠàøW '.‹eúgâ—m$I_Š1ê¶7®HÐäš>ãK8–a\1KÄápÈ4MÙl¶é¢É4<­Vë²QºæQD@¢ ˆQD‚(¢AQD‚(¢AQ€ ‚(@A ˆ€ ‚(°Âl«ù䆇‡ù„¢+Ïívó d(ºæ@A ˆ€ D@¢ ˆQD@¢ ˆËÇF°z™¦©¡¡!É4ÍŒ(“aÊÍÍUaa¡ ÃXWe_®º"ˆ€%¡ýýýr»ÝDLÓ”ßïW¿JKKS–+S˾uµ–Ñ5À*544$·Û­­[·fT1 cº\CCCëªìËQWQ°ä‚Á òóó3¶|[—e_ʺ"ˆ€%‰D”•••±å3 cÖ±Ÿ™^ö¥¬+‚(@A ˆ€ ‚(U‚(øæBúzæ°j«*äõzå­¬V]Óyõú×Iùƒ}:ßT§š©òWVשé|Ÿ‚«áÜüWT[Q£3Ã\¦_ñ @¦¥Põ< C—óµ÷ð 5–9eŽô©£õ”êë:wþUm·gpñ‡;õjí1õäïÖþ†:yòC鹤öST8§ó¯n—‹„ –#‡^י˕4žSSuÁä¶í;ä)±Ë÷b«ÎÔñ™Å‚êniQ»AçN×= ÜU*/®Õ‹-§Ô]צ*'—ÉjA×<Æ” Œ*”¸Ñ½[ÇÛNjñd: ÞèPSm•*¼^y½•ª9|F}AIòëJW‡{ŽêJ}…*_ìÞöéüáZUUxåõV©®¹C7B« àþ«:Ó#íj¨y¬Õ×½û¨Þxm ¦ÎsöòK v«®¢Vç¯v¨¹®Z^¯*kšÔéK(äp·NÖW«ÒëUEUš;}êkµÖA,+{‰êöäkðÍ}ªªmRkçUÝð‡$9Uìñh»SR¨O'ë[ÔëÚ¯ãm§Õv¢NŽoêHû …T OM™ÌÞ ÄÃS°W—ú •×zäÔ°:^­Wûh¹ÛÎéô¯öËÝÛ¢G®(ÝCPC#ïɧbU–¤hòtnWUmµ<ó•?žæÔÞҭ⃭ºxñ„ªÕ¥c-Ý“A<Ô§ãލËxIÇOŸSëA·zŽÕéØÕ ´Šëg5¢k€Œâ”§é¢ÎUtèBG—.;¤³’ —G{u¸ªXv9U~ð¨jª«µÃ)I%2*Ψ~xT’TP^£’Ñ7Õ9ÒŽv{;ÔgT¨µÌ®Ð3j÷yt¼óUU8%i»JŽûÔ{à‚zýUª*HcуAÊ©|çüu4WùãŠU]E¤bí?X¦ o( *©çM]í҉㵓u°£QÇ}M:?œ¿~¸@ ¢dzÝ^Y§æÊ:I! ÷uéB{».¼^«€ýŠNV«ªÆP_o§Î÷ö©÷zzzG¥]S‡”«¦ä˜Ú»|:¼Ã­¾Ž>•­*³KÁë ŒèÐÿö&½§K£Joµ;åO ôøŒ¤ü¾™ùÅr;ç)¿$)_;ZVívɘzá^ŸLwƒ=í”çp«<’üóÔƒ«“ @† Ý8£¦véàñød»Ü;ªu¸µ\%µÿ –Ž>…ʤ–‡Ôe”kOõnÕ¼V«š õjš¾¿QÊkJÔr¦K#=êè³kwk‰ì’‚¦¤ü½úU[ŠÄw6ät§·ìö¢r¹Õ­î ª ’šEƒÝz}ßë ½ñ:ãéSóœå—d2ì³Lê M>ŸòÙùê‡þù# @±Û¥÷.¨c ôXB „$ÃéT°·]—ƒ{Ôv¾UMuÕªØî’=’™°·»¼F%#ÝêìêP¯}—jJ&c—³¤DŽÀ€·ÜîÉ%?С–“] ¤{BNA¹ö{¤÷NžQ_Ò¹ w]P¯JT½ca埣†•ïqI¾÷¡UH½MÕªnšëg¢E€LR¼G åízý@­Fê´»Ä-§9¬«í:;X¢†“%rÜrŒö©«ç†òËìòuµêØ{£2Ë| „Ÿö×í–Ç%ùº/éì¥ër½tN{Ü’Fæ)ÿ|ïRñªv«^MMe:Zç‘ÝwVÍ]Aíh+ÖÆùê'È%J c¨êÄEÙÛOêLç›j È4rí¨Tãéê)¶Ků©yïµyY —Êö4èÄ §š›Zt¤Ã£óµÅ’ܪ¬)Ò©S¦v×'tC«®­M:v\']Ö¨‘¯²=o¨íðŽÕq£xwµÚÞvëLËIu´¾®³£’ÃU¦ÊÆÓ:\3u3{Ï<寞ç=œ=ó†ZšOéÈS2%ÚÝØ¦FS’su×Ï*c9zôhl©^,‹=ö8¾-N?ŽF£ÓK$™þ_Âá° ÃP[[Ÿ`Ýêíí•ÇãY—e\e_é롾¾^¦iÊf³)++kz±Z­Ó?ã‹Åb‘Åb‘Õ:9Š3þxFˆLz¼Œ@ZD@A ˆ€ D@K,++K‘H$cËgš¦ ÃX—e_ʺ"ˆ€%çt:õùçŸglùü~¿rss×eÙ—²®¢`ÉêîÝ»‘išS.Ó4522¢»w練°p]•}9êj-ã»æX¥ ÃPii©†††ä÷û3&†¡ÜÜ\•––ÎÚÝœ©e_Žº"ˆ€e "Ï=÷eGF¢k™D-Ë²ì €µ™Çh@Z¤=ˆÒú °>³-¢ ˆÒ: °~2—u% _·X,mŸí9,].[h[‰ÐjMwe ý5VÍd¥x §E`ùrWrÞZW“•R6yA`ùsØBrYFÑäDž*¡Çõ÷÷sÅ|C|ðÁœ™+]=Òi ¢óMT²X,ŠÅbúÝï~Ç•ð ½ûÅb)»åWjbÒª ¢³…ÐÄm±XLýýýêèèàêX¤ŽŽݾ}{FM•½ÒÁ¶’¡3.^±XlF$/‘HD]]]ºyó¦^|ñE•––r5,@¿Þ~ûmݾ}[‘HDV«5eÞJÎj+9y|Iƒhb¸L|<×öT‹Õj~>ëÖ­[úå/Éð"‘ˆb±Øt-ŒÎ6ƒ~¾í«*ˆ.6´ÎF¥ÉÖÓh4ªp8¬h4:½Äb±éçâ¯ß—¸°–Í5Ç&1`Z­ÖY—Ä}Ò=>4­A4±ã­Ÿ‰á39& ñãÃ(!drí>ì‰-Ÿ©hªº.ƈ¦JÚ©ÍÎ>ŸF£3(ADg¶ˆÎÖ::W·üJ¹m%*,Õ8Ñù*39ŒÆhâkÎD £ Cè|At®0:ÛþsÝØ~9C©-•‹Éc$)Σ‰ãIS…ÐÙZB £ “BèB‚hªnúäõt·†¦%ˆ.4Ý[­Öa4X'*¥š¤”*xF@¦„ÐTA49L¦š˜4ߌùt°-Ge¥ê‚O잟­ÀñíñÛ7¥  Œ „ÓùÇŠÎHŸä6NËý]ô¶ÕP‰qñVÐÄÇ©Z>çk %Œ€L¡©‚hâúlas¾Û¯¤ýf¥äVÑÄqŸ©Âgâ²Ð–PB(X/at¡-£ ™¤´ÖÐ5DSuÏÏJãáq¾Â&ÑÙÂ'A¬— :_/œ&>¿ð¹ÔátÅï#š<û}®0š>_È·(J@&†ÏÙé“„Ò¹BhÆÜGôIÂè|û%†KZCÁTÏÙ~Î>ÓõUŸ¶å¬œÙ‚álat®VÑÙö㾡`=‡ÐÅ„ÒÅ„Ð娶tVàBZFg ¥ñЙêùë)ˆÎ(<Ó1sÞ¶Ü•´IK©ÖzLrøLçMYÒJçú¦…×…ßUDFƒåB ¸-¢`½…ÏÅÓt‡Ð ¢ £³Ð…tÙÏWY„S‰¡s¡û/ö’–»§yÅoh¿ÂÎÕÕþ¤Át%*`­„×Åô8¯ù ºÐ0š\ðTß[?Z?ÀzšéØMÑ' £³UÄB[Uª+{쪢‰\Lë%A`u…×5DS˜.u€ÌŸ«&ˆJÖWø\•At¡DHX;asÍÑL¨XÌÍJ þ?HMèk)ÌÌÉIEND®B`‚glewlwyd-1.3.1/screenshots/g_4_scopes.png000066400000000000000000001325301322667720100204570ustar00rootroot00000000000000‰PNG  IHDRl.²Ü'À pHYs  šœtIMEár*¡ètEXtCommentCreated with GIMPW IDATxÚìÝLÛwžïû¿lvBb7ݦ8=ÓôàvvÜÛ303…Nïè,t¤8R:«îUi¡š-™Õ Ù««›äj'É•iSí™$ºSØ‘ Ò–ÜUAÚ)ìN¡;Šgî¶)žnkš©6vBj°“Àýƒ6„ß8?ž)RÁ_¾þ~?ß?R?/ÞŸ”±±±1 iRi€ä"°H2€$#°H2€$#°H²tšæ÷ÛÏÂúë“¿ÖåȰnܼIƒXPzZšÖ›³ô·»¾«om±,x|ÊØØØÍ³ûíga½ú³v¥×(%Ý ” XØØØ¨Fc#»>¢Ÿÿ¸tÁІ‘æñ““¿VªqR32 k,ZJJªÒŒk”’‘©Ÿœüõ‚Ç3ºÀ<ÂW®*5ÝHCX–TC¦#à GSÀÜÆÆÆ¤”À²¤¤¤.jï+€$#°H2€$#°H2€$#°H2ÒÍÚû¿oÓÛÏeÝ+,÷s[Tfešÿ¾é‚4à^fÚœ«C/;U¸>mâ7U»ß«e«â›hÿX]C÷Û]UðürŸ×™Ð(à>@`¸w¥›µûåÇkÿµ {‡›öZ–Š¿åûFÕÿÝïÕ1HsáîÅZ)À=̨¼Ì«jûÃŒ°&‘Ù¦C?zF%9+|+“U¯ÿE‘Þ;¸Mgÿæ»z£Ä*KÂËë&í¯~Aïü¯z·ú)•¸žÑ»{ž”3}çËÙ¬· µÝ?Üò\¡Þ¯Ù,‹²µsÏ÷Tµ>M®?û_õžg t„{+l÷¼Ø IétäožSqÆ,˜m:ô#IË]i“¾N{kžUÙåOuàïƒ ›QçY½•Ù£—Þ¹¢XúíýÑ7UðÙ9íù»AióãÚïyXÖ!ÿòÎ7ïÅ\ÕéŸý«Ì?.”»½K»zct€û+l÷‰T™3æyyb¥M‘iég6myBe™—tà-Ÿ:>‹ÈÛû±öüã ¬ßz\®tɲթ}¡}¿PÏù+êéîÕ?ÜœsÙÄBç[ÐÉÿ`ÿšû§÷ðÀÕrÖ£Xl&¿TïPüwáó_*‘-§)U6g¶Œ¿TÿTrC¾®.ó|<¥ à>1ªÈõy^ŽUw¼W=C÷æÝÒSeä!ß·ØÃpÏ3¤K¹¤= ïÆ™nÕ‰ÏÊ-M„5¿W×2ÚppHÑœ‡å2 (8qËæ‡e¿~U¾¡Q?–¶>¬¼ô¯ä½!Iér>•-éÒ2Î'É$)#UÆ©Yüt9¶dñ ïc6€{XTý#Ù*ÿF–zz‡g/w¶„°Æ°É¬ü͆é~9¢Ï>SÇÈsÚÿ²SÑŽ Â9¨î9 t¿¯ÞRìœOíú¬¾üµüË ´ùqíÝ’–°×ÌtC œO#à \7©âÅGäë”bü|ƒ ×¥4™×gË’yEáz½.elllŒf€Ù=óÚ[Ê0[hˆ»˜is®½ìTáú´‰ß\Tí~¯zdVÅQ ýã…Út³öîùŽ<æ[_ ´ÿ«^ú—«RÎF½îÙªòdzd–÷7ÿ®úŽÂÇ6mÖþN•ÚRð}¢£çl:ô|P•G>ÓÀlï¹Àùl.—Žüàåe]—ÿ£OtøC«Ž}¥ÇÏ+¬Tå—<§Æ¢Eþí}íx'²¬½ypg\„õû7^™÷˜ %Ǫ²-£êùÝ¥‰À%UÎÿV¤“›Ï©ôÄ ÑB´Å6©4+•¥Š¢½Ï­“-Ó Üo<¡½Ï¥«ï7—k°(ìaÀJ ž×ž_d«áOŸSÛÒ|­ÎúÿŽBeXœe6¡Þvutt©ÇÛ+_ ¬ðÐD§3d²8är¹å.*QY±KVãbÎUï¡RíjÏm5o«­Êq4ñýz_Khþ£z长ñe€¶z»­VŽUnãP¿W]gÔÑÓ¯@8¨`x¼?LÙìå¹KTRR¤—UÆÕxÇÞCziWëT-É{éÙú˵ãtP’d©xKïÔå­J›Ü Ÿµ€÷ŒZÚºåíí“?V|X2ÉâpÉå.PIY¹ŠóÌŒþXuÁs«úÜÇ4–eÉMÄÛ¤Ã‡Ž«c`ŽT0ÓPЧž O=Í:.›Šj´·Ê-+íUêmѱ†£söÇØPX¾°|^u4–lEªÙ[§ŠBû BЍ|-ÓÂI ¶tÊ_UµÊaÔ½&¢þÎikSwŸ_ÁðÐøFg“lN—ÜÅUyŠåXå¼$ÒÛ¤†úcê Î5, )èëQÐף޿c2åo×ÞCu*µù¸+,a›ˆºVª´úØÜaͬ‚ê:^­m•GåÐàX-!u6x´m×á¥õÇ`—Ž¿ö’^ªk‘?ºÌ·ŽúÔÒ9KÕÉ`‹ÚüÉl“€:›ÕØØ¨ÆSmË¿¿å6‹¿M žôÊžÃjîêÓÀdX#I±!ûztæøíxÁ£†v¿Vëòmµ*ß5wX3›¡¾Ví{©RG”Ü%¹Â&¢Þ£Uz­y`Úo 6·J`$Ú«£ÕÓÚܒ×õÆÛïéìÙnuŸ=«÷ÞyKGvºeš:"¦¾cµ:¾¢Æ ¨åp³â kòUsò=µ­U©Ë1ÖH’QV{ž\ÅÕ7¾£w–È2u^=ʘ ù l¢þfÕë‹CÞT ýM'U_ºðFåæ¼rÕ7½¥güwC‡uê›ÑÆj u6¨þLÂÊ­Üízã­FÕ.bO«»RG›NjgBŒõО–Àâ/ Ú§¦„å56O¥Ê*ÜšŠl‚gtÆÿ`õïÀ™£jz$¹÷¾­¦C•*LبÆlÏSqí µ¿õºò§~TóáŽ%f üjñÅtï?¢ª—Ke/ݯ5ñ$y¨ë4åÀ¼RRR¤±1À²Œ*--mÁãlBê8|\ñµ5¹ÚyâˆÊ—Rgɘ§ª#{§MÒ¶œî‘ –,Ú«7wÅW·ŠtðD½ ­K8‡Ù¥Ú'Tf‰ÿªïèaµ/25ˆx›Ô‹*J²º=rOVÇÿÔ¿CêiIX[“¿W=s—93æUêÐÞü„ÆoV×2›ˆ¿3alr«¢x±Á(GÙî„gÖ«6#˜›e]¶nƆiË2ÑzsÖ‚ÇÍ»‡M´¿Yozã?ÛvÒî¼eì8a/SmY£ªÏŒOµu·Éu˵ ûkDCýòz} †ÃŠÈ,›Ý!‡Ó©<;åÜ1¿¼Ý½òÃŠÈ ‹Í!ga¡òVù„:ëLÂJŽ‚C{Uj]ƉÌnÕ*Sgõ™ñð'Ö£ãgü*­r,t£êm6Ëõ¨Ø.InyÜRÏÄg%ÜqFþš<åïµU ·G^_@áHLf‹C‡CN—Cs>ʨOþøîŠ-ôHì%Ê?¼o¢„š_ÝQy¬Ko¬H aYŒÉ&‹a lÍSMò%)¦p("-b7Û2ÞDüêîöÊŒÈì*“Çm½ýOú>¹îú®^ýY»F•¢ƒQ))©4 €j,ÕØõýtWé‚ÇÏØDåo9“°?„[5yËÜ Ü¨üª:í4ôŽïaÌ“bÒJvô·©ñðqµ&l$ŸÈ”_¦Ýµ»åqÏ,•Qwm©^›\&á>¢÷NÏ>!í?¥òÇãmûºÞi©Ô¬û“GÚUýÂ>Mæ[î#ïéDñ|“Ÿwð:œmò¼tlb5‚S{ßi’gMÖ£½‡ôÒ®V…'žýÁwOÜŽ„¼:u¸AÇ»‚³žÃVôº5Tʹ*]; Ž7½ñ°ÄV¡š‚åO›Ý»µ;÷ŒŽM,Ñ6·¨¿¢nþ%âU³wê ä¬,žxf¹+Ü’w*±Q‹¿Fõóž,ªîêï赉?q¿ñ¾N.p|íwôZÏøOùßÓ©Róøç´q‡vœžù |Ú·íYío,ռݦùò¨@÷QÕ×7«oh–-nU¼¾W5¥³¬œ ûˆ?åç-â™rZ¤ñnLáÐ IòËÑB`›JŽÈ1‘ù˜æÛ4ÞÄŸ_ÿÑ—ôJsX’I%'ÛuÈeT ³Aµõg40ц¦2·\½»Ty|âyšJt²ýÐÂ÷jS嶯gPÁ‘v5Î2þÜÉû(s[uÏe–Ìá[[,úùKõ““¿ÖåÈ׺qó&`AiiiZoÎÒOw•ê[[, ?w ª£'>©g(Ú­â|aÚè(Wm}½êëëU_ç‘kÙ_äŽÊßV«òWÌ9é(IC}gt¬ú%U7öÎØPÜ,gYB„Ðß¡¹¶ õwjÚ4ø@‡zçØë"êëRïÔON•å/tƒwð:ìÅòLmÙáSKO`Á6öµth²u ·”‹öŸRÕKÕs†5’ì:¦]åuê¯BÏyu&^ÿJ¹Už®`±«dwBi®p§z‚óÿEÄÛ’PÍ©Š¢xêevoŸV­«Åw”E‹ÉßT¥¯ÍÖHRØ«æ};TÝtk©·h$Ñd‘Ó²˜÷ÒPBÿ5.s,0;ìñ½ƒÔ§£Ç:—°ŽQvw±Š‹Çÿ¹íÆÛ4ÞÌÕì1…:ëµkO<ä˜êÛÅÙ¦NÜ­–E”k õ4kj;C*Üæ¤ß÷£”‰p;ÆŒ¹WØDz§M`;KœwÅ·¥Cíõª:ÐßÇD&9 •ïÌ—ÃìWŸ·OÝ=¾©×ûNïRU줚ê\S×ou•Ë©¾ñ Ρ^u%—cæ;E5Ðá›ñ;Ÿ:|Q•º·ëïLXý‘[¦ÅTºs×aW±'WÇ&–“øZzòxæ.]íSsçd TPáž¾ò'Ô®=»Ž«/q‚Ö’¯¢"·\‹ìSgGÇø Š¡.ØcXñstÊ?õ“MÅnûŠÏiu•(W}+‚êì¨Ê1Wz‘·¹'þc~…¦-ð1jû´E6mòÕ¹V¥ìßüŒ2V¨"”¢u¶vM„{&¹ËÊå4K2Øäš#H w6hWp@1¯®¨òËe7+êWwëiµzã“û}ÇÔQrJå ÷mÌ«ÓÛï×Ä^ÄýF}íò&¬Ê)Xf.³Ë#·¡g*DêØ£—üÛµwo•J\öU¯Vc¼™µ mÚw8ŠJ™,å9Ì’£XžÜã:> ICêió)êšï|!u5ÇÇSI•fæ5I¹î#¿ý,¬WÖ®Tã¥d­U%Ñ,ÂØØ¨Â×FôêÏÚõó/¼ÊfÎÀ&ô*¾æ⼻`.Ô®â›ÎœÛuèHŠ¿_%Eýí:\·ojEÆ@ó-yGõ“³çv·Jl’/(IAõxªuÌ¢~uöÍüÊxL}~EÝ3KÃ…Õן²´jQq¼{±G¹Ç&Ê¢ùZÔòL›xŸö–}-êžldS±*§Íþ†Ô~à@ÂJƒòw6êH­{ZTU·WÞÆZÕžîS,¶ò¯Þ‡ûýñ ÊàT¡mú“Å%·E˜h² 7 héeÿBÝjNØÏ)ÿ–½ZÌr'&6CjñÕÉuûYÝ•ªsKŠz8Ó¥`L’ìÚ^S·ð?ÁÅdPÁÞ&ñ$–žØ(ÜÕ&kîe¡.µL5E%3Âõ$Þ÷‹ŸœüµRk”š‘IcX´””T¥×èæÄ8òÏÿçæ=~Î(8ö'|Û"›%Ù·UóñxP`«Ð‰“õÓ''¥jh:©Š©Iý°Z'–K²© 8~C¾ß­åÂ}šÊ>LñcÃÝ}º¥ PħŽx[”,6M¸ƒ×1£,ZsÏ\Å£"ò6u*ž×T(?±‰ýgôfOB¬íjœÖŒ3Ë]Û¨Æ2˪<û°/án-.YVcVØ8}åI88w©¨·Yñ¼Æ­ŠÂ[ïØêÞ®x‘µ!uÞ#eÑ,e:äqÌ:Ñn/Ý«ºÄÊq¾•Ô·‹¨ûPµ÷MþlPA]…Ë€rTžÐ[¯»ešùÒO=­ÇuàµW´í;…*¯ªÓ¡Smêî-ò™¬æx3Ëø›8ç©Cªœ%ä°—x4õq wéŒî«tµÄË¡ÙÊTé0Þ5÷Àý"|åªRÓù?_Ë“jÈÔ`dxáãæz!I\a–yU­-=û쳋úWz¨i“ÙQŸš[&k´™T²w÷ü妌.íÞ[ßãÂÛª¾©4Ä(GIÂ$o‡fnñuh2ûpîÞ­‚É tÈ™yiêŸüÁäV©c±ƒ÷¼Žñ²h“|-=³OÄFzÕ<5»{ë·õým-S×#S‰ö×Î(—6Yîš½ñk^Xb4[n _£Ì‰‰iöµ@!õ4O¥ ã{úÌvÓV·*¡ÎùîúÄÆ©Ý»ç†ÎõÔ–uK!¯«ËõZk¼Î¢­ìˆ­dc¬‰ëË«<¡¶·jg‰sŽ~S°¯K­ÇèµW¶é;…Õm‘7½CãÍlL*k¨¹¥tYüãš°†ÕÙœ£Ýê‰/¯Q®§\Óóš$ß÷‰±±1)…Ýk,OJJªnܼ¹àqs[Lœ¹6Üwì”wjÙG¡<‹˜!4»+¿º&hŽ2¹'_òªsÚ7Ø£òwNF6¸ Tâ˜|­_3¾íìî—r•ɹ„°ýN^‡½8á[û}-šm‘MÄÛß_ÄR"Ï´Ùßz66²”T,£Œ†<¿hHݧêT¾­Z§½ ;¨Ô‰†B­Ö<¿9¯Tµ‡šÔùþ;:yd¯v–È9×â®Ø€zš«ú¥Ty´{öàr•Ç›[˜JäÉŸo ˜°;Úœí°@OB94§*ãÄ]rkÎÀÆhJ˜¤E‰%÷BCýÞø„¥½@¹‹™#4ÚäN(ï3L\¥áR‰+þZ·7±ÔSPÞÉYN“K…»\SåņÔÛ™8u’7!Äp•¹–6 }'¯cÚ·öûÔâ9UQwsâÕ“<Ó÷͈¨gjc#ƒœÅÎE”@2˹ìMJâ ‰K¼¢a­NwŒ)’8m4ÏšMºšã%§ ªpÍý„­nÏ´²hÝ-}wuY4C^žnOµÃ¨ª}i›^;Þ•6XTðúIµ-]Ü>OKe´ËUìQmC£šÚÏêýwßÒûk´½À9Ë}Æäk~M;j[4³âت73åj¡…xÓÖ`‡:ý³ôÍž„rhù*²ß}÷`qÒçzÁ`µÈ É…6Aõ¢*Í›fÎîiÒûes½S°¥J;Ž ,ëB‡÷ñжg,ù‘pTšŠ1Ìr—9%ïøtç@W¯"•öñWCýšÊBEr%ƒÛ-“ÎhHR°§W¡ZÇø¾-‘>u$|ýdɵîäuŒkÿØÄ3èkö*TZß&Ô­æ©ZrU1óÛú±ˆÂS‹$,rÛ7Skv8d’/aO¤¥2Êâ°H“gúŒJö•NGêKèV¦ÜÙÚlzÉ)źôÚ Ï.¾ßv·¨/ê–û.Ô6›L«ÒH¯Zêu¸kúšSþvím¨[BÉÀ•3ZóTXž§Âò*Õ+¢þÎ6µœzS­}ñÞ8ÔsXuoºÕTßÇgõÇ›éLË íŪtÓaßøÜÖPU•}ξé®(¸e/©»â>,ÊÜ+llnÅ·¬Ëë‹,âtFsý3Ká宋ˆ*XùšŠhtú9¬î²ø7Ø{ãûÇD:¦¾µž[2¾RÅè(‘krfÒß?&êïŒï“[¦‚elÉq'¯czY´V%.² õ4kªò—³RÅö[Pñ^`–y±sýÓŠ7#7;íñ‰áX¯ºƒ«Ðû#>yÎcwÙn½Î@§š|+x¡N5ÝÍeÑV5;‰*Ð}TU¥»¦‡5¶"Õ¼ñŽÚOÕßѰf–^¤¼âJÕŸj×ÛûK¦­¸hnTü1ÝžñfZ³[sØUàqƯ±­S¹ú¦¡@…Ö;2n.ý>,Æœ+ldqÉe’&¾ˆîëèS¤¼x{NDö‡—¥‰ó¼¦|¹-K>Ã1crÑâV¡EKŠõ©Ó•;OòwöM¬,²È=¹áºÙ©‡Ôã“ëU‡?ªB—QÁNïÔÊ[qáòÊ<ÝÉë°Ë“{Lã‹l¼jõFTZj–RW|£åWÝz£1áùG]ì\p,¶â²`fg±ê™°‚êñ†TëXÙ†õ‘¾ù§~²©Àuëù-š¶&Ì`XÄŠ‚˜b±ø÷4yq¯Þ~-w§¨úOUk×ñ¾„ru¹*ÙÛ ½×êß{¤_ÝÝ~E$͹ ó–ðF9Ê÷ëD¸_;ŽO<ÝXŸÚ}Q¹]ÆÛ7Þ,ƒ½À#§÷ûõ*å±ßÚ7 U³ï'u—Ü€…ÍØ*wt¦kbúµç”:CÅ*_îyÔ¯ö¾å~ÛÛ(³Å$i<ð1¸juè¨{勌•˜Ô|fH“ûÇÔåI}“ûÈœ*žZ`ß?Æ”4¤^oPr™Ô;µoŒIŶ{à:¦—Eó¶z)-–9Е°y¹[³-Ñ1˜ešª“–?¼¸ºd±HxåÐ&o»@e¹ÒdE=ß©fù=µr,û„!užŠï×#K±Jni6¿:Zâç^½ÓäYD(RK嶉RVR¬§E½‘B®(µˆ)¹{’@Ëô°ÆäÞ©CkUh½=ïõ·¨~_ëx¿2éÄ{G—XvÎ(GY•œÇL„€a „cO8nÓx³ö"yœ‡'úÒ€Zzòxì’êœê›&•TåÏXÝE÷`A©s¿dT~UYBÙ >½Ùܿ앑¾ÓêXÁsÂjŠXدՙ»6ÊYîžZ11ÐÑ«PħÎÉàÂQ,gÂ,¨ÍíÖd°Î~…"¾ø¾1†B•:÷ÄuL+‹æm–7":›¯®T1ûDû´Íȇäõ-æFèñ­Â³²«¤*?þc°EÝËïÑÞ7u¼/¡MË<ºe‹&§¦å5ž¢E® ²ª(¡”•b=jé]i k% Ôn+ÿ)Õއ5¶²#zûÄí k$Éh±ÇǦ˜_ýËiãŒÕRÃmo–ꢊx_òµx’¤@Bß´”¨bŽÏüÝs·Az¶J<ßÖ{·éìÁõ–çå¦Ïwüiئ³ŸSIæ­/›¶ºõþÁm:ûÖ»fß^ËV—Þnئ÷^Þ ƒi³Þjø®¶çH2mÒ[ ßÕκÁý$u¾®*íÌÿ<]¯7û—ÙDûuêPÇŠVY˜EñÁ×!ïbfCÝ:ZW«ÚÚZÕÖÒl—nt–Ë•pÞ¾ÞNõNüh+pOÛÄ{Úþ1¾õõvLkp—ɹ‚¯®ßÑë°Ëß4G-ݽ +I *¨pÏQ^Ê"—+¾qÍ@ÓŒ=5fTGçê$ Ö’Z•M½ýºê«s93ÐÑ^ÝÓª©«2¸USá¸å0[‹â;±8UQ´øÂZäQ|š=¦žæÞy'Ë£±VŸ…úÕ¼‡ˆ:¾/—¿W'Še½Ýokq)^©k@Í-þ¥wÏ´’xù «Ån×x³¬~_PïK¾õ„¢ÓÊ¡ÙÊ*o ïÂûX]érÿà9úVÎÄ\f†ò¾åÒ‰lÐÂ[oogKú-çs}kÃ]VÄ ‚‘©÷·ªüÇKŠÝøZgºÏË7ÂÓ¿_¥Îÿ²]åõÛVÙ èôkÔXÊ[„Ôy Z§Vx¥öB•O­îðêø©…VûDÕú°š»zÔÓÓ£¿AæÙ>mæ|•M.܈yÕÜÜ3,ä*œQ#kbÿ˜[•œ#7@ IDATeΕíÓqG¯c¼,ÚÄ Ôsü°NMUW*V¥{®3å,/Œxoêø«\"j^­ ÁèVM]A<ÝêОêÆÅMBOu‹~5½V­Ö„ ɹ{¯Joٯݯ¶Ž„ ϯPÁRRk‘¦-²™XÉ4g;濉@ÇiõÝ#H¨[§z¦ÖÖhgƒgyû8-¹/8å)ˆÏ!xºAMþèÒÆ¥ã !òÌ’x·k¼Yk*¦—õ©¥Ç—°æÊSî¸óã&@²¥¯U…ëÖ‰ «+Wyéóÿi x]Îçf;ékU¶eTþË7L“9ý¦ÂŸ*8"i䊚;ÔG`sßJ]è³»NG*f2ÃÚ·£J…Ë£…¼:U½C{:†VáR*Û/‰<ýšt†æ<:â=ª= IA~UÉÉV¹K&Ë!y{&gò*ºe©ÊÄþ1³[î^éš‚;{ÓÊ¢}Sצâ åÏ3AkÌß©ò©oH{ö¨eމò¨¿E{ê»[Åk-߯C% C©ï´ª+ëÔÔZðo#ýmj¨|EǼñ+2¸÷êÈ,«k¢þIÌk<K\52³,šW-3£%8 œ>¥Þ9>PQ‹ê-½¬\ì ‘¾ÖxdrÊîUoïRþõ+°¬f¹wW(>2õéXÕkjê_Lz‘·ñ5íKèÎ3V©Ü®ñfycC'~-}‰«³2ÞÞÑqà^uSþ¿Rdó#r%”E3Ø6Ë}#¤¶àèÄoR•ïyQïÿŦ„ m¯Ù¦wÿ›ù–’i†ÍÏèÝ=OªèOžÒÉ=ÿUg¾ ·^É•sò=27édC¡Ê¶<¢ƒ?~Qo—dÿÞdÕëQ4^Öío¾«7J¬ïgÐöš"Õ=”¦¼ß×û¯lÁôH¼$ÚL™ëTñJ¡Þmئ³_ÐIÏf9ÓyÚ÷šÔ…1ÊUÓ¨½ “ä±>Þó’^ðÔêPS»¼ý…"QIQEBõw·©±¡JÅÛªuÜ;8wêÄ‘’E,G››µ¤A5S)CX{^RÕ¡6yg|#~u6Öª²º5^ÎÊV¡º’¹§Ûí…źe¿ùÜb¹fYh’¸LüØ’¥­¾¸®cZY´I•T8ç_ögÌÓîý Ï1æÕá;Tר®Þ@DÑhT‘@¿:OÕ«rÇaωV±æ£UÅûO¨ÆpÆ`—ŽíÚ¦Òªz5¶u«ßP$•¢…üýò¶ŸRCu¹^xå€Î$®ôrîÔ‰7<²ßrÃQù[:â%Ó”¯Še<à[Ë¢yÊ¢•[”è„[UûÚ)yCÓ¯#ÐÙ¨×*«O’Á²”w«7x»kYEðúã?uépõ.íÚµ”ÕzÓ·¼ë4æíÖ‘š„6òêØ+/¨¼ö¨šÚ½ê„&úAT¡€_ý½Ýj?Õ ªâT}:!ËÝ©ýûo–Õë *4»„ãk~ÅÂû*ÝM÷°jn|­æY¾êPÿùÿ4üB=76Èc›œO•ó¹ Ò¾oêoGåûMH±Í)2t1=,mX¿½:ë—¥ë:TjTÇÿûUÿ¯ðæ­:ùJBà“‘­Ýž-Òo?ÖÑßKéë´·æYyÒƒ:ü÷ï«úC2>«·^Z'ƒbj=Þ¥£oªÿí_é;o]šç ÚYÚ¾ó9íÎ éðÿ|_U§>U`ËžþÞ¸',.c3:äil’©~—öuħ±c=j=Ö£ÖþÜä~]'Þ¨T^¬]u,¿´“Ñ¡ªÆýòVPÏ$ÅÔ×z@Õ­4 Äní´†|½~¤F®ùR[± ,§§•É2¹Ü³væñýcΨ'á,…«ÓñïèuŒ—E;v,!Á°•ÈãX¸þ‘¹p¯+úµ«yòoƒê:½O]§g;Ú ‚½‡d{sÏ´ûZcžªÞx[–»t ¡?†û:tº¯C§q “»FGTÍÞ/¢>µt%\¬»BËZ@e-’ÇyX‡'³o³¼‘bOpÖÂZ•™ªufbö}È{\ÕÛŽË`É•Ã"…ý O>_gwvªzß|Ÿƒ,M,­ «uW©¼N»µ¨²±QžU_*SØNâðeT^Õ W%ôE)ØÓ¬c=Í‹;…¥DGNÔξÌío–ÃêVE¾4ýñ»UQlMÞ¸ D¦MV9ƒŸªñÃGTõôZ™u]ý~ª3A³ 7­Žóó¤67†ÔöѨŸË‘á³KŠ¥g«ü©òþòkEž‹ žW÷ ·<›ÓÕõ‡²<µYy—ƒª¿0:lj¯«ã—¿Wóg£’®¨w(Kïüè •ä\Póˆ$¥)ÒíÕ¾îáñ{øÆ*˼¤où4^¤êcíIÏQû—ëŸ~'ïŵ…aÓí~è’êøÔ3"Iøe¶Ü?rÈmº U)€…;"uñ‡ÚUzè½sd§Ü‹M Nm?ø¶ÚOLlŠmv©$w…Wl/WcÓmwÎ\³1ˤ£­Dû›N¨2oYG£S¥îéçs•8f_i’¸ÌøÇJs»Twø:¦•E“dóx”·¨˜åª;¥“¯-ÙT²¿IGÊl«¿Y—Ñ®òCïè7jTd[ÊHž¯²½o©íD•æÚª'êkQGb^³½PË[g0£,š¼jNÜóÇìÖÞ{U0£cáù|ñ°Æä®ÑÉUrî?žòÄÆҀϧ¿"·¥>ZTáH²‡0³\uMzçš[ÚqÁI¹%{uòíCš7ó¸ãÍ2û’»Â=ý vªÐœÄq I ›ŸÒÛµßTÝŸnUí–Qyÿͯ¦»¤Ø–<ÕýéVúÑ÷´wË|Sß7äû]HÑ-È™.¬¨ ý’Îg$$7ÕúÙ¨\ÏåÈ$ƒŠžËVàÃ/4÷víuãaN,ø•|׳T°~òZ¢ò~_d±™düR½ Jøü— dd˹„RUf[ެY©ñÿئ³Çÿuÿè1YeŒ—dÃ=a‰U쌲×êDq•üÝj9Ó¦n¯_ÁðÐÔ¤ŸÁd“ÃU ’²r•»d6çgWIÃY’ÙaŸ1‰o”«¾]ï×Mþ8Ïd¡½XõM全³E-mêôúŠI2É’ëÓá”»Ä#OižÌ‹¼¯ü{µÓ⿃C%®¹þÒª‚š×µ³'¨˜$ƒÅ©òygÒ—p_·õ:fÙŒ Ï Wóo†1s«ò¨Þ)éUç™éì•?V$j”ÙîË]&OE‰ÜõÆêÞy_5÷¸zÓÀFÙ «t´­BÞNu¶u¨£§OþpXCS³Ð™l¹Ü*..QIñÂ}ÂèjPçÙ†U¹B«§Ig=ó¼WžGíEò6שŽ^ùü I2X”ë*PùöŠ©~uVéõ×ã—aÖöÈ«;©7,‡u¼¹G¾ðäg©„írä¨}[ïïŽ÷Ç…žÇÜÇ[UÞtVåIÆÆûAc»GþîNuvt¨ÃÛ+phza²É™çR~A‘ÊËŠå².²'®Êxc”½¤F¯ÛÆ.³Ë¾äϵ°F{wvÈ?þ—³Ü-óRNp—ÜÀʤ« ä±ø¬Í9*þ/37u1ÊóýjüŸ4×â’Xð yÓŸ‘Ç–®S[–ùü¿«wDrL;jTý¿¹$½üˆò¬YòXcjù‡«K¸ÖÑÉKw}Tᣫß$’"Ÿ«öï?“ZætS‘Az̽ջ—Å,G¡Gu…Õ-ñ/­®b•ºæzÕ8ž1ãXGq¥êŠ+—| ³ž-¯\µy‹¼‡ÂJÕ.é싾¯Û{Ó:š4µ“‡³RÅË(™e´ºTZåRiÕBoãÄ®QvW©*]¥ª¼'?†V¹+ä^àâöbUV.|®Âª£*¬Zþ¸¼ã“Å,Ga¹ª Ë•xûQiúÞÊdz«\•®•ÜžKžZ×½+‘ž­âÅTܱ=$GúõÍUVìÆ Z?KÕÁç¬ oN—¯}pÖpgèüyõ¦?£Ý¥9r ~®ŽÐ|ojV±-U]Ÿ‡2Û&93bj¾<{H)šó°\¦'ÞܲùaÙ¯_•o eÌ"Áˆ"æµ²Œ O”Ä— ›:ò|TG9 ¡t›{E*Mð€ŠúÕ’°ïÇb6/îE¬¸ŸdÈ’µˆÃ²²¨N2¾zÆø­ÿ¬ªœˆZ>›#ÕTËg©r?•¥ào.(¸Àµ•¿üŒ*¾±Nù[suè•Çdþ´_gæy†>ûL#´ÿe§Š6›•ïzRG~£@÷'ê]BÈ;ÿ©N]ÌQÃÿæRÙ7ÖÉírêÈ+ËT°æž’N<˜¢}§Ô25º¸UQ`¥QÜå®+2,i¡Ðf8ª…¶_:^½×VaðsyGæ:ꆼ¿¹"9 jùhxK»¨C¿º!§@uæëòtNÕ-žóÔ—tàï~«ˆg«~ô¸ÌÃÃòvŸÕ®Žˆ–¶%õUþûßHž§TWU óõ¨zûÿ©úŸ®(F‡¹§¤ŒÑ ‚ˆüþˆLƒb¾.­?¬®‰‘ÂTò†Ú.m? àñÌko)Ãl¡!î¶?ùÜñ°æþ zTo =¿^•÷Ë-)R‹óS•??ç ÃægÔ¾3U{þïßÉ˪Ìâz$¬ß¿ñÊ¼Ç°ÂæAêTýŽñ=kâêvÖ¸7÷;mûÝx£Ìl¹·lÔîÂ,õþã— ”CVŽÀæfRÑþFU9h HdÈÉÕþÚûðßU×Kq1Ü~6 £CùùûŠɤ\w‰*kvËãbï˜)vá#½´ï£Å{þ÷záÿ¢Í°26 ³Kµ§ÚUKKp×I¥ ’‹À Él’ŒÀæ‘’’"Ñ–ellTiii G`ó°¬ËÖÍØ0 `YFc#ZoÎZð8˜ÇOw}Wc×G4ÖØØ( `QÆÆFÇÇë#úé®ï.x|ÊØkù`>¿ý,¬Ÿœüµ.G†uóæMÀ‚ÒÒÒ´Þœ¥Ÿîú®¾µÅ²àñ6IFI4€$#°H2€$#°H2€$#°H2€$#°H2€$#°H²ôù^lÔ¹Áa¡¥pßÛš“©­9YÚž›Cc±±±±Ù^¨÷~¡Ï‡b´8™ :ä~„†Ü1³–Dkñ_&¬Áëó¡˜Zü—iÀ3k`ã _£eð@£ àNš5°au t_!°Ü9©4@rØ$ @’Ø$Yújœ¢ôÙ¬?_#itH}QçÆ^N1jw¡]ϧKÔOþí²‚‹>w†ÊþË£ú³LICõ—Þ!]™õw«,ä†Â‡ô„$iT¿ÿð¼~zyt‘œªoÿI®jÖ.ç~—Òwîï×­[«mÖteŒÆôÏþ!ÇV¯©o繸W¤Ó·²Z×N„5’”ª­fjÍåkºö@¶FŠÖlX«òG3$èÜçC ޼ΠÀ½ƒÀf–&q?jœöƵښvMÞ¤… 7ôÁGA}žž¢ë±Ø2V­ôïÀí”ÔÀfÝúõÚåÈÖÖµÊÖM]¼ª¶O/ëW‘Ñe/##K¥Oäèùƒì†T]‰êóÁˆþᓈþc±aKV¶¶­ÿÏ‹¡­³fÊ ,mÛ*ïÅ[¯kͺuÚý¸YO¯ÍÐõ‘y?Ô'3wJÉÔ_~צ‚TéêWô³A“~èX£\؃WÕæ»¤”­]OæÈ½6CÙ7®ëÜ…K:ñךxLß~Ê6½¤YŠA»¾ýˆ^4HüJõ£^~,[[MéR,*ïçaü":±*h–¿—¤”t=m_¯ífé±Ì4tSƒCQ}ðùeµ^ŒéšÒô}÷czÕ4y#™ú«ïnQÀw^}!5áý¿Ô?MןZ¯§G¾Rõï‡u=%CnÇzmß”©\Cš¤Q]½Õ¼¬_£óŸ;xcñÏsZ;Ìr|Æ÷€Õ lRÓõŸ6d)#1×HÍÐC3 ¥è±Í6z•XÜÔÅXüº–œ7Äb M5ª+‹Y\rýšZ¿º¡¿Ú˜.efëÏžÊÖŸIºzmX†"z÷ó«‹m~ihHç/úfL¦è{­Õ««þ“)¡\Ûj?Ïó\÷ˆ¤¬°‰o2ªÀ`t–``L%U´JYù5¥µmjÏ•LÕnQÍÌcLf=mŒèWÑûáÑß”÷Üõã@¶^Ü”-·uìéRöš,<–¥ûþöƒ‹úp1«lFG§‡Likôão?¬gÓ%éºÎ]¸¢³ƒ#’ýaýùÚÛøýJÿÏ…¨B7n(8tSÚ˜.馮JÓ7šI•Õ ix“§¦Lu¯g6dʺ©ëýÐ4óÀÙϽ¤ç™Â‡pïKNI´á+z3°Fûì=´i£~º)ñÅ›:ë 郥Զ‹©õ£+zú›ëd—AÏ?i×ó‰¯ßÖÏ?žgO–´L•n˜XÍóõµ]žq숮‡Ö뙩Ò³¾uEg†‡õ‹O®éiçR3µí)›¶ÝCþÊ¥Ëúç›^ÌLÕÖÇ7éÐã3øzP­_*׆nJÊdП?·EÏûÎkß…yÎ=8¬‹2è!¥jë6ýô‰¤¦hr̬ç®ðypIMÎÛŽêÜúÉGWôû¡ëº*I£7üZ?ÿíúÙ—7–|ÆkW.ißÔQ 6*Iº:Õ¹ !ÕpA¿ž»|Öº kõÌÄžuO ÊI’2ôâ¦ñ¸!üRõá Î~}]1I±XT=Ÿ\Ðχî'sD'Ïtâ×4»9qoÒÕXT¿ÿãWªÿðk'šìJ(¤Ÿ‡bÇÜÐàùK‘]¿zYû®èÜÈÄs¸6¬þ8 ýŸO¤pékTž“:ï¹Wò<¸×¤ŒÝ2óýîÏh<ð~Q´…FÜ©4@rØ$ @’Ø$ @’Ø$Ù¬ÍcÙZ´'×eÒ€;fÖÀÆm]CËà¶5‡ÀpçÌØxëYeƒÖcÙyëiÀ“26666׋-þË:78¢¯ŒÐR¸ï=¹.S[s2 kwܼ n¿Tš ¹l’ŒÀ Él’ŒÀ Él’ŒÀ Él’ŒÀ Él’ŒÀ Él’,ýòåË´`Y222týúuÿoÀÖ¯_?ïë)cccc4@òP Él’ŒÀ Él’ŒÀ Él’ŒÀ Él’ŒÀ Él’ŒÀ Él’ŒÀ Él’ŒÀ Él’ŒÀ Él’ŒÀ Élà÷é§ŸÒ@’Ø$ @’Øþöî=¸Ê2Á÷ýWHVD×’˜’¨!R¶\bƒ/ (ˆ—C°A[ÑVÐØ{S‡P§ S#ô°íލðô@<o@oØa¤aŒ;Jw‡À`Bk‚¡WhX+AÎ  \£òýTQµÖ{yÞç}ÞKªÖçy$µ0I’$I’$I’¤f`#I’$I’$I’Ô l$I’$I’$I’Z˜$I’$I’$IR 3°‘$I’$I’$Ija6’$I’$I’$I-ÌÀF’$I’$I’$©…ØH’$I’$I’$µ0I’$I’$I’¤f`#I’$I’$I’Ô l$I’$I’$I’Z˜$I’$I’$IR ‹;_WoÚȸ‚¿PFˆ‡ßÄäî gµ$I’$I’$IÒÝùéaS·›_ü…²ýÀþo|FiÝYlsX-s^^ÆåµÇ­‰nû„~SÖ±|ŸS’$I’$I’$ý0Å}W ¾±…[Y·û‰íxjèÕ¶¾$I’$I’$I竇M|"/¿’Œ‹‹CÜŸ•ÀÜe¬Ûý ±ÝÕ¼º`+ÉYG¶ypøµôŠ÷‚H’$I’$I’¤ ÏyèaSÇÚÿw-ÓvµeàÝOÊþ­¼{ÜvÖ’ÁSÛR[¿—’•dÈŸ{±èÿhOè¬}€òO6‘»¼Š µßHLbøÐëŸÑ87ξÝ,*ØÈ‚-ÂõzÞÐ…ICÓèì«"ç·1|T:ë ?cs÷ŸP0fpB IDAT¨ÍÉË“$I’$I’$I:Î}`S·—w·ì#¼o¾¿1ªß ¶­­aÁŠÏ);ô}÷—”×µ?ëž6Ѫ2Æ|EúÀëÉ¿¦•ÅÿÁ´…¥ôýï7ѯÍ> 37®¹Oô"y onbôÂx–æ¤Ð ~/s ¶Ñ«ÏµŒïÞæåyóH’$I’$I’¤sã¼ô° ïoú=BI\'2Ø{$˜ D¿¸ÞlºhŒÈ·9td/á¸DÆßx™!ÈL ’zÝ>Râ Zµ¹»’țЭ1l¹ŒŒG÷R’_NI$…Aqßêwy·6¤1Ѳ—'I’$I’$I’t®œûè!>Èý×(ù,qmy°ß¤^Gú£×P°¼‚u»¿!ØŽƒ®$õë¿ò\Öe­ý ê!ùÚ+IÿóØ$\Ý™á‰ÅLøÇUô¼ö \—ÂÀk“H‡êªÝ„÷G÷ËeÇìÕ†²ý0( ³sà´Ê“$I’$I’$I:WÎC_‘6 yì†ÑªÍd¿ZÆ[Èìu5£ú´"Vµ‡wÿ'Â\ʨçîf~Jë“–zªymÚ$1þw3bÛNŠ>ûŠïója^záF2ë€àÕÌþYgÒ:ëV„.öq­IŽkR“”7(äÍ#I’$I’$I’Îó8¸Wë–WPqø{Œ’Ò JJÝn/o.¯&'犓„2 ¤_UŸ×PIÔÃËPöÙnbÁ+HŽƒê²ÍÌ­jÏØþ)dwN!{ànòfü; >2 å2‚µ%|qú5(º}3þ-ñ¦7{ì“•7èºïIúŠV–°¢àŠÊÊ)//§ªª–@ ™N½z’ÙÇ  ›Á½$I’$I’ΡóØÔíemÕ7§µiì/Õ”×]A¯5Oßû®¡Ó«›=ÏõI"5®žÍ.çÕOëé;¼ ½â!Â^Þ]ñ%µ÷bDZkÂe嬮 Ð71Ž„´kÈi·†iÿ\ ÷]Mêþ¯˜ÿÞç”uÿ )ñ@ýñGM8Iy’¤›jÖΜÀä77PÛì«0%«©(YÍ[¿J¡ÿ¤ä$I’$I’Î…óÚæ¢ö47Ý¿—È)6IHéÆü1m˜ùþçÌ\ø9µ´"¹]#Föã©î ½]B=˜‘UÊô÷KXQ`[ïä´Ö@œŸõ‚Ì\ð%µqzÞx=ùƒ9Q_™“—'Iúñˆ°6w$ãÞ ^ìÙŸ½z‘ž‘LB$LyyeëVPRPÅêé#YH~N7ìs)I’$I’¤o뢃’$I’$IÒ·Ó꼕ŸÄsC;’rª>2žyêYiÚ È¡o`«c^»ðøn¤Ú’$I’$IúâlIÒ-!Üd"µÓê-“Љ!÷÷%V¤O\tåZ æ¿É»«K( Ç€Á” 2 !{Ôp2ÛäÕ¥,˜Ï;E%”UÕÁ22û2$û)îÏl×ìÜ9‘å9üÝ” èOþÿšI&å½9ŸùEå4Ô¡ßÀŒÊD·SåSÑjJÞ]À¢wŠ()«¢6äÒ3úrÿˆ†÷K=ù>ÑJÖÌåÍ¥”•W®m8”ô úxЧu#ä](I’$I’tç°‘$ý 8‡M%‹†?À¯&¥¡ç‹KÈÏN?yqJQ*ß™Ìèi« Ÿp›îŸ1Üǧ6•Ës3å]ªNr„äþSÉÏBú1mØÌ^4wÇNaʼn fòbþl²»5¶ÑÊw˜6fÚ‰÷™Ï1oFN³ÁO¤dcÇ.`Cì$'ÒéAòçO&ÓÔF’$I’$]àZçæææÚ ’táúú믹üòË/àÚ·œ-ÞÀÎuÿÊ›$§^ÅÕW\rV]Q«‹þNYMC‰Éô8ŒGÁÐ~½¹¢u9*jZÊV¬$Ú8·´;r”HI.#ñ.;¿§ddȈÇ10“+B)ÿ‚=`_ÅjÞÿÏ †::\ŠýçÛ,XµÄøÏ•…ï‚ô¿ÿ~²LïäÖümg;÷±*Ö½û)CÓí’cOb9ÿíÑÿ‹U5 _ƒ=2ü‘G1ôvº_q »Ëÿ“p TóVQ”þÃn¡]ÜÑûOø?Å'aMJßÉùéc<2ìN23Ù÷ŸŸQµØóEU=~çÕß2$“$I’$Iúa³‡$]àìaD73Ìh^=¶+H …ž}û2`Àúöͤ[»Óˆ"k™s@“¡Éª)ûÖÅ€ }'å“7ü˜¡Ë"¥,š0†_•4´Yʨ%,{$<ª,ÈæéeÀ z-EJÈ}h ï†@_f/ŸC?{ÙH’$I’¤ X+›@’tÁKèFNþfŒÈ$¹éòXV¿Å«ÓÆ1òž[¹iP6csçðNIå 纩.šÛÖ™“^:.¬h7h*“z6¢ô]ÊçЉ¬›Û`ÉÎ`j3Ã¥êÇø£H –s×R}¢ó ôeêŒcÀTM͈”Æ:¬žOQÓB*W0g]C¼æña @¨Ù3f0°q Ÿª‚ù”n”(áÒÊÆÏ ØÌs¡LrFõ§gFÉÄ¢Þ†’$I’$éÂf`#I@B*Æç³ü˘7ãEFÜß—Œäc¶ —±îÝLó·ËüÒÈ1TSRÐØ»%ПQÍ.´£ïS£Ø¿?ýd4†QÊV”ГtbTN¯–Ðm9_Jßm”-8ð)NX…„nŒzª15bïn8r.•ë h˜Ò'…á9™œ°ãK(“QC©¶„’&sÝB‡j_λë*›Ý=={&ó-bÑüÜ×S’$I’$égH’ÔDB;z Ȧ׀l¢Õ›)Y·Ž¢¢"V¯Þ@øÐvUëxuôC”¾4™ƒR–E«X]Þ¸>}'â«]¿±äõkº$L鿯!Ù’û‘™|²J¶#³o ”UA¬œ’*è—~üV½šëÙÒ´”Ìtb@ùÚJ¢º‘@„ò¢†¸†@:jª«OÒ\)@¸¡þá(¤' ¤ìOò›o&FÉ´²âAFÜ?ˆ~ý2Iwè3I’$I’¤ãØH’t íºÑoH7ú Éa2Ê‹ ˜9ýUÖ…¬ž2w2óÒˆ… 7‡HOåŒr‰h„ÊÆ}IÎ ùÓå$g$U@„ªHŽ‹f’IOœ¢tÚ@¸êP%|èclS¸ç4O F8;\„^ã™ýbã~µŽ0Pµî-~µî-~’3ÈìÛ—C†0 3óI’$I’$‡D“$‰h4Jô´æP ‘> ‡9K2ªÓ¡e%Ì_]y¨  ,ΰ±#ó¸$œjó„„ÃûEcÍm pªRªf,Ö8[ŒÈYÎ';ªè–=‡¥Kó™4¢ÿQÃËÅ-÷7h,óKª½ %I’$IÒÏ6’¤ X”Íy0ò­0Љ—z»%tã©ÉysÌ b@UIÑá©$$„÷‰EbgX—¡ ˆ„‰ÀI{žD#‘#û5› E7Ûó¦‰X„pc5Á¦õHÁÂ¥ãé–pö-œšÉðñ™ ‘ÊRJJJX[Tĺu¨Šáu¼:f,™GNz‚·¤$I’$Iº`ÙÃF’tK ”lü\EIÕt- *‡{Ó’éÔØ“$V¾ùÈ|7Í©^Ë¢ùó™?E•@B2)‡ªRBùI«¥j]c¯’éÕìøiµ”–´DË×Ru¨”ôäÆh'DjzãùDÊO~g(”Ú‹Cr˜ï¬]Fþ¨ŒÆ5e̳¨7¤$I’$Iº€ØH’.hɽ2iÈXb¬ž»‚Óœ«j]Éá0#=3¥!ìHHe@FcØQQÐÄœ@å»3ùÕ«¯òê«oRhG¯ÌÆÄ&¶Ž‚’ȉwŽn `mã„7É™ôLn~³Š‚"N\…( V4žC^ý¥E dôo Rb¥¼»á$õ BI^6C bHv¥‡—èfæŒÉføðáääÑ| íÈ|jó²XU9oGI’$I’t3°‘$]Ð2²¹ÿPVQ2qsJNDË È[Ñø-“}Û5~‘™3€† ¢‚¹3‹š€"kyu~ãþÁL4?}øp¦Æ‰±zúÜ#ÈÑGgóÜ<ÞmÌkRîÏæ„#‰•½ÊôåÍGPÑÒ¹ä*$y #z)$Ô/‡¾€ZVäÎáDÙQ´t.¹o•QSêw¤ PYFEEVpÂ)j"•„k4D“$I’$I2IÒ…-!§òF5%P¶` C²sYTTJyäHbTS¹y-3ÇòÐCÓÙÐ8÷K§ç&1 ]“â2Ÿclφϵ«'0zr¥•MÊ©,bæØ ¬h *:åäÐëPR‘:œñ‡ºœT½É˜Ñ3Y¾¹úðPaÑêÍÍÃè‡ÂžþŒ‘~’ #ƺ)£™\PBeäp!”.Ïcôè4” ó¹&uõeüS½lªÞbLöd J«› Y¡|ùLFy³qHµF¼Ø·Éœ;) ì{hl¸uL—Ç;›N}"›—“7n %ß3ìyÒ9{$I’$I’~ì.:xðàA›A’.\Û¶m£sçÎ|;DJf’3æM*Î`Ÿ”ûg0/wíŽ]Q½œÉ#§°¢é0 ÉÔŽ5YÖóE–äÓC&RÊœ1£YPÖ´ÀÁ`ŒÚÚ¦Ë:1">ã3Ž9"Ësø»)€ =3Cl(©jR…±ÚØQÛ'œÁ¼fÎJÞŸÍ´ÕµGŸC"áZbMêÖóÅEägU1þ¡ ¬®=ú<’“CD#ašV#Ðw*Kæ !ÕÇQ’$I’$]Àìa#IÊOÁÿšÇ¤û{’|ŠmƒýynöR–4Ö´DÞÂ|žëŸrdY¬iX ãþ—ŽkB½;o SìÙ8´ÀÑaM ã~¦.\t\XsLA ˜4y/ö=|>G‡5Éô}.ÿa @*Cf.!ÿ¹þ¤4=‡&aM Ó@^Ì_r|XÐny‹f0¢g°ÉÂáp“°&˜ÁÀóY:ðF’$I’$É6’t³‡Ms"T––PZ&®$L*é))¤¦¦’’žBjèôg[‰Vo¦dÝÊÃb¡dÒÓ3ÈÈèFêéŒÿ©¤´¤±@rr:Ý23É<ÉÎGzؤðÜ’wÈI¢•”­csU%a’IOïEfß^¤&œöI°¹¤„ åUTƤ¦¤“žžAÏníNkÞ™håf6”—SYUE8 ”’JJj:½z¥; š$I’$IR#IºÀØü¸4ØH’$I’$é{Ï!Ñ$I’$I’$I’Z˜$I’$I’$IR 3°‘$I’$I’$Ija6’$I’$I’$I-좃´$éµmÛ6:wîlCH’$I’$I-È6’$I’$I’$I-ÌÀF’$I’$I’$©…ØH’$I’$I’$µ0I’$I’$I’¤f`#I’$I’$I’Ô l$I’$I’$I’Z˜$I’$I’$IR ;¿M]-Ë—¬cÀ”eÜ4å’½äKÊëNµS-s^^ÆåµÇ­‰nû„~SÖ±|_Ë4Vt{)þïO(©;­“§ä£m¼³ëÀéÙNöÔ)øˆT‘=õCæí *I’$I’$IÒ…à<6u”3åÓ=4D/õ”}ZʘÂ"DÓFYûo[)¨úæô6»Œûû]MÆÅÞ”’$I’$I’$]hâÎ[Éu•ÆŽ[.-§lh™ñ6þQÚ$’=(±ásÄæ¤3Q__Ï×_M]]ß|ó "I’$I’$ZµjE||<—_~9qqqßûúÆýp›úåŸl"wyj¿!˜Äð¡×3>#¡aõ¾Ý,*ØÈ‚-ÂõzÞÐ…ICÓèì«"ç·1|T:ë ?cs÷ŸP0(xÜ"UÛ™¾d+E;ê uìÀS·ó#à QËü—×°`7ðû• (û ËJ$v¸¼1âètmgr‡w¦W ò%Ù3¶1ü…Ûwç)I¸úúzvìØABB ¾%I’$I’tÄرc;vüÞ‡6ç¯vñ!²{Xýéѽl’{¥“qz×D«Ê[ðé¯'ÿšVTÿÓ–Ò÷¿ßD¿6û(XPÌܸNä>Ñ‹äý5¼Y¸‰Ñ ãYš“B;€ú½Ì-ØF¯>×2¾{›ãùŠÉ¿ÝDé5äÝ—D jÓ vRסqƒ“#ç…Ûˆ¼²–’Aý™]Ôífú?o¢äšÿBÞ}‰„ö×°¨ Œ «Ú±ô¾ËH8«óôa“¤šš.¾øbâââhÕª]t‘"I’$I’$õ¨üsëâ®dÞÈÎôŠ:_O^õjFÒ°þ”Ç*©Õá¦î{G/†ßxeCBþ¼1_ןõyJ’ ‹ …hݺõá?À’$I’$Ipø÷¢}ûö}ïëz^~önßÈCù! lKÿ>He¥›ÊøU)À6JžèÏäέÏú Wwfxb1þq=¯½‚×¥0ðÚ$R㡺j7áýÆýrÙ1{µ¡l?4Œ~ ³sॠêó}®þ/¤ΕZ“qíe›È©Ž:fq|A}ZSúù—,ú|7%©fÝçõpíÙŸ§$©ÁE]dX#I’$I’¤ã´jÕŠÖ­[ÿ æ=>MëV4†5µ{X]¼ç˜mb¼µj'c;§j¦„Ð)ŽÐ&‰ñ¿¸›ÛvRôÙW¬x¯˜W ;ðÒ 7’Y¯föÏ:“~Ô¶"t9°ˆkMr\ëosš'?Ʊ"»Èým +âÚqÿ) ¿¯ÃÿXÌäý§8ÎIÎsPȇM’‡A“$I’$IÒ ýP~;:÷ÿ¹n/EU§±]U5åuÍ­H ýr¨ú¼†Ê£– ì³ÝÄ‚—‘Õe›É[½‡Pç²ïëÍü ?áÁ¸,øP°‘™ ¾¤6.@ϯ'pbÃpj§#t%³Ÿ>À´%[™œ_F¨cGž™Á¢ßïnÜàTÇhCæum™¿âß½»K†^KnŸO˜¾p-oƵ¡çÌOîï71¡8‰E× '=OI’$I’$I’ôcpÑÁƒžëB+?ù„Ñ;Ìcsœý‡÷eæm¼’Ô¶mÛFçΰõÿâ‹/hÛ¶-­[dK’$I’$éx`Ïž=\uÕUßëzž—qµRo¼‘å7zH’$I’$I’$ŽV6$I’$I’$IRË2°‘$I’$I’$Ija6’$I’$I’$I-ÌÀF’$I’$I’$©…ØH’$I’$I’$µ0I’$I’$I’¤f`#I’$I’$I’Ô l$I’$I’$I’Z˜$I’$I’$IR ‹³ $I:Z}}=;wîdß¾}Äb±ïüø@€6mÚСCââüS-I’$I’t!ðW I’š¨¯¯gÛ¶m¤¦¦’––F øÎë‹Å¨®®fÛ¶mtîÜÙÐF’$I’$éà/@’$5±sçNRSSéСC‹Õ!ššzT}$I’$I’ôãæ6’$5Q[[Krrò÷¢.íÚµcß¾}^I’$I’¤ €$IM8p€Ö­[/êZdI’$I’$}÷ l$I’$I’$I’Z˜$I’$I’$IR 3°‘$I’$I’$Ija6’$I’$I’$I-ÌÀF’$I’$I’$©…ØH’$I’$I’$µ0I’Î¥h)yƒn⦛nâ¦Ay”FmI’$I’$š$IçT„ŠpãÇpD’$I’$I§ÁÀF’$I’$I’$©…ØH’$I’$I’$µ°8›@’¤o!ZJÞ£y+ÜÜÊÆÝzÓ‘¯É2oédz%Øl’$I’$I:š=l$IúVšÌYs*Îi#I’$I’¤0°‘$é[ Ñ)ù47MîDÈ“$I’$IR3M’¤o#¡“—ÿo&ú]˘[ÇQ@&³ÿ˜O?‡@“$I’$IÒ)ØÃF’$I’$I’$©…ØH’$I’$I’$µ0I’Ω&sÚ8g$I’$I’NÓyŸÃ&º«ŠW Ë(ø|1âèÔõJžº/ƒAí[Ÿyaûv³¨ð3 >PQû ÁĶôëw-“nMløA,REöŒ­ |ávrâ¶“=£‚á/ÜÎðË¿íYÔQòÑ_¨ì܉!gSoIÒ…ãØ9m$I’$I’¤Óp^{ØDw•3æ•?ñæçûˆPOÅ– ¦¼RÌ¢]ά°¯¿dìŒçWUm0èzfºž±Ý[Sòþ¿“³ü¯DÝ>î2îïw5Ÿ“3aí¿m¥ êïI’$I’$I’tÎÇ6QŠ ÿƒ Í®Ûïþùß)¨PAˆ‡ßÄäî ')«Ž¢Â¬KÌ`áÓé߸8#…¾íþÈKÿƒ¢¬> jºK›D²%z…%I’$I’$IÒ÷Þù lêö²â/'Y_¡€o|Æ®½é‚m#ÕÌßýG]}$¬i”z]/^ªÐ®þØ}¾${ƶ#C¢íÛÍ¢‚,Ø!\ ç ]˜44­¡¼}_‘ó[8òjÊV}Ί¿ì#Ю#ãëÅöû˜ÿòì~¿’e?aùC!ª>ÙDîò*6Ô~C 1‰áC¯g|F‚w”$I’$I’$I:cçiH´”—n§¤þt·?ù¼0ѯ¿¢œKÒL¢Óæ2Ýz%™'Õy Š™»¿“žèǼQIý|£VQ}h“ús w’~G&K^¸!ì`ZáN"Éyá6F%¶¢ç£GÑC‰PUÆØ‚¯õ»žü1™Lº&Ê› KY»ÏJ’$I’$I’$¹óØTò)Ù;¨=ÝöÅôÂ*ÊëN´¾žZâI>Ëùh¢UÛ˜»+‰¼‘Ýv½2Ò™úèÕ„¶”S9²]ú½ÈÉ’Úþ FÝÙ¾þ+a€øcš+²—p\"Ão¼‚Ì´ö zù#;“ç %I’$I’$I’ÎܹêþÊ‚åÕÄÎh§zÊ>ý9$ðÎCI×Y&.Ž { ï§IxrȪwí# ’z‚Ò#U» ï0î—ËŽYÓ†²ý0( WÊ‘æHˆƒÀ ÊK¸º3Ë™ð«èyí ¸.…×&‘ï %I’$I’$I’ÎÜy襬öìö¬--§lh™Ç íÛ“ÊNŠªê:få¾LyåOD½“ùל à: x5³vl/˜V„.öq­ ĵ>½Š¶Ibü/îfĶ}ö+Þ+æÕ¼ô ySI’$I’$I’¤3s†DK #ñjǨk`õ{Û(=fØ´Ê?—SBˆ!WŸ¸{K(å2‚µ%|qR/oø—ÙÎô÷ª×yuªË6“·z¡Î)dß×›ù~ƒq;YðyÔ;J’~àZ·n;u‰Åb/Š$I’$IÒàÜ6ñ—1jP;Îæç¥ä^éd4›»$0hx2wÎèW>aÎGU¬-«bQa1£—î!¥_/î¿üÄå&¤]CN»=LûçRÞ)ÛMÉŸ73aáç”…I9ÍaÌB|Cäë½TïƒöòîŠõLÿh¥U5­ÝÆêÚ‰Nb#I?tÁ`¯¾úê{Q—êêjÚ´iãE‘$I’$Iºœ—„¡Ýu7°ˆÿ ÷½¿°¡öôª‘qõä mfþšC.¿’ü m˜_ø+þÄ‚ýLlË€~Âø[.#á¤åÉùY(ØÈÌ_R çד?8ñûÒ†ÌëÚ2Å¿3zw?– O „q IDATíÁŒ¬R¦¿_ŠzÛ2px&¥µöŽ’¤¸:°mÛ6.ºè"’““[¤‡K,#³sçN:wîìE‘$I’$Iº\tðàÁƒ6ƒ$]¸¶mÛöƒ¾øâ Ú¶mKëÖç.4¯¯¯gçÎìÛ·X,öŸS  M›6tèи8{oJ’$I’$}`Ïž=\uÕUßëzú+$IÇþqŒ‹#55Õ†$I’$IÒw¦•M I’$I’$I’Ô² l$I’$I’$I’Z˜$I’$I’$IR 3°‘$I’$I’$Ija6’$I’$I’$I-ÌÀF’$I’$I’$©…ØH’$I’$I’$µ0I’$I’$I’¤f`#I’$I’$I’Ô l$I’$I’$I’Z˜$I’$I’$IR 3°‘$éL„WòxVYYY<ýAøÈòèfË"+k0¹£¶“ôCý”Ü»žõ#ÿ3ì±qän$Ò¢ï¡ÞCƒóøV¯›sUŽ$I’$éœ0°‘$é,mš3‡O#¶ƒô£L"))‰ µÔl_ϲ™Ï0±°ªåêÒ1-‰ŽiINwŸÃ¡òc,¬úåH’$I’Λ8›@’¤³T»Š™KGó/#;ÙÒVÍú=ãº&¶,œÈù›Ø4gÝ‘Ç-¡¨RèvòþåöïO9’$I’¤sÂ6’$¥ °}ÞV†›__õáo™ðØàÃC)=6á·|thÛŠßòHVY̦pö8†Ý•Å]ÞfƇUT|Ëãƒöy4ž’€X1…›¢§õl†?jò.¸kO^ȧMßáOY8ùq†ÝÕä]q¨LÕBËÊ"kØ >ü`O?ò³ÿ÷Ò£†2‹n™Í°¬,²›Mጧß'“[¸…†jT°ð§O°¤`;ù&oc´ù!Ñ"[(Ì{šGg‘•uß̚T¶I}V.Îåña‡ÞUPáûH’$I’¾I’ÎJFŽé ±bæÌÛÈq¿SV,fÊ”EoѱKwºt¬e{ñ"&Nù€£òK˜¹t;Äj6±tÊ£ütúj‚A –­Ë¦1}MÂ+™òÓi,]_KRïÛèÓ±–MËfòÄó…Ty1¤ïNBGnOˆ±}ëŽS?›U…Lœ¸ˆâíÖ»7Ý“jÙº&Ÿç§,nXÝÈŒ'ž'ÍVj;v§{ÇXûâùßÈÖ¬bÚô¥lÚQ{âºm_ÂÌeµ¤õîN°f+«f>ÁÄ•a #·Cï@ÛÆNâá´„ã÷ná·Ï<ÁÌe›ØAºwO¢fëò'þ”ÜŽÿ±f)ÓæS4¾«¦3}™o#I’$Iú6N8$Z}}=ÕÕÕÄb1êëëm)Iú‘ ƒ6ÂYêxÇX² Ÿ`ÑÒ™,}xÒQë"5»÷æ¶{Ç3uh'ªòØ£ùlßþ);¢÷’|hÃ@¦þ~w72ãÑgXZÝ'ýžßÞdËoÊ‹v°}ã¶ì˜Gq :f¿Ì¬‘ib[™÷Äó,ٴŠ¡<í¨lÒw$@ )Ĩ ÇØ²ìäÏæè² ãŒŸú47+(œ9‡kÃÔD!X<¥5@—±üîþ(3·.cñÖÑLN:räÞãä;ºŒ­â™fë–Æ˜7Þ`d§"MæÑ‰kXŸ¿ŒŠ;GÒ©OºóY_“DÛn§k8¦w`dý<–l’à7¿Ÿ@¨*|œGgneUþ*ÆÞ2ôÈ»‹.Œýýÿàá¨Xø?ÍßÎÖwšB‚7‰$I’$•f›úúz¾øâ .¿ürÚµkG\œSÝH’tœ@WFŽ¿ƒ¥W‘?g%·5Yºa/_ÉÒÂ|&>¾•M[wk®Œ¤è’ $%D÷.A `Jã4à±:¾úh;;=Ãß/jZÀ¶îˆB'"•¾1b5 Os0jNñl&t¹—ۂŬٱˆçÿ~Á´ÞÜvÛPÆŒ½“® P±±aÿŽ}ú@ CÿÇ¿1ôP1‡:­ocô==HNภ導·q[ã» Ô}(]XÃú±#2’NSŸYͧ[‰Iw ¥Kã+%嶇é2s:[·Êöh“À&©7½äŽ]’€íÄšËI’$I’NS³ILuu5—_~9mÛ¶µ…$I:‰Ð-cÓe3‹±ªÉòȧyüôùeÔÒ¸í¡Œ8ÌÂéKØ~VG©;ü©Ë˜—Ó¥é/¯’ºÖHß™è2ši]’à£S<›¡;Éûÿºóé²B W®bÍúõ,[´žeKW2õwSI;ÝŒ#äÔ™KŒXº¸Äš,= c$I’$é|kv›ýû÷ …lI’N)…{Æ?@ÒQËblÿ` £Í"oÜHîH«¥æ¬q Wtï@m$Þ·ÜÂ-·¤Ûú!~´•Z/‚ô‰²eé̆!Ì}Ú=™Ž§x6«VÎ&wú<6¥$wö¿ò?ßû uj×óáèxCÃþ;ÖS@…OßEVÖ#ÌØ=³êíXÃ[ö ¯YÌ&€´[H ý~:Qö’tC@ͪh,†ª5‹†tK»…ŽfÃ’$I’t^5ÛÃæ›o¾¡U«V¶Ž$I§!¡ÇhÆ÷YÆ”âC¿‚vJjÙ:ó _™DÍúo¬¤ I÷E3Ù´è žÙÚ‡¤šõo­%Ð{<#ý?ÒyTÃ’çeUb55‡ŸãîcÆrK8ų î xÕV­Zý»Ó1¶â@ ;·wL ”6š{‚ϳlûžxd%]ØÊ¦1H»ƒ‡Ó8³¤wKžù{Ö¤¨Ù^CŒ}ÆÜC'€„ÉA f‹çÌ&mü8n?¦ËN¨÷h긆E;–ðÌ£ëéݱ–õ›vIÜ3öžÆ!Û$I’$Iç‹©Œ$IßZ2·MZ“%˜ÄØ> PÃöín?–Þ v=+·GÏü)CyùñÜÑ%Èöâ5oÒûIüæå¡þˆ*oµ5ÔÔÔPK¤´ÞÜ3þ7¼üpÊi=›¡[¦2kÒôîÛ×S¼©†¤.w0vÖTîLB70ùw/“Ý'@Í&6íÖg /Ïzú̧¦JËfRvØQC,© wŒÿ /Ý~hÖ™NÜ1ú: ¦¸˜Ok›y%tåé7Þ`ü=ÝéÛÊúM5$u¹1/¿Áäì^#I’$IçÛEeÅé£xá—=ˆ/›W^›Âk‰¿æ…î_òúÄ<Š: åçSo%qw‹^Ëcâß~ɯŸÌ n×ûÌZx3ÙON%›M¼ýú¦¼œÈ¯so%‘¬È›ÆâøÁü|ê³$þm#ï¿þÏLyùR~=åV.)_DÞk“šýÃx¶Ï0 ÆÎ²µ¼¿x1ïÏú¯ìŽÿ5oú’ºö# aÆ¥ôÈ™BàË·+©k?˜®MF(Kìz3íëŠ(ßMc`“ÎÍMŽH¿™ôø"ÖïŠqë®2öü­‚¼ÑS§ö”ï…[»ãîöÓ˜ñÔ“t½¹7÷ëG¿›{Ð!à$I?ÚÿÜ$I’$IÒ÷Ãyl¾äýWð§='X½çO,xå}z¿2Œ+Y+›Y‹ááç‡5ΠCÆr¦ô&}âS¼þ‡­ ëâ9wZKª£a¶w39w(©G À¥zóÊ¿0xãÇ|üñǬ?E¯ßÌó¯LlìÑ#I’$I’$I’tæZóc»)ßuŠmv•³;vüâ@<”ü(?veŒÝuée´íÞ¾ü˜#›ÄØøÊ³<ûë2.IO%~×ÇlÙ}dÏÝ[>fWü•¤TÊù¸Iù±òµ”×%Ò£}€KÒÓ¹dO9»/í@‡ ÿwÿ×ü‘Ý1ؽ~!¯¿½…K{ÜÊ}9/ðÒ¯ÉÝñóöÆÝÞI’$I’$I’$é¬û6¼°ð_y¡ñklãËŒžö%Ù¯¾Â}N±ï•Ⱦ~1³þῲ7{ýÒÛsilëW/¦°²ÙÓé˜M?¦ñʬ®<;´ñ•oóÚÚ½tz%—wF¿K¦ñÚ+ ‰Ï¾•Ä]E,x} íÿ][ö7V¿2‹ôg‡Ò5¶…Â×ÿÀߺ?Ï€+!À0†¥þ‚×r 9wÓ~ïǼ=¿ò>¿¤}ꨤhQ{/y–Áñì^ÿ>Å{ÚÒ»ý%ÞI’$I’$I’$é¬]tðàÁƒÇ.ܶm;w>7GØù/üâc²çæÒçÒÓØ>¶“âÅ (ü¸ŒòÊ=ÔÅ_Bû®734;‡ ľü#¯¿6Ÿµ[öPwI'úe?˓ӹ`g1ó_[@Ѧ]üí’öt¿ûI^Ù›D Vö OMÛKö¨Dþ°x5{.!õæ‡ùùÏï#ãPÝvoäí_¿ÎÛªäoñmé: ‡Ÿº•+»Y¿ð×¼þþŸØUñm»ÒoäÏyrÀ•8$µŒ/¾ø‚¶mÛÒºukC’$I’$IÇ9pà{öì᪫®ú^×óü6±¼ü_×2ôŸž$£…SXÙ+<•WÇĹéaÂ"I? 6’$I’$I:™J`Óê¼!Оë»v%Ñ€D’$I’$I’$©Yqçÿøl[Z’$I’$I’$éâ.¤“ d¼Àüù^tI’$I’$]x>ûì3ᮽöZAR‹‰³ $I’$I’¤ Cffæ÷¦.%%%ß»úHRKjeH’$I’$I’$µ,I’$I’$I’¤f`#IÒ÷\tcƒOæÓèYì.äñ»£°Êv”ÎJd#ÌÇcÃî"++‹»?ÂÓy‹ù4Üô9[Éãw=ÆÂsùœ2Ïå»Åw•$I’$sÎa#IÒY  ÷>4”.A›B:cá•Lþé4ÖЛFgLZìøˆÂ…sxþ‰¼ôF.·'ÛL¾«$I’$éÜ0°‘$éÇ,Ôƒ‡Ÿîa;Hg,ÌÊéÓY|ˆYoŒã†Ð¡å·pû·ûèDfÎ{˜>z`cù®’$I’¤sÀ!Ñ$I:CÑŠ•ä==Œ»²îbØÓ3X¹2—aÌfËiÙRHîãø++‹¬¬Á<6y!#Í­¿‹aç²l{m“•òô]³øÃ…LxlpÃþ¹+©8\§,?–ÇÊCà …?82ÌС}?*$ïéG·Í僊¨U:Vx ‹á¶ñ£›„5B·0~ÖËLº·ã ò,žü8ÃîÊ"+kOç6¾ªXøXü¶¢ñe²…ÙòÈzä·4,‰²eö0²[Ì‘‘ÁNwŸ7ù·¼ÁÜ5n%GFk SøxÃfo!zªwËú]¥âƒ<ž>4lÝ#ã˜ýQ“1ëª>dö¸Gœ•Å]Þ&ïƒ —þèðº¬Á1á·n¿èƆwû‡ÌàéGî"+kO^Ì–Èé\kI’$I:s6’$‰è§Ì|fÅI#yé7³˜tg s¦¯¢æ´÷ßÈœçg²¾ãH¦Îú ³^IÚú|¦ÌkøA•ð‡L{f&ÅI3uÖ,&Ýcáô5ÔÆš”ÛJ~~÷N}ƒß½t±UÓøé Ž|™ß½1‰>5˘9o#ÍþfÛʼ™ÒiôËüîw/q«˜>s ¯¬tô£ºõC¶Ó…{»‡š]êz ·ôHn¦wM…Ÿg^mÆÏzƒß¼<’ŽëgòÌ”•„I¢OŸ$vojj7±¾رžMa€6×бOo’—wºûÜÄ CûØTȦCtx …[;rǽi$œÎ»åú®ŠnÉgâô5žÊ¬ß¼ÌøÞ5,™2" ç1ã™)¬ <ÌÔß¼ÁË£;R<ý¦iX÷ÄD–Æî`ü¬7˜5¾µK&òÄŒ#uŠíX´üî;‹Y/=LÒ¦9×òT×Z’$I’Î\³C¢µjÕŠo¾ù†V­Ìs$Ij*¼&ŸUÜÃËS憠Ç$&}ú÷LÜtº%¹eô$†Þs/=B]¬\Èó;þgzÕª|Š÷ð›—FÒ#¸a*S+å™eMËÐgìXîì‚®34m)‹{ObÌí]I ‡ï˜Ãª­5Ä Ù¡šÒFObä-É@'FŽîÎ’ü-Ôp'!/¯tX¬¶–X ‰`àȲèGã¸{âú&âÌz/—šìݲyÛ{3õ÷OsK +]¦Vðè3‹Y¾“ÛnïMpéJ¶Fî%¸õCvt¼Þµëùp{”{[Y¹#Hï;ÓH`{c‰ ¤æ>¡.Cé˜Hᦷß"¼¦­ïøÿÙ»ûà(Ë<Ñûß•Ð-5ÅgºM ¸42cáˆÁ„ƒ¯ :€ÀNEÝÙ#3nP—”Ø#„R¼DDÇDÜn »}þ BDÈ/ü~ªR Ý÷}õᆴܿ$÷¯¯ë¦dt¶}É-Wh®êl¥3¥ð)d§Y„óÛ  ÖXÃÖädV•Ì99ãŠ(9RÆÆö8±ÝµlO xÕ"òÓOŽÕªd3UÖÑ\XN´«òJJ˜s2áMkcîâZ¶·å3#ÞóXç{#I’$Iýtւ͵×^Ë'Ÿ| 7Ü`I’tJ‚ö­$3 È:uu1•¬)ÐׂM0“üöîÞÂÆ]{ÙÕÜHãî8LîjW;h!§Ú’5%‹@÷‹ 42Â_]²  @Úè´S<@¤ívWï@¬ô P’tv«&£Å¬_²`o©aeõ7÷‹·4Óoaùùg¼æ@ò³ò‰RÉ«­1Òv¶šXÄÌöFjZ‰h%JAFºÍT öuŸ`”™¬¬o&vw;ê[ ç•I‚]}É-Wh® F ˜^ÊÊÇ%:y2SòóÉ›œM$˜àÀ®V’á…d¥žÎÙÙKÖ ©k%žC´[a%=:…pr -tl²˜r:áÌšBV`+;Ûäµ÷2Öl$I’$õÓY 6#FŒà½÷Þ;ù'Mj*)))ö”$IBÇNÊ/g{`"<˜ÏÌÂ9Ìܸ”²ø%zÿ@€@À[¤K½ fL!ƒ¶4ÇÈ¿»ëjj„Ñ]ÿìh‰'ôÍ“@Ú VWñµ C€P J~FœºÝ-4±0Ê„ö :ë›iIo&žµàdq¡ûšZ©}܇ Y3'@ÙZŽdSßšÆÌ’L quçªÔl–üæß˜³k;xµz)5•“)y¾„ŒdW[.°ÓãÜëXK’ô-8Ìæ+ØÌ#””Ïã¶Kú§FŒ7Jç±äåÓwÿ‹L_CmùTF82’®Pg­Ä¤¤¤póÍ7óÑG‹Å8~ü¸=%IW©P(Äw¿û];¢O‚„³Ã°£–Ä”“K¢£¥¡˜Ð·?)vײ5þë~·âä2B$ØOv}˜þdûÉÚWiMÜ}êõ–†’]Ÿõ–t‰Dò(ˆVSQYË®õKÈî¾Wl55Í 3§feêl¡3á½Ï°².Â’9¤Ó™ð`˜Êúzê;ÃÌÌH%”6´êzê·´žå›3ú¾Ojt&Ñdµ5Í´†g’—9°Ür%媎ÏPÛr7 ò™“Ïœ…sX3w1u»ã¬ÎÃöZù]9;Á®ÒŸR(a]~öš;æéêÀŽæÚd¥ÁÉ›“µÐÐ’`ÊÉI´¼JK29á ¡Pocíi$IºÚý…—–Í£âÍ$ð+,„ÚšKX´9¼™Ê7ǰö/1)ˆ½AÑìJ^><•ù#IW¦sNIII!ÛC’t•;xð ›~HŸ¼¼ê唕¦¸ ÍuTîNöy]±@Z˜P¼™W к½†Šq’ÑV:ÙDò ˜PSÁò•™/˜@ y#•[;íxéÒŸíÅܹ˩=’ϪUÑRÉÊ@úƒ¬^WÄÄΔ-^LÅ(XµðŒåv$]‘)~E“aw]%+——QSßJxá:Ö¯^@Vèl;eRPUÅÂp3Õ˳´b+ñÉ%TŽ;uï–`Æ&„€¬)'/ì3ÈÏB˜rŽÏKõ}ŸT&ÌŒ̜ܭÓÏÜr%åªÔ»‹X5/‹æêå,~j)e;™X\EѸ ¤fS¼®„‰u¬\üK«[‰UQ” ÁlV¬[Å ¶S±ø)Wî 0{5ë>5V&R´ Ä–ŠÅ,^YKk´ªUù]3šzkI’®J‰wذd/?GÙ¿Œ¤xÕ#\²Õ@ƒ“¨~}-9½n˜c±FÒéo¾üòË/íIúö:xð £Fºbãï½÷¸þúë2dÈ¥yölÙ`âƒÙ]ìX;—ÅÍ…üî™ü‹÷I2Iê£#Ï<ÎO xáŸgâ­T.±·”Ç–'Yõ»ò®åÔ$IºòíÛ·œœœ7x‡ Kðtl*Sù#Ûö' äü‚5?>̳/¡xMÿ–Dkjjê<‰7Xx5/Îç¹ÙÏ1S·ÇËØCk_¯éwÁ¦©©‰±cÇú"]…Nœ8Á'Ÿ|ÂÍ7ß|YÇ™âPI’Ôíl¬¨¡!¹šÂ¼0ÉæT¾'Z4Áb¤Á;®Ý;¨ÝÔN´h²ÅI’ta¥XlzšŠÛëØT}Û%že$ œñèHIº‚Y°‘$©?"3YµêÕK™[™$–ÅäÂ*ŠL'±w-Ë«›»nÊ} JV0%Ýn”tá%Ú7R±r;¼"Vå™h$IÒ…üEãìÅ€@Î?°æïo³P"I€I’ú)2e k§,ùæ ã–°öûGÒàŽ^Æÿ÷ïËìˆ ÕŸãJùýïíI’z+ÖÔ®íß2h’¤s³`#I’$I’$é,þÂæ% y66†ôÃÛØÖm9‹5’tá]cH’$I’$Iú†Äa¶½3’Òšç¨]óãS÷È»<Š5 ’É$‰äŽš¤+˜I’$I’$Igßòû²gü|æß¸ŒfÖìaÙŒeìIžñèˆIº‚Y°‘$I’$I’Ôƒ&–Ý7ƒÊà/¿XÃO‰ô¸I䑟1Þ¥Ú$]¼‡$I’$I’¤o N¢æ­·.³ F0µô%Þ*ux$]}œa#I’$I’$I’4È,ØH’$I’$I’$ 2 6’$I’$I’$IƒÌ‚$I’$I’$IÒ ³`#I’$I’$I’4È,ØH’$I’$I’$ ²” ßä ¿¾‹…¿ÿˆŽSϸ硉¬¹7Dp@m~Î+ϼÊÊw¿~äÖïS4k SoâhJ’$I’$I’¤÷­vc IDAT+Ò…/Ø|þ •Ûºk’¼¹íÏì™x9CÏ£í[¢ÔÌNàó/ˆíä¹úý,ûMM…£éxJ’$I’$I’¤+ÐE™a“<~–§ÄÂÒ­g<Ù¿™7PˆÛ#×Þ6c8cø€û^hãíØ(F¦: ’$I’$I’$éÊ“2¸oþ3o×>'ðÕÇŽ²aó^~} FÇñ·ggQ<3ƒÛ†œàðŸš)}¥=ñ/ OcÖÌ;(ÓUŠý•ÊšyéÐ1â×~‡{&þ-%÷ßÈ€[™õ?ßeÞ²{™ÕUúhçëÌh¼… 3q¬ùÿtY?É›õûx'úC6ß‚? róŸyéÐ1’¡ë™~ÿxŠïì*PO¬’$I’$IR?555$]¦R=‚ã_èóÆ'HB× ›Ä>îä¹W: ON*À16ÿº‘gS2)}j<éŸuòÛúfÔ åÅùRÛöS¸ùFN¿ƒš[¯á/¦¬îmîùÇ»˜”r”ò§›xù†[)y*ˆøûTon¢à³òâÌá}»÷ÎñOyvóAÆOKQt|~”ògvñZäo)_˜F°í +6ÿe¡Q>æøÀcæ7®$I’$I’úgìØ±v‚$]Æ.zÁ&2v EùßçžHó’Ü×Ä}+Ïx2ô}j~ah;ȳM£|Ùm]Eë3÷SšjÓ‹05ö))Ã)ºó{ä¤BN$ÄM?8F$b‡Zxù³4J nãþÔ“û®9~”ê²ç¡;ÉéS„_:é.Êï=YQ‰5ïçåãßeÍÜ‘'ãÉGùGÿɆŸW¬’$I’$I’$éêrQ/ÿgNšHÍÇxzSËÚ÷º}zöyqv³Yn‰R3s8!€Ï¿ ~´“çê÷Sô¯·ðÊìáÄÚŽÒñYŒ%ÿãÌ{å cÿgpÿ-£˜5¼‘eÿ´ÛÇ~©?ˆ0}l7 …ÃmŸ’žÉøn÷ÁqË÷ˆŸwâô±` gÔW‹³à/‡â$‡ßƘS3b†’óð]äýià±J’$I’$I’¤«ËE+Ø„ÆÞAõÄc”=ý6oïÃ×~—¸¿ç¥Ç¡·G®;½MÆp"¿ÏŒÆhc8¡ÏÐ-¬ýù(F~íÈ®!õ€4Šþûã'?äû>`Û¿6òtýwYõË;¹mǘ<þɯõæÒS†œþÿq`è5g?¦óˆõþT¿q%I’$I’$Iºš\s1 Ýz+Õyî¹>kHå?¿c@…ˆÔRà³$±Ï!5r¡øÑqí0nºáäWz¬•Šm£ãsøhÿ;”¿ö ©£"Ì{xÏ-û!?Nù_Jù£òvìtÛ½ûm)ßá¶P×Ç¿ qêx>çð¡c=D6„ô[‡Á_?`ÿç_=w‚¦ÿý·é(óˆU’$I’$I’$]].ü ›¡iÏÆk/¼Á¿í˦ÜÅüÈÁgLj‡`ƭ̱ƒ²ÿõ6<| 7}öÏýë!öGHd($ù”—·½OüÚñü$cûóZ<À=ÃSHŒbúµ”½ðÁéÒ¾Oeý'D&Mâö¡ÀµÃ¸)åS~ûêûÜö£ëá` ‡¾€áçmÄèÛ˜N#+^8LInÁRúöçŒê;\w±J’$I’$I’¤«ËE¸ú?„`ÛŸ©<ôEï›†ÒøÉÌñü"ð»Bבλüú@‚I?1ÿçaó^*ý>ñ”·ßy5\j-8fkrߦâ÷Ml;ÐõLŸ5‘âŒ!@¥‹²IÝügJk¿v9“r¨½¿k ¶a7R<ëû,«›…»RÈ›EéÌã½ÖCpÃÒ(Yt›÷±¬æÏ$¯MeúŒ‰ =X%I’$I’$IÒÕäo¾üòË/íIúö:xð £Fºbãï½÷¸þúë2Ä‚¶$I’$I’¾éĉ|òÉ'Ü|óÍ—uœ®¯%IR7ííív‚$I’$IÒe «Ž×‚$Ißâ_$I’$I’ty¸Æ.$I’$I’$I\l$I’$I’$I’™I’$I’$I’¤AfÁF’$I’$I’$iY°‘$I’$I’$Idl$I’$I’$I’™I’$I’$I’¤A–bH’$I’$IW¿}ûöÙ ½;v¬ iÐX°‘$I’$I’¾%rrr.›Xššš.»x$i0¹$š$I’$I’$IÒ ³`#I’$I’$I’4È,ØH’tµiÛÈ“¯á@®®ƒú'sÉÍíþõO,)§~°N®Žzžœöõm}Ù8Æ®ú:¶I `ß„ÖPÎÓry¨tßšÔc®•$I’tyI’®&±ÔWÖҒ̳/¤ 0±˜ª…Y’Iâ-4l¬¡ò©fŽT­cIvê%&‹gÏ$+Ô—;ÙYWËîÐ Ì ösßþê ±v+ñ¼U¬/Ì&h®•$I’¤±`#IÒU!Áµ?å©Mí'ÿ›fHB œAÖèÑ]EˆqdO™Ì¸es)«|‘™¿) óR“:Ž9‹Æ]ú}{•$ž –%’zµG˜k%I’$]<.‰&IR¿$8²¥œEN#77—i/aíÎŽÓ/·5°vÉã<”›Ë´GQ¾åÈéå:vžz-÷¡'XöÌN¾Ú3±·”G_KÖ5,z|¹¹ò䊈u{ëØ^6®x’G§å’›û(‹Êë»-Å$£ ŠçŸžu 3&é¢Igò‚ñO‘¢ªõ¬[]@xwe·×!˜!33“ŒpÈ’.¢`ÆÝdÐήöD¯çæ€s@²•ÚŠ:x°ÂÃ߈ãÜ9#“‚çŸg^8@´äwü~Ÿ¯/SÖ‡|D²…ÚÊ2¬æùçWñÛ©¨ÜAìQ¤3óŸ_ 0#@Vñïø?åÙûÔ~ÏÇf®•$I’ômä’h’$õGg+(…L!;ÈÊ œßN8±Æ¶&'³ªdw§ãŠ(9RÆÆö8±ÝµlO xÕ"òÓF³*ÙÌc•u4– D^I s²ƒÀ8¢imÌ]\Ëö¶|fÄë¨m@É ‹N¶Íh²JŽ0wñFvwäwµ)é’„$žL’8Ðó¹9y€9ãdRHš³šÒ9‘“ïÛqf çÎ_ío„ß[>ÊîÚ.cA1w§™,ˆ²©æäÓÛªg}kÿŒc3×J’$I’I’ú#-`Fx)+{”èäÉLÉÏ'or6‘`‚»ZI†’uêjf*ÙKÖ ©k%žC´ÛžôèÂÉ-´tv]›%‹)Y§?ÌšBV`+;Ûäµ7ÓoaùùgDæ@/"J—R2N’iñ–^ÎÍæ bÍ@&ôt“”sçŒsÕA:[zÎGÙ!€4¢Y§gg+ýœ_û=›¹V’$IÒ·‘I’ú#5›%¿ù7æìÚÁކ^­^JMådJž/!# }¾¨Ù»®–’]_i3X]U@FàëÛ„"‹t)%ZwÒJ˜üpZ{;7Ï#g¤‚Ëç~úõÞýo¿Çc3×J’t…übt˜Í+V°™G()ŸÇmÁKùæ1Þ(Ç’—ÛN=™¾†Úò©Œpd$]¡¼‡$IýбóÖÔ5ÊÎgÎ’Ržya3;¨Û'-; ­ ´t»Ùø®ÒÇy¼|/¡¬ í 4w[Ò¨£¹ö@Y§>dÞBÃéI´¼JK2ìpPV¡Î:C"‘“_iõTVo§3á¸H—0 °£v;ñŒ™¡×ss 9£o§õ¹sFOÒú”îB´o®•$éJð^Z6Š×ö³ÿµ_±`áÞ¹”?/o¦òÍ1¬ýÃ[¼õÖ[¼õ‡µŒiªæåÃŽŒ¤+—3l$Iꇭl­ÙJ¡„2!H?¥bi9Î$o ®z-“×:.ÒÅ’lo¡y/'ïYÓÞÊÎú6í3{Ý 2Æõ|n&˜3‚´÷!ºsç €Ô®˜;bãè¾’Wê„^òÑyÎйí›k%IºÌ%óÒ³M¤?2È›/Ó$÷üŠ+nâ•Ê©½Þónàïû…÷.áÍnO-¹ï®¯mòÚì»x€{Xûz5“ü.é bÁF’¤~H½»ˆUó*¨¬^Îâ$Ò¢äWQ4.dS¼®„ÊŠjV.®&Ê"¯¨Š¢ìT ›ëVª¨¦bñâ¡0f¯fÝ¢Ñáä§é)Z¢¾b1Õ!2&RUœßu¡5“‚ª*¨¨¤zùVâ4¢”PU8ÿþ.ždc%K¿ú_ˆŒèdŠÖ1sôWg^Ïçfp 9#Ö‡àzÌa&äE©«YÌâ¶õ<¿ Û~ÁžóÑy»í›k%IºŒ%ÞaÃ’<}8Ô‘³(Yõ+Om.ºà$ª__ËÂ{—ÐÔã†9k$]‘þæË/¿üÒn¤o¯ƒ2jÔ¨+6þ÷Þ{믿ž!C†\Ùóì-å±åIVý®œlÿ¨dΰß$IºöíÛGNNÎyü0í*ÖĦ2•?²m’@Î/XóãÃ<ûòŠ×ôï>6MMMý'ñFWÁævÖ¼8Ÿçf?ÇüMÝg,c9¬}½¦ß›¦¦&ÆŽë7Št:qâŸ|ò 7ß|óe§3l$I’$I’$õì,Å€dÓÓTÜ^ǦêÛ.ñŒÔ @€`àŒGGJÒì»@’$I’$IÒ9£XÈùÖüýmJ$ép†$I—à¸R~ÿ{ûA’9Ã~“$é2ÓK±¦vmÿ–A“$›I’$I’$Igñ6/Yȳ±1¤Þƶӵ‹5’t¸$š$I’$I’¤oJfÛ;#)­yŽÚ5?&ÒõôåQ¬IL&I$ÏxtÔ$]Á,ØH’$I’$I:»ø–Ý·=ãç3ÿöÀe4³fËf,cOòŒGGLÒÌ‚$I’$I’¤4±ì¾T1øÅšà~òH¤ÇM"üŒñ.Õ&é tIîa“hÛÇŒ§ÐA€ŸüâGE†ôkÿØþ?qÿ¯?$ÏÖÂï3¢Ï{~NÓÎwù˨LþîÆ!pìæÿÓŸ™ú‹1ÿÆ tp±Væ­9¬_NaÖ çÓб^°vûð^’$I’$IÒ™‚“¨yë­Ë,¨L-}‰·JIWŸ‹7Ãæã6Vü¿ ¬øÓQöïÿˆ’¼±?ÆÛÚͼê·ùc¬/ }ÎÛ‘hoåÍX‚HðÆ¿·°¹í‹‹×ƒ)×ñȤ[síù6tF¬¬ÝAêI’$I’$I’Ôgi†MœçžûO¶}lþ¶u{åȶÿ`A׿—=—Ê‹…#¹©§¦Žeó/Èœt+Á7±ù@‚¿»ó2šÓ8l8óî~å´+I’$I’$I’.;©`â‘ü<ûB×̘³º†{~é¹XÄÞ}—7‡¿Ÿ˜AêÁCT4vòÑ‘“Ë¢}Üʬÿù.ó–ÝˬԓÛ´óuf4Þ‹…i¼¼z¿> ¼ð*S÷ÿW>¹MÇ_[Yñ¿[ØÖž$4"LÑãO/ û+•/4óÒ¡cįý÷Lü[Jî¿ñäûkcþ?dÖÏFòfý>Þ‰þÍ“>aÞšƒÌúåùøOÜ·þÃ3Ž9Àñ#VD†kk¥bS lO’$…̱£(5ŠñÃâwŽ¥èÎa_{Çà¨ñ¼ò÷±õïcë?þˆ5ÙÝÈýÇÀçG©ü_Í4Ý0Šò§~HMÁ(FÚϲíÿEâ\±žê†¾ÄãÙú™—æ_fów´SVÿ!±^û%Û'Ž ðî»ì9öÕÀ|ÀæöaL¿ó;ÄÑ#¬x%Áô‡'RS0’ôwÿÌ‚º6>à›ÝȳŸ ø©IÔþl7j>õz¢m?…›? uÒÔ,Ì¡øÖ¿­{›7ŽyòI’$I’$I’ô• _°ù¼“•O7²òß?éšiòŠf"熡¤ÞÆüYK&_°gÛ.üÏÿ¤éós´ÕµZ$!DÆ|—t>á_%úËгæí÷gÞ˜#3¾Ïßÿ(>þ” v¨…—?K£¤à6îu9?Ëš™×Óñ§ƒì9ã¤Nº‹ò}ŸIߘ½2”ÔÔ #RƒÛZ¨Ø5”ŸÍ’3 …{òƳfÖH¦ŽNN4“ù£Sˆ}|¼ÇXés\02<óÇ„¸éÆïñ³üëáãÿêºwPÏýŒd0)å(›ß=ÙØGÍï²x˜Y‘¯Ž/…ésï`^t89ÑQ¬)¸…ÔC-lûmyö¯i”ÜÆÔŒë?f$%so!õ@Wa-ö))Ùuç÷Èɸ‘¿›y×ÉbUŠ'Ÿ$I’$I’$I_¹¬/›'ÚÞåÍãfuÍô`D„{®=ÂËÄ~!u@­9}ØÁ”ktý»£íS’Ã3ß­á·|Èñ÷y'9מÜ?gT ç·ˆµ±â…6"Mâï¿*z qÿÄ!¼}è}6:JÓ»ñæ¡ã0¶÷ˆû×× }í’¡×3ëÖk(jo~|‚éGÒñYŒ%ÿcëcÿgpÿ-£˜5¼‘eÿ´ÛÇ~©?ˆ0}l7 õä“$I’$I’$é+¾`3ôFÖüò‡¼Ý¼ŸeÛ:Iò)•›3rî÷s<ÆK›ÿÌ®áöéwP8f8·Ÿõâý ö¼ñI¾à·Oÿ¿íþÒ¡wi:aêYöJÿ¢‡ûæ)CHOr=ÖËþŸÇÙðÜÛ¼}Ëx6Ý:½´Y쯔>ÓĶ”áðð[˜~c÷Wÿ‹?¶`ê¨!]cÐÆþãA~rÃR¯½ŽPü¿è¸v“ºbK´¾Ã²R4w$‰CïðlÛþ(¼QæM?JùšÿàׇÜÿƒ g $I’$I’$I\´%ÑŽ±íµ‰÷¸Í¼ùÚû¾s#ÏòjâÝüy<À#ùßå¶î÷ŠžÅôЇ'—E›;Œ›R>å·¯¾Ïm?º¶Pqè ~zóT¾ öñ§|tlø× (g“zë(¦_ÛHÙ ïœ!ýèûTÖBdÒ¤“³€z)ŒÄö¿Í²7NðÈϲÏçľª¥ %Fè³£l;ð_¤ßr ‡ÿï~Êö'yKœŽÏO.v®XÏ7®³k÷÷ ά[¿`Ù¾cd>᦯m}œ—_øOÆÌÅøãGy®þ]b·ÞÁ#7B[™?beÿëmxønúìžû×CìþÈPHò)/o{ŸøµãùIÆ:öæµx€{†{I’$I’$I’¾r‘®šcÞülö?×BòÞqüäØ^ü>@æôRšz˜Š×àgóÏ^¬ìiüˆäðLæEÎXækèw˜uç0þåwiâ.Šg}Ÿeõo³pW ™c³(yœ¢×NÇ‘óƒëynÛ°àè$6Mï%ì¡i”.Ê&uóŸ)­9DüÚaäLÊ¡öþëè}.È ÿßèà8/ÿú5^îöʘY÷±áα”NüuoðÛ”aÜ~çÖ ¥ô…f–5¦±áÞ3bÍ»Pq}|¾ö^3¯#ÈPr&‡ fE‡ñ]2‚⼡lÞüü*žBæØ¿¥fÖW3ˆBÌÿùDؼ—Ê_¿O<%ÀíwÞAÍCà Á1ãX“û6¿obÛq„®gú¬‰g ñì“$I’$IºÄšššŒG’.Sóå—_~y±ß$ѶÙO¡?þÅXñbýåèð+¯1{ÿ­¼X˜qj†M¢u7÷ÿú *ÿñNr†ÚGÒÕèàÁƒŒ5êŠÿ½÷Þãúë¯gȶH’$I’$é›Nœ8Á'Ÿ|ÂÍ7ß|YÇyIÖ¥ FÆòÒª±~W\®ŽÅi:ô!ϾqŒÛg~ïŒåÐ$I’$I’$IÒÅæDDâèJëÚŒR9>h‡H’$I’$I’t‰]’%Ñ$I—/—D“$I’$IÒÕìJYí‡J’$I’$I’$ipY°‘$I’$I’$Idl$I’$I’$I’™I’$I’$I’¤A–bH’tZ{{» I’$I’t‡Ãߪãµ`#IÒ·øI’$I’$]\M’$I’$I’$iY°‘$I’$I’$Idl$I’$I’$I’™I’$I’$I’¤AfÁF’$I’$I’$iY°‘$I’$I’$Idl$I’$I’$I’YŠ] I’$I’$]ýöíÛg'ôbìØ±v‚¤AcÁF’¾åFe'H’$IÒ·DNNÎeKSSÓe$ &—D“$I’$I’$Idl$I’$I’$I’™I’®;yfÅ“<>-—Üiòdy=bv‹4ÀŠú'sÉÍíþõO,)§þ@bBªçÉiOPßÖ—c쪯cË‘Äö@h å<1-—‡Jw‘¸ê¿5̵’$I’. 6’$]ÚØ¸|9Z²(XµŽu« 7V²´¢¯#J˜X̺õëY¿nU«2‘T>õkw ™ÈâÁÙ3É õeãNvÖÕRß’À¾ýÕAcíVây«X_”MÐ\+I’$I’bH’t8²-aæ=¿‚™™ã(.ÞÅcËkÙÑ1…Óí"i á ²Fî*BŒ#{ÊdÆ-›KYå‹ÌüM™—2˜ÔqÌY4îÒïÛ«$ñd€´ì(‘Ts­$I’$ ”3l$Iê—G¶”³èÑiäææ2íñ%¬ÝÙqúå¶Ö.yœ‡rs™öè"Ê·9½ôËžÙÉW{&ö–òèãkiز†EO#7÷Qž\±ñëËìÄö²qÅ“<:-—ÜÜGYT^ÏW+3%’1ÂщL ŸÞ<5œAIâIGMºpÒ™¼ PëÛz?7œ3b¯²hÚ“lÙµ…Ò'â‰gŽ@Ç–SËšõœ3ŽP÷øOÙО¤¹ìa*ßK¢Û¾½å#b ,šö$wÖS¾èq¦åæòÐ¥§—WûšꟜKuk’–ŠÇ˜¶¢kI´Û?˱™k%I’$É‚$Iý‘8PÃòŠ„æ”Pµn5E:Ù´²‚1 ±—5‹W²=0‡’uëY½ LcÅb*vÆN¾öÔr^LæQTµžª¢‰Ä7-ç©5{O]dL¶o¢¬¦“üÂ*ªVÍ!­¹šÅ+_íºÐØFýò¥ÔÆ'RTµžu« ï®<õzpô"Ö>³Œq§Ö"б³n+í¡(Ñ4ÇMº‚w“A;»Ú½ž›ÎÉVj+êàÁB  #ŽsçŒL žžyáÑ’ßñûã¾¾LYòÉj+È\°šçŸ_Ål§¢rÇY–ýJgæ?¿@aF€¬âßñʳ ö©ýžÍ\+I’$éÛÈ%Ñ$IêÎV:Q ˜Bv:•A8¿pb5lMNfUÉîNÆQr¤Œíqb»kÙŸ@ñªEä§ŒfU²™Ç*ëh.,' @ˆ¼’ædqDÓÚ˜»¸–ímù̈×QÛ:’l›Ñd•aîâìîÈïj³Kì[*WR±=IÞª…Ý.,Jº !$‰'“$ô|nN`Î8™’„欦tNääûvœȹsÆW»@àá÷–²»¶ËXPLÁÝé@& ¢lª9@'ùô¶êYßÚ?ãØÌµ’$I’dÁF’¤þF ˜^ÊÊÇ%:y2SòóÉ›œM$˜àÀ®V’á…dºš™Jö’5dGêZI†çív±/=:…ÔÍ"Þ–IDATpr -]×fÉbJÖé+~Á¬)d¶²³=A^{3ñ–?œ{FDaÄ9u±c×3”­ÜÀn&0¯ª„EÙÞPAºà’q’H ˆ·ôrn0gkÒ˜0¡§içÎ窃t¶ôœ²CiD³B§^ÎVú9¿ö{:6s­$I’¤o# 6’$õGj6K~óoÌÙµƒ ¼Z½”šÊÉ”<_BFú|Q³w]-%»¾Òf°ºª€ŒÀ×· }õáûWWðÓ²„(áù¢|2ý´·tQ$ZwÒJ˜üpZ{;7Ï#g¤‚Ëç~1‰ôvlæZI’®_Œ³yÅ 6ó%åó¸í’þ\ŒñFé<–¼Üvê™Èô5Ô–Oe„##é å=l$Iꇎϰ¦®™Pv>s–”òÌ ë˜ØAÝî8iÙahm ¥ÛÍÆw•>Îãå{ eeho ¹Û’FÍ ´2È:õ!óNïL¢åUZ’id‡ƒ„²²u¶ÐЉœüJ묧²z; Ö@EE# ×óü / J1 °£v;ñŒ™¡×ss 9#ѧXÎ3z’Ö§|4p¢}s­$IW‚¿ðÒ²yT¼¶Ÿý¯ýŠ 7ðNâ¾ýáÍT¾9†µx‹·Þz‹·þ°–1MÕ¼|Ø‘‘tår†$Iý •­5[‰‡Š™ ÐÙ¸‘iL ‡HÏXHK)+GqÁ­uTl­Ê =Z@^h)eÏX˜OZûª+› Ï^OôÔ¿8[ËÊ]\@4ÙL]å‹Ä'”ð@&)  ã§T,-‡Â™„ã ÔUo eò:ÂAˆ5n¤1™Á¼p; íÝN#:aé^T”$ÙÞBó^NÞ³¦½•õ5lÚföºdŒëùÜL0giïCtçΩ]1wÄÆÑ}Á®Ô ½ä£óœ¡s!Ú7×J’t™Kæ¥g›Hd:‘7_¦ Hîù VÜÄ+•S{½çÝÀß÷ ï]›ݞZrß]_ÛäµÙwñ4÷°öõj&ùóYÒÄ‚$Iýzw«æUPY½œÅI¤EÉ+®¢h\Ȧx] •Õ¬\\M2”E^QEÙ©@6+Ö­"TQMÅâ ÄCa&Ì^ͺE£ ÂÉOÓ&R´ D}Åbª;CdL.¤ª8¿ëBk&UUPQIõò­ÄiD(¡ªpA ½µhgCÙÊ3"΢èwÿÌLÿH‘$ÙXÉÒÆ¯þ"#:™¢õEÌýÕIÕó¹hΈõ!¸sF˜ yQêj³¸m=Ï/è¶_°ç|tÞ.@ûæZI’.c‰wذdON'uä,JV=BÅÊ“E›‹.8‰ê×ײðÞ%4õ¸aŽÅIW¤¿ùòË/¿´$IWª÷Þ{믿ž!C†\Ùóì-å±åIVý®œlÿ¨dΰß$IºöíÛGNNÎyü0í*ÖĦ2•?²m’@Î/XóãÃ<ûòŠ×ôï>6MMMý'ñFWÁævÖ¼8Ÿçf?ÇüMÝg,c9¬}½¦ß›¦¦&ÆŽë7Št:qâŸ|ò 7ß|óe§3l$I’$I’$õì,Å€dÓÓTÜ^ǦêÛ¸´Ÿ‡Îxt¤$]Á®± $I’$I’$Ó9Š5œ`Íßßf¡D’.gØH’tŽ+å÷¿·$™3ì7I’.3½kj×öo4IÒ¹Y°‘$I’$I’taó’…<Cúáml;]«±X#IK¢I’$I’$Iú¦Äa¶½3’Òšç¨]óc"]O_ÅšÉd’DòŒGGMÒÌ‚$I’$I’¤³‹ïaÙ} Ù3~>óo\F3kö°lÆ2ö$ÏxtÄ$]Á,ØH’$I’$IêAËî›Aeðƒ_¬ Žá'DzÜ$òÈÏïRm’®@ÞÃF’$I’$IÒ7'QóÖ[—YP#˜Zúo•:<’®>ΰ‘$I’$I’$Idl$I’$I’$I’™I’$I’$I’¤AfÁF’$I’$I’$iY°‘$I’$I’$Idl$I’$I’$I’™I’$I’$I’¤AfÁF’$I’$I’$iY°‘$I’$I’$Id)v$I’$I’ôíÐÔÔd<’t™²`#I’$I’$} Œ;ÖN¤Ë˜K¢I’$I’$I’$ 2 6’$I’$I’$IƒÌ‚$I’$I’$IÒ ³`#I’$I’$I’4È,ØH’$I’$I’$ 2 6’$I’$I’$IƒÌ‚$I’$I’$IÒ K± $I:­½½ÝN$I’$Iº „ÃáoÕñZ°‘$é[ü‹€$I’$I’..‰&I’$I’$I’4È,ØH’$I’$I’$ 2 6’$I’$I’$IƒÌ‚$I’$I’$IÒ ³`#I’$I’$I’4È,ØH’$I’$I’$ 2 6’$I’$I’$Iƒ,Å.$I’$I’®~ûöí³z1vìX;AÒ ±`#I’$I’$}Käää\6±455]vñHÒ`rI4I’$I’$I’¤AfÁF’$I’$I’$iY°‘$é*‘h{•5‹gZn.¹=Á²gvÒa·HÔAý“¹äævÿzˆ'–”S 1H!Õóä´'¨oëËÆ1vÕ×±åHbû ´†rž˜–ËC¥»H\åßæZI’$I‹I’®‰#Ô.-c+yW­£ªpí–³òb]•¾%‹Y·~=ë×­£jÕB&²ƒÊ§žbí®Ø “ѳg’êËÆì¬«¥¾%9€}û«ƒÆÚ­ÄóV±¾(› ¹V’$I’$Å.$éÊ—hÝÈÖö(E둟EÑÎí,­ßMÇÌév‘4 pY£Gw!Æ‘=e2ã–Í¥¬òEfþ¦€ÌKLê8æ,wé÷íU’x2@Zv”Hª¹V’$I’Ê6’$õK‚#[ÊYôè4rss™öøÖîì¶N[k—<ÎC¹¹L{tå[Žœ^¨cç©×Î\F'±·”G_KÖ5,z|¹¹òäŠèþ!þØ^6®x’G§å’›û(‹Êë9½2Sˆh^>ÑnŸž¥ ™$é IP:“äjÝBc[_ÎÍæŒØ«,šö$[vm¡ô‰‡xâ™#бåÔ²f=çŒ#Ô=þS6´'i.{˜‡Ê÷’è¶ooùˆX‹¦=ÉÆõ”w-ýõÐ¥§—WûšꟜKuk’–ŠÇ˜¶¢kI´Û?˱™k%I’$É‚$Iý‘8PÃòŠ„æ”Pµn5E:Ù´²‚1 ±—5‹W²=0‡’uëY½ LcÅb*vÆN¾öÔr^LæQTµžª¢‰Ä7-ç©5{O]dL¶o¢¬¦“üÂ*ªVÍ!­¹šÅ+_íºÐØFýò¥ÔÆ'RTµžu« ï®<õzpô"ÊKçˆÑq`;µÛ;Éxp‡Mº ‚w“A;»Ú½ž›ÎÉVj+êàÁB  #ŽsçŒL žžyáÑ’ßñûã¾¾LYòÉj+È\°šçŸ_Ål§¢rß\.™ÿü…²ŠÇÿ)Ï&اö{>6s­$I’¤o#—D“$©?:[é D)|` Ùé@Váüvˆ5Ö°59™U%s¸;WDÉ‘26¶Ç‰í®ek|Å«¾ZFg4«’ÍʤÍ:½îW p¶ÒÏùµßÓ±™k%I’$}Y°‘$©?R³Yò›cήìhhàÕê¥ÔTN¦äù2’@ Ð狚½ëj)Ùõ•6ƒÕUd¾¾M(‰¶´$ÃŒËL%5’Ij$“¢À.v,­gwìAòS:éBI´î¤•0ùá ´ö|nÂyäŒ@€ô@p`9ã¼ÓO€@¿Þ»ÿí÷xlæZI’®_Œ³yÅ 6ó%åó¸-x)ß<Æ¥óXòrÛ©g"Ó×P[>•ŽŒ¤+”÷°‘$©:v>ÚºfBÙùÌYRÊ3/¬cF`u»ã¤e‡¡µ–n7ßUú8—ï%”•A ½ænKu47ÐÈ ëÔ‡Ì[h8½3‰–WiI¦‘ÊÊ"ÔÙBg(B$rò+­³žÊêít& sG‹—Öv»16$»f6éBfvÔn'žñ #ôzn4g$ú˹sFOÒú”îB´o®•$éJð^Z6Š×ö³ÿµ_±`áÞI\·?¼™Ê7ǰöoñÖ[oñÖÖ2¦©š—;2’®\ΰ‘$©´²µf+ñP1s¢:7²£3‰áé Éc)eeã(.˜@ µŽŠíq¢U¤G È -¥¢ì óIkßBue3áÙ뉞º¶gkY£‹ ˆ&›©«|‘ø„È„ dü”Š¥åP8“p¼ºê ´L^G8Á‰3ɨ®¦¢z4…fèl¤®²‘@Þj&ø‰oiÀ’í-4ïåä=kÚ[ÙY_æÝaf¯›A&À¸žÏÍäsFö>DwîœÚsGlÜ×–êJÐK>:Ï:¢}s­$I—¹Äa^z¶‰ôG¦yóeÚ€äž_±`ÅM¼R9•‹öc1ñ…÷.áÍnO-¹ï®¯mòÚì»x€{Xûz5“‚—¤+‡I’ú!õî"VÍ« ²z9‹“H‹’W\EѸ Mñº*+ªY¹¸šd(‹¼¢*вSlV¬[E¨¢šŠÅˆ‡ÂL˜½šu‹F„“Ÿ¦L¤hAˆúŠÅTw†È˜\HUq~×…ÖL ªª ¢’êÿ¿½ûòŒ8þKrÜ-áì` ´.$*Xn(ØêÔ!¤Ô¶C§Æ¥"h 5J³Ø,q0 %‚$Pìd)Ø"%S;ˆ·¥ˆ2HÛ¥‚(äîHrŒT4¹6þéïN?Ÿå%áž÷î ï}ó>7þSÜ+–cðÝ“qæø®(ED¼þQœ9õWLÎÎÆøå?£±e{ì=x2¾>þVxž\ãÚéøìÚƒ¯¶Äkƒïĉ 'â½7\ù·~m–žt͸û×rÍØ{ÆÅ™£qô ñÍá‡~®Ôz=zjÏà÷[k ÕoÆ·£‡ãÜâ¶xeÇqòÔPL~y?ÚǦZ­n~<õ_Ö‚Í<sÎÅÈ¥‡ŽÃc±•˜¾:³é`S­Vc``À^@+++qçÎèëëkëqºÃhmXѨž‹ÉÝãÒÙñÿþ?D)ŠÅb”Š) ƒu›`CÄšˆˆbåó˜út§Pð ¸ÃÚ@i×D\¹bk†y€6ó/±fvzsÛ °1ÁXÇïñÝè‘8·?¶-ÎÇü?­F¬xl‰<®¾ó7wÄÄÌ\ÌNŠÞµo·G¬©G£Ñˆzã‘£³t0ÁXß½…;p$öŒÄÈîbÝY³cÃc±ÐxäèŒL°Z¨ÆØá8]:–kJýññPoˇô}{lÕt Ÿa<®´/f®_o³A½û'~ˆëNðâq‡ @2Á ™`L°H&Ø$l’ 6É€d‚ @²‚)€—CµZ5€6%ØÀK```À$´1[¢$l’ 6É€d‚ @2Á ™`L°H&Ø$l’ 6É€d‚ @2Á ™`L°H&Ø$l’ 6É€d‚ @2Á ™`L°H&Ø$l’ 6É€d‚ @2Á ™`L°H&Ø$l’ 6É€d‚ @2Á ™`L°H&Ø$l’ 6É:^WW—I`CÝÝíŸC:Z±XŒZ­f"XW½^B¡Ðöãlèhår9jµZ,--Åêêª  ""VWWcii)jµZ”Ëå¶oW³Ùl:mt²ååå¸}ûv,//‹6DÄýmÐ …B”Ë厸ÃF°HfK4€d‚ @2Á ™`L°H&Ø$û!š»ì“IEND®B`‚glewlwyd-1.3.1/screenshots/g_5_resources.png000066400000000000000000001436701322667720100212050ustar00rootroot00000000000000‰PNG  IHDRjý€#› pHYs  šœtIMEá0v7åtEXtCommentCreated with GIMPW IDATxÚìÝLÛwžïû¿ìì„Än»Mqz:¦éÁí츷g`f ÞÑYèHq¤.tV!Ý«0ÒB5[2«²W!W7ÉÕN’3*9Ò¦Ú3It§°#¤-¹«‚´SØBwÏÜ)lS<ÝÖ4S;mìü¨IÀN÷~Øüþœχ©à/_¾ŸïÇ_©Ÿ—?ïOÊÈÈȈ°êRé€ä ¨H‚€$!¨H‚€$I§ `v¿ý,¬¿>õk]‰ êÖíÛt€y¥§¥iƒ9S»û»úÖV˜ǦŒŒŒŒÐe0Ýo? ëÕŸµ)Õ¸V)饤P¤ÀüFF†5ÒÈÍ!ýüÇ%s†5†n€™ŒŒH))t€%IIIwo+‚€$!¨H‚€$!¨H‚€$!¨H‚Àƒ-ݬ}ÿûv½ý\æ½Ò`¹ŸÛªR+Sü÷Åð£ ÷*Ó–~Ù©‚ ic¿¹¤š^u+Kå?Ø¢@ÛÇê¸ß®Ú¨üçŸ{ð‚Ά†÷8‚À½)ݬ=/?®XÛ¯UÐ3¨Ø¤×2Uô-‡Üß0ªîï~¯ö«tîN¬‹Ü£ŒÊ]s]­˜Ò$2ÛtøGϨ8{™oe²êõ¿(Ô{‡¶ëÜß|Wo[eIxÙ`ݬU/èýCÿUïV=¥b×3zwï“r¦/á|Ù[ôv}v˜â‡[ž+ÐûÕ[dQ–víýž*7¤Éõgÿ«Þó¬—pOcE àž»%)}£ŽþÍs*ʘá³M‡$i©+kÒ×k_õ³*½ò©þ}PaÓ#ªö<«·Ötë¥w®)–¾Qû~ôMåv^{ÿåqð<,ë€i盳1×uægÿ*ó änëÔîžàÇŠÀ} UæŒ9^[YShZü™M[ŸPéšË:ø–OíŸEäíùX{ÿñª¬ßz\®tɲͩb}¡ý¿ìW÷…kêîêÑÁ?Üžu©Ä|ç›×­ñÿ`šûcäð@ÖRÖŸXl&¯~©žøï¾T #KNSªlÎ,/}©¾‰å–|]_âù¸K‚À}`X‘›s¼ ªöDºîÍ«3¤§ÊÈM¾/±G àžfH—4tY{ëßÿ2ݪ“Ÿ•[ i~¯Î%†4áà€¢ÙËeêWpì–-Ë~óº|à ~:(m{X¹é_É{K’Òå|*KÒå%œO’IRFªŒ3øérlÍäFß§j÷¨¨ú†²TöLu÷ Î\Öl!a³Yy[ “ÿüJDýŸ}¦ö¡çtàe§¢íA…³Qí²èz_=·¤ØyŸÚþôYzùkü—«Ò–ǵokZÂ^2“ Ìs> *pÓ¤ò‘¯óªôø£ç»šÐ.¥É¼!K–5×b$ÜËRFFFFè˜î™×ÞR†ÙBGÜÅL[rtøe§ 6¤ýæ’jxÕ-³ÊðˆmÏÒ¤›µoïwä1O)Ðö¯zé_®KÙ›ôºg›ÊÏ”ypPÞßü»êÚC gؼEv:UbKUÀ÷‰Ž·éðóAUýLý3½ç<ç³¹\:úƒG”›ySþ>Ñ‘­:Zø•vž¸ °R•Wüœ ³ù·÷µóÈ’öÞÁê¸ ë÷o¼2ëë50 ‚,H¶U¥[‡Õý»ËcAKªœÿ­P§¶œWÉÉ‹ ‡hó5©tË‘©ò¢}Ï­—mA9ßxBûžKWïo.Ò`^ìQÀr\½ ½¿ÈRýŸ>§Ö¤)ùZÿôùÉ0¿%5¡ž6µ·wªÛÛ#_ ¬ðÀØ`3d²8är¹å.,Vi‘KVãBÎUÏáínÍmÕo«µÒqtïýz]‹è¾cz镦Ñå~¶]z»µFŽîãPŸWígÕÞݧ@8¨`xt<LÙì庋U\\¨|—UÆ•xÇžÃziwËD­È{éÞúÊ´óLP’d)KïÔæ®HŸÜ Ÿµ€÷¬š[»äíé•?Vü±d’Åá’˯âÒ2åšyò`ÅϬªóÓX´E5o£Ž>¡öþYRÀXLAŸºƒ>u·7é„l*¬®×¾J·¬ô5VX¨§YÇëÍ:caõûÂê÷yÕÞtD²ªz_­Ê ìË'¢ò5·O i$)ØÜ!eå ‡P÷šˆú:Úu¶µU]½~ã˜L²9]ryTé)’c…s’HO£ê뎫38Ûci@A_·‚¾nµ7—)o‡ö®U‰Ýȇ@Ò-pšˆºŽU¨¤êøì!ÍŒ‚êúžNÍ5鹊íp¶ÊóÒñ±ÕNí{§Qžy6OöÖK»[»÷‡Þ=9= yuúH½Ntg<‡­ðu®¯sE†t@íozã!‰­\ÕùKŸ6»÷hOÎY[’ljV_yíÜáJÄ«&ïD ä¬(»f¹ËÝ’w"©Q³¿Zusž,ª®ªïèµ±?q¿ñ¾NÌs|ÍwôZ÷èOy‡ÞÓéóèç´a§vž™z|Ú¿ýYíí,U¿Ýª¹r¨@×1ÕÕ5©w`†-n•¿¾OÕ%3¬” ûˆßåå.àžrZ¤ÑnLáÐ2’4à—?¢E„¿6וc,ë1;Íwèy¿}Ç^Ò+MaI&ŸjÓa—QŽzÕÔUÿXšJÝrõìVʼn±ûi*Ö©¶Ãó_W¨UÛj´œAùGÛÔ0Ãóg5¯£ÔmÕ=—U0‹omµèç?.ÑONýZW"_ëÖíÛt €y¥¥¥iƒ9S?Ý]¢omµÌyìÌño4¨öîødž¡pŠ–ñi££L5uuª««S]­G®%q;*kÊ^98ëd£$ ôžÕñª—TÕÐ3e£p³œ¥ ÑA_»fÛR$ÔסIÓßýíê™e/‹¨¯S=?9Uš7ß®b;ìEòLlÉáSsw`Þ>ö5·k¼w ùåÓÊ‹EûN«ò¥ªYCI v×î²Zµ‡W`D‡¼:¯s¥œJÏ2W¬ØU¼'¡W¸CÝÁ¹ÿ"âmN({æTya<í2»wL*ÖÙì»GÊŸÅäo¬ÔÎ×f i$)ìUÓþªjœ^Ò- ÆÃ3Yä´,ä=40~K|˜öøÞ@êÕ±ã‹ØïÆ(»»HEE£ÿÜvãzÞÌÖí1…:ê´{o<ܘÛEÙ&NÜ¥æ”e u7ib»C¾ÊÝæ¤_÷£”±°ÒÏŒ™WÔDz&M\;‹wÅ·£Cmuª<Øß§D&9ó ”çÌ“ÃìW¯·W]ݾ‰×{ÏìVeì”k]í·ºÊäTïèÄæ@:‚’Ë1õ¢êo÷MùOí¾¨JÜÆiÇú;V{ä”j!UV¯vyrt|lùˆ¯¹[!göUÑ^5uŒ÷ AùåîÉ+}BmÚ»û„z'f-y*,tËå°HÁ^u´·®˜èÔÁ½†eß÷h‡ü?ÙTä¶/ûœVW±rÔ;¶Ò(¨Ž¾ˆ*³¥y›ºã?æ•kÒ‚svLZTÓ*_­kEÊûÍÍ(SA¹ÊcA)PGKçX¨g’»´LN³$ƒM®Y”pG½vûÓèjŠJO‘\v³"¡>uµœQ‹7>©ß{¼^íŧU–pÝÆÜZ½ý~uüç\oÔ×&oÂ*œü%–Û2»Ui+*Ђb„Ul‡½È£œãcåÏ|Íêy&M¸OzËÞfuw²©H“f}Cj;x0ae‰Ay»t´Æ=)ø©¬Ý'oCjÎô*[þWíÃ}þxepªÀ¶ãÉâ’Û"õuYÐP´d–ò~¡.5%ì×”7m/³Ü‰IÍ@»š}µrÝù¤FVw…jÝ’¢^Îv*“$»vT×ο‡O°_1”¿¯QG=‰¥ÍÜ**©Pe[­*öæzÕ쨬dò³Àh\Ì5töXK|bßV¬"Ç/Üœ¯Új§v‡1_‹înÑA“SùÅÅ*.ÊW¾;WVcŸ7Ó ¨ûÈqÅb’rŠõzmµ<“ƒ¥â²Mjîl•¿Ö5û ²P§š'ºÀ¢âò)¡z¯€ûÅONýZ©ÆµJÍXCgX°””T¥×êöØsäŸÿÏÌzìŒño,ìOøöµE6K²/)ª¾¦ñ€ÀV®“§ê&O6Ž1:JTßxJå“ùaµœH,‹dS~Qü‚|í¾ée~½šÈݪ®¾ÐïÉJ>ofx¾ÆÆÎyú°*f7ìÅM|\Ã:럽ÕÎæxÙ3[©*Æ»æ:¸_„¯]Wj:ÿç `iR kt528÷13ý2I\a–yÕ«Í=ûì³ úWr¸oq“ØQŸššÇk±™T¼oÏÜe¥Œ.íÙWßÃÂÛ¢Þ‰Ä(GqÂän_»¦nñµk<ópîÙ£üñõ·Ë™Ú´võÿ`r«Ä±Ð‡öj¶c´üÙ8_s÷̰‘5MÌêNÿv¾¿µy¢=2ë@Í”²h“˜å®Þoó2ÄÇ£Ù2}b~IŒ2'6>ÓÌkBênšHF÷ì™é¢­n•'„ÍòÝõIS{öÌ}Sê¦-é’B^5T•éµ–x=E[éQ^ÎÆWcíË­8©Ö·iW±s–qS°·S-'êµW¶ë;Õk–7]¥çÍLL*­¯žV¢,þqM VÃêhÎÒïuÇ—Ó(ÇS¦É9M’¯€ûÄÈȈ”Âî4–&%%U·nßžó˜™ *&ÎXî‚+ vÈ;±Ì£@žÌ šÝ !_] ³FG©Ü㯠xÕ1éëQù;Æ#›òÝù*vŒ¿Ö§ö)ßnvõÄË ¹Jå\D¸¾ší°%|K¿·Y3-ª‰x›âû‡XŠå™4ëROÂÆE–âòù'h­n•çîÒ‡aÊОeâ>Ô­¦„U îòÙ‚ «Ü““5õÞåIMN©òç¬Óg”ѰŒû ©ët­Ê¶WéŒ7a‡”ÂC:Y_ •šß7ç–¨æp£:ÞG§ŽîÓ®Ò|9g[ÌëWwÓU½ô‚*ŽuÍX®ðófS±QiÏWÎBæ6¹ÊøôWe¸T슿ÖåM,é”w|vÓäRÃ.×D±õt$N™†äM/\¥®ÅM>¯f;&}K¿WÍÞ©SÔu5u+^%É3y_Œh¿º'6.2ÈYä\@©#³œKÞ„$θ¤+ÖÊ Ç˜"‰sÐFóŒ™d ³)^Zʯr×ìwØêöL*ÖÕÜ{W—?3äæêÎT5Œ*ÐÑ š—¶ëµ !ƒEù¯ŸRë±’…íã´XF»\EÕÔ7¨±íœÞ÷-½q Z;ò3\gL¾¦×´³¦YS+‹­øófªÜÍ·ðnR°lW‡†±ÙPö,¯\…ö»ï:Ì/}¦_¬4¾°&¨Þ@T%¹sÏÈÙ=z¿t¶Wc 6Wjçñþ%5r qÿßAmöà¢Ï G¥‰øÂ,w©SòŽNsöwö(Ra}5Ô§‰ ÄQ(§Q2¸Ý2é¬$»{ªqŒîËéU{Â7Ú‹]h5Û1ú-ýãc÷ ·É«PII|™P—š&6bÉQùÔoçÇ" O,аÈm_Ø ­ÙáI¾„=Ë(‹Ã"Ÿ!èS0*Ù—;A ¨7aX™rfê³É¥¥ëÔk/<»ðqÛÕ¬Þ¨[î»t2Ûl2­üI#=j®¯Ó‘ÎÉk@Ly;´¯¾v¥—ÏhÍUAY® Ê*U§ˆú:ZÕ|úMµôÆGã@÷Õ¾éVcM|Ÿž•ÞLf²Xæ_¨h/R…ó¸ŽøFŸÁ­UVÚg›îòüi{EÝ×`^3¯¨±¹ߊ>,¯/²€Se4ÎöÏ,…—º"ªh`ùk(¢ÑÉç°ºKãßXï‰ïíoŸø–zNñèÊ££X®ñI|˜¨¿#¾/LN©ò—°åÆj¶crù³%.ª u7i¢Â—³BEöi¨ø(0˼Ð9~ƒiÙ›Œ›öø„p¬G]ÁùŸ¼ ç±»lÓÛèP£oï1Сƻ¹üÙŠf&QºŽ©²d÷äÆV¨ê7ÞQÛéºU ifEÊ-ªPÝé6½} xÒ ›þ¦ÅoÓyÞLêvËBâ »ò=Îx[;˜mlòU^`]•çæâ¯À|f\Q#‹K.“Ô?öÅs_{¯"eEËØS"ª°?¼ôV&ÎïšòTè¶,úÇ”IE‹[©?,)Ö«Tî\ÉßÑ;¶’È"÷øFêf§ŠR·OR¬Gíþ¨ \F;¼+ElEK+ç´ší°É“s\£‹j¼jñFTRb–Rg|#å•N?‡Ñ˜pÿ£Š.t8[vù/³³HuWAu{Cªq,o#úHo»ü?Ù”ïš~¾@G³&­3°‚ ¦X,þßÝ^EÜ+·ËÝ)ª¾ÓUÚ}¢7¡,]ŽŠ÷ÕkŸÇµò×éSW—_IF³Cî‚ÜE¼‡Q޲:îÓÎcw7Ö«6_Tn—ñÎ=o–Àžï‘SGFÇ}³ºòاMC~åÌûEÝ%×`n35F§ÊÜí›ví>­ŽP‘Ê–:7õ«­w©ßî6Êl1I z ®>æ^þb£CÅù&5Ðøþ0µ¹Rïø>1§Š&VXG÷‡ñ% ¨Ç”\&õLì cR~‘íhÇäògÞ¯"%E2:6%w«|¦%9³LõðÂò‡V, /£ìÙøeç«4G¯œç;Ý$¿§FŽ%Ÿ0¤ŽÓñýxd)Rñ´nó«½9!¦qîÓ;ž„q!5Wl+Y%ź›Õ)PÁ²ÒŠ˜b‘»÷!hžҘܻtøP ¬wæý¢þfÕíoW†B|ïØ"ËËå(­”óÄÁ±ð/¬þpL£ÉÆzÞ,…½P瑱±Ô¯æî€<»¤€:&ƦIÅ•y3UwÑu˜SêÌ¿6*¯²4¡i“ñy} ¹¡Qº}+p¯ì*®Ì‹ÿlVC×ÒGA´çMèMèÓR¦mÁäïФœÆS¸ÀSV&”¬R¬[Í=˱a-gAÚå?­š#ñÆVzToŸ¼s!$-öø³)æWßRúÆ8eu”Áp‡Ÿ7KaUay|,ùš½ IR alZŠU>Ëgþî¹€; =KÅžoë½CÛuîЋzËóˆrÒç:~£ŽÖo×¹CÏ©xÍô—MÛÜzÿÐvû ë]³/¯e›Ko×o×{/o”Á´EoÕW;²%™6ë­úïjW6Ãà~‘:Û FW¥våÄž©Ó›}Kˆj¢}:}¸}Y«*ÌÎÂx¸àk—w!3Ž¡.«­QMMjjOk¦¦er%œ··§C=c?ÚòÝ“6çž´?Œ¯]½=íÇÜ¥r.ã«ê«Ú{‘<ñMqÔÜÕ“°rÄ ür÷,e¤,r¹âÓô7NÙ3cFAµw¬LÂ`-®QéÄÛ¨³îˆ:–2óíѱ½-šh•Á­êrÇ´Ãü­ÍŠï´âTyá“k¡Gñéõ˜º›zæœ$ÆæYmêSGðn||DÔqìÍxy¸¼}:Y_$ë~[‹KñŠ\ýjjö/~ø»'•¾ËKXv§ž7K÷ùåñ±äkVw(:©ì™­´bzÈx^ÀÊJ—ûÏéð·²Çæ23”û-—Nþ`£æßZ{£<[Ó§Ïõ­wY5ƒò_|D¦žßªâ/+vëkíº ßwÿ~”:ûKv•ÕíHXUÓ¯3¯T[`1§©ã`•Îô/³•ö•M¬æðêÄéùV÷DÕw戚:»ÕÝÝ­n¿Aæ™>eæ<•Ž/ÔˆyÕÔÔ=(ä*˜R kl˜éÇJÎRçòöáXÕvŒ–?;º/@ IDATOÑé‰*JEªpÏv£œeñ]ÿ›:1Ϫ–HGƒšV*`0ºU]›O³Úµ·ªaa“ÏâO¯U©%!;rîÙ§’iû°ûÕÚžÐð¼rå/&}°jÒ¢š±•K³öS`î‹´ŸQïÝøôuét÷ÄZíª÷,mŸ¦E§<ùñï5ÏÔ«Ñ]ÜséDBx<µôÝzÞ,…5_å‹ÉzÕÜíKVsä)s¬þs ÙÒשÜ5}âÂêÊQnúÜÞ”ó¹)Nú:•n–ÿÊí»è"ÓdN¿­ð§W’4tMMíýê%¨¹/¥Îõ¢Ù]«£å 3˜ávíßY©†ŽÀüeÐB^®Ú©½í+ÐL‡J÷ÄK_ϼ¦ƒ¡YŽxioBBWY<˲UîâñÐb@Þîñ|§ §-MÛf†cËÜË]C°ºí˜Tþ,蛘°6•+oމYcÞ.•M$wjß»WͳLGýÍÚ[×©Ø VkÙ.Nx„úΨª¢V=¡yÿ6ÒתúŠWtÜo‘Á½OGgXMõ7ëlbNãÉ_ä*‘©åϼjž’Ô-ñ ¡ÿÌiõÌòŠú›Uw|ñåãb«ððˆô¶Ä$“Söpzzó¯O%­Ø0˽§\ñ'S¯ŽW¾¦Æ¾…¤vy^Óþ„qàÜU>eUÊzÞ,íÙ¥71XuVÄCÛU}nÜ«nËÿáWŠlyD®„ògÛ¹o…ÔûMªò›jÍz•¿R wë·ëÜ¡tʳEÎtîö½$uî—rU7h_~Âäx¬Wgö¾¤<5:ÜØ&o_@¡HTRT‘P@}]­j¨¯TÑö*ðŽEÎ]:y´xËÎfg-®WõDºVûÞ—Ty¸UÞęވ_ 5ª¨j‰—­²•«¶xöiv{A‘¦í#ŸS$× K÷‡‰[¼¸ÕwC;&•?gQq¹sîå}Æ\í9pc^Ù¹Sµ mê DF ô©ãt*vÑè\¸ak:ZUtà¤ªÝ g vêøîí*©¬SCk—úüE¢Q)QÈß'oÛiÕW•é…WêlâÊ.ç.|Ã#û´ ŽÊßÜ/¦<•/áO/æM(fTNaBnQÍk§å MnG £A¯UQ¯$ƒe1ïVOðN׬Š*àõÇèÔ‘ªÝÚ½{1ÿªô¦oií4æîÑÑê„>ðêø+/¨¬æ˜Û¼ê „ÆÆAT¡€_}=]j;]¯Ê¢Tu&!øÊÙ¥ûª=o–4êóË5·„ãÁj^ùüû&ÝM×°bn}­¦¾ùêéWß­¹ÿ4üBÝ·6ÊcŸO•ó¹Ò¾oâo‡åûMH±-)oã—¤:\bTûÿûUý¯ð–m:õJBГ‘¥=ž­Òo?Ö±ßJé뵯úYyÒƒ:ò÷ï«êC2<«·^Z/ƒbj9Ñ©c—n«ïí_é;o]žã‹Ù™Ú±ë9íYÒ‘ÿù¾*OªÀÖÿ<ù½q×›?W3:äih”©n·ö·Ç§¯cýÝj9Þ­–yþÜä~]'ߨPn¬Mµ/½„“ѡʆòVT÷€$ÅÔÛrPU-5ĦVCž^?Z-×\郭Hù–3“Êa™\îñèþ0gÕðF–‚ü•ð«ÚŽÑògÇ'$¶byó×92ìSCyŸv7ÿmPgö«óÌLG”¿ï°loît]ËbÌUåoËrp·&ŒÇpo»Îô¶ëÌNarWëØÑÊ™ÇEÔ§æÎ„ƺ˵¤SÖByœGtd<ð6É)RÑXðf-¨Q©©JgÇfݼ'Tµý„ –9,RØß¯ðøýuV«aW‡ªöÏõé1ÈbÐØRš°Zv—Èë´KQ‹*äYñ¥1…}á$>ºŒÊ­<©SáÊ„±(»›t¼»ia§°ëèÉš™÷x¹SÏ›¥°ºUž'M¾ýn•Y“÷ÜH"Óf«œÁOÕðá#ª|z̺©¾?ÕÙ Y[¾Vû…9Òš[jýhX ÏeËðÙeÅÒ³TöTyùµ"ÏÅ‹/¨ë–[ž-éêüÃ-YžÚ¢Ü+AÕ]žåÄ7ÕþËß«é³aI×Ô3©w~ô„г/ªiH’Òéòj×àè5|ã •®¹¬ƒoù4Z”êcíMÏVÛ—ëŸ~'ï­…õ…aóVíyè²êŽúÔ=$Iüe–Ü?rÈmº¨)x…;.ua‡ÙUrø½st—Ü M Ní8ô¶ÚNŽmvmv©8g™­µ—©¡ñ¨v8§®Ñ˜a²ÑV¬'U‘;Ïl£Ñ©÷äó¹Š3¯,IÜfôã¤üÙŽ]¬UnǤòg’lrt³\µ§uêõÂy‚!›Š4êh©må7á2ÚUvø½óFµ m‹y‚ç©tß[j=Y©Ù¶â‰úšÕž˜Óì(ÐÒÖL)&¯š÷ô1»µïä>åOéÄX¸_>_<¤1¹«uêd¥œÆùǧ,±3Ôïó©¿ß¯È©ƒU8’ìÇ—Y®ÚF½óFõ´~œçᤜâ}:õöaÍ™u܉çÍÇ’»Ü=ù òw©ÀœÄç&@’¶<¥·k¾©Ú?ݦš­Ãòþ›_ÿvY±­¹ªýÓm:ü£ïißÖ¹¦½oÉ÷»¢[‘3]2XQ~úe NIFn]UËgÃr=—-“ *|.K¿ÐìÛ±GÔŒ‡8±àWòÝÌTþ†ñ¶Dåý4¾ Èb3ÉxõKõ$)á _*‘%ç"JS™mÙ²f>¤†ÿc»Îý×õ£Çd•1^z w½ETª3Ê^T£“E•òwµ«ùl«º¼~Ó}“MW¾ŠKËTZä’uÒ\Ÿ]ÅõGe Hf‡}Êä½Q®º6½_;þã“„ö"Õ5¾§ŠŽf5·¶«ÃëSp &É$KŽCN‡Sîb<%¹2/ðºòvíÓ.‹oô: »fûK«ò«_×®î b’ §ÊæœA_ÄuÝÑvÌôD3&܃•ϽÙÅÔ¿\ÇôNq:Î6ëlGüÁ°"Q£Ìv‡\îRyÊ‹å«+VûÎûª»Æ•›þ5Ê^P©c­å ôt¨£µ]íݽò‡Ã˜˜}6ÈdsÈåÎWQQ±Š‹æFW½:ÎÕ¯H ­žFóÌñ^¹5´ÊÛxB§Û{äó÷+< É`QŽ+_e;Ê'ÆqÔY©×_Œ~\†û#·ö”Þ°щ¦nùÂ㟠§¶Ã‘£æm½¿'>绳oUYã9•%ý6:Ú<òwu¨£½]íÞùƒ“C“MÎ\—òò UVZ$—u#qEž7FÙ‹«õºm4Ù2»ì‹þX ªµoW»ü£x9ËÜ2/æwÉu,Oºò‹‹±Úœ­¢ÿ2uÓ£<ßߤ†ÿyQ³-&‰¿7ýylé:½ía™/ü»z†$Ǥ£†Õ÷›ËÒË(ך)5¦æ¸¾ˆ¶7yÔÍa…o ¯|—dHŠ|®š¿ÿLþIYÓmE®2bhf9 <ª-ð¨v‘iu©Ä5۫ƹsŒ)Ç:Š*T[T±è6Ìx¶Ü2Õä.ð *TS°¨³/øºîl;& ´7jb§g…Š–PËhu©¤Ò¥’Êù4ÞÁ ]£ì®U¸JTqO~­rWÔË=Oãö"UTÌ®‚Êc*¨\™ñ¸´ã“Å,GA™* Ê”xùQiÆÞòŸ7fW™*\˹<—<5®{ÿ:–#=KE ©°c{HŽô‹ê­|Ø­«jù,U‡ž³*¼%]¾¶«3†:.¨'ýí)É–ãêçjÍõ¦fÙRÕùÙhc°m–3#¦¦+3‡3áà€¢ÙËeêWpìÍ-[–ýæuùQ®,Œ(b^'ËÐàXé{ɰũ£ÏGuì—ý¸Å°¹¤Ò ¨_Í ûz,dSrà^ÄŠ€ûI†,™ 8,3sžj$£«eŒßúϪ̎¨ù³YÒŒ¡«jþ,Uî§2üÍEçi[ÙËϨüë•·-G‡_yLæOûtv–pgà³ÏÔ>´Q^vªp‹Yy®'uôÙ t}¢žE„+± Ÿêô¥lÕÿo.•~c½Ü.§Ž¾ò¸œ‘« ÒÜ3Òé‚O´÷´š'ž*n•ç[éw¹›Š Jš/¬Œj¾í•.\PÏ͇Uü\Þ¡ÙŽº%ïo®INƒš?œ§i—tøW·äñä«Ö|SþΫªù¢Â³žú²þÝoñlSý—ypPÞ®sÚÝÑâ¶œ¾®3ÿÉó”j+óe¾UÏoÿ?UýÓ5Å0÷Œ”‘‘‘ºá~‘ß‘ÉbPÌשcuGÔ9ö„0¿¡ÖËÛïx@<óÚ[Ê0[舻„íOþD§v>¬Ù¿zUÇÛhïïWäýrŠ ÕìüTe'.̺¢Æ°åµíJÕÞÿûwò²Š3¸ ë÷o¼2ë묨y„:T·ó`|OšøcF•{iÜ‚¿û¶ÿnÞhM–Ü[7iOA¦zþñËyÊžËCPóÀ2©ð@ƒ*ô$2dçèÀmŠ}øïªí¡ˆî,‚šÑ¡ü<‹ü½aÅdRŽ»XÕ{äq±7 L»ø‘^ÚÿÑÂŽ½ð{½ðÑgX:‚šÙ¥šÓmª¡'¸«¤ÒÉAP$5IBP³HII‘FFèK222¬´´´9!¨€YXÖgévlް$ñ!m0gÎy A Ìâ§»¿«‘›CŽjdd˜° ##ãϛCúéîïÎylÊÈëö`6¿ý,¬Ÿœúµ®Duûöm:À¼ÒÒÒ´Áœ©Ÿîþ®¾µÕ2ç±5IBé3€$!¨H‚€$!¨H‚€$!¨H‚€$!¨H‚€$!¨H’ôÙ^h鿪óWuþ꽄ûÞ¶ì5Ú–©9Ùt`Õ¤ŒŒŒŒLýe÷ }>£wðÀyÌdÐa÷#t`UL+}Öì¿BHƒÖç15û¯Ð€U1-¨ñ†oÐ+x Qî°Z¦5¬¦Áƒîãk5€Õ‘J$A @’Ô$ A @’¤/÷ÏKþ—-úóµ’†tè×—t~$áå£öØõ|º¤¡«úÉ¿]QpÁçÎPéyT¶FÒÀ%ý¥w@×füÝ Ë0©¾à!=!IÖï?¼ Ÿ^^à§êÛ’£êuK¹ÞÅôÃêýýúõë´Ýš®Œá˜þÙ? àÈÊuõ<7÷‚tº`2«uÝXH#I©Úöè­½rC7ÈÞHÑÚëTöh†¤!ÿ|@ÁÛ÷¹¸7ÔLé÷£ÆI¿1l\§mi7äMZˆpK|Ôçé)º‹-aÑrÿÜ)I jÖoØ ÝŽ,m[—¡,ÝÖ¥«×Õúéý*2¼¤óeddªä‰l=ŸmݪëCQ}~5¢ø$¢ÿXhÈ’™¥íkGÿóRhHë­kdP¦¶oL•÷Òôv­]¿^{7ëéuº94$ïçWõÉÔ]RÖè/¿kS~ªtý«‹úÙU“~èX«ÈW¯«ÕwY(K»ŸÌ–{]†²nÝÔù‹—uò?n(4v‹¾ý”mr鲃vû½htõ+ÕŒzù±,m3¥K±¨¼Ÿ‡uê‹èØ* þ^’RÒõ´}ƒv<š©Ç֤ɠۺ:ÕŸ_QË¥˜n(Mßw?¦WMã²FõÝ­ ø.è¯/¦&¼ÿ—úñ§éúáSôôÐWªúý n¦dÈíØ ›×(Ç&iX×oDõÁ¯è—ÁèÜçÞZøýœÔ3´ƒÏ7à.·rAMjºþÓÆLe$æ©zhjp¡=¶Å¦Ã'®\IÓCÙëôê·Öj[o@ÿ#¼¸å+k×oTý7×Ëžð»¬5FmÛlÔÁMYúù¹/õ«Áù7@±m6ë!IRT-Ÿ^ÑÓÙ6å§KÛÍÔúK×'­FYÿÐ&ýíSYÊûÙ°fžwnÖ·ç8Ö¦ÍÚ¿)þ³={ªžÍÔ˩ʞ¸#ÚöèÃúëØõ×5¬Û¨úìtÆ6•ÿÄf­ýQ?½4[?¦êé'múëMé“îA¶i­¶?µVÛ>ýBõn)tõ†ú k•c¤a¾Ò‡CÃ’nê“þê›YÊI•44zžo?eSµ5mÒûe­ÍÔ‹ÎL=‘úGíÿâöç^âýœÖî~+¸¢fþ,oóü‡ͪ i®^üRõ¾ºfÈÔËOoÖöµéÊr£~õÁ%_hV“bÐŽ§Æ'õcú—Bj¹:¬‡6mÐ_>‘¥ìÔL½úd–¼¿˜»ìWŠA/nÎýﯿևƒQ….ßVþ¦4iÝ:=q]ÿ:ž›¤ej÷“c!ÍðÞýø²þe(]Ï?aÕöu©s¼Émûä’ZR•ÿøØ±©ÊŽ èç­Á¤>¹NvIöÍ™²^¸9¶ªf©é .é—oJ¦õÚãÌR¶RõÌc™Zi–kÎX«—ÇBšë_}¥CŸ êZºAßv>¬?ÏNUŽcƒ¶¾Ô‡ÿñ•. ?¢Ÿ>–!)¦_~øåh ¸”ÄÛž¥œ[Qý>Sèê-)Ó¤—ÇBšK¿Ò‰Ï‡t-Õ¨²¼‡õâ)çѵ²}qmŽs/ñ~Nm÷€U/}fÝhVޤÑU+7‘Ô/}×õýofÉž©ï›Rt~›©d¬5ëÛcËI.}þ•Þ¼4𦄾é¬[£ý›Ò¤uf=1Zæ9Ï'A]Óˆnüñ†®o2+KkôâÆ4ýë—£éQÆ:³žËc>ñ}¥_\º-)ª_ô¦(§à!m›íM¾ëÍ/uCRÐoÖö§3%Iç}aýêʰ¤›j±¯Sõ:I©iÊXHܸ¬ÿþ‡Ñ@'rY-féÕµ’Ò3´Vš%œŠ'-Yë²ôtömy/©­7 OÖ¦JQh¡AÙð ý÷ß|)ïDˆ5¨S½_*C# \TðvŠÖg¥(c<¿JMWFФ‘¸Ÿ·æh÷€• j†tè×—t>q>q‘Ñ_hýºñ’XF½Z°U¯N;QšìkRµÐ]ï3ÖŒ— »­ó¡I3÷êÿꦴ)MRºž0¤è_oÎVþ,E=š5vž!½{y4¥¸9‘÷–YϧKO<ºVÖ/# IZ¿6c¬ÔXLÝW›C:wCÚ¶væw‰ ÝžØ7åæDRq[—bñv-:gˆÅºjXײ˜äæ µ|uKµ)]Z“¥?{*K&éúA}ŠèÝϯ/´û¥Olôí˜>¼š¢ï=¶N¯:¬úO¦„²l+}?oÍÑ¢&¾½É°W£3# ,ªrUÊòÛ”bÔö‰=UÖ¨º`«ª§c2ëicD¿ŠÞ·ý¶¼çÿ¨²ôâæ,¹­keO—²Öf*ÿ±LåÛô·\Ò‡ YU3<<9\J[«ûa=›.I7uþâ5»:$ÙÖŸ¯»ƒ÷sj;¸¬rP3¢k·ÇVEÄÔÒ{QŒ‡)i²­MS†FtãÆmMÚ°~7‡bºª5ÊVš¶YÓ¥Èøt}ªžØ4^<ì¶>‰Ìz޵Ùëäž·'ŒÚnMׯ¾¸¥k7n)&ƒ 2(?;Mmc%Ñ”aÔ³kïþ›ž‘‘!›!Eº5¤Ö¾ý²OZ›™©ï9¬úóMéRºI%ëBúðÊâÏmÝ”=ÒÄô¿ùBg%)Mß{T«v?¸W¬úŠšPè†.=nÐCZ£—ŸÈRÿ'7J5è{·õª5MÔ‰.*´Àå7oDôAl¶¤‡Û¤=7F7Ÿ·[7ê/7­’ùúk}8ëùRõÄ£™¥ÌÞýè²>L\Ñ“š¡’§,z&U²Û³dýâšB_­‡×êÙTé ç&ýpøŠþ%–¦ç·Î¾?Í]dm¶U‡ŸZ#iXç?ýJÿÏŨB·n)8p[Ú”.é¶n K“7’I•Õ ipž“§¦L ­g6®‘7t[ÙÖú¡iê3Ÿ{Q÷3…0àÞ¶ú¥Ï¯éÍÀZí·ôÐæMúéæÄoëœ/¤SÃj$¦–®ééo®—]=ÿ¤]Ï'¾~kP?ÿxŽ=WÒÖ¨dãØê¯¯©õÒà”c‡t3´AÏlJ•ÖšõíÌk:;8¨_|rCO;×ʺFÛŸ²iû=tÓ¯]¾¢²éÅ5©Úöøf~|Ê__UË×£AÊÛ’2$ôçÏmÕó¾ ÚqŽs_Ô%ôRµí ›~úÄ”RS4¾.fÆs—y?¸‡¤®þ[ëüúÉG×ôû›º.I÷¸úµ~þÛ/ô³/o-úŒ7®]Öþ.ª54¤@lX’t}(ªóCªûà¢~58{™¬õ×é™±ÿþ$08ãž9ý“$eèÅÍ£1C(ø¥þêë:÷õMÅ$ÅbQurQ?¸îúí!:ÐÉ?ÞPìöصI×cQýþ_©îïë²k¡~ŠsKWoÍ]rìæõ+:Ô{Mç‡ÆîÃAýóÇø|,}K_«²ìÔ9Ͻœû À½$edddÒ¬÷;?£WðÀûEáV:pÇ¥ÒÉAP$5IBP$5IBP$Ó‚šÇ² ô hO®_C'VÅ´ Æm]K¯à¶-› °:¦5ÇVÕàõX–AÇ:°*RFFFFfz¡ÙEç¯éãkCôî{O®_£mÙki«jÖ wV*]5IBP$5IBP$5IBP$5IBP$5IBP$5I’~åÊz°hºyó&€ÿ·`6l˜õµ”‘‘‘º`õQú Ij’„  Ij’„  Ij’„  Ij’„  Ij’„  Ij’„  Ij’„  Ij’„  Ij’„  Ijàöé§ŸÒ @Ô$ A @’Ô$ A àÿgïþƒ£ª¼ÿ¿…Ð1Ït+&¨ICLaX‘( …ÑÈ(Š8ÆÑÇà” S‚U‚³«ø~K¨ï¦J°F JB ” ¬#q7ˆ#P,Œ ŒÙ8À!ð„$*1Ñn6tàûGä÷ò~U¥*·ï½çž{îM÷Íýô9WR1¨‘$I’$I’$Iê 5’$I’$I’$IÄ F’$I’$I’$©ƒÔH’$I’$I’$uƒI’$I’$I’¤bP#I’$I’$I’ÔA j$I’$I’$I’:ˆA$I’$I’$IR1¨‘$I’$I’$Iê 5’$I’$I’$IÄ F’$I’$I’$©ƒ$B7oblÙgTâÑÂ;˜Ð+ùŒ–‘$I’$I’$Iú!;÷=jöî⵲ϨÞì‰ònÙ§Tí=ƒe‰1óÕe ]ûΜxÍÇôŸ¸žåÍHI’$I’$I’tñIú>6Ù^Øòm¬ßµŸ@×n<7ìz[^’$I’$I’$]òÎ}š.]y©ð:r/.ñPA2sæW³~×~»™5i‡—y´ð&òºx0$I’$I’$IÒ¥å÷¨Ù˺[Ç䯮dÐ}½(LêBÆžm,ýÎrQÖ‘Ësƒ®$Ö²›Ê•fèßòXø¿¯&tÆÛÞGíÇ›™´<ÌÆØ~]S)v+ŹmϾiÞŲMÌß%Ò ÷m=?,‹ž]€æ0#~[CáÓÙ¬/ÿ”-½î¢lpʉ˓$I’›äSQ IDAT$I’$I:Kç6¨Ù»›¥[›‰ìifÑ€O÷?β±&æ¯ØNõÁé]_P»÷ê3îYW3¦ìK²ÝJé ØQñw&/¨¢ß?ÝAÿ”fÊæW0'©;“žÍ#mO‹Ê73rA–ŒÈ @Ënæ”Õ×÷&Š{¥œ¤ÿ bIzß~+¥Cº÷›Ð'.O’ôƒÔý!^(Ì%pŒY‰D„Hm˜ÚªÕ¬¯K«|Q“³y¯¤?ŽŠ)I’$I’¤3qÙœóR÷61áŸ+XÑr Ë&¥Súÿô!¿‹C’¾o555äää\ÒmÐ~è³à ¹,/É;Épfqjß›ÀˆÉkhýNBw^X\ƈlÏ'I’$I’$¾Nç¥Ô.©¼0,Œ“õ×IJaаž†4’¤‹H2ÙCÇ3¾÷Áé:VT5Ú,’$I’$I:#çí+™·÷á½Ûm`IÒQ7òu‡uDkcÄ醪‘$I’$IÒéJ² $I:}Б±ÌqCšx#•Kç³ð½ÕTV‡‰% –Avn?zr…ý3OðÄw°®l‹VTQ][G$`Ù¹ôò9žÜóÄÏÇi¬¢lþ<Þ[]Iu8F‚Öõsóû1´è9Ê?NÀÔ¸œ¢&R ti eE™Ç.?ºœ?ÈÆc-¯¤ø§£X“€ÞSþ“yƒC4V.äµésXQ#Я”ÿœ™Äöã;ÖQ6oK×TRI‚¹äJÑÓ…äw;Q[up[K’$I’$ƒI’N[œHUäÐTf^Ú±—Úñ“GMfEøÈב0Õëßåµõï2+ÿæNAÏc$ÑÊ™Œ3Ÿ‰£Ö…©Û¦nâÍy”ÒyÈ?Æú;–ObÔÄ¥µy±0×¼ËÆ5ï2çÞW(-Jvòùo³˧2râ "Ç›ÿÞFN^sÔü±ðFÖ,ÚÈšEóxhÚ\& èvÁµµ$I’$IÒ™2¨‘$étE×3E[œ¸—§uç¾q9Š&³&Ö:ì=ˆ¡òéᕬxoÕ1HTÎbøˆ( Ž¡gòQë· 2ú=Já€|²Ó R[ÉŠEïRêÞ¥xêÞ+éDohå$FN\z(ôÈÈÄ€{ûÑ;ecåzÖ­XO]"k&3bBˆ÷¦8¯½E¢ç3nQ[HìNnv&Ùý\«'P4y ­Í•FïAƒЯ7‰×-bÑš0f鸑¤-X̘öÕÁm-I’$I’t6 j$I:%qwÔRW¹”9³QÈàÑ™“èÿ»ö¬ž|08Òo|)%…í†Í\Ȉçždá¸Q¼V™€ºùŒ›3”Åc² ͵cÍ|Ö·½_ZLiQv»a»SX8˜Ibib«Qí¸ñ*fN8Ò¤1hÚJÚõB<´ˆââu”åÝ0ÄÖLbjå{”œÇ®"u‹<4e&ãg9Yt¯Mj iù¼´pEíºø .,âéåcxxâz„YôÚjž,L· ¡­%I’$I’ÎR'›@’¤V±#ùÉwpÇ1~ÂgÔäE­½+ºbüÜ…L8æ˜c+˜Ùvç?øÐô#ƒƒƒByM›Æ `ëd¸lÕñƒ3ãDªv´ýžKá ìï>[%”ψ§ï¥wn.¹¹i$â‡gE×Ïai[Wš´G§ñÊ1† #ÔŸâiO“Ѻ笘³ŽÆóܾù¯ÌeÒàïîKãê9¬hë “?~Ê!ÍAÝ¿ÂøÞ­¿'ª–R½0ÚZ’$I’$élÔH’t‚ÝÒH Ž9oÇú2êÈ pDþñ‡É åóôжá¿b•T¶{¾J t0.¨eéúÇ\=»h:ó.dá¼IÎbâT¯¨¤5ºèÎÓ#ò8Þãg’{>Ɉܶ‰ª¥í‹ó 0ˆç#0¢‘ʲmËÜËÓÇ •èF¿çžfн÷rï€Üýa:´­%I’$I’ΞCŸI’tP÷‡x¡0—cÆ/‰‘ÕTW®f}]‚Xå"ÆU3~q)…™íŒR»º5: Mn ‘ÆtUIÎÍ"@„ªH²“d²ÝKÚ¢w‰ ròà ]ñ(O>4˜þýóÉ>á°[ª¶´ã•ÖŸü´-Ûü~P†D-•aèŸ}žÚ6÷^r•Åì©mû={¹'Ø·nýÇPÒÿBjkI’$I’¤³gP#IR›`ÏBž,:~”VQªfŽbäüjHT2}ê:Ílÿpù8‘¶aÇH¬gâÜâÖD¢ hÛzr^13^ 3öµõD€ðúwymý»¼ÒrÉï×AC‡2 ?ûÈ^$ñ(;Ú†#-—´ï i¹i@ˆŽÆmÿ\ „º'‹i«o ;“ÓËE:¸­%I’$I’·>“$é´„È{n<µ=ï$Q½šÚ#† K=Ã!Äñö+&Ó³h&K–”2þÉ{Ém×3&©fýÒùLõ?<†y•GlÿÐ3T“Ç.Éɇ֋'Îk³[¼~f!Å»„1jät–o9¼ýxãVOÅÈùƒ{)~2ûÈð!AÞÁ6§2q^Õ½Hâµï1aø8ÖÄξ-“ó_`LïÖßckÆ1rBU;·V|Çj¦Çжmu1‚¼ä ¤­%I’$I’ÎÒe8`3HÒ¥©¦¦†œœœKº â[Jxxø»D€à ¹,/É;¥Þ;òðk­AG ß4–Ì@·#—à½â"&·O2AÒBÄ8<˜X€Þ/-¤´è¨ ¤q5Å„HK Fˆµ,ÐïÏJfûE£UÌ5’ùÕG® &ˆQfwž,Gqþw£‡ïâáÉ•‡_f›F<¼‘º¶ñÎrŸžBþЉ, C÷—–PVÔ®ñJŠ:Š5  *å?Kòß¶Ë™0|"+Ú£’FŒHû‘×z¿ÄâÒ£zÿtt[K’$I’${ÔH’t2û mô-ëÇ1qõÑcne2túbJ_¸÷Ðr$bDÚîƒx©tñwƒ€n(Y8'{Û½˜ isôR)K¦#8å1fîb^y´7Ávë·i¹ñÊ‚…Ç i2‡NcîøAmè±0Õ†4Ü;~sŸëIÚ¹hÐnƒ)YPÊ ÷f´ÛÝö!M€Ü‡¦#¤¹ÚZ’$I’$é,Ø£F’.aö¨ùžÄÙRYÉÆÚ0;23²ÉÎÎ¥wÏn§Ô{'¾c kkÙ‰ed’‘™M^^ö© ÁÝAUe%Uµ"@ZZ6=óóÉÏ<ż¢;¨ªª¢º6L4 -;ü~yd&Ÿ¯æÚBåúÔF¢$Bidgç’›Û“SªnG·µ$I’$IÒi2¨‘¤K˜A$I’$I’Ô±úL’$I’$I’$©ƒÔH’$I’$I’$uƒI’$I’$I’¤bP#I’$I’$I’ÔA j$I’$I’$I’:ˆA$I’$I’$IR1¨‘$I’$I’$Iê 5’$I’$I’$IÄ F’$I’$I’$©ƒÔH’$I’$I’$uƒI’$I’$I’¤bP#I’$I’$I’ÔAÎ_P³7ÆòÅë0qwLü?-þ‚Ú½'[)ÆÌW—1tyì;sâ5Óâz–7wLCÅë«ðÿ}LåÞSÚy*?ªá½¯öZáÑzŠ^ù²¯h˜¢W>dÞמœ’$I’$I’$ýЧ f/•åLÜð ­‘K ÕªUÞDô’hÖ8ëþ´²ðþS[<é ê=¹—{BJ’$I’$I’t)I:/¥î²°*ñ—#UµTK%¿‹ „”® îÚú{Ôæ¤ÓÑÒÒÂ×_ÍÞ½{Ù¿¿ "I’$I’$:uêD—.]¸êª«HJJº ëštq6ñ>j?Þ̤åa6ÆöèšJá°[)ÎMnݼ‹…e›˜¿5J¤%@ïÛz0~X=»ÍaFü¶†Â§³Y_þ)[zÝEÙààw¶ ×3uñ6V7´J¿†ç~rÔÍ¿ãn#ƼW×2ðöJTßÅòǺ’8T^‚It¿)‡I…9ä¥Ñ/(šVCáoî¡0é4öS’.q---444œœLr²ï’$I’$I:lß¾}444žž~A‡5ç§f]BåX³áÈ^5iyÙ䞃Þ4ñp5cʾ${Э”ÞЉgò‚*úýÓôOi¦l~s’º3éÙ<Òö4±¨|3#taɈ º´ìfNY y}o¢¸WÊw7ý’ ³7SuC.%¦×0µl'±¤kÚ8ñ6Füæn¢¿[Gåà{™wK2ìÝÅÔßo¦ò† äÁ®„ö4±°¬šq«º±äÁ+H>£ýôL’ššš¸üòËIJJ¢S§N\vÙe6Š$I’$I’8pà:µ>ý¥©©‰k®¹æ‚­ëy j¢áF¶däðBËÌ«Š#‰Ü¼Êø–uõ!geZÝM$©+Å·_K~ò3‚dÞÒLFÄÃ5Ìù*•’q=ÛÂŒ+È}b7•¥µTF3œ°ŸPÿ;(ùɱӎ«f}ÒuÌžC^ çVJ×0òãÖù'ÝFè`I5s¿ûò(¼ýºÖ4„ü­†Q_·œñ~J’ ‘H …èܹó¡^I’$I’$ 8t¿¨¹¹ù‚®ç9¿å¯ßÄc¥Ÿ^ɽ}»“I3U›«y­  †ÊgïeBNç3ÞFòõ9v­`ÜoWÑû¦kpKƒnJ%³ 4†wÙeì?/;j­ª÷@ë(gòsÇ)}áíÍ®ÿ²åIɽé mAMôdÛõr— ƒûv¦jû,ܾ‹ÊÏY¿½n:óý”$µºì²Ë i$I’$I’ô:u¢sçÎüsÏqP³—õ+ÚB€Ø7¬©øæ¨e¼»j'cr2£„ÐI¶ ’Jñ?þŒ'kv²úÓ/Yñ~³Ê¯aÊon'/¼ž¿Î!ûˆ½ëDè* HêLZRç³ÙÍoãhѯ˜4»’IÝxèö ìNáŸ+˜°ç$Û9Á~ùG&I€ÃI’$I’$é¸.†{Gçö+È{w³:| Ë…©Ý{¬Éd_áíMì8âõ}Tº‹Dð Ò’ ±z %k¾!”“Aу}˜7î.MÚÉüíqBWŒ}Käò2¯jýI‹Ö3õý0‘½§²ɸ!…Äg íê¸êO¿åàwNwÑíÛXºç:J_¸ƒ ÷^GÿŒ’÷ì'q’šœh?%I’$I’$IÒÅïœ÷¨‰ì9…Åö4=æŒ.ô{ðºÏÚÌÈyͼÐ7•̤¶ü­–YZèW؃¼.e7KW|Aìò<žÌêL¤º–5±ýº&‘œu#º­eòï«àÁëÉÜó%óÞßNu¯»Èè´œ¼z™·ä¿¢Š1 ~ĤûR |VËÔÇ*'Ýb?ѯwÓØÜ•P0…àž]¬Øú-i×w¢öoÕLþ´…Äõ1"{SÉþ˜‘e;?§æ;Ü[Øé·§Øú’ÔÁjjjÈÉɹhëÿùçŸså•WÒ¹³¶$I’$I’¾kß¾}|óÍ7üøÇ?¾`ëxÎÇÐʼýv–ßîÁ—$I’$I’$I:™N6$I’$I’$IRÇ0¨‘$I’$I’$Iê 5’$I’$I’$IÄ F’$I’$I’$©ƒÔH’$I’$I’$uƒI’$I’$I’¤bP#I’$I’$I’ÔA j$I’$I’$I’:ˆA$I’$I’$IRI² $I:¬¥¥…;wÒÜÜL"‘øÞ·HIIášk®!)ÉiI’$I’¤:ïI’Ô¦¥¥…šš233ÉÊÊ"|ïuH$466RSSCNNŽa$I’$IÒœw$Ij³sçN233¹æšk:¬@€ÌÌÌ#ê#I’$I’¤.ŸQ#IR›X,FZZÚQ—nݺÑÜÜìA‘$I’$Iú3¨‘$©Í¾}ûèܹóQ—@ Ð!ÏÈ‘$I’$IÒ÷Ë F’$I’$I’$©ƒÔH’$I’$I’$uƒI’$I’$I’¤bP#I’$I’$I’ÔA j$I’$I’$I’:ˆA$I’$I’$IR1¨‘$é\‰WQ2øî¸ãî\BUÜ&‘$I’$IÒ‰ÔH’tÎD©‹´ý©#jƒH’$I’$é$ j$I’$I’$I’:ˆA$I’$I’$IRI² $I:Cñ*JÉ»‘cͬdìOî8<™ö(s—L /Ùf“$I’$IÒaö¨‘$錵{&ÍÉøÌI’$I’$ƒA$Ig,D÷´S\4­;!L’$I’$IGqè3I’ÎTr–ÿ7NÇ×1ê'c© Ÿ.¥¿CI’$I’$éìQ#I’$I’$I’ÔA j$I’$I’$I’:ˆA$IçL»gÖøLI’$I’$‚óúŒšøWaf•WS¶½™It¿ñ:ž{0—ÁWw>ýšw±°üSʶG©‹í'ØõJú÷¿‰ñ?éÚz#,¦hÚ6ýæF$ÕS4­ŽÂßÜCáUg»{©üè3vätgè™Ô[’té8ú™5’$I’$IÒIœ·5ñ¯jõ»¿²h{3 Z¨ÛZÇÄßU°ð«}§WØ×_0fÚ_x-œÂ€Á·2ãé[Ó«3•ü #–Küèå“®à¡þד{ù9ÙÖýieáýž-’$I’$I’$éœ:O=jâ¬.ÿ;9ï^ûý_(k‰RGˆG ï`B¯ä”µ—Õå›Xß5—£sèÙ¥íåÜ úuû3/ù;« ú2¸ý*)])ÜÕ£+I’$I’$I’.hç'¨Ù»›Ÿ`~,JQÞ-û”¡7ö!¯Ëq–62o+Üûôõ‡Cš6™·ä1¥%J·–£×ù‚¢i5‡‡>kÞŲMÌß%Ò ÷m=?,«µ¼æ/ñÛm ~=Õ«¶³â³fÝÒ)~*¡W73ïÕµÌß¼½’Õw±ü±á73iy˜±ýº¦R8ìVŠs“=›$I’$I’$IÒi9CŸí£¶ªžÊ–S]þÄÏ}‰ý%µüˆÇHrR®`ðO®#ÿ„Okn¦l~sötcü³ý™ût™Û73rA˜Æƒ‹´D™S¾“ìûòYü›ÛJ“Ëw%ȈßÜÍÓ];Ñû‰Ÿ²ú±®®fLÙ—„úßJé¨|ÆßgÑ‚*Ö5{2I’$I’$I’¤Ós΃šÆ7PTÖ@ìTWØó%SËÃÔî=Þübt!í Ÿ7×0ç«TJ†÷d@ÖäåfóÊ×ÚZKeôðrÙ÷ç1"7HæÕ×òôýWÂ×ßèrTSEwIêJáí×’Ÿu5C‡ÝAéð²“<™$I’$I’$IÒé9·ñÂÞo™¿¼‘Äi­ÔBõ†¿2‚dÞ{,•ïtŽIJ"Èn"{h𴯝šIƒd§ôhx‘=QÆþ󲣿¤P½äenŠä$§¼äës(ìZÁ¸ß®¢÷M×2à– Ý”JfO&I’$I’$I’tzÎq?8Õ±3[3VUKõ°Tò <’¯¾šLv²:¼—¡¡£f6ïdâïþJü‰û™wÃq Þ ¯gƯîõÒ‰ÐU@3Ô™@RçS«hJ*Åÿø3ž¬ÙÉêO¿dÅûÌ*¿†)¿¹Á!O(I’$I’$I’têÎñÐgÉäv=Ç5 uãé`Íû5T5<ÚŽ¿ÕRIˆ¡×¿;K(ã ‚±o‰\žBæU­?iÑz¦¾&²÷ô«ÓX½…’5ßÊÉ èÁ>Ìw&ídþö¸g“$]ä:wî̾}û.ˆº$ €E’$I’$éîÜ5]®àéÁÝ8“ÛJiyÙä3oIfpáÍäïÚÎÈß}Ì̬«³°¼‚‘K¾!£]uür“³n`D·o˜üû*Þ«ÞEåß¶0nÁvªC]É8ÅáÊBì'úõn›!™Ý,]ñ S?úŠªp«×Õ°& ·«©‘¤‹]0äË/¿¼ êÒØØHJJŠE’$I’$é Ýn¹…üIïÆÆØ©U!÷¶›(vŒçÓtÕu”ŽKa^ù§”­ø+ó÷@°ë• xø.Šï¼‚ä–dįûBÙ&¦Ïÿ‚XR€Þ·ßJé®'Yï òo¹’y+þÂÈ]ýY<ìf¦T1õ•¬h@ðJöe|VgÏ&IºÈ]sÍ5ÔÔÔpÙe—‘––Ö!=Z‰‘H„;w’““ãA‘$I’$Iú»ìÀlIº4ÕÔÔ\ÔaÀçŸΕW^IçÎç.,oiiaçÎ477“H$¾÷} ¤¤¤pÍ5×”doMI’$I’¤³±oß>¾ùæ~üã_°uô$Ií?“’ÈÌÌ´!$I’$I’ô½èdH’$I’$I’$u ƒI’$I’$I’¤bP#I’$I’$I’ÔA j$I’$I’$I’:ˆA$I’$I’$IR1¨‘$I’$I’$Iê 5’$I’$I’$IÄ F’$I’$I’$©ƒÔH’$I’$I’$uƒI’$I’$I’¤bP#I’$I’$I’ÔA j$I:U‘•WåHúÁ¼ïMX@AÁãÌ®;Áuwš IDATëñ­L{äè÷ÇÖŸeö†¶ÏÜðž*(  `,ù#é¼\mà’Ñ<>d`ë{Ð#O1zÒ;lŠÚ4’¤óË F’¤3°yæL6ø›ÎT0•ÔÔT‚Ähªÿ„eÓŸçåòpÇÕ'$=+•ô¬T§ºÎ¡€ò)„Ï¢I:ÆûcjjëûH¢á¾<üÌ•t¾Å71ãù™¹l3 1HMO'ÐTÏæU3yþ‰I¾I’Ϋ$›@’¤3[Åô%#ù×áÝm ¦T{ýmÆÞ˜ DÙºàež-ÝÌæ™3ùè¾î u@•B÷Pò¯÷\8åHºDyàÕ·™psrëdäCÆ=1‘ŠDåÛâÜ™n I:â›°¤HŒ7ÞËÍÉ@t³Ÿž…õ«(];†;žfCI’Î {ÔH’t‚@ýÜ™¬Œ{~øÃÙŒ{jȡ᭞7›.[7›Ç (x|å3ÆòÈÀ>2ši†©û`Ï i]ç™’•„Û†v‰‡W2mìã )( `à#Œ.)g«Ã¾ü„¸ñ±bN”oŽŸÒñŽ|ÔîüøÏLXÀ†öçbd &<Ã#Û{½:è‘i|øÁ4F?þ3þ{ÉC–Å·Îà‘‚ žšAù´Ñmçè3L*ßJk5êXð«gYÜPOéC(Ù?öÐgÑ­”—Œæñ! ä‘g&°à£v•mWŸ•ïLâ™GžÿPç9.]ÚÒ²¸- A"asH:¿± €@ÁC—j73ü•)Œ?ž‘='¿Î:…kŸ“_gÚõÿI¯%IƒI’N[†ê‰ fÎÝÄwî%×½Ãĉ ©¨OÞ£=ÒcÔW,äå‰pÄÿN ‹™¾¤ž@M›Y2ñ ~5u-MÁ cÛ²ÉL]…ÈJ&þj2K>‰‘Úçnú¦Çؼl:ϾXN؃qñKNçž,€õÛN~¼Ãå¼üòB*ê!«Oz¥ÆØ¶¶”'¾Ó:?¾‰iϾHéÚmÄÒ{Ñ+=Ñzþ½8ûÈp¯i“§.asCìøu«_Ìôe1²úô"Ø´UÓŸåå• »ÇŒ¢O ÈÝcÆóˬäï®ßÊìçŸeú²Í4Ѓ^½RiÚ¶–Ò—Ť£ÇiZÂä™Ä¶ó*S—y†K—²èÖµ¬lèÅý=’mIçU¨Çýô¨/åW?{„Ѧ1»|%Û}øùÏÎ=7†N~u:×>ǽÎâì¯%IƒI’Î@ú}c(J‡¦%Ó[‡Hh'ÚTG°Wî.~“·þe6ÿòú(²ê7ÐÐþFy /¯¼ýüáßßhíQôÿ6ÿñ‡çÍ¢Öñ]ê75°uÙ\*^ô*¯OÏ+¯¿Êc©Àæ”×y,.~©­ßÐŒE'=ÞñúÙþ0ůÌ`ö[oRü@_ú¦FhŠC´b.Kš€cxë_g3ûoQÜhXÆ;ÛŽŒû¿Á¿¿ÿ6£nèrœºe1êÍ7™1m6o½z7Aà“ÒeÔ‘L÷¾}éHåæ»ïáÆc Ùýd.‹ëÔ‡yãßÿ…Ù³ÿÀÛÅ=€«JW\Òƒ1oÿ‘?üáÿðÖ¨,¶}Ø€j¤KIŒeÏÿ¬­7j>[Ê6²xxÊmHÒy—1Œ)¯á¾A ‰Ík—°púd^üÕƒãî_ÒcúT¶Õo >>ŒC÷^SûЧ-°Lï‘ Ô“À±Ž¤KN0•ÔˆÑK lÞÔDüž4ü´“t¾¥ÝöK&ýË/™°uó'|²òÊ—UP_¿Œ©SïaF_gÕÍ>ùµO¯“^g=gy=(IºøÔH’t†BwŽbTUL¯XȪv¯G7”ð«—ÑÈâQüË ¦.¦þŒ¶²÷Ðo=FMaTöwǤöò?±‹^¼¡íñY=RᣓïÐý”ü{/6,+§|å*Ö~ò Ë~²%+yå­WÈ:Õl#ääYK‚DZïŽ&Ú½z.ÂH—‚@H$ˆ~3i›nû,=bé ¼ú6nNnû<Ư^\¶%ï°män¶9%G‘ å,Û#Øë†Ý–Æ·ÝÏ·ÝÏÃ÷Oâ/®"Vÿ7³ÎåµÏñ®³‡®ÑÎìz°„ûí…(I‡>“$éŒeð@ñäõWýkiáuJÆ羬Mg¼ÿŵ½Z‡A‹E³èsçÜyg‰mòáGÛˆy.rq¶.™Þ:„F /Ãz¥‘~’ã^9ƒISç²9k8“füÿóþ<–Ä>áÃH¿­uý†µ´ŽŒ¦|ô@ gÚÖÓ £a-´ —Yû›²î$+tÔM‡ãd.©·õ 4­ú€ƒ£®…×¾Ó:TGÖ¤›3J?lÉéÜœ ÐÄÚw>ië¼§îàû Yd¥õPÖ­Ÿ±±?ï$MPZZÊôÉs9ü8™8 Ûê[߃‚9dŸä:ë´®}Ž{:ËëAÇ>“¤‹‘=j$I: É7¤¸ï2&V¼S Ø=ˆ±mú³<³2•¦OÎ.PÉ6œ^ §³yá³<¿­/©MŸP±-F O1ÃCƒ‹ð.‹_|‚UH45:7zÃ!à$Ç;l bÕZV­ZË}z‘ž¨§¢ôâžôdBY#y ø"Ëêgòìã+éÁ667$ ë>~™•Ì饆 ,~þ¬Í ÐTßD‚}G=@w€äiA ©wfÎ «x,÷ÕE'Ôg$¥¯eaÃbžâú¤ÇødsÊch2DÒWŒ¹¹/¯¢iÙËübY€@»A ³ŠFÑ7'Õá8’t¾¤Ý=†Ç²žgqý^~péY©$êi¡6•‡ÇÜMVô^g…²N~í?•묳¼”$]|ìQ#IÒÙýKÇ=cFÒ~„îgLßt4Q_àîâ1ô ±OXYßpËÆ«os_ õk©¨Òçáñ¼ñê0ot_¬bM455#HjV(~ƒW™qJÇ;tç+¼>þaú¤Cý'Tln"µÇ}Œyý•Öa.B·1á­W)ê›E i3›dõÅ«¯>ýÇe1¾¨44‘HíÁ}Åo0垃cit羑÷‘€¦Š 6ÄŽqn'ßÈè7ߤø^¤'¶ñÉæ&R{ÜͨWßdÂmÞD.¡;'ñöÅ<Ð'‹Ô@ë€>©Y}yì•·xsô'~îL0‹ôÀ6>¨ˆØ˜’ίä›ûÆŒ¸Y© êëi"HzŸ(~ýMÆÝ:ùuÖé\ûœè:ël¯%IË8pÀf¤KSMM 999mý?ÿüs®¼òJ:wîìÁ”ΡøÖ<ñìbš²Æðö¿þÒ@P’$Éë,IºhíÛ·o¾ù†ÿøÇlíQ#I’$I’$I’ÔA j$I’$I’$I’:ˆCŸIÒ%Ì¡Ï$I’$I’ôCæÐg’$I’$I’$I:.ƒI’$I’$I’¤bP#I’$I’$I’ÔA j$I’$I’$I’:ˆA$I’$I’$IRI:÷EƘ7s-³Ž1+=—ÅcrÈ>Þª{›Y·îSf­k¤:¶.O¡÷Ýó`6ù!–$I’$I’$Iúa¹€zÔì£ê뻪™Þ÷ÝÆÜ°;™á¿3ê÷[ز׃%I’$I’$I’~XÎCPdÄè|òéD¿þÝz=•£OÔ›ææ}œ wØL¸ójò2º’ß+›’½ÈmüŒùá}-I’$I’$I’ôƒ’tþŠîD ؉8Å5@<º—8É$|ñª Jž ¿ºsëô×_2½ìï¼·½™DðJ ÎcüíÁÖå£_1ýíͼ·½™Øå?¢_ßà•ÁWÓ ˆ×ÂÃo'3þþýÌ[ùw%‘{S¯fÓ3¥m[Í»XX¶‰ù[£DZô¾­ã‡eѳ À>j?Þ̤åa6ÆöèšJá°[)ÎMö,’$I’$I’$Ig$é‚©I—#n0jÅZÿ-Ÿ\Ç SéêBvNjë2{wQ2{k2þ’Q©$‡k˜Pö&ï¥ä†Ý”̪déU7ðʳt‹}Á̲J†ï¹‹%úßUÇ„å×𰾌¡‰yågä‚d–ü:ƒn4S6¿‚9IÝ™ôli{šXT¾™‘ º°dD¡p5cʾ${Э”ÞЉgò‚*úýÓôOñD’¤‚††A’$I’$éžž~Éìëy jö“سÿ”{Ó@ò‡ÝÂ?cQE˜¥e•Ì]Syhp/Šo ’ØZÍÒ–k˜öDvk8’u3%eá×-DÙÆÒ=©¼2¼'ƒCW0­e”×°qÈíônÛÝAOÜJQNg +½ƒÍ<\º_gP¸§†9_¥R2®g[ðr¹O즲´–Êh¢»‰$u¥øökÉA~FÌ[šÉHòF’$I’$I’$™s3ÄõŒ›÷w*þÔØnNc§ý7/¸¢ŒÎÇY» ={å0©W°õ ,ZµEo¯#’TÀsÛc$ºö$7åðòùÞA>P»f7‰®ÝÉ .­Ûõ×’Ñò[b´5W0 Ý¶“3®!7é Ö½A»vÙeì?/;ªN)TïÁ×çPص‚q¿]Eï›®eÀ- º)•Ì.žD’ôCq)}SC’$I’$I†sÔÄXôog}ìx³yíßêèÿ9d5+®aÂJx¶gÂt&3ë:ŠGt#wæ2µâF^téĹ{*L[hÓì‚×3ã×9dÑ*]Jñ?þŒ'kv²úÓ/Yñ~³Ê¯aÊonoëÁ#I’$I’$I’tz:ÓÒö&¨Þu’ev}Kdïw_NN‚êOk) ï;jÎ~"-¸<™ÔRà«/©>´þ>*ÿm Cï"˜ñ#»vR=¼fãg_Nú=ƒ_ù–ÕíʇÃT·$“UgBWŒ}Käò2¯jýI‹Ö3õý0‘½ÐX½…’5ßÊÉ èÁ>Ìw&ídþö¸g‘$I’$I’$I:#ç¶GM—TJ&?@IÛd¼æc~úæn^wEWdÝ«¯ã…·1±t±A9 ÊH!ÔÒ̺·1¿1Ä O…È ödLx»–W RIn¬aRÕ^òžýÝ®ÏaÐåL~{ Ƀ2HÛõÓË¿!£zž¬…¥oÿ•ÜÂòZv1¯ü3¢7ÜÊCWC270¢ÛZ&ÿ¾ ¼žÌ=_2ïýíT÷º‹Œ.`7KW|Aìò<žÌêL¤º–5±ýºúI’$I’$I’tf.;pàÀóVú×µþn'cþ©/RNaù½Í¬^õ)ó61A")‰Œë¯eÄ  0«5m‰fjÙ§¬ø,Aâòƒå1þÎ+|ý%ÓËþÎ{Û›‰]žB~ß^L|5Ý€xý' ~³…1C’)[õÕ±$ºßÔƒI…Ùä¬[´‰ye›˜·u7±¤½o¿‰IC2ÈîgÝò*¦®k$Üà• œÇøÛƒçp(6Iú~ÕÔÔ““sÑÖÿóÏ?çÊ+¯¤sçÎLI’$I’$}Ǿ}ûøæ›oøñ|ÁÖñü5{›(žfÄ 7“×¥cw4^ÿ ƒçïgú?ÝN~ONIƒI’$I’$ý°] AM§óZz—ú_ß•4ƒI’$I’$I’¤ï8ÏXI¡ð±ëleI’$I’$I’¤cHºTv49««ÿ_¸$I’$I’$KŸ~ú©p7Ýt“ ãJ² $I’$I’$Ig#??ÿ‚©KeeåWéD:Ù’$I’$I’$IàF’$I’$I’$©ƒÔH’¤ï ¿Ã3Ockܦ8w"”?S@AAûŸ!<5¶„òŽjèH9Ï |Šòð©,eCù>¨‹ŸÁºgPµKxj`C&mÀÓп_]¤ö42ú·± ñx ´°áãz>hÜœé3Ýn“æÖSw¼éKÁ®ÏyfÖV¶¶œÞjñ/¶0dÚ&6´t@c;xæ·ÿEù.ÿt¤Kæ3>ò³'<Ãã (øÏ””³5êa–ti2¨‘$IGŠn¥|ú\¶%lŠó!ÐwãëVñζtŠÞšÀ°î­×ÅãÇoà/Ïemä~žæ‘—ti±G$I§*º’џრ0é©!<5»m•è&Þ™ð ,  àF—”·Ž NÝ%Œ~d  ||,3>Š.3ò3Æ>΂ †<ŸÙqhn¸œ§>CyûÅËŸaà3å­Ë¯>á•9ð‘Ñ”|Pwxè¨Ö5™¬á¯óÖ[oñƨ,÷÷&»GÞG°þ*œý9u¼ã¬ó%òÁ¡áËâ›&ñÈã3øðƒiŒ~| ðÌ„wÚ†Ÿ¨cÁã¿baC‚Í“dHÉ&âíÖ=é¹ýÑŸáÊ)ý8 òÔ¤Ãè!Bù3O0³>Á¶©¿`à„¶¡ÏNXþqþüû•.‘È&ý~=SþÄÙŸ¶ mö?,˜õß,üæ›ÿcCÞÛÉü#¦¿%úŧ<2ëÿòá_·2zÖ‡LYÏ3ï|ÎÖ=íÞò*þ‹‚)壃½GZþ‡•_þ/î¿¶Ów§÷ìdôo+ù ®I³ÿÌS«þ§u™=ßòÎ;•<òÛ?Q0e=£ßÛÑnȰýÔýu £÷!SþÄÀYeÆÿm÷uöX3Þúˆ!SþDÁ´ÿbܪ¦Ãï»vðÔo+)µk‹+øû­Ë¯>»•9ðw(ùëÿ~8a];‘ÕÿVÞuoü4åÔ.mZÍÀ)òÈï?eYãQÝpN´{ýÛJÞÙRϸÙ¦`ÊŸyêßwR׸“’¹ë8åO ™½…•»Žµ½?µ.ÿN=›ÏXÃá¡Ï–ýwP2÷£¶²>=ûañ¤:Ãk¬“\œøëûøŒ¿0÷+žˆ’Þ«/÷´ëîJÏ"•1{KºÔH’t:õ̺~>†1?O”¿ü"sc})~ýMÞxu8éŸLçù‰+‰ñ­¥¼ï½¯kïsíý>×µ KXKB˜?ÖKy=îPÛŸÉÑ8Û!âD°ÓL䪵¬˜k&3v±å­Æ `tsÇËË O³Ie} =Ç“"öÙ:^§š-ÿ¦êo£êT´‘åkJ Z˜@Bt0®Ù‰µŸëEÈúõÌ2°Dnæóe¾×þ2½-uÙžKR|:^sW°~}4ϲ“Øø]M máÆÔ¿}ÊBOÞá›ùï?ŒmZËÛ¦ãW¤‹TÙØ˜V‚ïÓ#Y?LJ@ΛVJ9= ý³ú܇eÚ¯ùüÅþ¼vÍto €ý\Ë¿´4i$ 3™ì…1øµ#žòô5l³#:2¸&ß0"ó–“Rdm5Ö /Ðu & رÚí«S™Í—?–ëë %1I°ŸðÅâZÈ+ ’ØYÄÕEÀp]øm­Ëžsà yÜ ð"d®…kr(%ˆÖF7kÛúm›Ž_‘Û†åé¡?lz2÷‰>K¿H)à\w5Ú­ÑÕiÃß:øò0‚½º½±˜l¼².eý vg¯YÔ`ÌÈÂcçqµ ¬K&7ž†+˜ü‡å_ó [ÑI’J\ˆ|ó!wª9z¿|‰WÖ°ßÚŸq.RêЛ…#úâgôÄl©Àìåyyl«èCøï"ÈT³ltåy^N;Iödß6ž®§üÈq¶Uºýòƒ5ñx !²ø0)ç*[5èïßf'Óq«‚=ñu¼†YœÁ‚jϽmÚ¾ûðŸô0AfG0{0Õ­Ï¡ÌjÂHO‚-?±ó´;`Ä‘Ç|˜:ÂŒomü†ì“,>×üÃt<Ç%¤¶î„Œwfã—jêŽ+é ílcµÖ&°´ÒÆzÉÚÉßñwÂv•çAìN;Ñó$oDDîJÔˆˆˆÜWFªÿ‰—57›Rk.KŸh4Ÿ™+YBxɼ˜ˆ—§a7ŽñAAŽóÃÝy¹ùØÍÁX\¤¸YÆc¶§‘[Joð4ŒÇFѾ|ìæùx×ÝÁpÆoQ~@IZ+±êFo×±[±cÀÕ`è@²‘ÓBùSž}]ý½ž7ã½ë¯ŒÞãñ6l#£ÈFKùÒÖ격¦®Z¼ëï" M¥|:¶þ–·MǯH×èŽe@ýe§Á±[›ý&ƨOܸáíPDƹj‚]QAæ‘n;63]Ï(Ïú¬§ÏSj»ÀÒøo­ËHNy ä%—ˆH؃ŧ/ã-ýê‚»#侈ÝÅKƒ‰›‡æªÓäZÛzhO5Ey±»<„·Sý%»ßäá5ç­ÄzC‰šjŠò*0x<Œgƒ™÷P†ÚDMikÛç8ôÞé†ûp5êcÇe䨓 ÑÝ8”WDJ^9û JÉ̯Ÿ¶Ön°îˆÜc;ÛXyÉ-· ,­´±‹:÷;þvß®’}«Y±ýŒbVB$¡~jԈȽI‰‘a0àfhð/;àú+Bð¼æî“;€‹þþÁûv±+=‰‹Y?ŽÈõ1x·ããíöš_¥¶ÁÐôŒVc•®bËÏ 3Af#ä··NEâÙRù7U_Z¯ðõuç&;ƒñÖ›:~EnÝps¼™#n_}öL²–±Ã±‘NÍL7OÐ˳6HXÔ|ŽÉÀ…E¡ãÎ+fבv|ñkÒ܈ õmßy ²úÚó@ãx*kÞkò<Ðj¬·9k)1ë²Óñ~žÑ©“<˜º÷Ë+š¯;GÖ.·sÚX7Þp©ÿ~ïìïøÛx»Jv,ãÕå»0=Éú° ¼Ô“F®¹H:Á¦eËØÄ DÆÌbè-­å쎚Ţ­…uï¸OŽ#)f}U2ÒIÔêé“·7¦Ò\JM×üs-M%>q'¥6(ÉXM\r6&¿ ‚E±úÓU¼dØEòþ\½=1¥“ÝðaãÙé<ñ¾ú#{»»½¾±˜¿¯¨…hŒ¸ú™!?ÜCß5“™1‡0´«t•v%íÄêùþî©SÖË¿mEœKzýÂØrwkwÅÏÜòUQ›êrtÖúuüŠÜ ¬¤Ÿ®€¼íôYr« øõ¹þR¶$ï, uÅ­™é&ÏL˜.X)urÂÝ¥æŸë…Bâ¿8Ci%”ütœ¸Ýç1yõ'xò0V¿9Š—KHγã: '†²²­ b((¡È¡'u«ª±×%•*ÉÏ«hñòÜÕË JJÈ­[¦š}›3˜¹å<†Vb½Ñ[f/'ìgÉoðY¹G¬u‰¤6mß ¨Jm ¿Î’±f7;a¨¨FÏ —Û¦EÖÎ6–©Mí”æÛX¦NþŽ¿m·«<ØØL<ç¯eý2%i¤±SlY2‹Ø¯rôë¿2wþŽÜÊ6ï‰MÄïñaå—ßñÝwßñÝ—+ñÉJdë •ŒX¢¥h IDATtõ¨é£o!ž¯»8NÅlM'9q¹ãVa6‚|¶­Ù†ÕN°Å@if »J]ñ7›pö!д˜Øå«1̵(ÄølÌ3Öb1&3fC>)Iix‡X`ñûí`n>7ÿù²˜åË} …!?™ØV, ž8·«Üö¢\²QóLš¢|2R×°q¿™«^  uÊͳùò7RÔ†è¬l[¾œ!á!XìÙ$džuT$ÏÖ>ÿÁ¹6æ’rßkn|:j¥.wð.\g­_ǯH×sæ Ös)©è›ÓµÓ5¹€*¶m>Ìb©–ÅÛLxŽ›Kx˜•ˆä–îxù¾*’øØD"$b7y–@˜Ÿ3àÜb¬rkØ3ãYœyuÊ„§eakØ:ÄxSêT³å_Þ–;þ„Í5‘»€ÄRžã’T›”13*ÐBòš,(\Ëú¹ –3¶R—;ªÓÖ¯ãW¤k91ÊâLò—ûYP6šõSz^3½v$àp?aޤnÙOâ<}“ðbÿºd±õt!÷x|¬;¬÷3÷j¤âüµÓÍêIÈì°%‡ÄœÆêÐˈGH˜Ü»æ<ðð¢Ÿ8Büöƒ,¨C/g_I˜G7À…es,˜¶üD캓XFFù?ʪ@SÍqéäJØ‹ˆH;Êâðôñ"ü¹J"ö´´K\Ÿóñ[~"bÝ1ìÆ^>7’0/GÀ±ÅX[WIî÷l4öaîèžMfVÌ©&vkË×À4 sƒ‘²¹ö ñ•í»ÑS¹×Äû"~ã÷lt0bñÑ3‰ÝœKÄ÷.üÍ¢#Bº–s{ÛX­´ l­¶±¼:øo%7u#M~Ìm"Qs»nWQ~PĆå"ö&lóߘªνÉv„ ‹æòî 7œM'2úb#j’5Î8–ÄoW2ÿÉEdµ8ã%i¤SÜwåÊ•+×5ß*+)..Æn·SYY©½$"r—2™LôïßÿŽÿ矦OŸ>888¨0E:zMt(Š——Ú‰ÞƒŸ.:Däv8/æåOª‰~Ë?ýÄPDÔÆj^y1‰–ùݲp¨í(>|˜1cÆt RÕ&iÊ'0¯Ø~ÔŽaÌ›Äýælõ!<îÆžS“••uãñØv×&j%î³9¬›±Ž9¼¾´„ƒŒaå·kn8Q“••ŰaÃTQºHUUçÎãÁ¼mc¼n`ßÊÊJfÍšE=X²d ƒæÏþ³^õªW½êõ.|½““4""""""Rξä |ƒ-êe+w®&’4ö¬w‰=ú;Ö$ÞX’¦ãŒ Œ†F¯*)éD×õ¨)**¢GôéÓG{GDä.6sæLþó?ÿóŽÞõ¨¹‰×FúU¤ˆÜnç%õ¨µ±´]rÇhwšf’4†1ÿ›¤•íKÒt¬GÍVn{g|Ìk¼>[û7õ¨¹ãÜ =j®kîVTT°hÑ¢;þ戈´LçyiÈèÅçŸk?ˆÈmt^òÆçK´DDm,m—ܵ:)I#r'ºnè³êêjݼ¹Ìœ9S;ADDDDDDDºÀ)6-šÏå>¸Ø®$Üóº5õ¦nÞ‰ˆÜý””‘.a;Áö#ƒˆZ³Ž¤¸ßà^ûö푤±a·Û±Ù½ªÔ¤5™¨ÑÍ;‘»Ÿ’ò"""""""Òe¬Yòô|ŸÃœG ·QOšƒ,yi í^UbÒ‰Ô£FD䥤¼ˆˆˆˆˆˆˆt­,–<ýñÆ7»>Icôáw/¸·8‹û ¯1\C²I'plêMݼ¹ûÍœ9Sç{¹õŒcYóÝw·YP}™µ…ï¢T>À¹º÷ú0òµ(–>ï¡]!^àÛˆ¹$ä4~¿'ý,xí³ðïoPIŠˆÜ %åEDDDDDDDDº^“‰švß¼³ç°nCÃ$ À9lXGΤ|;’Oò{"ßð¡€ÝÎ…³Ùüóà ĭpáÿ®˜†‡ÊRD䆴?)/"""""""""7ËMîQs™Ë—›zûËg7bçÆzÚtwñ`È Aõóúø0ˆ½ÌMø–œ²ix¸¨0EDn„’4"""""""""]ïæö¨¹!ïiÓ½WϚ׫o\8ʽÿ!ÿܟǹË}òT0o¼1™A;_}ÈûÉ»É9w™îý,Lzã-挪Íð”ígÝ;òUöY.ö|€‘“æð§Q¸œÙÎ[ÿë ¦¼·‚ÉWgß¾”?}1‰÷VLÆå·DüáŸLZö<û?\ljǢy'ÄÎd²îýù*û,—û alÈycBmbª#±ŠˆÜêQ#"""""""7KVV–âi§›Ü£æ]¾Ìå¶ÏÌe¨íQcç™lþ™œMϑķ&›Âö˜å¤tŸÂ#ÿ„ËÅC|þáGD¬èÅ{OÒóÄbÞß˳i1pö‹u¼¿â=F}Á¨îGùpi _õŸÊ#ŸÄ¥ì+6¼ÃÒ‹á½7|Úöl˧HyÿŸ ™4‡9õûQ>Œˆ#sÐk¼õ_ºŸø'ï¼Áû.ïñÖ¨ íµ—*­ˆÜJÒˆˆˆˆˆˆˆÈÍ0lØ0í‘èÔ5ý›ÅkÁ5ÈC×uyo s¯=í)"£žÄ°ŸH%¥ÀÂ[ï…Ô&31hñ)þôÿ}Ρ²'y¬¬€²îCxm‚MbgÐ2ú=y–~ÝáBv _]´ðÇ¥!<é0‡¥—søÃ‡©ä¼¶ß¶EHÏ)Ëxëùþ\ÈÜÀW—cé[Ï×Äãóoz‡ÏÏ\èP¬""7‹zÔˆˆˆˆˆˆˆˆˆt½NëQóÀ”H¢&œ%ù½·ˆË»Øêü}žú ïý©…Þ+C~Oä>ô°Û¹p6›~¸ë&ñÁŸ|¸xâ(ç.æs]6§'.À“C¦1©ßrâþðCóç±±cû˜/ý Ppâ—ûMaHƒ‘Å\†ÉósÞ"ú½¿0©û^þy¨ —AÐýì^rÊê×]–³—³Ý=t5®Ë—¹l¿ú× œÊ>ÛBd\,ý¡`/'ê–±sè?ñ§÷ŽâØXEDn%iDDDDDDDDDº^“‰švß¼3Xxã­ œx?†/ζe>Œ]Á´AíÓ«;pñ,/ƒÁgÓÈáý¨÷øjÿQ}›ÌŠ©œpB?tç_mx‡·ïçè‰Cd~žJæ¹> êד^–iŒí™Íûï$“yôG¿]ÇŠsè7%˜! Wúu?Åç)_q¨ €CÛ?äÃC-g¡\FÍb,»y'á¿Øô‡¾zŸ÷w_`ÈLˆUDäféHR^DDDDDDDDDn‡¨¨¨¨†oüòË/ÌŸ?Ÿàààö¬Žª'ò—ÿwŠêÖfícaÊÂ?3Ïß ‡g¼ÌÉ©ìušÀ´'û_;ï…cìØ™Á©A“˜àÙŸG~m¡û¡/øÇÆTþûû"z?ÊÒ×ü¸ß f_¶çðÅÆlý××ìÍïÅc¯/å1÷ãàÐÿ_{Q¾w+)Ÿ¦ò¯Ë0?û!Ô<Ç`æóönÙHêÖtrÆ: öþÛƒg'?ŒÓå“ìÜò#“žç‘Þµ±ú3ú±8•þ>ݸ•‡º1êµÿÃOôÇ@ïöǪ:+"7IûÎó·—óçÏãääD·nÝT """"""""r+W®`³ÙèÝ»÷mã}W®\¹ÒðcÇŽ1xð`•žˆÈ]înxFÍÏ?ÿLŸ>}ppP[DDDDDDDD®WUUŹsçxðÁoÛ›zS˜¹ûé<½¢¢"í‘Û€Ùl¾g¶µÉDnÞ‰ˆÜý””¿·""""""""r{hrP=`ZDäî§$ˆˆˆˆˆˆˆˆH×k2Q£›w""w?%åEDDDDDDDDºžzÔˆˆÜ£””ézêQ#"rRR^DDDDDDDD¤ë©GˆÈ=JIy‘®§5""÷(%åEDDDDDDDDºžzÔˆˆÜ£””ézŽM½©›w""w¿™3gê|/"""""""vøðaí„V 6L;AšÕd¢F7ïDDî~:Ï‹ˆˆˆˆˆˆÈÍ2f̘Û&–¬¬¬Û.‘–\7ôY·nÝøÇ?þ¡=#"r—Ó0—"""""""""]ïºD““¿ýíoµgDDîrêQ#""""""""Òõ®KÔôíÛ—ÿøÿ`æÌ™TVVÖýâZ¯zÕ«^õzw¾Š\£$ƒÕËæ1sb§1/&•œrí–›´sI@@@ÃS˜½(†Ô[…”ʼ‰³I-lËÌåìKM&-ÏÖŽeÛZz ³'0%j6U¿rgª(&ôí ’‹››¡’}ßç“V\ÝÌt{?·”¨¤|ò𛾔ý̼wsÈ©¼±ÅlG˜wˆ}•]³õóÞÞKj™}Ç‹ˆÜ{î»råÊ•ëšË••c·Û©¬¬Ô^¹K™L&ú÷ïÇÆÿóÏ?Ó§OT˜7E!)ó^!Ñú,aaSñ&›äØDö[¢ù4f<ÎÚA½Â&uÞË$º†“0߃Ý޵4—ô”5lÜïÊŒ„U,ò»Å{¹ü)ÉÙXB‚ñmõ£óX=óuöÏßÌê ç\öÆ÷UÚ¼—Yãͪ…ãqWåÓñ+w¦ŠbBßù‰ñ¿œ¾MÍp‘Õïf±ÿé'XíëØÄtûØòްøˆ “M›˜¾û÷»•Ô͈?ÝŸµoaÈ ìJ[Á^þ¤’è·|ñs¼ÕqŸ'e÷y,cÄ×I‡ˆ¾ãåNsøða=£¦•x† ¦ŠÒEªªª8wî>øàmc“M/GGGÌf³JPDä.wìØ±;:Q#7YÞNRrÍÌZ¿Œ©^¾„‡ïãå¥Iì*ÏsnÚE7ƒÁì‰÷!µ7 }ñ?ß%¯°<þ3¦þ=¯[Œ³/Á¡¾·~ÙVÙ±Ú ¸úY”¤Ññ+rƒªÉ=tï‘=kϳ§ïîmÏÙ¾—×÷ÖöCìu‡…ïÔ›àÀÞªÂ"ú޹'uÓ.i£ò„NœGÚ¾4¢fOaöêÚATÊ‘²lÓ&0ИTêG²²‘—Cè´‰0qæ"Vf”Ô¯³$ƒ•‹f2% €€)³Y²:ƒº¿¦2{âkqýÍ :~uüÊm¡¤äQí! ú¦¬>\;´ÙE’ßýŽ ç®ýÏÝLÙr†¯™>OyÁa¦½ûér}7€è=ÌKù™œŠ§¼Ì½D ãê@•Ùqº'Aº]?]q†Ð·³HË+"jõ·ÌÞy±fžŠó¤¤d1ííoˆÞCè–S † «&ïÀBßI' ú&¾{€•?58¨¬¥¬\ŸÁ”èoˆÛË’¥õç²SÌ~;‹Tkƒ}ñ}?:U3Osñ”×­sâ;ûˆ9p±þ<Ðb¬Ýð;’õóŪ§{´­iSTS6£Ó™öÑa¶7Q£¥í«(&ôí,RŽä³dõ·DËìÍgÈ+>CLÒ&FÔÕGØQÖÔç}S3J>‡®–§µ¨~賫ëþé1Iµë:ÜñañDZÔÎ6V+m‚–ÛXúŽ‘«-9i;{>I±ÉðÜB>g I]º˜$«?a kYµ"óþxDì °å¬aiì.LÁ‘$¬ZAبR6FÄ’QØ÷úR>³–°–„0¬—òzÜ¡¶?“£q<¶CÄ-ˆ`§!˜ÈUkY1×Lfìb3Ê[Õ8$”•«—à[÷“ãr2’·Qd²`qUÑw&£çãxRľ"[ÇëT³åßTýmTŠ6²|M)A HˆÆ5;±ös½Y¿žYf–ÈÍ|¾Ì÷Ú_¦·¥.ÛsIŠOÇkî Ö¯æYv¿‹ë‡Wwcêß>e¡§ïðÍüwŒÆ6­¿åmÓñ+ÒEªllL+Á÷鑬ŸãC g‰M+¥œž„„þŠY}îÃ2í×|þb^»fº7À~®€å_Ú š4’„¸cAÊ™º ¦îÌx¬uG}ÙY²]`qlfºê"I[Nˆ‡Y8 ¨ õ“$U¸öêhVýv æ¼ÜºÏ°géÖbLþÃH˜ó(a^v6¦!£¨¢šä­%Xë’^mؾª ¬ùòÏMÃúý±gÿ›W?:‰iìpֿõ4ñéµóWž'ñï¹ìï3ÈÙ£H˜1ϼD|cmzU] )­¯€á¬ŸoáYΛVŒË!¥Ým¬6´ šoc¡ïxšúLDDDšcǼ‚¨`÷Ú ºd’òGùi(; Á;2W¤°¿$ˆq¥ù”,,|v<~n€·'æ "Ì(ߟÄ6ë(£C r«Y6ÚžÍËñÉd/ŒÁ¯ñ”§¯a›}Ñ‘Á5ñø†™·œ”"k«±56¡<‡´øbwÚ ŒžßàÂP:…Á„;V»½cu*³ùòÇr}}¡¤q &## ö3¾X\ yeA; ƒ¸º® ¿­uÙsn8!»^„̵°qM¥µ:¶zÛÖßhÛtüêø•Û†åé¡?lz2÷‰>K¿H)à\w5Ú­ÑÕiÃß:øò0‚½º½±˜l¼².eý vg¯YÔ`ÌÈÂcçqµ ¬K&7ž†+˜ü‡å_ó[ÑI’J\ˆ|ó!wª9z¿|‰WÖ°ßÚŸq.RêЛ…#úâgôÄl©Àìåyyl«èCøï"ÈT³ltåy^N;Iödß6ž®§üÈq¶Uºýòƒ5ñx !²ø0)ç*[µ&†¶+Ì>N¦ãV{âëx #²8ƒ?ÔžJÚ´}÷á?éa‚ÌŽ`ö`ª[!)žC™?Ô„‘ž[~bçi;vÀˆ#ø0u„¹ö4& Ù'Y|®ùçâzŽJHmÝ ïÌÆ//ÔÔVÒÚÙÆj­M`i¥õ’Ußñ""¢DˆˆÈ reÔ¨úŸ®Ys³)µæ²ôù€Fó™É±B%„—Ì‹‰xy–qãDà8?Ü—›ÝŒ¥ÁÅ—›e{¦‰?YËØáØH§f¦›Š§ èåΊÙ$,j>Çäà¢Ðqç³ëH ;¾ø5inD†ú¶ïÛÖlÃj 'Øb 43…]¥®ø›M8{‡hZLìòÕæáZ”Fb|6æk±“³!Ÿ”¤4¼C,°?‰øýv07›ÿ|YÌò径‡ŒÂŸLìN+–Oœ[‰µ<3…L»'³ÌEd¦7¸¡lpÅ2Ê7]Þö¢\²QóLš¢|2R×°q¿™«^  uÊͳùò7RÔ†è¬l[¾œ!á!XìÙ$džuT$ÏÖ>ÿÁ¹6æ’rßkn|:j¥.wð.\g­_ǯH×sæ Ös)©è›ÓµÓ5¹€*¶m>Ìb©^„?WIÄž–v‰ ás!~ËOD¬;†ÝØ‹ÀçFæå8¶kë*Éý¾€Æ>ÌÝ£ÉÌŠ9ÕÄnÍcùº˜ôcnð R6×~a8¶²}7z*÷z˜p¿CÄoüžF,#"z†#±›s‰øÞ…¿YtDH×rno«•6­Õ6–—¾ãE®²aâ¹¼{ çAÓ‰Œ~؈šdM§3Ž%ñÛ•ÌrY-Î8FIé÷]¹råŠvƒˆÈ½éرc <øŽÿ矦OŸ>888¨0E:zMt(Š——Ú‰ÞƒŸ.:Däv8/æåOª‰~Ë?ýÄPDÔÆ¹­>|˜1cÆtà`©MÒ”O`_±ý¨Ø7‰ûÍ >ØêCxÜ=§&++ëÆã±í®MÔxÛÆ¨æ®ˆˆˆˆˆˆˆˆˆˆt&’4ö¬w‰}4™‰C¹µyN#ƒ£¡Ñ«JJ:Q7í¹åšIÒÆüoâþ0T ¹'¨Gˆˆˆˆ`ôâóϵDä6:/y ãó%Ú"¢6–È]«•$MÒÊîLäN¦DˆˆˆˆˆˆˆˆˆˆÜB§Ø´h>”ûàvb;Ûës4JÒÈ=ICŸ‰ˆˆˆˆˆˆˆˆˆÈ­c;Áö#ƒˆZ³Ž¤¸ßà^ûö푤±a·Û±Ù½ªÔ¤)Q#""""""""""·–õ KžžÏÁás˜ó¨á6êIs%/-ᠽѫJL:‘5""""""""""Ò²XòôKÄßìú$ч߽àÞâ,î/¼Æp É& ÓŸQc+<ÌKïæQ‚ß½ùaî7´|ùÑïyæã3ØÍÃٶЃ¾m^ò2Y'95Ø‹û9À¥ÓÌyûßLxó)æô»IWžÏ¬¸<¦¿5žé÷wdEb½iëmÃg‰ˆˆˆˆˆˆˆˆˆÜJƱ¬ùî»Û,¨¾LˆÚÂwQ*¹õ:§GÍ/…,û¿é,û¾Œ£G‹)ÀÎî£åüøý~f%þÈWåmYÑe~Ì,ÆP”Ïžò ÂÆîorÙTXÝy{ϱ7/ŒˆSGWÔ(Ö›¶Þ.Ú/"""""""""""Ò&УÆÊºuØ^ lú¶7øKÞöÿaníÿ—¬sæ³…ƒx ¥U]*cSN5^c¸û8›rl¼8ú6ê[ÖÃ…YϸÜ9ë‘ÛJ'$jL¼Ô—>­í Ó¤n<ñ”{ËI üäIöTöâþž8;Nlf)Å£Ýk†?û%ŸéïœdÖ’'™î\3qÆ·¼”9Ϻ²uÅ.>.>ÝÁ„£¿æ_Ï×ÌSr6ŸeÿÈe{‘S_3a³‡×V~–øO³ÙrüV§^<áÿ‘Ïô«ù¼K…ÌyûÓ_ÄžÔñüšMcÏ1+îÓßÏ ¿|ÏÓkÏ4Úf¿yó)–¹;P^˜OìÆ\¾*²cǯaƒ‰š>˜á=¬¬kë3˜[»Þé÷·×iæ¼ËäÝyœí'/ah¼]u–?ñ|ÏÂ2_>û}í~ÅÆ¦Ä/ù`ðXR†#øS#áAÕ¬ÛQÀÁ2G|† &rú †ö¨]å¥26l:ÄÇ9å”TxÔϛ𩞠íPʼnﳉúW!­Õ\\™>u$a>ÈQDDDDDDDDDDnúÐgU–’Ux¹îÃC>¬YÄ—Küyó¡ú+ÿ¥ŒÏÚ°5»®ÚaÏ\ú3¡_ÆŒè'OÕ¦áÏLÌyk¯¹tãÑWžæ«.*/ñIê}ÆŸó‡3™"–§Sp¹Œ˜w³ØTi&üõ±¬™Ú—òÝY„¤–ÕÇXy6ƒÑÃÝãšO4οþü4Ûþü4Ûþüq~0õã¸\FüGÙdÝ?˜˜×ÍšÁ :~”%;Ïck.ÖºÝЖ¸Êù õ ƒǰñ-?^¤ˆå©g(ou¿¸ò¨_ 'OrðÒÕ‚9ͦ¢LÝ #`+ËcÙ¿lL~ÞŸ5!ƒp;ùoæ&R À%6}œÉ} },I¯ æãÙu·eá¦Ó8ÉšùcÈÆ'É?²û’<¸Ù‰šË¥D¼›IÄ7çj{–ô"lú`ÆÜßçû]™3ý¼¨æàö}Ì}çY—›YWí°gîwÜwŸþ¸qŽÿwÜÖ¶Xº7½‰>3œY>&yzð‡§œá— ”åÇsÙZáJdÈPžÜ›1#†7µ%ßã`]ŒÕ8ý1Oy0öºÞ*Ýqv6Ò×Ùˆ±0—Ø}ÝymŽ…1=y"p8qÓ1a° c,^ÌâHù/•-ÆJ›ã‚AAÙãcâ~x-¨ür¾öÙ@-'cËØt²feÅÙ'9êbfºûÕísdò+#™eqaŒe0q!q>žËö_ÀVxŒκ2” ž½î3ˆÈWâœS›P+¿@‰£ ÓG`Œg?^œú«š$•£<蔡Ïn[áIöT˜^Û³ƒ¾î<á”ÇÖÌRÊG¸ãÜ®µî^¿ÉFÇnjÿ_Rx»‹Ã¬¸ïÀ¸WpÄ cœj–3ØÐòG”²ìÓBܧŒåW“ÝM<ãïÀÇ Øp¼Œ¬“Åì9^ ÃZ¸­q]»]`hë.éÞ‡éu#,³ŒrŸÞ|y÷#µ=vz3Á½>)etïc{~©brY%å,ú˶F+íÁÑ xfà`¦»d²äí<:lF¸3y˜+t×'""""""""""7;QÓ½qoýš³²d{)v.¿éƒ^ñÀ§²œ-›þMÝxtòHú¸ðh“7í«8¸»;Õ|òî|ÒðOÇO’uÉ M,e¯¬ná¹8€£nŽØ[­,Ùʆu?òãÀál|ÒT?„YùY¢Vg±Ý±//Œvgúó^Lÿ6“e7«0´{»ðñw…O 8zö›ŠLÿ­©Åù¨.¦¬ü}ã^2Ýp¾À•°ÿ5‰ß;ÃW‡O³ý¿2y7µ?Ñoæg|"""""""""""7½Gs?|îwÄØûñ3ÿí_?Ÿ³ cÜ›y¨üåslÈ©Æ4l$kžq®KxØ 2ÿÓ3|rü2ÜÊjl•u qâxû~âæÞ CÙ~,ĵI„â“§)tìÅP5‰‰Uñãö,þjugåïÝéÛà/5×yôçá ï^3oVE+I¥›WÊlà@†Wàƒã„Ë@&÷kø×ó|UXÅ„ÁµePÈÑJ#¿»ßg§Þ˜¬ç)qêÁØÚØlùGXò‘°Wa;~„ û±ð)wf vgÖä2bâþ‡Ûxf„QGŸˆˆˆˆˆˆˆˆˆˆÜó:aè³Klÿú Öç©fÏל=˜AMüÕvò{* ¼ÔŸ¡ ŸãâÍdÓ™šáÏ^éÁŽødGCŸêÇr‰=^ .õ³;SMù/(¾ärMâ¤)Î f²S&Ë?=‚q²;neħžÃ}ìØš^?­$DÊþÈ’ÝU¼ðš7ùLùÕœ‘cw ¦˜*ÊØžs·Ý8ñÃQ–®Ä>ÐJÉåš¡Àš‹µ£q5¹­ ?«ÐÃ…éU³äð%¼¦¸óÀ5sW²õÓøLÌðÊ2Ö¥ž¤ü¡‘¼ÐŒ<Äœ¾»XþÑðü@¨8ͺÿ:ÎQ˯qïv.°u{V§áüÎÓ’£'øÚjà =¤FDDDDDDDDDD:%QÓƒYsü8º.û“¾üîÒ!æ~^€×ä_å|‚دáµ9M'i Šƒ™ÅØ]¼˜åÞh8¯î½˜>ºÿo÷I²øáÓ=X’ú#ó÷9â5Ì›¨©•„}]ǘ}X·ý˜[6–“[ »»+Q¡~8oú7QkŽcuêÁ˜±cHz¦7­÷ý¨âÄÅ”PÉÖ¿fkƒ¿øL𠣇åÿ=±É»ùıŽö!.¤;QŸf³$Ó• O6Š5ðfÅÕtù\óYS{c¤;cü] ÇÆtKF5¤/áÝÙ´éø«Õ¯a°fúÕC&æüÞ6"þ㬎=’5S\0F_â~$öó,¶W‚ÁÔ‡ÉÓý ÷tБ'""""""""rÉÊÊR<"ítß•+W®tæØ 3ãÝ< 1ð›7Ÿb™»nÒߎNüëkf}ˆÏzÖõ¨±åï癫‰ÿóhÆt×>¹;vŒÁƒß±ñÿüóÏôéÓ}·ˆˆˆˆˆˆˆˆÈõªªª8wî>øàmc§AetÆ–èaª ·«KV²ŽŸáƒÝ—xtê€FÞ‰ˆˆˆˆˆˆˆˆˆˆHgÒÃBîq¶²<¢’ 1 ·?ܨ"""""""""""r uúÐg""rûÒÐg""""""""r7»†>ë¦béJÔˆˆˆˆˆˆˆˆˆˆˆˆt%jDDDDDDDDDDDDºˆ5""""""""""""]ÄQ»@DD¤FQQ‘v‚ˆˆˆˆˆˆˆÈmÀl6ß3ÛªDˆˆÈ=ؑۃ†>é"JÔˆˆˆˆˆˆˆˆˆˆˆˆt%jDDDDDDDDDDDDºˆ5""""""""""""]D‰‘.¢DˆˆˆˆˆˆˆˆˆˆˆHQ¢FDDDDDDDDDDD¤‹8jˆˆˆˆˆˆˆˆˆˆH{>|X;¡Æ ÓNf)Q#"rlª<:~åÎTQLèÛ$77C%û¾Ï'­¸º™éö~n)QIùä57}/(û™yïæSyƒç‘‚#L‰;ľÊ.ˆÙzŠyoï%µL‡Žˆ¾ãEDî=JÔˆˆˆHí`I‹—³@ÂV‘°pE–ÑYwâïQÿpV­]ËÚU«Hˆž?»ˆýuVî+ï‚`¼ynÆT¼Mm™¹”Œä$RsííXöF•™´ k`4kÃü0ªÚèø•»”ŒÝy¤ž®nfº‡Ãé³y¸bnfú®Wa%5-ÜÊ;,nGÏù»ãí¤#CDßñ""÷Gí°å§°­ÈBتP‚ܼ ËØÉâÔý”LuÇM»è¦0˜=ñ2¤6ùà‹ßøqø.y…åñŸ1õï!xÝÊ`œ} õ½õ˶ʎÕnÀÕÏ‚»³êŒŽ_‘QMî¡‹xìY{žm<}wo{Îö½¼¾·¶b¯;,|§ÞöVÑw¼ˆÈ=I=jDDDÚª|¡ç‘¶/¨ÙS˜½ºv•òC¤,›Ç´‰L#4&•ú‘¬lä¥Å:m"Lœ¹ˆ• *(É`墙LijƒÂTfOœGjÃÙSç1q^jÍ<ÍÅS˜^·Î‰ÓB‰IË«:ªÅXMXƒ°4è!ar5€ÝŽ]¥ß‰Ü77S~™…t¼N5WþMÕ—’´ºáËl‡¢˜6s%éiq„ΜH@À4æ-K!§ 䙯²¡ÈNöòç™s[ƒe[­Ëåé„NœGJF*1µÃvL™U?ŒÚ5JH÷ ‰ùvrc_fâ²Ú¡ÏZ\3Ç‚Ž_¿r[()9EÔG{ˆþ†)«×mv‘äw¿cù+dÿs7S¶œáãk¦ÏS^p˜iïþDúBßM' zóR~&§¢Á)/s/ÑȸÚ{¤ò";N÷$h@·ë§+ÎúviyED­þ–Ù;/ÖÌSqž””,¦½ý Ñ{ÝrªÁaÕä8Bè;éDÃÄw°ò§G•µ”•ë3˜ý q{Y²³´þ:̶âFÝpZÚ¾ŠbBßÎ"åH>KVK@ô·ÌÞ|†¼â3Ä$íabô7LY}„eM}Þ75ó§äsèjyZ‹ê‡>»ºîŸN“”Q»®ÃO¤EílcµÒ&h¹¥ïx¹Ú’‘¶³ç“› Ï-dásf Ô¥‹I²ú–°–U+B0ïgAÄJ[ΖÆîÂIª„*ecD,å€íq¯/å3{ a kIóǺq)¯Çjû39Çc;DÜ‚v‚‰\µ–sÍdÆ. 6£¼ÕXCB‰‰ ÆËPNIÎN’v–âùÜ(ÜUòÊèù8ž±¯ÈÖñ:Õlù7UU§¢,_SJТƒqÍN¬ý\/BÖ¯g–Ù€%r3Ÿ/ó½ö—ém©Ëö\’âÓñš»‚õë£y–ÄÆïâúßܘú·OYèiÀ;|3ÿㇱMëoyÛtüŠt‘*ÓJð}z$ëçøÈYbÓJ)§'!¡¿bVŸû°Lû5Ÿ¿ØŸ×®™î°Ÿ+`ù—v‚&$a†®ÇXr¦î¨i€;3ëW?¬YÙY²]`qlfºê"I[Nˆ‡Y8 ¨ õ“$U¸öêhVýv æ¼ÜºÏ°géÖbLþÃH˜ó(a^v6¦!£¨¢šä­%Xë’^mؾª ¬ùòÏMÃúý±gÿ›W?:‰éÿoïþc´ªï=¿…é3,}FéL•™¢3õ:@y¨ôS/˜R£{-®w6[ºYÉÞ,%)°Yôä?pþй NJKwlŒÕÖFÝ^l\©\£t¬ÌX.ÃV&*:óìûÇ ¿†ƒ{_¯„LÎðÌó|žs¾çœï9ïs¾ç¦kóèž”å=éÜ|èõC¤ëçÝÙvÙUiÿá´¬¾ëª4÷ìÌò,Ÿx~íÿ0ë6îMËÍ׿ѥܚ¿¤cã»Ùg­â<9ë>Öiô NÞÇŠ}<I }g¨’bÛYÑÖtè€n}ÖõNKû/”ë’dbZÛ{òý…²mïœÌìïM¡”E·ÎÊô†$­ÍiœÓ—ÆB²oÛºl*O˲UŸ c01«*Ûsgçúl_t¦ŸE=û6¯Í¦Ê̬jo®gêÒ´÷¬Ì†¾òˆµÎùdÜ„Á×rÿ ³©œ¤ù®¬™Ûb±Ÿo…b ©¤\©œ[›ÚròåŸÒ§Û˧ŸB[Ììöö´M¯M25¥úÝùþÂuyv÷œ´>PøTù§Û–›ç/˼’´dÞüR[ûfú3'#nvzïÜw³þZ¹h”¾=9m×’ŒÍüoîʯ7”þ$u‡FGwtzôõ„£3ûÎ)ik•äÒ”Šƒùþ#=yö½+Ò6.©k¹2‹jæ»ÿôAêKW“ŸN¦8ãÚ¬˜1ü ”Á¾w²n︴ÿøêÜ8fx;ØzçÇùþ#»²­|Ef~øQúG_šE×}9Ó‹IÆMci 5ɾžžl¸,ËþþêÌ)ÿíª¡rçÆw²ý–©§¹8¶ž};ÞΦ¡†¬ºóÊáz&LLû»¯gÃûC#Ö:ç Ÿ¶{ûÛÙR3>kÚš3µ&IË”´¿ûb¾rhÛ{Zßï’ÌøÎ5™ÓX“4NÈ »³¡yrL.¦6cÓVz+Ïî¾ê¿65¹ñæI¹ãºÆL=Taû;YòþɦÓn;V+·³ìcÔ'(ÐÇš[¶@Pg¨>Ó¦Õž*woO¹;÷þíÍǽ®1o–“9¥y™Û¸$Ëïüw)Íœ™YsædöÌéiªMzº{SilK騥J³ÒXÙ˜îþœæ ž£ëLß˽©4.Hëá3u™¾øÁLO²wãµ~RGmk=ühÚz·eCWg–,Ÿ˜_>t›ñ¯Ï§J9•R_(œC›Ì›§XþÙ·ýSí÷ÓZ3«õÈéÌÚÖYi-lÊ‹}ƒ9UþÑ?R[.·ÕR둳ˆ…‰"Ÿs{ÿS7ë/TÇRä°³P3ê´×ýaÅÌ$¸©ßÖÑ}yñýiwüÙ²cTæ´Õœdz¸žiÍG*(ïù ýƒæÞÎ<î½jóæ@2gÂU™;î•,_ýBJ“¾œY¥Ë3{ò¸4Õ$={>JeÜ„c†#j˜ÐÆý{Ò]>ÝíÀÑõH_ÏG©Œ»:­c޲O¿åÚáíÀ?Pë5Ò×3„kÒ|T@Ö:¹˜Â¡ ¦¤ï7&ÉèÂQwïŒJ!—¤¾±p8+ÔµŒjÆfÎõ£òZO_6ôìËË»ú³¥w2étÛNΰíÀ™©=Ë>VÏúS÷ J#ô±f÷ÙÇ ¨€3S(¤¡pÔ O•$õsóÀêyi>æìA!Ŧ$™žÅ?ÿmÚ^~>ÏoÞœgº–dmçÌ´?zZÏâã+ÇE}¢z …ŸÈ¡ÖÁÝo¦»Ò˜©-u©kjI]SK–^ÎóKžÈ¶}·eŽËWÏ›ÁÞÓ›ÆÌi¬Mz϶Mµ§ùTËÿDíeä¤í|ëN¡P{áÖMë¯õ—‹ÃèQi¨ù,GÜþäÙ3'ø¯ò{y¦æò´9Éô‰êÙŸä‹Myà‡WX Nq\’ŒËâÍL[Ï»y~ÇÞ<óÛW²vcCÚ4õì¶CŽÝ_ÏÐðïN¸±Ö‹\¹?÷?òjž­ùRn½îòÜñ ¹ãŸþ9+NÞv 5Fkçª;‡>Ö™w\Žìßíãá$I;ó«ûî˯r{ÚïÿA&×^Èß—?¬øA?µûðošny0ëîÿV¾lÉpžèõÀ9(¶¶¦ØßþbSšš†ÿÕ÷?‘ήgÓ?˜ì}ñ§ypýö§ÏIÛâùé/×dnáù¬ß¶7õ­Í)ômÎö£6¾}sú Íiýä"ûJ%•Ê‘ÎbïË}§¨¦6õÓ“ÞÍé>êaè/¯ø^¾wÿk)ŒPkÿó+³pɺ£\šTÝéá Öóiož_÷lÊÍ·eFÓ¹´©ò)—ÿé=/¡;›üq»ŸIw¥>ÓO}TtZmùœ¯÷·þÂçA9›÷y€üàž¿¤{!Ó/ûô¡ìÞž¿$“ë_]~üô ·ã‹)~XNÿ˜1i7ü¯þÃÝéüíÿIÿP²÷­·óà>H±åŠ´Ý2%?ýñ´Ì­Ù›õ=•Ô›Â{{³½|T »ö¦oôؾpÿT‡JCéí8åáy}˘dïÞtþ›yùñó½'?Ha„ZÏôT@c˘Tvý%½G}V÷Žòá 鴾ߙœòêéɦñYý÷׿ž›scã˜x:Oì,ûXÅÓê§œ¼U´‡ø—ýjîO _¬ËìÛ¿‘¥F%—ûî.¥øä[éxä”kk3mÆ×³fvqx½SŸ¥ßŸåßÈ’WF§yRK–Ý6”å/œj–ŒË²»¿–Î'ßÊòGþ”Jí3û¶odiKM’šSÖ:²¡tÿqW«½,ó¯›Úbc¸û@:žêÉÊGv¦8þòÌoûj6<~h‡Q3Â÷;ÓMyË5Y6ýµt>öÇ<6º6¥ë®Îª»jÒñxw–ÿq\þ{ÉAuÕmk„>Áàˆ}¬ûxøÄàŽübñüüdgCê¾úïÓ¾êöt,kλڛÒõû‡²àogë)_xƒ†óâ’ƒ4ø<úóŸÿœË.»,£G63à\‰^[‘;ï­dÕã÷gºƒàbØ.íz=wþYõ_§fºK },¸¨½þúë¹á†Îae9ÒìûV¾•ÿ§ß¨¤pÃóàßíÌÏžš”ežÙsj¶nÝzæõ þáPPóõ<øë»óÈ]äîÇŽú9÷ž¼šòÐïמqP³uëÖL™2EC©’ýû÷çý÷ßÏ•W^yÑÖ¨» @uœ ¤I’ÊÖŸ¤ãëëóX×ä\Øœ³6…B!µ…ã~ZRœG£Ì.¸“„4IR¸á¿åÁÿ2Y@¿ î¨ µSWä7¿1€‹h»4aJ~sùècÁÿ·FiÖ=tfÃÁç™ € è_ò«Å ò³}“Ò°óé<}$£Ò𯒡ϸpwæé_ÍŠµd݃—¦C¿¾8BšÁT*• VŽûi©q j¸°Ê¯æžo/È«×Þ»¿^¸ˆî¤y5÷̽'¯VŽûi‰q j¨‚­¹çÛsÓYûãê‡4µ“òno:åKšnÿO¹ÖlœžQÀ…S{SÖ¾ôÒEVÔ—ó­O楞;jªDPP%‚€*ÔT‰  J5U"¨¨A @•jª¤Æ,à\lݺU=p–5œµ)S¦˜ p }P%‚€*ÔT‰  J5U"¨¨A @•jªDPP%‚€*ÔT‰  J5U"¨¨A @•jªDPP%‚€*ÔT‰  J5U"¨¨A @•jªDPP%‚€*ÔT‰  J5U"¨¨A @•jªDPP%‚€*ÔT‰  J5U"¨¨A @•jªDPP%‚€*ÔT‰ €ÏµK.¹ÄLà¤Fº¸£A Ÿ[…B!f'488˜ššš‹ºFA Ÿ[õõõÈÇœ˜!$I8?þ8©¯¯¿¨k½äàÁƒ-2>¯†††Òßߟ¡¡!a I†‡;«©©I}}ýEG  J }P%‚€*ÔT‰  J5U"¨¨A @•jªDPP%ÿRÊÜ0èIEND®B`‚glewlwyd-1.3.1/screenshots/g_6_auth_types.png000066400000000000000000002243201322667720100213510ustar00rootroot00000000000000‰PNG  IHDRrEéˆi pHYs  šœtIMEá&|'»tEXtCommentCreated with GIMPW IDATxÚìÝLÛwžïû¿lvB‚›ÆnSœžŽizp;;î혙B§÷@t:R© UH÷*Œ´PÍ–Ìê†ìUÈÕ ¹ÚIrF%GÚT{&‰îv¤‚´%wUv »SèŽâ™;…mŠ§Ûšfj§šì$pÿà‡ á‡ù‘ÔIŸ)R¯?þ~?ß¿£ù¼üyR&&&&€¤“J$'‚€$E¤r’A@’"ÈHR9IŠ  Iä$©tº–ï·Ÿ„ô×§~­+áQݼu‹°¤ô´4m4géo÷|WßÚ–›ÐkR&&&&è:HÜo? éåŸu*Õ¸N)饤PüÀÒ&&Æ5ÓÄ1ýüÇe …9<]`™~rê×J5®SjF&!€„¥¤¤*͸N)™úÉ©_'ôž0°L¡«×”šn¤#¬Hª!SÃáÑÄŽ¥»`y&&&¤”:ÀФ¤¤&¼·A@’"ÈHR9IŠ  Iä$)‚€$EÀ|ÒÍÚÿ¿ïЛÏdÝ+',×3ÛTnaêÿ¾†tà~cÚš§¦*Ú˜6õ›Kª;èQŸ²Uùƒ­òw~¨ž‘ûíª*|ö1¹F/èlpœApŸ ÈÜ_ÒÍÚû⣊vþZEý£ŠÎú[–J¾e—ëF5üÝïÕ5Lw!¹±¾ pŸ1*?óš:þ0'ĉg¶ªéGO©4g•oe²èÕ¿(Ö;‡wèÜß|W¯•Z”÷gƒe‹Ö<§wÿW½]ó„JOéí}Ë‘¾‚ör¶êÍÆ"í4ÅÏ}¦HïÖnU®²µ{ß÷T½1MÎ?û_õŽ{ƒ „û+r÷¥èMIé›tôožQIÆ<˜­jú‘¤•®ÌIß ýµO«üÊÇ:ô÷…L©Öý´ÞÈìÓ o]U4}“öÿè›*üä¼öýݰ´õQt?(ˈoeí-z2×tægÿ*ó‹äêìÑžþ(à>ÁŠÀ},UæŒEþ<µ2§Ø´ü–MÛSyæezë®OÂòô¨}ÿ8,Ë·•3]ÊÝîP©>Ó_©ïÂUõõöëÐn-¸Äb©ö–tsú?ØçþÁ|­k%ëWr­&‡?WÿHìw¡ ŸËŸ‘-‡)UVG¶Œ—>×àLÀrSÞ®­°=îÒ×Aà>6®ðEþ¨þD¿úFîÍ«3¤§ÊÈM¾¯±Gà¾dH—4vYûߎý2Ý¢“‡ž–Kš q~¯ž†8¡Àˆ"9ÊiR`ªÜ­Êvãš¼#ã |<*mPùé_ÈsS’Òåx"[Òå´'É$)#UÆ™™ýtÙ·eq£ïs9€ûLDƒcÙªøF–úúGç/›¶ŒǰŬ‚­†Ù/¿ÖÐ'Ÿ¨kì|Ñ¡HW@¡œ‡Tÿƒù{ßUÿM)zÞ«Î?}Z‡_üR‡þeXÚú¨öoK‹ÛËf¶‘%ÚÓØ¨ü7Lª|þ!y{†¥G›lo8î¼”&óÆlåf^UhŒ‘p?H™˜˜˜  qO½ò†2̹tD3mÍSÓ‹mL›úÍ%Õô¨OfUþà!ù;?\:ÄI7kÿ¾ïÈm¾ýOþÎÕ ÿrMÊÙ¬WÝÛUñh–Ì££òüæßÕÐThê8Ö­:¸Ë¡2kªüÞtì¼UMÏTuô Í÷žK´gu:uô)?ë†||¤#ï[t´ø í:qA!¥ª ô5ç(üoïj×[áíýƒ»ãF8¤ß¿öÒ’ÇäÀ2ä !9•oWßï.O1©rü·bÚz^e'/j„úZK4ÈI¥«¸²T¹ëO´ÿ™ ²f”÷Ç´ÿ™t üæ2!Æ9Ü Ã´ïÙjüÓgÔñƒ4EÂ_ªûŸ~£#¿£à·¦AN°¿S]]=êóôËë)425 ™rír:]r—ª¼Ä)‹1‘#êo*ÓžöÉlÒZû¦:ªí÷A·ß¯×µŒ<¦^j\NhÝ­7;êd_ã>zÔÓuV]}ƒò‡ „&Ç£Á”+«Í®|W©JK‹Uè´È¸ïØß¤ö´ÏÔª¼—î­¯¹B»Î$I¹•oè­úü5é“dø¬ù=gÕÖÑ+Oÿ€|b%“ríN9]…*-¯PI¾™ÿEÀš œÿP5ç?¤#°bkä„=-:ÒtB]C ¤ˆÑ¨F^õ¼êëjÕ YU\Û¨ýÕ.Y¸XcÁþ6o<¶àxŒŽ„4ä iÈëQWëÉZ¬Úýõª,²­"¼ˆÈÛÖ5+Ä‘¤@[·|ÕÕkRÝkÂìîÒÙŽõøLn°f0ÉêpÊUâVµ»Dö5ÎQÂý-jl8®žÀB¥¼} xûÔÕz\¦‚ÚßT¯2›‘€¤±Ê=rÂê=V¥²šã ‡8ó ¨çDvT“'ÌMÀZ ª»Ñ­{Ž,o<ztâ•ôB}›|‘¾uÄ«¶îyªZÚÔáû*ûįî–f577«ùtÇʯo¥ÝâëP£û9½´ïˆZ{44âHRtD>=±O»žs«±Ó§µ:=G*ö,âÌgd ]^¨Ò1J’È*Vä„Õ¬Z¯´Íú­ÁêR©»\¥.‡lÖ\å**ÿO>¿W}m­:;·fÁÛªšªˆN¶4ÈEU#¬Fħ¶}Õ:Ò7;L19ŠUZ^ª2g¾¬Ö\™V(o []ꉡž#ڵǯS'ëä\æxŒ ´ª{ÞÝÉêêð©®ÎþõK@'Ψ'*I9Ê+d7Þ­[Ò¢š]Ç5pÛ_ 2(ªÙQÛΨ’/Ô¢“UöU•u‹ôSÍ¡¾Y›ÅY‹w«¶ºBN»U6³QRDA¿Oï€:Ú^W{_hæâH’Q[¾œ%n54¿¥·—*wæ4<:vŒg€ä°¢ 'âkUýñØ7êM…:ØrJ eKonίPC˪uÄ~7ÒuD§¿v3ÝX+ÁîF5œ[é•·S¯½Ñ¬ºö¼±¸ªt¬å”vÇÇhß!íkó/ã1 –¸å8Vw•Ê+]š‰rguÖ÷õßþ³ÇÔ>sK ríS-MU*ŠÛÇlËWIÝIu¾ñª f~Pë‘®eiq|]jóÆ~t<ªê%—We+;¨“µ±„y¤ç eÀ¢RRR¤‰ :ÀŠLLŒ+---¡cWäÕuä„bkqò´ûäQU,§^“1_ÕG÷Ïš¼m;3 ¢,[¤_¯鉭†1ëðÉY–ц٩º“'UžûÕÀ±#êL0M{ZÔ}*Kí²¸ÜrÍR×Yß×h|Õ×·§`¿».—f̯RÓþ‚¸ÎoUÏ “œ°¯;îÙäReI¢Á({ùÞ¸{Ö¯/O$°°Ü Ùº¥#¬ÈxtLÍY »ì=r"ƒ­zÝûÙº»I{óW°£…­\uåͪ9;9?ÒÛ!oÄ%çìß Êãñ* ),³¬6»ì‡òmlÄsׄ}òôöË),ƒr­v9ŠŠ”¿Æ· Ø}BgãV~6íW™e ™]ªo*WwÍÙÉP(Ú§g}*«¶/u¡êoí‹­NËs«Ä&I.¹]RßÔg%ÔuV¾Ú|åﵑ¿¿O¯_¡pTæ\»ìv»N»¼•¯º}±]•…Zê–ØJ+UpäÀT)6Ÿz‡"r[–ßYaÜ2“U¹†e¼Ø’¯B«ä HRT¡`XJ`·ž;ò¼ ûÔÛë‘7–ÙY.·Ërçïô}rÜ-?Ýó]½ü³N+E)£RRRéKš˜×D4¢‰cúéž²„^³Ì '"_ÛÙ¸ý'\ª­Ì_áÆäFT×k·¡r/ c¾•V³Ëyx°CÍGN¨=nûx¦‚rí­Û+·knÉ­°zëÊôÊô² ×Q½s²dþ‰jßiUì:냼WõV[•æÝ=Ü©šçh:÷r}G'K›½‹çáèû…ãS«ÚÿV‹ÜKlîéoÒ {Úšº÷‡ß>y{hôèô‘Fè ÌÛ†µøU55Vɱ&CÞ¯®×=±ÅZ©Ú•O›]{µ7﬎O-é´¶i°²~ñð%ìQ«gæ ä¨*™ºf¹*]’g&ÉQ›¯V ‹6QoÍwôÊÔK\¯½«“EK_÷½Ò7ùSÁáwtºÌ<ù9mÞ¥]gæÞ¯ìxZ&;Kµovh±œÊß{L ­™ç¹.U¾º_µeó¬´ ùäÝä'pO v9r¥ÉnT¡à*’4â“/¬e„ÃV•6•}* 2;Ìwèy»ƒÇ^ÐK­!I&•žêT“Ó(w£êÎjhªMå.9û÷¨êÄÔý4•êTgÓÒ×ìPÕŽCš¬4gPáÑN5Ïóü¹›×Qî²èžË2XÀ·¶åêç?.ÓONýZWÂ_êæ­[t €%¥¥¥i£9K?ÝS¦omËMè5Ë‹‰#uõÅ&û Å{U²Š/XíªkhPCCƒêÝr®ø‹ßù:êTñÒ¡'#%id଎׼ šæþ9™›å(‹»´Ð–&ÁÁnÍšêRÿ{iD¼=êŸùÉ¡ò‚¥.ð.ž‡­Dî™-A¼jëó/ÙÇÞ¶.M÷®¡°ò¶òe‘ÁÓª~¡fÁG’=ǵ§¢^]¡5ñAÎÆêh)¯Ú½Ê/6•î+ñêV_`ñW„=mqeÕª,Ž¥af×ÎYåÕzÚ¼÷Hyµ¨|-ÕÚõÊ!Ž$…)2ÉQX¤GìfŸ<êíóÎü}àÌUGO©¥Þ9sþg…˜œøéWw@rÚç¾SDC]Þ9¿óªËQ™ËxÛ±¾î¸Õ"yåJ¤ªÐÝ;›JÜy:>µüÄÛÖ§ Û½p ¬È€Z»§{РÂJ×ì•BÁNíÛsBñ·¹*.vÉiÏ•êîêš\q1Ò£Cû «¾ï‘¡nùf~²ªÄe[u›g©ò40µR) îÁ°ªí ¥ ayZûb?TjÖ‚ s‘vÎZ”Ó!o½sMÊ.Î(SQ¥*£)âWw{ÏTèg’«¼B³$ƒUΖPw£ö†ÕäjŒjw‰œ6³ÂÁAõ¶ŸQ»'6é?p¼Q]¥§UwÝÆüz½ùnmìç®7âí”'nOá Ëy™n¹ }3áÚH×>½àÛ©ýû«Uê´­Éój-ž7óö¿CŽÄÂRÉ Sn®òífÉ^"wÞ ’¤õuxq.Ö^P=­±g„©´Zssœ¯ä:¸üö“^þY§Rë”’µ^”V€‰‰q…®éåŸuêç?NlUβ‚œHÀ£Øº «Jò“`b.Ø©C‡b›Ý;Õt´^%ñߦ¯–"¾N©?0³‚c¨uŸŽ•¾¥†éYu›K¥Vɤ€ú<~ÕÙ矺æ~Å<ªnŸ"®¹%æBèMeZKŠ”PÌpÏÃVâVÞñ©òjÞ6õݳ&äg½å@›z§;ÙT¢ªY³ÂAu:·2Å ‚ÝÍ:Zçš U×ï—§¹Nug®þ«ú¡A_, 28Td]ƒñ”ë”+Wšê²€Ç¯HÙ僽jÛ/ªà¶½`ÌrÅ'9#]jóÖËyç“Y\UªwIŠxä?Û£@T’lÚY[¿ôB!EePáþuÇ—Ns©¤¬JÕõª:0ý™P›'¬Š²ÙÏ£q9×è×Ùcí±‰k©Jì+¼ps¡êkÚu<bD½í:´§]‡L––ª´¤P…®|YŒ_áóæ6#ê;r\Ѩ¤¼R½Z_+wÑìà©´"O'&“…z:ä«w.¼-Ø£¶™.ÈUiåœÐý+¼î?9õk¥×)5#“ΰ””T¥×éÖÔsäŸÿÏ,ùšeÅÄÑ/îÛÛ¹²æ~Õ—Ñ`ë‰X€`­ÔÉS ³'#§íejl9¥Ê™ÉþÚOÄ—]²ª°$vAÞ.ïíe„BšÉDL±cC½º­0QØ«®¡X_–&š2ÜÅó˜S^­µo¡"TayZºËq*Ußž³z½/®˜ÖÎf5Ï q&™åªkVsyîšÜû7îjsÊ]‹Ùbãì•*¡ÀÂ%§‚žVÅr—*‹n¿b‹k§bÅÚFÔ}”WË-oV“Û>ï¼­l¿êã+ÐyWS'/¬Þ¦˜þÙ ÂúJÙW~e¯:©7^uÉ4÷O#^õµŸÐ¡W^ÒŽï©¢º^M§;Ô;Lðž¬åófžçktªÍÓMªš'ü°•º5óq õè¬oá³ö÷´ÅʪYËUe7&Íup¿]½¦ÔtþŸ/€•I5dj8<šØ±Ëi8Ž_Ea–9êXþ6·ž~úé„þ•5 .o’;âUkÛt­7“J÷ï]¼l•Ñ©½û‹c{hxÚ50“’e/›üìÒÜm(ÂÞ.Mg"޽{U8ÝÐP—¼á¹§Ö¥ÁéL.•Ù}¨ßÍó˜,¯6ÍÛÖ7ÿm¸_­3³¾·»ß×Ñ6s>2•ê`Ýœ²k³˜åªÝ;çUˆÆGsîí÷+b”9þäÃQÍ¿v(¨¾Ö™ôarÏ ù.ÚâRe\è1ÒÝ&oÒ'9íÝ»ø=t̩˶¢K zÔ\S¡WÚcõ­åGÕ´š·¦Î/¿ê¤:Þ8¬Ý¥ŽÆETµŸ8¤W^Ú¡ï¹Uw¬Mä.=oæcRycím%Ðb×øà5¤î®ÀýîW_l9ŽòÜšã|Å×À}bbbBJaw+“’’ª›·n%tìò 7ÆÏh’àJÝòÌ,)’;™C³«*.Dð©7nâÖh/—kúo#uÏúÆ{D¾îéHĪBW¡JíÓTלoÇzûce‹œår,#œ¿›ça+‰û–ÿ@›æ[”ö´Æö/É-•{Ö¬pPýq'å–V.=kq©²Ð¤Ü¡½ÀÄ~°O­q«H\• ¹f'9jHò$'¯\…‹Ö4ÊhXÅý‹Õ{º^;jtÆ·CKñal,ÒZÍÿ›óËT×Ô¢îwßÒ©£ûµ»¼PŽ…ƒE‡Ô×zD5/<§ªc½óškü¼¹©Tî‚ųƒ×@W‡óæï‹+«æPUì‘$×`9–äMq“·Ñ°Âѯö䃃žØD¦­Py‰Ì­rÅ•  įêpªÔû[¯'¾dT@žéÙO“SEv›œ3eÊFÔß?¥”'.Üp–;—79}7ÏcÖ·üÔæ™;…VokŸbU˜Ü³÷åˆ ©ofã$ƒ%ŽJ)™åXñ&(1†ø%a‘Öf8FŽŸ£6šçÍ,ý=­±ÒU†BU:¾Ã—{VyµÞ¶¤.¯fÈÏשš‘¿»Yu/ìÐ+'zâBˆ\¾zJÇÊÛGj¹Œ69KܪklVKç9½ûözí`­v:æ¹Î¨¼­¯hW]›æV.[óçÍ\ùEZjáÞ¬à5Ð¥nß¹/Lx@]q߈/]v¡»y“ßò?>uZ= –•Åö· öªuf#˜Akÿ¼™Í”›»ôBG[‰ªÇuÄ;ù îèö«ºÚ¶àØtUÞ¶WUR\€„-oEŽÕ¥™/e+$7œÈ«d4.ôÏ,…VºŽ"¢ˆõk0"‘ÙmX\å±o¼÷Çö§‰ uÍ|Ë=¯tre‹Ñ^*çôŒ¥/¶?MÄ×Û—&¯\…+ØòãnžÇìòjíŠ_”ìkÕL1G•Jl·u b£À,s¢€Á´êMÐÍ[lÂ8Ú¯ÞÀ|"Â^yâÚ±9­·Ÿ§¿[-ÞU¼ÇH·Z’¹¼Úšf*ù{©ºlÏìÇZ¬Ú×ÞRç醻âÌ3Š”_R¥†Ózó`é¬:C­ÍŠÝ¦;ó¼™Õí¹‰Ä6º±sìè–¡±i(Te‘å®<7—µ¬9ÊuÊi’†¦¾¸îíP¸¢d{ZDò…V~öñ󿦻r—Ý€Ý>gÒ1×¥¢\i($): n_D®|É×=0µ)W®éÞ͕ڥ>¯¤h¿º|9 t{fVšXKŠVV.ênž‡­Dî¼ãš\”ãQ»'¬²2³¤ zbÁ¨ ²øö6ŒÆ¸ûQ$Ñ9âhtÕåÅÌŽÙÕ7lÔç ªÎnYU›á.ùf~²ªÐy{{þî6ÍZCf0$°!ªh4öß}-…]k·LrŠhðtöœˆ+{—§ÒýÚïv®ýµ‡ÕÛëSX’Ñl—«(ïa”½â N†µëÄÔݨӑËi¼sÏ›°ºåБÉq?Ô¦>•ܶÛǦ¡°zþýª’ä:$fyAŽÑ¡ —Ag{¦¦eûN«;X¢Š•ÎG|êXé·Ã2çš$MAgšŽ¹V¿˜ÀhWi¡I­gG4½?M}¾40½OÁ¡’™–Éýi¼I#ê÷$§Iý3ûÒ˜TXb½Îcvy5O»Gá²™ý=q›¦»T9ß’ƒY¦™z{!ùB‰Õ7‹†C«(«6}Ù…*Ï“¦+óyO·Ê箓}Å Õ}:¶rKTz[·ùÔÕã8öë­wa]PmU;¦JbIѾ6õ‡‹T´ª4#ªh8y.þ¶Ù!ŽÉµ[M‡ëTd¹3ïñµ©á@ûä¸2ëä;Ç–Y¾Î({yµ'M…ƒ! …¢šL>îÐóf%lÅr;ŽL¥!µõùåvÛ$ùÕ=36M*­.˜'ÈJ¢ëÔånTAuy\ù¡½Þ:¸â•á3êZÅ‚sÜê‹hȧµ™Ó6ÊQášYa1ÔÕ¯`Ø«îé@Ã^"GÜì¨ÕåÒt5±¡îAÃÞØ¾4†"•9Œ÷ÄyÌ*¯æi•',ù»[«ÒT9ÿü¬MÐGäñ&rC#ò÷y×à^ÙTZ]û1ЦæÞ•‚Hÿë:1×§ånݶ”¯[³rwq‚+®,*Ž+‰¥hŸÚúW;bCZÍ‚¶;ÊwZuGb!޵ü¨ÞóÉsw@z¶JÝßÖ;‡wèÜáçõ†û!å-¶œ!}“Ž6îйÃϨ4óö?›¶»ôîá:÷–¤Ù8w»So6îÐ;/n’Á´Uo4~W;s$™¶èÆïjwÃà~“ºÜÕÚû9p¦A¯® ʉ êtSתVe˜űðÁÛ%O"3’Á^«¯S]]êêOk¾S7:*äŒkw ¿[ýS?Z ]³6Ÿµ?·Ký]3Ç\år¬â«îwõƒÌó} Í*Ÿ^èõ¨µµo*p2ÈY4§ÖÖÔþ4·+9Ê«Û䮞Çdyµ©ÔwâˆNÏTi*Q•k¡ŒrTÅ„C¯ëÄ«bÂÝÍj]«ÂèRm}a, éÒ¾šæÄ&§g†Å Z^©Q{\¶äØ»_e·íïSGW܉Tªp9é„¥X³åL­|Z°Ÿü‹_„¿ëŒ’ñ©ìÕé¾™µ8ÚÝè^Ù>QË ¹ cß‹œiT‹/²¼çÒ‰¸pyni½;õ¼Y K¡*g£ ¨­Ï¼æÉ]a¿ûÏM€¯ZúzU:oŸ¸°8ó”¿Ä&#þÀ 9ž™ø¤¯Wù¶qù®ÜJ¢‹L“9ý–B+0&iìªZ»†4@s_K]ɋ̮z­Œ›á uéÀ®j5wû—.³ôètÍ.íëYƒÓ·«|o¬´VàÌ+:Ô\ðè°ç˜öÅ%Õ¥ L0[ä*5Fä雞áw¨ø¶¥-SûÓÌsl…kµkîîyÌ*¯ðÎLh›J*U°ÈÄ­±`·*f’½uíÛ§¶&Ð#¾6íkèQt ±¥â šJã±Þ3ª©ªWKpÉ׆;ÔXõ’Ž{bgdpí×ÑyVãD|m:Ÿã¸ —¹Êdny5Úæ$9ÆÜX1tæ´úø@E|mj8¾üòtÑ»ðP ´Ç&“C¶P¿úû—óoPþ­ø0˵·R±'Ó€ŽW¿¢–ÁDR½°<ͯè@Ü8p쮜³ªåN=oVöl(tÇÎe >xuTÅBÝ»úܸWÝ’ïý/ÞúœqåÕ Ö­rÝ ª#0>õ›T¸Ÿ×»±%n¡ƒA;kwèíÿf¾­ôšaëSz{ßã*þ“'tjßÕ¹ÃÏé—òä˜~Ì-:ÕX¤òméðŸ×›¥Ù“¿7Yôê_O–‡û›ïêµRËÔû´³¶Xõ¤)×÷õîK›d0=+­6WæU¾T¤·wèÜáçtʽUŽtîö½(ue/3ÊYÛ¬ý…q“çÑÙ÷‚žsש©¥SžA¿‚ሤˆÂA¿{;ÔÜX­’5:ᙊ»uòhiËÚf)mTíLúR×¾TÝÔ!OüLpاîæ:UÕ´ÇÊbY+U_ºð4¼­¨D·ísŸW"ç< Sâ÷§‰[º¼ÕÉp³Ê«MËUi¥cñåƒÆ|í=w£ÙµKõÍê÷‡‰DöªûtƒªvÑä\¹a kJZTrð¤j]q-zt|Ï•U7¨¹£Wƒ>¿Â‘ˆ +è”§ó´k*ôÜK‡t6~e˜c·N¾æ–í¶ ŽÈ×Ö+½¦U®àß^^ÍW^ͨ¼â¸ 'Ô®ºWNËœ}þîf½RuD’ ¹Ëy÷úwº&VD~/öãHŽÔìÑž=ËùW£×½+;Ocþ^­ëÃŽ¿ôœ*ꎩ¥Ó£ApjDôû4Øß«ÎÓª.yN5g₱¼Ý:è¶ÝµçÍŠF}a¥fâ˜P,x-¨\zߦdº€5sóKµÎóÍè`ÿo.þÒhà3õÝÜ$·uzʱUùWj¸8¾@Ã7ÔõËß«õ“qIWÕ?’¥·~ô˜Js.ªuL’Òîõè@ïèä5|ã1•g^Ö¡7¼š,jõ¡ö¥ç¨óÊùO¿“çfb}aزM{¸¬†£^õIRX‡~™-×ìr™.jM fá®I]ÝËm*kzKoÝ-W¢iÁ¡‡ßTçɩ͸ÍN•æ­ò*ljn9ªŽ¹k<晌´–ê`ËIUå/1it¨Ì5»=g©}þ•)ñûÓL~ÜT¸Ð±Ëu—ÏcVy5IV·[ù 5`–³þ´N½Z¼DpdUéÁ-·®ý&aF›*šÞÒ[¯ÕªØºœ'|Ê÷¿¡Ž“ÕZh+ ˆ·M]ñ9ÎÎ"­l]œòjò¨5~O!³KûOîWáœNŒ††äõÆB“«V§NVËa\zü¸+â;cDC^¯††| ß‘:k…Â_õcÍ,g}‹Þz­ö¶~\â᤼Òý:õf“ÍBîÄóf…cÉUéš}…»Udþ Ÿ›_ÃÖ'ôfÝ7Uÿ§ÛU·m\žó©åß.+º-_õº]M?úžöo[l:ü¦¼¿ *²í!9Ò%ƒå!¦_ÖÙÀœääæ°Ú?—ó™™dPñ3Ùò¿ÿ™Þ>¬î@,䉾÷F– 7NŸKDžc«ˆr­&‡?W\кð¹üÙr,£´•Ùš#KÖjþ?vèÜáɽ?zDc¥ÝpÏXƒŠxFÙJêt²¤Z¾Þ.µíP¯Ç§@hdf2Ð`²Êî,Tiy…ÊKœ²Ìš ´©´ñ¨rý’Ùn›3¹o”³¡SïÖOÿ¸È$¢­D -飯»Mm]êöx‰J2)7Ï.‡Ý!W©[î²|™¼®‚Ýûµ;×;y»J ½Ò¢ÂÚWµ»/ ¨$C®C‹Î°/ãºîèyÌ÷Ä3ÆÝƒ¤|K–Ü–¨ÚþáÚ2Îu|ú”'ÝWèæøÚwI†¤ð§ªûûO䛕EÝRx˜sïð5c–½È­ú"·ê—ùJ‹³DeÎ…þj\<ç˜s¬½¤Jõ%UË>‡y[˯P]~‚×PT¥º¢eµžðuÝÙó˜ÍßÕ¢™BU*YAé-£Å©²j§Êª—:Ðx'|²9ËTå,SÕ=ùÑ´ÈUÕ(×'o´•¨ªjé¶Šª©¨zmÆãÊŽÿª˜e/ªPuQ…â/?"­ÁØ[ýóÆì¬P•s5—ç”»Îyï_Àj¤g«$‘ =ÖdO¿¨…Ê“ÝVû'©:üŒE¡­éòvÏúŒ\¸ þô§´·,GöáOÕ\ìMÍ*±¦ªç“ɰÆ`Ý"GFT­WæoBEr”Ó4¤ÀÔ›çn}P¶×ä]F9´p ¬°y½rÇF§JëK†­}6¢c¿ÒÈM†Í½$•.ÀŒˆOmqûŠ$²i:p/bÅÀý$C¹Y –•µD5“ÉÕ6ÆoýgUç„ÕöÉiÇØ°Ú>I•ë‰,~sQ%έâŧTù *Øž§¦—‘ùãA] üùäumÒÁ*ÞjVóqýAŽü½©áKôÂÇ:})Gÿ›Såߨ —Ó¡£/=*GxXBœ{N:]€i‘Ój›yê¸TYh¡S$¹ JZ*Ìh©íG.\PÿUøTž±…Žº)Ïo®JƒÚ>]âÔ.©éW7åvªÞ|C¾Ϋ¦í¢B 6}Y‡þî· »·«ñGÊ<:*Oï9íé ky[^_Ó™¿ÿä~BõÕ…2߈¨ÿ·ÿŸjþ骢 ˜{NÊÄÄÄÝðu–Ï–)× ¨·GÇލgê b*}MMEËÛoøšxê•7”aÎ¥#’„õOþD§v=¨…¿šQ÷›ïißïF×äýòJ‹ÕæøX'.,¸"ǰõ)uîNÕ¾ÿûwò° ó¸é÷¯½´äq¬Èù: v«aס؞8±Çª÷â¸7~÷;íøÝ]x£Ìl¹¶mÖÞ¢,õÿãçK”UÖAæ0©ø`³ªíôÄ3ääéà­Š¾ÿïªï§H¯3£]…¹ò „•Iy®RUÕî•ÛÉÞ80WôâzáÀ‰{á÷zîÿ¢Ï°z9_gf§êNwªŽž )¥Òɉ  Iä$)‚X¦””ib‚ް"ãJKKKèX‚X¦Ü Ùº¥#¬ÈxtLÍY KËôÓ=ßÕÄ1GF511N‡HÈÄÄøäsãÆ˜~ºç» ½&eb‚õ°\¿ý$¤Ÿœúµ®„GuëÖ-:À’ÒÒÒ´Ñœ¥Ÿîù®¾µ-7¡×ä$)J«$)‚€$E¤r’A@’"ÈHR9IŠ  Iä$)‚€$•¾Ü´ ëüð¨ÎÑ{¸ïmÏÉÔöœ,íÌË¡3w]ÊÄÄÄD¢7x>Ó§#Qz _;˜ jr=DGK«µù®âàkëÓ‘¨Ú|WèÀ]•pã ]§·ðµF9AÀÝ–pÃj|Ý}x• pw¥Òɉ  Iä$)‚€$•~§š-û_¶êÏ×IÑá__Òù‰¸?§µ·È¦gÓ% ë'ÿvE„ÛÎPùyX–)iä’þÒ3¢«óþne˜ÔXô€“$ë÷ï_ÐO¯Œ'øâT}ûOòT»~%×»œ~¸{¯ß°a½vXÒ•1Õ?ûF˜X»®¾“mp/I§ c±¬Ÿ q$)UÛÎÔº+×uýkÙ)Z·i½*Î4¦óŸŽ(pë^h€{ AN‚ÝäzØ8ë7†Mëµ=íº<_YÈpSï}Чé)º®`Òj_î´¤ r6lܨ=ölm_Ÿ¡lÝÒ¥ákêøøŠ~_Q{Y*{,GÏæd3¤êÚXDŸ‡õ…õ‰†0YÙÚ±nò?/Ç´Á’)ƒ²´cSª<—n?¯u6hï£f=¹>C7ÆÆäùtXÍÝ(%Sù]« S¥k_\ÔφMú¡}ò ò_S‡÷²ÞS¶ö<ž#×ú eß¼¡ó/ëä\WpêÖ}û ëìÒh)íùöCzÞ iø 5øzñ‘lm7¥Kш<Ÿ†tê³ÈÔ*¢y^/I)ézÒ¶Q;ÎÒ#™i2è–†G"zïÓ+j¿Õu¥éû®Gô²iúB2õWßÝ&¿÷‚þúbjÜû®œ®>±QOŽ}¡šßêFJ†\öÚ¹%Sy†4Iãºv=¢÷þxE¿ Do;p3ñû9«æ9>÷€{ÄrRÓõŸ6e)#>ïHÍÐsƒ ¥è‘­V5=¿ò%Mä¬×ËßZ§í~ýÐò–¿¬Û°IßÜ [Üï²3ھŨC›³õósŸëW£KoÀbÝbÖ’¤ˆÚ?¾¢'s¬*L—¶?œ¥ —®ÍZͲáÍúÛ'²•=õ³!3SÏ:¶èÛ‹´Ÿ½y‹lŽýlËY¯š§³ôbj†rfîT†¶?ü þ:úGýõ…¢ˆõ›Ô˜“.ÃôÏ£ Û¢uÑ?ê§—êÇT=ù¸U½9}Ö=È1­ÓŽ'ÖiûÇŸ©ñÂM‡¯kȰNyI—ÿË1½?6.)î¦fšôWßÌV^ª¤±Év¾ý„Uµ–´Yï—½.KÏ;²ôXêuà³[‹´½ÂûyÛypï¸ +r2õg[–>ÌhVÍTˆ3|ñs5z¯ëª!K/>¹E;Ö¥«ðñMúÕ{—t>Ñ,'Å OLOúGõ/Õ><®6oÔ_>–­œÔ,½üx¶<¿Y¼¬XŠAÏoɘüï/¿Ôû£/ßRáæ4iýz=™qMÿ:«¤eiÏãS!Îø˜Þþð²þe,]Ï>fÑŽõ©‹¼É-ûè’:FRUøèÔ±©ʉŽèç~© Á¤>¾^6I¶-Y²\¸1µ*g©é ø/é—oH¦ ÚëÈVŽRõÔ#YÚpikÎX§§Bœk_|¡ÃêjºAßv<¨?ÏIUž}£¶û?×ûÿñ….?¤Ÿ>’!)ª_¾ÿùd‰¹”øÛž­¼›ý>Upø¦”eÒ‹S!Î¥‹_èħcºšjTEÁƒz>SÊ{x¬Ÿ]]¤íÞϹçÀ=$iJ«Y6™•'irÕËu'$EFõKï5}ÿ›Ù2¤géû¦Op3—Œuf}{j9Ê¥O¿Ðë—&Ó–àgAýõ™:°9MZoÖ“#± f‰v>òêª&tý×um³YÙÊÔó›Òô¯ŸO¦KëÍzr*¯ùÈû…~qé–¤ˆ~1¢¼¢´}¡7ù2¤×?ÕuIŸY;žÌ’$÷†ô«+ã’n¨Ý¶^µë%¥¦)#‘¸~Yÿý#“Oø²ÚÎÖËë$¥gh´@xKb²×gëÉœ[ò\Sç€_­K•4¡`¢AÚøuý÷ß|.ÏLÈ5ªSŸ+Cò*p+E²S”1o¥¦+#EÒÄÜÏ›‹œ÷;äŒèð¯/é|ü}ü&“¿Ð†õÓ%·Œz¹h›^¾­¡4Ù2S¥DƒœÌé²d·t>8kf_C_Ü6§IJ×c†ýë…Ê«¥è‘‡³§ÚÓÛ—'SŒ#aynšõlºôØÃëdù<¬ ¤ ë2¦J™EÕ7—xÜÓ¹ëÒöuó¿KtìÖ̾-7f’Œ[ºײsˆh4®«Æu5‘Å(7®«ý‹›ú«ÍéRf¶þì‰lý™¤k×Gõ~0¬·?½–h÷K##:Ò·¢z8Eß{d½^¶[ôŸLqeßÖú~Þ\ä<¸‡$ÍŠœØö*ãòGæ &ä_Ve¬”ÕŸSŠQ;fötÉTmÑ6ÕÎ=Æd֓ư~¹†Ã-yÎÿQ?ögëù-ÙrYÖÉ–.e¯ËRá#Y*´èoß»¤÷Y•3>>;|J[§ûA=.I7tþâU“lêÏ×ßÁû9÷<¸‡$I3¡«#·¦VUDÕ>pQïM‡)i²®KS†&týú-Å%>‹º1Õ°2•£4m·¤KáééüT=¶yº8Ù-}X°u9ëåZ²‡ŒÚaIׯ>»©«×o**ƒ 2¨0'MS%×”aÔÓë’0dddÈjH‘nŽ©cpD¿”Öeeé{v‹þ|sº”nRÙú Þ¿²ü¶-›s¦Bœ¨þá7Ÿéì¨$¥é{ë®ÝOî5I³"'¼®Kô€2õâcÙú躂©}Ïñ ^¶¤Iã£:ñÞE\^qãzXïE×k‡Azà‘ÍÚ{=¨öáqÙ,›ô—›§VÙ|ù¥Þ_°½T=öpÖL©´·?¸¬÷ãW¥f¨ì‰\=•*ÙlÙ²|vUÁ/¿Ôûãëôtªô˜c³~8~EÿMÓ³ZÞ'‰¬Ë±¨é‰LIã:ÿñú.F¼yS‘[ÒætI·t}\š½‘Mª,I£K4žš23äžÚ”)Oð–r,›ôCÓÜço{Y÷3…6àþ<¥ÕF¯êuÿ:°ôÀ–Íúé–ø?ÞÒ9oPï-§FÖDTí\Õ“ßÜ › zöq›žÿûÍQýüÃEö|IËTÙ¦©Õ?_^UÇ¥Ñ9ÇŽéFp£žÚœ*­3ëÛYWuvtT¿øèºžt¬“!5S;ž°jÇ=4®^¾¢³êùÌTmt‹šsÀ—Ãjÿr2h¹>rKR†$ƒþü™mzÖ{A..Òöð¨.É ”ªíYõÓÇæš¢éu5ó¶Xåýà”š<§2®óðë'\ÕïGnèš$ß’øKýü·ŸégŸß\v‹×¯^Ö÷.ª#8&t\’tm,¢óƒjxï¢~5ºp® ›Öë©©ÿþÈ?:ïž=CG•$eèù-“1D0ð¹þêýaûò†¢’¢Ñˆú>º¨ŸÜ£áÖ˜Nóëä¯k(zkêÚ¤kш~ÿÇ/Ôðþ— LuÙÕ`P?F§Ž¹©á›‹—4»qíŠ\Õù±©ûp}Tÿü¡_?JçÒש"'uѶWs?¸¥LLL$4ûýÞOè-|íý¢x¸kRé€äD¤r’A@’"ÈHR9I*á ç‘l½…¯µÇ7dÒ €»*á ÇeYGoákm{AàîJ8ÈqÛ7²*_[dä¶o¤#wUÊÄÄÄÄr^Ðæ»¢óÃcúð꽇ûÞã2µ='“ð•Xv€»#•.HN9IŠ  Iä$)‚€$E¤r’A@’"ÈHR9IŠ  Iä$©ô+W®Ð €5“‘‘¡7nÐøÿ6,aãÆK“2111AW$J«$)‚€$E¤r’A@’"ÈHR9IŠ  Iä$)‚€$E¤r’A@’"ÈHR9IŠ  Iä$)‚€$E¤r·ùøãéüÿìÝPTgž÷ýw»ã½Ý‰¡™š™±nˆdLH‘5HŒ ‰uÓ&y@S¢N‰© f6˜ºo౞æ)Ág«"ÖdÕÊwFI5£r.Ž®¬Ôtt$kK) M241ÓÒn5ÞÐü”_ÄŽù¼ª¨’î>ç\×÷\ç€çËõ½DDDD$(‘#""""""""""" ”È PJ䈈ˆˆˆˆˆˆˆˆˆˆ(%rDDDDDDDDDDDD”9""""""""""""J‰‘¥DŽˆˆˆˆˆˆˆˆˆˆˆH€R"GDDDDDDDDDDD$@)‘#""""""""""" ”È PJ䈈ˆˆˆˆˆˆˆˆˆˆ(%rDDDDDDDDDDDD”9""""""""""""J‰‘¥DŽˆˆˆˆˆˆˆˆˆˆˆH€ šÈƒu6emÕg80ó²íiòbŒ·õ‘‚‰›‘sõ›«>Ãq¸âæÃªOi¸zŸéå¡tÓ!Ò{nzÇ{áóë8|Y'XDDDDDDDDDDD¾¿‚îæÁ]/]ÝLÝ¥o1L aõ¢‡uFDDDDDDDDDDDDü&nFΔi¼mû)Ñ÷÷›YddÇnu—¾Àw©“m»›±$õ}æeÛcÄNÑI‘+Cc IDAT¦ š‘s•“ÿû$þò )sc°MÁz¥™7}ÎÍI¢Yò žkß`?ò¤ý)–ŠÿçG˜oûØ×iù¤‰‚ÃN=ßb˜ŒmÑÏɉö¯½sùUgÙ}Þëš™OF‘»(œS€ËN2}ÛòHêª?å\Ì/¨J:òþDDDDDDDDDDDDÆÉÄ$r®~Ãó—q]¹Låï:3ˇù¬§‹Ý5qô|ésZ®þè¶gæx²«¾ 2åç”=2‰öúÿfCy ÿëi§^¦jw=;‚"(X‹åJ•ÕM¬(ŸÂ¾L+!×¾aGÕbã#'fê(ûÓ€‘ñ3a3r\WúïÆA4ßô%l0“ÔEeÿ—®øp—C»¿Á4œ§~Bœâ¬&ž¸Œ5¼Î ìøK0…ëfø“0ýÚ7ØËZ°»­¤|‹9ñi ÿ®;Kãu ¿?‘ñ41é‡)&ÊÌÇ~BòVR &l t:/áºâfí?´ÕTW Õ` nºaLûO4d*iËæ’xçÈØæàC ÄÅ>ÌòøIøœ_sàƒÿÂÀß°üÍ¿g—uòˆ{mÝ#ÀÔ`rþñïI¿ð%µŸ~AÍÇõl«þ1õqWÓÃlýåt"Db懀Ë@Ðd,AýÚ1ÂþRÍP"""""""""""2~&Mìá®Rw¸•ÖÞï}ØZÙ]s‘ʆ.à*wŽRRÍHäCà¼ØEû€×¯ãøô>ÓX‚ ÓqŽÂc_cžn%ã¥YìZ÷ ^ú’ݽ˜­`òü×ýS {¨ûËân£èc'®«Cu¤ý‰ˆÈ=Î{ŽÂÔ§yú鞯 ªÚ¥m ä%w·+1ÏNÀÿTr×’écZi ß«Ÿ¢ßç¶‹ˆˆˆˆˆˆÈ÷ÎÄ®ìrõN:¿ÓG}ŸuÒrõ'Ä[²l /=BĶ&VìºÌ›ñÁ„]ãÜŸZØvú ¶(b§€›o8Pó9žûcIŸŒËÑÂ1„iAÃ!3ä~Ó/=LØ•/ØõñE1¿À:¸vóQ#ìODDîm^G%5®þ¯8¨¨mÇ–¦àˆˆˆˆˆˆˆˆÈ1ÁÙ‡«´zÆøÑ+ߌ2#ŒÖìÊšJÉï.RR~“°„“¾4‘Õ1FÌÑSœÔ@ÑïìÔ\ƒéARlñä†OLdþ2ªÎR²ûsõsÊæOë.Ë6„‘÷'""÷./ŽªZÿk­ª¥=#ƒ‰Hå´WØX¸¹ˆfã¡ RCtVkõQDDDDDDä^7Á‰œÉX‚r¦ËÍ-3 ›LéÏNÁšð>a$1õiö§·ƒ`23Ÿ%s¨÷¦ZÙµÁzkû‘{“·‘ÊZÇ0“9–FŽ9ÖJjZ2ÈŒTˆn‰9â}ûðsؘ~æ«í"""""""òC4±käL æÍE¡XGKM%eÑ â¦è‰ˆH`pÛ+èÉãXäáÇIÕþè– #,,Œ³Ú."""""""2œ _Ø%ì©YìJ‘ï7 •uø°b‹&ÒœAôæ"€³f?-ÙÙD*P""""""""2΂‘Q¸íTÚ»Ó8X`›a°EC‘p êÜjrf Sd«ó0/äã"ÞÞGUÆ0+긓ù\>>ç¥!/•5ýWçqÿÂÓ䆄2þ½4nÈò^îsûÙ±£’š:.`²1#Ûê7±ÅR¬³ªÝ»Ø_kÇáôt—3Y‰ŽK -c5 âB†ÞÞk'ç¹,Žù`æÆgWª™N{›KvPãðôµ×{’¬¿[‹°.ßËÞìÈÞýõ­Ý26 [ÿƒÒDã]ØOeåêì 8\ÝçÏ`²` ‹&vA:™¶D"l6ÆXÐöñ‰ay©+¨ñ@tî!*l!x[wŸË“8==ç2Î.Cn¡¼Ûè}<´z? WÀ3ÚxÅKCáBV|è¬,ß»ŸìHpÎä¹üF0Ì¡ìßKˆ£…ÚÊ]쪪õÇÁ€ÉMbJ:Ë3S™1Ú¬&o'ö»©Ø_‹ÝáÄãƒÅJdt Ò3±%Ž2–½íœ¬ÚAeMŽ–V\žîó`Œ&1}5«Sg ‰U""""""È&)"""#ë¤(ëæì§eÔ{i?œÇÒ¬ÍÔ8<€vj ÒxaÅvר{“8Ý}pÑê¨ãÀæµ,y.“Šswæ¬_ }´ÎcÉ’|v×ø“8½çò›³^ñ\Þc´dS÷¿[«jiöô:¨ªquÿ;†-rˆ8“·d ë¶èg#5»óYš–5â9ð¶ï'oÉ dUr¬±;‰às9qÔ}Èæµ y.kç† €Û^Jæs Y»ùuÝIœžóÐÚxŒÊü¥ÀùáJÓö‘7¨Án{+òà<5.…ä9 Ì4»i´×q²¦ŽV¸Žm 3ÏÌþ’äag3¸w³®²¦{_¦¢#ÈL°ŒÚã°´Rö&ú†ÿ€«–¼¬m8 q¤ œVCË®lÖpvcˆ aAɱV,.gµûP×ê_#›ó*I¬Êô'çn=ÖCö{z±%›8pÀ­UÔ¶g0Ô¤oceïºQÑ)ÜôŸƒmYÇp¸S4sRHŒ ÃÝp’ÚcÇht;›W¬Ã¼¯ôæw&/cÇüÇ0ÍL!-9Ž™Vp6Ú©Ù_ƒÃ>û6–fº)¯ÈfÀ¤¸ÎÃäe鈴' ›ð2¶ä8"-àj±SSù!vÐú!9EÉì/LÔÌ HJ䈈ˆŒ¤³ŽÊFÿ¿£3Hîÿ´:¬_y5W UŽbÇ?“ãgÄ`èûÎ0ÒG=.|–ï,è×ÞXâ“Iž¹‚%›€‹ºZ'ÄFömçm 4¯'a!¥¸œÂä¾§ë©iä䜤0c-:Ás¬€"û~ ã†~üÝZY XY°±”ÜÔȱ—ÿ2‡9Üuo »òüI,,(.&­ÿ9ñž£ªÒ_–ÍGîÞ2l2 iØ23ÙŸµ„ v´Ö`ïÌ$2ä6c}SûÆ7†Î5`IaãÎõ¤†ûËT£3üçÒCÝþ¼±3n¡ÄÚH}4mKÆtàZ©ªm'ã¦LŽ{E-Ý9–™¤Ïªüš‡ 3ßfgYF_’%ÍFf^;‡óV_ã_EEµ$HhuR»¡'‰c"!·ŒB[¿h©62W§S±.‹Ív´îfÝŽ´%úŽíîI7óí½”eôƒ©Øl©,Ɇ<µ•4¸IT&GDDDDDDJ«‰ˆˆŒ ýX%=yœ™ésÍ:cNoy5µUŽ)¯fáåâÜI'ŒD¦­&ÎÿÛéÐ^wÝø§‘X^.f}òÓP̉ä/ÇêïsÍŽ“tŽÐ’¸õ;)¸•$Έܜ,Êb[w‡è7ËÈüäÝ×<0%¿É‚!—w #9=ºwŸíãXõmüch"¥0·_§OdÚ›$ø30n×ø–®3FÛHñOž²¼šÛNeO–$.“äáf,X_œÁÍËG…‘º~+éVÿi;¶‹ÚþAh¯¡Ô¿Ó‚’IœÞ8Æ’Q\LŠ¿ œ³jŽÞíÅÕÐÓêhl)CŒAs™Ëç03:šèh >¯îw""""""˜”ÈV;µþ¬q¤'Üü´:dŽÞTNm%ð0Ø’‚-z˜Ô‰Á‚Å4Ô^5vÿ&,ÏŒ6ùbœ‘NfO§ô{x>øX)¬N ¿³QµŽuþ,‰iN1[3‡z8ŸLÙÿÈÿøGj ‡ïƒ×í»¿14¥>s˜i"3Ö;5ƒÄmNo&‡ÚA™·½gÝ(s–Ç [’Ì”²zø$qËWÏôÓÈÆ¾…jÚëªèžWeÅ–9üþ1DZ<ÍßN»³xz¢ßº¡Wú‰Ì(aWE» †o§ˆˆˆˆˆˆÈ]¦DŽˆˆÈpÚk¨òWé".Ä¡ô†Ì¡oRN-°jzda·<ÆEÃ9rÃ’H܈KÙ„—Ð3•¢eÀÃó¢ç=N•æÜ %dù“$é”&sëÏݽ´Ÿ;ÉþÒ<Ö9î@àï@ #ãˆ6††;8ˆŒDÚæÐÝ…îòj}:9¹Ë¿n”)™Œ¸á³I±)#ÏÆ ‰K!Âÿï–“íþbnZj{ÊãEm褳s¸/7Æhk_ü]Þ¾ö§ô´ß‡}ÃBÒ² ©8l§Å­[›ˆˆˆˆˆˆ|¿h‘a´ÔôÌ ìëxîéѶðQWÑ€;îî.šn0™oý¿·_‰1K4–Q0–h àÜ8Ý^âq½Á2>©†ÎÃäeUâ0ı¾4‡Ñ—"rsîd-5µu8-´´´àôøîlàï@ 1›ïhºf$ÆH)–©tùË«edt—ì·n”)%™ÃöÓB¤e”Ö[" Z—ÓÕH\=ÿôÕ‘¿ð…1¶Ø‡Ëíë£16‡­o;Y»¹à¬ûÍu²0X¢‰KH %-ä¸H´4Žˆˆˆˆˆˆ2ÍÈR û«œ·¼•¯®’†»ýÿ·5 Æ×·FˆÁ0ú.ŒÆÞí¼ÃåGÆãé¸÷¥Yùþ2^”“6ò&î† ²SŸcéÚ ìþ°†ºF‡?‰cÀb&.e9o§GÜÀ ã´ºÐí£H¤Ü\^­oÝ( i¶èZhÀ`4Ž:XM=¹ŸÏ_–·û6Kú¼Þûž‘Qʾ}eä¦Ï!ºß )ŸËAÝÝlÈZÂs©Ùì²wê–'""""""K3rDDD†à=WÅž<ŽõeÖçŒ4ËÆ½t•­€ÏN¥ÝMbòmd1¼=²ïf#àÜ.ÜŒœ‡ñºÝ}Ûݱ)#ÔnÈb·ZÔÌ·ËÈ%®ûY—µ{O…³¸—Yþr2q±±ÌëÛÖ{²‘Í•­?€~F"¤`©¬Äå/¯–‘AߺQÖtl3FJÔ¸q 7Ó¨‡ÏË®úf’ùã`I§|_3¾C>ˇ-'[¸Û°Û휬­¥®®§pÕ±-k-ìÝIf¤Q7? 8J䈈ˆÜÄKKU =Õf®^MÚ(+¡ÏtWQ¹¡ðQWiÇœ|ËR¼.Gï1'œÑB´ºkPÙiñfŒ°ÎŽgïâñb-Æ;s*Ö±®¦»V™)¥˜âŒÈQç§´Tîð'q Äåîe«-lâæ´\ Ç¡K3l,°V²ÛÙ]^­%ÑGOþ+"=…È·öÐàpAìðS¨¼-'éÉ—Z"-þse&,Ò¸[Æõš0‡Å’KrZ&Љ½t-Y»€ƒ¥¤—Ä¡TŽˆˆˆˆˆˆ•VÌë ²¦7ƒ-!dÔMBlÌìùÆ^ÉÉa*5ù|ÃϹqÖÕÞ½D!ÄÆù÷ÕQe¡>œ·‘ª“þÅ`,qÌ´ŒkÜö"²6ûb‰XNéúdF? nZìþ´€!™Õ †Oâ¸]î{>†ã#’´ŸZ+ÙQê_«ˆh2SÂFݺµª–öáƒ@coÂÔDl¢ÿ8‰žícÝ#žs{ai©©¤eÒÐSYÍ{ŽÒ¬ l6™µ¸‡9_q«sI1ùålÁ­»Ÿˆˆˆˆˆˆ %rDDDñ6VRÛ³hýÌtÆÇl}™*ëúerŒÆÞëµ ™ã鬥t—ó®ö;Òf£{åÇŠvô=Îí(ä€?>ÖŒ{5ªö*Öeè~ÀoH`}i6±·| /Ã.³â¶³c‡ãÞŽáxö)-…î‹“šcþTcÜò±]Žm:«émØAaO,)¤Ïì ‚91“€‡š‚R†Ë‰yvPð¡§Ë…ÓœØG£Ú´¶¶ÒXSŰKà¸Ûqõ\ëf‹f㈈ˆˆˆˆH@R"GDDd/Uµô<ÛK#dLۅЗɡ±ª®/ac°Û3㢱ˆü] þòßÛ²Ÿ¼¥ë8ækÝ8=w ëa6rz¦'8+ÉZQÂás½ oç9jK²Xѳhi9é‘ãûðÛ{ŽÒ좾òhofík¡¥e„¯öžš‰ìsŒ’m 7Ͱè´ï"'#‹}±ì^Çeœb1¼e£ô12 ›µÿ ÒÇx]ø¨Ë_A^•vwoh8\ÈŠ»i¥ï<HÖ™ÈYퟕãü¬Œ<ª:û%çÜ´.aEVÏ !+éo'ô+gh%%ÁÑùêÈ[[ÈþsGƒûÜa ׿cï¹Ö_ž‰Y7@ @Z#GDD¤?·ŠÚžògq¤'†ŒyÓîòj44Vr¬3 [`œAú›qTn°>ìÛVðÜ.+Ñ‘¼ÎFZý“¢—o$®&ŸÊa&æzW€w²-#•šh+æØ\¶æÌ§D€™ÄÜR–·¬`·|ŽJò—VL&žû#H/) 9d¼ãï ®µçöÍY,Ý<Ê637òï»R1‘éo’P™OZ+Wð\M4q3­˜|.ZZ]>ÀDÜ‚XΨÇYKp&Ûxs}_2áöc1£±÷1’d›•mÛzÊÖ%7–”‡‰™qfíNjв¨)ƒÉ€Ï3°¼ %¥iƒË´‰Ì,f}CŽyÀYCÑŠŠ &,fp»<ôíÅÀÌ·Kys†qÀö3Vç2§¦;Aês|Ȇ¥²‹¯ÛEÿfÖ³>5D÷? Hš‘#""Ò»¡’ºž¼ éÄÝÊŸè‡$Þ;)ÇAÕ±¾ÕAÂÒŠÙ™›â/»xœ8{’8Væä–³sõ FZ*%$ùMô|ÀçÂÑØHCË8OÍ1Ç’½s/ë_ž‰©÷Å CôÖ—W€óBR)®XÏËÑþbv.öcÇ8V×H«Ë‡!"…Üû)ËÍ!³çdøœØkjúfŒ|×XObx+}´&$÷ŽMSJæ¯ 3ɹ;ÙùvBï¶“8Þ,£¼p¸õÂH+ÙKÙ›sèäóàê—Ä1D¤ðvÙ^Ê2†˜Õ’LaE1é3Mý^ôárõK☢Iy»Œ}Åi„éö'""""""ê¾7nÜPDD¤¿ .0}útâNp·ÓÐЀ£Å‰ÛgÀK\B,acRãmÇ^[GƒÃ a"£“IŽ5ß¹¶Úí4´¸pK$3â∠û> òÒ~ÎŽÃÑBK‹C˜•ȸD#ûµÝÛÂÉš“8\`‰Œ%!9v`Ba‚ˆxl:¶éÄNÜŸ“Q|Û¯žÅt ý‘ÛvíÚ5:::0º¯Šˆˆˆˆˆˆˆ¢ëׯÓÑÑAhhè=ŸÌ™ØÞM1“kàØé³r,±‘DÃl¯ÓAvÕD¦üœ²G&Ñ^ÿßl(o á=MâÔËTí®gGP«b±\颲º‰åSØ—i%àÚ7쨺@lücäÄL½ùî/ÈÛÞDÃ#ѾŒÁy¢ª/ñýØÿ‘‘ù«Ù¸ÿù$öÔ9ìzÂW/Qô›&ìü-…/MÃ|¥‹Š*뎆°ï¥0ÞV?u‹ˆ|]]]Üÿý1iÒ$î»ï>EDDDDDDD$€Ü¸qƒI“ºWŽéêêâÇ?þñ=Ýß M东³NçÍkŸ³«Á‡ ¢c§³ÀúWN¶™I ÿŽÙ÷7¸‚¦‘óÔOˆ3CœÕDØ—±×y ¦pÝ ²ã¢_û{Y v·•Ô €o1'>Máß iÿ“ƒº Ÿ²sétb§ÓNaç1V|Òýþ¨Ç0÷ìiRoøæÆb{ê§Ý3p0cøÓ²¾ºvÛý‘ïÆçóa6›™‚0.ÓÐä`sÀì«æ7}òmÃøðtlÓêY÷ë£Ì|ì'$?a%å±`¦@§ó®+nÖþÓ¡A[MÅqº«¨ˆ›nfï×q^¼Œáá¿%²7ß4™èÇÀàOä¸G;†yÐËSL¤ÆO¦áâçT\¼„ý³Nê.^ƒÇn¿Ÿ""òÝÝwß}J∈ˆˆˆˆˆˆ°I“&1yòäÄúÆ”ȹJ]?‰àùšcõ_úŒ~Iöt+æ!ö`åF€©Áäüãß“~áKj?ý‚šëÙVýc6þê)⮦‡ÙúËéDèõ$Ì— ÉX‚&—nŽ|ŒÁÜ¡`»š €ÉóW\÷O%ì¡î/‹»¢¸®Ž¥“±>2ßgýÚxǧ¥gÅŸ[=†ûb3®ü”²7Ÿ&oÎOI´NÅxå[|£´d¤~ŠˆˆˆˆˆˆˆˆˆˆÈ½cÂf丮ŒácW.ãò)$¼ôÛšX±ë2oÆtsjaÛék$Ø¢ˆn¾á@Íçxî%=|2.G Ç<¦a „ÌløM¼ô0aW¾`×ÇqÄüëàÚèÍ {b:q5 d—ÿ sƒ1|ÖBÑ'}i—Q˜ù÷WßÐyyfÓTLW.Qsþ¯XžDËŸløô¾‡=¸®6L;Œ#ôSDDDDDDDDDDDîôä æûÑ’9÷†-¡f´Î`WÖTJ~w‘’ò‹x˜„%$˜ô¥‰¬Ž1`Ž~œâ¤Š~g§æL’b‹'7|2`"ó—ñPu–’ÝŸã 20ó©ŸS6ZwY¶±0ÿ”­k®³ao3yeÌ¡¡¬^MÅ—üíS‰{âAvÕü'+.%²wÑcÄBQùI*ƒ¦2ó©hŠ—N¡àƒ&ÖÕSñÄ0ͱŸ"""""""""""r¯¸ïÆ7&â@íŸ|Šª/ûÖɹ‰9¶Jžšª³""r—]¸péÓ§ÿ ûþç?ÿ™|É“• dׯ_ç믿æg?ûÙ=ÝÏ «ÅöÔS~JKDDDDDDDDDDDd¬&)""""""""""""I‰‘¥DŽˆˆˆˆˆˆˆˆˆˆˆH€R"GDDDDDDDDDDD$@)‘#""""""""""" ”È PJ䈈ˆˆˆˆˆˆˆˆˆˆ(%rDDDDDDDDDDDD”9""""""""""""J‰‘¥DŽˆˆˆˆˆˆˆˆˆˆˆH€R"GDDDDDDDDDDD$@)‘#""""""""""" ”Ès£ IDAT PJ䈈ˆˆˆˆˆˆˆˆˆˆ(%rDDDDDDDDDDDD”9""""""""""""J‰‘¥DŽˆˆˆˆˆˆˆˆˆˆˆH€R"GDDDDDDDDDDD$@)‘#""""""""""" ”ȹ›\GX™”DRRkºú^÷žgëâ$’’æSpÖ«8Ƀ÷4󺯇¾¯ù,^¶–Â곸ïêµz°ûZ_Èwº$Çk?""""""òƒ¡DŽˆˆH€h*-å´[qÀLpp0&QÆ[ù{ºß÷ž¥xÕ[”hÆCL¨¯ûzzkûÀdf×Q6í£©Ã3|ÛÚöRrÈCø¬L]Í-YÅ;G\@(³³³˜e01;;—WÂ7oï=Ïö7VQr¨‰¢ˆ‰ ¦«ùeï¼NÁ©Aµ»ö±¡´Á࿞‹(:¤+VDDDDDä^§DŽˆˆH€›MF(tí+a_ÇÀ÷Ü]­˜bf1;ç=Þÿ—íüË–,ÂÚNÓÑÿÁ³!žõü¿ýèÝî @LîüÛo?⽌PÚÎvpþÐNê}š±‰-sY¿eK‚¦rª[u.$Ð0w¯(ãqùF¿Þ¶ã4„.$gýV¶¿ÿ9/Äì¢Ë îúì뢲yÿ_·³ý·ï“tbOóÀ4꬜wùèãÈzdÊ0m 'ë½÷ØZ¼÷7ÍÆœ);D+F"âã‰2óøìgytˆ’pî3;ÙÛ/äÝþ…íÛË9Q€‡£eG&j‰"ûƒßñÛßþž÷³Âh>Þ&刈ˆˆˆˆÜÛ´FŽˆˆH 0<ÊÒœ¹ì{ç(e¥G˜Ýï-ó“ëØ˜s„}Õe¼³²™¦æ|Cí#øI¢,&¬€`b¢L€“Õ¿´ºï*_œj £â þ¡¢ÿ:hîðB„QçCˆ_W÷ˆ7Y k”ñkŒz‘Ù¦zNtTðÖ?T` ŸÅìÙ‹ÈÊ~žGÐz¶{ûÐøx¬XYô/`QÏnz&¹˜f³â…DZaJ:›Ùþëųˆ(Np¦ãî¥DFïY×éf|@ðÜEDù/;ëìWˆ*)¢¹í4mÞEXz¯ïYÌò'hC£‚6|Cß DDDDDDä¢DŽˆˆH1?“EVÔQJê+8Úïu÷éB^ë]†pf/\DÎ+.Ê‹öÒv[G¹Úû¯¨¬dEõÚl 8FI 0Þºs7£‚áÔ(ã×ü<…ÅpúP5ÕGŽrâÌUœáо#¬=ácÍ}LŒž‹ñáóÆî÷½:”¤•V 0V^ÈYHð€×|´æY+Xz‚ŠŽ½¼ñÚf…z8ÓÔóBö þÒo""""""òCvWfäxÿâ¤ä7ÇHÌ?ÄÓù¿Ç¶ëSÿåúííìò%*þw¶¢žÎ?Dò¦:òþãîž÷ÝN2Ög×W€»ŒõÇ©új}ú²ïþóŸyðÁ™â¥²¼“—5ÈDDDDî5ÆG×òoøPY5¹Ã&,‘ÓùÉi2ª:ðŒuƒ+_PTí¤åêpï_ÃÃ,÷ß^{¼Î ìøK0…Kgþ±Ñ‘¬íaÌç[°»û>ù|,™Ñ&Â~ô–?ÿ |õW\S…Ðý ® iØžú qá?"mÑÓ”-Nd™ˆˆˆˆˆˆˆˆˆˆˆÜž‰I3\ý+»w⻥®á8ý_dbdÿ’`nš\„‰op]¡_R¥Çu:ÿrŸÉDØ0{w;/áºâfí?ôÎTW Õ` ÖÚ"c†ÙŸñá騦ճî×G™ùØOH~ÂJÊcÁ„MÑ ‘Û3AóE¼8<··¥§¡Ç¢`â%DŒ?úa|I­ó*iæAo^þ’üþ/¼¯=Ï®G†ÙñUÀô0[9xÖÌ$Ì— É‚&­¡SƒÉùÇ¿'ý—Ô~ú5׳­úÇlüÕS¤š5ÐDDDDDDDDDDDäÖMPi5#ÑÓÆy—æ–?Ç>¾@àòkíjÁŽ™´‡‡Ÿc¶>€ÉóW\÷O%ì¡î/‹»¢¸®Þzs:ç(<ö5æéV2^šÅ®u¿àå /Ù}Ñ«Q&"""""""""""·ebfäLy€å©!T}p«åÕÀIôù#©¶ÇùðŸXñÏß°<ÉJÜCÐòégì®ÿkb" ÜCï×þ™!'Øð›xéa®|Á®/âˆùÖ)ÀµÑÛfæ[Ü_}Cçåiù†5Ÿã¹?–ôðɸ-óH˜¦ErDDDDDDDDDDDäöLX–!ä‰'©à¿)øø3=ckZô“Q¸hˆõqz<ôSÊÖMeWõ§TÕü»¯€iÚƒ$/ü9Ï<€qÄý›ÈüeýÙ÷?ÿùÏ<øàƒLž¬D¼ˆˆˆˆˆˆˆH »~ý:_ý5?ûÙÏîé~NÒ© LJ䈈ˆˆˆˆˆˆˆˆˆˆ¨ …@DDäÎéèèPDDDDDDDDú Unf䈈ˆˆˆˆˆˆˆˆˆˆ(Íȹƒô&""""""""ò]hFŽˆˆˆˆˆˆˆˆˆˆˆH€R"GDDDDDDDDDDD$@)‘#""""""""""" ”È PJ䈈ˆˆˆˆˆˆˆˆˆˆ(%rDDDDDDDDDDDD”9""""""""""""*H!‘ï+ï§M|ùÿmäúW_qãêÕ|<î›2…É=Äÿg>ÆÇb4@îJ䈈ˆˆˆˆˆˆˆˆÈ÷’÷Ó&ÚßùG&OJÙ “&+(ß^çºÛCû;ÿHئÿ_Éœ{€J«‰ˆˆˆˆˆˆˆˆˆÈ÷Ò—¿ÞÈä©S™4õ(‰ÓcÒd&ÿÍß0Éx?_þz£âq/œR…@DDDDDDDDDD¾®¹:™tÿý Ä&O½Ÿë—¾R îJ䈈ˆÜ‹\Y™”DÒüBÎz¿GûžˆýO0冀$%%1oÝi¼™cæ>•Ǽ¤$’VÄuk[rººœƒ­þh»³fÞ«”·Žç­få¼eT;¿s/¶uÜö;Ò!ϲ§` ËÏ#))‰ù¯®¡`ÏYÜßeŒŸ-dþüq|NorK1qqº<5‹ç‘”4Ÿ•Õôþˆ:²†¤¤¤!¾æ‘7ÄMµuÏJ潺}`»\§Ø¾nó“’˜·x%Õçon“û4Õ{Žã¼­G(?xþŸË»ðóm´8 ǹ‡•¯s^¿¤‰|¿}û-ܧÇÜCš4YkÝ+§R!ùžóžgëâ$’’nãáÎí0˜ &4<Ãhûxî_¾§Ü4U×ãh®¦þ–žˆwqª|'Õ;;x Dñâ’ED™¾ë޵uÜö; çAÖ½ö¥Í¡ÌÎZϦMëÉšmàLé¼±ýüÝK4ºŽ÷Ú…YKsظië³fc:SÊ[« 8~G3"ã9^¾Ë¸½Û&ູk}¹ó}ó6¡#&žÐ›¾¸ÞÒ½ep›]Ôï<„gîFÞËyãDþz3(®9~G>ö­ÄÄKkù[¼µ³‹˜ìMlY¿àúÞ*=‹0ÏÊaÓ¦M¾6fÏÂdˆáÙðA{nÝÆÒf|ƒ~ÚþÆ;ìõÌ&÷ÝwÙ´"Šæ’7xçÈÀ·©œ²ê:–±ç”gb¯Ã;ýóm´8 {Û>OuÉNî‰[ŸˆˆÜó‚¹%æg)ü×g¿¿û—Àçn¢ºÞGø’ {+¨®wñâ‹–ºç•5öÛTŽ—”PšÅ{ï.åÑžçƒÏËÖmç”ÿ)½ç·²8)‰¤e{è™°â:¸²»$RÁY¼´Rþú*öv´QöÚ| Ô#óÑv¨•‹“HJZÌšâãËý¸ÏS]¸†Wçw—ñX¼2òSý>á,gYRI‹‹9~°˜5¯.cë÷ (}æÜ³lȲ Ëüõ3†ïß0mª´Ú-´óÈžç³²ð ·TiÅušò¼•,ž×¯­Î[ˆ€ë8[׾ʼ¤$æ¯,`_ÛÍæéu¡xí«ÌOJ"iÞbÖV«¤Gÿ07USï çÅE‹XMÕgúÆ­³šeóVRÝ/ì®ê•Ì[Y‹VÊ_}ŠM^b~áÙÞY&®¶j V.î¾v– ,Áã:ÅÖžó1ë¶Ÿê;žûkæ­äàéƒ,›Ï²í­ÝcÔ_"Æ{Ú_JkÀ×bŠý'Ô}¾û¸ózÆ^9gÝþñ?¸­ýö;z»Ž³fÞJöœª¦p¼ î×€qYOy=ÌÎZØ—Äñ³ÎÍe}ö‹ûÆpÜ}šÇâ•jô—Ýî³ì齎Fß®ÝíÊYÑ/‰ãg~†œ-›È}1tøs1bŒG‹ÓðãeÜÇm÷Ͱ7®ó¯¡ð`kßñFzoÄxzi=Xè/ٔļWײµ÷ž4Ò{ý ‡QÆA¿;­Õk™7o%å= ©Íc»Ý?WÖŽXºmèkzp_ް{PßÜg XüêVÿÏ´y$%-feÞλSÜnj›·#Íá<eô}ÇíÅõVâ>¦óË€{ÖÈçgpüNRµò5JÛ|4ýóò†)#v«÷PºË{®ñßGÖsäH÷y9?\\Ç|ÎÏâícÇËý¿ÌgYÁZ{™Äüe…nsÿcßÔþÿ¢z¨˜ s {ÛŽpÆÅ¢xK¿[[Û õ&YÜGŽ—²Ó³Ü…ÖWéž"vú–’ûÊÀ9Bž¶6|¡1„÷›éúL†¶S´¹û~F½^ÑAס7øû¤—ØÐäén{Ái¼££ÑîçCö{‚¾!N73¾t ï¿ÿ>ïf…ë/ù^P"GDDänjÝC~~õm>B£bˆ õÐV_Á;ùc]_!”ÙÙYÌ2˜˜Ë+ýKqxŽRTrÁtÑ´/Ÿ Gz³Dlc%‡šè Š˜˜`ºšOPöÎ뜴bF×Q6í£©ãæR†ðxfÇÇOü¬¾ÿ8› †Qú7JÛ{¨ÜJ;÷±¡´Áxh>TDÑ¡1Ö›óž¥xÕ[”hÆCL¨¯»­omï~h1–vxϲuU>{Ïtà3…Üu”ÒÒ¦A¼Žÿúöñß\r¶¼Ç–œx<{ßaUq¿‡ú¾6v•ËÙd¿8ðáñÉ\>úè#ÿ×l|!‚ãy>ÔÞ³”¾U™Х¬ßò.[6.%üLù;Ïã®­ÆãhíjfgÉq"Vlâý÷7òÝ×ûPëÝx;ŽÓF8ÏF ñçãæGyþ•yÒ2†ãºŽ³áêƒ_aý–-ä¾è£¼èžÞ|¥“êwÞb§'žœ-ïñ„ž)áü#CÞÓ¼ÍÇi#Šc†þ³vó£ÏðÌã–¾Ø >#Æx´8rÆsÜzÏRüF>G ¯°þÝ÷Ø´"”ú¢7(:åù½Qâé=_Æ;E'0½²ž-ïn"gV{ó‹8åù½Q¯›±Œ¿Þ[Zo•t±pÓ–>jÛe욢±dÉó×ÔöšÜ—çY>¨oÀ×±— e]<Ÿ½…-_!¸©tL1²mGh }‘ãàïo#®·÷±ŸßÁF:?ƒÛœˆí_> ;Ü@TîGü¾pˆ2b·sõž¦ä Ô/eã»[È}¾‹Ò¢£tõßïฎùœ÷Ü÷›)+kåÅõïñþƹøŽnàõU嘖nâý÷r‰ï:DÉÎa’·7»ûÿ–Eƒc2Â5ìëh£Ë`Âs¨€•‹ç‘4o1+ ªû%þ¾S^z†¨¬W&Ü{(Úécéú%„šhb0 «c@ì<øè¢ÃÆ' ùýÿy%¡Á¼ðîÿá­'ÆEîGà÷Oˆãh”kyØ~OèÏ·±Äi(F‹•ˆˆÂCMúÕKDD¾TZMDDä.rwµbŠ™ÅìsX¿(£³œe¯•ÑÖvšï‹DþßP"âã‰2•q¦+˜Çg?Ë£fè{ZNÖ{ï±ôQ8»õ5ÞØÛEó©¼Ï[ðÙÉÞ6 x!ï~°ŽÇà¬^Ék%Í-;Jö3‹è_ÕcVλäÎÂä;Êý^·ü_öî?*Êë^ôÿ[‘g4ÌD¢™‰qP×`š!i é…6oEs I#±GbOÔ¬ ßàæ"=g´kç[ §ÈíEÒ"¹¥$µØZ°)¦‰4=ÐÐö0ç›Â¹‰ÓDæªLb˜¨Œ˜̃è÷a@`ÀßÕÏk-Öb˜yž½ŸÏþ1ÃÞ³÷“Ki@m[×c°ä`MŽÄcŸøúb&Ì{ FSʧ™œ=?"Ã=õϱ¾Æ‰£Í…/Ýr€Öc«cŸ0ç°ëGé¥iãZ*Í486ã ¥½Æ¿ÂȔŮÚL¢è¡!{=UŽátzšë°©`XWNe¦ EuP·)F{=M=élŽºÓ…{*CZ` 4>}M#M]}¤¤Lb›ª¡‚9Šcɲ’‘ D±!³}uNÿÀWWÍÞX¬%›ñŸ>šÕÎÓõØsJ‰@E›QNQFàÒ#ê¨] [žŽR*𵬫Í÷¯.ñiIØ`%=u1:ýTZêÉ»4!:N^/ÕûÐùÓ+™ëÊÜ`¡±¦7)\6-âõâE‹>ÄxU¨t ­5Ø”TªK2‰Ñq…ö¬%»Ù¼¯»ž:g,…{6“ óo.ìamv]})Œ.BÕëEUôhƒBàëÈ剂®á?(ÉT¾U4vY„Šq¨8MPײÞzl54«‰”føã“OaO1 .ï„Ï…Šg¢Û‰[±“šäŸˆ3›0¤¸0(ÀDÏ…h7¡ê%P^Ûv²‹mX w‘XR²(¡ë®..ƒÜ¸‰C>^›¾¬LÇ,c-É……dÄi€,ú^Öf×ÑÚ›BZˆ¸Î[¯ÍŽ>%s(™§Wó$Û=L±|ƒL¾N®Mx® ík©¡•TÊ 3ðkçÓØÇë”Ê<ð{|N)Ñ:ˆÎ Ý´†X+YIÑh0‘‘\E«Ã\Lã¦=ªß¹ìóÃømXÕzAuPÑ”L¾µ“ê ¡¢‚ì2={J“F|ÎòØjØG*•ñÁí¥¡¸of5k¢4¸»F¦ŸI,ÅTÕt`ÊŠEq4SVå‚V™¨n^=)z x»qkÍÃ+x&¨G¡êJ¼}ü뾡ïo“ˆ“Bq;‰!„â&ÒÅm¡$¿…}M5lt`w¸¸¦÷[ÕZˆ ¬r1Dë7—pwúo«ONçÒÎ%ÆÄ Ìe8œ8}A$ÚD6¤Æ©±— ùèi(`[»´‰””d¥®ÁõM)ŸúXbûœÌzÀ‰:ÉÝœþãâãñÕIÿÑH<ß³3T>RQ:ü36¦ŒdÿõEr†™ª2ÇPœ\þt\»³yzwp\8\>Þ±|Ž&lªž´K÷&0¥¯m¤¹© OÊx8¡è±ÝaYQ”¡¡%·Ã‰jÈÀ4niI îÇá†8­ÿøØØè÷µP\ÜŠ!§– —¾J­‰"%Má@×~:Ði·aëòBâ$êã$ó5òº&zU´hqâöÂ_©§¯Ç…ªB0]tºP,9 /žÓ`N2£&r¼;n¯ƒ‚'—JÃ@·—Ë&r­ªwÐhªÆb¥¶Ö8_ ÛªF–刲˜TŒ§§QT»ºHÍ–ïTÛèµê«†Û­ÿ}P5e2\:ÌI&°3A§X抓áÒñ úhýP÷§(ã=vÚã¿ø&hßàiQëJŠHˆÃ¬tòtAí}I¤G§ÛZ×…>#ÄjœÞ¦bê¼iT®‰û )‘)– `[ký嘸&m£{x‚ÜëÀ“|]¼ú$ôšÐõ¨oºâÃ4ÁuCÏu{«?¬¯ IDAT_64‡ˆ“Bq‰!„â&òt–²>¯·b"1-üŒ>êËqÞôœšüP´˜x:«È«rÖ”úo¸{C®ïZM{ùPÕ‘á×™³JÈ2üö°Þr§?ø°7ØPQiÜôÁOu5ÑåI!i¬¨ª!¦ë…Hå*bêx_ eØ-Vve "õuPš]@«OêªÒs2HoÈ£Ø{Â¥((“¼.)í´9<¬Š5Èìi§x}1já[X¯E“Ô§Q^™9jk­q¬|%a¢†ýv) |éŒþÕy@ŸÃ¿’hܲ˜LŒ§§Ñtñ…ìÚ£õƒzÍ•ÔÛD j ãÅl¢ç&Œg¹?ù í´·µÑR•GME"…»JI‰œè¹kQµÄ[«Éñ³¾¦‚ý©;ü7g•gÏÕ•É5iÓ—Ÿp8Þº)Ä­¯‹%…BÝ8¯'Ý–ïÛèµê«¦T^cÅñš—ù5L{‚6¬èõ(Š–¸ }u¦8 4Ð;<ÿ ½í48 ¤'Gô-®^§MOóc7ë—5’Xù¥q"rùÑ¿eáéõ¢#Q;¶ðt³ ƒ¶—†Í›¨±{Q¼'—ãÿ°ccíêýäÔî$Ã8~=Š QW\õ]×ñýíò~Ù‡}qBˆËÍavùkÜ»8øo§Qtp²®šSG/[‰é_åTÞKœ:~å©M‹ÎgÉ·à“*8;0Vv1ýàëxò^âäq)q9¹GŽBqÓøpîoÇ¿›W%¥¹™$›¼#ö9×\úÙÝÛƒ ìm®ñG¦0¡3£îÖý8|—Æp˜0LöÞÞýìÂ%¿’Üͤ¯o2y¿fùœC`”ÅÕn |´—¦ÍËY¶ìY¶wû&‘ †ÿfxΦvü÷äí¥½É<ü€ÁâOÇë1›@B‚ ÕÑF[‡ïß$ì4ØT´‰…ÔîÚÅ®ÀOma"Zºhè 쎯ªAoœ®+NRo6¡¸Ú°­4ë³·áRL˜õ“kÇj ¨r'SX˜2r›œ®:š½©TÖngKæ*¢ (ÞÉ­»ú|Of,´WÕs`ÔM!z[è ܧfâtýíDµ·àô _¿£Í1tMZ³­Û[kÄhôÿèÝMTTµú°QŒÉdZTlut޾ù§“šû„ýÚÕÄxr]CäÐu#ucÓ;d½UÑÇÀÙ6Ôw€Î¢gy¶ÔvÜç „ˆg_ÇN¶×ÛÑÆ¥‘[ÄÎ=Õ¤)íÔwõMøÜ5©Š…Œä(¢Ò¬¬ÑwQUÕçJêÀMá m8àø-8T=qÍ”âÖ×ÕIñCí~ôã©Æu*íþJË÷Z—ÏÔûªÀûíˆ:ïÁÑæ7®7ÒÔÓÖLо€) “ê¤c¸ÓÄãìÄ…žè 9êÞö&œ¦UŒ˜ÇAƒ%¿v¨OÙµ«–ò5ЧRR[K¾E}-l/ÚA§GƒÎ‰ö&;XR0kŒ¤•ï¢|m| {öÔbµ(˜²jycW9iƉëÑÄueâëö]Ï÷·ËúåIÄI!&p¡sÎ-/Ócý&ýë9M÷nÿób"ÿ{æ³·~ï´ÄJÜ\²"G!„¸i4h£ô€GÅ&6¶èqwÌ×ÇaVvãò6“ý¤ =-ˆFœF!R ¸]4TíÀ”ŸKÒ$¾©‹ÝÀC;»]d¯í"Öà¥Ëîô¤æ¤2¹/æzh«(ÃæßßÚªØÚÈzR¡®oy¿6ùœ\OLÈÁ8]l&ÉÚ<ÊŠw¢d¥ wí§ªÂŽaM­ÿF×!f<elkTI-߀žK“ŠEo@ëµÓbëFoQp¶ÖPÖîEµ8qûü[׌—׫Í×å"I±æÓ´¾ŒìõNÖe¦àƒk¢~Ÿÿ¼©FÐè'NW“œIlMÛ¢°nˆE±7PÑ<\É51™dšÖS–W 9é¼mÔWíÆ‘X=Τk$« ­´e—‘·ÖAÚ†U$˜ô¨®ö×íÃi0£` _ÈO¦í—îúÔ[¥0‹dò(.ŽÁš‹â¬§¬Õ‹¥Ò„Ñ<þsºñTqÒ\ÓŒWk%âà¶5ÐîÖoТxÇ.dBÕ¿ýx4ò“i.¨ .s¹¡êÀ$ê®§³º6…ô¬ô+Úmrt™?ö_½—æâb¢­™XT;õûðÆ’Šk⸠ç-g‹JRNäÐû¡}Äã©ÇU*îAo  åÓCgCmJ:Yé#·ššL¸MŒ<÷•ôU‘‰Y$WP\5Óöz?®ŒÇ)•ù¿ ]YÚ‘ñã·aM¤‰¬Ä* ¶••ŸYí¢®¬mj%‰CÉôaoq¢µÄ2zCETPv”(Å¿m\tTà: ÐU̶b…üÌ{=eíZÒjãý[‘êT§C’£ÖKƒ[‹%ÖDd¤¿°'êCBÕÍD×û¾¿M&Nã· !„¸xüc|Gs€ƒœýÎm{ã‹+éÏûgÒ_P%n:Y‘#„BÜDQiVrâ (¸q:ósˆUo-NèÈ/\ƒE¨^óò³Ì£ÏBò†d ¸m6:½“üJ­&šÍµµä§Z0¨ºìnôæD²ÊkÙ:…-(Ô¡%7v[;ííþŸÖn ¡®o2y¿Fù = ÇÖ]嬋7¡¸íØ] ¦ø,Ê+7û'“Mùµ…¤Y (n'n%žuëF•—1òÚ|’ÍZœ¶vlN-±iVªËÓ1ÞÑ­Á‡½É†jH%#zT¹jL¤§P»šè"|k*Úö2òÖgSу5?>hó-±ÉÜ5Ùd×t²5hâØZ]B­”eo"»¢eM9Õ›£'1ÐãÃÙbÛ悵<ùä“C?y­}hâr°¦iiݶ‰µk ¨ëI¡¤$“£‚mûz&ÎëUåkÆUìØSI–ÙEkM1ÅÔÙTâó«©Í œ7Tº‘«(¯Î'ÞÝ@qv6eû!³$+hÛ(2++É2Ø©*È&¯¬ob!•91ãçÛ¸ŠÒ]Õä'BW}Û Š©irbȪ¦¶|fíDÅ*Æ¡L±¾\q½ÃZ]H¼»žmٛȫrbɯ$?Nº ž O]B>%ëÌØ« ÈÞ”Gqƒ›xk%ù1š Ÿ ‡)Ö?]B9±nËšé½’:0Š×ÑDcc W¶Önt™Ž|¬(ñäoв¿,›ìmu8-9T–øWÔ…ŠÛPÞ¼vZÜ Ä_ê¸=£_I\§÷‰óéÅÑÔHã~çcâ¡Ê'T›uî+é«t X+ó‰uÕQGEG 9Yf%E+Ž×»œ¾’´ цu$VcuQ¿-›ìâ&ÔÔªóã†ããsÒâS‚iêý»&†œJ+‰î}çåQÑ¢V^MîPä¦Ó©`6ëAubwˆ šUŸ¸…¨+^÷ ~ Ý«LÐ&„b´~¼?ogpA2ó€9ɘv¿Âìyá„%—…ÿûç,mü%æ|›y±s†Žœ¾h%†ò:Ì¿dic=‹¾ù5fÞ|n…ð/o?ÖóAîZÊœo~%»ÉÒÆ:þãJ4áR:w²i/^¼(aBìСC,Y²ä޼ö?þ˜Ù³g&A!„¸ÍøñtJÉ¥Èm3n’Þöw)ĝР¬–ðѽc-ÙöÞØ™‚N"$„bН~‚ð{æMñ(ÿ=rîéþ&‡^=Ȉò»Yøã\ 3ùäh¦|Sy/ñYÄ&mOFýÉÜTÂWlÂðåc|ü¿pf`)÷þð»D¨åÓ·>äÂ]1÷¥o0ó·/søµÃÏ’²$ÂNvpìû{ñ…?„þÅoq|ÿwk+ƒ#î‘3ŸÙ¥¯pÏÀ›¸~ÒÎ`ÄCÌyqÚ£Û9\ÒÎà¯tàÄq¿ý›Û¶ü9uê÷ßÿm]Ïek5!„B!„BÜ .ÊjhSËÉI6 Ú¨ØçÅ’+“8B!n §¹ˆÂôðQû~ÏY@˜ú!ý¿ëàl?œ=ò/ üq>§9óóœúm+çÎæbç3Ü??"è§9õÝíôwù¤>‹Ë¾ÎÜûZ9qføUÓ}ÈïÓ›½‹3s}ú½ÜUöUîšÓާ_ŠèN$9B!„¸íù:ry¢ k‚W˜ÈßóÒ+!„âº2¦SRÒCYUk+T½™ÄœJòWEJl„BÜÂ#˜†ÊàÀÈ /ü§Ž›?¬ã¬­ïÛñØÞçüÀQ<ï 03&™91K¹ké£Ü¶ ¨‡ñ>ß‘|j2šùápdøeÓ=ÀŒˆÅÜÿã_ŽÊØ14w!9w(™ÈB!ÄmO“°ƒ?üAâ „wüûALo¿-q¸ÙŒI¹ìHÊ•@!„¸%M[ð( Çè;60ò‰3ïsw*™ÈB!„B!„B!˜ƒöÙDÂŽþŒÓÇ9ÃτŮ'rQ''~ÙNÿvúëßdþ¾Ëܘ9œæëÌŽhÅùÂÎ „3+BaZð©•Åè„s¦Û?;3mQ"åîQFŽfpîbfœ9Æ™Àê›iÑë¹ïé~Ž}ïM. H)݉nàDŽ—×ªÚyÅ5ÆS†¥4æ,aÑx‡œåOú+¯üé½`æ,ŠŽ"çÉE<&›è !„B!„B!„˜¢ió33ÿ=qæ/ bÅ7˜sŒ“Ö_3z¾ä"÷s÷sÉL?½ƒþîÂb¿ŠvîIN;ÍEåƒKÑÅ.æ|·Šòåo`ˆ`úÁ„…¿Ï Ì~y ¾W÷r.üô/¦2½³ŒÏFM]ìÞ‹ûè÷1çB]3 èŸÍ|3°›¸ý ¬Èä½·ÿLî_4|muVS8êÉ~öþú²~è£þ¥x \ R!„B!„B!ÄäMËfaÜ¥G§Qvðé–jN¹|ÆäBW5Ÿ¼‘˽ ¹[ '?ÄóÊ·8Ö=ÀEjq½cåÞúsÕcœýÝùä_Ocx9›ûV¼ÏGáâ±79úÆ"ÿñ»Ì8É9[5}¿ƒ —¥t”“…ß‚Ü̼o%¦žäìï¶óQÝA.J‘ݱ¦]¼xñÆ•ÿÀq²Š:Q×óîŸNà¿]”žEñ<>ÞdÌ€›üoÛèMÿ;v?ªþûI'ë¶dQÖßQj “’BˆkèСC,Y²ä޼ö?þ˜Ù³g&ï-B!„B!Ä­îðê'¿gžb'޳øíßܶ×788È©S§¸ÿþûoër¼ +r¦£h§£@`"'4ðyð¡ah*g®‘ÒMZ|óm'?¥bï¼yø,ªv6+V>ŒõQ­ÿõžãTì±óæá³xgFð¥øÏQ¸r÷>gi{4XS.ðZËQÞïŸÁÒ—PøÌ"˜Hël?»÷àõn}çŠ3cM7V rä/vŠ~ÝËûÞ (sô<“þùK5ÒK!„B!„B!„âªL¿ås®ãùGzÞigeUU9·žA œEKôþÉ–~JwvòÎŒ(J³§*yÞûïð?÷Ê»ì=oÀºéqjÒïÁó§wÉlêÇHÂ×ßÃÖ_ûXñd<5™‹ˆüè6Ô÷r€³ì}ÝÆ«çîÁºéqêþa ÷¶=ïë=HÎÞOÑ=þ5Ya]ìã§õïñ§³R¹„B!„B!„BqunŠœ ¨ç.Lz5„óXzõÑñS[/¿Úû.¯Ê=ÿm¥…üÏkQ»ò«óóÙ¾vÏL1”žøOvŸ<¿:§§0óVêîfûù~R›ñþêGy(†kaÝ’0`iÏ’Vãà“Fž9wˆWë)Ýò€ÿÜÜÍÒµ§y·æïzŒ|Åsš¾sÈô^ÓÁcF-÷}þ,ÆR¹„B!„B!„BqunØtƒ¯÷[^û€wþp"è7¹Ûÿ?þÇóq¬3Žw?‚p°,¡È²ä§‹Ÿ¶:øéž?Ñ7c/ö¢Îy€¥³†_ÿØ“_à1àÈïO£Î‰âaÝðÙîYx/ÆóGùÐK`"çn¾”¶Æ8Ÿ¥3Žò瓃¬èï§ïœ‡Üo7ÊÓ,žƒ• —ðÌ[¾ÓÊCÞËW>odŃzî —Ê%„B!„B!„Bˆ«sƒ&r¼üôgðgïxOŸàþ¬‡Ç_^¢QOùz±µ^\»$pOš0î3- ÿù{XZõ[Êl§Ø0ŸÎµ»+M`Rç<0h²ã…%,­éèæèÉù þþÐ1~÷×Oyç-¯4ͧä¿?X$„B!„B!„BqenÌ=rTö‡xMÿgô \þgÍ 8ø×#ìíõÌú΃2Sƒ~ñ,8þ)‡ŽäÝŸýž¯6ö£5F ôã=Ïð‘'>ú”Þ< ½ô—Ïø]Ðù}½½<¯á±¹aèŒw£õ~FßÌYÜ7×ÿéqRöV/}pâà‡”þþº%FÖ=Ëk[¾È×fãõÃ>©]B!„B!„B!„¸*7fEN¸žÒâTJ}‡þÂßÕžæ¥-I¬›âØy x)ÚÁ¶š?á]±„ÆYèΟåOqðú /=§ã>í¬ÀÆÖ=G(\¦GsâEï ðð¦îY¸„3mïùÍ #‘ýG©h:…ññÇyhhû³óüjϲô™%<|¾Ÿ×š>³øþÛ<а˜çïi§ø‡ïÁ“ ¹ïܧ¼öÖaZ¾ˆ1TNó«wŽâù0o £ïà~ïUøÒ¹IŽB!„B!„B!®ÎM™mÐÌÕcœqžûfNêÕ¬ÌLBÓúW^ûˇl=¡¢Î˜qá½X³>Ç3óÂ=…›¡lï_ÙRóêL+Òâ±. ômŽC·÷Šjã9‹ÇŒº•w£|3îÁšÎÞ½ÿÎÿôÎ êÁÏQóŒ‘{Ðòü ñ°÷¯Å;Cá¡G¡fõ4€fi Û—½GÙÛïòÎyP´³YñLë.™Ä¹dzaL×ÌäØwJ$·C‘J„B!„B!„Bü-:ßw‚é3gJ Æ6k&ƒý'%·™ÈB!nC¾Ž\–-[Æò-ø$âo§c+Ë—-cÙÆýôMíH:›êÙߨùž66/–úžk˜¹¾&6.Ž¦Þ«¾Ê‘y½fç(É4mæ¹§–³lÙ2V?»™¢†x®¦¿9PÊêÕ[éô]]¾öoÏÊ×òÕϲ¹´Î¾ë^ÓF–ÔÛ[³Þ%*.£ËóÚ–ï8…NÑæzz.{|Óîkaãòç¨ï½žå~yžûÚJynù2VÝàÏ—â8å2¿q]¦£™RLúè¬ßÊæ§–³lÙj651ÔÌ[6³lÙ²1~–³uŒµ§a#ËŸÝ92_}ìÜò«—-cùS)jê¾»nù°,Äß¾ `š siz˜Ü3èv)J B!„¸µx°7ÙPMئ4"¾Ž&‡zý²§˜Yµ&³öjO4*¯×ì¼ãèÝÏ–µÙT9 $fR^^HV¢BWU6Ù;»oÞ¤o_ [×fSÖ ±™ù””—S˜•ˆ¶«Š¼ME´]×ÉœkY_¤ÞÞ|£ãxýãês´à²Äc¸ìñ (Ók^î£ó܇­®or µùqhn`¶GÇõF¶‰ÓžJL|ôÔç‘WçÆ’SNeaz[yUðºØ|ÊËËGü”äÄ¢U,$™F¹§â*#®Ò×ÍÎ콉X««)ß`ÆQ‘MAËÈÎÇg¯§¦É€k ÞÛod1VœÆí²»iª¨ãf7Q!„b²fH„B!Ä-Åc§É¦bZ³¥q7M¶>V­Š¼uò§‹!csÌßÎyýA¥­¢›!‹ÚêL¢/&¤µ‘µU´gî Ew£ƒÙGKYíÚ5TÖæ7”~IÉ ­- ¢.ƒø-17tYêí­Roou>-NÌ«LúüØu”»ŠWUÐÇY0ênV\]7¹L¯"&>;uõ.b­{ÈM‰â0kÝ49pCTd4 #ºˆ^šê²jÙuôÐPV‡Û ŒìrºêhtY°Vo&)ˆ‰¡¤·‹õuÍô¤dx«Ó‰bÙ€í]^ôé¦ÛŸÞ°>bì8UÆÝ;Ö³©1P·ôò±K!ÄßY‘#„BÜl}ÔoÝÈSË—±lÙjžÛ²“Ž[|tÓTº™gWû·ÛxjãVê;F}Õ»¯¹Ï²|Ù2Vo,bŸóò¯úz[Øžû,«—-cÙò§Ø\Ú$[Iˆ[’ÇÞ„M5±*=t3Ø›º†·©êmâ¹åi j}MY¾±‰>z¨v=»]*öâ'Y]z`h•IŸ³‰¢Où·{®hä6<}ì¸Ô6V?Ç–ÃéyZؼ|#û;÷SôÜjžÛÙ}û‡¶‰ñu¶ÒñóÛËÓíO×ÿšÕ<·µž`¬¼7t¾Úؼ|# M”n´ýÑ×5¢°QoƒÄ¬´áIœc²•œUèÕI¤;âš–óÔÆ"š£¾Ýí9@ÃPŸ¢¯ék÷ç+CÐ$N€.üÊr¬« ã—Å„1§ñë‹ÔÛ›Wo{žcÙ²\:&(Œ±ã2:o-¼>*¯žE<õìÚöogó³ËY¶ì)6nm {hoA=ûKÛ`-cù³¹ìz¿½,o>'-)fͨǮ±Ë4DÛ ù<“ËçÈ`*ŸqÛçèøý‰½×RåTq”=Íò­ãl#6Õzˆ{¯ÒÍ>dóvZZüåÒ=^\']æð]ªcmõlynµ¿þµÐ3”æ2V?WJËxÛ|§}Yþÿ“¦±bÒÛ6ƒåOm¦t>Àçl¡Ëk&=>2¨[ÛÊÎÒô¡I–}H[uÞ4¬iÆïi(£NÍÄš1r×éD5X0­t1$˜Qœ8=Ãí|ýnîælžXö$Åv¯?ïEøBÕ£P}ù˜×}ƒßÛ&§Ëi0eV²k×.ª³Lò¡K!Äß ™ÈB!n&ß¶oÊ£¦Ý×`ÁbPqÚvS·Óÿϲ¯›Ù›¨h¶ãŒŢÇíh§¦`=Ež¡sìØ´Æ.ªÖ„ÞÝJU•}Ô@K ÛÖ³¯Ë‹>6‘xƒ{s›òšè•R·”ÀöT†D£ŒÄ¦ÀÞ@פ¶©Š"s×.Ö,…oðöÖÀ*ÕEcE1Y•쪶’L+e6ÿ}a|ؾ©€}j2ù•µTæÇãm,`Óö A}ÕI]Y=¬Ê!gÕÈ"Mœ•7Þx#𳇒T=èãI1hÀw€ª¼ º ™VVSY’‰©«†muÝøÆË눾!T¾ÔU´µ¡œ]»JH¥•²Šö1ïwãsµáÄD’yŒ¯ë¢IÉXE\ä$Òík£8»›>ƒÂÊJ¬«TêËÚñÍ÷ÒTG7žüÊZªË31tU½­eÌiŸ£ 'fVYÆþj».:„˜ÈáØŒ.‹ c*N!Ê@êíM©·Zs:kÖ-V IDAT¤Œ¿¥Ö¸q·þaT^@u5R\ã&%§’Ê’ ôöª¡úé뮡 ¬mF!•ÕåäǺiÜVÆ¥·ÛËòæjÁnX…E3úñq ›ÉÄîR˜Cäs|µÏÑy~œg~´‡“‚ÙúÿV:Æ6bWR}TdcÓgRR]‰5ÅMUY+îàóŽŽë¤ËüRÛqPSÓêÂZv•$£¶³~S=ÚÌrvÕZ‰w7SQ7ÎÄíeiçÿs¤Ž‰ïÛ³·ÑªdPX]Kù¶²lÊ:<¨.'nE‹·¹ˆO-gÙò§ØXÔ4q8¢P©¯êœ•1r²½·²:•ÌÂ5˜F-4Q´ ¸]#bçu¹Pqãò‚&®”ûM-k zR«ÃÞ(Ä¢˜±¾ñþ­(&¬G!úòq¯[CßÛ&§±h"DEEa2håc—Bˆ¿²µšBqyluìsævý(#½4m\K…£™Çr¼u4:}Õ{¶£Þ¦¬­pÐZÓJNB:J{ nÀ”Å®ÚL¢è¡!{=UŽátzšë°©`XWNe¦ EuP·)F{=M=élŽ’²·J£ðoOeH –Æ'¢¯i¤©«””IlS54b4r$Ç’e%#!ˆbCfûêœþÁ¯®:š½±XK6ã?}4%ª§+ê±ç”€Š6£œ¢ŒÀ·¤G Îëвåé(¥¢Y˺Ú|ÿꟖ„ VÒSW£0£´Ô“çòN˜Wðo™:_`Ú`%3p]™,4Ötã&…˦E¼^¼hч³ •®¡µ›’JuI&1 ®Âžµd7û÷u×S猥pÏftþãÍ…=¬Ín «/…ÑE¨z½¨ŠmP|¹'×ÿ‘ôýôÀó=;ý7lÕ'§si‡cbæŠ2ÎNœ¾T”ÿŒ)#™( @ÉfªÊ.ÍäøpuøÓqíÎæéÝÁ9pápù(ÄMçs4aSõ¤]º?)…xm#ÍM]xRÆÄ E%è.ËŠ¢ /¹NTC– ±³HKu?7ÄiýÇÇÆ†ØD¿¯…ââV 9µl¸ôujM)i ºöÓÐy€N» [—'Ñ7L2_#¯k‚áWE‹'n/Œñµzúz\¨ú(Ô ÓõA§ Å’Ãð}¸5˜“Ì(‰¯ÃŽÛë àÉe£Ò0Ðí岉E«€êÆ4¢ª±X©­õÎWöª‘e9¢,&ã)ÄiO[.Ooëòß8[›Hå¥þÁg©·7¦ÞN1.“c&)hË.9 ³ÒL‡ËG†%“4CÛž~ Kb"I))$'Æaó-²[›BJ‰nœÇS‹>Tì‚.R3¥|›jû¼Vå=\ýŸGTS&ÃE Ãœd;ÄqŠe®è1.¯   Öu}Š2ÞÑc§=~;òáêt¢²^ì¨#.w;q€§E ¬+)"= ³ÒÉÓu´÷%‘9œnk]úŒü«qz›Š©ó¦Q¹&jìÕ‚‘)– `[ký嘸&m£{xrÜëÀ“|]¼ú$ôšÐõ¨oºâÃ4ÁuCÏuë#Æê“ Í!â$„BÜ&d"G!„¸i|¨êÕ¯Nùu欲Ì#¿µª·È¿½âÖiö**›ž 1ø©®&º<)$UÃUuâÖ (D*WQÏCïë¡¡  »ÅÊ®Œ ¤¾J³ hUâI]•BzNé y{¯Q¸e’×¥1%` 6‡‡U‘£š=í¯/F-| ëÕæIôi”WfŽÚÞFAk+_I˜¨a¿ÝCJB _:#Ñ_ûþ•Dã–Ådb<…8¦‹/dמ@íR´C RooL½½.q¹ü„ÃuWGîO~CFg;ímm´TåQS‘Há®ÒË'9úºhQR(ÔóøzšJ>¯¢}^«òžRyÇk^æ×0m5P§Çºt½EÑ´O Î‡z½0´$§·‡ôDãˆ~ÅÕáÀë´³é‰àoàìfý²F+ߢ4NCdB.?ú·,<½^c$jÇžn6aÐöÒ°y5v/*÷ärü:m¬]½ŸœÚdǯG±!êŠk‚뾞}Äå}²û$â$„c›Ãìò׸wqðßN£èàd]5§Ž ^¶Ó¾Ê©¼—8uüÊS›Ï’oÁ'/Tpv`¬ì$búÁ×ñä½ÄÉãR:ârr!„â¦Ñ`üwïj·¾¿ØKÓæå,[ö,Û»}èãÌ(€»u?ߥÿ÷p˜0h4Ì8›Úñß ¶—ö&Gð¿½,þt¼± $$˜Pm´u8ðJAˆ[…ÏNƒME›XHí®]ì üÔ&¢¥‹†®Àùª4 êÁÙéºâ$õfŠ« {ðMèím¸fý¤2ÍšªÜɦŒÜ*§«Žfo*•µÛÙ’¹Š„hŠWÔìÕçk”Èx2c¡½ªž£n ÑÛÚ@Wà>5§ëï³T{ Nßðõ;ÚCפ5›Ñº¸µFŒFÿÞÝDEU+î±nHaL&Ó¢b«¨£sô <ÔÔØ'œ³¾šO®›Žºc¤nìo{K½½~õöºpÐæ®Œ>G UOœAC_ÇN¶×ÛÑÆ¥‘[ÄÎ=Õ¤)íÔq³£¾®HŠŠÝèÇSÍTb7•|›rû¼æåøÜãlc¸<8ÚœãÆõFšzÚô—]΢gy¶ô˜’0©N:†;L<ÎN\艚ŸîmoÂiZňy4Xòk‡ú“]»j)_c}*%µµä[4Ð×Âö¢tz4茑hð`o²ƒ%³ÆHZù.Ê×ÐÆ—°gO-V‹‚)«–7v•“fœ¸M\W&¾nßõì#.ë“''!„áBçœ[^¦ÇúM>ú×sšîÝþ=æÅD>Ãæ³·~ï´ÄJÜ\7hEÎ GþØIÖÛ'‚¶fVøÒêx¶Y{…Ë_øõζ}tù%/ ÿ™¥|en˜”°Bˆ[š.v©Ú<šUlz¶3ì.LÉd˜4èLXchg·«‘ìµ]ļtÙ]€žÔœTÿvl‰s8ªX¿¶ Nœî‘éD¥gbÙ]}÷&²ñèÝ]Ø^”Ø|2uRâÖà³7`Sõ¤nH$:x»?Ã’õíþmª ' uû1gZ «ŽŠ.•à;£ëPñºœôybBÈéb3IÖæQV¼%+½k?Uv kjý7»1zíé(c[£Jjù,xð\šŒPt(zZ¯[7z‹‚³µ†²v/ªÅ‰Ûçß¾f¼¼^m¾.IŠ5Ÿ¦õed¯w².3ÿ8\õûüçM5‚F?qºšäLbkÊ(Ø…uC,нпáG“I¦i=ey¥“ŽÁÛF}Õn‰ÕÆÞˆU…VÚ²ËÈ[ë mÃ*LzTWûëöá4˜Ñ:Ç¿ª1žL?\:©·7»Þz:¨kSHÏJ¿¢]?G—gðcÿع—æâb¢­™XT;õûðÆ’ŠËIsM3^­• ‹‚ÛÖ@»[O|à†èÃyKÆÙ¢’”séê=ØG<#/!b£ » o](L”O u´)éd¥Üjj2ísâö0òÜWRÞ‘‰Y$WP\5Óöz[PÆã”ÊüŠß®,íÈø,’É£¸8kf,гž²V/–JšHY‰Ul+#*?³ÚE]Y;ÚÔJ‡’éÃÞâDk‰eô<†&2Ѝ ì(QŠÛ¸è¨Àu «˜mÅ ù™ (özÊÚµ¤ÕÆû·sÔ)¨N/†$3F­—·K¬‰ÈHa«Ô£PuE3Ñuã¾ïm“‰ÓømB!.ÿß‘Ã\à gÿ£ƒsÛ^ÅøâJúó~ÁÀ™ƒô×”@‰›îƬÈ8EÅ;'FÞ_•?¿óï\å¹Z¨yéqê_zœú¬/R³v ‹z{Øò“ŽHù !„¸ÕéâØº«œuñ&·»KÁŸEyåfÿ–&šÍµµä§Z0¨ºìnôæD²ÊkÙzi«Mùµ…¤Y (n'n%žuëÌ#Ó1¦S^›O²Y‹ÓÖŽÍ©%6ÍJuy:F)qKðao²¡RɈ5Ì¢1‘žj@íj¢‹ò­©hÛËÈ[ŸMEG Öüø Í· Ä&[p×d“]ÓMÈ/™kâØZ]B­”eo"»¢eM9Õ›£'1ØãÃÙbÛ悵<ùä“C?y­}hâr°¦iiݶ‰µk ¨ëI¡¤$“£‚mûz&ÎëUåkÆUìØSI–ÙEkM1ÅÔÙTâó«©Í œ7Tº‘«(¯Î'ÞÝ@qv6eû!³$+hë(2++É2Ø©*È&¯¬ob!•91ãçÛ¸ŠÒ]Õä'BW}Û Š©irbȪ¦¶|A·J£øBÅ8”)Ö©·×½ÞzM46¶peë•Fçmäc@‰'ƒ–ýeÙdo«ÃiÉ¡²Ä¿*I—OÉ:3öª²7åQÜà&ÞZI~ŒfdÞ¼vZÜ Ä_zõŒzÆÇ/ü g–rï¿KÄZ>}ëC.Üõs_ú3û2‡_; Ñù,)K"ìdǾ¿_øCè_üÇwð·¶28â9ó™]ú ÷ ¼‰ë'í F<Äœ7¡=ºÃ%í NñJNgñÛ¿¹mËppS§Nqÿý÷ßÖõ|Æ­—¥ÀJø/ðØÎ2*3Ãáïíg÷Þ¼Þí¡ï¼ÂCqf¬é&äÈ_ìýº—÷½Pæèy&ýò—>Ù{ŽS±ÇΛ‡ÏâÁ—â?GáÊyÜpÒÉ3ÿë#Ömù2Ï>qžèø#i¶…ìË1qÏÙ^žÿÎ!žù‡Eü¹é¯|hù"{Wjáä§Tìý€7ŸEÕÎfÅʇ±>˜¸ºš¼ !„B!„·, e5´©åä$Pí TìóbÉ•I!„·ŽÓ\Daz¸2òïs¦~Hÿï:8Ûgü œÏÀÀiÎü|§~Ûʹ3‡¹Øù ÷Ï:ÁiN}w;ýÝÀA>éŸÏⲯ3÷¾VNœ~Õ´E_#rÁûôfïâLà\Ÿ~ow•}•»æ´ãé—"º͸%suþ–D¢B`EÎ ž“n^ûµmôÃ<¦8ËÞ×m¼:#Š¢MyÎÍO›ìl¨gßóFt½ÉÙû)‹V¸”ü”|ɨ¹ê}PÕ¿¾ËßmõGíj^0ràë=Ä«Çõ”ny 0Ùq7KמæÝš#¼ë1òÏiúfÌ!ÿÑ{yLµÜ÷ù³g€ç°ƒ_ÓS˜ù+uþc·Ÿï'µéï¯~”Ç&•à èÿ¥_öÏ´xìùÕùùl_»ÈŸS ¥'þ“Ý'Ï_U^…B!„BŒOSÄÛoKn6cR.;’r%B!nYÓ<ŠÂ1úŽº¹û™÷9ž—Áɘ´ÿ%ÝóßfÞ‹ôæ•á!Ž{K Ñ ü…Ï~ÛNÝ›ô?ùmŒ¥ä?ÿÅÑ÷N6óqá/PG<§rḔÏê†OD=OÍ£gy¥±-®ó!_÷Eö­™`õËB 5ésü7 ¸€·ßÍkMÉk!¿^3Oo?}ç<ä~»yÔ³8xV.\Â3sllùN+=x/_ù¼‘ê¹/ŽôžFÅÃAk¼ïYx/ÆóGùÐË$'r[riÞ Ÿö¢Îy€¥³†[æcO~Ç€¹ò¼ !„B!„B!„¸sÐ>›HØÑŸqú80gø™°ØõD.êäÄ/Ûé?ÐNý›ÌÿÁw™3‡Ó|Ù­8_ØÁ¹€pfE(L >µ²Ý‚pÎtûgg¦-JD£Ã=jÂè‘à Î]ÌŒ3Ç8X}3-z=÷=Ýϱï½É…)¥;Ñ ÈÑ>øUñg)~å=þ|~ÌœÏÿX9ñfŠVËCÆ»‡_cšƒñäQÒlŸÒË´€v!;^X¢W;Ý\=ù/?Áß:Æïþú)ï¼e㕦ù”ü÷Gyà ®Q=‹îf„9#è†Ùçðéc_ÓUäu¥l(,„B!„B!„“6mÞbfFã¿'ÎüD¬øscŽqÒúkFÏ—\ä~î~.™é§wÐß=@XìWÑÎ=Ééc§¹¨c0b)ºØÅœïVQ¾ü ñL?¸€°ð÷ ‚Ù/oÁ÷ê^Î…?€þÅT¦w–ñÙ¨ £‹Ý{qý>†â\¨kf "ýóÏ ùo¶qw¢6‘£]¼˜ª'5¼öCÛä&qÐñÒ \Ñ…nî 8§â£ñn´ÞÏè›9‹Ççò9?dË4ä¯]„ïð‡¼Ú;œÿjdÝ#ëVôSºýßyý°cJÿ1Þó,â¾À±'>ú”Þ< ¼øïç3t=9|v‚œ…¹xüŸO98`ä±p€AÞýY;E3¡>þÊóºòó©ÍB!„B!„B1IÓã²YwéÑiÔƒ|º¥šSG.Ÿ1¹ÐUÍ'oärï†BîVàÂÉñ¼ò-Žup‘Z\ïX¹÷Ÿ¾Ç\õg÷c>ù×Ó^Îæ¾ïóÑA¸xìM޾1‡Èü.ó#NrÎVÍGßïàÂe)ådá·à73ï[É„©'9û»í|Tw‹Rdw¬3‘®Çºv¿ßó'~1©›1)¬ÈüÏîüªÎÅs4¦Å<O;Å?|ž\È}ç>åµ·sÐòEŒá rš_½sï̇ù{S}ð{¯Â—æÌ@g\Š™6Š÷|ˆf…‘Èþ£T4Âøøã<ÌœÅ}3NóÓ–£<ð_gÃ!e‡/Œ˜AížèX­{ŽP¸LæÄ!ŠÞàáMÜ}yB!„B!„B1ýœ*xŠS!_ÖŠs]ëÐ1gêÿ…ÃõcŸïô«ÿÄ¡WƒÿÖΑu;¿Wpèÿñÿvú7cÞŽs]{Ðã÷9Yò'¥ DÀ šCÓû‡/„~©VÏß§?ÌK–+_a¢hï&’x½ÛÇãŸ×òü ñ°÷¯Å;Cá¡G¡fµË6ÍÒ¶/{²·ßåó hg³â™x¬¦0@OÑæ8t{? ¨æ0Þ™³xìñǨ[ØÊmÖ<¬Ï,`KÓ{duÎ êA3EéçÉÿý™›¥§pó#ÿ?{wõçùÿ _m~šftÚ˜müšÜM³U W¨JM Î*Ö ¹œ f'ê!$)dn‘T÷ °¤"2—%9ë2¸—àUÔ.³0©‚Týè©Zz~'}éI¤O‡­I7Q~€Ø´tÆÄ×£ª šîþ~?ß÷çóýtóy÷çó¥ú_~ǾÆÿÀC1ü`K%GQ_£¬"""""""""""²Ð<066¦Y""2Å'Ÿ|Âã?~_û§Ÿ~ʲeËX¼XIr‘ùî÷ˆúÎ "ŒÑ?^â{§Î.Øã»ví—/_æ±Ç[Ðõ¸HMYDDDDDDDDDDDd~R"GDDDDDDDDDDDdžR"GDDDDDDDDDDDdžR"GDDDDDDDDDDDdžR"GDDDDDDDDDDDdžR"GDDDDDDDDDDîM<cׇé\¿Æ>¨8,J䈈ˆˆˆˆˆˆˆˆÈ=éÁï¬àÚÕ/ˆi\ûâK?bV %rDDDDDDDDDDäž´òïJ¹þå\¿z®_S@®_ãúÕ«\ÿò Vþ]©â±h^•ˆˆˆˆˆˆˆˆˆˆÜ“¢¿oçѹø÷•|õ¹—±¯¾ºïcòÀƒ²ø3þ?UDß®F²(‘#""""""""""÷¬èïÛù³wZY°´´šˆˆˆˆˆˆˆˆˆˆˆÈ<¥DŽˆˆˆˆˆˆˆˆˆˆˆÈ<¥DŽˆˆˆˆˆˆˆˆˆˆˆÈ<¥DŽˆˆˆˆˆˆˆˆˆˆˆÈ<¥DŽˆˆˆˆˆˆˆˆˆˆˆÈ<¥DŽˆˆˆˆˆˆˆˆˆˆˆÈ<¥DŽˆˆˆˆˆˆˆˆˆˆˆÈ<õà\žüÕW_ñÇ?þ‘@ ÀW_}¥è‰ˆ,P&“IA¸C<‚ """""""Äb±(s16K£££cÙÙÙcÃÃÃcÙÙÙccccú©Ÿú©Ÿú¹@ÞÏþð‡?ŒýéO»råŠnºé¦›nºé¦›nºé¦›nºé¦›nóøö§?ýiìøÃ‚¯z`llll6 ÇÃÃ?̲eË”ýYÀrrrøÅ/~qßÿ§Ÿ~ʲeËX¼x±ƒˆˆˆˆˆˆˆÈ°—íY餦¦’ž‘C^U+½CßtüfY¾É§w’—žCËÀl·7ÇíßÖ!tSž×ÂÀ-÷ïð¾ƒÛœ^7Ëv&^CUlOO%£¼ÿÝ<µnÄqÎu~âZ§¡/™SL†èmÙO^V:©©ì,oãFQGÚóHMMæ–ÎþÞ[·<к“ôœ#SË5ÔÍ‘}ÛÉHM%=k'åmý·–i¤—¶ÖNÿ@;-§û¿áº ©“9µÁ¯oÚ8ÝR-ÝÙ¿“œôTRÓ³ØYÕFÿˆÞÑDDä.º~X¤8LgÑb]3h¡Tå\ž¬Á=‘…OIû»ÌßÏ¡¬TRSoc@QDnŸacÓÖLl¦¹<ÏKwK3m®@øçµ³[>Õ[DeM e{R09ê)ÜUNç7šÌ™Eù¾Ööîôö§é]íxìIXn¹ÿÍïû޶›iã5DOó|ë+i*J$ún¾Õ„Äõ™ö=—˜øh)¤°Ù‹½ †º²-˜{j)¬ïÃÄ$QSS3åVY€É°³Î²åV*ê]BÞäs—BIC5;l¸jó)nŸzÒú-4¶yðœn¤µÛ÷ ×^HÌ© ~MÓÅ郴&¨M{ IDATsÜe#·²†Ê\,=µVw¢\ŽˆˆˆÈó­ÍÈ œ›Ý99ääìæíósÿGኣ†ÜœrŠ?dxn¯¤ï—ïóágû¼ÒCiî˼ÿÙŒêð/)Î}…_^üº )ëÛî,ö%"÷-%íEä¾Ov^6ñ1wèy Ñ^]M—i+uïb_ö&Ö%'³.s/šjXè ¶¹ïîÎĸ§øqµ»±¥Y'ôCïßCífúÿ€ð ̉vVÅ|›qOûžCLüNš[<$”T²7-‘Ä´<ÊÊ6bñºðÄÆ‘œœt³âmwaÙS¦Øà ÐZÝŒ×bLÙüˆ£™;%•y¬‹'1s?•Ï™q4Ÿ™2ÅÓëÆ°Û13‚ËáÜ|—ãúµÚà\L§[ŸÖA«ËÂs5ûÉLŽ'>9›’’]Ít ©W¹Sî‹¿áà+¯pðÃsœw8¸ ÀeŽóœûð ÅŇé™UVæ ýgŒ œÅ1§LÎ0޶VΞÿ§”E­å™Œ ¬]úu7RÖ;¶Ýo)."rOÐŒœ»i€–çwq à¦q[U}7ֈ駭*œŒñea²vî§¥;üˆˆ¿¿…©©¤¦ï¥mbùÿ`;öæ‘:¾ÔI^Uý7F[ØžšJjÖÚ[ËÙ™•:¾LMÕi4Ê,óÅH'yé;iílaßö RS3Ø^ÞÎÀ@;UyY¤§¦’±½Šö‰Ùlþ¾r²rÑyúy9餦f±sëôKü žº<Ñ`'‡&Ηô¬<ªNŒ'\&Ÿ7@KÎó÷pVl&£jš„ÌP-=R´ƒÄÐAÖ˜dŠêj(Ù41/a¤¼ôœî=Mùö ¶˜8õÛ(ß9~l©©lßßBßHH<ºÛ¨ÊË™8þò‰%—¦/ß`ëvRS÷Òá¼rï35âöÚy'dû#3ÆÛÏÀ骉e°RIÏÙË¡ ~ì–²ùÝ´»¬¤Ù¢Cî{¦ýP÷d¥flgß‘î©KòÍô8³+gÄv3ÒGëþd¥§’šÜφÆï#þeç6êÝ\ÕÏ’¾?Ì2b‘Ê¦Íø'χt²òÐÞ>^/ýáâ:ë:ïÃ?ÇsðÖÐíû–òÿ–¶ébæ\ô»Ûqøld&ÅVû9R•Éši»zš}[(Ù²jê;ok5Í\J²§Îò¹Ý,v¬A3],É6 w7îð÷î'=5•ç{ðžÉgCêf*œ¾ñ²—÷⟩…m+‘ú iê$´ Fl3‘úŒ>¡„‰Ó-UÁbOb]ÐÓb,VÌðé;‚""""wÌ]œ‘óïWÕñÑ… |ôÖk¼vüÂä#Ž¿Æko}ÄÀÀ¯9Pù3N8¹ÒÏYÇ(fd²†~ÎÎ-“óÍ[ú›s7óÄÒ{d»""A4#çn²R°‡ÀDJA ÙÖè‰å]vQ{Ɖv»¯«‹Æâç)ï¾uD:0ÔMuq#.,l©©$sM4 µSú|'>Ì )$Y|8ÏÔ²«°mê5u¼'©¨ïÁg€×™jªÏh7™G.ØTÖıÊõ:*x~W ¦ÜŽ5•ä=3e–KÀs‚ŠF/iuÔUfcvÖ“_Úùš;þ>ä—ÒadSÖÐDÍ =ÕùTO9ßÖ{ìÏY ìeïqjü-ßÂ÷»:qcc“}ú¯ÊÇÄ%“{óu7ÍÕ-°©€‚Mð÷Q_X‹Ã’KY]u•¹X”6]ƒ#ࢹ¶“5;j8v¬’tP]ÛÅH˜ò™l™lÝš~I­€‡µÄï©ãXC ëé º¶gší¥ñ£í3ÄÛßßHqu¦ì2êj(Jðr¢´ša½¥lžvœ–MØ£CïOslþ>ì*æd`=EuMÔ%á;QÌ®ma¦Çƒëm†r†7H[q!;$Šêšh¨ÉÅâ¨8þÐ2?ÅßüÓ»X l%ïñ«ªi–›M™oi3½ÔæWÐcÎ¥²¡Ž’4/õÕxƒ·×Y×ùDŸã9HÄ}—ÿß““çbÀãÆk˜ð)ggVúøµXÊÃ\‹ÅßOK½Ûžlâ‚=ØJus€Ü²­XC&š&¼ž)±óy<ðâñAtb¿:ÛÄV‹™ gù×÷ʰ6JÞûW~UžÛQ¤¶©2GîwfÕfÂõ‘švø8…ŠŽËãБ}ÄOl„î–3xLvìf½…‰ˆˆˆÜ)Þ½Á½Õ<“ý´Öý–ðs>¢ø‹¬§Y9Ö®ôŸÅ1ú(Ù6°¤¯<ÛÇð3O³àâ/yåÕ³d®áËÇŸ?üËb^>»Ã5ñ|øò«´]êvð‚ãu~þÂÄs>û%¶òÑÀe–<ú/¿Ä3«'>µ;xûàQ>t^âê’Gù‹ /ðrnÂøþ®ü†ÒßgÃþÍ8޾Íù'+9¸¹Ÿâ—ßgÛyæR ;*>9æelxã0»×\9ÿKŽnåãËŒ²„GŸÌ⥗²xbég¼ZÖÜ ”Nl÷+g*W¥/¶òTñη¶ñQÿ%¢BkRè¾Êø)5T^ÚÍáò‰¸2Ì/‹_¤5þ Þ|ê}^­[ÎîìQÚZ?¤ÿÒÖ<™ÅË/m¾9[èÊ9>xë(ï;¸<ºŒ¸¿Ìf÷î°ÖðÙ‡Gy«å#ú/µÂΆݯðBÂr‘"ó@NNŽ’9wM4k’’°™qxÍħ¬#.Fº›9áÌ[hxw|pd°m'Ûj]t4vPœÉä†ý´–ÖÓá5H*©cßÄ4€3ÍôÀò\ u¹VŒ€‹æ]…œp¶Ð6IÞä[‚wÿ‰ìU0вçݸ:=ø3WÍŸ¥Œä>gTP@Z\ Äe“i=IkB {ÖÅ•ìõõt¸¼€ñfmb}YÙ‰Ñ@¸¨m[OQI Ö€‹ÖÚZò«Í¼[µŽØíœd#uIÁ¤µ¢_n[×DãuLÝwlR. TPߨuO†ë Õõ.Àt’{qṳ̀™£Á××d»9ƒ'B;š©­$9#ôAú‘Y¶ó°}Æ´µ9N‘q?§kK©î°¾rOPrGDDDD¾®»4#'Àðù>úÎ_üK”ý9Ê~ÖLóÏÊxÎ5ù÷«—Îqî³áTœXVmÅ“<¹z%ñO¯€þSôÍjRÎj²Þ|“ÌQÄþœ·_~büãðè%Ný˜¸ÜrÞ|ý%žæ#Þ:êà @àG‹«8;ú»ËÞ lwWOUQ|ôÜÍ2Ž^ õ­÷á™xá™S‡â_âç?ÿùÄígìûËe°,§V8ÇÛåÿHßÊ, Ë^§l_«ûŽSÓzž@¸²N†t6å õèǬÎÞÏ›oîã>â­£WĸÄcÛ@TÿYÎÝxòpgVðô3b£—NQ×2ÌS?*£lßf–Ÿ{‡ÒšßL\¯è"¿¬ª õJ»ËÞàõýY¬pþãäãóÇ©zëc–l.¤ìõýì¶sªæ0Ž+:!Eæ%q¾}ÞÞñ ›×grc%œU)ÙããÉî^ÜÁ_{öœá¤ÀŒÕv㫯~<Ýîñ‡çóìæÍl~¶pb 7.OÐÌ $L¼Ì2ñúZ EæÃŒÕrc¸ÑÀÀÀgžÛ4ŒÐÁMë‚–Š¶­Ãfxèö„[Jȧ×MÀ²Ûä¨f ‰{P•¹jnE5ðâ :…¢í%455ÑÔÔD]IÒ”$˜IHúÊzôÒ¶$€ó4­G°ïóv„^HÝŒ=è*ç†1Û4A8¡Û3渽ðñ޶ç²ÅÒCé³Yäí?@K—KB"«¦Ü¤§Ó -!&Ìý~Ò5^gö qúXû:,7.ïÌ›[9oò¹œx}=oN%5uü¶!ÿ$^¼ôûn£ïŸU™ƒÛÌx_°®ãfÄ`[g×Û¨ó9Ÿƒ‘÷=¥ÍÏá\/¥…ç*ËÉLN$qÝøµX¸åZ,ƒt4;0gO3ØVA³o e[×LÿE…Ø4Ê*·bœ,fÛ† <›ß‚±1 ÆÍóÖç‹«ü>s<æè™ÛQä¶rû}ÐlÛL¸>c¤sïÄ2Ž©¤fì§×?‹8…1Ô{„½ÛvQÝcṺc”¯‹Õû—ˆˆˆÈtwfäœüi7¿ö(?z)‹ø•ñd½ô#>üÉ?rQúàµãvöÿsùÄR3!&–U[±áiV$<ɲã§8Û7ÌÓOÏbFÇä6£¦ü9.÷e6',V“õg[/Œ'%œ­|xÕÎKŹŒoþŠGûyñhý?*&€Q–dìç•Ís‰¦$•–²t¢XW‡9úë¥d¾±›ø¥@`) Ù/±á™g&–K[KÔGïSqéJIJ\™U¹`uöËdMWVv§ŽŸg˜§Y:C\ŒµHˆªâlÿ’–2Üs–OñÊZÎ,á©W ÙoO·ü/¿ÖÊo.>͆«m´~fç•ù$L×Ú ¼üÚ)ú†ŸæÉáÏŽŠãGÏ$¿X»ŸO_bE”NH‘ù@3ræ»[“,&« ŸÛÉÚ3dÉdUÐsl{*Ùc›úÍj³=|ФÜ/Œp§ÎÔÓjÎ Œ[E[×a¥‘ÓÎÒ’'FdcV7ñ론 p±FÐPéP7UùÅtIlÜ”FfA6™­…TŸ¯†aÜÁ¯¹‡–áNÆ;&‘½ÿ|–ìÞ.º:;i¯/¤±6…²cUA³Un»ƒv#²˜0÷¿Is)gh»1o¡¦.7dù)Óªoª9ϱ¾¦‹ã¯ó;¸ïç¢a6c&ƒ¯ÅbMÄB+ƒ>˜œ’3ØE«ËBfJp%øñt»ð¹ìÚp<èïÇy>õ)uP•Mlò^þéW{ôa¬Š%нgÏX±˜iÍÛE£ÓG(ÜœÐöŒÓ4!{Uøv”0C[ñÜ¡>(\› ×gÄ$•qì݉ÎÑ0aŽöãœEœn©êöý<_Ñ…icÇŠÒX£™8""rOXβš·ùî÷‚ÿv…@_7Ÿ77pùÆuÄ—ÿÖ·þšË…?áò¥ÛßÛqE<þ\øq-_L·\Õò¬oý‘Ÿðù%ÕŽÜê.^#çΜ?‹ctONÌ 1}Š„%à<ÛÇíOèXFÜÚ%“÷¢¢ŒÉÔÉðù Œ®x’¸ Ñò¸'Y1úç‡o¾>>~†$Òðo8xð#Vþ¨˜ìµÑÕ<½ÁýòAËQjÊ_¥â£«³*ñlË5õ¸¦K …ûÀdžø(úÏös…azÎ^`ÅSϰzò kyríÍ5ŒµO²6êŽK®ž?Çå«¿¥jG99ã·í¯å2Ü¿F\Vü–/æ(ï|‰öxV:!Eæ%q¾µw¸Éfs¢ ðvœÆ51‰`°«€5Kð‰y+uu•l4ÎFê»G€,öñ‘.߈•„äd’“­\tv»”ÑÎE§ëæì¿«WÀL¢%ÜÈb4æD ¸;¹ù2?½å9äT…¹îG8«Ö“kÐSÛLoè(FziltFL(/“´‘º¦ìËÝDrœÃ7ßçÈ…÷P÷´81%¦‘½·œ#ï6°Åè¢Åq닆í°.ir,>ô~(³ÍŠáéÄ´©!g'ÊÍ<óãSö=‡r3Ùl˜¼.¼¦U¬Z5~3{Û¨­ïÀëŸ{$çRæm×rKÛÁÕé×»iîûŽ|.b]‡5à¦;hZꈻfâ‚ò£ƒ]m¸­›˜’Ç!{QÇŽ›¸5Q³ÕæT65Qd¿¶ÜòCôŽD³*–hFp¶9Áž†-z[jŽQ³Õ‚)©’wßm¢Än`ÝÓÄ{Çjز*r;ŠÜVn¿š{› yìdyVÅÆ=›8ÝÒquR]݃uOÇö+‰#""÷žë½‡pï{•’Ÿò‡ø/\!™ïx“ñ_ƒüž?}ð?ðk%!ù–Ý9FÅo¾NÿÇÇ©9îd” ¼óÖ¬~åÖÎóá[ïp€(âž+乄'ˆ3¦äê?å`”QNýt;§‚rž¥ïÊÓ$M÷ªÑÑ×å¢ –G},ÂL¯|Æ•oÑ÷7¯¾ùM«a‡K«ø(ê/xæ™§ÙðB>(çàÕ;T»QQ·}\k7ÄÃÁ9ÿ™³–³á•Õ‘v6þc”ñŠeØ_žÉ£QS·¹tbÖ ÿ™Œ¾ùøãùèí Ž}’ƒÅ<­Ëäˆ|ë4#ç.‹6ˆ5^­õ‡°íe]¶Zº8î9Aþ6 §0³±`#«àæÀŽi¦ØDvì±s¦ÖIWm3ýÇö—™‹ýx-Îã»Èw%aö:èqù0ŠÈA3rdóq¦¢‚¸’\ì'-µ'ñ%”±q f\>6ië)¤¢"ž’Ü w Õ>ìuV¢qOyn |7C#ñÄÞ2[$–Me%tæWS¸ÍÅ–›H¶š xº9Ý|·Å†ÉáÓ—Ù‚É礽§³ÝÀÝÑHu—€ÝןÈl&y„–o¤·•æNƒÌ=™·5Àº½àû¦âmxÜœi<ƒÏTB¶ÝÀÛÓJ—×L’eü•7˶w{€u7†üGpN¹?MYrYo*¤ºâÆž4ÌžÓÔ×:±lm Ñ3<ÜD*ç½­Ít™ìÉœºÔTt|.¹Öç©.¬‚‚L,¾NZêãJi˜L¸Gn/S·3S™§ÉèŦìa}}1q”äÚÁÙB­#011jú8ΩÎoû<¼½}G<c­ìI©§¸´š5EÙØš«»0m¬#er7C8ÛÝ˜ì „æ1¢c×°&¨8Æc|Ù¸¸5ÇiG¥E¹ÉΪ»LliJ¿–LŒAÀíÃ²ÎÆ*“V¯ {‚•ØØè‰ÿT÷£™ÚJtÄ>ȶNn§ÍÌø±dÆ8Mm·G+=+ÏY<ôtz‚;4ì ñÄ*±#""óÜØ¥OñŸÿ=cœã‹»ù²ôç¬zñ¯.üoŒ^=ÇpË9J¾uwmFÎÒÕO°vÅÒÉ!£Îw¨xq;~RÁ;Λi–%ËŸ ~íòé§•ú9åeÉ“…¼ñ曼9q{£ðI–àäTßDjtt”ÑÉ­W¸à¼ýùhË×>JÔ¥éZ.m¸ÿc.E­fí¬’Î¯âá§xå•§ ~É•¾V~}å/){£”ÝYϰvQWgH:ݱrÍ¢Îâ67ê õxVlà©)yœó||þæóq~t9ñ+ –¬]Ë’Ëç^º’•+ÇoˇÏrôß0€aG GßïgiüÓl~á*¿Î†¨yv:‘o˜’8wÛÖïXÅoO½>?DÇ‘×ÔDÑF;–€ ‡Ó‹Ù–žš&ö'N?"²jc[Ì€çµgaU&5ME¬·™p÷tÑã6‘°¥„†šLV)è²Ií0qº:ŸüÒfÜöê*Ó"HÇ$RÒPF’·…Òü]Ö»±ÕQ”:òn!a½oc>ùýÓS~Õ&ªŽ5P”Ž–ZJ‹+hlscÙÓ@SÍ‚.Uq‹èÄJ¶˜è(ÝŶmÅ4¤QY¹««–Ò“³8ø[ËçsµqâD;žÛ fèö¦ÞÌï˜ä"*Ÿ³á¬/&W!­^’Jê(š¸údÙ|NÚ½É$ÝèœFBîOW–èDö7T²…ªów‘_Û…±µ††¼¸ñdËLWÄrúpµàÄi÷4câkÈ­«cÅI}q>…Õgð¥”QW?±™ÚKȶçPæ ÂSRWD‚§™âüBj»ã)ØcÃ0b1ÓÅqîmè¶\¹}Ït.Æ\Ö@I‚‡–Ò|ò+Úl¬¤¡(ñf|ünÚ]`M¶2çüAt<u%¤xORQXHm»Á–šöN^hÇK¯ÛÀf3CÀÓk™2Ó/r;š¡­D<îur;mæk›Ún½nàâxE)¥¥A·âZºô¥¹' ãûE×V¯gé `ùz¬ÇƲQD=³—?;ú ž8ñ>¶·^gEÂÍØEkÿ KM3¶ïóĉÖþô?òÐ’)ÿ¬õtÞÄë§{<È’'XþÓ7yüøû(þ ïÌô?è£ÏñæÁ,¦›ûè«aGÅ9žyã0»ƒ–õ"pž£/ÿ”×îãç¯|±Š O½ÄKYqÐ×Ê[Ç?âÒŠóóš°œÏxÿåWùpÃë”ox‚åôPúâ;<ùÆa²&vzå7¥¼xüIÞ8œÅê@‡_®à£Õ™>÷4Ë/}È;ob8ã ÞÌ]‹qå7”¾x|Êëþâ—ßgÛyúÂA^©ê#a%/Ä]™&j)Qýy±â<Ïì{…Œ'¢¸ð›ã~çc.Çý˜Ÿ•ý€•FHYGon÷Ëg*×øqÙß8Lîãê)åÅwì¼q8wšø†ìk)Àz*_äÀoGyôG?ãàÄ5€çòâkquÙ“üèåLâý´}ÇêB—?=ãW^å8ÉK/l`Å•yÿí6Î'½ÎáÝO0ê¨áŪs<ùã—Éx"ŠaÇ)Ž?GÂë‡yù ­¯&òm»ßgä|úé§,[¶ŒÅ‹«1ˆÜcü}å<[ ò½*õ-pÅû~0ØÍi‡AҦĉd¥ŸþCÛÈwðÞ‘4b!¹ü>cQßY1ÇW_#ç;ý?哟ŸcÊù’þì¿ìåZY.>[‡õ­ÿÈåŸ𧥻X{`=>„·/@Ôvayú"Ÿþø?suô ¾ûo°´¯‰ÿóÁÿâú’?瑟ü-ýÏWùýÛ¿‡¸"¯^ÇâÏ»¹xø_ðGý9æÿ–¥—ñ¿÷wpmÊ5rV²¬êg|gô¿ãùç.®-ýs–¿¸ Ógø}e׿x¤£¼Ä÷N]°õíÚ5._¾Ìc=¶ Ûùœ–Vûzƒ{+Ù\ºó•­ŒnÞMÆ•£¼6‘Õyô¹×yiù)޾Yû§Oâ@€þ³FWd±6d°ßx” Ϭà쩳ôQÊî—þ’š£oQñë%<úd6/í¾BÍû7ž¼ûSq¼ü5J/½Á›ÏÍPl#ž—+÷±ô­wxëµ6®.Y=c?•¹kgq1ÊŸýÆÁe®ò몟ðë GÖ¼ôsjžy—6ÔpôÀO9µ‚¸gž£xßÞªûGjÎÆS³9¤¬Ùwª\Ó Ù×îµ,%~Cüv˜ O®œúô¨¿àÇÙK8{ø5Þ¹¼„GŸüe/ݘq´š¬ò28|”·«~ÍÕ¨eÄ=SHùž¿®QÂnŠ3sô*^…¨eq<õR9»•Ä™4#GDDä^ᡵº‘Î@ ë-œ­Ôžôa/JPGDDDäv^a ƒE¡—¬X¾šÅÿÅð‡Ý|1 _œÿÏŒþf%££W¸ú‹C\þŸ|yà÷Œõþ ­ úb?W¸üƆûGs\^É÷ªÈ#vðÇ Km<°ö?»úßÌ?ÆÕ‰mýŸ7W³¤ú¯Y²¼‹-jt_º‹3r¦ œ›WzŠK,cCè ™7>ky™W™ü¬æÜHåÎäŪQŠ^L¼ªMdÁÑŒÍȹWi†ˆâ}?ì#§âüÚDrˆJdõ;%ðF.ŸOžœ‘ó§ø7ù¿ò½iÊ|ïÞùã…¹©fä, wqFÎTÆÚ8ü‹ÔÓÌWW>£¯ïcZO]"nw+‘û†fäˆÈ½*:¾œS§Åûþ²jÝ^­Û«@ˆˆˆˆÜ!¬þ\dèbȕ̯þ— ³ù<>Ó“Éļð:+^ìf°°šùnU1£ÿ/úŸ] 7ÿw†7¿Îª¥‘ö4¾ý±Ð ¦GŸŸáÓ²ÿF`Êc®_RýܯÍåÉÜ».â­ï3üäyé©å ˆÈ}$''GA‘ûÐrL9),þ¬ƒ+!I“Šϳ2ëßq½¯‹á·kùÃK?e8Ì#ñËYÿC–-íàÓ}ÿ™‹ïwpõüEÆ–<¼ã{Ä¬Žš¼ûÀÚ¢‹\ I]?ÿ{®=ò=¼z‘¯.ß®-ÿ+¾»c‹£TC÷«omFŽÌoÆÚÝþÅîé{âÞ~[1Y¨ÔÏ‹ˆˆˆˆˆˆÈýàßã¡8Ư‰³r5Kð·<‘ÏKþ¡eÆxŒÿkûz]9Äpÿ(‹þÓ#ŸsåâÆŒ‹\[ú1 ßã«þÆÓ‹%i)‹Î­fqÔ¿q €¥,{uþŸÿ _Fý;Ì/ndQo5º}~¬ÿ_ð~vKÅ^h>ÃèÒdÌ/ü Ñÿôæ2nrß™S"Gƒ{"" Ÿ’ö"""""""r?X”˜ÏŸ%Þ¸w…À¹nþϾ.Ÿ¿5crÝÑÀ…b4Þ IDAT÷öòÝeü_\ÿü1ò³×¸Ø?ÊMx~YÂwÿÓ›<¸Èþ.üÃ,¯æóèþ?œƒ±‹ÿÏÞ[NìËo°réç|ÙÓÀwsý–=}Æçe¯ÁËy¬xm=‹ŸóŇøCsȵ|ä¾òÀØØØ¬êÿ“O>áïþîï4¸'"" Ú§Ÿ~ʲeËX¼x±‚!""""""2Ïý>cQßY¡@„1úÇK|ïÔÙ{|×®]ãòåË<öØc ºu™B×È™?æ”ÈÑàžˆÈ§¤½ˆˆˆˆˆˆˆˆÈü¡9""2…’ö"""""""""ó‡f䈈ÈJÚ‹ˆˆˆˆˆˆˆˆÌš‘#""S(i/""""""""2hFŽˆˆL¡¤½ˆˆˆˆˆˆˆˆÈü1ëD΢E‹ø¯ÿõ¿*b"" œ’ö"""""""""óǬ9=ô?üá1‘N3rDDDDDDDäžñÀ0v]q˜Îõk<ðàƒŠÃ0ëDÎw¾óÞxã rrrøê«¯&¿±­Ÿú©Ÿú©Ÿ 󧈈ˆˆˆˆˆÈ|÷àwVpíê Ä4®}ñ%‹1+ Àcccc³}òW_}ÅÿøG_}õ•¢'"²@™L&V®\y_û§Ÿ~ʲeËX¼x±‚ˆˆˆˆˆˆÈ<çÿ“ û^añÃKXôP4,Òÿó\¿Æõ/ý\ûâ*8Hô÷í öP¯]»ÆåË—yì±Çt•Î)‘#""÷‡O>ù„Çü¾Õ[DeM e{R09ê)ÜUNçÐ]<æ;¾½;½ýiú W;{–[îóûž]§0—vZæ!zšÏà[_ISQ"Ñw³‰ëÝkC3í{.1ñ3ÐRHa³{A ue[0÷ÔRX߇ˆI(¢¦¦fÊ­² “ag5dË­TÔ»˜r”þ~Žäs—BIC5;l¸jó)y“ò;[hlóà9ÝHk·oaöeáâtKµ Ð\XÁÖSR×@]AžãŔޭL“ˆˆÜ³TDDDDd>1ÌVìqq7¨âã±ÑÉæŠvœC¹¬‰]ÈG?ÈÉÒjz,ÏÑP—G|ÌÄŸ“×±iË:ì*¦ºº„iÄÎ˺³M©»x»…AÇ.δ¹ð'ÆßÕØoǵµôXöÐÔKÜNN#iÍN¶ÕÖÓ•{ˆ´˜{àPbâÉ΋ÿ†w2D{u5]¦­Ô5í%q2.ɬ[ŸLù¶bj›³IÚw?´ÛáÇÕîÆ¶É:ŸàûžÐŽøæD;«b¾­¸z¾å:ý1ñ;inñPò.{ÓbDl&/Åm.<ij&6ŽäØ©ï?mÍ.,{šØ4åï´V7ãµS{;G3'S#n¯wB¶?ÒWNVΡ‰÷ÆtRS³Ø¹¿•þ‘ÙÅî–²ùÝ´»¬¤Ù¢Cî{¦=¶ˆí6ßVOmGáÛhhü>â_vn£ÞÀUý,éûÃ,#vç´ ª¼‰ó(ïííãõÒ.®³®ó>ü7Ú\gËÄç® ¶—·30¹ÏT2¶WÑnòEð¾o)ÿoi›.&aÞüîv>™I±A§Õ~ŽTeN&Y¦tõ4û¶P²eÕ”¿´VÓÈ¥${ê!ŸÛMÀbÇ4ÓÅ’lÃpwãï~ÒSSyþ¸ï™|6¤n¦Âé/{y/þ™ÚÑLïÓ÷Ì}Yä63‹÷Ë0ÂÅéV&ìëÓ°ÅÍd6 @ŸŒED$%rDDDæ÷ jÏø°&Ø1y]tÔ4Å@+¥¥Çéq°ØìØ,>Ü=Ç).==þç`ÅÅÇéqƒ5!»Ù‡««‘Â҉ˈ[HJ2^œN/ø=t»ÇwëuºðáÇ5ñ{šh?GòwQ{Ɖv»¯«‹Æâç)ïÑóvPQ}§Ç£¿ãЮRN8<LVÌÞêëªw #x0ÃÏÈ`7ÍLIÙ$Ä ÒV\H³/‰¢º&jr±8jÉ/mgð÷7R\Ý…)»Œº†Š¼œ(­¦{ð÷q`W1'ë)ªk¢®( ߉bvè›ý’W7ÍÕ-°©€‚M–ñmæ—ÒadSÖÐDÍ =ÕùTwÌXÖP>g#aÊb°û&l¸ét›HJ2ãéqŽoÇçÄá<œCŒŸÓ=^,I ˜.šk;Y³£†cÇ*ÙHÕµ]×l™EC9BÝMÖœˆ¾ÖzZÜö4+Ñþ>ê kqXr)«k ®2«£‘Òæñ¤q¤z ÿ˜yöq˜M݇çP'ùµô˜³)««£dS€–ê.|aFÛüžNÜXYg›æ«ò1q¤eo"16\Lg¨‡Ë2›z ×Ö{ìÏY ìeïqjÈ ˜ênÊS#¡ÏuuâÆÆ&ûôS bâ’I޽Y–iνË5Çc6Ù2Ùº5-ü’Z'j;‰ßSDZ†ÖÓAumÏ4ÛKãG!Û7€€ç^Ò ê¨«ÌÆì¬Ÿ]ß5]Ù<í8-›°G‡ÞŸæØfjÿsèçRÇSEj£¡e~Š¿ù§w)°ØJÞãWUÓ,#v;ç´¿—Úü z̹T6ÔQ’楾ºoðvCã:ë:Ÿ8o.ØTÖıÊõ:*x~W ¦ÜŽ5•ä=Cms˜÷œ[ö\þOfhL"¼ÿhn³bIó`1Æ—‚9ãK ¤òÆ’&qTœ<[Û‚³ ŠÄÙ•Sv åÙãC.#œ ¤PY–=^žø"Ê*hõøf,kZÈ*_LfÂ.åo˜°<>°®KÀt²×È&L®N<–|:Ý~6.Ú=&Òn. dÝQBnr,°†ÜvN4öã% c¦2·s8¾ŽB6t„ôn+)K‹¿ä%dnÜ41ÛȆÑÞB¡gbVI„z ÿX4æYÆ!à(EÝO=ÎÁÖFzŒ4Tæ $–Q6°ü3áàÇ ³iîíh¦¶bïˆ\ÿ¬ê1|;ˆ™íœnÒ¹î‚EªÇÐø| 3¦ ÇüÝ{ÙPìjóë©û |ÚúÁ?»rÍå˜c³Ù;CG`ßSBöÄövä¶r²ÙnÝÞ´15±¾¬ŒìÄh »ymùÍt ¦±e†Ø…–m°Ç‰9-wr7Sî‡ì{¦¾Ï6—¾qulöý¡1«žxvýùÔ63ÔÞH©)Ëf¼ J(é}–bgø¸Î©Î'~O*( -.â²É´ž¤5¡„=ëâˆÆJöúz:\^ÁÕvß‘ûÞ‘žðï?“.jÛÖSTRƒ5ࢵ¶–üj3ïV­›òym¤§‘“l¤.)ø¯ƒ´V4ãËm`ëšh¼Ž©ûŽMÊ% ê»±îIÀp¡ºÞXƒNr/.Ÿ™4s4øúñšl7gðDhG3µ•$gøã&B_6ÛÏaûŒik!rœÂŸ}T=›Ï`ÝJÖ5ú("")‘#""2XRHÿj1öLltáðtãÉeMâ>*‹Ú9ÙÖHñNN—gÊÒ Ñ¶M¤˜zèò§ðÙ㘬 ¤¤d²§ mü[•³xÜNW7.—7fÖo1ÓqÂ…ÓíÄá¬i$Ä‚·uü®æõ™Ü˜0°*%5.w/nP"ǔŽñÄFûéëÏØX³×O|q ë³mÔW+“#Ó°QWdOfø<Zj)­Ïä½ýñø\N¼>Å·d{,ôû ÍžËK!¥ÏfaOIa]ZëSY .7K6ö ±ªXû:,Ó¸¼Ì2‘c&!Á<ñ»O¯›€e7'aĸ÷‰ÀÐéÊ’È1Lø¼„]¼+àÃ00™ ¢miØ©¥Ý=‚¹Û)©ˆLOnFŒNܨɼ`µ{Еž ãæ׌ñ4‡sxFB5u‡ÉbaÕ‘Îè5¤m1èsœ¦µ·^g=¤L<¡ÞˆôØ,ãà=9CÝ›¦«[†½€›×ýŽÆ¶Î†.‘c˜0áÆëƒi¦04à!`^3ñ­ë©1\~Ì3”e¶õ®D4CÝMyj¤ºbšöðâ ÑŽ¶—ÐÔä›8¦FJëÃ{³-×ms„óêöŒ9nÏÆº wѶuØŒ3t{üdÏ!v0HO§AZeL˜ûSygèûÌ3õÆíÕq°Ûè/2Ó1M{Nw» Xs¹Y1ØÖYÁI„8αΠ3VËטãÌ“]‚a„{õôûß÷F~ÿi7 ÏU–“¹ ›Ñ˳ÅÍt ­#3öæ~;š˜³‹¦ÌÆl« Ù·…º­k¦¿¦Mle•}—³íÄx=¦lMÂtÂ{39ësáÅ‚Õ ~‡ Ÿyæè™ÛÑÐ ý¡5ÂqÃÀ×n3áúŒ‘ν<[êÿnJ¡î½*,gfˆSØ~ÕFAÓ1²ÝZëk),ãÝC›t K‰‘y!@ÀÏÄ@V è¯0Ò[Åó…gðVR¶dR”=DKõ ÜAÿHW½g§÷Lmít9œ9îàÌÉvÊŽU‘6ããvÒlàpõÐÞ `ØHK³á´ïJ´p¶ãª[W§+ü©c“ÈM€®úúBb7ØÑŠ#Âõ`"×ÃÌeù&ëq¦º ¹®B¬ZÏÿßÞýGÅuÞwÿHˆ;®5y°!V†¤9Íf‡v î8= Ô 4`§Âì1R·’¶F4E4‹IÑs€ÝÛ š"š"ܺ•ÑYµŠ‘M ]Ãî²]hMck¼ÙLe3eôcûXÀh˜¬#éý:‡s<3wî}žïóÜçÊ÷;ÏsKA´ti4\ïp)ÒÓ¿×S®ØáÖàÒ`¡€»_î EiVÓºb79Ö/e¥_?ÇC_‡ŠÖÿ×s~¬«oáX³Ñszåx=-÷ gÕ¸ÞNë?väëlY²=^44í•WíX–ê•Ç–¯y™ä¨ìÔñãÇÿ:Õ¼Û*YòÔÐÙ©J‡Išìבº£6)!9I&MËÕë’¹²›’UÐ|\Í»­2§7èäÉNU; ÙJ;õÒñf$GîGÑÆÃHõÜÔ>ò¤ëåINJi-q áªWYE—Î-+h0èWP?€î¹Ñ£ò<ÿEWI?ý£¿Ò%eèCG¾ªGR·.ž¤oê_¾ý].+ÜYÌÈ &xuªìi Ù ù<>e(½4O)2i<Å"É/wËíï·È7æ^ñËr³Ù«‘! éŒÓ!kУ¯$á,«IfäÏ%Éšž.KÇiù$YœYÌʰJCž…íò× IpîÓnëNxO©¬xLN«_c.¯$‹òÊóV}HkRæ>å™+ÔçnÓÞâ^Ùä‘ÇG«c I~¯üAÉ”Z¢Û^5U4Jå…²úÕÝvBîÌvYMRPõuôÉo®V‘Ão¤GC>‹Ò­f%ØK”c®PSý1¥¹²xϨ­Å%ëîÎ…‡K›­²õt‘½Ä!u©e,¨ÕŸ|.%¥—*Gª¯OUu‰S†§[M~9ZmJˆRÖ%« ¶RÃe-*Û;ªÝ%ùʰò¹‡ÕÛ}Z.eª¶:÷ú>‹3]æ¶Sr[ ä°H&K–ì:¥UÏ:×ö÷hñ¼YwÅ ‹Uf¿Ký#çdqò t¨iȯ Ã#_ MæíføWÿl­qHpFiû0õLÎ)‘³£IU5)ªÞç”áêQK_¤Á+I¹Õ•êÝÛ¤²½=[’«…û½ê>½p¬¼÷gǬ³LQÊr3Ú1AAù½MN§®¸™­í’Wœª‘Û*4^ùµÕ,kRE±[ûò•a³(èÖ™®ÓòXí2{6Þ§Ör¬¨s‚4=Ú£®AC…¥…‹K®Oèþ–¿^ˆ€_}õõÚQ]"GÐ¥î–Óò;k•—"Þȱ[*[Ž<ýAe•¿ßJÓr­x¦,Qú¿)Úùá_kOk´§KƒF¡J W.5eZÃx¿•Vî{#çtRf©rÚªT_¿CÕ%ÉÕ½0Æ«Çq£çÍúlìØ‘®?¦$›J3ÛTUÓ¤”Ê"Ùƒcêj’9¯U™×3)W¿g!ù:&%¥(eYqŒcaÙ¸)‹õ´Jcõª©7TY’!ÃÕ­¦!³ :Óž%“`(èñËšeW²Ù¯ŸY§MII éZu<ŒToùVm“ô™¨×ШqZÙo“Ó ekkSSÛ•çÛeøFÔÝ2"#§YNfãwÄü;çøÉ›š—$½®+?ÖÕš”üÜ“ºXñ7š¹üº.v¿N pÇ1#€X`{VÕÏÚ%¯OA‹]9•íjÈZøß¿”‚j•§[eÈ'ÇPfe¹œ†$ÿ˜ú=%dÔªµº@N«äшË'‹=Gå­µÊMRÔÏ%ÉdË•ãýagXe’EvÇâM7{îÒä¦:ØÙ©Ê<‡¬A·Æ\>Yì™*mîÔá´w¼Liªì¬UÃ*Ãç‘ÏH׳ÏÚiw¬™a±Ë¢1uLJJQIk«J­.µU•©¢©OþÌZµ–§Ê$)!£R ÏÚåj«RÙ Õ÷ø”^ݪÊT“dJÓáöh@MeTÖ2$cw³Ú..–¡Êê<™‡šT±·L-骮LWÄg×'¤©º½Vé¾nÕ”PE›GŽÊVU¦%D-kØÓ%¥PGNvª2]ëiQUUZzÆdΫUçÉ•K™lYrš%Ù³n„šlʵK2;•e]kt×_Æ0¥•«ºÀ¬š*.®R×x®òds·¨æôxÄv‹Ø¦kC´¶')_Íí•J÷õ¨¾¬LMg¤’†Ò¥~B$çëèÉV•Ú½è¨WUU½ºF‚J¯lWç¡ÇŠÖQËòAÛÑ*gŽC¾Ž2•uœ[ñ«öhm·âtˆÒVáâÕx¼]•™ÒXw‹jªêÕÑ둵´]Íûd7o¼Om¤Î~w¯Nê²”èZ÷·òuP’ŒtUî3ëLS™Êjºäq”«µa!9-v×Ëæw©ß—¡ô÷3UÓ!¯Ã•%Zÿ_Çù¹œ~¹{OéÔO˜{âÑúèê}pAȾ7rN'd¨ºµRNo—ªÊ*Ô2œªòR» #IF0\7~ެ˥;Úõ'AµíªvzÕ]S¦²ú^óÔ^™¶Ÿ€Gý[Ý©. IDATnÉ–a[ÿxoJUykµ2}§U_Q¡–~CÍí:týA;>z Ùí)è‘ËgUÚ²_0DîGQúJÄzGh“ô™,¤ß¦©µáYY\]ª*; ²¦^ù3kÕ^!ò8@¬¸(ÿ7†4ûX޶>"i[Žl'þT‰HR¼âí>òçßÐã§¾)ûŸ}Y8·]ÿææ>)ks—ì§¾©ÇOuë£_ú¼xpÅÿÕ(þW.~?ÜçË<ø¸¶}é«ú¹ßÔ㧺ô‘/<)S<­s?Û4???OXpþüy%&&*..î¶/pœ’ÏV®“/)™&àž8[§§«‚jx©Qi&âqGL ë̘¡ôü´ÅÙ;Z¬2W¹^:–Ët¸K½¹ë3Šø‘u~ká9Ÿû’þß ¯kÅ ò3õ‘¿:¤ÙÚ½ýV–löyMUüžþeë}ôHŽ‚/•ïlPñ¿~@Ö_½ óÿþ?éòÌãúÐ_|E[Ïvꟿýšæü”ú½ßÒûE½ù—oJ;*õsMYŠ{oX¾ö× ÄJ–ç~K[ß9ª7hvÅ3rUbãŸêá™oÉûâf·~JÛž; ó[GôfÃf×YÓ™wßÑǾó½{¶ýggg555¥íÛ·ßÓýœ¥ÕÀ}À«ž¦ ›UžcUÐÕ£–Ó~9*$qKf.i^†6LJLÃÞö˜â‚¯éâß ëÊEéÊOþ“fþ磚™‘¤Kºü£šúÛ]½,Ioj~ô7µýÑ­ËvpIS_9¢‹çf$½®·/>ª5ý[=ôá½{yi«Mý¼’û‘&ÊŽëòâ¾þù«éÁ¦ÏéÁmCš¾HÝHä€{_r¡ÆÕÔV¡â–  ‹]™å­ªÌO"6€%ñ[µIAÍά\(tþõ¿ÑÔ;_ÖcÑ¥+#ÃòÿÏ!MüH×f$é-Mÿ÷=š£m©ëÁÇQ¦n•F–í ø¦¦ßšYÚßO†æÈôh¼ô“¥Í6ôÚ²õcÚþWß )Ø™‰œû‰î ÓŽCúæ+‡÷ú5?µNßùq¸Ó’³éhÿö¬nÓc¿(C4yafå—¤w*Šô^j†Ì¿œ¡„ßþ²ynXMšVš>ÔX«„™ÿ«ùÛ!]ìú–.~öËJÞéH ûŸ9Œâ%½×§óµ£àŠÏ‚š{‡ö¹_‘È@Ûd~&Sqoý7]zGÒ¶¥Oâœ{•ôÑQ½ûÍ!]<;¤‹ÝßÒ£ö=”ºM—ôo•¸u@žTWg$)^?³ÕЦå»6>¦„ÇâuùÜBvfÓG3e2.È’0šûÉ›š}ècÚrù‚./ξٴc¯>üôE]øê·47C+ÝHäî;›ù˜Ø¡…gâ<ú˜¶þúoé¡Ô z¯ú» Í—Ìk»~vOŽ6_:ª‹çfçüœÌ½§K.iÞ¸ Ù­+Áù1];”ñ«¿%kúVm~ý1ÅÅÿH³’¤­Jüâó ¼ð׺ÿ YžËÓæÑ&ýKHÂhþÜ_Ë÷Ö×d­?$uõifk†,¿ý›2ýàK‹Ë¸á~D"pßÙœV¦¤½ÿê’‚¯럟o×ÔOn̵̘ëí—éCûjõ³†4÷ÞkšþÓ?Ô…s3šW§¼ÿ½Zúƒ¯ê¡à]ù»¿ÒÛtIÖ/–éÿþ#ýôuiþ·ôÖKÛ”ô…¯èÑ­ïéêH»~úµaÍÝp¤·ô^íJ_8¨Gþ0GqÁ÷tåïŽè§]¯kž&»omšŸŸ§ýXtþüy%&&*..Ž`ãÞÜõÅ?üXÅÌ»ïècßùÞ=[¿ÙÙYMMMiûöí÷t;n¦+Ä&91ŠD@Œ"‘£HäÄ(91ŠD@Œ"‘¸;mÚ$ÍχpæfµiËâp ‘¸+myøÍ^¾B ˜½rUqYÄ=€Dà®ôè¬ÑÜÕ+š»|Yš›% ’47«¹Ë—5wõŠý5ÄãÀ¼*À]ÉôI‡>|äOtá¿4èÚ{>Í_»vßÇdÓ–-Š{È¢ÿçF™>é “Ü m:???OXpþüy%&&*..Ž`İÙÙYMMMiûöí÷t=YZ F‘ȈQ$rb‰€E" F‘ȈQ$rbÔBÀ­ãõz À2V«• ¬‰ø‡ bK«Ä(91ŠD@Œ"‘£HäÄ(91ŠD@ŒÚBw«×.¾¦£ÿpTƒumîÚ}ƒ-›·h›±M‡þÕ!}bÛ'è÷˜Móóóó„€çÏŸWbb¢âââ1¯©v¤VÄ? ø¸xmÞt.B57?§àLPÙ€êÓëï›dÎì쬦¦¦´}ûö{ºž,­¸+µþ°UÄ? ÓÓ}›Ä‘¤Í›6ëã™âLjýa+ã^k_B¸ù®údl1Ä"#ÞÐT`Š@ÜcHäË&Ïhv¶²w5êl Ìë{\`ø²³³µóùQngœoööXŸé³ê©;¨=OíTvv¶v=sPu=g5}=þýÚ¿sº'$MöjÿÎ=ê¸)Öho·ÎŒ>XùnVÿ?Û¨]»k4p ê¶ž¸-÷ÛóÌ‘C×ãµs×3:ØØ£ÑÉ[Þ‘ÖÖž×7ÔÁϨ{|­û[çþ7T…aÕìÖø ¯oò±7ÚÆë:ÿn,óä`£öìÌÖ®º[<Ư×u·ùMˆkh›†~e]1™Ôh÷a|j§²³wi]¯Þ/êtÿAegg‡ùÛ©Ãa•ñžýÚù̱•åšÖ±ç÷hWv¶v>µ_u½çn,Óô¨z{5!)0Þ¯î3çnq[~€±ì&§›¸=`cæççµI›Ģ͛6ß·Ï º§Û•p1̲Ú,²Ú,ºi¿7 œÓѧ²•ýnÔÞMÂÕ÷VÄ3qFÏ—©ÍmUfi­š›kUših¬­LeÇÂÜ 4ìÊß](»ùfܧáî.õºƒ7¯|1#¤n75nLöëpq™š$gI¥š›U[š)óX›*Ôipò6Öù¦ïïfï?Ìpåî—ב.ë ¯oý±×vMZO? -ó¤FºúäÏiPgešL·ó2×Ûׇ¢{=1 h¼»B]>9Ê›ÕZ[ ËH‹*ÚÎ* )ÁY©æææ åN™ ‡²l!{ïQ}›[Ákå±²*ògªº½]Íûìr·”©ªåIpu«£×+IòžéPϰÿÞËV‹ÓÍÜ ‚-„€»HB–_Ì"Äõ5­Á–XKÕÙ^¢ïßkÌÈUzÊ~·´i¨ä¨rW´]ªŠ¦ÆVùî†>;â6©þ¦& ™w«µóÒ®Ç%CY9ª+®RKW‘ÒŸO½­7ñï¹û=²çÛã³üµ÷èGAùƒ†,i%'Ü©¸zïp›~€˜\êêöÊY}R‡r“$¥Énö©ª×-¯R•’´CIË¿0¡Þ.·¬¥Ê_ñþ¸zšºä³®üÃôX—Nyªn?¨¬$I©©j˜ÓÞ®>ç–(eq;ï¨G†cŸ,šÖИ_–BÛí=ŸoÛ5 |œnÞö‘1#€;mrT݇÷ë©ÙÊÎÞ¥=ÏÓðj3cÂ,é˜èבCÏhWv¶²w>¥ƒ½:÷þ´€‰níÉÎVöSGÔßS§ýO-cã™ÅåWÆÕ½÷€Nù$É£Žâ]j\ëZa‘ʽ츃gŽèà3{tô\ rY%irPG=£ÙÙÚµ¿N§=7þŽõ–Ô7L\'éù=»—¢Y¬_„Ù“Ã˶ßù”öî¾ KGÝk爺G¤ÌÒ‚¥$É¢äœjÕ–çË sN,_Vgú¬z®÷Ëþ1=¨ƒ;÷«g¸WûÙžºÅ%zÆÕýÌ^ðåªÿ¬v5ž½qvÍZË7ݯƒ;÷ëÌèÕíÙ¥=ÇÆ£—MÒô¹^ÕíJ;³wê©ýuêó„ü²ýfÖ-$nKÇ^ìu6ìZqŸi\\Ê)[;Ÿ9¤£«“C ñªÜ·,‰³(!C•­ÍªÎ_œ—°JÌ"–kí9ѳGÙÙ‡4a˜›ô,3;âþúõ_Cö?}¶NO=stqÌÛ©ìì§´ÿpÎM¯-v7”-àQ¿Û¦\»)äµ7|_ÖÑ÷ÇÆ]{ôü±aM®¤"¾¡6^ëù¿ÿ¥¿Þ_¬6OPµóð*ˈE*ó*}&0ޯƃ‹çÑÁ#êï_h—s«ÅuÍm~V÷ûÜ`÷âx¿K{êú5~ý˜ÙÚµ§Qý«]×û†òÿƒzÃÅdbðz v>uPgÆðôkÌoWazÒ²Óê°Ž5^O²¬>ÛÔå/PuAòŠ÷Ç{šÔ,QuÑÊ9B~GA«C¶e3]¬vžay¦¥ÀèaíÌÎÖÞ^ùúÊô™ìϪÞå_({ݨÑúQ”ñ0|½£e‘ûL¤1#²Õât³¶ˆ†DwR଎¨PÇ[~«CkPž‘ªª8¶ò†Æj&ûU³·^§Çü²83•nõËÕ×¢½ZqÉwZõm#ò†$¿Ü}Mjê›dUfy©œ†$™•Y^­"›éæ•Û7 ú¦ÓryýÒÔßF.k଎¨Ñ©1¯‚f›,¾µµ¹îL}Ç{TSsB#ž ¬v‡ìVÿBýj΄¿ñ9Ñ«ªªñH6§S‹_î¡UÔôh‚^¾öÓÁ;(lʲ‡ù)zÂåå+-)Ò&Ô[U¡.º*[;ÕÞ\"ëX‹Êjú—Ú-èVWË Rö5ëøñåi@M-CšVŠJŽ׳VCŽÚ—ôÃ7ÎYWù‚u5uKùå*Ï·F/Ûä êËZ4b)Rmk«ªóƒên’?xê8«¶ŠYKTÛÚ®Ö†ÙÆ:TÓuãRqsªj’¹¨V­íͪtútª¦IÃa’>÷ <²+ß~jAÂŽ e¤&-•%4fk)×:ël¶j÷îÜÕ—Ô zuªeP©¥­:Þ^­ ¨©e$ÌþrõïBöoH zO©¾Ã§ÜòVµ6Éâj»ÞFÑbwCÙ¼ýrYóå0…¾S·ÀY9P¥ÓÁU¶vªµ2]þSU:pd1Éíó ¶ñÚÏ¿Ð2ÿýæ×OªÜfÈ^ý’¾ßf±µ”ù†>3ª–²zXJÔÐÞªê\ŸÚšä[¾ßи®¹ÍÏ› [ãʯíÔñ†êµ÷@·Ì%Í:ÞY­t_ŸZºÎ†OLÝpìååÿy†Æ$pVGÊj4`©¶½SÍû¬i*SÓð´‚^|†Yþ¾:íjçÂêz—%W4ªºÛÆd/-Z™„žèQSWP%µ»e ™8b˜ Éç];¿×« |òú%SZ£¾ÿ½Ní¶Z”×þ=½òR­†]Õ/½¢ï×¥IûQ”ñlÕz[¢ŽeÑûÌjcF¤®½zœnÊökÀÒjÜAÓ#]:í“d/×ñ¯)YêÝ_¬wŸzÜût8Ê9Çûº4”¬Ï6«µÄ&#èV× ru«w¼P¯ß@°«üä×U”,wïÑÞ܃^ “•’ž.»¹Cc>‹R3³´#á&”Û²´­³²]Õ9vùNÐe-qw,Ì”±•êxg‰R4®ž²½js߆ú†dg¦}ã2;œÊ̯TmaŠLÝÚSÜ!gTÞ@¾Bs Ï Ü’d-PeíA¥™ÇÕÛÒ¦Aÿ¤|)™u£ÖÆï—_fY6ø¬ƒÀ¹nuyœª=yP ’´CöÚq—õhl2W¹‹ýö¯Z%I’RT²Ï¡SçäS®®·“qÊ”¹¨YuEÉk*›c C#FžÚJ”j’”V«Úñb•õÝŽº™•±¯Z…yùJMX8ŒþnUxÃ<ëÂç‘Ïp¨éÆý…©Y9µµ*J3IJ•Ã2¡â². Läª JìBË61â’%·äúaV¼9öôX—úüNU7TnÒBÿhºôtK·\å²Gù­*×êq]W›/þwzy¹rw$H;ŠTh;­gµJ³vÈ$›ŠrÚ4àö)¸¼™V=vHŸ¿áZÛ¡¾`¦j‹bšZ©Úñzõxý šýRЭ–ÞUV7Ët«§¥EeMlÌZqšéÐiå©5}ù»ê©ï’¿¤]»SLò­5µ¹%Ù–ä>¹ýåZL’ÿœ|fûÒ žý(Z_Iw­^oEË¦×ØÏW3¶Bä8}ðíÖ†Dwï¬G’dMO×Âmœd~ý¾¿AÄ¥¹ò/|ß{¢LOŸXþ™Wno`é~‹Å)çbrÅj·Hò(ø¿µÜïOC1gj_^ª’L¹#–uZžá…Œ­(G)&IJQN‘]mMîÛ^ß„´çÕPÙ¯Ó½ªÚï–Ëíøm“=_™æ yO¨âé2ÛœÊÌ,Tiyî Kp!Ã,³<òù¥0?Ï×ä¸WAKŠ’Wùºßí’ÏïVÕg³C>±êœ_ʵH’EŽeOÅ6ŒµÞV^où,r:-k,[@–Q¯ G¹–&ˆ™dϲËè» u3¥(·ÀÐÙ±3ê=«Q׈FÆüRf˜M%*°V¨æé§äÈÌTVn®r2ÓÂ&+ ³!}ò-»£mrT«³Ó¿X§Õ´-ÿÆÊ˜­­\ =à ݟ±ÎýÙ•µlÉ.“=Kv£OÃÞ€ŠÖ;iB#ƒ†rVy2&»= Z‹äXvŸ>É‘%kðŒÜ>Éåó4ccm¼®ó/i×™he6‡ö™…kDÐV¢¥&H=Ë&¹!ŽëlsÃ"›õýï2dȲÃr}H0ŒÕ¾þØ+ú|è5~Ô£ µTK“”vèˆÒ$M÷’¬z¶¡N…)’”&»1ª§«º44™¥Â¤¥ãtÉRT¹âz4Ñ[¯.Zw§„¦MR®jΪª¦JŧÚ1swºÌ§|KÉY¿[>Ye³H1·ü–,YLÑûÑd”ñСÞÒøî3«Óƒ‡ôtÍØÂõÞœ©Ö—eí‹§ÐVî]ßökE"€;& `ðƒ|éËöÒ•ÚWþbØâ0Iþ;\nüxƒ$ZY ûc§¾Ó£Ú[Ñ'ŸaSfA¡*‹&ÕÝtJžÕ¾”«Æ—íëUoÿ€†ÆÆÔwbL}§ûU{¼qÝ70ïW&[†¬Ò {ZùI!7¬§‡T¿·^ÁÚoë˜3B±¨¹µ$d9CædIÓ’ C†aºµåK_8NÒòãD)›{-ÝÿVÕmrXeU0Ò•—Ÿ«Âò"öT¨>Üù”¦C/~OE£CT[…:Z2Ãös“-K6uèŒkZ¹‹ñJH¾>ëoÒ½0Ãi©*!1[K¹>@{†³BÊðÁw¸Ô~ëˆ&ÇÔoäª6a•×·Òzʹž>z+¬·½ÂÅñ¦·ùM%gbH=n« 3“W\ǽÃnù=.øÌò_EœÐÞìSÊlý¶ÓLJÊ8¤¯¿TÓ~ÉI ?¯§ûl²š'Ôsð€:\~%U|v§þa0¢â]gTÞyLEÉ«÷#g”¾âPï›ÑgV3Òkuüdðú¿_,¦€\kˆÓzã ˆ‰Êú•?Õs?þÓú?ûÕ89óŽŸø»jû%éOþîÏôã¹p×¥'ôåì§õêÐèå«´"ã9Ü1&YïÀx‡Fc:¡Þƒ;•ýŒŽD}HN‚¬Ž…ïû§mrfd(#æ {PƒÃî ä4‚ZÛ¤•”;ZYM²fØ%IžÞ!-¦#Ý.™ÓrUt¨NÇN¶«ÀR÷X˜éƒÉ9*q5ÒÒ¥ÑÐPLª£ÃqÌYO¹b‡[ƒî¥ ¸ûåZ”f5­+v“cýRVúõ{ñ¡¯CYì6ÞA¹–íjÒ5(¯a“Ýýó ·ñ-<ÿÖSæ×&Ï –š`ZîAϪq½Öl“,7Ô' ÑºgôLãYÉ–%[Уá¥ACÓžQyeÑŽeùщ¡^ylùZ‘Ç‘IŽÊN?~|ñ¯SÍ»­’%O ªt˜¤É~©;ªÑi“’“dÒ´\½.É‘+»)YÍÇÕ¼Û*szƒNžìTµÃ­´S/oVArä~m<ŒTïÀMí3¡!Oº^žä¤™Ö'­3®€˜|÷5ü¯Õ„ü½05CpS˜‘À”àܧ¯zÚŽÊVyHYɰܾõ—5)sqŸî6í-î•My|·©¾+~ök’9Å"É/wËíï·È79Qd6{520¤!q:d z4â•d8”eåÆÍÚ%)·ºR½{›T¶×£gKrµp?¯Wݧ]²îîT^²V]rДZ¢Û^5U4Jå…²úÕÝvBîÌvYMZS¢2AAù½MN§*)aƒå›^ÙL9%rv4©ª&EÕûœ2\=jéóݺº-{ß°Xeö»Ô?rN‡!Ï@‡š†ü :<òÒV,egÈ£¾Ž>ùÍÕ*ròôhÈgQºÕ¶=ók«5XÖ¤Šb· öå+ÃfQÐ;¬3]§å±Úeö¬^Þõ”k­í9=Ú£®AC…¥…‹K8®sÌÙßò× 𫯾^;ªKäºÔÝrZ~g­òR$Ã9vKeË‘§?¨¬ò÷[iZ®¯Ã”ÅY¢s…šêÉ(Í•Å{Fm- }Òa’LQ>_>ÀEnãiötiÐ(TiáÊ¥£¢öѨç×Ê}'D+s˜>Ÿ”Yªœ¶*Õ×ïPu‰Cru«e,¸81*|7zÞ¬ÏÆŽ”^ªU¨¾>UÕ%Nžn5 øåhµÉ”dSif›ªjš”RY${pL]MC2çµ*óúa&åê÷Èìp*4aJJQʲâ)ÆÂ²q;Rëi•ÆêUSo¨²$C†«[MCft¦/³N›’’;¡E#Õ[¾UÛd#}&ê?¢Æ)䜈º= ÖÌÞÖÓ‘¶A¬cFwRBšoÖ³é6>—\^C¶ôR5·\ÛMÆäB5wV*Çn–gdH#³œÕjo.ÔÚW²IQξY É72¢QàÖ”;ZYMiªì¬UÃ*Ãç‘ÏH׳ÏÚïH}S ªUžn•!Ÿ<C™•år’ücê÷ܸ}BF­Z« ä´Jž±¸|²ØsTÞZ˲j땜¯£'[Uj÷j £^UUõê *½²]‡vDyæ@ŠJZ[Uju©­ªLM}ògÖªµy\Ç~õw•µ5þú&&äèw¥MO×ñ'霿¡¯˜:aèëo«ö×:Wù|ùñ>®'_VÛÎã:þd›j?•#wï±hÓüüü¤ÏTEØÂ¦Ê“/ª0™XbHr¡ÆÕÔV¡â–  ‹]™å­ªÌgK^ðÝÔüú¸.¯xwFSA->”ä¢ÜÓKŸÎÌ-{ìÚÜ„^ýéŒ>þP–ž´|\ŸÜöiý‚e«ôÏËv5ëÑ«—–263Ó/Ïl–Rˆ×òi@&ص->E_Ê=RÂwd‹‰È+™2Žê•Wˆ¬kìL­Ów¾Cî´ä¬C:šuˆ@€5™ ¼­7¦=á—VÛ,ivF3s3á¿lü‚~ç‰/é‰ÙjðíWÕÿãïª?å°¾ñŽû¾fæÂ+Я¯üàeMÌ®ÜþòUÚ ‹yE°6Z>¯ì-¯¨ñ7ë/ßÔ?N¿«™-ñŠ_¾QœMOl]z'>á ÙâÞÕ?]Y™º<=®K¦m›yWï^]ø›2åhßÏ?¡DîàCÌÈ܇âM)úx¢n˜‘3ðÈs-òwgïèR¼]OýþGþIõ¥™+}úêÿKÔç¡N{¶\Ôø….Õÿèÿ†<“G’&ôò¤_ا’­­³å~ûkjüñš¡™ iÓüüüŸO×®]#™c6oÞ¬-[¶Èb±Ü3rHäÄ(–VˆQ$rb‰€E" F‘ȈQ$rb‰€E" F‘ȈQÿ¥?V›ÅIEND®B`‚glewlwyd-1.3.1/screenshots/not_logged_in.png000066400000000000000000000763531322667720100212530ustar00rootroot00000000000000‰PNG  IHDR¦àçÝîbKGDÿÿÿ ½§“ pHYs  šœtIMEá2 ôù×tEXtCommentCreated with GIMPW IDATxÚìÝP[÷ïÿ¿$lKk;f!É¢ä¦brm6Q¾IaÛBÛ)x¶àÞ1ÞïÔø~[»·5n&vî\Û;cû;c<ÓØž4xÛ%ݽ¶;7pw6òl÷;AwÚÀn‚ºÙ(ií¦h»±Ø&RSK±É6¿¾ À`K€?3™ èpÎù|ÎG§ÓÏ+ïÏ'gbbbBÀm–KÀS0Á A0CLÀS0Á A0CLÀS0Á A0CLÀS0Á A0CLÀS0Á A0CLÀS0Á A0CLÀS0Á A0CLÀS0Á A0CLÀS0Á ‘OÀêòÖ…ˆþû©×t)z]£cct°Šäçåi£u¾»ý³zì¢;®ý9 XÞºÑ}¾G¹æµÊÉ7)'‡…±€Õdbb\ã‰aMŒ ë>]wÇ…S¼±`yöÔkÊ5¯UnA!¡° åää*ϼV9…zöÔkw\ûykÀ*¹rU¹ùf:XårM…º½~çµ›G«ÇÄÄ„”“CG«\NNî¹GÁ A0CLÀS0Á A0CL`„|«öýMzù‰5Æ\Ïr¿^:ôYmÙ@×c} è²”¿NM_½_Áž_¨o¸X/~\UÉâ—.êä_¿£®_.ï=Ž~¬óý¿’˜Ç…ôÕ¡ ÈÖÕK±žù“ßUÃkd½Sÿ¿ÐawX‘äǦâß־ƇUû;ùŠþÇ:Ñ_ gêâÚ=Wf¹W/í}@®ç_ÓÙáOéÔÿxHî—~%ûTíï¬QâbHÇÿ׀·ÇyŽ0 Á·’—ŽýÙª)˜ã³ÙáÔ胞üõÚ·ëqÕ_zO‡ÿ2¤ˆå^íj|\/z´ùÜ%òïÒ¾oþ¾*/¼«½qYºÿAl¼Gű@fç/ø-íøê§túÇojë¥ujú¿Ó¡¯~¨Þ¿úµbп’çWWäéÐá˪%ð“ù·« …£3?¹,mü­…Uv þ&€%0®Ä"þº¨Ä"óå5V¾ùÕ‡ ¬“Ý’«û:™/~¨Áé%ûFåÿ׫Y\!®Pj½¿ø¨ç¡Á`SÜÒ¸¢#7ù8Òž“ò¬ä5ñFÆ•e?),/ö˜àVF?ÒÞC¯¤~Î/VÇáÇå”’¡Ô;ê› ¥òV Åßp–!…’ç*ºÿ•Ž\•?6®Ð{×¥‡ïQyþo䕤|Ùÿó:Iñ|°jL°P³C)åªäÓ÷ªløcEæùÓo[Uq¿iæi.E5tá‚ÜÃOèàŸØw‡Ùp¯ö|uƒ‚ý¯k`TJ¼ëWÏWב?ùX‡ÿþ²tÿƒÚ÷@ž4ÊcÀêA0@Öâê}+ Îž_¨o¸X/y\USŸ\º¨“ýKùç ŒJŸ|L§Ÿœù»`Ï?hóߤÃñ–¢ëÐ7”õúuyûßÔvwtrïªá°ÿå¿èàV»Ú¿™« ÿ—:î^£¶ÏÇ'œÂ*‘3111A7ÀêðÈî—T`-¢#îDŠUÿÀ¸y¼ò#ŠÄ’_&“I–"›§œÕµª¯q¨ØœÉãh«Óö³“YqÉ®—ÕÝbû<¶Oj»²èÁãÚüT×d¹jÉ6½ÜÝ*Û÷qxЫ>÷y¹=ƒ FB E&Ç£ÉR¤’R›Êµª­­V¥£X楸â@›6o?;cCÄÕòlí Úz&$I*jzIçö”/IŸ¬„ïZÐ{^®î~y| „"J½–,*²9äpVª¶¾A5åVþ·]èÝ_h绿 #°j­ˆ`*êíÔѶ“rÍ“ê&Š…üò„üò¸»tR%ªÞuHûZœ*æb‰…\:qèø¼ã1‹hÈÑß+w×Q©¤Z»öíQSUé"˜¸ü.÷ŒPJ’B®^ZZ–8t[m¢ìuë|w·ú}…"±ÉM•ØrÖ4ª¥±F¶%Î…¢:´ÿ„úBó½–b ù= ù=rw¥b‹öµíQ]©™/Ìc™÷˜Šªÿx³êvž˜?”šSH}'wjSóqy£ ª·³]íííj?ݽðö-´[Ý:Ôø=µ÷¨ºú|š ¥$)SÈçÑù“{µõ :ÔÐRÝ^°»U Ûç¥æóÕÍÍ:ÎK 浌SQ oÑ¿5•8UÛX¯Z§]¥%E*RBÁ¡€A¿<®.÷¥Õ”ø»´³9®ŽÎýr²Š#ko‹Žzf†C{µjëkUç(WII‘¬Š* )àëUw·[}iã1ÒwT[·uª£UŽ,ÇcÜ×¥Þ9w' ÉÝPk«m™ú%¤î“gÔ—$»ìõ ²™z$Ú¹õ„|7|b’I ÍŒ‡tþ@³‘Nu4ÛµŒ`|à¸vöÌØ,²¤z›vµ4Èa+Q©Õ,)®p0 ß§n׋:ë‰LßGWë^Ù_îPC)_+˜m™*¦â t¶jgz(e²kË‘—ôjw‡µ4¨ÊQ.[q±¬Å¥*wV©®¡E‡N÷èÕ—jKYÚ©Bgµçh¿¨QÀÂEÕtçÌPª¨RÛ^8§žÎãÚß\'§Ã¦Òb«¬Å¥²•;UÓ¸GÇO÷蕎gT]’v*ÿíÜß­p–ߟ«?„”lÑ.§)5ÄÝÝŒßa$> ã;g†ReµÏè…—_Õ›oö«ÿÍ7õê¹—tl›S–é#òhÕÉEuVP®£]JJUhשWÕ}¼Uu[2”’$³ŠKËå¨iÔþös:w¤VEÓ·áÕñ㼓`.ËLÅ]Ús—ªx°Tê`ç)í¯+¿e¥ƒµ¼Aû;_Ò.{êw1÷Q¾ãfî±T½‡´ÿ|Z%^Ù½ðR»Z3Ø3ªØÙ¬ã§´-m<&<‡µ×Ìâ áSgZ¹TIc³ê›œšŽ¦Bçu>pgïàùã:;ýHLrî{YmͪJÛHÊZZ®šÖõ¼ôŒ*¦R×Qw–Á`š€[.êGçÁcj¹eù›Y¥uÕ±+•˜ÇúΰÌ(¸mrrr¤‰ :Xå&&Æ•——wǵ{‚©°ÜGO*U+U¦mÇÔÍú`ærµÛ7c2ÚuÆ'¢)d-> ö¥ª•LÕ:Ò±_UÅYœÃêPkG‡ê‹R¿ò?ªž Ó‘¨·SžDêûÐTkS±³QÎé#"rŸÜAã;,+­VªbŸŽ4ο<Ÿ¹¼Ymû*Ò:¿K} L¦¢Þ´w“SM5™³lõ;ÒžÙ€ºý¼‘ÀíQ´~Æ×é`•O k£uÍ×nÃ÷˜ŠvéEoêç’mmÚQ¾€aJëÕZß®ç'#…X·üq§K°ÿM<<(¯×¯P$¢¨¬*)µÉf·«¼”¬  ÈÛ? @(¢¨L**±É^U¥ò%~áÞ“:ŸV™SÙ¶OuÅ 8‘Õ©=mõêÝy~2äJxtò|@u-¶[5T]žTõ`Y£jJ%É©F§äI~W"îó ì*W¹yµ=ȸ‚yýAE¢ Y‹l²Ùl²;lš÷QÆýê ¤~t6UêV¤´¶IG$—þ ¨(®Æâì;+L+s²”¨È”Å—«²Dò†$)¡H8*e°ÛÕmyßDêï÷ÊŠÊê¨W£³øö?éOH;X žÛþYý×ç{4®å˜ÌÊÉÉ¥S€Udbb\‰¸&F†õÜöº;®ýSq\çÓöoqjWS¹6×nVEËm3 Lîåb.—’1qìVûÑ“:ë‹Ìù¹¥¢^;Zw¨Ñ9{‰·¨ú[ë´{ªìÅyL¯vÔÌ=ñ8­†­'S}PöŒÎ¹šU:ç õhçh*Çs{U57›ä5ð>ìÝjÜ|"Y]b×¾sj,½ÅÓhÓæígI>û#¯tÜ…½:}ôNö…æuõNõ°I•MΙÔáíJU¨zË6ízæíjªUÅT@ëÓá½®EOZLJz˜þ©D5ÎŇ]ÅŽZ¥z%¤ÞÁè;òvyR?V4iFÁ–µJ[R›)âî–1Û™e©jRSS“š¶T«$í{á¬Oþ~[“óF‘ÞCÓ¡”¥¢^»SGG‡ŽyF[œ3ÿÈwâܳ޹|^~ýu½þúëzýõÕe2Åý=ò¦UYU.pù8«£Qδåûbî½ÚÜܦîà’íñµï›9û Ø­ûÓÓ,E%*·Y%[R_ט<Ýþ[œ/¬¾®Ô;ÂRÛ¢Ù¹Ô²´ÀªghÅT<äUpú§Õ”¯€‰Æp\5Ù·¨íØÕ”¦Ef-R<У£{LWØ uíÕñÚsÚ?UuPêTm‰äIRHoP­¶YAG< ÞÊòõwÎ^Ò0"_jj¶¤¦JÅ&ÞGiM£ÊN$—óó»ä 7ªažð,îs©ª“-5jž1ËVÏáÃi•C&Ulk×±VçŒJ•–=ûämoU량Ģ}d0 ÜLvU•,Áx*rÈY$ %»,ä *^7Ïr•á~u¥í·VqÃ^JV9·¤-çsËåßsËJ—¥PìlÖ§¤¸WÁó} %$©T[ví¹õ\¡!%dRå¾NkL¯†rª¦®Y-={Ô|`ê;ç“ËUìôÉlΦA?~6d”ԪƶÀ†[+µg—][O¤B™„ÿ¬o?«Ã»*kkU[S©Jg¹ŠÍËø¾¹ALž£'”HH*«Õ3{v©±jæÒyµ e:yrò„‘¾nö8æ¯ ÷É5ÝEªmšõ,c;¬n†VL%"´ÿº¾H%˾tb\ƒ]'SHI“:NíŸ9¹šd¶ÕéPç)5M‡=Ù›V%T¢ÊšTƒün¿n¨•‰ø4ñXRÇFú}7VÿDýr¥úª²6ÓÔÄÀû(M¯Âð«Ë3_ÍTTÞÎ^¥r©&U¤wqà¼^ô¤-Þ¶¥]í³B©IV9[ÛÕ^_´$Ï>âOkm‘CEK1ûm.™QI Í_×öv)•K9ÕTuc‹‹[T1ýSL½.¿â«àÅRTß®¶FÛœBiÝ>í©Hë#ÿbjߢêoÛ©£¾©ŸMªÜÓ$Û lÍzéçŒjŸÉî÷Ësö¤ï~J›þ J -{Ôvº[ýƒá ŸÉR¾oæx¿&’ç<ݦæ9œÒÚÆT5_¤Oçóßu°Ï•ZƯ¤^Í6óŠi€ÕÍÐ`*M¯r±Êjºõß]züñÇ3ú§®m0»Iû¸_]®©µî,ªÝ·C7-F1;´c_µ¦oÛ{V¾éÔÇ,[mÚdö û†e×¢~·¦2ûŽªœ:Ñ[þèì[skpê‹Su¶L§g¼ —ó‹¨kzûÆê‹@·kú~d©ÕÁVçMö¡±Ê¹k_êž!‘>­E7 b–5ý棉yöY ËÓ5¦Lî¹5W£‹jJ qb½.ƒ–ó[ »vì¸ù3´ÏZpAM {Õ¾³A»Ï¦Ö«,©?¦¶Ål\—¼¿òæu¿tDÛjí󌋄B¾>=yX»ŸÚ¤?¨jTëq—¼Á¸AXTh× K®éArD½îÐ<ý”'U.¥²ÆÍÌ¥–¹V5c÷˜JŸ¡7­€Ö‡zå.ã©Rc3¡VgsZ(PÚD´ÙVŸÚŸ&æU„¸½SO‰*•ªµM}6(÷¬ê…Pÿ@j™,G½ìY” y¥5iU>—æ*šŠz»RûÿÕªqÆ,wXiÕ6ÝzBºØ©¦JÓ ýJ™f íy‚аG]iU>Φù‚œb9g&Sêò­ðdª¬^•7]wÒ,³iÏ/Vÿé=jØ´Sg¼i;UQÇ¡*-Uža-¯Sk[§z_?§SÇöi[}¥ìóë%†äé:ª›¿ æãýs´Kü¾¹¥V7{QÌ ’Cîn͹]Г¶ŒŸ]ꩀ i€ÕÌÐ`ÊlI›ŒNDM,oãÃÞÔÄli¥Ê2™ 5—È™¶,ÕP(½êÆ¡ZGê³~oúe!y§fs-UÙJå˜^/¦Þô)â°¼ia£Þ‘Ýd»‘÷1£ Ã'—wö”|Tý]¥Výjœ¹¯M|HžéÇL²×Ø3XºË*û‚7J1¥—ìÅ#Zšá˜P4}ÎÝl3ƒ öu¥–J3UªÉ1ÿ.v6ÎXίßå[ÑËù™ÊËu{VéŒ+ØÛ®ÖÍ›´ûd_Z¨R¤ÊgN©ûx]fû°eýâ*•£¦Q­‡ÚÕÙó¦^å%½pp—¶TÚçhgBþ®ÝÚÚêÒì•ò–ü}3[y•nUX9#H¹Õ˜clzÒ–ñ«hRuéÊk€Õ+ßÈ‹™Š‹dÒTáTH¾`\uå7Ÿ,mìÔëõó}šPÈÕ¢­'†t?±ôýü‡µéñÃYŸ#‰KÓqUÎz»äœÖêP´¹tòÓð ¦3[µìfÉätÊ¢óŠI ynµMî«õÉV±P›õšVFÞÇdƉä3ðuy®«KíîW×ôFJejš]}‘ˆ*2]ôR$gif3ÒV›MùÓö,Ë–YE¶"iê !¿Bq©t±âñ |iÃÊR6WŸÍ\*M‰>íþÂã™Û~—|q§œ+tòÞj±,ýI£rÚ¯£}3k|,[´ïО,–º\¥Vsªi®’+“U–éõ# D2[O/,b¿©fWª¾LšZ ÒºKÆVÙ|°zO§öÓRQjo趀ܮ´XʾOç:3Ãr5oJ.Á&%<. D«Tµ¨t&¡Dt徜‚®™¡”ŹMmGZUU|{®¸´ÿÀÙÉqeªVǫdz\.Ñ,[}‹ì''ÃΈ†" M&9·é}³¥Õj´MŽ¥!¹¨ÓmîEUÍXíÕ©0Åï–7“Öp¿ŽïiUkk«Z÷œÖ\·n¶7È‘v^ß@¯’?–T:•>·>c'¿[¾÷ô±&g½ì‹(E0ô>JkÔ˜ÚÔJ®þ´Ê “*›œó,‹V$‡#µ±ÔPç¬=oæ’»wi•âÚVÕO_>¦¾ýGÕ»™öø€Žï=«é»29µ«ÉvÃan—R;%ÙÕTyÒR\ݨTœ§kড@c¿’úæCÕØ«O®ñ—,UÃþ-iUSC:³û°z‚Ùœ#¬ÞÃ;ufh±·R¥‡ôü IDAT†éj¯Nž¾UõV\ƒgŽª«Ï#Ç#OÀ$ë\“·Ö ÕOâ$¼êêò$4“U³ÖvKîïtã±’½Þ¾¸}t ½Éåü’'çäQž^¬FÍÎùÎ`–½¡jºZKC/êä-ª–¢½íêZª@ÅìÔ®=•©*—˜[{w¶g6Ù>=,Õ¹{§Î¦eeöûT7;I‰ÔíN»ñŠ&Uf“¶WkFÑT²2mÞ~ Þ¼A÷ùVâ[)ܯӞéZ)m;Ô¸°}Ö² v5V¦*œBg©3Ïî½t2-,Ÿ½”ãízß,Dq¥š¦‹}ryüiAr™lÆ¿7Ür—ã¢VçkJ›±¸u`k‹Ú{ƒ·^Ö/ìÕé[µ×[‚;±©~Gj)·Ð™Ý:Üž÷è¨÷¸ö¦%"-µóL˜ËY;ÒÄäõL%vUßPz”ÜßiŽcœ‹­1ö>f,çòOOÐ[jšTq“‰hsÅ65L'•1¹÷î•kž@ piïþ>%–p<7T[mªjKþ3ÚÙ¼Gá[þmt°[‡šŸÒ oêŽLÎ}:6GµT<àÒùô\ª±2Ë* ÙËùyåš•L™‹RÁÊЙÓ˜ç ¸´ÿDöË!& x?D}gS™Å®ÒÈ€²ùgPÁUäXåÜѤԛɧ-»Õ9˜IJ•·}·¤û¶¦YUG·ë}³°wCecê^|éA²½9RúÞp'È]žËšåØÕ®}•ia@§3{7ë ­jëì‘w0¨p4.)®h8¨ÁþnµjQͦ:éMFömê8V+Ë"övM§)¹÷nVK[·¼é3ÛÑ€zÛ[Õ¼ólj¶’&í©?V(­ªQÉì_–ÕÈ1GáPúþN©ck³«¦Y ÷1c9¿)Eªm²ë¦ærí8˜ö^ݺU{Ú{4Œ*+TïéýjÞzT“sÿ³öòY”bÕìÐ.gÚC}:±}“êZö«½»_ƒ ¢ñ¸*”·ç´ílО:¬óé•{ömêx¡Q¥748®€ËZêOjZÀ¾q9?oÚr~f•U§W‘³jÝ}ZÞðÌûö¶kwóQù$™Š²¹zD¡Û½[\Ao õc¬OGwn×öíÙü³S/úvŸæò:¶+­c^xê jh=®Î¯ƒáä8ˆ+ hp _=§©¥æ Úy&-è+Û¦ƒ¥†½o4ê+›4/ERArEÓ­÷=[Ií°ºä/Û•Í65¶wʲ»¸SÓõ‰!Ξðèì-þÜâ|F/4«<Ñ#›Ü _’ÌlSKûAy›Ë“¤„|gkçÙÚ ?7V‰˜*ô̱]rÜ,m)©Qeљ˻YNÍy µr˜ÎË“v¡¢ªJ-E?z“Ëù8‘–Ô”ÔªÑvëu»¬UûÔÞ4¨í]SRß™ê;3×Ñ&UîkSÉ‹{g´kqã±\-/¼¬¢ÃÛu8mñr—÷ò¥ªk;§sǶəiúa²kË‘—ÕÓÑ<9ñku¨¶l±·Ñ öÎcÚbŸ]ƒ3ÇäjI­vv¨¹ü³«f»êœ3Ï稵Í]9”¾¿“$É¢ÊùŽÍ–Á÷1c9?I%*ÏèV9öœÖ©gªo„•¨ö`§ŽÕ—hÉç·Í¥jh;§s/ìRuIg©Pý¾—ÔÝÑ¢ù¶ÒŠû]r§çR[ª´°º‘YËùÉ«®ô=¹¬NíëØ§ÊY˜ˆ ÉïO…Rç.êh‘Ý|ëñÓØÞ1 ùý (z[Öõ‹+]î×¢UŽ=:÷®úñ/'•ÕîÓ©—ÛtÓlçv¼o8–œMΙ-¨Ü¦*ë2¾7|âåLLLL¬Œ[‰*Ðï–ë|·ú½…"±éÉM“¥D6G¥jëT_ãPñ¬¹Íð@¯¼AÉjsªª|ö¬j\ñ©Õ¥Ìæ[„qz]ru»Õëõ+KH²¨¨Ì&»Í.gm£ëÊ•é¼m|°[/ž÷O¶ÃdSmKãœKèIR¸¿S]ž’LEv545èæ…F™·ëöÞÇì¸Ô¼é¨& zÊôÌ9—š³¬ª‰‡Ô{Þ¥ó½ „"ŠÆÍ²–ÚäpÖ«±©VΩuòâñäždf™—|¾;®à@¯z»Ýr{| D"ŠM϶›d)±Éá¬TMM­jk2Æ ËÛyR§Ýò†‰I2©ÌQ©†-MÓã8ì•«7(i2T¬)5Ïy®þÓGu²Ë#dê;áÔ®öãj(]È÷l!Ç/ç{©W½n·ÜÞB±™¡‹¥Dör‡**«ÕP_#G±9«1¶Ø÷Mt [Ý“IžÕÑ G–#1: ×i·“_xÙšÔ`3gý]YövX5VP0…O‚`g£6O-ågß§s*¥[ð —Díd/—.À’‰äJÛ—§¢©šP ŸH„R°0SX2qßi¹BS?9ÕTYL§€iùt.ª@ *K‘I ŸŽï?¯XòKí6U‘K€4SX¸p¯öo=,ÿ ”©eG•¬ôHÃR~XbUlW‹ž3LaáÌ6UVÉ$I²¨Ì¹EûN½¬ã ¥ô ¸AÎÄÄÄÝ€ÛŠ)‚` † ˜€!¦`‚)‚` † ˜€!¦`‚)‚` † ˜€!¦`‚)‚` † ˜€!¦`‚)‚` †È7ú‚ñwÿ·F/h4ì£÷Üþ—\q…òïvÈüðŸÒ°Ìr&&&&ŒºXì'OkìÊz€áòÖ? Ë—ž§#`¶”ßð»]„R–ÍØ• ~·‹Ž€edX05üGzÀ²½8@'À22,˜¢Z Àr ÿ Ë(—.€¦`‚)‚` †È_™·U ¼ªNY~Û4Çg _½ Ñ_þHÃÿîÓ„$é^™ë¾¯Âu’.Oÿô§É߯6ËÝŽÛsýœâ™J?¥œ± J¼ûS/ÍÝÎ}ÞOÊXXȳ2¦íwv¿cVL™”»®\¦GŽÈZõYåð W¸åÜӠ‡6Ë\¾I¹y+ý¼ ß·KþÊ¿Åã‘$“r,OÊüÈ—”')ç·¿&“å5Åc<È¥ñ%Þ8 1S&†/PñÂócì–Ô*¦®jìâÛ'üð5ªrýÖ#÷IºGùÖu7 ¦rîùšÖ<üYåßurÓøÅ×÷ýH‰KWSåÞ«ü‡¿¦Â² åZ$%4Tâ—?ÒðÚqŸRþ_“ù¡G•·Î2y¾Ë~ø¤á÷/dÝl˜•ù÷šTp÷Ê+4iâê{ ¿¢áîÑØÈ¬c76hÍ# *¸ë)ú–¾iô¡çµînÝb™µOÉôÄ‘™Ë±å> ÂMÏË\(éâsŠ^(W¡ýsÊß°Q~O#ƒ?Ðõ÷ÏsÓdúâ­Ù0õs¹Ö5üXcoC± ¿É¾]7ý¸å–|M懿˜¼ßA¼û]¿°DÏ*“q“[¡µ GT'MüªM×®}Q…e)¯0¡±‹okäÝ¿T<|9ûc3}~S­ÿ¢ ¯AëT®)¡ñè FÿJÃÿq!‹öÜ¬ß æ¿v&ÏxQã °Z䝯›žˆgî(×þ]Y+LûE¹woÒš/<©<ÏÓºº,iƒ žø®Ö–ZÒŽ3)ÇêùÑ生û-ÅþýIë”ïü®ÖÝ¿qæù6<&ó)íÓŠù/dqÝ,ÿ?²|~³ÒWMËY÷ ò×}K–û>§ë?9¬D,9Ã_üßdýü¦ÔÖÇd®´«`l :þ®¯Ër÷ÆÔò‰…ÊôÈåÄ¿¡kïÏÕ¦‡ßÒXácÊ+”¤„Æ>òiôÚÕìÛ•ñy7¤ÛФu•é÷[.Ó£ßUÎp‹®…®.òYe:nÒÚvÿ~­K;6ïîÏ)ïî å¾þm]ÿðꂽ•œ’½²T~.mÝN“r­™^žUôŸý¶çrfý¾Ð±»àqX-VÙS’åI>\žüùC]KÌ}èÚMZ› ƇÚôñß~UW^9¤xT’6Êäüºò $Y¾¨ÂädüøÐsй·é㟴i*ûÊ{èÉÉN2?©Âd(5ñ«çý»f}ì> ë'¯Ÿ÷ð×”_Åu3~B¨ð‰©‰ý÷•xãY}üwßRìŸi\’òZóøç&'ñsPáS¡ÔûŠ¿y@ÑWŸÓðG¦¥Ù (o£Æßûž®¾ú¬®¾¼¾L*°?6Ï^_W5úÏmº6ôaòç ~ý°†?¼š]»²9ï 51ôýÉûõ $+xL*xÀžÝ™K¦ãf–±_ÒÇ»UÿýŽ%¯óûÊÍ]ܱó» ÉP*ñ3]õúøïžÖõàd™aîCß‘ym¦íÉ´ß0v5ΫÅ*¨˜zPk¿òã¹?úÈ¥ø•¹×{˹gSrBü=Å}ÿ¨‰qI×ÞÖðÛ?“éóŸQŽéQ™Öèú•·uÝ󤄯Ãok|¤@9ë ”3ääÝ“ŒïR EÎ]ŸSÁÝ—5ò¡O‰Ÿ=­1Ë:I#‘rîËðºá‘Ìšoݤ‚ÂÉlÓõ÷'«pÆþý]»«B–û-Ò]›”oþ©F ¿8}ìØ;‡5ü“ËåÅ_QÞîWÁbéè]ýyr‰¶K¥øCŸÑ«¤‚û”#e·¯P6íŠ/ð~‡ÏéêÛ=—t寔x(¹T\a²çžE<«x¦ã&ÍU—®ùÞž¼Nø¬®¿»IÖŠ{¤uŸUÁÚ)~-‹c3ÝWmý&˜&ÿuôŸ Ä¥ÉŠ£ÄÛ?P^Áfåæ]U޹@ŠeØžñÛôŒGnÓ8¬(ù«õÆ'~}FWÿ©gžIêåÞ5µ´ØƒZó•kÍ ÇX”·v¾ Ñp 웵æáï(oÃÆ¹«2âÿ¨á_5M.å·î3*|â3*”4ÐHð%ü¯iBÊËôºÊpI²µ÷&ó˜Fƒ¿IûàªÆÞÿ@º¿\Ò§”WX ‘µåÉc/i4|)uèÈ F®Hw-²Ó‡/¤õ÷U,â\Ù´+>²ðû RÆ“÷[¸€12׳ÉpܤÙ+oM†dS·tѯ Ý£mT^at-‹c3 ¦ ïKÞ×%]I«lŠ¿¦ëÿðZÚÙ·gIŸñÈmg€eS*þæ4:U53vUãÑ ¿UX1]­’ÐØÅÁ9¬H*xRkëö'«J>ÔèÐ9\ôIîךAÎeþÓ7ôñ…ÏÉTö9”<¦<“”cuÈTîéÏèjÏ÷4‘éu3fÊüÐy+¢Vâ̾iùoa1Ï*ãq“’“[áóÊîØ…‰Å·gUÞW¡ÜâÏÊü™%Ø_jÁÒC‡uÊ5/ ]Ùœ÷vŒ‘9¿9™›L_ÒÚ'”¿þå=ð­{hãäﯾ¦‘Ø"޽™ØO5’˜ü×üG÷Ê\|¯rÖ?*³ó;2ÝíPþÝ4É¢=Yôû¢Ÿ1à“&ÿÛ²˜K×Þ{R–ïSnÙ³²–ÍøP#o¿ ‘¸¤ð[×}Ê•Iù‘õ‘YçÉ-Pޤñ¤øÕ#2¯3)¿â¬³Žûè+þш4žáu35~AÃoœSþç7+O÷Éôøs3HK èú›ÿ0¹ ÝÈÛºþö€òw(GÊüÄMåÒâ÷ Z ‰+—%Ý#é>­©ý±LoC± Y´+«óÞ†12×µ373ŒÅ”[úu­+MÿåûŠ¿áÒøb޽™Ÿ†þ3<ñåä9Tøùï§¶Ù’4æ{A‰k™²ê÷ñÅ?cÀ'Kî'·iW5öó§}ãœF.89ù=ÓØÅWtýÕoëÚ$—¹»ò#Å<ç4zu²¬d": ø›Ï*6øáäç¦'e¾{ÝäÿOŸÕµ_¾¥±áØôdúÄð{ùåsŠ¾Þ­ññ,®›ð_)öÊ! 56œ¼Ï«ïitèûŠöü™±TËÄü™¢žs¹|I’&®(îyZ×..ß“˜~O׃ï'ûì’Æ§Jx²hWVç]ê12—LÇÍŒû}AWßù‡äßÄ4vñ'ºþ“§5|éêmËüØ[öÿûGõñO¾¯ÄÅ÷5>&I GßRüo)æ¿u{²ê÷E>cÀ'KÎÄÄ„! WÎ~•Þ6Bnrí¹ñô ÿ *øâ­Ý éòsúø§¯Q¥bØó¨ÐÚ†#*È“&†žÕÇ^ÿÒ‹[¿åÇt,“|ºàdmƒ,›¾®I®ýTÿúS­»ß¢œß~V¿õ‡½fRÞ]÷Mî4ö–†ýè'°,¦>Q®jôŸv(öá×TXþ¤ò¬*¿Pš~_£A—†ßý©ÆâôXì1àŽÂS°|ré` †0,˜Ê]o£·,«¼âߥ`L”~†Þ°¬òïvÐ °Œ ¦ n¢j Àò½ìÖÛTøpË(gbbbÂÈ ¿Û¥Ñ‹ ÿ ½à¶Ë+þ]åßí ”€Àð` w¦\ºF ˜€!¦`‚)‚` † ˜€!¦`‚)‚` † ˜€!¦`‚)"?›ƒ/]ºDn«‚‚ŒŒÐøÿ6ÜÂÆWÝ=çLLLLðèp»±” A0CLÀS0Á A0CLÀS0Á A0CLÀS0Á A0CLÀS0Á A0CLÀS€%÷Þ{ïÑ n@0Cäy±ÑÑQ…Ãa% ŽŽÒûð e±Xè7È™˜˜˜0âB£££zÿý÷µqãF­[·Nùùùô>Àİ`ê׿þµÖ¬Y£õë×Óëw Ãö˜–Õj¥ÇîP†SãããÊÍÍ¥ÇîP$E0Á A0CLÀS0Á A0CLÀS0Ī ¦.¿ñC=ÛòÇúã–gõÃ7./øoõS ¿Nÿÿh蚤kCú?ß?-bÇLû@/}ûõí—>¸ñRÿòœžúãzý*`©ä¯æ›¿ü¯«#?ü½sqDw?¢?úÆ—y¢+Ô꩘2ÙÕò­j•­•´¶LÕÿeƒþ¦­Sï\‘$\|Gm£ ÿ%uÌ—¿Õ"»‰‡ °¬’Š©«úùóÿ]þÁ§õôu}¹`>uíoÔwÃqCú¹žÒ5ZWG‚ú׿yVßîÿ¶¾ûôïkÝ‚¯Ð½?Ô÷_ê׿]QÁÝÿY_þÆÓjùý É[óëï¾ÿCýíχted½>]ýGúÆ7je3Iºúºìø[}yÿWôóžVàÿ:¢çŸúÿÙ»ÿà*ë;ïÿO!9‡Ôs &€$ Ä †@X*±"M¬ˆ¸ÖzX»¢»¢¶Áî`¾%tn¡_»ml;†é‚ëHÜ¿a¿²°Z(ôŽÒ &,‚'4ä$À÷„ŸB~›ø|Ìd&ç\×õ¹Þ×ûº(^~>WŸ¶Ç“$I’$I’$Iê¢:G0ÛÁª {Øÿ×=¼µx 0‰wœaߺüÇÒ2¶ý¼g;bÃÏyæT¬z)Eÿò'Ò'=Áìì{þ³„yú— aÃ/ýœEsy%ñþaö?’ü×¼õ›ß2ëéKùå¬IhÚÉ+ÿò\}Û¦|«O;ãù@J’$I’$I’¤®«“̘ú+u=ñó66%ÞÁ@v ÈðÄM¼uÒ¡uüõ|N]·ƒºÄ«y`ì(†$3ésãú$B¬ºŒWvdóä/'·†Jd<±“üßo±±îFnLhâwÌäÉñ}ˆm8óx’$I’$I’$I]Yç¦éŒýV/6ýi?$^Ímw|‹>—~ƒô'&òŸKßâÏ{šHìswLKŸ=ÕLš˜ÁŸÞúO67A¯o%ý<Þ3¸únnë3—ÿ=WkßÊÍ%÷[C耺êJöÿuEþà”£úP}nLèÅ!ÉO’$I’$I’$©+ë$3¦ú2ö©ß0ˆU/áŸþi);èEvîmL¼-‘¦êͬzöYöÎÄÿó¯ÌËh;íioå¼D€K‡0å™åŽâOúkJæ²ô7ßâ‰gžbH èu3çL$ý¤O.í $'žPGãÝèk¦$I’$I’$IRÖ­s•{€ KÞj ¥ö³iÍ[”--ã­5›ZC)€¼µdÚ+™ô>°gÓF>?éûÕª¤©WɉP·a ¿ùÍ\:äFÆOy’y¿ü·%þ‰ÿØXÇ722øÆþjê.íKß¾-?ÉuÿÉoÿºØéÏÚÖx’¤®cçÒ®¿þz®¿þz¦¬Š^ôã$I’$I’¤Î ¡SUÛÁŸ«›:´kÓæ?³#6Ь3Nšº”áS&’þO¿eÖ¼=L¾m}¨þÃ[,]ýW®û‡{É Àv²jé*|ã¹#+‘º o±~/†÷ù¬»¹;ý'üËœ_”ÛèsàOüGIÕ£~FŸpšRÛO’$I’$I’$©+ë\ÁeÇþŽîºƒ¿¶³K c2ó~Ö‡’Åe”,(ã¯$Ò+=›;¦ÿîÕ²®Þ¥Ãÿž§&þ’ß,.â7Ab¯«Éý‡9ü}V¸‚»ç̆_þ†’¢Õü5±W}‚9dq¦<¬íñ$I’$I’$I’º®NL%’œÈig"}y×d;°Û¥Yyüã¼¼6öHføäYürò™6áîYÏp÷i¿‘yKn<»ñ$I’$I’$I’º¨ÎõŽ©À&ý}.}ÚKœûû÷“â$$I’$I’$I’¤¿ ­à¾cŸä—cŸôÎI’$I’$I’$u2 ¶@’¤N¦q'kJ_à¥TVo£¶¡4Ò2²È½ÿaÎL¸Íãk(c1 nK IDATK__Eye„úRÓÈÈÍ÷O¡ 7ài+§ð»SYƒ¡óþ‹’ü05åKùÅÂXQYO`t1ÿµ(çø±ç[§$I’$I’ºƒ)I’:‘hù"¦M[ÌG±“¿ÕGØöQ„m³VóÒ ß§¸d&9§I}w¾ÎÜ©sY9åøÚ•k_åk_åùœÇxqÁ·n±sù|œµ‚Ú‹P§$I’$I’º&ƒ)I’:‹šåÌ*gÅë+¨¬‡XùóLžeÉÒi ž¾”èG‹™þRk(HVF:£S/L’$I’$Iê² ¦$Iê$v®^ÌÚÖ°gèO—Q<)ã„%÷ò)(ÈgÎ=Sy£êW½DE4—Üc‰O «æ ¥BŒžQLQÁ Kéå0åáûY:}*¿(Á¶ÅLa˦eœvY¿m/½¤qç¼EÌÈ?yŸó«S’$I’$I]Y7[ IRgÐHmÅÎÖß³(È;M`ÎaÊ734+‹¬¬Tb'lÛ¹‚E­iQèÎ…'‡RÇŽƤ È µ|Œ”–PÙxæŠrf¿ÈœüSë8Ï:%I’$I’Ô¥9cJ’¤N"õ@5o¬ÝÉ„ é_Ú'cÒBJ&}ùØkKÙ@Srμt^8‡&¤²â¥Z¨/§<Ã2NWLçõ¾àuJ’$I’$©ksÆ”$IBŒ¼›iy‹SŒò¹w1aZK——SmïØ(Õ«Zb)dj¨©9ÓO”`VZëqµTÔža:SÖÍd/t’$I’$Iêêœ1%IR'VÈs?ðø/ÖR DÖ¾Ê/Ö¾Ê/€@j9£G“7acs2N™ÕHmm믱µÌºëöž1Fm4§yËT Ü›À¯S’$I’$I]3¦$Iê4‚ ž´ˆ×^+fÆý7“•z|K¬¶’µo,fîÔ{ønþ4JÊkN8.Fôßãk<Ãá‹Q§$I’$I’ºº¸Í˜êÖ­‡¦[7³0IÒ×ÌY„B±Øñ߃g˜’LÏ¡ 0‡‚Bˆî¬ ¼¼œ5«V±víGDb@íZžŸú8,{‘)A @øè¤§ÔûYòZ!ƒƒÿ²Ï¾NI’$I’$uuqK‰zôèÁþýûí¸$ék!œ~|JQm¤¶ƒG5R[ytßiá@Î3Œ±¦0sa ¯¯y‡â²Z·Tò¢Z3±0é­cE«©ýJúÑ‘:%I’$I’ÔÕÅ-˜êÝ»7û÷ïgß¾}477ÛyIR—ÎËÀÖß#¥«¨îÈAÑr–®©oý0˜±'Î"jü”ES'QPPÀ”9«ˆžþo[ržA^¨åS,Rݺ_¬›[ƒ Xo|m«Ê‹&1!?Ÿ “Ѝ8ÛÄè¼ê”$I’$IRW·¥ü¸òÊ+©©©!NIR …èÛ·ï×» yd=Ï/*Èó.FIaΙ_ÍÔXÍësf²º5— å=@Ή;ƒ°³’m RJùccÛû4ãDwR{4Û §r4Ú çNat`:kcõ¬˜³ˆ‚¥3Oÿh/0çÕJ"¹œõ {çY§$I’$I’º¶„¸ž,!~ýúÙuIê⪪ª ¦H§`ö”N^Ì6`ÛKSùîªÑ<ðØ& Ë"-=L(5Õ;©,/å…E¯òÑÑ &0š?Í=%ÄJ#ot*‹_­…ØZf>^ÄŒÙÓ˜0øø^ÑO—³hî,Ê[?ç|èñ1£)|8‹{ž¯„È«LTÏŒ¢Ÿrç°Þ­¡P”êå/0sîK-¡iÜÿÓÑgÒÎè<ë”$I’$IR—vÉ‘#GŽØIÒ…TUUEff¦jVÍaêô7ØÖÑB£ùiñ& žn0 ï™~lVU‹©©a£µÔÇNøvôl–-š@úIìäõÂIÌ=q€@ˆÔ0Dkë‰0æÐŸ.¥xRÆÉ3™Ë)üîTVÇ WÌåœ~¦Óy×)I’$I’¤®ª›-$éâé=vK_{ŽÇò²µ¹g£ïŸÍ’×>”jŒ¢¥ ¸è‰#Ũ­=!ì e‘÷Ób^[pº°' —QüØÍ¤;¼žÚB©ÀÀ<~Z¼ìË¡ÔÙ]ôyÖ)I’$I’¤®ÊS’¤ ÎSgÐXCõGQQ½“ÚµD餆SÉ:ŒaƒÓÏj9»ÆŸòQu5;#j£Âi餥g0lXFÇÆi¬áÓòr>ªŽ°3 =-ƒŒŒ,†î}Aß÷tÞuJ’$I’$©K1˜’$]pS’$I’$I’NÇ¥ü$I’$I’$I’S’$I’$I’$IŠ ƒ)I’$I’$I’$Å…Á”$I’$I’$I’âÂ`J’$I’$I’$Iqa0%I’$I’$I’¤¸0˜’$I’$I’$IR\LI’$I’$I’$). ¦$I’$I’$I’S’$I’$I’$IŠ ƒ)I’$I’$I’$Å…Á”$I’$I’$I’â¢óSMõ,_¶–±³ÞáúYÿ“–í º©½ƒêYôô;LX^ÿ¥-U;k-˾šËiÜ^ÁØÿçÊ›:tñ”¯«âõ=‡:6xt;“f¿Gé> aÒì÷(ÙçC/I’$I’$I’¾,˜j¢¼l=³>ÜOKÄÔLå‡L-ÛKôkq»Yóß[(îØî =¹3·?Y=|Ð%I’$I’$IÒW/¡SUÛeiEìK_×VTS91…œDoèI’’™”ŸÜò{ÔvHÒÙhnnfß¾}455qøða"I’$I’$ºuëFbb"—]v 6äص“¢úƒMÌYá£úÃ’S(˜x…YÁ–Í u,-ÝÈâÍQj› 1ˆ08hˆ0åçU<ÁÚ²ù4ûJóC_:C4²ù˶°jW3á~}yøÆSþ±óŒç¨§äé÷Y\¼ü.c+o`ù=ÉÄŽ#F¯ÉdNA&Ã’€è&-¨¢àÉ›(H8‹ë”¤¯¹ææfvíÚE0$ô%I’$I’tÜ¡C‡Øµkýúõ3œ:«c‰a& °úÓgM¥Ë ëÌ–jŒT2­t7y×Q|U7v®ÿ„¹K*ýÏד›Ô@éâõ¼09 #õà^^*ÛăKymJ½šðBiÃF]CavÒ—OÝÍÌ_o¢âª,ŠÆ§ˆT1¿ôsêú¶îÐö9¦<ù¢Ï¬¡<ÿfJ® BSó»‰ò«¾IÑødÂ÷²´´’é+{óÚøžÏé:ýC!I{÷î¥G$$$Э[7.¹ä›"I’$I’$Ž9B·n-oIÚ»w/}ûöµ)g©SSÑH Ÿ¦eòXóJ*¢Ô“@Ö°LîLû‚5ÛÃä8Ït*z€Ú„d G^NNrÒB¤_Û@Z4FªxaO EÓ·†7=ɺïåÅÕ”GÓÈO8L8÷zŠn<}º³ó*Y›p/NÎdX"yE5«yðƒ–ííž#|t¤nÇnßè[†Q0òŠ–R„ üOS÷5ŸóuJ’ ‹‡éÞ½û±ÿ£!I’$I’$Çþ½¨¡¡ÁfœƒNE4nßÈ=ÅŸQ êÅÍ£’N›*ùE@åÝÌÌÌîç|Ž`ÿL ’×3ýç+zÍ匽6¼kRHO„šHµ£<þ³wN9*‰ÊƒÐ²j_€œÌÀF?Ddkþß$ãX~Ö¬kzh ¦¢í#|Ê׉!òGu§bë–n­£ü³Önm†kÎý:%I-.¹äC)I’$I’$}I·nÝèÞ½»ï%?G$˜jbíŠÖP  ~?«×ï?eŸ¯®üœi™i„O3B¸3’R(üÉmÜ_õ9«>ÞÍŠ7×ó|Y_æ=9’œ& ÔŸç~œIÆI]ëFø2 HèNjB÷ó¹Ì¶Ïqªèæüºœ ½¹sdãRð‡õÌ<ØÎyÚ¸Îü°($ pù>I’$I’$‘ÿvtî:Ç Þt€U‘ì©¡ºét‚d\‘­{ÙyÒ÷‡¨ü¸ŽX¨'© PSù)E«÷ÎLcÒøá”L¿ï'|Îâ­„Ózªÿ‚ÚI¤_Öò“ÝÎü7#Ô6uä"º“vU±ÏvPã!*?þ‚£oÌ:ÛsD·náƒWPüØõ̼ù rÓ’…¥×ž¡Œ6¯S’$I’$I’$éâ¸äÈ‘#G:C¡;?ø€K??þž©/ psÁhŽLò®JÒW¬ªªŠÌÌÌN[ÿ_þòzõêE÷îö’$I’$Iú²C‡±ÿ~®¼òJ›q–:ÍÚmé#G²|¤7L’$I’$I’$©³êf $I’$I’$I’S’$I’$I’$IŠ ƒ)I’$I’$I’$Å…Á”$I’$I’$I’âÂ`J’$I’$I’$Iqa0%I’$I’$I’¤¸0˜’$I’$I’$IR\LI’$I’$I’$). ¦$I’$I’$I’S’$I’$I’$IŠ ƒ)I’$I’$I’$Å…Á”$I’$I’$I’âÂ`J’$I’$I’$Iqa0%IÒEWËÛ?Ø1'ÿÜúƒG(z{µïò£[È’ÈßZé±®Ú2~të);§±£|X¶„··5žãÉO9>úÜú–lë,Ô ÷å¼úØFO.ظ’$I’$IÇ%ØI’â#0¼§§e"F¬~/›ÊŠY4ÿ è÷23|2ˆïÝ3‘A¡s9x/떼ȆÐ]|o`ð+8¾«ô±ž\°q%I’$I’Ž3˜’$)N)ƒÈ¾újŽÆ C²ûÙðï”m¡qÚ×°!á!ÜûÈŒ¿Õ>z$I’$IÒEàR~’$}U‚RC‹Å¾¼-º‘Wfþˆ»oØ1wóHQ›OXµ.º¹Œ9?º›[ÇŒa̘;øáÌ%lŒÝÚȶ·‹xäî[[— |œçÖÕvxì6Õ®ã¹ÇÀcÆ0æŽ2ý×ë8ad·½KÑ#wsë˜[¹û‘¼ûîîþÁs§¿öíãKÅEßã‘[Ä+ëÊ(zäÜ:f wüpΖêÛÆ’ü/–iîxî(ÚØºbÛµµ{DÞ;Ö‡[ï>a¹È6k:MON·­þžÕý“$I’$I_gS’$ÅÍñª±±–¯,bÉöÙãpòbrÊžz‚ëGQøìïøÕÓ“é·a!Îz·%hÜÈ¢'²¡ßdf?û+ž7™Š™õâfÆÍÅ<5ÿ}B÷ÎæÙ_=Máð½,›5ŸuьݖÆ,xè)^‹ÝB᳿ãÙÂQÔ/{Ї´;²ðѹ¬O™Ì¼_=ËŒq{Y4%{;Üž-¼¸ð=>ø4¿ÿýþ¨ì©3¸·õüN~…×^ÜÎ^ pÖ}kçµîsËìÙÜÛÒ,²S"Ü÷苬ŒŒã®v¶ß8Ã=Z_Ì;±ï0oö½-u)dö¶¹¼²«¾ýšÎГõ÷lïŸ$I’$IúÚ2˜’$)Nà yzZ6¡–O„úõ#-üÒ~õ[6±·~ OsÊ–~l®‡q©wW€Þæ•7òá¦õ¬ßPßiÙ+˜=™»ú=Á¬¿»›ìï|‡›Æã–ïŒ -µíŽ}æú÷nÙN¬ß½dŸ°OjöMô‹½Í–½Öm'6`2ƒŽ]R˜A7 €S)d ïWàtɹÔ#ÒÎåücç¯?Û¾Û¾G-qÓñftƒï°nW#wÚÞ~ï€ÓÕßÈ®·ë7•Aáã÷`Äã ŽGí×tŽý ßý“$I’$I_S’$ÅI eÙW_M°½c@Ê]<ýìdœô/ûBi@í:Š}Š•QÜþ½qLœv/_y‚¹G'ã„Gðø¿þ'÷~ø>ï¿÷ï.z‚â…ßaöï‹ÞÞØ_iƒÁ¯ôü©g:ÿÙö­½{túŽŸ+ÐÎö¶žµó¯©Ý?I’$I’Ô)øŽ)I’þÆ„ "´w {Ci¤¥µü¤ì-cᢕìm<º¬Úí<û»LŸü=¾}u?õ±cyEíº_³`É&B#ÆqïãsøõË¿â®Àû,ÙPÛîØmI4€À®÷Øt²ƒµ›ÞcW`ƒR‚ôѶ¿Ç–cãDÙòÞö¸ô¬íÚ.þ=9U{÷¨ÅÞ;Þ,·¼Ë–X #ú;¸ýTAR¾tùpÎøAÑFj;TÓWÓ_I’$I’ôõa0%IÒߘàÉL°‰ùOñöº|øî¯™5k)[R²é„@J?Bõ›xwýf"µÛX÷Ê\æ¾_Olïvö6B€í¼S<—…eëØ¸ùCÞ[¶„÷÷¦0¨_¨Ý±Û>™[B˜?÷×¼·q3ß}ŽY 7ÑïžÉBêw¦r ï0wî+¬Û¸‘u¯Ìgá†ØEëS˜õ»¶Sm¿¶öŽ?ß{rªöîQ‹zÞ™;—WÖmdã{¯0wÖkÔŸÊí;ºýËRGMåV¶ÞƒÍ|øö|毬'û{u ¦3õä\ú+I’$I’t:S’$ýÍÈägŸej¿M,zêQž˜ÿõߙͳӆ‚#¦1ã®+g=Ä}÷=Å‹ÛÆ1oÞí Ø²Y¯m#üíBæMĦEOñèCO0÷•½Œšñ,…C‚íŽÝ¦àfþjw±’ù>Ä£ ß'pÏÓüê‘Öå ÃßfƳ… ßõ"O=ú × aÚÔA©\øÞú1ü–lö?ʣśil¯¶öŽ?Ï{òåVµ}Œ¢ðÁoÏ”Gg½Èöìi<;oÇ^ãÔÞöÓ `Ưf3jïf=úO,ÚNv᳎w ¦6zrÖý•$I’$I:½KŽ9rÄ6H’.¤ªª*233;mýùË_èÕ«Ý»w÷fžÈ:ÞÞ`Ô÷F´†'l~î>Ý4ÿõ8Âvè˜Æsø»§bÌû÷"FÏ~»$I’$Iúj:tˆýû÷så•WÚŒ³äŒ)I’tìâ•ù³XX¶‘H´–më^dákõdOn(%I’$I’$l$Iº Ò&2oÞ6æ/z‚ûƤ â;Óž¥ð{©öF’$I’$I€KùI’.—ò“$I’$IRWæR~çÎ¥ü$I’$I’$I’S’$I’$I’$IŠ ƒ)I’$I’$I’$ÅEBg,ºqO„çË*)ÝÚ@Œ^}Ï"¿Ï9¼ ¤¡Ž¥eSº5ʶúÄ’{‘›{ 3nL& 0iÁòž¼‰) Û™´`OÞDÁeç{M”¯ûŒ™™ÐÇw˜H’$I’$I’¤®¯Ó͘jÜSÍÔgþÌK[ˆÐ̶ÍÛ˜õÌz–î9tvƒíÛÁ´ä‘$Ææ_Çs\Ç´ìõG¦,ÿ‚ÆS÷OèɹýÉêqA®„5ÿ½…ÒÈaŸBI’$I’$I’ôµÐÉfL5²ªì>:í¶ýüâ·¤´9Ê6Â|¿àzffÛ«‰UeY›œÅ’G2œØúuV£{ÿ»^û„UcF‘â!IÉLÊOö©‘$I’$I’$I:+˜j:ÀŠÏÚØ^eQ^-ý˜ WgXâöÖP²n~ ÿñPªUúµÃ˜×¥wó©Çì`Ò‚ªãKù5Ô±´t#‹7G©m0tÄ fLÐ2^Ãn¦ü| y“ûS¹r++>k л…?Æ„> ”<ý>‹ë€—ßelå ,¿'LäƒMÌYá£úÃ’S(˜x…YAŸRI’$I’$I’Ô%t¢¥üQ]±òæŽîßö{›÷í¦šK›všä*©'ù7^AN¸­(]¼žöfÆC¹¼ø@&é[7ñà’5GwiŽòBÙçdܒò'G0]Ì-ûœ(!¦<ùHîÆÐû¾Ëª{’!RÉ´ÒÝ„s¯£xj3®jä¥%¬ið!•$I’$I’$I]C§ ¦j>øI¥»¨ïèw3¿,BuÓ™¶7SO"©çø¾¨ÆH/ìI¡hò`Æèɰ¬ fßןðæjÊ£Ç÷Ë7Œ)Y!Òû\ÎãzÁ¾/¨H<åDP›LÁÈËÉЇ ¯§xr& >¤’$I’$I’$©kè±GÓ,^^Cì¬j¦òÃ?3… ¯ß“—&?%$âµ9!$:ê5{ˆ…B¤Ÿaôh¤ŽÚƒQÿÙ;§lI¢ò ä‡ K;Þâ`Î0^°&Éë™þó• ½ærÆ^›FÞ5)¤'úJ’$I’$I’¤®¡“ÌÇi¤²þÜŽ¬¯¨¦rb 9§<Á>}HçsVEš˜>ecÃçÌzæÏ4Þ7Ž’«Î0pêÏs?>uVS7— @Bw Ý;VhR …?¹û«>gÕÇ»Yñæzž/ë˼'G’öA•$I’$I’$I_'YÊ/HVò2Ü›®‚ÕoVQqÊr;ÿ§šrÂLèæéJá´ž„ê¿ ¶Gé—µü¤F·3ÿ͵Mg_NMå§­ÞO83Iã‡S2ý¾Ÿð9‹·6ú”J’$I’$I’¤.¡s̘JìÉù½)}ùl—óƒÔad6_ ’_0„WŸ©àÁgðÀ˜4r.ƒê?cñúý¤åærçe@ôôã\Å”Þï3÷·0¾?éwSòæV*³o -hn¿¶0‡‰î;@MC2AðÆŠÔ÷ÆýºS[YÍêú£“}É”$I’$I’$Iê:MêÑûÚ,åæ¼ùÕwìÒ²F\CÑÄÓ¼_ê¨Ë® xz%eSºâÏ,>¡ä^Œ½ë ¿Ý“`›ã‡˜òãQPº‘…‹wPŸ`èÈë(¾#¹ãŽJ"çÚ^”¬ø#Öå²l〈`þ[å¬h†@¨y£˜1 »O©$I’$I’$Iê.9räÈÛ IºªªªÈÌÌì´õÿå/¡W¯^tïî I’$I’¤/;tèû÷ïçÊ+¯´g©›-$I’$I’$IR<LI’$I’$I’$). ¦$I:K.¹Ä&H’$I’$錺u3b9§¾ÙI’N8xð $I’$IÒi566’`#ÎÁ”$I§HIIáàÁƒ444pøða"I’$I’$>LCC$%%ņœãæù55TÖ†I ½z ÓÆgö!$I’$I’$IЇ¯ÁŒ©CT¼µ–ÇW60ô–¼øØ  $=ò Sû)Ÿ6ùH’$I’$I’$ÅC' ¦BLy$‡º1:·7cß§ðÜ#mÍ–ÚOÉ1²&^ÏÌo÷aXZ29ÙMÉ&«æ3GùH’$I’$I’$ÅABç+¹P7@¬ƒGÄ€Æh ýò²4Š ÑMbÍæ/IDATا{Ëç}»YXú ¯om êE^þ0fŒ µìÝ×7ñúÖê{\ÊèQßdv~zÛ7p×ËAfŒ;LÉ»;ø¨.¬k2™]Áà¤Ös5Ô±´t#‹7G©m0tÄ fLÀàD€CT°‰9Ë#|T˜@r ¯£0+èÓ)I’$I’$I’º”®¿”_b˜)#l[ñ>ù‹6°èƒ=|=$’‘™Ò5ÕQôëY‘0¢©¹,º%‰µ¥dneS˶çË)mîÇŒ‡r)žØ›èšr&—ÕÑØzŠÆºmÌ\ÞHÞøQOÎ õ³OxpI„(]¼žöfÆC¹¼ø@&é[7ÛÞ©dZén¹×Q<5‡W5òÒ’ Ö4øpJ’$I’$I’¤®¥Θ:LìàáÏ–‚Dr&ÞÄ’«?ã¥õÞ(-g1HNáÎül ¯ Û\ÉÍ}Yp_¹IÀ€!Õü™¥ûš‰²…7¦0{ò`òÃ=YÐ\ÇíeU|tÇH†¶¶1ï¾ë˜”ÙHfh¨»Š·°b_«xaO EÓ·ŒMO²î;@yq5åÑ4ÆFP›LáÈËÉ CNZˆôkHKðá”$I’$I’$I]K§‰?#ÕL/ù„r€ÿ®9aË^_ðùé”LJë~†£œÉœìLà;·ï⥕[xéå5Ô&Œáá­õÄ’“•t|ÿœñדT¯>@,y ÃÂÇGëÝÿrÒšwði=­ÁTOÆžpî`Z_²v°vß!òêê¨=åñŸ½sJMIT„üþ™$¯gúÏW2ôšË{myפžèÃ)I’$I’$I’º–NLÕóÒ¿}ÂÚú3m®áÿ¶ÜŸd’qʦÆH3ß…‡ïËl}§SwÒ\Aá”Þd-ú/æ¯ßσ—‰Ý¸pouj ©š& ÔŸç~œIÆIÝîFø2€ r÷W}Ϊw³âÍõ<_Ö—yOŽl¡%I’$I’$I’Ô5tŽwL5Ũ¬kgŸº/¨múò×Á¨ü¸šÒÈ¡S¶¦¶=‚¤\•{vSyìøC”ÿÛj&,«#”v)ºÏ©ˆ?²æ³ÝD.epèè7_°ê„ñ#*›ƒä\ÖpZOBõ_PÛ#‰ôËZ~R£Û™ÿf„Ú&¨©ü”¢Õû g¦1iüpJ¦ßÀ÷>gñÖFŸNI’$I’$I’Ô¥tŽS‰)ͽ¢ÖUðÝßà±é71é²vŽís]½…YÅk¨ÏË$/-‰psk>ØÂâš0ý0Lzh0y¬gæËÕÌ“B°¦Š9M {èRz÷Ï$¯Çzæ¾ü)Á¼4Rëv°°l?i¹¹ =¶Ü^3o¼üg² 2Ö\GIÙgD¯ºŽ;û@«˜Òû}æþ¶Æ÷'ýànJÞÜJeö ¤%BŒ¼±bõ=†qÿ€îÔVV³º>Àèd_2%I’$I’$I’º–KŽ9r¤ÓU½¯š‚g>gÚ?blRöoj`ÕÊ)ÙTGeMŒXBiý/gJÞ7)Ð’.5î‰0¿ôcV|#Ö#L^Þ0f|»'a€}»YXú ¯om ¾G9£²™—߇Þ@ãö äÿ®™iw)]¹ƒÊú^3ˆ9 ;Z[t/%¥)Ù|€ú„CG^Ü;ÒÈHhdÍò 毩!Ò P/òò‡1cdè.-(IñUUUEff¦$I’$I’t’ÎL5í¥ðùS°į¶”ÆíÈ_|˜…ÿ<’œD(Iƒ)I’$I’$I§×­SV˜DnÿdR ‚$I’$I’$I’:Nú"£$ î¹Â»'I’$I’$I’Ô‰tÎ¥ü$IÓ\ÊO’$I’$IÒét³’$I’$I’$IŠƒ)I’$I’$I’$Å…Á”$I’$I’$I’âÂ`J’$I’$I’$Iqa0%I’$I’$I’¤¸0˜’$I’$I’$IR\LI’$I’$I’$). ¦$I’$I’$I’S’$I’$I’$IŠ ƒ)I’$I’$I’$Å…Á”$I’$I’$I’âÂ`J’$I’$I’$Iqa0%I’$I’$I’¤¸0˜’$I’$I’$IR\LI’$I’$I’$). ¦$I’$I’$I’S’$I’$I’$IŠ ƒ)I’$I’$I’$Å…Á”$I’$I’$I’âÂ`J’$I’$I’$Iqa0%I’$I’$I’¤¸0˜’$I’$I’$IR\LI’$I’$I’$). ¦$I’$I’$I’S’$I’$I’$IŠ ƒ)I’$I’$I’$Å…Á”$I’$I’$I’âÂ`J’$I’$I’$Iqa0%I’$I’$I’¤¸Hèe¢ú2õ­j}`ô£Xpcˆà9ÙÄò_¿Ë¬Ï¾Ü’´«® ° ‹±—u÷ ‘$I’$I’$Iº@:G0Õ´Ÿ…+N ¥b¬]ñ ºžœÄó»6Å“ 4¦¾n/%e•Lÿ× Ë¦e’á3"I’$I’$I’tAtšS±æÓ|Ý\ÃÔ9ïœòåÙͤ „B Mëy|ßÉd±›ï¾¡"šIF؇D’$I’$I’$éBHèz—tþ3©=&G¿h¨ciéFoŽRÛ`èˆA̘8€Á‰‡¨þ`s–Gø¨þ0ä &^GaVkÔÝ×7ñúÖê{\ÊèQßdv~zìÛNÁ3Ÿ1iú´`5ëþÀ]ëûóÚ´ônˆ0åçU<ÁÚ²ù4ûJóC°o7 K?áõ­ ÄB½ÈËÆŒ‘­AÜùÔ*I’$I’$I’tuë’WÕ|˜Æï|ˆØ ¿G÷íá…å{ ]AN ÒÅëyá`of<”Ë‹d’¾u.‰P4F*™Vº›pîuOÍaÆU¼´¤‚5 @SEÏ—SÚÜåR<±7Ñ5åL.«ëx}Íx¡´ F^CáȤ–1ý!+R45—E·$±¶ôÌ­l:¿Z%I’$I’$I’.²N9c*íš, Ç]Áè´ ç;×'öq9ßuÊ—¡+(þq½ÆH/ìI¡hú`r“z’ußÊ‹«)¦16z€Ú„d G^NNrÒB¤_Û@ZD·náƒ)Ìž<˜üp˱ šë¸½¬ŠîIN‡*s[ãû“~p7%on¥2ûÒ!ÆÞX±ƒúø@wj+«Y]`trá´Lòz¬gîËŸÌK#µn Ëö“–›ËÐD Gé xéÝ ¾¹TmaþÖÃ|æÒz_=˜<Ö3óåjfI!XSÅœŠ&†=t)=Ï£VI’$I’$I’¤‹­“$Ý F>aáÖÃíïJáþ‰Ãx,;xÎg „z’Êg,ÞÜHîµ!¦üx”ndáâÔ':ò:ŠïhY"0˜5„c*˜ÿV9+š!êE^Á(f è¤0ç‘„K?aNñVê{$‘“›Ã‹ù­K&õaFÁL/«`ê‡ ¼fs&6S¸ºâ’R˜ýÈuÌ/ý˜éÅŸë&ï®QÌÈLÏ£VI’$I’$I’¤‹ë’#Gޱ ’¤ ©ªªŠÌÌL!I’$I’$é$Ýl$I’$I’$I’âÁ`J’$I’$I’$Iqa0%I’$I’$I’¤¸0˜’$I’$I’$IR\LI’$I’$I’$). ¦$I’$I’$I’S’$I’$I’$IŠ ƒ)I’$I’$I’$Å…Á”$I’$I’$I’âÂ`J’$I’$I’$Iqa0%I’$I’$I’¤¸0˜’$I’$I’$IR\LI’$I’$I’$). ¦$I’$I’$I’S’$I’$I’$IŠ ƒ)I’$I’$I’$Å…Á”$I’$I’$I’âÂ`J’$I’$I’$Iqa0%I’$I’$I’¤¸0˜’$I’$I’$IR\LI’$I’$I’$). ¦$I’$I’$I’S’$I’$I’$IŠ ƒ)I’$I’$I’$Å…Á”$I’$I’$I’âÂ`J’$I’$I’$Iqa0%I’$I’$I’¤¸0˜’$I’$I’$IR\LI’$I’$I’$). ¦$I’$I’$I’S’$I’$I’$IŠ ƒ)I’$I’$I’$ÅE§ ¦#“?뮟µ’…‘Cg}|´òrg½Ãõ‹vPsVG6Q¾®Š×÷´ž³a7Sf¯¦dϼ¸èv&Í~Ò}ç;Ð)µ^°q;p.I’$I’$I’¤St®`j_„™ÿï{Ìü ŽÊÊjˆ±¦2JŘ´¨‚UÑŽ ÔDÅúb»¶³6z6E4²æ¿·P9|ñ®3¡'wæö'«ÇùtJ­lܯ¨/’$I’$I’$©SKè<¥ÖSRògVÔ¥dÅ [¶­ø#¶þ>½$ÌkÓ2Hok¨†:J7f`îU×l¥ts#Fÿv.5)™IùÉg\I’$I’$I’¤èDÁTˆ;Çõæ…—[g:V7FßœÖv(D?ûŒµÍ—ò𨄫¶2ý^jF¦Ñ`ßv žùŒIÓo¤ ܲͺ?p×úþ¼6-…7ž~ŸÅuÀËï2¶ò–oÙ§vÏvfþÛVìŠêÝÂcBŸî­'Ü×7ñúÖê{\ÊèQßdv~Ÿ–ó5D˜òó* È`mÙÇ|š}¥¹û™´ Š‚'oâÎ}ðÝß}~Ê5øþc733íÿoïþb³*<Žÿú‡† ‚úB ¥qËÀPˆtB”Ý,¨Ù’¨³$[7¬r!D3ì…nÜÀ…8b2¢°™Ìr±IÔ 5fí$Ì0íFG'»hHê¬SµŠ6¤‚ ÕBJK){AåŸDgN`çóILˆïyÏûœçpnøæyÎØô÷~’§_Ù“7?ÊPÊ2cvCÖ·6¤©êhž»p¬KeÕèy['^n\²ò™=iYQ—®7ºÓÞ3Š ¯ëŒ ka6åÝ<Ò÷ƒüê¡ÑyÍ`Úþõ·ÙÚ°(ÿÞ´7ÿreÖÝ9’ç^ߟ]}eiœÝ'Zë3«jô”}y±íóüGý9<\‘¹·Üœu˦gVy’œÌ¾wwgýk½Ùut$µ“Òºl~Ö4Vz¢à*vlåw2‡z?OGï‰3ÿ§bfc¶¬½3¿]»0Ï<{ýGúÒùÙ`¿ñ\£ÛøÕÞ%SªÒ<¯*éÙ—Ž+Úί:+ý«kZÒ<±<5'eeë÷3#I2’]í¿ÏªŸ½—Žßp®ÑmüJsJ)%)5ÞëóE~Ù=xec)¿øÔÍ]Ú”û«S?}Z~¼¸&9r,‡“ôwïÉöã“òÄŠYYÚ0!Íófgã²ërøÝ½ÙufŒ#©YôÃlX<-‹¾¶©<55•™\S™ÊÞ=yú÷åy`åœ4W%IYn»£)[볤¡6Ísfdå_”¥ÿÈð%Çš+WRgSV6Vgê”óÀ×%G¾}·×¥ç¥²4=‹ÊúÒÖsúd‡v÷¤«ö¦´–¾º¾²´,ŸŸûçÔ¦yNC6®¨KM÷ž´I{÷fëg“²aŬ,™>!Mõyby]j> ˆýÇr¸¬6­ nLóô)ùѲžŽreh¸šýÙýSþ`oOÞ®HëèÊL.å¶qgûÎÏÓ?¯”šouÖŠ4•ÎNeeÙ˜TŒþùpï± ÕÎHÓ9'ž\wcJÃûóáѤyÜéï77T\ú'ú{óøË½)ݵ(?þ*î”Wgé±éìÞŸ»ûÒÑs(ow'³/?â+×ùוT\é””_—Ö™c²fg_ú'ä­ÇRš7?õÉ芬 YR:á*K7¤±lÞ>r2-}}9|¼?ÿôÓW/8iUºŽ'KëÒZ»3kŸy#sgߘ%óJi™=)SË=Ðp5»6ÂTù”l|ôÖtîîÊÚöÏ3”cÙÔ¶/õ˧¥q¸?¿nû 'IÆdnËü<ÒX›¹'³kÇ¡ e$/mþϼtîGÝ=é(eÉE¾54øúq5µi.U^ü$'¾È‹¤zöülYZs&ð öveõËóR÷‰,)%Éàð™/e_÷·yÑõ¥ñ©è;˜ÎþúL&‡z¤·l|fUçtˆ¹¤“élïÈ¿-åç•2ùœONoÇ7-Ï>Ö”¦òÓÇv¿LDû£ë îY]]š†ßËÖ׾Ⱦں´L9÷Ó/ófïÉ,i;zzÓ5\™û&ŽM͸ ©>úe«Ê¢Ñ± ~òaÖþ®2k–×g°ûÃlí’G—rC)÷·ôeÃÆwò|÷`–ΫôTÀUêÚÊo íoÌÑK3’·ßÚŸ} R‘O{öåíáŠÜsç ™ujoNKõÁÓÛù-¯ÊÔ²cyéõý™µøºdïž<Ý=’Ôž=¼&#é?r,‡jÏ ES3³!-ãvæÉ—?LeK)×÷íϦm_¤´hÑéU]— @ý]Y»ãdîyàæ4åDú¿jde婨®Jõñ¾´ôe®¯“}èÊ“ïg¨îhŸ8½µÝ7õ»Žë¢×zîoU%©ªMëÌ‘¬} 3î*eêyGgûË辰µ!MÃ}yn[OúgÎÏ=S’ÊÌÌÊÉÿ•'Ñ™Ü]—©Çä¹ßt§kέ)•'C9–ííûst\Sî›>6‡»öå­£¹­ÖK¦àj6æÚjUî_yK&-­·æÙ»ÎîÙ6£åÖ<ÛzS'ß”§V^ªÍúe“S}Î8šç]—ÃíïdUû—£ïKº„òIYÿ·¤5Ÿfý–Yµí`*5çÙ¥rùµ='³ï‡r8CÙþü[¹ý§¯Ÿùouç`*fgý²´¿°#»±#[•²qÅ´Ìèݵ;^z¬ßi\¿?_ÿ­ò4/¬M2>­sªÎ?¼lrÖÝQžímïdÕ {²¯îûÙ²â«aÕYùÐÂ<<±/›ž'«Ûö§Îül¹«6•Ij=!ÿÑ‘U›wæñƒ¹­uaÖM뉀«Ø÷N:uêZø`ïû¹wóÇéMEþîáÅy¼$J\ö½öVîíš™_=2ýÌŠ©ÁOþ'KŸɦǤ¹ÜÁÿG{÷îMCCƒ‰ÎsÍî}VYš_?5Û¼Z MG÷ÁlÝ1¹Ën¼`?àÏ‘—òð'1Ø÷qÖ¿Ð›Š¦9ÙÔTiB€kw+?®^¶ò.fŒ) Â…¦(„0@!„) !LPa €BSB˜ Â…¦(„0@!„) !LPˆï:uê”iàOÍŠ) !LPa €BSB˜ Â…¦(„0@!„) !LPa €BSB˜ Â…¦(„0@!„) !LPa €BSB˜ Â…¦(„0@!„) !LPa €BSB˜ Â…¦(„0@!„) !LPa €BSB˜ Â…¦(„0@!„) !LPa €BSB˜ Â…¦(„0@!„) !LPa €BSB˜ Â…¦(„0@!„) !LPa €BSB˜ Â…¦(Äÿduÿ~/‡IEND®B`‚glewlwyd-1.3.1/screenshots/password_forgot.png000066400000000000000000000354771322667720100216700ustar00rootroot00000000000000‰PNG  IHDRBÐrth`bKGDÿÿÿ ½§“ pHYs  šœtIMEá 4tEXtCommentCreated with GIMPW IDATxÚí½t“eº÷û6)%©4áGZ4I§4*#­nÚqhu[f†Îv(s¤ÎF¶8{„¥à{(goÊyå¬×zÞEÝË¢kÊž-Ž‚£Ô³mõLë a+aœÆ3´¸MaLE¢ØŒ46šPú¤-礿 …´”ÂõY‹µhòÜO®û×÷¾®ë¾Ÿd‚Ïç; Â-ÌDiADADADADADADADADADAnQbo¶ ) YTÒ8¦²é%5¼œ§•Q!—že4l\DI# [Lå›kHU‹G(‚ áŠ*}ËóRˆv±2˜Ô·ô`ðT¯àÉJ7`¢¤j;yz™ ‚áw½¥¢ÂéeA$4A!A¸UCãqÁç¤v÷nöظ¼AB€JcÀdÉdaárò-úásŠƒÍ?+ÆØö9ª©¬Ü‰ÍD•YÎ{/X†” ÝÃî]µØÍxƒ€J‡)+Ÿ¥+—“—ÂÀN]z)5/ç {œÏ?ÎZ[pÐk.Ê–>J kçpö=Ëâ²fPeSþÞ,´P_]ÅîÚúˆ*4Y¹…,-Ê#U{¹fßCuµ•F‡—?€J£#)É„9¿¥Y¤\Ê(ÅCCí.ª÷9q¹ÝøƒávH2šÈ,|’åy©hÇ¥l€úõ‹)m0Q\µ…æV l|¼„Æp5È(­áÅœ ?ÝǾg—RÖ `dÝ®×(Hº^cQÁç¨eçn+v‡ (<–l —S¥!¼•ðìÛJq™ï¯‡‚^šíu4ÛëØ™]Lù¦…—ž”(xö=ÏÚ2þÞ?º{=kw4òA~\ö*ÊìVì%eä^3{¯ ųçKʰ 1$DÐÛŒ­ª [m-«Ë_ pØ3ê·Sjõ^ôN(èÇíjÄ]ÙˆõÕtVo{qØ{¯²qcÍ¡‹ÛÁÝìÅ]f§f×"Ê·=‡E{¥eµ˜óMÐä\X^ rЧ× û¹ln”óPÑR\Ø\‘ÿòÉHº^cÑþç‹)³]ðI!?îÆ:*ë¨]TÊRE„ð– àØÊÚ2kÿ`1dä’“‰YÄÙÔ@ã¾FÜ!ðÛËYû¼–7·äŒèa»)­‰ <“Ñ€1K70ôöl$‚:2rsÉÉ4£ :i¬·akòc++Á¥¹öª1oz½›Zv?ÍÊî‘=›h¹ØQlÇå4&²s3É2'p6Po·Óì‚MT®ÝŒæÍ.úŒ–Ý%"¨2’™ŸOŽÙ€N­à÷:©·Zit‡ ÔLeY5™¯1d;Ì·ç ™!s9Œ:ð»ì«®£É¸ëØ\‘Û›²úmŒeõ–|ŒTâ\6JÎPÚ×Ô4Dt‚Îz<˜‡Ø­´ÔãŒ|®.;“¤ë28^ZK™­ï“4˜2sÈÌÊ Iqáh°ckòâ®+¥\<ÂïRT[KuuÒå/ÔÉ]˜EÿœTœ¼ú|ßÀÓ‘[ºM936oa!¬n१K¨óBо• ‡…M–ᇟ»¦0_Rƺ óøöQQÑAU&ůmaaRßy,,\Å“{6óty#îàH‹üxØ«F­ü×Xñâòƒ*}5Û^,8h»°€¢ç<ì{>2ÑBTTÔ“3xÒ*G©­vGD0ƒu¯½xAx¸‚¢"ö¬_AySÜ6š|E¤ S½ª?M_½ƒ ·wyl]QŒÕÁújœ,ú"½1—MÊ$ÛU^:êiQ,ƒpîs_ÐD4ùV ±Ûר'–²‘k8•£;y¾."‚ª‹=î‚¢5¬®ßÊÓ¥Ö¼Éï.7õfI¨©†ÊÊÊËÿ«¨Å­ NéìÄéiÝ¢-lÈÆ5Òf±¦t)†ð:‹mg¾KØ’Q¼ ÜiôXwE&ŸŠìM›‰à€$¥,ÜÀ†LÕÈÞàU°÷ŠPe²aKá0O$‘·¡ŒÅ†HÿØwS?Ø%,¢šœU仆%‘ShêO`hØçwz"ÿ7Q;ÌR­…¥EÙ¤›L˜Lze<Ê&‘›ñªü4ù††¼öHÈ›¾tQ¤ý]Ô;CòƒŽú¾ÀBþ ó¬×n,p쪜ŠìMç.ô9ë(ëë@›—Í S™GôŽÔ©…õÍI§×HyU.ˇ=ì¡Ñ™š<ŠFLBëÉ)ÊBu­ì½B4yËÉÑhEO¦GþhÆ:X´9¼¸w/{÷îå½M#×C „FÖ`M_©¬ ža¯I)ÜÂËÛ·³ýå Cì{Y5)y™ 7ûœ¾!!¯#ü…X"é §ÝMóå-ù èà5‹Š«£/6/àÉÇ¢šÔÂ"Lw0,ÝÁ›«F{ Ú‡³/³­Ë$ã’y2=™py!äÆá¬á>ΔͰ­(nú̹/ª¹˜°Ó|-ì½B̹ÆK†ÖzKFšqîJNj¡¸‚稇ÍJMµkÄIš’—®¦?!šÊŸd™m…ùydfYH¹äfç•”µ)³ÊFc(’'Ì ïàš#!¯.“Œ$#F³ kcˆ c O¨¸6SÒó̓ò{×p,úœ¸"©%ïÒ.Iô}”áMë ·ô&ô—™¡z“ð¼AeØìšJ;±†€¯?×¢3è.-Z=I*.Úͼö^:ŒºËaD¸¿w¸lS€£ õØêq¹Ü¸Ý-xƒ¡¨>]m^CÙj/%•øod§@¥3aÉÊ$7?ŸKÊE WR­™|346AÈYKɬଋ¶ÊœCŠZ‹>7]àmÄÉz}ùA -úë2•€‡þ2_f,¢§ÿ£$4¾i3‹„ú •úò2ѿà Ê]8IFÝ`x¤¾üpÍU°÷ŠP£¾leÔhûâ|Ea°g5_Ìê’rªêl46»""¨Bg0‘‘»”Õ‹—¼wjá ¼¹«œu‹³Ã¶¯¥ü.­U”¯dñãÙíðcY-–|SžÐá {üvgÄ‹xÉzsnžÐæ „½¾¾°À˜O¦þ:ÅA½pùþíMöX¾x„¯™hÔ@ú \jìJ 80¹G;8Ô+oà²B@¹ÎöFEÿåß“h'}Fèr)4›ºÙK 8عË5rŽÌëÂívÓ¼¯ÇH“9àí4ôJÊÊ1šò"Çœ‚TEb|SŽiHH«7çDúËMMä)•9ØÝÜk×·Id/8ÖTY±oø³ˆÊQvVظÉtP„pø1QÀê¾eß[Ãúµ¿bßQ_ÿäT|G©ÿÕzÖVõÌfuaʘö_µY+)Œ¬ÄA[ k·îá¨OÈÅÝÃÖâRìÁ¡^}Uí à \I†h,[ËóµŽ]OŇsßK¬][ñlUd¬,Â<ÈS2ö{?v*_u^´(ø»Ùüt1uÞ ó‘“¹ÿ`s¨‘çK^bÏÑ¡w ÝÇK%e4EþÎ(è;®r%eu)ËŸ23.¸JŸI†nèKæ|óðù¿k8õykX±+h/ãéÍÕ4´Åz~µ~-Uî›oÊËfÉðòDÖºXê^K• B®ÊV×*4šÁ!Ë¡‘Å[6Œ|€ø²áq*ËK×á|º‚¦¸­å¬¶–ƒJƒ&ì_yMK×a¬­ÀÕE™ðñ±WÝ ØËާÇf2 1¯ã…5©£˜XÒ3´47y±Uc«•FEè‚Í ]î&6-šK)\Ifu!p׬e±ÍD†Ù€Vñáv¹pûC€†Œ|3.k#A‚XׯÀ“SÀª E˜ÕjR—¯#Û^8B®:ÊW×QŽ N‹ð3Ø Uf1ú_IÙÁ]a"ß}>Uf².|ZHBžYE½ï†&ò-Ú`,šYS¶’æÕ;p~{%%öJ@ƒ†±ˆ*“•…~vT¹Ä#¼ùµÐ̪m;(^”Žf§3xà©LùWngåÊ’ùê”^x­”Å郾U¡_ud®®¤|ùÀ‘õp[‚ã`¯>g%ù}žJÈ«¹§;8êE$gÝ6¶­Î¤ÿVCDPGæÊr¶oʹx_RŸÇ–íÅ,2E\*¿‹&»{c3n•1—uÛÞäÅu«)êkŽ—&›mÐy»6m¿ - á÷2‰ÜÕå¼¹eáÐ]Ú+);8¸pÐsæá0«1æºÆ˜EƒŒÅÔ"¶í(&ß4Ø­A•i%¯m¹àýï>|>ßyQ½Ëðàt8pºýø½ÎˆÉbÁ’4þßËhqÐÐäÄ­ÎDFNVø©†À>ž]\F3`Z·‹íIWÇ^Ń£¾§+I:Œ¦rÌ—/×ÿ}„X¹ãMŠRîåòzð¡Çh4cÉ2“tY÷2üIø0µ‚:É€1#‹¬Áw(-4ìkÄåÑLVŽù"aUIö«¥Øƒ!ËVðlãrŠò30´àwãr5`Ý]C£@EÆê•˜EA„ð¦B›Ã†V²qýšCAš­•”Z‡»PEúÒÙ²P~lXDoF-4ñò{¹8¬»Ù½§ —Ûƒ?òEC fK.K ÉIWP®²Y"Â-œ#A„Pš@BABABABABABABABABABABABABABABABABABABABA„[‰1þ®q ¯.[I•wä+4#FS ‹–S`ú£ä}ϲ¸¬2˨{! ùµ^á»ÆõÞÚZ6vl­ÄîÑTQJuÆk¥Hƒ_3›VŒ=”NIÍËäi¥In´¦B/jAm1ˆ7xC{„j=)Y…lÙ¶ŽtÜTׯPÆCͬyn «ò’¤1nôЀ¤\–gªð7¹H{ ‚p3†Æ—q Ñ´€?@¹">'µ;wRmwàö‡@¥Á`Ê¡ h)…9)Ä -õÕTÕÖãt¹qûƒá2)f2 ŠXžoAa!¥…ú;Ømwârû ¡Ag4‘U°œ•Ã\?&»Æ¯žJÃz•4¡[TÉ›Ïéqì®dGu=.4:L–|ž\½œœ$5 Ð°~%M}¥›)[ü(eY·ë5†d1FaC þY—6cXºƒ×–Cý¯¶RY׌?½„š—ó)òöí[ÏÒ²&0®f×k…\äÃ(GyiÙjêü*²ËÞaKÖÀG÷±sW¶þ Òa´dS¸üâ 8Oõ ž¬t£Y´wž3_Ô} šüm¼³!üþXët9Fcw;5ì¦rg-õÍ^B¨Ð¥çP´j+O?Y‰ÛTLÕö…èßž§YZî²Y2º1"\[¿7⪵—XÊÑjž]¶–ŠºÆðÄñ6[ÙQº’[ëñ r8^ZÁÊÒX›qûƒ¨TªpW#uÅ,Û¸Ï" l]¶’Ò*;Ín?!T¨âw7a­,fÙúÚ¡×É®ñ®g„›ÚõË(ÙaÃÐbЩ èÇe¯¢tÅföD é²rÉÎLG€ Sf6ٹٵã`ƒâƺùiÊêšñGQW½¥€ w-vÏ0·sÕbóš -zömfÅê2jì1ùq7†7àž­ÇTË(ët)Fo·ÂÑêgYV²[³—p‘þf•ÅËxÞ6ÊÆ(Ljp-…ÐceGc¸k5é¦K aÀAEI%Í!0d¯f[U{÷îeo]嫳Ñ^k)›kͦ–Ýl­ó*2Vo£jï^>øàöî­¡²8jÚAõQ¥Ð9*žÇꌋ(ÝQÇÞ½ðÁÞ:v•.„šE¥C¹2»Æ»žüûʨt¦°¸¬Š½¼Ã›ï|@]å:2U@¨‘;¢ &µh[¶¬Â¢0±tÓ¶lZE¿Î\ ^ëV*Õ¤/ZGÙ¶Jvlɹt¿ê-„•kãEK ®ZA@“Sˆ¹ÏYi©¦´ÌŽÐdØWWSII¾Ñ\Y¯œã#…£®ÓHŒÁnÅù*%•Í„Óâ2vÕíeïÞ½ÔT“kbßQ‡w&D7F„k"„JÀÃÑúÝl\[‰ #E…æK†k%V?¨2ÖQ¾¥s_|ªÖc)ܶuám—æWwЧS>gcx˜Ö°©Ð<(ìÖ’ºp«Óü¸üƒBbGP‘¹z 9)êþ>)gë² h4ZnßÙÅ8×s`µW‘½©œ5Y5U§°n1< \Þ¨ùÙ ’¾n;/?W@–9•ýåB-=–°âªmêm+Nªëƒ€ŽÜÅ¦ÈøPpìÚ7éëØþ€}jm*y¶Sš­üÔ½::O|DF]§á£ŸÑÛí£þÕü€nÑ6¶­É¢/rÕ¦.dÓ¶â°7=*p|ƈá(qW<É£>:äߢÅO²ºt~ ™Åe^ò茇ÆZ !gy>Ãí…%å¯"[4Df“>¯œššj¶ “{TPB¦,Õ‘ü_wÃ…›7Z²¶¼É{ï½Ã‹ý‰´±Ù5ÞõìG“GQÖžŠÞ`›~e6¨rY•?ºÝÊþðØUK£o°VS ùô-JŠ‹} áÅ*{yî0öiÉz2€ÓŠk@U§ä`VÕ`¹qù ëJÏHŽ¥N¥Qy„Úqh×1Ø9IÖˆf´zÍ(뢑CÖ7”G8*Ô‘Î3²z×kF©«ÇK<]I&kLdæd’•i!Ãl&5I}Á1’UÖR¸…7 m°a³Õãp8höqÙk(³Û°—ngSŽ~Ìvw=o„¶¾Rô–Òi¢ÙUKƒo!9ÎjC€©ì¤¡ýÓŸÚQãB„"­Ž6r¼ê‰±1Ø­ô»Á#›- ½[HÕz’4Ðôáò+0ÂY'%@AV«xáq6„5èŒèÔcµk¼ëy#´õx9……ágϽMxUf!Y­`Iä.<¡¾c+»^pü¸e[+ÂùC~aÿ&‹:’d :jª) -µì¼êz2»Õf óu@ÛÖJ†I…–Ú­¼ê‘º…r„ ÍZͺìÊì^ꊧ)3ì,3zÅI}µ•¦ða+6­Ž3P›(ÈÑa³ú±mÞˆnM9&-ënjšü¨T@\µV ¹XR-åjh²i,[Ê Û"²-©$©´4X©µ»Ã[‹&بíïz^Q6ÀEíî=¨-I˜,’Ô×Ö†áÃcY…–a#H}ÞVÖ¬d‡«™«—ÑŸKŽ9 Ÿ³›5rvÔ°˜MËS.ÈAVÐì·R¼VaåÒ\Œj?N{5U67ºt#þæ««*£·[yÕrm%ØüVJV¸ÈÍÏÅ’àhƒºF7:“¿Ë*µl‚Ü Bzò6m‡Š¶Zݸ­T5ZûßÕ¤/fÃà§#PcY·…•žìhj¦¦¢”š‹YZ¶Â@ËÊ 6VRâòPùæ²6”³Z)¥ÒîÅm¯£Ê>Ø#Ù«7°aÈ¡ÇÑÚ5Þõ{œ›¥ÂfÑTUNSÕàg¯‘ Ã…ÇéÐÜ|Ñ#uCmO¡¨|<¿™~š¬54 ˜‡&})›¶¬x ©€M%ŠËlxÝ6v”Ûúß2-*£4ÏÆÓÅWÙ½‹ÝÚ,6l/A]R†ÕíÂVã¢Ïrã¢2J³v³²Ôjùµ«ÉŸÏwþF3Jñ9ihpâv+¨FŒ&3–Tý+¢‚ÇÙ€Ã寝è0šÍ˜M)‘ƒÓ -õVìn­1“üA_$ x48=x½~µƒ1³ÅÌ¥žI]ã]ϱàùφå 6šÈÌË"E}­mÚWΗ–±¶Î?äË.E ÅAC“ ¯G$¦ô¬KÛ8JCC3noEkÀœ™ƒå:|ÑÀ¨íFÁwÔ‰£Ù‰WÑaÊÌ!+E‹¯öi–V¸"_¦*^á­$„ÂMJÀÁóËŠ±u,ª|“çRoõiícßKXýZrV®xºfðûë—RÖ¥5¼˜#^á- 7-Špì®Ày¤®0U|Т:h´qøŒ˜^(Âܯu»7³µ ÐdSdPø.»ì{vqdƒ@Evé›lÉÑKÓD¼ä—ž.¦În1ƒ:€ÛåœÒ‘_º Ò^â ßmô)FTÍnBºtòWn`LêAN¡…ç^ÛAVõ.v[¸Ü.ü¨ÐÓ1›s(XZ8è[’ñA®òï‚ ˆJ‚ B(‚ B(‚ B(‚ B(‚ B(‚ B(‚ B(‚pË2¦G캻»ikkCQº»»¥A¸!P«ÕLš4 ½^ÏĉÑûy£~Ä®»»›¿þõ¯èt:4 ±±7ÎãÊ_}õ©©©L˜0AF„ Ü‚ôôôÐÑÑÏçÃh4F-†£V±öövt:S¦L¹!"..î†gA® çÏŸçüùóÄÅÅàóù˜6mÚÕÂÎÎN¦OŸ~ãÆú±±"„‚p ƒN§ãرcQ—õfIooï¨boA„k-„qqq(Jô¿E+Š&ÂMÇh÷ DA!”&áVG„PBiADADADADADAna®ÏC¹g¿à¯ÿ–?8¼tÁò#þþ©1g²tˆ ·‚GúŠªÿñ¯Ô8¼tЉ×Qÿþ*¾ I‡‚p áÙ¿ÔðQû0o´DÍ_ÎJ‚pó ᙯÚG|¯ý«3Ò#‚ \s®qŽ0ÕªkaJ÷qö¼QKç‚àg©q}/r|ÏÔ~À²%s˜ tµ}Î'ú ׉=¨ÑÞ‘Fvn6³úó™ÝœúâO|üÙ1ZO+Äh“I›÷óç$†·Û‹íÍ÷9•û8óŽŒÍy–¹K–r_â`[ÚøøíjÚç2¯ý Žü•öδwÜGî#÷1³Ï¼®6¾8ð ]'(= žÂi’›=‹Éƒï¾ô[W›IDATó@!÷žøŽœ 3…;îË%7MáЇãl  ¨§’6?ŸÌIˆ €ËÔAÄ#¼…é:†íý?q¤ËÀ½?XÀ‚f1¹õ0ÖßNGD@Úþü.ïìw¡îcÁÃ?àÞ©8÷¿Ëï¿èr«ŽÏöðá1˜ižKrüñA+ŸHäÞ‡òÉŸŸLÏ_`ýÓqºÂIŽ~ø>ûg™šö ü‹1–ÖÃV¬_ M)œ8ð{=idç?Ì3:ùë÷yûm'fÌã‘/ÀœÐΑý6Žu®‚ Ḡ‡+®ݧŽÑÚù‘<8-˜ƒqj<\=ôt=åÇiâï}ŒÇ² áÆL…ჷ±~r¯)Cä^ ÏðG™Eþ’™ LÌñ7ø}Û f×­ÐÉTL á‘9 ásf‚÷Žœè {ÎäÎLx€ç†=Z¾xûOtšáÇÎ$HV·âzß͉ŽnR‰¢â âŽ/S³3ûÅa(2³§ÞX«DÂLéÄùá‡üù‹ãœêêf²ñArsç’ Ýí.N %íV”ÉÜ17/':efFÜ¥?Om4‘8Htâ'«¡zb™û“ŸED°›®/Ç>ÿŒcÈûƒÐ&èÜÕ“‰g غOìGQAp¼|¤BþeÕþÛ«_yý®UÿBa’êÆjÉ©ä?ÖÃÁ‡qî¯Å±b¦ÜÁ½>ļY ô(ôÀñÎk8.*OGW7DÂàø„¸Ë6¶:ñÒל=fÇvÐEk{'=ê)̘‘@lÌ0#¸111#x¡QÔ!A\BA„p| yø¬ÁsÑËž†ÏðÜ—ÍõÕÂÎvõ¯â¦Í!û'sȦ‹¯›Ï~‚Ãúq/å^u<1h1ÿ8Ÿ´ø‹›vò`÷n!ŠšŽCüÞz˜.Óøñ#&f&ƪz›ƒWpÛ˜ÑÔA$4¾rN®æÅ ›yÃqq¼ÕéxƒÍ^¤úðékÚ]A?ðr¶•#ƒN÷œ=ú;^ýw=v³ ©<øÐ}Lá4îŽnbg1•NÚÏNfÚ´i‘‰Äž8ÈŸ¸QÆÑÎîSnÚ™ÂÜ ÐuêŠC×kYA¸µ=³_±ÿ·¯òVcû¥¯ë<ž—ÿw3Áª¿_Àì«ùÈ]l3µðÍÁ±ÇÏÃw ×ÁƒœPŠŒ§Í"Aù„ý¿·¸÷â•ûÜÉé˜;˜75&›˜o>Èûûßáw'æ‘6#†S­Gp9A¼eÚX {¼ÌÉð™ý3âç&3ùl+΃ŸqLž­œè˜ÊÌø±„ÿQÔAÄ#¼ÒPø+^ßü?//‚ƒho|‹ÿ¹ùõ«üÈ]æ… HKìàðþßcµ»èIË'?M;pIâ\~œo!¹ûöÄþOŽÐ—Æ‚Ç!urx1<´„ÇæQÜØ¿ÿOv÷`œ_ÀOœ6¾«Lâ½üäa3 'òQm-<Ž6{ K~pñí°:5Fͽ†u„” >Ÿïüh |õÕWÌž={Bx˜Ÿy™#£6-g_YϽªÑÙf±XäÞá§»»‡ÃµV]}ÅPÝËúû7éAnáÐXA„PA„PA„PA„PA„PA„PA„PA„PA„PA„Páæ‰'ÒÛÛ+-' K(B­V_=!ŒçôéÓÒÒ‚ ܰ´··3iÒ¤«'„S§NåôéÓøý~º»»¥ÅA¸aP…ÖÖVÚÚÚÐëõQ—õ÷Bø»¾ÚÛÛéêê1á†A­V3iÒ$ôz='FïçIûx±®Ûáã:»8þ¼ô‚ ×… & #÷Þ™¬_”>úòcBï™s,ùc”^˜¨ŽgbŒJzB„ëJoOˆÞ®³¨c&°óÙ‡0Üvs„Ë_þ˜î‰qÄÆß&"( Áı“§"–å/<º²£ý°ÿóÿi {‚ª8iyAn8bâ&£ôœ§¼®ùê áŸx™¨Ž—ÖáÆõã&³÷3÷ÕÂ.%$á° 7|˜Ü¥Dÿ{Àòˆ "œÒ‚ ˆ ‚ ˆ ‚ ˆ ‚ ˆ ‚ ˆ ‚ ˆ ‚ ˆ ‚ ˆÞ´ÄÆ3ÿ‡~ó\õÏÿˆÆçáÏ=Àæl=S¯S“ß»ôÿ ÷ÆÊ¼Õ¦Ûw«ï5sûuš;"„cc’žÏ-àå…É$wž¢¶þ+ÞúsG˜ÂO=ÀžgÒH1º,wþpÏÿ ù“¤-n5:ÎõÐÕ}óÿFÑM-w>0—%º½oç—‚(ƒô?-?›·Ìfóýnþþ@§ŒxA¸ˆ o¼²—7$4þnküs>±ÅvYËãyâ¹<ãoäïöhؼÌLv·“Ÿ¾ô ­QÙLšBaþžÊÐ33º:lßåð™‡)IÛTößÄÆ¦OXXuú‚…˜”Äoþû}°ûc^ŒŸÍ³Ù3˜7}"m­>j÷â•/•!ëïsÓXÿH2s§Ç‘@'}üîÃf^94hÑŠ¦—¼&žÂçP¢ý–§þïCîùùÿÇËi1«ÛÏÏí‘h@kä·ïaÖçÈû­ÐïdãOŒd§hIèìä ·—7Þ?‚õToý4Ö¾í8ü”%öDž]x;ó“ãè8ykÝ!^qÇóÄ’{xâ{·1M⋦fJÞý–oºGÓþ¡ø!žíøŒÜó ™'71ÿüÏÿ\:š¯Û¾$&nòw j½tž›ÂãSøþƒ),˜3]¸ÏtÓÀy”s!NŸHµ1߬3“7¹{ãqþäVHHMægÞÁ­ßòQ[CÚw‘;EÅÜÎä¯Ý¼ùé Ú§L'÷îÛÉžØÊ;®0‘{’ÍÛ?šÆÌÞÓìùÌË7ÝòšÍ#úb{¼÷'/'†M¿¨˜û7³xHuSölæuŸáÀQ}q–ž¨lŒç‰•?àŸïQÓþu+4Ÿât|"Ý{¹j/ï~©ÐU}»9ÑâÇ?•\Cˆ·v;x¥©ƒÖ³Ã«åg ’˜55‰¥™“iwyøð˜Bâ3øÛ¬îõ·ò{Ox&gÏç½B3Μä½OsÈ×K‚ayóf2ãëoØê|”u¸Ü5A:n»¥©ñ¸?ûÇY VÓ ïäî8HœtŠ·¢wç÷(¾Oƒc“÷Ûz™:÷û¼÷Ô,îVŸÅvà8NMà®{ogIÎtÔŸËÀùKôÓ9LcîûQŽCC"?¹w2Çš¾¡ö›nRï6ðÐ}3yä~#óΞäí¤ã¡´dTZyç›Ð(ú@Í}Ùwò âáõƒ”H}³{Oðænô„R¯ÒÉSyß°Ýù_üãûsÙü“dædÌ¡,cÐÅGÚø¤é[Þ>䣽{À [²d6s:ZøåKŸsð\äåÜl~î~úX*o|ù9Gú®×M'ðûùåE†ÃÓ¨ÿå¦é™j Òžx;s´pò+~ñÊ‘þr¯Ìý>ÿo‘¢ùñ¿äÛ™º§ž¼?vDVèxžˆÆFí –¤@[ýÿÇ/>è+û ÿðÌßðÔìi$ÓÁ7ÑÖ×ÓÆ¡Ö^Èèâð—m>wi“’áÝW?æ…¯#ühÏ?—ÉÂEiÌs:8xNÍüûoƒŽ~¹ýóˆ—$ÞÉl03ï{ñðu£¨C×´:OÒ¶ …\£š7ÚÐ&2/Ú:`Z²9±vOdVF"p†ß¹»!v ϸ…¸ÉÏôr䀃¿/µòÓíŸR¶ÿ[ì­0'ívžúùìù—y<‘i‚Ä,™Ç?uó±h'Eþq†·í gÞàdbg+¿>4hMìpð;50õ®Û™C¶º¯-Ð~èoû£4?äå_í¡b´6vwÑL3&3/qâ Ä÷‡ä½ò5ߌ¥¾ÑÒr„_=¨Â6^±žøiLŸ(ÔnÿOrËM@@;0ÕDY‡(®QZ=AZÆmhmr2³8Ãù@•ÈüD€8æUpò[@=ívæÇñŽô‹ €Òö-¯|Þ)FæM¹Ÿ®¨ïGÛ/~/µ­®eûÉ ]Àa{Û€PŸëäPPÅþ(û@r„7Ÿ ¶ºOPí>AµÔ‰z–<’Î3÷Ogý²T¾t„c ‰Lä`[0Ü=º˜5iк8Åñ VöÁ»ÒS“〠¶Ö —ÿN>iíá©»¢0û”oÈg¨£µÑs‚ê|üÛ¢Ù¼¼a6'}Øx±jå·‚2š{1º£mî3t\è™·œ¢Û˜•8ܽ(ݽ$§‘kÔ3ט@šQÏ\] ÇûÛ÷òuˆêšî3üÎ ¹É3˜냻ÀïÆ~¤“îaþl5¯œ›Bît8¾¿V@› e!¶v]P“nŽ}Ù wÇ‘¦ë¹áúéÊú^=ÚqØÝÉ…YAi;wé~‹ªDo´3Øø˜>=Ä Î¡©}å”·ß=Àqm/¦Í`~âŽEZâØžOyÁ=\ìÒÃñ¶Þ¨…·k<~÷¾»wè¦Ä(llïÂÛ±syëá1V)ÏùxáÕOi_”FyO©Âÿù/¼lu÷ª¶¾­ŸÍžûÓY˜sɱg°õmD ÃqûJNÍbý<¥ƒ¶Ö“¼õîçük_þí\[^ý Êc©,šË’ÎN}yŒ_–KÜ3)ÏIᙾÅúnu莮žÐ˱¦StÝ?8÷‰Ð2â)ÎJPûõе:ÈOwQšŸBvÎlB]|qä%CT_¾ßq8|´UŒÇg}G˜àóùΦ@îæP%ÜŠéTá’Dž,™ºÿcþΔö®;¡Žvl[~r‹çA¢D„PBiAnuäkI…ñᜇÜôiA#‚¡4 "„‚ ·8òŬߺ;Ù÷G7ÕÇÎÐìëA§Æ4+‰U?4`™r¬eÁ“<]ù®¸il[mÂûÿAñ<}gðvOGÛzyÛ[ÿ•Æ0<0‡òâQ÷œeçNjZSÛn`ÕTßâ Q¡ÖÄD¼‹®ˆ'ÄÆ`¼M…nrÌPÇ$èÒg`Š,oIßKÂà;ƒ;Jgn<îÍ=<_G®I¹&ŽÜ´ck¨É·‘ Y“f„·QBô^ºÌm:²§†‡¿6yFض3§ðž­ñ.¶6V~IcTw¯§(ÏÓ=zQºÃ÷RÇNäµM¸†­{¥»o “Ü.VTµá™D¶ÅÀºy!ªþà‰ˆa4¶ÜÏôÐ÷X9câßC—,þ‡x„BôL™Ê“Æ @ˆšÿp±§½;2Ÿa÷ûGiì¸ToÔ üÍm¸"^›çK.ý —\òz¡{<îí=&’dœö˜šOr´;,AõŸ®]Ûžña=,ßQN}"ÆI½¸ûñ¦<3[žIž¾{À#'Ûc1$‡%2Ðå®D²îŠG9á§þë AÙâ £ ŽÉ+H¥ñ·_b=ã£ü7>Êy ÆÛ&àŽÌ*­ñv oóSuÆÃÚ_Ÿ!cJ7M­  "ÿáéá •‹z"úIÀY…ê}ß`|ôNrÆrŸ =Ùhîq×äÇ9±žieõ¯ý9‡ûìµl[…š·>Å®ŸˆÏ"Ä2šF iÑ«€\ÿy˜§¿PásŸ"^Ú(lO±Ì$ýÀ1šbí‰DtÁ34žìAeœEÑ$Ùâ £C£gÊ Š-S0Ý6˜€núÌ¥,;~¨iXµü^ÖÝ£ÅÐs–¦Öºé:V.¹— Æ‘º9žÜl=†ð;…£«wŒ÷¹P`£¸Gìm¬ûÅlò§«P=‡O£gÝß&\»ƒÒúdŠ˜ §C„&O&÷oïaË÷Ô›ÍêYjT„hiŸHöߦ„w׻ΰÏ×íS ¼°|¹Óci9æ§ÑC†e6Û–¢ZL„k‹| —p}vÐp<„¢Ñ’5Sð>ÄÒ?œEg¹—7Õ ¾ ;pŽ0…]+’Ç&J×ÉvABcáfã\•ï»q£&û™dkÎRódz€šÜ{âol!ù.Û.ˆ 7SgR¾*þè¡áÀ1ìL@7]ÇÒÞÉò™ÅvABcA„k‰,_‚ ˆJ‚ B(‚p‹óÿ,— N²u:&IEND®B`‚glewlwyd-1.3.1/screenshots/password_reset.png000066400000000000000000000374521322667720100215050ustar00rootroot00000000000000‰PNG  IHDRZ<ŠbKGDÿÿÿ ½§“ pHYs  šœtIMEá T­tEXtCommentCreated with GIMPW IDATxÚíÝPTg¾ïûw¤iš‘_¡Ø„±´³ÜtÝ6±¦=‰Ì1Á}•™Ê8Ù1µ¦&šsÅÚ­s£÷–äTIvE“ÝS1{b܉z¶O ¹ölcs#xÂ-;!v"4†„n«sÿ ù!ˆDÍ÷UeUB÷Z½žg­õYÏzÖ³ÖzÀårý€Bˆ;f–TBHÐ !„­B Z!„ B Z!„´B!A+„´B!$h…B‚V!„­BHÐ !„­B Z!„ BˆŸÕñ£Šõež,ªÂ;у£ÐéuèôÙ˜ òÉMÒŒ63^~²ˆ*/„›ös|»µ¬W!„´ho‘·GC=U凨µq/µá–u&„íä/X͆¼¤›Z¡Š«‡ÃŽ­¦‡ÀKám¼õ¯®Š—5wŸj)}–ßpzv;H^´Ô‰ ½mC>)cŸî+×8½·ˆKà¥þÀ!¬y;Éþ!„tLu«¶óT”ÿÿ=5”ÙYsB Úé[“q0i±Û]²æ„Òu0ÍI‹&Itô÷&´L¡E«¸°šRzº «Ý‰Ç ÁQZ’ôY˜ ÉÏŽŸp´‚ËvšÒR3µVöŽþ1ÁáQÄÇë1˜ XŸŸMÒx3QZ¨){‡Ò³6ìׯӓUð;6䥠¹Ãe¸cõ¤ØØ³n è·ã`~4ʵ³~§KMN®E§Ï ÃFò3¢æ£`Û³Ž-OÀ í¯ÿÅ@pV ï¿’1üw§¼œC£Tì8Éëy\ÖR8ŒÅîý·n*ê^Öm1ãt›ßá­‚±®(Ø^{š-倖õ‡Žð\ÒMeGrºÊŠÝéÁKÿ6¡ÏÈbUÁLÃê)pº³lZ_Œ}¢epŸå…§Šií{ÓPâ¾ Z÷µ¡ñêèÉ­z¥å4{‹J°8‡ÿÝÛáÄ^[ÎÚrÞLßÈþÝ…¤Œšt-Tî-b—ÙyÓ'^O{-޵˜ß\Àæý¯Rróò¹­oòÒKÇhðŽœÞ‰£Á‰£¸Š“ﬦdÿ‹dhîDf¢ž†ÖWËÙ=[6+G½™EfJWsðÅl4wÁrn)¶øá·xØ×ç“nÆìGY-ŒsŠ2‹κ|òG„lËÙ½›qró6ÑPUNCU9‡sŠ(Ù¹jüø4ícS© q?­r óÀK0:Ý$vO×Yöl*¡ÊßX _`Ä”›A N›‹Ù‚ÝÞúClÞâæÀÁ癓׎î Ù`Y&¹-Qj…§J³™Z‡¼ (.%ë­B’F.C@Èj³V“Ÿ›. :VΖ–Sß8Êyy_.GvŽ i(ÃLÔÓàAÅvˆ"³':Œë ÈÉÖ­´`·ãM³/à,ßÃUÇÙnPj ;ßç/;®ÝÄÆCý£ŠŽdUô[Ní(»Núƒ%\‡^§E—u+IK~n8æþ¤¥ª¥€Ñ”Š­”Jÿrê ŒÃÂØmÝË–bó`¨iÓääfa÷`«¯¡öl-/tT•°e†#»sÑÜÁ]lÊu!î“ U®qzïNæl6ù†[Ýä\TîÝëß)ÃÉÚZÂÎü€Óó¼| 7Púò6Ô{ÁqŒ]‡M¼õ\Àp3å*e¥ÿo§³õ­WɶS­"¿°ÓÛž¥¤Þ  õ®B’¢¥êµþ]°ù¯gË#??½ÏaîOe)6w6Ùši,ÃLÔS§ÙQFvìßN^üÀ7 ddç‘¥ßÄÆvÀCÍék(†À'jÔêÀ£;»œŽ“'-¦ÅlÍ›L}©Ñççn6ãÁAYU 7%­ki%ý9»€§râ‡u³¼¹g d£0î:ÈÎÜ¡ &oUl®áµM;(w‚§j/û¬ì̸sQ;õº·âG¿æ¶•QZZzÓ¿£oþ‘½{¶ñì“ýC»ú[³éÏo¡ ´X8äO¸pÓîá;å‚Ý»1†ûC¢ìÃ5(NìþŸÏ}Ó¨çˆñäèw°÷ðS²[‹ÿ¿õäGÙˆ5¬/Ìa^^¢Lsf¢ž† Ǹsk@ÈI2m$+Ø_SžÉm,w .Ò‹ö³} Á¢Öç3p}ÖQVEËÍ}E”Öø®é…ä(îšÃ˜ýÛTÔêÝlÏe°°&›çw­GÛßÞÄr¸†;} xªu!î­·¡œC ·òÍ`¬•Ýù·~³BKmýmQ-ùë3Æ>õÒd°Þ…ådx¬X[À0pî¯ÉåÕ¿üe↷{슃ÃÕ€¸†¹¦…U£Üp‘T°›× îPf¢ž†å¬‘‚±Î:Ô´C×5'—³Ó½œÁF6Lõ޵žüœ(ÊË;Fí>p[Kýg1Áä.«‚Ýbõß~®£°pì[ÆÕ)ê±ÏØÌØ•<¢ïT ÞN]ˆ{¿ë \«G¯OÇT¸U†Éœ:¹qT:ûUõj.×xûÖ¿÷»°u(ÜÚÕ…–«V¬3'Kícžf&ååu²œ¼Ô—üާ-«)0å‘•A’æÇ.Ãø ]:õØÌ)žûLÿrêsÐO9¸Ô$åçU^NÇMÝ.jŽÖœQ0ì”ß…Íî?(Ge‘>n¶E“ž¥»¼¬-t‡v´Ûª q×mÔS8ò|Ê8]Qp ´š¼µÿný­¶±q¹•QzÝ\­©ÄRY‹ÝîÀḆÓã½µ]Òð<Å›ì8PKàô_ŽÒ“‘…Ñd"7#iD+mºË0õh4÷Àú„`Môm-§:)cT9';FŒ>pÕPÚ0и/À vê3Ôµ­Ÿ°…­œ€§çV×é´·YâoÑÞÎŽé™â d^eø„n[){^>@mÇÍ­³(m:C¹QU8é³õ“Rð Gr¬˜KK)³T öûz;ìÔšíÔšQ•ÅÆÛ)̈žö2ÌD= ÕŠú®^ŸC„Û\$ÿ4'Oï>h©:IÎFaÊר /ÞÅ VO\SƒW”;yC¤!A;µS»põ`³™GžŸü'×i^Þv€ú³½ôÕæç’n0ÐóVc'hýKŸAþóä?îV«•šªJjkpzŽZí€Cû)LRO_f¢žî•õ9ÍË”d2uòd@÷T t#i È¿i!ƒì²÷tàž ã·gð·4S)¯¢àEüØîãkˆ× \ÞvLyöµÒwü!LúÖw8òê‹äe Ù)-]¼ÜU…¼¸ûuŽ|xŒ’õ£ì>dC™Æ2ÌD=Ý+ësÚ£6%SÿÐeU\»fa`4 ®ÀÈM]ªêhôþïÓbÅ¡ŒßŠwÖŒgˆÆ5ù¤U\vä†u Ú;ÚÚÐçøÃËkÃlïI¶n¬¯mâéuëxzÓkØ”¡¿;¬7*ä²Á4ö-®n×C•”«¼¹mÏ>û,/ì­ãyºÑdlØ:8$Éëtø¿7e˜‰zºWÖç„É8´¥¼s¨Ô§—žõÆøQ×µ!Ãÿ}o eÖqÊ¡Ø(«ñ œJ± z¬FëØl©­’;½$hïp(»Ð?fÓƒeµM+¶Ãì-·ãìèÀž=Æs…17g·•ÃïŒ1ê@­§‡ÃAÃÙ2¬c5/Ü- fuxÔ` Oof¢žî•õ9Qk2úÇ»:±Tùc-}=ÙccR~>ºþ¤¥jßá1 WïÃìß&´¦‚á'ÔêÁñÎJÛè­VW%‡Ž:%å$hïøžÉæ þV³œ¢M{(³¹Ó͵³d˶“þVˆ–§6ÞþªA7Øú¨âÀ›7¿áÁe=ÊË›Š(wͳcØU›xŒYþ‘íÞZöìxÓW‡ÏÅ}õ,¯í(Æ? ˆô|ÃÐ2Üvf¢žî7N÷½°œ@’‰|mà‚É*ÈfÌ‘[ñùl¼£â$Û¶ü‘³W‡Ê¡¸®RùÇml9æïƒÏasÁˆ ÔZ wÈ6ìcψ·(×N³gÓ®Á[•ÅKuOMRá.Šl›(©ò€Ó¾-ö‡¥é¿3ɰs,Ø\Ìs#.^$l$«´˜Z/8Nná)‹žtƒâÂa·ãèðᤛ ØÍµxð`Þö,-¹ù<·½ƒZMʆ­äXú7z¯½œ’Íå”LT”ÅÝAà(±à¬"¶8~ûe˜‰zš¶56xÅËÉ¡Më°èµ„¶òÊó)¨ï¢åÙ}“¯åСn¦ìcgo:²‘½õÖ;¶pÌ^ûIŠ7Ÿ‚ ÷âŽ:žÚ½›nS§P°1“%õ€—úC[x꨽. ÅÙ€Ãß°Ö¯ßAº¥˜“Ò°•íϪÝoQ²1‡ÁF‡×CGÀN¬3²¹ä­Ï èRËc÷Á"Vëý'jvꫪ¨ªmÀÑá%Xgdëþ#¼ºu3…ºù;©·XÆKæ²óà.žZ0c/!®Ç¸¹„#»Wò$¨Û,ÃLÔÓ4‰Î݈i ¥æíÀÞЀÍá¹ë–ó¦ÚËÊa`±Ãó ™ð±Ïí?DÑê„l!¬7Qtà Ï1³øU»Ù¿ÕÈÀf‡Ç‰½a dµäl=Àþ zä~¯ß.—뇟LiW­VNZ5ñZ:CÊ­ Öî¿ ¬ÿfu¼]z6Ù·v)ר9[‹½¢t²s 7mäJËUl-N'n5­m¼ƒ!éÖNqo« 3QOÓñû-X+k±ÙÝ…NŸKîhwþØË`è]gQ¬>p„'Ó’v·`³Z±9:pÑQ:ôdÜêÈw 6› »Ã‰[Q¥3‘m ^î@ âþ9€_åÏnî?=×®çÐ[ÏÍÀóc…tñâ¶càqźü| Yq•TSiÄ–ò¦Ù6ª,õýÏ Îâw¦x©!A+Ä´­ã,'O>ß3˜ôç·"OÒu Ä4QÇX í‰®Ëbý®·x%_Z³btr1L!¤E+„´B!$h…B‚V!$h…“¥PóÒ¯øÕ¯~ůÖý‘«ŠÔˆ­B Z!„ B!A+„´BqŸ™ù‡Ê(6ö¬Û‚Åú­Ç8˜rí,‡ß)ÅRÓ€Ó„kÑé3Èß°‘üŒ ⬸°šRzº «Ý‰Ç ÁQZ’ôY˜ ÉÏùæZ7•ÛžbW=€ž¢cY5òA î^Z·ƒZÿ#ûÓwäÕÜ‘avqö…õ7èØúÎ[ÜÊ­îî³/ðTqçPòþn2¸Feé1Ž–UbwzðL¸VO¶±€õ…y¤Lðìg—í4¥¥fj­6ìý E|¼ƒ©€õùÙã?¶Oi¡¦ìJÏÚ°;tx 8\K¼NOVÁïØ—2öÉ'5í Ö»ËFÙÑ£œ®²úë´¹ôY¬*Ø€i¬mJ±òò“ETyaÁŽ“¼ž§Áe-åÀÃX삳Jxÿ•Œ€i\Ö25SeµÓá‚£Ðeä_°ül$Œø‘‚vø–MËÙ=[öJ#G½™EfJWsðÅÑ_°§´œfoQ –ïCòv8±×–s ¶œ7Ó7²wa@`i0˜ôPoì˜mnVØ™•–Jìïñ²[(¹†á;§bÇ2ðâ[­‰ô)þm¯lõ.ÖË.ñc­Ûvˆ"³':Œë ÈÉÖ­´`·ãM³/à,ßÃUÇÙn±W¸Î²gSÉà[>Ã1åf`ЂÓfÅb¶`÷€·þ›·¸9pð9²&:ÄŽ8»ÅŽ’›1lgvÕ×Û¹<¶JZ0¸^«Äæ…¨œ,&³^;‡Šª°wázrŒYdâqÛj¨¬ª¢¡ðÔs`ËË„yå¦Ößµ£;†B6XG–ÉD®AK”Z¡Ãi£Òl¦ÖáoŠKÉz«pØòã:Ëž€ Ôf­&?7]t8¬œ--§¾p”óò¾\Žì 8ØMqÚ;]ïnë^¶›ç¡M7’“›…!܃­¾†Ú³µ8¼ÐQU–=Žìγµî±e×IȆëÐë´è²£[çÖ×¶Plø¥pôY¹de§¯Ø±ÖTa©wâ(ßE‰dŒø±ƒÖi¶@”‘û·“7ø‚#Ùydé7±ñ€ðPsúŠ!%`§tQ¹w¯?dÃÉÚZÂÎü€ÓÔ¼| 7Púò6Ô{ÁqŒ]‡M¼õœÿe}ñYähá˜<ÖJ®) 5øÜØÎ:F,h-õ®çH ;Wí@(„“7•—:±w@ð‚Íìµ`è÷WåSøb g÷øwdo-ûöU’ ÊUÊJýËœÎÖ·^qú¼ŠüÂBNo{–’z/8,Ô» ‡-KÕ±ÁSô›x‘aùùyì}¶sx*K±¹³8žò´w²ÞoîÙ(Œ»²3àÕ±y« `s ¯mÚA¹tœ< h1í(fëˆõ«\=ÌžrÈß|Æ_ø<›+÷²i—yŒÖ°ø©ù‘/†…cܹ5 d‡$™6’åñ¬»cÄËé[,òïéá¦ÝÃCv°‡À@ÁîÝý¯u–Ã>x1Ëß:騥Þ5üÔ´Êjº`ýjÿ›VíTÚÜÃú ­•A—I?Åw—g±}w@È2´|yÛ‹yÊÿšWoÕQ*‡-cH„ç>Çèõ'·@?b-îá§Å¶ÿëÉ7Žr Ðd°¾0‡z=z}4Š2ÓÞ¹zw×Æì¯“¨Õ»Ùž;ʸ5Ù<¿k½Þ,‡kp³zÒ‹ö³ý¦ƒ¨ë;eþ &gçè];ѹ[)~J+ #î‚  7R`ãäM­A;ÆG-µeôïnZò×gŒ}±F“ÁúwW{¬X[gNR^†ÿ5ÏÎÚ\ÃNM­^y¦UdøƒÚVå`0/Üý„&¦š³áyÈë‰üê ·Àÿ? ˜G“Ë«ù ùË_x§aÌÖ´âöŽñáS]Ã\Ó2êw’ vóúÁƒ|}û°åœú´wªÞì«ÿuã: Ç®uJ…Ç›9àà;²‚Œlíu гu ï"ŸßyÁKMJA!zÉñ£­.ݘ!f$ååÐòR_ò;ž~é5JÏZ¹æžhþ·3íªw¶¢²H÷u2Ѥg œ*8¾#èsF?€ºlØ® däA->,iÔŠ»f }› ®Ž/o-Å¿[‹Óyq¹øE“jëÁk«Ä®dcP»±Uö‡S°!—$µ†hcÔÚÁY‹Íß_Øbè'Ô³*cª/‰ŠB5Aé£uD ÃÙ1êAçjM%–ÊZìvÇ5œï-ýºÚð<Å›ì8PKàô_)ŽÒ“‘…Ñd"7#é¦ÉíL{Gê] è‰Ö=Qµê£'àÆé Ø&óšÑ‡€)îÊ5ÁöÍàO iÑþX‚™Ê9·‚gŠCf¼Jà„2LúÁþBkKÿia•Íß ñ·6£ ÆÁþB‹ÍÝßzhQëLdMùe|jÔjõ„ßÑ 4ìeX‹Öm+å¥uO±yG ÇÊ-Ô6Øý!L”VOºq=›ŸÒ;W8òN [ŸÊé„zê°Sk>FIÑFžZ÷G­®iœöNÔ»ï@å«'Þªë]Ak[{ðpÀl&Þ~5òêqÁ=ù\5ƒ]„QOqàÈó¤LqcnäÄbsQ€«@K®Þ¿'Çgåa†{°ŸP;•a]­ÑŽ1ZS-5—w …Ðúwæåm¨8[N_Ma~.é)ñC ¡ÔØ8pÒ1~mÆgÿ|ùσ»Å†Õj¥¦ª’ÚšœÞþ0ó@ )0ŒzifìV¦ÛÊáwìcÿ‚ÓŽÃá álÖ±ÂÂÝ2têîoQßδw°Þ“òóýßõRµïð(ÕþúºzxÕª5LpAä¬vw`ßÙÑÇâ*W9¼Ï‚䬸gƒM6›7 ´vÊ)Ú´‡2›+ tÜ\;ûG¶l;é?õÖòÔæÑŸ— Ö›È6’LKVúˆoFg‘5üO†ÛÖ5ÄKmñö”Y‡®š+.lg_cË–cþ±ÂÁ¤o,ÄÐÒÓ ¶Þª8ð¦í¦V¥Ëz”—7QaWnðÖ²gÇkœ¾:|.î«gymG1õþÿOÏ(ïíL{ë=>ŸÍƒw§œdÛ–?röêÐ6¡¸®RùÇml9æï³ÏasAÒ”.ÇFç=ÏêáÙUÅlz¹”šÁ±m ®«•üqÛŽ9$`D?Õ½¹Øj’ wQdÛDI•œöm±°/8œ(MÿdCƒœ‚Y°¹˜çƺb¦ÑcÒCmÃÀ× d¼SMDž!˜òª¹ê1eÜn̆³ ]CC½˾",û 8<ïˆáYQÆì\5¼O2©`#Y¥ÅÔzÁqr OYô¤´h»G‡'ÝdÀn®Åƒó¶giÉÍç¹í…ÔjR6l%Dz‹*xíå”l.§„`¢¢4(î#8«ˆíƒƒ÷ogÚ;Yï²·¾ÂzÇŽÙÁk?Iñæ“@0áá^<Ú–:žÚ½}ì›E&Üü <_¼‘†Í‡°UØQu'ÏP+68‹:f—¤‘í½*žU»ß¢dcƒc½:B6XgdsÉ[#îÅ¥?qUÀý;†Ñª«Ñ¾£31åá³Á»u?û7g5¸ø!EÖÆî̽ùºvt»±ZïovØ©¯ª¢ª¶G‡—`‘­ûðêÖÍô'zÔ[,ãMsÙypO-ÖÂîèÊp=ÆÍ%Ù½jøUþÛ™öNÖ»ÆÀsûQ´zá˲ÁzEòüm(Õ)…ì?T„IØ, Ù`ýjv¼µ{Äçâ§ê—ËõÃ=_ ÅÅU«•‡“EM¼V‡N§ÇÍÝ6Œqðy´hÙxè…I€Ò‚µ²»³Ñèt2² ÄO¸ð -W­þ›ÔñZtéÙd'„ˆr𳵨; Jg ;×pSp+-W±9´8t¸Õh´Z´ñ: †¤ »GngÚ;[Ñ-جVlŽ\@t”}FñÓ¿TîkVjêí8[ˆŽê_wá¶'$h2F Z!„t!„ B Z!„ BqGÈÅ0!„­BHÐ !„ B Z!„ B!A+„´B!A+„B‚V!î53ú†…Ï?ÿ\j\qO˜7oÞ½´)))<ðÀ²…w¥~ø«W¯Þ»-Z€T*•¬M!Ä]ÉçóMûº˜Pªí}ôùÀ7îç*4“-GW#Uv…9‹×ñëE‘ýË”’LäûG¨¨¾@›>‡XÙzº´ä¯3’¾ëg(kbîckyÂ*1?5Ž”ÑØ';÷Q‹¶_Ä|#KcÏTãåj·¯ÝN+R‰ 8z„17-'­= ŠÔ“Ôƒ£µ|í|Ù 3ˆ ú–¦ö^èm§é[ˆI!dœeIHêÚ´T4´ÓÔéU$iO<éY½]Nš._ É Ù¤Š˜KLP¶3gøôÊu:{}„é–`4¦©º…Ï'YŽÞö&¾eè#‡)$/ŒƒžfÚ•¡¿ª“ Äù ïv8é JfQr@*Ž…úPÙs„¸ßZ´þ¨Å°r1—Ws¦ÎÀº´áŸö)]ôáÆzü-¬7MJW¯"âÐÇÀÇövº8•H2µZú"¡º©“^µv橯#XMDhЈ?EB=Ý}€Šî¦*,uvšÛ{èSÏ!..Uà$a)˜ÖôQW} [EÖ š3—…K–“™j¢ÏC&W޾n#B=òL!” ÚéQÿg¡!þÂGo¡ÂTÃ7™Hµì9BÜŸA ªÈ…¬\x™Rk—S‡‡†:” 47‘zs1Ã"Uý­ÏÔ¨¶sýz=š¹h#Bñ%hPššhV;Q4ztã-…BWOßðªS:é%ˆÈ èºÈGæKôê—ñøJ=‰‘!à¿W0—Øùä<1Ÿzér:¸\w«ùCBÖ­gQäDŸ‡LªAaj ›n›ê}Ý=ô‚:07ƒ‚†5T =nº}0Ôeí£·S‘=Gˆû±ë``çÍ4’ÚNµåò°±µªÈdb衽;ŒØØXÿ¿HT­uœ«v0 ‰sÑ(¬Ú ŠÑ¡AEd²– w#ìnBuÉh&XŠæ M ]Bòá¼Øˆ›Hô1*|Ú™CÚâGü! ôvÒÚ34}÷ÕøóŸ?àj7@Ú–,_ľÅÑå›ðóÉ–#$&™9|ËE{g@)ºhºÔ ¡ ÄÑ@Õè´¨ûš¸ÐpÁÌ×Ê%{ì9Bܯ-ÚþÔHd©QOÓGv†µ«Âô,5Ôqªâ8´f’Dgs#¶ÆVB32Ñ ”T“Œ.ÔŠÍ q‹#û+ æab°ÓÚÄÃú˜‰+¥µ‚¶³HIßW©¶÷šº’ä0P)‰Ì¡š UMK ¬»[Ýšèkm¦µ+†ÄØd"”óT|dÁ½p.¡J+M—m|4—ÌaÊøŸOº©,Ñ×a®~Ÿºúë¦Ý^Ç¥Ö æ®XD¬ ¥ß[•˜IfŒóŸàÃÖEè#ûøêbMAA²çqÿ¶hýY«[ʲ¹A73´Ëײf©ÅQMEÅ9.9úÐ-Íç×Kb‡BGƒ>.Ðëï‹ Ñ¢ŸÇü˜‰b6”T“‰TÔUœ£ú:ÌÍÈg­Ñ?Ž6r!OÁÖìFQǺÔIJù7Wü„Ë6Ôâî¼rŽO.4Ñü­B&ÔÌå,‰Š..{ó!ñû'S|Î39e§oîã<ý„®ÿoŽyû£vR ~ÃòØKÒyw_!- ]ê°ÕŽÃÜ´¥œ=ô¶q¥úÔh榒cÌ!9l¢Ï§ZމÖÿ(ëníziÚ¸|î쭸ѧÏdqŒ„ƒ˜>wïŰn'öoaŽAGÄhŸ‡è0®]˪G>íÅqæ8eÕͨõ‹YñØRR#Ú¹d>ŽùJ÷°IÛëÌ|ÒÉÂå&LKèûªó¹ëô†þñu<67æ,fÍo~A3úâu]8Í™&H4¤‘Úÿ·Öê°ö¥’czŒÅq=|U}Š÷޳ЗÉÊÇW`ˆh§±ÂBSïØÅ{ÙúC¶íÓ¯°£h±â±e,ŒéÂVq‚®t¡è’5Ðþ%íþ‡Ä»›(@_{]>P7µÓ§ND9Öqö[ê>2c'ÌËÈLôñeuÇ?XŽn®ž9E…­›˜ÔŬX±Œ ŠæK桺îmÂrê½Z.[ÁŠÅÉ„5_ÂüÑeº&ü|*å¸õõ?lÝ©;¹pª”s]D–±bé#D¶Ÿ£ì|»¤ƒ¸ÿ[´¾îVº ".2ôÖ&èj¤Ê®0gñ:~½(²ÿo)ÉD¾„Šê ´ésˆìHÆ´v ý¹‚®¿ÍGm­($¦!,è %""Œ_ç¨?×Ó¥%±¿¥ék£ b1ç÷·è"®¼wŽýJ_’ˆ HP7c?å µËGJˆjŒn‹±—-¤÷+Î[¿%táÖähûW^J2ÚßÃ|¾§ÞHLr"j«ƒ¦N‰±}´5õ Ž‹¡¯õ:Í=ÑCóõ‚âR‰gí+q+xú Yæ§’ ~S¶jš2Ÿd¾Z¡‡ô+V²r¾ÿ@7?œÇilíÂ7? :›hî ŰrKbUÀ|t1¡TÛûèóoÜÏUh&[ŽI¬ÿÀuç»~†²ö æ>¶–'Rú›ÚóSãàH}â~oÑNRo{ß2‡Gô‘ #yaô4Ó® ýU­Óؘ SCLf¿R'ˆqN“0 BF™3x4S…„¢žh¾ã,›¯ÝN+R‰ 8B†17-'­= ŠÔ“Ôƒ£µ|í|Ù 3ˆ ú–¦ö^èm§é[ˆI÷"bBZrÀˆÚ´T4´ÓÔéU$iO<éY½]Nš._ É=T‡ªˆ¹Äõ`;s†O¯\§³×G˜n Fc‘ª[ø|’å˜ÔúXwn‡“¾ d%Œ(QűP*é îÿ­*$5}tvö@âh½8/VÓØ§gñ¢Dúº ŒˆIJíô(0rêÈÛ.xhÄ(ó%¹‚‚&7Za¼eëSºèÃõø[Xo^"ºz}‡>>¶·ÓèÄ©D’©ÕÒ ÕMôªí´3‡LíxCÕÔD„\0B裧»PÑÝT…¥ÎNs{}ê9ÄÅE  œ$,Óš>êª/a«(ÃZAsæ²pÉr2“#PMôyÈäÊ1™õ?´î|ôö(ª!L5|·‰TK:ˆû?h‰H$YV[]¤ÝÜOÛÛJ]µæ¹É,SÝt+ﯻ‡>BPO÷~4óý‚Ô¡¡Áð¸‰ÔЛWeX¤ª¿õ™Õv®_ï¢G3mD(¾ JSÍj'ŠF.b¼_Rèêé¾y(ôDdHt]ä#ó%zõËx|¥žÄÈð_ˆ« <îÄÎ'ç‰ùäÐK—ÓÁåºóXͲn=‹"'ú¶žâ½¯F?WK$]\onâËÖÔsc¹Î¿£G¤²D_‡¹ú}>èÊ$5.ˆv{—Zƒ˜»bQÿÅ%ß=¾¶Âô,5Ôqªâ8´ö—±³¹[c+¡™hÖ¦&]¨›âGö¯ä˜‡‰ÁNkOëc&^ñ­œø°EúHú¾ºHµ½‡ÐÔ•$‡JIdÕ\¨º@hZaÝÍØê.Ф@_k3­]1$Æ&¡œ§â# î…s UZiºlãÛ ¹dƨSÆÿ|Òå˜âúW%f’cçüÇ'ø°uúÈ>¾ºXGSÜ "~"A a¤¬ü ±WSemÂný…þ[pSW<ÎÒùãkCH^¹ŽÇ5ª«©°õ£\hZÎâä°ûfui—¯eMä9Î]¬¦ÂÖGPh ÉKóYš;´2U1èã‚°}JB¬¿ì!Zôs õÛ8æÇL´ÚCI5-'ôò§ÔU\B ÃÜŒ|ŒKüãh#òÄc]œ9_ÇÇeýõœš³–µ]ŸðÁ¹j,ç².'ÇMÝX>µQ]ѨÑÄ¥²båbR€° >Ÿt9¦ºþ#I[S@йs\°§ qúe¬Ñ7QvFBL\.×3õcŸþ9¨Tróø]«ó￈n´›„ø ðù|X­VæÍ›7mó”§w !Ä&A+„´Bqo“N81\ä"~û‹¤„­BHÐ !„ B Z!„ B!A+„´B!A+„âÞ Ú   nܸ!µ.„¸ky½^ÔÓü¦€ ÚððpZ[[eM !îZíííÌž=ûÞ ÚèèhÚÚÚhnnFQäU!Bˆ»‡¢(477ÓÖÖFttô´Î{FŸG pãÆ \.ßÿ½„­⮡V«™={6ÑÑÑÌš5½mÐZ!„ø©‘QB!A+„´B!$h…B‚V!$h…BHÐ !„­BHÐ !„˜v?ÚëÆ_-oÀ|ÁA¯â•µ „øQ…¨ƒ1-Ò±mõ‚;2ÿ¿×ùÝ÷lxý”0Kʬ `YËBˆÕ>/7z»Q=Àá–£ýÙ=üô.€ ¯‚oVªÐŸIÈ !î ³‚‚Q…ÍÁ‹Š ¯2ýóŸÉÂü_ÿ£¾¿%"kVq× Céû’ò†{7h?mt2K*kSq÷¶nCÂøËǽ´½ŠWº „w}7Ât_¤—á]Bq§Ã[ª@!$h…B‚V!„­BHÐ !„­B Z!„ BˆŸ •TÁýAý‹ÅT==ú‡Þ^š¾hæOå˜ÛnHeÝ'm¤…ëóøó/Úxæ¿[¹ä“‘ 3¦«ñ|¦ª`bŒfUj2Å©ÑÄì­â½Îoùþ»œXÕËŽÿçaþ^Ö— ÷ ¦êFþÙæ»©õó§¿û%'VýŒßÿ]'þgŠT•3xþ!~nðåg®± ᨥB„­¸kz!ßû†µfÕ‘ñüaÍ<Œ?ÿ‰Á}´]kåm³÷¾øÖì9˜æóLz4‰¡ÐÛ㦮º‘W>n¥Ùw«óRSð‡ÇØ‘JñûO¼TžUǾ½¹u=;žýo‹àè'¼:râÈ|pmÍ.ÊN_ä¿*ÃÚ §¥²mei†A]߸øàLo\ô ÍûVÊ0îwB)xq;4_óÌ¿èïU±ô÷y¼žDSy_ÕÓ?Ž{éoH¾\MÞ¿¹Pîa^zBGN’†ˆž®8œ¼}ªsç@7O(¿yqè¨å?Ÿçå§ äølüúµ/ifÿíß°cE™Óö‹óUW±ÈV--Zqwyø‘‡H¦ºÏ¾ µ.•ݾˆßênp±úsþ\ÙJóƒ l{n9{ ê¡øýRv,™ƒâøšw+¯q¾3„œò/¦ˆÁÖñÄóòQñïµìªïzx÷h-/œñŒÛ…‘¼b1^‹º¹™w?m£=òAžyfûÿvè™Æ 9¿äDa2™>T\áÝÏÚ¸>ûA~[øK^úù¬I”a¢ïôPw¹B£ÉŒ8x…bLê_Ö´9hüÖ$Ä1¸ä¯ë˜´¿åƒMV=裪òsÞµ¹ IM¦xû/ùCüð]0$"—Ÿ3ÉwT}îAa ŸÈáÄß?Dæì.NÚÄùoT˜Ö,¦Ø •­øQ$/Nåÿüùð‹a‰FcœJÓ§µì¸¨ †ÏÚµó˜ßuÿòÚeê.L}ìàåóë5)¼ý×Ë4jâX›m•ÿ‹ß~8зû%¿ÿÃ/yf^, tñå­Î«¥‹Í7 ½—KmãÒÃ"àÄ›ŸðÊþ&çDZìy1‹U«SÉ´Y©û^ÍÒG]×ø//]y|˜ßn ó¡ð…"o¡ ·ðfÛ7´­H¨Sóv›šH2# ­ b´ÌWµPç›Erz$ð8| šÃÖh‰èiæ…+çýe~£âaþõ¿xfMïýË×´9"æt%yÿŸ"uìÏÕÀ7ŸóÛ7iô—ñ´¿åjAFH‹V̼ˆÔ$~››<ôoÉCç…ßQ÷×ï†vèÈ8Ö>×?spšÙþ|Ç{U=M¦ðõÒÄêÈŒØ\<¼ýÆòÞø‚/'3¯ÉºÖÈŸ¾Hwo˜¿ƒÐXòœ(”üŒ%—‡ oR«†6k5·X†[øŽÒÜÂ%/¤¦ÿ  IH ™ïxûcG²4 „L]0|ó5unPÇ>ÄÒPhú¸q0d”¶¯yãr$éÈ | ×É?W ]¬ŒùùÇKùçƒ! Ð~±‘÷:d{—­øQ\<òüðQ³ˆ‰ãÏ,bíÓY\Ù[Ei'¨#"‰"VäbY1ÚœzIž= ZZy¥ÜÅ¿¬žÇëÛçÑõ‹ªF'æ‹Íœw((Lb^Ln o›ã;ºFü­ýZ'müŒäÈYà¸â»A„.£.š4]©ºhÒ¢úOç¯ôÄe¸¥ïø¾ãâHV¹à‘èpPÕØC>ÃÒyjÞø~ÆázEÍ€&BC,^êš{G”ÄGÓ_{à‘R5 uëtqݰîB–æ‘M×Î7÷ñÌÏe›— w´·µðjù7üúéY• ¢´Ó7¸æ›NÆ+ŽÑÎ?û¸î¿¹¡±ªšUõ,}$£!–¥¹Vå¸^ÿÿp¬•®IÌkzOÆT,]›Ëë†BÏwXê›9Qþ»¾Q³ë¿."& &*Cû-}ÇǥϾƒ¿&32EL—ÃIs§óðÃψù&T¼˜m=SÛÃ|7ú­oÐ+]´âÞ¡txhãA4Á€¥ã;ÚI@‡º/<þ«‰#çAhò³ÃI„ö¶.*ª»¨¨nU(+Öü’W5ð›3­¼q«óš¤XÝψ k¨»ˆHˆ$–>êÜ>ˆ}˜m†ÒöY5Â…{àK³ã†ÏèVÊ྅ï´Aû_Ó„cj,<§=(Üà¼ÃË3¿xˆi‘„x]”5ßð×»›6¢™Ÿ_ô Ûõ’ tÑ8N_µ»¹ˆÀ˜ ¢ì¯•ÊRÿ…8q÷“>ÚŸ˜ˆÙþUÞÙŠ¥[@~d`(ÅòÒsR¼²ÿj¼Z·€}a9û }ëë¡Ñáf¡šuËóš´¤Tþñçªaóûꟷ²æ¨C5Äퟻ‡Bˆù…ŽT_í­”á–Ê àvQÕiÍ# ·ÿ”þWê» 4Žg Ç×\ñg¢ÒÖÂùH~,…¥}±ê؇øÃ#AÐü5ÝcWA»ãk®„qµŽÔ€ªˆ1¤²6J¶giÑŠ»«EëëÅ Ä$„ Æƒ‚‡?Ÿ¸†é¹$v½¸ ÓÅ6»‚I{ô!2C{x÷í¯ip|¹ëA~½f9ÿöó¯9ß1 ±S5Ð|…wÛnÀ­Î P|}@kÓÁE'fÇ8¼¼*Ö>·œäúf.ö„™ž@Zhu§ú/,}ÓLUÏC¬Zó(/…:¨ëQ‘šªã7†` 1U‡éb#e·P¥óVÊ ø<˜ÿêå·†@s0$ÝÍNšˆ&9®|Ö9ü>oœúcáC¼^ÎéÏ\4‡F`zôAùŽ?ÿûPÝŒªók^©x˜?¯˜Ï»/>È—;Q"b1¥ÿŒÞŽ>"f˶}/ú§ú§]3õc¶ü• 0©õ;±"cbã¢PZë?çÔhý¡Ê,/{ˆù‰á8?û Û÷ t~ÉË=Äi£Xô‹8ræ…‚³…×ßûŒ·úZ}=œoøŽ ˜Hÿw"IS°}öWvü/¸wà–æ¸»úxx^ ˉÇÐ׉+½ôÝtø×ðäŠxúÎ}Ê Ö–§'²*%œ ¶vÞ?UÇN«ÿÜ×͹Æ^âÒòxv"«~®!Èuo_âãYÑhÉœåäøÅNÎMT†[,'ü@·/šß, GõÅ_yíwû/”Ý`nVi!nÞ.ÿbØÐµžÖfN|ÑGrB KÒâX«âºý+þù-+ï ®«`Ò~™LÎo8RýC ?ÐjÿŠÓ³IIŠdé‚IžåÁòØûu4k®ðþ9'­ò¬ iuCéᙼ_LÛüp¹\?ÌÔÂ_þàˆY‹b|þ;Ãb*>á?›=RbÆy»Ú±ì~bÚæ'}´Bq‡IÐ !„­BÜÛdÔ¸û|ßÂ?ìü¥„´h…BHÐ !„­BHÐ !„ B Z!„ BqßmH°Š}^©u!Ä]ë†O!$xzo1˜Ñ ]2?ž½=²&…woÐ*ßó«¿Mºwƒöÿþ?ÒQÏúAÂVqw†loêY?P´zÁ½´‡·üª|Ýßq£O^ˆ$„¸ ¶Ï‡¯û;T?(ÞòwÓ>ÿ}m ’òþò¿¯Ñë•°Bü¸B‚Uüêo“¦½%û£­BüTÈð.!„ B Z!„´B!A+„´B!$h…B‚V!$h…BHÐ !„­B Z!„ B Z!„´B!A+„´B!$h…B‚V!~òþc­ô~”ñª^IEND®B`‚glewlwyd-1.3.1/screenshots/profile.png000066400000000000000000004377561322667720100201140ustar00rootroot00000000000000‰PNG  IHDR˜ÐY¹Ëº pHYs  šœtIMEá70YìqtEXtCommentCreated with GIMPW IDATxÚìÝP[ç½ïû/ $’#[øR o[Ô?·V.;´&Í®ði >yÆÜ3àîŽñ½c2ÙÜ)¤ûölÞ[;'üGœIk<›f&øLbÒ4§ ¤1ÚõXNQ;(½ Â1rb„q$oáþÄ#~Ù² ñûõOaiéyÖzÖZéðñ÷YOÌèè¨XÜb`ñ#È–‚<` È–‚<` È–‚<` È–‚<` È–‚<` È–‚<` È–‚<` È–‚<` È–‚<` È–‚<` È–‚<` È–‚<` È–‚<` È–‚<` È–‚<` È–‚<` P0`AÎwyþ¯cŸ^óoÞd4€éqq+4‰ÿÏž§¶¦k£ØlÌèè(ƒ æé|—ç¯5ǪŠQ(cb˜êD0::2úÝ‹¹QÌòxÞÀ¼|ìÓXÕC±ñ ¤xÀLbbbãTÅÄ'¼|ìÓ(6Ë#ÀsýF¬BÅ8sŠU& x£Ù c æottTbb`N11±Ñ}$A°äKA°äKA°äKAxð$,/ØõÄ»¿ú鹃Û?.â`örõm6¤0e¦ç¥ÄŠˆ¨ÓNT=õ|ò]:âIÝKêU'ªž*J¾í³»gãó@ ȘäÕ¯—g•é[š/”Öÿ¥îâˆéÙ¬z³Fy;m©²~¼Î¢‹ ~ÛÔÖãºK=©£ûâ6ÏîžÏAÁ€‰bÛŽÙ…ot9ƒ""òå[_öér>9k½“˜ièzƒõúwvØîüì¾Ûãsoî]†<@Ô)Åi©ï ¥x""âþÜQ©XæQ„vxiצüµ‰šA_ÛÙ/ª­}IxôدÖYOô~²Öü½ÄÀU÷á·M}‰Eå?*^!òÿð±Á–Û¬>VžÞøÚ§§†"î<"ÉiリvòPÛ)Ÿˆˆ63ûýÌžçŽôxD$ayeSÑúe)ñ~Çù¿Õ¾7åðD’¦tÔx=ñ o9ÑUi;×åèT*v]ì¬jìjeÚ–÷wùkÿ[üÌjãŠ`ÇÅÎêÆnçÌÛ'5·úÄØÙ ˆ$?ú’eCþÚD¥wÀÚì¨ýìF rwI‘Çg`Aƒ<Â=;Ž©µà¢\±R/7ZÜSr2òZÛ.Û}"Šåû·(ܵo)y¯O“ýø‰ç–‡¦ÜÆ/Û»ãQ×Gçvþ÷ó§EWµãQµÜ8þÚŸê¯Ýtüþ£§¯&7açY$>_”¹7¡¯ö·gŠë;{Ó7Û½J;e‡©ÍrãËË~¹Ét­³ò-[ÉÛ®ôŒC? ÍV­Ð×䪬œ-yÛåIÛ0Þ×LÛeZËû¶šƒ®Ê7μðÑ`ÖÎ'¬WÌÐÝ ã³°AÆ‚<ð IPh$è™a ­:}]^Bõ §µËkw|QþÞ@ÊÖµÆð„F×Ç¿¼áîûæødÅ2­ˆ„òÀUcvžrUúÞGú+O8[{¼í_vW¿ó•× 7Ý’`Mêhöƒÿ‚í#Gycwk×uû¥îú/‡5+âà [ß¹ÐpéºýRWù‰¯¼k×™“gß>uˆÖgä)¾®~§ÛÖ㵟ýë+gT+âgì.Òø,xÆÔZð ½¢Ò&ˆø&oÕ¦$*}7”:µjÀåäéùº7~µA-ö!ñ;Âu|þ øçèf;ktÉ)‰Ëêþeû¤mƒ†±ú"ï¯é &Ÿæ ëÙ‘Íé« Ò—›ÒÉZ/Ç?ó¶¸CÉZÀýsxuÖŠØÆ`äí Woé<65=I5à Ϻ Úÿ`·‹ˆÈÌÝÍûø<È‚<ð \íë•GstЦ/'Í®Mx´æŸ üýÿ¬šå›Ã#à¼ß×6•ŠXÕØOñ"Þ¯JßêrMÑMïÀ§:åÀ¾ÇÍÁ«Mç¯4~ÐÝødfMBÄýFDDã¥sÓ¶O§¾é¿Íî¢0n2¦Ö€‰ïêñNÉyvíæI)•î1½I¾=Ýô¸}þ䕯ð´VmÚÊÔáN_ôzU…úUèÓÇ~òº½^Í2íР{`Ð=0èѤU<«ÓÎ\|5ŸƒT§¯ËO¸\rÄ^ûÉeÛ•Á@B줗èirt¡DH©[eˆد̺}²O× <²2#tx±¦]ÛÞ·,x¶înçøyà°6^´¼h¬1©þ·ýšè7|¯èï“{Ïœi€¯Ë:”y`—Áou{’W—íHîm;ãΖ x%N³"I›pÝ3gÏCƒ½Ãê‚gV;[díºŠô8 ôtÖ_ýQÕ/òÁWî„•EÏ®5\´¹ƒ3wÔ5ÃAN>Iß 7q¹y½ÆÓ3¢Ìp`c¼ê«$­¢ß#"Ÿ¿k‹³±Ó¡H.Þñ=Mç_šúDÒfØ>m± Ï—ÎfÉ<¸k ú“þ@ÊÚ)oÝðIäîÜÁããëZð c yà3p¹äÐÙ:w¢Ùüƒºâì5ÄÚÞ³þÁ‘`õçEWµïÉú+mçöX½ÙÚ´> ÍÍ:fÖ(çìw¨¯¶ñ²wƒñè??Q±~ ú½«ÞÐ7Ž¿u¶îÚò²â¬£–Õš‹)ùÃõÀ,Íã ]—ªþ4ÿüÉÓåïMq—¿}Ù¥Ût(3IDdøjÍGÁQ®yþèÉJ£JÄo/}ºÄ˜vá–ü ”@Ï…§ÿmÛ±¨,Æ Ïk?Y[sÄÚ=í-‡€Ïí´¹6kÃÑmÛ_UQlJáQ}üj KN¹Ç:·‡×°8,¶©µÞ¶Ã…¹%¯FHñnån=R²½ð°ÝËE¢¦·±f"ÅSëÖŒz5£À¢°¨*ò¼ŽÃÅ/4tÿ®Ô™Ì–<³ÉªÓj%ÐÛírõ:m Míáå %…þ£'+M.%pçúìÖШÍ{ýDUö”ŠW­V©ôˆh´D{Ü‹'Èó»N––Œ§xJÃó”åfL~ZFJj†);7¿¸¬ãt]eõ©±}ݧÊjsN×dåwÌç •¸j·Ü2o]eª:ÝVÅpß,–©µ~WCÙ«í¡ù´ê¬'UNMñ&ÓdäWž<±ßúÕg­­ïðs-èQjT,* ²˜˜e€9ŽŽÄÅÅE±ÁEäõYk„‹ñÖ=”¯Ÿ+DPeªØúÅÝx¼$€{@»<éf`qæ4Z¡IŒbƒ‹bj­¿£áM{èg]QÍÞŒù•¥æ•æÕ•4ùDÄ×vÚé7^Bäïë°ÛnÇ+]ª^o0d¤2Iw*¯ËÞæp¹=^QjuzCvvÆb!ŸËÙíêuõº½¢ÕéSõzƒ>U£º÷€×ÕÖfwº½cžå¶VQö÷:lg¯ÛPjtúÍ&SFŠ*Z½Ÿ\o@™ªÕê k=ºWˆg øŽøÍž§~ñZóˆÄÄ(U11± 0ÝèèÈhÀ?:<ô›=¹Qlv1y~WcSxLÓþ‚ŒyÇ ªÍÅeEJ‡WDTYH@áí8]W{äÔøºaêÍy{K÷ZL©“ó¶•æ¾` ˆˆ˜}|4çÖøÁUŸ¿óHèÖ¼ô~caê­5—<ýÊXV±»Ò‹á´å¹W»ED ¤Î0úŽšçöœòˆˆ˜~x4wrÔg¯¯­:Òê¾å+ºm/ÕTË£Ñg?ùêá#Vçô…ŽuYE{³SUQ¸B£Õqø¹Ý µùXsQÕÛRUZÙ4¶Æ²:Ï”gš+$ë;]¸½Ú)"†žÌOék«{¥ú¸ý–К **öçL+K]PïÞŽÓuµ‡OµûdÚÙ=_VQš?5Žõ6?ýJû¤ îã;?."¢ÜvôãÃ&•ˆß^ùt‰5 "†ŠOZRîγ` Øš®ýÝ‹¹/ûôš÷ÛàÍ› 0]\\Ü MâoöänM×F±ÙEœûÝV[è/|å¶½9 )iRéóK++++++Ë,Æ÷ø]§KówWOODÄ×ÞôjÉs%uïÄ6!/[uX]Ó&ñöu´Ld]ÝÖÉß õçlu„~4ämžé@£ÝKjŽeÍØ¯ÎF[ïLCál´Ž‚2«`ò¥þŽúâçJ¦§x"ân}uO~™Õ³ ÇÉ’çJ^”≈Ûvü…/4ºüQ¸¦ úZ*÷”‡r´Ûè8YòÜ ÓR<ñØÊwî¬ióÞnïã'ç“Hgwªzw~iäa‰þºÓq°XňÄ0 À½}@AEž×a ‡E³áÔæô5WWÛ‡ڕ½Ù°Y¯qµÛÛÛlαííÇ÷Ž, ÍÖM1æ¤Ý)">G‹[ŒúÉíù»­ÎI¿:­N®iòyø]-öPÞ²&o–É—Ñî%5DzæÕW»EÄÙhë³Dª¡ò·7´Œ±2«À¤™4Få{Ž´‡DÚÍÛ¶™Œz­¸Û[¬Övˆ¯µº\y¿o¿ã𠯆OZÔ›Íf“!#Uéíu9ZšZÇ2®€½¶²)ëÖ‚ÄÛ¸ní»÷ô+µãa¦R­Õfè4!·¥ö…Ö±cW¶™³ÆF×Öbµ‡ž÷©Jôï+ŒøºÈY{÷¶TO:9åš,sN–1UåïuØZ¬¶±añÙj‹+µ§‡ë>•–¢cÀï±7¥¢JƒÙbÒŠˆv³Nu/Ÿ5‹ßù.Ï/^kŽU=“¸,ž©µ@$££#žÿúÅkÍ¿{1šEy÷?Èó»íáj1]Î=xûZ_suuk(»2<_s¨,g|b_±ø]͵e¯4u‹ˆt7”6¿_9/¤šÌ:qºEÄm³÷–ê'ÅB~WKû䲨@{‹Ëoš·ÍÑWªOo{x±Yƒy^ó0£ÞËÄŠí ö¾ÜÜлäúÚìc?­)˜\ðzB¯XÓšf}ù›F¯W‹Ówo•±¬æyû §ÆÆÆmk¨µ5ÔŠRk0™LYÛrrr"ÀÝÔ§ó.€nólëÒµ2¶”‡×=½û™z¸C¡ŸÖ:ÛݦÔ´b÷ˆˆ·÷î\Âh3·*òÆ+rÄcŸmšŸ*xæ_Åã÷÷.¸äÇïŸøJŠ)/TÜæ½ÀÎß ÐÖ˜•ÞlËW\¡ØM,Ȱ&/+e^=F½—I5y§Ækòúl íc? sR§œpøh4êYT©¾ï¯6ÕdW¾ûþ¡"Óä xœ6k믔<÷d¶¥´æt‡7š÷ÀÄíx‡9ž¨4³6 Ñ†#-¯×7ßÞ'ŠZ•³žJ£ 3úîJlÔÆŒ»ÿy¢5ÕÒíqZÛ½ù9 ©Éñ{\žì>ž<©7o3ÍgÝU•~Ò2 ¢5ek¥Û#hoqùMâjiŒ}`ÔŠˆh f½Øœ"‡ÕåÏ6ªÆ_¦ËÉNï€D»—‰š<û)»77W#Ò×Îñ6l›ò•*<þså*Àbx¥™*5§ôhËÞ^G‹õt“µÕæœt?ºm§ªmÖ¦ýu‡ŠÇ'ßá=5þ@`ÒÁÌ2ºJåü»WªÆ¿>ÇÅ›ônÊ»ó®ÃÅ2Î|w,‚ OeÈ7)›Z""¶ú–¾œü”y×ïjnŸÏX’GD”ÆÒšÃ¦”©ôæ,uC“oìveÒ>ö;¥!¼šBŠÑ¬§[Ä簻Ũ/¡ÎÊÑÝ¿^nIòr4½­¡©¸¦‚[Jø”uhª³ÇåñËÌÓ?'æà.tÃS©ç[¯SÍ:©R¹ÅÆÜâJñ÷uØív›ÕjmmËô|ö#¥µÆÓ5&M4î¨ñözg›HêíõŽß¶ó甪ð=lIŸþ·>¼è¦%©W*ϪzLìŸ\,«?WiýÚ›¾áèþ-ÛÔ\ð%&vqFj~åóá<¡ûø Õͽs~¥¯¥ºäx÷BûÉÎU,Ù̘ø;Ž×6´Úl6›Í¥¼µL³9o³ˆˆì 6ŸˆˆÒ˜=iB«ÆZvb1ä61ú½Œ'yÛ‘Úú±qSçFXHWeÈÏ'yoi‹œÁx[êÜ·w­5Æ|SèGwëÖ9®´ßñfmk8Ç˱LN*=­ §N:uªáÈIÇ —R51oT½{ J­‡]3ô^Ø:éÍÓî•>/TÌ)íGf*nõw4¼zC¢Ò”§¿Kÿ÷²hÆæ¼þjãåŽA‘ÁoOâß[œ‘½"NDT+)-^çù$ôQcã¥ö`„o÷º‡ ™ObŠeyé#®k7Ó*ÍcΫäÐÙÚ¶Ë­_öµžýâ…#çšºŠŸ,çmåKË" òDc*;T0¾z­õ•Åu-½3èôÙëKv–[oãmú¼½c ™¸¿PÝ¡fÉk?\Ψ6›§­‘b2%b>»m¬È˰mJ!\ŠÑ¬»e‡|SÊ3ú½LÔä¹C³*Õ9›#E'ªÍEù¡TÕg-/oœV5çw5–W¶Þö‹4Yû ©­½zOÙÌ…i}öº’’ñÀаw¯qÒñjôY¡&ÐzRvxzµZ_Kõ ÇC½+³ŠsRö ÏSw¯<ah½öÃåáæµy{Mš»uv‹gœ`Ь]ÛN<kÿè¯5ÖN«¤dLùtY¶¸[ÿZóQ¿ú™'ßß•2­‚í¦ëóo¼i«áÙµJ]š)ØwÚ=2¾‡zUÚÁýOŸ9¸ýÜÁgÞݾylÏ„GUe¬O;P²íÌÁí¿¸%/%v¶ýE”)«”<}æàO?,Ùh6nù°üû†±BÀ„廳?¬Ú~îàÓÇ,i†éóRÕ+‹ ÒòÞßìC“6õÕ¾u®ú³Á[wŽÐZbÑ‹Ûß7'‰ˆ(4/ýjû¹rÑXÃÏž>÷âšpš3ûnúË3gþiUøsåóû·ø3râ|úáþ-y)̪Cì¢9•q]EVø‰´/îiKiÍÉf{GoŸ×/â÷öõv´®«*ÎÙ^rdl™VCÑÑCæÕ¦˜«ö‡-µü¹âšÓöñÀÐëj©+-,9Šteæ!JjöÔ%Öä§f!ã/° ï`ÎJYðpD¿—‰$/☠f˜‰«ÊØ{ <ª{íÎeuÍŽ^¯ßï÷öv´ÔWäö—;Ueì­y~<µm­ÝótnIÍÉÓ-v‡«·ÏÛçê°·57ÖW•än/9>¾–Éæ—j,S“}Ž9܈½zgaU£Ýå _J¯½±¦¤ðÕPá™:§xÒðÝù=5Ý %ù%‡OÛÇF·¯£ídUásåã/~Ü\V‘£YèsTZ.înØSXVß6þŽ:¯«¥¾tçøÉ©ÍJ3îbÜ"g˜‰")o}bŠNWøì¦ÊkMÓ#õÃE;6U>«ÏÕ©RׯÖO šî˶àÃÝXÀkÈ|X¾¼ì¯ÝS,/ûå&ÓµÎÊ·l%owºÒ3ý$¼¤aü²½;u}tnç?ZtU;Uϲ¿âáŠ}?Èòu–¿q¶Ú¡zÉ¢ ÿ•ø|QæÞ„¾Úßž)®ïìMßtl÷ª[^¡¤Ô=ªïéž[ë }Wúl=©e:[óÛœþTC²VD’M‘Õ"¢ÚlPõ:ûÃÃξ›çÜÙ¾@Ú÷B¹¤z¥E7h=# ~´fߦl¯«ò­³Õçc‹w®ÔS½þx IDATåÍ~Ã.¢cQé-u'Õ•{^ çnÛ©Wm§fØ]mzéèë…f½XÛÒKqÝ{aµÍ'"öSÕ%§ªE”J™zï*7¿th¿1bÊ¡ËÉÒ?5¾þ‚ñÖ—Œ©ôf£²)<5R´ÙY·ó²è÷2±v­ˆˆÎl™yR¥&»¢® cOÃØÎîÖ㯴¿eeVEîÍòS·õ¢<©òèAßÄ•öØO½j?5óþ†‚£u…ÓW_\•×TÒä 8›jKšj%Â¥­¹¦bJáÙßQ`xÞì=eu‹ÏÞP]ÒP=}­ùà!ËmT©irª?_\rª{ìÚy¡õˆˆR© L=»5‡+²5wù‰^ã ³‹OIÿy™)èêõ¤¢¼oÛ‚Žÿ–¨ŠðgTÐwúâH]f²²«? HÊ_kç[oæÄǶç/·‰ˆ×ÿåÚ£+âÇ?sýÑqüË€Èã(Ì]¦•+¾ö×n0˜åò ïtÛƒ"=Žêô”º4åªô½ôWrÚ†DÄ[ýN’iŸÞ¤¾2y£2!^5ì÷…s<åú̶â‡C¿ »Kþí‚}|ÏZk¹ÔïÍ\eH¸l×=šzík{ÂÃ9Ä65¹ÉÃvÇ€$‰ˆÈˆkÖÝ|îž¶ É’¦hý2¨Ý˜–qÍ]yeD—mÈ^.>ÑÕéºP™²­~+÷älbÙñ¤æÖ¼ÿþ¡¢9^À¯4<ðÝæ£…*Ѽf¡ä×<ô¼ar=ÙÔdAg>pr¬õˆñ„!×4ñ]£yZÀ4þ;u–ù¶ÞBvz™\“§³Xf-ÆÒËê½´m†ë 38y(O§ºÃ+}â@ža®ª>]VÑëž,‹8Tcª8v0O7uãÔK©Þ\ðú‰šéÕÞQ Í©8özÁæÈç?vع·Y¤¦1UÖÛ?%Ùšâi³^:V_fÒ܃ú¾3Ì*xãôE¿ˆÈð@ckGËÐ7ßÙví¦ˆø¯]­ÿ}§k¨¿®õ+ǰˆHßÅË®¯É :?ëó§¯6(D™²:KÑßäNnßz¶_ÒV˜7ú§},~ÒýŽðžþ øgÛ?VgHR]ýº#îñâЀºä”ÄGêþeû¹ƒÛÏÜÞ¶ï{)¢2L]E704"ñ*m¸”+Ðã(¬;SXw¦äݫީ§3Sk·Û!ËÌ(ôëÕ^gOcO¬aC’ú‘•kdÀzubñ»Nu3“բܖ™Ôûùån‰MMOô÷¸Ã£:â¼ô-ë În,ªRsJæ»Ú¬M§Ûì.·Ç7ö—¿R­Ó³Ìyùy9Æ”‰?üSÍU‡´½¢Ñ§N TÆÊæ3ec?FÊRs*O~\ØÒØxÚÚbwº}µvÞ 7˜ÌKnƬ‡jsQE‘Ö¥Þlœ¾oJÖþ—ŠlRkÈ0ü®ÆÐ;ïdsÁ6V D‘”­‹›åsUZŠ~¶R¨‘޳ýª­›Š“½]SjܾAoârózN”•½åàÆx•:I;sS3íï¹äl–Õw­ÉJ[ž•m¬Hm §³þjrÕ/yë—›Œ†C»×¼î[çÿšÞq´(ôGË3+²Wo[ŸbÎüþë/šL×¾½ejí,­y:û¼è2‚í> ô}ã”e¹Z:o]ôvŽÝ†»bMÝg¯Œ-~èþ¼Ë®X]·;}[Úò¬lcÍVÞ¼4‚¼…¿½¾1´D¨© ‹B¯Ÿý½?‰êÙ?÷õô8†ãÅýÕDÉ›ˆˆº.Uý9hþù“§Ëß›â.û²K·éPfÒLí̸ÿP_õ[µ¯XW·/³býÀaë·þ ß‘Çß:[wmyYqÖQËjÍÅ¿”üáz`z»—Ë_³Õ\Ó7.Þ²?3ÉÝü…ÇÇf¼N6ck¾oìƒ"îozƒ"AŸÕ-2Øß2­xn®Ý‚ö³×E|ÃÑžïrémÓèköeØ*õ':"½…bFGG…ï.¯ËåUk•gëáÊÚVˆˆÚüúéšl^Lvô.Ü^íÉzýL]6ÿÒ` Úò‰xö;uJЇþ:37~æÆVw½SrJ^úˆí³~ˆH¬ágÛŽ¥]Ê=zÅ·ÔFzy[£¡3ÿHûy^†½ž ¯ïŽÚ­Ê€¾ËúZ*wV;§>2Å{Iñ˜$Øä=·q‡.5b–7<ØüžÓ~Ÿ+Å vrâÏþ|P™¦¯ÈT´¿×¿ÄR¼„$Sú£{³ï}íæ–»]yõ¶uÅzÆ€)ÜŸ]xî³ ‹÷øzÊßNªz6óôŽ8¿÷Û–?œ­ý,°´FX™¼æÀÏuÏÿZæp¿Ý6‚¼ï4•>k³ÖÕî ˆzÉ\¸¯ÅÈÛñXzÜ—¾(¹ôÅÒ=þÀ•‹Ï½r‘ëx‡xGX€ïà;ò€»&ºïÈcÕZ` È–‚<` È #¼p˜‡ÑÑ‘¸¸¸(6H@»<éf`qæ4Z¡IŒbƒy`~³ç©Ñá¡ÿàèè£D4::2âúÍž§¢ØlÌ(Õ°`!Îwy^>öé5ïàÍ›7 `º¸¸¸šÄßìyjkº6ŠÍR‘,F$†QîíBEX€ó]ž_¼Ö«z(F¡Œ‰¡Bˆ`ttd$04:<ô»s£X”ÇóàåcŸÆªŠO Åf§z(&>áåcŸF±Y9°žë7b*ƘS¬2aÀÍ%ž òÀŒŽŽJ ïÇæŒê‚0yÀ@,yÀ@,yÀ@,y ¤H2[žøøàösŸ9aY½Fq§¤ýåÛß7'MÞ¤LÿᙃO˜æÛ2Íøñ¯hRÌv(¦Ìô¼”{—ðh7ß­Úþñ®‡•ê´UO=Ÿ,¢^u¢ê©¢dn‹»Ž `A¦™5[“5""ñ[Gw<¬¾o£Êúñ:‹îž%<ʬgV«ç ßë¿mjëqq?Ü;y ¡XV`TMÞb\“¡x@N>N£¸éép‰ ]o°v·äÝË[!¸Ç”i[Þßå¯ýclñ3«+‚;«»ÇªÛÔ«Ò*v®ËÑ)¼îoÞ<3QƒÞ®RɰëbgUcWûPRQùŠWˆüã?|l°å6^$,/°l*Z¿,%Þï8ÿ·Ú÷zœÁùõ›°êدÖ6ïÎÚñýŒ‹ÿ±ÓzCÔ)/íÚ”¿6Q3èk;ûEµµÏ#Êç÷o+{DdçOÎl<ûô{‰ÇÊÓ_ûôÔä.æ:Ü *ò"ømƒÃ?yCŸ£»cáq•j…¾&WeýàlÉÛ.OÚ†c»WiEDýh;MÙ^Wå[g«ÏÇï\©«ÂR,/ûå&ÓµÎÊ·l%owºÒ3ýD£”Ç_ûSýµ›Žßôtãõ€$>_”¹7¡¯ö·gŠë;{Ó7…ÚœO¿"Ÿ´×’.ç¿8|~PË+ö?nQ¸kß:Sò^Ÿ&ûñÏ-WJàÔ‘ÖÃWov¼ûÑ“'úÎi^€ÛF°êU)wgÝçßzED†;>ï8îÖd§ÝƬÇaë;.]·_ê*?ñ•wí:s²è3d/—žèjíºnk»PùçñÄ0hûÈQÞØÝÚuÝ~©»þËaÍŠx‘P€8""ÊUé{é¯<álíñ¶Ù]ýÎW^ƒÞ¤žW¿""çm³¿òÉe[߈:}]^Bõ §µËkw|QþÞ@ÊֵƹNqÞ€ÛÄÔZ€ùR¦m|wß÷RDÄ;ÐògW¯$7f”=&"kMoµÖv,¤1o‹;´ÀýsxuÖ …3=Ñßó…+Ï9/}ëß*""ÁÖ³#›ÓW¤/7¥=’µ6^.ÞÚœF—œ’¸¬î_¶OÚ6hH«oÎ~cÜ"â·w†rC­N­p9Â_ôô|ݿڠûÀlç3ïÀm"Ș'E–ù{)c?j’sþ>yÒG*ËO­ûí•É™•w†Vü¶ˆÌšÓ¨Sì{ܼÚtþJãÝOfÖ$LÛ'^ÄûUé[]®‰y¾7½³ŸÑ¤~‡G<Á‘;žÛ9,SkæG‘”£›ùSÝ#ú)IœßuMRÓžôXÆd•÷[O(çÒäèBÉŒR·Ê°_ öv ªÒtávb –­«N_—Ÿp¹äˆ½ö“˶+ƒ„Xå´þ½n¯W³L;4èt z4iÏê´ÂÁéýÞšßyÜ>òJcxV¬6meêð ç\…uó>Üî ÈÌO¼6qæ5S~Ú>èt•n:V”xäl¿;¨0<¦ß¿UÑöîßÚƒ¢‰ÏßµÅÙØéP$ïøž¦ó/M}âê²›u»}UõÒô[Çr< ø½‰ËÍë5žžýc†ãU_%iýî x%N³"I›pÝÓÓYõGU¿4Ê_¹V=»ÖpÑæŽ° G„~ej}Ÿ¯«Ë:”y`—Áou{’W—íHîm;ã˜kAÀ|·‰ `ž†½ƒ"3eyƒþ[æÒ®8‹ß,ûÙÚ²Ÿ¯ÕÈ;«ý o·½y)¼ÜëðÕš‚KV™fØuñRIãˆø.—¾{`纚}^·ûÍ…»’E$Ðu©êÏ[+~þdáð ã|GùÛÁª]›eöïn´>Pœ›u,ùÌÎ÷½Çß:+–eÅYša¿ãü_Jþp=ÂÚ²û½E°¿úó^ˆª}k5ƒƒö¶s{¬ÞÀÜãsc^€Û3::Ê(€yÚò‰xö=}ÝxlçÊ”Ÿø[ÞýòÏçÙŽ2mKsQlù¿f¿·k÷«ßÖ°×sáõÝÑjŠ<€ùröÙöÏÜ,v,TäÜkž OÿÛÔ/¢‚Š<` È–‚<` È–‚<°@££Œp<°)Éê›AƘÓÍÀ`Ú£+¢Ø AX€ßìyjtxh$04::ÂhŽŽŒ†F‡‡þu÷ßG±Ù˜QªaÀBœïòüß'þÜóÍ5†˜IÚ£+þu÷ßoM×F±M*òÀ‚ †qqŒ‘".n(0õf©È p¾Ëó‹×šcUÅ(”11TŒO­ýÝ‹¹Q,Êãy ðò±OcUÅÆ'â3‰‰‰S=Ÿðò±O£Ø,XÏõ± ãÌ)V™0àæÏy`FGG%&†qæ¼y3Š äKA°äKA°äKA°ä„(SÝ¿;ûêíçþôý¢tSœßHÚ_¾ý}sÒ”FÒxæàæ„ywšfüø×?4)fÙEaÊLÏKùnÆ8ó8}„䈈h7ßýç­Å—ù¾¼|úâ`ª!ãõ]«´‹âÐTY?^gÑã<èH;D™’~ôç«SEüÏŸèó‰Âºûéºõ« Š+¶ ÃE @‘õì:½ˆëâW-çoø&¶î QeÚ–÷wùkÿ[üÌjãŠ`ÇÅÎêÆn爈zUZÅÎu9:…×ýÍ›g&JíÂÛU*v]ì¬jìjJ**ÿQñ ‘ü‡ ¶ÜÆë„å–MEë—¥ÄûçÿVû^3¸Ð~'·/"±k~¸©*w•Qç¿ÖßøÞ_^ý2ic\Ñ‹Û,ÿôœõ†(4/•?Yì´rvK¬ágÛN:ó_ëv«S^Úµ)m¢fÐ×vö‹jkŸGDVûÕÚÆãÝY;¾Ÿqñ?vZoÌtú˜#xŠeùéqþ‹çŠO\i¯%]ÎqøüàŒ§9ïS†<ðb•?+ô[×X6Ɖø›ûÆªó”ŠØ@pä¶Z¶¾s¡¡kDäºÃ—øþ¾uæä+- ÙÁËÅ'ºÚƒ"]*S¶ÕoÛ9hûÈÑxþrûˆxý_®=º"^D$&ŽˆˆrUúÞGú+9mC"â­~'É´OoR_±úæî·Á7Cûš$íðÀáóߨ}"n»ûóÄÞ`Ä#žKýÞÌU†„ËvÝ£©×¾¶'<œóHlSP“›æ@xÁo›ºnfo|¼~÷e‡,Ïß'""*ËŽ´¦ßv»R¾ÿöwlÕ—nc¢­·ÅJîoœÃ«³V(œé‰þž/\áxÎyé[ÿX’¼a=;²9}uAúrSÚ#Ykãåâ­ÍitÉ)‰Ëêþeû¤mƒ†™äMï7¶a rûž®ÆÌÃO;.~Ýòùë¥~wP$âF·Û!›Ì(<ëÕ^ç_W¤ìߤ®\#õWG´™jÕ€Ë>OÏ×½ñ« j±‰ˆßÞé‘ØÔ™Ns!ÈXß±ëv÷n\­—a—Óõf³[ûlfÙÚ ÇŠdÏ;—­úâŸ?©|ûÌ+Ó²<ï -ú#l™5ŒQ§Ø÷¸9xµéü•ƺŸÌ¬I˜¶O¼ˆ÷«Ò·º\s~ozf?»p¿3µ?ÔÿêkÖ†ôGs6¬4?›YºãëÊ×>³ú"n°ö)ŠÓ—9Ö*\Íö7´™É¾å÷ßœC¢žå†G<·YÒˆ ¼#@d¨ÿøñÖ'_ùðñWþ¸óøÖ+׎·Z»áä>c^²¿ãš*w—qÛ­ÉšßuMRÓÖMl‰5lHVy¿õ„‚6MŽ.¿(u« ñûµ`o× *M§WŒï¿L%""êôuù —KŽØk?¹l»2H˜<á7Äëöz5Ë´CƒîA÷À G“Vñ¬N!œÞïÈLík×*~œìíºÒð‡ {Ùƒ+‹Ò•7Šìçu[Ó,Ƀ-WƒÞ¯ú=)iÏoMtvÝ#âqûüÉ+á2Xß9("¾®.ëPæ]¿ÕíI^]¶#¹·íŒ#xkþäþ<òécNqUUUŒ˜§7þ_Gœê¡ålG†ÛW½kVgÿoÚ¼Õƒ§l×<Ó¦‡Þôyþð¥?mÃ÷ ´ÆòƒG ЧþÇgµŽ¡›"qËWý·-C‡­ÃÿõÙ¿üß“åÿs–¿s¹;(ðZ¿ðÿÝ×þÓÓú,ï·ÿ£7mc§Ÿ^ù_ý×\ê•Å?3üò‰GÓ®»ª[nþà‰¿{fÈ}ªgð¦ZkyfýIøº±Ãw¾½ßŸžö>ów–Œ‡>o/ÿƒ§êQÍÔïÍÈíÿþ•KŠdËOÖÿ·¬Õ9+ƒ­§?«í ö÷OßxSäæÐȆ'V¯»üeÝgÿ¹)éÏ(¿yí~ó͈ÈÈ`kû·ÉÓK~ºv×ß©þ×\xÁ:à…ú¿>•â:Û}á?EdÆÓw§ÞŽÿÿòX´Z‹å¿A`ž¶¼p"^£}°ÎY¡)(z¢lmœã÷íq,`½ eÚ–æ¢Øòÿ̼§Ç{¿úÅtÃ^Ï…×wGíNd@fô6ÿÔµ!Éu;«ÖQC0—à Í1È0àþ"ȸ+=žþ·¨_Üm± °øäKA°äKAX€˜˜e€9ŽŽÄÅÅE±A‚<°ÚåI7ƒŒ0§‘ÀÐ Mb$È ð›=OøGGG ¢ÑÑ‘ÿàèðÐoö<ÅfcF©† q¾Ëóò±O¯yoÞ¼ÉhÓÅÅÅ­Ð$þfÏS[ÓµQl–Š<°`1"1Œpo*òÀœïòüâµæXÕC1 eL B@££##¡Ñá¡ß½˜Å¢<ž7°/û4VõPl|)0“˜˜Ø8ÕC1ñ /û4ŠÍòÈ€ð\¿«P1Àœb• Þh.ñL`ttTbx?0·˜˜Ø`T„!È–‚<` È–‚<` È–‚<` ÈX”šŠ_m73ñþ„)3=/…iqÜ ÀݦN[S³Ë½"NDD®–°Û$©`GZoó­¾Å|બ¯3 ö4õpï;‚<€»L¡Ù»km ùÓlÇ``bcbÎV½i½ªò ÖÆs£0ànSe$Ü8ýå¤oœFW³o‹9yí©S^ú§mÜ~î×O½nNц7+SV(yúÌÁŸ~X²ÑlÜòaù÷ Šù}79íݪìçÕ¡]´™Ùgö§i%©¨üGÅ+âŒÿø[–+¹Œ÷y÷B (¢xøÐ¯3sâ§~ ÑÕì™]žbyÅþÇó®uV¿åö¨Wï·<~"ÁöÜû×Ї+öý «ëRù’¶ö€eeŠÏ5ßïFîéÆñ×þ¤y1ÛÔܺÇà ÞwTäÜ3±šøH›5ºš}[¶©çÕ„:}]^Bõ §µËkw|QþÞ@ÊÖµF…h7Ìrù•wºm=×mmŽê/oN¯àšé»3 Žý/È[wC°ŒÌ³æM«S«¾v„—Èðô|ÝŸdPÇê Iª«_w„¢· óây—Á_òî™ïp¤Í^wÙ‡mÑ,_«TΏV‹ïȸ” ‘¡þòªC¿+RŽV?n’±ïBë¼S<ÛçO^iTw»}""Ú´•©Ã7œ¾wç ¢¤ ä IDATlX™¡øÆ…ac’Hÿü¾+¢‰U…‚"…>=‘ëµäÜmþŽ¡¤üõ‰6Ç´…kçJñ”«4›Ó&Œõ^óvwuY‡2ì2ø­nOòê²ɽmgA \r6?ûøÁ]ßV2 ik+ÒãÂo¸›à›á»24Ø;¬.xfµ³u@Ö®«H“ðÊ^‰Ó¬HÒ&\÷ qﳘÑÑQFÌÓ–NÄk´ŒÃB©ÓÖÔì2d¯ˆ‘«¥ì6ÑìXÝÛüÅŒ)žBSQþ¤E3e[oóŸžûä†$?ú’eCþÚDÍà ýì_+­}Q®J;°Ó«‹íuþíð%]ÍÝ…‡ººoiv†ïêŒÆC;Vg$».þ­öó”CÛ¾Ùy¤Ç#±›Í™uÛ’½>³ó}/+×.Ô°×sáõÝÑj ,AÞ╜’—>bû¬ß#"køÙ¶ci—r^ñ12÷Otƒ<»ønH,ØùÊÌåºåšõë*2ígûIñ¾KxGÀwÂ@OùÛIUÏfžÞç÷~Ûò‡³µŸ1ö;… à;Â}é‹’K_0ßUL­–‚<` È–‚<` È #££Œ0§ÑÑ‘¸¸¸(6H@»<éf`qæ4Z¡ùÿÙ»ÿ ¨Î|ß÷_ÌêÚûtO*Ýî¹7Õ¸w5¦vëÂ%¥ˆ&BŒK[kDë¹7È©iùøøø;µ‘ÙGñCR¨Lâ Ä8¸ZPæ÷U{—Ð5WúdÛ}³ížtßIzEÃý£AQ°ÌûõOdõ³žõôZfù¬ϳž¿ZÄ òÀc¨ËOøîÛï#ßLL|ÏÙf51ñý÷‘o&¾û¶.?u«]5ÁhXð8þùÿ ”4ü9ôÍÝ»w9ÀÃÖ¬Yó¼á¯êòSÿ÷¿5-bµy€0µЂ<@ò È4€ Ђ<@ò È4`í¢×øç?ÿ™Ó ˆÈóÏ?¿XU­š˜˜à„+Sk È4€ Ђ<@ò È4€ Ђ<@ò È4€ Ђ<@ò È4€ Ђ<@ò È4€ Ђ<@ò È4€ Ђ<@ò È4€ Ђ<@ò È4€ Ђ<@ò È4€ Ђ<@ò È4€ Ђ<@ò È4€ Ђ<@–+ȋܨyõå)ûÏÝzòŠ.½üòË/¿üªóFd Úºxèå—_~ùå 7#+¡@D–-È‹Œ¶]Üûi´õâ-N=°pËäEFÏ] OûyüIÞ£ÝjÝÀøÙígä@xbk—ã ‘kmÑOyéÓµK>‘ñ¶ 7÷Ú°ò·aó‰®.UD1¬×­„zYžy¡áÖhŽgzÝQ´/VDD|ç>½¹"OˆnÝúõëׯ_gX!õ"Ëä…®¶]QEDLÛwoܰuÿFñ]X¡I°-ýÔÚÐpÛ°*"óúîu"›wo”ÚQßùs7Þv¼8×ÄÓÈíásgÞ;ix4 Š(¦Ø¤Wvï{{÷–ÙF¸E®–½š!,K{Zwn^6,ó‹ŽŽ¢ ºYê_¹ùÙ™3m“ÐÇľ˜´ûíwv'­{à›ÌZÏäG·.Ÿ;ÓváêèÍñ@X}L̆[ö½ýö«÷2u¼I£åY/—‹(›ÿGC’.2ìø‡‚Kª¼Tý?Þ{Õp{¸õ]ç™ £áÉO§ö¹}õÓ¶¶óW†¯ŽTQô¦˜õ7½¾ïÐî-ÓZ3ïä~]çÞïӋã¾°*¢èc6&mÞ¹ÿí×g|eYXÛð–<È»}yr<^ÌîDDÖO%y çn¾S6k’wë³²‚ò ¾ûÔÀø•ß½òñ¹7ORç9ZàbMÁñÇد­|ÏåÑæ÷v̯߬ºtéܰo|øã*û…‹ÕÎW×-ðÛ¨3[öŸ·à|Û›'[˶zeüÝ+çõÒ/›÷¿¸ÐTíÖg•åÔ¥†}×.}|íÒÇg^©h¬Ù¹A÷XmÀZê ïöpÛ°ˆˆÄîÛ¾!ºé~’wéܨ£lÓÌ$(4\s/Òoܼuóæ¤õêè𕋆}㯚û`7ß;vÜP6¾þö¾í›6Èí«μ{~\DÆßÏßù¾„Eb^ùÅ¡[6B£Ÿ½×ðñµ°HøÒ»gnl-[P²ºú«‚ó|»ýû_Ù²q]äÖ ïÿêü¨*âû¸Ì¹ó³ÊMóVsû³²©/fó›»·&m0Iàæð…¶‡"ã;j·~Z³Å ºM5ÿX¹ùÞþ=¿ÙXÑÓºó¡¨1tíýãm"¢Ý¸aý†Í¦©“P4™â)±›_ß¹uSŒIQ¾«?=e\õÚ»em[ÎEyÄBÕùåç£W"&iûÖW6¿d]¾rù•qU—ª•>un}8{œ«mxbKäݾÒvMDD6îߺ~jãô1y£ŽM†_‘gÊ>ˆˆ(ŒÛ}ÈñË‹•öãççä¥úúWª[¯NjÓ–-/Ê΂óa ‹l|§¥ùÐd}›’6'­ÆWáြ¸~߯wþ‚˜¶W7W¼º~ª–-¯nٸϻ£"á+ŸÞŒlš/¼uéýèàÄ—~ÙѸÿÞP¶Wwï~µrOÁù€„/¶] m™×§S”ÉÊlµ·µ‰Ä¼^ÝPúêôɲ7ε‹ˆ(I¥»ï«»ú´`OÕ°*ã†oÚp?°›ã@‘« eѳmÚ~¢¥fëä¯îÜïp\®ÙìcŸ„/UÖZóÐ0ÂÙÛ€§°´‹]ܺ4™ã½´ï•iIÙúWvGW¼_<7y`Ðð™sÑ†3@×m-=¹/fÞ&9J_É^Ú·}r4XÌ;5û¦×§Ûðúäºa_(²À/¤ß^S:•âMÚ°óÍŠˆH(žwßHàê-Ù¸{ûƒñ–!éÐ/^yiãÆMjä1NoREs匤LõDDô[ßy}f6¹~ë¾èÝ ?ºòЕ3“1Þ›'*¶>8 аÅqâ1""á g.ß^`Ûð–4È»u±uTDD’öm~ Zw?Ék»6=ºŠÜ<]ôûíÍOÙÔ½¸ïÐÆyøÒ››gLAÕ6èED$fûÖ™±’!fò ÏôÛ÷½ôP«”{õ<‚bˆ6àæù+·f|´a¿ó½ÖÖÖ÷*·®[ðÙU¶¿½ý¡Ò†­üãÿøÇ‹5³Ìò„Ô×½½±¿84KU÷¯ÄÕ󣑅µ Oa)ƒ¼[ÎE—HÚ·eFª3-Ék½º¿=põFXDDŸ´}öÑ\ë“6Ï=&O1æŒÔ¦½§²!i¶V) ÛY·aû+&u¸*ggQMëgÃ7COј¯l\耷ȭ—?m(;V;ºàÚWoDÕ-I³¿ànÝä•Poûž¦mX%|GÞÍ©O†ÿÃËs•R¯´^ %M¾.òE'}š^2Í™6šD|sÕ¶Äé‘Á <ÅÞºMŽ“¿ô{÷J@Äwåãw¯|ü®ˆbÚ˜´yóö;·&m0KøzŒÑŒë6%Eײ¸rn84ß•0%½dâÿ#€%·$A^äZÛÅhÜöÒ¾Íó¼ómz’w%šÛ­åPtÓ5gíg3£¼È354šã‰N'·FÇÇǯ]87üpFºˆ~1â o‹DÞ>sfá«ÖʆݻcEDÔKµg®Ff¹çÃ""1¯ïßÀ€<€¥·A^äÚ¹É/ißük7ÜOò®›LòÖmw¼i _*·;Z/OP‹Ü¾qÑYÿþ¸vOuÌöÍ&õJÙ±šOoÜæºñYͱòáè{ó¥‡&O-åûh† “Ãè.9uuú8ºÛÃï9ö|<¹úH(ŠÌ¶ûƒZ¿Û%èk+Èw~vãväá+¡ű`9,Á;òBí£ë˜&íÛòˆ5X×mÞý’\»&"×Ú.ÝÞ¹{ˆn“ãä;×ì¿ \z÷Ø¥wEôz OFLÊæwö~õþ¨OµîÅ·K_¹püRXÔÑ«ìW‰b2"¡@xjÕWesEÅ«÷Ϙ2¹@¯ïWû_½°1ư©ô¤ãÅùS³ ûÞÙÜV~E•ñ¶ü¸°1饽¸9::PEôI¯oºqþJXÂç öø¶î~§âÐ&Ý<2l)møÅÍü÷GEm+··‰(z½¾öÅîsVn]ÇÿDËañGä…®¶]‰&S›÷%UzÝæ}“còFÏ]š\ÆB÷â¡æŽŠ×7Þ[ u2;R6¾YÝqbÚv­Y·µ¦õľ—ôS?«ÀTЧߏý—]'v® ø;¯›& Ž^»võææ­{õDkÅ›ÑS¾téÒ•kãU‰Ý^Úüic©ãPô„ªoøÂ…[¡GȰ©¨¹£âÍ{-¾Ÿâ)_¯hiu<ú`q¬š˜˜X± ݾ<|ÃwK“iCÒæÍ/®{6fqFnݸvóæ-Ÿ/R 1ëcÖoØ´iƒaŽ¢Ã¯\ ÉzÓ†[·n2,øã£7oÞT•õ1’¶l¹W}äæå —GbÚ°ióÖMëx Ð­«ÃÃWo"&Ó†“’’Öá,«äˆZÍ)V>‚<@ò È4€ Ђ<@ò È4€ Ђ<@ò È4€ Ђ<@Ö.E¥wîÜùóŸÿüÝwß}ÿý÷œbü¨¬^½ú'?ùÉóÏ?¿víb†o«&&&·¡wîÜñûý:nõj†ûàÇèîÝ»ªªšÍæEÌò?ÈûòË/W¯^½víÚÕ«W¯ZµŠË€•‰‰‰»wï~÷Ýw"ò³Ÿýl±ª]ü©µªª †5kÖ0"?NÑdì›o¾YÌ:—¢¡«V­"ÅÀÖêի׬Y³¸ H,UÇÕÀÙ¢GdŒ›4€ Ђ<@ò È4€ Ђ<@ò È4€ Ђ<@ò È4€ Ђ<@ò È4€ Ѐäz§§§§§íLn‰Œ|#==}GåõW €&„˶¥§§¾w#›)r½fÇŽ²‘ÞÕ‡·èô=qÐHgK÷øcÝBŸ`Ú¹^³#ýaoºÞ]÷áôôô5×#þùV¹cGåÈÒÞ^"ãý-5Ǽ±-==}ÛŽ¯i ,ì9wÛßS<&?ÍîÙ }¼žêc—Gõl<Ê ‘çnh quhQÈÝ9¤Šˆ§s(°õ)Öì=¹Vý¶4wzÔÇ9äìà¢7Nc¶Ä(OwÓ›-F³Å¨pbh»‹w½åØ®ƒåÝaKvAÅ©¦SÕEy zOcñ®·Ê:ùýçâõl<ÊÚÚ®pŸ³+ÿ{,W€Ö:yîÎ!Õ²g¿ÒÑÚ9ÈÎ6=m…†ø¼£ñOUƒ1§þÃãqºE«ÏVóAÚTÓ @›"c-ŅͲ§î“c)S»¸ø”Ì\{^{y±³°Êx¶&ÍÄyZ„ž-€GY¡#òô"Þæ†Þ‡³øúO?õ±ãÀñÓƒÑã§ßJOOëdçÉcolKßöÆÑý¾ñîÊÃ;ÒÓÓw®éõEDD"¾ÞÇÞÚ‘žž¾í£5cüÒÀˆæxÙ¹¹¹VqwºîÝÆBc•‡ßØ–¾íÕ=Þ©gÙPÿÑm‡Ûû[ŽØ‘ž¾ã@eïøxoÍÑ7¶¥§ï8PÓtèžœ€-<ØYsô­méé;TNÎ~½W@"ãÝѽӷ½uìä`@d¼å­ƒ­~Õ]õÚŽšë‘PïÑm‡»Gº+ì8pz|Z«ÒÓÓw(k¹’™»ˆH`ðdôæ9í¾+UàY¶°¾Öìý4¦ÓX>ª¿ïÄdOj²c½ÍÖ™™¥ã4çÆ±æòÆðžúSÇRLâë?yüÀŽmÛÞ*ëì?ýÖ®Fsi]Ž2àlŽÞå"“}¹mo=ÑÛ[ùÆ['g>x†®·—E»_÷K}-¦Þc}µÔô´OÍC¿XÛç5;¶»÷ è<œþÆÉ±È\½Ðš«ÌìýÀô`gïg. g àQVfgµ$ˆ:ÔÐü`—o¼½¼¼uÈ«š­6«9ìj-)Ÿö *‡³Ë«(¢Ý]å{Öõz‘°§§ªv $ÞòƒU]®°1!5Ùv÷831À¢ ¹;‡TsjjlLB¦YÜí“I^ ¿ªÐ9dÌ«¨¯/ÍV[jÂ÷æ­ªžÆÆñ슦³Õj_ÕÁ#-z{ÝÙ¦Òä`³ù¡Ç^ÕÓììͯ;{¶:KújÓ_Bk,©ÐçUÔŸªs$;ÊkC±ö³g÷›[Å'¿+‹×‰ˆêm®m‘좢l³D®7;]f{Eý©új»ÅÕXÞ<‘w‰\?q¤¤KÍpÔ7Õ;’Ã%GNLµjzU~ æïkÍßO€e¨m f–Ö×WÛÍîÆÂ’ÌÑ™™­ã4ûF 5v„3Jóãuè/;RåNtœýí'ñU­~k¶-&Ñn·º½‰Œ8 «†ŒöêSõ¥™Á†Ú¾àÌ&ú:KŠ›ÃÉŽú¦Suv³ËYXÞcr²Ñ?äˆHØí Šø]ÝCAsr‚qrßù‹½œ˜›¬¸;Ý“yÙ@§Çœ‘mÑÍÓ ½g®2óõÕƒ½Ÿù=[sY¡SkÍEû;´v9»òJï?Çõ¶„ÔlGEn¬Î×r`o£×;âLÍ[S’+><‘©¿~boaWPl¥žÎÖ>x¤Õï½îó7©bÞ_Wo·(ª§ùHq‡»¥s<÷(“w,¢hŽ—“i‘äTccG§+™iòõ5)Y§ªíñ:‘ÄŠŠñ½…=÷öQ’‹Š2ã ——kéjO(-H‹Ó‰%/£¡ÏTEfLo³ä—ÚSL"±ö|[GãXP2 ÷> zƒŠ­(+-Ñ$bµ˜3ýfåÞþ÷^N¥êóê*óbDD"ú”üÒܬìxƒˆX•Þ–bXä]B®æžpBiõÑL“ˆÄU«î]ÎwQM〉<;‚]G~Þ5í®ãøðƒÜôµÆyûi°ôYÕyñ:‘x›Ñ··°¹}<Û3c›µã4ÛÆ«Ó¥O­·$2ÒX;dq|hO4‰è“ôjf‚I$bµ(á`X}’UW‘—¨‰/-ÙUâ~ }‘±–foBŇGS "g­ß[Øî d¦¦%è»z=¡l½§ßoNM»ú½‘lÅÓë×'dZtâeÞbkn²RÒ饥¢9^EœÎ×>O/tÒ\=ÕyûìÁÎÑÏ\xÏÀVê;ò”8»#£«¤¯±¡7uj›!ñxµ£·«³±ä°ÇíñÏüE‚1Ñj}Œ""F›U/¢‹þ êwÿï WDü­…»Zïíà÷ø#«ã/€Åñt©Æœl‹ND,™ÉúŽžNW(3Õ?âWlE–ÉûΚfUîu¡£Åí±(Š(Æ8£nò‡Yß ½¹M•~ð3Ížc..ßõ†-55-33#51f–;œ1áÞ¯uu±™9ÊuWwûÈõ÷Ð+,©=Ð{¼ª9Ï6õ n²¥™ÕnOPõVàYb4›ïÝ_‹^QÙ×ýüý4XާHkæƒý-?2ggfÖŽÓl}¿3Í:‰\ï[©ÑºT¿'lNMŽ5£M¯ú»½ªÅnl‚Ášf‘ƒ¼°Ç {J^KŸ¶Í<–Lk¦Mœ½ÞqЫOväú‡û½!¥ß+6»E'S·TÝüÅt¶Ü¥¼ÓJ±tzͱ™§:Õ«§:_?ð‘=Øô3çïÙ˜ËÚÛ2CJAµÏ9ÔÚ7µ%4Rs°¸'¨XRsry–ÚïB+û.úkAuõ~ÏÔh#Űˆ"îö!UÔŽ#?︷ÍÕé ¥.ÚÂ\Š¢(s߸ ‰Ç>ø}ÞÈÀ@oCq£3µâlM¦if ¦{5k Kú”ä¬ìÌÜ¢¼Üöâªðã5Ƥpž=Æœº³3»XÀÍ!Ü*£Õ¢øûÝ÷^›ìî÷++ãðÌôÝÿ|ò~,Õ3­¿ÕëQ͉fÝ\™Y;N³n4ÆÅ?èˆÎœfU\Í]c¡ÐXg­Ó¥êõö ž,o f•Úcu:s¢Y¼ýžÉ&„<ý3£¡·ZõAOPe v:ú‚1%d›ýÝ~sšÅ ·%½Ý~s¶íÁßÉ>¢˜Á–kS‡š[¼æÜŒXÑ- :g™§é.¤Ÿ àɬ]ÉÓÅç;’{ʇ¢ÿË+úX£HØãk²½®)/Þ "¦Ô‚Œ†’ªª¸R»MÜ-N—:c¾¨.Þn·¬-®‘¢\s¸¿¥¡Õ“zʬ1&$ë:<Æ›QtÆ4«tôyÍûf¾ŒøÅ ¶Üµ|Ào)ʈnŠÉ˜«ioîWr rcç*cxŠ~àœýLþ’OmõÊnž)­(ß2õClNiQ²Y‘ ×«¤:Š‘°ëÞ/!&·®É‘aÕ{‡†¼ú„œÒSu¹ÜD,žˆ»sH5gåMŸ¦³äf™UW§KÉ®;åH¶WÖv‹½ºÀ²o1¤8ª÷[Ý %…GŠ«ÚƒÉ¥õŽxˆ9!Ãl,,lœ¹R˜.±¨4GßW~dïÞ’æñÌêê,‹ÇYÞ5þÀ.ºÄ²SÕ9ÒW[x¤Ð9 ì©;u4Ž)À³þ œÎë_P(gyš~,ż§Ú®t×Vµø§ªÓ "2GgfÖŽÓì½)Sª#ßâª-990¥ÿõï>ÿÃoNÏLÌ­ùàŸÿá7¿®‰¦xÑÞXi½#Áß\RXìŒ/*°>ô&’X{}}ÙÝPRX\ÛN­¨/Š×MvÓô"Ö4³NDgÉ´ŠèÒÌ3¿ã£Šrm"–ÜÔ©‡]Ó\½Ð°§³££Û«ÎSæ)ús÷3<­U‹[ã_|ñÜsÏ­Y³†“ оÀà‰â’.¯%£¨ /ÙfÕ«>¯ÛíQ­iÓÖOô v»”äìD“ˆHdìäÞBwÑ'§—u%ÖñÓo²øk†­+ÅÝ»w¿úê«^xa±*\Ë9`n¦”ãM¦u5·t:‹‚“sKõ–Ô[ZlìýbþöÚÆ~µ®(ìºÛ]a›#aùR¼Ðøˆk ¹Ãos¤’âÏ0Fä°P‘€/(z£Éðð" X|‹ä­æœ+A y€ä@hA y€ä@hA y€¬° /2vâôôô5×#‹Sa ûð¢ÖO{Ÿ»^³cGÙÈoJÎÃÛtú8m–E`¤½æè[;¶¥§§o{ãÀÑÊöë!N znôܬ Ïúˆèés)é ˆˆzËVu¹ÂÆ„ÔdsØÝãùèƒß|è°Í_“µèÃß}ôÑÎXDÄÓïg ‹DŸ’_Z]š—–Ÿ˜¶Çž¬ûÃ"âëkR²êªíi‰ñ)y9Æi»(ÉEE™q1±iy¹1f•¤ÅÅÄeäeèÃÞàÿ“°ä—ÚSbcbÓìù6ñ9åQLnu}Q†U/ttµ:«Š¾–~ ¦7 ¡¡æ® ˆµèì§OtÖañ÷´{"ótÏîÝ· ššNž8}¶.U/âjìïiRż¿®¾º´¢¾nQÄÝÒ9.o¿GDÌ9ŽŠ“§Ï69²’“ 5 hì“¬ŠŠ¼”øø”¼ÒÒdETznžAš ò‚#UĘ‘kÕ‰ˆÄ¤æYEÄ;âˆУŠS³­:‰É°Ï›äŒ""f«QDÔGÝÝ`¡t±™9 âîn?}¢ìØÁâ¾°ˆˆDü#~Å–i™œK¡³¦Yï/¿£-fCôOŠ(Æ8£nò‡YWè1Ú¦^ž¬(Â>)1¯ò׿ûü÷Ÿ4ÕWå$[oOmmÿÿ¼îsrrŒˆHLî¯?ÿüóß”ÅëæéžM2§¦ÆêDÄ`ËµŠˆÐŠø½"âo-ÜõÚk¯í*ßãè¬Ù©zkñ®ôGœ×Ù¥G㙈`A"þA¯jI³NÞ4 Ö4 =7Ï$­/v¡ŠDTUÞ=§zzÜ$üƒ5…%}JrVvfnQ^n{qUxQëW¦Ýç`Ñïa#=î°Þ–•›hŠKÌŒKÌÌɬÜUÜöþß·-UÓôß’ªjDDw£*j´£f-¨.¸ÿt¬m:1dÖ|bééììíp¹zZ]=]½gk2yMzn0E3#òŒ‰VE$Ø×퉈ˆøÚ="bI1ëtæD‹ˆøûº£¯4hws],¿«¹'œUßtâ¸=;%ά„UUDDgN4«îÞ©ñ)O¿‡‘ÀV¢`wcc£³ªyêw¿ÇýßmH4‹ˆ`h\DÄ×yt[zú['Æ"swϦêôD?›ìŸYR,ƒÙf‘pÈ’’’’bQ=ýýƒž°ˆ¯÷dem³Ûb¯<ùÑ~{jY$ìâ%(FgN4‹·ß3yÏyú½ôÜ<“V戼pOÉÞ¡û¿£µœ:‘¿Ç<Ðêï(ÜëJ0‡]n¿ˆ1«(+FD’ó³ôÅ=þÖ#{,âõòî?ÅhևݽCcF›âík¬«6o0’“aOh¬-)-ÍOPÜíÎnRV"SjÑKa‡·«äµ>³Å¨ú£/|2æ¥Z¬æ,}q·áÈ[½Vñ¸ýªX2ò,:ƒeÎîÙTüæï(Ü5`Q‚Þ *JrAV¬ˆäÚm­Nwë‘BO²1èò„•‡Ý z½¨o ¯o ;ÁfV½C~Å–ff< €ÞÄ 2JªªâJí6q·8]êü3µè¹Ш•:"/¼Ïï«"º¸£MMŽ,›Yõ¸ÜA£5µ ®©,Q'"¢Ktœ*Ͳ• 7hÌp8˜[ `ùé‹Jsô}åGöî-iϬ®Î²xœå]ãbÊ®;åH¶WÖv‹½ºÀÂM ÀJ¼‹Å;uª4'ÁbTý^oPôæ„,G}ÓñDƒËÎÖíO¶(A·Û¯X’ êêÆêæížEYö—î·Š?¨­ŽSÕi&‘˜Üº&G†UïòêrJOÕåÆˆR*êKsÌâu ¹ƒFkFQ}ój,”!¥´Þ‘ào.),vÆXÅ4ÏÜVzn4jÕÄÄÄâÖøÅ_<÷ÜskÖ¬Y¾/¸>èªF[r¼I'è>¼«ÖcÌiúðx¿ÃX~‘±“{t-E~Ãé° |ƒÝ.%9;Ñ4u*t}r:ÓÀ™ðƒº{÷îW_}õ /,V…kŸ…³v5”7zÅœºßžfkoôˆ˜3²-¤xðãào¯mìWëŠ2̪»ÝÙ¶9Hñ<{ž‰ /Ö^_'ÎÆö¡Vç€(Fkêþ‚¢üxr<øqˆÉ­®¯m(ÞëT£5µ¨Þ‘mŠ\?YÒàžeµ Åb¯(Kcò> z&¦Ö+Ì¢O­]Í9V>‚<@ò È4€ Ђ<@ò È4€ Ђ<@ò È4€ Ђ<@ò È4€ Ђ<@ò È4€ Ђ<@–$È[µjg?r«W/fø¶øAž¢(ß~û-× ?f‘HdíÚµ‹XáâyF£ñÛo¿ýæ›o¾ÿþ{.~l¾ÿþûo¾ùæÛo¿5‹Xíª‰‰‰Eoë;w‚Áà;wÈòðc³zõêµkׯő·$A€ÅŪµ€ä@hA y€ä@hA y€ä@hA y€ä@hA y€ä@hÀÚ–»sçΟÿüçï¾ûîûï¿ç¬‹bõêÕ?ùÉOžþùµk‘Ô­š˜˜xduwîÜñûý:nõjFð‹éîÝ»ªªšÍæù³¼y_~ùåêÕ«×®]»zõêU«Vqr€E111q÷îÝï¾ûND~ö³ŸÍSrASkUU5 kÖ¬aD°¸¢™Û7ß|óˆb ¬nÕªU¤xÀ¢[½zõš5k¹4ÅcyœS`),$|c y€ä@hA y€ä@hA y€ä@hA y€ä@hA y€ä@hA y€ä@hA y€ä@hA y€ä@hA y€ä@hA k—ó`ëÝÍ-nß몢7Z,‹-3Ïž•hÒýp§À×y`¯Ó«dÔÿ¶2QÇ߬HËäEÆ;«ŠÁi›ÂA¯;èu»:Z2*ê+3c¸À–'È‹Œ8£)ž1µÀQ“kЉDB>w_Kcc—ÛßWUb¶6ýAÄé­y{rÆ•D3Ãñ°b­š˜˜xd¡/¾øâ¹çž[³fÍ$Ð{tW•[”äŠOdšü,2ÞRx°Ñ#JjÝ'5)®~tîÞ½ûÕW_½ð ó”YŽÅ."þ~¯ˆ( y©¦‡>ÔÅæ¤*"ª»ßáš³Z–©µjX5VEž¿j°åć‹þÁÏ×;››Û\Þ *ŠÞlM͵Û÷¤=8ý62ÞßÜØ2àöx£«gX“só r\;ãQe݇wÕzf,vëmnnéòUÅhIHÍËÏÏ¿DFý¼ÄeÌiúð¸ÑÕÒÐØ>à ª¢7Z²ò‹òÓbt×H`^Ë2µv¼åÀÁF¯ˆ>ÕQ_š·€ù³‘±öâ·:s»9«úTYÚdœ¬9XÒ3¹~†¢ˆ-®ØgOçÆ,¸ÌÃAž¯·¬°ê…9&w*:UŸ-3äeUØýµ .U£YöU%¹ôÃÙ¦7?n+ej­LΞ•ð€óÈko-;ÙÞ{Ýš»|hÄYÒàVÅœZtê“ßþùçŸÿþ“ú¢T£ˆ¿§¼¼Ó'""‘gUOPÄ’S}ö÷Ÿþ‡?|þû«sÌ"ª»¡a$²à2o/¯Šè“'þûß6UdEw*i¸þÀ^Á¾ª·eOÝ'Ÿÿá7ýæ¿or$+"êPcóXä‰a€Y¬]¦ãèb³+?È(êëîíryÃ"a¯«ÏëêëhP¬Y¥ÕŽÌÉ÷Êù†:="úÔü¬3Oc² RŠÂîA¿$Æ*&EDTï '”?5[×RóÑïîtefˆxz‡Â"Jj~ƃG7$çg:‚înO(Ótov°>ÞüÀTa£Ù,â}ò³Y»œÓ™âÒòâÒòD$ä»îêïíîésEõôT ªÑ÷ÊEüƒ~ »Š*3*{U ÑØÔìõû=}-CéÕù܃A1ZŒÊÂÊÌ“a·‰ˆ·±vzîï®uºDÄœ•·ðyOÒ`˲ØE¬½®ôú‘Úà@푟7ZlV‹ÅbÖ«á ßëŠ.iaÌ(-šZ ÖRäHªðwïr%g¤¦Ä›Ôëýí=® ˆ1§¢(^'“qŸ«/2äòø}ªÄ­¶äY¾@OÖüH¬Ä À òVsš€• Ђ<@ò È4€ Ђ<@ò È4€ Ђ<@ò È4`í2ãîÝ»ápø/ùË÷ß¿tGùú믹œžÿ÷çÎÛ·oýõ×wïÞ]ôú׬YóÓŸþtݺuk×Îü‡à_ÿõ_9ÿ´þHµÌÏ8óÿüóÏ?ÿü’~“ù—±Z­«V­â/+€•ï¯ÿê¯æú( |ñſݹsçOúÓúõë_xáEQ½ªªÞ¾}ûOúÓßýÝß=|sæv @ÓT36&%%-u“æÈZ,Kä}ýõ×Ï?ÿüOúÓe¸Š:nI³BX4sý“ó릦í¯f}ùå—ëׯÿÙÏ~¶DÇWeýúõ"=·SÏÒ#Õò·hþ‡¬Å²äÏiùË_þæoþfyNÙÚµkyò  w¾ûND¾ùæ/3¶ÿº©)ú‡¯¾úêoÿöo—ºëÖ­»zõêÃÿÆp; éGªÊ\Y‹e9»X½š%5à±­Y³f©±“vàGk©²ˆØ È4€ Ђ<@ò X¹A^(:wîÜ×_ÍE€ùܾÜPæ¼x›ϸä…B¡¦¦¦þçnjjúË_þ²äÇûò·%ÿç¿©NÛ¢þÛÅ*ÿ/ö·ìÿ¥ä/þ›Êß+ÓíË•öcï_h;n/ûA³¼ÿ¸XòÖÃ*]}ûTGÿñС¼þð~ÿñ•Øÿëo¾\x=ÿtèPÝõE½}/¤ÎûeþãB‰ý¿^øòÙùúÀBäÖå÷* vn}ùå—_~yËÖÝE5ç†oGD"·.6üƒ X»ÏX4Åû÷ÿwùöÛoïܹ³´Çûÿn^øïíãêž¾ÉõßÊÿ›+þ%ÿë—¿û§ÿV^ÿ×ÿT’üŸøË `ÅQˆˆ.·Ë‰–š­ë~°¶üäû?Êì¦ß+ÿúo”ï¥ùɆ­;~¾: ¹ýYe~ùyßý'®ðø•k¯|üÞ+¯›®œ¿¶éäÖÆuº²+.ÈûÿÙ»ÿ ¶Î;ÑÿŸøÇÑ$‘êTÄád„7#²Ñïn˜8@}Áîb»rcì»Æž»).fïbî ¦3ÀLA3k¶˜6˜&”dìu ßš¶-¬Sg ñ Þ»(³A“1š$R£µ+ÅŽŽíøþÁï͹ï×ìdkqÎsžçÑù<眞sÎÔ,žV«ýñü­o}kù®€/¼ò?þç»_ŠˆlšòñWö·Î]òÄ {cï‰þGÇO*Ú?¼¿ãvhkÍÖžlQ´œWW?—·ñ­ÑÛ¶)|)£îtoö£t6ÿ×:šÅ‹xêGÿô“g·?¡ø.|ðö/-¿üÀýÞ”ìÞjZ[‰¼ÙY¼Í›7/ç•­™eÿ¼ëúWVÿìÉOÕÏídÛóÑ£ó(”mÛ·m¬ùðsuÇ\žX{4Ûž=Õ"k$—7‡¯úKÒº½x×…ÖösC_nܺý¹âv<¤Èè|è_µ~8|åºÜ·õÉÌ^È|tlþÚõ/ϽTÚ|vèÊÆéŸO”ùÉ;/¾ô–}øÊõMÑßËzþùï¦Ç ¼z_Ô“Y{¯Ï]97ºp%C)sú2—Ïÿô­]ÿü‹ïoQ??ûÒ‹Í熮\߸ټëù|.öÕj>€`¾xÃò/n‘ˆœj+ß®»ÞúÛ§vìxô×|°V[³†ž‘·âY<å-=ôÐC›§]$]¿üÅÕ›Ø8öÏlÞxýâå«ìÒî°omz`êÿýËÿ>³´r4Ûž=ÕRòøè #¿[íçåÍr}¸õ¥Ê:ñÏÿ||‡œ{ñ¥¿õ“WÊ_Ü’YXöó²ã‹S» IDAT™ ¶T·Ž?ªôê‡/6_ÞþÓ²²ã™›?iùYÕÙËÓŠ»ø»ªŠÖ¯bŸ/û_??‘¹Ùñriõû—Eärÿ/J_¶?°·°¬ì§;®·¿øáÕÙ¹¬y6:g%C)s¡eÔ -U/~xßÞ²ŸŸxÞ|ùÝê_Ù¿Z¥æw—ùßgf\UÝFa_œ}ãå©’¢ñ,žˆÈ¥ß•[&²xŠV³ÚM^C3òÞ~ûíÑ,žˆ8p`²xA/9¯«rßý“¹=åþ"_î´úúúÜÜ܉ÿý÷ÿýÀ/ùË¥¥ÙöìÉÚó?Ìý_DF~wüø÷º^ù»ž–wõ½Ÿzoê[þò™÷‹ˆ<”õÓÌØDÊÌŠ~·åÂeyú~¹?6ë…];vpWùûÿ~@D¦^U\úr©…m=øÆGg}úà_ùè‡k¨Ék(‘·k×®ááaŸÏ'"GÕét«R“¹úÕäµúÕun«°|GÑ,Þm•ué¬õÄïü£ÿ[yüŸÊWáæÚY/»ØøÀ"×EdSô¶ûÆX›î¬<ôô®Ÿ8ξ38ä²ÛWåɉõ¶=ýÐØ «l{rÛÆ³¾Te¼Ü«>¹ru¸*gÿ”-o¾ð•ú€ãËÑÏM_oVçÙè•T¿\¸Ì…—Q¢3wm®8ù“磟ŒrûöíOÆlQDd5šÜíWUKž.ÖP"ïÁ¾ê¯\·Öº~óæÍ?þñ§æò®^]ñ×LÜ›õ½û>|é•÷?ùüÂû¯Ö¼'Û³ž|€°°]:·v²x×/_údš ƒ¾Úiã›ï»:tÎ~áâåÏíïÔüâë×/~yüuïÕÔ¼cÿä“þwjªõ»wl™\Qy43sëЋå¿:kÿdðýæêêö DoVdËÓ™æëïUU¿ÕÿÉ'öw^¬9{e‘C(e.¸ÌFùâlË/^úý“ ƒýï¶÷_Ù´mó}«Ò|¡P?9ûÛ³ÿq)ø¾ø³µû޽="õÿôýUÏã­¥[k'Œæò^~ùe¿ßÿõ×_߸qcÅ«pÌóå/¼ôâ+ÿãê}QO¾PùBìýìÇÖäfddtâò˜‹wýO/WüiÚ'÷mÿù¯ŸŸ{a%æ¹vU¿tò¾»qsôŽƒÅÇï{±æåêßÇTFËÆÍ{Žg\nýÕÏ^½º)êÉW¾?}~(³¼L~õÒ+Uï]ݸ)zGaùUDä'*ÕÕZó³–û¢¶g|÷C!n´zG&…Pæ‚ËÜû|qƯ^zµêg×eã¦èí/”?ÿ¨¢È*4Àü”ïüà©‘·ßsðjé¯NýCÔ;UÿÜß®{Ÿî¹uëÖ‚ }öÙg›6mZ¿~ý6ðùçŸÿÍßüÍVüòË/ÛÛÛÓÓÓ·lÙÊòúÓŸ¾ûÝïnذÝÀÚwãúu¹vmæŒãÑ'³~ÿïÒDäñÇ¥¨À…7N”ŸÛ^^õì’²xçÏŸì±Ç¦~òñÇ3œëKª©—9üq—W—Îÿö“Èïoß*_œ{ãׯ¾qöü°_D´QïxöG?yvûÖ¯·f_d…èæÍ›W®\yøá‡çYfí^§ÎËc×€ùi¶=k}åYúnýÝbëöƒåÛ®ÑZ®ã‹Ö>y@ ‘„y@ ‘„y@X‰DÞ7ß|CGÀbݼys¹7¡ª*ý ár‘µa¹pß}÷]¹råÛßþ6ß%Lõ§ÿó~÷¯]ÁþºiÓ¦?ÿùÏ[·n]Ö:\ºtiÓ¦M|î²KªÕ²ÜYË>#ï[ßúÖ_þò—Ë—/߸qƒ B<älÙ²åâÅ‹n·{™~ÏQUÕív_¼xqË–-|î²Kª•·2Y÷ܺukÁ…>ûì³M›6­_¿~iÛ¸yó¦ßï¿zõê²Þcû—¿ü…ýÀ]ã±Ç»qãÆ¥K—þò—¿,Ç=¶ëׯÿÖ·¾õàƒnØ0sjöÇLÿ÷Kª¾Æ™ç"+D7oÞ¼råÊÃ?<Ï2+‘È0Py¼µ$ò€0@"$òÀâ¹[ì?9˜òI`¸³*/sgòÎÌ#åÕ©ÆH÷‘‡šÝ"âho^±ÍΪFû‘‡ÚÝkíKZBŸLYeyµ‚ß×bw’UÙ“CC",’o¨ÝÚèT§}ÔgÉ·ØôÙ•5•9»%¿¢×·²uòö57¶O¯ÓÊQL»÷e˜´kí{ZBŸLYeyµ*ßW(]õ=y> T¡S‡¶yDDôS>öõ7÷¨‰Õ%Y :sÙÀ3…Ͷ‘¤Ý%½¢‹ÉÊ‹¡Qwƒµ½'3#„NcÌ®ijjªË5Ný4àêsŠ)Õ¬]Æ”jRœ½®7%úºóvéè,?´çÐéaß`ë‰#™;“““3óªÚÇoÔ¿³19yçþc§úFDDÜí‡vi+i¤ýÈ”‰ÈpóþÃ-ÕQ±wOÕ``Φդ7oç‘ÖÞæã‡ö$'ï9TÞ=<Ü=ºÂžCUÝã7“ú†ÚËGk—¼çЉæAŸˆÈHï‰=;wénÏÛ™Y5à“‘Î±»PC)9X[B«U³›<£OænÎô/åƒi«ÌhT_{UÞþÉÉ{MÞo«áÎ̼“ÝÝå™ûO ͺu®íάÛjì$ân=”œ|¬oz…CÚ“W‰<°šˆÈ¨¨(£aÚ-—ª×åW ze쟊ޠ¨¯Öʪ«ÑÒ,» vDÜíÅ…þø¢š†ºêlƒÝš_Ú="ª/¶Ø´Ye5uÕE±Þ¶RKß·6Fe754(æ²7ß=#¡” :ëë‡w—54U¦¨=‡6k³«›Jâ½]ÖÆÁ€ˆk ­vCvYM]Me¶Ñ^_Ú8‰H**0Û­µ}>é¶ÖºK ât‹+yK]w®N›Ö'š Í™þ¥ü—i«L¯X£µ7*§º©©2Mz,V›ODÖüŠ~}ve]MIª·ÖÒã£fsn7*è†Vj'шhMûö¥fl<Ä=y•pk-¸]ªªŠV;™ÛS´ŠÈ\ÙU›U]ž)"¡æFWlÙ™¼ˆD›Ê†ä·ÚGR½.¯b.HKŠ‹1 ©ƒB ƲAŠˆHH%(ñ©Ñ:‰ÎÊ0v´Æ–ä&EkĘ•RÛãôª"Ñ&ä”d¤íŽÑ‰ˆIén.ôŒ6(bwIAûa‹å”Éîˆ/9“ [tÉóXêºs6yjŸmδ/e¢³·`Ì)ÉNˆ‰ÊÎ1·Õy%UµÕ÷HZuYVœF$¦¤dà™bÇìõ‚lWtC+´“ˆèⲎÅ-yO^$òÀíREüþÉ|‡êWçNÒèccÇ­çw:¼~gñÞä)5 ù%Õœn(,}&Óœ˜˜”šš’©Y\e4¡” èÝXÝEÑGë5 +%*5]´w¶ 8úûí~I_72£$·ýp­=¾ìL’nñ%Ï×K\wá&ÏÓœ)_Jpzóøk/eô› xú\ª1Û4¶!)É(³yóm7è¶V`'¹í=yuÈ·KѵªkbΘê÷ªŠÁ0û…§Š¡Œg\T}zuM¶q2M¢h#E$îØk¿Ï°Ùz{»k ë­‰eMU©Ó‹QUu¾7êæ*a±o+é«Ê/îQâÓv§fde´VLfwþa¯ˆêòR#n3ƒ´@[B´`“çiÎÔ/%è¬(Ê’:_7ÝÖJì$·¹'¯ž‘n—Ƙ`g·côAeW·C5%çÍühM&­×éÕFŽÒ{Û­µ=Þ€Œô>ÙìÐÆ¥f+?}¦.]±5ÛGD¦&f|®Ï<%-a1|öÆ.ZMÃÉãÙ»¢ Š2+ª¯èÒ,Jó·Y:ÜKê¯Û¢›0³`wó¡ääääc}‘ÀÀ‰ÉSí̽æÌñhÍí³&ÎÞ,[ŒÙêÍÈsw5ÛEĘ[y<)R#"šÈÔ¢Ê}µ¿Ñ62~?]æÉÞΓyûú¨cÚ|Ú‘¾ÓÇ÷ïLÞ™™w²»óøÎää=僙>ív¼„îÖò#™ÉÉÉ{ŽTuŽÝº;}v®»÷ôñC£Ó‚÷:~ºoDD†›m󊈫þÀØrw÷Écû÷$''ïÌÌ«jš˜§;Ò{êØþÉÉ{Ž”w¸ÔÅ÷…Æ”dRDÄïöO™û«úýªˆ(Ú±Ó—˜ì²Ê’’’“""âj¯Ê«Í‘Í}cógÌIkèhçÌèÒ¡€Œ 4Ÿ8’¹s¼áã?9m)°ÚFúÆ£ugæ‘)w¤Ïùù|ápÛâ¸`ég sDY°x_ ú‚ Áƹ?Ÿç¼À¢¢»=/9999óä`@C§ö''''jŒ¸OµŸÌËÜ™¼3óHùD\Îu’?qN,–ƒÅ>t`™ƒ|¾#f°ã»ˆˆêîŸþÓ-ÛU96V-‘çsöºDĘ•5ù¡&:#Å "®nçx8z{*,úÚÃÍ…Å-ýU«×z:*,ýó…©·£¢¶ß¯("~g—ÅÒ5k~üpkiiK¿K5˜Ì&ƒßÕßR\Ú9"†Ä‚ÜXED´‰%YFŒt—®è°ûõ±‰ñ¿£Ëz´°Ý-"ÁSGKÛìUkÔ{{jk‹ïŒ€³×©Šˆ>Z?å— )Õ,"®úû2óNœ<ÝÞíTbwïÞ­“ÀÐéü£Ö.‡GLf³Þë´ÕõžÛ‰.½þñÉ£…õ6§ß`6TWKqáé¡€m)°Nü‹‹[ú]bŒ5ëýN[}ai«{žÏçq›â¸`ɿ޲`ñ>oô"‚ó<¯°È´’\£ˆ·£¶k°§vô”²}Qã‘ëj³vù±f­×Ùc=ZÜ=²À9í•›;fC9=à€,Ÿ9˜ÁŽï£½îÍßœ>ýú™"“ˆ¿§¾g$´ viöÈk^SAÓk§O¿ÞTdñtµ:ÁZ ¬º€«×)"†ô¢²S§›ŠÒâãõ#Þ@ÐÏçKÜ^D‡8nX² Q,Þ狾`CD°q`¡ãàçf^ÊÝ5å9ø‡ÚÝ"š¨}e "k¡Å®Š>½,wêyÆÜ††S'O7U'jEìõ]ÃóžÓîþ׿ŒÙPN8 ËãÁ˜ÁŽïãôé£ùeñЍöƙῠWå@øYµgäiGŸTë÷úE¦ýÃ~­vü™ÚÄœ´˜È”•§Ï©Šèw›4"™’m¶–ϸëccõ""“^Ä¥ÊÌÙ{º¸ã•EÝíõÅGœ§'Èä¾€§Ï%"ž–ügZ&+âôø\}NY¨‘¨”,S­Åb'¨~¯w¬™¦”Ü’¢YŒˆË*ÿMVy`dÈa·ww¶wõ»\]KÒ)“Sѧd˜4""‘‰Y&«Åép2Ì wýX—ºDÄ)"™ñ›?fˆˆúêçli@¢ø5«LcÚ¨í·yZ ŸiÑc3r R£5"A>~u}»Ú¸`é‚EYÐq °Ø¡#Ðd2>ÄÒy€YgãÃijïãèi¾&:§,½+¿Ã+¢M)É™zšiHLŒÒˆˆÎœa›ÝÓçñeG=§ 8ƒÄlÐá‚:°Ü1®=b.tã—¸ñY±ÒßïêsM ÿe¹*ÂΪ%òtÆ$£8\®iïw uöxDÄ”dÒŒ¿¢õΛ€ªª"¢(Êøø¶^‹ã¨:\ØåUŒ‰éEY#Í–6×K0¦ÜÊ\Óä(¥7+j÷’·l8Ø4ú²‹¹ ´w9üZsZF\Dt\jt\jzjù3…=~×à•¹aíÜc¬Kª:_!³ZJk@DjÕ›æ®ööî›ÝÞÕbïêè.kªJ òybЂn7¢C7,ÃÑ9Ø8 ]ìÐQ¢{o°ã Ÿ¯XÊ%~zuÓ\ÂWÕñ“ÑY'¥ªÑL¯ÕùÎiƒŸ»ê‚6p@–9ÆÝ·}­,Ë9Unit³ËO½þ‡wêöDüö^O ØçÁÃá6#:ÄqÀ?:‹÷y¢/È*ÁŽw:ŽƒÀJù`}E—_D«ˆßf±N{Ô³Ç6zŽ;v–oL0ÎwskИ]h¸à€¬¡ãûø%ðdøÛEÄ0#üWãªX{6¬Þ¦#v—•ôæ[lζâm“ÒÊJ’æ….>'M[Øåi9zÀf—Ë{;ÕÐh£ô"~§õè‘n½×>åL]£DhE¼žÖÚSÆ¢cIÙæ«£åh¾3^ïµ÷;ýJlQ¶N"sÒ´…]ÎÚÃÚo»2Ó;(±`Ÿ1¿ÍÕQ¼·Ç`Ô«—W}zA¢ÑlÚg°µxÚòØc ~»Ã#¢O+H‹}œIiñø»ò÷öëÅë ~ò¡‹ÍIÓv¹jîï6‰ÓáQŘ’eÔDi)°ê´ZO­§ÇÖk6¨®~ˆbN2h´þ¹?%h8DÝVD‡\p@–5ÆýKºúCÚÁƒ×å þ+U¬=÷ܺukÁ…>ûì³M›6­_¿~­Ôzd°ÏáUõæøÑ×`tyÆâÔ§7œ™ëñÖ¾ÀЩGۼƂ3¯e‘=üºyóæ•+W~øáy–Ù–-óÛkKë]bH<˜1ÔZï1¤ì6’ÅÀÝ*<yQÙ5Õb­oío±ÚDÑ›æäÄÇÀ]+y@ ‘„y@ ‘„y@ ‘„y@ ‘„ ˽ÇC/௄Á`X¦’™‘„eŸ‘·|9Hà¯3ò€0@"$ò€0@"$ò€0@"$ò€0°.À¨7n\¼xñÚµkªª.GùŠ¢Ü{ï½[¶lÙ°¬Ô¢Ñe¹qãÆ§Ÿ~ºuëV£Ñ¨(ÊrlBUÕK—.}úé§<ò¹¼Å¢¿ "rñâÅ­[·nÙ²eù6¡(ÊÖ­['¶EŸ/ ÏÈ€ˆˆßX =øàƒ×®]£Ãk $òÜ­GöŸ Lùd¤ïô‰#ûw&'ïÌäñuç%Ï´óÄ@`fiáΪ¼ÌÉ;3”wæÜb(Ë«€•7ט°p,OqV6 IDATßPÇyŠ VÐV¸»Oæíß™œœ¼çÐñÓ}#‹Ú“œ¼3óHyûœcR`èTæ´Æë[Ì7ØzâОäääûêu/ª‡ed ùD^æÎää=GÊÛ‡ A€/t 1ÜzdçþÓËZ7” ]LoÌ\u¡Ág¾:wE€‡zæ,Žo ½¹“ÝëntóæÍõëׯÀ†EY¦gðÝÝV;‘çj·6:ÕéÀââ§)»²®®2ÛÐo-´ôúDt±EÕSTÄjs’Q3£¸>K¾Å¦Ï®¬©Ì1Ø-ù½³ÏÄCY&Xݬ¼¹Ç„byVü†6†ÌSl°j„¶z`¸±°¢KRJjêj b=-Å¥íîPGžÀÐéüâ6bI]]uŽÉiÍ/îžã"Âëòk‹*ÇXS`ÖˆˆŒtWÖºb jêjJâým¥ÅÍÃ!÷p`¸¹°°Ñk.¨®)K×÷[ k9S>ß)ÄpkEm°‡`놤‹ë‰‰Ÿùê Üê!˜#8°XÞ¾æÆvŽ!ÀŠ[Ågä†N>ÚæÑO=¡ìiu6Ȉ‘˜’’gŠm#I»#¢&§vºÛ†Ü†Ý3&{úú›{ÔÄê’¬ˆ¹là™ÂfÛHÒô¥BY&Xݬ¼`c‚,–ƒÄo(cȧ˜RͺÑòM©&ÅÙë ,z™`u°ò‚ Ácyáø 6†Ì3D„24Í;ÂhÍ)©fíØbZ½"sL"Ÿ»æ~—K5˜ãëLŠ«Ïåq·»'àò+ƒvf‘ªªŠ¢»H×(ZEQô£ÿšX7xwÛý¦Œø±ë ]‰ÓU\€v 1ÜjiT³K² s·4غ¡éâ{crp˜wð™¿ÎÀÝà¡‚9‚‹5ܼÿp‹GuTìÝS5ðuçí<Ò9ÐY~hÏ¡ÓÃân?´óHûø Ô‘ö#“ÿò ¶ž8’¹39993¯ªÇXK°šo­ÕDDFEˆÏ9í¸¥‰Î;uzò`Ý×ÜåÑÆ›§þ(j®µ› Š¢gM¨W½.¿bÐÿ®¬è ŠêôúE4‹[&XݬÂ@dLPAcyø >†Ì3D,<4-´zUùغ#C¶Æ¯1+62´QQÑ*âõx'® <UT_D'ZSƾ}ŠatÃ^Um.Ì,vxƒ9%§¤`w”F$2>Ã\ÛØØ“Q¶Ûàínî7æ–¤Œž×O¬;O{­¿«üH³ÍéךsJŠ2¢uì’ Àç:…p·ZÕìº}F{çœõ ºnA:ÏvƒõÆÔ:ø,Tgà® ðPÁÁEŠÊnjò>jÏ=s:5B|Q]–fsFAAâ<¿¹Û‹ •}%5%z¿½ÕjÍ/Õž9™Awá’È[€o¨ÓZjéQS*sc¦­}ýõ’V?G°«ª*Z­vÚÁSü‹_ÀÚF–ËóŒ!! A†¦V V=“ßå1î«Kõ§ñˆøìX©¨­ï3æÆ*Î.K­Sdì]\Ö±8ñ¸¼¢Š’ZT] õv7Z,ù^홪$Df•äv¶ÞeÑÆF©êè“ëía¿¨Nk{JQIµQu¶Z­ùý™ª$δ@€ÏZÝÝZÑèϮۥñÚe‘›^8H—Ð3|ŽÁgá:wU€/tæ,ÚØrâù ª6«º<+RD$È“$Cͮز3y :‰6• Èoµ¤’Ée&òFNW”¶Ø%ö`MY^ÜÔ°v÷4ÚõYsÿ§(Šøý“G\Õ¯NWB_ÀÚ–Ë3Ç_ï±gJíªˆhkÞ¬2Í[ììj,juј š²\öÖZkaiô™S»C:i‰H-«,.->Ð&"†Ä}ñÚ6¯vFS£ö5¼³O§mUŒIq=SÚØ3’”!½åùµþ”‚ê¬X­ßÑnµÖךß<§ ¡‡E1¬,ψ‘8“2öä δ@€O_ÝÝ^ÑèO¯Ù¥ ^³ -Y8HïÀ©Ë¬ÁG ¡ÎÀÝà³£@áÜaúØØ0ïw:¼~gñÞä)Ÿ†üB"X”µ˜Èé>q¸Â¦M+k*Jy‚é¶µ: ‰‘sŸ%ëZÕåû±JT¿WõĉP–°öÇ„%Æò¬1D_ÖtFQ´zHðbç¬Fˆ«ÜCNÕ¥ÓEFé"£Š”[a»Ý·;5´û\"Žýæ¹>·_‰ŒPûŽ?ÓeœÕRnJQ:S‚AZÝ~±7öHZ]IVŒFD¢M•ÃýGm}‰‹ ¥‡õŠ¢›xòŽ1n´LáL ø´Õž>§ßå8º«e|³-‡“ÛkÞ©šrÁ¬E#] é휺|Rô!Ô¸;<è!˜#8pg)J„2÷ADx²¤*¢O¯®É6Nf´m$}î|çÊ{{lfä÷O6Víx^YNëÖÞ>Ðk±ôsšN¤Îþ™ØmkwwÉã‰Æ˜`g·côöW·C5Í|7}(ËXûcÂÒbyŽ1D9*B§™§Ø`CSh«{mù…OóUU¿*J¨jFºO–Ÿðit‘ñ9ÚbN5MoéHï‰CyÍåû\ÑGkE•ÏãVE´‘Jˆ=œdT]}ãOòŸ( À§¯®154i¨Þg}ZeCC‘YÊéG(Az;§.AŸê ÜôÌXV“Ù;ŸkÀ3ú¿´&“ÖëôjÇ‚Oïm·ÖöxyßE¸»ð†õƒGOýÛG}ôÑGÿvêÑóµo_ S–ך›‘ç³·ö«ÆƒOïX´‹¢7ÇÆDhDdÄÑíÒšgLØõ ´6ö*¹Q]|Nš¶ÐZÛ]–mô´VtIJubÄ–a¿Öþ˜4–ç;¡žk ™.H±óM ¯.ñÆÚZKmtÁn“âío¶ö+)Õ±!>vZk{Ei…R” 8š-6mzC¼nÆðgJÒ;-¥mQ–Yñö7[lÚôºÄÑ$fÇÖZ*,ÑEY±Z¿£ÕÚ¡&VŽ^M¬«Ö´ˆÄÜÄÚâRKTQ–Iµ7ZlÚ´šD~Ì>»VQQã•S¢QôÆè¨ˆÐ6-!iÔâ{crÝ ƒFB¨3pWx¨‡`ŽàÀâéDõ{\#¾˜ˆY;¿Aqµ6vš²Íbo´ÚU1ˆˆhb²³‡-…URað÷6×¶8ë \~‡©À¹‚§}0þ¯cÿõ‰‰¿¼·ï‰_Šˆ?ßÝД;#žŠJÒJ­–Â.­11§¤È_Ú<ú‡¨ìš±Xk‹»üŠÞœVVSÃή4Ûkß?•ûô±ósÿùq²xËçž[·n-¸ÐgŸ}¶iÓ¦õë×Ó_w«?þøñÇ_x¹À¹Ü§—ïœìxî•}¯<×6þßôãÿ.Ÿz¿>”DÞùóç{ì1ú|ÂÍ›7¯\¹òðÃϳÌ:º ‹§QE£Lù/]²ÌHäa€DHäa€D–  ªj@ò_ºd™m  °xÿ~<ý¸ˆLý/–3ò°šGÿþ‘sþ%ò?úÿxyí²aFåÁå¿ý¨œ~XiÌȉ< ȉ< ȉ< È€ˆÈúõëoÞ¼¹RUUQ:|±Hä@DD«ÕþùÏ^ ]ºtéÞ{ï¥Ã‹DDD¶lÙrñâE·Û­ªê2mBUU·Û}ñâÅ-[¶Ðድ.€ˆlذá‘G¹xñâ¥K—–)—§(ʽ÷ÞûÈ#lØ@Vjñ_]€Q6lغu+ý°6qk-Häa€DHäa€DHäa€DHäa€DHäa€DHäa€DHäa€DHäa€DHäa€DHäa€DHäa€DHäa€DHäa€DHäa€DHäa€DHäa€DHäa€DHäa€DHäa€DHäa€DHäa€DBMäÝsÏ=t°LÖ­[ SR"OQ”¯¿þšÞ–C ذaÃüË„”ÈÓëõ_ýõµk×¾ù溸S¾ùæ›k×®}ýõ×z½~þ%ï¹uëV(%Þ¸qÃëõÞ¸qƒ\p§¬[·nÆ z½~Áy¡&ò¬"ÞZ „y@ ‘„y@ ‘„y@ ‘„y@ ‘„y@ ‘„ ¡/zãÆÿüÏÿ¼~ýú7ß|CÇwĺuë6nÜøío{Æù’u÷ܺu+”ânܸáñx4ͺuLâ7oªªj0æÉ党Ȼxñâºuë6lذnݺ{Îîˆ[·nݼyóúõë"²eË–`‹…zk­ªª:nýúõÌÈî¬ÑœÛµk׿[&ôâî¹ç²xÀ·nݺõë×ÏÿjŠÅ%òèS`9,˜|c†Häa€DHäa€DHäa€DHäa€DHäa€DHäa€DHäa€DHäa€DHäa€DHäa€DHäa€DHäa€DHäa€DHäa€DHäa€DHäa€DHäa`]€erãÆ‹/^»vMUÕeÚ„¢(÷Þ{ï–-[6l`Ow9ÒX7nÜøôÓO·nÝj4EY¦­¨ªzéÒ¥O?ýô‘G!—înä>°,.^¼¸uëÖ-[¶,ëVEÙºuëÄæèvpãyX~¿?""be¶õàƒ^»v>w·›‘çn=t Ö5÷ß´z£Á›•“»;F·”²CíK£ÍéU›ò¢4+О@ß±]Åv1W¾s:I·rßW`àÄÞB›j*yó7»#ÖòŽuóæÍõëׯ̶EY¾Çð¬kbFžßëröwXò÷9=è[ôÚk¡µÇéUE1"D× €»ÏJ?#ÏÛôzvÔ´>·ÓÖh±t¹ÄÙRќڔ½˜d\ÀÕÛïѦTŸ)OÐ…G¯Í«3—½s:UÇN€…­y]dÌîÕEfOO·g‘ë«~UDô1FRb¸k­™—]DÆï6‰ˆx]Þ_ 0݆5SeôÿiõÚi ¶76¶Úì.¯*ŠÖ`JÌÈÎÞ—4ú>‹À`Õ3ù]~qÕH®ý¾†3Ç¢5¾Þ¼½¥ÃÁ¦¦±ÕZj;Þ©·±ÎWæ¸Àpoc}³ÍátyUÑê¦øŒœÜô¸ˆÙwýܽÖú»Ë¯ŠVoŠMËÉÍI ú±—dˆˆˆ£bor…‹Î¼–9ögßPwccsO¿Ó«Š(zclbVNNF̼ïµ µæ×:T1åÖÕeÇhBéºÉªèÓÎ×Û›kë[mNïx r’"5Ké ,53#o¤¿Û)"Š9É0™ijÍ;oíèwyUÕïqtÕ—>\Õ;""¢ÑÇ¥$Æ›õ""bˆOLLŒÑNÉ-©®®Ò£ï”í,T¦ˆˆøúª.m±9\^UEü^—½«¶ð@a»{FµÕÁÆü¥-ý.UkÐ+â÷:m-¥GK»G‚6TŸ’oÖŠˆ(¦øÄÄ”DãxêÒÝ}âðÑŠ6›s´j¢z]ýÖüy­CAg)†[‹G³xëj&³x!5s¼—:Ž(®ïqú§4ápiçÈâ{Ëf $ò>÷`gU±Å.¢ÄL¼°Â7`-®u¨bH,¨{ó÷üãÿøû7k õ"ž®ÒÒv·ˆDî>^UY¯cVÉɪªã©‘“{º,Ö~Åœ^T]×ÐT™¨ ­L‘À€µ¢Ë+bL¯lúýÿø‡?üñ÷g*Ó "ª£¶v`zJÍÙÒæ2¬yóxëõ·þðNCA¬"¢ö×6K½i¢³Ë«*sc1e—UU•çŶx¸µ´ÂæÑÆÕí÷ï4”¥n¶¸vp®òÃí¥Gkíª÷ÕÔäÅL<$0¤fŽñöTÔ:ŒûªÇšðû†¢xEDí¯omÂbzcéûÀç^)ÏýáŽ'žxâ‰'¶ïx¶ êó—"/ÎýëùK„)ÀÊ'ò<õ‡“gص÷@¾¥Ë©˜÷U6UîžHĹ»j»¼¢ÄÕTeÅŒÞ鉈˪ª+2‹ˆ£¾~á$’ßo.j8}<#!&:*Bj™W¯Ý/¢ÄŒß‡ª‰LÊ-J4hµZ¿Ë;}Ú”Ê꼸±[_uÑY%¹Fñ:½‹ì˜À@c£SDÌE 'Çê¦ÑE§žh¨LÔŠx;êm³&ù¹;+ò­ýªÓkêŽÅMyÕÇâºNUËjŽ%Œ5AQT0Ú*‹í%¹ô¯åûÒýòíóîÑ»¤Uÿðÿ¿%7m_Qyî¾c¥¿þ„‡&¬¡[kEu9\þ‰ºûÛ"ÚÄœ´ÈéËE¦å&*"~Gß‚¯·URr§­Z™%BÕÕçôM.¢K¨zýÝwß:•1}U}Jvì´·åj ú¥´>àìî÷‹(‰9)Ó7 ‹ÏIÓ‹ˆ£sjmDõtŸ8j±ùEŒÕÇã¦Ua‘]§MÉŽŸ¶¾Þ`˜üÇ¢zc) ÿ¿ÖœÒ·Ý"Oý¨²±ãßÞÿý®æ“ÿðT„ˆû½·ÿ]%DF­ôË. ¹M¯gGMû(02lï©·ÔÚmÅ¥QgNgDŠHÀÓ翽¶0O™Q†ß¥ŠˆßëˆÌû¶c‚qêßC-3*1ËT_ëô´åïí1§¤eìNŠ5ÇDêænOœazeIýâw9ü"bL2Í܎ƘdVÚlªË镉ێõ…þÑ$—«µu0ýØä+.Ýu†Ã|½¸˜ÞX¼/Þ°ü‹[$â§ÚÊ·ªùÛ§vìxô×|@`Òxk­&"*!«¬lè™Â.¿£Ý>’!¢zG_Òàu:‚ܽ©úÌó(Úi‰¬ËŒÊª©‹¥Öæñ:zZ=-"¢5%¦eçä¤FÏHa)w¦ÔѪég¼³WDÆ^äëUÝþ)·˜úU1¬ÌpTXíž6K[FCöÄÛhÛu3zi–ÅôÆb}qöOD”§JжO)éÒïÊ-YŸoño@Xt™ºè„Œ¼'O¿þ‡wš*ÆjE¼=֠-Z½^DÄ3ÇÛ#ü—_D´QS¦¦™²²bt"™VrÐ("ŽZk÷ÈR›¢ì ̲vy¢ŠLÞõ©1&™DÄokwÎÈOØ»wïëàbSH!–éîãüð÷!ÕqFdÝ)S‘È»yófWW×~ô£€€€É;ùÓŸþd2™~ðƒÐXÌ|÷ÏëíŸNÇ—_~uãÆ¿þõ¯AAAF£QQ”;^UU»»»ÿú׿>úè£C/Î\Nøõjа°°É®Òȃ¬;b*yW¯^ýÑ~ôÃþp ÊÒh4“š+€;æûï½u9¿>|xÍÚØ®®®    LRùŠ¢‰HOA\NÜMCª©¯Ñȃ¬;b*iß}÷Ýüùó§æ”Íž=›‘'¿pãúuùöÛkƒ–ÿúðážÿp»Ý?þñ'»óæÍûüóϹœ¸Ë†TÓÅÛ ëŽ˜Š»øïÿþïûîãW5`lnÞ¼9kÖ¬É.EQ”ÉxÜ›&uE~ ð$ò?@"ð$ò?@"ð3:‘çr¹Ž;võêU>'I÷Ù’¬ÂÓÝœ¸›ÍÜDžËå:|øðý×>|øÚµk“^^×û¿x³£ÿ¯«_~-ûŤ-I/füêôW*ÀÌÔ}67iïoN¾½/)kZsy—Ogl*·yÌ—Oõâ¯vìøUËÐí.”‘ôÏ¿ïò}?¯íر¿åŽ^¾}Ùçíu.ŸÌHúç“]wÏá÷Ï¥³Gr“7D?ñÄO<±"zSjÁ±¦nˆçÒÙ?4Mï ŠÙ3óŒõdñ¾þúkùî»ïnܸ1¹å}ÓqòÍÊNõ©þ‹š_Ï~½yñ 9w}ðÚëÙE÷¿–þÀŒ£:.qœÜ—$Ê ¢çM[]æüãϳ’Bú_+ܻÍœèõO‡Ðu~¤û¹;³OØn¸ÜçþÝrî߬|6à܉O—G—ÎÓL[ífb"¯O«Õþìg?ûá8y#àŽ#ÿëðµˆÈƒýÓüû³×ŸÌúù3¡ˆ,üçÖ—òª?¾ý ÀL´á@…º7ÑÒ¤N.oÎCA CB>”,z&i§ðžO {²xË_xå¥M+(®Žs'^µ¼zÎöa¿ìÞ´™q‰¼¡Y¼ùóçOfJP|ο=}ý›÷ÿòýÛKÕ¯š;$äÅ…=ó(”!sŠ>þJ~ˆá)€™G²©¸BfH.oß4f¿T¹"ãéŽÊê³m_Ï Z±#ãçÑ+Ò3úµÊ;¯\—ûƒžŒÿùÏãõÎ_»þõÙ7³ËO·]™3pù­}^|ÿõ7ßÜyåúƒ W&¼øâšžôa߯ÝüdÂ3ׇ¯Î°…Ž^I_ö9p˧3~ñû§ÿíWk¨_~óõò³mW®Ï™o~úÅÞúÐt>o.³¼m x¶¸*w…®w¼õØòèèEoœ;7#^[3³Þ‘7åY<å¡?üðÃó ’®_¾tmÎü‡æôþ9ç¡ùs®w]¾F“p‡ýðÁ‡úÿßÛÿ÷ñíG²©¸"3¬çËÇÉé~_Þ×;+ßüøá„¬û·}Ñröõ7?þFDÔ‹GrßjYŸ–ó/9ûân©Ø_Ù÷ªÒk¿^~yÅ/rröÅÏ¿Xñ˂ӗì®ëdA^å7¡/æüŸÉŠŸßúVöþ.‹ÈåÆ_e¿ÕüÐ3i99¿ˆ¾^ýúÇ׆æ²F(tØJú²ÏÑÖQ;* ^ÿøþgÒrþ%ëEóåö¿ÖüÍ4>pwyûÿ¾3hT5]:}좈²<3½/‹'"Ò}2×r+‹§h5Óz¼3kFÞ‰'z²x"òüóÏOAÏëóº*÷?p;·§<0GäâÀVZZšœœ|ë¿·þÏç_}õÕñíJ²é@IÓ†ä“nqœÜ·oe푵S<-ïÚ‡¿ÜöaÿA‰¯þ*þ‘‡~úÈÃñ ?¨è¸,O= „&üüéèèEˆHÈœ³¿ÏûúÖ…öþ•iÏ,RD-|èë_ü²òý¯¢“ú.ÊjGuåWæ~-)ô I»ô‹_~Ðrù©…UüiÎÊɈ_¤ˆ,NK»ô‹_žZÇ ¦’ßø°Ï®Q×¹üÕå9 _ˆ_üHHÖü§¾ž?gäšLÞáw•­ÿóyé?ªrt=Þ%;Ÿ8dé¼ GÎo˜)Ç;³yO?ýtgg§Ëå‘ãÇïÞ½[§ÓMKMæÌQäÚ7·Çvê7×Ex¬Àäõ:=Y¼ í«ûtaÖIwÏ+a¯äNÃõC~ìbÎC‰\‘†Üßw•ÞéÎÊÃO==çbëé÷[ÚZÛš›[¯É“·¶ yêáÞ‹®òdÈœÓ_«Ò·ßk¯\ë,ع¥_Éó;¾QjýzηRÅ ¦’ê×£ïsôu”…ñOÏÏ;ðÒ‹ Ÿ rÅŠO.^ ˆÈt>p·ªÆ=7Â/̬DÞ¼yóvïÞ}øða—Ëõõ×_¿õÖ[?ûÙϦ%—7ç¡ û¯_ºÜ—½»~íòõ9 æßOt˜¬^gâY¼Ü¤}'""¢„½RQœ2 3¾‡ÿ±‹ë"s”9s†|r¹ùµì‚³sþ1:ú©§w¬úýÜ_ ÿƒ9"¢Ìé·@yðé¬Ü¸ Û •H‡/U¡Ða+yG<°xǯ~»¾åã?þøì‘¼Š7ŸLûUÆS2‡0ªòÆÓ”þOÉö=DûxNí‘ ·gG¸N§®ÝwN}<êŸ|êï¾™vêçÏŸ¿{÷n­V+"ÝÝÝo½õVϽ)¦<"gÛzæä©_}Ôv=äɇ™’`2{ñ›Y¼±ú¦¥òÃoVæüŸìã£CCæÏ¹výö+Ý®w|ôUoÿ©vœí¸>ß<ÿö%øþû¯t\~`A‡.ÿÇ›¿ù貪Ì7Ï¿ÞÖo»;®©Ðázö9ú:—›Ëßü}Û‹ŸzfÇ?ç¿ö/OÏùø÷-—§åðFUÞyÜ·^…·<3wM¿|ël¡åœ*¶)lzVð¾xêçÏŸÿ³Ÿý¬.ïÚµ)ÿ™‰BVÞÿñ›G>ºøUÇG¿)úPV$<ùa`ê>;s²x×/w´] £ËëO;Íyhþý×ÚÎ6wt]þªùý¢_}|íúå¯.÷ýÜÇEEï7_¼Øø~Ñþÿ¸ö‰Ñ no¨,Šj{=÷µÓÍ[>*ß¿¿ºã¡…óYðT¼ùú‡ûßxñbóû¯¾2ÆB‡áË>G]gŽ\:]ñ«7O6_ìhiü ºñʃ!óÃà õâé÷NÞíñx\—>?]’ºyï ‡Hð˯¬™Þ<Þ {´ö–ž\Þ[o½åv»¿ûî»7nLyXübîÏß|ýHÞÿºvð“?Ïÿyè´c3²‡q8z&.Ï€¹x×ÿôVÞŸ,¹Å¿¼ñâð++‹wüüéýoøßÌ™¿0:1cßý¯½µÿ?ç/”9ó×ï‹»\ùÚ/síÁà'–ÿóð—à‡ãssäµ7|xm΃ £Ór_X¤ˆÈCÑYùêë¯Uý²âþà ‰üªÍÇB÷G{9$ö9ê:„¾˜÷Ú›¿)øåu™óàÂ?Ï}q‘¢È4>€‘)?»ÜqâCÛ¹ßdŸûMÿþiqéŽÇ¦ûÙ§|ÿý÷¾¬÷å—_>øàƒ³fÍG_}õÕüãqløõ×_WWWoܸqÁ‚¾¬ÿ§?ýéÿñgÏžM³0óݸ~]D¾ývðŒãž7³®Y+"aaa¾ìÊÓq,+÷ìŠÜ‚MãÊâ555ýä'?é¿ä³Ï>ãr À¯‡Tý‡9Ÿ}ö™ëî¦÷.®Y$—Î{ã7ÇN7uºED½é…—6­òy¼5t壛7o^¹rå‘Gñ¶ÂŒ¤õÌË£iÀÈ4!› lâ<ÀÌ ëýu‹ ‰¹+gbïãSf>y€ ‘øy€ ‘øy€˜ŠDÞ}÷Ý÷ßÿýßœk“Y³fݼys²KQUUQÎ6ÌüAÖì)8€ø‡¸råÊ~ô#>KèïOþóÉ?ÔzûW­Vû÷¿ÿ=((hRëÐÝÝ=wî\> wÙjºLê k*fäýð‡?¼zõêåË—oܸA#»œ tuuÙl6UU'£ªªÚl¶®®® ðq¸Ë†TSo Y?øþûï}YïË/¿|ðÁgÍš5¾bnÞ¼yõêUUU'5—wõêUÚ1€»ÆO~ò“7ntuu}ûí·“‘ËSeîܹ ,˜={ðììÏ>ûŒóÀ߇TS<Æa壛7o^¹rå‘Gñ¶Â%òŒ`ÔD¿Z øy€ ‘øy`\l•»¶hóô[âé¬)Ø¿:juü®ÜšNÏÔTÃQ·kõ¶r›ˆ¸.T—OY±CªQ½kõ¶jÛLûÆqNúm2¹5…Ÿ×XÉ´´dÈcçj«.,kW,j°¤XêõIùEù; Í–”¼3®©­“³¡¼¬z`¦ŽbZ·9ΤiŸÓ8ÎI¿M&÷ ¦åóò¥ÐioÉ^Í€1ð´oß]eÑ÷[ìj,?¥FìÏLX¦1ç\x.­¼Þ¹.à9+ºÅ {sPwƒÜ’™‘ÆDcL*:zôèÁdcÿ¥kC»˜b̺žuL1&¥ýŒuÐC‰®º=«wÕ\¨Éݶ~Û¡NWKeÖ®øÕQQQñ{ ªûÔí{²1*jõ–½Å [õ¶Õ»ª½{rTïê÷—ˆt–oÙ^aW[óžY_ÐâvjrfÏê]•gÊ÷m[µ~[n]gg]Ïë·Ôõ=Lêj«Îí©]ÔúmYå-.Ç™¬õ«÷ÕõìÒV½gu|Á—8jzŸBõeÏÞŽÅ·Zy1ô“ágà‡rnÀ&ƒª¡º`Ï–ÕQQë·Ý~ÞÔÓ[ÃÕñ{ÔÕåÆo)nò$êpå®Ût4±Un‹ŠÚÛ0°Â>µäiB"Œ& 088Øhðȥ괺ƒ^éýSÑÕîtÙXµ–YÊe]jê:ƒˆ­:#­Ìž^tøàþ$CsaJvCÄÓVša©×&äÜŸê¬Ê¶4ŒþhcpÒÑ£‰ÅœóîY‹Å—=¨í¥¥ërÍ_¥žÊÛ¾»\›´ÿèáÌpgmaY‹GD<-%i…͆¤œ¢ƒEùIÆæÒì²6H@dzª¹¹°¤Á%ŽºÂkDfêRÝØö<‚ñn;ÜIpN4^gà‡òÿ Ød`ÅÊ ÏïÜôh~¬œ²Ö»DÄs¡0%¯QŸ”°(3ÆYb9å¦fÖìµ ©j$­)nóæàÂ}lÉÓGkÀ ªªhµ·s{ŠV.û¡jöç&Šˆ§­¼ÌšóΞe:YhÊé|>¥²Ùá´:sjläÒ“Ñc7(>Ô 7¤ˆˆø´%<55f¡N&ÄW†f&G.Ôˆ1aUÉ©v§*¢í²™q±ëëDĤԕ§Ù{(`]fjõv‹¥ØÔÜžùÎ2ݘ÷<‚ñn;ì!÷?'^gÀ‡r«CK0îÌLZ œ´Ó\UÚæ”µ¾ô”ÄîÏIXªYœ™yṌ֡Ûy)Wãµ )j$"º¥ {—Ž»%OyàPEÜîÛùÕ­Ÿ¤Ñ‡†ö¾ZÏÝÞêt·g<Õï_ mn‰1'm4¤e?oŽˆˆŒ‰Y±4P3¶Êh|Ùƒ¢7t½uE¿P¯¹u ½{ ŽÙ¨´4×T^h¹ÐÚØØì–ˆ¾mã2“«·—4‡ç¼©ûžG:ãÜvôCápú}(ÞéÍ}?{¡(=Ÿ¬ÇÞ`UI¦Þ‚t¦H£ MäT®×²¦ ‘L¸%OyàPôF­j½5gLu;UÅ`úƒ§Š ôe\TýÆýEIÆÛiE("K÷þö?.Ôן9SW’VZ‘s´ fànTUé—GuÃía¬¿Vàh(HÉ8¥„Ç®‹‰KMˆ«LË»Ýñ¸;"ª½Íé‰ ˜`i”cñѨ‡<ÂáôÿP¼~ÀŠ¢Œë@G:^ËšŠF2Á–<xG¸4Æe&i¯kíyQ™ÇZתš"#f~´&“ÖÙîÔöÐ;« KN9=âh8t ¼U»4&aoî¡wnTêË›"ý3.ëû{öº‡±p5—Õºc‹Ø—´nÙBƒâ¾ò´•æÕêÓcÝU–ã¶q/ŸÅG£ò‡3îÏÜ°Ô Ö3í½oÚsµŸ±Žé4úbòÉlÉS†D¸tá;cµõ…%u-mu%yµ²jgÄÈsà4‹“’Œ­–´‚š†– u‡²³+ÚõfƒF±Ö–æV7´´]8SU^ïÔ› ZÑ е²¬æBgç…êÂÂæaÒA:QÝv«Ãåec¤è Zwk]c›ÍÑÙP™—WïVV§GÄÓV–w\Ùœ¹3.5=Ü^j©s*χcñÎu¡²¸¸ºsÐ_x;äÛçÄÛáx?£ ˆH^%µyy• -- •–ad„r})hò‰×S9ö–$3g]ev–¦¤”¶)ÃîaŒ4KS37jOeï~þùŒ²Î˜üüXc{aöñ¶Îª¼*wlæÎ…ÑE¦§š[K ÏŒqºßèÇ2w{uUUU²Ëáùö9‘á§S¼ŸF’Y”j/ËHI+lXœšlú®Æk¹>4YÄÓ{*ëìw %O‘|ÿý÷¾¬÷å—_>øàƒ³fÍâ²0\ %JzÖÒéÜÓÖPÓ¬„¯[ "âi+~>¥5õÝC1:>£q¹yóæ•+Wyäo+0#À¸.”7,N0ÏŒ—¶Ù+-Ù…Õ-6—£³¡¬ð¸ÛJoò0#ãd;Sl)9ÞlW½)bgzzÜbyã6êŒ<yÀôãÑZàn@"ð$ò?@"ð$ò?@"ð$ò?@"ð$ò?@"ð$ò?@"ð$ò?0y®¶šûvmYµ~Ë®}ê:=^ÖtÔ슊ŠZ_Ðâq‡wvµ±ó4슊Z½ïÂàÛÊ·EEEEímðˆx.d­Žêouü¶¬ò Žaêy¡²`Ï–õ«{ÖÙ“[Ùâ¢ÝâÎ5×¶âø¨¨¨¨¨-åãÙþŽÄÑ ÆI jÜ+ú_¥§>½õ€ÿô(â¹ ã Ÿ–‚õQCm94}·gÀ½A½ã£m•¶;\Üàa2Lw"ÏV“µ}·åxc»Ý-"n{{ãñ¼íÛ Î8†[YÑŒzƒQ¯Œ¼Ï;¸Z_—Û&ë(Z½^¯×*¢:­õ¥iÙÕ¶A—¤â”´’ÚV»[ôƒâ´¶ž*Iy>·\îP§g­9å{u½OÝd…1;jeƽŸi €& м´ú~ ÆÀqÝÔÜÙ;"÷Z3Þìi-ÝQc±Ô;EŒó÷§Fj<¶ºÂ´¼Z{mž%òÝ‘ºA«ë" ~9ú^ïìj“˰ùàïö‹ˆ§¥x{J•½µ²Þ—x«[l-?n1l>xtïbˆ«åPJJ…õTi}ê²u4_LøÆëVOÄ^ÓhK œŽjÜ©`œA 0>úEïì[¨áŽ˜Îf¼i‘g«-ocrþ¾È@ˆhcÒó7DÔÆ²zGßSNñÎÔسe[ñùã&²:íÛ²:juüžu5ûVGE­ÏmñÈÀù®}{¨«Ìݵ~WAM§ÅÚÎÚ·­g>îúmû58D¤³|ûî*§ˆXKŸï]Ïc«;°wËú¨¨¨Õñ{ ªÛnMuœ)Þ»euTÔú]¹Ç­êØÏ…ÆiRDÄms÷›t«ºÝªˆ(ÚÞ^yqRN~ffæN“""âj«.ØÓ[›]Yå ½óMî=О“3è”¶yÄq¡õÀ ˆê=QQQQñZ<âi+Þµ­¼Ó3ÒÈp£¡[7ÿÞ"Å[dÑÁÏCh¤«½·¾IDDµ5w{?`05YÉ`'ò\íg¬"bLXÜ/¡µ0n•AD¬uí}qà<•g9Þjwf§eT4ÚU­^k?žgi)>œÇóJÝŠ"ân¯µXj‡Lûî¬Ìήh´ª“Ùdp[+2²kbˆHMUDD‘š™`Ôˆ£.{{Þñf·>4"Üàn­-ÜVmOKñîìªf»ª5ê§JJZÇ‘Qi?Ó®Šˆ~¡¾ßW:SŒYD¬¥ÛŸŽß“uàPu]»ºnݺȅ:ñ´JÙ]XÛj“Ù¬w¶×—fl÷õ™Û[§ôúgv§•Ö·» f³Aµ6Vd¤jóˆ×#Åݕdz×Õ;Eôq± f±Ö4Žö) ŠîS–Âz·¢q¶ÏΫëMlŒÒD‡ mÅjèY¢U_#tÀÁZúÈ—…A; ï=EÍñXëšUsBhßÄXkUa­ÛjÖ:ÛOîÎè9Ä‘Ÿœ22*­b 5ëÝíõ¥iÙ•¶–”œXß1ŽöÌ4Ã7co5bóöƒÞmäKñ¨·ˆÀt ŒÍL6Š8—Ô¶œ*éyV'gs°f¤;nþ¯üqøˆð¥w£?‚ÿöjï­oêa¯*5Ñ¡¡°loÁdÆiÝ""æÔÌU>F耠½ô‘/ ƒwž*"í5Í.ñXëÝòx"ÆäÇ‹:º?B+Ò\ZÛ)Bù5õL»ˆ6¦ç:z8=6<\ïpz¼.)ƒ1±¾cí˜i¼4co5RóöƒÞm´Kñ(·ˆÀT'v?=ø±MðæœDƒHkaš¥YýÆœäþs2ÂÍÿºÏ;lDøÒ»ÑÁ/#ÈûÕÞ[ßÔG¿±'×®ˆÚ\68¸&!9øj:ß‘§íy«ÛééwÍwwºED´Ú¾7Sj#vÆ.Јô‚ÛÚU}Ä:“FDW%™ ³½§ºõ¡¡zƒI/bUeðì=ÝÒ}ùéuÇ«K3vµ·¶Û½Lîóج"b¯Hy®âvEÚí.kC»ôÌ,ÔˆHðªS‰¥ÝÇ“ º½¯(ÓšV%g¦y1`ÀÒ„Ü_'äzm­ÍÍu5ÕµVk­ÅYljWEô«âL‘ÀˆS¡¥ÝzÁê‰3~ê{Oig‹UD áá=YÃ_ÿ¿8OCé°Gê‘`¾d»‹tÖœ²‹(áëLÑ„®3Ksk{u£#.nì¯_ÔšC1,Ô‹8{"ÌyÁk ðÚ=±ÖY™‘]ïmD~~B°FħØZúh—…Átá ¡ÒÜÜZÓê0[}y¼Þ¾Þ¬9Î$õÍö»k³4G~LcZ¡m¬·W¤=W¡5†FDÄ%§Æ,ÔˆxYî}ð?ѾC7ööÌ4Þš±×@óŒ56= ^ÍîíRlW_L6½Ápëíüбg<¤Y¸3gcmÊq§ˆvUfòâþ÷ÃÜ${½ù÷´{‰¯ÁH ÕëÕ~”&Ý7O•ÆFkƒu@pMJrðÑt&òtÆH£´Z­~ßÁÓVsÊ."¦H“¦7êí›ñ¨ª*"Š¢ôõ/ú=×…‚íiµNű1.=ÁQn©²³Voh›’ó“M·/z³¢Ö»dCâÑž»žãBum«[kŽ[°piÌÂ¥1crŸK;å¶¶\>µï[—Ú{J=ª:ÒN†)Ù‡»JOOÔSiOŸºµ°½¦Ñ·N;‰Å¡ IDATªCÚáÐx,I+i1lÞŸà{„ޱô±_±BÂ•æÆæêÆz»U$´ÿ|<Uõˆhn¡ŠªG~- ¦à]ó…ÚêêºSõÍ͵͵ÇërŽÄxY1Z«wßqçÚ?0m¼6co¦klfj‡4qz»»ùX0“÷îUýªÚw×>äî}èÈ7ÿÞoòuÞz=ú#øyÙ&|‹¥LÊ 0ÓúcÁ±If±–d7ØzJ¢0»Â.¢„ï\5Ò¬ a©QDì§jÚ<"⨯œÈ“çkM½SÄ”ZT°7i•Ñí¥ªˆè fƒˆ¸]ÆÐeË–-3ªígÎ4´»EcXfku}§GDlõÕw.ãî¬)---Ì+ë{µ—ÇÞnu‹ˆ6øá¥&EÄyª¦ç]‚¶úÊv1.3hD£(Šˆ8Ûœq´ž±{?±×7vŠˆØª÷¬ŽŠÚr Mñr¤¸›ôæñúýF»VD¤µºÑáK}Ö‚Þ{‰­&/ã¸SszÑÞÞoœ}ŒÐ;Qú°tßÎu¡q¡Š¨õ¥¥í"¡qòxöúž’z/FÆeFŽ8òk¶ºâ\KY«1)·øwÿùþÁÍwó»ÇÛrïQ3Á¾c<í˜a¼6co5Bóö²‰·[.Ÿ+B¨¥4¯Ö-¢UÄ]o)ðNìaî@Fؓ׈-épõM}#ñÛÁÕ,"†AÁ5É Ïìi-=`]Næ™K}{UÆóU·bs2#G~Á‚.|g¬6­Ö^±ûùz£X­Î‰TC£ Ö‹¸Û wïªÓ;›ûÝÞi”­ˆÓ^YRlLß—d®(l­ØÒ®w67¶»•Ðô$DìŒÕ¦Õ¶—l¾z•x‚"R7Sª¬Ç3ž9e0êU»Õ©Šˆ~cj„ÑlÚl¨¯°W¥<ßjp7·ÚEô±©±½9Œ »»6å™F½8ÞûT]èÎXmZ­µd÷–:“´·ÚU1®J0j‚½)î}ÏÕîçÀ²ÞOÖV¹íùkku³c]¸÷&4((”‘Z—×&ê•ëLaÏ/×håLIVƒˆˆ>25ÁÇU&Xú  ÃÀöÎÉk¬wªCòx"öª”çêŠÓêTE OŽ âÈŸiµöÆSõ§NÕ×„š ªµÑ.¢˜# ­{øå¢xšà õ>÷P|h˜!ܵÏ7Þž`J>xÀì¥{ ´š··M¼Z ·K1É<ÌDÎãiÏ×÷»ŸÑšÓ‹r åyÇ"¡™E gR²ëOYJÞÙ·x¤;ï¼EŠ×`¤?‚¿GPêØ“ý‚«Ñ¨µ[íª(ᩃƒ+xÊ“À-÷Msùë ŽN 5êÑLá3ÍŠõ%]š¥é3cMzÅiuêW¥§‡NäÙÚà™©áEœV«‘žªˆ¸›ë¬‘àU;Wq66^p{$0nÿáôU&­µ±¾Ñª ݘyp\`Oeçl4§Õ©„'&Þ¹Zjï=x0sc¨Q¯Ú­V§h ¡±éE‡÷-Õ‰fážÃ‡Óc͵½¹Õ©7E$ï?œµT#"¢[–ž³Ù¬QÝŠisz²÷úè–fÝŸnTœ­­vÅž¼¿hO°F¼)îš<^ý)»ˆ˜ãÌ·óJáë "ÒZÝì© Š‘Z¯÷&êÚÛ…:[ë{œjq|ŒÐ —>èÂ0dç:s\¸"">ð"eLÌL4‰Ý©êM«Òæ÷\ˆ#¦[–S”¹1Ô ÖæÆÆV§Þ´*µ('&Àëò‘.¼ë;‚ÇÑþiNå9o³Ûݪ×fì5 ¼7o¯›x 4.Åðßðq:­öË_VåUÙE ›SW-ŒLÞiqÏ+móŒt2ÒàkøˆðŒôGðër+ ""†ØÄU§Õî5¸¦>9ôùÁ÷ßïËz_~ùåƒ>8kÖ¬™RqGKC«SÕ›Ã{Þ•_³ë9K»~ãáw†{«Ü‡¶l¯°‡æ¼_Ó“õ´?¿»ÊiL}ç· Œ ÀÔàîV7oÞ¼råÊ#<âm…Ùþzdîæ’ìR«"“"Ú*KÛE «ÖÉ☮ å%¥•µvQÂÂy@0õü6‘œT´_ K++ ëEÑ›"“Sw.&`’¸Ûkj[Ýzsljz$y<À4ðÛGk€»È¨ÖÞÇ9f>y€ ‘øy€ ‘øy€ ‘øy€ ‘øÙSP†ÝnçDàa0&c·ÌÈüÀTÌÈ›¤$pï`FàHä~€DàHä~€DàHä~€Dàfs 0q7nÜèêêúöÛoUUŒý+Š2wîÜ Ìž}f´Hä`¢nܸñ׿þ5((Èh4*Š2E¨ªÚÝÝý׿þõÑG½7sy$ò0Q]]]AAA ,˜¼"E ºUÖ=x’yG&ÊívLAAóæÍûöÛoïÍ“<3y¶Ê][´yú-q4ÊÚµeuTÔêø]Õm.WÝž¨ÁVg]ð Þ›§³¦`Oüê¨Õñ»rk:=ÖèË:Þê`jyZ Ö¯&Ö;o¸Þgô^c`Oáko5Ân½U÷Í=¶º{¶¬ŽŠŠZ¿mß¡ÇXûß}ÛÖGE­Žß•[=Jï×Y¹kõ–Cw`[O[qü€¶·ˆ'‚ˆ "ˆð™¹á3ÁÒ§%|&2ÀÄLçºP]>ò°SææÍ›³fÍš‚‚E™¤wðÍ|3àÑZW[uaY»ºjÀu=#£Â›žŸn’ÖrKašEÿNA¤.4}ÿ~ç­•Tk¹¥T"šA»k°¤XCSó‹ŒöJ‹%%OûNA¤nìëx«ànå¥÷¹×ÒSøÖ[Ðy«†o›{:ËÒòjõ‰™E‘z{M¡%#;ðCq>õqž¶C)UúÄœƒ‘Úöê” í;Å1ÞFQy%íª!ül+â´ºµé™q†ž7©(z³†öHADá3CÃg‚¥OKøLd€‰™ÏÙP^֬ݸ.˜Ï÷„éMäyÚŠ·ï®²‹ˆèû_šOU¶fÅ‹ÈâÌÌ Ïe”Õ;"×,\vû‚l«.k7$^7èíj,?¥FìÏLX¦1ç\x.­¼Þ9p-_ÖñV7ÀÝÊ[ï£xë5¼ô¾ôV#tF^;AŸ6×Z+kíæôƒ{bDÄ”Þp*­ºÙèKçj.«²›3î‰ Y¼8ßÖ¼½¬¶3&)xØQ”¥ÌiPîȶ"N«] I‘Ëh†DD>3=|&Tú4…ÏD˜0ÃLcRÑÑ£G&\ÝU—ÁièýSg0êEuœ2é:SRæÞ˜¹qð¤kC»˜bÌ=ßiL1&¥ýŒÕ3æu¼Õ ¸;xZrã·Ÿ©éyx(~WVå­G'\mÕ¹»âWGEEE­ß–UÞÒ»¼ïŒ¨¨Õ[ö÷>i4t¡­|[Tïƒ=úôÿc[¥MD Å{·¬ôÈ’«nÏê]5jr·­ßv¨³_5VÇïÊ­µºùÈ0qá¥÷ñÞkŒÞSxë­FèŒ|éGìË´æU1fmïjZ½"Ã=á3‘&f¼Îò-Û+ìjkÞ3ë Z<ƒ†¶êm«wU÷½%ÁQ½ëö_®–ʬžaOüž‚jÞ¦y>gòƒƒƒï<4 ÷Ú·¸wV¬«¡¼Ö®5›ûÛãi+/i6%',2sVuZÝŠAß÷ ¢7(ªÝéó:ÞêÜ5T{U^©3&µ¨(?AßZ’’]çOKIZa³!)§è`Q~’±¹4»¬Í#âi+ͰÔkrŠîOuVe[\Ã.Ô‡‡ëí­q·6;EìÍ­q¶6: á¡zOËÝÇÕUéE‡‹ÒÃÝU»´ôvšªµÌR.ëRS×Äq&/¥°QŸST”¹N-·Ô»U>1L~—ä¥÷¡×¥§ðÞ[ÐÞ Ž¶yAnB°FD\޶Se§œÆu¡¾õ¿ŠV§ýÖ#Fn»]§Ý-"¢5ÅmÞÓ;²UZÊÔ¤œÍFåÎl+ªÓêTíåiñ«£¢ÖoÙs€·ÜADDøÌÜð™`éÓ>`bÆ N:z4Ñ ˜sÞý k±fаÂ+[uFZ™;<½èðÁýI†æÂÞÑàfÏèÚ¹Új ³-§ÔUùÉ‹û]R]¥Ç%¶(|˜IϪªŠV«p]÷Ø×îÚU99 K5"‹ÍzÛó)e§l1 zí²™q±ëëDĤԕ§õÜ9­NÅœ¹4@Äd4ÄØ ʰ 5úÈPíñºv×:mû»!"ÔÝ|ÆêY§´×Ùµ¡1Fµ9»Öš™ßóÈÒÂ|µõ¹ÂòÖÔ‚¥""ª6anB ˆØ*K•؃ùI‹5"Ksr:ŸO©åó´õ>Žñö#ôV>uF^:AŸ6÷´<—Rë1n>¸1ØÇãO •¼’Òcr¨Ò^k)ié1¡[š°wiß(*¯Ìtps°ÆÙ|g¶§Õ)ª(1éûSµÎº2‹%Å©õúV&ADDøLkøL°ôi Ÿñ0áz?Ê[ùÝÛà ± ¿…§­¼ÌšóΞe:YhÊé|>¥²ÙC€?˜¹‰<Ç…CyÙÍšX”³giÿx²*kÖ'¤ûm‰¢(âvßî‡T·Ú/ }_¸˜"M½Q¤1Eš”Ú»'!08f£ÒÒ\Sy¡åBkcc³["DD4椆´ìçâÍ‘11«"–jD†]hŠ1KaÕ¥o°jÃÓãì¥g¬.åŒUÌIFó¸U5$˜û:ÀiPkÚ²T+"úÐО/F=ö vÅœjP;>/L[ï3Þ^cpoå:³÷¹ìfUD´Eï˜FÜíÐjŒisјRM°6W–¦e/|§Ø·þÄää·ddg<_%"†ˆÍáÚ*§và¡ÚªóÊÜ‹6y›ôD¶ Þ|øýÍ:]ÏâÅ&Åú\vÙ)Gd7ÓDD>3/|–jÆVºÌ€ð™È~èÖ°Â+w{«ÓÝžñLT¿e†6·Èƒ_˜¡‰š3ô÷£mõÕVã:o—Yq™IÚëZ{ÞÏï±Öµª¦Á? îË:À= ýL{ïKt<íuíª~©Aãj.«uÇ>°/iݲ…ÅÝÛÕ9(oÕ.IØ›{胕úòfǰ EB×ì5ÕÕvC¤Q§5‡ê­ÕÕ5vÃ:s€ˆÞdTìgZo½n¶õŒ]1ša¦1,5¨­uÖ[µ;ÓÎ+ò0½Ïøzaz+M@`f„Ýzë}ÛÜYŸ—’Vvë…ͪêVEñuÖ¹£î@nñ—F Wku«˜cLŽTcN?|´×áý› ¢Í?|8ݬ™È¶Ž3YÛö”ߪ³ËzÁ.ú…|ÁFADá3#ÃgÌ¥OøLh€ ¿w;{ç²^°÷ü—ÖdÒ:ÛÚÞ¦­wV–œrò‚Ñ©×q¬ðÜ¢â?ž?þüù?/j*9ÑÁIÝLœ‘çj®lT‰{ã™Þ0Eo] GkUk4SÖu¡²ìŒ—¬Ñ…ïŒÕ¦–Ôå$í•yµ²jDÀ8Ö¡iàîç®ÍË[˜™dV[Ë »CsbƒEq´îÖºÆ6½Y±ž*µÔ»U³ÕéYªkmi­[›™`Vœ•õN}¸A«¸‡Y("úÐpmIU»~£Y/}¤IªNY ‰¡"¢ MZ¥M³äR’côöš’ÂVÃæÃfÈÀD]તÐRKFvpæÎP¥µ²°Öɧ…éì}¼ö#H†ë­ò²Û;ÁÑ7—ð8cI‰¥daê:“âl,/lTVíõñ]YZƒ4çeç)éIË”ÖrK½vãápÝ Ž6 8¸ïà•`E½qaÏ‚ lkŠÔ·[²-Úô³âl,·Ôk7Œ`2DA„ÏÌ Ÿ –>á£ó~F'ªÛnu¸ iZÅZYVcJ2KsYa³*Íâ¤$ãvKZ¤ÆÜgÊK*Ú#ÈLÏÙÔ§öžëûkï?=që_>ÜüÄ«""Ë‹?*YÁ'âG‰<§Õ.b¯ÈËî·Ì”þî¯ã4"k]»}ån¯®ªÒ.ݬÝÒô¢ÌBKIÚv·Ö‘y0s™n\ëw;%<}§¶Ú’RâÔ#R‹2cDdijæÆìÂìÝUŠÁ›œŸ¯µäfýuBz~¢¥°$#EEo^•Y”¾X£‘aŠˆÆª­:eŠ4hDÄc’zkhdÏoFi–fÌ×ZJ,)n­!tóþƒ{†{IÀºýU‹¥,/¥TkZµ3?¹2¯…O Ó×ûxë5F¸;¶·|Ï9ìnGê}Ø\‚Šò–²²ŒãvUk]•s0u™¯ï¼×,N-ÊTóJòÒ*ô¦ˆýÔÝ^]U¥_–<Û®ÛX -ey)v·Ö¾qÿá=‹éˆ‰ "ˆ"|fjøL°ôióþźÊ\^š’b;|4yPc_–ž›]hI«Õ#vf¦»³Ë{þ!8©¨H,…%µnEoŽÍ)JåÊ9…4+J>*N~joÓðÿFod?øþûï}YïË/¿|ðÁgÍšÅ)îž–Üç2ÔüÑ_W €O>ûì³°°0F¤g“ŸÚÛ$8¾ãÈæ#;ªúþwã¾O%¬ø£R_yMMM?ùÉOî¾sxóæÍ+W®<òÈ#ÞV¸v€©¥QE£ôû_N‰Hä~`6§¸iç~ð§ÂŒ<ÀÈÀó¨ªêQûý/§ÄúèìÙ÷hF‹Dî€Ù³gq&Ö~€DàHä~€DàHä~€DàHä~`ö”a·Û9ѸG †ÉØíT$ò}ôQ>?Ü#®]»6»åÑZÀÈü‰<ÀÈü‰<ÀÈü‰<ÀÌæ`âTUýâ‹/®]»¦ªêdì_Q”ûï¿ÿüÿ¡(ʽy†Iä`¢TUmmm š¼D›ªªÝÝÝ­­­f³ùÞÌåñh-&ê‹/¾ Z°`Á䥨Eé)â‹/¾¸7O2‰<L”Ëå ˜‚‚æÍ›wíÚµ{ó$ÏŒDÞ¥ŠÄ Ÿ{ú-é>[’ž¸aÅO¬X›˜{ìs—ˆˆë;žlEz“gðÞ<ïåîX»â‰k³Þëð [¢/ëx«€©åù$7:z˜Xî¼ázŸÑ{=…¯½Õ»õV ß6÷\úCÁŽ +žxâ‰èM©%g»ÇÚÿ¦nŠ~â‰k³ŽÒûuT$®ØPÒq'¶CAADá3íá3ÁÒ§%|†?4Ïç…kT9ù,·œþ˜;j:vdäa=¦ÌÍ›7gÍš5)Š2Iïàóßûæ‹/¾¸zõê7ã2Ê®¯þ¥êå•akòÿòÝ­E_•o {6§ê£?ÿù£òWÖ„­|åW¿ÿþû¯ÿòQ?,iåò—Ž=xwe® [ùJùGç?ªº½éØ×ñV7Sí»?ç¬\ùÊy“ÎKï3r¯1´§ð©·a·ÞªáÛæßý­øÙ°å/מÿóùãù? {¡ê+_û¸ïþÒ³íÿüçóU9? [þRí×^ÏÖßÊ·†……=[ü·;°­ÏuDA„Ïô‡ÏKŸ–ðñvhß}ôòò•¯Tý±¯Úçÿr•æè‡þVüìòjùìf„óçÏß•eÏørhW¯^ýâ‹/FØíô&ò¾ûËgÃzô¿Žÿ­ìÙÛæï¯~ôÊò°­Cú€¯ª^X¹µ|ÈmÊÕڗ–¿òQO w>seØ Cs}>¬ã­nHäᮽ ôÒûxí5|é)¼ôV#tF>u‚^7ÿî/ùkn÷jßÏ\9ÜÖÃ×üêG¯,{áÖðçoÅφý´ìoÞFQ/¬\óìò[5ȶ¾ÕDD>3#|&Tú4…×Cûªü§Ë‰˜» „HäÍ$òú›¤DÞô>Z« y¡´ªªªìåà½=® Ç—Göþ© kà”I×éÂ7\›r6 ™$~îsY´f‰®gÿ‹Ö<¦\<Ýéó:ÞêÜ-«f­ÝPxú½žqÖ&¦WÜztÂõù±¬Äµ+žxâ‰'¢7¥ùÄ5ðŒ'žX±!¹°÷©¡ /ÙôDïƒ=O*ôÿcSÅ%é>[˜¼!zÐã?®?ìX‘ø^Ó{Y›¢7•tô«ÆŠµ‰Y':\|d˜Š¸ðÒûxï5Fï)¼õV#tF¾t‚#öeºÇ×ô-ÑhÄ3ô©ƒákîêèP—„ôm¸b‘Òy®'þ.Ulêÿ¸QGEîꎜ­wd[ßê "ˆ"‚Ÿ>+}zÂÇë¡yÝJ`ŽFèÏ:ŽlØü›úiö?Eç~â4¬¸tlÓŠÄc}oè>–xû/×'é=Þµ;rñ6-ø‘ÙÓ[¼f^PÈ55ïtÈË¥aÊ¥c…yûò–ÿ¡$ìÒÐ…–¯xõÜ'Ý©!ó\Ÿ69D¤é“n ™çøô¬#pEX€ç“‚¤½'_È)]3¯ûDIÞÞ$WÙñ¬%Q;ÞÈ=²dSzzt tŸÎÚiù$ìå‚Ò0åó#–¼ÝÊJ>2Lz—ä¥÷Q/zí5Fé)¼÷V#tF£w‚£m^Xлm÷ç§ß8éÞä[ÿ«è4â¸ä¸Uö%›*žK.èÛ´u«¦w?—*rßPwÙÒôÞÙÖÇ:ƒ"‚ˆ Âg&„Ïè¥KŸ–ðñzhª£Ã¡ªG’צ~êP_óRnú† MÒ¿„쨪rmNlzùø‘µóÄuiÀ°Â«KÇR“ßÐlÍ-Í p5½m±ìܧ=^²v§$ò&Êõù{–}y'=k¼¼¤ßõÔuîÕc²¡tù0Qæñ¨¢Ój\×Å=öu€{€vMAAb˜FdÉã—6î|ã䥵‰ºå/ålÚ°a‰ND)+Ž$_r‹ˆ8:Ê’ôg£ÃæIØ¢ 5¶@eØ…š€è0í±“]tO_ \æj:ÝéÙ ¹xÒ¦ [¢6í;á Ë)O];OD; ~k9òiza˜ˆˆªÛZR$"—*JÎ)Ï–رD#VPбqç >/L[ïÓ=Þ^c„ÞʧÎÈK'èÓæžOr×î<á ÞZ¶)ÄÇãž·ü…0É.|õlÈËaÊÅy…EzgLèÂÓÃúFQYo¸vÙ¢q4Ý™m'RgADDøLqøL°ôi /‡fëpˆ*ʚ̒t]÷É7òòv8tïF3•ÃÏhü¿þà ¹4üžÏ¼ÑVð^ê ˆ<¶¨ £içÛMÝkÉäÁ/Ü7ckÖÝT’¼!)ïlÐ ¥UÑýãéÒÉ7š¶nþ".÷í~HuyD”±¯Ü‹^Ô×é-Š^¤ØÎÙ<¢ Y»)L>y¯¢¤ =ysòÉÞ@Ñ,Ù±)ðܾص;Ò Žœ¶†…i¼,\´f‰\<ÒoBá IDATÙáê8ס[¾é§KÔ‹§;\§;dÉšãb‡¸rI_@Ï[¨v|Þûj@XXÏw¾[“MY²&¤íø¸0}½Ïx{Á½•ëtòŠž_Ä‹NoòŒ²Û¡ÕÓæ¢Y”^QU^œù¬¼¼ï=_ÂrÞÚü[5Çön|ê©ØG” ˵¢Ñ <ÔKDzÞpm*Ø:d¾ÂD¶HAADá3µá3ÖÒgBøx`†l­øãGï&F‡- [›~ `¹úá'‰¿wkXá•ëâ§÷¹½ÿÔûcÅOíüw‡8.2»~b†ÎÈëþCúæìuÏæWe®|©¾tºâbà¦èáŸPB´jG·Ú›ŽW]uÈK|Y¸ÇhDD<"Ýgswî=©,vÚM¯$nz;9«çõtº°ôcmm:}úô‡'ÿ5ùUËÊüªÂµó†]øøšב¦‹Kš\!// ³…8Ž}z1à×¢—éFüYQ4<É€™ØûŒ³×Ò[é–çWWED]€FÄûn‡­†›{.}~Q Z¢Ó…<’©i:|¬Éµa­oÝܼég_v]r)AóÔ³©kß x¤ÛÙ‹îÎO“žúMß’ßl~âí•¥, ÓŒ{Û‚ÀމÔDD>S>c,Ý×TÞ$†ÏL®ßšºEËåíKn¦eù5ïà Õãé}ë£*ðÓâÒ!·s¾ŠŽ·L×ÙÜĽ'l=®9P6p†5#gä¹Nçå y¹¼*wíÐï/>Ö¼Á[×  Yþ˜\<Ùû~~OÇÉOÔEÑÁš1¯Ü>?}±÷KUÏÅ?\T‚4®¦7N¸ž-­(ÉÚ±aÅcWoW×}¶¤àȧº°µ‰éGŽ—ýTóáošº‡](2/ìÙ@Û{ÇŽ] ŠÑé è8vì=[à†%óD…(¶?¹õºÙONÛ”Ça¦ T?9Ùq«v§/òÒnLcï3¾^c˜ÞJ3/¨Ç‘%k ØXóxfEU¯òâ­ðìòŠÌÇ5ÙvBuDA„ÏԆϘKŸþðñzhݧÓ7í8r+|\M6 X¤¥EÞ]ngï\M½ #Ý¢EZÇE‡¶·i8ŽY O:ø½‹©×q¬ðÜ¢â?ž?þüù?/j*9ÑÁIÝLœ‘çjzûœòB íÜéÞ0%àñ°%ó4"ÒýÉÉNí’A3e]MoœÖlzySˆF·â¥guÉ–Â?ì¹T‘uBÖ÷$tǸMw?÷‰¬¬E9;–¨Ÿ±ü»+,ÿÙQAZ÷''Ï}ð¸¦ãdIÞ‡nõñ‡'L''^=áÖål}\ã8Wñ¡#`yNãf¡ˆ„­ÐýëÛ~úx€h¢ÉÛ';_ ]ØŽ5ºä¼ìÍËk.(´|¸µüqÈÀD]Кa¯æ¥î É})LùämË Ÿ¦³÷ñÚkŒ4"ùÿٻ㨨î;áÿŸV¹s/':DvÀt°éàs:´§Ã±âiDVÁ¸jºˆ-˜­£[5MÄÉÙ§@¶0iT$‰k¡ m }Ü&²ÉBìÓIó;[¦ç ³©ÎÆ0A™$gÆäÌ5žüþp‰ÀÈûu<¹Üïý~ïùÌg¾Ÿ¹÷N l5RÍŽ™Ço.÷ý0îÙgK+—äÿýeðOõ¶?)k- ñÄœÈXy§(¿R¸ý>ÝÕ—ü1ò‡ ß‹•hï^¼øêÎ+‹Q¢ÿ¯+ &Ñv2cDA„χÏ${ŸŽð‰ ¶kKVÝýné¾ÒÈÂ}K7ø§ú’?Fþ ŽÓÂQ¤hÞþ3¼ßýèEÆÄ*gó¿ÿ¯íß–w^°½£I¬ˆˆîÛÛ·Çe–f—Hþc½§êŸýõ»[C`ÊøßÌ]±çOWÛ³ú»×þòÇÌï>'"ò½C§«ïã £BÞà™Dú]´oز%…­?Ô‰øÏ¾ö®,}gïÿûýo~¹ô‘.ÖIäÒÂÚb[ɳٙÞÈ%«Šë‹ï‹¼©u€Ûò½ÂG"_ºãÙA5îoZ[òww‹ÈÒŸ–ü`ŸmŸõ7JÌ·¾ÿØ‘%ûmû~¿´qKá—Ú*÷¼¦‰õ­µÅµ…ßÖé$ÀBÑ-^µTýÍkKVÅêD$níù㙥Cߥ[ZRw ²´²dǯ}jÌÒªË t•»ÿþPVZúÂþÏE.YûÈÇ÷ÿ¦/ûËc¼; ˜­F¿µ ¸Ù±’`Íeñ–Úƒ¥/¼ûû55féÚ²úüûBÑë¾_[¬í¯,ÊþuÔ’¿ýá°õþ¿ßÿæ7wï±à·ÐŸLÛÉŒDD>S>“ì}ÂG‚íZìßj[É ûwôûÔ¸ïýðPCî·™ †¡˜¥k¿UÿÜŽ44çŽz²ßWXüý}¶Òì?¨qûHI¡7èâìÅÛkk¥´¼rÏ|JÔ·¾_V›ÏC?…t÷UŸ>”½bÏ;ÿ¼”*ÞØ¾òÅ_„²Þûï¿×]wÍ™3ç&ú¸óÎ;9ÐÀŒâÿ¯ý—ë¯üÊ¥¼>¾ ï¼óÎÒ¥KC˜‘¾™½bÏ;ò­'¶×gÖoo¾ú3}ߟeé¡Óµ¡òBíkú|úé§7ÑêòåËŸ|òÉ=÷Ül…¯ò<ÀÔÒ)Š¢S†ýä„€Bær€YH÷íòS§8 „ÎÈÂ…<L1¿¦i~mØOI¸´SìÏûÒ÷‰ÈðŸgä`ªè–üèû1ÿóý›/¯gä`Êܽªäßß.á8Ü ÎÈÂ…< PÈÂ…< PÈÂ…< PÈÀdÍ™3çòåËSБ¦iŠ¢Ì΃L!“ùá‡NAG.\¸óÎ;gçA¦€ÉúÚ×¾600Ðß߯iÚ-êBÓ´þþþ¯}ík³ó Ïåy€IRÅl6ÿÏÿüÏ… nQ-OQ”;ï¼Ól6ÏÚKk)äàK (Ê7¾ñ ŽÃ­Ã¥µ@ „ y@ „ y@ „ y@˜;}¼÷Þ{h̃áVlvnø˜=¸´ò€0@!ò€0@!ò€0@!s9˜¼Ï?ÿ|``à³Ï>Ó4íVl_Q”;î¸#::zîÜYZÑ¢€ÉúüóÏß{ï½ØØX£Ñ¨(Ê­èBÓ´ .¼÷Þ{÷Þ{ïì¬åQÈÀd ÄÆÆFGGߺ.E‰½Ö×,<ÈÜ#“åóù¢¢¢¦ £»ï¾û³Ï>›yfòú›vn>Ðç¶d°ëÈþ›×¤¤¬ÉØYÞÒçñ¶íJmÍþÿè­ùÏž,ß•±&eMÆÎ’“gý{ e`c0µü½å6ˆuàË(ûŒŸ5FfŠP³Õ› 6ŒÐšûûÛìÚ¼&%%eÃÖ}Gº'š÷mÝ’²&cgIË8ÙïlÓÎ5›œý²Ú†²Ë ‚ˆ "ˆð™ á3ÉÞ§%|‚ìÚB3—·§¥aìi=¦ÌåË—çÌ™3)Šr‹îÁ7óÍ€Bž·¯¥²Î©|]/(htš¬e55eVCwež­Ã+iɯ¦,×¢*æ•FݨÍuÙrlzkYUكݖSÚqcþ e`cÜ®gŸq²Æ ™"´l5Æfƒ #´æþ³uy¥­’ZXUS•kq7µô‡šãü}Gr š}É…55;LÎÊœ‚¶Á1fQ¥ÕÃZO¦m¨» "ˆ"‚Ÿ™>“ì}ZÂ'È®…ò˜Ñ<] u-ÌÛ1kLï=òü}‡¶=ÔìÑinor¶ß¿1ND {6Ôu®\¿üúšý-uNCö±õ£ÎÙôv7´kÉ…YË#EÌÅ=›ò:WŽ\+”u‚ p» –}”`Y#H¦%[‘Œ‚&Á𫮦V·9¿fWZ”ˆ˜ò»ÚóZìƒcBÉq^{]³Û\X³ke”HBBY¿}[]ëÙ4k\ÀY”­ÎcP¾”¶â.ƒ"‚ˆ Âg&„ϤzŸ¦ð ²k©žPBf–é=#Og´V?~¼&Û8âÕ]óÌI+ C¿FŒzÑ|#ËëÞŽê:_zazÌèÌàêrŠ)Íyeû¦4“âìpù'¼N°±·oIÆæC'¯\I±sÓµë ¼}-%;3Ö¤¤¤¤lغ¿¡whùÕ 0RRÖlÞsh貃ö7lMºÐÁßw(#eÄ/[›úEd°ëОÍF]¿àmÛµfçÉž“%[7l=rvØ0Ödì,iuùxÈ0q$ûÏãgŠ`ÙjŒdJ3—©æÔ4³:´šªW$ÀUGîs¹4ƒÙxµ­a¹Iqu¹¼""ýM[SRötù‡Í¢4ka–áKiâ.ƒ"‚ˆ Âg&„ÏäzŸžð ¾k¡„+ð'<Š¢ˆÏw=i>mX@‡¾0 ˜Vš†¢HgZiRZ»Üþ¬˜¸´t¥×~²©§·ÇÑÝm÷I²ˆˆÎlM7ämÊ0''¯LKKMNŒÑ‰\hJ3Ke›Ë«ïr©IùÝݵ.¯Òá³Õ¨óœpi†,óÕ€Ž2¯4h'ITEDo±\ùÌ×ïîq+æ\ãˆÑñxaÚ²ÏÍfÑÙÊÛ±gS‘]5¹ê¥rÓ˜›½qj.:Sî±ãY.{Sue^Qü‹‡B»YVTZqYoAQÁƒÍ"bHÎLR›=êÈ]ío)­ó¥WeÆé¾Ä¶ãä}ADDøÌ ðIÔM¬w™á3N˜Ü\Ècæº6­Êçtx|΂R†-3ôù„B -ä ¶íßVÚ©®+>žŸ6ú¥º¿³Éiؘø”gEoT5—GªÊk>¦ ê„×fEDDì*Ï)hW’Ö­OÛ˜›µ±)¯ôÊ»¼ÈÄ=ÿözVOggGG[u^merññò´¨€ ÍiF_ƒÝé°ûŒÙf‹Ûèiq8£>ÓS䘟!+J”Âù˜‰Ùç&³Æ Ù*2©øø‹šˆˆ¢êu"Á7p!6÷÷÷95CB\ddL\dL\¾ÒÓ™×b÷®O‹ m&µ|ϯþ3ÛÛïSb¢´®}›Z#÷Ôïîrú\އîo¼º¤q[JsrÕ+剺ɴ+ïƒ"‚ˆ ÂgF…Ï{Ñ­ Ÿ »6ÉÇLÙVh×èÓ+ª¬Æë5_Eå²êià}³dËž? 9³ö@]ùª»9*ãùêŒ|(;l¶ncö±ãû¼éïlq×K :ãr“8ÛWîÏïwµ94Óè/=e`pv8‡îéêw¶95}¢Açµ×µúÖU;°Ïº~y¼Añ ¥ºÁ®#jbZÖž’#/Ö¤+ öÁ€ E¢,ë î“--nÃJc¤j¶è]--'݆õæ(½É¨¸;×n7ëèp+FÓèÌt†Dƒæhs]]_&éÌ>7—5d+]TÌQ‘º16, †ÖÜÓYš“Wwí†ÍšæÓD õ¬óÁ¶%‡z¼ºÈ˜(x-1§™Fì©Îœìøc™ѯ+;v,߬›TÛ1ó>ˆ "ˆ"|fTøL¸÷韠»6©G¸¸^½óºzÜWþ§šLªÇéQ‡žÚzOKeu»‡ï»˜zg~_ù§%‡Þxûí·ß~ûCKÞ©þÃÊøfây^{S·fÜbpww …™(z³%!J'"ƒŽ6—ju¦¬·§©®CÙ˜½1N™´cšWYÝVl5º›J[%µ"9ê&Öá©ÛŸ¯µ´4¾ÐjÖ •'|–âuq¢x ªÏÑÖݧ7+®öZ[§O3»<þDU\­µ­>µ0ˬxº›:=ú$ƒªø,½%I­nvêÓÍzÑéWš¤¹ÝeØb‰‘H‹5Uͳ•Q²Óôî“Õ•Cæ1³Ndd¡.&Õj©µÅî°(ަÊV¦3ûÍcÍHe«‘‚lvÌ$8~sIÚh¬®¶UÇç®7)žî†Ên%µÂ♪Aì¥E¥J¾u¹âh°uªéÇ’"G%Ú¨¸¸«;¯Ä)¢èñWÜ|[owh» "ˆ"‚Ÿ™>“ì}:ÂGd×b&ò˜I"Eó¹]ƒÞ„¨žZÅÕTwÒd5‹½®Ò®‰ADD—`µ·ÙòÊ%w£Á×ÑPÝèL®1ð²9eüoæ®Øó§«¿íYýÝkùcæwŸùÞ¡ÓÕ÷ñˆ„Q!Ïãr‹¸K‹†-3å¿ô«:¿«Í)ƬQDùœ-ÍÍjâŽq:‰L̯*¬´Uçmó©¦äšÂå‘7µp»S’òw¨-¶œjjLέ*L‹‘ÄÜÂô¢Ê¢‡šƒy]vY™j+­,:aùUV~Ù[euAŽ&ŠÞœZX•Ÿ ÓI€…"¢3®´¨Íí¦•ˆÓLÒ鲬¼òQºÄý5eª­Ú–ÓèS –ÌŠš]î µ¾¢F³ÙêJsjUSꎲì¦Ò^1L_ö –5Æxw0[~Ïp³c%ÁšK\VUÙ ­®®à„[S –ÔâšÜå¡NIt ¹U…Ziui^£Þ”œ>,@}Ζæfýòìq· mÈ» "ˆ"‚Ÿ™>“ì}ÂG‚íÚdB3ˆÁ’jn¨ÍÉé?v<{Ô“}y~ẢJ[^«jLÞQ˜ï+j¸ò‡8kU•Ø*« Z}ŠÞ¼®¸*—o šBºûªOÊ^±çÀ^Jol_ùâ‹/BYïý÷߿뮻æÌ™Ã!nþÞ’MZÙø·+ $ùË_–.]ÂŒôÍì{Þ‘o8±½>³~{óÕŸéûþ,K® ¥÷Î;ï|ó›ß¼ýŽáåË—?ùä“{î¹'Ø _åy€©¥SE§ ûÉ! …< Ìå³.¡äÕW9 „ÎÈÂ…<L1¿¦i~mØOI¸´SìÏûÒ÷‰ÈðŸgä`ªè–üèû1ÿóý›/¯gä`Êܽªäßß.á8Ü ÎÈÂ…< PÈÂ…< PÈÂ…< PÈÀdÍ™3çòåËSБ¦iŠ¢Ì΃L!“¥ªê‡~8]¸páŽ;B&+::z`` ¿¿_Ó´[Ô…¦iýýýÑÑѳó Ïåy€Iš;wî½÷Þ;00páÂ…[TËSåŽ;î¸÷Þ{çÎ¥- yøÌ;766–ãpëpi-(äa€B(äa€B(äa€BæNAn·› €YÂ`0ÜŠÍNE!oáW¾ÂãL—Öa€B(äa€B(äa€B(äa€B(äa€B(äa`îŒÅÀ+?)9÷äÁGLÊÕ%õ¼p´±Ý~æC™ÿYOn_kš'¾Óûÿþ`ßÈ–+Jêž ŒX¦k=zø…Ó}¾y‹“·ì}rõ"åÆCY'ØØL-íÝÃ?(»øó£OXCÜj²ÏøYcd¦5[±Ù`í¹6pú¹ƒ ­}ç/Ý»líö'­‰ú åßçëOØ?Ðæ/NÎÚýäÚ¯v®W ~òŠå_Ÿ·Cn|lÙ_:ú«ö¿|ñû¬?{t­‘x'‚ˆ "ˆð™±á3ÉÞ§#|‚ö{ñÝæÃ‡ëßúàbÄÂïÜ¿ýÉIžaÈÓ}xïÁSže%ÿ÷ñ„ÀþG§òèïRVm‰æh!ìÍ€3ò.þõÄÑßý÷¥¯¯Íåå¿9³xKAÙá‚ ƒýèÞÃÝ>Õüð/öï¿öï_¶›çEÄ'ÇŽŠÓ‹Ý‡÷ÿ¢{þ–‚’Ÿg-´?¿ÿ©î‹7vÂ:ÁƸ]Î>ãd2EhÙjŒÍFh͵sõ%[eÅ“%e¿Üžà~¹üŸ_5Çi}¡¨¼ùbÒ“eeÏd-v-zâôGAÖ¹Wžª?siBmƒŽMs½TòxÓÇæíE¿Ü»Vo?º·þ]ç#DA„Ï ŸIö>átr÷QûÁ’Ãç+)ûå£ß«O¼tާcú¨»é”oEÁ¿>’À§˜ ¦÷Œ<ÍY·÷áWÏ‹ˆÌþÒ|ºùÌÂ|4}‘ˆ,yrwïÊ›:?JZ·àëI ®g»Mg ÖŠu F½:Ûß¼´bÿ£™‰óDâÖûðã/w{’Vë'ºN°±nWÁ²,kÉ¡d«1’QÐ$RsõÜ+­çãZfM] ’°ø§öÓ¿ÞëYJŽóõ65Ÿ²Ìš¼@dÉ’ŸŸïýñïN¹Vl2:X͇çY1¡¶Z°±i}õ/ŸÿΣ%­X ’`ºóã'^?ã–%Fž“DD>30|&Õûô„OÐ1do´Gü]ÙöuK‘ÅOö¾õð©n÷¦Mœ”n.ù´½9Þ0CYazÏÈSŒ%¿>xðð–Ø¯²Ú§†xKò¡_ÕèEzÑ|#O‹óu××_\ûäý£Ï‹ÕÎÙ²8uÉ•VL+GœyË¥Mx`cnÚ»¿üÁîºÎ7^ؽ{Ë꬇òÌ+ΫŸïúþúÚS¯ÍÊZõã|æ%ÇÐrÍõÆáÝoY•µvwñs=Y8И—õ çDD´¿>÷pÖêÝ ®¡7O¯Î{Å-"õéh‘eàÆ…I–ùGíïz¬‹ôûì‹H¯ã#1.øØaÿøo,f½öî³O”·.Ìx²ä>ýǧ^8\ÏùNT IDATþ“‹e¿}d‰""—ÎÕ~Ù|ÿöÇ’ÊGÝOu$lùYI‚ræågŸëbÄ22Üò”$ûhg‚fq2Eðl5F2? Ž×üçµõüµ»þÍ¿¶!Ábþ½S‘Ï{®MÎ_Í}Qdž¨‹×þpCÄÐv^yúw—¶”?`ì=5¡¶ÁÆæ;y¾S¿üÉËoý÷ÅyßX–õä#cÞ• DD>Ó>ãO”Æì}ZÂ'蘣-éñõõM§Ó÷®6||ºÑ¾è‘Ý+ô<#ÃÌ‚ôŠÃZÞÞÖŒÃÿºzhï>h:£\z˜×$Í8QVRñÀ“%»õÍG÷Û"ž  w.þµõ…Š_¼©­.Øb–|öƲê eA€¬qé’Ì›§^û=âNEÄ7ñu€YàÎÔ½{3‘%æùçÿ¡èwí+2çÏKÚ¼;}Õjó<Y¬œ~yïùOED>þÀ±ä±UI–"‹î;oˆ¸PÑ'™ç½þ¦óâjË™·Ü —}çboçÚ:åLûù;-+i½­ÍO>cM] "_ÿ¹Ö÷ã/;¶?a¹¤>Pô³¢EÄýJÃ[«l2+" {vîÑGOñxaÚ²çf³ÆÙ*¤d$ †Ô\{÷釋þãS‘Ø ‡×. q¿õ–ŒïÈÁçzž±&(gN=]FdèÌ5ádžfQÍçË(Ï\¤xz'Ú6ðØ´KŸÊ%Ç/_»ïñÝEÆKgšÝ}xþoŸHâÝ3DA„Ï ŸIö>á@tæ£ÖÖ½ÏÿØú¼ˆÈfã¥K£Ïï@˜ 2¹&мFûëËõç~ö¼5ižˆ|ýɽçþ¡èûG+Rp<1ÍÜBž§·á©g^þÿÄü£’²G†Ð@{S¯þ ŸðDDÈÅ‹×óÐ¥Oµ^‰CY˜'/zâ+‹—™"NuŸ×2£¥Þáè}£ÙÑg×ÞíøT–‰ˆ(K2Ò–üïGþæ²eÉ+V¤.K0(".^a–£íç.êíçTËÃéçí/tŸóE¼å’%[)ž×Î]Zø€ùj@ë—,û›K§œ‹ežˆÌ¿ú™¯æî=±dûÕoÜSLËGœâñ´eŸ›Í£³•¯»øŽK"rç²_}Â4æfoÆ„š‹²ø±Šƒ™çz›ëî}fñoKW‡4¥_°âgï>QQþ£WEdአ–y¯~¬FŒXÅýÚÁú‹k>p÷½‡Ð6ØØ‰Yø£'O_$" ¦ˆ¡»2¥óî™"‚ˆ Âgæ…E™Xï2sÂçFu?µ¿Þwßö_<`V/ö8zôhY½ùè£&‡áK <¹þ÷@SÏ™¾>=óOÛ³†­¸Ðù©PÈ…¼‰¤±ÓÏüãÁ·ÔU{ýð 㨗ѷšÏ,L_ø[£•ù‹æ]:ç¹ú9Švñc-bá¨{^†²0Û2žˆˆ&òQÏÓEåí–u«îKßþ@ú«%O]¹©Ä¼„Ǫ2{ßêìîn¯/9ú²ÿ}ð‰ÔƧ.ºØØ{Æá¸hܲÄr~‘çõ>çüw}‹7›æùrD„^áMfbö¹É¬qC¶R-{ÿÏáK""óôŠHðÍFˆÍµ¿:/E›ÍS£™¢ýTéí,yÝ~qujhiNŸ¸ã_­¾‹Jô­§ì§bGî©æ¶Ÿ¹øAßÃÖ—¯.yùÇY¯¬(©ÿy‚2^Û cKž??"bžåÚ]™%ä÷§"¼{&‚ˆ "ˆð™á3ÁÞCtKÃ'èa«é YuøÑÌŠˆ|ÝTp®û‰·ºÏ‹eOɰl:sM yå’ÈüûQ’a¼^ŽP£9š˜¡¾:u±ûéÃvã–gþÏ£7TñDÜo½ö?±«’ƒ•²Èb’3íï^ VÍõæ»—/µ‘PÖf3g†nâª9í¼4ß­øMÿqqÕÁŠ¢ŸnZôõ…ÊEíÊžž†g_êSVdîxüùÃe¯¼Õèø(àB‘–U ݧ^;1¼hžoÖŸ{ýÄ©ó†UñzýâEç»Wo)ëy÷­#™Fß{E1$,¼ôî›W¿‚Fs¾uæ¦/ûÜ\Ö­”†èhCt´aÁxð×þúà3¿Ø°Pæ¯ú—g*~¯„Ð6èØ”ØeÆKçºÏ ýÁw®×-óMwòŒ$‚ˆ "ˆð™‰á3áÞg@ø£É¨o4¸$2ÏÁ32Œ›Î\- 4…Q/ž÷ñÏÑWžêú_¶þMßw™j&ž‘çë}å­K‹~}¾»ûüТˆùæ„%zED>rœþ`Þ’„‘8\´¿ò»Îˆµ¬]¤Ì³l_5ïñ£õí{3Œç_yꔬÞå!\‡§nŸþÇÁƒ¦ÝæK}G_÷™÷®[$ÊÇ ç}ún»ý¯úxÅõfÃÓo}z)þœGKPå\kã)߼ݙñŠÇþJçÇó“ÎS.X("z³E­õ¿çßož/Êü$“¼úÆ ”-"jBFê¼’§6(ÖûôçO=w´ïoxƬˆŒ,ÔîËøNÃóOTÄ>™• ô½òì©y´0Ù'hÖkF([d³c&Áñ›‹eí×ê럮_üتÅÊÇöÆ£vå¾ý–Ï:Ÿ·Pÿù òÓ ‹òîËO¿5/ý‹zõàÔwG¤[×,2.¸6ÃŒˆùƯ/Ò‹ˆ„Ð6ØØæ%=²¬þŸ*~Àt©·þð[ꪒdN&"‚ˆ "ˆð™™á3ÉÞ§%|‚ì‚aYÆwêŸêðâŸ>`V/ö5}][VÌyXáL™x:sík‹”€óš%[b÷þ¢ä°l¿ßðé[õ/;—•( €B^è<ç΋œÿÍÁŠaË?þBEº"¢}Ð~FŒ£ïŒpÑùÚ«¿Ÿ—°}í"EæY.ù§£‡Ÿ+Ùë›·8ywù“‰ónjàvay~º©é‰×Ï_ºsáwVì}~{¢ê›ß%•ìÖÖÿKÉË /Kß_öÈÕõyí÷¯ÎO²®5N¦mбÍKÚ[þOG×W}( ¿sÁóÖ1DA„ÏL ŸIö>á¬í‚Õ?/»ôÜѦ.ª¿±ð›«v?¿/Š óB^°éÌ}C+¨‰§0‹¶””Èó/¹çž{‚­ðUŽ,0óQÈÂÀ\0 )Kÿï9 „ÎÈÂ…< PÈÂ…< PÈÂ…< PÈÂ…< PÈÂÀÜ)èãü_p 0KnÍf§¢g0xü€ÉàÒZ PÈÂ…< PÈÂ…< PÈÂ…< PÈÂ…< Ìå`ò>ÿüóÏ>ûLÓ´[±}EQî¸ãŽèèè¹sgiE‹B&ëóÏ?ï½÷bccF£¢(·¢ MÓ.\¸ðÞ{ïÝ{ï½³³–G!“500}ëºP%66öZ_³ð s<L–Ïç‹ŠŠš‚Žî¾ûîÏ>ûlvä™QÈëoÚ¹ù@ŸØ’Á®#ûwn^“’²&cgyKŸWDÄÛ¶+e´5û{ü£·æ?{²|WÆš”5;KNžõì1”u‚ ÀÔò÷–oØ Ö/_ ì3~Ö™)BÍVcl6Ø0Bkîïo;°kóš””” [÷éœhþÝ·uCJÊšŒ%-ãd¿³M;×l>rv"mƒŽ-ô¼ "ˆ"‚ŸiŸIö>á3¡‰'·§¥¿âòåËsæÌ™‚ŽE¹E÷à›ùf@!ÏÛ×RYçÔF¾¾4:MÖ²šš2«¡»2ÏÖቴäW S–kQóJ£nÔæºl9¶N½µ¬ªl‡ÁnË)í¸ñÅ8”u‚ p» œ}ÆÉ7dŠÐ²Õ› 6ŒÐšûÏÖå•¶JjaUMU®ÅÝXPÔÒjŽó÷É)hö%ÖÔTì09+s ÚǘE•VkJÛ c 9/ƒ"‚ˆ ÂgúÃg’½OGøLpâ‰pãéj¨kaÞŽYczï‘çï;´í¡f·ˆˆ~øKs{“Ó°åøþq"’PXس© ®spåú¨øå×ÏÐìo©s²­uΦ·»¡]K®(ÌZ)b.îÙ”×Ð9¸räZ¡¬ll€ÛU°ì£ËA2E(ÙjŒd4 †Ô\u5µºÍù5»Ò¢DÄ”ßÕž×bÜJŽóÚëšÝæÂš]+£DÊúíÛêZϦYã΢luƒ2¡¶þ`c )/ƒ"‚ˆ Âgf„ϤzŸžð™øÄ“'%€™kzÏÈÓ­UǯÉ6Žx•Õ¼sÒJÃЯ‘£^4ßÈòº·£ºÎ—^˜3:3¸ºœbJ3G^Ù¾)ͤ8;\þ ¯llÀíÁß[’±ùPÇÉ+èdìÜßtí:o_KÉÎŒ5))))¶îoèZ~õŒ””5›÷ºšçÆ…ý [S†.tð÷ÊHñËÖ¦~ì:´gó†Q—yÛv­Ùy²çdÉÖ [œ6Œ5;KZ]>2LE\É>Á³Æø™"X¶#…’ÇÌeª95ͬ­¦ê pÕAà‘û\.Í`6^mkXnR\].¯ˆHÓÖ””=]þa³(ÍZ˜e˜`ÛÀc -/ƒ"‚ˆ ÂgF„ÏäzŸ®ð¹ù‰'f¼³ ›·5º5GéÊ{ý£¦ý-[×ìl¹zŽæ`ËÎë¿y{›ö_™ödì*oánZ#Óü­µº¨˜¸(ñ:Õ ãw:r= t5´ºÕ$óðONü} ÕvSn~ü gjk—O1è¯~B£è ŠæôøDt['ØØ€Û†æn.­MÎίÊ{CeuN‘þÅCiQþÞê¼J»%·8׬úìM¶Ú¢º¤÷ÄK_m­Ó˜]\eQÜ-Õ¶"Ûò—XÜ7.,KJÒ×v;wÅEùvˆØƒåqt{ I½¿÷ÀC­†-…UizÏÉZ[ÁC¾š÷%èDDsÕÙÌss“ 2ØQšSé°dWYgC¥­Ó§$óá–§¤ ÙGsÍãdŠàÙjŒd4~¯yyÉPÛÁ¾Îºv1ËZþUTEË£˜s×­LŒ1 inƒp¡N¿Ò¢žhsz׫η!Ùâ³w¸üëg›[µ¤5{Q«ÏRXvå² ø2ͱ©²Á‘[ž("¢©Y%Y1"ÒßTÛ­¬«)³&èD‹‹Ï>˜ÓÊã…iË>ƒ7›5ÆÈV!%£ I0¤æþÞòM9­>cfMz\ˆû•dµHium—1Û¢8[mÕN‘¡3"³ö$^E•Öù¬5™q:}¢m¼LADÂ(|&Ùût†ÏÄ'žCÙµ ®¯O+$ÈmNý} u.Kñ‹»–GŠH¼©øìƒ9MöÁ4*y 3·7Øs¤´¨Ñ.–-UÅ»‡ÇS{]ŸøEQÄ绞‡4Ÿ6, C_˜L+MCQ¤3­4)­]nVL\ZºÒk?ÙÔÓÛãèî¶û$YDDg¶¦òŠ6e˜““W¦¥¥&'ÆèD.4¥™¥²ÍåÕw¹Ô¤üîîÚ—Wép‰ÙjÔyN¸4C–ùj@G™W´“N$ª"¢·X®|êw÷¸s®qÄèx¼0mÙçf³ÆèlåíØ³©È®‰ˆš\õR¹iÌÍÞ8Œ 5)÷Øñ,—½©º2¯(þÅC¡Ýí'*­¸¬· ¨àÁf1$g&©Íuä®ö·”ÖùÒ«2ãtolläe"ˆ"‚Fᓨ›Xï2sÂgÂO„©kÓŠ |N‡Çç,x eØ2CŸO(ä!,ÌÐBÞ`Ûþm¥êºâãùi£_ªû;›œ†É1*z£ª¹<ÚPU^óy4Å`P'¼0Ë(""šÈ`WyNA»’´n}ÚÆÜ¬My¥WÞåE&îù·×³z:;;:Úªój+“‹—§E\hN3úìN‡ÝgÌ6[ÜFO‹Ãåð™v˜"Çü YQ¢>ÅLÌ>7™5nÈV‘IÅÇ_ÔDDU¯ ¾Ù€Ã±¹¿¿Ï©â"#câ"câò•žÎ¼»w}Zdh3©å{~õŸÙÞ~Ÿ¥uíÛÔj¹§~w—Óçra>ì=D·4|nrâ‰pÙVh×n{ª‰èÓ+ª¬Æë5_EáØM=ï›%[öüaèÌɘµêÊWÝÍQÏWgäCÙa³u³ßàÅ´¿³Åe\,5èŒËMâls\¹?¿ßÕæÐL£¿ô<”u€YÀÙầ«ßÙæÔô‰×^×ê[WuìÀ>ëúåñÅ7”껎hp¨‰iY{J޼X“®t6Ø.‰²¬7¸O¶´¸ +‘ªÙ¢wµ´œtÖ›£Dô&£âîp\»Ý¬£Ã­M£?0Ó š£Íumt|™<¦3ûÜ\Ö­tQ1WDEêÆØl°$ZsOgiN^ݵ6kšO%ÔóÛ”êñê"c¢tâu´8Äœf±§:sþ±ãCŽUdD¿®ìر|³.„¶AÇF^&‚ˆ "ˆð £ð™pï3 |nnâ‰ÛÄõê×Õã¾ò?ÕdR=N:ôÔÖ{Z*«Û=|ßÅÔ;óûÊ?-9ôÆÛo¿ýöÛoZòNõÎpPÆ7ÏÈóÚ›º5・»c(ÌDÑ›- Q:t´¹Tó¨3e½=MuÊÆìqºÈ¤ëÔ¼Êê¶b«ÑÝTÚ*©ÉQ7±O Üþ|­¥¥ñ…V³æh¨<ᳯ‹ÅcP}޶î>½Yqµ×Ú:}šÙåñ'ªâj­mõ©…YfÅÓÝÔéÑ'TÅ`¡ˆè-Iju³SŸnÖ‹N¿Ò$Íí.ÃKŒˆDZ¬©jž­ôˆ’¦wŸ¬®t2™u"# u1©VK­­ (®p‡Eq4U¶zx´0Ù'hÖkF([d³c&Áñ›KÒFcuµ­:>w½Iñt7Tv+©–ÐN&Õ öÒ¢R%ߺ\q4Ø:ÕôcI‘£mT\ÜÕWâQôÆø+ Bhtl7q„AADá3Má3ÉÞ§%|t71ñD8‰Íçv z¢nxjWSÝI“Õ,öºJ»&]‚ÕjÜfË+—Ü_GCu£3¹ÆÀã>eüoæ®Øó§«¿íYýÝkùcæwŸùÞ¡ÓÕ÷ñˆ„Q!Ïãr‹¸K‹†-3å¿ô«:¿«Í)ƬQDùœ-ÍÍjâŽq:‰L̯*¬´Uçmó©¦äšÂå‘7µp»S’òw¨-¶œjjLέ*L‹‘ÄÜÂô¢Ê¢‡šƒy]vY™j+­,:aùUV~Ù[euAŽ&ŠÞœZX•Ÿ ÓI€…"¢3®´¨Íí¦•ˆÓLÒ鲬ú°Äý5eª­Ú–ÓèS –ÌŠš]î µ¾¢F³ÙêJsjUSꎲì¦Ò^1L_ö –5Æxw0[~Ïp³c%ÁšK\VUÙ ­®®à„[S –ÔâšÜå!V!D—[U¨•V—æ5êMÉéÃÔçlinÖ/ÏÞ7™¶AÇ6ñ# "ˆ"‚Ÿi ŸIö>ásO„ƒ%ÕÜP›“Óìxö¨'ûòüÂuE•¶¼VÕ˜¼£0ßWÔpåqÖª*±UV´ú½y]qU._s2…t÷UŸ>”½bÏ;ÿ¼”*ÞØ¾òÅ_„²Þûï¿×]wÍ™3‡CÜü½%› ´²ñoW @Hþò—¿,]º4„é›Ù+ö¼#ß:pb{}fýöæ«?Ó÷ýY–:]J!ïwÞùæ7¿yûÃË—/òÉ'÷ÜsO°¾Êó SK§(ŠNö“C y@˜Ë!f!]BÉ«¯r'œ‘„ y˜b~MÓüÚ°Ÿ’pi-¦ØŸ÷¥ï‘á?1.ÎÈÀTÑ-ùÑ÷cþ%æû?þ6_^;&ÎÈÀ”¹{UÉ¿¿]Âq¸œ‘„ y@ „ y@ „ y@ €Éš3gÎåË—§ #MÓE™™B&KUÕ?üp :ºpáÂwÜ1;2…<LVttôÀÀ@¿¦i·¨ MÓúûû¢££gçAžËó “4wîÜ{ï½w``àÂ… ·¨–§(ÊwÜqï½÷Î;K+Zòð%˜;wnll,ÇáÖáÒZ PÈÂ…< PÈÂ…< PÈÂ…< Ì‚>Ün7³„Á`¸›¾Cf.­Â…< PÈÂ…< PÈÂ…< PÈÂÀ\&ïóÏ?øì³Ï4M»ÛWåŽ;îˆŽŽž;w–V´(ä`²>ÿüó÷Þ{/66Öh4*Šr+ºÐ4íÂ… ï½÷Þ½÷Þ;;kyò0Y±±±ÑÑÑ·® EQbcc¯õ5 2÷ÈÀdù|¾¨¨¨)èèî»ïþì³ÏfçAž…¼þ¦›ôù‡-ì:²çæ5))k2v–·ôyED¼m»RF[³¿Ç?zkþ³'Ëwe¬IY“±³ääYÀCY'ØØL-où† bøòÊ>ãg‘™"Ôl5Æfƒ #´æþþ¶»6¯IIIÙ°uß‘®Á‰æß}[7¤¤¬ÉØYÒ2Nö;Û´sÍæ#g'Ô6Ø®y{›öoÝ’’²fóžCý<‰ "ˆ"|frøL²÷i Ÿ1v9ä~1Sy{ZÆžÖcÊ\¾|yΜ9SБ¢(·è|3ß (äyûZ*ëœÚÈ×õ‚‚F§ÉZVSSf5tWæÙ:¼"‘–üŠaÊr-ªb^iÔÚ\—-ÇÖ©·–U•í0Øm9¥7æŸPÖ 66Àí*pö'kÜ)BËVcl6Ø0Bkî?[—WÚ*©…U5U¹wcAQK¨9Îßw$§ Ù—\XSS±Ãä¬Ì)hcUZ=¬uHmƒíÚ`[i^µË’[USU˜äk.*h8ËÓ‘"‚ˆ Âg¦†Ï${Ÿ–ð òé3—§«¡®…y;fé½Gž¿ïж‡šÝ""úá/ÍíMNÖãû7ƉHBaaϦ‚ºÎÁ•ë£â—_?C³¿¥ÎiÈ>¶~Ô9›Þî†v-¹¢0ky¤ˆ¹¸gS^CçàÊ‘k…²N°±nWÁ²,kÉ¡d«1’QÐ$RsÕÕÔê6ç×ìJ‹S~W{^‹}pcL(9Îk¯kv› kv­ŒIH(ë·o«k=›f 8‹²Õy ÊÄÚÛ5énèVÖÕä®OЉ˜ {::ÙÙo‹á9IADá3ÃgR½OSøÙeeýÀL1½gäéŒÖªãÇ×dG¼ºk^ƒ9i¥aè×HƒQ/šodyÝÛQ]çK/LýÅïêrŠ)Íyeû¦4“âìpù'¼N°±·oIÆæC'¯\<”±sÓµK'¼}-%;3Ö¤¤¤¤lغ¿¡whùÕ«®\µ3t¥Ñ û¶¦ ]èàï;”‘2â—­Mý"2ØuhÏæ £.Yò¶íZ³ódÏÉ’­¶9;lk2v–´º|“ì}ZÂ'Ø.Ñá#Îzüøƒb.~éÕý ºQÓŠ ú[ òê|IùUÇj*¬{åÐlsgôè¼}'+‹líZjYv°4àí®=!몒¼EÑ4MTUñº.¾‰¯ÌjjqqV¢N$Á¬ï0§®½?-K¯.ßQ¸qÝú„H1)m yWÞËx\Åœ»neb”ˆÉhHs”€ uú•õD›Ó»^uv¸ ÉŸ½Ãå_¯8Ûܪ%ًͨZ}–²+—,Å—iŽM• ŽÜòDMͪ(ÉŠ‘þ¦Úne]M™5A'’X\|öÁœV/L[ö¼Ù¬1F¶ )I‚!5÷÷–oÊiõ‰3kÒC½B(*Éj‘ÒêÚ.c¶Eq¶Úª"CgLD&fíI¼:‹*­óYk2ãtûDÛÛµ˜¬Âì“ÛlÛî·‰ˆ¨–8MÑñL$‚ˆ "ˆð™á3ÉÞ§%|‚É1Ú"œ =K¯Õw¯O+$ÈmNý} u.Kñ‹»–GŠH¼©øìƒ9MöÁ´4>A8˜¹…¼Áž#¥Ev±l©*Þ•8<žúÛëìú¬ü€Ÿð(Š">ßõ<¤ù´aú:À,`ZiŠ"i¥Iiírû³bâÒÒ•^ûɦžÞGw·Ý'É"":³5ÝW´)Üœ¼2--591F'p¡)Í,•m.¯¾Ë¥&åotw×v¸¼J‡KÌV£ÎsÂ¥²ÌW:ʼҠtz$Q½Årå3_¿»Ç­˜s#FÇã…iË>7›5Fg+oÇžMEvMDÔ䪗ÊMcnöÆaL¨¹èL¹ÇŽg¹ìMÕ•yEñ/ZÒûÒ¨´â²Þ‚¢‚›EÄœ™¤6{Ô‘»ÚßRZçK¯ÊŒÓM¼mÐü>ØQ’SíKͭȲ¨>GKeemAµù¥ý‰"ˆ "ˆ"|f^øŒ÷Ôk²6]áôH†z+צAùœÏYð@ʰe†>ŸPÈCX˜¡…¼Á¶ýÛJ;ÕuÅÇóÓF¿T÷w69 “ßÀWÑUÍå¹ú1¤æóhŠaÔIß¡¬Ì2Šˆˆ&2ØUžSЮ$­[Ÿ¶17kcS^é•·<‘‰{þíõ¬žÎÎŽŽ¶ê¼ÚÊäâãåiQšÓŒ¾»Óa÷³Í·ÑÓâpF9|¦¦È1?CV”(…9fbö¹É¬qC¶ŠL*>þ¢&"¢¨zHðÍFˆÍýý}NÍ—¯ôtæµØ½ëÓ"C›I-ßó«ÿÌööû”˜(­kߦÖQ?ùÝ]NŸËñÐýW—4nKiN®z¥v|ÿ U<‘þΗq}°Ô 3.7‰³Íqå¥~W›C3þÒóPÖfg‡sèöt~g›SÓ't^{]«o]Õ±û¬ë—ÇßPªì:r Á¡&¦eí)9òbMºÒÙ` ¸P$ʲÞà>ÙÒâ6¬4Fªf‹ÞÕÒrÒmXoŽÑ›ŒŠ»Ãqív³Ž·b4þÀLgH4hŽ6×µÑuðeò˜ÎìssY#@¶ÒEÅ\©c³Á’`hÍ=¥9yu×nجi>M”PÏ-l;Pr¨Ç«‹Œ‰Ò‰×ÑâsšiÄžêÌùÇŽ9V‘iýº²cÇòͺÚÝ5MF…¸&¢ÆpBDA„ÏŒ Ÿ ÷>Â'è.‡zw׫w^WûÊÿT“Iõ8=êÐS[ïi©¬n÷ð}SïÌï+ÿ´äÐo¿ýöÛo¿qhÉ;Õ8ÃAßL<#ÏkoêÖŒ[ î0Eo¶$DéDdÐÑæRͣΔõö4Õu(³7Æé"“v¬Só*«ÛŠ­FwSi«¤V$GÝÄ:<5pûóµ––ÆZÍš£¡ò„ÏR¼.NAõ9ÚºûôfÅÕ^këôif—ÇŸ¨Š«µ¶Õ§f™OwS§GŸdP_€…"¢·$©ÕÍN}ºY/:ýJ“4·» [,1"i±¦ªy¶Ò#JvšÞ}²ºÒaÈ33|&Ùût„O\°#¼_„—HÑ|n× 7!ꆧ–Aq5Õ4YÍb¯«´kbÑ%X­Æm¶¼rÉÝhðu4T7:“k T¦ŒÿÍÜ{þtõ·=«¿{í/Ìüîs""ß;tºú>‘0*äy\nwciѰe¦ü—~µQ'âwµ9Ř5êƒ(Ÿ³¥¹YMܱ1N'‘‰ùU…•¶ê¼m>Õ”\XS¸<ò¦ÖnwJRþµÅ–SíQɹU…iQ"’˜[˜^TYôP³b0¯Ë.+Sm¥•E',¿ÊÊ/Ûb«¬.ÈÑDÑ›S «òt: °PDtÆ•µ¹Ý´Ò cšI:]–•W¾3J—¸¿¦LµUÛr}ªÁ’YQ³+ÐT¢ÖWÔh6[]iN­jJÝQ–ÝTÚË#†éË>Á²ÆïNf«Ñï9nv¬$Bs‰Ëª*´ÕÕœpkªÁ’Z\“»<Ô9‰.!·ªP+­.ÍkÔ›’Ó‡¨ÏÙÒܬ_žýÿ³wÿAQÝyÂï?3Âé2*ÚD¶ÁÙÆq[«ÒìÖ6•k#P ˜è<€ó€³#fGÍfdg Ùû 0Ï@Ï™ƒŽëà^·}ƽ îÙɅɘ-HRô­:U¡7£}ãÐ!ÒqŠ6©>ÆÊýDÀ>Ѐ -ïWY”Î÷üøžóéO?}Îéìøy´½]‹Î¬iÒë›+ 5ÅdÍ(k*Já5DD>K5|æ¹öû>ñz!¯ßaÅdK³:Nž:S0ådßRR–QQo/nWÍÉûÊJüŽÑ?Äç74ˆ½¾±´Ý¯­• E ûÅcx¼ñÒÑ‚­ß þçǨâMï+_~ùe(ó}ôÑG?üðŠ+è2àè¯ÚYªÕÌü¸bBòþûï?öØc!ŒHß.Øzð=ùóÃç÷žÎ=½·õöϬ'½t"”BÞ{ï½÷è£>x}xëÖ­?þñ_ûÚ×ôfø*ç—AQƒ2á'] y@ˆ  €eÈPõÆtá„+ò€0@!‹, iZ@›ð“. ·Ö`‘ýîŬEdâÖ+ò°X ›¾ýØ ‰ýÆwþ‚/¯Wä`Ñ<òDÕ¿½[E?ÌWäa€B(äa€B(äa€B(ä`¾V¬XqëÖ­EX‘¦iŠ¢,ÏN¦€ùRUõã?^„]»vmåʕ˳“)ä`¾bbb†††5M[ Uhš688844³<;9‚ó ó±aÆ¡¡¡k×®-P-OQ”•+Wnذ!"b™V´(äàˆˆˆˆ‹‹£·Öa€B(äa€B(äa€B(äa bÖáõzéh,&“i!¾›,ÜZ „ y@ „ y@ „ y@ „ºó÷Å_ }þù皦-ÄòEY¹reLLLDÄ2­hQÈÀ|}ñÅ~øa\\œÙlVe!V¡iÚµk×>üðà 6,ÏZ…<Ì×ÐÐP\\\LLÌ­BQ”¸¸¸ñu-ÃNæy˜/¿ß½+zä‘G>ÿüóåÙÉK£7ز×áÀ„)Ã=ÇË÷ïÚ–šº-gmÛÀˆˆÈHÇÔ©¶•÷¦.-påbíœm©ÛröW]¼ºÆPæÑÛ6‹+Ð_»}{Xî½`Ùgæ¬19S„š­¦Y¬Þf„Ö<0ØqøÀ®m©©©Û÷¼x¼gx¶ù÷Å=ÛSS·åì¯j›!û]iÙ¿m×ñ+³j«·k#ý-å{¶§¦¦nÛuðh× §"Dͪ‡g³^>÷ |æ¹öû>zë }`ˆ¥k¤¯ÍÁÑ["nݺµbÅŠEX‘¢( ô ¾¥o òFÚê›ÝÚä××ÒÒ³nK~MSSM¾©·¾ØÞ5"e+©› ¦È¦*Ö³aÊâzì…önc~MCÍ>“Ó^XÝuwþ e½m<¨‚gŸ²Æ]™"´l5Íbõ6#´æ+ÍÅÕí’VÖÐÔPdóž-­h 5ÇŽ–¶ú“ËššêöYÜõ…¥ÃÓŒ¢ª'´©­Þ® wT7zlE M eIþÖŠRÇNG"ˆ µ‡gµ^>÷ |æ¹öû>zƒ»†XÒ|=Žæ6ÆíX6îï3òGŸy¶Õ+"bœøÒÜÙâ6í>Sž/" ee};K›»‡S2£7n¹s…æ`[³ÛTp*sÊ5›#½ŽN-¹®,oK”ˆµ²og±£{8eò\¡Ì£·m€•^öQô²†N¦%[M“Œt“`HÍUOK»×ZÒt =ZD,%=ÅmÎáìØPr܈³¹Õk-k:-’P3è|¦¹ýJz~|ÐQ”½ÙgRf×Voפ×Ñ«d4e&D,e}ÝÏ^ìÌåœ$‚ˆ z8ÙúzAøÜ‹ð™×ÚïSøèmsHCXZîïys~Ù3gš Ì“^eµ“5)Å4ök”ÉlÍ?¹¼>ÒÕØìÏ*Ëšú&?àéq‹%Ý5º|KºEqwy³žGoÛ€C ¿*g×Ñ®‹£7åì/o¿ubd ­jζÔÔÔÔí{ÊýcÓoßu0zßÛØFwOtìI»Ñ!0p4'uÒ/{ZEd¸çèÁ]ۧܲ4Òq`Ûþ‹}«ölßsüÊ„ÍØ–³¿ªÝãça1âB'ûèg™3…^¶š&…’§Íeª5-ݪŽÍ¦ r×Að-÷{<šÉj¾ÝÖ´Å¢xz<#""ƒ-{RSö&Œ¢´ü²<Ó¬Úêi¢¨cƒ2ƒ¢*ŠbT8#‰ "(´š¦-Ÿ…Ÿù­ýþ„îÀ3¤!–¸+Ž]Ïœõj®êÛkûS†ƒm{¶ío»}æpÛþ;¿ô·”{rÔòT„“ûü­µ†èØøhq«“&n‘\PÒP NG}ca…ñÜÑôè@cq½ÓVTYdUýÎû‰Šæ¤s7ÊÀ‰R{·¹ ²Á¦xÛíö-¯¶yïžX“”d<Ñë>íw9}"ât K|´ÏÕë3%ÙŒþÃÏ–¶›v—5¤}OØKŸõ7{1Á "š§Ùî°f%›d¸«º°Þe+¨l°)nG½½Û¯$sȰà)I'ûhnݬ1C¦ÐÏVÓ$£™“àLÍk«ÆÚt7wúÌy¶ØÐò¯¢*âóúƇF^¯&š×/%ª%;7W6 ¶Ø›µü¦\³óâ¬Úêîš!)ÛÚØÜÜ™]™iòu8zÍei\ AA!FÐ4mAø,DøÌ¬Ðåw»|~wéŽÔ ÓL~¡‡°°D yÃåÏTw«•gJÒ§¾Tv·¸MÙÉÁ­ͪæñÝþ _óû4ÅdRg=°Ì(""šÈpOmai§’”‘™ž]”—ÝR\=úÖ&*ñ࿼™××ÝÝÕÕÑX|¢>¹òLmztЉÖt³ßát»œ~sÕæ5ûÚ\îh—ß²Ï5í'œŠ­0jÇRÌ>sÌwe«¨¤Ê3ç4E5Dôt3Blpk¦„ø¨¨Øø¨Øø¥¯»¸Í9’™ÚMvÑ[þòÿ)ô+±ÑZÏ‹;ÛÍ“÷4àíqû=®gŸ:{{ÊÙgR[“.Ô&fj«»kÃÝÍ’ÑT–—`‘–š+½Ïv÷x%‘gõADPhïCi Âçž…Ï,×¢…Ÿ9†#Ýa…6þØSMĘU×o¾S¸UT¾fë>y»j÷Á»r2öéÃ͵OsËA²•!:vTt”ašÅê%ÁКûº« ‹›Çجi~M”P/.î8\u´oÄmW›K¬é–I{j°–œ:3æT]®IŒ5§N•X !´ÕÝ5M¦„¸&¢ÆrED…A!µásïÂgÖk_ á#s<"ìÝ©Þxú¼£ÿS-Õçö©c§¶Ñ×Vߨéãû.ßå­ÿ¯MGûî»ï¾ûîonz¯ñß/Ó)3[ŠWä8[z5ón“··k,ÌD1Zm ÑvuxTë”+eGúZš»”ì‚ìxCTÒ¾ µ¸¾±£2ßìm©n—´ºäè9Ì響½ºzcY¾Us9êÏûm•ñ¢øLªßÕÑ;`´*žÎön¿fõø‰ªxÚO´ûÕ²<«âëméö“Lªâ2QDŒ¶$µ±Õm̲Å`L±Hk§Ç´Û+"Q¶ü4µØ^}\)H7z/6Ö»L¹§¬™2ŠMË·°—VÄ—í³)®–úvG ÷3ûèféF$Á²Õd:‹6 ÎÜ\’²ÍöÆE™Å×ë¨ïUÒêl!>ó^5‰³º¢Z)Éߢ¸ön5ëTRÔ”D{ç•xE£yãè„™Ûuv-69ßÖh¯¶o,ɳ©~WKýy-¹&™Oʼn "(´ŠÖ_/Ÿ Ÿy®ý~„îèn.=Œ¥(J4¿×3<’}שeR<-Í-ùVq6×;51‰ˆòóÍÏØ‹k¥(Ûäïr4žu'7™¨,šÀÛE[þ×íß>ùWãùÏÜ¿ú¹ˆÈ_½Ôø8G$Œ y>WÄ{¶ºbÂ4KÉk¿Ì6ˆ<n1çMù˜ÄïnkmU÷eÇ$*±¤¡¬ÞÞXüŒ_µ$—5•m‰šÓ<ÀƒNI*Ù§¶Ù }ª9¹¨¡,=ZD‹Ê²*ê+žmULÖŒ‚šÕ^]_qÞö˼’šÝöúÆÒBM£5­¬¡$Á` EÄ`N±©­–“ADÌééöØRƾ0,±¼©Fµ7Ú ÏúU“-·®é@°'¨DgÖ5iv{suá Õ’¶¯¦ ¥ºŸ#†û—}ô²Æ4ïN‚f«©ï9ƒ.vº$Bs‰Ïk¨¶77—ž÷jªÉ–VÙT´%Ô!½!¡¨¡L«n¬.>k´$gMP¿»­µÕ¸¥ ;~mEo×¢3kš´ÆúæŠÂFM1Y3ÊšŠRGADPȤۄτÏ<×~Â'~–]pc²¥Y' O)˜r„·””eTÔÛ‹ÛUsò¾²…côñù b¯o,m÷+FkFeCQ/‹Çðx㥣[¾üÏQÅ›ÞW¾üòËPæûè£~øá+VÐeÀ Ð_µ³T«™ùqÅ„äý÷ßì±ÇB‘¾]°õà{òç‡Ïï={zoëíŸY/þN;zéD(…¼÷Þ{ïÑG}ðúðÖ­[üã¿öµ¯éÍðUÎ3,.ƒ¢(eÂOº$ò€0AË!¡ê7è Wäa€BY@Ó´€6á']n­À"ûÝ‹Y/ŠÈÄŸ˜Wä`±6}û±Aÿûïü_^;-®ÈÀ¢y䉪{·Š~˜ ®ÈÂ…< PÈÂ…< PÈÂ…< PÈÀ|­X±âÖ­[‹°"MÓEYžL!ó¥ªêǼ+ºvíÚÊ•+—g'SÈÀ|ÅÄÄ jš¶@«Ð4mppphh(&&fyvrçæ)""bÆ CCC×®][ Zž¢(+W®Ü°aCDÄ2­hQÈÀ=G?,n­Â…< PÈÂ…< PÈÂ…< PÈÂ@Ä"¬ÃëõÒÑX&L&ÓB,6"|7X>¸µò€0@!ò€0@!ò€0@!tæï‹/¾úüóÏ5M[ˆå+вråʘ˜˜ˆˆeZÑ¢€ùúâ‹/>üðø¸8³Ù¬(ÊB¬BÓ´k×®}øá‡6lXžµ< y˜¯¡¡¡¸¸¸˜˜˜…[…¢(qqqãëZ†Ì3ò0_~¿?::zVôÈ#|þùç˳“—F!o°eÿ®Ã S†{Ž—ïßµ-5u[ÎþÚ¶‘‘Ž©Sm+ï L]ZàÊÅÚ9ÛR·å쯺x%t¡Ì£·mW ¿vûö ±Ü{Á²ÏÌYcr¦5[M³X½Í¸‡Íç¶§“]iÙ¿m×ñ+Úç(?³-5uûþª¶àƒ-="ˆ"‚Ÿ¥>º¥Nã{>£9“vú`O ôÐéo)ß³=55uÛ®ƒG»9ÃÒH_›c¦³‹äÖ­[+V¬X„)в@Ïà[ú–À­µ#mõÍn-mRN(-=ëÏ(©)±ˆËa¯/¶ÏÕ¦DÙJêê|ã3i‡ý„¤˜ S×c/´÷ÚŠjÌÞ»½°Z=W›5ûyô¶ ð ÒÉ>Óg»2EhÙjšd¤·÷°ùœöô®‘Pu£[3%ÝÐi‰5 IDAT9Š‹›ÕܲºéqÔ×7Zν˜`a›Cî1ADDø,…ðÑ(…r/DøˆÏãW“KʲM£ãRŒVƒ~orÛáŽêâFoFYC™Éw±±º¢4úÌ¿äÇsF†_£Ù©feÆóÒ y .0pô™g[½""Ɖ/¯-nÓî3åÙñ"’PVÖ·³´¹{8%3zã–;Wh¶5»M§2§\³9ÒëèÔ’ëÊò¶D‰X+ûv;º‡S&ÏÊOó:Šs¶¥¦nßuàðG¥ÍÜ66)Ûêooî¼À`‡£×\P–Æõ¬á&>ÿÌ™Ý&ÅZùÚå †)à ]ƒm¥ÅÍþ¤’†SMuù&gýØhKzëF.ÖWØ;µ´š‚‰Wé=q^2’‚¼Æjš&ªz'¥(ª"âŸý<À2 ¦UVæ%D¬ÆÁo6w¦çÕ-ûʲ32¢DÄ¢t8н~ŸÇ§X‹2R£E,fSº×¤h0¦ØÔóî‘LÕÝå5%ÛüÎ.O SqwxU[ºYsV´ûme5Ò£EdcæÚYïpÕ&Šˆhj^]U^¬ˆ ¶œèU2šjò "‰••W¾UØÎñÂ}Ë>ÃsÍÓd«’‘N¼'Íg»§Q‰yo„ª›ýùM¹ñŸsâöøEs×·¥•”Õ™5wK}}¡Ýx®6%zBÛ{rúDA„ÏR=ÓœÆ >âóøD%½¤®Hõu4Ûí…¾±ìÍÜVbóÊ .>cæ)»ˆˆj‹×4jááfìˆ×hï +DçëKŽf­òÜ-Q"²ÑRyå[…-Îáôt^A–n!o¸ïxuÅY§Øv7THœOƒÍNc^IÐÏ—E¿ÿNÒüÚ„€}`°¤XÆ¢È`I±(í=Þ@^l|z–Òï¼ØÒ×ßçêíuú%YDÄ`ÍÏ2Wì̱&'§¤§§%'ÆD‚N´¤[¥¾Ã3bìñ¨I%ÙÞÞ]ž¥Ë#Ö|³ÁwÞ£™ò¬·:ÚšbÒ.º}’¨ŠˆÑfýÌ7àíó*Ö"ó¤­ãxá¾eŸ¹f©Ùj¤ëàÎ §&"jrÃkµ–i{÷f̳ù½ÚÓÁ¶êfVCîÔ§I+¢ˆ˜v×TeÇ‹H¢E{ìQvtèùwºü"ˆ"‚Ÿ%>‰:çX(§ñB„Ä瞺5:9Á¢xvV4wN^¯nÛ᮪ÂFZQ]žMõ»ÚêëO”6Z_+O$ŽÂÛø°B—ßíòùÝ¥;R'L3 ø…B(äÍ#u”?SÝ­fTž)IŸúr;ØÝâ6e'ö‡b4«šÇwûsÍïÓîz`B(óËŒ""¢‰ ÷Ô–v*I™éÙEyÙ-ÅÕ·? =ø/oæõuwwuu4Ÿ¨O®sÌwe«¨¤Ê3ç4E5Dôt3æÙüíiÀÛãö{\Ï>uöö”³Ï¤¶&7\¨4EMì‘9Ñ$-ƒ~‘èóï´ùDD>K%|ôÞÊ…p/DøÔ&¢&|½m”eË]ëÕm[âi¦²¼ƒˆl´Ô\é}¶»Ç+‰|omxlt‡š¦=°G1fÕ5äO¸ÕZQy½FÞ®Ú}ðßÇ®œŒ}úpsíÐ+3ùê’<”]v{¯¹àÔ™ò Û<æL½w)ó‹¸;\£Ïcx:\šeêW®‡2° ¸»ÜcO ¸;Üš1Ñdq6·û3N~1?sËF“âKuÃ=Ç;\jbzÞÁªãçš²”n‡s8èD‘h[¦É{±­ÍkJ1G©V›ÑÓÖvÑkÊ´F‹-fÅÛåܬ«Ë«˜-S?03˜Mš«Ã3¾u]n‘‡û˜}æ–5‚d+Ctì¨è(Ã4‹ÕK‚ól~oöÔ`-9ufÌ©º\“3jN*± æ³æé¹·#ž>¯7ª³È¿ÓçwADDø,‘ðÑÊi¼á3ÜU¾ç€cü› ‚­W·­&SÞcj"j,÷j=`îTïF<}ÞÑÿ©‹êsûÔ±SÛèk«oìôñ}‹ïò¿Öÿצ£¿}÷Ýwß}÷·G7½×øï—é”™-Å+òFœ-½šy·ÉÛÛ5f¢­¶„hƒˆ »:<ªuÊ•²#}-Í]JvAv¼!*i_†Z\ߨQ™oö¶T·KZ]rôæáÔÀƒÏß^]½±,ߪ¹õçý¶ÊŒxQ|&Õïêè0ZOç {·_³z|DU<í'ÚýjYžUñõ¶tûŒI&Uñ™("F[’ÚØê6fYb0¦X¤µÓcÚm‹‘([~šZl¯>®¤½ë]¦ÜSVƒLy›–o;a/­ˆ/ÛgS\-õí>ŽîgöÑÍÓš­&ÓYì´IðÞ4ŸÃžÞIÑññ·w^‰WD1š7ÆG‹ˆ!¹ ¹±´Â_’gÑœÍön5£ajr®'Cè1ADDø,…ðÑ­{/løXRŒn{…]-ɳ*¾^‡½[Íjš>zm“ómöjûÆ’<›êwµÔŸ×’k(ˆ‡£(Ñü^ÏðHÂÔQM&ÅÓÒ|Ñ’ogs½S“ˆˆ!!?ßüŒ½¸VвMþ.GãYwr“‰*À¢ ¼]´õàÝþíà“5þ—ÿÌý«Ÿ‹ˆüõÑKsD¨çóxE¼g«+&L³”¼öËlƒHÀÓásÞ”¢üî¶ÖV5q_v¼A¢KÊêíÅÏøUKrYSÙ–¨9Í<蔤’}j›½°Ñ§š“‹ÊÒ£E$±¨,«¢¾âÙVÅdÍ(¨©QíÕõçm¿Ì+©Ùm¯o,-ÔD1ZÓÊJ  2QD æ›ÚÚiI1DÄœn‘n-eô> CbySjo´žõ«&[n]Ó`ó‰Î¬kÒìöæêª%m_MAKu?G ÷/ûèeiÞÍVSßs]ìtIð5ŸÃžúÝm­­Æ-Ùú7Em©l*«·7WzÅd˪i*{ÄЄ¶ú=R"‚ˆ Âg)„ϬOã… ŸØÌºSRoo®.ôúUsRVÝ© †ÛFgÖ4iõÍ…šb²f”5¥ð´0d²¥Y' O)˜zV–”eTÔÛ‹ÛUsò¾²…côñù b¯o,m÷+FkFeCQ/¡‹Çðx㥣[¾üÏQÅ›ÞW¾üòËPæûè£~øá+VÐeÀ Ð_µ³T«Ñ\1³òþûï?öØc!ŒHß.Øzð=ùóÃç÷žÎ=½·õöϬ'½t"”BÞ{ï½÷è£>x}xëÖ­?þñ_ûÚ×ôfø*ç—AQƒ2á'] y@ˆ  €eÈPõÆtá„+ò€0@!‹, iZ@›ð“. ·Ö`‘ýîŬEdâÖ+ò°X ›¾ýØ ‰ýÆwþ‚/¯Wä`Ñ<òDÕ¿½[E?ÌWäa€B(äa€B(äa€B(ä`¾V¬XqëÖ­EX‘¦iŠ¢,ÏN¦€ùRUõã?^„]»vmåʕ˳“)ä`¾bbb†††5M[ Uhš688844³<;9‚ó ó±aÆ¡¡¡k×®-P-OQ”•+Wnذ!"b™V´(äàˆˆˆˆ‹‹£·Öa€B(äa€B(äa€B(äa bÖáõzéh,&“i!¾›,ÜZ „ y@ „ y@ „ y@ „ºó÷Å_ }þù皦-ÄòEY¹reLLLDÄ2­hQÈÀ|}ñÅ~øa\\œÙlVe!V¡iÚµk×>üðà 6,ÏZ…<Ì×ÐÐP\\\LLÌ­BQ”¸¸¸ñu-ÃNæy˜/¿ß½+zä‘G>ÿüóåÙÉK£7ز×áÀ„)Ã=ÇË÷ïÚ–šº-gmÛÀˆˆÈHÇÔ©¶•÷¦.-påbíœm©ÛröW]¼ºÆPæÑÛ6‹+Ð_»}{Xî½`Ùgæ¬19S„š­¦Y¬ÞfÜÃæsÛÓÉ®´ìß¶ëø• ís”ÈÙ–šº}U[ðÆÁ—8š3©ÃöñDD>K7|tJ!œÆ÷>|fs =,u#}mŽ‹¼¥áÖ­[+V¬X„)в@Ïà[ú–À­µ#mõÍn-mRN(-=ëÏ(©)±ˆËa¯/¶ÏÕ¦DÙJêê|ã3i‡ý„¤˜ S×c/´÷ÚŠjÌÞ»½°Z=W›5ûyô¶ ð ÒÉ>Óg»2EhÙjšd¤·÷°ùœöô®‘Pu£[3%Ý9Š‹›ÕܲºéqÔ×7Zν˜`-ÿú<~5¹¤,Û4ú$Åh5p>ADDø,ÑðÑ(…r/DøÌ&æzXú|=Žf§š•Ï¡…¼8ú̳­^ãÄ—×ηi÷™òìxI(+ëÛYÚÜ=œ’½qË+4ۚݦ‚S™S®ÙéutjÉuey[¢D¬•};‹ÝÃ)“ç e½m<¨ô²¢—5t2E(Ùjšd¤›ï]óYïi°‘½Ùgšð〫Ùᵕ;˜-’hQ}¥mn¯$ć”}¯˜ò“S¶DsADDø,õðÑ[{(§ñB„Ï,B`N¡KÌý½µÖ`Îo8sæLSyRfÐFLÖ¤ÓØ¯Q&³Q4ÿäK&Gº›ýYeY±S³Š§Ç-–tëè§7KºEqwy³žGoÛ€C ¿*g×Ñ®‹‡ìÚ–šš³¿¼eü¾†‘¶ªý9ÛRSSS·ï)wôM¿}·Cjê¶]ö ëLtìI»Yaô.‡‰¿ìi‘ឣwmOMMݾçÅãc ’‘ŽÛö_ì»XµgûžãW&lƶœýUí?‡ ‹:ÙG?kÌœ)ô²Õ4É(”$8Ïæ³ßSlÙ3ñV¥+-öf-¿,Ï4a{:œ~KvÒØ *jKùñÚìÑÐx[Ýå|~ÅdR9 ‰ "ˆ"|–~øèâôOã ŸiB`>¡‡ðqű뙳^ÍU½c{m`ʰb°m϶ýmcCnÛç·‘þ–òÑaOÎÚ6ž¦ y!Wò¢cãããÍ“_v =>~AóH£Ý«Z­“>íp4:-yïºrVóyüŠÉxûSÅhR4¯Ï?ëyô¶ x`hÞÖê¾ô¢††š<£«±°¢cXDýÅõNS~eCSCM¾Ùy¢¢y 8QjïVó*šêJl¾Ö {ÏHЉƤ$£·×5,"~—Ó'âuº†EÄçêõ™’lÆ@ÿágKÏki% §J’ü­¥ÏîKšš§ÙîÌ¢¢L“ wUÖ÷ó*Ê25‡½Û¯qİð)I'ûL“5fÈúÙjšd4sœwó9ì©jÉÎÍM7ÝÙ›µüÊ\³2ñ%ÅãSTûxþÎcÆÛê._óy|š×Qœ³-5uû®‡yÊ DA„ÏÒ ½µOs/høLó =„øü3gv›kåko”'¦ +t ¶•7û“JN5Õ囜õc£! D,é­¸X_aïÔÒj &>¨`¤÷ÄyÉhH rí´¦i¢ªwRŠ¢*"þÙÏ,jZee^¢A$ÁjüVasç`zžQݲ¯,;#3!JD,J‡£Øëñy|е(#%1ZÄb6¥{MJЉcŠM=ßáÉTÝ]^S²Íïìò2w‡Wµ¥›5gE»ßVVs =ZD6Öh®õWQm¢ˆˆ¦æÕUåÅŠÈ`ˉ^%£©&?Á ’XYyå[…í/Ü·ì3<׬1M¶ )é$Á{Ò|¶{•˜w0ñöH¨ºÙŸß”oð9'n_4w}[ZIYYs·Ô×ÚçjS¢'´Õ]¾ÏãM”ô’º"Õ×Ñl·ú¦y6ˆ "ˆ"|îgøè™æ4^Ðð™&æz'cgéxöΰBƒ· 8š=¶Ês¶D‰ÈFKå•o¶8‡ÓÓ9ö 7Ã}Ç«+Î:Ŷ»¡ò@âÄxìlvóJ‚~¾¤(Šøýwòæ×&tèóË€%Å2EKŠEiïñòbãÓ³”~çÅ–¾þ>Wo¯Ó/É""k~–©¸bgŽ599%==-91Ö t¢%Ý*õžcGM*ÉööžèòŒ(]±æ› ¾óÍ”g½ÐÑÖ“vÑí“DUDŒ6Ûèg¾oŸW±™'mÇ ÷-ûÌ5kLÍV#]wV85Q“^«µL»Ø»7cžÍïÕž¶U7û³r§>MZEÄ´»¦*;^D-ÊØc²£CÈ¿ñ¹§.äFE.2Á¢xvV4wNn "ˆ"‚Ÿ%>‰:¥½PNã…ŸPB`>¡‡04>¬Ðåw»|~wéŽÔ ÓL~¡ yóHcåÏTw«•gJÒ§¾Üv·¸MÙɱÁó‡Ñ¬jŸ6V•×ü>í®&„2°Ì(""šÈpOmai§’”‘™ž]”—ÝR\}ûÃЃÿòf^_wwWWGcñ‰úäÊ3µéÑA'ZÓÍ~‡ÓírúÍV›×ìks¹£]~Ë>KÔ´Ÿ!+J´Â÷La)fŸ9f»²UTRå™sšˆˆ¢ "ú‹ ºól~ö4àíqû=®gŸ:{{ÊÙgR[“.TŠ¢&Ž?öÈœh’–A¿Ht(ù×5áÚ¡(Ë–»Û‚"‚ˆ Âg©„Þ[¹Nã…ŸÚÄC`^¡‡0Ùè+4M{`&b̪kÈŸp«µ¢ÆÒw‹oäíªÝÿ}ìÊÉØ§7×>ñ½2“¯.ÉCÙe·÷š N)òþi°»ÍcÎÔ©ã‰Á¼Å"î×è³ ž—f™ú•ë¡Ì,î.÷ØDî·fL4FœÍíþŒ†S‡_ÌÏܲѤøÇRÝpÏñך˜žw°êø¹¦,¥Ûá:Q$Ú–iò^lkóšRÌQªÕfô´µ]ôš2­Ñ"F‹Yñv¹Æ7ëêò*fËÔÌ ¦D“æêðŒo]—›Gäá>fŸ¹e ÙÊ;*:Ê0Íbõ’à<›ß›=5XKNsª.×$ÆŒšS§J¬ƒ9ŬyznÇ툧Ï+ÆjHùw¸«|ÏÇøC¦ƒ¶DA„Ï =¡œÆ >!„À¼BaïNõnÄÓçýŸj±¨>·O;µ¾¶úÆN]|—ÿµþ¿6ýí»ï¾û=ºé½Æ¿L§Ìl)^‘7âléÕÌ»MÞÞ®±0Åhµ%DDdØÕáQ­S®”ékiîR² ²ã QIû2ÔâúÆŽÊ|³·¥º]Òê’£ç0§|þöêêeùVÍå¨?ï·UfÄ‹â3©~WGï€Ñªx:OØ»ýšÕã $ªâi?ÑîWËò¬Š¯·¥ÛgL2©Š?ÈD1Ú’ÔÆV·1Ëjƒ1Å"­Ón[¬ˆDÙòÓÔb{õq¥ Ýè½ØXï2åž²D&êbÓòm'ì¥ñeûlŠ«¥¾ÝÇÑÂýÌ>ºYcA³Õd:‹6 Þ›æsØÓ; 2:>þöÎ+ñŠ(FóÆøh1$$7–VØãKò,š³ÙÞ­f4LM®zË·¤Ýö »Z’gU|½{·šÕ”ÌÕDD>K3|ôDëžÆ >ú!0ŸÐCx‰Íïõ $L=zªÉ¤xZš/Zò­âl®wjb1$ä盟±×JQ¶Éßåh<ëNn2QX4·‹¶ü¯Û¿|ò¯ÆÿòŸ¹õs‘¿>z©ñqŽHò|¯ˆ÷luÅ„i–’×~™m x:ÜbΛòA”ßÝÖÚª&îËŽ7HTbICY½½±ø¿jI.k*Û5§y€’T²Om³6úTsrQCYz´ˆ$•eUÔW<Ûª˜¬55ª½º¾â¼í—y%5»íõ¥…š(FkZYCI‚Á A&ŠˆÁœbS[;-)&ƒˆ˜Ó-Òí±¥ŒÞ³`H,oªQíö³~ÕdË­k:ìq—Ñ™uMšÝÞ\]xBµ¤í«)h©îçˆáþe½¬1Í»“ Ùjê{Π‹. Þ£æsØS¿»­µÕ¸¥ ;^w¶T6•ÕÛ›+ ½b²eÕ4Œ=FiB[åÇfÖ’z{su¡×¯š“²êNH ADDø,Õð™õi¼°á£ó =„“-Íê8QX8xêLÁÔ#\R–QQo/nWÍÉûÊJüŽÑ?Äç74ˆ½¾±´Ý¯­• E¼r."Ãã—Žl=ø^ð??Foz_ùòË/C™ï£>zøá‡W¬XA—€@ÕÎR­FÿqÅÌÊûï¿ÿØc…0"}»`ëÁ÷äÏŸß{:÷ôÞÖÛ?³^üúàõá­[·þøÇ?~ík_ӛ᫜gX\EQ Ê„ŸtI(äa ‚.–!CBÕoÐ „®ÈÂ…<,²€¦imÂOº$ÜZ €Eö»³^‘‰?1#®ÈÀb1lúö7bƒþ%ößù ¾¼vZ\‘€EóÈUÿöný0\‘„ y@ „ y@ „ y@ €ùZ±bÅ­[·aEš¦)в<;™BæKUÕ?þxVtíÚµ•+W.ÏN¦€ùЉ‰Ô4mV¡iÚàààÐÐPLLÌòìäÎ3ÌSDDĆ †††®]»¶@µ¸µò€0@!ò€0@!ò€0@!ò€0@!ò€0@!Kb+†.ü]ÕÕ—|עܞòiß/Nžít^þXVÿÙÖ¼—÷>mY%þKåÿãÈÀä–‘[«Nÿ(A™4M»Ú~òØ/. øW­OÞ}èå'×)w¯1”yô¶ ÀâÒ>8öÍš?:ù’0ÄB –}fΓ3E¨ÙjšÅêmÆ=l>·=Ìs¡ôï.ØþéÕ|óí…:_;ù‹7œï_ü³ÇóðÂÓf%ÔmÖ†.ýüˆ£}à“›Åm~zïËù‰FÎF"ˆ"‚Ÿ%>º¥Nã{>šC5ùÊ IDAT»ù…çÞ¸~çÏÖòÿ¨NTB ½¦#,øz:ò–osÕÿýý„à‡þÓK÷¯ӎ4쎡·ö–Ày7~þä¯ÿû検ÐZ[û.¯ß]Zs¬4Çä÷“òòñÿ{¯uUäÆä¸)qz£÷XùOzWï.­úQÞZç«å?ì½q÷*C˜GoÛªàÙg†¬qW¦-[M³X½Í¸‡Íç´§S\½ðÃÓ—'ì·æy­êû-×­{+~vèi£óä¡Óh!n³võtÕ‘vÙúrUÍÏö&x_¯ýÇß q:ADDø,ÕðÑ(…r/Døˆï7Vm~îßÞñŸíݤ„Üv†éŸö¶¼åßZúOßMàs,÷÷Š<ÍÝ|è¹7>Y=ñeôRëåµß>òBÖ:Ùôòóý߬méþ4)cÍדÖÜÉç[.›òë2ÖLÉ(γoßÜZþBnâ*‘?èîû¯÷ú’ž4Îv½m<¨ô²¢—5t2E(Ùjšd¤›ï]óYïiÎj=ökßÚÈ isàôëŸüå UßÛºF$ÁòÐõ—Þ¼ì•Mæ¶Y½z¡ý“_“Ÿ¶F$aýß;/}ÿÍ~ßÓ1\RDADá³ÃGoí¡œÆ >rÝ3$¦œÍɉkfìè»ÚN?áâ¦_‹4Z7šVÑXîïyŠ9§êŸ9¶;nRfÐ>3m´%¯ûUYgÍ?ùóïéÓ7ž~ù©©×ÅjWnYŸ¶i4‚ËÖõ‘—ßñh³žGoÛ€ƒöÁϾù|s÷oñüó»ŸÌ{îï^¹à¾ý©§ÿ÷¿ùaésOçå=™÷¿}å5רtÍóÛcÏ?·ûɼ¼§Ÿ¯üyß§:‡Îçý㪈ˆöûŸ?—÷äóÏØ¾çž,¾à‘Oû~^ùü7òòžüNñKŽ>ߨÊKÏï.mïÿí‹¿ó·Ž«6c÷7KÖ~õ‡ ‹:ÙG?kÌœ)ô²Õ4É(”$8Ïæ³ßSñ^(~2¯²÷v®ô\8vúfÎË;ÖNØžKÎÏÖgÙÆQjâ ¯¾ôôèàm¼­þòWYßj½ýæ[]­ˆvSãŒ$‚ˆ "ˆðY’á£;ˆÓ?4|D»îþ,Ò¤„3sÛi§#L|z¾ô…c¸ù߯~÷éWú5ÝáÌ3&ظF䯭¯”~swÞ“yÏ=ì7n^F±„Ýçgä)kbÌkÄ?ùeWùzþ‘Úñßnô¾þÖÇÙ¬“>íùýÙÓý–½ÏÝýÜ:íúÕ‘k·?MQVÇ(7/ûnˆ(³›GoÛ€ç-ã'oüðìæï>Wõ]é?{òôó¯¬þUõV£öÁÏ«N:öþ`ïFõFë±³ÿøkÛ¯ö}]~ïxéÕ^óîC?Kˆô¾yú'u¯&¬° Ý=±4ɶú¤ó_þ:ãçuéw}*æ5×]Îëb³µ~úRmûÚœ—«7^ëÇjÿîFͯ¾»I‘›WO{ÝúÔÞï%­•O{XqÒ•°ûU Êå×úê;7"7sȰà)I'ûh—u³Æ ™B?[M“ŒfN‚ón>‡=U×?ý?·GšFÿ0táÇ¿¾¹»v‡¹ÿ­ /)W?\åëg÷ú;ÿ}cÕŸmÎ{ù»c=o;Í6ÿèûcãû}ïé·¯ÿéög$DA„Ï’ ½Ò4§ñ‚†Ü¼î¹~S{½ê›5ŸF®}tkÞË{Ÿ}6ßÌm§™Ž°±&«î˜V|¨=çØ?=¹F´~l8£Ü Ž ãš¤UCçkªNGîx¹êyã WëÉ“Ï×­úUÅV.m…¼Ù»ñûö_ÔýämíÉÒÝÖ IÈï<{^ž8b rí´vó¦¬Z¥Žÿù"âŸý<À2ðPÚ¡C¹ ŠÈ&ëêOþ¦â×C[sW¯JÚõ|ÖOZW‰ÈzåÒë‡>ùLDäú|‘›¾÷D’mÈúu¦Ç?1E¨“¬«Þ|Û}ãIÛåw¼k7ÿåþî?hÊåÎO²m]§õ׵߰¾üJ~Úùú´ÿyòu×Þ—l""7Õ?Ø#"Þ Žw"Ÿ8VºÓªˆ$úÁÕ^àî_öñÍ5kL“­BJF:Iðž4Ÿížª ;¾—06âi=òkNmî:Å×?q{>“›®Ÿýæñï?_a¾y¹õäÉç­þÕKIÆ mgèIíƒ?WñŸ‰Äm?öô:NC"ˆ"‚Ÿ¥>z¦94|äúUŸÜ”È­_±W½~éô±WŸ¿¾êW/%©¡´ÕŽð¥3œ¹sÂ×h¿ýôÕ„¼šŸ´JD¾þò¡«SqÁùéÖ´5ô'–¢¥[Èóõ;~øÊëÿ¯X¿]UóÝ„‰4ÔÙÒoÜüó%%2Rnܸ“‡n~¦M½Ò.¤y€e`}òú±_Y¿ÙùVï'Zn̺´§"]ý¿mu 8?pöº>“Í""ʦœ¬µUÿë»Ï=ºysòÖ­i›LŠHЉë·ZådçÕFçUÕö\Ö'Î_ô^õG¾ã‘M»×)¾ß\½¹v‡õv@7mþ“›o¹¯‹m•ˆ¬¾ý™¯æíÿ$rÓÞÛ_s¦X6¯|‹ã…û–}æš5¦f+oå7ë\7Eä¡Í?;ù’eÚÅÞ½ól~¯öÔû›#§o<}dÇÔ/T$Rdí·_ú~Ö:I°DŽ=ö(kMÈùWYÿ½º#¹Wû[OŸ<ôÊú_U?ÉÇàDD>K0|l:[Êi¼á#ëvüÓéêªÑÉ›~ù‡oÖµtN^¯^[Ýe"|)Á‡3wþlã»<ðég—ÿaoÞ„׺? y 7›4vé•¿=òŽúÄ¡~nëÔï,z§õòÚ¬ÍÁ¿5ZY½nÕÍ«¾›c/üÚëZäÚ)ϼ e`¹e<MäÓ¾WÔvFÚ2žxYç{sÀ½úÿú]–UÓ~†iTx…¥˜}æ˜5îÊVªíÐÿu즈Hä*£"¢¿Ø ›1Ïæ÷hO5¯óò? <—ÿúí)¯'ïÂÖªÓ?X½:2r•mü±GëLrÁû™Èš™ó¯6ô{÷ÍëºUjÌ:K̺¿Wú»«ÞtÞx2ÔLADá³ÃGïÝd§ñB„ÏuœêzÛ]ëÕkû‹\ýerN†+½á̸`ãÛM‘ÕOý¤*Ç|ç+O"ÕzòBw£÷ÇÇœæÝ¯Ùùõ»_A½ïüæÿ‹{"Y'¨”u6‹\êüàFZâ*Íóö7×ïò&,”y€eàr÷e-9Aíò%÷ÍÕ¹1ŠßÕò7ž8vò«""šó†6ú˜W_ŸãôeÛwwnÍMØš›¿ã§/Tœu}j{è»'¦m]c{bíOó›ó×c²Ö­RW[§ß<ÿÖ'¦"Êúu‘Ÿôº>ÝaZ#"âûà#×YV‹Lz޲bJX{ó×o{´ÄÑÍp¿sù¦lä€á~eŸ¹e ÙJYcšø«Þbõ’à<›ß›=U¬ÏÕýsþíqÑoêþáí„ÿ]žc]§(76›o¶ô^Õ’¾®ˆˆÿj¿WV[ )ÿúÞ9òÂë¶“Çö^<¢iŸiIZ&‚ˆ "ˆðY¢á£WÈ‹›ù4^ˆðñõ¾rèõ?¨Ú9ÁÖ«×VUu–É)¾ô†3ゎk’ׯ_uý²ï¡˜Ñï}Ö>püãë«¿wh‡Ê¹ y¡Æ^ÿ…wn®ûvÌ'½½ŸŒMŠ\mMØdTDäS×¥?¬Ú”0ùfÎ ¿îŽ|ú»O¯SVÙö>±êû'OwÊ1rá‡oÉ“å£Ïe˜å<œxð}öGŽXžÏ±Þ8{òM¿õPÆ:Q®¯]õÙÎß7*ž·?~ç³›¯ú´U®¶Ÿ}Ë¿êùÜŠÏy¡ûúꤵ«”A&ŠˆÑjSO¿ñß«Ÿ²®eu’EÞøíÖ~;!FDÔ„œ´UU?>âPò7~òÖÏOüÉŽW¬Ê”Bž˜ÏùKÇ«/ÕŽœ—  \øé[×9Z¸ŸÙG7kL#h¶šLg±Ó&Á{Ó|{êï¿pº72+ÿióšuæ5ãã®H‰\mþú:£ˆ(IßÝ|úꎙŸÛa¹ÙúØ;êUÉk&·Õ[¾íé?=}úǧ×ï‰õÊuçÙ“NåñrADDø,ÍðѳF÷4^ØðY¿ÙxùÕ<¶êïwlT®;Ï{G}ªfjøè†žÎt„-euðáÌøW)AÇ5›rvÇúIÕ1Ùû”é³wΞ~ݽ¹ÆDQòBç»ú‰È'ÿçHÝ„ië¿ÿ‹º,EDûCçe1O}ŠÁ ÷oÞø×U {Ÿ^§È*ÛsUÿpòØÏ«ùW­O~¾öåÄUsšxÐEÚ¾Ÿ·êü«Ç®?ô§›÷ya«QDö¾üTÝOë^ú×ȵ>‘ÿ£ÒU?>ròßLø§Ïý(çÕŸž®}á¦D®Þ˜ö|ÕßoR 2QD”uI¶‡ÞøíúÍ&EDâÒÖË¥« É£÷Y( /×”ªÇNÿ¸âõ­ýË坿»äaÍ“¯ÔÜüñ«-?¬8«®|oéîÖ#1ܿ죗5ôÏVw ¤‚-vº$xšÏaOý—ó¯o¬NÊÚ¬¿;I‡jÿáä±ÓuËÚ¿|ªôÕü±“&´ÕYþºGJ¯ÿ¸¥å¥7?¹ùÐÚ¿ÜzèÕ½‰*g$DA„Ï ŸYŸÆ >1O¾R'?=ÖòÊOn<·ùéòÊߤ„zxà yzÙÇÇfPƒaÖí®ª’WñóÚ·nD®~ô‰CGön¢&€%ë+_~ùe(ó}ôÑG?üðŠ+æ°Ž[LGKŠöÿ³w!mõùâï?{*+VHú[–!&îDžAÙ3*³Mg£AÛƒöa×–=m/Ô •CêEê… GsaÃ!fƒõÂÉÜ)ô7éž…9:ltfPžs1fàÆ0`ÆÓ†,xÈ:O™s៪ͲV[5õýº(uùý®YŸ|Öú¬µ¾þ?ÿçÿ6üÿýæÃ€c»ô?þÇ1z½zõêoûÛw¾ó³ßbÏç…< ”± € HùîÿþËÿ‹Ý@)á‰< PÈJ…< PÈJ…< PÈJ…< PÈJ…< ”Â2þß¿ÿ € Bû0³=Bž¦i|~ÀIðj-P(ä%€BP(ä%€BP(ä%€BPÊØ8¹o¾ùfssó믿6 ãCÌ_Q”Ë—/_¹r¥¬ì‚V´(äाù曯¾úêêÕ«‡CQ”±Ã0^¾|ùÕW_]»víbÖò(äà¤677¯^½zåÊ•·EQ®^½º»¬ ¸“#'¥ëºÝn?…}òÉ'_ýõÅÜÉç㉼؃ÞuÿÔ£ ËΔìÒÓàÄür*#6WÃ}wK…Uòs?Jîï©Ô†~5ReÙ7­°> LÌ'uÕUÛ1àorZÞ\âQÚ˜­€ÓUX¹Õ§~0Ö÷¯Xöy{ÖØŸ)Žš­™­Ùj¼ÇîÇÛÒýÖcƪ'ÿW§SD¤°6öÙÃéÜë_{F3Vs Cmc}"‚ˆ Âç<„é…Rv%œˆ-'sŠ«¡cÀßR$Î&|¤°1š˜Mf ÕQÝÜíï¬Ù®4äWc@d1­+š§¹ÛßSWÎÑXzò+ñOë¡G NÉ«W¯.]ºt RåÁwþƒB^~-Œ¤Œ†}9¡¯ï™Þèö¹$ {¶ç#uVotôõ´‘Ž&¤Îq VóK®À²§{8äÈÄ®!õùHõÝÛ˜­àce’}ÏodŠ£e«C’‘Ùj¼ÇîÇÚÒ7®¢†Â)C«ÞKëj­Ïߢm†¢ØÜonsÑ6–£î1ADDøœ‡ð1»P*¬G{{#j«´C–¢Á`oØõüQ¥å<„Oa=Ò;4k»ãÕÙ23Á@_ùó§-å"Ù¹¡Þp¦Ñòk¹™ðPŸ}ê?Ú‘¥&·$Ôf y w kc÷NgDDl{¿šçc)íÎÔ㧈Túý+·ú"‹Ùº&{EÍë'47â‘”Ö1Ùtà™ÍürtÞ¨õ·ÕXEÜ+·z£‹Ùºý­ŽÒÆlÝ+³ì£˜e “Lq”luH22M‚ï¯û;oi±«¨@$§)û* ÑÚkëjy™Â¤Í÷ˆ "ˆ"|ÎCø˜-½ŒD3ÿó¯]¤Ê¥æú⩌T:åìçŽÍfܾñN¯]D\¾¥ùÞx"ÛRnÏ.G—•Æñî¦J‹ˆË¿²øpfq£ÝÉCyγ³#ÏâhMMMw8ö}ÏyÍ]]§mÿhÕ61ôýLæÂ½Ùß\þÆwôRJ\^÷ÖÝ‹ËëRR éÂ;·1[7àãPX¼y{laæIçíëõõ7<Ž­åw‚k->øàæõúúúúwGW·§ÖgF:o^¯¯¯¿~»gl)k2q#z·þöÓõís¼›õû~¸Û‘ìÒXÏíõõõ7î>zº=#ÉÏu^0³23x÷ÆÝ§ë{Vãú̓³i §&ÙÇyØ÷Âhð…&C¾j}ºïá“Õí¤i¤#¨4uw7i’]ê .ÛÚB!“ ,êŸ>|J2É>‡d·d óluH2z{ÐêPö¯PÎÈD{o^¯¯¿q»óÉÌúÎ ñë¾æm޲Ç@ADásÂÇléF&ST}v÷Vl|÷>ñ™‡¥¢sd°Íi‘|vm>2Ÿs4yÊE¤¼ºÅ­ÏFæ× Rؘ‹.;:ü <ÏZjœíSSw4Å=ðù¯WZ\V˜Úˆ÷õFôj_hr|´]K·¯†€RPv®×.¿6ìÌ Ã{WÈ/O¼ÆPu‘ïXÃ0DU_§EUDôwo\jÃÀ@[•E¤ÒmÛø¬+2¿ám³©5÷ý-M•Vq)sÑÞŒ."’Kçwwc]•]ÄåмM):Ñb«ó¨/æRù&5µÑj=zb!]hRRsÕãu‰þYÝãÞz¯¡bØHÞ F“Ý#U""†Ú6:ØV."±‰e¥q|¸½Ò"R50°þY×,ŸÎ,ûd›5ÉVGJF&Ið½t×-µVµõTí\E EôöñV§%—Ø3«\:'†(^ßh·š›‹]¹íñ^÷͘¶9ÊDA„Ïy3†¡‹‘ Æ|þQ‡‘Šƒ]Ûó‘:ûyŸ-…Õ‘[]³ºˆ£u¼yëaÁò6Ç̽À½DDTÓ0D¨…—šíOl·¾ûú²B6Š÷(¬E#iÏÀóΫˆT¸Ö?ëŠ%²^/ß (ç·—]y:Ôÿ,!ž;¡Îª½ñ´1IØÚ|Eï/)Š"ºþ:º±' Þ¸\u®í(²¸ê\ÊìR¦ÐVîô6+«‰™ØÊêJry9¡K­ˆˆÅÝÞ¬õöߺ鮭­ózj«Ê-"E'º¼n Î¥ó¶¥´ZíkÉ,O,¤óÊBZÜíKîEÚÐÚÜ;mw×iÆL*'UªˆØ<ž­{¾…ÌJFqw;ö­ŸÎ,û7kÌVù…ž[ý CDÔÚÐç#®Cgûæjœ°ûûÚÒøPDoµ¾1š´³uòW­VëÖäJ—’¾Õ™ÏÖµØÞæ°ü"ˆ"‚Ÿs>fYED»3<Øâ‘*—²=þ]‹ý„ÏÎIe÷äT[: {û+ž5Ù³ ƒ]a½¡{´Í£êÉx08Ñvþ˜¿ù\âv/+Lé©dNOõý¤~Ï4mM y w‚46÷øÞТÚ80åóüªÞXŒ¥´–Úâc(6‡j¤s;÷Q =g¼1`ÂQÚŒ""bˆd—Fºúæ•êÆ&oKw[K¬whçfhÏü¦meqqaa.Ü;¬˜ñÚ‹Nt{z4‘J&tG‡Û“qäâÉ”=©»î»¬‡ÞCV»ÂIÎcö9fÖx#[Y«¦ž""Šj³ˆ˜Ï¶èjœ°û{ÚÒBf)¥§“ülgʳ{õÓµ¡_TY¬{þº ÕU£IlCÙwB|h›Có;ˆ "ˆ"|ÎKø˜ÊÙlŠ¢VíŽç¨*vŸMø6ÖR†Vé´ZËÖr§OYYì'òMžÅȼ4ŽûÛ*-"Rá^_~¸¸”‘*þnmi_Ù˜^V[c#n]øØšGCí{^ÓVT¾AÏ@þ÷ƒwz~¹ýädù¿<‰ŒüèöÊÛ|ë\~” À²£crêq‘ó§ÅxÚÑdv–bqÔ¸$5—Ü¡žK®ƒrý(m€ µÚA¤šK¶*Í’ODfõÆÐä“GíM5š¢o§ºìÒÓ'ѤZåmë|ú|¼YYŒ&²E'ŠØ=MZf&Ïhu«êöØÒñøLFkrÛEl.‡’YHî7›\È(×Áf­J3’séݵ[H1DÎ0û/kÉV{ù»ÕrÈlÍ’à »¿Ÿ-µ¸}“SÛ&G[5±5ONúÜ–ìÂã»ÑÝ¢ó镌Ø*ö_mÞæðü"ˆ"‚Ÿs>f,Ž:‡‘^Ú9+zŸUøä‡ºz#»m C7DQD 9pŽiˆ¨å¼«õ‘y]½Ë§W2[ÿS].5—ʩۇ¶-†çsü½‹Ó÷çÿ þá»c¿ýâ‹/¾øâ·cßý2üË?³SÞî<>‘—OÄ– Ç-³¼°f¢ØÜžJ»ED²É¹´ê>ð¤l~%YPZ:ZœkõýFµ7žhwdbC³Ò0Zk?F |üôÙ¡¡ »ÛHFƒ/tÏ@£S”œ¦êɹå5›[IÏOuÃΪTIÏNÌ꪿ͭä–c‹9[µ¦*z‘‰"bóT«áé”­Ùm‹­Î%Óói펧\D¬žöµ70ôTéðÚ23á`Rkt[äÀITyC»g"Ð×ïôß÷(ÉXp6ǧ…³Ì>¦YãE³Õ~&³=4 ¾ŸîÇØÒ× Òîtîl¼âTD±9*œvqÕÙRþ€êks+¹åh`Qm?˜\ÍÛi"‚ˆ Âç<„{mGm¸¯?àôµ¹ŒD$°¨6†¬î™…Ou‹#„+º›\Jn9\VF=V±Ö¶{¡@…¯Í£êÉXð…Q;LA¼YÅÐ3él¾ò`€¨š¦¤c‘W»[‘`ÂMDÄRÙÞî¸è‘îM_ˆ†Ÿ¥jÇ5ª§¦ðûîöüaç§žþþîoþ»õûÿ."òOc¿ ÿ€O¤„ y¹tF$ól¨Ï4—ïóŸ·XD é¹”8Ú܈ÒSñéiµê~‹Ó"Ö*_È „{ï骫Ö?« ð±Sª}÷Õx +œSµÝ!¿×."UÝþæþ`ÿÃiEs7v «¡`ÿ ÏÏÛ|ÃwÁp_—!ŠÍÝàù*-)2QD,Ž::=ïªÓ,"âðºd1í©ÛzÏÂRõx|X „]ÏtUó´ŽŽwÌÇÞ4:n‘¡® ÕÕp¸#6´Ê'†³Ë>fY㳓¢Ùêà9gÑÙ–ßS÷cl©žŠOOÛj:ZL_6*o”` 2Ô•ÑUGuóèdçöé¯ûš·9ÚDA„ÏyÓÙÖ ŒûƒHWF4OóðxÇÁ±æÎ,|œm¡ál é{‘1TÍÓ00Þ]c{Óð¸Fú»Â†¢¹ýãÝu ’V‚4Oƒ;:ÑÕµ19Õqð¨ôùûƒÞYÕQ{ßïÓû£[¿p¶‡B†ûfuÅænuWòzz,?ÿn¬ã‡=_ÿõ§Tñ÷ÿûßÒî/ùË·¿ýíK—.±Ë€@auðVŸ1l>\1ïäOúÓ§Ÿ~z„+Òßwü°çKùÇ'/~ö‹Ö_ülzçßæG”OÇ~7q”BÞ—_~ù½ï}ïãÛ‡¯^½úÛßþöï|ǬÁ·8Îpº,Š¢X”=ÿ²KŽ€BPÊØÀd©üõ¯Ù ”žÈJ…<œ²‚acÏ¿ì’#àÕZœ²?>j~$"{ÿÅ[ñDN‹å»ÿúÓò¢¿)ÿé¿ýOþxí¡x"§æ“ þ׃ì‡ãà‰< PÈJ…< PÈJ…< PÈJ…<ˆôë& IDATœÔ¥K—^½zu 2 CQ”‹¹“)äà¤TUýë_ÿz zùòååË—/æN¦€“ºråÊæææÆÆ†ah†allllnn^¹råbîä2Ž3œPYYÙµk×677_¾|ùjyŠ¢\¾|ùÚµkee´¢E!ïAYYÙÕ«WÙ¯Ö%€BP(ä%€BP(ä%€BP(ä% ì–‘ÉdØÑ¸ 4Mû³-+ÝU.^­J…< PÈJ…< PÈJ…< PÈJ@»'÷Í7ßlnn~ýõ׆a|ˆù+Šrùòå+W®”•]Њ…<œÔ7ß|óÕW_]½zÕáp(Šò!aÆË—/¿úê«k×®]ÌZ…<œÔæææÕ«W¯\¹òá¡(ÊÕ«Ww—uw2cäà¤t]·Ûí§° O>ùä믿¾˜;ù|<‘·{лîŸzTaÙ™’]zœ˜_NeÄæj¸ïïn©°J~®ó'CÉý=•ÚЯFª,û¦Ög‚‰ù¤®ºj;üMNË›KoÏû3ÅQ³Õ!³5[÷Øýx[ºßzìÁÃXõäÿêtŠˆÖÆ>{8{ýkÏèoÆjdhÓ6GÜdADDøœ‡ð1½PÊ®Dƒ±ådNq5t ø[ŠÄÀÙ„6æÂC³ÉŒ¡:ª›»ý5öC§£¤äWâ/2žÖCœ’W¯^]ºté¤(ʃïü;…¼üZ<I ûrB_ß3½Ñ7ìsI2ölÏGê¬ßèèë/h# LHã@¬æ—]eO÷pÈ‘‰]Cêó‘:ë»·1[7ÀÇÊ$ûž5ÞÈGËV‡$#³Õxݵ¥o\E …S†V½;!—ÖÕZŸ¿EÛ E±¹ßÜf“6GÜdADDøœ‡ð1»P*¬G{{#j«´C–¢Á`oØõüQ¥å<„Oa=Ò;4k»ãÕÙ23Á@_ùó§-å¦ÓQbrKÑHBm¦ y§ °6vïátFDĶ÷«y>–ÒîL=nqŠH¥ß¿r«/²˜­k²Wì¹?²¤´ŽÉ¦wLòËÑy£vÔßVcq¬Üê.fëö·:J³u|¬Ì²b–5L2ÅQ²Õ!ÉÈ4 ¾¿îEŮ¢‘œ¦ì«0dDk¯­;ìQ“6GÜdADDøœ‡ð1[z!‰f<þç=^»H•KÍõÅS©tÊÙ‡O!›Í¸}ã^»ˆ¸|Kó½ñD¶¥\5™Nô8ÏÎvŒ<‹£=4555ÞáØ÷=kä5wu¶ý£UsØÄÐ÷?2™_GôfsùßÑK)qyÝ[wo,.¯KI-¤ ïÜÆlÝ€Cauðæí±…™'·¯××ß|ð8¶–ß ®µøàƒ›×ëëëëoÜ}]Ýž^XŸé¼y½¾¾þúíž±¥¬ÉÄèÝúÛO×·ÏñnÖïûánlCD²Kc=·oÔ××߸ûèéöŒ$?×yýÁÌÊÌàÝwŸ®ïYë7 Φu>2œF\˜dó¬ñöLa–­IFGI‚'ìþî[*±»õõ=K…=WQF»¿MÛ3ÓÜš®hšúæ–¾îkÒæˆ› "ˆ"‚Ÿó>¦q鹄îj©Þ.‚Yk?iqÊùQÝ ^÷NÕ¦Èö+yfÓQBÖ£·ï=ËÉ¡ŸÜY-¸¬Øˆß½þ ¾}É!Ùøƒ×?åWc·.{nvŽÄ× ìI”Œ3~µÖb/wÚ%ŸÚ÷µk©è{ú:-Eg3jµ{ßÝžµh8áêö½9n‘KëŠfÛ¹C£Ø4ÅHåtË»µ1[7à£ad¦‡&j;|¡IDƒá®~Ûó1¯½°î &<ÝÝnUOÄý‘êç=²6ÑXtt „âɼ9q¸ºÚ6±œÌv:íz2‘‘D2+N{.¹œÓª=¶Â꓇}³ÚÈkËÍLúêãÛï\éH ênéî®Õ$»0ÔLz:B% u¥– <%™d#eš5Þ’)̳Õ!ÉèíIðÄݱ¥ª«¥µUÑv.Œ£}¼Õ‘˜Ù·B9ÈöÞìKæÍÝpßß½ý‚Ëë¾&mŽ¸É ‚ˆ "ˆð9ácv¡ddÒ9EÕgDSºêª½ï÷bï¬ÂÇRÑ92¸½ÐìÚbd>çh󔋈Ùt”gûÔTþÞÃDÇó§^»ä3û.+LmÄûz#J«?ä·é‰X0ØÕ¯>âåaLPÈ;±üÚL°?0o4 wì\!¿<ñBCÕE¢Ì0 QÕ×)EQýÝÛ€Ú00ÐVe©tÛ6>ëŠÌoxÛljÍ}KcS¥UD\Ê\´7£‹ˆäÒ9ÅÝÝXWeq94oFSŠN´Øê<ꋹT¾IM-d´ZžXHš”Ô\FõxF¢V÷ø‡·Þ_¨6’·‚Ñd÷H•ˆˆ¡¶¶•‹ÈFlbYin¯´ˆT ¬Ö5Ëç…3Ë>ÙãfC²Õ‘’‘I|/ÝßuK­Um=U;WQC½}¼ÕiÉ%öÌ*—Ή!Š×7Ú­ææ"@Wn{|£×}3¦mÞaAADás¦ácÆ0t1RÁxƒÏ?ê0R±`°+`{>Rg?á³¥°:r«kVq´Ž7;ß>¥bû(Ý}áúõe…lïQX‹FÒžç5V©p ¬ÖKd½TòPÎo!/»òt¨ÿYB’°µ¿¿¤(ŠèúëzàpÕ¹¶£Èâªs)³K™B[¹ÓÛ¬¬&fb+«+Éåå„.µ""w{³ÖÛ릻¶¶Îëm¨­*·ˆèòº%8—ÎÛ–Òjµ¯%³<±Î+ iq·;,¹iCksï´Ý]§3©œT©"bóx¶îù2+ÅÝíØ·v|^8³ìsܬq0[åznõ' QkCŸ¸훫qÂîïkK7âC½9ÔúÆhÒÎÖÉ_µZ­[“+]JúVd>[×b?j›£¬3ˆ "ˆ"|Î<|ªLJ{Š("ÚáÁ§ˆT¹”íñïZìç |vN*»'§ÚÒ‰X8ØÛ_ñ|lg >³é(U»—¦ôT2§§ú~R¿g𶦠…ÇÌod+kõÀÔsCDDQmóÙ]vO[ZÈ,¥ôtòáŸíLyv¯~º6ô«‘*‹uÏûSVW&± ]dß ±i›£¬3ˆ "ˆ"|ÎEø˜ÊÙlŠ¢VíŽç¨*vŸMø6ÖR†Vé´ZËÖr§OYYì'òMµzñé^þêsi_Ù˜^V»c "¶æÑP»ãuÁXQy­ú ä?x§ç—ÛON–ÿË“ÈÈ>a¯¼Í·ÎåG¹,;:&§9ÙXŒ§M&u<±8j\’šKnÏ_HÏ% ×Á?¹~”6ÀZHméZHÍ¥ [•fÉ'"³zchòÉ£ö¦š MÑ·S]véé“hR­ò¶õ >}>Þ¬,FÙ¢Eìž&-3g´:‡Uu{léx|&£5¹í"6—CÉ,$w‡›M.d‡ëà 3‹V¥ɹôîÚ-¤ug˜}Ž—5Šd+‹½|‹Ýj9d¶fIð„ÝßÏ–Zܾɩm“£­šØ‡''}nKváñÝÎèî@ÑùôJFlû¯6MÛeAADás>ÂÇŒÅQç0ÒK;'pEã³ ŸÜâPWod·aè†(Šùt|T^Wïòé•ÌÖÿT—KÍ¥rêö¡mËŃáùïâôýù?ƒøîØo¿øâ‹/¾øíØw¿ ÿòÏì”·;Oäå±eÃqGË,/l‡™(6·§Òn‘lr.­º<)›_‰E”–ާÅZ}¿Qí †çÚ™ØÐ¬4ŒÖÚцC?}vh¨Âßî6’Ñà Ý3Ðè%§©zrnyÍæVÒóEÝp§s…*UÒ³³ºêos+¹åØbÎV­©Š^d¢ˆØ<Õjx:ekvÛÄb«sÉô|Z»ã)«§½Aí =U:¼¶ÌL8˜ÔZ'Ý‘ý…ºò†vÏD ¯ßé¿ïQ’±àlŽO g™}L³Æ!Šf«ýLf{h|?ݱ¥¯¤ÝéÜÙxÅ©ˆbsT8í"⪳¥ýÕ׿VrËÑÀ¢Ú<~0¹š´É/m“AADásÂÇŒ½¶£6Ü×púÚ\F"XTCV÷̧ºÅÂÝM.%· .+ £«XM¦£äXÅÐ3él¾ò`€¨š¦¤c‘W»[‘`ÂMDÄRÙÞî¸è‘îM_ˆ†Ÿ¥jÇ5¾6OMá÷Ý?ìùÃÎO=ÿüýÝßüwë÷ÿ]DäŸÆ~þŸH òréŒHæÙPÿži.ßç?o±ˆÒs)q´¸¥§âÓÓjÕý§E¬U¾?÷ÞÓUW­Ü_c=Vàc§Tûî«ñ@W8§:j»C~¯]DªºýÍýÁþ‡ÓŠænìVCÁþžŸ·ù†ï‚á¾.C›»ÁòUZ,Rd¢ˆXuuzÞU§YDÄáuÉbÚS·õž…¥êñø°ºžéªæiï,6Ü¥½itÜ"C]ª«áþpGlh•O g—}̲Æ!g'E³ÕÁs΢³=, ¾§îÇØR=Ÿž¶Õt´˜Ž^Þ4:)Á@d¨+£«ŽêæÑÉÎíÒ_÷5i“9ê&ƒ"‚ˆ Âç<„élkÆýÁ@¤¿+#š§yx¼ãàxzg>ζÐp6‰ô½Èªæiï®±ŠˆÙt”ÍÓàŽNtumLNu<*}þÆþ` wVuÔÞ÷ûôþèÖ/œí¡‚á¾Y]±¹BÝü• SdùAøwc?ìù²ø¯?¥Šw¸øûßÿ~”vùË_¾ýío_ºt‰]| «ƒ·úŒaóáŠx'úÓŸ>ýôÓ#\‘þ¾ã‡=_Ê?>yñ³_´þâgÓ;ÿ6?ú£|:ö»‰£ò¾üòËï}ï{ß>|õêÕßþö·ï|ç;f ¾Åq€ÓeQÅ¢ìù—]rò€PÆ.. Kåà¯Ín ”ðDP(äà” Ã({þe—¯Öà”ýñQó#Ùû/ÞŠ'òpZ,ßýן–ýMùOÿíòÇkÅy85Ÿühð¿¾d?Oä%€BP(ä%€BP(ä%€BP(äà¤.]ºôêÕ«SXaŠ¢\ÌL!'¥ªê_ÿú×SXÐË—//_¾|1w2…<œÔ•+W677766 Ãø@‹0 ccccssóÊ•+s'—qœà„ÊÊÊ®]»¶¹¹ùòåËTËSåòåË×®]++» - yxÊÊÊ®^½Ê~øpxµ(ò€@!(ò€@!(ò€@!(e§°ŒL&ÃŽÀ¡iÚ‡˜mYé®:pqðj-P(ä%€BP(ä%€BP(ä%€BPÊØ8¹o¾ùfssó믿6 ãCÌ_Q”Ë—/_¹r¥¬ì‚V´(äाù曯¾úêêÕ«‡CQ”±Ã0^¾|ùÕW_]»víbÖò(äà¤677¯^½zåÊ•·EQ®^½º»¬ ¸“#'¥ëºÝn?…}òÉ'_ýõÅÜÉ磷{pûÉZaÏ”ìÒÓÇn_¯¯¿~óÁH|-/"’Ÿë¬?èúã•ÂÁ¹ÖgF:o^¯¿~óÁàÌz¡èÒÆlÝœ®ÂêÈEbxÿŠeŸ·gý™â¨ÙêÙš­Æ{ì~¼-Ýo=öàúí§ë;=ׯnîÛ螥73ô[Ús‰ "ˆ"|J"|L¹ìJôqçÍëõõ7 Æ‹ÇÀÙ„6æžtÞ¾^__ãKÙãm2ΩüJ<ú¶£§äÕ«W—.]:…)ŠòÆà;ÿÎÁ«µùµx0’2ö儾¾gz£oØç’d4ì ØžÔY=¾ÑÑÜn## LHÃr`vK®À²§{8äÈÄ®!õùHõÝÛ˜­àce’}ÏodŠ£e«C’‘Ùj¼ÇîÇÚÒ7®¢†Â)C«ÞKëj­Ïߢm†¢ØÜonóamȹDD>¥>f‡\a=ÚÛQ[ý£² {îç*-ç!| ë‘Þ¡YۨΖ™ úúËŸ?m)·MÆù•[ŠFjs“Ó¾…¼­°6vïátFDĶ÷«y>–ÒîL=nqŠH¥ß¿r«/²˜­k²WÔ¼~Bs#Ii“MžÙÌ/GçÚQ[UÄ=°r«7º˜­Ûßê(mÌÖ ð±2Ë>ŠYÖ0ÉGÉV‡$#Ó$øþº¿ó–»Š Drš²¯Â­½¶®æ—)ÌÚs‰ "ˆ"|J'|Ì–^HF¢ÿy×.RåRs}ñTF*röáSHÇf3nßx§×.".ßÒ|o<‘m)?ò&À9r¶¯ÖZí¡©©©ñǾïY#¯¹«ë´í­šÃ&†¾ÿ‘ÉüB8¢7û›ËßøŽ^J‰ËëÞº‰bqy]Jj!]xç6fë| «ƒ7o-Ìl½apóÁãØî{ùµøàƒ›×ëëëëoÜ}]Ýž¾ó¶C}ýõÛ=cÛ¯#¼9q#z·~ûE‡­·öþp7¶!"Ù¥±žÛ7¼×Ÿë¼þ`fefðî»O×÷¬Æõ›gÓ:N#.L²yÖx{¦0ËV‡$££$Áv÷-•ØÝ½¯*­Ç£Ýߦí™inMW4M}sK_÷5mCÎ%‚ˆ "ˆð)™ð1½ˆKÏ%tWKõv ÌZóøéH‹SÎGøˆênðºwš¨6E ão2γõèí{Ï2Frè'7FV .+6âw¯?ˆï¼J?xýS~5öxë²çfçHœq PBÎøÕZ‹½Üi—|jß×®¥¢sìéë´ͨÕî}w{֢ᄫÛWñÆ“³F.­+šmçbÓ#•ÓE,ïÖÆlÝ€†‘™š¨íð…:$ †»úmÏǼöÂj¸7˜ðtt»U= LôGªŸ÷TÈÚD_`ÑÑ1ò(™x8Шùü‰'óæÄáêjÛÄr2Ûé´ëÉDNDɬ8í¹ärN«öØ «OöÍjwü!¯-73è{¨o¿sa¤#¨»¥»»V“ìÂPW0ééy”T4XÔ•Z>2|ð”d’}Œ”iÖxK¦0ÏV‡$£·'Áw?Æ–ª®–ÖVEÛ¹0 DŒöñVGbfß å #Ú{³/™S4wÃ}÷ö .¯ûš·!çADDø”Jø˜rF&ST}vðAt1¥«®Úû~_K…õ\„¥¢sdp{¡ÙµÅÈ|ÎÑæ)‘#o2Î1gûÔTþÞÃDÇó§^»ä3û.+LmÄûz#J«?ä·é‰X0ØÕ¯>âåYLPÈ;±üÚL°?0o4 wì\!¿<ñBCÕE¢Ì0 QÕ×)EQýÝÛ€Ú00ÐVe©tÛ6>ëŠÌoxÛljÍ}KcS¥UD\Ê\´7£‹ˆäÒ9ÅÝÝXWeq94oFSŠN´Øê<ꋹT¾IM-d´ZžXHš”Ô\FõxF¢V÷ø‡·Þk¨6’·‚Ñd÷H•ˆˆ¡¶¶•‹ÈFlbYin¯´ˆT ¬Ö5Ëç…3Ë>ÙãfC²Õ‘’‘I|/ÝßuK­Um=U;WQC½}¼ÕiÉ%öÌ*—Ή!Š×7Ú­ææ"@Wn{|£×}3¦m@ADJ%|̆.F*oðùGF* vlÏGêìç!|¶VGnuÍê"ŽÖñf§œx“q^ld»/\¿¾¬â= kÑHÚ3ð¼³Æ*"®õϺb‰¬—JJÂù-äeWžõ?KˆçNh ³joç;|ªLê\Š("ÚáÁ§ˆT¹”íñæÞïÁ¯êÅXJk©-/ž?lÕHçŒíª¼¡çŒ7L8Jà‚QDD ‘ìÒHWß¼RÝØäménk‰õíÜ íùß´­,..,Ì…{'‚µS#^{щn¯C&RÉ„îèp{2Ž\<™²'u×}—õÐ{ÈŠbW¸Šó˜}Ž™5ÞÈVÖê©ç†ˆˆ¢Ú,"æ³-º'ìþž¶´YJééäÃ?Û™òì^ýtmèW#Uëžç‚¬®MbºÈ¾⣴DA„Ïù³S9›MQÔªÝñæUEÑ3 ŸÂÆZÊÐ*Vk¹ÓZîô)+‹½ñD¾Ék=RÈ£Ô®lL/+ ÃØÑ±5†Ú¯ ÆŠZξ;}ùßÞéùåö““åÿò$2ò£OØ+oó­sùQ.ËŽŽÉ©ÇE¾L7ãiG“IO,Ž—¤æ’[ãóÒsIÃuðO®¥ p¤RÛcºRs)ÃV¥Yò‰È¬Þš|ò¨½©¦BSôíT—]zú$šT«¼m=ƒOŸ7+‹ÑD¶èD»§IËÌÄã­ÎaUÝ[:ŸÉhMn»ˆÍåP2 ÉÝáf“ Åá:xÃÌ¢UiFr.½»v )ÆfŸãe"ÙÊb/ßb·Z™­Y½’[Åþ«Í£´DA„Ï93GÃH/íœÀ?DÏ(|r‹C]½‘Ý6†¡¢(r´G©{]½Ë§W2[ÿS].5—ʩۇ¶-†çsü½‹Ó÷çÿ þá»c¿ýâ‹/¾øâ·cßý2üË?³SÞî<>‘—OÄ– Ç-³¼°f¢ØÜžJ»ED²É¹´ê>ð¤l~%YPZ:ZœkõýFµ7žhwdbC³Ò0Zk?F |üôÙ¡¡ »ÛHFƒ/tÏ@£S”œ¦êɹå5›[IÏOuÃΪTIÏNÌ꪿ͭä–c‹9[µ¦*z‘‰"bóT«áé”­Ùm‹­Î%Óói펧\D¬žöµ70ôTéðÚ23á`Rkt[DöêÊÚ=¾~§ÿ¾GIÆ‚³9>-œeö1͇(š­ö3™í¡Iðýt?Æ–¾Nv§sgã§"ŠÍQá´‹ˆ«Î– ôT_›[É-G‹jóøÁäjÞDD>%>fìµµá¾þ€Ó׿2‘À¢Ú:°ºg>Õ-Žp8®ènr)¹åhpYiõX%¿p²MƹaCϤ³ùʃ¢jš’ŽEf\ínID‚ C4Ke{»ã^ wDº[4}!~–ª×øÜOMá÷Ý?ìùÃÎO=ÿüýÝßüwë÷ÿ]DäŸÆ~þŸH òréŒHæÙPÿži.ßç?o±ˆÒs)q´¸¥§âÓÓjÕý§E¬U¾?÷ÞÓUW­Ü_c=Vàc§Tûî«ñ@W8§:j»C~¯]DªºýÍýÁþ‡ÓŠænìVCÁþžŸ·ù†ï‚á¾.C›»ÁòUZ,Rd¢ˆXuuzÞU§YDÄáuÉbÚS·õž…¥êñø°ºžéªæiï,6Ü¥½itÜ"C]ª«áþpGlh•O g—}̲Æ!g'E³ÕÁs΢³=, ¾§îÇØR=Ÿž¶Õt´8Ͷ¦¼itR‚ÈPWFWÕÍ£“ÛÃ…¿îkÞDD>¥>¦³­÷‘þ®ŒhžæáñŽƒãéYø8ÛBÃÙ@$Ò÷"c¨š§a`¼»Æ*²~ÒMÆ9¡yÜщ®®É©ŽƒG¥Ïߨ ôΪŽÚû~ŸÞÝú…³=’@0Ü7«+6wã@¨›oÔSdùAøwc?ìù²ø¯?¥Šw¸øûßÿ~”vùË_¾ýío_ºt‰]| «ƒ·úŒaóáŠ6þrm IDATx'úÓŸ>ýôÓ#\‘þ¾ã‡=_Ê?>yñ³_´þâgÓ;ÿ6?ú£|:ö»‰£ò¾üòËï}ï{ß>|õêÕßþö·ï|ç;f ¾Åq€ÓeQÅ¢ìù—]rò€PÆ.. Kåà¯Ín ”ðDP(äà” Ã({þe—¯Öà”ýñQó#Ùû/ÞŠ'òpZ,ßýן–ýMùOÿíòÇkÅy85Ÿühð¿¾d?Oä%€BP(ä%€BP(ä%€BP(äà¤.]ºôêÕ«SXaŠ¢\ÌL!'¥ªê_ÿú×SXÐË—//_¾|1w2…<œÔ•+W677766 Ãø@‹0 ccccssóÊ•+s'—qœà„ÊÊÊ®]»¶¹¹ùòåËTËSåòåË×®]++» - yxÊÊÊ®^½Ê~øpxµ(ò€@!(ò€@!(ò€@!(e§°ŒL&ÃŽÀ¡iÚ‡˜mYé®:pqðj-P(ä%€BP(ä%€BP(ä%€BPÊØ8¹o¾ùfssó믿6 ãCÌ_Q”Ë—/_¹r¥¬ì‚V´(äाù曯¾úêêÕ«‡CQ”±Ã0^¾|ùÕW_]»víbÖò(äà¤677¯^½zåÊ•·EQ®^½º»¬ ¸“#'¥ëºÝn?…}òÉ'_ýõÅÜÉ磷{pûÉZaÏ”ìÒÓÇn_¯¯¿~óÁH|-/"’Ÿë¬?èúã•ÂÁ¹ÖgF:o^¯¿~óÁàÌz¡èÒÆlÝœ®ÂêÈEbxÿŠeŸ·gý™â¨ÙêÙš­Æ{ì~¼-Ýo=öàúí§ë;=ׯnîÛ螥ÂQûŠäWcïÞ¨¯¯¿~»glaƒC‘"‚Þ)‚²KOݽQ_ýæƒÁ8筄χÓ ¥ìJôqçÍëõõ7 Æ‹ÇÀY…Ùr ŸA~%}ÛQƒSòêÕ«K—.‚Eù@cðçàÕÚüZ<I ûrB_ß3½Ñ7ìsI2ölÏGê¬ßèhn·‘‘Ž&¤Îa90»¥@W`ÙÓ=rdb@×ú|¤ÎúîmÌÖ ð±2É>‡g72ÅѲÕ!ÉÈl5Þc÷cméWQCᔡUïNÈ¥uµÖçoѶFCQln‹ùØþ¾Ù¹¡Þp¦Ñòk¹™ðPŸ}ê?Ú‘Dt¤¾…µ§]}Ó¶;ãuj* võ©ÏǼvŽHÂ烅مRa=ÚÛQ[ý£² {îç*-ç"|L–Kø|$rKÑHBmnrZØ ÷¡ÖÆî=œÎˆˆØö~5ÏÇRÚ©Ç-N©ôûWnõE³uMöŠš×_ªñHJë˜l:ð5›_ŽÎµ£þ¶«ˆ{`åVot1[·¿ÕQÚ˜­àce–}³¬a’)Ž’­IF¦Iðýuç--vˆä´½çÒÑÚkëjÞzýóFßìrtYiïnª´ˆ¸ü+‹g7Úå“Dt„¾ùDd:ãöwÖÙE*+‡7÷"³ë^já„Ï ³¥’‘hÆãÞ㵋T¹Ô\_<•‘J§œƒð1YnmŠðPzÎöÕZ‹£=4555ÞáØ—Œ¼æ®®Ó¶´j›úþG&ó áˆÞìo>x’_H/¥Äåuoݽ±¸¼.%µ.¼s³u>…ÕÁ›·ÇfžtÞ¾^_óÁãØîûùµøàƒ›×ëëëëoÜ}]Ýž¾ó¶ÃÖ{oKY“‰Ñ»õÛ/:l½å°÷‡»± É.õܾQ__ãÛ3’ü\çõ3+3ƒwoÜ}º¾g5®ß|08›ÖùÈpqa’}̳ÆÛ3…Y¶:$% ž°û»o©lÄîî}Ui=ˆíþ6mÏLskº¢iê›[úö¾†aˆ¢n_”YUQ›ÂIAG‹ =64·c§«VãRÒKé<‡$áó¡ÂÇô".=—Ð]-ÕÛÕ4kÍã§#-N9ác¶\Â磰½}ïYÆHýäÆÈjáÀeÅFüîõñíKÉÆ¼þ)¿{¼uÙs³s„תA!ïè•<{¹ÓétìÿÚµTtŽ=Ý};¿ͨn÷¾»=kÑpÂÕÑVñÆ“³F.­+Úîé¿bÓ#“Óß¹Ùº #3=4‘óv‡BÃm¶d¸«.+"…Õpo0¡µ„ÆCÃíŽÄDd­ RX›è ,ªm¡ñQŸ'7ÝXÊh«®¶e–“YÑ“‰œH&‘ÌŠH.¹œÓª=¶Â꓇}/Œ_h2ä«Ö§û>YÝNšF:ˆJSww“&Ù…¡®à²­m ò7ÑÀ¢nð‰áç$“ìsHÖxK¦0ÏV‡$£·'Áw?Æ–ª®–ÖV¯¶saˆí­eÿ åŒL´÷æõúú·;Ÿ¼©æí}Ë«[Üúld~½ …¹è²£ÃßÀ{MDtÄRTEr™Ý×)õLÆ\†[`„Ï ³¥™tNQõÙÝ[±E†Ø;«ð1[.áóQp¶OMÝÑ÷Àç¿~\i9pYaj#Þ×Ñ«}¡ÉñÑv-ܾJAÙ¹^»üÚL°?0o4 wì\!¿<ñBCÕENò ÃUU÷Úˆþîm€ @mh«²ˆTºmŸuEæ7¼m6µæ¾¿¥±©Ò*".e.Ú»u.“Kçwwc]•]ÄåмM):Ñb«ó¨/æRù&5µÑj=zb!]hRRsÕãu‰þYÝãîôÚE¤bØHÞ F“Ý#U""†Ú6:ØV."±‰e¥q|¸½Ò"R50°þY×,ŸÎ,ûd›5ÉVGJF&Ið½t×-µVµõTí\E EôöñV§%—Ø3«\:'†(^ßh·š›‹]¹íñÞÞWÊÛü3÷÷~Q=NÃa˜"ˆ:RÙ«Û=2žXrtx”Ôl œá…Âç†ÃÐÅHã >ÿ¨ÃHÅ‚Á®€íùHý\„ɦ>‡í£t·¾ûú²BLþ~Va-I{žwÖXE¤Â5°þYW,‘õ2@"JÂù-äeWžõ?KˆçNh ³joÇͳU~¡çVµ6ôùˆëÐÙ¾¹'ìþ¾¶t#>Ñ›C­oŒ&ílüU«Õº5¹Ò¥¤oõGæ³u-ö#ôÍ. v…õ†îÑ6ª'ãÁàD_Øýùã*JyDt”²{†Wûúû>›­¶µZΩœÚ>,|̾œQD´;Ã-N©r)ÛãеØÏ>|LC›ðù8í^V˜ÒSÉœžêûIýžiÚš.ò@!ïilîñ½¡Eµq`Êç=øU½±Ki-µÅ‡ÀVlÕHçvnäzÎxcÀ„£´.EDÄÉ.tõÍ+ÕMÞ–î¶–XïÐÎÍОÿøMÛÊââÂÂ\¸w"X;05âµèö:ôh"•L获'ãÈÅ“){RwÝwY½‡¬(v…«vœÇìs̬ñF¶²VL=7DDÕf1ŸmÑÕ8a÷÷´¥…ÌRJO'þøÙΔg÷ê§kC¿©²X÷üuA««F“؆.b{__:2/ãþ¶J‹ˆT¸†×—..e¤ŠÁƉ "È~¤¾öšžŸÿßù ])·KnÍ26 áó!ÃÇìTÎfSµjw:GÕ‡ñY…Ïa¡Mø|ŒW6¦—†alØcˆØšGCí{^ÓVTþÌÖÈÿ~ðNÏ/·Ÿœ,ÿ—'‘‘}Â^y›oËr!XvtLN=.rþ´±O;šLêxbqÔ¸$5—Ü¡žK®ƒrý(m€ µÚA¤šK¶*Í’ODfõÆÐä“GíM5š¢o§ºìÒÓ'ѤZåmë|ú|¼YYŒ&²E'ŠØ=MZf&Ïhu«êöØÒñøLFkrÛEl.‡’YHî7›\È(×Áf­J3’séݵ[H1DÎ0û/kÉV{ù»ÕrÈlÍ’à »¿Ÿ-µ¸}“SÛ&G[5±5ONúÜ–ìÂã»ÑÝ¢ó镌Ø*Ô#õ5ä@ˆ"j9DADÐÑ"H²sOÇVòk¹Ý"ùd<)n¯‹3[Â烅‹£Îa¤—vNàŠÆg>æ›Fø\¯«wùôJfëªË¥æR9uûжåâÁð|Ž¿wqúþüŸÁ?|wì·_|ñÅ_üvì»_†ùgvÊÛÇ'òò‰Ø²á¸£e–¶ÃL›ÛSi·ˆH69—VÝž”ͯÄ" JKG‹Ób­¾ß¨öÃsíŽLlhVFkíÇháŸ>;4TáowÉhð…îhtŠ’ÓT=9·¼fs+éù‰À¢n¸Ó¹B•*éÙ‰Y]õ·¹•Ürl1g«ÖTE/2QDlžj5<²5»mb±Õ¹dz>­Ýñ”‹ˆÕÓÞ ö†ž*^[f&Lj­“n‹¸Š/oh÷Lúúþû% Îæø´p–ÙÇ4k¢h¶ÚÏd¶‡&Á÷Óý[ú:AÚÎWœŠ(6G…Ó."®:[*ÐP}mn%· ,ªÍã“«YßÚvO80¨ðµyT= ¾0j‡k¹+NAGŒ Ñ$1Ô?¤øÚk”d4°¨6OV[9" Ÿ>fìµµá¾þ€Ó׿2‘À¢Ú:°ºg>6³åª„ÏGÂ*†žIgó•DÕ4%‹Ì¸ÚÝ’ˆ†h""–Êövǽ@ïˆt·húB4ü,U;®Q85…ßwÿ°ç;?õüó÷wóß­ßÿw‘û]ø|"%TÈË¥3"™gCý{¦¹|Ÿÿ¼Å"RHÏ¥ÄÑvàF”žŠOO«U÷[œ±VùBþ` Ü{OW]µþqõXm€Rí»¯Æ]áœê¨íù½v©êö7÷ûN+š»±cxX û_x~Þæ¾†ûº QlîÈWi±H‘‰"bqÔyÔéyWf‡×%‹iOÝÖ{–ªÇãÃj èz¦«š§ut¼³Øp—ö¦Ñq#ˆ uM¨®†ûñ¡U>1œ]ö1ˇœÍVÏ9‹Îö°$øžºcKõT|zÚVÓÑbú¶kyÓ褑¡®Œ®:ª›G';·GH{_{Óð¸Fú»Â†¢¹ýãÝuŒQóÿ³w‡!måéâÇŸ»• 'w ÊQ†%L¼"³(w'‘½¦\´»h µÃ­-wÛy¡¾P_X_¤¾P_h^ؼÐ\P_t³àMAÒË`ïî*ì_—‹î,J‹y±f^Ê6 $#M`n 9´Ìÿ…¶U›cÓZ­©ßÏ i~žß9§¿œ'Ïù=9çHAÅF¥ºkÌo …†zîÚœžf“Ô ÂçÝ…éjë&üÁ@¸¿3-š»yx¢}ïóôÞWøˆÙví„χAs7¸"S©;Óí{Ê^c0Ð3¯:<×ý½zdë•mcc†úæuÅæjëªæ½?:–_„þ2ÞþE÷ÿþœ*Þþþá§Ÿ~*f¹ï¾ûî£>:uêC|òëƒûŒaóÇðF¾ýöÛÏ?ÿ¼ˆé7í_t?”º}ÿ7¿»ô»ßÜ{þ³ùæßäóñ¿LSÈ{øðágŸ}öáá³gÏ~øá‡O>ùÄlŸqœàhYE±(;~2$E ”€2†8,Õƒü#Ã@)áŠ< PÈÀˆ‘7vüdHŠÀ­µ8b»Ù|SDvþÄkqEŽŠåÓÿuyÁß”ÿú?þ™?^»/®ÈÀ‘ùø—ƒÿó`qx\‘” y@  ” y@  ” y@  €ƒ:uêÔ³gÏŽ`C†a(Šr2™BJUÕï¿ÿþ6ôäɓӧOŸÌA¦€ƒ:sæÌææf*•2 ã6aF*•ÚÜÜ}öìÙ²²ZÑ¢€w ¬¬¬¢¢‚q8<ÜZ ” y@  ” y@  ” y@  ”€²#ØF:f pBhšv«-+Ý]Nn­J…< PÈJ…< PÈJ…< PÈJ@C€ƒ{úôé“'OþïÿþïÙ³g‡±þS§Nýã?þãÇ\VvB+ZòpPOŸ>}ôèQEEÅ'Ÿ|¢(ÊalÂ0Œ'OžkìÎÅf«}Vk¶ï¶{¡—O-„†¦æãiCuÔ6wù;ê^9ËoŒùÕ½ìË÷èŸÆë,¦í»;^Q}AAæëϬE‚SÑÕxVq6´ø[*‰ÂçPÃÇt¢Tô¡xäásÐñ–[›½Ÿv_jâ³ïx8uêÔlåîÛ- Ç —Û˜ †FîÏ×¾¾»zcïp¯Sâ‘@°'`›ñZݽ££/? d$0%^ÇžXÍ­:«î®á1G:t©3#^ë›/c¶o€•IöÙ?k¼’)ŠËVû$#³Ýx·Ý å¸üãpÏмíŠÌkKÏ}ýå3“-å{úe“ºêéõ·h[gOŠÍeÙ·½˜õ¿¾/ˆ "ÈtýùÇ‘žž°zÉ?Ú.+‘`°'䜹YM>‡>f¥¢Å£ŸƒŽ޹ìJ$S›)äBÞÈoŒ_ûê^ZDĶ£ùñb4¡]™¾ÕR)"Õ~ÿÚžðrÆÛd¯Úñ½Lj6œÐÚï4íù¦&·Y4<£þÖ:«ˆk`íbOd9ãݽT1˘íàCe–}³¬a’)ŠÉVû$#Ó$ø»Þó|2:ŸvõNtøì"âì]Yì™eZÊí{¦QiÑÚ<Þ½—J˜µ³þ×÷D™®?GÒnÿL·Ï.RãT³}³‰´TWrL>‡>f[/êP|?á#18NÞï3ò,޶±ééé‰vÇ®OY#§¹j½ÚöK«æ°‰¡»³ÏR(¬7û›Ë_9ÅYIˆÓçÚúÞÈâô9•ÄR2ÿÆË˜íðaȯ^¸<¾4w»ãò¹úú 7nE7rσkcvðÆ…sõõõõç¯ÞЬo·çÏt\8W__îr÷øJƤ1¹ZyòñöùÒ…ú]/®FS"’Yï¾|¾¾¾þüÕ›“Û+’ÜBǹsksƒWÏ_|¼c7Î]¸18ŸÔyËpqa’}̳Æë3…Y¶Ú'“ÜÝlÏUWƒÏ¥>aSÄ0¶º¦¢Wëë»Wò"ù솮hšúÊ™´ïìk¶~ó¾ ‚ˆ ×FP>¹Ó-µÛµkÝ­É‘ªx„Ïá…é$®¨Cñ}…ÏF ÇÛãÈåkwÓF|èWçGÖó{¦©Ù«çnÌnO9$3{ãå«ÜzôÖÖ´çBÇÈìFž‘DÉxÏ·ÖZìå•vÉ%v}ìZª:Æ'_~¢®DæÓj­k×·=‘PÌÙÕûêsëŒlRW4Ûó{¥›¦‰¬.by³eÌö ø`é{CSžöÞ±v‰E‚¡Î~Û̸Ϟ_õcî®.—ªÇ¢©þpíLw•lLõ–ícn%= ôê¾¾íN¿Ú8\[k›Zg:*íz<–‘X<#•öl|5«ÕºmùõÛ_õÍkWüc>[vn*Ð÷•>±}Ï…‘ "®–®.&™¥¡Î`ÜÝ>0æV‘``YW<¼e8ô”d’}Œ„iÖxM¦0ÏVû$£×'ÁwÑÝ,ÿŽ nwÌl,‡³ŽV÷Ö„Fu¶\º¤h[ÎF¤çB_<«h®†ëþ®¦J‹yû޾¦ë7ï "ˆzmåÒɬ¢êóƒ7"Ë ]uz®û{÷}®Ÿƒÿf!`w(¾—ðyýänßÃñVÙ6=»öU¬}fÒg—\z×´ÂTj¶¯'¬\òùmz, vö«3·}\Ž y–Û˜ ö†áöWÈ­NݗƱÚQf†¨êËgEUDô7_8Ô†Ö‹HµË–ú²3¼˜òµÚÔºëþ–Ʀj«ˆ8•…HOZÉ&³Š««Ñ[cq:4_ZS 6Zl^·z!‘kRKiÍãÖcKÉ|“’XH«nŸÃˆõÏënÿðÖ}UÃFüb0ï©1ÔÖÑÁÖrIE§V•Ɖá¶j‹HÍÀÀã/;çy¿ðÞ²Oæm³Æ>Ùª¨dd’ßI÷ýä×G.vÎë"ŽKÍÛ×RXkZ»kDD$ÌŠ!Нw´KÍ.„ά:3âµfMÚwö5[¿y_ADÐk#È0t1ÁÙ†^ÿ¨ÃHDƒÁ΀mfÄËt”ð9¤ð1óÅß·1wÛGé‹?}ðrZ!)“cm#Nºf:ê¬"Råxüeg4–ñQÉCI8¾…¼ÌÚäPÿݘ¸¯Œ tÔ쌧Ôb8fk-üm‰¢(¢ë/ó¡;ºøe€ÀéunG‘Åéu*ó+é|ky¥¯YYÍE×Ö×â««1]<""W[³ÖÓñ‚Ëãñú| žšr‹HÁF§Ï%Á…dζ’Tk{[Ò«SKÉœ²”W›Ã’½Ÿ4´V×ó€¶»¼š1—ÈJ*"6·{ë;ß|z-­¸º»öŽ÷ ï-û¼mÖØ›­rKÝûc†ˆ¨ž±¯Gœû®öÕÝ8`÷79vvÝ™nMÆ¢¡`OÕÌøî‡U^ºó‡KVëÖÿªÚ©$/ö‡3Þ³v{ë/¾/ˆ "è•õ+¢ˆhW†[*E¤Æ©l?׌"|)|Ìþ ë;8;|Š1”¸Ó Sz"žÕ}¿ªßѦmèB!%á˜ò2 ·® -«Ó½¾½7פ–£ ­ÅSøáŠÍ¡ɬ±]•7ô¬ñÊŠY8aC$³2ÒÙ·¨Ô66ùZºZ[¢=C[gyÖšîÿúSëÚòòÒÒB¨g*è˜ñÙ 6º|=KÄcº£ÝåN;²³ñ„=®;¯;­û~‡¬(v…³'Çìó–Yã•le­˜ž1DDÕf1_mÁÝ8`÷bäS C«®´ZË+­å•½ÊÚrÏl,×äÛuiœÅºã¥ÕY§I4¥‹ØÍÚ‹Yÿëû‚"‚ÌÖï±ÙE­yñ\3G Dønø˜ÊàP<ìðyÓC‰ÏlL§Æóg/Š!bkks¼,+*‡À{ûfðJ÷ï·¯œ,ÿ·Ûá‘_~̨¼ÎÏŽå[¹¬:ÚïLß*pþ”ZžM:šÌ>f-Ž:§$â[ÏçÏ'â†sï/fàH,%¶ŸéšO,$ [fÉÅÂózãØÛ7Ûšêª4EßNu™•ÉÛ‘¸Zãk휜™hV–#±LÁF»»IKÏÍΦ5¯ÃªºÜ¶äìì\ZkrÙElN‡’^Š¿xÜl|)­8œ{¿0³h5š_H¾Ø»¥„ÁÛ…÷—}Þ.kÈV{ù»Õ²ÏjÍ’à»!»<ÔÙ~ñ°gÃÐ Qö\ú‘Yºuµ#òb™\r--¶*Õ´½˜õÓDd¶~‹Ãë0’+ϳ&Døvø˜9È¡xØáóÆ#†ÉËê].¹–Þú—êtªÙDVÝ>´mÙÙ`h1Ëß»8zÿïà_?ÿóƒ<øóø§C¿ÿ;ƒòzÇñм\,ºj8®héÕ¥í0ÅærWÛ-"’‰/$Uמ+eskÑð’ÒÒÞRi±Ö^oT{‚¡…6G::4/ £û[,áŸ>?4TåosñHð¾îh¬%«©z|auÃæR’‹SeÝp%³ùU’óSóºêou)ÙÕèrÖV«©Š^ QDlîZ5t/akvÙÄbó:åÞbR»â.«»­Aí M*í>[z.Œk—î¸,"» uå mî©@_¥ÿº[‰GƒóYÞ-¼Ïìcš5öQ0[íf²Ú}“à»ë^Hym‹# „ªºšœJv5\UFÝÖÝ Òé6e IDATµ%ýµ·Õ¥dW#eµyÂc‹Iû®¾&ë·š÷D½6‚D<ížP_ ²·ÕiÄÂeµqŒ"|1|ÌØßþP<ôð±lÄpìYÅÐÓÉL®zï§jš’Œ†çœm.‰…ƒ1C4Ku[›ãZ gDºZ4})º›ðLhTŽLþ›®/ºÿúüU÷¿þüÅoþ÷ÒÏÿSDä_ÆÿúïH ò²É´HúîPÿŽ6gï׿m±ˆä“ q´îù"JOÌÞ»§Ö\o©´ˆµ¦wÌ „z®éªÓãŸð×YßjàC§Ôö^Wg¡¬êðtù}v©éò7÷û¿º§h®Æöáa50ì¿ïþmkïð•@0Ô×iˆbs5øÇz«-)Ð("‡×­Þ[tz5‹ˆ8|NYNº½Û0¬æÖİ:ïêªæ¾4:ÑQèi$ö¦Ñ #uN©Î†ëÃíÑ¡uÞ1¼¿ìc–5ö9;)˜­öžs\í~Ið]v/¤²ul8‡ûî§ Us7 LtíL¶ºö–Êò¦Ñ; „‡:Óºê¨m½ÓQm³ö}ÍÖoÞDôúkÝÀ„?÷w¦Es7O´×A„Ïa†éjßþP<ìð9èˆá˜ÓÜ ®ÈTggêÎtûÞ£²×ߨ ôÌ«Ïu¯ÞÙ>æÚÆÆ$ õÍëŠÍÕ80ÖŹÇ²ü"ô—ñö/ºþõçTñö÷?ýôS1Ë}÷Ýw}ôÑ©S§2à_¼Øg ›?®€7òí·ß~þùçEÌH¿iÿ¢û¡üÓíû¿ùÝ¥ßýæÞóŸÍ7ÿ&Ÿÿeª˜BÞÇ?ûì³o Ÿ={öÃ?|òÉ'f üŒã GË¢(ŠEÙñ“!)…< ”1À d©üãJ Wä%€BŽXÞ0Œ¼±ã'CRn­ÀûÛÍæ›"²ó'^‹+òpT,Ÿþû¯Ë þ¦ü×ÿñÏüñÚ}qEŽÌÇ¿üŸƒŒÃÛàŠ< PÈJ…< PÈJ…< PÈJ…<Ô©S§ž={v2 CQ”“9ÈòpPªª~ÿý÷G°¡'Ožœ>}úd2…<Ô™3g677S©”a‡´ Ã0R©Ôæææ™3gNæ —qœà€ÊÊÊΞ=»¹¹ùäÉ“Cªå)Šrúôé³gÏ–•Њ…<¼eeeŒÃááÖZ PÈJ…< PÈJ…< PÈJ…< ”Á6Òé4 €BÓ´ÃXmYéî:prpk-P(ä%€BP(ä%€BP(ä%€BPÊÜÓ§O777üñGÃ0cýŠ¢œ>}úÌ™3ee'´¢E!õôéÓGUTT8EQc†a«5ÛwÛ½PŽË§BCSóñ´¡:j›»üu¯œˆå7Æ¿üê^öeƒ{ôOãuÓöâF8³2Ý_M6§çºßßBÖ%‚ˆ "ˆð9Æác:QʬE‚SÑÕxVq6´ø[LgYG>ûOî˜ô•¶ÜÚìý´ûÒ>Óz™gÏž:uê6¤(Ê!=ƒïø;…¼ÜÆl0œ0v}ŽöõÝÕ{‡{‚=Û̈×êî}ùm$#)ñ:öÄjn%ÐXuw 9ÒÑ@ sHñZß|³}|¨L²ÏþYã•LQ\¶Ú'™íÆ»í^(Çå‡{†æmWüc^[z.èë/Ÿ™l)ßÓ/›ÔUO¯¿EÛzê‰bsYömýç7&;ûîÙ® LxÕÄl0ØÙ§ÎŒûì‘DD>Ç2|Ì&JùÇ‘žž°zÉ?Ú.+‘`°'䜹Ym9á³ïäŽI_ÉË®DÂ1µ™BNˆ÷[ÈËoŒ_ûê^ZDĶ£ùñb4¡]™¾ÕR)"Õ~ÿÚžðrÆÛd¯Úñ½Lj6œÐÚï4í9KÉ­F Ϩ¿µÎ*âX»ØYÎxw/UÌ2fûøP™eÅ,k˜dŠb²Õ>ÉÈ4 ¾Ãî…÷<ŸŒÎ§]½>»ˆ8{W{fc™–rûžiTZ´6wï¥fí¯aO"|/íòOtxí"ÕÕéصðüc_[%Ç$DA„Ï1 ³­çãáHÚíŸéöÙEjœj¶o6‘–êJ9ác:¹cÒ ô¼ßgäYmcÓÓÓíŽ]Ÿ¦FNsÕzµí—VÍaCß}Édn)Ö›ýÍ{¿¥É'Wâô¹¶¾7²8}N%±”Ì¿ñ2fû|òëƒ./ÍÝî¸|®¾þÂ[ÑÜóàÚ˜¼qá\}}}ýù«·"ëÛíùÇs#ÎÕ×ן»Ü=¾’1iLE®Ö_ž|¼}^t¡~׋«Ñ”ˆdVÆ»/Ÿ¯¯¯?õæäöŠ$·ÐqîÆÜÚÜàÕóW'ïØsn Î'uÞ2E\˜dó¬ñúLa–­öIFÅ$Áw7ÛsÕÕàs©Ï_Øy~ÇB*zµ¾¾{%/’Ïn芦©¯ìIû޾fû¦'“†ær<ïªÕ9•äJ2Ç!IADásÃÇt—\ˆéΖÚíjšµîÖäHK¥‹ð1ß.“¾ÀãÈåkwÓF|èWçGÖó{¦©Ù«çnÌnO9$3{ãå«ÜzôÖÖ´çBÇÈìFž‘DÉxÏ·ÖZìå•vÉ%v}ìZª:Æ'_æ •È|Z­uíú¶g#Š9»z_}„‘MêŠf{þ7Ž›¦‰¬.by³eÌö ø`é{CSžöÞ±v‰E‚¡Î~Û̸Ϟ_õcî®.—ªÇ¢©þpíLw•lLõ–ícn%= ôê¾¾íN¿Ú8\[k›Zg:*íz<–‘X<#•öl|5«ÕºmùõÛ_õÍkWüc>[vn*Ð÷•>±}Ï…‘ "®–®.&™¥¡Î`ÜÝ>0æV‘``YW<¼e8ô”d’}Œ„iÖxM¦0ÏVû$£×'ÁwÑÝ,ÿŽ nwÌl,‡³ŽV÷ÖPu¶\º¤h[ÎF¤çB_<«h®†ëþ®¦J‹yû޾fû¦¨ŠdÓ/nÓÓiCŒ´.bå¨$‚ˆ "ˆð9vácF:™UT}~ðFd9¡«NÏuoGì½—ðÙgrǤ¯ôU¶MOç®}kŸ™ôÙ%—Þ5­0•šíë +—üc~›‹ƒýêÌmžJ y—Û˜ ö†áöWÈ­NݗƱÚQf†¨êËaEUDô7_8Ô†Ö‹HµË–ú²3¼˜òµÚÔºëþ–Ʀj«ˆ8•…HOZÉ&³Š««Ñ[cq:4_ZS 6Zl^·z!‘kRKiÍãÖcKÉ|“’XH«nŸÃˆõÏënÿðÖ}UÃFüb0ï©1ÔÖÑÁÖrIE§V•Ɖá¶j‹HÍÀÀã/;çy¿ðÞ²Oæm³Æ>Ùª¨dd’ßI÷ýä×G.vÎë"ŽKÍÛ×RXkZ»kDD$ÌŠ!Нw´KÍ.„ά:3âµfMÚwö5Û·Ú6· …¦Vín%1%D¸2‚"‚ˆ Â瘆ÃÐÅHgzý£# ;¶™¯ýX…>HÛG©òâ`|1­”ɱ¶ 'Ý3uV©r<þ²3Ëø¨ä¡$ßB^fmr¨ÿnLÜWÆ:jvÆSj1³µþ~IQÑõ—yÈÐ]ü2À àô:·£Èâô:•ù•t¾µ¼Ò׬¬Çæ¢këkñÕÕ˜.‹«­Yëé¿xÁåñx}¾OM¹E¤`£Óç’àB2g[Iªµ½-éÕ©¥dNYJŠ«ÍaÉÞOZ«ëy@Û]^͘Kd¥F›Û½õo>½–V\]Ž]{Çû…÷–}Þ6kìÍV¹¥î‹ý1CDTÏØ×#Î}Wûên°û›œ ;»îL·&cÑP°§¿jf|÷Ñ*/ÝùÃ%«uëUíT’ûËo‹Y»½ˆün÷ ¯÷õ÷}yOD4Ï¥Zõ^V%1ADDøËð©1)í)¢ˆhW†[*E¤Æ©l?b¯Å~\Â'Æ‹i…)=Ïꉾ_ÕïhÓ6t¡‡’pL y™…[׆–ÕÆé^ßÞ¿<“ZŽ&´Oyáüas¨F2klWå =k¼òÀ„b–NEDÄɬŒtö-*µM¾–®Ö–hÏÐÖYžµ¦û¿þÔº¶¼¼´´ê™ z¦G|ö‚.ŸCÄñ˜îhw¹ÓŽìl¹7œ{ÿäz1Ë'@b)±ýL×|b!aØj4K.ž×ÇîܾÙÖTW¥)úvªË¬LÞŽÄÕ_k÷àäÌD³²‰e 6ŠØÝMZznv6­yVÕå¶%ggçÒZ“Ë.bs:”ôRüÅãfãKiÅáÜû…™E«ÑŒøBòÅÞ-% Þ.¼¿ìóvY£@¶²ØË·Ø­–}Vk–ؽÙå¡Îžð‹‡=†nˆ²çÒÌÒ­«‘Ëä’ki±U©¦íEå÷ÌÂíÁñµœÅZn·H.>—ÏI^&‚ˆ "ˆð9–ácÆâð:ŒäÊó¸Â‡ñû œd/«w¹äZzë_ªÓ©fYuûжegƒ¡Å,ïâèýý¿ƒýtüÏ ýþï ÊëÇ+òr±èªá¸¢¥W—¶ÃL›Ë]m·ˆH&¾T]{®”Í­EÃKJK{K¥ÅZ{½Qí †Úéèм4Œzìo± ‡>|úüÐP•¿ÍeÄ#Áûº{ ±R”¬¦êñ…Õ ›KI.N–uÃ•ÌækTIÎOÍ몿եdW£ËY[­¦*zF±¹kÕн„­Ùe‹Íë”{‹I튻\D¬î¶µ'04©´ûlé¹P0®]ºã²ˆì.Ô•7´¹§}ý•þën% Îgy·ð>³iÖØGÁlµ›Éj÷M‚ï®{!åµ-ŽP(ªêjr*ÙÕHpUiu[w'H§×–ôÔÞV—’]–Õæ ],&í;ûÚÌöMÕ$6Ô?¤ô¶Õ)ñH`Ym¾SËcú‰ "ˆ"|Žiø˜±{Ú=¡¾þ@eo«Óˆ…Ëj㘧¸Ëâ;|˜Ý}ð¬bèéd&W½÷ˆS5MIFÃsÎ6—ÄÂÁ˜!šˆˆ¥º­Íq-Ð3"]-š¾ ÝMx&4Ž“#“ÿ¦ë‹î¿>Õý¯?ñ›ÿ½ôóÿù—ñ¿„~Á;RB…¼l2-’¾;Ô¿£ÍÙûõo[,"ùäBB­{¾ˆÒ³÷î©5×[*-b­éó¡žkºêôø'üuÖ·ZøÐ)µ½×ÕÙ@g(«:<]c~Ÿ]DjºüÍýÁþ¯î)š«±}xX ûï»ÛÚ;|% õu¢Ø\ þ±Þj‹E 4ŠˆÅáu«÷^Í""ŸS–“nïö «¹51¬Bλºª¹/NtzÜ¥½itÂÂCSª³áúp{thw ï/û˜e}ÎN f«½çœW»_|—Ý ©lÎÂá¾ûiCÕÜ ];¤­®½¥²¼iôŽá¡Î´®:j›GïtT[DĬ}G_1Û7{uטß õܵ9=Í& ‚ˆ "ˆð9ácºÚº 0îïL‹ænžh¯)¶ë!‡O%ÙNs7¸"S©;Óí{Ê^c0Ð3¯:<×ý½zdû˜k“@0Ô7¯+6WãÀXW5GÇò‹Ð_ÆÛ¿è~Xø×ŸSÅÛß?üôÓOÅ,÷Ýwß}ôÑG§NbÈ€@~}ðbŸ1lþ¸bÞÈ·ß~ûùçŸ1#ý¦ý‹î‡òO·ïÿæw—~÷›{Ï6ßü›|>þ—©b y>üì³Ï>¼1|öìÙ?üðÉ'Ÿ˜-ð3Ž3-‹¢(eÇO†¤ò€PÆ'¥zðd(%\‘” y8byÃ0òÆŽŸ I¸µGìo7›oŠÈΟx-®ÈÀQ±|úï¿./ø›ò_ÿÇ?óÇk÷Åy82ÿrð 2oƒ+ò€@!(ò€@!(ò€@!(òpP§NzöìÙlÈ0 EQNæ SÈÀA©ªúý÷ßÁ†žÝÜÜüñÇ Ã8Œõ+Šrúôé3gΔ•Њ…<ÔÓ§O=zTQQáp8E9ŒM†ñäÉ“G={ödÖò(äà 677+**Μ9sx›P¥¢¢âŶNà óŒ<”®ëv»ý6ôñÇÿøã'sÇy©èžÇþé›U–ç-™•ÉàÔâj"-6gÃuWK•Ur ¿Šïî©xÆþ0RcÙÕ–< L-ÆuÕéið7UZ^Ýb1˘í€£•_¹Ø§½7Öw¯Pöy}ÖØ)ŠÍVû¬Öl7Þm÷B9.ŸZ MÍÇÓ†ê¨mîòwÔ½r"–ßÿò«{Ù— îÑ?×YLÛ‹áâú‚"‚ˆ Â瘄éD)³ NEWãYÅÙÐ>ào1e}øú/¿ÁˆáXË­ÍÞO»/í3­Ç‘yöìÙ©S§Ž`CŠ¢Ò3øŽ¿cPÈËmÌà £a×çz_ß]½±w¸×)ñH ذ͌x­îÞÑÑ—ÐF2˜¯cO¬æVUw×ð˜# :‡Ô™¯õÍ—1Û7À‡Ê$ûìŸ5^ÉÅe«}’‘Ùn¼Ûî…r\þq¸ghÞvÅ?浥炾þò™É–ò=ý²I]õôú[´­§ž(6—eßö"F¸˜¾ ‚ˆ "ˆð9&ác6QÊ?Žôô„ÕKþÑvY‰ƒ=!çÌÍj˱ŸÂÿå¢G Ç\v%Ž©Íò@!ïä7Ư}u/-"bÛÑüx1šÐ®Lßj©‘j¿íb_x9ãm²Wíø^&5Nhíwšö|S“[,žQkUÄ5°v±'²œñî^ª˜eÌö ð¡2Ë>ŠYÖ0ÉÅd«}’‘i|‡Ý ïy>O»z':|vqö®,öÌÆ2-åö=Ó¨´hmïÞK%ÌÚ‹ÉïEôDA„Ï1 ³­çãáHÚíŸéöÙEjœj¶o6‘–êJ9ácö_.rÄà8y¿Ïȳ8ÚÆ¦§§'Ú»>ÝœæªõjÛ/­šÃ&†¾û’ÉÜR(¬7û›÷~K“O®$Äésm}odqúœJb)™ãeÌö ø0ä×/\_š»Ýqù\}ý…·¢¹çÁµ1;xã¹úúúúóWoEÖ·ÛóçF:.œ«¯¯?w¹{|%cÒ˜Š\­¿<ùxû<íBý®W£)ɬŒw_>___þêÍÉíIn¡ãܹµ¹Á«ç¯N>Þ±ç.ÜœOê¼e8Џ0É>æYãõ™Â,[퓌ŠI‚în¶çª«ÁçRŸ¿°)òüŽ…Tôj}}÷J^$ŸÝÐMS_Ù!“ö}M÷ͼ/ˆ "ˆ"|Ž[ø˜Nâ’ 1ÝÙR»]³ÖÝši©”ã>EL÷1o#—¯ÝMñ¡_YÏï™V¤f¯ž»1»=åÌì—¯rëÑ[[Óž #³yF%ã=ßZk±—WÚ%—Øõ±k©êŸ|ù‰º™O«µ®]ßölDB1gWï«Ï­3²I]ÑlÏÿƱbÓ#‘ÕE,o¶ŒÙ¾ #}ohÊÓÞ;Ö.±H0ÔÙo›÷Ùó롞`ÌÝ5ÐåRõX40ծ鮒©¾À²£}`Ì­¤gCþ@Ý×·ÝéW‡kkmS«ñLG¥]Dz"‹g¤Òž¯fµZ·-¿~û«¾yíŠÌgËÎMú¾Ò'¶ï¹0’á@ÄÕÒÕåÑ$³4ÔŒ»ÛÆÜJ" ,늇· ‡ž’L²‘0Í¯ÉæÙjŸdôú$ø.º›åß‘Á펙åðbÖÑêޚШΖK—mkÃYÈô\è‹gÍÕpÝßÕTi1oßÑ×tßÌû‚"‚ˆ Â縅YédVQõùÁ‘å„®:=×ý½±÷^ÂçõÀ}G Ç[eÛôtîÚW±ö™IŸ]ré]Ó S©Ù¾ž°rÉ?æ·é±h0ØÙ¯ÎÜöq9&(äXnc.ØX4†Ûw>\!·:u_Çj D™a¢ª/Ó‚¢*"ú›/œjÃÀ@kE¤ÚeK}Ù^LùZmjÝuKcSµUDœÊB¤'­‹ˆd“YÅÕÕè­±‹8š/­)-6¯[½¿È5©‰¥´æqë±¥d¾II,¤U·ÏaÄúçu·x뾉ªa#~1‰wÔˆˆjëè`k¹ˆ¤¢S«JãÄp[µE¤f`àñ—ó¼_xoÙ'ó¶YcŸlUT22I‚ï¤û~òë#;çuÇ¥‰æík)¬5­Ý5""’NfÅÅ×;Ú¥fÂ@gVñZ³&í;ûší[Ú´/ˆ "ˆ"|Ž[ø˜1 ]ŒDp¶¡×?ê0Ñ`°3`›ñÚAø¼v$÷1wÛG©òâ`|1­”ɱ¶ 'Ý3uV©r<þ²3Ëø¨ä¡$ßB^fmr¨ÿnLÜWÆ:jvÆSj1³µþ¶DQÑõ—ʆnìèâ—N§×¹E§×©Ì¯¤ó­å•¾fe=6][_‹¯®ÆtñˆˆX\mÍZOÿÅ .Çëó5xjÊ-">—’9ÛJR­ímI¯N-%sÊRR\mKö~ÒÐZ]ÏÚîòjÆ\"+5ªˆØÜî­ï|óéµ´âêrìÚ;Þ/¼·ìó¶Yco¶Ê-u_ì"¢zƾqî»ÚWwã€ÝßälØÙugº5‹†‚=ýU3ã»TyéÎ.Y­[ÿ«j§’¼Ø^Ìx[ÌÚíEä÷¢û‚"‚ˆ Â罇ÙtUDÑ® ¶TŠHSÙ~ÄÞЇ>¯Éý&˜(A/¦¦ôD<«'ú~U¿£MÛÐ…B(ä -ܺ6´¬6L÷úöÞZŽ&´Oá‡(6‡j$³ÆvUÞгÆ+L(fà„QDD ‘ÌÊHgߢRÛØäkéjm‰ö mòXkºÿëO­kËËKK ¡ž© g`zÄg/Øèò9ôH,éŽv—;íÈÎÆö¸î¼î´îû²¢ØΞp³Ï[fW²•µv`zÆQT›EÄ|µwã€Ý‹‘Om$ ­ºÒj-¯´–Wö*kË=³±\“o×…=뎗Vg&Ñ”.b7k/&¿ÕDD>Ç"|ÌNål6EQk^ûäþL”¼—Õ»\r-½õ/ÕéT³‰¬º}hÛ²³ÁÐb–¿wqôþþßÁ¿~:þç}~h¨Êßæ2â‘à}Ý=ÐX)JVSõøÂê†Í¥$§˺áJfó5ª$ç§æuÕßêR²«Ñ嬭VS½@£ˆØÜµjè^ÂÖì²‰ÅæuʽŤvÅ]."Vw[ƒÚšTÚ}¶ô\(×.ÝqYDvêÊÚÜS¾þJÿu·ç³¼[xŸÙÇ4kì£`¶ÚÍdµû&Áw×½òÚG(Uu59•ìj$¸ª4Œº­»¤ÓkKújo«KÉ®FËjó„Ç.“ö}mfûfÞDD>Ç.|ÌØ=ížP_ ²·ÕiÄÂeµq¬ÈCñ°Ã§r¿‘,bÄpìYÅÐÓÉL®zï§jš’Œ†çœm.‰…ƒ1C4Ku[›ãZ gDºZ4})º›ðLhTŽLþ›®/ºÿúüU÷¿þüÅoþ÷ÒÏÿSDä_ÆÿúïH ò²É´HúîPÿŽ6gï׿m±ˆä“ q´îù"JOÌÞ»§Ö\o©´ˆµ¦wÌ „z®éªÓãŸð×YßjàC§Ôö^Wg¡¬êðtù}v©éò7÷û¿º§h®Æöáa50ì¿ïþmkïð•@0Ô×iˆbs5øÇz«-)Ð("‡×­Þ[tz5‹ˆ8|NYNº½[÷YXjnM «P ó®®jîK£…žFbo0ðPç”êl¸>ÜZçÃûË>fYcŸ³“‚Ùjï9gÁÕî—ße÷B*[dž3p¸ï~ÚP5wÃÀD×Îi«ko©,o½#Á@x¨3­«ŽÚæÑ;Õ1kßÑWÌöͼ/ˆ "ˆ"|Ž_ø˜®¶n` „û;Ó¢¹›‡'ÚkŠízÈáS)æ#YÔˆá˜ÓÜ ®ÈTggêÎtûÞ£²×ߨ ôÌ«Ïu¯ÞÙ>æÚÆÆ$ õÍëŠÍÕ80ÖÅ'ç²ü"ô—ñö/ºþõçTñö÷?ýôS1Ë}÷Ýw}ôÑ©S§2à_¼Øg ›?®€7òí·ß~þùçEÌH¿iÿ¢û¡üÓíû¿ùÝ¥ßýæÞóŸÍ7ÿ&Ÿÿeª˜BÞÇ?ûì³o Ÿ={öÃ?|òÉ'f üŒã GË¢(ŠEÙñ“!)…< ”1À d©üãJ Wä%€BŽXÞ0Œ¼±ã'CRn­ÀûÛÍæ›"²ó'^‹+òpT,Ÿþû¯Ë þ¦ü×ÿñÏüñÚ}qEŽÌÇ¿üŸƒŒÃÛàŠ< PÈJ…< PÈJ…< PÈJ…<Ô©S§ž={v2 CQ”“9ÈòpPªª~ÿý÷G°¡'Ožœ>}úd2…<Ô™3g677S©”a‡´ Ã0R©Ôæææ™3gNæ —qœà€ÊÊÊΞ=»¹¹ùäÉ“Cªå)Šrúôé³gÏ–•Њ…<¼eeeŒÃááÖZ PÈJ…< PÈJ…< PÈJ…< ”Á6Òé4 €BÓ´ÃXmYéî:prpk-P(ä%€BP(ä%€BP(ä%€BPÊÜÓ§O777üñGÃ0cýŠ¢œ>}úÌ™3ee'´¢E!õôéÓGUTT8EQc†a|Þd$Qjrk³‘ý§õ82Ïž=;uêÔlHQ”Czßñw n­ÍmÌà £a×çh_ß]½±w¸×)ñH ذ͌x­îÞÑÑì‹…Œd$0%^‡eÏêVUw×ð˜# :‡Ô™¯õÍ—1Û7À‡Ê$ûìŸ5^ÉÅe«}’‘Ùn¼Ûî…r\þq¸ghÞvÅ?浥炾þò™É–ò=ý²I]õôú[´­§ž(6—eßö"¶»1ÙÙwÏve`«&fƒÁÎ>ufÜgçˆ$‚ˆ "ˆð9–ác6QÊ?Žôô„ÕKþÑvY‰ƒ=!çÌÍj˱Ÿ7I”šìJ$S››*-ŒN‚÷[ÈËoŒ_ûê^ZDĶ£ùñb4¡]™¾ÕR)"Õ~ÿÚžðrÆÛd¯ª{yN’š '´ö;M{ÎRr«‘EÃ3êo­³Š¸Ö.öD–3ÞÝK³ŒÙ¾>TfÙG1Ë&™¢˜lµO22M‚ï°{á=Ï'£óiWïD‡Ï."ÎÞ•ÅžÙX¦¥Ü¾g•­Íã­³KQí¯ßn.¾—vù':¼v‘êêáTìZxþ±¯­’c’"‚ˆ Âç†ÙÖóñp$íöÏtûì"5N5Û7›HKu¥ƒðɽáHÀ1ö~o­µ8ÚÆ¦§§'Ú»>ÝœæªõjÛ/­šÃ&†¾û’ÉÜR(¬7û›÷~K“O®$Äésm}»bqúœJb)™ãeÌö ø0ä×/\_šÛºƒáÂ[Ñ·Nä6fo\8W___þê­Èúvûó»êëÏ]îß¾ÝáÕÆTäjýåÉÇÛçiêw½¸M‰Hfe¼ûòù=÷Mä:Îݘ[›¼zþêäã»qîÂÁù¤Î[†£ˆ “ìcž5^Ÿ)̲Õ>ɨ˜$xàîf{®º|.õù ›"ÏïXHE¯nߪ”Ïn芦©¯ìIûξ&ÛÕ“ICs9žwÕêœJr%™ã$‚ˆ "ˆð9Žác:‰K.ÄtgKív5ÍZwkr¤¥RŽEød$qì=Ž\¾v7mć~u~d=¿gZ‘š½zîÆìó[µ3³7^¾Ê­GomM{.tŒðT”’÷|k­Å^^i—\b×Ç®¥ªc|òeZ‰Ì§ÕZ×®o{6"¡˜³«·ê•+glRW4Ûó¿q¬Ø4ÅHduË›-c¶oÀÃHßšò´÷޵K, uöÛfÆ}öüz¨'sw t¹T= Lõ‡kgº«dcª/°ìhs+éÙP ?P÷õmwúÕÆáÚZÛÔj<ÓQi×㱬ˆÄâ©´gã«Y­Öm˯ßþªo^»âóÙ²sS¾¯ô‰í{.Œd8qµtuy4É, uãîö1·’ˆ˺âá-á§$“ìc$L³Æk2…y¶Ú'½> ¾‹îfùwdp»cfc9¼˜u´º·¦€ª³åÒ%EÛÚpÖ0"=úâYEs5\÷w5UZÌÛwö5Ù®¢*’M¿¸LO§ 1Òºˆ•£’"‚ˆ ÂçØ…Ù¡h¤“YEÕçoD–ºêô\÷÷¶TYEøì3dÒWú*Û¦§s׾еÏLúì’KïšV˜JÍöõ„•Kþ1¿MEƒÁÎ~uæ6O%…¼ƒËmÌû‹FÃpû·+äV§îKãXm(3 CTUÝuj#ú›/œjÃÀ@kE¤ÚeK}Ù^LùZmjÝuKcSµUDœÊB¤'­‹ˆd“YÅÕÕè­±‹8š/­)-6¯[½¿È5©‰¥´æqë±¥d¾II,¤U·ÏaÄúçu·x뾉ªa#~1‰wÔˆˆjëè`k¹ˆ¤¢S«JãÄp[µE¤f`àñ—ó¼_xoÙ'ó¶YcŸlUT22I‚ï¤û~òë#;çuÇ¥‰æík)¬5­Ý5""’NfÅÅ×;Ú¥fÂ@gVñZ³&í;ûš°×¶¹e(4µâhw+‰ù@(!•DD>Ç4|̆.F"8ÛÐëu‰h0ذ͌xíÇ |2L?lÛG©òâ`|1­”ɱ¶ 'Ý3uV©r<þ²3Ëø¨ä¡$ßB^fmr¨ÿnLÜWÆ:jvÆSj1³µþ~IQÑõ—ʆnìèâ—N§×¹E§×©Ì¯¤ó­å•¾fe=6][_‹¯®ÆtñˆˆX\mÍZOÿÅ .Çëó5xjÊ-">—’9ÛJR­ímI¯N-%sÊRR\mKö~ÒÐZ]ÏÚîòjÆ\"+5ªˆØÜî­ï|óéµ´âêrìÚ;Þ/¼·ìó¶Yco¶Ê-u_ì"¢zƾqî»ÚWwã€ÝßälØÙugº5‹†‚=ýU3㻎TyéÎ.Y­[ÿ«j§’¼Ø^Ìx[ÌÚ‹Ù¸Ý70¼Þ×ß÷å=Ñ<—jÕ{Y•ÄLADás,çƤ´§ˆ"¢]l©‘§²ýˆ½ûû&€'Ì‹i…)=Ïꉾ_ÕïhÓ6t¡‡’pL y™…[׆–ÕÆé^ßÞ¿<“ZŽ&´Oyáüas¨F2klWå =k¼òÀ„b–NEDÄɬŒtö-*µM¾–®Ö–hÏÐÖ)µ¦û¿þÔº¶¼¼´´ê™ z¦G|ö‚.ŸCÄñ˜îhw¹ÓŽìlf§r6›¢¨5/±ç¨)þ0>ìðaxÂf6¦Ó ãù³Å±5޵9^tµœ±;z¹o¯tÿ~ûÊÉò»ùåÇŒÊëüìX¾•KÀª£ýÎô­çO©åÙ¤£É¤Ž'GS ñ­üæ“ qù÷O®³ p$–ÛÏtÍ'†­F³äbáy½qìÎí›mMuUš¢o§ºÌÊäíH\­ñµvNÎL4+Ë‘X¦`£ˆÝݤ¥çfgÓš×aU]n[rvv.­5¹ì"6§CI/Å_o—5 d+‹½|‹ÝjÙgµfIð€Ý‹]êì ¿xسaè†({.XÈ,ݺÚy±L.¹–[•jÚ^äüõöàøZÎb-·[$Ÿ‹Ëç$/ADDøËð1cqxFråù ÜƇ>LO´—Õ»\r-½õ/ÕéT³‰¬º}hÛ²³ÁÐb–¿wqôþþßÁ¿~:þç}~h¨Êßæ2â‘à}Ý=ÐX)JVSõøÂê†Í¥$§˺áJfó5ª$ç§æuÕßêR²«Ñ嬭VS½@£ˆØÜµjè^ÂÖì²‰ÅæuʽŤvÅ]."Vw[ƒÚšTÚ}¶ô\(×.ÝqYDvêÊÚÜS¾þJÿu·ç³¼[xŸÙÇ4kì7±.”­v3Yí¾IðÝu/¤¼¶Å BU]MN%» ®* £nëîéôÚþ€ÚÛêR²«‘À²Ú<᱋Ť½¨äªjêRzÛê”x$°¬6ß©å1ýDD>Ç4|ÌØ=ížP_ ²·ÕiÄÂeµqÌSÜU¥‡>o3’(%V1ôt2“«¶¿ò ©)ÉhxÎÙæ’X83D±T·µ9®zF¤«EÓ—"¡» Ï„FàÈä¿éú¢û¯Ï_uÿëÏ_üæ/ýÿöî(4®ûÎø¿µ8ƒaDaÌØ”˜q¡ò.Hd‘ÙV2{­Ü‹Ý++eã„­“Y²?(zõ σ3²l=¸*ø*à+_вÛÚ°ØËÅn›ë¡V,ÂZ45Ö@Ñ@ªCÜÜˉíh9²eøóyÑñùÏ9ùÏùÍoÎwÎýÿ†Â?žüÝÈ<# òʳ¥J ö?´,ßûë_¶§BXœ½4r}|R™™<>Ýt¨½>j›z‡ûŠ…‘ž·*é|Kß©¾]µßhø¶‹š{¥' ]#åt®¥{¸¯­.„ÐÔÝ·¿¿ØÿÎù(Û°·sh(],öØøËŽÞ¡7 Å‘£]qˆ2 {ú†{w¦Ra™…!„T®µ1}þr¾5› !äÚòáêlcëÒßÛkzïÔPº0Rèú ’Î68qêðr·»¬ÛwâT\(Œ v¦ó{ uN ÞôŒñüºOµ®±Â»“e»Õãï9—}Ø•šàÓ¾œúŽá¡ùÂØØÑKq:Û¸gàT÷à 2³«³½~ë¾gB±06ØUª¤sÍûOœ9¼3B¨¶üá±Õ¶›ÚÙ=ÜŽ ö|É·ì¯ò€ RA*HùlŒò©ú°»Nõ cý]¥mÜ?tª³iµCŸyù<ùL’$ÙÆ= ã£]]sgÎv>~Tööíí/z.¦s-‡úz+ýãKÇÜÁááP(޽X‰2 {†»wzé\?©üîdç|¼ü?¿,Å[Ùw>ÿüóÕ¬÷§?ýé{ßûÞ¦M›L| ,Þ<öÚÑx¨úíŠà‰üñ|ùå—WqFúûÎù8üÝûþâW~õ‹ó~î÷áå“¿]M÷ñÇÿð‡?üöÍá½{÷þò—¿|ÿû߯¶Âwg¬¯TE©è¡Ÿ¦dy5¦^@©Ç~û[ÓIâŠ<HAël1ŽãÅø¡Ÿ¦d|µ€uö‡w÷¿Bxø'_Ëy¬—Ôþùg[—ý—­?û—¿÷ÇkWäŠ<ÖÍKÿtìß>:f¾ Wä@ò y‚<HA$€ @ÀZmÚ´éÞ½{ë°¡8Ž£(z1'YÀZ¥Óé?ÿùÏë°¡»wïnÞ¼ùÅœdAkµeË–;wîÌÍÍÅqüŒ6ÇñÜÜÜ;w¶lÙòbNrã €5ª©©Ù¾}û;wîÞ½ûŒ²¼(Š6oÞ¼}ûöšš4ÑäðÔÔÔlÛ¶Í<<;¾Z È€ä@ò y‚<HA$@Í:l£T*™h^ÙlöYûì³;wî|úé§q?‹Ç¢hóæÍ[¶l©©yA-AkõÙgŸ}òÉ'Û¶mËårQ=‹MÄq|÷îÝO>ùdûöí/f–'È`­îܹ³mÛ¶-[¶<»MDQ´mÛ¶/¶õN²{ä°V•J¥®®n6ôÒK/}úé§/æ$oŒ+òæ&Þî¹ÝwöÝ©Kæ¯.Ž^¾>S ™üžC}Ýí;jÃÂ¥Ã?œ~tdÔ2ü›ãM©G–-Þ¾P,Œ^ž®¤ó-}ûêS_ÝâjÖ©¶oÀúZ¼yüµ£•¡_?^ëðô-×}¾¾k<Ú)VÛ­VxØj»ñt‡/×ãç. Ž^œ.Åé\óþî¾Ã»¾òFlñÖÉŸ¿s¾ü傯ÿqrWªêòÕl÷IÆ¢‚T R>Ͻ|ªž(Íß/ŽN\Ÿ.Gù=}íUϲžfù|éöÄÛïL4Ÿù?‡ëW76^ýŒ±¡-ܘü°Ôx`…ÓzÖͽ{÷6mÚ´Š¢è݃oãÛAÞ­ÉâØL¼ç‘×õ£G?¨ìíê͇éñB±§9w¼µ¶±÷ĉ/_|ãÙñÂhhÍ=V« × ]…ëÝCùÒD¡Ð5˜>w¼µöÉש¶o|[Ué>+w¯tŠÕu«šQµÝxºÃ—ëq‹·Çz/fÞènÍ”. Gû·ž;ݾõ±qåÙJº¥·¯={ÿ®'Q¦!µâòÕôÖÕŽE© ¤|žùT;o÷ôŒ¥ôè ׯ‹Åž‘ü¹ww¦ž}ù,¹=182g›—ÝßeǦV;clpåkãcSéý‚<^Ï7È[¼uò­wΗB!óðKð剙ìgßk¯!ììë»ñÚѱ«ó­ûêv<ô¹ÌÜäØL¶ó̾Ç>©Y¸>~9n9Ñ×±«6„†¯õŒ_o}t­Õ¬Smßø¶ªÖ}¢j]£J§XM·Z¡Um‚Oqøò{¾8;q±ÔÐ{êp[]!ß{írÏäÔ|ûÖºÇN…J!{°¥õñK%ª-_Mo]ÍXT RAÊgc”Oµ­/N—ûÎi« ¡)Ÿ.œ)…õáY—ÏÒ$NÆÊÙjwÖ¯2v•3°‘<ß{ä¥r‡Ïž={ª3÷È«{¼mhnÍ.ýZ›ÍeB\yô’É…+#c•ý}ûÿ”fqöÚLÈ·5ÜÿÜ(•oËG3WfŸxjûß‹7½úúÉ+Þ?üú+»w¿úö{·×­Éco¿úÊîÝ»wÿäÍ÷Æo.-_¼}áøáW_Ù½{÷+¯9ym¾Ê¹ñ7w¿~úöÒû´Ww?òË›s!„ùk'¼þ“Ý»wÿäÍwO/=PX¸tø•·/ܸpìÍŸ¼yúöC»ñÊ«o»8[ñ”±uQ¥ûTï_ß)ªu«šÑjšàš‡WÛótÞ¶†ôƒ_2Qxð…¹‰7wï>rm1„Åò­J”ͦ¿²CU–?<¶Úv«E© ¤|6ZùT=‰›½4UÉ·7/Å`µ»Þ;}¼½><ûò !Üñâƒ}ÙåËge²ÂŒ±±Ýý­JñôàOrüæâc§s“o¾òöäÒ)G˜Ÿ|ûËßnN¼wÿ´çÕÃÇ'o-šIã9µ6U·µ¾.,Ì<ò’šÚqøäé/_Q¯_,¥›ù´çÖøÈT¾»÷«÷­‹Ë³•(›yðIL”ÉFñL¹BêÉÖ©¶oð­—Î޶töw†©ñâHWæÜɶºÅ›#=Å©Æîî†tej¢0Ú?Ö|îÈŽpkôháj®s`¸1*MŽú »~ý~cé« ‡š›3£×§ç××U¦§Ê!„©éùP_Wž¾^Î67fo¾ÿÎÑ‹Ù7ú†Û2å £…£ïTN-}ç"ž+Œ7´ww·dÃü•Á®âtcçÀpc43^,\­D-ž2žyKªÒ}♪]ãk:EõnµB3úú&ø4†Wë¿Ç- œ¿uuìr9×Ñxÿ„&o?p ÊÞßp9ŽÇ{^=:]޲ {õuï«OU_þðØj½µúXT RAÊg£•OµC1.Í–£tåⱷǯÎTÒù–C}½ËÜbïé—Oan¢0Ý}¼)„âtljc[Cs£×£½§†îL…Ð40pûç]=_<·î3ÿM»Æ ÝjUͨJ|*ÃW²xóøk]+!äœÚ¿t-EmSÇ‘¦B¥ÙrˆCÔÖ{¢;]¾4V(t•Ó玷֖«,xl5ÕÇ¢‚T R>­|ª‰ãJˆgŠ“{zûNä♉b±«9w¼µîY—O˜›«UžzäñV1vU3ÆF·t”~ñÅê/O+Â\•cíÖøØlãÀ¹Ã»jC;ò·Þ515ß&É#6n7ãô`ÿS¡ñáÃM×ÓÜ屩LÇòŸ–DQ*•/ûP\‰*èÕ¯/€|k~©ŠRùÖ|tñZi±ck}ÛþèæÔ…‰7oL_¿>U -!„j8¸?ÛÓÿÚ« --­mm{Zš¶¦BXva¾­!/Í.d®Í¦›{ÛK×G¯Ì.DWfCÃÁ\ªüálœíhxPÐu ­ÙøÂL94¥C™ÆÆûŸù.–n”¢†îÜ#{çùâ¹uŸoÚ5ïV W޼Ö?‡Ò-ÿ>ž_ña¿ºkþ$ï†óÝgÎvÌNMŒ{úwœ;ùèÍ‚êœùÍÚÚûÿW;óÑìkýc—ç[Û«-_ÍÆ×2¤‚Tk­ü\œIDATòYßò©ö]£…}cèX{}¡)-Ýbï ÅoT>ÍWÇ*û‡¬xê×”ÉJ'˜$ЧUUf¦Ë•™£?Ýýвì­Jä‘4È›¿ôÞ[ƒWÓ{Îö¶=þ’®”ã¯Ü a5ëÀ & !„8„ùkÇ»Ž^Žš÷îkkïîhŸè¼ÿ.¯¶éÈÿþŽW¯^¹ri¤g´Ø2pöx[ݲ Úr•ñ©™é©J®³¡±”+ONÏÔMWò‡òµ+~†Eu‘wOlÄîó »ÆWºUmóÀÙsq!DéL*„ê»ìn¬qøj,ÎÝš‰³;ëkk·Ö×n­ïn\활ZØ×öÈ…=©Ú‡~­Íïʆ‰¹JuÕ–¯êÔm cQA*H)Ÿõ-Ÿjoå2™(J7}q‹½\ÓêÅ5”ÏbéÚLevúÿùÁƒùà­Ýç[†óhâ¸b™¬x‚IÏlªžVÄî½â2ûO Ì}Gi‡Às°ðûcoù÷¥+'·þ¯÷ÇŽÿÓKfåë|wC>•W …ë¹Î3gß[æýÓÜÕÉÙܾj/³©Ü®|˜¹4}ÿþü‹³—¦ãüã@|5ëÀ `æÊÌÒ=]g.ÍÄ™¦ljajìbeïð™÷ß=¸o׎lTYjuó×N¿?>një8rìô¹Sû£«ãSóË. ¡®q_¶tar²”mÍÕ¦3³““JÙ} u!dò¹¨teú‹ÛÍN_)E¹ü㘥²MÙxúÒì{we&ötñüºÏ7ëËt«TÝÖûêjS+qµœiΦ£Ê2 C™ÆæôÈù™Ìþ†LHeZóáüåÙìµ÷¤{ ƒ§£Î¶LéÂHq:{àLC*„Gƒº­{6ŽŽö×÷jŒ¦'ŠËž-žg÷©Ú5V:³^®[=ªÊîØŸÞðålmnÏŒFvtïËGåëãÅëÑžµ6È|kf¦Ð_H÷v4Dåëã…«éý§ZêBªÊòÕ4׺êcQA*H)Ÿ W>ÕÔµt¶Œí/Ô÷vä㩱ÂÕôÞáUŠk*ŸP_ÿ`+Q}¢LnÇÒ‚¯»Úcë q¥4;¿°óñ#.ÍF³còÂÔXq*ÙBHíÕºÆ ïN–íV¿ç\öaWj‚Osørê;†‡æ ccG?,ÅélãžSÝ7ÈÌ®Îöú­ûNœ ÅÂØ`W©’Î5ï?qæðÎT¡Úò‡ÇV=«:¤‚TòÙxåSõaw œê+Æú»J!Û¸èTgÓj‡®¥|ª[ÕØUÍ\¶qOÃøhW×Ü™³•½}{û‹…ž‹é\Ë¡¾ÞJÿøÒ1wpx8Š#G/V¢LÃÞán¯œë(õ£‘ßìüñ‘—ÿç—¥x+ûÎ矾šõþô§?}ï{ßÛ´i“)ƒoÅ›Ç^;U¿]1<‘?þñ/¿üò*ÎHßùã#‡¿{ÿÃ_üêÀ¯~qþÁÏýïþ!¼|òw£« ò>þøãþð‡ß¾9¼wïÞ_þò—ïÿûÕVø®ã €õ•Š¢(=ôÓ”¬‚  ÆÀ (µóØok I\‘ È`-Æq¼?ôÓ”¬‚¯Ö°ÎþðîþwCÿäk¹"€õ’úÁ?ÿlë²ÿ²õgÿò÷þxíŠ\‘Àºy韎ýÛGÇÌÃ7áŠ<HA$€ @ È€ä@òX«M›6Ý»wo6ÇqE/æ$ òX«t:ýç?ÿy6t÷îÝÍ›7¿˜“,È`­¶lÙrçι¹¹8ŽŸÑ&â8ž››»sçΖ-[^ÌI®qœ°F555Û·o¿sçÎÝ»wŸQ–EÑæÍ›·oß^Só‚&Z‚<ž‚šššmÛ¶™‡gÇWk y‚<HA$€ @ È€¨Y‡m”J% À "›Í>‹‡­Iî®À‹ÃWk y‚<HA$€ @ È€¨1¬ÝgŸ}vçÎO?ý4ŽãgñøQmÞ¼yË–-55/h¢%È`­>ûì³O>ùdÛ¶m¹\.Š¢g±‰8ŽïÞ½ûÉ'Ÿlß¾ýÅÌòy¬Õ;w¶mÛ¶eË–g·‰(жmÛöŶ^ÀIv<ÖªR©ÔÕխÆ^zé¥O?ýôÅœäqEÞÜÄÛ=·ûξ»#õ`ÉüµÓÅÑË×gJ!“ßs¨¯»}GmX¸tø§ƒÓŽŒZ†s¼)õȲÅÛŠ…ÑËÓ•t¾¥s o_}ê«[\Í:Õö X_‹7¿v´2ôëÇkž¾åºÏ×wG;Åj»Õ [m7žîðåzÜâÜ¥‘Áыӥ8kÞßÝwx×WÞˆ-Þ:ùówΗ¿\Ðxâ?NîJU]þ´¶‹ RA*Hùl˜ò©z¢4c¼8:q}ºå÷tôµW=Ëzšåó¥Ûo¿3Ñ|æÿ®¥ÇƵpcòÃRãNëY7÷îÝÛ´iÓ:l(Š¢gt¾oy ·&‹c3ñžG^×ý ²·w¨7¦Ç ÅžBæÜñÖÚÆÞ'¾|‘gÇ £¡5÷X­.\+t®7v çJ…B×`úÜñÖÚ'_§Ú¾ðmU¥û¬Ü5¾Ò)V×­VhFÕvãé_®Ç-Þ뼘y£o¸5SºP,íßzîtûÖÇÆ•g+é–Þ¾öìý»žD™†ÔŠËŸÖvQA*H)ŸQ>ÕN”o÷ôŒ¥ôè ׯ‹Åž‘ü¹ww¦ž}ù,¹=182g›—Ýßµ–ZùÚøØTz¿ Äó òo|ëó¥BÈ<ü|yb&ûÆÙ÷ÚëC;ûún¼vtìê|뾺}.3796“í<³ï±Oj®_Ž[Nôuìª ¡aàÆk=ãWç[]k5ëTÛ7¾­ªuŸ¨ZרÒ)VÓ­VhFU›àS¾üž/ÎN\,5ôž:ÜVBÈ÷^»Ü395ß¾µî±S¡RÈli}üR‰jËŸÖvQA*H)ŸQ>Õ¶¾8=6^jì;w¤­.„¦|º|tr¦vÖ‡g]>K“8Q+g«ÝY-¥°±<ß{ä¥r‡Ïž={ª3÷È«{¼mhnÍ.ýZ›ÍeB\yô’É…+#c•ý}ûÿ”fqöÚLÈ·5ÜÿÜ(•oËG3WfŸxjûß‹7½úúÉ+Þ?üú+»w¿úö{·×­Éco¿úÊîÝ»wÿäÍ÷Æo.-_¼}áøáW_Ù½{÷+¯9ym¾Ê¹ñ7w¿~úöÒû´Ww?òË›s!„ùk'¼þ“Ý»wÿäÍwO/=PX¸tø•·/ܸpìÍŸ¼yúöC»ñÊ«o»8[ñ”±uQ¥ûTï_ß)ªu«šÑjšàš‡WÛótÞ¶†ôƒ_2Qxð…¹‰7wï>rm1„Åò­J”ͦ¿²CU–?<öÉ·‹ RA*Hùl´ò©z7{iª’oo^JÄjw½wúx{}xöåB¸ãÅû:²Ë—Ï“—Éq{üõ·>(ÅÓƒ?ýÉñ›‹VÌM¾ùÊÛ“K§a~òí/[¸9ñÞýÓžWŸ¼µh&IŒçüÕÚTÝÖúº°0óÈKgjÇá“§¿ìAׯ/–ÒÍ |Úsk|d*ßÝûÕûÖÅåÙJ”Í<ø$&Êd£x¦\ !õdëTÛ7øÖˆKçG[:{‡;ÃÔxq¤«?sîd[ÝâÍ‘žâTc÷@wCº25Qík>wdG¸5z´p5×90Ü•&G ý…]¿~¿±ôÕ…CÍÍ™ÑëÓó‡ëë*ÓSåÂÔô|¨¯+O_/g›3‹7ßçèÅì}Ãm™ò…ÑÂÑw*§–¾sÏŽÆÚ»»[²aþÊ`Wqº±s`¸1š/®V¢Oϼ%Ué>ñLÕ®ñ5¢z·Z¡}}|ëõßãÇ–Îߺ:v¹œëh¼ ˜Î·8eïo¸Çã=¯.GÙ†=‡úº÷Õ§ª/xì“o¤‚TòÙhåSíPŒK³å(]¹xìíñ«3•t¾åP_ï2·Ø{úåB˜›(ŒÅOÈM]x$\Cé‘õÏž]xë©Îs§ÛêÂBé‘ÓŠªæ&öŒEú†û2•©‰b±«?}îý6Wf"È[³…[Šý…Ëñž¡Î‡o®°p}ôðw¸y™*‹ã8¤Ó_¶…(…PyòuàÞ30ÐÑ” agCfîç]c—çÚ:2é]‡úÚ÷îÛYBÈG—Æ{J•B(Ï–£†î½­Mu!äsÙ¶R6Zva*ÓÚ˜þðÒ̾ôÌ•R¶¥±2uevq_4s©”nlËÅSý+}C÷¿7±c(ž~­8>Ý}¼)„âtljc[Cs£×£½§†îL…Ð40pûç]=_<·î3ÿM»Æ ÝjUͨJ|*ÃW²xóøk]+!äœÚ¿t-EmSÇ‘¦B¥ÙrˆCÔÖ{¢;]¾4V(t•Ó玷֖«,xì“o¤‚TòÙhåSMWBìWwcßäÝp¾ûÌÙŽÙ©‰‘bOÿŽs'½9Rý3¿9P[{ÿÿjg>š}­ìò|k{µåuOi»¨ ¤‚”ÏÆ(Ÿ¦*Ñ^¢²o k¯!4壥[ì=µÃ¸J™4_«ì>°â…tÏ®ô؈¾8­¨ª23]®ÌýéeoU‚ DØ AÞü¥÷Þ¼šÞ;p¶·íñ—乫3Ùö–å¿1eréx¶/¥òq¥å¦«Y^0Q!Ä!Ì_;ÞuôrÔ¼w_[{wGûDÏàýwyµMGþ÷tܸzõÊ•K#=£Å–³ÇÛê–]ØÐ–«ŒOÍLOUr ¥\yrz¦nº’?”¯]ñ3ä(ª‹|“Ø}¾a×øJ·ªm8{.!„(I…Pýa—Ý5_Ź[3qvg}míÖúÚ­õ½Ñ«=“S ûÚ¹2!UûЯµù]Ù01W ¡®Úò§µ]T RAÊgc”Oµ·r™L¥›¾¸Å^®éiÆË–ÉbéÚLevúÿùÁƒùà­Ýç[†óhâøôK |fSõ´"þâ¢q™ý'†澌ƣ´»< ¿?öÆ‘_ºrrëÿzìø?½dV¾Îw7äSy¥P¸žëÌ\š¾þÅÙKÓqþñ?¹¾šuà0seféž®‹3—fâLS6µ05v±²wøÌûïÜ·kG6ª,µºùk§ßŸN7µu9vúÜ©ýÑÕñ©ùe†P׸/[º09YʶæjÓ ™ÙÉÉ ¥ì¾†º2ù\Tº2ýÅíf§¯”¢\þñÌRÙ¦l<}iö‹½»2ã¦Ý<ÇîóͺÆ2Ý*U·õ¾ºÚÔ [­ ®qø*”¯võŒ}q³ç8®Ä!zìÒù+ï½yxü‹ufo”BfGºêò§µ]T RAÊgƒ”O5©\k.ž½öà ÜS?Œ«”Iª¡÷ÌÙ%gNȆÌÞ¡3gzRϺôHŒ/Ó»…Ù¥ûÿ•ÎçÓå™rzéÐΔ'‹#—ËþÞÅúûïÿ[ü¯œüÏ>úè£þóä>ù÷ÿ6)_o#^‘·05q=ν‘-]¿²Tf!Ê44î¬K…æ§/ͦ»RváÆÄØ•¨½³½>UÛ|hoº§8rià`®41x1ì9ÑR÷ ÖqhðíW¹88¸£ï`C<=^ü°Ò8°·>Dålº2}éú­LC4{y´pµ7Ì–›ÒaöâèÅJº¯£!*_Ÿ¸ZÎ4gÓQe™…!„LcszäüLfC&¤2­ùpþòlöÆ­!„ÚÆƒ{Ò=…ÁÓQg[¦ta¤8=p¦!£AÝÖ=G Gûëû5FÓÅ‹eÏϳûTí+X¶[=ªÊîØŸÞðålmnÏŒFvtïËGåëãÅëÑžµ6È|kf¦Ð_H÷v4Dåëã…«éý§ZêBªÊòÕ4×¶‹ RA*Hùl¸ò©¦®¥³eäh¡¾·#O®¦÷·¬îÒ¶5•O¨¯°•¨> Q&·ciÁZJd© q¥4;¿°óñg/ÍF³còÂÔXq*ÙBHíÕºÆ ïN–íV¿ç\öaWj‚Osørê;†‡æ ccG?,ÅélãžSÝ7ÈÌ®Îöú­ûNœ ÅÂØ`W©’Î5ï?qæðÎT¡Úò‡Ç>ùvQA*H)ŸW>Uv×À©¾ba¬¿«²û‡Nu6­vèZʧºµ”‰’mÜÓ0>ÚÕ5wælçãGeoßÞþb¡çb:×r¨¯·Ò?¾tÌ…âÈÑ‹•(Ó°w`¸ÛS¿ŽR?ùÝÉÎùxù~YŠ·²ï|þùç«YïOúÓ÷¾÷½M›6™2øX¼yìµ£ñPõÛÀùãÿøòË/¯âŒô÷?>òqø»÷?üůüêçüÜÿîÂË'7ºš ïã?þáøí›Ã{÷îýå/ùþ÷¿_m…ï:ÎX_©(ŠRÑC?MÉ*ò jL¼€R;ýö·¦’Äy‚<ÖÙbÇ‹ñC?MÉ*øj-ëìïî7„ððO¾–+òX/©üó϶.û/[ö/ï×®Èy¬›—þéØ¿}tÌ<|®È€ä@ò y‚<HA$€ €µÚ´iÓ½{÷ÖaCqGQôbN² €µJ§ÓþóŸ×aCwïÞݼyó‹9É‚<ÖjË–-wîÜ™››‹ãøm"Žã¹¹¹;wîlÙ²åÅœäÇkTSS³}ûö;wîܽ{÷eyQmÞ¼yûöí55/h¢%Èà)¨©©Ù¶m›yxv|µ@ È€ä@ò y‚<HA$€ @ È€ä@ò y‚<HA$€ @ È€ä@ò y‚<HA$€ @ È€ä@ò y‚<HA$€ @ È€ä@ò y‚<HA$€ @ È€x‚ ï;ßùŽù€gä»ß])¬[mEÑ_ÿúW³ ÏÂââbMMÍ +¬6ÈËd2ýë_?ýôÓ¿ýío¦ž–¿ýíoŸ~úé_ÿú×L&³ÂjßùüóÏWùˆŸ}öY¹\þì³Ïdyð´|÷»ß­©©Éd2+_‘÷Að¼ø«µ‚<HA$€ @ È€ä@ò y‚<HA$€ @ È€ä@ò y‚<HA$€ @ È€ä@ò y‚<HA$€ @ È€ä@ò y‚<HA$€ @ È€ä@ò y‚<HA$€ @ È€ä@ò y‚<HA$€ @ È€ä@ò y‚<HA$€ @ È€ä@ò y‚<HA$€ @ È€ä@ò y‚<HA$€ @ È€ä@ò y‚<HA$€ @ È€ä@ò y‚<HA$€ @ È€ä@ò y‚<HA$€ @ È€ä@ò y‚<HA$€ @ È€ä@ò þ?1N”´Ì¡IEND®B`‚glewlwyd-1.3.1/screenshots/profile_upate.png000066400000000000000000001527711322667720100213010ustar00rootroot00000000000000‰PNG  IHDR•4üÈ¡n pHYs  šœtIMEá8(ÍõŒtEXtCommentCreated with GIMPW IDATxÚìÝopS÷ÿû·þXÂÂŒ] +±cÇŽ]|cÖ¬{a å)èí–´s“ö7ÓüæÞ¤6ÝM$y°Íƒ_Ó{gÓ;óKgîo“™nØÉ&4žKãLX<ñoÈ’…àââ "‘caŒŒdI¾üO6²-ÿ‘ÁäóšñØ’ŽÎùžï9:¾}¿_Ë/¾8‚ˆˆˆˆˆˆˆˆˆˆˆˆÈ,Œª™‹B%™“B%™“B%™“B%™“B%™“B%™“B%™“B%™“YU """÷ª‘‘U‚ˆˆˆÈ, ƒ*ADDD–B%¹«‰ˆˆˆäç^J“ˆˆˆ,5…J"""²ì$‰ˆˆˆ,ï=—&Y •DDDdY(H¹7îÅ0‰ˆˆÈB)T‘¼ZL˜¤ JDDDdv ˆÆï±.‰ˆˆÈ|)T‘¼™o(”ïåEDDDVš¹‚Ÿé÷Có ŠFFF,‰ˆˆÈ¼(T‘¼È5ð™m9…F"""¢{ªÙ‡BóæNÁ’ˆˆˆÌ‡B%Yr¹„AÙ–Éõ¹Ån[DDDä^4ßpÇ`0ÌÚS)×aî,‰ˆˆH®*‰ˆˆÈ’š+Ô™þú|Ïg[""""+ý>j>aÏôiü½¹„K –DDD$ •DDDdÉÌ'Pš) ¦ f+F}Ed6## '9ú‘}[Ëó,iø;ÉÃýÌs)e{M=•DDDDò?6ýž+Û—~DäÞñþ™+£’É ”Dd.s£™÷Ï\Éûæ*‰ˆˆÈ²È2©CDDDD÷^"2U,>ŒÁhREˆÈ¼Lfn'’yߎB%É«l½”2ÿVƈˆˆH~îÁ²Ý{e»G‘{î¬J"2òL1 PIDDD–áÿD#3'""""ù½›éK>""""ó¥PIDDDò&[ƒÅôçÔ¨!"""’ÿû°\îËDDDDæ¢PIDDD–M¶¡ïÔ˜!"""’Ÿû®lCà‰ˆˆˆ,†B%YjÄÑ=™ˆˆˆ¬l •DDDdÉd›üy¶qüÕSIDDD$÷e¹Þe»—ÉF¡’ˆˆˆÜj´Ñ=—ˆˆˆ¬, •DDDä¾}ïi³ü´òÄ“ÏóÆé%Þb÷^:@kc#Ûž?M?¯=ÑHãÓï{ý­4>ù.:<""""""óc²Rûè&¾ÿ×ñÓ<Õ´‰›¬X–lFÜn•…†Ñ‡kØßòÕÖ»±³ÓÊr¯)(bËl¶.e=ÝKõ/óaVˆˆˆÈrYŽoÊ:›ö³Û;~'ìïædW¿}æ4ç~ý^m-^’íÄO¿ÊËm—±·<ÅsO–ae»Ý‚Ū;`™E:ÆÀµaÖ–®¥`òIâׯq˶õÖü}ÿW½–DdŰÚÙ³¥O"ÊßuúŠÖ¯¥¡ÒÃw-W8|)AjÑ1±©l=®äMz‡F §7pƒpònìð´²ÜÓÿŽ-U=ÝKõ/ó¡PIDDDî+ÞƒÏóü¶©ÁNôÜ«<ùãCt¼zësx—`;Q ÊøéóÏqÀ PÌÓoäi™IzˆÐg=\‰Ž`‰=Lõƒ£ÁRü«Kœ¿!eŠ’®© XßQ‘¯5#ÞG6à¹=ÀáÓÂé±§¿äjÌÃÁG6à½ü¾Ôo6§ûR\Õ·êIõ¿b(T‘%7ŸoÁ.Ç7fíuOñÓÊC¼Ü{š à]‚ÎJ ―%{ADDDîw©!nÆFï}áÏè1>L…}€ÞK‘ÑoܧbDo')¶.¾¹f¾÷cƒAÇGDî 66;Áææd 4&ÚßÏF+CF 5ºlSí*×`Nøb€ŽK1b¦Õìk^ïÜ œ®£|m©[Qº> Ñ;dfsSõ…@íC<Õà÷-ìÛ¶Žž¿BOr¶÷Ž€u ßÿ«µœ; gx´l6·‡l¼Á¿||slûVjkJ¨_oÅfJÒß÷îÜ'(¸³,=qR³í[–Õkh®Y×nÆLŠÈµëœ8!”ÓšR>š¢ós›´SZ˜fàÚu:Îß œÃëS‹kgÿx=ÅëjšjŠ©\W€)~Ÿ¯ŸÎ/‡IÍZ¦‚Ùë?¾˜c«^¹ù¦9•DDDäkÀŠÝe0ãóm{î$Þâ¹'i<ðÁñÿ¨œ{‹ž/©±õ ž|îUÞ Žc*ʉ§ùÎ+—^^ùv#Ï$ŽŸ7¦Ì©”]<ø¯>÷$Olk¤±q?ýoÖ¬K"""_ ëyè‘X3–ß$®}ÆùK×éÇ̺‡ªyp­¾ÿ+"_o¦ÂÕ8ÆMßùb*ïj”à0`´Ò¼ÅMµqÎO®Ðv!†Åãf¥ÓÄʬ4T­&òyíê£;­¬ÆÂ0g?ºÌ™¡4ýÝŸófOüÎáôf|o.ÌT×o¤Á£ó?¯ðΙëD%ì«+ÂvDzYʒ˾e2Ziz¬÷íëÿ$@ۧ׉8ŠÙý ebyS¡ƒå&|Ÿ}AÛ§†Öl`ß7'Ë3×ëÌ°ÝæFåéÇÿã ú|OÍ&ZÖç(Óõ¿¨c+ù¦PIDDDîq?'.¸qÙ'ŸN„Ûyù™ßpšJš¼X€÷žç‰ÿ†v¿mŸâ`«—x×!~ùóÚ…8`§á¯óâ^'àbÿ?ü#¯?[G.£ÔÄϽƿóK³Pwà)ž:ØŠËßÎožù/œP°$""òu`,,¡¢Æƒ}JÇ o5åë TA""f#VÒ Í1¼Å±žJóŸ†ñEC¼á66×:J3Z½#Ÿ‡8ûÕ0Ñ¡[œýü6¬²Ž%™ÕÌ=[f|ïL«×Ñ`âø§aü7„¾ºAÇŸop:pe»ÔO+K®û–¹‚«Ÿ÷Ó~þþHœàÀ Î|•ÂR˜A¥ðý¹Ÿî8ÁíçnX·ž‡¬¹¾žå¬/¦Ò8HG÷ 7ƒ×8~å6æUƹË4Ký/úØJ~?¢ª¹ŸEƒçhõç´ ‚¥åu¡½m„ŸýgþíéªÑP(~Ž—^é`°h7ÿøî¯Ø6¶ì³O¿Å¿÷Þ|¥ƒoõPz_p„‡ZÇ*ÜkmlZg‚k™ %¸üÇ'5x‹pÊŽ§Ð@Ozö×»oe+¥»£óí›Cä¥ ^ì›dî2-pÿ}le1*‰ˆˆÈ}åôÏþšÆl/Tä×/µ’™)aiáùƒU½Œâþw鄲¿{v"P°zŸàÙ–ßò³ŽÃœŽ>Áãö,x‚×ÁõÔ*‰#¯’ƒ]´ýö4§ÃPåÖ1¹Ÿ¥c}|ö—/šòìÑÀy.j¨()T°$"_k©[1¢¬Æk7ÒûÕ´TÉ´šMßÀÔ}‰ŽœV6B*½À9væù^“Ñ0ÙØnâ78öÉu"é©×ûx<•V`£¥ÑMyú½}ƒôôFèy`#;fmý™,kzŽ×gbÒ#ÙÜ•)ÇG–ŽB%¹¯8›ö³Û›ÑÝÇ⢲®¦Ö*Ч/ìjÀ•±h"|™0E4T9§-hÇ»ÍazÃ,(TЇ» ƒoþ¿y3kÉñG〺*‰ˆˆÜ·†¸Øóã_ø^½±†‡ŠøìBˆÛŒpóÊ_øÜZG¹æU‘¯õµ2ÆÙë°óáu”|&”xØK¸‰óá4±d‚äª"J nëÑb[[„=•à«aÀçrš ˜&#Žu“×îø`œ¸ÕJa2I`¬l¦5Nv—%éúó éÙWœcߦ±¬[O•ù&ïüÏÐX}p› Óæ_²Pf7àŒ1¦¢"œ¦ç†F `Ž×³a(’„ÒÕ Žo÷ÑhIÉ;á\Ê´Àý7ècr7é.EDDDî+ÞƒÏóü¶ƒ«uê$ž‰<llÝeÏþšê²¥R\^J"""÷µ‚µlXoæf8Iá7áa— 3PõpŠžÏÂ$,ë)Y­¦ùºKá;ê¿*å»[ 8sy¾Û°¶x-õ›V½r…Þ8¤†#ø’i©u’òE‰­ZCSÕ*¢+ô§!—ô"Žëªl¦8±ù1™$š²P÷¯ü·aÝzšF¸=¶7¯sæV­•Àg74±ùáu8¯ˆ¦s(KdŽ}›^c‰aâ«(_oaèÆŽR'-L˜o`3훉ªGK ÷\'d\E}ÕZ,׿ä³!ÆB¥¹^¿S,æ"Ùñèm:.‘²­£¥ÔHÿ'Ã$˜½LÑôÌõŸˆ,þØJþèNEDDDdŒÅU†“Ó\¸††Ìqè¢øOö•T-lÝVW%NÚIॡÁ;åµè…œôÛ)S¦$""rŸ+`݃Rå¦pm¢Q¦`íƒTW­åöªõØÕR#"ñ(m'“l~¤˜šòoP_ñ¡Ûøÿ +˜ ¢ã?úHÔÓÒ¸ëð0Á@£—Æ^ŸS’¾þÛÔWxØ·ê o>ò¥btöÜdWU){])"×¾¢ã‚‘]eã sö“/ fMõk°¦’ô÷}IÛÅø e›V–Þùí[*2@ÇUÍß|€ºÔ0ý}aÚ?MÓúh »ÜC½ ¤nñáçiª«=l³¦ˆ\»FÛùAbŒe4³¼>s= Ññ_Ò\SÌ®Æ ˜‡ã\üËtFÒ¤˜½LG®ÎRÿ‹>¶’OºUcõ>NSÑÚ~÷;N>ñÒļJqÿ»ü¶#•OPW¼À•»[iuý–7÷*ïî~'Æ3«èI^yæç´;ÿŽ?>Þ ƒ ""rß+À¾îί|Ø×ÏôEp‘¯§á!Ξ pv¶eâ·èúÏ[te{-u‹£·¦<•¸Êÿ4BèÒUÞ¼4ñ*G:Æ'¿ë½ …8 e,qƒ7CÓÊöÊìåg¦²Ì±owî,þÞ«ø{3ŸäíŽÑ™Öén|âH0”}³½><È‘ŽÁñ=Ϩ'H Òqz0ËW³— ˜¥þ{l%Ÿ*‰ˆˆˆŒ³6ðì/š8ñË6~ö„ŸÝO4àŠöÒÞÖE•<õâ^Ü ^¹—§_ÚOû3Gxù{hß½Jg”î¶6Nº8øÚ‹X·ˆˆˆˆˆˆˆHþ)TÉPüøk¼[ü/½v˜“‡ÞdÐ⤲é ÏþâYw/n|:{à üáŸëxå7oÐÕ~ˆ®D®Ú½üâ×Ïs ë<ÒFO4óÚeH³ ŠˆˆˆˆˆˆˆˆÈ ³BC¥8“m´w‡™_»lÿ©6ü¾ZöîÝÆ"G°™ûªÓÓ95P²ØqØí¬µ¨nDDDDDDDDDdeY¡Rœþ“G9Ö™ò¬ÉúaÊ]Nìv…¤ˆF"D¢a®ötÓŠM.î¦íHнû·+X‘<ŠôM^«l•{Øßê¹³§d¡ “)X±)l‘{Ô •’DΣ-3P29©ni¡©¢øŽ±Úìã¡¢ªž¦ œ:ÞAÏø[£=´wz9¸Óƒr%ɑĸß6Êj]Y†Þ4ãn=ÈiUm‰ˆˆˆˆˆˆˆˆÈ½Í¸’ ›ŒtÓÞšòÎâ¡åÀ>¶g ”¦³W±}ÿ~¶8'ŸKø:93ÔY "ËÀ„ÅlV5ˆˆˆˆˆˆˆÈì Q=ˆÈüŒŒ`0æ?òYA¡R _ç)&û(9ؼwUŽy4Òš‹©ßÝLÉÄQzΆP¬$"""""""""÷›µ€‘”Z,Ed~FRI -ùÿRûŠùÚ|ràŸ'Û7ï ¡xÅ·W²¥òm½£cR%½„“nJ— &’±ú‚a¢CC$°Pdwàp:)¶k€½e ô"‰Â"N‡âûâ$‰EÂD"Q"ÑARä°ãp8qØ­óþ0çå|G‚„XJ*©qÛ–fÏ£ý\íL2Y(r”àvc3络Ib}ÃQ††¢¤Lv í8Ý.Šm÷öåS×#‘•iWýýÈI0˜Ì£=—DDf22ÂH*ÉH:É®úò¼on…„JI"=Ÿxìæ[uÅ ,¼™’ú&6›B$LNH-®&â8Õù1=¡XÖ×-%•4li ÚmŸ¶™8c¿çX`l@?÷nžÚëÍ>ÇSä ‡Þ>5YŽ&~¿{Ö]¤íÍãŒgpîÝO±×;[Cò2–ÃÙËÛ‡ºÆzœ9i>x€ûG¿ÿCþåh±±c¿ãG{©˜žÄ‚œéìà”?šuvo;Zêp®È«BŒà¹.ºNù§fXÄîass3 ûœ§òÂÏ×ÉÏãÀÉáHw °P¾ïGì,5õŸàؽDÆÊh©tQé¶åþÑŠ]àðï;8[øÑ*l±ïàl0[Ym¸k›iÞâ%{‡ÅÅ”3ÎÀ…StvõJ0C=UÓÔ¼…ª,‰eüâ;¼y<4íÙ(gßþg0áÝû»Ýf Iðƒ7ióÈÙü#ÔØîÂõHDDDDDDDî®u6öm-çý3WJÄI§U)"2#ƒÑH¡ÅÌ®úr\ëlyßÞÊþ.9ˆïêd©ÉûÞEÔÙQÅÖíÛÙ¾};Û·ÕPºà/î'‰\8Æ¡#36à$B½tµ¢í£~âS^±â|8#æð™¡gklÀÏ”¸$â£?>C©Â—éŸxääá’¹vpËa÷Rí.LO :g‡{|Œ×®ÉS‹gÚ±OœáCm3JQGµãZaW„äçÚÑÖ5K  pöØÛüé|d–á{¾Î •"æÿ€£í“AÍRH œ£íб%€ÁîvÞþ× Ä—°œÉŽâHÇÌÒh=õÐqäÇf­óe=Yòs|EDDDDDDä®Q%¹×®+ã‹ê‰~®fä·œ÷DÁcóNG€Évg N‡’õ%8¬B}!ðÄ롳G9šÚÇþm¥å·•Vâ$4Ú;#Â?¥Žé[J¹žö\˜Ká$nóËúû˜h3wT’ËdËW;Þj]]£}•Â=b55ÌXÄdˆnÿx šðÔº¦ö Š]äý£§e†¶¼e.J6ˆ†ð_òŠ ?í¦t9HÒßõ'º‚;g)¡¼Ü…ÓiÇ”ˆ ]¦×«çÁÎèõdïýµçk6©h/Ç;'ƒ?0a±Ù(v,b˜µÄe:ÿäg|×-N/å›J=¤W¹ì N†›Ñ޵9øþ¾:f›b-·rÆñw¼CG #M29ð”—±©ÄŽ)%tõ2¾Àx't¾ÃqÛAvgô4W³¹¶„Tjˆ¾Þñ@Є³¼W!€»ùž»‰ˆˆˆˆˆˆÈÝ×w=ÆÑ|LÌVŒþNDf32ÂÐp’£ùØ·5ÿ½•VD[b2Ú—Ñ;ÆŽ÷^˜ 'v‘ŽÿD­ÉYÍÎÝMx3Šë!¹HgûqzG3"ÝïÓUþ¶OâdwSn‡p ÊÕ`”­Ži‰@2‚?4½kEŠ?BÒ=}À!B½ºìeì¹ìÏ2–Ãî­ÆÑ56^¸‡@¬†ªÎód¨‡‰ö}‹—ZWæ±q±£ƒÀD‘L”lÞÃî­î)!Uý¶f‚ãØÙ©Tjå\ âWù¸g²må»Ù¿Ó;-€ÛJÓÀG9rvlHÁ0g}jêù9_ï ÐÙE*8ÊijÚBµg †U‹ú Œ}Þ+w쥹"sõlkàÜñ6ºÆOŽp'z½|wƱs+g<ÐÉ _F,ãif)srÕÔm¥yà<ï·uŽ› ü': ܉gl9³£Š­Û"|tÕ7ö¹²±©a[÷ðõHDDDDDDDîº÷Ï\ ”LúÿºˆäÀ`À`.€äèõãÿ›Gòº¹1ü]j(’ñíûBŠ ïv‰’ œûx2̰ײwßö© ¸cÌŽ Z÷ï£v¢­;FÏÇþŒÞEl*›Œ —ÂwI5b"Ÿ±L.»âŽÑÜâa.EÆØØT^”ã>-c9¦ טi¨®8}Ý“ åo-%™Uéå“ÉD [õöL ”FYqoÝÞJÛŠº$#~Ƙ¼´4{³öè27ÐRi™xõG¦»¥<_³|>SãëÜIg)çé1ánÙKkE–uZ‹©Ûõ]¶dŒÚúäÉÅ”3Šï”oòZãØÂÞ]S¥É:¯a×w·0q'|œòÇîƒë‘ˆˆˆˆˆˆˆÜm±ø0£I!"ób0™¹ÈÿD+"îNÅ3{—X±æpMž›C‘œÖo«Þ϶ç^É0Ý=ã}§,”770ëýÍ¥44{é9æ2+øBñ FGË2ã(waékÌðNzÉM.¾Äøž8Ãvªs´9r‰p¼»5³h¾É Ââ¢ÜaÎùTX¾rd¯ªêÎÀ$¢{¢¥ÜFyíÔa#z&ʃ¥œ–-nfîÃfŽ¥¯=£gÓ½~âMh-¤Ð4ó±sÖ·ÒR#˜lLy;_³±PÙ²÷Rw t4Ð\5K?;³ƒÚ–Zºt†"±^ºÃ[hqçæ(gÔOw8cÙæZŠÍ³m¾–æÊ3´õŽÆPá³>¢Uu¹õ \Jy?¾"""""""²¬FF@CÞ‰È| ¤Óé¼ofEôT"3¸BúA?}ÝgöEg9v^ªjj¨©©¡Êë˜.ñùzg9Ë©.Yú|ÚQ[Î\#Å™‹k¨ì.D¨ohÁåŒ÷_ž )måÔιOfJªË™è#¹L8¾ò¯G""""""""""3Y¡’É’¤âÄïrO“Ø@ÆOöMäÔÈlÇ•1äÔÁŒ°–ðPéäkW§4ŒÒ7ÞfMœ IDATbl)Áã°SZ>¾¢!ÿ`fÉf-¥—0¯ÎËYŽ)Cà…è NO•âºLŽèU3µ×H2Âä&L8½ÎzšYq–9V̇Óì¨dÓDb‘"ÐqˆCÇNr>0@,yÏ×éŠ=8–¾""""""""""ãVDO%³Ý•1OIŒ¾p.-·fÌæ™~¬°àFÔ$Éèâ`S©©ë°¹+'‡úê¿Dx¬ÃC2r‰ñ|ÆQ^Š0;Ê)o\šr+ñOÎcä¨Äc›¹–³S‡Àû ™•bnB㜵x§OT“JfôH±`±ä¸ƒ&ËÊHRÇX=Ûùßîf³{ú¦ˆ…øº»8Þvˆÿñÿ¾Í±/0_žóuÊ'­0C šsš; Àbˈ‰ÃÙË™"‘ÑÒdËqãf+¶ŒÞd‰Är‡3ù?¾""""""""""ãVFûza %ˆŒµ‡/…ˆWyYø¼òIb7b /Of{³¥¯Û6ï¬uLk´.t±É‘ á$qCÄëyaÃ5>˜ÕÉC„T?¾HO©™AßDƒº½Ìƒ}Au½Œå°{©vt1ÚY)È_‚q**¬@ ÷D¤DI­÷Îu˜ÌÇ?EÎmâ©+mö³ÝËÖ½OÓíÇïëå3ßeáiço*B §ƒ€ï3¶ìÙE}©5¿çkÞ%G©9—CšqDM¦÷š2™3×™ó 5mη»0g׊<¾"""""""""²­ŒPÉì¤Òm¢×?Öz8ƒ?æ¥Ê¶Àõ%#øB©W™ÕfFõM¥[ر۽øŠ4;(ßd¡»7ÁÄ|FÅê LN¼“¥ØFç3 G¡¾A(µÐ?1É…MÞ¢PŽ©CàÿÒG¼Â‹5ê§gbø<7µÙº:™,X&ÆDŒ‰%ÉeœTbhɆ¾3MŽÉ¸°ž©xFaž30ÛK©¨/¥¢~;$c ôé \ÂwÉOhÏlÇ5Ñ})A_x(‡}K „—蜴P˜Q±plÞçc<ú±Œõ9¬ó8ffÅž ê¶íæ»?zŠýMžÉ0%á㓾xžÏ×|‹r5Ï¥‰\dì«ËÏ{»s²?\"”c=%„3æörÚ–?ÎY™ÇWDDDDDDDdŒVþªz-Å@•šêbJŒ XÀXÈî– ~ºc#åY¾l)vñ“üô±±¢Çv1Y©¬ÜÈ÷ÿú!~º£‚Ÿl/c_õZÜ˱¿å6[—p»ùXçô][SÂSÛ¿Û¨Æ]ù8®”‚šKëÙì˜|={œÓ ˆ•’œéô-ªáÕê,› B—æÒö p²ýÇŽãXû²Ý쬤4c½¡Ÿþ±‡öMn2³•)ó…/ ù&–5¹+q.¢m{YËa÷R=9‰=~|=ã! O­k†Î*…””LÆ‘n?Ñ9÷lßåØv<ÎÉV}>"ó:ã„z‚“=•,%Œ*8þzÿ¹“|øá‡|øáIÎÍz’Y)®k¡É™ñùèÊûùš_)‚=!æ,j¼îàäCG™cÁ½t ]ÎÉ@*Ü3eޝ™«©w"ÅâÄU¸üׯ•y|EDDDDDDDÇæp°§i,0ir±Ù1ßV¡Bª×Ý‘LQê*\ù£À±{›‡ÖR^¾Fû™ Ç}·H86°wK)Þ?²p+èóa§²¹š³m=c½;"œýSÎ};©Èyò þŽ6ÎF[•ö.NE‚||fïÖâY*3ÉÀ™Nºýc±‡cÍÙ¶–ðp C@*Hw·y,ü2Qâ™6ŒÜ”ùŒ2—çÃN/k92‡ÀKø¸“þ‰Ñó¼Ôº¬3žºÎJ–Þ±€0ršSJvzfÞbÜŠîèRVJ*ÝàŒ>Œvóï¾:öVåv2&ûOÓéŸì~kñVßÀ ]î¦g,01 y¨v{f9ÇLجSŠ—ÿó5ÏRþ.z"곕³‹ÀD5–Pí^ø™ovTâ6ù=,!>>7G=%8÷ÉäÜ_&w%Ž»qE]¡ÇW$›`0¨J‘;¥ãü{ÏMÕk(&Î…Ë)«/¦xìesáj¶Ö›9wñ&ekƆ¿ ”žy•Ñh çÆB,·&; ­<ì!2”Ʊb+ËDyM Þd„¶S'ÚÎbøûcìØæ¦ùÁÞ8PbE5%ZÝM쪽ÊÑñd æãøÛQÂ;wÒàµÏ¾3± gŽ·s*¸ƒC9¨|¬„S£ Êѳ¢£t?;½Ù'yŠ»x?#Í(Ù\NöèÁ†»Ü¡ ˜ˆg(»£ËÏÔùŒ2—­tÛ¹Ë[»·GW€hxâ"nñÖR2ËA5—l¦Òæ£;À×þ>®ߦ&KË~2rž÷?ð/é…Òºé[ÔÚcÛ‡`ÇQÚS»h©)5L‹?¢ýXwFÏ*' ¥ÓÎ_+ŽMvŽ.•òŸÅõ0Sf•Œôr&8ù‡ÃY¸ çk¾E8Õ~’’}ÛÈ–Åüüéìd9Mžz¼‹9õ­.6WÚð÷ÄÆêé8§¼ûØVšíhÆ v½ÏäæmT>æÂzWêi¥_‘;¹ÝnU‚ˆˆˆˆˆˆLcÄó¨‡Ûm|Ÿ‡èI§4¯§êŽå¬xsÚw‹Ñ‚ëAKCþs,˨Ui"ý·p”Ù)5ÝšøÒ²©h îtŒsƒ6¶f4ÖYV¯¡¹f=^»3)"×®sâ|„P 0­f_óz|çnà|påk HÝŠÒõiˆÞ¡‘¹ß˜ ‹h®)¦|­‘Ä(]#Må)Ž}4@8 ˜¬ÔÖ”P¿ÞŠÍ”¤¿ï+:/Ü}mº‚Õlv‚ÿÌWÒ˜TŒÎO‚”šf¶fÆí˜Ù¼ÕK͵˺4 F MMP—¾ÎÛ]a"pV”qÀyCŸŒo4×÷Dh¿¹Ž«®ñ/ÿ98>s8Õßz†ëW8t1i¢þŒ$¢·80ècqW?‘+Š™Ò-{hödÌš’ q¶ýo¾}ŒÏ]$8%OIâ±( |tâÞø}Ûd äÜÌÞÝå œ{e”­¼•-qu _û!ÞùðÁhÆ2ÁÿÑ1Ž´õLöZšÊgnù¶{ÊîlàuxÉÖ®9ŸÑä²åÙç š§e-Ç”!ð&j˜òZçìA¡¹˜†–Œã˜ Òùö¿ÒþÑEú£q’É$ñèþ3päíየiéÆB5Ó°£:£žbø;òæïÛøðÜüÁ~"ÑñX„`€‹çÏp¢í÷ü¾íìÄ?%M;©ÎÒªïð>”±î oæÄù ‘xÆ9–Œ<ÿ!m‡»˜è3cñ²¹Äº,çkÞEºi;ÔÆÉ A¢ñ$ÉdœØ@€s's¨Ý—1'U MÍÞE†:fJ·4ã8¡"t=Bû™™Ó;Å#~ÎûWÚz&ƒKy [Šï^F¿b¯ˆˆˆˆˆˆˆÈ\Œ<¼¾›ÝN]e ÛY‡k¦†]K!›)a{¥ƒ »ûz;ŽZÀSƒQéBªíã…çÆBø*ÊW™aÑJÓc%¸o_çø'Ú>½NÄQÌî-“íŒ&+ U«‰|ä_»úèÅNë#«GÛ-çz¿±æÆoàI\çýÿø‚Ž~MÕöŒ)HÌT×o¤Á£ó?¯ðΙëD%ì«+"[«ŽÉ¾ zod秊¸#p3•åË÷³m'ÅÕp»sÕè6M«pYÂBJ L”8ÍDÃCíu¹¾'Fð‹©5k)¯Ð‚ÕTÛ‡ñõ “*XÍÎÆ<‰Ç?ù‚Ž>õ5EX5ŸÒ]³ò=2;¨ÙsËG9îË8E#zºôÌñv‹»‰½ß®£8u¾É†ø”£~O }‡;휓"ÔÓA[O£ÁE–¦©„¦][(­Ö‹¼l²¥'c>K‰‹Â¬E(§ÔÔ›1üØ6mbI¦uYÖrd7þÔCTç0–˜ÕÓÌžÚ0G»ÇßÅö8þ³Ù–6áiÞIÑ'íSök1¬îíìÝ‘àèñŒ€#¤§+8ç¹à¬ÝËžºærÔÓRùm½ckN…éíl£·“™Ï1l”ïl¾³gO¾Î×¼qR]ž Ç…DîŽ Ý3-k£|Çnj–¢»ÕKËîj"m=£=çˆâ?u ÿ)Àd”ÊROŽZv7{îR/¥•z|EDDDDDDDreÂ6e +®t„,ÃߊHR—ùTyæ6›t‚Þk#ìÙ¸ Sdˆ”±€Êõ‚Žß8eA®~ÞOO_tì‹â ’_­coáÔ¯®G>qö«0ÌÙÏoSWnÅÆ ‰9Þo+vRÎMþôçÓÀÍëlìY3¶÷«×Ñ`âøÉðXûk‚Ž?[p7:p âžV[fæT’ÄHÆsë7ò_ê3ZkSQÚ>ì'sú¹¶ã"¾±§)JܾûÐ As!ÞÕz£VÊW¥††IMt!’ã{ƒ7 ¤]T¯5âÿ*mÃZЇ9~kû&'žôMÞ9Î0Ò϶U|×¥OÆÝ²B›íTìü¥å§éè{ïwù‰ÍrΔ·ì¡¥<É©O–øl¬ØÉ›èìè¤7œã{v››[Ø:kw.+îæ}ì ã½Ó'ƒÊrŽYJ¨Ý¹›m3Í+•ó5olx›÷à-l§½;4ó°…û¼t½m¬îíìÛgçøû§džPY%›§‰];ê²öà[þËâJ:¾""""""""9J'轖ĽÁ ©Ûœ M¦¹Ñ}êòµx $‡nÑí‹]eå#¯g-¥&ˆ]»IdÆy•Ò„¿Œ‘ª³ã4.\ƒÇ8DgtÚÒÃø‚#”8ìÔ:Vá^kcÓ:\Ë\(I(ã}É4$sz¿"gæØuÒåº6 c¡’Õ¾ [•=-ÓÊ?ŒÓÌ¡R*9&3…#Ä¥nôsø#ãØúœìzøÎÚ˜s;ÑABlà¡ÕFbë-$Â×è)´±¥¸Kz5nsöÖÈ”±ÑR¹¾'}›¿DFصq–¯â”m, Ú“ÜëÌ$ofÇÂq’ •îóJ.ºÝ»•½Þz"ç{{¹Ú!KL4 š,v¥›(¸’Jo)¶){k§¼e7…Q°:¦ÏÇd¦tûøIÓøÃYªÉîeû§¨ó÷p¾×Çå`˜h"X°98N\US]QœcO3%››Ù\Ý“ƒò’™Þió¥‰Í()ÀdsRå4Ϻîœ÷+¯åÈ”9,ƒÚòùL…g¥´n7?(ïÇßÛÃgþ‘Áñ¤«ÝA‰ëaªëÊqÛGË´í?aËØ>.ÕÀ\\Eë*¶ \Ä×{™«}!ú#Q“'#6»ƒ—‹2o å{nÛ6Û©h=ˆ»ú"½=—¸‰Œ¥ÀdÁnw`w8ØPVIM¹û\+]’óÕŒ½ü[4ÙG‡“´”Øós!1Ùðlû.?ªôÓÛÓƒ¯/Â`,NÒlÅî(ÁõP%u•žYöyáå´–Ö³ç•}çèùì2}Qb‰`Âb³S¼©Œ‡«ë¨*+̲੭%Lv<…ÙËé¨l¢©dôd)t[þ¹]ò둈ˆˆˆˆˆˆÈÝ–¤÷œŸ^À´ÚÉ­Å8ÆžößäÌ#˜ì«¨¬ýÆØpp Î|äãè­‘9לŒ4–R]dälñj,7¯ÑŸ‚)-“6ZÝ”§oÑÛ7HOo„ž6²#³‰&5B*=ÃöryÿlŒ@üÇ>¹>- !ϲO·‰à¤r­ßø8~©$á[£Úì&¬¤°ÛøbFêVBëŒD|·é[5LáÆU'VaüŠpŠ©î¤r|# |1Ú).4SmKq¾{ÐÜI÷¢ûàkêVž¶yjæýN[©—ŠÒ™«ÆlνÞ:¶yëØ¶¥¸Š­Å9îƒ§Ž­žùò\÷+¿å˜*êëf¢£“³ï†23ÛJ©¨/¥¢~®Íy;ñmÅÔWLíf»ë-­ ¾´‚ú%úØ/ö|µ–VQWºLŸðb/uÛ½ ªÓE•ÓlÃ]µwÕÖÅ9ÜuÛpÏùù©¡Î³4ŸÛ¥¾‰ˆˆˆˆˆˆˆÜŒx*Öf>fÜ¥Üw´ýX¨­°qæì-s­2}›¿D ìØhch‘°ïöﱬ[O•ù&ïüÏÐèðkp› 9ÏÛ>ûûG¼ž„âÕo‡ç†`€ø`œ¸ÕJa2I`¬W’i“ÝeIºþ|ƒÄô|(>È™h­ZûÔÀØ<ócL…|«|‡ï(çÜÛIÑ×—¤yãª-Izn¥‰Ç‡zx-¸Ì ngE*÷÷$nÜ$d,届U8nßàÒÐhýD¯'1?X„Û¨?g±3·õ‘¸kŸD‘»-á|÷ä8„%µ^ìªg,`SQnÍÙæ569-:ÚCÆäÚ@ýª=×ïìÁ“J /XEùz ö‚<›JÙ±Á„ÙR€-‡mÌõþص0YÃŽG×âYcų©„æŒÂ§n^çÌ­U´>VBåz+î'»ëÖáŒß&šuh¿½ÝýøönÛHó&;Þõ6ÊÝÅìù+îÛqâYÞ—Ëvb×c$VÛ)Nß&4 ©¡[„±R±:…ÿz2ëþçüžÔmz"Ü übñÉ@¢ý× ×°§Îw¬~vº4¥Ã]ý(ª änK†ÎÐ31e›Ú%œGDDDDDDDDDî&¹Žç_`ÉyèÿÄ›„R&¼A_–‰½S‘:®¦)ÿæÜææ1Û íŸÞ$RTÂ.wÁœëŸóý©Ÿ„®ZÏžÆ4;oÓå‹“L'I¥†9ûÉ|t{MõöVÛ±\û’¶‹ñ™ç!Giÿ÷€»l»ëKÙ²±€¨ï*‡Ï|E8kþ3÷vRC·ƒ·Fƒ¦tß 0<„?>Ãþçüž4Á/â@‚ó×2 8娄XìhôÐâ‚3çf™+KòÍðâ‹/ލdyʼnDX M¤Â~ºŽwâëçh)ßÃÁÍ÷òu»ÀáßwŒ ƒèaÏOöàÑ—Dîi###w<.NOb$ãÿì :¿L}mŽ«i•ƒ–o‘êÑJéD¿Ç)T’»p•p°©ÄF$#…‡»œÚo5PSªn½"""""""""òõ m`àk»ÿ©[×8tüšN„B¡’,?k)[¿û#¶ª&$“­Š?­R=ˆˆˆˆˆˆˆˆˆˆÜ£Œª™‹B%™“†¿Y&‰D‚@ @,#‘H¨BDd‚ÅbÁf³áñx°X,ª¹')TY‰D‚óçϳaÃÖ¯_ÉdR¥ˆÈ„T*E4åüùóÔÔÔ(Xù:3`ddô·ˆH®FF0ó?8B%‘e())Ááp`6›1 ÔX$"ÀÈÈ###X­Ö‰ëEyy¹*FäkÊf-`h8‰Á\ Ê‘Üï'RI -ù|*‰ˆˆˆˆˆ,ƒh4ŠËåÂjµª—’ˆde2™X·n~¿_•!ò5¶«þŽ~äƒ$LfõX‘ÙŒ0’J2’N²«>ÿ_JQ¨$"""+_ü4ÏÿÍ3t$\<õ‡wyÎ;Çóó]ýÉgøëŸÆÒô:ÿöZÖû Ê¢ç^ã¹çÞ¤{ÐBÓ?þ¯U¶óä·_¦·h/ÿôÞKÔEßúتÓLd±R©f³Y’ˆÌÈd2aµZ5çšÈלk}[Ëyÿ̆qFÒiUŠˆÌÈ`4Rh1³«¾×:[Þ·gT•‹ˆˆˆ,±ø^}¼‘ÆÆ¼¼ åôoߤ{Šj÷²Û Xí¸Êœ¸¼N4ƒƒHÿfÔÁDdvSD¦\T"r]'ÔSIDDDäk'N4 PDëóÏó„× ´òêáÖÉE¢ª%‘»A¡’ˆô]qô#S³£® "2›‘††“ýÈǾ­ùï­¤¯É‰ˆˆÈ×Fü«<ÞØHãW9ü«§y|[#Û’_ ž¹àÀ ^}æ ¶56Òúä öÇïXWðÄkÄ+mQ¼ µØÃ½´¿òC~öÞX’?Ç«?ü9‡N÷‘(*Ãnç7¿éžú~ÿ[üüçoÒu9«²–J× —»Þäg?—\´>ÿ, €"Zþî%z­0ð?ÿÞ/9r:г¡…&W”î¶Wøá3‡ .´¬ãÂí¼ðòºû!ñ¯=ýC^ië¦Jjk„{;øíÏ¾Ç '£€‹Ö_ü‚ÝN µOýÏÕå0àÝBË>Â/s’¨Å ÒÛö2/µs¨Ç }‡xå°‹ánŽüü;|ïå„íEcëü%/Ÿˆ.¼Œ"""""÷X|ƒQs0ŠÈüLfn'’yߎB%ù*ãÙ·Þâõ×ÞàÿØBpú·møè‰ßŽö2*{–?¼w˜ÃüW9õÝѰ{m-¿x‹?¼õo½þ,eþÓôÅ­x›š¨´8©km¥Êþ¶ßÑ•×S¯ñú¯_âW¯¿ÆA'Ðý‡ý +k¦†_üú·?òTôŸ8tpîçŸÞ{‹7Þx—?þ¢¤ý·í `Å»­…¦±PÉÛÚJƒÛ:g-¼ü•üÝOðî»'ùóeôžè#>g=f¬ÂÒÄ?üñ=Þ}ïŸØï}ªöÅ?òÞ»ïñÏO¹FËפwÁe¹‡ŒŒ¨‡’ˆÌŸÁ@:Îûf4§’ˆˆˆ|ý¸ZiõŽ)öºTÑÁé¾.‚уD».PöänFñ²û`%¿/nô= /ðë_¼Çáïñ³'{9×ÛGbÖ Æ v] ïÍóí73_ë£7glcó(ëÓxÇ—)jå§{ë(¶‚ÿt/ À¹û•c«t·¤ò•—éõŸærüÅÖùVØ"Êïl a,rU—IŒ à—s=:¨*°ã¶8©«´Vìî±^Vñ} -£ˆˆˆˆˆˆˆäD¡’ˆˆˆÜ¬ ‘ cáA"ÎàXJaŸ²t‚ÉÅÏæ&zú%¾÷LaK-ð‹ƒaÞxù—g|Çäš+Ÿý5ÏVf7gÅY7[Ø‘CY­v,9•|¡“ -¦üKY³ÎKEî%·Îü7~ú«.û?øÝkÅ1Û§¶÷ÿá§¿Šñ÷¿û{µÌsC‘vþþÿüÿØõýßì.Yªeoñçö÷¹öèÿJëFËBk` Ö!"""""‹¡áïDDDd峺¨u„é8tzl>žøÿÏÞýG]ú¿ío²daÃ&¡YˆY „BÉ5ˆßòÕ«…âHË|ÅÎ%~ïUÏTÛÚZ;#vFœ9êÌ­öÚcíì½G˜)ð{päHõFn2E©ØØ Á……Ä,YذɆÝìûG~°„$›` ‡7 IDATBBx>fvv÷óùìû×.öÓÏ+ï÷GÞª:"IòÈãJ9¾¹J{º–ÖÞc ÊåqØ”W>O’tzW•¼IjRõ®†”Gä}¿JIEÏlÑkÏTj•'¤À€ ‹öä1¹Kº—i …<*[ºTK—zm¨RÕÁãjªoƒ¶uàÃ]eE²J ìÝ£ž©©z§$ɳTyו­|öj$ã8S•7êm&’ØWÛŸžÞ§ÚàVeñ¨â•òLÍcƒªÝý'íóv}†F¾f*€IÀ­5ϬÒ[?Ù«ÀžŸè;{¬²*Ú7¿¦`ãS*¿*„iÖÎGïSUMÓEeUùWw/'Wñ¸Vg>¡= ¿Ñ÷¿·K:­ÓW%69<.IíjxåmØëR ¦áêÐÂf“+SR Y;_{MžçžQźJ•l{EuÛ6èцr¹5:ØÐ.kÙsªt Õ·!Ú:GÙãz8¯ZÛšwêÑïÕ¨,/¤šºfI.­~fµÜ×9žënÿ`†1Ž#T0êm&ŽÚWÛ%÷keù`·öÕUQ᛺¦é»þ±nzÌT“‚céËzÿíç´º¬@.kTQYå*(×Ã/ý»vüxž®š S°Q/lœ'5uiÕsoëÕŠìî}¶2=·ã%=T’'kà´ÖrmÜxõSϺÍúyyž¬ ÈëµjÅs?W™UR{öz#’Õv¹U±r¥VH'öUêd¥ï^½þìczdý#zìÙ×UÕNÙyHÏ?ò¬þ|è=½ôt¥Ö¯¯ÔÓ¯¬sç>Ö›Ï?¦GÖ¯WåÓoêcÏñÁ*=ûÈÓÚëOùlí^½ùü“=Ǿ®ªsÑkUTçªÞÔó=¢õë×ë‘'7kkmPÒ9½÷äÏ´û|—NüöQU¾Ù hÇÇzþ‘gUu´J¯?]©§·Ÿë×õÝíüõ{jèÐÀeHR°V[7?©Êõëµ¾òi½´½öʸ R€ëgxá…’ ©d2yÍûÞm‰D¢ï}"‘è{Äãñ¾çÞG,“ÕjÕ–-[Ƽ͑ã¯é{ìT àçú]&tÐp3µÀðÔÔÔhÑ¢E2›Gº`D‡jý¸^ö> ÿûÍG¤÷žÔÏv8õÓ·^Ò2§¤à!½ôä«:Q¼A?z°XVïnýaÛg:o¹K/¼ý¬tÒó¾*¯{…~ôôäñïÖ˯îÓyKøé“z ׫›¯Ú»þYo=Y$k°JÏ>ù^÷}’¦vö\Î"=øX¥–æœÓ¿~U8ª·7/ÓÔ”c+Â[õ³_VɽáGz°Øªóû¶ê÷ŸähÓ[Ï«ÔrNÛöKÛð¦^Zæì|ý½‚99š»òAUܵT¥9^½ùø¯T»`£{`®¦vÓ¿ß¡†ŠÿKoVzdö+#Ú ?<ù+Uå®Õ6,“3X¥¿ÿ@þŠÖ›É:PÜ‹ 7X,¦Ã‡«¬¬ìºËxâ‰'Fe6›e2™úF£±ï¹÷a0d0d4vÿÝqïûTýß[ÿúá2Úì €KDÂú§û¿5¦u0S &²ž¥ïrîZ¦I9¥wiºNhßÑî99þwè°e…6=û –,(RéwªŸ®œÞ¯‹J++µÌ“«YKÐJ·4½âImXâQ®g©XfW¸)¨ÁîV4ëOêÁÒYʵDþ`®tÞ«knë<§ e®VV,Ñ‚¢RU<¶I/<û ÜIÖ+í¸¢Kö6éé+zž©*ýÁô쾫% Š´`ÉZ[jWø|G÷áýÊè8ö'U…‹õ£gѲ-XV©g›«¶ªÝ:¬pK3ZT8¶6Þ3Gßs»šïsÈ+ä-)Ÿ£‡ï°\³Çäü†þç=³Uhº¾¦˜¦åjã·¿!÷°®Ðåv;U”1±B~{v®Ö¯˜£ 2d²LÓC+nÓ|›$K¦Zq›ÙøÉMÊF L\Qï>ÕvM×]nY%YÝKUj—Ží;ªEuþØyYæ.Ó•ÌÄ*Ï]ž«âYœrçLí}#‹,r8ûr«Å2D ¦k®çÊ_K[,WGC}µÎ}P+sëÕÇÓó¿þƒÞûì¼rŠ(×:x¹ ¤ÜÊ:KËVK'ªôçíЯ7ÿL/~´UAo“ºrîÒÜ”"œsïRN×9yƒƒÔnaF¹çÍÒ½ySz–G7);o¦VÏËÐÄÿÓ“fÌÐ|‡abµéöi²ú›õîu*žˆ¨Áצ@Œ_ÚdgfÀ­Â6ïýåïÏÐV7‘¨N|P«.uéƒ_þP¤î:¶OG;îÒÔ±n‚Å*‹e—Z¦.PåëÔG?ÓgŸ}¦O¶¾¨¸K?}ýÙîeú(×™Zn°Vo>ÿ²>±,REÅ2­¬|@+ÿ¼Y¯‡¿^Ûf(IF›Jr¯½nÏ®ìãjJ0D#cÕ˜Pøâe…â’QÝ©ž{ã2•eR#T€‰*zBÔvÉ~×OµyÕÙG]ÞÚüÛÏôÁÑ.ý¨8G]úX碥*²JRTÞϼêRÑ mj°v»þä-Õ†—é» –é»Ðžü•Þ;Ô²eé?ßqôOªîX¡~ëɾ~ w º$ŸÓã–åüg:ü®r{B«à‰ÏtÞ2K§4èF™iÚL=¼ ®_´èv‡ff$Ôzþ¢ªµ)ï>Æ:uš–ÏÇaT4Ô¡ßճޮì7ˬ¸‚ç/ªêXPþ¸E‹Ê Tš!©ämlöéõÅM6•çªt†MvSL-Ítàø%×Ñ>S¦Ö.ÏRýá fÏËVöù³zçT—d±«¼$GEYÙº¢òkUõ©°Â2iþ]-*©øvýÏœsÚö_f­]š¥ú¿Q}ÿ6Œ ­˜øÈ `‚Šžø@µ]ÓµìwÉ3k–fõ<ïÌ‘=|BŸÔzåžSퟫ×? «+xNÁž{$¥–1µøA-µÓï_ß®C ^5|¼U¿þà å<ðÍerè/QÿÚµÙÂþ6µŽB¸aÊpêžB“OœÓž/‚꜖£µßÊ”]’,Suïâ\åGƒÚÿù9U7TZœ)[ïÕy£MåwæÊ}ù¢öîÓž/.*èÌÖªÛ­2©K‡?=­Ú΄Zê¾Ô¶úˆâ2k~é,•™Ã:ð3z¯ö¢BÎ\­]ØSßHÛ'I&‹ÊægIÍ­:Ø“Œ6-_âÖ|c»|~F{އeÍwë¡"›LŠ«þ3¯>éH¨õØ—ú·#Š:2#o+&6B%˜¢:±¯V]9zÀÓ/%±ºµ²"G]Çö騥B›^ú?Uü³~û«_éÍ*ií³ä¶ÜØÖN-}LÏ®õèĶ—õ«_¾¨ßþ9¨ÒmÖcEVI9*^:WÁ¿Òó;¼Šðyë‚JýhåT}üê/õÔ“/ëOMKõì/VÈíýôë}ç®-ú@O¾ô ­Ô'úý¯~©_ýá3Yؤ—ñˆL \s®1Õ®¡‹ú´%¢îEÚâjmiUmȪüi£q™<®Æ£-ªk¨©5¨½GÚÍš¡;l’c¦Kù‰KúðHPÞ`D¾³-úèljÀ•ÐÙ/[´÷X›¼ÁˆšZÛT{!.k†©ww¤$É45KeöNíÿ" 泌üÚT}´MQ—Sy–‘·¯›Q_“öŸ É×™”Õ9CEæNUPc0ª&«ö¿,{^–fŽ`¸®¯­˜ÈXþ&æ¥-xz»ÞdŸç‘7õÎ#=o§®ÒÓ¿^uÕ«¶öºD/m_’²'Wß}}»¾›ZVå®Ôã¬Ð¯·Wô¼éÿYiê’—Ô·éªc*}äy½ùÈÀí-zä%míÛçÑKÛû¯‰çÔ’Ç^Ò’ÇR·-ÓëÛŸì{wu’r—¨róUTåÔeÔnE¦i9Z¿xz÷̘ÈeyÏ’Y¹9ÙZ:S’²”÷ùi&¿F-Q]ù|¼½C¸CùF]È2+v©]Á”p(ÐQ,¯çm¢KMIå:*qN‘{º]³³LÒùk²9¦Èn±éþsúíé’Ë,5v¤}Õ…$)¦æ‹WæÙ3­2_ÊŸRV¸­]!Ó4ͰHM‘áÊõµ¡`’2*¿pú•¥ÖlSä™=¥ß1fß>U‡þÑ~ÍŒêtÙÉà˾%{«OÏb׊Ån&:ÔÐÜ®ú† êo›¥{̃vIŠ´éÃÏ/¦UÝuF"×~í‹'N$ÇbøG¡­˜Xÿ¢˜ŒŒdã¸L»œ×\-«í²äÈÊãªí¹²§È‰(Ü—ÃXUà0ôaÊÌ”ËWSgB¡‹1™§e¦”o+ÛÖ7ãÚ5CóÌ—´ç³f8’¯#¦¸Ù Ó M´G±Ù”‹)é~„mÓµ¼(SöA¯øÖ¾ƒ¤p{T±)™ÊMY¢Î>=SŽxTF0»èúÚŠ‰Œ™J€IÊ$ûpîÝc±ÈvÍÆ„| ¼;WkYtè\§ÚF͘éÔ’<£|Ç.ÈŸPOøcÒ¼3¨¿(¿qŠJçM—õâW:Ñ)…[.ª©p¦î_Uõ—ŠOsjyÞ•Kóñh—"–)*œaUg[RΙ.­È1ÉÜf‘ÝØ©PBŠÈ(ۋ즈—.ª¶£@wæJ'ÚÔnÎÔ¢¹Yr÷)”|kß@éU4Tcl–V”¸o );Ñ.wqæ•û*]#&üƒÌœ‰^º¤êšKª²ž¤Ú¾òëÝ&ÿ€»ã—´ÿ³KWm«ÿkß^yÎÊÛº·]ïT_)ËꬶJÙÝթÇÏèð°ÇaˆöÅÛµ»ºýÚí‘üG‡2fuŸžR]_{Bz·:Ô×öwSËi[1¡*&­ÐW_é_1ÀhàVXH‹™Jp˜L&%ÜÀкººdµZ¸‰Ä/µhÛ_in ÌT€ÀápÈï÷3†d·Û0!*À ŸŸ¯ÖÖV577+2 ®FÕÜܬÖÖVåçç3 `Bbù;¸¬V«Š‹‹åóùÔÚÚJ°àšÿFØív³ü˜°•à±Z­*,,d Ü”Xþ& ƒAJ&#“LÊ`ûȇP &»Í¢d<Æ@‘d<¦ ëØ/NG¨ÄÊÒÛ”LÄ”Œu1c @zɤ’±.%1­,½mÌ«ãžJ0AäeÙµöîBí«=£ÎhDÉD‚A0(ƒÑ¨ «Y+K •—eóú˜©!0Áþ;ÁL%˜ š/†µûÓFLÌ6 DK†Lª³+¦ÝŸ6jíÝc?[‰™J0Aì«=Ó(™Ì€t ÌŒfí«=3æÕ*ÀŽtÉ`41FÄ`2ër46æõ*ÀD‘L2C ÀÈ J$c^ ¡Ò"T@Z„JH‹P i* -3C&‚¦¦&`#T‚ÛífÃbʘª²93T4Ã&»)¡Pà‚ªë‚jŠ·‹–”¨°å´vžêººlç7´ñN³ª«Ïª1~m›–«.2jßÇ_©)‘îh£Üîiʼئ†Î$_쨌)ÆËßnöì\­/ÏSiŽMÑ —tü|LW¶¾S’)ûMדfÌÐ|‡/7f*n ¦ §Vkš’bç›ôÞ‘°¢2êÔBîŸáËØ®03Y€1C¨¸ •_4CNIÁómò6G½jRñQ®Ñ4m¦^×/ Zt»C33j=QÕÇÚè©Ì:uš–ÏÇaT4Ô¡ßճޮì7ˬ¸‚ç/ªêXPþ¸E‹Ê Tš!©ämlöéõÅM6•çªt†MvSL-Ítàø%_·}ýë—$ƒœßÈÑŠÂLÍ´ëìTýñ¯tðB|ˆ}-ºÛ£âó=K­*/¿M õÎÁ€‚2È5§@ë\µóÓ6…,v•—ä¨(Ë"[WT¾s­ª>VX’L™Z»²Oуy½ŸMèì—-ªoõÌ Š*v!K«3L½»{t·Õ45KeöNíÿ$ _ÏñÕG­r/v*ÏҮƮ‘µ¯®+Mý6‹2â—u°¹CM]’Ú›ÔÞbQ(9Ô¾¤Â­ŠÌÊ”ËRÄ1UŽÎv5™3ä™jPCȦÂ)q5ù»dr~CEæNUèi{«ö§è‡ó²4óäWjêù#¾&í?“$9f§SŒ'B%ÀÄ—ˆ¨!˜P~Ž[.¼¤MѼœÞé+fÍÿæ45ü£MÁŒl­_ƒê"C×o ªþò,­ú¶G-ç;ämiשÖN…’†Új—_9ºcªQáVEçUŸa×’l‹¬‰©rê²w$eŸe•ùrPþ”v‡ÛÚ2MÓ ‹Ô“¤˜š/ö~O9Ò)Æ¡à&Wc]³2KrU–3MNÅ Us2¤Œ¢YZš•£µ‹¤Ýu—ÔxÙ©ÒoåËô…Oû –"ikLO€3œåØ,v­XìVa¢C Ííªoªþ¶Yºg°+óFI‘6}øùÅ”P¥»ÎHd¸ã”Ò¾tõÇ;uðÓFÕ9§ª {ª çÎÒÝóÚõÑß¾Rc×Pû.«1lT©Ó&–QÁÆËjžÒ¥ŒYS”"kûâ’uX_kRáQ›U†±F¨¸9Ä;uøðiî¿ý°OZ”¯¥Y9Z·8¢°5¦ÖN³æ,ÈÕ©Íò^“ÅÕvYrdeÈ¡.…ú¶äÊž"s¤Cᾜê‡AÞ`Ïu™™r™â:Ò™PèbLæÛ3å4†»—j“A®l›ÌºÜýɬšg¾¤÷>ö÷íw›û/ãwE¤=¢ˆÍ¦ŒXL¾žÙ=¦i.­*ˆéàÑ6E¼gÔ`íK¦­ß>Ã¥;3Ã:t¦]uÁvÕ jyy¾e™Ôsº¯ÑWssLËgMÓ|kLõ E"êœ;]ßÌ3«ÝwYaI±ö¨bS2•kiS¨§?öé™rÄ£ºÐ%Éп/É´cŠñE¨¸¹%ºT×,Ùd︨?o“Éšè¹—Ð5¯á¢‚wçjí"‹ëT{¨3Z’g”ïØùê _Lš·`¦õå7NQé¼é²^üJ':¥pËE5ÎÔý £ªþ²SñiN-Ï»rÙ=íRÄ2E…3¬êlKÊ9Ó¥9&™Û,²»—’‹È(ۋ즈—.ª¶£@wæJ'ÚÔnÎÔ¢¹Yr÷u/;7 ÁÛ· ]DÍ™)k̯º¶¤ì®éòØbò]N(f|Ÿ$…/†-r*;Ò&—ïêP@N͙ڥڋÝ÷GŠƒjŒÍÒŠ—â!…§LSù¼) ùΨ%! ”®…ÒŒ)Æ—©¢¢b3ÃFS2™¼êõPD"!“ɤ5kÖ0p£`Ïž=ŠÇã2W= Cßó@IW½îÕÿ=€±õ÷“-2˜- ÄuýŸÑ„üþE¦;”?Í®¢i]ª?{Yƒ¬¬–ìêÔ‰@LÓr¦kaSÅß°ËeŒªþ¿¾ÒLIIF[¦¾53¦ƒ }sn®îœ5EºÐÞº‚II‰¨[cÊúF–þ·Û³”oêÿÒô³ÎøÚu©ó²Ú,™*ëÒ³§jZ¤MÕÞ„¾1{†n…T)¦¤Õ®ùw¸4×Ü®ú@—šýŠeM×]wÌP±Ë¢Ë-~í;Ù9`?Òµ/yyèúëZ:Ôj˜¢âÛ]Z”?MSò64ë@ ®Xgç û’’’ñ¤²gMÓŒÐúªKñdRÊÎÒ¦ýíËu$%%c:íhJŽSe…3T’eÒ¥³-úÏS—•$£U߼ͮà¹6µÄz:•fLC¬”7ø?x—Ï9¦u^xá¾0ò•dòš÷½Û‰ÄU¡Qï#÷=÷>b±˜¬V«¶lÙ Œ‚'žxBÑhTf³Y&“©ïa4ûžSƒ¦Þ°I"T&‚ýð mvâë0ZU²h¶–fÕR÷¥vûã×]”iÚLýp‘Aû>þJM‰‰×Õ‰Þ>ÜX‰HXÿtÿ·Æ´æŒ&DTu‡Ï¨-Ûª`kœñF¡`rIÄäóÇ`”*0€ø¥mû+íz*0D£Qù|>…ÃaE£ÑIÑ'«Õ*»Ý®üü|Y­Ö[ªïc5Vã‰P €qFuìØ1¹ÝîI*D£Qµ¶¶êرc*..°_“µïc1VãÍÈ0¾|>ŸÜn·rss'U˜`µZûúåóùn©¾ÅXŒ7B%ÆY(’Ëåš´ýËÎÎV8¾%û>šc0Þ•gñx\&“iÒöÏjµz¯¤ÉÞ÷Ñ+·ƒAJ&#“LÊ`ûȇP &»Í¢d<Æ@‘d<¦ «yÌë!T€ beémJ&bJƺ˜± ½dRÉX—’‰˜V–Þ6æÕ™q˜ò²ìZ{w¡öÕžQg4¢d"Á ”ÁhT†Õ¬•¥…Ê˲y}ÌT€ ÈÀ˜`ÿ`¦LÍÃÚýi£ &‹ f›Œ¢%CH&ÕÙÓîOµö­ÄL%˜ öÕžé”Lf‰@ @:ƒ f‹ F³öÕžóꕸYEšôÉÖg´á¾¥Z¼x±W¬Q妪i½Eú:¢›*µ®§ÿk*µiÇ…&BÛZÿ¢ K×ik?S#ŽtÉ`41FÄ`2ër46æõ°ü7¥ˆŽ¼ö¨~²Ç¥‡žyUÏ•8m>¢]oüFO<Ðö?Ö<Û$î~Óûúñ†uеJŸªT™+¢æƒïê­ß<ªÊÀvíøñ<Ùø‘¸%“ÌP0rƒ‰Ä˜WC¨ÀÍ(R§­{*zn»6­ÉîÞ6o¡ÊŠlò~ï mkx\//œ¬±JHU¯¼¢ƒî§´ýíÊ+áÙÒûTîÙ ï½òUUnÑ}~&£‰åï¸IE%E튤nt¯ÒË[^ÓFOwÒ:¾K›6ܧ¥‹kñâ ­{f«Ž„$©U©\¬¥ÏÔ¤|>¤¿<±TKŸù¤{ ¹Ðíxfƒî[ºX‹ß§ÊÍ»t<2:Þú‰¶”V<µîšÙXîU/襟¯VvO;¦P•*—nÐŽOviså-]¼Xë6é}oJ'›ªôÚkT±x±–ÞW©Íï{¯Œ×D€1B¨ÀÍÈV¤ÊÕ.þÝ÷u߆MzãýOt¼5"É!OY™æ9$EŽèµ'^QMÞF½¼åmmyµRžšßéoWDÙ*[W¢hÍ.5ô!¡½{Īò er¨I»~ü„Þj/×s[¶ëíÙ(wÍ+zôÑxß²µ (– IDAT)Ò\-¯<ª(`*’cžîÛ°FeÙéúß#Ú ·^©’çñ7ôïÿþªÖh¯^|¥ª;T‹ÑËþB{­ëå··ëÇÝ:øb¥^ü$$Màñ+,ÀMÉ¡²Mÿ®íKwi箽ÚóâO´M’5¯L«ŸzNÏÜç‘M•?þ‚Ö­Y£…I*’uéV=ÑÔ.IÊ._§¢ößéý†ˆ.´)T³KG¬KõF‰M‘ã[õ–·L/¿ÿc-uHÒ<½ìUÍ£;UÓzŸîËÇ®‡Bj—C.Gú1ªÿ½<¿ Ê¥Ù’<Úøx‰vþ®AÝ'üöDVèÕ—7tÁÂçô²w“v4‡Ò?P0 *pÓrh^E¥6WTJЍéÈ^í|ë-í|~ƒ¶¿èµ î[gÕ‘š÷µ£æˆjêê`M»´¢çãÙåZWô¢ÞÚëÕ3 Ý:²ëˆ¬o¨Ä&…êhoÐOþûâ~uæ©¡]ã*ÙÊ”W¤knQ«·YQ—GnGšþK’\Z˜2ãÉf“¬=å4Õxu?¥+»*{æ •Ij}?Íødòë“¡7¡Èñ­Úô–ôøË•=÷²É½pžy£\E¾£WvQ¤DzåÑŸh¯µ\«×¬ÒºŸoкOhSï=…”­òuEzeë^5?^¦]GlZõF‘l’BQI®‡ô/[*屦Öl•Ã=¾}·”Ë­*U5„´&»ßt¥P•žÿþóмôÿikÙm²ÿ’¬VYm¶A¹{ÿ€{Ókà€Iˆ{*p²Ù¤†êÚÕwC¤^Q"’ÕáP¨æ-í ­Ö–ohSå-—'[(¢hÊÑîòu*j®Òû{w©Æ¶B늺#GQ‘2 dºåvw?\]zåµ½ DƹóÙåÚX&U¿¶UGúµ¥iïNÕ¨Hk¯ÿCŒ°\ey’·úÊ=§Qͦ5Z³ùˆ¬y|›ÑªåËæh½ûf™óa”ÛíTQ†ïÌTà¦äY­§ÊßÒónPûS•ZUä–#Ú¤OÞKÛNé©×Šä¸•Ù~D{—«Ä&ïÞ7ôbu»¢%^"erÛ$¹Ëµºàýæ•ÓÊ{x»<=Órl +UYð}½øÄfé™ur‡ª´õ7ÛÔ°âmåÙÆ»óÙºï…çôî÷_Ô£ß÷jcå*•åIÞªwµíÝ:å=¼]«Ý’šÓô?]-K¬UzB›6•è…Ê2Ù¼Û´yoH ·x4-Ýø„ø‰Àdd6]÷.p)?£w¾F‡>¬j–O•Ì›®ö“­òvM¶^›4»`†òb—ÔЙäGp‹#Tঔ­û^ýwÙÞzM[ßÿ6(jÍTÞ =÷ö3Zç±IžŸkóC¿Ð+¿xD;­y*Yý”^}Õ¡Í›^Ñ/v•iÇ$·*Öè7¿‰jÕ:OÊRoUnÙ"½ø²^ûɵ[]*Yý’¶<³P¶‰Ð}÷mù·¶¾òšv½ñ¼¶µK™y%ªxîm=³n^wËÒôMš:ezaëKzeóoô‹G£hf‘V=·EÏ•9$9&öøFŸÑª²YŠ7žÑÿë)~Õ>‹‘Hô=âñxßsï#‹ÉjµjË–- *à–USS£²²²[²·Bßoôïá‰'žP4•Ùl–Édê{ƾçÞ‡Á`Á`ÑØý÷½ïSõ`lýë‡_Èh³3‘Ñ®Õ˲T÷É9yãì«pwÏ‚„†–ŒV-/¿Mî/½z§)6ð1»ÊKrT”e‘­+*ß¹VUŸ +ܳ۔‘©åÅÙ*œnT´-¤ƒ>£Ê ãúðÓV#,Ï6MëÿÛtùħúžYVvw¾þǬ6ý¯Ï:5·¼@wgto4ûôÇúˆâü&¤D$¬ºÿ[cZ3•¦xR’1C«¾=KÓØºw±¤ë±d´iù·Š._Tõç!uZ§é®ùn=döigCDqc†–/þ†òƒçµïï—¥iYZ1?Söhðúʲ1]:üéiÙîÎW^ãiíö'ÝêŒ #aÕ4Än›C÷.ž)eä%[3TdîTõ5£jò·jßñ˲çei¦Q²g»T¨KÚ´M¾KùÎúU}!1èÕþtå¥Õ7ó‰EÏ@¨ÀH^×2qöL«Ì—Ûåﺲ-Ü֮ɪƒ2]™Ãjí { œïºÎòø–02„JŒHRÑ¡£HH{ùåëº9{g2¸wÄï€a2$Å;µ·úä•F»VW¸å–z¥y¯3P ·G›’©\K›B=eاgÊêBWRícRöTe;Ô”$£\9I×Qž$Kw§L}SPŒrf``ü2H+¦@Ì¢"—Y>là¥íF(™2mÊvõ™¢QƒA5ÆfiE‰KñÆÂS¦©|Þ…|gÔ’âç:9×­{DT}ú²4-KËÆ”{]-š¦<Åb Å­Zx‡C¼—¥¬Ýå]Né–Œ²M±ÈnŠ(ç—p+#T DT5G/êÞ·éÿ(éÖÓ¡«šåSLÞæ êN¶{†’cvžœ}õ¶ÐÉÓÚy¦SÕoV´8[+gÉÖÕ¥&_“vŸŠvYñ°ª?÷kE±K÷/6(¸ ƒÝSS| `)‘¾¼õ—´rÞL­Î‹+xþ‚ªµ² ·€˜š[.«tN¾ÖN9£w¢"Wºu*0ÎL&“âñ¸L&Ó¤ì_4•Õj½%û>šc˜ÿ¾Ô¦¶ ´Guõ­Ã+$ÕOêÀPÇD:tð:8Ð>›]…Ž.ýí³/µ_’dkŽSŠÆ¾žò$…ü~½ë÷§liÓ¶¾·IùOÕ¶S|ÿŒ ãËáp¨¥¥eÒö¯µµUv»ý–ìûhŽÝÌ*)þ†–»mr˜LrΘ¡å³ŒòŸëT”ÁÁ#T`œåççËï÷«¹¹YÑèä¹FÕÜÜ,¿ß¯üüü[ªïc1VH’"—´ï‹¬³ôðŠÛõÐ|»B'ÎiïW,J‡±ÇòwŒ3«Õªââbù|>µ¶¶NšpÅjµÊn·«¸¸xÐ%Ý&kßÇb¬èjmÕžÖV7¡€ÕjUaa!}À„ÅòwH‹P Œ:ƒÁ0&Ç€ó10~•¡¸aø+XÎŤýÇ*%“Œ€‘I&e0Ž}äC¨„ÝfQ2c ŒH2S†Õ<æõ*€qÁ_ÊpÎàZ+KoS2S2ÖÅŒ%é%“Jƺ”LÄ´²ô¶1¯Î̈€Ñb0”ìù?=½¯ ÃU3Rß÷߀Ñ;/윫ÿ¾ÔíÆ_^–]kï.Ô¾Ú3êŒF”L$ƒÿo¾Ñ¨ «Y+K •—eóú•À9Éá"çd†%/Ë®ÿý¿“0á°ü¸aúÿµ,3•Æî¼«ÿùç]àë"Tcf  ý·qq`ìÏÆs^¡sƒ­ãŸºíرc À×ôÙgŸ yÎÅLqðu*€15ÔM¡{ÉdRûöíc°¾¦>úHÉdrÀ¥ïúŸ—Œ¡¸!ZÏ?5T:vì˜víÚÅ@\§]»véË/¿¼*TèÜ àz™0ÚR/Vô^ÔH&“}ûzÄãqíÝ»W'NœÐ÷¾÷=3ÃpìØ1ýÇü‡¾üòKÅãqÆÏ·úŸ« ´`(„J຤E©ï‡Ú>ÐÃh4öíÅb:yò¤~ûÛß2À#Ç•L&û¥Á‚¥þ³—RÏÙ†Ú *€ ÝL%£±{EÞd2©D"¡X,¦D"Ñ÷H&“}ûzËéÝÖ+õ5ÀÍ~î”ú:5ðI ‹ŒFã Ôc¸Ÿ-7$Têììd¤˜„ú9ýŸÔà§7J}N÷H=~ 2û?LƒÝ)‘H\¥†I½Ëß 2¥>§–9œLàæ‘‘1¦å›'C'Àø*Tê}î?Ëh¸¡Rê1„JàV3X¨Ô¶÷@ÁÒpB¥ÁÂ$B%0–¿£f°û*õîëÿÜù»Ôc‰ÄUe*õ p³ŸS t5’`i°ã ‰ ”ú#Tc¦ÿ…‰ÞÀ©w_o˜”H$® –Rï¿4P 4Ø %‚%0ÙΟ҅J-ƒ×ÿuÿICLC!T7Ì`uk4¯ –zçþKßõîjÙ;‚%0Ε:glÆ÷@áÒpg)Œ¡¸nƒ-s—ºÞ`/z·Æ«B¢Ô0i ™J½Ç¥>Læó­þÏCÍVêõ@ÓPKßB€þ•À Ñÿ¢Dïì¤Ô÷ÍHJ7C‰` Ü çOCÍX,8l;Àõ"T£n ÙJ©÷Iê•$¥>†;C‰@ Ü çUƒ=ô‘®L€t•À×2Ðxíï½X1Ô’xý?“nÉ;B%p+œkõ=P°Ôÿý`KÝ 7H"h!Tc¢ÿì¤tÁRÿ )õó©áRïûþ˜Àd:jÛ`÷D,`ì3ƒÕ0B%0f† –Ò'‰YJÒ°–®êžK×ÿ5Àp*€¯m¨%ð –†š­4Øqýë X·ÂyÖ`ï‡0 ôúºÇwÛ×­Üš•À¨K,õ# ½œÝHC¦Ê˜ìç]_÷¼ˆó'0\„J`L 'Xê=®WÿãÓ]à`V¸Ω&ÒñàÖF¨ÆÌpƒ¥ÔãS w¶À­|¾5Ÿ·&B%0¦Zæn¤ŸÀ蟟Œ¡¸!†Zæ7î\ àz*€Ž€ àÆžsŒB%0®†ºØAàpýçR£P LX\$˜8Œ Ò!T@Z„JH‹P i* -B%¤E¨€´•¡Ò"T@Z„JH‹P i* -B%¤E¨€´•¡Ò"T@Z„JH‹P i* -B%¤e÷ÄZõ×ÿõ®êý\Zþð:;F­ù>ü7}è“d/ÑCÿc©²od¯#^½·m¯ü’‹Öëw;GwÐǺ|M€™J±@é[ªó†øf&qžÔS Þ«h¿­Áz¯B ÊÁ÷3®BGÞÑ΃AI.ÝóÃušc§-ܪÆ7TŠùUç퉔L¹òØýò†$ëÔ\¨Rç$aÛl­zøaÅ%™¬ŽÑð±.@ã¼ü]¤¹N½™’½¨\KJzS¤ê'É›ew8äp8d·ÝŒåŒk¨‘¿Î§¸$É®;æ»äô”ÈÕ³7t긂|?Âø­–iV]Sw¤$Ç\g›%åk¾K::¡c­eZš®‰1…›êUs¸A§› Ç%™ìrº 4¿¤Lóó­C|´Eýq·£’kùµ®Øª ·F5µ§äó‡•d²;å¾ãN•/™#§¹»¾Ö“‡ôùáSòŠK²:œÊž½HÿmÉŸ¯Õk¿-÷u/Ÿ×ÝöÝûä{òVíÑކеŸŒ† „<èSá\•¯]­…Ù×÷³ ¬Òžý éÚ¾ú½õò{ëõ¹g…Vß3¯_x5Òþpë§P)¬¦º¦ž×N•:ûö8òçË¥ H Ÿ®W üÛš9`+#júëníoì½ìo•+ߣٳóäˆÔ|ö´›B ÖïUõ0Z<üŸÚ Ëä*RYI¡rRØß¨Ï6t/Ã<¬Ý;KQI-*R¾Ëªh Qµ‡êåJŠzõ·šVy† ÂõÒž†F…äTá¢ä»d‡h<¬C Å%…ê?ÒÁ¢ªbæ0KŸÔþ”@É‘?_ó òä´Ká`³NÕÕ«),)X¯½Õù{^»Jäq¤ìs¤,nT} \3Qb­5Ú_ß!˜®áR\ºTåÞ*½»·aX³Mâ¡°¬ž{´nÕõ5gf¾ò]ÒÎ= ŠJÝ’k‰Z[ª¾ªfº5ÛíлïRPR¸¹YÊ–c„Cjh”ì…ºgí Íqô.wþå»véƒIQm*6sx¡UÈ{¸o6Xnùz­^˜º4ÞÏ/TÕŸö¨!,E½uòGò•o»òÓ0™®”e¢ž`]$‡Šî¹_Ëçô[~/Öªcu=³¿Ln-_¿ZÅW Î<—–êøžwTÝ—‚j —Êi¿úg:d[b-:Ô(ÙU¸ê!Ýë¹RÀœy ¥rŸþúIQo•4=¬{™š5d¸EÇ£Ò·N½™Rn‰§_ãg¾«çuTÞú€b×”Qóçõ=!‚Iž{ïpÉ4»g¹¾S2ÜxÇ­òås® ƒl¹%*´_iÛ’{KÔ¿*³³H%}M)»žQ±ªðžå)Ò΢%ÊïIR"Ña–SØß»œKó Gln•.ò(×å’Ë•¡xüú¿S÷еª(€‰·ëBOªgõÜ¥¢¿‡_wζ ڽ셋äªë.kH¹ßTþ@+œ™mrZ%…%9îgÀ›ñXåèkÂu&3ÖB•äÒ“U™¶ž6Œ€ÉjV÷ôª NøBš7ïÚDǹp•\ø5¿RS¡î,dy8›G«ëήnº{p4ò9™7îbç-ZÍë/†öW1º±^ëîÎG’$I’$I’¤¢·4¿^á“ÝL©ë&ÇŸºÍ™:_-ÌñáÐúНÔyêéíÖ¡P×õð ±Ùn†´ØªÿÀorד ½ð$C/@}ó\ùê _|þ_~±Æf Øú‚…·÷ #Ý÷ø%±•eöí ×õä3üõ‰§é{¢—ŸÜxÍ/Jw*\tT£Fn;êªU¯ßXÏáH’$I’$I’$Ø •šl|ü)»ƒUzÿó(ƒOß~dLoýc>œ[c{ ¼+ÔŸ~z;0ˆôÐÍö$f›W¾¦Îm¦oknðå¦7zWG×<=øOŽ[|õÞoxû?ÖuÖøÙÏŸ¼§/Šåÿµ(<9ñwLuÝÛ]¨“ž(lÏïw…æ0]¡[¿7¯¿:éíôÁI’$I’$I’$Ôá¶§æ:þáz¤Ä3OµŸj­ó©gèÝýŸ¯>¼1}ZG7G»wþ¾ö!ŸmÝf·kóEãxg›_óÞÛÿ“û·ãÿýÝgì?X«“'G'øéÎto­Í îí¥ª³qe'Ä žæ?ÿÕ­¥Æ]'ë䉾®ø‚¯Ôo÷bàãÝCg½ß$I’$I’$I:¨*5×>ä³ÝÄ¢÷gÅ37R%>¼ž*uñô_ï.X#3¿Ê¾¹RókçÿÀ1S"‚Íu666XûÃÇ\¹UðÖØ¤¶{::¹3µ¸Õ#Œ¨ÅâÿZ¿ë-w=C÷Î>>›_äÍ}_ |½8Ïïwεëø0ÝT’$I’$I’$éÀP¨ÔdíãÏ®‡;OþìI:´^'OÝH•Xûø‹ëáQçOÇyfg#Ï.ñÆ¿/óÅFýúþ¶¾þŒwß~‹ÿØø¡ÞÚ(?=²sZ_ðÛß¼Cöë›GñÔ¿^åß\â«Ýûr¢÷Ó6¨ÞU2×A÷õQDŸ‘Yøã·FLm}µÄ¿¿ñ6_Ÿ¢°N­Þ¼Í6÷9–®gßnµù!o¿õ.«_o±»•æÖ×|öîÛ¼µûb?Íøp7fJ’$I’$I’$܃ù½zý ~¶;NåI~öTçWÝžo5Ø™ên¡N ôãÓc¬½±À:°õY†ß|–„iÜ<ÅØÏ¶XøõÜ­ýÉèOÿáßù¬­õ™{ãcæèìì Yߢ±gèPðÔ$“7ß— ¼;ni“…ÿùÿð‡ž(½L¿ð“¿pº‡ÿ O}x‰/Z°ñá[ü_ŸöðdoáÖëëllµ€0OþÕ|ýû/hÐà÷oÿšêÓÏð_&Gx"tcé੉¿á¯7Þâ?Ö¡µþ!—Þø‡[4n ¡ºùÙÏ'yºÓü’$I’$I’$݉2R©¾ö!_ìOýŒ¾Ž;X¹ó)~v}°Ò:v}H ¡ŸŒðÊßMòW={'m»(=Ï0õw§¾±ü¤ói¦þëÏùYoxÏ[lmí ”Â=ütüü·Sƒt}kõ1þj7|im±¾¶Æ+w8d©s€Sÿu’gvïÁÖ:_}öŸ}±ÆÆV‹ û§L¼òßøÅÄ8#»ÏÉjmòÕþÀf㎥㠞åï˜|¦—ðžsÝ(=Å䫯ò“þË—$I’$I’$éúå/yíq8‘úÆW|ñÕ:ÕÍtFèî{Š#?étгÍͯYÛØ`s³J­ŽvÑÕÕMïÝtÜ~E¾úì ÖÖС»çbЛê IDATiž~ânB™&›__a}}ƒAW”î'Ÿâ©î=Ûjnðž`½‘î^žzú‰›§I<è±Ô7ù㕯XÛ¨±tFºéy²'» “$I’$I’$Iº[M¨$I’$I’$I’¤ûç°—@’$I’$I’$Ií*I’$I’$I’$©-C%I’$I’$I’$µe¨$I’$I’$I’¤¶ •$I’$I’$I’Ô–¡’$I’$I’$I’Ú2T’$I’$I’$IR[†J’$I’$I’$IjËPI’$I’$I’$Im*I’$I’$I’$©-C%I’$I’$I’$µe¨$I’$I’$I’¤¶ •$I’$I’$I’Ô–¡’$I’$I’$I’Ú =¨]½z•Z­ÆÕ«W¹víšW^’$I’$I’$é;8tè‡&‰pøðýGô@B¥«W¯R­V ‚€ ¼Ë’$I’$I’$I÷ÀµkרV«D£Ñû,=P©V« …8|ø0‡òK’$I’$I’$ÝW¯^¶³˜ýèG÷u_$TjµZ„ÃaC%I’$I’$I’¤{h7wi6›÷}_‡äI(I’$I’$I’$Ý;»ÏUºvíÚ}ß×a/·$I’$I’$I’Ú1T’$I’$I’$IR[†J’$I’$I’$IjËPI’$I’$I’$Im*I’$I’$I’$©-C%I’$I’$I’$µe¨$I’$I’$I’¤¶ •$I’$I’$I’Ô–¡’$I’$I’$I’Ú2T’$I’$I’$IR[†J’$I’$I’$IjËPI’$I’$I’$Im*I’$I’$I’$©-C%I’$I’$I’$µe¨$I’$I’$I’¤¶ •$I’$I’$I’Ô–¡’$I’$I’$I’Ú2T’$I’$I’$IR[†J’$I’$I’$Ij+ôHõÖ§¼unŽ2˜x_ïÜþys÷Î_`¥&}úu^ê y‡%Iw¤þåo97›§ŸàõWŽÓy›¶Íµw87Û`êõ—é»Ó.gë2o_að쫜èºWmë\¹œ¥šâx÷Ýö÷b’$šk¼sn†ÕÆþ‹£ÃgùÛçºïqô o›§àôë/ÒÛøÆÿû¶.Ix×ò;ÎÍÂÔë/ÝyýqÏWX^Y¥PªPkDbqâ‰4ã'é뼓~ëSÞ:¿Dúì«<Ûuï~ló;Öß©nüÎ×ãêNI: G¾¬(-,p%õ}ÞLIÒwU§”-Ð(g)lçxç}ÚUg`hxø^¶­QX^¢üн؆$é&á‘à¦7vbÑà>ô-a¢±p„À«.IºçåÒ\še±!58ÀèP’x¤A¥\$Ÿ]äâ¹R㧘<Ñ•ÄCâNêNI: Gÿ=¾‘#“áÕg»½›’¤ïX$•ÈZƆ V–ɶ8~¿R¥Ž^N>×{ïÛJ’2§_ã…žPzuååWî©•¼ú’¤{¤¹ÎgXbˆS¯?Ï‘=eROïŽfè£K\ÌÌ09ËËG;½fkII÷Á#*…ÊÒŸüœcû¤î›Ÿ¿Of1K¡ÒÂÄú›xn»óÛxŸ_¿¹L5:ÄxªÌR¶H#œ``|’¡Æ"s 9Ê0ñq¦ÆÑ‚ææ§,Ì/’+ViéÆÇOÐãW0$é‘W/e)´bŒ ..“ÉÙ:~ìúxõõËdæ—È—„ã)F†Z{Vþœ·Ï-‘žLSX\¦PXzœ©Xž_ WªÄ?õ"Ǻ؞¢èüòö4áu§)/-“+U biƦ&¶G ímÛÕdã“ ó‹9JµA4Éàø$ÏiðÁ¯ßd¹ ÌýŠÿ^8ÍëcU.ž[fðÔ…ÌåÔi^}®{ÏyÔh&–fbâYz;6¾½{ m}É{sV‹UáýƒcL_‡­O¹ôæÙbƒH2E´Ai5Ã…‹—Ùôµ$I¸©ï¢)RÝ]$ÓQ(­PÜí0¶>gn&C!2Ääô4-–çó4öÖ­2‹‹&Ïpv*M+7Ç›– Ÿâì™ úk«döë¯vÖ]Ê䉜âìÙ)È1ŸÉSÿF³æú"³óyÂC“LŸ>Åx²ÆÊ¥y¾¬wóìÙ³ G“¯ó/öns¤Uai~ƈBs…‹ŠÑa&§O3=5L¬¸È¥¥ušì³æï^˜%ÛJ3>}†éñ~+³\xwÏy|s’¤;sÐzä õ$éñÕÈ3¿X#=1ÍôÔ0ÑÒ"3³;ý@›Ïî·®%n¿ŒzÅ•é‰zC°õùo¹0W"9~–x}’DvŽåjœD}ÃÃÄjyV+Mh^!33G!2ÌÔéi&Ò5æsÔö=±M.Ï^d©ÑÏøôNŸ&ZÌ0séS¶ˆÐß¡Z(mŸg£D±T‹”¶j” 5¢ýI"×·wÐuž$9ØOPÊRÚ-¾¶òdËQÒ1B©÷j×þ@õÕÔ•·­ïî¾î”¤ÛyäcèhzŒáì–³²C7-«×*„IRãÛó¹n~Àç©TŠT›{¾ô3ùÚÏ9^ãÝó3dk˜x_³þþ›\X®R)UY¯.QhAtøÓÃ1‚V™¥ Y)-“Ý8_Ì–¤GØÎÔwÑÁ4Q€þ‘ŲÅ-Žëd3·H!àôÔ³Û:ï›d²rž™Õ½ èãXOô 1˲’œ`ôh!b ¥È•k´nÑÇF&xöH'ÐÍðH‚•Å25ŽqÓckjA‚±£ÛÁLj¦«Dƒ½Ýû$á¡S¼trçklÍ0ý# ßù6cœ ·ÌÅj㟠¶·Q/.±ÚH21õÇ:z˜j•8—Y¦4ö2}ûíC’´÷›ì…%{ó;>㯽ʉ;¬G¶"¬o$I±0S“œì ½$"UÎÏ,±²qœáêí?»'nWKÜfY½˜¥N1è€æç ÄÆ_ãÙ¾N L2Ìb+M²hƉ j ØÊ/’c€S“'é ½LÏ1[úöY5×—Yª$™|í9Žtl{|²Âù™Š[ÇH¥’„³9Êõã„ËyªÑÉF‘|¥Éñ L®&™Ž¢Âna;à:ñAúƒY²¥:Gt°•ÏRަ™ì ±ùÑAêÀÚÕ«¯î¤®lSßÝmÝ)I·ñèm zO“ͱ¸#µgQGß LJ6»Èì[eJå*û~‘ ’$Þ¹Ý1o?/7B"Þ~kÞ}€në*ÿ»°Ý1U—g8·¼wUÊÕ&8TT’YÍr–B+Âà@l»sŒ¥é¯°š-R?–¢Z¬$ƈ…nt¡ñTœ`o1DˆEw?ŠDâ‘ëmÜî±é»}Ïn[ö}Èz(1Ì`ô"—Îý©©tštª®Ð­·›LFöl ›cƒkÅOø¨X¢X*P(6¸©Ý£V®ÐŠ‘Øó›ÊÎDŠhk•r úÂûìC’ô·â(ѽoêAŒp׋“Õ#>h}#Iz|qÒ7ŠBññ`•rµÙþ³ûíj‰Û,Û,W!’&‚æÚ*ùFœñÔîNZTË ¢©~ºZ5jDH„[TW+´bÃįnñT ö •åµF™Ù_ýË7–D)7àX6ÍËÏ?K:ָż­ñü(±ÝA61’GŽpäHŒV9O¾P¦ákI’]Í+…áÔ$gΞåìΟ3“)ÂY)¶ˆ&£´J9*×ëŠ&å|ùC|ëË÷y÷ƒá¾cœ|þ%~ñÚiƒ<ËŃ=Mc{º…¦Ïüœž=Αž(ÁMEâÍ"ñA5¿3ïøÎ1”òTƒq'IÒt•?ÝÓúF’ôHj•ÉÝ(Jh–s”[Q’ÑPÛÏî·«%n·,@µ@¥ ¡hŠxPd)»N½¾Îåù ÅV˜0 6¿|K‹5&†é…ˆ&£PÉS¾~¸uÊùý¿ ŽÇ ×ÊÔÂ]tumÿ‰Ô²drÔš$¢TW³d«QR±‰$‘J–ìj•è@bŸi`¾NGbD«ÀÒâ2•è én€ÐÖíÛßëúêNë;Iº›h:Ô;Âxÿ*— »o›áXhPÎ\à­\„Zñ»…?±ÁaËJ˘)÷©)”Éq†xT’YÍÒ …V„‘={§2ŽŽäYÍ O “\œgöRŒ‰‘$Ai…ÌêƒÿU^@…ÕÅUá †µÂ ùZ„þèöÃÜôhT+lÕ{÷}¶F‰n”ÈÖ‰$*¹Eæó Z‰ µæöô7m#9L:|‘ù¹÷ FÓDª«,dJD‡ÎÕŠ$µS#{ñ<ùo|ƒ<œgzôN¶s˜¿¸Çõ$éQÔ`unŽøø0‰V‰åL–Fÿ]йýg÷Ömj‰ qëeÑ!’­y–r[ô?Æäd‘Ùù œ[I006Åxaaæ<¹x?çÎprûá>t¦FI/Ì27gb8¥e2ÅÖ¾ó­…z‡޽ÉüÅw`lh#ÏòÂ2åÔi¢;%Z$ÙOxa…rdDB‘qVÈU¢ '÷¾ë×éH0˜lq)_%6–fwIWº]XçÊGKäƒAFOt·mßqë«¶õÿ`$݇ŸSéäèØ±=?éœ`¬?J@J% 5>F2Å›¾Õq`]'8ufœtU[˜Xj”ÄÑnºoZ§ÊÊü"ùÖ)ÆÒQZ¥2Ù‰ñäÃ(Õ7¸R̳´R%1ž2P’¤6 •$I’$I’$µ¢ëÈI^ÅôpŒ UféÂEVJËd7N0RÍSˆ2>ù}á .gÈ7jÔšÐe#I…­ü"985y’¾Ð;ÁDñ³¥ƒnÁºG’ôÝ=¶åA­X¦DÒƒÄwβ+5D<3O¹R¤Ò*–(– Š H4©«‰1b¡Ýg<'Ø[\bÑŽë…V@@$¹ÞÑAp»N…Äž§×ÞIzäuöä¥WNòRs‹õR‘bn•ìjJe•ùù¯l×ýýlÏv×ʼnWþ™;ëo¼ß¾¦Iìî,š"µ3}PGb8yŠÕÕú¶÷S]žáÜòÞ#¬R®6 ÅH… ä«Ë\<·L8–$•dtìØ¦R’$=Mª… ­Øðõ>:ˆ§bpÐPɺG’tü@K„ФÕj]ïðn\»3IúÁÙú’wffÉý ¤bpå"s´ÿ ü­$=V]˕ˬî<ïâD_'=}Çèé;Æ`úwœ»˜£Qù#[±ïZÓÜüÿ­æn…×ÚûÓëN|tŠÑøÞz' ’AÇ1^~=Á•Õ,Ù\Ž|±Èêr‘ÕlŽÉ³/sÌç*I’uu$iÇcûL¥H2NÔr«”w&rÝ̯lOëë' MnWqÕÜêöœål‘_)ùª¤˜zq‰ÕÆÓg~Î ÏçHO” ±;þ4D4¥UÊQ¹>1x“r¾ìøTIÒ­ÕVY\\$3·ÄÇ5©–+4ÂIw2º]ä llW,\~ûÿæ_þå×¼»Þ<@M³gÕ<«;¶ò+Û_Zõëè šØÞO£#yäGŽÄh•óä eÀæ§ïñ»ù%J±a^ú›¿åŸþá4CQ Q$_mz/%é¡°]—PÉ_ï N9_±î‘$=àé‘Ö`uö<…›¾lgôôÏ9ža(šg¹ºÂÌù"Éhƒb© DØž^¢„ðEV«Ë\8Ÿ'F…JÍ…$ýБ(áF‰\aH" ’[d>ß •¨PköÑ•&¹8Ïì¥#I‚Ò ™U; IÒ­u¦ÆŠÍ°RÉ2û«ÑX„VµB­ap,E,Ý®G* \øuŽ8eJÕÄÒ ÅBtÄÚ×47"Ÿ*+3çÈÇj•-úGè&±œ¡´|™r?‘Z‘B¹Ag¸Âá*…\ž\.Ïj2A´U¡P‚©¨ß(—¤‡§o%½0ËÜ\œ‰á”–É[žtǺG’t/<ú#•5jµ=ªU- ÔÃsgÎ0> Ú*S,ÕˆÄSŒž:Ë};…Q¨ñÓ Ä#µ µHšññ¤àIÒL¨oŒ‰Á0¹K8~–¥Jš©©bå —²ÐyœS§Ç鯭073Ãü* O³Ã$ݲséåùÓ§™L‹´¨V*ÔM0>}†ú: £Ïžb¸?FP+QªÄúG95ýÝ¡Ö4»bÃL Ç¡Z£‰“?ÍÔÑyëºNpêÌ8éx˜J!O¡&98ÁéS'è:ŽL2=1H2 •bB©F$žflzÒ©ï$éaÒq„‰éq’Õ%fg.’)$2«œu$é^8ôË_þòÚýÞÉŸþô':::8|ø!˰¶Öø²T£IÐßÛIØúä-ÎÍ—‰ žáµzð{y’$I’VÍõ÷8a…ZlŒ×^=¹=#ƒ$éñ´ù%Ÿú÷±ù7Yï<3¥1^ÿÅ1:¼B’ôƒvõêUêõ:?þñïë~~Ø™I£ÈÂ¥E*DI “Š”YY,QÒ1%I’$I’$=$ª¬Ì/’ob,¥UZ!“mO(I’˜vnÒý,Ó§ ³¸Ba9Cž€H<Åðè#½FJ’$I’$IzHt`jªÂüÂEÎgZ‘8©±iÆwÒ\{Ù…­[­Äž|‘£Nk*IúŽ~ØÓßI’$I’$I’$=âÔôw¦<’$I’$I’$IjËPI’$I’$I’$Im*I’$I’$I’$©-C%I’$I’$I’$µe¨$I’$I’$I’¤¶ •$I’$I’$I’Ô–¡’$I’$I’$I’Ú2T’$I’$I’$IR[†J’$I’$I’$IjËPI’$I’$I’$Im*I’$I’$I’$©-C%I’$I’$I’$µe¨$I’$I’$I’¤¶ •$I’$I’$I’Ô–¡’$I’$I’$I’Ú2T’$I’$I’$IR[†J’$I’$I’$IjËPI’$I’$I’$Im*I’$I’$I’$©-C%I’$I’$I’$µe¨$I’$I’$I’¤¶ •$I’$I’$I’ÔÖ •:äÕ–$I’$I’$IºDó@B¥ h6›ÞQI’$I’$I’¤{¬Õjqøðý|H¨‰Dh6›üùÏæÚµkÞ]I’$I’$I’¤ïèÚµküùϦÙl‰DîûþBâ¤>L4¥V«Q¯× –$I’$I’$I’¾£C‡]Ï`ÄH¥Ðƒ:±Ã‡ó£ýÈ;,I’$I’$I’ô:ì%$I’$I’$IR;†J’$I’$I’$IjËPI’$I’$I’$Im*I’$I’$IÁš IDAT’$©-C%I’$I’$I’$µe¨$I’$I’$I’¤¶ •$I’$I’$I’Ô–¡’$I’$I’$I’Ú2T’$I’$I’$IR[†J’$I’$I’$IjËPI’$I’$I’$Im*I’$I’$I’$©-C%I’$I’$I’$µe¨$I’$I’$I’¤¶ •$I’$I’$I’Ô–¡’$I’$I’$I’Ú2T’$I’$I’$IR[†J’$I’$I’$IjËPI’$I’$I’$Im…î¤ñÕ«W©Õj\½z•k×®yõ$I’$I’$I’A‡âðáÃD">ؤ‡JW¯^¥Z­Axµ%I’$I’$I’a×®]£Z­F,8TªÕj„B!>Ì¡C‡¼Ò’$I’$I’$I°«W¯ÛÐ~ô£¶í*µZ-Âá°¡’$I’$I’$IÒc`7ïi6›jøN7n $I’$I’$I’ôèÛ}®Òµk×Ôþ°—L’$I’$I’$Ií*I’$I’$I’$©-C%I’$I’$I’$µe¨$I’$I’$I’¤¶ •$I’$I’$I’Ô–¡’$I’$I’$I’Ú2T’$I’$I’$IR[†J’$I’$I’$IjËPI’$I’$I’$Im*I’$I’$I’$©-C%I’$I’$I’$µe¨$I’$I’$I’¤¶ •$I’$I’$I’Ô–¡’$I’$I’$I’Ú2T’$I’$I’$IR[†J’$I’$I’$IjËPI’$I’$I’$Im*I’$I’$I’$©-C%I’$I’$I’$µe¨$I’$I’$I’¤¶ •$I’$I’$I’Ô–¡’$I’$I’$I’Ú2T’$I’$I’$IR[†J’$I’$I’$IjËPI’$I’$I’$Im*I’$I’$I’$©-C%I’$I’$I’$µe¨$I’$I’$I’¤¶ •$I’$I’$I’Ô–¡’$I’$I’$I’Ú2T’$I’$I’$IR[†J’$I’$I’$IjËPI’$I’$I’$Im*I’$I’$I’$©-C%I’$I’$I’$µe¨$I’$I’$I’¤¶ •$I’$I’$I’Ô–¡’$I’$I’$I’Ú =,²µö KËYJå*•ja"±±X‚ôÐ0}ÏÁÞÆæå78Ÿ©¤§ù‡—ú‰c–$I’$I’$IjçûÏ<š\ž»H&_ûÆ‚µJ‰Z¥D1¿Ârz’é—ŽÑå=“$I’$I’$Izà¾çP©É•Ìn !5:Îè`?Ý! I}³Dny‘Ål‰jnŽÙhœ3Ïu?Ô£Âñ!†+ɨ£”$I’$I’$IÒcãû}¦ÒVžÅÕÐ?y†—Ÿ=º(„èèêãÄ ÓœPYY¤X¸/hGï žáyž;æ˜*I’$I’$I’ôøø^C¥f5O H2”ê¼E«݃£¤ U"_mz×$I’$I’$I’°ïw†¶VƒÖέÛMG‚¡±Q€XxŸF[k\^Zb%_¤RkA&O18<ÌÐÑ}¦ËknðùÒ"ËùåJa"±8ýƒ#ŒöѺûö[Ÿ¼Å¹ù2Azšx©ï¦}××?eii™\¡L­bÉC##œè½9Tk~ùþu¶Hd𠯽¡øÁ‹+yʵ„#Ä“ŒŒp´+ôÝÎM’$I’$I’$é‚—^zéÿÎf}üÂ%æV«”fYH¼Æ ½7o§–›c8C§Nñü‘íÑLÍõË\šÉPhX\Z'ýB¡{u¬’$I’$I’$Iû8üý£“g˜HǨQʯ°07Ãù_ý ÿýßð»÷>âóõ­}×Þ\]`µArœé—OnJ¡NúN¾Ìéñ¥ÅE®4f…|±ôí†.!ºŽŽ2žŠ‡iTjÛ?¾Óöûjrei‰2@bœ3?¿qœ¡Ž޽x†©T¨‘]Ìó­3m¤&§¯J¡žŒÅ¶¯X¹º=…à=9VI’$I’$I’¤ý}ÿCVBÝéUÒcër«äò Å  Q)’«É­,Ę˜çØõgmRÈ–0©‘ºöÙt×À(©…‹ä% Uèëˆ-*…2õ#½{¦‚ëàÈËË?ÞtlwØ~?Í2¹ÂvØ“Iïsœô ɯP+­R®£sï­pšáþoÙŠD£@åÞ«$I’$I’$IÒ-<4ó …:{8z²‡£'êl®)äs¬®æ(Õ U^eîÍ­×~ÎñN Y¥PhP\¸ÈÛÁ~[mPimÿ·Öhݤ†â,.”©®Ìð«\‚ôÀ ©$‰Þ®}ž5t§í÷;„ ¥@ŒT|ÿ5B±‰`…|«B¹Gö6‹&ˆè.݃c•$I’$I’$Iº…‡ôá:tõåDïQN<7Îú'fçsÔZ®~©P«F­µÝºV.qûIÝZ4vÚvŸœfšyæòTk%rË%rËa⩆GF8Ös#‚¹ÓößÞum{z:"D·jÞ^VkQm4o¾-A˜à€Wí;«$I’$I’$IÒ-|¡ÒŸ¿›![ è›àd÷­¥ƒžãœ*¹°R£QÌSiöÑC°¶Ä{íUNvt¿ô|™¿=Ygý˹\žb±H©Ú œ_a.Ÿ#?u†—ŽvÞeûoÚM’Z´Z·ºâ;Ë€ ø.×ô»«$I’$I’$IÒþ¾ÇP©E­˜§PZiì6¡ÒöaFQ ì¦/¢a Q£\kB×þë7ëuZtt|sy=GNÐsäõÏYÎ̳\¬‘Ë,3Üÿ<=¡ïÒ~G8B¨P¥Rƒ}ç¡kT©4ÂÄÂ÷â–Üå±J’$I’$I’$ÝÂáïo×ÉåÅeÖ›·k[§”«lÿ5–Ü~ÆP(F*Ð Ÿ-³ßê͵w9ÿ«_ñ«óÖšÀæ'üö_óë·ÞáJýæ¶ÝGyn|˜(@­¼=µÞ¶ßOGœT  Êj~cß&[Å,%€H’Dä./ç½8VI’$I’$I’¤[øC¥=CCÄj+ÌÎ}r‹`©ÉÆå9.å@˜ôpÿÎ`Ÿ’ÃiÂ@cuŽ…o&)Í5–æ³Ô€Hjx‡iTªTË9– [ßÚÓf©°ýl¦HŒHpí÷ÕEz8@eqž¾q’ÍO˜Ïˆ Ýý¢{r¬’$I’$I’$Iûû~'Aë~–S%.Ìç©åç¹ð¯‹Äqb±Ñp‹F­J¥X TÛnIO0väÆüqGÆO˜ËWÉ^ÑŽ$Ãé0Å\ƒÂÜ9ÞÈ ’JƉ *…U²ù - >¼î„î°ý-t¦']y“År‰Å ç) ¤I%¢ÔJr«ªÑ!&GºïþZvÜ›c•$I’$I’$IÚÏ÷/t™³ÑÈdÈWjTJ*¥ÂÍ" GÆ9ÑKçM :96y2³Ì¯V¨VY.¬^_N 119Jßõªƒ#ÓŒµ.±¯RÉgYÎïÝ^ŒÔØ'»ï²ý­®r7ÏNŸ†¹K,jWW(Þ8L‰a&§ž£÷;Ý{t¬’$I’$I’$Iû8ôË_þòÚAþéO¢££ƒÃ‡ïߌyõÍ+‹ªµ*5¢Ä¢Q¢±ñž.:Ú¬ÛÜZ£P(Q©´b1bñÉžÎ[¦fÍÍ+JUªÕ­ B4#‘ì¥+toÚßò7®P(–©V[Oôßö8ïÆ½:VI’$I’$I’ôx»zõ*õzÿøÇmÛ>T¡’$I’$I’$I’œ; •Lˆ$I’$I’$I’Ô–¡’$I’$I’$I’Ú2T’$I’$I’$IR[†J’$I’$I’$IjËPI’$I’$I’$Im*I’$I’$I’$©-C%I’$I’$I’$µe¨$I’$I’$I’¤¶ •$I’$I’$I’Ô–¡’$I’$I’$I’Ú2T’$I’$I’$IR[†J’¤ÿ¿½ûÿjã¾÷<þ4#aÉ"¢|±…±q 88ÄÄ8¸äâ¥Ç-©S·Îu·çܽwÏÙ_î¿‘ýñî_ѳ½»½ÍÖŸ¸¡¥%eCCLŒ!!QÀÆÆ–-[±‚"!!¡Áûƒ° °Áçõ8'çÄÒð™Ï|fôžÏ|Þó™ÉHI%ÉȲ•+ŸŸŸ'‘H`š&óóó[VD"¡#ADD6Ûíf~~ž™™æææ0Mó™®ß0 òóó)..&/oåûJ‚Á v”ˆˆˆˆˆˆˆ|¯¹Ýî%ÿΕñ’lÆv6Û–%• ªÙl6ŠŠŠ¶¬.—‹;vè×"""ë’oÉ|*ÅãÜ»wùùy¾ûî;JJJp8†ñLëjš&±XŒï¾ûŽ]»v­zîÕ9QDDDDDDDž7ëÃYIeeå–oC¶c;›iË’J‰D›ÍFAAANP‹eK[""²MÝ¿Ÿ±3òÙgÃìß_ËÌÌ %%%oIU तàa]tN‘ï…uŒáäªlÇv6Ó–%•R©Ô– ª­$//Oh""²nó °›KÍ­øýgŸ ?üÿd2‰ÓéÜò:ñí·ßêœ("""""""ßëÃÉu™Æv6Ó–Ý¿_Ö‘ïWçe~>'’5†a<ó÷9‰ˆˆˆˆˆˆˆÈÆØÊ±݆,"""""""""""")©$"""""""""""")©$"""""""""""")©$"""""""""""")©$""""""""""""=I¥D"×ë%‘HhŠˆÈó'v“‹»Àõ˜šBDDDDDDDD¶Že»o@"‘à³Ï>#‹‰DxõÕWÉÏÏßÚJÍ\¦§oš#?mÆi,úܼÇõ¡O½5Å\¾“ÊÆ£Ù»CÇ¡ˆˆ¬&v“ßý3—cÀ8?yëÇì-ÊõJÏr½ç\ ¯ü­ûõ·8^þtg?sêþøûùk”­TÔ¬ž?yÙóÓNꋟ¤üAþøÑÇ~þ£•Ëß`ë]ß’åç®Òó§+ìûi'û‹Õ¦"""""""9%5ÍÍ/‡øüëëÜžNVg%û_z™æ+)bš›×§)­­¤hlζN*-N(¤R)æçç·¶RÉ0W‡¼„Í=Ë¿ p©—K7/kgçÌ.]êå“üŸñ£*«~X""²23FüÁDÜØUþú.Û$±ÆŽÐvÈÉò³\~‘2 *ÏIuí>œùj ‘œ›àÃ÷z¹<½øC“dø&_÷ßäëÏ÷ò¢í&—ïþ€7öVR´ 26Û6©´<¡”ŸŸÏáÇ)((Ø¢™„GþBÏ•™ô? —} 0vsžÊ×ðb¹(åhðôßf¶jïc‹‹ˆˆPRlj4éþ¿ýÜ6ÙV‰¥¼ÂJNÍÈÝlÖR^.üñ”VVR¹g{ªÊ’J9ܦ"""""""ÏÐJã8ycðólÛ%•ŠŠŠxå•Wøì³ÏH&“Äb1†‡‡9|øpN'–ŒB;ùf”ÙEY$sn–y£ˆ¢|ˆ""ÏS‡d³J¾ûW.?˜¬kTÒú4:s÷TžWXB©Ó¹òÍ&`äå­rkÅl€ÁÞ¸•÷ª÷zØßt€ý—ûødÍé½yé¦É[a]…ûx½½~Q’À ¿Âëݰlê¶Ö¶m&kMoqà®ÿíÛÜú¼ÑáJŽvþ9ܦ"""""""ÏØ¦Žã¤nó×ÿù>×=ᮬýŸùeÝÒ[ƒ×ÿÌÿúëMÌ²Žœ}ÍÊ#ÛLqq1¯¼ò ùùélL<gxx˜D"‘³u6JÊqæfèÁýå&Ó¾¦³Ššª$"òÜuH6Ô6L(=­ä]/7’Õ´Ÿøšë÷Rî,&oÎd~ñBfß´¹èŸ7‰˜E¸‹—žXóòg#ÌZ‹).NÿW8{•¡³¦A±»3äãQQ&aóiê¶z`ë[ßò³/›"¿ÌËM¯Ññ³ö·¿;›Óm*""""""²6egá:8¹ø•I{Ú8¾YÊ(q“þ›˜@å+Ù.¯ÌÎÛ®;»¸¸˜Ã‡?–Xš›ËÑ7YËi¨Îçöð¾©{„}#\¼{*—½øZDDd‘ØÍm›PšŸ 355õØá™Ì©£°ˆü¹7affï¸ü oÏa&¦Ó³~˜ãÆÅO¸˜bÊ™O.\cîì]öªE£´žú’).}8ÈõÀw}_ðñ…q"…¥Pì©Ç=ƒ>Ã?5Eàò%.Þ˜}ʺ­Ñ‡YçúÖ³|ÓܽÈðÕSá»ø¯Œq{¶Gq~N·©ˆˆˆˆˆˆÈóÌœºÁøõo‰¥R¤Ó|{ý"þßÓã=Î^Û_´m¶e[ßâü ±ô ™”J¥˜ŸŸÏÑÚZ)knçÈЧ|Þ÷æòTéàH¹U¿(Y£×#þ`"î6›¡d~3Lß7ž¿§ƒŸ^ûo²&Žì»Àð…®Å”V¿Ä±cù\º8Ì…«n:JÁ(>À‘ºY¼—zù|®gåa:ŽTñø™u'õÇÛap˜‘n0gRZ}”ö¦Òô£ù ÷òz‡É¥K^.öŽ’ïÜCñF®|2õDu;±7Cìs}ëYÞZÞ̱ºA†?ÿˆ^ŒÂRvi§¹ÔÀ wÛTDDDDDDäyd”½Èžøe®OßäóÞ›|¾|çyãÍ&^ØF™šo¿ýöýl¼wïäåmÌä¦{÷î±k×® )kff†ññqêêê(..^÷ßÊËË7lÛDDäûcÞLOñ˜K­EÉþ=”0Íͯ‡øüëëܧ_cuV²÷‡/ÓüÃ=”<áPÏjc;OÔ6óó$ vîÜ™qÙçâe f,‰ˆˆ<,Î~òË5„ˆˆˆˆˆˆˆÈ¶PDe݃GÚ•°§ñ8{Ÿ-ÓmÈ""""""""""""’‘’J""""""""""""’‘’J""""""""""""’‘’J""""""""""""’‘’J""""""""""""’‘’J""""""""""""’Ñ–%•vìØÁýû÷µDDäûsÒÍËc~~~Ëëaš&†ah‡ˆˆˆˆˆˆˆˆlC[9¶cÙª¶X,ÌÎÎb³ÙtˆˆÈ¶øæ®^ȸœÕjeff†’’’-­o,#??_;NDDDDDDD¾W²ÃÉu[9¶³e3• H$ÌÎÎæÄ]Û"""›Ý)..fff†ééiLÓ|æu5M“ééifff(..ÖΑïç!¡” c;[6S)//ââb‰‰DbËK@@¿*y"û÷×f}îÛµk333|ûí·Ï<±dùùùìÚµ‹¼¼<EDDDDDDä{%Û1œ•ܾ}{ËëŸíØÎf²leäååéñw""ò½’——·å¿[‹ÛíÖNYDã%ä© DDDDDDDDDDDD$%•DDDDDDDDDDDD$#%•DDDDDDDDDDDD$#%•DDDDDDDDDDrÍôW¼÷‡ L¥–}ž så£÷ùýoÃoÿ^ “Ê•:Ç®ñÞoßå‹i€wƾàJ8•Ûíã½ß¾ËØôv?`6¢½—•±¥m“cÇÏÓÛ¹ü»]'%•DDDDDDDDDDrIbбBæc_p«¿‹~ŸÆŽN:šìú»è»‘ÈÁˆãaüñÈ-†‹Ú†:\Öí~ÐlD{/+cKÛ&—ŸõÖm;ýn3³(B‹ˆˆˆˆˆˆˆˆˆä‚SÏqÞMÿÓ¶ì넟ÑIω6î.Ü´Þ¡{ÔG¬úEjÀõ+(ãà«ejµÍæyÎ~·ÆñãÇÿ{VÛH`±Xرc‡‘ —‡Õåaÿ‹uì/¾Ã• º†=-èéããKÃŒN˜uT±{g>Lñî;³ã@=/ä§W{ÿøÔ¿@þÜwŒ{ìúaßœ?ÇHô>±£x£U4Tpoµr—KÜàýßõ1çL2Òûÿd”Ɉ çw\úà/ô}|‰/'£ØwW³«`áO¦Æèïù€¿\bxÄËdJ«~@±b7þÆÿ9?ýÀ~våÓc¼ÿÎ|Sv€jc’÷þ£öýXçz3µÇlÇÚVÛ73|ñ‡åí]ÌÜmòø±±‹¹ÿ´´ ÷mþ¸¼mJaüïÿ¾ùr2‚­b7¥…é/¾ÆÇü…¾‡ùÚ?C‘å*ùà*êv?<†—ìæUë^q{òröØ.fæ«wù]×uÜعl[×ý»Ý÷ïßÇ4M ²ˆR""""""""""’,E%8NöÇŸ9fÆ#$ ;6ãÑg†ÍŽaF‰'W)ÐŒ0Ò? µ-´ÔÚiÆzºIVÑÚyŠ“'±èê½F HM ÑÓïÃÚÐNçÉ´–Çñöösk]Oêrrèôiíîö_ó_^/ƒõ–k†ŠPÛ~ŠÓ5˜“}œ;?еñ§OµQŸ``änú½4©» v°7ÒÞy’ÎŽF!zG¦HEÕ­´¸ Þ"AŒkƒD©; tõá·5Òq²“¶š8ƒý“ÄWݘµêçÌ\—:¶-€ÕUGCC ö•ªù$¿Û\ŽQ Ó""""""""""¹Ï4MÌ5¢++IDAT°ZY’n2¬ÀêcÓ&Ö†?X@jj”‘H9íg^ew@)®ög»¼bûðÄ#Ä 7-µÕT.öš(vc•}8ò¼ð‡ë.× ª¥…}¥PÚ@coyÍÕ¥XpÐP3Èd(Ž X°RÕÔF]íÊ \“£tG´JÚZ?×OÿE`mgvSðÔëÍÆ–·V.oïŒmòø±±¸Î«q4µqhwऱÉw(Dœ}˜¾!&©åDûA*,@Ymwè ®VR†úY2×%gŽm  â G+6òw›»”TÙ Àdré@´™Äd­¡wåå^Δ ‰'Côüî7Ë–³JÂ>w#uönzßù=nOM 5ž Jžr$Ù²Þr ûƒ´Íe{8 m‹¶Øâd_ÁÝÀ¾  ýøIð,*¯¤ž¶æqÎ ¨j?CuÁ¬7«¶qå­« ³i“eÇFf6Ü.ë¢ãñÁq—"ê`:q=¬K.VK*eU¿ÌõÉ…c{s~·¹KI%‘mÀ°9°š⋦µ˜É8¦ag…§å-ü‘ÍX4 l¶:Nt6âX2¢m`-¨àè[ÿBÃ>ŸÉÁn†<´Ÿþ1ûV(Þ4MÌl*_°F¹EOÙ0±[|ÔÕäQEmm u- Ôy»é[2ŠŸ"‰&ÑPœÔ¾¢MϺ=žÄzÚ0›6Y~ld< cƒZ-«}–¹>9qloÆï6‡éJ""""""""""Û€ÅQ…‹“Á/I™ bº<8²ë·º\Xã!âÖJJÒÿÙâã NOAìÖ§\ø"ˆµbçÍ3'©3|ŒbéLóáH{‚H šÕz3–û&’µtžú Ç`w©#¹4!š¢oÂFck-Io?ãÓ´Sž°=žÄzÚ0›6ÙÀ#{¹">B©GmòEžjŸ­×VÛÏâw›K”TÙ ªhªµâäÚÝ0S×雀š&ÙNö±”5ÒèÒßýWnÝåεOéí%dsc·€A„‰¡>Ænqwê7¼£øâ6\v+XíØÞ‘+Ü ‡¹36À@`õ4€“d4B,‘¡Ü§dØìX“A&ýSLÇÂÜúª>_3!žRSŒôc4´ÑTßBkU”¡þ+ ´gsÚüü<‰D‚;wf\V"‘-—àΨwƒ›í÷ª(Þþ^Æî2ˆ¾5ÂÀxw]¹JÏ‹š@DDDDDDDDDDd«PñêQ*¶cÕKêéèˆÐ?ØÍÙÃæÂÓÒIë"íÖ猒J"""""""""""òTJªòFõQ5ÄsN¿‘Œ”T‘Œ”T‘Œ”T‘Œ”T‘Œ”T‘Œ”T‘Œ”T‘Œ”T‘Œ”T‘Œ”T‘Œ”T‘Œ”T‘Œ,9_ÃÄW††ðúƒ„¢I¬vîªFZZöá\«ö±+¼÷N?!k-'ý:eÙlé³ú› ºõgþ½'€QÕÉ?ý¤âñ9ýïž"B9'þå vs‡¿ý®Ÿ¹t1Ãæ ª¡•ÖC­¸}wøjh¯/D4ibظÊëhi=HY~@"ß ËãIŽž92ÆE‘M BS\8{žñ¸•Ú“¿æõ2E!‘Çcå]>z§‹‰äÊ_ÛOó«WO¿ž-ºNÙnñ25u‘³ç½Ä-œyë %›Su½.ò|ÉíßðôþÖÕ/þè£d4„¼s~?'_§ºh•¿5¬Ø6’VF¶ë{“šââÙóxãšÏ¼Å¡’g߬†Õ†Õ3'àê&n=Ûõ%À.vuãØìvÌh„àä ]þ 'Îg·K"òÜtÚ·>>‹ˆ(N‰È÷†Õ†mÉE´ÃnlLÙOrm¯."ßÇx)"òr8©ãJÿBBÉQGljªK,¤¦¯1ÐÝÇDt‚¾~¿þI5+æ5 ªùñ[Õë[å³ú›-e§áä¯HßÌâîÅsty£½>¦ë—Þ‘ Ž2ì œ<}4}'Bâ.Ÿvu1™dÈ×ÂîEú‰ˆˆˆˆˆÈ:بë<ñÒM’Øv×é""[/EDž@îF¤é Fš;ŽQ½í°”죵#H༗¨_¬šæÂ£™lut4ÃèH÷øË…¥S3c·ø´¯?ŽÕ]KK]”þ~?FÍI~}¼ ËòéœñGå¶7&$·âªm¡½õ@úñ{+L¾ñ)Cãø#IÀŠ£ªŽ–¶WÙ]æ‹sçñÆ" ýßD’š¾Æ`ÿ“(IÆ»¦‰ÖÖzž3b7¸Ø7Èx Šáª¡©ÖÜÝïò¸0¼QÌd”djéa&“˜† ëÃÎyí8BI¬®…»"SŒ 0ê MØ\U44·rhw:á´ÒTÚØ•÷x§?„õAÛO¯°;NqÔä‹A¼þqs¡-[_e÷Âñ±ÝDdSÄn}JÿàBœ3l¸ªhi=DEQæï³Š Ùü¾Ÿ .>I|ÙÐ.îªq(SüÌ>NeŠÑ™âëšßOgÑ?yš89ö>g‚`«ãä™c¸"9wÞKͧOÑ`-ô%h-22$iuáij£­¾4}I»ÆµýâëÍf«oÍx˜)žª¯)"[0³ë—eê`Fñ_x嘺‚­Ç‘\‘—«K„|D Ô,{D¨¥´Ž{º36J=ú">I_ÿ8ÁèJ óEw£þ(¦Õ†5:N_¿Ÿ¬BZ|œ¾A?IÃ’„&ú韘^yÙðWôöŽâ˜Ø]n\ö$ÿ(=½WˆaÇÓÒL¹`ÅÓÒFƒÃ±kôžëc<ÄVî¡Êž$81Àùî1¦!ýºó½xQL«[|’ÁÁà´rŠ/”n› Û²3E«7@dˆsÿþ{ÞÿÛ>»FÈ(çÀT—@jŠO»Î30$Š ·ÛF<äc¨çÞJ¬¿J‹÷áü·\8ßÍ/DÒîÆm7ÓmÙý)S)2·›ˆlÖ•>==£ø#à(/ÇmKò ÑÝûUú·—éûllF\|’ø,"²‘ÖŒC™âg–q*S Î_³í_­§,"²%µm4;Òqfpâ.“ƒã¤ ÑNÃâÌuÄËÀDG¹k<ÄäÀyz®Å²¿ÞL\_;Þ­·O«¾¦ˆl•µúe™úŸD½ ŒG0ì6ˆ‡˜èZ=¦nÙ8¦ˆäŠœíÅ$ã éë¢Y2YqXL’É¥i¡òÖ“´Õ¸°š“t-ú‹ˆl¤LqȺfü´d§2Åh3C|­õeè_ë<.Îøùg|ÉgZϼE}‰“†öFÆÏè&ˆ ¶:Ú›Ów̧-ß|ꇜ·þÆÙ¡ ÂûáÌâz3>~žókÄ»¦èÚñ´Ä¢¾¦ˆlq¼$s¿ÌÌ›\˰Qwò ÇÊ,Ä®ý•³}~#+ÇÔ͸^‘í%g¯ù¬Þ@—Œ“„eïMJY˜Œdµ.z1ÕCSmE`Y2=êOÏȱyjqYJ¨it3ЛEVÉVNùÂ(¨Ýe"˜«Ìq*¨8FGë5ÆÇ‡èy/D0Í0*EÔI×q´‹wF—ÔšP4AÄŸŽºŽ†š…©«Nj\ ö?Y46“qâÛÌEMs­Õ+÷h‹*rü9žŠ1 ˜œ`|ÂO$2A¿‡7\ íZS·Ð®PâiÀ5ÐO( ’ªOÏvÊzÇ?Ú‡á`º]ìUU ïz*¡þÿmᤙâÖÐZí–BÏ_Ù¤‡«Õ/:J÷;£Xåx‹ˆl¬Lq(c|Í@3”‘âV†øºvüMcýýc‘•¯³í,yϼáàÁå½¥´‰öº ºÆã€•š¶f{RœÝƒgᚯÀ]‡ ¨Ÿhb¤ÒÃëÍ¡ ñ.cLV_SD¶:^š™ûeYÇ&[ u {EU ”ãÇñy,¦>ûqLÉ=9;ê^àðà H$âÅ7]ÏÁ’Eákj‚É(€ Ëò(ˆVŒKKašé… ÃX´ÑƆ×;qç#ÎuO7xêêhmˆ3ÚïM?ÊoEB¹«¹ƒf×’³6·9¹‘5´ÓxúWYÍâ‰Ýc"˜Äꮥ¾¢ˆÒŠ}”V죮æCÞéž$ 2ëZ«„'èB?܇)L3»²Wn7%”D6MÑ>~ük7w&ÆŸœÄ01`b|’öÓ?f_†ï=W°9qqýñYDä÷3Å×l¦¯YFÛÃä+ÇWÞx´jÿ*©ý("ÁF݉Ók¼xÞ|x ¬rmhb>|/°™ÝUèÃëÍ,®' 2õyÕב-Ž—YïF?Ï3EdÂGú‰müøè!jÉG³‚–a »Û@2é |÷nvïv`†|øü!’X°W¥37‘qáTú¬áÙýøCCC ôðèõH)¢¡Hz<Áê`g¹ ˆONðàõVÓ>oú1Ž*ì°Fú|_hû /šÅ>K·KÔç'¼p¶{ÿ·üæ7à”‘¡ÝDd³L_»È‡ý#ãWü×:IƒHðES¿Ï6#.>I|y¶ýÄLñ3›8µv™úOê_‰HnDÌ»CôM¤_(oÄ×?Àc¯ìú˜X¸ù¼®AY=V.s¼Ë>&«¯)"Û·ÿùP|iL ØWŠ©9<Ž)"ÏLOç(â@{¾®~|!/=g½K¿¶×ÒÞVM¶!.¨j¢ÖÚÍDt”óg}8ˆ‰o|sZ6 Ihà<ïMÚˆ–]€[ lV Å;xGëQªëq=OW¨ [<€?”Ä(o¥±Š< u rîìø&Õ}…=ài¡ÁÑ…72NÏï&±;l˜ÑÈÂ{˜lÔµxp¸]4Ø}ŒF½t PnOFµ-µéÇÖÙÊq£D“týÎïrʰÏʶ;2Èù?Lâ"D0j‚£†‡g†v‘ÍaµFñOú˜œô1QîÆnFðGÃÇnÁš\û{ŒÌ1Á¹áqñ ãs‰ö·ˆ¬W’‰ž³ø—Ü´é¢ùäOpgˆC™âk6q*S™âkI¦þ•2K"²!âŒwŸÅ·ìnx«»•Îv;£}ãÄò¶N|]ôú&éjà̱²EKGñv½ƒÏaÄ11¨j®%ÛWëfЇc²úš"²Õñ²%Óßf›–ÅT¿ÃJ4MÇÔ–•cª3GÇ1EäÙÉËéÚ•àǧOÑZ[ŽcáKV»‹ªº6NŸ~ê¢u”e© õdµ.FÞÇÐÔ¢¸çh¤­ÑÑ8¦ÍEMëI:Ö3H!ÞeŽÉêkŠÈVÆËìîôÉ›Øki¬±D3ÇÔ\Ç‘gfÇÛo¿}?›ïÝ»GAAyyyÛsKcw¹ŒcÚÜT•abWÞãþ¶ºSœ9VŠÞÂ#""""""’»RS9{ÞKÜÑ™·*á-"""²æççI$ìܹ3ã²ßŸHvÎlódÓÛœso:sß-3ݰ“-LhW€IÁ'™NÁ%Y1³–¦ÿ=×ãéûL?î\ωˆˆˆ¬E3v¦˜2ƒLÓŸ›-8¤L"""²X .‰ˆˆÈŠXH`)ógxx˜D"A*•R#ŠˆˆˆdÁh4b6›ÉÍÍd7W*=˜DDD$ .‰ˆˆÈ’šoÆÐBK·oߦ¬¬Œ}ûöQQQ¡ÆÉÂÅ‹ùÝï~ÇçŸÎúõëgÜf¡k5)è$"""™\‘e7ßZIã?étzâïX,Æ_ýÕ_ÑÐРY€ŠŠ ***8~ü8ï¿ÿ>V«•œœ Ôí¦ÏVšk­&‘L5ˆˆˆ¬†é³”2KÃÃÔ••)°$"""r>ÌÃ?Ìððð]÷[Ó×¶Y—DDDdÉÌ481Ó¬¥¹~Òé4‰D‚}ûö©AEDDDîÑw¾ó‰ÄD`i¶Ó\3Íçº×‘¯'¥Å‘U3W€Ik,‰ˆˆˆÜ»ŠŠŠ)¥ñ{°qJ'"""‹¡à’ˆˆˆ¬˜Ù¾›TJ§Ój(‘%6~e0&îÃÆ×Wʤ`“ˆˆˆdCiñDDDdÙÌ—Ve®”,""""²´÷eÙÞ{Íu'"""š¹$"""+d¾YK™³—DDDDdi¥Ó鉙J™÷bš½$"""‹¡™K"""²*¦lŒ§ÄÓ7dEDDD–çÞk¦µ—tï%"""‹¡™K"""²â21”ODDDdeî¿ÆL㳕Æg(eþ-"÷§þ1Þ;ÿ9wIe{‘9 Ö™Mì«~ç&ë²GÁ%YÓƒB³åêŸ+%žÒ≈ˆˆ,éiñ2¦›ÆïÕæz^DVNÿ'?ô‘cÌ%ÇdÁ ÷ ˆÌed„¡á$'?ôqpWɲ˜”ODDDVà¾æîµ–fzM3—DDDD–ÿ~lú=×L_þ‘ûÇ{ç? ,M À’ˆÌ''‡S.9ïÿ|ÙN£à’ˆˆˆ¬Š™‚MÌѽ—ˆL‹“c0ª!DdArŒ&î$’Ëv|—DDDdEÍ4k)óo pˆˆˆˆ,Ï=ØL÷^3Ý£‰È}÷ÖŒ%Y¸œœe]z@Á%Y…ÿÌšODDDD–÷l¶/ûˆˆˆˆdKÁ%Y13 \LNƒ""""Ë–Í}™ˆˆˆÈl\‘U3SJ< jˆˆˆˆ,Ï}×L©ñDDDDCÁ%YÌÑ=™ˆˆˆ¬M .‰ˆˆÈ²™i‘è¹òükæ’ˆˆˆÈòÝ—e{?6Ó½œˆˆˆH&—DDDä¾ Á Ýs‰ˆˆÈÚ à’ˆˆˆ<ü¿>ÀŽOð³Kñ™7½ÃS;vP÷“NâKrÆ8]/5²£ñ%ºâjÿû›®•ˆˆˆˆÈšc´PùÍ­|ïÏåÙ=¥<]»•=[-˜—ì\.;Þ¼œÑ‡¹8Ôð0å–ը촲Üoró9Ôð0Û-KÙN÷SûKvWLDDDd•蛳£FaÏðnTm!""òµ“ޏÉðÔ'‰ßà«xZ÷b""ûëÜÔåã÷ pêü—œ»>‚Ëëæ»š1.ÉIŒl-ÞL¹m,¸‘ŽÓÛw“pr5*<­,÷õ¿cKÕN÷SûK6Lj‘U"øiŸGG0ǶQþÈFrøWW¸x%BÊ%]QJ¾µ-"_k<=„ûNˆãÂãq÷¯¹ss䱇ð\ý_j‰O›ŠÓ}E©V­Ôþ÷=—DDDdÙ-ä[±ú­ˆˆˆ|m¤†¸½÷I„?¥Ç°R[ˆÞ+R©Ñ;I ,÷>|³Ðû±œœ]¹?äZÙîÿù[“¥1ÑÞ7X2©Ñmk+»)Ëp‚¾/B´]‰0®ç`ýf|]7q<²‰’¹¤nGéø$Hï‰íµÅTç•òt¿¹læ`Ý&zþósz’sí;– |ïÏ6Òu¶ž±©¨V—›ïo¹É¿~tkìü*+ ©ÞlÁjL2Ðÿí—î®äÞ]–ž8©¹ê6óú ÔWlÆc3a"Eäú Î\ŒLqCG¾™¢ý³¶?b£(/Mèú Ú.Þ$œÅëS‹kãÐx;ÅËzj+ ðnÊÅ¿ƒÏ7@û—äæ,SîÜí¿—k«1†å¢´x""""ÑwyfÇžy×O×ñWxîp#;vÔñÄS/ð‹³¡iÇñ¿3¾Íž8ü¯ï&|×Aãøß}?AãŽìØQGãáxí]ÿØ:O!Ž?µƒ'_ïºùé_ì ñ¥®‰5 âwyí…§8P7ºïϼě¡¥­Çœå?fÇöw°cÇêóÂ/Έg»M€ã‡w°£ñ•Œ5Ž¢œ}¡Ž;vpøÍÀäqBÇïZ +Úõ&/=sx´Œxê…×xwÊɼyxu/œ%téM^8°ƒ‡ß$° k%""² r7óèc³a,Ž“¸þ)¯Ü`4‰M–óÈF}/XD¾ÞŒyë±3Œ?:CªÐTßµ(aÀ`¡~§‹rà íNË¥f·‹C^ËdÚ<£…š²õD> ðoýôb£ñ±õ˜æÂ‡W9?”f û3ŽöĹk"Ô¬ûfÃDyõjL1ÚÿësÞ>ƒ¨½ƒUùXïÚv†²dS·L µâºsƒÓ÷ÑòÉ "öš™L!h̳³§ÄˆïÓ/hù$ÂІ‡8ø­ÉòÌ÷:³œ·~‡“’t„Óøœß6Œ»b+ › ó”ižö¿§k+ËEÁ%‘ þ£ÏñÃW;ˆ—5qäP-Ž@Gü^xg<§ëµ§xòï[è,£éÐj=QZ_}Ž—Î N9VàÍòäOÑi©áÀÓÏs¤¹×`Ç~ú ¯vÆ /ÿ/79'GþáŸøÅ³,@¼ëüð;?åX—™ªÃOóô‘FœþV~þÜ“¼t&´õȦ|Þ|ᇼz¢ sU3GŽ¢Ö¦ãèßñÜë—Æ@ómã¢¦Ñ ƒtö7c€3½ ®¶v1¾ÜT´÷ ½@Õ/ ôîO8ðßÓê·QwäiŽ4zˆwã§ßù!¿¸45EB"ÜÊß?÷s:ñR[ãÁ¼€k%""²Z y…”V¸™º¬†»§œ’͹j “ i†æI{g¶oÆk¢í“0¾H‚@0Ä{—î`un¢(c<òY _ ºÍ…ÏîÀ:ËhÀd"v5ûL—Y÷‡qý&j¬Cœþ$ŒÿV‚àW7iûãM;Ι>ê§•%ÛºeàÚg´^¼‰?'ºÉù¯R˜ó2CQ)| ;'ŠÐÚu“ĦÍGË«¿äéÚ—&ν¨zز+3ïÇ‘_ñæOÊÝì)~ýÔ3üº³ƒ~Êðd±³±ÇÑœé ñŒ§ÂÝt†Áá€po½ñ'¨±Äñ·v^š+mïâõWÛÌoâŸÞùucUyþ™7ùá“?çè«­ùõ Æ+ÝÛBøùáߟ+Cà8?ÎêZ‰ˆˆ¬®tj˜ä”±´4©Tš4úV°ˆé4qLäÉ@ŒËÁšg˜ƘoÆt'BpxòÕØÍA¢Æ lÎ…@ I0cT2ÍØlÑl,~_‹mÖ\ ûJ§½2ŒÃ¾á¹÷·ÎW·éK¥‡ñF(´Û¨´¯ÃµÑÊÖMF¸ž¹Q‚«ÑÉ|Rƒ· §l¸órèIÏýz÷í™J™ƒÍž‹éέŒÔyi—ûÿŠãüeZdýïùÚÊbèEDDD$Såó<;Í êxþ/ žåœPç;ôb¦á'ÏL î<ñGœ™* ùWÿοÿ.#pĉɿg+Cà ǯ‚³ù0^¢D£c?x9rÄ áN:Ã÷V¬Ëgv`Â]­tNüÅÃ3ožáÌ›ÏàÉr‹÷ *ÍÐÛÚKˆö¶r/O?[‰.Îö„éì„âfj A(~öù‰À€Ås€çÌÐ}œÎhFÍ üäÈxp‹\+‘Õ“Žõó韾dhʳ#Dû.r98DZM$"_s©Û1¢äâ±Í0”m\ÏžÚbö8²æNJ/r žîk4äLÎì0ñ›œêðsì?2®q~h-×JÃ.ÍÛò±'ïÐÓà½þ$sOþ™,ë¢^{-=2sPgQeZ¾ë#÷N3—DDDD28ª¼Ø¦?WY‰ƒ^üA½aÀC£wúVNê¼fŽvN>c±˜‰våLW']ݽôvuÒÝŸÛzvñðèš@ƒGÿš¿8:c)ñGã€e‘õH@•%»ò4òâßÖðÜÏòãï%¿¸†ººššš¨­*-A6ÛX¼¨‚¶Þ3øã5pæ8SW뢅Wéè ñB~g®‚óé:\@4|•0ùÔ”9¦ÕƧΠmazÃðÄxE58'š$¾ k%""²*†C\îù‚ñ/€¯ßRÁ£ù!>½ä#ÜúüO|f©¢Dë.‰È×ú³2Æ…°wÛ& ? ̈ºÛŠì¸ˆóÁÍ4±d‚äº| so›ábݘ-•à«a g™ËiÌÁ8x1`ß4ùÙŒ·XÈK&é+›qƒƒ¦â$¼IbžoÄç©Û4æM›)3Ýâíÿ޵W.Sδõ™ÌÛrðGF2Æü|Æ]C#;Ïë3a(’„¢õ ŒŸ÷›Óþ’·ÃÙ”i‘õÏÑÛd5èîDDDDPf ‰Ù^O,â˜#X²N¥åì+Oñã–~È÷ÒÐÔÄáŸ<Ã+ž¯<ùSæœx4V´âçÿ‘—ªl3ÖÍé±ÜCÛŒÎ.Ê®|Êžzƒw›.ÑÑÖÊ™3tû9­Ç~޳éùÕÏ)Èj•Í^øûN:ûû1w ’_ÕˆÓe£Ö ÇÎôò´ÒK>MÎÅ]"‹%#Óe×JDDd•änä¡Í&n…“ä}ã1¶9­˜x˜²m)z> “0o¦p½†nDäë.…ïâuÊÿ¬ˆïîÊåüÕAúïÀÆ‚To]GôóÏéCj8‚/¹…†J)_”غ Ô–­#Ú÷9iÈ&ŠÇ€e].VcœØBŠ˜LM™©zÔÆWþ;°i3õvÜ«Á­œ¿]Lãã…ðéMMùlß¶ Çõ>¢é,Ê™§nÓ[,1LKÙ¦•¥wauKEB´]sRÿ­‡©J 3Цõ“4ß,dŸkˆ“·€Ôm>ø,My¹›:KŠÈõë´\$ÆX¬fŽ×go‡!Úþð%õìÛñ¦á8—ÿôí‘4)æ.Ó‰ks´ÿ=_[YºE‘’­æ0•tÓùꫜ©ù/F;yý¥qr iZ‚ºî×ùeg#/¯W=Ëë¯÷‚¹f¯…ç¼¼JÛkǹT3¹–OèÌ/8ÞäÿßÇOpÕOIO:{œ^À‘ˆÏ^xW#Î×9úË×x§é«DÏòêsG«ãoùÝ5s7À<õˆû³+_¼ë5~øã<ȉ¶Áñšg´¤†ië¤meæhÿ{½¶²\‘SA¯¼ØÂS¯¶òwyom^§™D¿ŸÎŽÑ5¼OÿŒg˦M2G9ñÜ“\mj¢2?Lgk+݃fj^üÉhpÃÖÌ‹O¿É¾Î_?ÙAsc%æp­­½XœfÇî}-ž&êò[h}õïøYô05¶(½Ç9vf3Ðö8­M/p Ê†Ùlz9ñËãÐÔÀUžyå­ÏàïŸÁ`±ª!DdÁÒñ³ÿ[Ërìjä:袽ý¾È,Ëx¥R$¢aú¢aú|ݜÆggõÕ.ôñ,"+ôAÅ'ZèÉLÅ”Š2¤ÕEDDDDDDDDdx@‚KqúζÐÚfaã³QüçZðû*in®ÃeQ‡‘åíiŸX2Û°Ûll4«mDDDDDDDDDdmx‚KqΞäTwdʳF›‹’òm”8ØlVòHDˆDÃ\ëé¦7›Ü8ÜMˉ͇v+À$"Ë(FÀ7ùYeõîçP£ûyVŒÆ`Áª “ˆˆˆˆˆˆˆˆˆÜgÖxp)I¤ë-™%£ƒò†jK Åj£7¥eÕÔ†.qît=ã»F{hm÷pd¯Å—Ddy$ˆ$Æÿ¶R\éœ!%§ Wãþ{£ZKdÅÙžà×xBõ™‡a->馵#8™ Ïì¦áðAvÏXšÎRPÆîC‡Øé˜|.ákç|(©^!"+ÀˆÙdR3ˆˆˆˆˆˆˆÈÜrr`dDí " 32BŽaùB@k8¸Ã×~ŽÉ9Kv¶7ï£Ì¾€ÁZSÕMõN<¥çB…—DDDDDDDDDä~`µä2’Òˆ¥ˆ,ÌH*Ižyù¾Ü¾f¿6Ÿ uñq`ò±mûj Q›—Þs´ôŽæªJôõNº(Z‚–IÆBôÂD‡†H`&ßfÇîpP`Sâ½è 28D#yùvn7Ä%H‹„‰D¢D¢ƒ$È#ßnÃnw`·Yüæ^–þÐ× <˜À\è¥Âe]ššG¸6&:˜ e4“o/Äå,ÀjZîr&‰…ú „£ EImäåÙp¸œXïïS}‰ˆˆˆˆˆˆ¬Mûªæä‡>HBŽÑ4:“IDd6##Œ¤’Œ¤“ì«.Y¶Ó¬ÑàR’HϧD'»øvUÁ"+c¢°º–íÆ £R÷Ö2ñÐ%εDO06ãëæB/5;k(wÙ¦&Nß©ßpªo,ÑŸ«‰§›=3¯9ϱ·ÎM¶½–#ß«Â6c.Órô4ã±8WÓÓ4{æP^Ár8zyëXÇØ 4õGSa›çê|À¿žì!6ví÷ü ™Òé±€X€óímœóGg<†ÍSËž†*k²ÿÇtuÐqÎG85Ë&67Ûëë©qÛæíʋﯓïÇÐÙåDw 0Srðì-2õŸáÔû½DÆÊhö:ñº¬Ù¿µb—8þ›6ÂŽ~p¸ k¬O·q!0SY­¸*ë©ßéaæ Œ÷RÎ8¡Kçhïè!˜`–v*§¶~'e3D.ã—ßæèéà´g£\xë—\Àˆ§ùiš\& Iàý£´øF ä¨ÿ‡+¬«ðy$"""""""÷ç&+w•ðÞùÏJÄI§Õ("2«ƒ<³‰}Õ%87Y—íK©ÂW˜xä`[á|\ÁrØ<”ÛÇŸ ÓÓ·Ã=>Æ[×è®Ä=íÚ'CçyûXˬ%€¨¿ƒ“ÇZñ ­µ¾¢«å-s–¢}\8õ¿¿™#Íã½ö×Y¤RÄüïs²u2`³R¡.ZŽš%°#ÐÝÊ[ÿö}ñ%,g2Â¥SÇ8Ñ6{`i´zh;qŒSs¶ùŠv–å¹¾"""""""²j4gIDî—ωµùEõÄ×2âŽG÷EEb—Oóv[“ãÏfn7…› ±["ûƒôõ…'^^8ÉÉÔAÕM”ßZäÅApt¶F"ˆŠìÓÏ”$r%<í¹0WÂIJ]¦»·õ÷31vn÷’Mf²•+‡ O¹ŽŽÑ¹Káž>bÌZÄdnÿx qW:§Î¨Š]潓çf ¬…xŠÚ­ â¿â#~ÚZk¨ã'èø=ŒÊ™ ))qâpØ0&¢D‚WéõGÆÚ9EÚÄb¬ IDAT ý}zÝ3Ï[Šþ:“T´—Óí“@0b¶Z)°ßCúµÄUÚïg¼êf‡‡’­…Œ^Òk\õ&ƒœÑNµØùÞÁ*æZ‚-»rÆñ·½M[_FTÉhÇ]RÌÖBÆT”൫øúÆÛÕ"EÐ!éšžpˆ`Æ,/[±[6õYÁrØ<åØ;ÆRã…{è‹UP6KO{˜ç7{¨tf^û—ÛÚè›(’‘ÂíûiÚ嚬ª®«'ðá)N]’J¥ÖNÇ_㣞É6´–4qh¯gZ nµ¡9qâÂXªÁ0|*ªíËÓ_ï’ ¯½ƒT °—P[»“r÷¤[‹úé{¿{÷4S_šyÌjêêCtn¡c¼s„;8ÓëỳæXÌ®œñ¾vÎø2Â3îzš÷TLY³«¢jõ¡‹¼×Ò>Ö7øÏ´Ówd/î±íLö2vÕDøðšoì}eekM»ì÷ñ瑈ˆˆˆˆˆˆ¬º÷Î>X2êÿë"’…œrL¹ýüøoñزœfM¦ÅK E2¾ŸG~Þj—(I¨ë£É †­’惻§äŽ1ÙKiÑ=‰õÒÞI㬕›§œQ?ÝáŒmë+)0ÍuúJê½çié G…/øˆ–Ue7Sp)-ûõ‘52J…'" •“C:^¶Ã¯É™Kdý Ÿþ‰é4nÊóÊZœ•¸'Ê¡/:A4Ù½¸Æ_KôãdF“Düãa˜.™‰ì N¦Æ*òâX@8q%Ëaó”OÎúö0Óä¥x÷Äš;X¥|J€*Æ@ÆB\Ö’Jæ½ V'•î5ô­sþd°,ÖËG¾è×ÎCYE”yìS¥KÜ_ï.g å…K·¶W–0_9SA•“Ó‡ö-ºœñ«“ÁJk •óÖÉDay sÆ"W Ç×þ瑈ˆˆˆˆˆˆˆˆÈtk2¸d4gRqâ«<ó$ÊXʶ•¬&™l83RQÝ̨„¥G‹&_»6e€|þñ‘cs!n»¢’ñ%ú3KF #àR´­MFXÉrLI¤'0=º§¯»ÉL_Sg‘$#LžÂˆÃãÈbæ™G±}Íô{“ÝËÖ‰ÈEо¶c;u–‹}!bÉUì¯Ó¸±/ylÉÊÖÂlò_æ³Õ99ç-r-B|QåL韜éhtx°™²¹Fn &ÏN`‚4Ë~}EDDDDDDDDäkoM¦Å3Z­ŸÀ4H0š¤Ô2wUl‡ø‘w¶WS öœä­ŽÈ¢Ê“̺„ÛøÍ/Û|Œxljª?×6FsrE®¯²db!üã#Çöb&0:˜‰’¢×ˆí²¦”‹¹2‘ÖËÁ£ ÎS¶’嘚/Ø VZ:™/ÖGw`üÊ’iA¡T‚¡‰Åq¬8mÙum³ÝŽ™pÆ^÷󻵈ڽåôŸê™Dûºiïë¦#V‡ §s+Å×ìk-}Ö¦yyË0¡0ŸÂ¬®© kaôŒ'ãQR‹,gjp2,eÝlË.0kÌg³Fc£qW¡c-÷õY“3—L6gÆ:&1úÃÙŒàš0™fû±À¢S“$£÷>›JM=†ÕåL6p…ð؈dä ãq{IÀd/¡h|”ª‹,ËÛ_—]rôšš²¹¤WÔh\ô,*£)ó˜Yw¨ik­š^kòúŠˆˆˆˆˆˆˆˆÈZ²6ƒK&^—‘^ÿØ(nßyü1eÖE/ÁL-º -V30:¸o,ÚÉž&×½7¬ÉNÉV3ݽ &Ö;*€`ÿXÁèÀ3±˜Šut½£pHì„"3‹™ÙêÉ_嘚/ð§~â¥,Q?=iõ\TÎ4õÉhÆ<‘+1F$–$›ErR‰¡%K‰gœÌÕ¸¸™©xF\Â4o\Âd+¢´ºˆÒêÝŒêÐßwß?ÁñXS"À¹SíÙËh6Âeê¯Ë.A4ÙDÑÄ”~±¸0‰cÞäGã$³ùÀLƉLÌ3“g^ñÇ5z}EDDDDDDDÆZðY¾‘â\ì ÐJ-jYÃÚ,¶‰ÂíÞÉõxòqWhÑ3PâÁ øîaâ’Ù>Y’T,²DÁ ¯kb`<â su"]1ŽŒö|§“ñqìˆ?D,ž\çÈè¦ÄaZ嘒/ÐM¢þn&Q9sZ=“ çÄt¦ýá¡,ê–$Ú^¢>i&/£báØ‚ûc<ú±ŒãÙ- ¸f&+îRªêšøîžæP­{2¨’ðñq|™ûër‹r-Ϧ‰\‹dÔÕŽy‘ýÞæ˜œ—fÙN‰0ጵ¿Ö•ë¬Íë+"""""""² V¾‘‚\ ×BEy…†El`È£©¡”g÷l¡d†o)› œühO)ÏþoVÖt®£¯w ßûóGyvO)?Ú]ÌÁò¸r3¶ÉÍçPÃÃl·,áy—ã˜Ó«¶¡§w—Ao}®Õ‚›ŠªÙnŸ|½pšÎÐ"ÂKÉçÛ}÷4kqODÂWd3ëãlë)N:Å©ÖóÌTt“ÃKQÆqƒA?cm[]dÆX¦¬w¾B0è›ØÖèò⸇1î-‡ÍCùä"Oôô àëqW:g™¼’Gaád!Òí':oÍñ]-Q‡´ávLþó’è÷YPwŒì LÎ\22žmpüõ®³|ðÁ|ðÁYºæìd ª¨ud¼?†–½¿.¯ž ó5ÞOw`ò¡½Ø¾èY;yNÇd`*Ü3e °Ù›©w"ŠÙ3oå?׿õ¹7V»ýµc“Z'Ûí Ê£|Ó]*Šœyk?+Ln>Mun‹ põ:­çœöÝ&aˆæExrÕdáÖðû†·¾œ -=c³="\ø}Žƒ{)Ízq¡þ¶.Dîµ(n¼¶ÎE|t>„gWÁ›$t¾nÿXøÃ¾•ú™6¶²­A  »Û43Rèž–^nÊzG™Û‚c›ƒ{ ¯h92Sã¥èû¨‰¬z*–Y»²ÃëÆÜ;(Œtr®ÏË^÷ìgŒûÏÑ]ªþh¡ÐëßèÃh7ÿé«¢¹,»Î˜è¤Ý?9-×ì)¿+7tµ›ž±À‰qÈM¹Ë=G3bµL)Þò÷×e–òwÐqSmŸ«œôM4c!å®Å÷|“Ý‹Ëècô²ù¨kžvJ†èúxrm0£Ë‹}5>a×èõ™I P#ˆˆˆˆˆˆÈÝÒqþ³çöò çÒÕWP0ö²)o=»ªMt]¾E¨xÃXZ¼Áô쇌FS8¶äaÝžœˆ`°°Í>Bd(}Í6–‘’ŠB<É-çB&ÆÎbøbì©sQÿH„¾Þ8J( ±¦‡-®ZöU^ãäx„ æãô[QÂ{÷Rã±Í]¹X€ó§[9XФQv¼r®mt`9zá÷´b¯gæE âÞˈjn/aæ„W‰‚ A o"LCñ]S€¦®w”¹­×e½Çú­l9lžrìD¢á‰s³§’Â9.ª©p;^«î@_ë{8ÿ%3Œð'#yï}ÿ’~`Z¶~›Jkߨù!Ðv’ÖÔ>*Šæ ªÅÒzª;c¦•ƒšš¢iýׂ}« £[¥üðEÝÌ»JFz9˜üÄîÈ[þºÜ"œk=KáÁ:fŠÅümüþÂd9îj<÷Òõ-N¶{­ø{bcítšsžƒÔÍt5ã:ÞcòôV¼;±¬J;­Õë+r7—Ë¥F‘i ¸¿é¦ÁzßgAzÒiM›)»k; nÂtúî`6˜q>âæHQãŒÍÅ*Mdà6öbEÆÛ_^6æoÀ•ŽÑ5heWÆ`yýê+6ã±™0‘"rýg.F¦ãzÖoÆ×uÇ#›(Ù˜Kêv”ŽO‚ôÌ¿?`Ì˧¾¢€’7£tô¨-IqêÃá4`´PYQHõf Vc’þ¯h¿tkôµér׳Ýþó_e–Ƥb´ È8K›YÏcbû.ׯrìÊ0ÌÔÖ>LUúou„‰ƒ£´˜ÃŽûxü¤Ùî¡õÖ&ö¬»Î¿þ×àøÊâ”ûjn|Î±Ë Œíg ½Mg_ŽÞ«òN\ÓLíÜO½;cU•T ­Ç8úÖ)>èºL %OIâ±(¡¾K|xæm~ý›–ÉÀ’c;ÍM%‹\›e”µ¤‘áë¾Öc¼ýÁ%ÑŒ7f<‚ÿÃSœhé™ $Ø*©-™}Üæ.¾{ ×îa¦ñíÌõŽ&·-™y¢ZÑrLI7Ñ”T:æš ¨iÈ¸Ž©íoý­^f '™L†ðŸŸoµ}˜—.Wª©€š=åíÃß~’£¿iხKøD¢1ⱡ@—/žçLËoøMË…‰8 k÷R>Ãè¾ÝóhƱ´½uœ3Dâ},%pñZŽw01‡Æìa{¡eEú벋tÓr¬…³—DãI’É8±P]gŽs¬Õ—±fU!µõž{ î˜(ÚYg¢CEè>y‚Öó}d.ÿø9êßhé™ Ð˜KØY°z±û5{}EDDDDDDDæcÈeÛæ\¬6UÞBv?¶ çl»æ<¶?VÈn¯R› ÛföYFÄSƒQúÒy”ÛÆ98¶äÁWQ¾Ê Ú,Ô>^ˆëÎ NÜGË'7ˆØ hzÄ<9Îh´PS¶žÈgþ­£Ÿ^l4>¶~tÜr¾ý yÔïøîÄ Þûô ©-·e,Mb¢¼z 5¦íÿõ9oŸ¿AÔ^ÈÁª|fÕ1ÚÖc'AïÍ™§m%nÇ軕šáKøs'ŵp›cÝè9ëpZ€¼< sŒ:LDÃCãuÙî#ðEŒÔ†Ž7hîzÊmÃøú‡Iå®gïŽB܉§?þ‚¶þª+ò±h½¥·ö“™ìTì?Œùý“œöetÕH=}ô̳»ÙUKó_VQºŒßä€ü"ÊQ½¿þãmŒNÖIìi£¥§ÑÆ oPc!µûvR4×UÈ÷°ÕzžŒõ^Ì…Nòf,B EÆÞŒ´``ݺ•%YöeEË‘™oü©G)Ï"ǘÅ]ÏþÊ0'»Ç÷â¿pÿ…™¶6â®ßKþÇ­Sêu/,®Ý4ïIpòtF # §#0o_pT6³¿j–u‚ìÕ4x?¥¥wìÈ©0½í-ô¶3{ÃJÉÞú»gú,W]6ÊKôø¢ÐÝ »m¶m­”ìi¢b)¦ßX<44•iéIGÿ¹SøÏF#ÆÔ íd¯¤©Þ½J³–ÖêõÉ–ë”5‚,8ÓB˜'ÒâŠÓ—Σ*ó©\Óìc6é½×GØ¿eÆÈ)C.ÞÍ9þ'¾eʆ\ûl€žþèØÆ$¿ÚDsÞÔ¯°G> rá«0Ì…ÏîPUbÁÊ ‰yö·8(á¿ÿãMiàV¶MVöo«ýúMÔX‡8}6<6þš íf\;ì8sñ Ok-“S*Ib$ã¹Í[øïÕ£µ©(- ™œ~¾óøCCÄ·äã0F‰ÛÖc$`Êó>‡Þ¨…’u)ÁaRSFˆd¹Obð}i'å ø¿Jc}h#Cƒœ¾=‚m«wúowEFÓFxߺŽï:õÎXiÈ0¢Ò½ß§¨¤“¶ö ² ”7쥶tl ßTÄDæ·E£Œý‡-|Ðú>=áÌ¡Ûrm%4ìo l¾€‰ÉA‰ÓHoòE%³2×;ÀÌÖÙ¶]pOYÙrLIØÊ+Èn"ˆ…¢ºƒ´µñ^‡ŸØ}¦¤a? %IÎ}¼Ä½±t/ß·o¥½­Þp–‰÷ln¶×7°kÎé]\õÙC §{§/5C3R¹·‰ºÙÖZŽþºl¬xê÷ãÉk¥µ;8{:É:/Ýì‹k7Ú8ýÞ9ú2;Ô %«»–}{ªfœÑ·ò‹kéúŠˆˆˆˆˆˆˆd) ÷z×C&HÝábß Ñdš›Ý7(/Ùˆ;Ï@rè6ݾ(Ñu>ôÇñ¸7Rd„Øõ[Df]w)MøË©*Ãá¼ ¸ C´G§íÆ¡Ðn£Ò¾×F+[7ázæFI‚û%ÓÌjÿò¹˜b7¥3Êu}Æ‚KÛ:¬¹ö7”N+ÿ0w—RÉ0šÈËÈ—º9Àñ cÇs°oÛÝ­1ïy¢ƒyˆG׈m6“_§'ÏÊ΂\ÌéõعÅÛ#Sr§¥²Ý'}‡?EFØ·eæ¯âoÉ%:p‹9¸6™HÞ̸Ž#„Cq’ .­8ÓƒT›gÍžj"}>.öör­?B4–˜H5šmØ‹¶R²Í‹×S„uJím”44‘‹}úzM&Švÿ€ÕŽ?œ£Ùlv~š*{}\ „‰&R€«ÝŽÃîÀùh9å¥YÎl0Q¸½žíyáÑzí”ζ§÷ÎZ¶÷EIF«ƒ2‡iÎcg]¯e-Ç Œ™éêìT–,dÉ< EUM|¿doŸúƒDcÄ“&,6;…Îm”W•ಖ©îû?bçX—ê a*(£ñp;C—ñõ^åZH”ÄdgÄj³SètRì© ÄmËîÜ&¥Gp•_¦·ç ×"¢ƒQ¢±ÍØlvlv;{©(qa›ï KÒ_MØJ¾M­m4ͤ¹Ð¶<,F+îºïò¯ŸÞž|ýcq’& 6{!ÎG½TyÝsÔyñå´U³ÿû^¾.z>½J(J,‘Œ˜­6 ¶³­¼Š²¢ù‚ZfÜ••¤¢€Ñ†;oærÚ½µÔŽv–<—yñïÛ%ÿ<YmIz»üôÆõï*À>ö|`àç¿Áh[‡·òciâœÿÐÇÉÛ#ó95%`(¢<ßÀ…‚õ˜o]g SF&s­4ìpQ’¾Moÿ =½zÞžÌ!šÔ©ô,çËfÿ¹€øMN}|cZ l„x|†:Ý$‚ïF¾ñü~©$áÛ£ZmF,¤qž;øbªí‚› D|wè_7LÞ–u$ÖaüŠpŠ© ó¤²Ü‡B_ Á7mä™(·¦¸Ø= hm¥ûÉø5u vwuîŠïi-òPZ4{S™LÙ7«ÝSE§Šº¥¸Heì*Ȳî*v¹Ö²­×ò–cª¨¯›‰‰OŽJ<‹Hqf²QZ]Diõ|š–í`-(¥ª têôÛ¥8nQ)ÕE¥T/ÑÇÀ½öWKQUE+ô/ðPµÛ³¨6½§rš¬¸Êvá*Ûu/WWU®yß?T¹—æ}»ÔŸG""""""""÷îÒ®";®»Æ~ÌT–Z9á6‰ù™¾ÃŸ"9ìÙbehƒ°ïÎ]û˜7m¦Ìt‹·ÿ#8š–\¦œ¬×uŸ{ÿo$¡`=†Û£iñ0àx( >'n±—LÒ76KɸÁASq’Ž?Þ$1=Näü͇h,ÛŒë\hlú1Æ<¾]² Ãw•sþó¤èïOR¿eåæ$=·ÓÄãC mÛÈcNƒ}wfÈ*•ý>‰›·Šx¼tö;7¹24Ú>ÑILäc7Ä&ÚÏQ`ÁĽ%Vü(r¿IF¸Ø=™Ÿ°°ÒƒM­""""""""""ã ¹lÍÏnxÛ´ÁŠ=«MGgÌQ½.AÏ»gô¤ÃÄs×Q²ÙŒ-7÷Ö"öX·™ý;¶Pï¸C‡/N2$•æÂÇ_ðáuÔV»i.·a¾þ%-—㳯SÒúŸ}|WñC4U±sK.Qß5ŽŸÿŠðŒq ùÏ“ºM`¼=pJ'ð ÃCøã³Ô?ë}Ò¾ˆ .^Ï(àp”SÒg¶³g‡›'œï ͱ––,—œ—_~yDÍ «+N$’Àœg$öÓqºÿØüGsÉ~Žìuk=˜¯£Ø%Žÿ¦m,=¢›ý?Ú[_B¹¯ŒŒÜõxü¹t:=ñ8NOü¤R©‰ßã?Éd³ÙÌo¼¡FYÏ=÷‰D“É„Ñhœø1 ¿ÇrrrÈÉÉÁ`ý>òøãLÓ‹ÈòúçSŸ`°èË×w1ä±g÷J³ÉG—ŠÒòÁÀXš¹ûœÅŠwÓ×¾K—ƒ£´˜ƒCü¦spþÔ~û£Å|ÏqƒcÝš˜¹$ “ŽÇø›ýßZ–ck¨VV_ÌÏûoµM®±4ùñAuK"""""""""2Mzˆ.E)*³a›+À”æò¥ðÚ,`¢²ÂÇ c ‰q£ú-‚—†¾>%c.®MëyÜËÀ¥Û ,Ý·=Uä¾dÆÓ°Ÿj»ZBDDDDDDDDDîýr€c_€Éd"''‡ ‰022Â:·›üï™ø¼¨ÿûÿG #ò5eµä24œ$Ç”«Æ‘ìï'RIòÌËRpIDDDDDd\¿pêÿßX,ŒF£DDîb4qïýß9ûÓÕ"_cûªæä‡>HBŽÑ¤L"2·‘FRIFÒIöU—,Ûi\‘W¨“_ÿü—¼ÓÙÅÕ08½5Ô4áù#uXÔçœgeÕ²B><ù#‰8cé´’""Ó2dde6ñhi!ÎyÖÛ6N†R-"""÷¢x°õO®gW‹ŸÞHH´Ó¼k#O¾|Ðt7;ª}ø|µÔ‡ôŠÜ22tJ&"3Ór™"rÅk‚R "wÈë„f.‰ˆˆÈ=(DÓ–×ð'ÏZv¿þ"ÞˆuÔóâó»èlßÎ.Û¼šû""""w6—D$|n˜Ç{031˜,dèuADf26ÆÈh’Ç{XµìöÍ^Ò×äDDDäÞj¡)PÀ†mã…%{ɶ¾T†ÇãP„x÷ª}>|µ “3™Öáóù¨ÜÒA TO­Ï‡¯z­·±®¦–Gÿ÷µmÝqâ¡Cl[_C¥Ï‡¯¼šu[›èŽ_Šéò~5l¡®Ú‡ÏWIÝÖƒãAêŸ~–Æ@/»ž¬dkGüšC»óš¶­£ºÜGyu[šº™ºu¨u'/ÖVâóSûâNŽ ^î<6¥¿¼šºMõøoª?H}Ÿ¯šmÝq Fëz>Ÿêã1 6]Ê¡<¦X7M[×QSéÃç+§ºnõSƒ¹^Ž»ã0ØÊŽõ5”û|TÖm¡)×s[DDDDî;žüb¼°¤ë-‰ÈÍ00˜21d˜øðä·m—DDDäž¶Ó ଡÒ=µÇ‚»n' õl«qÝÚN#-lyuá¡ë·Eÿ_^~ú×ìóÇpx+(sÆèlÞγ뛮\‚/²_¿vŒ˜Ù h~•­Í!ÀIå¦ xÍ6*^ÚÊ÷ 3«zÙÞÃí-Æ вýY6š(Øxùå½´÷&pzŠñ8‡èmßËÆ—2jbãÆ½´÷B×K±#F më_ž(²ÍØï¤¬ÌDèìŒ@<ıàÄ¡uˆ'0ÑPRåÁïfçºgÙÞÜIÅÅ"6vm|š-ÇbÓç8ÑÉŽg_¦Ñ&a+Àiáµ×:õä‘ûÎp|C†®Ñ("·Æ`4q1‘¼mûWqIDDDî9‰ØÄ »Ûw¸_ïæ7ùÃßgÃL×´ÕtýÚà\»“Ý¿ÝʶÝ;Yã:ëi NÝ‹‡—ÞoåàÁc¼·¡€@k˜8ÜeexìJ*+YhŸ)š644°{g=ï½^ ðïj&Ä"AìÅ^*67ð^C= »7PôŽC<ØJÀYË–ßì¦þ½6¯,£Ì!rÃ~ îêbÌ@°5H, 3ã íôÆÂø  ˜ªb;1ÿ{ÇS¼y¨úúƒ¼¿Ù Ѳ«…Áir¼6´g|WÁÞ;ÔDÓûïñ’GÏm¹iÆ’ˆÜ:ƒt:}Ûv¯â’ˆˆˆÜ{ì3~b†¾«}Ú*yae 9v –kÚ`°½€ðÞçyìç?çç­ŸXâ.L 4e97‡¯cüW§g|½¾ßb¹7g%•3›ì%µ,·ŠÝ»…ßn~Š’îl¬«¡üÉ]ã3¹&X<+©°ὬÌGeÝv:+Ù°õEJ,7Ó_C ´´ÄAU­†ºévàUxs âUµx&çªXƒ è§7~½C¸½€‚º*ÜÀâ¦jªK"""""""w—DDDäžcw•á·à¿bMº8Ûj(÷•S»³ûÖJ:;æiÛ“Mž ¿åõ×_ŸrÛ͆Ëm8Êñøåß§þóoåégÍ®æ 6o-›_Y3>sé’œjvzŸÝ›×Råu’èõÓ¼÷×<[³‰Cƒ7Ño/¦ÊDŽq¨%@Â졪ª '½´¶´å^7<†øs,"w¡8¡Ó'éŽ&ïë,$û[©¯?D(©g„ˆˆˆˆÜ{T\‘{»Š5v¼Ú@÷D #ÖÝÄŽ}aÀÂrs,æñbF$@$0Hgkè[ hÇUì#æÆ[^Ny¹›D •Ööîo1{*1µ^t}áVšã6ØÚH@An{œàÁV"€gÓnvlZG•;FdÊ]C‡v°åÕ=t¸×±m÷AŽýñMÖ8!?máø û!o•èe_sœ•xÜ^®Zvþ~3U;Áö6Úƒv¼O½Â›¯×N[@¹–›ªªpš!Ò~ l†…û ÖòÊÚ…Žpx¨Úü&¿­¿†“»v+/•91!4S±ù%¼f`ÈOK0޽|»_y ¯zýí´wFpxªxi÷6ªs¸a?€Å]MñÄvîrxJlã ž*<öÉ‚~Ïæ•Å8ãüž 6¼þ{¶zgX.ÐâesÃoxªØ‰9ÒKÄ\ÆÚµºæ’± Ç6P¿go¼µŸÖî(I€ØiÞy£‰Ó×7>ÝÄM§ˆÊþ7šèusøzÞ9½~@¼ŸŽCM¼õÆöìy‹ý­§¼´¼[<Èþ7šèè;MëþÞØ³‡úwO,ƒådûœJ1ðÑ^ê[û¹zU¸dÿaÞj8F°ûûÞ`Ïž·h:ÔÁà”—¼øài7½Å{ö°gO=ï:Iÿd’hw+ûßzƒ={öðFÃAŽõ ß /ÆÉwöÐpéø’ƒ{k{ޏßà±·ØóNÇøw†û&s¼§þþõx“i&g—c~ƒ·šˆÆõ\‘{–á•W^SDDDäo566vÍß—ÚÒéôäßétzò–J¥&^º%“IÌf3»wïVR¯#Þ½ƒ'Ÿm$Rðï7ÕÝBáJDî4ï>º‚§>8„Ét J$û9Òx€ £ŒJ¯cä‡öáz| +²{xçÝ.JÖÔ²Ø:¾ùðé&»±¦v1Öø§ìßÛÆ°ÍFÞâR<îBò³‚×¶epzÿ»œ0S¹´¬D˜Î#í³aÍEXãAöïm!j{ˆÒ‡Ë)´Gé8ÔB§õÖÖaIF9þná¥kX]d½Î!æí=¤² Xúp)œÿ6¶0à\Je©cä$GÚ{2°rm5.­"ƒd2ɾǫyæÃÃßzëׯ'‘H`2™0“·ŒŒŒÉŸ—nƒƒÁ@FÆø÷‘/ý}ŇIWý-"·×ï>ø„ ‹U‰‘[–Žó«Çz[ö­·¸""""""w‰ø™RT­(!ßä-gEô0±dßÌRXJž`EÉÄôÂøµmÉÁ“ø£NV¬Y6>98VD è$4\D‘qü®ÙÞJJó­@6¥Þ\:OD¡ËäY¦q†8Ì®XA‰Ëä‘›£ñ€ŸžX%YòV°È³< €cþIšcë–ŽD1æRîq㲎'°ưgê3‘åvaîê!_ˆ9$f+À™Œ&YhŒÐ3dÆU˜M*ÜB ᤢjãµ±ªR¼}ô$eÕEý+së8Σ‡UU¥ä™× VD9 KʼnˆˆÜÙ22)\˜Çrç,,¤ òQwŒhzº;d²´¬€Âþ^?½¢Ç˜ýkf¢­í =ßâÒ“Æ9¹<·$ƒÿí+BéŽË5Û¹óF#Öœ\VþdYƒ_òv “UåÙtýût¥mŸžÿ‚SšÜ}ÏPqIDDDDDä®$Š’²/Å1¹ª¤Wù㛹¶Y8Y3¶%"Œ$"|°wÏUÛÙˆ$ (kü>¹ódÑ4s)éZ܎˧£&‡‡1@_,I‰=›¢EFúÃÝt„ ôq&œ€‚‰msKYdk¦åí·È-pã.,¤ÐíÂnfês’Ëz¢q²ú¢˜ófQì '‚QâÆ Qr)Í61Ò%e+!oÊÄ­ynl©n"#à2_³$±ÐÆÜr²M—OµnF—DDDî`¸>È ç¥ÿÀä8óXI’w»FHÜѱy¨`>Îä7wPqÉÈC?œƒy ̾À)ÒúÎI¢‹óÜ£T\¹‹XnâП6)"÷«`4Þt!'•JrÅgF¬W/Ãwu[ ÈZÄã5¥d¯üÀÀlg|¶“шÑô]žN/=ÜGëþè1>„ga!‹ËJXÜy×¾åjqQþ‹¤$$쥧½™G xä™jЬ3õåR˜àd8Bn8AöÒ\\±lFºˆXûI8¼8,ÜÜI×Ë£ˆˆˆÜ]2,ç^ûÿ¹5w.9Ý#71{H®dÀœ‘føÜEb)€8ŸM¼Sq鞤wÃ""""""wÉé›Õi‡ž^"É¢‰ëø$ ~—Vã žñ©$©ÉjRœhhè–G1;˜G" ›íäOÌÞIö§å¤•ò%X¾“c‰Œ$qO\Œ(é!’Ê¢Än"òHxXõ\åøs$ ÅS“E²á¾ãø#ù,--¢ÄUDÉÒbŽ4àTh—¥cÚ¾¢"+.£§»è±³(Û‚9ËIV{]ÝCØJò°FG6Æ¡ ýÃ%Ø/]»ª?È1Gºöq±»l¤ü=D“ù“1G‚Räêi+""r2ÎÉcÍORýÜÀ’ÚÉËJ3xöm§Ï™x/až=‡å‹çã¶gˆ]Àßwåõì.÷›0‘"zö­§£ ¤2YRV@iPü#Ö†ûx»+NÊh¡xq.¥ó-XIúÃ_s´û"éoŸÑƪåóè:å¡…9äœ=ûŸB¦•²âxæebMÐ÷å mŸ 3Œ‘Eÿ—›òÙÀâò ¾dïÿgbUù¼‰eñ®àæc•;—j†""""""w kþR éáðáúú u·ÑÚ“ Ï“ÉlÇn€,g>æó=DŒ¹äf)Ûƒ=ç³p»Æ¯Ÿdq–RhÓvø8ÁþAú?=FËÑlÅ^r§9~{a)ÎT€ZNì璘£Ã=aEDDîdé8Ékš‡Î3ø9ŒYÙú¸æOÎÍΡê‡fŒŒrêx/'GÒôw~ÎÞ®8)L,*}¯i˜£þ‚ý'ÏËÎeUÉÄx·€1ï¢y¤=œ„ Ë—ºX”1ÄÑ¿ ¹{s¾‹§<Œ¤èú Ç.¤<ý9ÿ§c„éß…Þz¬rgÒÌ%‘»…ÅEÅêG8ÚÚNËvRf…ËW²Üeòy¸ÂCËÑ6šfæx©\§åÔ­’MiÍJh=BûÆ,r=PS–w“'6œ…¹œ:3^€3ÏŸÇ4BÛ'‘‰ý òaÆ,ž[8¼O¿ºée¿]¬r'RqIDDDDDän:‰Ë.¢ru•×é³UR[4µ§„uE¿ZŠXýË¢+ïp½6«‹Ò'~Aéõ°¸YýK÷UM«¹Üd"oÙjÖ-›éS#ÙžJj_ï(¬¸^ûá©mEüâ——·Í_öu×Ý¿u†>ÀäbźX1eû¢Õ/pMìnÊkÜ”_÷ø¯Ÿ3SÎbVÔ.¾¢mñ:=_EDDîDÆ9 xÆ7wü‹-ñ‹ÏD‰a"wAåyóp~ÜËÑèØß0J‚ÞØåû§†.IÙÉÏÊàëy&’ß R$Š ÆI^*.¥Gé ‘›m§8{®¹Všg„³×ÉbŸ…5ÓÂãW¿GÅabš‚ÍtñèŒ$ Ÿ»<ÿÈj3cºe`ʾ†Ï3Îa~&„â7—•o«Ü‘ç%JˆˆˆˆˆˆˆˆˆˆÜ2È/œ{y 6Ë,Üͺj‹8›"qUÏj(Ó/7viøË´RásQ˜¾@ MßÐüaŽ~£ïB’”É€qšPãCqâ YÉ$±øømØ2—åÖi+ÓÅwý‚ÒðP‚ä,¹™—Û¬smØS ¾¾…ÙFß.V¹iæ’ˆˆˆˆˆˆüýNBóV°nò """ß#ÖÌ›Ø,3Ë5iúçˆ.ËeÕ’LN|9ÂP:ƒùyÙ,ufÐwúkÒLŒ,üI‘®s dÌ¢tá\Ìç¾â¯#0ÜŽPa—$hû|„Ôœl–;/TŸJŒÏœEá|3#çÇÈÎsP±Àˆé|&ÖŒbiˆ“eV&VcœáoÎqòB•?Ë…¿žgÈdcÉçá8ÛG,=}¦‹ïzU¬D4JOòA*Фzb ÏšCÙÂYÄú¾ ÿ.O•úV±Êù¾^)‘ûCŠø(p£ÓhòºKà¥.DØÿ§QÊ~<²ŸÎÃBšá #t~Ò‡05uCŽ|žfÑ¢|Ê-)¢gÏÒ|zˆa€ÑüÉ@Åâù<âË!‹áï¤ä'ãË󥢃´q²ü§? $5J8BË'i*’Ë£®öIî¿HiQ>«f}Á»§>þ/ ¬t–T’þðW4Ÿ~™¾™â»žôm “XœC…o–ÑQB}!|–˜a)Àë&öÖc•;’ŠK""""""""""rHÇù¿áZl»|Ý¥k$ þ5ÂÀ43iß|C›ÿÚfgŒó_ °/4pÝîÔ…oøè?¾¹¢­ëÈd/ÁÀ‚©½C¼Ûvy_ŸaïgSºGG8uê NÝtfˆ/5Ķ¡kÛãhÿóÚ§ÉYçñÏ蜌'ƾ¶Ødìû¦îïVc•;’ŠK""""""""""r߈}õo¥<ˆü-t‰,¹iš¹$"""""ò=Èœ=›ä… ˜æÎU2DdZÃýýXsó”‘»Hê›~öQ|roÓÌ%‘ïÁ‚%Køë¿ìS"DdF½¶]T¨DˆˆˆÈE3—DDDDDD¾ÿù¿ÿZ~õF#îG«˜ýÀJŠˆLºðÕW?láÓýÿBÕïö(!"""rGQqIDDDDDä{0û¨úÝþüÏÿÄçøÃýJŠˆL²ææ‘]THÕïö¨ø,"""w-‹'"""""ò=2`ƒò "×¼8Œ¿>ˆˆˆˆÜ4sIDDDDDä{p᫯hùÕ xÖÔñãÿ¶–Y ()"2éâÙ³„ÛZiùÕ š½$r¿3`llü§ˆÈÍÃqû橸$"""""ò=øó?ÿ ëžÅ½²“É„Á`À DcV~>¶ÿºfòõbù«ÿK‰¹OY-™ŒŒ&1˜2• ¹ù÷©$YæÛWRqIDDDDDä{pöÔ)J7þO, F£Q ‘kFòWüŽýz³’!r{´ô8ÞI0MšÁ$"3c,•d,äÑÒÂÛ6ŒŠK"""rï|¾j¶uÇ­ë}ø|>ªwt›êðù|Tnñ¿z¿Ý;¨öùðÕî iÛ:ªË}”W×±¥©ûŠmC­;y±¶ŸÏ‡ÏWIí‹;96%ÖÁcSúË«©ÛTÿ¦ú¿Eü±n𶮣¦Ò‡ÏWNuÝ&ꧪ§ÖçÃW½ÖƒÛXWSËŽî8 ¶²c} å>•u[h ÆõÄùŽ|xò‹ñÂ’®·$"7Ã`À`ÊÄaâÓ_ܶaT\‘{˜‡u¼hçµ=×€<ÄËOÿš}þoeÎÍÛyv}!œ”•9€ˆ‡8¿[¤#@Œ8‰†’*Ïô×êmd{s ··{$@ËögÙx©Òlàå—÷ÒÞ›Àé)Æã¢·}/_>È @¨‰÷ÒÞ ^/ÅŽ¶]¬¹Ð ûo1þx7;×=ËöæNÂx(.v ´±kãÓl9vÕº‚‘¶¼ºÎð$:ÙñìË4úÃ$l8"-¼öZ§žz"""""ß‘áø(† ]£QDnÁhâb"yÛö¯â’ˆˆˆÜÓœU/±Ö ‘}Ûi _ÙlÞC{œkw²û·[Ù¶{'k@g=MA îêbÌ@°5H, 3ã íôÆÂø  ˜ªbû °¡¡Ý;ëyïõ l€W3A  b/öR±¹÷êiؽ€ ŸpâÁVÎZ¶üf7õï5°yeeŽ‘ößZü1ÿ{ÇS¼y¨úúƒ¼¿Ù Ѳ«…«'~y7¿Éþø>kC{hŒxïPMï¿ÇK=ïDDDDD¾3ccš±$"·Î` Nß¶Ý«¸$"""÷6óBÖm®ÂF€];ZˆLvÄ µ÷Þû<ýüçüü±õã…ÂBq,žJ€D @ • ªj=0ÔMG°(¨Â›3ÃøÎJ*Ýãóšì%µ,·ŠÝ»…ßn~Š’îl¬«¡üÉ]ôN¹«Å³’ ÞËúÇ|TÖm§Ã±’ [_¤Är3ý7Ä 8ªjñLLÃrU¬ÁôÓ;uÚ—­’V–c‡p{7uU¸-€ÅMÕU—DDDDDDDîe&¥@DDDîuöò ¼èia{û^Z&[“¿y6ü– ó”{Xp”XÀ^L•ücjI0{¨ªòÐѸ—Ö–‚€£Ü‹cÆÑÄã0¾n^âŠÑcþ­<½¾™ˆ¹€ŠÚZ6¯‰PÿjãåSN5;•àon¢©¥…V¿Ÿæ½~š›ZøÍ{;¨¾aÿÍÇžñ®ZPÐbǬ§•ˆÜƒ’ý­¼ýAœªçªqélYDDDDdZš¹$"""÷+7?uUÈŽ«Ø @,æÆ[^Ny¹›D •Öön†ÈÁ[åzÙ×g%·:›Ú†·Ò=ýõ–­4Æ‹3ƒ­t”á¶Ç l%x6ífǦuT¹cSfVAèж¼º‡÷:¶í>ȱ?¾É'0ä§-¿aÿ­Äïðz0‘–f&Â%ÔÖ8¾ìž»çuÒ‚³l!½M­ã!ÚšzʉˆˆˆˆˆˆÜÃô],¹/XJ^`sY3/·_ž=ä®]GñÞítî­ãù@ŽˆŸöÀfïfÖM\FÉYV†c×>"€Ã[ŒÃn§Ü m½€¹„•Ë FÓø|5­"½˜){q%n,Ý`ˆÀög©kqñ&ŠZãìöÇZÚhiiå ·W<ü­÷±~ýz‰&“ £Ñ8yËÈȘüyéf00 ddŒ_IáÒßS]ý·ˆÜ^¿ûà2,V%BDnY:>̯ÿémÙ·Þ.‹ˆˆˆˆˆÜe²½•”æ[lJ½¹tžˆ0BÆÁ“ø£NV¬YF¾ ÇŠ(¡„†‹p»]˜»zˆÄbŽ‰Ù p&£I#ô ™qfOs¢h¦pÅ J\& ܬüôÄŠ(ɲð·‚Ež…3•óOÒ›XŠt$ʈ1—r—p<½0†Ý8SŸ‰¬›Œ7n!pRQµŒ"ëøqW¥xûèIʪ' ü),%O°¢d|NV¬ã8gŒVU•’g\+Xmä€&^ŠˆˆÜ•ŒY³ñÍÇ3߂՘&ùš¶Î(¡ÔÍî!“¥eö÷ÒøÙè•ûÎ~€µ?3ÑÖv†žÔ·ˆmN.Ï-ÉàÃûŠPúF[gàrÍÁvî<Í ùnr*·ƒŠK""""""w•,ræË'Ö&0Nüžˆ 0’ˆðÁÞ=WÝÇF$EŽBr9BO4NV_sþÃ,ŠáD0JÜ$J.¥ÙÓ&:p;.÷™nÆ}±$%ölŠéwÓ 4ÐÇ™p &¶Í-e‘­™–·ß"·À»°B· » ˜©ï&ã銒²•7åKÝÖ<7¶T7‘p™ÇóætfMô&‰…†0æ–sùpM8ÜŒ*.‰ˆˆÜu¬9¹¬úéì@ôì7ô1‹… rx¬8Éÿsjˆá»êhŒZ÷@ñ!< Y\VÂâ΃Ž_zQtQþ‹¤$$쥧½™G xä™jЬ3õÝ\¼‰›Ì›Õ¤S`‘{î­QV6+' Kɳ!öw “ ƒÏJÜ<>ߎ#cˆaÍlùÎ鵈ˆˆˆˆÈ=Âìp`‰0l¶“?1‹'Ùœ–“VÊW”`1Yqyl=ÝE׈EÙÌYN²Ú»èêÂV’ÇôWtˆŒ$qO\Œ(é!’Ê¢Än"òHxXõ\åøs$ ÅS\Z5f¸ï8þH>KK‹(qQ²´˜#8Æe阶¯¨èæâ5:²1é.Á>qÃýA†ŒÙ8²€Ôµ§Âv—”¿‡h22æH0BŠ\=‘DDDîä{æ“ DÏž'N\õ¥“1RßñˆÆ9y¬ùIŠ£ŸXòC;yYiÏž£íôy"ƒ™gÏaùâù¸í$bð÷]y­ºËý&L¤ˆž=Gëé(©L–”Pšÿˆµá>Þ2Z(^œKé| Vc’þð×íþ†Húoïêñ d?°€ŠBy– ’##tuEûשú ,YæfñÙ‰%3Ì”•ý€’ô9ÞmÅ€£¨€ZÇ9Ÿ'–i¥¬xžy™XFô}9HÛgÃã3ÌŒ6V-ŸGש(-Ì!çìÞýlô†9•ïã_ŸˆˆˆˆˆˆÜLy¥”Πí`+Ý}ý„>=NKË)"Ö\l_-Ìræc>ßCĘKn˜²Ý8ˆÐs> ·Ë>ÃÞ¦£¯Ÿþ`‡[ºH8—âÉ£ÕŽ9ÑOÏ™AbÃQú:s¸7Aj$ÊHŒD œ8ÌÑÓ}ô†vž$8’…Ãnž±ïfãµ8K)4‡i;|œ`ÿ ýŸ£åè¶b/¹Ó|¥Ò^XŠ3àƒ–“ûûéëhãp`DO"‘»I†OvÆÄŒ¥³œLbÏq°¼ä!_A2cð6ÌZ2feóH¡‘ž¿~Ió'QFæ,`ÕOmã_ÒÉœÍ _.ù‰(}ü%ma¥‹mX2.Ç\ö³\\ÏñÑÇ}4rŽhvU?4cd”SÇ{99’¦¿ósövÅIabQéƒxMÃýóì?yŽXv.«JlÓ~)hÆøfŒ³<¾x6‰¾~šÿâhÔHII.ùÆ™úRœ‰$±;faœ…Óde‘› `$×a"a8ÃÂò¥.e qôã/hîÆœïâ)er©gŒ™x̓ð íáäs*ßϹ‡R """""r¯È¦´f%´¡ýƒ c¹žG¨)Ë›<ù3e»q™;éq¸Ç¯kD6…èºpÛfúå!–{-tµ }ÄÌÜ‚2VV€à*£rQ GZöÑi´‘ëYJU•…ÖÃGiérQ[ò0UKZ9Òþ=)0fåRXQÃò<&¦ï»éxM.*WWan=FëS$Ì6œÅ³zYÎô'½Ö…<¾*E[›ŸÃN`vâ­ZJÇá~=DDDî®X ˜ ²sY¼ HÒõéðäL&c†Tú»º†QŠž¿ôÓâô'2Yã›Ï,Cô.pŸþ†ýQÒ@´ŸÃÖY¬v^ºoš3Ÿ÷ÓŽMÌJüz+³Œ—º'ŒÇjœ=¯u„ŽEè›Ø¾í/f\¾lœ™CôŒÞZ|£7ß’IVê"íá „F¡Cý™ÄÆfêcxp„øƒ6Æqûlì#C„LY¸gÄ,ÎJŘýÓmŸD&bäÃŒY<·pyŸ~EhâqŒ÷…øèLûC7Ê©|T\¹[Xܬþ¥ûª¦Õ\ÑduQúÄ/(ö,ÐÅŠu/°âò(ZýE7Ûh$ÛSIíâÊëtZq?¼÷ÃSÛŠøÅ//o›¿ì ê–qÝûNßw ñÚݔ׸)¿nÞŠXýËkД³˜µ‹¯h[¼NO3‘»F:N š&‹Õ%ßÐÏ,.¸4ÅÄ¢ÿ4‡ÀŸÏÍÊáßlB9CÛàw±P^‚ÞØåBUjè‘”ü¬ ¾žg"ùÍÑ)E¢È`œä¥BHz”žÐ¹Ùvгgáškå¡yF8;ÍÛ?û,¬™¯¸ú½Ì(Ó—¦‹Ï@g|æñSç£t]|ª‡ÝôŸ½@°ˆÏGˆ¥™úbC °€ÍÎ`x¾™Dä,]YV–ædbNÏ&›‹œº0†õA3¦‹Q¦Ä=|~ˆ˜qó3!”H>wéq2`¿QNå{¡â’ˆˆˆˆˆˆˆˆˆˆÜ…Rôt†±çâ]0‡lRD#QüŸÆÈò…é ÂCt¢týàA™î“ú ~ž>>7¥¸2>f<~³yš߯OÐ~¼‡ÎìÙä̦ðDzlá‡ÿý+zFgê»HÏp¥Ùæeí¹HxÖ(YÎ"'1 óÐ×DR`¾©‡uŒáïl–™Ü.*.‰ˆˆˆˆˆˆˆˆˆÈÝ)5©S½œººýT,ɧ|Þj}q†ÍIGLý$—ÏŽ† ^S)Jqþ"Øçeag”Ød»GÎ,Lñ OÖ;ÌØ £K×Ùl8Œ):FÒÄÎ%1ýÐFvÆðønpäX0qqüžóæ³Ðô ûÿm`²ßeºzy¿ËâCqâ YÉ$}³}ŒsT$iÿËy×½¦ÔtñÝp|ë|?³ sâ‹!:£Ct~eyY>Kæ '³§íëH'Yþà™“t]H0òã¹ü'§‰¡¾‹ É¡ÉY6r3Ï›8ë\öT‚¯GÃÕÇ2vÜÊ÷CÅ%™ùÄ1oëÖ)"""rIÒ9Y`²`½pŽ>>Ñœž¸ÖÐ5w /pŽè²\V-ÉäÄ—# ¥3˜Ÿ—ÍRg}§¿f ÍDÆÈŸäé:Ç@Æ,JÎÅ|î+þ:ÃýçæñxI‚¶ÏGHÍÉf¹óòÇð©Ä(ñÌYÎ73r~Œì< Œ˜ÎgbÍ_b.N–Y™Xq†¿9ÇÉ Tþ,þzž!“%?ž‡ãlßørt×5}|)ËÌãÇÉÄS”‡99@çù1¬Ž¹¸-Iú.¦Iš¦ï>7L“MNü<£½@„lŠfròÜøõ“Ñ(=É©(vê‰1üS—ÒK]àÈçi-ʧܒ"zö,ͧ‡ñÁŸ T,žÏ#¾±þŽAJ~2kü®ÑAÚÎ8YþÓP’¥?¡å“4•?ÉåQ×ûÎ$ ÷_¤´(ŸU³¾àÝ@‚S ‹PV:K*Iø+š?O¿LßLñÝpü³|Ìeù]!¿HÏé/9úÍ)¦ïH\ 4šMÑÐ…‰ÂW‚ž!p[G^ZÂ/=BÛŸÂ$çPᛇet”P_ˆŸ%¦?žäT¾†W^yE‹ŠˆˆÈßlllìš¿/µ¥ÓéÉ¿Óéôä-•JMþ¼tK&“˜ÍfvïÞ­¤ŠÈ=íÝGWðÔ‡0™ô?™^2™dßãÕ<óááo½õëדH$0™LÆÉ[FFÆäÏK7ƒÁ€Á` #cüÂ!—þžêê¿EäöúÝŸa±*‹ 3ÅK¢|^ýŸs` õ­weœ“ÇsK |øo_Jßy‡z§Ç'_éø0¿zü§·eß:‹‘{W:Aç©/8Ÿc&:˜R>D¾*.‰ˆˆˆˆˆˆˆˆˆÈ½-¤o ©<ˆ|GT\ùdΞMòÂLsç*"2­áþ~¬¹yJ„ˆÈ"õM?{(>‘ ¥@DDDDDäïoÁ’%üõ_ö)"2£Þ[È.*T"DDD䎢™K""""""߃ÿüßÿ-¿z £÷£UÌ~à%ED&]øê+‚¶ðéþ¡êw{”¹£¨¸$"""""ò=˜ýÀTýnþçâó?üá~%ED&YsóÈ.*¤êw{T|‘;Ž–Åù0€Ay‘k^Æ_DDDDî@š¹$"""""ò=¸ðÕW´üê|¾rªë6Qlpʾê©õùðUoãPÃêª}ø|•Ôm=H0¤¾æ1^ Ñüü?°îP Rçóá«ÜJGüÊý´ÜƺšZvüñÿ¦ÆçÃW³ƒ¦ë©.÷Q^½Žm­!‚·PWyi¬C„â×;ÎÅ6.:Ķõ5Tú|øÊ«Y·µ‰îÉØ}ø|ÕlëŽ1Z×ûðù|Tïè& 6Õáóù¨ÜâçêâÝ;¨öùðÕî iÛº‰øëØÒÔ}Ŷ¡Ö¼X[‰Ï7_í‹;™šâÁcSúË«©ÛTÿ¦ú¿Eü·ðxO>NÝqleÇúÊ}>*ë¶ÐŒëß™ˆˆˆˆü]|xò‹ñÂ’®·$"7Ã`À`ÊÄaâÓ_ܶaT\‘{N<ØN/€³†J÷Ô îº44Ô³­Æñnv®{–íÍ„ñP\ì hcׯ§Ùr,våN#ûøõkLj™ÍÀæWÙÚœTnÞL•ÀLñÚßðbÉ áEZØòê>:ÃC—ÛÂlo b6C"Òɾ—ŸäéW[‰ØmcýšW[c3ìsºØ€ÁC¼üô¯ÙçáðVPæŒÑÙ¼g×7ÂIY™ˆÐÙxˆcÁ‰]vˆ'0ÑPRå™þºB½loŽáöchÙþ,Ml‚ ¼üò^Ú{8=ÅxœCô¶ïeãË5±qã^Ú{¡Àë¥Ø#ж‹õ/7ºaÿ-ÆK÷”Ç)ÑÉŽg_¦Ñ&a+Àiáµ×:õMDDDDþ.†ã£2tF¹5£‰‹‰ämÛ¿ŠK"""rÏIÄ&f•ØØfØ.æßCc/àxŠ75P_÷7{€!Zvµ0xÅÖ^z¿•ƒñÞ†­aâXp—WP6Q\rWVâuͼܞwó›üáï³á‡'ˆæ2~óþ!z“§ãMů¼Ï¡ƒ‡øýZ'ÁÎÓÏ•™.66ï¡=ε;ÙýÛ­lÛ½“5 ³ž¦ wu1f Ø$ Ðñ†vzcaüPLU±}†#*`CC»wÖóÞëØÿ®f‚@,Ä^ì¥bsï5ÔÓ°{A?á8ă­œµlùÍnêßk`óÊ2Ê"7쿵øoíñ¾ü8­ í¡1là½CM4½ÿ/yôïLDDDDþNÆÆ4cIDnÁ@:¾m»WqIDDDî=ö‰âN,ÂÐ ›Eü€£ªÏÄ]\kðýôN­æ8¼x' ?NÏø:{ ¾ÅÒh¶J^XYBŽÝry&ÃËÂÀbÇepPâ±쮉YP3 5mlqBí½„÷>Ïc?ÿ9?lýx¡„0P‹§† h'h%ˆƒªZ uÓìÀ ª&—¼.g%•îñ£±—Ô² ÜN(vï~»ù)Jºw²±®†ò'wÏ*›`ñ¬¤Â„÷²þ1•uÛép¬dÃÖ)±ÜLÿÍÇK÷äãáön êªp[‹›ª5ª.‰ˆˆˆˆˆÈýKÅ%¹çØ]e8Â-øCS{âtl«¡ÜWNíÎn3îå6]SÇbÇüwËÄå#ôlø-¯¿þú”Ûn6”XÀ^L•þöî7*Š3Áûþî¶:thmÓ¤é@ ²C—\]Qgt2‰³f2³’}Î3³/&ó&Ù&ç9çÅdÎÙyγº»÷$³I¼“fLÌšàÑ…‘‘;Ìàb 01MЖδi¦I—Ýð¼àˆüiP#Â÷sNº»ª®ªºª€«ú××U œÐ•m2UT”*Mªª¬”O’{M±ÜÓ¬'¹z¦¤Pýózä;ÿ Ÿò)©x›žÝµc¨çÒˆäzéƒw´çÙ'TQœ&³£^‡^ù}gë3ú 7Žé×eû'8Þ_éq掰¯Joüû^½|´[Ñp³öÿûjQ/·¢èù*½üòêŽR¸þ—Àüã­ÐŽLIjÓK/¼®ÖáÜ Ôº_/è‘))wGiÅ92$*©mxžîê}Cðy×(Í~«W„Sž‚¡aõB!¯Š×¬Ñš5^™mUªªmîÕ•¬âŠ4I:p¨GJ[«o±r ©i­ú”¤âµ^MY=U:4\½UûÔ(I™¥ò:#ò½[¥€¤œgöè¥gvªÂR`̢ݼ¤ç^Ø«FïN½¸ç]øïŸkGš¤¾zU÷D¦>“íwÏêxÛ•Vš+IêØ_%_D’ºU½¿ß3ÌCauÖ·É̪ж2lV·r òå&i0Ž*óGÛ^üž*Ÿü™šê¢ïüéOd$IæðyIå»ôƒb§œ‘§´#­Z¯ôìӓ߬WqZHõM=’ÜÚòÌyæAMx·íTÁ+»ÕôÊcz²­Tî@½jÛúd?«Ã·QJ+-•ûgä..ÛéÔš4©ºC’Q¨-9Ó¥l=Ú÷äFUeÚèÈ”¡Òïo‘Wvù¼nI}jÛý=VéV ¾íŠ¡ În¨¬Vee•Þ-.”'âSmÏÐzËÓìr†¦ž>“íwÏîx'¯}J[’žÖ¡¶Ÿè‘oîW¦:Ôà· óQLfÔ*GZÊð袩*\Jµ¸ ᘗì¹;õò;9úéªoRGŸ¡¤´­Ùñ}ýà±b%ͤï¿þš)§B9ÎiÖ‘ù„v­mÒÞ}õ2Ý9ªxj—v­ºI“wÛóúAýsúYm|¾4myöêxé'ªï«W¥/¢gÖ¼¨=»^ÒOöVª¾¾V2äΩÐÏ>«É’’§™>“íŸíñ¶ëÙ×ÿQÆs?Ó¡¦ÒJõĽò ½—p“„|:QuBm=}Š%¦(«d­Êr]CwáN8z\m=}2%Zž·FkWgÈ!IŸ~ùj½²*ò¨oP»¿OÖ%Y*ÝX®\—©æýûT{QRõ«úwß=ñ@H÷5(oû£Ê7Në—¯žRÞæ=^«^ï·ôhQp¨¼õYêü°Ag/JK²Ê´±Xj¨ªU»¿_Ö%9*ûúZeOôwdÊí¾TœWcUÎÔKTJN±ÊÊò•l ©á}jön×c«]R´W'öP“u•¶?¶Z.EÕ{bŸtiÇ£…»úèù£Úw4QÇÔPß&Ÿ!wf‘Ê×*yøOA¤·Y5Õõòú“¡%™EZ»¶H©vIŠ*ØZ£ªºvùûc²&¥)ïõZ“á˜bZlfÛ;åqœàX¬vÙfS†Û«âÆÃÀ“°k×®Aª\«ÁÁÁ«^¼7000úz```ô‹ÅFŽ<¢Ñ¨ ÃО={¨Ô9.Òú’¾ù} dþ@ïìl^ôô¾JonX¯‡ ›mßù‹ž×ñ}ås—jmqš¬S:ZÓ)ÏæZŸÔñ}Õæ\¥ò’,9Âmª«nR(çAíx U¶ˆO¿|¥RÁ¤å*z`²œA5~P©&Ç:=±5[v…ÔøÆ›j+Ú¡m¹)ܪýcÃ¥WªNJRj~‘r¼YÊH<«_¾R©À’•¯/Vr_ƒþ«²E}V· Ö—«0) ºCÕêô>¨Çצ^ýÍÆ8¶§ù—oªÎZ µ%YJ4{Ôt¼V>×:íøºWáût §DoË•#ܬý¯Ö( •?þ-å:Bj~cŸ2Öö5ÉW¬;zþ¨^=Ø®Xb¦J(’[=j8^§×:íØš-Gô¼ª^=¨Î´R=P˜"ÃìQcUü9kÇšd©÷„Þ<Ð&WÉZ¥Yj9¡êv§6?þu¥…&›V¡Äú8··$¦Ú)ãÇÂ8«ÿÚW)Z‰Ö¥ÉhÐñÚõY3µå‰òðµÒ[Z4Õ͵ýÈÑY—ñôÓOË4MÙl6Y­ÖчÅbý9òHHHPBB‚,–¡;)Œ¼¾âäq¯ÜXÿrø#YìQ®ž IDAT*ÀŒ DÂú»Í÷ݲibÀ-"r¶Nm±LU¬/T†]Rj™Öª1d*¢zµ™i*¯X­l‡$%«"æ×«5 ò—n €]ÅkU”áäRQqŠšêêW¶¦ï¯“½ðëZ_8Ü("IV-_Sªìd»”\¨ü%-jô”«Ä›,›\*ȪU{ _±).>'ÛkoƒêƒiZ¿cõо*YîõAulRw8[^¯GFK»‘\ŸBI™J3{ä F•k ¨½Ï'Ë5Éz e­_¯BMRªRCÚw°^í¡l&Úµ¼¸\y9¹Ã=•ܲf4èPÈZ´?¨~kŠÖäxåqHr]άœÖ©¦Ù”çöÆz*ã8ŽW‹Pã‡:kÍуEJµIò¬×úà>¤ƒ%·‹¡²Òò|êӛݷBïc‹<žÅJúýEµõÓwe¡"\€[BT¡î bιG“ »¨¤á+ÙÄ´ µM $æ)%Q²%zåV“Ú/&i•Ç9Eé¦ÚŽ•{m‘Rb~5o‘™¶N9.ÉvÊ0Ï«ýl¯)6Û?TU‡©XJPýQ ÕV×&ÓX«‚«úÏ6Êן¨ §!«9ù´x·×ž6óãèÌ*RZ]µWº´¶8MV“Ž·õó ÀW$6(É’¨ŠÒå(i±;µþ~I³íÁd±«¬Ä£œ/¯ê“!õ‹õÇy=lëÔ¾¶ˆb–D•Ý¿LÁ :òÛ/¥ÅKUž—$‡œ]ySnÌ%ú°CöÕJkïÐA?_gY¨—àVa÷¨ü[ëTSU«ÊƒµŠne•mQ™Ç.É£µßªQuBUOÉ4’”V°YßZ|‹^ø¹T´u‹Tu\µ‡ÛdZ•’³N[KSG÷ÇæòÊc4©Ýíº¯‘\ÊrKA¼ISm]®²b»Zªª¶ßÐ’ÌRmY›=ôm]O©ÖæUêxå5Y“”’S¢Š »ªŽÖ¨²Å£m…¨bU•Ž×V{L²&¦(«|«ÊRm²iòiqo¯mÇÑ‘«ÍÆT]]¯£ëd¸³T\Q¢Æ£çùà+“ cª.<ÃS¬îüŒïÁd¸îPŽ­_ÕÔ~I’zuÄr›Ï]ªÔÓçLv+K_èý/ª{@Ò~U/uhóâÙ•×=Ý Œ<á~K úŒßµkg¸fƒƒƒW½yo```ôõÀÀÀè#‹þyD£Q†¡={öP©æµ77¬×Ç?{ç|¥¢çêÕÃQU<¾Qª·Â9êÀæÚ~äè¬Ëxúé§eš¦l6›¬VëèÃb±Œþy$$$(!!AËÐ8J#¯ÇÿÀõ/‡?’Åî "æ"‹C[þt©NýºKrhËZ^Ž”T*0¥Po¯õöRøÊ0,Üw®Z¥OÞ>@E˜RÇ‘J¹²³¨0§Ðs n‚?ú¿þoUþÝS²X­òn¨ÐíË–Q)FýáÜ9ùŽTêô/ßVÅ¿ì¥BÀœB¸7ÁíË–©â_öêþ¿ÿWŸ¾ÿ¾ÂþóT €QŽ”T¹²³Tñ/{ ŸÀœC¸7ÉíË–©ì…ÿ‡ŠpKážK0W%$HƒƒÔ€™T‚åÆE@„K0G9ì‹4‹Rfd0U¢qã¯#\€9jCÑ D5½D&ÓÔ`ô’¢ÚP´â†­†{.À•¶Ô¡WgéHÃgê7# RL*ÁbQ¢aÓ†¢,¥-uܰõ.À–¶Ô¡¿ü³{¨sÃâ n„KˆáâF¸€¸. n„KˆáâF¸€¸ÙnÆJûûû©yæ™ÁÁÁ«^¼7000úzppPP,ý9ò<j``€ ¸N¾üòK]ºtI±XL‹EV«UV«uô¹Åb‘ÅbQBBÂèÃbú>òÈë±Æ¿sWbbâ )×6ŸvÜ<ñ†K#ÁÒDáR,“Õj•aêîî¦R®ƒÛn»M‹E6›m4Xš(\0.€©Ø¨0y<*`âžKˆáâF¸€¸. n„KˆáâF¸€¸. n„KˆáâF¸€¸. n„Kˆáâf£ ˜{¢Ñ¨€LÓÔ¥K—æÅ>-Z´H†aÈívËf›ü# Ó4ÕÙÙ©p8,Ó4äñ7 C‡C2 ƒ_0§.0ÇD£QuuuÉårMÄÜjû …ÔÕÕ¥ôôô ÷Ë4M577Ëãñ,è`Å4Mõööª¹¹YùùùL`NaX<æ˜@ —Ë¥%K–Ì›`I’l6›–.]ªÅ‹+L8Ogg§<RRRt bÆh=tvvòKæÂ%æ˜/¿üRN§sÞîŸÓéœt¸»P($·ÛÍI0,99Yáp˜Šs ásL,“Å2/Ùm6Û¤÷‘ŠÅb²Z­œà ÃX°÷sáâF¸€¸. n„KˆáâF¸€¸Ù¨æ‡h4ª_ÿú×:yò¤~ÿûßËét*;;[þç.§Ó9ÿ+ Ô¨×w¿¤ýõmê˜JJ+КÏèÙÇ uÓ÷¾÷=öͽªxk¿vz8WÀ­p €yâÈ‘#:yò¤6mÚ¤eË–éâÅ‹úïÿþoýÇü‡ž~úiY­Öù»óÝïêû½ Zw…žøÞN»#ê©= ½?yR;¯éõïçÊÎ)p].0 êþçTQQ¡ââbIRzzº–/_®ýèG:wîœÒÓÓçéÞ‡Tµ{·j=ßÓk?ߩܑiÍF•zÓ7wÿDU;÷h£“óàz \`ž0MS@àŠ÷/^¬¿ù›¿Ñ’%K$I]]]:|ø°º»»e±X”••¥‡zH·Ýv›~ñ‹_Èétꡇ]þµ×^“Ýn×#<¢þþ~½÷Þ{jkkÓÀÀ€ ôõ¯]†aÜÜï=¡—k¥òÞv9Xæ©Ø¥Œ´)9"É)…Z÷k÷ {UÕ©$e–ïÔóÏïT¡SR¨J;7îUÅ·©mï˪lê‘‘Y¡g^Ú¥­Þá‚»«ôÒ /éÝú™îU|ïy=»Õ;Ô+*Ԩן߭WjÛ0Ý*Øò”ž}öêm¸ÕY¨n} *))ѯ~õ+ýÛ¿ý›Nž<©`0(IZ¹r¥’’’488¨_üâºí¶Ûô—ù—zøá‡åóùtâÄ IÒ½÷Þ«ßýîw4VµµµiÕªUÔ믿®þþ~}÷»ßÕöíÛÕÑÑ¡ýû÷ßô}ôTË'¯ÖæLÐ5É™«mUq²¤H£^zz·êӞЋ{~®=?Þ)oýÏôý­ŠŒÌo¶iïî*yŸú©ÞzëÇÚªJ½°»J! -ÿâ“?T¥±C/þü5ýô)j_Ø©N„$ukÿ÷ŸÖÞ¾R=»ç5ýüŸŸ§~·žüáêåôó =—˜'6oÞ¬ÌÌL}ôÑGú¯ÿú/…Ãa-[¶LåååZµj•¢Ñ¨ÊÊÊ´jÕ*-^¼X’ÔÒÒ2BÝsÏ=zûí·ÕÕÕ¥ŒŒ >}Zv»]+W®Tww·Îž=«çž{N‹-’$%&&ê_ÿõ_500 ‹å&~5RŸœrO;ìS¥OíÒ¶­[‡z*)GÆš—õtwßsyŸÚ¥k’%yõÄSÚ÷³6´Qªý™EÊõãÓ§¤Âgõ¢ï9½ÞR¤õeíõëÅw¿?4M¹Êyѧú'÷©¾w£6rz€y„p €y"!!A÷Þ{¯î½÷^ ¨³³S'NœÐo¼¡E‹)??_«W¯Ö™3gôÛßþVgÏžÕ'Ÿ|¢?ú£?’$Ý~ûíºë®»ÔÒÒ¢ŒŒ }üñǺï¾ûdµZå÷û‰D´{÷îÑõ ** »wSØJ’O¤«† ‹¨××#Óí•ÇéÕÆm†ëßÕëõªoªUm}ŸT>v~· Çô€²Û%c¸œîzŸLÏ÷ty²SÅÏüTÅ’zßmR ¯Mÿg÷[šÚú¤IœŸ`þ \`èêêÒ¯~õ+íØ±C’d±X”™™©+Vè÷¿ÿ½>þøcy½^íÝ»Wv»]………Z¿~½î¸ã™¦9ZNAA>üðC­_¿^---zòÉ'%IJNN}=Öí·ß~S÷ÝžY*ªTÕÒÖäqÝ—BUú‡GþA‘üo½\ܨçŸü{U¥Ú²µBÛ~ð˜¶í{ZÏ…ÆÌo2ì“Ü$)24}©¦$÷Ãúç=;å½âT†œ‰±ñÀ|Â=—˜ìv»õÙgŸM8ÝétêÌ™3 …BúÛ¿ý[•••)==]—.]ºb¾¼¼<;wN'Ož”ÃáÐòåË%IÉÉÉ ƒZ´h‘–.]ª¥K—ª··W‡–Õj½¹;Ÿ\ª'Š¥ê—^VcäÊIÝ•ûT¯m-t*T¿W‡B[´çõŸê¹[µ&7MöPDf|5,wqšä«VÛè:"ªn«¶>ß(#'GI6’<òx†îÀ~í~©Rç'˜_è¹À<œœ¬ÂÂB½üòËú³?û3¥¥¥)ê£>’ßï×·¿ým]¼xQýýýjkk“ÇãQKK‹N:%¯×+Ó4e†/^¬ÌÌL½ÿþûú“?ù%$$H’V¬X¡´´4ýâ¿ÐƇuøðaŒÎs÷^w=«¼ 'ñé‰*N“|UôÊ&¥íxM[<’zÖ×׫¸¸˜“à:ÖÉÓO?-Ó4e³ÙdµZG‹eôçÈ#!!A ²X†î¤0òz¬›ßS ÜlÜs q#\@Ü—7Â%Äp q#\@Ülsn‹¢½:þ¿¨%<ò†[e;¶)ßyÝV ÎÃÿK‡;%9 ôð_¬QòWY Ÿ~ùJ¥ü’œ«¶ëÛ«]×÷ ÜèòÀ‚6çz.EMj}' &_ˆ#X0¬V«æíþE£Q-Z´hÒ}ÅbœÃLÓ”aT˜SæX§–¨->™ãÞ ¶ø*,”“ãuS…ßÔ¾Ú $·Ö=¾MÙ¶n„Ûn»M/^ÔÒ¥Kççõe(4i`ât:uþüyy<NI½½½r8¸èsËÜ —¢~5ù†£%kм¿|!IÁ&µ Uäš5n_®Š;“d5œ×ÿÜèò7œÛíVWW—¤¡°Åf›WwÑhT¡PH_|ñ…ÒÓÓ'œ'##CÍÍÍJHHÛí^°½vLÓT ßïW~~>¿`N™S­ÓHO“F²%GN©J\ÕòÕ%…ÔÒTÑj×¼¨r‡Óy —¸áWŽ6›ÒÓÓÔÓÓ£K—.Í‹ýZ´h‘ ÃPzzú¤™aÊÏÏWgg§z{{ešæ‚< ÃÃáP~~>Ë×^;›‘¿©SC£*;´2Ï-—½@îÚ$…δ*¸zµ\3ÀB¸`·Ù”ššº ÷Ý0 eeeqÌÕ¶êœÙ’Hšº‡oØé¼[ùÉ6IÊsK5I¡OÔÜ[¬5ÉÓmrTáîÕŸjSGw@á˜$«C.O¦ò Š•—1Å·}¢çuôÕƒj7%wÙãÚ–o(è«W}ÃuúC2%Y.yV~M¥%ÙrÙ†Ö×{ºN'OQg ¬˜$ÃéRòòUú“’\%Ûǯ£S‡þ×auKr®Ú®o¯v]>W­ß¡hð´êë›t¦Ó¯)ÉpÊ•œ¦¼¯•(Ïã¸úNUþèö›b{u¯ŽI²flÑ›=²E»UùÊ!ùbRʺ'ô­l»Âݪ­­W{À¼<ߘRÂç[ÕØô‰ÎöœW w6©s$[ÊËî¡äTÆhºÖ™– JHžb£C:}ô޵‡®|;V°³Eµ-jɫЪX\[$ßñCªl Ž+*¨Î¦cê<Ѓæ+X}PÕ¾ð󘡠º[ªu ½Cë¶W({V÷ÝŒ)tú¨kWèÊÂì©¶»MMy›õð²Ï ÔH÷‡:|ø”üãê f†ô‡<æSÓɸE…ɳ;MC§«tèX›Bºz_ý¾ù}-:é-×–u¹ãB¬™î`: Œ{^\ÿöؘ,Ls$\ «»©{ø¹KY—¿sfäÉ­¡¡ñÂ- ”> Ô ·:¢îãu¬}äãCî ¯–/O“3PÏÙµw‡l©Tu[<õ¾*CaYÝ9*.ÈRŠK ûÛu²¶MÁ¡tpß)É”äôjÕªe¸ ™v5ÔµÈoJ2}ú?õ½òNˆMÌô×éP[»Br)kU23ÜrÄB ´ŸR][@1I¡–£ªÍy\kSã,=|ZÇÆKÎŒ<åe¦ÉåÂÁijQwXR°E•5^íXŸ!»lJ]¿SO­*Øp@oÖ%¹Uþø6å:&ÛöU6 1†Kn—S®å—g6¾,Y]ÊÈÉQfJ’Ö˜Â}~u´µ©3“b~ÕkRÆö¢á°1þm‰tWéà±¶Ñ0ÈéÉRfær¥¦ü=gu¶½SÁ˜öUë—ÇìÚQá4¤›nXHæF¸îT“ø¹»@^ç˜iÎ1Cã…ÛÕ(UêaJ´·^ÇZ†£ëÕ=^ò‹Ö¨ÔW¥•mqõ>‰…Â2¼ë´­"[£›“š¡ ·´ïP›Li(Xr—èá‹4ºªT–{œ:ðf‚’Â==êW²œ3¬’P[»äÈҺ˕í-\žŒle¸÷ëÍÚ€$SgÛ‚Š¦Æ^…|§F{‡¥”nז±Cæe+?/KUÿyHmaÉô5ÉÉP†ýò©bµ^.Ë:Åz‚MM’œÊY·YeÙã†å‹öª¹i¸7˜Õ£²í[”Eåä*¿¨H­‡ÞTuwL ¶«;\$—ãÊÓvÊm‰žWÝh°äPVÅÃZï½\@vn¡TÚ©ã«%$™¾*ÕtïÐúIºjM¹?€k·bh‹€[e.lDÈפ‘l)¥À;.ˆqÊ›ç~nÊ×Pôª"ê9Ù2&Xå]¿y¡ÔÞ2m*ˆ7æñ¨´,ûªPÈžR ,Çåm+Y_ ñ«²¹rT0ºÉ!E¢³©CYëÊÆK—¹rJ”1œ¨DúÍ8Ë‹*ì έ¼¬ B»GE«¼Jq»åv'*›ý1õ”?¨µ1±>}>œîÞ?V΄‡Ã)ïå º×Ô DΞTÛð:yTî —‘=C¥V _Sí';§ 'ݘ9ðYyH¾¦Àðs 2®Þ<¹k††Æ3}MòGSå»åÑ Úº‡“Gž¾¶Ü>éî&®’»i¨¬)¥Ü£Œ‰F>³Ùå2$…%9WÊ;áÍz 9G7a– ‘¥‚”IöÃj(É>¼ 3`5lênÔ'!åæ^ì¸ +ô­Âk<¤Ö,}-k’aãÝÊ¡ IDATì^myê©i‹ˆEf›lEhï®u—V¥Nz’Û’ µÊ}j¨WÜùOˆfËa›áþ®¾9 @› Ün~Ï¥P»Z†GI“§`â@ÇáÕåÎK>5ù#WNï÷+0Ü»ÅHË’kªÈÌéÑò8:/YívÓÍd¸¦Ÿg¶\iSì‡uÚäÊÊÔPõÆÔ]½OûWãén#×yÛÝ™rÏ*¶Œ*ÔÛ©ÖêpM`–+ï—?04.WZâTó:ä9bAu÷]ïýŒýðbäyBBÂUïO6 ׯ]o{l¢¶ÀX7ý#ó`{‹F²%uWꕽÓ-Sg“_O†FúõD#!ŒœæHqL³S‰r'J M·ëÍ­»ýºo-µT›Jûô~íÐp¡ÎÕv¶¨V’Õá–gùr­ÌÉ•×ã’ýÖcµ;âØöˆz;}j÷Õç ‚Á BfìÚw2¹<Œ^¢{âžHcφѓ!¢¾HtÂ_‰øö0S|X@› Üšnr¸TkKhÆKÅ:›äd(c‚¡ç¬Öécû-Ð ÅzCâ ›’ 7ë/¼ÝjklRËŸÃCëÅÂu¶ÔÙvJÕŽ •¬+W‘g–CÁMÓ+r¾QÇŽÔª3|õ^;œ.¹R–+3±CµMÁY¬<¦Xtôd˜¾m¶ËËÅf·?€ÙÿíYz.ܸv×øöí.0[75f‰ö6ë“‘lÉ™§òÒŒ)zÌDÔ]W­¦ ¤X·šz"ÊðÍm³9GC3dJš*‰)YàÝéQþò×H‘Ðyõt÷¨³Ã§³~…b’ª;tXÚþ Š\×ù ·êÈ¡ZÞ"Ë“§U÷x•–š¢äË7ªR´óÂ,Ã%«Fo-eöË”¦ì…‹D./G÷$¸á488xÕ{S½Àõi‡M׿¢âuÃ¥¨‚-g4Òy%åkÅÊõNÝS&%Ò¢¦j¿††ÆëQÄë Ýrihp³PO¯"šbX·hPgCøvgª¼¹©òæI «ûÃÃ:t* ) ú:¿ *<×õ$ 6ž–¬ò”mצ|çõ= m¹“¤¡qÿzŒÊi›ü ž ¥8¸±|U&çì{ÍÍÍÊÏϧ²®Áo~ó›)Û\ô³a¹ikŽÔÔ>-)/cú!ØyJyÑÝtyX5»K™®áçþ&ùÂS¬ÖߢNséh¯><´_o¾ù¦~YåÓÄ·ò—)kx¸X(¨ë[U{†Ã«W_Ë™Ž å]N—Ô4š.9å]52Á¯ÚšÓš0_Šöª¾¦] 1[’Í&… ƒò··¨g²Î ©¤‚ìݸ‘âbšìGŠt«þd`Ö%»òóä^‡¯¦^磞 ê­¯QÛð¾:ï.”‹ŽKð•šh¼ÿ±áRss³öïßOEÌÒþýûõé§Ÿ^.MÔö˜©›.Eåoñ†<žq-çPÆåtIþ–ÎÑÉ‘Uª¼áBLß1¨lTg02º¾p¯O'Ô©àB=ÔIÊZ>\A±N=|\­½Wöê‰ôžÖñÃÇÔ=r\îI™dxAS}³Jèìrö*ò©¶îüU=¨ÂÝ ªXØnJ¸ñ7©s$ÈÈ(Pš} ;2T"óKR@-¾òó‡zÃØ’‹ôàöDÕ­Q[`d—ƒ%«;Oå¥òœ?¤º…x´^­ÛV¡º£UjòÔJLáð˜1ò ·²ŠKUšwuo2‡·D9¿9¬¶°¤XXXVû »09²µa[LµGkÔˆI်}—ƒ>«+K¥åeÊw÷«Áß©º ¤XHÝíí •^—¦Ý{ªV?¸]®Ú*Õ¶ø‡Ï+ƒ%«;GeåeÊM¦Ï|ÕÆN“L’488¨E£Q Œ>G§”3òÞˆ±Ïnõ¶ÓØçcƒŸ±¡‘Åb™ô1vî·®¹}²k×®yùÉK$Ø­Îî€úB1É‘(WZ†–';úlX4Ô+0¨P¨Oý¦UF’SN§K)©.Ù§^PݾNù¦äL”Ëí•7Õ>›-P¨·G@PÁ`LVg’\ž e¸Æ” ª³½S~)Ñ•¢ oê•W¼Û é|O·üÁ~…%9]r{ÒäqÚ9à:èŒ~Æ?ƆE#Ïc±ØAÒøÇØPiìcüúæ“Éî—4>4š*`²Z­W„Mョ™ôh ¼m2_Ã%ðÕ›*\ù9¾×ÑøpiºPi¢`‰p ÌwÓ…Kãâ©B¦ñCå˜&Zßøí yÀ 3Ù}—F¦ÿ9~X¼±ó \QæTáÒøç·z›j¢6ÔL¦ÉæŸ(,š,XA¸¾2ã?  žF¦„JWLcïÏ4Ù{cç¿À|i?M.M4DÞdCàMT@<—ÀM3Ù·p-ËÓH5~H¼‘iS ‡GÀæC[i¢6Ód=À' ™âíµÂ%pÝL6üÝØ¡ñ&ûcä}‹ÅrEX46Tš¨çÒÈ|cÌçöÖøŸSõ^šêùDAÓTCâF€„Kà¦ÿáÄHo¥±¯'ê¡4]%&°ÚOSõ`š,@šì}€™"\7ÜD½—ÆÞGiÄØ@iì#ÞKK`!´«&û9ÓÇteL†p \W 7Ñô‘-¦*oü2Ó …G¸B[küó‰¦ñ¯'/Þ@‰À ŒE¸¾ã{+M0”Æ.?6dy=A˜Oí¨©Þ›ìžI“M“-3ÙºÆ#\_™©¦éæ“D¯%)®!í¦º'ÓDó0Â%pÝM54ÞdÓT½—&›oü:˜ÀBhgMö:ž i¢Ÿ•;Õ:—ÀW.ÞL-3ÕPz„K`!´£¦z/ž°iªçñ \7ÄT½—ÆOÿ<Þe¤+%> ­½Ïëxz;Å»‰p Ü@3 ˜$Å2/c=—ÀBh_Å;m¦¯g².°°.€*ž€Iš8TŠg¸¼‰Ê‹À ÜÊí¨k?Þ÷®uÝ`a¹iáÒÀÀ€úûû500À‡>,ñþ¿Ÿj>Ú S›IϦkÌͶ€ÅbQbb¢,Ë [ÏM —Ô××'«Õ*«ÕÊÑ`˜i8t£ç¸Õ\ÞL×s~0÷ ª¯¯OIII7,`º)áR¿l6›, `çf, °\Ëç,|FÀü000 i(‹¹ýöÛoÈ:nJ¸‹Ådá AÀÜÀg3ÌÏÿíÑhô†­Ãv3wŽÆ 4t$‚&€›Ùóïÿ¼Åb¹¡Ÿ·Ø¨f0=#šn|› àZ.€9eª=žfß–¸^—À-ƒKn> U€x. n„KˆáâF¸€¸. n„KˆáâF¸€¸. n„KˆáâF¸€¸. n„Kˆáâf›{>£ƒoTësIw–=ª-w;†Þôá[塀ßÐ]ßxTkSlqÀŒDÎÕG>SìŽ2=úàÝrL1oÔ\o1µîÑõJ›é¿œðïtð­få>ô°îq^¯y#êù]«ú–åën×lÿ^2Šúuü÷tÚœxrRáCúöý®ë|ô‰¾Q£Ïl}ãÑ”bŽ{ÍŸu¸ÅÿµTé#ÒºG×Îüúãúm…‚Íjl>­® Õ³*qɺãλTX|¯Ò3ù¿uFßjÐ]=¬ûœ×iónD™×xxM××\3¸î€i̻ˉ uuêY±Viv.àZEt¡µK1Iú¼U]á»u·ã­Êz‡²ósu‡q=çíWWcƒÎ¹× ]2W0•h½â»–$YoÀÿCIKe‰²Rë€ë~¹ä×GÇŽ¨þ\¢Väf«8™îH4uñósú¬µ^ï¿Ñ¬¥T~K\IÌ3¹î€iÌ¿¿í槪m-ÒÃ÷¹8º€k¼Xº Ö®˜–äÊÚܨ֮°î¾Qé’=E÷ÞŸrýçÌ1‰ÊÝôˆÖ¸¿‚K1{¦Ö?œ9æZ‰Ú\'Ñ€>zÿ=5(_]­åc.“Ü)˵òžBå|Lï×¾§êć´>ÓAÍ\K¸Žæ]¸dHºØP§3ÙZ9A êø­jë[ÕuÑ”dhIz®JÊîú'ü­þóíFõ%å«tÅçjh='Ó¸SÙ¥åÊ7ëU]÷©>7 Ý‘]ªu¥+å´IÑÐÕÕÔëÓs}2­‰ºó®"•–Þ#7_É€[^äB«ºbKT”›+ã\£j[Ï)|÷ÊÑ¡ñ"ß©¶¦AŸ}nʸc…ŠòccîС7tWù]êªoT×EiÉ]¥ZW$5ÖÔéÓ ý².ÉV醴ҩ¡¡‹ÞjžÀ^v]®>ohÔ§úd]r—JÖ• õ;¯3ªà'µª©ÿTúc²&-Sni¹V/7õѾ­Æ>Iկ뵮oèÑ’>½ÿF£r7ä««¶NŸ¯ø†¾ß5f?ú“¡%+ UVvŸRìÁ«Ëx E¶ðY}X]«ÓçúdK”ž[¢²û—ÕKäŒM°@fq=2åõÍøañ¨a˜‡bêûô„ÕŸÖ…~똶üðä©ÚîšìZÂ1í´@Ã1Õ›ùúÆC«•b“Bª¶þ´ÎõJ/)Ñ’Æj](yHrßÓûµ ò§¯QŠMŠϨ¶¦NŸ^0eÜ™­’|Suõ‰ÚðÐj¹¯º óëãšZ5v}®þX¢îÌùÌ-¤¼¥ÖÃCÊŽÜÃZ¨‡¾}¿\Š*ðá[z§«PlJ.,ÞeîÕº;?Ru_©ÙUMígŠŒ›-¨×‘šÏdä—kÓ76¨tY¿šÕèlÄ¥ûzH…IVÝYþ¨¾ó@ÊÐ7JbÕPÓ(e—¨$;IŠúU÷~­Î%ª|Ó7´i]¡–œ«×±†€¢š Œ¨_'Þ9¢ÖØ]*ÝôMm*M—Ù|Dãט™x¯Gâ½¾Ì_ægª©ï×]e›´i]¡’.Ôë½#Ãÿ¦i»O~-1õ4EºTßlꮲ"¥Ø¤pÇQ½S}AËJÒc–ëÎÖj5öÝ¡ì;J+,Ô’þÏtúbTŠö¨ö½ju%jÝ76©ì®~ÕÕ|ªþ w,¤ßy_ fºJ7}SߨP¨¤sµzïØ…•¨ôôDõu]ÚOó‚ÎõKê;§ aIê×…®~%¥/Sâhyñ.ãѲÜtY/´êÂÈÅWø3µ~ž¤»²—ÈÏuàXÓÍ×õÕ ®+§¼¾›ýu'LdÞÅÐIw•¨°õ5¶Öª5¿ìŠi‘þ‹2î\¦Ù¥C㽆>Ò·êuñâ9õEÇܤݚ®òG*´ÒðëÄ[冀_º³ìm¹ÛPà·oëÆ>]¼Ð§@_ƒºbRRám*\"kìs5¼ó¾š/4ª5xø¢6܆‡ÄKʽKI’”¾B‰õÍúÿÛ»ÿ×¶î<ßãÏøheŽ+W¹ 26  /^<¤¤ôÒe/w`þ’þ)w`Ù0fKà fÄšŠšÌ˜ŠˆŠŠÑ­ˆˆ] «Rr°“8|9išNœ>`˜‰¤#ëÈÕG/½ŽÞ§ÜØãìÙîT·©“¬,^<8!úØ íUÖ*G70>7ÇÙSÃpjŠ|²L)3Ïì™SÄH2•Û¢Úê2x‚œœ™çâÄp’é™4¥í]ÎòÈi»mºAš¹É3'ËM%Iä:$‚£=z¦ñ©%Þ»pxX[?ÎøÌ<ùÉs‡G7¦ª»¬wz?y§p°ýÆ•^†ùÅ·8;pŠÅA“+Å]šsï3ö¸û$}á¦|õO”}ŧðчœÎ<²FÌ7’¤×XœÉÅ.œŽ§I‡V×v(Ý>ÇtçéïÝÓOËO¹l¿Q¦ϲœ†þM¶7ë$ qqlˆ3ž‰³=È‘ú)’AnöjÛT™diác1àô<ó+l4ÿþQõoí²ÓΰðÑ[L üî©…6«k%{gÉf3ÄËUZû爷jtY2½µvŸsA‹j'N&—$F›ûÁ&ñ6é<ãÁåæ>g&†Ù«•i%r,œŠqçë(9ð¡gåÆhùêyrå3òÝÏÍ’ô¯ßwƒSLr”7ªloUɹhxì ßR.o³ñY‹f«Ãc,3¤FèƒóꆤSñƒ—èû'ÚÜåÿÕ¨ÎîWvn C«Ó¿B*IÇV¿U¦>ÉO&ËdŽñx‰J¹ÁþÙ,F‡ =G2öpIMeSGCE’LÜK¦Â‹o<íôê÷מû×å±'c¥§É'Ö¹vå?Hg³ds9rÙ1FcOÞn&ÙÀIÎæ¾o|Ã×&fz£Ç# èÝV›AbŠô‘O,GÒYƒ ­.ŒÅs’¤Ÿ¼'H}Q’ÄxN"åˆGÍ7’¤×W"÷0”KeIZþ³ß»?-K<å²;­„91è_¡ÖKQÈÞ¿“VDvœQ€A—.!éø€N¥Í 9MêÁ¯;L*›„Ç”K½V“n¯ÅÆ¿ÿñ'—$hõàl*Gš"Õö>a½M|¼@¾Sg»Öf?¨Ñ&Ít2ÆÑ…1õ6±4ùLÀµr“ý‰µr›Dn“ô¹%>L•ÏÌ‘òÕóäÊçÌwQs§$=ÎkÙ~ OÌ2›ªR¬ïR=òïû7?çÓõ Ý I6Ÿ§0Õew³ôà†çópuJÍ.2›z$¦-–$éøêÓ,Õ0 tõO”Ž^Ô(ÓØÏé!1 "¬%Ãc¼ýáÿfêfZ­Fukíb–…Ëïùö÷Û nwï;>_Û Œ39™#?7E¾´ÎõÞ‹ýîaà:(I’_ºÌ;;Iës¾öön~ÎÕ_,ßH’^Áý·ä/˜%ž|Yª78ò©Ø€ƒÂã~¾¨SjdfÆcß©–h…9æ“Áó-s ̳´X({½$™‰ &&’ Z5jõ=ÿ¶$éøê7)Õij \º|™Ë‡?—²ÄiPj Hd šUÚòEŸV­õ«1¾÷ÝW|ñ·&ñ±³\xû=~÷Ñ ù Æn#ÚÙ6Æ0L²|éŸyçâ9&N% ‹ SI‚Níp.ùáïÐ¬Ñ ’¤ü²’$ýŠîòÃ/šo$IÇÒ Eõa(¡ßªÒ$È$bÏ|ïþ´,ñ´ËÂT:í>ÄYRAƒò-ö÷oqc³Hc'N;ß}ɵí.“óÓœŒÅHdЮÑzðëîÓª=þˆx*E¼Û¢etôà'ì–)nUéöFÈL&èTÊ”; ²Éaâé a»L¹Ò!1™~ÌxØè·NçIêìlïÒNäɈ=g|öõé|õ¼ùN’^Äk[MÇNÏP¯p­~ÿå3 ž ­âU>«†t/V%óÓ¤w‹4w¯²Ö'ì6¨·z™Ó&•¤c«ß,Q„LÎd9utÄib†\X£RnŸŸ&³½ÉƵ$ó3‚f‰bå×ÿH/ Me»B/>ÏT: [/Q놌'Núg@¯ÓfoÿôcϽ„ â½&Õú-Ât@»ºÍf­Ç ݦÛ?{ñÈ62Óäâël^ÿŠ`6GØ©°Ul’˜ºD:¦Iz–.åõUj?9¢<ž.°<û<ÛâŸ~á|#I:ŽzT®_'U˜&=h²[,Ó_dr†Ã§¿w<%K½'_6œ˜"3Ød§ºÇع³,,4ØØ¼Ê•RšÉ¹E A‘­µUª©q¦—.qáàä?ŒdgÉmmpýzŠùé44w)6Ã;=ÍtòS6×?‡¹<‰^Ý­]ZÙ‡-ÌŒß*Ñ ó¤Cˆ…YR”¨¶Lgþ×È·N“Ï ¸VëœËqÿ’Ñܳrà>7¿Þ¡ä™=ò™×þ…óÕ3óÿÁHú ½¾m„3s3$üËÉü{äS¾‘gåÀ­r‰R¥}Ð =ëú¿p¾zv¾“¤_ΉO>ùäÞ¯}§?üðÃÃà ù H’$I’$IÇÊß}±ÎF¹M27ÇìÔ8éÔIâƒ;´›MZƒ¹3'-Hî|Ç7€ñsc‡SúÜúr•µæÿî,¯Ú Û_ý™OëÓ|ô‘K:žîÞ½Ëþþ>o¾ùæKÙ¾K’$I’$Iz#L¼s‰²evvË×·è>á'™%}æ$'¹M‡Òæ6µÁs¹ƒf‰b¹GºyµŠ¥ýÛÜlÔØ)uH²K’ô–K’$I’$I’žSŒÑ‰ ¼;q€þÞºÄ G†ÿãèyÛln­³Z„)²sËμRªß)±y­J+°˜ñi–¤'p,ž$I’$I’$IÒkäeųݑ$I’$I’$IRd–K’$I’$I’$IŠÌrI’$I’$I’$I‘Y.I’$I’$I’$)2Ë%I’$I’$I’$Ef¹$I’$I’$I’¤È,—$I’$I’$I’™å’$I’$I’$I’"³\’$I’$I’$IRd–K’$I’$I’$IŠÌrI’$I’$I’$I‘Å^‹GѿūW)wãL®|Ì»§_âÃÚû†Ï®lÒŠO²òñ»œŽùG$I‚þ÷Ÿse£ÇâÇï3ö¼kÃÞ >[-‘¿ü!çGÝ—’ôÚÚ»É×ÛÛ”j-:½A˜$•É3W¸Àéaw$ÉÜ#I:>üæÒó â$’!‰dHàÞ$ý"kKŠÉ©<©¸»B’^[ýïùrm­J“NÂD‚ Û¦YÝbmõ¯|·ï.’$™{$ILJ߻y^ÃgxÿÃ3îIÒ/¸¶œæÂ[§Ý’ôë7w)w€Ä+—ß>˜€°ÿ=_­­±Û®²]›câ܈;J’dî‘$ ¿­riÿ7¶ŠìÖštzajœ©Ù'Ž„¸½ïøj³H©Þ%žždUJI >IDAT.ßas³N[áã÷NûéX¼îßøÏÕmÚaž…é»»UZÝ8©É9 ç8i}'IÇtɸAqs‡Z«Ë€8Éì4óóŒ-zxyx*ËÌÔàÈÿ›¿\Ù!·£¾½K½ É\ÅØÝÜ¢Úì$'),½ËÙQF®®îŒ‡ˆÞv1Okg—j³CÌ1·8Ï9I:¶½€ äÁÛç™^X$ÙêOÎEØ»Éߊ[”ê-ºƒ8Éñ˜Aq›¿­o°[ï0ˆ‡Ä;e®oÖDÙ~·Ìõ­:½ z´*›lVîø&IÇrÍøž­õ"Ä4 Ë+,/N“llsmç}€½ÿæúZ‘z8ÅÂò2ó“v7kôŽ.ƒÛÛm&.qy1Ç zO¯îŸ^âò¥yÆ»Š;ßlï§-vŠ5’3K\¾¼È$U6‹5œ˜$IÇ×p*G ½Í§úþò__ðÕoiÎ;Ç™SÃÐÿž/®®³]kÑK¤I'´ë»l¬Å­~ÔLs¨]¢Xé‘̤‰w[T‹WÙøvïಽo¹öéuÊa&Ëx¢G³Räêú îܹÁÆÆá‡„™ é°G«¶Íúµ¯1áHÒ«”[nR\»N=œfqe™ù\—­Í*]s$éWð›9`¿±C© „yV>z‡Ó1¸sã3V‹-ªÛUæ&ο¹ÍN›#£*îpã/«›Qî!ÅÜGpanÿí?ùt»M«Ö¡~ÔÙƒ’tìÄŸ™'?yîðˆ½Au—õN€;ÕmêÁ$+‹Æ-°Ð^e­rtãssœ=5 §¦È'Ë”2óÌž9EŒ$S¹-ª­.ƒ',ÆÉ™ùãÐO2=“¦´Ý¢ËY<ß»$S£çY\°µµCµÕ¥Y+Ó¬•ÙHN²°ü.ãÍÊ] 5Çå.0Ên|¶J±U¡Ôša®!Ó<\I˜½t‰‹'cì÷_¬nÔhlW¸}ö"Tv¨ 1½Äòt’`Ðbçê:¥æ.åÛç™éÔh$òÞb,~›Å-j½.Ý>Œp$é•°WÛ¦Ê$K ‹§ç™o\a£u æIÒÏ÷›‰ÝF‹æò¤õhvŠTq“V»A»ž°~xìäáuFÉM§)^‹°*‡2áÁÿL¤B Í Úwž$I¯Üêx’³ù€ïßðu£I£Y§ÞèA O§Ñ!HÏ‘Œ=\NSÙÁÑ„$ÃW@@˜ ,¼A¹÷kßé?üÀðð0CC¯X·µ÷=ß5» Â4ã§Gˆ{ß|Æ•Íaþ½sÊ“TI’$Izeõo}ÉêÕÝä}xá`Bƒ$éõtç;¾iŒŸã ûïsëËUÖšs|ü»³ »‡$é7íîÝ»ìïïóæ›o¾”íÛ•Õk°um›6 ²ÓÓdÃ¥í 7™tgI’$I’$éÑ¡´¹Mm°Ä\.Á Y¢Xî‘.d,–$I/}ÉQ'/²¼ÅíõÝ"5ÂT–éÙ9fN»«$I’$I’ôŠ=Ïâb›Í­uV‹‚0Evn™Â¹úßÉÆV“Á“n$™^x—3Ž;•$ýLŽÅ“$I’$I’$Iz¼ì±x¶;’$I’$I’$IŠÌrI’$I’$I’$I‘Y.I’$I’$I’$)2Ë%I’$I’$I’$Ef¹$I’$I’$I’¤È,—$I’$I’$I’™å’$I’$I’$I’"³\’$I’$I’$IRd–K’$I’$I’$IŠÌrI’$I’$I’$I‘Y.I’$I’$I’$)2Ë%I’$I’$I’$Ef¹$I’$I’$I’¤È,—$I’$I’$I’™å’$I’$I’$I’"³\’$I’$I’$IRd–K’$I’$I’$IŠÌrI’$I’$I’$I‘Y.I’$I’$I’$)2Ë%I’$I’$I’$Ef¹$I’$I’$I’¤È,—$I’$I’$I’Ù?¬\:qâ„{_’$I’$I’$é%x™=Ì?¤\ ‚€~¿ï3+I’$I’$I’ô   ½¼ èR.…aH¿ßçÇäÞ½{>Ë’$I’$I’$I/èÞ½{üøãôû}Â0|i÷ûG<¸¡¡!‰Ýn—ýý} &I’$I’$I’¤tâĉÌËüæRìõ‡††xã7|¦%I’$I’$I’Ž‘!w$I’$I’$I’¢²\’$I’$I’$IRd–K’$I’$I’$IŠÌrI’$I’$I’$I‘Y.I’$I’$I’$)2Ë%I’$I’$I’$Ef¹$I’$I’$I’¤È,—$I’$I’$I’™å’$I’$I’$I’"³\’$I’$I’$IRd–K’$I’$I’$IŠÌrI’$I’$I’$I‘Y.I’$I’$I’$)2Ë%I’$I’$I’$Ef¹$I’$I’$I’¤È,—$I’$I’$I’™å’$I’$I’$I’"³\’$I’$I’$IRd–K’$I’$I’$IŠ,ö"7¾{÷.Ýn—»wïrïÞ=÷¦$I’$I’$IÒ1tâÄ †††á¡§7ég—KwïÞ¥ÓéA¸×%I’$I’$I’ޱ{÷îÑétH$O-˜~v¹Ôív‰Åb qâÄ ÷¸$I’$I’$IÒ1v÷î]à zã7žx½Ÿ]. âñ¸å’$I’$I’$IÒkà~ßÓï÷Ÿz½¡½‹%I’$I’$I’¤ãïþy—îÝ»÷Ôë ¹«$I’$I’$I’•å’$I’$I’$I’"³\’$I’$I’$IRd–K’$I’$I’$IŠÌrI’$I’$I’$I‘Y.I’$I’$I’$)2Ë%I’$I’$I’$Ef¹$I’$I’$I’¤È,—$I’$I’$I’™å’$I’$I’$I’"³\’$I’$I’$IRdÿÙÄ0® Ó7IEND®B`‚glewlwyd-1.3.1/screenshots/sign_in.png000066400000000000000000000234721322667720100200640ustar00rootroot00000000000000‰PNG  IHDRGã³Ö'bKGDÿÿÿ ½§“ pHYs  šœtIMEá#F·ÁetEXtCommentCreated with GIMPW IDATxÚíÝ{PÔgžïñ·ôM h”ÛØÓ HFÅoHFŒ3¸‰L%Ñ=êf3³§&qëÄT˜ª=UqþÐTM2Sc6s2I6ÑœŽLFfqTÜ Ìº6²t‚vFhÝ( H_ðüA+x¢¨ŸWUª"¿î§ŸßÓ¿þô÷ùÝzœ×ë=ˆˆ\"JC "¢pQ8Šˆ(EDŽ"" G…£ˆˆÂQDDá("¢pQ8Šˆ(EDŽ"" GQ8Šˆ(ED®‹q4 Ô¼ÌckË õ@S"v‡»cEKŠ)Ȱ^­1^~l-åAˆ-z^ÈŬ÷éæñâÙÇ×S¤,ßÊÛOgÜ~ã'¬ƒÜe•cЇ»®–òÝ[Y¿jÏnsâ×{ "wjåxIq8u1+\ùMð6ãv»p©ÅR·õy^N|›W¥ê‘;;­¹Å,Y’uíiLà{6­es™R»e+5 ^"Oóž±Á:‡ ï½G0[SoÏéè°r—M«Ì,za#'FþÝy„W@ïĘaÆ–šJjj*6«ÖAŽ7= ‹ /¦#.—WÜÙÓêá~³[3¬€¯o¦Ý|•cÀKMé6vì)§Æå¡3¦Ä2³)Z²‚â9CO§¼Î=ìØQJe—¯ïX»)6‘ÔT¹EKX^<‡ŒÁ 4s¤ä=vìsâr»ñu‚)6…T»ƒÙK~ÌÊYX¿áu|Œn #<¿xµ ~¤×ß°‡mï•PVS‡§0%â˜SÄòU+YG^\̺J`êzvþ¢ ÿuN^YöeàX³7ŠmNíãÝ÷vPv$ÒVl vGÅ+WQœg»þ1lnÆë‹ÂqŸZü§úS›mæëüÌïaÓÚÍ”y.ý{ÐçÁU¹›-•»ykÆ*^ß°‚¬«¦S3‡6­e}©çŠ%ÁNnW%î-•”¾5•Õ¯¿Ê’¬+ûç¯y‹_ÜN]ðòç{p×ypo,gç{‹Ùüú?“gý&Öap#íß`ï]öçynkÝ¥§n}¸Ê·³±¼”òu)f[Íû^aíÆ2.†NîÚR¶¬-eÇâ¼ñÏs°~CÛá­}}Q8^±Mž¢´Ìù‡ »ý:6=ï>^yf3å}ÿŒZHQA¹)àqÖPVZ†«‚µ[YýœŸ-o<ÍåÙvjÛºþ`4Ù™]TDAn ‰æ>“C¥¥Tºƒ¬cËÆÌ~{—÷a@ð¤Ì^LqAöDð¹kØ·c7µ>À½›—_+àý—.ûpÂ: 9F#éß š÷¼8 ™QXHÁì\b;T*£¬ÖGÙÆu¸b‡àέ¬--ÃÂåKÈŸãÀhÆU¶·J]ÏîWزè#^ÈýúíV¿¾(¯Æ=›Ö±ób6Ρ8w¸M/‡6mŠ„J,³×læ¥âSÃŬX¹„/?Ï–Ú ¸·³þݢ˦U ”ìpG^{kÞ~•âKÎ$ZDñŠìyþ)6×Á]F­w¶Q¾ÊHðL]½•W— œz. ¸x›žZK©:íÀéŸÃë(®ÃP6¢þ º¯½VÛŒ¦Ù¬}{‹RÍÛ]´äi~¼çežÙ\‰»sèæ<¥eXȺ×_`ÁÅvrÉ›³€ÙŽgXµÅtrdÏ)¹Y£>½½Õ¯/cÛ¨ñ;KرcÇÿm{ëWlzåyžzlUä4ž¾ªqÆOVïƒ Ð\ÆÖȧ>¶hÃ¥¡r5—%6P©\<%Û¹ä`xÀƒ+òò±OStÕS,S)X⸰F4û/ŠùœÍ‘ÿwP\x•вæ±|E>SÀ(¯ÃSÅõo°á/}/º&ò_zi@0öïKÎXô/Ì6 ³¯±¾´f@0õË(ZÅ…fü¾Îohó¿Õ¯/wUå¬ÛÍÖºá<ÒÄÔ寲¡xø'€7W–ÐWó¥P¼<ïÚSAkË‹)ÛéƒÎjš!÷¼ØZÀ«¿ûÝÐã¿öŦX3Ð œ¢ôH3‹®r{Æ’ übÉ7´Cìú7ÈèSY©¸c°âšßh6 VÌÁT9ŒËIc Yr­YƒÙJJÿ1»o(oñ닦՗l)Ž­XÉ¢ÜëÙÍíÇ}È}q?¡ÃìÅ;È@fGJdËöâôü°sÕÕÜPCMY);w¸®Õ2 òIܹAj7ÿ˜'˳¤h³çä‘a½Õë0’þ 64n.tÜBìƒtÅl/ÄA9C~GÚóiÇôÍoŒ·úõåî ÇÄÇ·ðþO¾‰ý3¼¾Åƒ•lüñòáÖ²xý¸¢G~Ž¢ìP%.—·ûžÎà°Z4çþ„«=¬ÛR‰ðDŽ.˜äÍ™MaQy—U†£½£Ý¿ÁrÝ{±ˆJLI¼'V©&®8R~å㬷v?Þ­~}Qå8ZáØyƒÒ/Û©æwîà•—·P黲ZHLÉÀž;›‚Är¶ìt_³:ËZò3Þϯ¡tÇJÊÊ/îÇ ú\T–º¨,ÝÎæÄÙ¬zéVäÙF}†ªo¬ƒ 'z`6ýúf3 5¯6Ýâh2)åÎG3±æ‹å)[ÞÿÉõÞrw/?¿…ÚÈ7qÆbV0#7—¬Ôþ:*pÄ9H8Fz”šGñOò(þ ø›ÔÔÔp¤ü•Gêð_%[×®ƒ­¯³"ÞØ9×8"àšyã¯áÝ÷®q´Úl ·ÛMݾj®þf.æklÿ”tt×aôûwm6欘9†[Ç–-G®¨ÞCly×¥O–(or:²ze¤|ñìfí3¯Pâô9?§öýŠçžß¹V6…ÇW¼4Ί=/%R.•³å­+ïDî­ÙÆËϬe·§¿Mß%GQR)œ¹£P°’WÖýœ= —¶âoØÇÏ×m¤6òïŹý}ñ: e„ýtøW±ÄÞ÷ÿeëxnÓ¼‹_6Þ†=lZ»þâe‘ÂZ‡=ävd¼½ºk&cÅzÖ:Ÿasy'xÊxí¹2^3Å’hí»’¡W—‰©«7òôeG<2–¬böŽTÁ½ó9/s0#7kÀ‹ÛåÂí ±Ì(ÊÅUZI'”>ÿÍÅ<ý rÍf²V®!¿¬/‚®Ýl^½›Í˜HL´ðûx¼Â4{-/,°ê: 5F#ëß`Mg±rýœÏ¼FmÜ¥›Y]ºL±Ä;¹‰Žåk°—¼FY'˜¬ŠFQåx“¤²hÃÛl^•OÊ…?;ñ “½Õ›ß¾ìšâ ³Ãlxc-‹‘“|}.jËË)¯¬Ãí b²²æõ÷yuÍjVØ/´ï¡¶¬¬ÿ2B[/½±žÇ§¼»BŸo@ðÄ:(\½™÷7,"u´×aÈðHû7H>fó³·/kûb0&2{õ6¯´÷?^á(·©q^¯÷ümÛû€—†šêÜšfRSìØír³†s¾¾«aúN`NMÁ>cs^B8Å‘}•¸|hÏeNÁ•GhÍ 8Ýnš=|~3Ö”RRíäæóë­Ã0šiÿá?UÑZ'?XÌ(˜ÓwŽÏ>¾‘:À±æ=Þ(Öo‰ÂQî`Þ#;ØQ㫃¢% ®y5£¿æe–­-'H,E¯ëv_r{2jdØ<¥lßîL¸RòøÙÕöUØöZ䦱;Œ¢ÊQîtþC¼üäú‹÷¢œZ´’E3°§XÁçÆå:Bé¶TzLÌXû>¯.²iÜDá(wA>:·ñâó[‡¸©Dßíè~öt®~^@Žr 4SSºm{jq¹›ñu±)äæR¼| šN‹ÂQD䎥!Q8Šˆ(EDŽ"" G…£ˆˆÂQDDá("¢p¹}Œø®<½½½x½^Î;G  ß㑱Ál63~üxl6QQ×_ŽèòÁÞÞ^Ün7“&M"&&ƒÁ wDDÆ„p8LGG^¯»Ý~Ý9¢ÊÑëõ’œœLBBF£‘qãÆ1nÜ8½+"rK?žóçÏc±X.fÕĉo^8vvvò­o} ‹Å¢ªQDƃÁ@bb"×ýÜ ‡ÃF£ˆŒÙp´X,7t=txܯ:LMé§X–-gš9Vr.";úÊU‰XŽôwm:ŽòYé1zððBé  ƒ£Û?¤jÍ®gDäî™V÷øüÐMWõmþÙð ï¼ó ]}åX\JóœI9XAÙÑÉ,›{cC~ÓÖADnØ8¯×{þFŸüÅ_——‡Ñ¨´ˆŒM¡Pˆššî½÷Þëzž.Q8Šˆ(EDŽ"" G…£ˆˆÂQDDá("¢pQ8Šˆ(EDŽ"" Ç! z{{5Š"2fƒAÌfóÍ ÇØØXZZZ4ú"2fµµµ1~üø›Ž6›ÖÖVššštk;MMM´¶¶b³Ù®ûù#ºŸ#@oo/^¯—sçÎ) EdÌ0›ÍŒ?›ÍFTÔõ×#¾Ù­ˆÈíàzov;â[xgee1nÜ8¼ˆŒIçÏŸ§¡¡áºŸ7âp´X,ú™³B¡ûÕ½§šÑhT8ŠÈG'‹ˆ(EDŽ"" G…£ˆˆÂQDDá("¢pQ8Šˆ(EDŽ"" G…£Œº®ãóæÖ½œi,DŽ"" G‘ÛßÍ»c{5|t‚éÅó訮ÂõUè$&O¿ŸÂ™éX.<®§•‡©rµà„ÁÏäìyægsñ!Ç9|°W‹Ÿ0f¬“³É/Ì'3f¨åÝþ!‡-ñ÷eaBž½¼¿ËExòÃ<ùˆ½ïoîOùõgmd/ù[œhº8]}€ÃG¿¢­¢ãÓpÌ{¹™q}òPöþ.Ú —1ëôÊœ]L_ºœ™ÖVŽ1Lkc7æä$Â-§iꆉqÝ4îÆœM’訧Ü ~î2~43¡¯OY™$üæ}öWTÓêÈgbdݺ;R(^VHºB§÷RÒf`òCKy$«¯¤ÍÉN†÷K¨kÃQåx™´éýÓc0’2=+m4¶‡À˜ÀôG‹cˆžÇ«iôÃ…<1ÆM&ÉÐsï^>?qšöž1öyN'Á8Œå Ò Ý¸[º!ÔÆÉvH›–G²á m=ÐÓFãHÊNÂô´5r†xîs$ X‹2§%Cwm~Öœ™Krdÿ€ßí!lÈdffÌ€¯¢d¦9¢µÕ‰¨r¼œ™¸hÃeJÀB˜î®0`¤«±œ²*MmÝ„Íñ$'Çaø”˜,Š SUq çþjöƒ!~2Óæ=ȬÌ8ŒC-·$ãH‚?¸ÚèJ÷à $0+%…pT4¶ÓcvÑF<³RúB-Übˆ3_ÚmCL4Úè‘eÑq–È€†èé@´•ã¥ÃmI0k«Q8^1©¦£;|éËÚéÁ@‚ÅGù¬ô=Žxx¡ƒô Ðw¥j@+–‰9ä?’C>=txܯ:LMé§X–-gfÂPË-¤d'A…‹Ó§;è¶N&%.šPš•@c#Mf«{Ü…4]t ÿ¨„»º cÁ<0ë †þŒ6C·Ÿ®$\\Ý=ímu"šV_©©º‘þÃ!1“¸ÀaöV†Úd¢-4wrÆ0™YIFbƒ/ïK®LìÑ58ý<7¡o’î! -Ýîq$õL\6óU”Vü†O:f‘l ÍUű“çÏd¢¸ÊÕ.ÆôYÌJrqøóiËL a¾:ZE£Á ­NDáx¹h²‹$úøçTí?F :žÉyÅ΋œç˜0Gê`ïá*þPÒw>avþR–và“ƒ”̲üé<\ÔEÙçN*ö×f¬ÉÙÌ_8—¬ fˆåÆ$Éœ'£I›ù£%G<´œI&'ià°XÈ\¸Œ‡­eTÔW°ßÙׯiE2wàÁ–+$0ýÑ%¤Úy˜ýXIv<À£ŽFJöjÃëÆy½Þó7úä/¾ø‚¼¼<ŒÆadl{5|tûÅ«ED¾y¡Pˆššî½÷Þëzž.Q8Šˆ(EDnØÍÛù—0“'þq¦F\DT9Šˆ(EDŽ"" G…£ˆˆ(EDŽ"" G‘[ŽƒÞÞ^¢ˆŒYÁ`³ùúïÀ?¢pŒ¥¥¥E£/"cV[[ãÇ¿¹áh³Ùhmm¥©©‰@@·ÿ‘±#ÐÔÔDkk+6›íºŸ?¢û9ôööâõz9wîœRDÆ ³ÙÌøñã±ÙlDE]8âp¹éhµˆˆÂQDDá("¢pQ8Šˆ(EDŽ"" G…£ˆÈmdÔ~šõÕÝu”V»é 5ª"rKYÌ&ŠfÚy~ñÔncÄ—zΞcå/è…(s4Q“Þ¹¥zÃAz{º0Æñî³’2á&ß•`å/в`Œž `‘1!Ê`ÂO#+qàÆÚIþ÷ÿ«í«M½"2æ,1ÂçÙ¼»îæ†ãçõ¢ÌÑzDdìV‘–~Wí¾¹áØj*-"c~Š}#Šu*ˆˆÂQDDá("¢pQ8Šˆ(EDŽ"" G…£ˆÈmĨ!ëÛb¢¹??›üžìI,iýºƒÃ ü²ÜKÛÅÆòÓµòÕþK3þ›Ò¹[ñš¢poãÅŸÎei"´žòPr¨“c4™÷&ó£ÅsùÑ÷¾à‰7ê©õ=¼ã\˜žPïMíâ­xM¹3è~Ž…/Š).I£x—¸çûóùx‘™£»Êù§ŠN—D‘]”Ïó­œØµŸ¿«èÖ`ɘìh£lÃ#×õís”aO2rr£3¼Y;0z©ÿCeAÈ™‡Uƒ%šVËݤ#Íý Qn¾lêò²þçH¢'²¯/–¿_û Ï^²ÿ/Š´Ül^\˜Æ¬4#M­”î­gÿŒ¿â_ì_°tó—œÄLñOb}G%‹öDó?ÿ&›Ei&vSUád}i M¡kõðò×I[r·Så(â¾ükzˆæ‰gðo˧PdÆ< zô·wr²ýÚi“6w6ÿþd&ùƳ”ì?É~_4KŸÌçå)W¹íݤ{xýélқܼºûŸ´š™Uð=~ñPìõw}4ÛUŽ"—ksþ™ÿ¾k:/?’FÎŒ6ÎÈz8QßÊáÚ¿ðáQ/m×ÊÆñɼøˆ Ë×'xâ—_FÚÔóÎÜ¿â“GÀwÙã'áÿ÷ýüÓŸ#û/+Î`þ_sY”m#©´sÀQñaͶD•£È•z©¯¨áïÖ—ò£7þÄÆý¡¼ r²¿Å?üÍ\öü¯YümêÕ7)«ÝÎ,S˜ò=î‹G³šj(»Ú}H»›xóè€;!?Uí€1j@µ:L£Ù–(E É&w ;JòÜ/÷‘¿©‚Wÿt–žèI<ÿdÙW™ÄMŠÆB7U__VZžëì ªËùÛ9}ÙC7ÚÝÑlKŽ"—–~ɼøw³x1÷ÊZ+ÐîåÃ+XW†ÄdîO¸Êó/¦€ˆÂQî(¡(²ï›Dq¾í§êôÒv®ïvà*ØñuˆfÖ¤ËÊJc4Ó4¼¢p”ÛÕ¹VÞ©c¹÷;¬Ÿwž:óD;ÏÏ0¯…ò«L“ýî¿pù‹ìÜ3 Ó¾—Í"ýF›ŒA:Z-Ã-ÙÿñQÊþy&…°ïûíT¹;iꆤIñܯ ~>Øþ'¯öt?Ûs,ÊáãŸÚøøxLšHÑ”(NtCNHûEá(·+3k7¢ø¡,þö¾‰äÏHÂtøº9ö''oîuSÕ~­ëš{©ÿã°Ô7•u ÓX:߯éSͼúV#q+ È ig¤Œ-º¶ZnÒ×°™{&Z ½ƒ“çþ=Ž×°´©’Â_·êN:òеÕ2v·±þÙÞY|ésÚ·˜'œ FÑ´ZîÆ)y+¿ü¼‡™7‹wŒ |p<iyb~;šØP«;ùˆÂQîJ!ª>ýžmŸÊOó³X7Ã@O‡ŸúZ'ÿ°ë$ÇÎi„Dá(wm>vsøæð52öiŸ£ˆˆÂQDDá("¢pQ8Šˆ(EDŽ""·8ZLFzÃA¢ˆŒY½¡ÓõŸÒ=¢pœ—“Jo.û‘1Žsüð»77ÿÏ›9ê¼RDÆf0ötcŽ:ÏÚÅSon8¼ûÜ÷1žê:KoX÷ä‘1Šá¡®³Ïx÷¹ïßP#ºŸã@›w×ñ»?Ÿ¢'¨€‘[Ëb2òÃïfÜPÅ8êá("r'Ñ©<"" G…£ˆÈ ÓÍno'¡v^üù *¯ºÐÄâ•3ùçd}ße/³øãL™¹üæo&\ñûߢp”2YLX ßÉñ¤ÆB€wò«7±³k<«þG+âõ^‰ÂQn3+Ÿø.+ô«¸(x‚™–IDAT" G¹ç:)Ù×ȶ?žžq$NJ`É÷3Y1%2‰;sš§þÕ;&™õ߇mågÉ}l:?‰=Ë[Ÿ}ÉŽÆ Ö´I¬ÎëaÓoÏ`ι~×7´ín¶½}Œ]çØú¯•¸Ÿø/¤_:Õ´œäÉw›ñÙRYc÷óî1?~K ù÷òÂÌØ‹SÍæÿ:ÅkZ¨ô†öÌdV?œÁœØ¾åÞ/O±i_d¹Á„cJ*«˜NÞË»Ùöf-[Ï^ØÑË¡íU¬wCâ÷¦ñþC±ø«²ü÷]ÄæäòÑ&`¾á1mçW%')q0O²±ršÎœ»]hÕ&ÔÉ[ãµÿôã!†©i&|_ûØúq-¯|yÙ ú]m¼òÛêΆû‚mû ¶7ZLXÏ´°ñ·g^WÛòØ™a0¿à^· ²‰y›yíX»Ýе«‹²ßãź@ß²¶&Öïj¢ÒÛKÊ$+Ž aÜM¬ûÍ×xÎxX÷q•^°Ûã˜ÂÕàfíošhr¹…ÙSL@ºÓAõp¤­ïe}M]øéÅÕØwIlîÔÌ7:¦a?¿úõ±Ó h­ÓË–}úunUŽò °õÿ~ÎÖ1eåò›Ç&pÿ…^ &™×ÿq ¹Fh®>ÊßEÙÛX=%Û€çåýà>^˜‹ùë–y ©¼þÔ=ä{(ù·j^kê¬mgL‰ÇaqSÛe"7ËFÖøÁÖc<«VNgERþ/ëyòcµlåÔÔtl]çˆM‹#ÿ;Sxif4æ •™÷,žÐ$¬^.€ ɬ)Î ÏÒMÉïNr¨'ˆ/¶A—Gá˜jÅTããTC7þo©ë €·÷9+5-ç+…éFüî/nhLi¬cy`³³ue:t³ãßjÙòµ¶`UŽò1ŘI™ÐÿŸc¸¾bÌÝIHœšŒ#òÕ—úíTÞ³¸:–DVN‹Ã6> ï—‘çeMŒ<ÏBá\륅Þõ´=ÉOêÛ­iÉ}íœmÇs¬ö)løa ¹_»yñ׿‘uãðTsò$ò-ÀÙ&ÖnùœÇÞýgì$Výu¹Æa,Ÿ4‘\ ØrW‹S˜(Ì‹ž.œ^?5g›¼ØSð|Ù€ý{Idc4…³b´ñªr”oŽ™•Ëoä€Ìeû» FLôõ-3£œ^2îÆÛæs¡ [aünOmoÅgO~^ kfÙþÛæþ€ŒMbÃj+5Ç<”œh㻃ҊJkÚX÷T6 †\neÁ$¨ýº}u½ 1NÁù§&Õµá3'`ƒ¾iúu©¨r”1ÅfÅøêZqE*šæÿjî›bÚâI1^}3Hµ÷Í=u_ÓꋨCò í^ª’<르¥/½ Í8l ØÇ÷â>æÃ8ä²á¡tØB}û#šëNòÊg_áLJç¥åßåÓŸÞÇ〞³”Ÿér9˜™1Õ œc÷ >‡mÔÕœ¡yߎÆ<‚1M™ÒW%ºk¼œ ôP^Ó¥T•£Ü Vû·X2ÁÇö³Í<÷æYfć¨m &ŠšD굞7e2E'¥g›Xý¦;çpwÝ@ÛÆ(lã®;öÄþÃ{(¸æ¹Žv~ð'ÊmQx½A‚ŒcöƒÉ ŠS6ÆõûcŪ7[®:¦¢ÊQnÚ×],O¯œÆšïXI wQÛ$qR"«–Nãû o·qkž¸—¢I&L]çðÆÚXóƒ¸K§ˆÃj;šÂ|)ð5¶SÓÓ;H™›ÆÚ¹1p&H0&†Â|‡ ßî›ÔgäÝËêL3&‚œj‹"ÿ}GÁ{βÏÛ‹uJ›ÿ:™Àí>CeSÄI6V/ÏbA,C.0Û’Èœ8oÏ´`Æ„#-ò‡ä$ãGaLWf±8ÍÜ7¦Æx–ÏÕ>ÇÛ…nY&}:;8r:H ÖÊœt3fÀ{ì(ËÛEbÞ4Þÿaì¨]êÖžcï=•vÍÊKDÓj¹õÎu°e—7fò禓ÛÅÎ?vf ¿­k€Eá(w©¤t6/…×þØÌ‘ŠFÊGâ¤D–ÿV¦kï‹hZ-""而ˆˆÂQDDá("¢pQ8Šˆ(EDŽ""cÄÿ4æH"àtÃIEND®B`‚glewlwyd-1.3.1/screenshots/signed_in.png000066400000000000000000000361111322667720100203670ustar00rootroot00000000000000‰PNG  IHDRH=Lm_bKGDÿÿÿ ½§“ pHYs  šœtIMEáð6TutEXtCommentCreated with GIMPW IDATxÚí½p“×¹ïû)X2®ä$R ’ÃÈ!›Xm±°ÛÆÚ rºm·Á=Ó·›p²çÔæ‚}0³/ævcö\;ss†™˜öâ4!ìºÓœšžcå¶(;cg76iez"‡ @­!–#¥ Õø•qî’Œ ¶1¶üƒäùÌ0ƒäWë]ëYk}ßçYk½k}!|Š ‚psÄ‚ "‚ "‚ "‚ "‚ "‚ "‚ Ÿ µîäñ‚ ((xšCg•ñÿXéæèÓñß°îy7ŠÔ Ì"Ú·ÇúèÏsösÒA“&Z[%•9ªØ'/ÇêøÆùÛÀÉ}4zc4…l[oA--R„ÏNˆ­'¿²’ìøGÏóì;‡ëÙξ†Î¸:’·­«V*F|MOÇ"«2ÆÓ„Y+€±ˆm•Y±:ö5ÐÛmwÚM[8úI•]I¥MÔQ„Ï¢@ÆÂml0Ç>„ì>4Æxbw»Oc²Ø´-½Ô‰ ŸUDIIÕZL±Á»9Ü=’DhÙ×H|èÑ´aÅF©Af)S‘¨zñz¶­vRqÜx9¶ÛAñbõ/ÔÞÀÐУa5Õ%™c'pÓ|ô(-m.<þ0@¥1`¶æPT²žB«~ä‰ÀIÊÖÖáLå/óBÉ(*:É–ÕutÝì:n–Íššt¸Üx‚‘èÐF‡ÑhÆRXÂÚâ\2GʨâbçãU´E «ú8òµ\M44Æé £Ê©ç—ÏZ‡—Q àr¥©¥ —ÇO8*Ls…%¥ç'=Ù¥øÚi>Ú„£Í+ ÁŒ5¯ˆ’Òb¬ú)¨3ÅMí8Ã`®<ÆÁb=J÷I¿Ü„³½ Ð0™­¯ß@ñHé$#$Ûzü¶Tp×>A…3œðkuk ¨ƒ)j W3‡:hsyˆfO‡ÉšGqÉzŠs“3ô5áþq͈´7¿LÓI7¯—`8Ú¦Œ&39%O²>1ɤû”mw¦¸Ø»®Šh­"§úÏæë‡ïÞu±¿éXY„g¬£[Åwr7UuücÜN—WEýŽ¢;mé£uw5ÿØ—©²(ß¿‡’Åê1ò;h ¢ÎI|âúN¡øZØ]UsŒÛ©²7°W)‹'Ôb|-µTÔ· åáF Öìg›MŸÜ:&n/S£i¤ªÎ9jZ†•u|&wxÇHFI³õ­Úr$L¸WÒÛ‚“µUÔ‘€ie k½5ÔwºÕ4ÙÄbõ4ö ä:ÄöíÇ芌ñ{ÓJê÷?“´‰Þ¹ÿôOÿT3%9×ÈWyiþÍy" òÑ»½XŠa¡ºÿퟨo»€ÆþÏüßßÏõérí¦ìÇzãÍ(ÛNaÉ÷(±[™¯…p÷G\„+Þ6~sÞLqþuiõ§ùÕ·wæ–°Ê2Šå”óüÏcoÑ{³ëF¡ûhÿíÕb•l"ç;ßçû«¾ÃwìßÀºDÇÕÞó|ti{éèLþê«Ü™˜ÀU?Σ¼ƒ6ÿ*oý¿ÿ‹4&Ìæ%|Õö06Ë̉þ¿ü—ÿ‡·b½M“e§xÕ*J¾óM–ÌOã’÷<Á úω6…¼ï,C?÷Ÿô­ÿ©k#ZK:²ìßaÕ÷JøNîW™?×K—7 „ñ8ßBÉ+fY &]gW{yëßþ'ç# ¾3ˆãE'~LØ×þ?ü‡¿g•ýAÌs?Âå 2„?ø‚¹%ØÌMnI²õ­ÛRÍ‚GJY¿¾»ú-þÇï/fªŽý‚]?ZÏßÿ‘¹IË_×Þ2~üF¼¶4˜sò)\µš¿³H»ä¼?Ì¥œ´Åµ-ÍBqIî-µ©I÷ÀIvþ錉£!g%¥ßÿ>«¾ó0VóôÿÿàÒ´ú-?²0)K§$ÄŽ£Í­d[^;5máØ„M /¬ïfßaoüQHeyîè.±âæP­#öÔÕa¯9ÈŽo%¿¨ÊÛÙ[VÍ ?„Ûv³ÏeeÇt¯RÎÒÜ/S6•/ì¹n<µˆâÒRZ¶>M}g¼N:¥dŽžzzÕuT^/hÝŸù×SYÏŽâ„°"¿˜Òõ%4íÜJCg¼Ç¨9\È 3Çß`Bí4ìn#+OùÁg)Ipóò‹K(=¹uuDðÓÔÐJÉžØ[’ëÌïp‚ÎNõþmäãy°`ÍÍ'Ç\Ɔ¦½¥ŲxÄ2N<$Øz2¶D:¡@êÆñ'›?åìajã¥#xoÅ¥›(oÝMYc ïwêû‡¯í1qÌ*odOIb{Χ¸8ŸÝOWáB¸µ w(—dŒ Lñ«†Zl••Ä×Oìdgõ¾¡§@Ve%ùú±úéa±ZÑ­Ü5b(‡6—M5k1Æy¸i_.¦øñÄŸà¶Ž±•˜‡žÚ¾ÐØIfWíg[þ¢æsÒk)šÂ]Ã;ÄM,”ìÚ…]ˆæcxná͇@ëaâÑ]våŽa:Ž>ñ]·OhªêLƒ}Ge‚°]#³pÃPÛ Ãc”h‚i$ÁÖ“±åÍ£ÖÉæ/„ëåæ˜ð©ÈÛñ숡­ÞVIÝjà ö… ;þÚ‰™bûýBkemiYf3f³%IoúLý»Øú|*+ãËǃtzbêh.g[‘qÌ10ÓEôj¥¥£¿]£^\BiܶnÇ-‰Arž6ö¼ño¼ñ¿Ü1z>•Pd|é©ì¬åÉáëhŽÍü(^kÝûÖZY[¨‹þ?ìÂå·<âjîŠå#RÛhO0=¹ë×bÏË#ÏfŽ•y êLc§d´áµÃx¼„ ¦1y[OÆ–ãÐÇÉæOñâpÅÚ¤®˜'Gu¹Ô,.)Å<ƒýC¥‰ÿªGûÈ9³däàmØ’´^0e:ôÃX´Êæ'Ù×54’ÊÚªb2oÒQÝq1Õå=fõdçÀ㇈—r3™%(øÎºp9oòŒï'æ<Ì#¶¢ÞVïÐ8ŽY 0†»¬6€`Ô–A…±§¯=íÛâk¯2ó0!@úÜìÈâ:3Y1šmÕøì9¡4’`ëIÙò¦ã “Ï_À'æÝj¬ùc7c6ñêšþþ¡&3?Ýñ‰ÐYÿ$ëœ+))Ì''×Jæލ¥LH)ÜTÈ¡ Gt,&g¥7›SÜl½ýM.×›u€á+#ŽØL=!ζ·âlíÀãñâõvãGn9•v´%' ø@P¤ƒº'׎3ÅÐ8m¢Äßl2omÉÄTÔ™V;ùšœPI°õdl9 ùSB>†ªË¢»‰ô U× ôµeuå~ª:þŽ4tœˆÚVgÆš›ƒ½°›53©vN™6íPiPa@¥Oƒ‰‡]*õͯÍV’6þpKUïn¢vgÁ=!“%›®†ãÞñ ÝŽÚ)Â,[d¼FQÂC&½UYI~©’ð ›XI°õ¤l9 ùKxÇm<ùÓªg²¨Y\ò,Gò\8ššhv¶ kF‚::Ǩ×å°aÇ6J­É‰±S˜µ¨ÐÄ5$4–nJh¨)N¬"…ÈD³haçÖ†¡É']öJJ‹md[,,6^˵ÒîŸ@Ž®( ÅLh-Úxn¡E3dSev×Ù”’[OÊ–SŸ?µúÚâñ/c¾è« yÃ3Ù?ÔF+Å›¬o‚ÏË墽­•Žö.ü ØAcU54î§4sòjö ¤ZÏа‰Ï…W)Á¨½òü¾¡PÀ¢›@@ðLxö»»éåXå«È®|g‹Sàk1šTà‰@È;ñecÚ]‡IAˆx=°2êTZ &‡5&{ 6ãôÖÙÔ’[OÊ–Ó?½S,jö»<„#³xGq=kliA¤f×k7Ííáøã‰,ýhNâèOq_GÛ'„טQÙX_8zå‡&ü¾æ5˜óbs‰7whÌ|¹ö–±î‰'XW¶÷xµ›96qám¦mŒNás4ÐÐØHccS,ýä×ÙLz“¶õ¤l9 ùÓš°Å7Mèj¢50Vu5Óž¡þ¡œåÐÖ2ž~úi¶ìn%4Š^X×W-gŠø½„’Ð fõ‘ ™ÅűM/"´í;ä¤m=9[N}þŒä­oOØEþ“#çO9Ëá}NÂ3Õ?Ôjð{ðz½tlÆ5š‡|׆4º¤x©³ûLc1åC+\³µâyNž Y œ¥õù­T‹7®<ÊK®[Dª6`ÑÅÛÀ>jº‡=Y”îjËj†ö¤œH(fòšÚh8ä¾áÉpegY'üמªÁ‰Ž°ks)_óü'¨*«¥ÙHhx!ºO>OÅÖã± G«Çz[i¤öhÝÀÆX¿ ·ÕPQÛŒÛwíН•ç·ïZm*]‹EÄ:›= 9i[OÊ–×ybþPòó§ÏßÄÊøɶ:Êv6ÑÞº6îx¶•ç·VpÌ;“ýÈ='–ÉHµÕ{i9;<•ÐÙ“ì­®#¾ÿMv±%)³ÙS·YÅ ¡çYW~œ  Ê«ç—ã¹9TUÁ±aM„ð0Q3±º~?›FxeÍײ•'ë;¯}¡1`6éPü]xcqµym5ÙÎ:Žû'°YEà$Û×Õ ½ …ÎL¶Å€V àõxð#€†ìB GGìµ3Ù¶b6n+vˆ„Í*Töz~¹c,ûøhÙYF}¢ª«4è´Ñ·A" vÊ*?xÝkYã/SmYÎÄq•a‚‰³YYå4î¹Îœl%l41âÎ5 žÍÞu圎Ц’‘F²l= [ZÊX[3¤J‡Ùl@c©äÙMñW"'Ÿ?åìQ*Êî¿iоæ5ªrØP¤ñ˜çÖ'…’Ñ?­ì|úzGF…N§E I\-¤Ê©â…g‹HÆî‰³ÿTC­…û©Z™54#Ã;šÊ\HUÃÁÅÀX´‹ý•ö¡=* ûñtÅÅÑ@^eû×›'¾Y¯>Ÿ]«Xo zèlk£­£ o0‚Êd§rÿöT–SÏDÄO§ÓyÓWGq­)Úõõòz,&˜Ð!T&;åõ/LLceÚq°ž y ¯˜E;´ saõ☤:›EaÌäm= [êmˆ¿C$ˆ§« ·7œÔü©—²¿±ŠBsâ¢ùkâ¨2¯¤ú…]×ý}šû‡ÞÆŽƒ5¬ÎÒ$$!LG{y=Gv%G§ÕƒL !n— ·7HÐëL˜­V¬Fíøïvãñú )jt& Ö\Ë3­·>Æâ;ëŠ-‚UP ˜²sÉM\ê¯tÓ~²Ot& ¹6ËävQWœu¹èòúñ)jŒ&“Ëb}ÒÂV%pW{Þ`E«Ãd2c6/f\fŸlÍ&’`ë ÙRñájíÀí Q‡ÉlÃ6Ò«“IÈ_¨ÛE{§¿O½.Ú~“Ö–’Ó?ßYÜ^/>¿Ÿ`HÖ`À`4a±d’ìVu{ ¤ Â42GL ‚ )‚ )‚ )‚ )‚ )‚ )‚ )‚ )‚ðÙ"éæ*í[YYÝyÓëT™+öÂb ó'ùºÝgWíãT9#€ŽÕ GØ´X--tÔ‹¢j5RâAN‘°O‡ƒÆº Ö®ÛI“;$µ!Ì:q<»w+W®¤¢9 æ2¹h²WSj»naE!ðá÷tÒÚéî8âo£¡¢ß(Û• ÂÌ裇fgPì 95èm%”޵¯bÈMÓî4´/Ç·×b9ò,ùo ³À{ìnÞlj°XBBì™Bk¡d×Ajì×v Þ½¯ ¶…“Å@7îöfön]džD<È™F­rööjœaˆ´¦5K‘x‘´*£›Ýë*pHD-Ì.´Vž,6à<æº8Þæ£¨xäÐ<àn¡©ÉA‡Ë'¶%³J£Ãh4c),amqîu»2GÚËOyu¿`Wîè㜾æ2žÜõ²ªŽqàz¥V¸GijiÃåñŽ€Jg ÓœCaI)ŹÆÙ1ÛpÓ|ô(-m.<þèîÒ*³5‡¢’õZGÞ5tr «ëº@•Gý/wa¥›Ö¦cmn¥£Bc0“k/ami>‹µS“FRlžpŒEVõqäk ¸šhh8ŒÓ¾î(…„.¬HÔíyèŽEϬénõ*6^·;°ÖÝUÔ8n<}0âõtàmèÀq(‹òý{(Z"£&³ØŽîÄq‚Dhoö äŽvÞ‹ŽæxX•MIîpqT|-쮪Çy]"A?žŽ4tœàPööï*½y§ŸB|'wSUçÀƒütµ «í‡óª¨ßQ4æi‚Šï$µÕuו7BØß…óXÎæfÊëŸM°uòÓHžÍ|'k©¨sŽ|¼¯ÚÊ®_¿q¾ÖòDU2NóD '+‘F+&¢ñº(¹húL÷Ñêkâ¨2‘SXˆÍb@§VúÝ´:tx#颡®‰œJÉŒ§Yˆ]wœãAˆ´7ãV¬XGê¾6šâç#å”2L'©-«:4H“e§ÐfÅb¿Û…ÓáĆHg#å!nd&–1†\»©¨s ‰€!ÛNž-‹&Œ»³Ž“x#l«§¢VË‘]¶‘·©xh¬jÃ4fòì9äZŒ„Üí´¶µÑÂ4TìDsäÙ‘‡D&›Fmv¥æxL5&Ì&¦\ÝM¥¬|œ5 iÀ¤ƒÎ ò„!C9KsSìÜIU6•/ìax^Dqi)-[Ÿ¦¾3^'R2õC Iq¡ãÇüÑíÝ ÖÒ×ÖLô.l¥Öáк{w¬£jÈ©¬gGñâkÏ/¦t} M;·ÒÐï1jòÂÆi>ÎTqs¨6.Ž:ì5Ùa»¦:ùE%PÞÎÞ²jNø!ܶ›}.+;F\ZåÇUV9û÷”\ž¢bJŸñq²¶‚:g"ìÛ׊mD¡Lɵ¹÷øqÀ@au•ù™²è[³çUCµúšÇ ?`\‰v4m#…#O±•˜ã~Ôu§ªÉ,´ÇN} ÓîðŒp€¹¶æ˜ëì”$NìsÒ;³RS¸kxGGµP²kCGB7ãL¯ C퇇&t+w±Í6‚[§ÍeSÍÚ![8·3êhUÛv•Œà•ÉßVÇê¡ãŽÒHrS`óìªýlqnK„ÑO$ÓÚØóƼñÆür‡eÔ®„"£'žYHq¬3†[›oìH>'×ô±s¢>vÄ=KÅk­cäÓÊÚøa.ß´ºxœ®ØQŸ&JKG·“zq ¥ñg‰Û1ª¨hò×cÓš¥OfÅ>táåM¨‰¦‘t›«ì¬—¶Âm+Š‚/ÞQ5·r̤‚ïl;-‡j©Þ7ÖºµLò®)$ÍשB·óZ‡,)^œpÿÞÖxxo¬Œö/„Úl ÝÁét!¸=±„.‡ì1µ@OvNÜuóŽ**»iÌzÐ[ó‡Î÷¶ûP’–ÆØÜœ7ì¡'ãaöŒA*Aüñ™­݈9ÄÙöVœ­±³u»ñ‡#ã¾E¦½Sc#^´·xP,q/«›¶æØ¹{æpÄóé îɵã¼[„@Hé 蔄a½ýMn«7ë?Â)Ÿ:Lº›%bBx ¤¹á‰¦‘|›«´z ­…ÛW _;qÿOe²Þ°»OÈÝDíÎ:nè‡*t†LL–lº6Ž{G¿‰ÑN±©‘/ÛZèÞd‰Žu;ˆëcÖê<Œ×y¨á :‚e:=È‘øíTãØyfh†6¶[Í ¾é,®­ ˆD#€¥i¢iLÍåávHŸ³mhiJ¦Í<¼=ZعµÎx™½’ÒbÙ ‹×®TÚÝc $FòŠM4DG÷&/VÓípÆÖ fSzÀ™M¼ëVÓpd³s2U4Ÿa $tMPBák5Š· ßÄVB"qM;•Mãv±¹ðYgvŒA†Úy9î‘Åê¼á"ÕÝôrLUdW¾Ì‘=ÏP’Ÿ;LÇ‹1¯„èüD§£E9Ksl²*¯”W¼h1šT±|z™µo¢©õ Åù\xÇôÀüñG=–Ãà0nÏØ[|)Þö¡Åèz“nœh·‰ÍÈ©'@ë¾Ý8ã‹ó®Ÿõ áuňÛX_8ú«|¡À8Þy0æP›Á ¶9ñx±·44ØJFš-Uc΋ý âu¶6žW×Þ2Ö=ñëÊöâžÖe>z,ÖøÄK;Í®1ò©¸inÇÝq²F™Ðñ6·áCdÝÍñ·R4XrILãv±¹ 9¥ž£›æeÔÄ÷ÜSåPY™;Fh¨0jû¹8üòxv_1’·:ÖùüŠ-¬ÖÙYkYzµ¹¥ä¨¢‘s÷!FÓÅ}˜Ý'<øƒAüš\LÓfÇf„#´í;<ŠX(œ=¼GL …%£¿nè9ľ“Q˺/žÈõëF“Æíbsá³Í”ŽAZ›8Êèæ¶wzÞs5±úÙ#ì©Åd5@—"m4rcÙd&¢×Qöín¤ÍÍ«kìKŸ»š,êé"Hgç5¡uœK›Kùz3=à?AUY˜ÊåZâ3£!ºO¦n÷ñX¸h`uyî$æB¸››hÊGoWÈ+¶E'–ŒÅ”ÛRí ƒÿ8[+`[U)¶ÅÑ|*³´ÝGm|œV“GyÉX §#tÔUPÞÆ»£P¸[³¯îDlY”Šì ¥XÔINcÚm.Ó,áÎã4vŽãBCå;¶Qb¹yg–l §©ŽŽxW°Úi&Ûb@«ðz—â,èêº&Î%Å™c©™¥5T¹Ë¨o ƒßɾ 'ûTtZÃ\[l¤"«¼Ž“šUˆÐu¢‘®q]›©Ð†Q}˜äV>ËZoÇ<ñ§®ü8 B£‰6abõ®m£/âFCV¶–®N?Î}U8÷J£"rݲ*};ŠŒSÆtÛ\fQˆ­Òè0粡z?ÇŽìU£‚–Ï®ƒU¬4Çîƒ:ÛÚhëèÂŒ 2Ù©Ü„=•唯WGüt:×½rxm¼.·$ëÚGs yÆ›‡æE»^ ~C†! Lè¨*“òúØS2ƒ¯³i-lÜßHÕÊ,4 ‚›(Ž*s!U or¼…[å~ö—ç *n¢°éÈÙPÏÁ¶1\›l·‰Í…Ï,_ŸÞ>ÙUðuʼn+¨LÙ¹äf&tt¥›ö“x‚ 3YȵMÁ‰‰J€³.]^?>EÑ`Âd2cY<Ë#‡|¸].ÜÞ @¯3a¶Z±Ž1û?´—#64¡4P|¸Z;ðø}Ðc2Y°æZb^ëÔ¤qÛÚ\{æPc\œ‹qqî—d’[”Iî”fCÏâÜ|çÎrsiXlF,“.¯k~1Ö™Lãv±¹ !¶ ‚¤ ‚¤ ‚ )‚0Nn³YlAñ AD AD AD AD AD AD AHAHAHAHAHAHA„Ï®@†8¹µ€‚‚Ö=6vvµÂÙ矠  €‚²fâ'#+®k>p‹6L¬NBîCly¼€‚‚ÇØÞ®Lº=¹Žn§ì‰Ç((xŒ'ÊvrÔÞ*Ü®©Å’=NÐïöÆ'„ÇŒþ¹»o¬Ï<Þè‰tf;ñC '§tgyþ‰ žæ¨O*ôÔZ &“Õ”Ý$„ëÐ1ºÂ É*Än˜T…röù2ª;ðÕ j‚ž6«*xþ¬"õ)Üž!¶1;v4§·#*†ŠŸŽØùôD<¸}ÑŽäm~iηÈ!ïÓÖÆ®~Á‘™ºc£Ba ¶M›(ÊœÄ7/7ûk~Á‘#¿ qƒ ðs¼±Ô¨p; $FV öà 7ž0˜ íèðÓî \^9Ùúa¬Û±›²' ((x‚-{[I ¨|­‡ØþôãÑp½àqžÞ~ˆö@7GŸ.çxÀK㓳{´¸0ÐÊó[×ñXA—ÕÒìáºÐYšwoa],T|¢l'GÛG í´l‰+<Ýäò¤Úw>FAA[NÆ•¦röyž(( àé&|CQn<^ë!üïæèº¨öžU€­±á'bÃæøï](#„Ìö{>öe;rc;v ÏÏZê=a+Ùr24>{úŽòtAO쥵e/[Ö=Íó§ÿŒ¢U¡1S¸X ¨1Z-Ñ3¾ýAHá6Hµ »EtÓîUP¼íøÐ`±GCio»%äÅí4VlƄ߆Ôïk%¤ÖAºNÔP˜î&jjŽÑáU0˜³0Âx;ŽQ½³…FòÊ7­Šz/yåÛXmRè•<_VÃñN? }ÀICC× ¡ú¡Šrö9ºðc&+K íªŸ¦¶}¤n©'·$ ¯ÃŋӲ(±ê'渞Dääè¢vê €â#æ”®/¡E¥IDATt{¡àiïÀb7ßxf´¯™êêctxÁ”M–>„§­‘ª×ú¦ur]~ò*+±ëTd­­f£E}ke:©­?A—?w®àÙ_üš_,%3ö joj% ¨Ì¦äŸq.Ó"h1ÛÍ@¯ÛG·ËK9f3¹FvyðyÛñ*‹á:fbC,œÚ¿Z€§Ã„‚Ýh²²É«<È p°~&o'~EMfnfmT°,y6·‡ZE½LÓñ/i¤Ü|Ý5®—iòº•ìÿÅA8ÂË•f Œ³Ñ9¢÷¤Ï-!ÀãÀ¥û$ía ««~biŽãIDf¾ÐÝê%òÐT±á—'*ÒvËÆP¼­x ÅTîØÃRY˜CŽ>@P_ÜŸÜVýÈ¿ÍÓþcT­-àñ²}¸u…lض‹z|u2n©ìë -èµêajßGí ?VR·ÿrÅ}ngDŸMŽð4Óâ•ÉŠ5†DÜ47w&ò­ãoé!×nž.¯£ÑáE›]LeÕê¨9­(£zÍÖ’TDp5·ÓæðÙÑðzÂiŽÇY·o‚œtzˆ¨ÌØós0à¥õ¤/ ËÉ9Õç³ë/S_¹{¶ÅÛ‰ãXåëvr20CöTkF˜aW𵺣¡pÇ&Gá3 êLlV„»è ƒ1ׄК,Ò鉀.›lýø;’×Ñõ:7Õ³kS)ù™áQBSeÍQcȉz‹Þæ6ºmÍžë¼_3* ètà‰¥ãk; G3s1ŒÛi­ÅXUikäÈ.òÜÆ“¦ZóšžXˆÀÝv³õJz²íÀË ‡Œ6Ì&+ft5wFƒÕ–9b8ê;ù<µ»_Æm*eÇž#üúø~V€°‹6ò–ÑLÔžÃB÷Òzöó¤YkafHInrjÌv 8; fKT)ÔÆ\Lªãø# ²ä3þU j4&=Ƴ¯Œ²“zÂÃ.Q£×A?M ÏcªÜ4|ÐÛÖS¨©Âái`úfLxñ¯º')1´qÌœŠudBtvù…å…Gõ欔äªèh ²‹­CžÛ¸ÒÔ[1«Žá;¨x¼A‚‘›[Ƙ“ƒ®ñA@—…^«%×mÑA^ G­ÖO»³ §³G¶ƒâ¥ÃýMž!yB4a{&Œ?¶Ön ® ÌUÇ8X$.¤p»{€Ö’gÂHN¼ÃiMäÆzĈ3«cY¼ò*‚t{UäU–Gg­Ã.Nv+@&ö'íTìèÀÁ R[©Ü¾•ÉcYæ#‚ )‚ )‚ )‚ )‚ )‚ )‚ )‚ )‚ðCÎÅFG{'%ÞOQæ,ÉH#=á£ÞOp¾ÙÅOO‡ Mkf4l®z˜§.ÿûO|Ó|oA¿êU³Ü¶Œj€Þ|µƒšÎ~ WŽv°å7aF•§1Óº5Ô¦%ülÛ×ø¡iÓï|È‹­¦gA[7>L­E-mCz×Ëû¤ ûÇ%~ÞÖéz–k¥®Åƒ>ß\éã2°è®TÔ0ª©5êYšçϸœ®e>NõôߊŸÿ ¾œÊ-8ââú„®óÄ&<—¤´Ôéwq7¾Â†sÅHWô³hÞ@–‰@ Ÿc ã ÂÒŒ Hù3§F )ÕØW}šÌKÔ<Û†3å³Óη¼Ë³Þ‘ }•zE%Ä>ç„q¾‚´ þëÒQ‚TíÖdÁN‡@ †èEÅ©7¨Î¢¿Iú9se $~˜—Æ¢„Y ^â" &Ì©saÿÞïKání\„?½ÓEK,ÿÞCÔ.M.,)JÖ|™¥Àéß\àO€Òëãí>XôèbJkTÏ_Èæ/Ï…ž œžéwuzîIðt3²cOÐûÞ¨þ}l´o Às¯Œ½t!ª4´¼ '-Âe ¸‡K¼øêzn1 ÊÀU 5šà´‡w¢…éÃy®Ÿ§–ÝÏþÿ<‡—N‡Q›òÔÒTN÷ÁÒÏùÅ׺)ܘIÍ3Káé^Î\V±tÙB–§õñÊK·^ARøŒ¢xÏð»¬ùÖ½šî`yö]¤Fú9ßíÇñïgxÎ=|mâÅÓ§ønè>j 3ɳÝOz¤Ÿ÷Ïœ§zØBññÓóÞ9Z–eQdû )—pz'ßòÇ×ß¡†¥l^ºˆ­÷÷sþÃ^4º¸øØ ö$\:÷ß;𶯼‡–."Oá£î Ôý«›&¯ÄןG¾>MFBö¿F•./ž ‚0»‰\¾ˆs×cãºVÆ AD AD AD AD AD AD AD AD AD AD AD “Aª*…Á«±¨ ³–Á…TÕø÷èIš@~ã#ƒý}R‚ Ì^T®Pð`æô ä¿|?õœOE$A˜âØß‡zΧT­Ìš~8\ñ)Ÿ* üõƒWeÿÞ÷úyéõ38>RXñ£¿cOf4¥êíߦúLy/õñƒª‡ÙrùØâ#4š°N¤\‚xÂ̳hÅ×yqÕ|Ô==¼ò»^.Þµ€§žZÁþÓ†šÇWËãµï-dù¼Ë´üîš·€–~“í÷ÍxóÕj:û>^9ÚÁ–ß„£âhZÂ϶}š9ý·¼Øúgzd°uãÃÔZÔI(G”Ôô vn´°œK´}½÷ÝKäWeŠ ÐÖú!¯¸C¤.YDݶo²ÙÍ÷©×ß¡æÝh¾_;ÚÁZ>a<ò6Ùr âA 3Hz¼vè-ž=‹;ŸÚgr(Z¹„ån§æ-d»M ÈŸ;ÙØeÏ-}ÿQjH7Õ<´ì¸Ü;Çãßßu/¯n³°üoÒà\˜‹¾^N÷ Bv?ü —?^‰zwkÖÜÏ—»ùÑÞ÷8u%öÛßzÙùÌ×ùîªÅ¼ôÁ{C÷žP9âif,äî–VòÿýrTàRîdç*é}=l©wñvìºçÞ¼—Ÿý£…§VeðóŸ\à¢/À)o– òþ¹^N…n¶sþäË%ˆ)Ì$Ýgøé¹„êå9Ç%H›Oñ‚9Ü}ßBà*ÎëÈOŸáçÁÄ„šþØëÄP§ÌIÃ…»¾ÄšðÑ»^Þ'í¼Ø?.ñó¶>H׳\;¹r ñóßÛ.yêù y( ÎÿöÌ8(½xibùDgÛ“Q.AVSó_{át¬žoy—g½#–í£ÞɈHBÙ‡¦L}Ïšºr "¸¸´1oéÆN§ÖÝÅ=ÀÅû‡ Ä|Ó¤s™‹ ߥgÜÅ|®r*4@¨§HÇž‘Bó‰<‡2æ&&ÄÖeiô¾ûß{-pmFwÞ—nšw%x‰‹d &Ì©sáaÓ¿DÞ8¡¾Y9`î(÷Ñ‹ž2Rá\ß°n±èoҀ˜¹2±:IF¹„™GÆ ?„Îy9 ,_õV\?®5OÏæµ I§ggßð¿e.á¿Þ—ðŒœ7ŸÍEw@¤—æžA.z/ð>s±¯4±$á²»-KX£Kà4-w? [îr÷ߘX2F3ûäÏ8ƒpÏ£YßŰ¼l߸Œºo¥ßüõÈ›”cTëõñv,zt1%Œ5ªç/dó—çBÏN‡&X)É(— ¤ …ì¡æõ…¼²*ƒ=Ûçóþ™^ÎQë4,_ró÷ßü?õ]'‘Öl|˜E=œîKeyvKÓ®rêõ®è¤Å• <ûæ½¼¸â^yf¿zï”ôùfßAð*é1QQ>î¡­o!E«–±=ÍË©¾–,1ñ‹ ¸g‰‰ÂÓghö  \ÒYó¨ NûqxüøZ7…3©yæo)<ÝË™Ë*–.[Èò´>^yé=7+ÿÍÊ1ž{ýcì¥ 9P¥¡åÝ=ié.[À=\âÅWÇqïQIB¹H! ò§wÞ¡¨ÛÈ-º{Æ—øî’¹ô÷õqþÃn~ê8CÓã`µ½Cõ'‹Øúˆ‰§tÐÛó1¯¼öÿÝÝ7”îm¬ùø+T¯˜O¡Mòqçëoó󔥼òhì²+½ì:ô¿QV-¦xåRÖôõqúƒóü¨þ©äPoËdó×/àðþ…ž÷ÎѲ,‹"ÛWÈH¹„Ó«:÷ß;𶯼‡–."Oá£î Ôý«{Ä|ßz9Æž8}Šï†î£¦0“<Ûý¤GúyÿÌyª‡ŠOƳŸ\¹„™ç @àÓd$dßùkTé²ÉmAì ”»ß|‹ÿäK9„Ï‘Ëqîzl\×ʤ ‚¤ ‚¤ BRIšÏ#W|üÃŽÿ%åñ AD AD AD AD AD AD AD c¤ªR¼‹ ‚0kPHUùwÒòìï“aö ¤r…‚3§_ ÿåûÙ¨ç|*")ÂìÇþ>Ôs>¥jeÖô $ÀáŠGHùTaௗ¼*ûÝ ‚0 „ñê½Dʧ ‡+¹¥ß&m?ÈDêOtñÆï»éˆH ‚0³¤ªR(x0ó–<Ç)HA„ϲÌGARARARa*™’Å÷œèÂñ/ýмY#ÂÌ’ªVQø5[gzÛé ë¼…2sÔiÌ™«’ÚaF¼a°ÿ¯¨ç~Ã[ÆpǼ™ ±×x‹9©¤¤Ý!â(¬`Î\)_¼“)¬?ðÖ­ý6Y™øçëŒzŽªT©AfsS¿ˆrõSêOtM¿@þ9ê4©Af¯7™úEÞøƒwú²_‰HX-¬·oeòX–ù‚ ˆ@ ‚ ˆ@ ‚ ˆ@ ‚ ˆ@ ‚ ˆ@ ‚ ˆ@ ‚ ˆ@ ‚ ˆ@ ‚ ˆ@ Ÿ×¦òÕ5ߢ£öoùÁ]b AR>7ÜûÈ :j¿Iá<±… )‚ )‚0QRÄÂT 5ÝËöÇLäejIïëã}¯Ÿ—^?ƒã“ÁaÏç ˶+ƒå)\îéÅñ›3¼™ýM~bú5õçøÓ¤î¡asÕÃ<ì ¯±eè—±ï/¿‹ý'ŸP¸ùQª3Ò¨ûñ·ÙÞù6EÇþ’p½ )Iâî¥òj©ô¾Ohiý‹iéä-[DÝ6=KüÏù¢–ñõ^]¥'õãyíÍ˰`>kÖåa¿<’s›3À›¯v ¬XJMö ¯ýß8zÂ"Ž‚¤0-êN6¯2Þ×Özo_‰~ýÜ›÷ò³´ðÔª ~þ“ \œ÷%¶?¦'õã÷ùásç83p†¿þM~µê.&áãÊð }½œî„ì~þøA/¼"Õ(ÄcAH"êù y( ÎÿöÌp(½xibù<КL,W]¥­ÅÇ(=gqF’sAf—@¦k™O„÷{úoeÏФ²D é ÒH¥S_K_ sê“äÜCD …YbßâuSxAfJ0D/*ÈH½AÕýMÐÏ™+pùcHcù‚ëÔ.%¯Þ•œ{ ó:?ÌKc‘x˜‚¤0íÙëãí>XôèbJTÏ_Èæ/Ï…ž œAÈ{ÓÌ%¯ÈĽ ™±l EªäÜcž{»œ/'H°"$Ÿ4 ¿•EFß¹xîO¼äðÜëc/]È* -ïèIK§pÙîá/¾z€P϶ÜË+EðÚf=¯½]æSxßÞïƒ}©ÍÀ8ïAÎsý<µì~öÿç9¼t:ŒÚ´§–¦rº–&ŠîÀU 5šà´‡Wú"Â-3—¥Ë —8ýéæçî>.ž>ÅwC÷QS˜Iží~Ò#ý¼æ<ÕÃqræßÿƒ5Á,ª¿•Ášz>êö±çÐyÒKm<00öàäxïñÇ×ß¡†¥l^ºˆ­÷÷sþÃ^4º¸øØ ö$¤×óÞ9Z–eQdû )—pzY )ð…@ ði2²ïü5ªô»Å¢Â8ÍjîŸ Ÿ\æO‰ã…)él¯²±¦§ûK½„ÄRB’‰\¾ˆs×cãºVÆ …™ažžš-6^\©'q¾D±éð¾;,â(Hˆ-|N õòÜïúùÉ7–óbÊY^yOŒùüpEó/÷°«³Ol$ˆ@ ŸW8õëÿ`Ë'YlÎ[Luö\ú/‡8Óéæ©×ÿ$¯û "Âç]#ûxûßÏÛÿ.¦f'2)‚ )‚ )‚ )‚ )‚ )‚ )‚ðùÈTU ƒW#bQAf-ƒ ©ªñ/ÿNš@~ã#ƒýòz˜ ³X •+<˜9ýù/ßÏF=çSIAf§8ö÷¡žó)U+³¦_ Wüÿÿ¯ÖñÞH'jIEND®B`‚glewlwyd-1.3.1/src/000077500000000000000000000000001322667720100141475ustar00rootroot00000000000000glewlwyd-1.3.1/src/Makefile000066400000000000000000000030331322667720100156060ustar00rootroot00000000000000# # Glewlwyd OAuth2 Authorization Server # # Makefile used to build the software # # Copyright 2016-2017 Nicolas Mora # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU GENERAL PUBLIC LICENSE # License as published by the Free Software Foundation; # version 3 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU GENERAL PUBLIC LICENSE for more details. # # You should have received a copy of the GNU General Public # License along with this program. If not, see . # CC=gcc #CC=clang CFLAGS=-c -Wall -D_REENTRANT $(ADDITIONALFLAGS) LIBS=-lc -lulfius -lyder -ljansson -lorcania -lhoel -ljwt -lconfig -lldap -luuid -lgnutls -lcrypt OBJECTS=glewlwyd.o authorization.o oauth.o webservice.o token.o user.o client.o admin.o scope.o resource.o password.o PREFIX=/usr/local CONFIG_FILE=../glewlwyd.conf all: release clean: rm -f *.o glewlwyd valgrind.txt debug: ADDITIONALFLAGS=-DDEBUG -g -O0 debug: glewlwyd release: ADDITIONALFLAGS=-O3 release: glewlwyd %.o: %.c glewlwyd.h $(CC) $(CFLAGS) $< glewlwyd: $(OBJECTS) $(CC) -o $@ $^ $(LIBS) memcheck: debug valgrind --tool=memcheck --leak-check=full --show-leak-kinds=all ./glewlwyd --config-file=$(CONFIG_FILE) 2>valgrind.txt test-debug: debug ./glewlwyd --config-file=$(CONFIG_FILE) install: glewlwyd cp -f glewlwyd $(PREFIX)/bin glewlwyd-1.3.1/src/admin.c000066400000000000000000000117361322667720100154130ustar00rootroot00000000000000/** * * Glewlwyd OAuth2 Authorization Server * * OAuth2 authentiation server * Users are authenticated with a LDAP server * or users stored in the database * Provides Json Web Tokens (jwt) * * admin services * * Copyright 2016-2017 Nicolas Mora * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU GENERAL PUBLIC LICENSE * License as published by the Free Software Foundation; * version 3 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU GENERAL PUBLIC LICENSE for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see . * */ #include "glewlwyd.h" /** * * Get a list of authorization_type or a specific one * */ json_t * get_authorization_type(struct config_elements * config, const char * authorization_type) { json_t * j_query, * j_result, * j_return, * j_element; int res; size_t index; j_query = json_pack("{sss[sss]}", "table", GLEWLWYD_TABLE_AUTHORIZATION_TYPE, "columns", "got_name AS name", "got_description AS description", "got_enabled"); if (authorization_type != NULL) { json_object_set_new(j_query, "where", json_pack("{ss}", "got_name", authorization_type)); } res = h_select(config->conn, j_query, &j_result, NULL); json_decref(j_query); if (res == H_OK) { if (authorization_type != NULL && json_array_size(j_result) == 0) { j_return = json_pack("{si}", "result", G_ERROR_NOT_FOUND); } else { json_array_foreach(j_result, index, j_element) { json_object_set_new(j_element, "enabled", json_integer_value(json_object_get(j_element, "got_enabled"))==1?json_true():json_false()); json_object_del(j_element, "got_enabled"); } j_return = json_pack("{sisO}", "result", G_OK, "authorization", j_result); } } else { y_log_message(Y_LOG_LEVEL_ERROR, "get_authorization_type_list - Error getting authorization type list"); j_return = json_pack("{si}", "result", G_ERROR_DB); } json_decref(j_result); return j_return; } /** * * Check if authorization_type has valid parameters * */ json_t * is_authorization_type_valid(struct config_elements * config, json_t * j_authorization_type) { json_t * j_result = json_array(); if (j_result != NULL) { if (j_authorization_type == NULL || !json_is_object(j_authorization_type)) { json_array_append_new(j_result, json_pack("{ss}", "authorization_type", "structure must be a json object")); } else { if (json_object_get(j_authorization_type, "description") != NULL && (!json_is_string(json_object_get(j_authorization_type, "description")) || json_string_length(json_object_get(j_authorization_type, "description")) > 512)) { json_array_append_new(j_result, json_pack("{ss}", "description", "description must be a string up to 512 characters")); } if (json_object_get(j_authorization_type, "enabled") != NULL && !json_is_boolean(json_object_get(j_authorization_type, "enabled"))) { json_array_append_new(j_result, json_pack("{ss}", "enabled", "enabled must be a boolean")); } if (json_object_get(j_authorization_type, "description") == NULL && json_object_get(j_authorization_type, "enabled") == NULL) { json_array_append_new(j_result, json_pack("{ss}", "authorization_type", "You must modify at least one value")); } } } else { y_log_message(Y_LOG_LEVEL_ERROR, "is_authorization_type_valid - Error allocating resources for j_result"); } return j_result; } /** * * Update an authorization_type * */ int set_authorization_type(struct config_elements * config, const char * authorization_type, json_t * j_authorization_type) { json_t * j_query; int res; j_query = json_pack("{sss{}s{ss}}", "table", GLEWLWYD_TABLE_AUTHORIZATION_TYPE, "set", "where", "got_name", authorization_type); if (json_object_get(j_authorization_type, "description") != NULL) { json_object_set(json_object_get(j_query, "set"), "got_description", json_object_get(j_authorization_type, "description")); } if (json_object_get(j_authorization_type, "enabled") != NULL) { json_object_set_new(json_object_get(j_query, "set"), "got_enabled", json_object_get(j_authorization_type, "enabled")==json_true()?json_integer(1):json_integer(0)); } res = h_update(config->conn, j_query, NULL); json_decref(j_query); if (res==H_OK) { return G_OK; } else { y_log_message(Y_LOG_LEVEL_ERROR, "set_authorization_type - Error executing j_query"); return G_ERROR_DB; } } glewlwyd-1.3.1/src/authorization.c000066400000000000000000000354661322667720100172310ustar00rootroot00000000000000/** * * Glewlwyd OAuth2 Authorization Server * * OAuth2 authentiation server * Users are authenticated with a LDAP server * or users stored in the database * Provides Json Web Tokens (jwt) * * Authorization check functions * * Copyright 2016-2017 Nicolas Mora * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU GENERAL PUBLIC LICENSE * License as published by the Free Software Foundation; * version 3 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU GENERAL PUBLIC LICENSE for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see . * */ #include #include "glewlwyd.h" /** * * Check if the authorization type is enabled in the configuration * */ int is_authorization_type_enabled(struct config_elements * config, uint authorization_type) { json_t * j_query, * j_result; int res, to_return; j_query = json_pack("{sss{sisi}}", "table", GLEWLWYD_TABLE_AUTHORIZATION_TYPE, "where", "got_code", authorization_type, "got_enabled", 1); if (j_query != NULL) { res = h_select(config->conn, j_query, &j_result, NULL); json_decref(j_query); if (res == H_OK) { if (json_array_size(j_result) > 0) { to_return = G_OK; } else { to_return = G_ERROR_UNAUTHORIZED; } json_decref(j_result); return to_return; } else { y_log_message(Y_LOG_LEVEL_ERROR, "is_authorization_type_enabled - Error executing j_query"); return G_ERROR_DB; } } else { y_log_message(Y_LOG_LEVEL_ERROR, "is_authorization_type_enabled - Error allocating resources for j_query"); return G_ERROR_MEMORY; } } /** * * Grant access of scope to client_id for username * */ int grant_client_user_scope_access(struct config_elements * config, const char * client_id, const char * username, const char * scope_list) { json_t * j_query, * j_result, * j_scope; char * save_scope_list = o_strdup(scope_list), * scope, * saveptr; char * where_clause_scope, * scope_escaped; int res, to_return = G_OK; if (client_id != NULL && username != NULL && save_scope_list != NULL && strlen(save_scope_list) > 0) { scope = strtok_r(save_scope_list, " ", &saveptr); while (scope != NULL && to_return == G_OK) { j_scope = get_scope(config, scope); if (check_result_value(j_scope, G_OK)) { // Check if this user hasn't granted access to this client for this scope scope_escaped = h_escape_string(config->conn, scope); where_clause_scope = msprintf("= (SELECT `gs_id` FROM `%s` WHERE `gs_name`='%s')", GLEWLWYD_TABLE_SCOPE, scope_escaped); j_query = json_pack("{sss[s]s{sssss{ssss}}}", "table", GLEWLWYD_TABLE_CLIENT_USER_SCOPE, "columns", "gcus_id", "where", "gc_client_id", client_id, "gco_username", username, "gs_id", "operator", "raw", "value", where_clause_scope); o_free(where_clause_scope); res = h_select(config->conn, j_query, &j_result, NULL); json_decref(j_query); if (res == H_OK) { if (json_array_size(j_result) == 0) { // Add grant to this scope where_clause_scope = msprintf("(SELECT `gs_id` FROM `%s` WHERE `gs_name`='%s')", GLEWLWYD_TABLE_SCOPE, scope_escaped); j_query = json_pack("{sss{sssss{ss}}}", "table", GLEWLWYD_TABLE_CLIENT_USER_SCOPE, "values", "gc_client_id", client_id, "gco_username", username, "gs_id", "raw", where_clause_scope); o_free(where_clause_scope); res = h_insert(config->conn, j_query, NULL); json_decref(j_query); if (res != H_OK) { y_log_message(Y_LOG_LEVEL_ERROR, "grant_client_user_scope_access - Error adding scope %s to client_id %s for user %s", scope, client_id, username); to_return = G_ERROR_DB; } } } else { y_log_message(Y_LOG_LEVEL_ERROR, "grant_client_user_scope_access - Error getting grant for scope %s to client_id %s for user %s", scope, client_id, username); to_return = G_ERROR_DB; } o_free(scope_escaped); json_decref(j_result); } else if (!check_result_value(j_scope, G_ERROR_NOT_FOUND)) { y_log_message(Y_LOG_LEVEL_ERROR, "grant_client_user_scope_access - Error get_scope %s", scope); to_return = G_ERROR; } json_decref(j_scope); scope = strtok_r(NULL, " ", &saveptr); } } else { // Error input parameters y_log_message(Y_LOG_LEVEL_ERROR, "grant_client_user_scope_access - Error input parameters"); to_return = G_ERROR_PARAM; } o_free(save_scope_list); return to_return; } /** * * Remove access of scope to client_id for username * */ int delete_client_user_scope_access(struct config_elements * config, const char * client_id, const char * username, const char * scope_list) { json_t * j_query, * j_result, * j_scope; char * save_scope_list = o_strdup(scope_list), * scope, * saveptr; char * where_clause_scope, * scope_escaped; int res, to_return = G_OK; if (client_id != NULL && username != NULL && save_scope_list != NULL && strlen(save_scope_list) > 0) { scope = strtok_r(save_scope_list, " ", &saveptr); while (scope != NULL && to_return == G_OK) { j_scope = get_scope(config, scope); if (check_result_value(j_scope, G_OK)) { // Check if this user hasn't granted access to this client for this scope scope_escaped = h_escape_string(config->conn, scope); where_clause_scope = msprintf("= (SELECT `gs_id` FROM `%s` WHERE `gs_name`='%s')", GLEWLWYD_TABLE_SCOPE, scope_escaped); j_query = json_pack("{sss[s]s{sssss{ssss}}}", "table", GLEWLWYD_TABLE_CLIENT_USER_SCOPE, "columns", "gcus_id", "where", "gc_client_id", client_id, "gco_username", username, "gs_id", "operator", "raw", "value", where_clause_scope); o_free(where_clause_scope); res = h_select(config->conn, j_query, &j_result, NULL); json_decref(j_query); if (res == H_OK) { if (json_array_size(j_result) == 0) { // Add grant to this scope where_clause_scope = msprintf("(SELECT `gs_id` FROM `%s` WHERE `gs_name`='%s')", GLEWLWYD_TABLE_SCOPE, scope_escaped); j_query = json_pack("{sss{sssss{ss}}}", "table", GLEWLWYD_TABLE_CLIENT_USER_SCOPE, "where", "gc_client_id", client_id, "gco_username", username, "gs_id", "raw", where_clause_scope); o_free(where_clause_scope); res = h_delete(config->conn, j_query, NULL); json_decref(j_query); if (res != H_OK) { y_log_message(Y_LOG_LEVEL_ERROR, "delete_client_user_scope_access - Error adding scope %s to client_id %s for user %s", scope, client_id, username); to_return = G_ERROR_DB; } } } else { y_log_message(Y_LOG_LEVEL_ERROR, "delete_client_user_scope_access - Error getting grant for scope %s to client_id %s for user %s", scope, client_id, username); to_return = G_ERROR_DB; } o_free(scope_escaped); json_decref(j_result); } else if (!check_result_value(j_scope, G_ERROR_NOT_FOUND)) { y_log_message(Y_LOG_LEVEL_ERROR, "grant_client_user_scope_access - Error get_scope %s", scope); to_return = G_ERROR; } json_decref(j_scope); scope = strtok_r(NULL, " ", &saveptr); } } else { // Error input parameters y_log_message(Y_LOG_LEVEL_ERROR, "delete_client_user_scope_access - Error input parameters"); to_return = G_ERROR_PARAM; } o_free(save_scope_list); return to_return; } /** * * Check if code is valid * If so, return username, client_id and (if needed) scope list that was used to create that code * */ json_t * validate_authorization_code(struct config_elements * config, const char * authorization_code, const char * client_id, const char * redirect_uri, const char * ip_source) { json_t * j_query, * j_result, * j_scope, * j_element, * j_return; size_t index; int res; json_int_t gco_id; char * code_hash, * escape, * escape_ip_source, * col_gco_date, * clause_gco_date, * clause_scope, * scope_list = NULL, * tmp; if (authorization_code != NULL && client_id != NULL) { code_hash = generate_hash(config, config->hash_algorithm, authorization_code); if (code_hash != NULL) { escape_ip_source = h_escape_string(config->conn, ip_source); escape = h_escape_string(config->conn, redirect_uri); if (config->conn->type == HOEL_DB_TYPE_MARIADB) { col_gco_date = o_strdup("UNIX_TIMESTAMP(`gco_date`)"); clause_gco_date = msprintf("> (UNIX_TIMESTAMP(NOW()) - %d)", config->code_expiration); } else { col_gco_date = o_strdup("gco_date"); clause_gco_date = msprintf("> (strftime('%%s','now') - %d)", config->code_expiration); } j_query = json_pack("{sss[ss]s{si ss ss ss ss s{ssss}}}", "table", GLEWLWYD_TABLE_CODE, "columns", "gco_id", "gco_username", "where", "gco_enabled", 1, "gco_code_hash", code_hash, "gco_ip_source", escape_ip_source, "gco_redirect_uri", escape, "gc_client_id", client_id, col_gco_date, "operator", "raw", "value", clause_gco_date); o_free(clause_gco_date); o_free(col_gco_date); o_free(escape); o_free(escape_ip_source); o_free(code_hash); res = h_select(config->conn, j_query, &j_result, NULL); json_decref(j_query); if (res == H_OK) { if (json_array_size(j_result) > 0) { // Get scope_list (if any) if (config->use_scope) { gco_id = json_integer_value(json_object_get(json_array_get(j_result, 0), "gco_id")); clause_scope = msprintf("IN (SELECT `gs_id` FROM `%s` WHERE `gco_id`=%" JSON_INTEGER_FORMAT ")", GLEWLWYD_TABLE_CODE_SCOPE, gco_id); j_query = json_pack("{sss[s]s{s{ssss}}}", "table", GLEWLWYD_TABLE_SCOPE, "columns", "gs_name", "where", "gs_id", "operator", "raw", "value", clause_scope); o_free(clause_scope); res = h_select(config->conn, j_query, &j_scope, NULL); json_decref(j_query); if (res == H_OK) { json_array_foreach(j_scope, index, j_element) { if (scope_list == NULL) { scope_list = o_strdup(json_string_value(json_object_get(j_element, "gs_name"))); } else { tmp = msprintf("%s %s", scope_list, json_string_value(json_object_get(j_element, "gs_name"))); o_free(scope_list); scope_list = tmp; } } } else { y_log_message(Y_LOG_LEVEL_ERROR, "validate_authorization_code - Error executing query scope"); j_return = json_pack("{siss}", "result", G_ERROR_DB, "error", "server_error"); } json_decref(j_scope); if (scope_list != NULL) { j_return = json_pack("{sisssssI}", "result", G_OK, "scope", scope_list, "username", json_string_value(json_object_get(json_array_get(j_result, 0), "gco_username")), "gco_id", json_integer_value((json_object_get(json_array_get(j_result, 0), "gco_id")))); } else { j_return = json_pack("{siss}", "result", G_ERROR_UNAUTHORIZED, "error", "invalid_scope"); } o_free(scope_list); } else { j_return = json_pack("{sisssI}", "result", G_OK, "username", json_string_value(json_object_get(json_array_get(j_result, 0), "gco_username")), "gco_id", json_integer_value((json_object_get(json_array_get(j_result, 0), "gco_id")))); } } else { j_return = json_pack("{siss}", "result", G_ERROR_UNAUTHORIZED, "error", "access_denied"); } json_decref(j_result); } else { y_log_message(Y_LOG_LEVEL_ERROR, "validate_authorization_code - Error executng query code"); j_return = json_pack("{siss}", "result", G_ERROR_DB, "error", "server_error"); } } else { y_log_message(Y_LOG_LEVEL_ERROR, "validate_authorization_code - Error generating hash from password"); j_return = json_pack("{siss}", "result", G_ERROR_DB, "error", "server_error"); } } else { j_return = json_pack("{siss}", "result", G_ERROR_UNAUTHORIZED, "error", "unauthorized_client"); } return j_return; } glewlwyd-1.3.1/src/client.c000066400000000000000000003217611322667720100156030ustar00rootroot00000000000000/** * * Glewlwyd OAuth2 Authorization Server * * OAuth2 authentiation server * Users are authenticated with a LDAP server * or users stored in the database * Provides Json Web Tokens (jwt) * * client CRUD services * * Copyright 2016-2017 Nicolas Mora * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU GENERAL PUBLIC LICENSE * License as published by the Free Software Foundation; * version 3 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU GENERAL PUBLIC LICENSE for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see . * */ #include #include #include "glewlwyd.h" /** * Check client credentials * If client_id_header is set, client must be confidential and password must match * otherwise client is public */ json_t * client_check(struct config_elements * config, const char * client_id, const char * client_id_header, const char * client_password_header, const char * redirect_uri, const int auth_type) { json_t * j_res = NULL, * j_client = NULL, * j_auth, * j_element; size_t index; int redirect_uri_allowed = 1, auth_type_allowed = 0; const char * auth_type_str; // First, check if client_id exist and is valid if (client_id != NULL) { j_client = get_client(config, client_id, NULL); if (check_result_value(j_client, G_OK)) { // If client is confidential and auth type can require credentials, check its credentials if (json_object_get(json_object_get(j_client, "client"), "confidential") == json_true() && (auth_type == GLEWLWYD_AUHORIZATION_TYPE_CODE || auth_type == GLEWLWYD_AUHORIZATION_TYPE_RESOURCE_OWNER_PASSWORD_CREDENTIALS || auth_type == GLEWLWYD_AUHORIZATION_TYPE_CLIENT_CREDENTIALS || auth_type == GLEWLWYD_AUHORIZATION_TYPE_REFRESH_TOKEN)) { if (o_strcmp(client_id, client_id_header) != 0) { j_res = json_pack("{si}", "result", G_ERROR_UNAUTHORIZED); } else { j_auth = auth_check_client_credentials(config, client_id_header, client_password_header); if (!check_result_value(j_auth, G_OK)) { j_res = json_pack("{si}", "result", G_ERROR_UNAUTHORIZED); } json_decref(j_auth); } } // if no error occured, continue if (j_res == NULL) { // Check if auth_type is allowed switch (auth_type) { case GLEWLWYD_AUHORIZATION_TYPE_AUTHORIZATION_CODE: auth_type_str = "authorization_code"; break; case GLEWLWYD_AUHORIZATION_TYPE_CODE: auth_type_str = "code"; break; case GLEWLWYD_AUHORIZATION_TYPE_IMPLICIT: auth_type_str = "token"; break; case GLEWLWYD_AUHORIZATION_TYPE_RESOURCE_OWNER_PASSWORD_CREDENTIALS: auth_type_str = "password"; break; case GLEWLWYD_AUHORIZATION_TYPE_CLIENT_CREDENTIALS: auth_type_str = "client_credentials"; break; default: auth_type_str = ""; break; } json_array_foreach(json_object_get(json_object_get(j_client, "client"), "authorization_type"), index, j_element) { if (o_strcmp(json_string_value(j_element), auth_type_str)) { auth_type_allowed = 1; } } if (auth_type == GLEWLWYD_AUHORIZATION_TYPE_AUTHORIZATION_CODE || auth_type == GLEWLWYD_AUHORIZATION_TYPE_CODE || auth_type == GLEWLWYD_AUHORIZATION_TYPE_IMPLICIT) { // Check redirect_uri if auth type requires it if (redirect_uri != NULL) { redirect_uri_allowed = 0; json_array_foreach(json_object_get(json_object_get(j_client, "client"), "redirect_uri"), index, j_element) { if (0 == o_strcmp(json_string_value(json_object_get(j_element, "uri")), redirect_uri)) { redirect_uri_allowed = 1; } } } } // Final check, is everything ok? if (!redirect_uri_allowed || !auth_type_allowed) { j_res = json_pack("{si}", "result", G_ERROR_UNAUTHORIZED); } else { j_res = json_pack("{sisO}", "result", G_OK, "client", json_object_get(j_client, "client")); } } } else { j_res = json_pack("{si}", "result", G_ERROR_UNAUTHORIZED); } json_decref(j_client); } else { j_res = json_pack("{si}", "result", G_ERROR_PARAM); } return j_res; } /** * Check client credentials */ json_t * auth_check_client_credentials(struct config_elements * config, const char * client_id, const char * password) { json_t * j_res = NULL; if (client_id != NULL && password != NULL) { if (config->has_auth_ldap) { j_res = auth_check_client_credentials_ldap(config, client_id, password); } if (config->has_auth_database && !check_result_value(j_res, G_OK)) { json_decref(j_res); j_res = auth_check_client_credentials_database(config, client_id, password); } } else { j_res = json_pack("{si}", "result", G_ERROR_UNAUTHORIZED); } return j_res; } /** * Check client credentials in database backend */ json_t * auth_check_client_credentials_database(struct config_elements * config, const char * client_id, const char * password) { json_t * j_query, * j_result; int res, to_return; char * client_id_escaped, * client_password_escaped, * clause_client_password, * clause_client_authorization_type; if (client_id != NULL && password != NULL) { client_id_escaped = h_escape_string(config->conn, client_id); clause_client_authorization_type = msprintf("IN (SELECT `gc_client_id` FROM `%s` WHERE `gc_client_id` = '%s' and `got_id` = (SELECT `got_id` FROM `%s` WHERE `got_code` = %d))", GLEWLWYD_TABLE_CLIENT_AUTHORIZATION_TYPE, client_id_escaped, GLEWLWYD_TABLE_AUTHORIZATION_TYPE, GLEWLWYD_AUHORIZATION_TYPE_CLIENT_CREDENTIALS); if (config->conn->type == HOEL_DB_TYPE_MARIADB) { client_password_escaped = h_escape_string(config->conn, password); clause_client_password = msprintf("= PASSWORD('%s')", client_password_escaped); } else { client_password_escaped = generate_hash(config, config->hash_algorithm, password); clause_client_password = msprintf("= '%s'", client_password_escaped); } j_query = json_pack("{sss[s]s{sss{ssss}sisis{ssss}}}", "table", GLEWLWYD_TABLE_CLIENT, "columns", "gc_id", "where", "gc_client_id", client_id, "gc_client_password", "operator", "raw", "value", clause_client_password, "gc_enabled", 1, "gc_confidential", 1, "gc_client_id", "operator", "raw", "value", clause_client_authorization_type); res = h_select(config->conn, j_query, &j_result, NULL); json_decref(j_query); o_free(clause_client_password); o_free(client_password_escaped); o_free(client_id_escaped); o_free(clause_client_authorization_type); if (res == H_OK) { to_return = json_array_size(j_result)>0?G_OK:G_ERROR_UNAUTHORIZED; } else { y_log_message(Y_LOG_LEVEL_ERROR, "client_auth - Error executing j_query"); to_return = G_ERROR_DB; } json_decref(j_result); } else { to_return = G_ERROR_UNAUTHORIZED; } return json_pack("{si}", "result", to_return); } /** * Check client credentials in ldap backend */ json_t * auth_check_client_credentials_ldap(struct config_elements * config, const char * client_id, const char * password) { LDAP * ldap = NULL; LDAPMessage * answer = NULL, * entry; int result, result_login; int ldap_version = LDAP_VERSION3; int scope = LDAP_SCOPE_ONELEVEL; char * filter = NULL; char * attrs[] = {"memberOf", NULL, NULL}; int attrsonly = 0; char * user_dn = NULL; json_t * res = NULL; char * ldap_mech = LDAP_SASL_SIMPLE; struct berval cred; struct berval *servcred; cred.bv_val = config->auth_ldap->bind_passwd; cred.bv_len = strlen(config->auth_ldap->bind_passwd); if (ldap_initialize(&ldap, config->auth_ldap->uri) != LDAP_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error initializing ldap"); res = json_pack("{si}", "result", G_ERROR_PARAM); } else if (ldap_set_option(ldap, LDAP_OPT_PROTOCOL_VERSION, &ldap_version) != LDAP_OPT_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error setting ldap protocol version"); res = json_pack("{si}", "result", G_ERROR_PARAM); } else if ((result = ldap_sasl_bind_s(ldap, config->auth_ldap->bind_dn, ldap_mech, &cred, NULL, NULL, &servcred)) != LDAP_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error binding to ldap server mode %s: %s", ldap_mech, ldap_err2string(result)); res = json_pack("{si}", "result", G_ERROR_PARAM); } else { // Connection successful, doing ldap search filter = msprintf("(&(%s)(%s=%s))", config->auth_ldap->filter_client_read, config->auth_ldap->client_id_property_client_read, client_id); if (config->use_scope) { attrs[1] = config->auth_ldap->scope_property_client_read; } if (filter != NULL && (result = ldap_search_ext_s(ldap, config->auth_ldap->base_search_client, scope, filter, attrs, attrsonly, NULL, NULL, NULL, LDAP_NO_LIMIT, &answer)) != LDAP_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error ldap search: %s", ldap_err2string(result)); res = json_pack("{si}", "result", G_ERROR_PARAM); } else if (ldap_count_entries(ldap, answer) == 0) { // No result found for username res = json_pack("{si}", "result", G_ERROR_NOT_FOUND); } else { // ldap found some results, getting the first one entry = ldap_first_entry(ldap, answer); if (entry == NULL) { y_log_message(Y_LOG_LEVEL_ERROR, "ldap search: error getting first result"); res = json_pack("{si}", "result", G_ERROR); } else { // Testing the first result to username with the given password user_dn = ldap_get_dn(ldap, entry); cred.bv_val = (char *)password; cred.bv_len = strlen(password); result_login = ldap_sasl_bind_s(ldap, user_dn, ldap_mech, &cred, NULL, NULL, &servcred); ldap_memfree(user_dn); if (result_login == LDAP_SUCCESS) { res = json_pack("{si}", "result", G_OK); } else { res = json_pack("{si}", "result", G_ERROR_UNAUTHORIZED); } } } o_free(filter); ldap_msgfree(answer); } ldap_unbind_ext(ldap, NULL, NULL); return res; } /** * * Check if user has allowed scope for client_id * */ int auth_check_client_user_scope(struct config_elements * config, const char * client_id, const char * username, const char * scope_list) { json_t * j_query, * j_result; int res, nb_scope = 0; char * scope, * escaped_scope, * escaped_scope_list = NULL, * save_scope_list, * saveptr = NULL, * tmp; char * scope_clause; save_scope_list = o_strdup(scope_list); scope = strtok_r(save_scope_list, " ", &saveptr); while (scope != NULL) { nb_scope++; escaped_scope = h_escape_string(config->conn, scope); if (escaped_scope_list == NULL) { escaped_scope_list = msprintf("'%s'", escaped_scope); } else { tmp = msprintf("%s,'%s'", escaped_scope_list, escaped_scope); o_free(escaped_scope_list); escaped_scope_list = tmp; } o_free(escaped_scope); scope = strtok_r(NULL, " ", &saveptr); } o_free(save_scope_list); scope_clause = msprintf("IN (SELECT `gs_id` FROM `%s` WHERE `gs_name` IN (%s))", GLEWLWYD_TABLE_SCOPE, escaped_scope_list); j_query = json_pack("{sss[s]s{sssss{ssss}}}", "table", GLEWLWYD_TABLE_CLIENT_USER_SCOPE, "columns", "gcus_id", "where", "gco_username", username, "gc_client_id", client_id, "gs_id", "operator", "raw", "value", scope_clause ); o_free(scope_clause); o_free(escaped_scope_list); res = h_select(config->conn, j_query, &j_result, NULL); json_decref(j_query); if (res == H_OK) { nb_scope -= json_array_size(j_result); json_decref(j_result); return (nb_scope==0?G_OK:G_ERROR_UNAUTHORIZED); } else { return G_ERROR_DB; } } /** * * Check if client is allowed for the scope_list specified * Return a refined list of scope * */ json_t * auth_check_client_scope(struct config_elements * config, const char * client_id, const char * scope_list) { json_t * j_res = NULL; if (config->has_auth_ldap) { j_res = auth_check_client_scope_ldap(config, client_id, scope_list); } if (config->has_auth_database && (j_res == NULL || !check_result_value(j_res, G_OK))) { json_decref(j_res); j_res = auth_check_client_scope_database(config, client_id, scope_list); } return j_res; } /** * Check if client is allowed for the scope_list specified in the database backend * Return a refined list of scope */ json_t * auth_check_client_scope_database(struct config_elements * config, const char * client_id, const char * scope_list) { json_t * j_query, * j_result, * scope_list_allowed, * j_value; int res; char * scope, * scope_escaped, * saveptr, * scope_list_escaped = NULL, * scope_list_save = o_strdup(scope_list), * client_id_escaped = h_escape_string(config->conn, client_id), * scope_list_join; char * where_clause, * tmp; size_t index; if (scope_list == NULL || client_id_escaped == NULL) { scope_list_allowed = json_pack("{si}", "result", G_ERROR_PARAM); } else if (scope_list_save != NULL && client_id_escaped != NULL) { scope = strtok_r(scope_list_save, " ", &saveptr); while (scope != NULL) { scope_escaped = h_escape_string(config->conn, scope); if (scope_list_escaped != NULL) { tmp = msprintf("%s,'%s'", scope_list_escaped, scope_escaped); o_free(scope_list_escaped); scope_list_escaped = tmp; } else { scope_list_escaped = msprintf("'%s'", scope_escaped); } o_free(scope_escaped); scope = strtok_r(NULL, " ", &saveptr); } o_free(scope_list_save); where_clause = msprintf("IN (SELECT gs_id FROM %s WHERE gc_id = (SELECT gc_id FROM %s WHERE gc_client_id='%s') AND gs_id IN (SELECT gs_id FROM %s WHERE gs_name IN (%s)))", GLEWLWYD_TABLE_CLIENT_SCOPE, GLEWLWYD_TABLE_CLIENT, client_id_escaped, GLEWLWYD_TABLE_SCOPE, scope_list_escaped); j_query = json_pack("{sss[s]s{s{ssss}}}", "table", GLEWLWYD_TABLE_SCOPE, "columns", "gs_name", "where", "gs_id", "operator", "raw", "value", where_clause); o_free(scope_list_escaped); o_free(where_clause); if (j_query != NULL) { res = h_select(config->conn, j_query, &j_result, NULL); json_decref(j_query); if (res == H_OK) { if (json_array_size(j_result) > 0) { scope_list_join = strdup(""); json_array_foreach(j_result, index, j_value) { if (o_strlen(scope_list_join) > 0) { tmp = msprintf("%s %s", scope_list_join, json_string_value(json_object_get(j_value, "gs_name"))); o_free(scope_list_join); scope_list_join = tmp; } else { o_free(scope_list_join); scope_list_join = strdup(json_string_value(json_object_get(j_value, "gs_name"))); } } scope_list_allowed = json_pack("{siss}", "result", G_OK, "scope", scope_list_join); o_free(scope_list_join); } else { scope_list_allowed = json_pack("{si}", "result", G_ERROR_UNAUTHORIZED); } json_decref(j_result); } else { y_log_message(Y_LOG_LEVEL_ERROR, "auth_check_client_scope - Error executing sql query"); scope_list_allowed = json_pack("{si}", "result", G_ERROR_DB); } } else { y_log_message(Y_LOG_LEVEL_ERROR, "auth_check_client_scope - Error allocating resources for j_query"); scope_list_allowed = json_pack("{si}", "result", G_ERROR); } } else { y_log_message(Y_LOG_LEVEL_ERROR, "auth_check_client_scope - Error allocating resources for scope_list_save %s or client_id_escaped %s or scope_list_escaped %s", scope_list_save, client_id_escaped, scope_list_escaped); scope_list_allowed = json_pack("{si}", "result", G_ERROR); } o_free(client_id_escaped); return scope_list_allowed; } /** * * Check if client is allowed for the scope_list specified in the ldap backend * Return a refined list of scope * */ json_t * auth_check_client_scope_ldap(struct config_elements * config, const char * client_id, const char * scope_list) { LDAP * ldap = NULL; LDAPMessage * answer = NULL, * entry; int result; int ldap_version = LDAP_VERSION3; int scope = LDAP_SCOPE_ONELEVEL; char * filter = NULL; char * attrs[] = {"memberOf", NULL, NULL}; int attrsonly = 0; json_t * res = NULL; char * ldap_mech = LDAP_SASL_SIMPLE; struct berval cred; struct berval *servcred; cred.bv_val = config->auth_ldap->bind_passwd; cred.bv_len = strlen(config->auth_ldap->bind_passwd); if (ldap_initialize(&ldap, config->auth_ldap->uri) != LDAP_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error initializing ldap"); res = json_pack("{si}", "result", G_ERROR_PARAM); } else if (ldap_set_option(ldap, LDAP_OPT_PROTOCOL_VERSION, &ldap_version) != LDAP_OPT_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error setting ldap protocol version"); res = json_pack("{si}", "result", G_ERROR_PARAM); } else if ((result = ldap_sasl_bind_s(ldap, config->auth_ldap->bind_dn, ldap_mech, &cred, NULL, NULL, &servcred)) != LDAP_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error binding to ldap server mode %s: %s", ldap_mech, ldap_err2string(result)); res = json_pack("{si}", "result", G_ERROR_PARAM); } else { // Connection successful, doing ldap search filter = msprintf("(&(%s)(%s=%s))", config->auth_ldap->filter_client_read, config->auth_ldap->client_id_property_client_read, client_id); if (config->use_scope) { attrs[1] = config->auth_ldap->scope_property_client_read; } if (filter != NULL && (result = ldap_search_ext_s(ldap, config->auth_ldap->base_search_client, scope, filter, attrs, attrsonly, NULL, NULL, NULL, LDAP_NO_LIMIT, &answer)) != LDAP_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error ldap search: %s", ldap_err2string(result)); res = json_pack("{si}", "result", G_ERROR_PARAM); } else if (ldap_count_entries(ldap, answer) == 0) { // No result found for client_id res = json_pack("{si}", "result", G_ERROR_NOT_FOUND); } else { // ldap found some results, getting the first one entry = ldap_first_entry(ldap, answer); if (entry == NULL) { y_log_message(Y_LOG_LEVEL_ERROR, "ldap search: error getting first result"); res = json_pack("{si}", "result", G_ERROR); } else { struct berval ** values = ldap_get_values_len(ldap, entry, config->auth_ldap->scope_property_client_read); char * new_scope_list = strdup(""); int i; for (i=0; i < ldap_count_values_len(values); i++) { char * str_value = o_malloc(values[i]->bv_len + 1); char * scope_list_dup = strdup(scope_list); char * token, * save_ptr = NULL; snprintf(str_value, values[i]->bv_len + 1, "%s", values[i]->bv_val); token = strtok_r(scope_list_dup, " ", &save_ptr); while (token != NULL) { if (0 == strcmp(token, str_value)) { if (strlen(new_scope_list) > 0) { char * tmp = msprintf("%s %s", new_scope_list, token); o_free(new_scope_list); new_scope_list = tmp; } else { o_free(new_scope_list); new_scope_list = strdup(token); } } token = strtok_r(NULL, " ", &save_ptr); } o_free(scope_list_dup); o_free(str_value); } ldap_value_free_len(values); if (o_strlen(new_scope_list) > 0) { res = json_pack("{siss}", "result", G_OK, "scope", new_scope_list); } else { // Client hasn't all of part of the scope requested, sending unauthorized answer res = json_pack("{si}", "result", G_ERROR_UNAUTHORIZED); } o_free(new_scope_list); } } o_free(filter); ldap_msgfree(answer); } ldap_unbind_ext(ldap, NULL, NULL); return res; } /** * Get a list of clients */ json_t * get_client_list(struct config_elements * config, const char * source, const char * search, long int offset, long int limit) { json_t * j_return, * j_source_list = NULL, * j_result_list = json_array(); if (j_result_list != NULL) { if ((source == NULL || 0 == strcmp(source, "ldap") || 0 == strcmp(source, "all")) && config->has_auth_ldap) { j_source_list = get_client_list_ldap(config, search, offset, limit); if (check_result_value(j_source_list, G_OK)) { json_array_extend(j_result_list, json_object_get(j_source_list, "client")); } else { y_log_message(Y_LOG_LEVEL_ERROR, "get_client_list - Error getting ldap list"); } json_decref(j_source_list); j_source_list = NULL; } if ((source == NULL || 0 == strcmp(source, "database") || 0 == strcmp(source, "all")) && json_array_size(j_result_list) < limit && config->has_auth_database) { j_source_list = get_client_list_database(config, search, offset, (limit - json_array_size(j_result_list))); if (check_result_value(j_source_list, G_OK)) { json_array_extend(j_result_list, json_object_get(j_source_list, "client")); } else { y_log_message(Y_LOG_LEVEL_ERROR, "get_client_list - Error getting database list"); } json_decref(j_source_list); j_source_list = NULL; } j_return = json_pack("{siso}", "result", G_OK, "client", j_result_list); } else { y_log_message(Y_LOG_LEVEL_ERROR, "get_client_list - Error allocating resources for j_result_list"); j_return = json_pack("{si}", "result", G_ERROR_MEMORY); } return j_return; } /** * Get a list of clients in the ldap backend */ json_t * get_client_list_ldap(struct config_elements * config, const char * search, long int offset, long int limit) { LDAP * ldap = NULL; LDAPMessage * answer = NULL, * entry; int i, j, res; json_t * j_result, * j_scope_list = get_scope_list(config), * j_query, * j_auth_type, * j_cur_auth_type; char * client_clause, * client_id_escaped; size_t i_auth_type; int result; int ldap_version = LDAP_VERSION3; int scope = LDAP_SCOPE_ONELEVEL; char * filter = NULL; char * attrs[] = {config->auth_ldap->name_property_client_read, config->auth_ldap->description_property_client_read, config->auth_ldap->client_id_property_client_read, config->auth_ldap->scope_property_client_read, config->auth_ldap->redirect_uri_property_client_read, config->auth_ldap->confidential_property_client_read, NULL}; int attrsonly = 0; char * ldap_mech = LDAP_SASL_SIMPLE; struct berval cred; struct berval *servcred; cred.bv_val = config->auth_ldap->bind_passwd; cred.bv_len = strlen(config->auth_ldap->bind_passwd); if (!check_result_value(j_scope_list, G_OK)) { y_log_message(Y_LOG_LEVEL_ERROR, "Error getting scope list"); j_result = json_pack("{si}", "result", G_ERROR_PARAM); } else if (ldap_initialize(&ldap, config->auth_ldap->uri) != LDAP_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error initializing ldap"); j_result = json_pack("{si}", "result", G_ERROR_PARAM); } else if (ldap_set_option(ldap, LDAP_OPT_PROTOCOL_VERSION, &ldap_version) != LDAP_OPT_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error setting ldap protocol version"); j_result = json_pack("{si}", "result", G_ERROR_PARAM); } else if ((result = ldap_sasl_bind_s(ldap, config->auth_ldap->bind_dn, ldap_mech, &cred, NULL, NULL, &servcred)) != LDAP_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error binding to ldap server mode %s: %s", ldap_mech, ldap_err2string(result)); j_result = json_pack("{si}", "result", G_ERROR_PARAM); } else { // Connection successful, doing ldap search if (search != NULL && strcmp("", search) != 0) { char * search_escaped = escape_ldap(search); filter = msprintf("(&(%s)(|(%s=*%s*)(%s=*%s*)(%s=*%s*)))", config->auth_ldap->filter_client_read, config->auth_ldap->client_id_property_client_read, search_escaped, config->auth_ldap->name_property_client_read, search_escaped, config->auth_ldap->description_property_client_read, search_escaped); o_free(search_escaped); } else { filter = msprintf("(%s)", config->auth_ldap->filter_client_read); } if ((result = ldap_search_ext_s(ldap, config->auth_ldap->base_search_client, scope, filter, attrs, attrsonly, NULL, NULL, NULL, (offset+limit), &answer)) != LDAP_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error ldap search: %s", ldap_err2string(result)); j_result = json_pack("{si}", "result", G_ERROR_PARAM); } else { // Looping in results, staring at offset, until the end of the list j_result = json_pack("{sis[]}", "result", G_OK, "client"); if (ldap_count_entries(ldap, answer) >= offset) { entry = ldap_first_entry(ldap, answer); for (i=0; iauth_ldap->name_property_client_read); struct berval ** description_values = ldap_get_values_len(ldap, entry, config->auth_ldap->description_property_client_read); struct berval ** client_id_values = ldap_get_values_len(ldap, entry, config->auth_ldap->client_id_property_client_read); struct berval ** scope_values = ldap_get_values_len(ldap, entry, config->auth_ldap->scope_property_client_read); struct berval ** redirect_uri_values = ldap_get_values_len(ldap, entry, config->auth_ldap->redirect_uri_property_client_read); struct berval ** confidential_values = ldap_get_values_len(ldap, entry, config->auth_ldap->confidential_property_client_read); if (ldap_count_values_len(name_values) > 0) { json_object_set_new(j_entry, "name", json_stringn(name_values[0]->bv_val, name_values[0]->bv_len)); } if (ldap_count_values_len(description_values) > 0) { json_object_set_new(j_entry, "description", json_stringn(description_values[0]->bv_val, description_values[0]->bv_len)); } if (ldap_count_values_len(client_id_values) > 0) { json_object_set_new(j_entry, "client_id", json_stringn(client_id_values[0]->bv_val, client_id_values[0]->bv_len)); } // For now a ldap client is always enabled, until I find a standard way to do it json_object_set_new(j_entry, "enabled", json_true()); json_object_set_new(j_entry, "scope", json_array()); for (j=0; j < ldap_count_values_len(scope_values); j++) { json_t * j_scope = json_string(scope_values[j]->bv_val); if (json_search(json_object_get(j_scope_list, "scope"), j_scope) != NULL) { json_array_append_new(json_object_get(j_entry, "scope"), j_scope); } else { json_decref(j_scope); } } json_object_set_new(j_entry, "redirect_uri", json_array()); for (j=0; j < ldap_count_values_len(redirect_uri_values); j++) { char * space_address = strchr(redirect_uri_values[j]->bv_val, ' '); if (space_address != NULL) { json_t * j_redirect_uri_uri = json_stringn(redirect_uri_values[j]->bv_val, (space_address - redirect_uri_values[j]->bv_val)); json_t * j_redirect_uri_name = json_string(space_address+sizeof(char)); json_t * j_redirect_uri = json_pack("{soso}", "name", j_redirect_uri_name, "uri", j_redirect_uri_uri); if (j_redirect_uri != NULL) { json_array_append_new(json_object_get(j_entry, "redirect_uri"), j_redirect_uri); } } } if (ldap_count_values_len(confidential_values) > 0) { json_object_set_new(j_entry, "confidential", strcmp(confidential_values[0]->bv_val, "1")==0?json_true():json_false()); } else { json_object_set_new(j_entry, "confidential", json_true()); } json_object_set_new(j_entry, "source", json_string("ldap")); client_id_escaped = h_escape_string(config->conn, json_string_value(json_object_get(j_entry, "client_id"))); client_clause = msprintf("IN (SELECT `got_id` FROM `%s` WHERE `gc_client_id`='%s')", GLEWLWYD_TABLE_CLIENT_AUTHORIZATION_TYPE, client_id_escaped); j_query = json_pack("{sss[s]s{s{ssss}}}", "table", GLEWLWYD_TABLE_AUTHORIZATION_TYPE, "columns", "got_name AS name", "where", "got_id", "operator", "raw", "value", client_clause); o_free(client_clause); o_free(client_id_escaped); res = h_select(config->conn, j_query, &j_auth_type, NULL); json_decref(j_query); if (res == H_OK) { json_object_set_new(j_entry, "authorization_type", json_array()); if (json_object_get(j_entry, "authorization_type") != NULL) { json_array_foreach(j_auth_type, i_auth_type, j_cur_auth_type) { json_array_append(json_object_get(j_entry, "authorization_type"), json_object_get(j_cur_auth_type, "name")); } } json_decref(j_auth_type); } json_array_append_new(json_object_get(j_result, "client"), j_entry); ldap_value_free_len(name_values); ldap_value_free_len(description_values); ldap_value_free_len(client_id_values); ldap_value_free_len(scope_values); ldap_value_free_len(redirect_uri_values); ldap_value_free_len(confidential_values); } else { y_log_message(Y_LOG_LEVEL_ERROR, "Error allocating resources for j_entry"); } entry = ldap_next_entry(ldap, entry); i++; } } } o_free(filter); ldap_msgfree(answer); } ldap_unbind_ext(ldap, NULL, NULL); json_decref(j_scope_list); return j_result; } /** * Get a list of clients in the database backend */ json_t * get_client_list_database(struct config_elements * config, const char * search, long int offset, long int limit) { json_t * j_query, * j_result, * j_scope, * j_redirect_uri, * j_return, * j_entry, * j_scope_entry, * j_auth_type, * j_cur_auth_type; int res; char * scope_clause, * client_clause, * client_id_escaped; size_t index, i_scope, i_auth_type; j_query = json_pack("{sss[ssssss]sisi}", "table", GLEWLWYD_TABLE_CLIENT, "columns", "gc_id", "gc_name AS name", "gc_description AS description", "gc_client_id AS client_id", "gc_confidential", "gc_enabled", "offset", offset, "limit", limit); if (search != NULL && strcmp("", search) != 0) { char * search_escaped = h_escape_string(config->conn, search); char * clause_search = msprintf("IN (SELECT `gc_id` FROM `%s` WHERE `gc_name` LIKE '%%%s%%' OR `gc_description` LIKE '%%%s%%' OR `gc_client_id` LIKE '%%%s%%')", GLEWLWYD_TABLE_CLIENT, search_escaped, search_escaped, search_escaped); json_object_set_new(j_query, "where", json_pack("{s{ssss}}", "gc_id", "operator", "raw", "value", clause_search)); o_free(search_escaped); o_free(clause_search); } res = h_select(config->conn, j_query, &j_result, NULL); json_decref(j_query); if (res == H_OK) { j_return = json_pack("{sis[]}", "result", G_OK, "client"); json_array_foreach(j_result, index, j_entry) { scope_clause = msprintf("IN (SELECT `gs_id` FROM %s WHERE `gc_id`='%" JSON_INTEGER_FORMAT "')", GLEWLWYD_TABLE_CLIENT_SCOPE, json_integer_value(json_object_get(j_entry, "gc_id"))); j_query = json_pack("{sss[s]s{s{ssss}}}", "table", GLEWLWYD_TABLE_SCOPE, "columns", "gs_name", "where", "gs_id", "operator", "raw", "value", scope_clause); o_free(scope_clause); res = h_select(config->conn, j_query, &j_scope, NULL); json_decref(j_query); if (res == H_OK) { json_object_set_new(j_entry, "scope", json_array()); json_array_foreach(j_scope, i_scope, j_scope_entry) { json_array_append(json_object_get(j_entry, "scope"), json_object_get(j_scope_entry, "gs_name")); } json_decref(j_scope); j_query = json_pack("{sss[ss]s{sI}}", "table", GLEWLWYD_TABLE_REDIRECT_URI, "columns", "gru_name AS name", "gru_uri AS uri", "where", "gc_id", json_integer_value(json_object_get(j_entry, "gc_id"))); res = h_select(config->conn, j_query, &j_redirect_uri, NULL); json_decref(j_query); if (res == H_OK) { json_object_set_new(j_entry, "redirect_uri", j_redirect_uri); client_id_escaped = h_escape_string(config->conn, json_string_value(json_object_get(j_entry, "client_id"))); client_clause = msprintf("IN (SELECT `got_id` FROM `%s` WHERE `gc_client_id`='%s')", GLEWLWYD_TABLE_CLIENT_AUTHORIZATION_TYPE, client_id_escaped); j_query = json_pack("{sss[s]s{s{ssss}}}", "table", GLEWLWYD_TABLE_AUTHORIZATION_TYPE, "columns", "got_name AS name", "where", "got_id", "operator", "raw", "value", client_clause); o_free(client_clause); o_free(client_id_escaped); res = h_select(config->conn, j_query, &j_auth_type, NULL); json_decref(j_query); if (res == H_OK) { json_object_set_new(j_entry, "authorization_type", json_array()); if (json_object_get(j_entry, "authorization_type") != NULL) { json_array_foreach(j_auth_type, i_auth_type, j_cur_auth_type) { json_array_append(json_object_get(j_entry, "authorization_type"), json_object_get(j_cur_auth_type, "name")); } } json_decref(j_auth_type); json_object_set_new(j_entry, "source", json_string("database")); if (json_integer_value(json_object_get(j_entry, "gc_enabled")) == 1) { json_object_set_new(j_entry, "enabled", json_true()); } else { json_object_set_new(j_entry, "enabled", json_false()); } json_object_del(j_entry, "gc_enabled"); if (json_integer_value(json_object_get(j_entry, "gc_confidential")) == 1) { json_object_set_new(j_entry, "confidential", json_true()); } else { json_object_set_new(j_entry, "confidential", json_false()); } json_object_del(j_entry, "gc_confidential"); json_object_del(j_entry, "gc_id"); json_array_append(json_object_get(j_return, "client"), j_entry); } else { y_log_message(Y_LOG_LEVEL_ERROR, "get_client_database - Error executing j_query for authorization type"); } } else { y_log_message(Y_LOG_LEVEL_ERROR, "get_client_list_database - Error executing j_query for redirect uri"); } } else { y_log_message(Y_LOG_LEVEL_ERROR, "get_client_list_database - Error executing j_query for scope"); } } json_decref(j_result); } else { y_log_message(Y_LOG_LEVEL_ERROR, "get_client_list_database - Error executing j_query"); j_return = json_pack("{si}", "result", G_ERROR_DB); } return j_return; } /** * Get a specific client */ json_t * get_client(struct config_elements * config, const char * client_id, const char * source) { json_t * j_return = NULL, * j_client = NULL; int search_ldap = (source == NULL || 0 == strcmp(source, "ldap") || 0 == strcmp(source, "all")), search_database = (source == NULL || 0 == strcmp(source, "database") || 0 == strcmp(source, "all")); if (client_id == NULL || strlen(client_id) == 0) { j_client = json_pack("{si}", "result", G_ERROR_PARAM); } else { if (search_ldap) { if (config->has_auth_ldap) { j_client = get_client_ldap(config, client_id); } else if (0 == o_strcmp(source, "ldap") && !config->has_auth_ldap) { j_client = json_pack("{si}", "result", G_ERROR_PARAM); } else { j_client = json_pack("{si}", "result", G_ERROR_NOT_FOUND); } } if ((j_client == NULL || check_result_value(j_client, G_ERROR_NOT_FOUND)) && search_database) { json_decref(j_client); if (config->has_auth_database) { j_client = get_client_database(config, client_id); } else if (0 == o_strcmp(source, "database") && !config->has_auth_database) { j_client = json_pack("{si}", "result", G_ERROR_PARAM); } else { j_client = json_pack("{si}", "result", G_ERROR_NOT_FOUND); } } if (check_result_value(j_client, G_OK)) { j_return = json_pack("{sisO}", "result", G_OK, "client", json_object_get(j_client, "client")); } else if (check_result_value(j_client, G_ERROR_NOT_FOUND) || j_client == NULL) { j_return = json_pack("{si}", "result", G_ERROR_NOT_FOUND); } else if (check_result_value(j_client, G_ERROR_PARAM)) { j_return = json_pack("{si}", "result", G_ERROR_PARAM); } else { y_log_message(Y_LOG_LEVEL_ERROR, "get_client - Error getting client"); j_return = json_pack("{si}", "result", G_ERROR); } } json_decref(j_client); return j_return; } /** * Get a specific client in database backend */ json_t * get_client_database(struct config_elements * config, const char * client_id) { json_t * j_query, * j_result = NULL, * j_scope, * j_redirect_uri, * j_return = NULL, * j_entry, * j_scope_entry, * j_auth_type , * j_cur_auth_type; int res; char * scope_clause, * client_clause, * client_id_escaped; size_t i_scope, i_auth_type; j_query = json_pack("{sss[ssssss]s{ss}}", "table", GLEWLWYD_TABLE_CLIENT, "columns", "gc_id", "gc_name AS name", "gc_description AS description", "gc_client_id AS client_id", "gc_confidential", "gc_enabled", "where", "gc_client_id", client_id); res = h_select(config->conn, j_query, &j_result, NULL); json_decref(j_query); if (res == H_OK) { if (json_array_size(j_result) > 0) { j_entry = json_array_get(j_result, 0); scope_clause = msprintf("IN (SELECT `gs_id` FROM %s WHERE `gc_id`='%" JSON_INTEGER_FORMAT "')", GLEWLWYD_TABLE_CLIENT_SCOPE, json_integer_value(json_object_get(j_entry, "gc_id"))); j_query = json_pack("{sss[s]s{s{ssss}}}", "table", GLEWLWYD_TABLE_SCOPE, "columns", "gs_name", "where", "gs_id", "operator", "raw", "value", scope_clause); o_free(scope_clause); res = h_select(config->conn, j_query, &j_scope, NULL); json_decref(j_query); if (res == H_OK) { json_object_set_new(j_entry, "scope", json_array()); json_array_foreach(j_scope, i_scope, j_scope_entry) { json_array_append(json_object_get(j_entry, "scope"), json_object_get(j_scope_entry, "gs_name")); } json_decref(j_scope); j_query = json_pack("{sss[ss]s{sI}}", "table", GLEWLWYD_TABLE_REDIRECT_URI, "columns", "gru_name AS name", "gru_uri AS uri", "where", "gc_id", json_integer_value(json_object_get(j_entry, "gc_id"))); res = h_select(config->conn, j_query, &j_redirect_uri, NULL); json_decref(j_query); if (res == H_OK) { json_object_set_new(j_entry, "redirect_uri", j_redirect_uri); client_id_escaped = h_escape_string(config->conn, json_string_value(json_object_get(j_entry, "client_id"))); client_clause = msprintf("IN (SELECT `got_id` FROM `%s` WHERE `gc_client_id`='%s')", GLEWLWYD_TABLE_CLIENT_AUTHORIZATION_TYPE, client_id_escaped); j_query = json_pack("{sss[s]s{s{ssss}}}", "table", GLEWLWYD_TABLE_AUTHORIZATION_TYPE, "columns", "got_name AS name", "where", "got_id", "operator", "raw", "value", client_clause); o_free(client_clause); o_free(client_id_escaped); res = h_select(config->conn, j_query, &j_auth_type, NULL); json_decref(j_query); if (res == H_OK) { json_object_set_new(j_entry, "authorization_type", json_array()); if (json_object_get(j_entry, "authorization_type") != NULL) { json_array_foreach(j_auth_type, i_auth_type, j_cur_auth_type) { json_array_append(json_object_get(j_entry, "authorization_type"), json_object_get(j_cur_auth_type, "name")); } } json_decref(j_auth_type); json_object_set_new(j_entry, "source", json_string("database")); if (json_integer_value(json_object_get(j_entry, "gc_enabled")) == 1) { json_object_set_new(j_entry, "enabled", json_true()); } else { json_object_set_new(j_entry, "enabled", json_false()); } json_object_del(j_entry, "gc_enabled"); if (json_integer_value(json_object_get(j_entry, "gc_confidential")) == 1) { json_object_set_new(j_entry, "confidential", json_true()); } else { json_object_set_new(j_entry, "confidential", json_false()); } json_object_del(j_entry, "gc_confidential"); json_object_del(j_entry, "gc_id"); j_return = json_pack("{sisO}", "result", G_OK, "client", j_entry); } else { y_log_message(Y_LOG_LEVEL_ERROR, "get_client_database - Error executing j_query for authorization type"); } } else { y_log_message(Y_LOG_LEVEL_ERROR, "get_client_database - Error executing j_query for redirect uri"); } } else { y_log_message(Y_LOG_LEVEL_ERROR, "get_client_database - Error executing j_query for scope"); } } else { j_return = json_pack("{si}", "result", G_ERROR_NOT_FOUND); } json_decref(j_result); } else { y_log_message(Y_LOG_LEVEL_ERROR, "get_client_database - Error executing j_query"); j_return = json_pack("{si}", "result", G_ERROR_DB); } return j_return; } /** * Get a specific client in ldap backend */ json_t * get_client_ldap(struct config_elements * config, const char * client_id) { LDAP * ldap = NULL; LDAPMessage * answer = NULL, * entry; int j, res; json_t * j_result, * j_scope_list = get_scope_list(config), * j_query, * j_auth_type, * j_cur_auth_type; char * client_clause, * client_id_escaped; size_t i_auth_type; int result; int ldap_version = LDAP_VERSION3; int scope = LDAP_SCOPE_ONELEVEL; char * filter = NULL; char * attrs[] = {config->auth_ldap->name_property_client_read, config->auth_ldap->description_property_client_read, config->auth_ldap->client_id_property_client_read, config->auth_ldap->scope_property_client_read, config->auth_ldap->redirect_uri_property_client_read, config->auth_ldap->confidential_property_client_read, NULL}; int attrsonly = 0; char * ldap_mech = LDAP_SASL_SIMPLE; struct berval cred; struct berval *servcred; cred.bv_val = config->auth_ldap->bind_passwd; cred.bv_len = strlen(config->auth_ldap->bind_passwd); if (!check_result_value(j_scope_list, G_OK)) { y_log_message(Y_LOG_LEVEL_ERROR, "Error getting scope list"); j_result = json_pack("{si}", "result", G_ERROR_PARAM); } else if (ldap_initialize(&ldap, config->auth_ldap->uri) != LDAP_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error initializing ldap"); j_result = json_pack("{si}", "result", G_ERROR_PARAM); } else if (ldap_set_option(ldap, LDAP_OPT_PROTOCOL_VERSION, &ldap_version) != LDAP_OPT_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error setting ldap protocol version"); j_result = json_pack("{si}", "result", G_ERROR_PARAM); } else if ((result = ldap_sasl_bind_s(ldap, config->auth_ldap->bind_dn, ldap_mech, &cred, NULL, NULL, &servcred)) != LDAP_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error binding to ldap server mode %s: %s", ldap_mech, ldap_err2string(result)); j_result = json_pack("{si}", "result", G_ERROR_PARAM); } else { // Connection successful, doing ldap search filter = msprintf("(&(%s)(%s=%s))", config->auth_ldap->filter_client_read, config->auth_ldap->client_id_property_client_read, client_id); if ((result = ldap_search_ext_s(ldap, config->auth_ldap->base_search_client, scope, filter, attrs, attrsonly, NULL, NULL, NULL, LDAP_NO_LIMIT, &answer)) != LDAP_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error ldap search: %s", ldap_err2string(result)); j_result = json_pack("{si}", "result", G_ERROR_PARAM); } else { // getting first result if exist if (ldap_count_entries(ldap, answer) > 0) { entry = ldap_first_entry(ldap, answer); json_t * j_entry = json_object(); if (j_entry != NULL) { struct berval ** name_values = ldap_get_values_len(ldap, entry, config->auth_ldap->name_property_client_read); struct berval ** description_values = ldap_get_values_len(ldap, entry, config->auth_ldap->description_property_client_read); struct berval ** client_id_values = ldap_get_values_len(ldap, entry, config->auth_ldap->client_id_property_client_read); struct berval ** scope_values = ldap_get_values_len(ldap, entry, config->auth_ldap->scope_property_client_read); struct berval ** redirect_uri_values = ldap_get_values_len(ldap, entry, config->auth_ldap->redirect_uri_property_client_read); struct berval ** confidential_values = ldap_get_values_len(ldap, entry, config->auth_ldap->confidential_property_client_read); if (ldap_count_values_len(name_values) > 0) { json_object_set_new(j_entry, "name", json_stringn(name_values[0]->bv_val, name_values[0]->bv_len)); } if (ldap_count_values_len(description_values) > 0) { json_object_set_new(j_entry, "description", json_stringn(description_values[0]->bv_val, description_values[0]->bv_len)); } if (ldap_count_values_len(client_id_values) > 0) { json_object_set_new(j_entry, "client_id", json_stringn(client_id_values[0]->bv_val, client_id_values[0]->bv_len)); } // For now a ldap client is always enabled, until I find a standard way to do it json_object_set_new(j_entry, "enabled", json_true()); json_object_set_new(j_entry, "scope", json_array()); for (j=0; j < ldap_count_values_len(scope_values); j++) { json_t * j_scope = json_string(scope_values[j]->bv_val); if (json_search(json_object_get(j_scope_list, "scope"), j_scope) != NULL) { json_array_append_new(json_object_get(j_entry, "scope"), j_scope); } else { json_decref(j_scope); } } json_object_set_new(j_entry, "redirect_uri", json_array()); for (j=0; j < ldap_count_values_len(redirect_uri_values); j++) { char * space_address = strchr(redirect_uri_values[j]->bv_val, ' '); if (space_address != NULL) { json_t * j_redirect_uri_uri = json_stringn(redirect_uri_values[j]->bv_val, (space_address - redirect_uri_values[j]->bv_val)); json_t * j_redirect_uri_name = json_string(space_address+sizeof(char)); json_t * j_redirect_uri = json_pack("{soso}", "name", j_redirect_uri_name, "uri", j_redirect_uri_uri); if (j_redirect_uri != NULL) { json_array_append_new(json_object_get(j_entry, "redirect_uri"), j_redirect_uri); } } } if (ldap_count_values_len(confidential_values) > 0) { json_object_set_new(j_entry, "confidential", strcmp(confidential_values[0]->bv_val, "1")==0?json_true():json_false()); } else { json_object_set_new(j_entry, "confidential", json_true()); } client_id_escaped = h_escape_string(config->conn, json_string_value(json_object_get(j_entry, "client_id"))); client_clause = msprintf("IN (SELECT `got_id` FROM `%s` WHERE `gc_client_id`='%s')", GLEWLWYD_TABLE_CLIENT_AUTHORIZATION_TYPE, client_id_escaped); j_query = json_pack("{sss[s]s{s{ssss}}}", "table", GLEWLWYD_TABLE_AUTHORIZATION_TYPE, "columns", "got_name AS name", "where", "got_id", "operator", "raw", "value", client_clause); o_free(client_clause); o_free(client_id_escaped); res = h_select(config->conn, j_query, &j_auth_type, NULL); json_decref(j_query); if (res == H_OK) { json_object_set_new(j_entry, "authorization_type", json_array()); if (json_object_get(j_entry, "authorization_type") != NULL) { json_array_foreach(j_auth_type, i_auth_type, j_cur_auth_type) { json_array_append(json_object_get(j_entry, "authorization_type"), json_object_get(j_cur_auth_type, "name")); } } json_decref(j_auth_type); } json_object_set_new(j_entry, "source", json_string("ldap")); j_result = json_pack("{siso}", "result", G_OK, "client", j_entry); ldap_value_free_len(name_values); ldap_value_free_len(description_values); ldap_value_free_len(client_id_values); ldap_value_free_len(scope_values); ldap_value_free_len(redirect_uri_values); ldap_value_free_len(confidential_values); } else { y_log_message(Y_LOG_LEVEL_ERROR, "Error allocating resources for j_entry"); j_result = json_pack("{si}", "result", G_ERROR_MEMORY); } } else { j_result = json_pack("{si}", "result", G_ERROR_NOT_FOUND); } } o_free(filter); ldap_msgfree(answer); } ldap_unbind_ext(ldap, NULL, NULL); json_decref(j_scope_list); return j_result; } /** * Check if client parameters are valid */ json_t * is_client_valid(struct config_elements * config, json_t * j_client, int add) { json_t * j_return = json_array(), * j_result, * j_scope, * j_redirect_uri, * j_authorization_type_list, * j_authorization_type, * cur_auth_type; size_t index, index2; int found; if (j_return != NULL) { if (json_is_object(j_client)) { if (json_object_get(j_client, "source") != NULL && (!json_is_string(json_object_get(j_client, "source")) || (0 != strcmp(json_string_value(json_object_get(j_client, "source")), "all") && 0 != strcmp(json_string_value(json_object_get(j_client, "source")), "ldap") && 0 != strcmp(json_string_value(json_object_get(j_client, "source")), "database")))) { json_array_append_new(j_return, json_pack("{ss}", "source", "source is an optional string, values available are 'all', 'ldap' or 'database', default is 'database'")); } if (json_object_get(j_client, "name") == NULL || !json_is_string(json_object_get(j_client, "name")) || json_string_length(json_object_get(j_client, "name")) > 128 || json_string_length(json_object_get(j_client, "name")) == 0) { json_array_append_new(j_return, json_pack("{ss}", "name", "name is a mandatory non null string of maximum 128 characters")); } if (json_object_get(j_client, "description") != NULL && (!json_is_string(json_object_get(j_client, "description")) || json_string_length(json_object_get(j_client, "description")) > 512)) { json_array_append_new(j_return, json_pack("{ss}", "description", "description is an optional string between 0 and 512 characters")); } if (json_object_get(j_client, "enabled") != NULL && !json_is_boolean(json_object_get(j_client, "enabled"))) { json_array_append_new(j_return, json_pack("{ss}", "enabled", "enabled is an optional boolean")); } if (json_object_get(j_client, "confidential") != NULL && !json_is_boolean(json_object_get(j_client, "confidential"))) { json_array_append_new(j_return, json_pack("{ss}", "enabled", "confidential is an optional boolean")); } if (json_object_get(j_client, "authorization_type") != NULL && !json_is_array(json_object_get(j_client, "authorization_type"))) { json_array_append_new(j_return, json_pack("{ss}", "authorization_type", "authorization_type is a mandatory array of redirect uri objects, at least one redirect uri is required")); } else { j_authorization_type_list = get_authorization_type(config, NULL); if (check_result_value(j_authorization_type_list, G_OK)) { json_array_foreach(json_object_get(j_client, "authorization_type"), index, j_authorization_type) { if (!json_is_string(j_authorization_type)) { json_array_append_new(j_return, json_pack("{ss}", "authorization_type", "authorization_type must be a string")); } else { found = 0; json_array_foreach(json_object_get(j_authorization_type_list, "authorization"), index2, cur_auth_type) { if (json_equal(json_object_get(cur_auth_type, "name"), j_authorization_type) && json_object_get(cur_auth_type, "enabled") == json_true()) { found = 1; } } if (!found) { json_array_append_new(j_return, json_pack("{ss}", "authorization_type", "authorization_type does not exist or is not enabled")); } } } } else { y_log_message(Y_LOG_LEVEL_ERROR, "is_client_valid - Error getting authorization_type list"); } json_decref(j_authorization_type_list); } if (add) { if (json_object_get(j_client, "client_id") == NULL || !json_is_string(json_object_get(j_client, "client_id")) || json_string_length(json_object_get(j_client, "client_id")) > 128 || json_string_length(json_object_get(j_client, "client_id")) == 0) { json_array_append_new(j_return, json_pack("{ss}", "client_id", "client_id is a mandatory non null string of maximum 128 characters")); } else { j_result = get_client(config, json_string_value(json_object_get(j_client, "client_id")), json_string_value(json_object_get(j_client, "source"))); if (check_result_value(j_result, G_OK)) { char * message = msprintf("client_id '%s' already exist", json_string_value(json_object_get(j_client, "client_id"))); json_array_append_new(j_return, json_pack("{ss}", "client_id", message)); o_free(message); } json_decref(j_result); } if (json_object_get(j_client, "confidential") == json_true() && (json_object_get(j_client, "password") == NULL || !json_is_string(json_object_get(j_client, "password")) || (json_string_length(json_object_get(j_client, "password")) > 0 && json_string_length(json_object_get(j_client, "password")) < 8))) { json_array_append_new(j_return, json_pack("{ss}", "password", "password is a mandatory string of at least 8 characters if confidential flag is enabled")); } if (config->use_scope) { if (json_object_get(j_client, "scope") == NULL || !json_is_array(json_object_get(j_client, "scope"))) { json_array_append_new(j_return, json_pack("{ss}", "scope", "scope is a mandatory array of scope names")); } else { json_array_foreach(json_object_get(j_client, "scope"), index, j_scope) { if (!json_is_string(j_scope)) { json_array_append_new(j_return, json_pack("{ss}", "scope", "scope name must be a string")); } else { j_result = get_scope(config, json_string_value(j_scope)); if (check_result_value(j_result, G_ERROR_NOT_FOUND)) { char * message = msprintf("scope name '%s' not found", json_string_value(j_scope)); json_array_append_new(j_return, json_pack("{ss}", "scope", message)); o_free(message); } else if (!check_result_value(j_result, G_OK)) { y_log_message(Y_LOG_LEVEL_ERROR, "is_client_valid - Error while checking scope name '%s'", json_string_value(j_scope)); } json_decref(j_result); } } } } if (json_object_get(j_client, "redirect_uri") == NULL || !json_is_array(json_object_get(j_client, "redirect_uri")) || json_array_size(json_object_get(j_client, "redirect_uri")) < 1) { json_array_append_new(j_return, json_pack("{ss}", "redirect_uri", "redirect_uri is a mandatory array of redirect uri objects, at least one redirect uri is required")); } else { json_array_foreach(json_object_get(j_client, "redirect_uri"), index, j_redirect_uri) { if (!json_is_object(j_redirect_uri)) { json_array_append_new(j_return, json_pack("{ss}", "redirect_uri", "redirect_uri must be a json object")); } else if (json_object_get(j_redirect_uri, "name") == NULL || !json_is_string(json_object_get(j_redirect_uri, "name")) || json_string_length(json_object_get(j_redirect_uri, "name")) > 128 || json_string_length(json_object_get(j_redirect_uri, "name")) == 0) { json_array_append_new(j_return, json_pack("{ss}", "redirect_uri", "name must be a non empty string of maximum 128 characters")); } else if (json_object_get(j_redirect_uri, "uri") == NULL || !json_is_string(json_object_get(j_redirect_uri, "uri")) || json_string_length(json_object_get(j_redirect_uri, "uri")) > 512 || json_string_length(json_object_get(j_redirect_uri, "uri")) == 0 || (strncmp("http://", json_string_value(json_object_get(j_redirect_uri, "uri")), strlen("http://")) != 0 && strncmp("https://", json_string_value(json_object_get(j_redirect_uri, "uri")), strlen("https://")) != 0)) { json_array_append_new(j_return, json_pack("{ss}", "redirect_uri", "uri must be a non empty string of maximum 512 characters and must start with 'http://' or 'https://'")); } else if (json_object_get(j_redirect_uri, "enabled") != NULL && !json_is_boolean(json_object_get(j_redirect_uri, "enabled"))) { json_array_append_new(j_return, json_pack("{ss}", "redirect_uri", "enabled must be a boolean")); } } } } else { if (json_object_get(j_client, "confidential") == json_true() && json_object_get(j_client, "password") != NULL && (!json_is_string(json_object_get(j_client, "password")) || (json_string_length(json_object_get(j_client, "password")) > 0 && json_string_length(json_object_get(j_client, "password")) < 8))) { json_array_append_new(j_return, json_pack("{ss}", "password", "password is a string of at least 8 characters")); } if (config->use_scope) { if (json_object_get(j_client, "scope") != NULL && !json_is_array(json_object_get(j_client, "scope"))) { json_array_append_new(j_return, json_pack("{ss}", "scope", "scope is a mandatory array of scope names")); } else if (json_object_get(j_client, "scope") != NULL) { json_array_foreach(json_object_get(j_client, "scope"), index, j_scope) { if (!json_is_string(j_scope)) { json_array_append_new(j_return, json_pack("{ss}", "scope", "scope name must be a string")); } else { j_result = get_scope(config, json_string_value(j_scope)); if (check_result_value(j_result, G_ERROR_NOT_FOUND)) { char * message = msprintf("scope name '%s' not found", json_string_value(j_scope)); json_array_append_new(j_return, json_pack("{ss}", "scope", message)); o_free(message); } else if (!check_result_value(j_result, G_OK)) { y_log_message(Y_LOG_LEVEL_ERROR, "is_client_valid - Error while checking scope name '%s'", json_string_value(j_scope)); } json_decref(j_result); } } } } } } else { json_array_append_new(j_return, json_pack("{ss}", "client", "client must be a json object")); } } else { y_log_message(Y_LOG_LEVEL_ERROR, "is_client_valid - Error allocating resources for j_result"); } return j_return; } /** * Add a new client */ int add_client(struct config_elements * config, json_t * j_client) { if ((json_object_get(j_client, "source") == NULL || 0 == strcmp("database", json_string_value(json_object_get(j_client, "source")))) && config->has_auth_database) { return add_client_database(config, j_client); } else if (0 == o_strcmp("ldap", json_string_value(json_object_get(j_client, "source"))) && config->has_auth_ldap) { return add_client_ldap(config, j_client); } else { return G_ERROR_PARAM; } } /** * Add a new client in the ldap backend */ int add_client_ldap(struct config_elements * config, json_t * j_client) { LDAP * ldap = NULL; int res; int result; int ldap_version = LDAP_VERSION3; char * ldap_mech = LDAP_SASL_SIMPLE; struct berval cred, * servcred; LDAPMod ** mods = NULL; char ** scope_values = NULL; int nb_scope = 0, nb_redirect_uri = json_array_size(json_object_get(j_client, "redirect_uri")), nb_attr = 2, i, attr_counter; // Default attribute is objectClass json_t * j_scope, * j_redirect_uri, * j_query; size_t index; char * new_dn, * password = NULL, ** redirect_uri_array = NULL, * escaped = NULL, * clause_auth_type; for (i=0; config->auth_ldap->client_id_property_client_write[i] != NULL; i++) { nb_attr++; } for (i=0; json_object_get(j_client, "name") != NULL && json_string_length(json_object_get(j_client, "name")) > 0 && config->auth_ldap->name_property_client_write[i] != NULL; i++) { nb_attr++; } for (i=0; json_object_get(j_client, "description") != NULL && json_string_length(json_object_get(j_client, "description")) > 0 && config->auth_ldap->description_property_client_write[i] != NULL; i++) { nb_attr++; } for (i=0; json_object_get(j_client, "redirect_uri") != NULL && json_array_size(json_object_get(j_client, "redirect_uri")) > 0 && config->auth_ldap->redirect_uri_property_client_write[i] != NULL; i++) { nb_attr++; } for (i=0; config->use_scope && config->auth_ldap->scope_property_client_write[i] != NULL && json_object_get(j_client, "scope") != NULL && json_array_size(json_object_get(j_client, "scope")) > 0; i++) { nb_attr++; } for (i=0; config->auth_ldap->confidential_property_client_write[i] != NULL; i++) { nb_attr++; } if (json_object_get(j_client, "confidential") == json_true() && json_object_get(j_client, "password") != NULL && json_string_length(json_object_get(j_client, "password")) > 0) { nb_attr++; } if (config->use_scope && json_object_get(j_client, "scope") != NULL && json_array_size(json_object_get(j_client, "scope")) > 0) { nb_scope = json_array_size(json_object_get(j_client, "scope")); } mods = o_malloc(nb_attr*sizeof(LDAPMod *)); cred.bv_val = config->auth_ldap->bind_passwd; cred.bv_len = strlen(config->auth_ldap->bind_passwd); if (mods == NULL) { y_log_message(Y_LOG_LEVEL_ERROR, "Error allocating resources for mods"); res = G_ERROR; } else if (ldap_initialize(&ldap, config->auth_ldap->uri) != LDAP_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error initializing ldap"); res = G_ERROR; } else if (ldap_set_option(ldap, LDAP_OPT_PROTOCOL_VERSION, &ldap_version) != LDAP_OPT_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error setting ldap protocol version"); res = G_ERROR; } else if ((result = ldap_sasl_bind_s(ldap, config->auth_ldap->bind_dn, ldap_mech, &cred, NULL, NULL, &servcred)) != LDAP_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error binding to ldap server mode %s: %s", ldap_mech, ldap_err2string(result)); res = G_ERROR; } else { new_dn = msprintf("%s=%s,%s", config->auth_ldap->rdn_property_client_write, json_string_value(json_object_get(j_client, "client_id")), config->auth_ldap->base_search_client); attr_counter = 0; mods[attr_counter] = o_malloc(sizeof(LDAPMod)); mods[attr_counter]->mod_op = LDAP_MOD_ADD; mods[attr_counter]->mod_type = "objectClass"; mods[attr_counter]->mod_values = config->auth_ldap->object_class_client_write; attr_counter++; for (i=0; config->auth_ldap->client_id_property_client_write[i] != NULL; i++) { mods[attr_counter] = o_malloc(sizeof(LDAPMod)); mods[attr_counter]->mod_values = o_malloc(2 * sizeof(char *)); mods[attr_counter]->mod_op = LDAP_MOD_ADD; mods[attr_counter]->mod_type = config->auth_ldap->client_id_property_client_write[i]; mods[attr_counter]->mod_values[0] = (char *)json_string_value(json_object_get(j_client, "client_id")); mods[attr_counter]->mod_values[1] = NULL; attr_counter++; } for (i=0; json_object_get(j_client, "name") != NULL && json_string_length(json_object_get(j_client, "name")) > 0 && config->auth_ldap->name_property_client_write[i] != NULL; i++) { mods[attr_counter] = o_malloc(sizeof(LDAPMod)); mods[attr_counter]->mod_values = o_malloc(2 * sizeof(char *)); mods[attr_counter]->mod_op = LDAP_MOD_ADD; mods[attr_counter]->mod_type = config->auth_ldap->name_property_client_write[i]; mods[attr_counter]->mod_values[0] = (char *)json_string_value(json_object_get(j_client, "name")); mods[attr_counter]->mod_values[1] = NULL; attr_counter++; } for (i=0; json_object_get(j_client, "description") != NULL && json_string_length(json_object_get(j_client, "description")) > 0 && config->auth_ldap->description_property_client_write[i] != NULL; i++) { mods[attr_counter] = o_malloc(sizeof(LDAPMod)); mods[attr_counter]->mod_values = o_malloc(2 * sizeof(char *)); mods[attr_counter]->mod_op = LDAP_MOD_ADD; mods[attr_counter]->mod_type = config->auth_ldap->description_property_client_write[i]; mods[attr_counter]->mod_values[0] = (char *)json_string_value(json_object_get(j_client, "description")); mods[attr_counter]->mod_values[1] = NULL; attr_counter++; } if (nb_redirect_uri > 0) { redirect_uri_array = o_malloc((nb_redirect_uri+1)*sizeof(char *)); if (redirect_uri_array != NULL) { json_array_foreach(json_object_get(j_client, "redirect_uri"), index, j_redirect_uri) { redirect_uri_array[index] = msprintf("%s %s", json_string_value(json_object_get(j_redirect_uri, "uri")), json_string_value(json_object_get(j_redirect_uri, "name"))); redirect_uri_array[index+1] = NULL; } } else { y_log_message(Y_LOG_LEVEL_ERROR, "Error allocating resources for redirect_uri_array"); } } for (i=0; config->auth_ldap->redirect_uri_property_client_write[i] != NULL && json_object_get(j_client, "redirect_uri") != NULL; i++) { mods[attr_counter] = o_malloc(sizeof(LDAPMod)); mods[attr_counter]->mod_op = LDAP_MOD_ADD; mods[attr_counter]->mod_type = config->auth_ldap->redirect_uri_property_client_write[i]; mods[attr_counter]->mod_values = redirect_uri_array; attr_counter++; } for (i=0; config->use_scope && config->auth_ldap->confidential_property_client_write[i] != NULL; i++) { mods[attr_counter] = o_malloc(sizeof(LDAPMod)); mods[attr_counter]->mod_values = o_malloc(2 * sizeof(char *)); mods[attr_counter]->mod_op = LDAP_MOD_ADD; mods[attr_counter]->mod_type = config->auth_ldap->confidential_property_client_write[i]; mods[attr_counter]->mod_values[0] = json_object_get(j_client, "confidential")==json_true()?"1":"0"; mods[attr_counter]->mod_values[1] = NULL; attr_counter++; } for (i=0; config->use_scope && config->auth_ldap->scope_property_client_write[i] != NULL && json_object_get(j_client, "scope") != NULL && json_array_size(json_object_get(j_client, "scope")) > 0; i++) { mods[attr_counter] = o_malloc(sizeof(LDAPMod)); mods[attr_counter]->mod_op = LDAP_MOD_ADD; mods[attr_counter]->mod_type = config->auth_ldap->scope_property_client_write[i]; mods[attr_counter]->mod_values = o_malloc((nb_scope+1)*sizeof(char *)); json_array_foreach(json_object_get(j_client, "scope"), index, j_scope) { mods[attr_counter]->mod_values[index] = (char *)json_string_value(j_scope); mods[attr_counter]->mod_values[index+1] = NULL; } attr_counter++; } if (json_object_get(j_client, "confidential") == json_true() && json_object_get(j_client, "password") != NULL && json_string_length(json_object_get(j_client, "password")) > 0) { password = generate_hash(config, config->auth_ldap->password_algorithm_client_write, json_string_value(json_object_get(j_client, "password"))); if (password != NULL) { mods[attr_counter] = o_malloc(sizeof(LDAPMod)); mods[attr_counter]->mod_values = o_malloc(2 * sizeof(char *)); mods[attr_counter]->mod_op = LDAP_MOD_ADD; mods[attr_counter]->mod_type = config->auth_ldap->password_property_client_write; mods[attr_counter]->mod_values[0] = password; mods[attr_counter]->mod_values[1] = NULL; attr_counter++; } } mods[attr_counter] = NULL; if ((result = ldap_add_ext_s(ldap, new_dn, mods, NULL, NULL)) != LDAP_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error adding new client %s in the ldap backend: %s", new_dn, ldap_err2string(result)); res = G_ERROR; } else { res = G_OK; if (json_object_get(j_client, "authorization_type") != NULL) { j_query = json_pack("{sss[]}", "table", GLEWLWYD_TABLE_CLIENT_AUTHORIZATION_TYPE, "values"); json_array_foreach(json_object_get(j_client, "authorization_type"), index, j_redirect_uri) { escaped = h_escape_string(config->conn, json_string_value(j_redirect_uri)); clause_auth_type = msprintf("(SELECT `got_id` FROM `%s` WHERE `got_name`='%s')", GLEWLWYD_TABLE_AUTHORIZATION_TYPE, escaped); o_free(escaped); json_array_append_new(json_object_get(j_query, "values"), json_pack("{sss{ss}}", "gc_client_id", json_string_value(json_object_get(j_client, "client_id")), "got_id", "raw", clause_auth_type)); o_free(clause_auth_type); } if (json_array_size(json_object_get(j_query, "values")) > 0) { if (h_insert(config->conn, j_query, NULL) != H_OK) { y_log_message(Y_LOG_LEVEL_ERROR, "add_client_ldap - Error adding authorization_type"); } } json_decref(j_query); } } o_free(scope_values); attr_counter = 0; o_free(mods[attr_counter]); attr_counter++; for (i=0; config->auth_ldap->client_id_property_client_write[i] != NULL; i++) { o_free(mods[attr_counter]->mod_values); o_free(mods[attr_counter]); attr_counter++; } for (i=0; json_object_get(j_client, "name") != NULL && json_string_length(json_object_get(j_client, "name")) > 0 && config->auth_ldap->name_property_client_write[i] != NULL; i++) { o_free(mods[attr_counter]->mod_values); o_free(mods[attr_counter]); attr_counter++; } for (i=0; json_object_get(j_client, "description") != NULL && json_string_length(json_object_get(j_client, "description")) > 0 && config->auth_ldap->description_property_client_write[i] != NULL; i++) { o_free(mods[attr_counter]->mod_values); o_free(mods[attr_counter]); attr_counter++; } if (nb_redirect_uri > 0) { free_string_array(redirect_uri_array); for (i=0; config->auth_ldap->redirect_uri_property_client_write[i] != NULL && json_object_get(j_client, "redirect_uri") != NULL && nb_redirect_uri > 0; i++) { o_free(mods[attr_counter]); attr_counter++; } } for (i=0; config->use_scope && config->auth_ldap->confidential_property_client_write[i] != NULL; i++) { o_free(mods[attr_counter]->mod_values); o_free(mods[attr_counter]); attr_counter++; } for (i=0; config->use_scope && config->auth_ldap->scope_property_client_write[i] != NULL && json_object_get(j_client, "scope") != NULL && json_array_size(json_object_get(j_client, "scope")) > 0; i++) { o_free(mods[attr_counter]->mod_values); o_free(mods[attr_counter]); attr_counter++; } if (json_object_get(j_client, "confidential") == json_true() && json_object_get(j_client, "password") != NULL && json_string_length(json_object_get(j_client, "password")) > 0) { o_free(mods[attr_counter]->mod_values); o_free(mods[attr_counter]); attr_counter++; } o_free(mods); o_free(new_dn); o_free(password); } ldap_unbind_ext(ldap, NULL, NULL); return res; } /** * Add a new client in the database backend */ int add_client_database(struct config_elements * config, json_t * j_client) { json_t * j_query, * j_scope, * j_redirect_uri; int res, to_return; size_t index; char * clause_login, * clause_scope, * escaped = NULL, * password, * clause_auth_type; if (json_object_get(j_client, "confidential") == json_true()) { if (config->conn->type == HOEL_DB_TYPE_MARIADB) { escaped = h_escape_string(config->conn, json_string_value(json_object_get(j_client, "password"))); password = msprintf("PASSWORD('%s')", escaped); } else { escaped = generate_hash(config, config->hash_algorithm, json_string_value(json_object_get(j_client, "password"))); password = msprintf("'%s'", escaped); } } else { password = strdup("''"); } j_query = json_pack("{sss{sssssss{ss}sisi}}", "table", GLEWLWYD_TABLE_CLIENT, "values", "gc_name", json_string_value(json_object_get(j_client, "name")), "gc_description", json_object_get(j_client, "description")!=NULL?json_string_value(json_object_get(j_client, "description")):"", "gc_client_id", json_string_value(json_object_get(j_client, "client_id")), "gc_client_password", "raw", password, "gc_enabled", (json_object_get(j_client, "enabled")==json_false()?0:1), "gc_confidential", (json_object_get(j_client, "confidential")==json_true()?1:0)); res = h_insert(config->conn, j_query, NULL); json_decref(j_query); o_free(escaped); o_free(password); if (res == H_OK) { if (json_object_get(j_client, "scope") != NULL && config->use_scope) { escaped = h_escape_string(config->conn, json_string_value(json_object_get(j_client, "client_id"))); clause_login = msprintf("(SELECT `gc_id` FROM `%s` WHERE `gc_client_id`='%s')", GLEWLWYD_TABLE_CLIENT, escaped); o_free(escaped); j_query = json_pack("{sss[]}", "table", GLEWLWYD_TABLE_CLIENT_SCOPE, "values"); json_array_foreach(json_object_get(j_client, "scope"), index, j_scope) { escaped = h_escape_string(config->conn, json_string_value(j_scope)); clause_scope = msprintf("(SELECT `gs_id` FROM `%s` WHERE `gs_name`='%s')", GLEWLWYD_TABLE_SCOPE, escaped); o_free(escaped); json_array_append_new(json_object_get(j_query, "values"), json_pack("{s{ss}s{ss}}", "gc_id", "raw", clause_login, "gs_id", "raw", clause_scope)); o_free(clause_scope); } if (json_array_size(json_object_get(j_query, "values")) > 0) { if (h_insert(config->conn, j_query, NULL) != H_OK) { y_log_message(Y_LOG_LEVEL_ERROR, "add_client_database - Error adding scope"); } } o_free(clause_login); json_decref(j_query); } if (json_object_get(j_client, "redirect_uri") != NULL) { escaped = h_escape_string(config->conn, json_string_value(json_object_get(j_client, "client_id"))); clause_login = msprintf("(SELECT `gc_id` FROM `%s` WHERE `gc_client_id`='%s')", GLEWLWYD_TABLE_CLIENT, escaped); o_free(escaped); j_query = json_pack("{sss[]}", "table", GLEWLWYD_TABLE_REDIRECT_URI, "values"); json_array_foreach(json_object_get(j_client, "redirect_uri"), index, j_redirect_uri) { json_array_append_new(json_object_get(j_query, "values"), json_pack("{s{ss}ssss}", "gc_id", "raw", clause_login, "gru_name", json_string_value(json_object_get(j_redirect_uri, "name")), "gru_uri", json_string_value(json_object_get(j_redirect_uri, "uri")))); } o_free(clause_login); if (json_array_size(json_object_get(j_query, "values")) > 0) { if (h_insert(config->conn, j_query, NULL) != H_OK) { y_log_message(Y_LOG_LEVEL_ERROR, "add_client_database - Error adding redirect_uri"); } } json_decref(j_query); } if (json_object_get(j_client, "authorization_type") != NULL) { j_query = json_pack("{sss[]}", "table", GLEWLWYD_TABLE_CLIENT_AUTHORIZATION_TYPE, "values"); json_array_foreach(json_object_get(j_client, "authorization_type"), index, j_redirect_uri) { escaped = h_escape_string(config->conn, json_string_value(j_redirect_uri)); clause_auth_type = msprintf("(SELECT `got_id` FROM `%s` WHERE `got_name`='%s')", GLEWLWYD_TABLE_AUTHORIZATION_TYPE, escaped); o_free(escaped); json_array_append_new(json_object_get(j_query, "values"), json_pack("{sss{ss}}", "gc_client_id", json_string_value(json_object_get(j_client, "client_id")), "got_id", "raw", clause_auth_type)); o_free(clause_auth_type); } if (json_array_size(json_object_get(j_query, "values")) > 0) { if (h_insert(config->conn, j_query, NULL) != H_OK) { y_log_message(Y_LOG_LEVEL_ERROR, "add_client_database - Error adding authorization_type"); } } json_decref(j_query); } to_return = G_OK; } else { y_log_message(Y_LOG_LEVEL_ERROR, "add_client_database - Error adding client"); to_return = G_ERROR_DB; } return to_return; } /** * Update an existing client */ int set_client(struct config_elements * config, const char * client, json_t * j_client, const char * source) { if (source == NULL || 0 == strcmp("ldap", source) || 0 == strcmp("all", source)) { return set_client_ldap(config, client, j_client); } else { return set_client_database(config, client, j_client); } } /** * Update an existing client in the ldap backend */ int set_client_ldap(struct config_elements * config, const char * client_id, json_t * j_client) { LDAP * ldap = NULL; int res; int result; int ldap_version = LDAP_VERSION3; char * ldap_mech = LDAP_SASL_SIMPLE; struct berval cred, * servcred; LDAPMod ** mods = NULL; char ** scope_values = NULL; int nb_scope = 0, nb_redirect_uri = json_array_size(json_object_get(j_client, "redirect_uri")), nb_attr = 2, i, attr_counter; json_t * j_scope, * j_redirect_uri; size_t index; char * cur_dn, * password = NULL, ** redirect_uri_array = NULL; json_t * j_query; char * escaped, * clause_auth_type; for (i=0; json_object_get(j_client, "name") != NULL && json_string_length(json_object_get(j_client, "name")) > 0 && config->auth_ldap->name_property_client_write[i] != NULL; i++) { nb_attr++; } for (i=0; json_object_get(j_client, "description") != NULL && json_string_length(json_object_get(j_client, "description")) > 0 && config->auth_ldap->description_property_client_write[i] != NULL; i++) { nb_attr++; } for (i=0; json_object_get(j_client, "redirect_uri") != NULL && json_array_size(json_object_get(j_client, "redirect_uri")) > 0 && config->auth_ldap->redirect_uri_property_client_write[i] != NULL; i++) { nb_attr++; } for (i=0; config->auth_ldap->confidential_property_client_write[i] != NULL; i++) { nb_attr++; } for (i=0; config->use_scope && config->auth_ldap->scope_property_client_write[i] != NULL && json_object_get(j_client, "scope") != NULL && json_array_size(json_object_get(j_client, "scope")) > 0; i++) { nb_attr++; } if (json_object_get(j_client, "confidential") == json_true() && json_object_get(j_client, "password") != NULL && json_string_length(json_object_get(j_client, "password")) > 0) { nb_attr++; } if (config->use_scope && json_object_get(j_client, "scope") != NULL && json_array_size(json_object_get(j_client, "scope")) > 0) { nb_scope = json_array_size(json_object_get(j_client, "scope")); } mods = o_malloc(nb_attr*sizeof(LDAPMod *)); cred.bv_val = config->auth_ldap->bind_passwd; cred.bv_len = strlen(config->auth_ldap->bind_passwd); if (mods == NULL) { y_log_message(Y_LOG_LEVEL_ERROR, "Error allocating resources for mods"); res = G_ERROR; } else if (ldap_initialize(&ldap, config->auth_ldap->uri) != LDAP_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error initializing ldap"); res = G_ERROR; } else if (ldap_set_option(ldap, LDAP_OPT_PROTOCOL_VERSION, &ldap_version) != LDAP_OPT_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error setting ldap protocol version"); res = G_ERROR; } else if ((result = ldap_sasl_bind_s(ldap, config->auth_ldap->bind_dn, ldap_mech, &cred, NULL, NULL, &servcred)) != LDAP_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error binding to ldap server mode %s: %s", ldap_mech, ldap_err2string(result)); res = G_ERROR; } else { cur_dn = msprintf("%s=%s,%s", config->auth_ldap->rdn_property_client_write, client_id, config->auth_ldap->base_search_client); attr_counter=0; for (i=0; json_object_get(j_client, "name") != NULL && json_string_length(json_object_get(j_client, "name")) > 0 && config->auth_ldap->name_property_client_write[i] != NULL; i++) { mods[attr_counter] = o_malloc(sizeof(LDAPMod)); mods[attr_counter]->mod_values = o_malloc(2 * sizeof(char *)); mods[attr_counter]->mod_op = LDAP_MOD_REPLACE; mods[attr_counter]->mod_type = config->auth_ldap->name_property_client_write[i]; mods[attr_counter]->mod_values[0] = (char *)json_string_value(json_object_get(j_client, "name")); mods[attr_counter]->mod_values[1] = NULL; attr_counter++; } for (i=0; json_object_get(j_client, "description") != NULL && json_string_length(json_object_get(j_client, "description")) > 0 && config->auth_ldap->description_property_client_write[i] != NULL; i++) { mods[attr_counter] = o_malloc(sizeof(LDAPMod)); mods[attr_counter]->mod_values = o_malloc(2 * sizeof(char *)); mods[attr_counter]->mod_op = LDAP_MOD_REPLACE; mods[attr_counter]->mod_type = config->auth_ldap->description_property_client_write[i]; mods[attr_counter]->mod_values[0] = (char *)json_string_value(json_object_get(j_client, "description")); mods[attr_counter]->mod_values[1] = NULL; attr_counter++; } if (json_array_size(json_object_get(j_client, "redirect_uri")) > 0) { redirect_uri_array = o_malloc((nb_redirect_uri+1)*sizeof(char *)); if (redirect_uri_array != NULL) { json_array_foreach(json_object_get(j_client, "redirect_uri"), index, j_redirect_uri) { redirect_uri_array[index] = msprintf("%s %s", json_string_value(json_object_get(j_redirect_uri, "uri")), json_string_value(json_object_get(j_redirect_uri, "name"))); redirect_uri_array[index+1] = NULL; } } else { y_log_message(Y_LOG_LEVEL_ERROR, "Error allocating resources for redirect_uri_array"); } for (i=0; config->auth_ldap->redirect_uri_property_client_write[i] != NULL && json_object_get(j_client, "redirect_uri") != NULL; i++) { mods[attr_counter] = o_malloc(sizeof(LDAPMod)); mods[attr_counter]->mod_op = LDAP_MOD_REPLACE; mods[attr_counter]->mod_type = config->auth_ldap->redirect_uri_property_client_write[i]; mods[attr_counter]->mod_values = redirect_uri_array; attr_counter++; } } for (i=0; config->auth_ldap->confidential_property_client_write[i] != NULL; i++) { mods[attr_counter] = o_malloc(sizeof(LDAPMod)); mods[attr_counter]->mod_values = o_malloc(2 * sizeof(char *)); mods[attr_counter]->mod_op = LDAP_MOD_REPLACE; mods[attr_counter]->mod_type = config->auth_ldap->confidential_property_client_write[i]; mods[attr_counter]->mod_values[0] = json_object_get(j_client, "confidential")==json_true()?"1":"0"; mods[attr_counter]->mod_values[1] = NULL; attr_counter++; } for (i=0; config->use_scope && config->auth_ldap->scope_property_client_write[i] != NULL && json_object_get(j_client, "scope") != NULL && json_array_size(json_object_get(j_client, "scope")) > 0; i++) { mods[attr_counter] = o_malloc(sizeof(LDAPMod)); mods[attr_counter]->mod_op = LDAP_MOD_REPLACE; mods[attr_counter]->mod_type = config->auth_ldap->scope_property_client_write[i]; mods[attr_counter]->mod_values = o_malloc((nb_scope+1)*sizeof(char *)); json_array_foreach(json_object_get(j_client, "scope"), index, j_scope) { mods[attr_counter]->mod_values[index] = (char *)json_string_value(j_scope); mods[attr_counter]->mod_values[index+1] = NULL; } attr_counter++; } if (json_object_get(j_client, "confidential") == json_true() && json_object_get(j_client, "password") != NULL && json_string_length(json_object_get(j_client, "password")) > 0) { password = generate_hash(config, config->auth_ldap->password_algorithm_client_write, json_string_value(json_object_get(j_client, "password"))); if (password != NULL) { mods[attr_counter] = o_malloc(sizeof(LDAPMod)); mods[attr_counter]->mod_values = o_malloc(2 * sizeof(char *)); mods[attr_counter]->mod_op = LDAP_MOD_REPLACE; mods[attr_counter]->mod_type = config->auth_ldap->password_property_client_write; mods[attr_counter]->mod_values[0] = password; mods[attr_counter]->mod_values[1] = NULL; attr_counter++; } } mods[attr_counter] = NULL; if ((result = ldap_modify_ext_s(ldap, cur_dn, mods, NULL, NULL)) != LDAP_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error setting client %s in the ldap backend: %s", cur_dn, ldap_err2string(result)); res = G_ERROR; } else { if (json_object_get(j_client, "authorization_type") != NULL) { j_query = json_pack("{sss{ss}}", "table", GLEWLWYD_TABLE_CLIENT_AUTHORIZATION_TYPE, "where", "gc_client_id", client_id); res = h_delete(config->conn, j_query, NULL); json_decref(j_query); if (res == H_OK) { j_query = json_pack("{sss[]}", "table", GLEWLWYD_TABLE_CLIENT_AUTHORIZATION_TYPE, "values"); json_array_foreach(json_object_get(j_client, "authorization_type"), index, j_redirect_uri) { escaped = h_escape_string(config->conn, json_string_value(j_redirect_uri)); clause_auth_type = msprintf("(SELECT `got_id` FROM `%s` WHERE `got_name`='%s')", GLEWLWYD_TABLE_AUTHORIZATION_TYPE, escaped); o_free(escaped); json_array_append_new(json_object_get(j_query, "values"), json_pack("{sss{ss}}", "gc_client_id", client_id, "got_id", "raw", clause_auth_type)); o_free(clause_auth_type); } if (json_array_size(json_object_get(j_query, "values")) > 0) { if (h_insert(config->conn, j_query, NULL) != H_OK) { res = G_ERROR_DB; y_log_message(Y_LOG_LEVEL_ERROR, "set_client_database - Error adding authorization_type"); } else { res = G_OK; } } json_decref(j_query); } else { res = G_ERROR_DB; y_log_message(Y_LOG_LEVEL_ERROR, "set_client_database - Error deleting old authorization_type"); } } else { res = G_OK; } } o_free(scope_values); attr_counter=0; for (i=0; json_object_get(j_client, "name") != NULL && json_string_length(json_object_get(j_client, "name")) > 0 && config->auth_ldap->name_property_client_write[i] != NULL; i++) { o_free(mods[attr_counter]->mod_values); o_free(mods[attr_counter]); attr_counter++; } for (i=0; json_object_get(j_client, "description") != NULL && json_string_length(json_object_get(j_client, "description")) > 0 && config->auth_ldap->description_property_client_write[i] != NULL; i++) { o_free(mods[attr_counter]->mod_values); o_free(mods[attr_counter]); attr_counter++; } if (json_array_size(json_object_get(j_client, "redirect_uri")) > 0) { free_string_array(redirect_uri_array); for (i=0; config->auth_ldap->redirect_uri_property_client_write[i] != NULL && json_object_get(j_client, "redirect_uri") != NULL; i++) { o_free(mods[attr_counter]); attr_counter++; } } for (i=0; config->auth_ldap->confidential_property_client_write[i] != NULL; i++) { o_free(mods[attr_counter]->mod_values); o_free(mods[attr_counter]); attr_counter++; } for (i=0; config->use_scope && config->auth_ldap->scope_property_client_write[i] != NULL && json_object_get(j_client, "scope") != NULL && json_array_size(json_object_get(j_client, "scope")) > 0; i++) { o_free(mods[attr_counter]->mod_values); o_free(mods[attr_counter]); attr_counter++; } if (json_object_get(j_client, "confidential") == json_true() && json_object_get(j_client, "password") != NULL && json_string_length(json_object_get(j_client, "password")) > 0) { o_free(mods[attr_counter]->mod_values); o_free(mods[attr_counter]); attr_counter++; } o_free(mods); o_free(cur_dn); o_free(password); } ldap_unbind_ext(ldap, NULL, NULL); return res; } /** * Update an existing client in the database backend */ int set_client_database(struct config_elements * config, const char * client_id, json_t * j_client) { json_t * j_query, * j_scope, * j_redirect_uri; int res, to_return; size_t index; char * clause_login, * clause_scope, * escaped = NULL, * password, * clause_auth_type; j_query = json_pack("{sss{}s{ss}}", "table", GLEWLWYD_TABLE_CLIENT, "set", "where", "gc_client_id", client_id); if (json_object_get(j_client, "name") != NULL) { json_object_set(json_object_get(j_query, "set"), "gc_name", json_object_get(j_client, "name")); } if (json_object_get(j_client, "description") != NULL) { json_object_set(json_object_get(j_query, "set"), "gc_description", json_object_get(j_client, "description")); } if (json_object_get(j_client, "confidential") == json_true() && json_object_get(j_client, "password") != NULL) { json_object_set_new(json_object_get(j_query, "set"), "gc_confidential", json_integer(1)); if (config->conn->type == HOEL_DB_TYPE_MARIADB) { escaped = h_escape_string(config->conn, json_string_value(json_object_get(j_client, "password"))); password = msprintf("PASSWORD('%s')", escaped); } else { escaped = generate_hash(config, config->hash_algorithm, json_string_value(json_object_get(j_client, "password"))); password = msprintf("'%s'", escaped); } json_object_set_new(json_object_get(j_query, "set"), "gc_client_password", json_pack("{ss}", "raw", password)); o_free(password); o_free(escaped); } else if (json_object_get(j_client, "confidential") == json_false()) { json_object_set_new(json_object_get(j_query, "set"), "gc_confidential", json_integer(0)); } res = h_update(config->conn, j_query, NULL); json_decref(j_query); if (res == H_OK) { if (json_object_get(j_client, "scope") != NULL && config->use_scope) { escaped = h_escape_string(config->conn, client_id); clause_login = msprintf("= (SELECT `gc_id` FROM `%s` WHERE `gc_client_id`='%s')", GLEWLWYD_TABLE_CLIENT, escaped); o_free(escaped); j_query = json_pack("{sss{s{ssss}}}", "table", GLEWLWYD_TABLE_CLIENT_SCOPE, "where", "gc_id", "operator", "raw", "value", clause_login); o_free(clause_login); res = h_delete(config->conn, j_query, NULL); json_decref(j_query); if (res == H_OK) { escaped = h_escape_string(config->conn, client_id); clause_login = msprintf("(SELECT `gc_id` FROM `%s` WHERE `gc_client_id`='%s')", GLEWLWYD_TABLE_CLIENT, escaped); o_free(escaped); j_query = json_pack("{sss[]}", "table", GLEWLWYD_TABLE_CLIENT_SCOPE, "values"); json_array_foreach(json_object_get(j_client, "scope"), index, j_scope) { escaped = h_escape_string(config->conn, json_string_value(j_scope)); clause_scope = msprintf("(SELECT `gs_id` FROM `%s` WHERE `gs_name`='%s')", GLEWLWYD_TABLE_SCOPE, escaped); o_free(escaped); json_array_append_new(json_object_get(j_query, "values"), json_pack("{s{ss}s{ss}}", "gc_id", "raw", clause_login, "gs_id", "raw", clause_scope)); o_free(clause_scope); } o_free(clause_login); if (json_array_size(json_object_get(j_query, "values")) > 0) { if (h_insert(config->conn, j_query, NULL) != H_OK) { y_log_message(Y_LOG_LEVEL_ERROR, "set_client_database - Error adding scope"); } } json_decref(j_query); } else { y_log_message(Y_LOG_LEVEL_ERROR, "set_client_database - Error deleting old scope"); } } if (json_object_get(j_client, "redirect_uri") != NULL) { escaped = h_escape_string(config->conn, client_id); clause_login = msprintf("= (SELECT `gc_id` FROM `%s` WHERE `gc_client_id`='%s')", GLEWLWYD_TABLE_CLIENT, escaped); o_free(escaped); j_query = json_pack("{sss{s{ssss}}}", "table", GLEWLWYD_TABLE_REDIRECT_URI, "where", "gc_id", "operator", "raw", "value", clause_login); o_free(clause_login); res = h_delete(config->conn, j_query, NULL); json_decref(j_query); if (res == H_OK) { escaped = h_escape_string(config->conn, client_id); clause_login = msprintf("(SELECT `gc_id` FROM `%s` WHERE `gc_client_id`='%s')", GLEWLWYD_TABLE_CLIENT, escaped); o_free(escaped); j_query = json_pack("{sss[]}", "table", GLEWLWYD_TABLE_REDIRECT_URI, "values"); json_array_foreach(json_object_get(j_client, "redirect_uri"), index, j_redirect_uri) { json_array_append_new(json_object_get(j_query, "values"), json_pack("{s{ss}ssss}", "gc_id", "raw", clause_login, "gru_name", json_string_value(json_object_get(j_redirect_uri, "name")), "gru_uri", json_string_value(json_object_get(j_redirect_uri, "uri")))); } o_free(clause_login); if (json_array_size(json_object_get(j_query, "values")) > 0) { if (h_insert(config->conn, j_query, NULL) != H_OK) { y_log_message(Y_LOG_LEVEL_ERROR, "set_client_database - Error adding redirect_uri"); } } json_decref(j_query); } else { y_log_message(Y_LOG_LEVEL_ERROR, "set_client_database - Error deleting old redirect_uri"); } } if (json_object_get(j_client, "authorization_type") != NULL) { j_query = json_pack("{sss{ss}}", "table", GLEWLWYD_TABLE_CLIENT_AUTHORIZATION_TYPE, "where", "gc_client_id", client_id); res = h_delete(config->conn, j_query, NULL); json_decref(j_query); if (res == H_OK) { j_query = json_pack("{sss[]}", "table", GLEWLWYD_TABLE_CLIENT_AUTHORIZATION_TYPE, "values"); json_array_foreach(json_object_get(j_client, "authorization_type"), index, j_redirect_uri) { escaped = h_escape_string(config->conn, json_string_value(j_redirect_uri)); clause_auth_type = msprintf("(SELECT `got_id` FROM `%s` WHERE `got_name`='%s')", GLEWLWYD_TABLE_AUTHORIZATION_TYPE, escaped); o_free(escaped); json_array_append_new(json_object_get(j_query, "values"), json_pack("{sss{ss}}", "gc_client_id", client_id, "got_id", "raw", clause_auth_type)); o_free(clause_auth_type); } if (json_array_size(json_object_get(j_query, "values")) > 0) { if (h_insert(config->conn, j_query, NULL) != H_OK) { y_log_message(Y_LOG_LEVEL_ERROR, "set_client_database - Error adding authorization_type"); } } json_decref(j_query); } else { y_log_message(Y_LOG_LEVEL_ERROR, "set_client_database - Error deleting old authorization_type"); } } to_return = G_OK; } else { y_log_message(Y_LOG_LEVEL_ERROR, "set_client_database - Error updating client"); to_return = G_ERROR_DB; } return to_return; } /** * Delete a specific client */ int delete_client(struct config_elements * config, const char * client, const char * source) { if (source == NULL || 0 == strcmp("ldap", source) || 0 == strcmp("all", source)) { return delete_client_ldap(config, client); } else { return delete_client_database(config, client); } } /** * Delete a specific client in the ldap backend */ int delete_client_ldap(struct config_elements * config, const char * client_id) { LDAP * ldap = NULL; int res; int result; int ldap_version = LDAP_VERSION3; char * ldap_mech = LDAP_SASL_SIMPLE; struct berval cred, * servcred; char * cur_dn; cred.bv_val = config->auth_ldap->bind_passwd; cred.bv_len = strlen(config->auth_ldap->bind_passwd); if (ldap_initialize(&ldap, config->auth_ldap->uri) != LDAP_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error initializing ldap"); res = G_ERROR; } else if (ldap_set_option(ldap, LDAP_OPT_PROTOCOL_VERSION, &ldap_version) != LDAP_OPT_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error setting ldap protocol version"); res = G_ERROR; } else if ((result = ldap_sasl_bind_s(ldap, config->auth_ldap->bind_dn, ldap_mech, &cred, NULL, NULL, &servcred)) != LDAP_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error binding to ldap server mode %s: %s", ldap_mech, ldap_err2string(result)); res = G_ERROR; } else { cur_dn = msprintf("%s=%s,%s", config->auth_ldap->rdn_property_client_write, client_id, config->auth_ldap->base_search_client); if ((result = ldap_delete_ext_s(ldap, cur_dn, NULL, NULL)) != LDAP_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error deleting client %s in the ldap backend: %s", cur_dn, ldap_err2string(result)); res = G_ERROR; } else { res = G_OK; } o_free(cur_dn); } ldap_unbind_ext(ldap, NULL, NULL); return res; } /** * Delete a specific client in the database backend */ int delete_client_database(struct config_elements * config, const char * client_id) { json_t * j_query; int res; j_query = json_pack("{sss{ss}}", "table", GLEWLWYD_TABLE_CLIENT, "where", "gc_client_id", client_id); res = h_delete(config->conn, j_query, NULL); json_decref(j_query); if (res == H_OK) { return G_OK; } else { y_log_message(Y_LOG_LEVEL_ERROR, "delete_client_database - Error deleting client"); return G_ERROR_DB; } } glewlwyd-1.3.1/src/glewlwyd.c000066400000000000000000002522771322667720100161700ustar00rootroot00000000000000/** * * Glewlwyd OAuth2 Authorization Server * * OAuth2 authentiation server * Users are authenticated with a LDAP server * or users stored in the database * Provides Json Web Tokens (jwt) * * main functions definitions * and main process start * * Copyright 2016-2017 Nicolas Mora * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU GENERAL PUBLIC LICENSE * License as published by the Free Software Foundation; * version 3 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU GENERAL PUBLIC LICENSE for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see . * */ #include #include #include #include #include #include #include #include #include "glewlwyd.h" /** * * Main function * * Initialize config structure, parse the arguments and the config file * Then run the webservice * */ int main (int argc, char ** argv) { struct config_elements * config = o_malloc(sizeof(struct config_elements)); int res; srand(time(NULL)); if (config == NULL) { fprintf(stderr, "Memory error - config\n"); return 1; } // Init config structure with default values config->config_file = NULL; config->url_prefix = NULL; config->log_mode = Y_LOG_MODE_NONE; config->log_level = Y_LOG_LEVEL_NONE; config->log_file = NULL; config->use_scope = 0; config->conn = NULL; config->instance = o_malloc(sizeof(struct _u_instance)); config->allow_origin = NULL; config->static_files_path = NULL; config->static_files_prefix = NULL; config->auth_ldap = NULL; config->auth_http = NULL; config->refresh_token_expiration = GLEWLWYD_REFRESH_TOKEN_EXP_DEFAULT; config->access_token_expiration = GLEWLWYD_ACCESS_TOKEN_EXP_DEFAULT; config->code_expiration = GLEWLWYD_CODE_EXPIRATION_DEFAULT; config->jwt_decode_key = NULL; config->jwt = NULL; config->session_key = o_strdup(GLEWLWYD_SESSION_KEY_DEFAULT); config->session_expiration = GLEWLWYD_SESSION_EXPIRATION_DEFAULT; config->admin_scope = o_strdup(GLEWLWYD_ADMIN_SCOPE); config->profile_scope = o_strdup(GLEWLWYD_PROFILE_SCOPE); config->additional_property_name = NULL; config->use_secure_connection = 0; config->secure_connection_key_file = NULL; config->secure_connection_pem_file = NULL; config->hash_algorithm = o_strdup(GLEWLWYD_DEFAULT_HASH_ALGORITHM); config->reset_password = 0; config->reset_password_config = NULL; config->login_url = NULL; config->grant_url = NULL; if (config->instance == NULL) { fprintf(stderr, "Memory error - config->instance\n"); return 1; } ulfius_init_instance(config->instance, GLEWLWYD_DEFAULT_PORT, NULL, NULL); config->mime_types = o_malloc(sizeof(struct _u_map)); if (config->mime_types == NULL) { y_log_message(Y_LOG_LEVEL_ERROR, "init - Error allocating resources for config->mime_types, aborting"); exit_server(&config, GLEWLWYD_ERROR); } u_map_init(config->mime_types); u_map_put(config->mime_types, "*", "application/octet-stream"); if (pthread_mutex_init(&global_handler_close_lock, NULL) || pthread_cond_init(&global_handler_close_cond, NULL)) { y_log_message(Y_LOG_LEVEL_ERROR, "init - Error initializing global_handler_close_lock or global_handler_close_cond"); } // Catch end signals to make a clean exit if (signal (SIGQUIT, exit_handler) == SIG_ERR || signal (SIGINT, exit_handler) == SIG_ERR || signal (SIGTERM, exit_handler) == SIG_ERR || signal (SIGHUP, exit_handler) == SIG_ERR) { fprintf(stderr, "init - Error initializing end signal\n"); return 1; } // First we parse command line arguments if (!build_config_from_args(argc, argv, config)) { fprintf(stderr, "Error reading command-line parameters\n"); print_help(stderr); exit_server(&config, GLEWLWYD_ERROR); } // Then we parse configuration file // They have lower priority than command line parameters if (!build_config_from_file(config)) { fprintf(stderr, "Error config file\n"); exit_server(&config, GLEWLWYD_ERROR); } // Check if all mandatory configuration variables are present and correctly typed if (!check_config(config)) { fprintf(stderr, "Error initializing configuration\n"); exit_server(&config, GLEWLWYD_ERROR); } // At this point, we declare all API endpoints and configure // Authorization endpoint ulfius_add_endpoint_by_val(config->instance, "POST", config->url_prefix, "/auth/", GLEWLWYD_CALLBACK_PRIORITY_APPLICATION, &callback_glewlwyd_authorization, (void*)config); ulfius_add_endpoint_by_val(config->instance, "GET", config->url_prefix, "/auth/", GLEWLWYD_CALLBACK_PRIORITY_APPLICATION, &callback_glewlwyd_authorization, (void*)config); // Token endpoint ulfius_add_endpoint_by_val(config->instance, "POST", config->url_prefix, "/token/", GLEWLWYD_CALLBACK_PRIORITY_APPLICATION, &callback_glewlwyd_token, (void*)config); // Authentication ulfius_add_endpoint_by_val(config->instance, "POST", config->url_prefix, "/auth/user/", GLEWLWYD_CALLBACK_PRIORITY_APPLICATION, &callback_glewlwyd_validate_user_session, (void*)config); ulfius_add_endpoint_by_val(config->instance, "DELETE", config->url_prefix, "/auth/user/", GLEWLWYD_CALLBACK_PRIORITY_AUTHENTICATION, &callback_glewlwyd_check_user_session, (void*)config); ulfius_add_endpoint_by_val(config->instance, "DELETE", config->url_prefix, "/auth/user/", GLEWLWYD_CALLBACK_PRIORITY_APPLICATION, &callback_glewlwyd_delete_user_session, (void*)config); // Current user scope grant endpoints ulfius_add_endpoint_by_val(config->instance, "*", config->url_prefix, "/auth/grant/", GLEWLWYD_CALLBACK_PRIORITY_AUTHENTICATION, &callback_glewlwyd_check_user_session, (void*)config); ulfius_add_endpoint_by_val(config->instance, "GET", config->url_prefix, "/auth/grant/", GLEWLWYD_CALLBACK_PRIORITY_APPLICATION, &callback_glewlwyd_get_user_session_scope_grant, (void*)config); ulfius_add_endpoint_by_val(config->instance, "POST", config->url_prefix, "/auth/grant/", GLEWLWYD_CALLBACK_PRIORITY_APPLICATION, &callback_glewlwyd_set_user_scope_grant, (void*)config); ulfius_add_endpoint_by_val(config->instance, "DELETE", config->url_prefix, "/auth/grant/", GLEWLWYD_CALLBACK_PRIORITY_APPLICATION, &callback_glewlwyd_user_scope_delete, (void*)config); // Current user endpoints ulfius_add_endpoint_by_val(config->instance, "*", config->url_prefix, "/profile/", GLEWLWYD_CALLBACK_PRIORITY_AUTHENTICATION, &callback_glewlwyd_check_user, (void*)config); ulfius_add_endpoint_by_val(config->instance, "GET", config->url_prefix, "/profile/", GLEWLWYD_CALLBACK_PRIORITY_APPLICATION, &callback_glewlwyd_get_user_session_profile, (void*)config); ulfius_add_endpoint_by_val(config->instance, "PUT", config->url_prefix, "/profile/", GLEWLWYD_CALLBACK_PRIORITY_APPLICATION, &callback_glewlwyd_set_user_profile, (void*)config); ulfius_add_endpoint_by_val(config->instance, "*", config->url_prefix, "/profile/refresh_token", GLEWLWYD_CALLBACK_PRIORITY_AUTHENTICATION, &callback_glewlwyd_check_user, (void*)config); ulfius_add_endpoint_by_val(config->instance, "GET", config->url_prefix, "/profile/refresh_token", GLEWLWYD_CALLBACK_PRIORITY_APPLICATION, &callback_glewlwyd_get_refresh_token_profile, (void*)config); ulfius_add_endpoint_by_val(config->instance, "DELETE", config->url_prefix, "/profile/refresh_token", GLEWLWYD_CALLBACK_PRIORITY_APPLICATION, &callback_glewlwyd_delete_refresh_token_profile, (void*)config); ulfius_add_endpoint_by_val(config->instance, "*", config->url_prefix, "/profile/session", GLEWLWYD_CALLBACK_PRIORITY_AUTHENTICATION, &callback_glewlwyd_check_user, (void*)config); ulfius_add_endpoint_by_val(config->instance, "GET", config->url_prefix, "/profile/session", GLEWLWYD_CALLBACK_PRIORITY_APPLICATION, &callback_glewlwyd_get_session_profile, (void*)config); ulfius_add_endpoint_by_val(config->instance, "DELETE", config->url_prefix, "/profile/session", GLEWLWYD_CALLBACK_PRIORITY_APPLICATION, &callback_glewlwyd_delete_session_profile, (void*)config); if (config->reset_password) { ulfius_add_endpoint_by_val(config->instance, "POST", config->url_prefix, "/profile/reset_password/:username", GLEWLWYD_CALLBACK_PRIORITY_APPLICATION, &callback_glewlwyd_send_reset_user_profile, (void*)config); ulfius_add_endpoint_by_val(config->instance, "PUT", config->url_prefix, "/profile/reset_password/:username", GLEWLWYD_CALLBACK_PRIORITY_APPLICATION, &callback_glewlwyd_reset_user_profile, (void*)config); } // Authorization type callbacks ulfius_add_endpoint_by_val(config->instance, "*", config->url_prefix, "/authorization/", GLEWLWYD_CALLBACK_PRIORITY_AUTHENTICATION, &callback_glewlwyd_check_scope_admin, (void*)config); ulfius_add_endpoint_by_val(config->instance, "GET", config->url_prefix, "/authorization/", GLEWLWYD_CALLBACK_PRIORITY_APPLICATION, &callback_glewlwyd_get_authorization, (void*)config); ulfius_add_endpoint_by_val(config->instance, "*", config->url_prefix, "/authorization/:authorization_type", GLEWLWYD_CALLBACK_PRIORITY_AUTHENTICATION, &callback_glewlwyd_check_scope_admin, (void*)config); ulfius_add_endpoint_by_val(config->instance, "GET", config->url_prefix, "/authorization/:authorization_type", GLEWLWYD_CALLBACK_PRIORITY_APPLICATION, &callback_glewlwyd_get_authorization, (void*)config); ulfius_add_endpoint_by_val(config->instance, "PUT", config->url_prefix, "/authorization/:authorization_type", GLEWLWYD_CALLBACK_PRIORITY_APPLICATION, &callback_glewlwyd_set_authorization, (void*)config); // Scope endpoints if (config->use_scope) { ulfius_add_endpoint_by_val(config->instance, "*", config->url_prefix, "/scope/", GLEWLWYD_CALLBACK_PRIORITY_AUTHENTICATION, &callback_glewlwyd_check_scope_admin, (void*)config); ulfius_add_endpoint_by_val(config->instance, "*", config->url_prefix, "/scope/:scope", GLEWLWYD_CALLBACK_PRIORITY_AUTHENTICATION, &callback_glewlwyd_check_scope_admin, (void*)config); ulfius_add_endpoint_by_val(config->instance, "GET", config->url_prefix, "/scope/", GLEWLWYD_CALLBACK_PRIORITY_APPLICATION, &callback_glewlwyd_get_list_scope, (void*)config); ulfius_add_endpoint_by_val(config->instance, "GET", config->url_prefix, "/scope/:scope", GLEWLWYD_CALLBACK_PRIORITY_APPLICATION, &callback_glewlwyd_get_scope, (void*)config); ulfius_add_endpoint_by_val(config->instance, "POST", config->url_prefix, "/scope/", GLEWLWYD_CALLBACK_PRIORITY_APPLICATION, &callback_glewlwyd_add_scope, (void*)config); ulfius_add_endpoint_by_val(config->instance, "PUT", config->url_prefix, "/scope/:scope", GLEWLWYD_CALLBACK_PRIORITY_APPLICATION, &callback_glewlwyd_set_scope, (void*)config); ulfius_add_endpoint_by_val(config->instance, "DELETE", config->url_prefix, "/scope/:scope", GLEWLWYD_CALLBACK_PRIORITY_APPLICATION, &callback_glewlwyd_delete_scope, (void*)config); } // User endpoints ulfius_add_endpoint_by_val(config->instance, "*", config->url_prefix, "/user/", GLEWLWYD_CALLBACK_PRIORITY_AUTHENTICATION, &callback_glewlwyd_check_scope_admin, (void*)config); ulfius_add_endpoint_by_val(config->instance, "*", config->url_prefix, "/user/:username", GLEWLWYD_CALLBACK_PRIORITY_AUTHENTICATION, &callback_glewlwyd_check_scope_admin, (void*)config); ulfius_add_endpoint_by_val(config->instance, "*", config->url_prefix, "/user/:username/:action", GLEWLWYD_CALLBACK_PRIORITY_AUTHENTICATION, &callback_glewlwyd_check_scope_admin, (void*)config); ulfius_add_endpoint_by_val(config->instance, "GET", config->url_prefix, "/user/", GLEWLWYD_CALLBACK_PRIORITY_APPLICATION, &callback_glewlwyd_get_list_user, (void*)config); ulfius_add_endpoint_by_val(config->instance, "GET", config->url_prefix, "/user/:username", GLEWLWYD_CALLBACK_PRIORITY_APPLICATION, &callback_glewlwyd_get_user, (void*)config); ulfius_add_endpoint_by_val(config->instance, "POST", config->url_prefix, "/user/", GLEWLWYD_CALLBACK_PRIORITY_APPLICATION, &callback_glewlwyd_add_user, (void*)config); ulfius_add_endpoint_by_val(config->instance, "PUT", config->url_prefix, "/user/:username", GLEWLWYD_CALLBACK_PRIORITY_APPLICATION, &callback_glewlwyd_set_user, (void*)config); ulfius_add_endpoint_by_val(config->instance, "DELETE", config->url_prefix, "/user/:username", GLEWLWYD_CALLBACK_PRIORITY_APPLICATION, &callback_glewlwyd_delete_user, (void*)config); ulfius_add_endpoint_by_val(config->instance, "GET", config->url_prefix, "/user/:username/refresh_token", GLEWLWYD_CALLBACK_PRIORITY_APPLICATION, &callback_glewlwyd_get_refresh_token_user, (void*)config); ulfius_add_endpoint_by_val(config->instance, "DELETE", config->url_prefix, "/user/:username/refresh_token", GLEWLWYD_CALLBACK_PRIORITY_APPLICATION, &callback_glewlwyd_delete_refresh_token_user, (void*)config); ulfius_add_endpoint_by_val(config->instance, "GET", config->url_prefix, "/user/:username/session", GLEWLWYD_CALLBACK_PRIORITY_APPLICATION, &callback_glewlwyd_get_session_user, (void*)config); ulfius_add_endpoint_by_val(config->instance, "DELETE", config->url_prefix, "/user/:username/session", GLEWLWYD_CALLBACK_PRIORITY_APPLICATION, &callback_glewlwyd_delete_session_user, (void*)config); if (config->reset_password) { ulfius_add_endpoint_by_val(config->instance, "POST", config->url_prefix, "/user/:username/reset_password", GLEWLWYD_CALLBACK_PRIORITY_APPLICATION, &callback_glewlwyd_send_reset_user, (void*)config); } // Client endpoints ulfius_add_endpoint_by_val(config->instance, "*", config->url_prefix, "/client/", GLEWLWYD_CALLBACK_PRIORITY_AUTHENTICATION, &callback_glewlwyd_check_scope_admin, (void*)config); ulfius_add_endpoint_by_val(config->instance, "*", config->url_prefix, "/client/:client_id", GLEWLWYD_CALLBACK_PRIORITY_AUTHENTICATION, &callback_glewlwyd_check_scope_admin, (void*)config); ulfius_add_endpoint_by_val(config->instance, "GET", config->url_prefix, "/client/", GLEWLWYD_CALLBACK_PRIORITY_APPLICATION, &callback_glewlwyd_get_list_client, (void*)config); ulfius_add_endpoint_by_val(config->instance, "GET", config->url_prefix, "/client/:client_id", GLEWLWYD_CALLBACK_PRIORITY_APPLICATION, &callback_glewlwyd_get_client, (void*)config); ulfius_add_endpoint_by_val(config->instance, "POST", config->url_prefix, "/client/", GLEWLWYD_CALLBACK_PRIORITY_APPLICATION, &callback_glewlwyd_add_client, (void*)config); ulfius_add_endpoint_by_val(config->instance, "PUT", config->url_prefix, "/client/:client_id", GLEWLWYD_CALLBACK_PRIORITY_APPLICATION, &callback_glewlwyd_set_client, (void*)config); ulfius_add_endpoint_by_val(config->instance, "DELETE", config->url_prefix, "/client/:client_id", GLEWLWYD_CALLBACK_PRIORITY_APPLICATION, &callback_glewlwyd_delete_client, (void*)config); // Resource endpoints ulfius_add_endpoint_by_val(config->instance, "*", config->url_prefix, "/resource/", GLEWLWYD_CALLBACK_PRIORITY_AUTHENTICATION, &callback_glewlwyd_check_scope_admin, (void*)config); ulfius_add_endpoint_by_val(config->instance, "*", config->url_prefix, "/resource/:resource", GLEWLWYD_CALLBACK_PRIORITY_AUTHENTICATION, &callback_glewlwyd_check_scope_admin, (void*)config); ulfius_add_endpoint_by_val(config->instance, "GET", config->url_prefix, "/resource/", GLEWLWYD_CALLBACK_PRIORITY_APPLICATION, &callback_glewlwyd_get_list_resource, (void*)config); ulfius_add_endpoint_by_val(config->instance, "GET", config->url_prefix, "/resource/:resource", GLEWLWYD_CALLBACK_PRIORITY_APPLICATION, &callback_glewlwyd_get_resource, (void*)config); ulfius_add_endpoint_by_val(config->instance, "POST", config->url_prefix, "/resource/", GLEWLWYD_CALLBACK_PRIORITY_APPLICATION, &callback_glewlwyd_add_resource, (void*)config); ulfius_add_endpoint_by_val(config->instance, "PUT", config->url_prefix, "/resource/:resource", GLEWLWYD_CALLBACK_PRIORITY_APPLICATION, &callback_glewlwyd_set_resource, (void*)config); ulfius_add_endpoint_by_val(config->instance, "DELETE", config->url_prefix, "/resource/:resource", GLEWLWYD_CALLBACK_PRIORITY_APPLICATION, &callback_glewlwyd_delete_resource, (void*)config); // Other configuration ulfius_add_endpoint_by_val(config->instance, "GET", "/", NULL, GLEWLWYD_CALLBACK_PRIORITY_APPLICATION, &callback_glewlwyd_root, (void*)config); ulfius_add_endpoint_by_val(config->instance, "GET", "/config/", NULL, GLEWLWYD_CALLBACK_PRIORITY_APPLICATION, &callback_glewlwyd_server_configuration, (void*)config); ulfius_add_endpoint_by_val(config->instance, "OPTIONS", NULL, "*", GLEWLWYD_CALLBACK_PRIORITY_ZERO, &callback_glewlwyd_options, (void*)config); ulfius_add_endpoint_by_val(config->instance, "GET", config->static_files_prefix, "*", GLEWLWYD_CALLBACK_PRIORITY_APPLICATION, &callback_glewlwyd_static_file, (void*)config); ulfius_set_default_endpoint(config->instance, &callback_default, (void*)config); // Set default headers u_map_put(config->instance->default_headers, "Access-Control-Allow-Origin", config->allow_origin); u_map_put(config->instance->default_headers, "Access-Control-Allow-Credentials", "true"); u_map_put(config->instance->default_headers, "Cache-Control", "no-store"); u_map_put(config->instance->default_headers, "Pragma", "no-cache"); y_log_message(Y_LOG_LEVEL_INFO, "Start glewlwyd on port %d, prefix: %s, secure: %s", config->instance->port, config->url_prefix, config->use_secure_connection?"true":"false"); if (config->use_secure_connection) { char * key_file = get_file_content(config->secure_connection_key_file); char * pem_file = get_file_content(config->secure_connection_pem_file); if (key_file != NULL && pem_file != NULL) { res = ulfius_start_secure_framework(config->instance, key_file, pem_file); } else { res = U_ERROR_PARAMS; } o_free(key_file); o_free(pem_file); } else { res = ulfius_start_framework(config->instance); } if (res == U_OK) { // Wait until stop signal is broadcasted pthread_mutex_lock(&global_handler_close_lock); pthread_cond_wait(&global_handler_close_cond, &global_handler_close_lock); pthread_mutex_unlock(&global_handler_close_lock); } else { y_log_message(Y_LOG_LEVEL_ERROR, "Error starting glewlwyd webserver"); exit_server(&config, GLEWLWYD_ERROR); } if (pthread_mutex_destroy(&global_handler_close_lock) || pthread_cond_destroy(&global_handler_close_cond)) { y_log_message(Y_LOG_LEVEL_ERROR, "Error destroying global_handler_close_lock or global_handler_close_cond"); } exit_server(&config, GLEWLWYD_STOP); return 0; } /** * Exit properly the server by closing opened connections, databases and files */ void exit_server(struct config_elements ** config, int exit_value) { if (config != NULL && *config != NULL) { // Cleaning data o_free((*config)->config_file); o_free((*config)->url_prefix); o_free((*config)->log_file); o_free((*config)->allow_origin); o_free((*config)->static_files_path); o_free((*config)->static_files_prefix); o_free((*config)->jwt_decode_key); o_free((*config)->session_key); o_free((*config)->admin_scope); o_free((*config)->profile_scope); o_free((*config)->secure_connection_key_file); o_free((*config)->secure_connection_pem_file); o_free((*config)->hash_algorithm); o_free((*config)->login_url); o_free((*config)->grant_url); o_free((*config)->additional_property_name); if ((*config)->reset_password_config != NULL) { o_free((*config)->reset_password_config->smtp_host); o_free((*config)->reset_password_config->smtp_user); o_free((*config)->reset_password_config->smtp_password); o_free((*config)->reset_password_config->email_from); o_free((*config)->reset_password_config->email_subject); o_free((*config)->reset_password_config->email_template); o_free((*config)->reset_password_config->page_url_prefix); o_free((*config)->reset_password_config); } jwt_free((*config)->jwt); u_map_clean_full((*config)->mime_types); if ((*config)->auth_ldap != NULL) { o_free((*config)->auth_ldap->uri); o_free((*config)->auth_ldap->bind_dn); o_free((*config)->auth_ldap->bind_passwd); o_free((*config)->auth_ldap->base_search_user); o_free((*config)->auth_ldap->filter_user_read); o_free((*config)->auth_ldap->login_property_user_read); o_free((*config)->auth_ldap->scope_property_user_read); o_free((*config)->auth_ldap->additional_property_value_read); o_free((*config)->auth_ldap->name_property_user_read); o_free((*config)->auth_ldap->email_property_user_read); o_free((*config)->auth_ldap->rdn_property_user_write); free_string_array((*config)->auth_ldap->login_property_user_write); free_string_array((*config)->auth_ldap->scope_property_user_write); free_string_array((*config)->auth_ldap->name_property_user_write); free_string_array((*config)->auth_ldap->email_property_user_write); free_string_array((*config)->auth_ldap->additional_property_value_write); o_free((*config)->auth_ldap->password_property_user_write); o_free((*config)->auth_ldap->password_algorithm_user_write); free_string_array((*config)->auth_ldap->object_class_user_write); o_free((*config)->auth_ldap->base_search_client); o_free((*config)->auth_ldap->filter_client_read); o_free((*config)->auth_ldap->client_id_property_client_read); o_free((*config)->auth_ldap->scope_property_client_read); o_free((*config)->auth_ldap->name_property_client_read); o_free((*config)->auth_ldap->description_property_client_read); o_free((*config)->auth_ldap->redirect_uri_property_client_read); o_free((*config)->auth_ldap->confidential_property_client_read); o_free((*config)->auth_ldap->rdn_property_client_write); free_string_array((*config)->auth_ldap->client_id_property_client_write); free_string_array((*config)->auth_ldap->scope_property_client_write); free_string_array((*config)->auth_ldap->name_property_client_write); free_string_array((*config)->auth_ldap->description_property_client_write); free_string_array((*config)->auth_ldap->redirect_uri_property_client_write); free_string_array((*config)->auth_ldap->confidential_property_client_write); o_free((*config)->auth_ldap->password_property_client_write); o_free((*config)->auth_ldap->password_algorithm_client_write); free_string_array((*config)->auth_ldap->object_class_client_write); o_free((*config)->auth_ldap); } if ((*config)->auth_http != NULL) { o_free((*config)->auth_http->url); o_free((*config)->auth_http); } h_close_db((*config)->conn); h_clean_connection((*config)->conn); ulfius_stop_framework((*config)->instance); ulfius_clean_instance((*config)->instance); o_free((*config)->instance); y_close_logs(); o_free(*config); (*config) = NULL; } exit(exit_value); } /** * Initialize the application configuration based on the command line parameters */ int build_config_from_args(int argc, char ** argv, struct config_elements * config) { int next_option; const char * short_options = "c::p::u::m::l::f::h::v::"; char * tmp = NULL, * to_free = NULL, * one_log_mode = NULL; static const struct option long_options[]= { {"config-file", optional_argument, NULL, 'c'}, {"port", optional_argument, NULL, 'p'}, {"url-prefix", optional_argument, NULL, 'u'}, {"log-mode", optional_argument, NULL, 'm'}, {"log-level", optional_argument, NULL, 'l'}, {"log-file", optional_argument, NULL, 'f'}, {"help", optional_argument, NULL, 'h'}, {"version", optional_argument, NULL, 'v'}, {NULL, 0, NULL, 0} }; if (config != NULL) { do { next_option = getopt_long(argc, argv, short_options, long_options, NULL); switch (next_option) { case 'c': if (optarg != NULL) { config->config_file = o_strdup(optarg); if (config->config_file == NULL) { fprintf(stderr, "Error allocating config->config_file, exiting\n"); exit_server(&config, GLEWLWYD_STOP); } } else { fprintf(stderr, "Error!\nNo config file specified\n"); return 0; } break; case 'p': if (optarg != NULL) { config->instance->port = strtol(optarg, NULL, 10); if (config->instance->port <= 0 || config->instance->port > 65535) { fprintf(stderr, "Error!\nInvalid TCP Port number\n\tPlease specify an integer value between 1 and 65535"); return 0; } } else { fprintf(stderr, "Error!\nNo TCP Port number specified\n"); return 0; } break; case 'u': if (optarg != NULL) { config->url_prefix = o_strdup(optarg); if (config->url_prefix == NULL) { fprintf(stderr, "Error allocating config->url_prefix, exiting\n"); exit_server(&config, GLEWLWYD_STOP); } } else { fprintf(stderr, "Error!\nNo URL prefix specified\n"); return 0; } break; case 'm': if (optarg != NULL) { tmp = o_strdup(optarg); if (tmp == NULL) { fprintf(stderr, "Error allocating log_mode, exiting\n"); exit_server(&config, GLEWLWYD_STOP); } one_log_mode = strtok(tmp, ","); while (one_log_mode != NULL) { if (0 == strncmp("console", one_log_mode, strlen("console"))) { config->log_mode |= Y_LOG_MODE_CONSOLE; } else if (0 == strncmp("syslog", one_log_mode, strlen("syslog"))) { config->log_mode |= Y_LOG_MODE_SYSLOG; } else if (0 == strncmp("file", one_log_mode, strlen("file"))) { config->log_mode |= Y_LOG_MODE_FILE; } one_log_mode = strtok(NULL, ","); } o_free(to_free); } else { fprintf(stderr, "Error!\nNo mode specified\n"); return 0; } break; case 'l': if (optarg != NULL) { if (0 == strncmp("NONE", optarg, strlen("NONE"))) { config->log_level = Y_LOG_LEVEL_NONE; } else if (0 == strncmp("ERROR", optarg, strlen("ERROR"))) { config->log_level = Y_LOG_LEVEL_ERROR; } else if (0 == strncmp("WARNING", optarg, strlen("WARNING"))) { config->log_level = Y_LOG_LEVEL_WARNING; } else if (0 == strncmp("INFO", optarg, strlen("INFO"))) { config->log_level = Y_LOG_LEVEL_INFO; } else if (0 == strncmp("DEBUG", optarg, strlen("DEBUG"))) { config->log_level = Y_LOG_LEVEL_DEBUG; } } else { fprintf(stderr, "Error!\nNo log level specified\n"); return 0; } break; case 'f': if (optarg != NULL) { config->log_file = o_strdup(optarg); if (config->log_file == NULL) { fprintf(stderr, "Error allocating config->log_file, exiting\n"); exit_server(&config, GLEWLWYD_STOP); } } else { fprintf(stderr, "Error!\nNo log file specified\n"); return 0; } break; case 'h': case 'v': print_help(stdout); exit_server(&config, GLEWLWYD_STOP); break; } } while (next_option != -1); // If none exists, exit failure if (config->config_file == NULL) { fprintf(stderr, "No configuration file found, please specify a configuration file path\n"); return 0; } return 1; } else { return 0; } } /** * Print help message to output file specified */ void print_help(FILE * output) { fprintf(output, "\nGlewlwyd OAuth2 authentication server\n"); fprintf(output, "\n"); fprintf(output, "Version %s\n", _GLEWLWYD_VERSION_); fprintf(output, "\n"); fprintf(output, "Copyright 2016-2017 Nicolas Mora \n"); fprintf(output, "\n"); fprintf(output, "This program is free software; you can redistribute it and/or\n"); fprintf(output, "modify it under the terms of the GNU GENERAL PUBLIC LICENSE\n"); fprintf(output, "License as published by the Free Software Foundation;\n"); fprintf(output, "version 3 of the License.\n"); fprintf(output, "\n"); fprintf(output, "Command-line options:\n"); fprintf(output, "\n"); fprintf(output, "-c --config-file=PATH\n"); fprintf(output, "\tPath to configuration file\n"); fprintf(output, "-p --port=PORT\n"); fprintf(output, "\tPort to listen to\n"); fprintf(output, "-u --url-prefix=PREFIX\n"); fprintf(output, "\tAPI URL prefix\n"); fprintf(output, "-m --log-mode=MODE\n"); fprintf(output, "\tLog Mode\n"); fprintf(output, "\tconsole, syslog or file\n"); fprintf(output, "\tIf you want multiple modes, separate them with a comma \",\"\n"); fprintf(output, "\tdefault: console\n"); fprintf(output, "-l --log-level=LEVEL\n"); fprintf(output, "\tLog level\n"); fprintf(output, "\tNONE, ERROR, WARNING, INFO, DEBUG\n"); fprintf(output, "\tdefault: ERROR\n"); fprintf(output, "-f --log-file=PATH\n"); fprintf(output, "\tPath for log file if log mode file is specified\n"); fprintf(output, "-h --help\n"); fprintf(output, "-v --version\n"); fprintf(output, "\tPrint this message\n\n"); } /** * handles signal catch to exit properly when ^C is used for example * I don't like global variables but it looks fine to people who designed this */ void exit_handler(int signal) { y_log_message(Y_LOG_LEVEL_INFO, "Glewlwyd caught a stop or kill signal (%d), exiting", signal); pthread_mutex_lock(&global_handler_close_lock); pthread_cond_signal(&global_handler_close_cond); pthread_mutex_unlock(&global_handler_close_lock); } /** * * Read the content of a file and return it as a char * * returned value must be o_free'd after use * */ char * get_file_content(const char * file_path) { char * buffer = NULL; size_t length, res; FILE * f; f = fopen (file_path, "rb"); if (f) { fseek (f, 0, SEEK_END); length = ftell (f); fseek (f, 0, SEEK_SET); buffer = o_malloc((length+1)*sizeof(char)); if (buffer) { res = fread (buffer, 1, length, f); if (res != length) { fprintf(stderr, "fread warning, reading %zu while expecting %zu", res, length); } // Add null character at the end of buffer, just in case buffer[length] = '\0'; } fclose (f); } return buffer; } /** * Initialize the application configuration based on the config file content * Read the config file, get mandatory variables and devices */ int build_config_from_file(struct config_elements * config) { config_t cfg; config_setting_t * root = NULL, * database = NULL, * auth = NULL, * jwt = NULL, * mime_type_list = NULL, * mime_type = NULL, * reset_password_config = NULL; const char * cur_prefix = NULL, * cur_log_mode = NULL, * cur_log_level = NULL, * cur_log_file = NULL, * one_log_mode = NULL, * cur_hash_algorithm = NULL, * db_type = NULL, * db_sqlite_path = NULL, * db_mariadb_host = NULL, * db_mariadb_user = NULL, * db_mariadb_password = NULL, * db_mariadb_dbname = NULL, * cur_allow_origin = NULL, * cur_static_files_path = NULL, * cur_static_files_prefix = NULL, * cur_session_key = NULL, * cur_admin_scope = NULL, * cur_profile_scope = NULL, * cur_additional_property_name = NULL, * cur_auth_ldap_uri = NULL, * cur_auth_ldap_bind_dn = NULL, * cur_auth_ldap_bind_passwd = NULL, * cur_auth_ldap_base_search_user = NULL, * cur_auth_ldap_filter_user_read = NULL, * cur_auth_ldap_login_property_user_read = NULL, * cur_auth_ldap_name_property_user_read = NULL, * cur_auth_ldap_email_property_user_read = NULL, * cur_auth_ldap_scope_property_user_read = NULL, * cur_auth_ldap_additional_property_value_read = NULL, * cur_auth_ldap_additional_property_value_write = NULL, * cur_auth_ldap_rdn_property_user_write = NULL, * cur_auth_ldap_login_property_user_write = NULL, * cur_auth_ldap_name_property_user_write = NULL, * cur_auth_ldap_email_property_user_write = NULL, * cur_auth_ldap_scope_property_user_write = NULL, * cur_auth_ldap_password_property_user_write = NULL, * cur_auth_ldap_password_algorithm_user_write = NULL, * cur_auth_ldap_object_class_user_write = NULL, * cur_auth_ldap_base_search_client = NULL, * cur_auth_ldap_filter_client_read = NULL, * cur_auth_ldap_client_id_property_client_read = NULL, * cur_auth_ldap_name_property_client_read = NULL, * cur_auth_ldap_scope_property_client_read = NULL, * cur_auth_ldap_description_property_client_read = NULL, * cur_auth_ldap_redirect_uri_property_client_read = NULL, * cur_auth_ldap_confidential_property_client_read = NULL, * cur_auth_ldap_client_id_property_client_write = NULL, * cur_auth_ldap_rdn_property_client_write = NULL, * cur_auth_ldap_name_property_client_write = NULL, * cur_auth_ldap_scope_property_client_write = NULL, * cur_auth_ldap_description_property_client_write = NULL, * cur_auth_ldap_redirect_uri_property_client_write = NULL, * cur_auth_ldap_confidential_property_client_write = NULL, * cur_auth_ldap_password_property_client_write = NULL, * cur_auth_ldap_password_algorithm_client_write = NULL, * cur_auth_ldap_object_class_client_write = NULL, * cur_rsa_key_file = NULL, * cur_rsa_pub_file = NULL, * cur_ecdsa_key_file = NULL, * cur_ecdsa_pub_file = NULL, * cur_sha_secret = NULL, * extension = NULL, * mime_type_value = NULL, * cur_secure_connection_key_file = NULL, * cur_secure_connection_pem_file = NULL, * cur_grant_url = NULL, * cur_login_url = NULL, * cur_reset_password_smtp_host = NULL, * cur_reset_password_smtp_user = NULL, * cur_reset_password_smtp_password = NULL, * cur_reset_password_email_from = NULL, * cur_reset_password_email_subject = NULL, * cur_reset_password_email_template_path = NULL, * cur_reset_password_page_url_prefix = NULL, * cur_auth_http_auth_url = NULL; int db_mariadb_port = 0, cur_key_size = 512; int cur_http_auth = 0, cur_database_auth = 0, cur_ldap_auth = 0, cur_use_scope = 0, cur_use_rsa = 0, cur_use_ecdsa = 0, cur_use_sha = 0, cur_use_secure_connection = 0, cur_auth_ldap_user_write = 0, cur_auth_ldap_client_write = 0, cur_auth_http_check_server_certificate = 1, i; config_init(&cfg); if (!config_read_file(&cfg, config->config_file)) { fprintf(stderr, "Error parsing config file %s\nOn line %d error: %s\n", config_error_file(&cfg), config_error_line(&cfg), config_error_text(&cfg)); config_destroy(&cfg); return 0; } if (config->instance->port == GLEWLWYD_DEFAULT_PORT) { int port; // Get Port number to listen to config_lookup_int(&cfg, "port", &port); config->instance->port = (uint)port; } if (config->url_prefix == NULL) { // Get prefix url if (config_lookup_string(&cfg, "url_prefix", &cur_prefix)) { config->url_prefix = o_strdup(cur_prefix); if (config->url_prefix == NULL) { fprintf(stderr, "Error allocating config->url_prefix, exiting\n"); config_destroy(&cfg); return 0; } } } if (config->log_mode == Y_LOG_MODE_NONE) { // Get log mode if (config_lookup_string(&cfg, "log_mode", &cur_log_mode)) { one_log_mode = strtok((char *)cur_log_mode, ","); while (one_log_mode != NULL) { if (0 == strncmp("console", one_log_mode, strlen("console"))) { config->log_mode |= Y_LOG_MODE_CONSOLE; } else if (0 == strncmp("syslog", one_log_mode, strlen("syslog"))) { config->log_mode |= Y_LOG_MODE_SYSLOG; } else if (0 == strncmp("file", one_log_mode, strlen("file"))) { config->log_mode |= Y_LOG_MODE_FILE; // Get log file path if (config->log_file == NULL) { if (config_lookup_string(&cfg, "log_file", &cur_log_file)) { config->log_file = o_strdup(cur_log_file); if (config->log_file == NULL) { fprintf(stderr, "Error allocating config->log_file, exiting\n"); config_destroy(&cfg); return 0; } } } } one_log_mode = strtok(NULL, ","); } } } if (config->log_level == Y_LOG_LEVEL_NONE) { // Get log level if (config_lookup_string(&cfg, "log_level", &cur_log_level)) { if (0 == strncmp("NONE", cur_log_level, strlen("NONE"))) { config->log_level = Y_LOG_LEVEL_NONE; } else if (0 == strncmp("ERROR", cur_log_level, strlen("ERROR"))) { config->log_level = Y_LOG_LEVEL_ERROR; } else if (0 == strncmp("WARNING", cur_log_level, strlen("WARNING"))) { config->log_level = Y_LOG_LEVEL_WARNING; } else if (0 == strncmp("INFO", cur_log_level, strlen("INFO"))) { config->log_level = Y_LOG_LEVEL_INFO; } else if (0 == strncmp("DEBUG", cur_log_level, strlen("DEBUG"))) { config->log_level = Y_LOG_LEVEL_DEBUG; } } } if (!y_init_logs(GLEWLWYD_LOG_NAME, config->log_mode, config->log_level, config->log_file, "Starting Glewlwyd Oauth2 authentication service")) { fprintf(stderr, "Error initializing logs\n"); exit_server(&config, GLEWLWYD_ERROR); } if (config->allow_origin == NULL) { // Get allow-origin value for CORS if (config_lookup_string(&cfg, "allow_origin", &cur_allow_origin)) { config->allow_origin = o_strdup(cur_allow_origin); if (config->allow_origin == NULL) { fprintf(stderr, "Error allocating config->allow_origin, exiting\n"); config_destroy(&cfg); return 0; } } } config_lookup_int(&cfg, "refresh_token_expiation", (int *)&config->refresh_token_expiration); config_lookup_int(&cfg, "access_token_expiration", (int *)&config->access_token_expiration); config_lookup_int(&cfg, "session_expiration", (int *)&config->session_expiration); config_lookup_int(&cfg, "code_expiration", (int *)&config->code_expiration); config_lookup_string(&cfg, "session_key", &cur_session_key); if (cur_session_key != NULL) { o_free(config->session_key); config->session_key = strdup(cur_session_key); } config_lookup_string(&cfg, "admin_scope", &cur_admin_scope); if (cur_admin_scope != NULL) { o_free(config->admin_scope); config->admin_scope = strdup(cur_admin_scope); } config_lookup_string(&cfg, "profile_scope", &cur_profile_scope); if (cur_profile_scope != NULL) { o_free(config->profile_scope); config->profile_scope = strdup(cur_profile_scope); } config_lookup_string(&cfg, "additional_property_name", &cur_additional_property_name); if (cur_additional_property_name != NULL) { config->additional_property_name = strdup(cur_additional_property_name); } config_lookup_bool(&cfg, "use_scope", &cur_use_scope); config->use_scope = cur_use_scope; config_lookup_string(&cfg, "login_url", &cur_login_url); if (cur_login_url == NULL) { fprintf(stderr, "login_url is mandatory, exiting\n"); config_destroy(&cfg); return 0; } else { config->login_url = strdup(cur_login_url); if (config->login_url == NULL) { fprintf(stderr, "Error allocating resources for config->login_url, exiting\n"); config_destroy(&cfg); return 0; } } config_lookup_string(&cfg, "grant_url", &cur_grant_url); if (cur_grant_url == NULL) { fprintf(stderr, "grant_url is mandatory, exiting\n"); config_destroy(&cfg); return 0; } else { config->grant_url = strdup(cur_grant_url); if (config->grant_url == NULL) { fprintf(stderr, "Error allocating resources for config->grant_url, exiting\n"); config_destroy(&cfg); return 0; } } root = config_root_setting(&cfg); config_lookup_bool(&cfg, "reset_password", &config->reset_password); if (config->reset_password) { reset_password_config = config_setting_get_member(root, "reset_password_config"); if (reset_password_config != NULL) { config->reset_password_config = o_malloc(sizeof(struct _reset_password_config)); if (config->reset_password_config != NULL) { config->reset_password_config->smtp_host = NULL; config->reset_password_config->smtp_port = GLEWLWYD_RESET_PASSWORD_DEFAULT_SMTP_PORT; config->reset_password_config->smtp_use_tls = 0; config->reset_password_config->smtp_verify_certificate = 0; config->reset_password_config->smtp_user = NULL; config->reset_password_config->smtp_password = NULL; config->reset_password_config->token_expiration = GLEWLWYD_RESET_PASSWORD_DEFAULT_TOKEN_EXPIRATION; config->reset_password_config->email_from = NULL; config->reset_password_config->email_subject = NULL; config->reset_password_config->email_template = NULL; config->reset_password_config->page_url_prefix = NULL; if (config_setting_lookup_string(reset_password_config, "smtp_host", &cur_reset_password_smtp_host) == CONFIG_TRUE) { if ((config->reset_password_config->smtp_host = o_strdup(cur_reset_password_smtp_host)) == NULL) { fprintf(stderr, "Error allocating config->reset_password_config->smtp_host, exiting\n"); config_destroy(&cfg); return 0; } } config_setting_lookup_int(reset_password_config, "smtp_port", (int *)&config->reset_password_config->smtp_port); config_setting_lookup_bool(reset_password_config, "smtp_use_tls", &config->reset_password_config->smtp_use_tls); config_setting_lookup_bool(reset_password_config, "smtp_verify_certificate", &config->reset_password_config->smtp_verify_certificate); if (config_setting_lookup_string(reset_password_config, "smtp_user", &cur_reset_password_smtp_user) == CONFIG_TRUE) { if ((config->reset_password_config->smtp_user = o_strdup(cur_reset_password_smtp_user)) == NULL) { fprintf(stderr, "Error allocating config->reset_password_config->smtp_user, exiting\n"); config_destroy(&cfg); return 0; } } if (config_setting_lookup_string(reset_password_config, "smtp_password", &cur_reset_password_smtp_password) == CONFIG_TRUE) { if ((config->reset_password_config->smtp_password = o_strdup(cur_reset_password_smtp_password)) == NULL) { fprintf(stderr, "Error allocating config->reset_password_config->smtp_password, exiting\n"); config_destroy(&cfg); return 0; } } config_setting_lookup_int(reset_password_config, "token_expiration", (int *)&config->reset_password_config->token_expiration); if (config_setting_lookup_string(reset_password_config, "email_from", &cur_reset_password_email_from) == CONFIG_TRUE) { if ((config->reset_password_config->email_from = o_strdup(cur_reset_password_email_from)) == NULL) { fprintf(stderr, "Error allocating config->reset_password_config->email_from, exiting\n"); config_destroy(&cfg); return 0; } } if (config_setting_lookup_string(reset_password_config, "email_subject", &cur_reset_password_email_subject) == CONFIG_TRUE) { if ((config->reset_password_config->email_subject = o_strdup(cur_reset_password_email_subject)) == NULL) { fprintf(stderr, "Error allocating config->reset_password_config->email_subject, exiting\n"); config_destroy(&cfg); return 0; } } if (config_setting_lookup_string(reset_password_config, "email_template", &cur_reset_password_email_template_path) == CONFIG_TRUE) { if ((config->reset_password_config->email_template = get_file_content(cur_reset_password_email_template_path)) == NULL) { fprintf(stderr, "Error email_template, exiting\n"); config_destroy(&cfg); return 0; } } if (config_setting_lookup_string(reset_password_config, "page_url_prefix", &cur_reset_password_page_url_prefix) == CONFIG_TRUE) { if ((config->reset_password_config->page_url_prefix = o_strdup(cur_reset_password_page_url_prefix)) == NULL) { fprintf(stderr, "Error allocating config->reset_password_config->page_url_prefix, exiting\n"); config_destroy(&cfg); return 0; } } if (config->reset_password_config->smtp_host == NULL || config->reset_password_config->email_from == NULL || config->reset_password_config->email_subject == NULL || config->reset_password_config->email_template == NULL || config->reset_password_config->page_url_prefix == NULL) { fprintf(stderr, "Error reset_password, mandatory parameters are missing, exiting %s %s %s %s %s\n", config->reset_password_config->smtp_host, config->reset_password_config->email_from, config->reset_password_config->email_subject, config->reset_password_config->email_template, config->reset_password_config->page_url_prefix); config_destroy(&cfg); return 0; } } else { fprintf(stderr, "Error allocating config->reset_password_config, exiting\n"); config_destroy(&cfg); return 0; } } else { fprintf(stderr, "Error no reset_password_config values, exiting\n"); config_destroy(&cfg); return 0; } } if (config->static_files_path == NULL) { // Get path that serve static files if (config_lookup_string(&cfg, "static_files_path", &cur_static_files_path)) { config->static_files_path = o_strdup(cur_static_files_path); if (config->static_files_path == NULL) { fprintf(stderr, "Error allocating config->static_files_path, exiting\n"); config_destroy(&cfg); return 0; } } } if (config->static_files_prefix == NULL) { // Get prefix url if (config_lookup_string(&cfg, "static_files_prefix", &cur_static_files_prefix)) { config->static_files_prefix = o_strdup(cur_static_files_prefix); if (config->static_files_prefix == NULL) { fprintf(stderr, "Error allocating config->static_files_prefix, exiting\n"); config_destroy(&cfg); return 0; } } } // Populate mime types u_map mime_type_list = config_lookup(&cfg, "static_files_mime_types"); if (mime_type_list != NULL) { for (i=0; imime_types, extension, mime_type_value); } } } } if (config_lookup_bool(&cfg, "use_secure_connection", &cur_use_secure_connection)) { if (config_lookup_string(&cfg, "secure_connection_key_file", &cur_secure_connection_key_file) && config_lookup_string(&cfg, "secure_connection_pem_file", &cur_secure_connection_pem_file)) { config->use_secure_connection = cur_use_secure_connection; config->secure_connection_key_file = o_strdup(cur_secure_connection_key_file); config->secure_connection_pem_file = o_strdup(cur_secure_connection_pem_file); } else { fprintf(stderr, "Error secure connection is active but certificate is not valid, exiting\n"); config_destroy(&cfg); return 0; } } // Get token hash algorithm if (config_lookup_string(&cfg, "hash_algorithm", &cur_hash_algorithm)) { o_free(config->hash_algorithm); config->hash_algorithm = o_strdup(cur_hash_algorithm); if (config->hash_algorithm == NULL) { fprintf(stderr, "Error allocating config->hash_algorithm, exiting\n"); config_destroy(&cfg); return 0; } else if (config->hash_algorithm == NULL || (strcmp("SHA1", config->hash_algorithm) && strcmp("SHA256", config->hash_algorithm) && strcmp("SHA512", config->hash_algorithm) && strcmp("MD5", config->hash_algorithm))) { config_destroy(&cfg); fprintf(stderr, "Error token hash algorithm: %s\n", config->hash_algorithm); return 0; } } database = config_setting_get_member(root, "database"); if (database != NULL) { if (config_setting_lookup_string(database, "type", &db_type) == CONFIG_TRUE) { if (0) { // I know, this is for the code below to work #ifdef _HOEL_MARIADB } else if (0 == strncmp(db_type, "sqlite3", strlen("sqlite3"))) { if (config_setting_lookup_string(database, "path", &db_sqlite_path) == CONFIG_TRUE) { config->conn = h_connect_sqlite(db_sqlite_path); if (config->conn == NULL) { config_destroy(&cfg); fprintf(stderr, "Error opening sqlite database %s\n", db_sqlite_path); return 0; } else { if (h_exec_query_sqlite(config->conn, "PRAGMA foreign_keys = ON;") != H_OK) { y_log_message(Y_LOG_LEVEL_ERROR, "Error executing sqlite3 query 'PRAGMA foreign_keys = ON;'"); config_destroy(&cfg); return 0; } } } else { config_destroy(&cfg); fprintf(stderr, "Error, no sqlite database specified\n"); return 0; } #endif #ifdef _HOEL_SQLITE } else if (0 == strncmp(db_type, "mariadb", strlen("mariadb"))) { config_setting_lookup_string(database, "host", &db_mariadb_host); config_setting_lookup_string(database, "user", &db_mariadb_user); config_setting_lookup_string(database, "password", &db_mariadb_password); config_setting_lookup_string(database, "dbname", &db_mariadb_dbname); config_setting_lookup_int(database, "port", &db_mariadb_port); config->conn = h_connect_mariadb(db_mariadb_host, db_mariadb_user, db_mariadb_password, db_mariadb_dbname, db_mariadb_port, NULL); if (config->conn == NULL) { fprintf(stderr, "Error opening mariadb database %s\n", db_mariadb_dbname); config_destroy(&cfg); return 0; } #endif } else { config_destroy(&cfg); fprintf(stderr, "Error, database type unknown\n"); return 0; } } else { config_destroy(&cfg); fprintf(stderr, "Error, no database type found\n"); return 0; } } else { config_destroy(&cfg); fprintf(stderr, "Error, no database setting found\n"); return 0; } auth = config_setting_get_member(root, "authentication"); if (auth != NULL) { config_setting_lookup_bool(auth, "http_auth", &cur_http_auth); config->has_auth_http = cur_http_auth; if (config->has_auth_http && config->use_scope) { config_destroy(&cfg); fprintf(stderr, "Error, due to security concerns you can not use authentication via HTTP together with scopes\n"); return 0; } config_setting_lookup_bool(auth, "database_auth", &cur_database_auth); config->has_auth_database = cur_database_auth; config_setting_lookup_bool(auth, "ldap_auth", &cur_ldap_auth); config->has_auth_ldap = cur_ldap_auth; if (config->has_auth_http) { config_setting_lookup_string(auth, "http_auth_url", &cur_auth_http_auth_url); if (cur_auth_http_auth_url != NULL) { config->auth_http = o_malloc(sizeof(struct _auth_http)); if (config->auth_http == NULL) { config_destroy(&cfg); fprintf(stderr, "Error allocating resources for config->auth_http\n"); return 0; } else { config_setting_lookup_bool(auth, "http_auth_check_certificate", &cur_auth_http_check_server_certificate); config->auth_http->check_server_certificate = cur_auth_http_check_server_certificate; config->auth_http->url = o_strdup(cur_auth_http_auth_url); if (config->auth_http->url == NULL) { config_destroy(&cfg); fprintf(stderr, "Error allocating resources for config->auth_http->url\n"); return 0; } } } else { config_destroy(&cfg); fprintf(stderr, "Error, auth http error parameters\n"); return 0; } } if (config->has_auth_ldap) { config_setting_lookup_string(auth, "uri", &cur_auth_ldap_uri); config_setting_lookup_string(auth, "bind_dn", &cur_auth_ldap_bind_dn); config_setting_lookup_string(auth, "bind_passwd", &cur_auth_ldap_bind_passwd); config_setting_lookup_string(auth, "base_search_user", &cur_auth_ldap_base_search_user); config_setting_lookup_string(auth, "filter_user_read", &cur_auth_ldap_filter_user_read); config_setting_lookup_string(auth, "login_property_user_read", &cur_auth_ldap_login_property_user_read); config_setting_lookup_string(auth, "name_property_user_read", &cur_auth_ldap_name_property_user_read); config_setting_lookup_string(auth, "email_property_user_read", &cur_auth_ldap_email_property_user_read); config_setting_lookup_string(auth, "additional_property_value_read", &cur_auth_ldap_additional_property_value_read); if (config->use_scope) { config_setting_lookup_string(auth, "scope_property_user_read", &cur_auth_ldap_scope_property_user_read); } config_setting_lookup_bool(auth, "ldap_user_write", &cur_auth_ldap_user_write); config_setting_lookup_string(auth, "rdn_property_user_write", &cur_auth_ldap_rdn_property_user_write); config_setting_lookup_string(auth, "login_property_user_write", &cur_auth_ldap_login_property_user_write); config_setting_lookup_string(auth, "name_property_user_write", &cur_auth_ldap_name_property_user_write); config_setting_lookup_string(auth, "email_property_user_write", &cur_auth_ldap_email_property_user_write); config_setting_lookup_string(auth, "additional_property_value_write", &cur_auth_ldap_additional_property_value_write); if (config->use_scope) { config_setting_lookup_string(auth, "scope_property_user_write", &cur_auth_ldap_scope_property_user_write); } config_setting_lookup_string(auth, "password_property_user_write", &cur_auth_ldap_password_property_user_write); config_setting_lookup_string(auth, "password_algorithm_user_write", &cur_auth_ldap_password_algorithm_user_write); config_setting_lookup_string(auth, "object_class_user_write", &cur_auth_ldap_object_class_user_write); config_setting_lookup_string(auth, "base_search_client", &cur_auth_ldap_base_search_client); config_setting_lookup_string(auth, "filter_client_read", &cur_auth_ldap_filter_client_read); config_setting_lookup_string(auth, "client_id_property_client_read", &cur_auth_ldap_client_id_property_client_read); config_setting_lookup_string(auth, "name_property_client_read", &cur_auth_ldap_name_property_client_read); config_setting_lookup_string(auth, "description_property_client_read", &cur_auth_ldap_description_property_client_read); config_setting_lookup_string(auth, "redirect_uri_property_client_read", &cur_auth_ldap_redirect_uri_property_client_read); config_setting_lookup_string(auth, "confidential_property_client_read", &cur_auth_ldap_confidential_property_client_read); if (config->use_scope) { config_setting_lookup_string(auth, "scope_property_client_read", &cur_auth_ldap_scope_property_client_read); } config_setting_lookup_bool(auth, "ldap_client_write", &cur_auth_ldap_client_write); config_setting_lookup_string(auth, "rdn_property_client_write", &cur_auth_ldap_rdn_property_client_write); config_setting_lookup_string(auth, "client_id_property_client_write", &cur_auth_ldap_client_id_property_client_write); config_setting_lookup_string(auth, "name_property_client_write", &cur_auth_ldap_name_property_client_write); config_setting_lookup_string(auth, "description_property_client_write", &cur_auth_ldap_description_property_client_write); config_setting_lookup_string(auth, "redirect_uri_property_client_write", &cur_auth_ldap_redirect_uri_property_client_write); config_setting_lookup_string(auth, "confidential_property_client_write", &cur_auth_ldap_confidential_property_client_write); if (config->use_scope) { config_setting_lookup_string(auth, "scope_property_client_write", &cur_auth_ldap_scope_property_client_write); } config_setting_lookup_string(auth, "password_property_client_write", &cur_auth_ldap_password_property_client_write); config_setting_lookup_string(auth, "password_algorithm_client_write", &cur_auth_ldap_password_algorithm_client_write); config_setting_lookup_string(auth, "object_class_client_write", &cur_auth_ldap_object_class_client_write); if (cur_auth_ldap_uri != NULL && cur_auth_ldap_bind_dn != NULL && cur_auth_ldap_bind_passwd != NULL && cur_auth_ldap_base_search_user != NULL && cur_auth_ldap_filter_user_read != NULL && cur_auth_ldap_login_property_user_read != NULL && cur_auth_ldap_name_property_user_read != NULL && cur_auth_ldap_email_property_user_read != NULL && cur_auth_ldap_additional_property_value_read != NULL && (cur_auth_ldap_scope_property_user_read != NULL || !config->use_scope) && (!cur_auth_ldap_user_write || (cur_auth_ldap_rdn_property_user_write != NULL && cur_auth_ldap_login_property_user_write != NULL && cur_auth_ldap_name_property_user_write != NULL && cur_auth_ldap_email_property_user_write != NULL && cur_auth_ldap_additional_property_value_write != NULL && (cur_auth_ldap_scope_property_user_write != NULL || !config->use_scope) && cur_auth_ldap_password_property_user_write != NULL && cur_auth_ldap_password_algorithm_user_write != NULL && cur_auth_ldap_object_class_user_write != NULL)) && cur_auth_ldap_base_search_client != NULL && cur_auth_ldap_filter_client_read != NULL && cur_auth_ldap_client_id_property_client_read != NULL && cur_auth_ldap_name_property_client_read != NULL && cur_auth_ldap_description_property_client_read != NULL && cur_auth_ldap_redirect_uri_property_client_read != NULL && cur_auth_ldap_confidential_property_client_read != NULL && (cur_auth_ldap_scope_property_client_read != NULL || !config->use_scope) && (!cur_auth_ldap_client_write || (cur_auth_ldap_rdn_property_client_write != NULL && cur_auth_ldap_client_id_property_client_write != NULL && cur_auth_ldap_name_property_client_write != NULL && cur_auth_ldap_description_property_client_write != NULL && cur_auth_ldap_redirect_uri_property_client_write != NULL && cur_auth_ldap_confidential_property_client_write != NULL && (cur_auth_ldap_scope_property_client_write != NULL || !config->use_scope) && cur_auth_ldap_password_property_client_write != NULL && cur_auth_ldap_password_algorithm_client_write != NULL && cur_auth_ldap_object_class_client_write != NULL))) { config->auth_ldap = o_malloc(sizeof(struct _auth_ldap)); if (config->auth_ldap == NULL) { config_destroy(&cfg); fprintf(stderr, "Error allocating resources for config->auth_ldap\n"); return 0; } else { memset(config->auth_ldap, 0, sizeof(struct _auth_ldap)); config->auth_ldap->uri = o_strdup(cur_auth_ldap_uri); if (config->auth_ldap->uri == NULL) { config_destroy(&cfg); fprintf(stderr, "Error allocating resources for config->auth_ldap->uri\n"); return 0; } config->auth_ldap->bind_dn = o_strdup(cur_auth_ldap_bind_dn); if (config->auth_ldap->bind_dn == NULL) { config_destroy(&cfg); fprintf(stderr, "Error allocating resources for config->auth_ldap->bind_dn\n"); return 0; } config->auth_ldap->bind_passwd = o_strdup(cur_auth_ldap_bind_passwd); if (config->auth_ldap->bind_passwd == NULL) { config_destroy(&cfg); fprintf(stderr, "Error allocating resources for config->auth_ldap->bind_passwd\n"); return 0; } config->auth_ldap->base_search_user = o_strdup(cur_auth_ldap_base_search_user); if (config->auth_ldap->base_search_user == NULL) { config_destroy(&cfg); fprintf(stderr, "Error allocating resources for config->auth_ldap->base_search_user\n"); return 0; } config->auth_ldap->filter_user_read = o_strdup(cur_auth_ldap_filter_user_read); if (config->auth_ldap->filter_user_read == NULL) { config_destroy(&cfg); fprintf(stderr, "Error allocating resources for config->auth_ldap->filter_user_read\n"); return 0; } config->auth_ldap->login_property_user_read = o_strdup(cur_auth_ldap_login_property_user_read); if (config->auth_ldap->login_property_user_read == NULL) { config_destroy(&cfg); fprintf(stderr, "Error allocating resources for config->auth_ldap->login_property_user_read\n"); return 0; } if (config->use_scope) { config->auth_ldap->scope_property_user_read = o_strdup(cur_auth_ldap_scope_property_user_read); if (config->auth_ldap->scope_property_user_read == NULL) { config_destroy(&cfg); fprintf(stderr, "Error allocating resources for config->auth_ldap->scope_property_user_read\n"); return 0; } } config->auth_ldap->name_property_user_read = o_strdup(cur_auth_ldap_name_property_user_read); if (config->auth_ldap->name_property_user_read == NULL) { config_destroy(&cfg); fprintf(stderr, "Error allocating resources for config->auth_ldap->name_property_user_read\n"); return 0; } config->auth_ldap->email_property_user_read = o_strdup(cur_auth_ldap_email_property_user_read); if (config->auth_ldap->email_property_user_read == NULL) { config_destroy(&cfg); fprintf(stderr, "Error allocating resources for config->auth_ldap->email_property_user_read\n"); return 0; } config->auth_ldap->additional_property_value_read = o_strdup(cur_auth_ldap_additional_property_value_read); if (config->auth_ldap->additional_property_value_read == NULL) { config_destroy(&cfg); fprintf(stderr, "Error allocating resources for config->auth_ldap->additional_property_value_read\n"); return 0; } config->auth_ldap->user_write = cur_auth_ldap_user_write; config->auth_ldap->rdn_property_user_write = o_strdup(cur_auth_ldap_rdn_property_user_write); if (config->auth_ldap->rdn_property_user_write == NULL) { config_destroy(&cfg); fprintf(stderr, "Error allocating resources for config->auth_ldap->rdn_property_user_write\n"); return 0; } if (split_string(cur_auth_ldap_login_property_user_write, ",", &config->auth_ldap->login_property_user_write) < 1) { config_destroy(&cfg); fprintf(stderr, "Error allocating resources for config->auth_ldap->login_property_user_write\n"); return 0; } if (config->use_scope) { if (split_string(cur_auth_ldap_scope_property_user_write, ",", &config->auth_ldap->scope_property_user_write) < 1) { config_destroy(&cfg); fprintf(stderr, "Error allocating resources for config->auth_ldap->scope_property_user_write\n"); return 0; } } if (split_string(cur_auth_ldap_name_property_user_write, ",", &config->auth_ldap->name_property_user_write) < 1) { config_destroy(&cfg); fprintf(stderr, "Error allocating resources for config->auth_ldap->name_property_user_write\n"); return 0; } if (split_string(cur_auth_ldap_email_property_user_write, ",", &config->auth_ldap->email_property_user_write) < 1) { config_destroy(&cfg); fprintf(stderr, "Error allocating resources for config->auth_ldap->email_property_user_write\n"); return 0; } if (split_string(cur_auth_ldap_additional_property_value_write, ",", &config->auth_ldap->additional_property_value_write) < 1) { config_destroy(&cfg); fprintf(stderr, "Error allocating resources for config->auth_ldap->additional_property_value_write\n"); return 0; } config->auth_ldap->password_property_user_write = o_strdup(cur_auth_ldap_password_property_user_write); if (config->auth_ldap->password_property_user_write == NULL) { config_destroy(&cfg); fprintf(stderr, "Error allocating resources for config->auth_ldap->password_property_user_write\n"); return 0; } config->auth_ldap->password_algorithm_user_write = o_strdup(cur_auth_ldap_password_algorithm_user_write); if (config->auth_ldap->password_algorithm_user_write == NULL) { config_destroy(&cfg); fprintf(stderr, "Error allocating resources for config->auth_ldap->password_algorithm_user_write\n"); return 0; } else if (strcmp("SHA1", config->auth_ldap->password_algorithm_user_write) && strcmp("SSHA", config->auth_ldap->password_algorithm_user_write) && strcmp("SHA224", config->auth_ldap->password_algorithm_user_write) && strcmp("SSHA224", config->auth_ldap->password_algorithm_user_write) && strcmp("SHA256", config->auth_ldap->password_algorithm_user_write) && strcmp("SSHA256", config->auth_ldap->password_algorithm_user_write) && strcmp("SHA384", config->auth_ldap->password_algorithm_user_write) && strcmp("SSHA384", config->auth_ldap->password_algorithm_user_write) && strcmp("SHA512", config->auth_ldap->password_algorithm_user_write) && strcmp("SSHA512", config->auth_ldap->password_algorithm_user_write) && strcmp("MD5", config->auth_ldap->password_algorithm_user_write) && strcmp("SMD5", config->auth_ldap->password_algorithm_user_write) && strcmp("CRYPT", config->auth_ldap->password_algorithm_user_write)) { config_destroy(&cfg); fprintf(stderr, "Error user algorithm name unknown\n"); return 0; } if (split_string(cur_auth_ldap_object_class_user_write, ",", &config->auth_ldap->object_class_user_write) < 1) { config_destroy(&cfg); fprintf(stderr, "Error allocating resources for config->auth_ldap->object_class_user_write\n"); return 0; } config->auth_ldap->base_search_client = o_strdup(cur_auth_ldap_base_search_client); if (config->auth_ldap->base_search_client == NULL) { config_destroy(&cfg); fprintf(stderr, "Error allocating resources for config->auth_ldap->base_search_client\n"); return 0; } config->auth_ldap->filter_client_read = o_strdup(cur_auth_ldap_filter_client_read); if (config->auth_ldap->filter_client_read == NULL) { config_destroy(&cfg); fprintf(stderr, "Error allocating resources for config->auth_ldap->filter_client_read\n"); return 0; } config->auth_ldap->client_id_property_client_read = o_strdup(cur_auth_ldap_client_id_property_client_read); if (config->auth_ldap->client_id_property_client_read == NULL) { config_destroy(&cfg); fprintf(stderr, "Error allocating resources for config->auth_ldap->client_id_property_client_read\n"); return 0; } if (config->use_scope) { config->auth_ldap->scope_property_client_read = o_strdup(cur_auth_ldap_scope_property_client_read); if (config->auth_ldap->scope_property_client_read == NULL) { config_destroy(&cfg); fprintf(stderr, "Error allocating resources for config->auth_ldap->scope_property_client_read\n"); return 0; } } config->auth_ldap->name_property_client_read = o_strdup(cur_auth_ldap_name_property_client_read); if (config->auth_ldap->name_property_client_read == NULL) { config_destroy(&cfg); fprintf(stderr, "Error allocating resources for config->auth_ldap->name_property_client_read\n"); return 0; } config->auth_ldap->description_property_client_read = o_strdup(cur_auth_ldap_description_property_client_read); if (config->auth_ldap->description_property_client_read == NULL) { config_destroy(&cfg); fprintf(stderr, "Error allocating resources for config->auth_ldap->description_property_client_read\n"); return 0; } config->auth_ldap->redirect_uri_property_client_read = o_strdup(cur_auth_ldap_redirect_uri_property_client_read); if (config->auth_ldap->redirect_uri_property_client_read == NULL) { config_destroy(&cfg); fprintf(stderr, "Error allocating resources for config->auth_ldap->redirect_uri_property_client_read\n"); return 0; } config->auth_ldap->confidential_property_client_read = o_strdup(cur_auth_ldap_confidential_property_client_read); if (config->auth_ldap->confidential_property_client_read == NULL) { config_destroy(&cfg); fprintf(stderr, "Error allocating resources for config->auth_ldap->confidential_property_client_read\n"); return 0; } config->auth_ldap->client_write = cur_auth_ldap_client_write; config->auth_ldap->rdn_property_client_write = o_strdup(cur_auth_ldap_rdn_property_client_write); if (config->auth_ldap->rdn_property_client_write == NULL) { config_destroy(&cfg); fprintf(stderr, "Error allocating resources for config->auth_ldap->rdn_property_client_write\n"); return 0; } if (split_string(cur_auth_ldap_client_id_property_client_write, ",", &config->auth_ldap->client_id_property_client_write) < 1) { config_destroy(&cfg); fprintf(stderr, "Error allocating resources for config->auth_ldap->client_id_property_client_write\n"); return 0; } if (config->use_scope) { if (split_string(cur_auth_ldap_scope_property_client_write, ",", &config->auth_ldap->scope_property_client_write) < 1) { config_destroy(&cfg); fprintf(stderr, "Error allocating resources for config->auth_ldap->scope_property_client_write\n"); return 0; } } if (split_string(cur_auth_ldap_name_property_client_write, ",", &config->auth_ldap->name_property_client_write) < 1) { config_destroy(&cfg); fprintf(stderr, "Error allocating resources for config->auth_ldap->name_property_client_write\n"); return 0; } if (split_string(cur_auth_ldap_description_property_client_write, ",", &config->auth_ldap->description_property_client_write) < 1) { config_destroy(&cfg); fprintf(stderr, "Error allocating resources for config->auth_ldap->description_property_client_write\n"); return 0; } if (split_string(cur_auth_ldap_redirect_uri_property_client_write, ",", &config->auth_ldap->redirect_uri_property_client_write) < 1) { config_destroy(&cfg); fprintf(stderr, "Error allocating resources for config->auth_ldap->redirect_uri_property_client_write\n"); return 0; } if (split_string(cur_auth_ldap_confidential_property_client_write, ",", &config->auth_ldap->confidential_property_client_write) < 1) { config_destroy(&cfg); fprintf(stderr, "Error allocating resources for config->auth_ldap->confidential_property_client_write\n"); return 0; } config->auth_ldap->password_property_client_write = o_strdup(cur_auth_ldap_password_property_client_write); if (config->auth_ldap->password_property_client_write == NULL) { config_destroy(&cfg); fprintf(stderr, "Error allocating resources for config->auth_ldap->password_property_client_write\n"); return 0; } config->auth_ldap->password_algorithm_client_write = o_strdup(cur_auth_ldap_password_algorithm_client_write); if (config->auth_ldap->password_algorithm_client_write == NULL) { config_destroy(&cfg); fprintf(stderr, "Error allocating resources for config->auth_ldap->password_algorithm_client_write\n"); return 0; } else if (strcmp("SHA1", config->auth_ldap->password_algorithm_client_write) && strcmp("SSHA", config->auth_ldap->password_algorithm_client_write) && strcmp("SHA224", config->auth_ldap->password_algorithm_client_write) && strcmp("SSHA224", config->auth_ldap->password_algorithm_client_write) && strcmp("SHA256", config->auth_ldap->password_algorithm_client_write) && strcmp("SSHA256", config->auth_ldap->password_algorithm_client_write) && strcmp("SHA384", config->auth_ldap->password_algorithm_client_write) && strcmp("SSHA384", config->auth_ldap->password_algorithm_client_write) && strcmp("SHA512", config->auth_ldap->password_algorithm_client_write) && strcmp("SSHA512", config->auth_ldap->password_algorithm_client_write) && strcmp("MD5", config->auth_ldap->password_algorithm_client_write) && strcmp("SMD5", config->auth_ldap->password_algorithm_client_write) && strcmp("CRYPT", config->auth_ldap->password_algorithm_client_write)) { config_destroy(&cfg); fprintf(stderr, "Error user algorithm name unknown\n"); return 0; } if (split_string(cur_auth_ldap_object_class_client_write, ",", &config->auth_ldap->object_class_client_write) < 1) { config_destroy(&cfg); fprintf(stderr, "Error allocating resources for config->auth_ldap->object_class_client_write\n"); return 0; } } } else { config_destroy(&cfg); fprintf(stderr, "Error, auth ldap error parameters\n"); return 0; } } } else { config_destroy(&cfg); fprintf(stderr, "Error, no auth parameters\n"); return 0; } jwt = config_setting_get_member(root, "jwt"); if (jwt != NULL) { config_setting_lookup_bool(jwt, "use_rsa", &cur_use_rsa); config_setting_lookup_bool(jwt, "use_ecdsa", &cur_use_ecdsa); config_setting_lookup_bool(jwt, "use_sha", &cur_use_sha); config_setting_lookup_int(jwt, "key_size", &cur_key_size); if (cur_key_size != 256 && cur_key_size != 384 && cur_key_size != 512) { config_destroy(&cfg); fprintf(stderr, "Error, key_size incorrect, values available are 256, 384 or 512\n"); return 0; } if (cur_use_rsa) { config_setting_lookup_string(jwt, "rsa_key_file", &cur_rsa_key_file); config_setting_lookup_string(jwt, "rsa_pub_file", &cur_rsa_pub_file); if (cur_rsa_key_file != NULL && cur_rsa_pub_file != NULL) { char * key; size_t key_len; jwt_new(&(config->jwt)); key = get_file_content(cur_rsa_key_file); if (key != NULL) { key_len = strlen(key); if (cur_key_size == 256) { jwt_set_alg(config->jwt, JWT_ALG_RS256, (const unsigned char *)key, key_len); } else if (cur_key_size == 384) { jwt_set_alg(config->jwt, JWT_ALG_RS384, (const unsigned char *)key, key_len); } else if (cur_key_size == 512) { jwt_set_alg(config->jwt, JWT_ALG_RS512, (const unsigned char *)key, key_len); } o_free(key); } else { config_destroy(&cfg); fprintf(stderr, "Error, rsa_key_file content incorrect\n"); return 0; } config->jwt_decode_key = get_file_content(cur_rsa_pub_file); if (config->jwt_decode_key == NULL) { config_destroy(&cfg); fprintf(stderr, "Error, rsa_pub_file content incorrect\n"); return 0; } } else { config_destroy(&cfg); fprintf(stderr, "Error, rsa_key_file or rsa_pub_file incorrect\n"); return 0; } } else if (cur_use_ecdsa) { config_setting_lookup_string(jwt, "ecdsa_key_file", &cur_ecdsa_key_file); config_setting_lookup_string(jwt, "ecdsa_pub_file", &cur_ecdsa_pub_file); if (cur_ecdsa_key_file != NULL && cur_ecdsa_pub_file != NULL) { char * key; size_t key_len; jwt_new(&(config->jwt)); key = get_file_content(cur_ecdsa_key_file); if (key != NULL) { key_len = strlen(key); if (cur_key_size == 256) { jwt_set_alg(config->jwt, JWT_ALG_ES256, (const unsigned char *)key, key_len); } else if (cur_key_size == 384) { jwt_set_alg(config->jwt, JWT_ALG_ES384, (const unsigned char *)key, key_len); } else if (cur_key_size == 512) { jwt_set_alg(config->jwt, JWT_ALG_ES512, (const unsigned char *)key, key_len); } o_free(key); } else { config_destroy(&cfg); fprintf(stderr, "Error, ecdsa_key_file content incorrect\n"); return 0; } config->jwt_decode_key = get_file_content(cur_ecdsa_pub_file); if (config->jwt_decode_key == NULL) { config_destroy(&cfg); fprintf(stderr, "Error, ecdsa_pub_file content incorrect\n"); return 0; } } else { config_destroy(&cfg); fprintf(stderr, "Error, ecdsa_key_file or ecdsa_pub_file incorrect\n"); return 0; } } else if (cur_use_sha) { jwt_new(&(config->jwt)); config_setting_lookup_string(jwt, "sha_secret", &cur_sha_secret); if (cur_sha_secret != NULL) { if (cur_key_size == 256) { jwt_set_alg(config->jwt, JWT_ALG_HS256, (const unsigned char *)cur_sha_secret, strlen(cur_sha_secret)); } else if (cur_key_size == 384) { jwt_set_alg(config->jwt, JWT_ALG_HS384, (const unsigned char *)cur_sha_secret, strlen(cur_sha_secret)); } else if (cur_key_size == 512) { jwt_set_alg(config->jwt, JWT_ALG_HS512, (const unsigned char *)cur_sha_secret, strlen(cur_sha_secret)); } config->jwt_decode_key = o_strdup(cur_sha_secret); } else { config_destroy(&cfg); fprintf(stderr, "Error, sha_secret incorrect\n"); return 0; } } else { config_destroy(&cfg); fprintf(stderr, "Error, no jwt algorithm selected\n"); return 0; } } else { config_destroy(&cfg); fprintf(stderr, "Error, no jwt parameters\n"); return 0; } config_destroy(&cfg); return 1; } /** * Check if all mandatory configuration parameters are present and correct * Initialize some parameters with default value if not set */ int check_config(struct config_elements * config) { if (config->instance->port == -1) { config->instance->port = GLEWLWYD_DEFAULT_PORT; } if (config->url_prefix == NULL) { config->url_prefix = o_strdup(GLEWLWYD_DEFAULT_PREFIX); if (config->url_prefix == NULL) { fprintf(stderr, "Error allocating url_prefix, exit\n"); return 0; } } if (config->log_mode == Y_LOG_MODE_NONE) { config->log_mode = Y_LOG_MODE_CONSOLE; } if (config->log_level == Y_LOG_LEVEL_NONE) { config->log_level = Y_LOG_LEVEL_ERROR; } if (config->log_mode == Y_LOG_MODE_FILE && config->log_file == NULL) { fprintf(stderr, "Error, you must specify a log file if log mode is set to file\n"); print_help(stderr); return 0; } return 1; } /** * Return the filename extension */ const char * get_filename_ext(const char *path) { const char *dot = strrchr(path, '.'); if(!dot || dot == path) return "*"; if (strchr(dot, '?') != NULL) { *strchr(dot, '?') = '\0'; } return dot; } /** * Return the source ip address of the request * Based on the header value "X-Forwarded-For" if set, which means the request is forwarded by a proxy * otherwise the call is direct, return the client_address */ const char * get_ip_source(const struct _u_request * request) { const char * ip_source = u_map_get(request->map_header, "X-Forwarded-For"); if (ip_source == NULL) { struct sockaddr_in * in_source = (struct sockaddr_in *)request->client_address; if (in_source != NULL) { ip_source = inet_ntoa(in_source->sin_addr); } else { ip_source = "NOT_FOUND"; } } return ip_source; }; /** * Converts a hex character to its integer value */ char from_hex(char ch) { return isdigit(ch) ? ch - '0' : tolower(ch) - 'a' + 10; } /** * Converts an integer value to its hex character */ char to_hex(char code) { static char hex[] = "0123456789abcdef"; return hex[code & 15]; } /** * Returns a url-encoded version of str * IMPORTANT: be sure to o_free() the returned string after use * Thanks Geek Hideout! * http://www.geekhideout.com/urlcode.shtml */ char * url_encode(char * str) { char * pstr = str, * buf = o_malloc(strlen(str) * 3 + 1), * pbuf = buf; while (* pstr) { if (isalnum(* pstr) || * pstr == '-' || * pstr == '_' || * pstr == '.' || * pstr == '~') * pbuf++ = * pstr; else if (* pstr == ' ') * pbuf++ = '+'; else * pbuf++ = '%', * pbuf++ = to_hex(* pstr >> 4), * pbuf++ = to_hex(* pstr & 15); pstr++; } * pbuf = '\0'; return buf; } /** * Returns a url-decoded version of str * IMPORTANT: be sure to o_free() the returned string after use * Thanks Geek Hideout! * http://www.geekhideout.com/urlcode.shtml */ char * url_decode(char * str) { char * pstr = str, * buf = o_malloc(strlen(str) + 1), * pbuf = buf; while (* pstr) { if (* pstr == '%') { if (pstr[1] && pstr[2]) { * pbuf++ = from_hex(pstr[1]) << 4 | from_hex(pstr[2]); pstr += 2; } } else if (* pstr == '+') { * pbuf++ = ' '; } else { * pbuf++ = * pstr; } pstr++; } * pbuf = '\0'; return buf; } /** * * Generates a query string based on url and post parameters of a request * Returned value must be o_free'd after use * */ char * generate_query_parameters(const struct _u_request * request) { char * query = NULL, * param, * tmp, * value; const char ** keys; struct _u_map params; int i; u_map_init(¶ms); keys = u_map_enum_keys(request->map_url); for (i=0; keys[i] != NULL; i++) { u_map_put(¶ms, keys[i], u_map_get(request->map_url, keys[i])); } keys = u_map_enum_keys(request->map_post_body); for (i=0; keys[i] != NULL; i++) { u_map_put(¶ms, keys[i], u_map_get(request->map_post_body, keys[i])); } keys = u_map_enum_keys(¶ms); for (i=0; keys[i] != NULL; i++) { value = url_encode((char *)u_map_get(request->map_url, keys[i])); param = msprintf("%s=%s", keys[i], value); o_free(value); if (query == NULL) { query = o_strdup(param); } else { tmp = msprintf("%s&%s", query, param); o_free(query); query = tmp; } o_free(param); } u_map_clean(¶ms); return query; } /** * * Escapes any special chars (RFC 4515) from a string representing a * a search filter assertion value. * * You must o_free the returned value after use * */ char * escape_ldap(const char * input) { char * tmp, * to_return = NULL; size_t len, i; if (input != NULL) { to_return = strdup(""); len = strlen(input); for (i=0; i < len && to_return != NULL; i++) { unsigned char c = input[i]; if (c == '*') { // escape asterisk tmp = msprintf("%s\\2a", to_return); o_free(to_return); to_return = tmp; } else if (c == '(') { // escape left parenthesis tmp = msprintf("%s\\28", to_return); o_free(to_return); to_return = tmp; } else if (c == ')') { // escape right parenthesis tmp = msprintf("%s\\29", to_return); o_free(to_return); to_return = tmp; } else if (c == '\\') { // escape backslash tmp = msprintf("%s\\5c", to_return); o_free(to_return); to_return = tmp; } else if ((c & 0x80) == 0) { // regular 1-byte UTF-8 char tmp = msprintf("%s%c", to_return, c); o_free(to_return); to_return = tmp; } else if (((c & 0xE0) == 0xC0) && i < (len-2)) { // higher-order 2-byte UTF-8 chars tmp = msprintf("%s\\%02x\\%02x", to_return, input[i], input[i+1]); o_free(to_return); to_return = tmp; } else if (((c & 0xF0) == 0xE0) && i < (len-3)) { // higher-order 3-byte UTF-8 chars tmp = msprintf("%s\\%02x\\%02x\\%02x", to_return, input[i], input[i+1], input[i+2]); o_free(to_return); to_return = tmp; } else if (((c & 0xF8) == 0xF0) && i < (len-4)) { // higher-order 4-byte UTF-8 chars tmp = msprintf("%s\\%02x\\%02x\\%02x\\%02x", to_return, input[i], input[i+1], input[i+2], input[i+3]); o_free(to_return); to_return = tmp; } } } return to_return; } glewlwyd-1.3.1/src/glewlwyd.h000066400000000000000000000665371322667720100161770ustar00rootroot00000000000000/** * * Glewlwyd OAuth2 Authorization Server * * OAuth2 authentiation server * Users are authenticated with a LDAP server * or users stored in the database * Provides Json Web Tokens (jwt) * * Declarations for constants and prototypes * * Copyright 2016-2017 Nicolas Mora * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU GENERAL PUBLIC LICENSE * License as published by the Free Software Foundation; * version 3 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU GENERAL PUBLIC LICENSE for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see . * */ #ifndef __GLEWLWYD_H_ #define __GLEWLWYD_H_ #define _GLEWLWYD_VERSION_ "1.2.3" #include #include #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif #ifndef __USE_GNU #define __USE_GNU #endif #include #include /** Angharad libraries **/ #define U_DISABLE_WEBSOCKET #include #include #define _HOEL_MARIADB #define _HOEL_SQLITE #include #if MHD_VERSION < 0x00093800 #error Libmicrohttpd version 0.9.38 minimum is required, you can download it at http://ftp.gnu.org/gnu/libmicrohttpd/ #endif #define _GLEWLWYD_VERSION 1.1 #define GLEWLWYD_LOG_NAME "Glewlwyd" // Configuration default values #define GLEWLWYD_DEFAULT_PREFIX "glewlwyd" #define GLEWLWYD_DEFAULT_PORT 4593 #define GLEWLWYD_REFRESH_TOKEN_EXP_DEFAULT 1209600 #define GLEWLWYD_ACCESS_TOKEN_EXP_DEFAULT 3600 #define GLEWLWYD_SESSION_KEY_DEFAULT "GLEWLWYD_SESSION_ID" #define GLEWLWYD_SESSION_EXPIRATION_DEFAULT 2419200 #define GLEWLWYD_CODE_EXPIRATION_DEFAULT 600 #define GLEWLWYD_SALT_LENGTH 16 #define GLEWLWYD_ADMIN_SCOPE "g_admin" #define GLEWLWYD_PROFILE_SCOPE "g_profile" #define GLEWLWYD_DEFAULT_LIMIT 20 #define GLEWLWYD_PREFIX_BEARER "Bearer " #define GLEWLWYD_DEFAULT_HASH_ALGORITHM "MD5" #define GLEWLWYD_RESET_PASSWORD_DEFAULT_SMTP_PORT 25 #define GLEWLWYD_RESET_PASSWORD_DEFAULT_TOKEN_EXPIRATION 604800 #define GLEWLWYD_RUNNING 0 #define GLEWLWYD_STOP 1 #define GLEWLWYD_ERROR 2 #define G_OK 0 #define G_ERROR 1 #define G_ERROR_UNAUTHORIZED 2 #define G_ERROR_PARAM 3 #define G_ERROR_DB 4 #define G_ERROR_MEMORY 5 #define G_ERROR_NOT_FOUND 6 // Data tables #define GLEWLWYD_TABLE_CLIENT "g_client" #define GLEWLWYD_TABLE_SCOPE "g_scope" #define GLEWLWYD_TABLE_USER "g_user" #define GLEWLWYD_TABLE_RESOURCE "g_resource" #define GLEWLWYD_TABLE_REDIRECT_URI "g_redirect_uri" #define GLEWLWYD_TABLE_REFRESH_TOKEN "g_refresh_token" #define GLEWLWYD_TABLE_ACCESS_TOKEN "g_access_token" #define GLEWLWYD_TABLE_SESSION "g_session" #define GLEWLWYD_TABLE_CODE "g_code" #define GLEWLWYD_TABLE_AUTHORIZATION_TYPE "g_authorization_type" #define GLEWLWYD_TABLE_RESET_PASSWORD "g_reset_password" // Link tables #define GLEWLWYD_TABLE_CLIENT_USER_SCOPE "g_client_user_scope" #define GLEWLWYD_TABLE_CLIENT_AUTHORIZATION_TYPE "g_client_authorization_type" #define GLEWLWYD_TABLE_RESOURCE_SCOPE "g_resource_scope" #define GLEWLWYD_TABLE_USER_SCOPE "g_user_scope" #define GLEWLWYD_TABLE_CLIENT_SCOPE "g_client_scope" #define GLEWLWYD_TABLE_CODE_SCOPE "g_code_scope" #define GLEWLWYD_TABLE_REFRESH_TOKEN_SCOPE "g_refresh_token_scope" // Authorization types available #define GLEWLWYD_AUHORIZATION_TYPE_AUTHORIZATION_CODE 0 #define GLEWLWYD_AUHORIZATION_TYPE_CODE 1 #define GLEWLWYD_AUHORIZATION_TYPE_IMPLICIT 2 #define GLEWLWYD_AUHORIZATION_TYPE_RESOURCE_OWNER_PASSWORD_CREDENTIALS 3 #define GLEWLWYD_AUHORIZATION_TYPE_CLIENT_CREDENTIALS 4 #define GLEWLWYD_AUHORIZATION_TYPE_REFRESH_TOKEN 5 // Callback priority #define GLEWLWYD_CALLBACK_PRIORITY_ZERO 0 #define GLEWLWYD_CALLBACK_PRIORITY_AUTHENTICATION 1 #define GLEWLWYD_CALLBACK_PRIORITY_APPLICATION 2 pthread_mutex_t global_handler_close_lock; pthread_cond_t global_handler_close_cond; typedef enum { digest_SHA1, digest_SHA224, digest_SHA256, digest_SHA384, digest_SHA512, digest_MD5, } digest_algorithm; struct _auth_http { char * url; unsigned short check_server_certificate; }; struct _auth_ldap { char * uri; char * bind_dn; char * bind_passwd; struct crypt_data cur_crypt_data; char * base_search_user; char * filter_user_read; char * login_property_user_read; char * scope_property_user_read; char * name_property_user_read; char * email_property_user_read; char * additional_property_value_read; int user_write; char * rdn_property_user_write; char ** login_property_user_write; char ** scope_property_user_write; char ** name_property_user_write; char ** email_property_user_write; char ** additional_property_value_write; char * password_property_user_write; char * password_algorithm_user_write; char ** object_class_user_write; char * base_search_client; char * filter_client_read; char * client_id_property_client_read; char * scope_property_client_read; char * name_property_client_read; char * description_property_client_read; char * redirect_uri_property_client_read; char * confidential_property_client_read; int client_write; char * rdn_property_client_write; char ** client_id_property_client_write; char ** scope_property_client_write; char ** name_property_client_write; char ** description_property_client_write; char ** redirect_uri_property_client_write; char ** confidential_property_client_write; char * password_property_client_write; char * password_algorithm_client_write; char ** object_class_client_write; }; struct _reset_password_config { char * smtp_host; unsigned int smtp_port; int smtp_use_tls; int smtp_verify_certificate; char * smtp_user; char * smtp_password; unsigned int token_expiration; char * email_from; char * email_subject; char * email_template; char * page_url_prefix; }; struct config_elements { char * config_file; char * url_prefix; unsigned long log_mode; unsigned long log_level; char * log_file; char * allow_origin; char * static_files_path; char * static_files_prefix; unsigned int use_scope; unsigned int use_secure_connection; char * secure_connection_key_file; char * secure_connection_pem_file; unsigned int has_auth_http; unsigned int has_auth_database; unsigned int has_auth_ldap; struct _auth_http * auth_http; struct _auth_ldap * auth_ldap; struct _u_map * mime_types; struct _h_connection * conn; struct _u_instance * instance; jwt_t * jwt; char * jwt_decode_key; char * session_key; unsigned int session_expiration; unsigned int refresh_token_expiration; unsigned int access_token_expiration; unsigned int code_expiration; char * admin_scope; char * profile_scope; char * hash_algorithm; int reset_password; struct _reset_password_config * reset_password_config; char * login_url; char * grant_url; char * additional_property_name; }; // Main functions and misc functions int build_config_from_args(int argc, char ** argv, struct config_elements * config); int build_config_from_file(struct config_elements * config); int check_config(struct config_elements * config); void exit_handler(int handler); void exit_server(struct config_elements ** config, int exit_value); void print_help(FILE * output); const char * get_filename_ext(const char *path); char * get_file_content(const char * file_path); char * url_decode(char *str); char * url_encode(char *str); char * generate_query_parameters(const struct _u_request * request); const char * get_ip_source(const struct _u_request * request); char * rand_string(char * str, size_t size); char * rand_crypt_salt(char * str, size_t str_size); char * generate_hash(struct config_elements * config, const char * digest, const char * password); char * escape_ldap(const char * input); // OAuth2 for input parameters validation int check_auth_type_auth_code_grant (const struct _u_request * request, struct _u_response * response, void * user_data); int check_auth_type_access_token_request (const struct _u_request * request, struct _u_response * response, void * user_data); int check_auth_type_implicit_grant (const struct _u_request * request, struct _u_response * response, void * user_data); int check_auth_type_resource_owner_pwd_cred (const struct _u_request * request, struct _u_response * response, void * user_data); int check_auth_type_client_credentials_grant (const struct _u_request * request, struct _u_response * response, void * user_data); int get_access_token_from_refresh (const struct _u_request * request, struct _u_response * response, void * user_data); int delete_refresh_token (const struct _u_request * request, struct _u_response * response, void * user_data); json_t * validate_authorization_code(struct config_elements * config, const char * authorization_code, const char * client_id, const char * redirect_uri, const char * ip_source); // OAuth2 callback functions int callback_glewlwyd_authorization (const struct _u_request * request, struct _u_response * response, void * user_data); int callback_glewlwyd_token (const struct _u_request * request, struct _u_response * response, void * user_data); // Authorization callbacks functions int callback_glewlwyd_check_user (const struct _u_request * request, struct _u_response * response, void * user_data); int callback_glewlwyd_check_user_session (const struct _u_request * request, struct _u_response * response, void * user_data); int callback_glewlwyd_check_scope_admin (const struct _u_request * request, struct _u_response * response, void * user_data); // Validate user login/password credentials json_t * auth_check_user_credentials_scope(struct config_elements * config, const char * username, const char * password, const char * scope_list); json_t * auth_check_user_credentials(struct config_elements * config, const char * username, const char * password); json_t * auth_check_user_credentials_http(struct config_elements * config, const char * username, const char * password); json_t * auth_check_user_credentials_database(struct config_elements * config, const char * username, const char * password); json_t * auth_check_user_credentials_ldap(struct config_elements * config, const char * username, const char * password); // Validate user scope json_t * auth_check_user_scope(struct config_elements * config, const char * username, const char * scope_list); json_t * auth_check_user_scope_database(struct config_elements * config, const char * username, const char * scope_list); json_t * auth_check_user_scope_ldap(struct config_elements * config, const char * username, const char * scope_list); // Validate client login/password credentials json_t * auth_check_client_credentials(struct config_elements * config, const char * client_id, const char * password); json_t * auth_check_client_credentials_http(struct config_elements * config, const char * client_id, const char * password); json_t * auth_check_client_credentials_database(struct config_elements * config, const char * client_id, const char * password); json_t * auth_check_client_credentials_ldap(struct config_elements * config, const char * client_id, const char * password); // Validate client scope json_t * auth_check_client_scope(struct config_elements * config, const char * client_id, const char * scope_list); json_t * auth_check_client_scope_database(struct config_elements * config, const char * client_id, const char * scope_list); json_t * auth_check_client_scope_ldap(struct config_elements * config, const char * client_id, const char * scope_list); json_t * auth_check_client_scope_http(struct config_elements * config, const char * client_id, const char * scope_list); // Validate client on a user oauth2 request json_t * client_check(struct config_elements * config, const char * client_id, const char * client_id_header, const char * client_password_header, const char * redirect_uri, const int auth_type); int auth_check_client_user_scope(struct config_elements * config, const char * client_id, const char * username, const char * scope_list); // Validate authorization json_t * session_check(struct config_elements * config, const char * session_value); json_t * access_token_check_scope_profile(struct config_elements * config, const char * header_value); json_t * access_token_check_scope_admin(struct config_elements * config, const char * header_value); json_t * session_or_access_token_check(struct config_elements * config, const char * session_value, const char * header_value); json_t * get_user_scope_grant(struct config_elements * config, const char * username); json_t * get_user_scope_grant_database(struct config_elements * config, const char * username); json_t * get_user_scope_grant_ldap(struct config_elements * config, const char * username); json_t * get_authorization_type(struct config_elements * config, const char * authorization_type); int set_authorization_type(struct config_elements * config, const char * authorization_type, json_t * j_authorization_type); json_t * is_authorization_type_valid(struct config_elements * config, json_t * j_authorization_type); int is_authorization_type_enabled(struct config_elements * config, uint authorization_type); int grant_client_user_scope_access(struct config_elements * config, const char * client_id, const char * username, const char * scope_list); int delete_client_user_scope_access(struct config_elements * config, const char * client_id, const char * username, const char * scope_list); // Scope crud json_t * get_scope_list(struct config_elements * config); json_t * get_scope(struct config_elements * config, const char * scope); json_t * is_scope_valid(struct config_elements * config, json_t * j_scope, int add); int add_scope(struct config_elements * config, json_t * j_scope); int set_scope(struct config_elements * config, const char * scope, json_t * j_scope); int delete_scope(struct config_elements * config, const char * scope); // User CRUD json_t * get_user_list(struct config_elements * config, const char * source, const char * search, long int offset, long int limit); json_t * get_user_list_ldap(struct config_elements * config, const char * search, long int offset, long int limit); json_t * get_user_list_database(struct config_elements * config, const char * search, long int offset, long int limit); json_t * get_user(struct config_elements * config, const char * username, const char * source); json_t * get_user_profile(struct config_elements * config, const char * username, const char * source); json_t * get_user_database(struct config_elements * config, const char * username); json_t * get_user_ldap(struct config_elements * config, const char * username); json_t * get_user_http(struct config_elements * config, const char * username); json_t * is_user_valid(struct config_elements * config, json_t * j_user, int add); int add_user(struct config_elements * config, json_t * j_user); int add_user_ldap(struct config_elements * config, json_t * j_user); int add_user_database(struct config_elements * config, json_t * j_user); int set_user(struct config_elements * config, const char * user, json_t * j_user, const char * source); int set_user_ldap(struct config_elements * config, const char * user, json_t * j_user); int set_user_database(struct config_elements * config, const char * user, json_t * j_user); int delete_user(struct config_elements * config, const char * user, const char * source); int delete_user_ldap(struct config_elements * config, const char * user); int delete_user_database(struct config_elements * config, const char * user); json_t * is_user_profile_valid(struct config_elements * config, const char * username, json_t * profile); int is_reset_user_profile_valid(struct config_elements * config, const char * username, const char * token, const char * password); int set_user_profile(struct config_elements * config, const char * username, json_t * profile); int set_user_profile_ldap(struct config_elements * config, const char * username, json_t * profile); int set_user_profile_database(struct config_elements * config, const char * username, json_t * profile); int send_reset_user_profile_email(struct config_elements * config, const char * username, const char * ip_source); int reset_user_profile(struct config_elements * config, const char * username, const char * token, const char * password); // Client CRUD json_t * get_client_list(struct config_elements * config, const char * source, const char * search, long int offset, long int limit); json_t * get_client_list_http(struct config_elements * config, const char * search, long int offset, long int limit); json_t * get_client_list_ldap(struct config_elements * config, const char * search, long int offset, long int limit); json_t * get_client_list_database(struct config_elements * config, const char * search, long int offset, long int limit); json_t * get_client(struct config_elements * config, const char * client_id, const char * source); json_t * get_client_database(struct config_elements * config, const char * client_id); json_t * get_client_ldap(struct config_elements * config, const char * client_id); json_t * is_client_valid(struct config_elements * config, json_t * j_client, int add); int add_client(struct config_elements * config, json_t * j_client); int add_client_ldap(struct config_elements * config, json_t * j_client); int add_client_database(struct config_elements * config, json_t * j_client); int add_client_http(struct config_elements * config, json_t * j_client); int set_client(struct config_elements * config, const char * client, json_t * j_client, const char * source); int set_client_ldap(struct config_elements * config, const char * client, json_t * j_client); int set_client_database(struct config_elements * config, const char * client, json_t * j_client); int delete_client(struct config_elements * config, const char * client, const char * source); int delete_client_ldap(struct config_elements * config, const char * client); int delete_client_database(struct config_elements * config, const char * client); // Resource CRUD json_t * get_resource_list(struct config_elements * config); json_t * get_resource(struct config_elements * config, const char * resource); json_t * is_resource_valid(struct config_elements * config, json_t * j_resource, int add); int add_resource(struct config_elements * config, json_t * j_resource); int set_resource(struct config_elements * config, const char * resource, json_t * j_resource); int delete_resource(struct config_elements * config, const char * resource); // Refesh token CRUD json_t * get_refresh_token_list(struct config_elements * config, const char * username, int valid, long int offset, long int limit); int revoke_token(struct config_elements * config, const char * username, const char * token_hash); // Session CRUD json_t * get_session_list(struct config_elements * config, const char * username, int valid, long int offset, long int limit); int get_session(struct config_elements * config, const char * username, const char * session_hash); int revoke_session(struct config_elements * config, const char * username, const char * session_hash); // Tokens generation and store digest char * generate_refresh_token(struct config_elements * config, const char * client_id, const char * username, const uint auth_type, const char * ip_source, const char * scope_list, time_t now); char * generate_access_token(struct config_elements * config, const char * refresh_token, const char * username, const uint auth_type, const char * ip_source, const char * scope_list, const char * additional_property_name, const char * additional_property_value, time_t now); char * generate_session_token(struct config_elements * config, const char * username, const char * ip_source, time_t now); char * generate_authorization_code(struct config_elements * config, const char * username, const char * client_id, const char * scope_list, const char * redirect_uri, const char * ip_source); char * generate_client_access_token(struct config_elements * config, const char * client_id, const char * ip_source, const char * scope_list, time_t now); char * generate_user_reset_password_token(struct config_elements * config, const char * username, const char * ip_source); // Token serialization functions int serialize_refresh_token(struct config_elements * config, const char * client_id, const char * username, const uint auth_type, const char * ip_source, const char * refresh_token, const char * scope_list, time_t now); int serialize_access_token(struct config_elements * config, const uint auth_type, const char * ip_source, const char * refresh_token, const char * scope_list); int serialize_session_token(struct config_elements * config, const char * username, const char * ip_source, const char * session_token, time_t now); // Callback functions int callback_glewlwyd_validate_user_session (const struct _u_request * request, struct _u_response * response, void * user_data); int callback_glewlwyd_delete_user_session (const struct _u_request * request, struct _u_response * response, void * user_data); int callback_glewlwyd_get_user_session_scope_grant (const struct _u_request * request, struct _u_response * response, void * user_data); int callback_glewlwyd_set_user_scope_grant (const struct _u_request * request, struct _u_response * response, void * user_data); int callback_glewlwyd_user_scope_delete (const struct _u_request * request, struct _u_response * response, void * user_data); int callback_glewlwyd_get_user_session_profile (const struct _u_request * request, struct _u_response * response, void * user_data); int callback_glewlwyd_set_user_profile (const struct _u_request * request, struct _u_response * response, void * user_data); int callback_glewlwyd_send_reset_user_profile (const struct _u_request * request, struct _u_response * response, void * user_data); int callback_glewlwyd_reset_user_profile (const struct _u_request * request, struct _u_response * response, void * user_data); int callback_glewlwyd_get_refresh_token_profile (const struct _u_request * request, struct _u_response * response, void * user_data); int callback_glewlwyd_delete_refresh_token_profile (const struct _u_request * request, struct _u_response * response, void * user_data); int callback_glewlwyd_get_session_profile (const struct _u_request * request, struct _u_response * response, void * user_data); int callback_glewlwyd_delete_session_profile (const struct _u_request * request, struct _u_response * response, void * user_data); int callback_glewlwyd_get_list_user (const struct _u_request * request, struct _u_response * response, void * user_data); int callback_glewlwyd_get_user (const struct _u_request * request, struct _u_response * response, void * user_data); int callback_glewlwyd_add_user (const struct _u_request * request, struct _u_response * response, void * user_data); int callback_glewlwyd_set_user (const struct _u_request * request, struct _u_response * response, void * user_data); int callback_glewlwyd_delete_user (const struct _u_request * request, struct _u_response * response, void * user_data); int callback_glewlwyd_get_refresh_token_user (const struct _u_request * request, struct _u_response * response, void * user_data); int callback_glewlwyd_delete_refresh_token_user (const struct _u_request * request, struct _u_response * response, void * user_data); int callback_glewlwyd_get_session_user (const struct _u_request * request, struct _u_response * response, void * user_data); int callback_glewlwyd_delete_session_user (const struct _u_request * request, struct _u_response * response, void * user_data); int callback_glewlwyd_send_reset_user (const struct _u_request * request, struct _u_response * response, void * user_data); int callback_glewlwyd_get_list_client (const struct _u_request * request, struct _u_response * response, void * user_data); int callback_glewlwyd_get_client (const struct _u_request * request, struct _u_response * response, void * user_data); int callback_glewlwyd_add_client (const struct _u_request * request, struct _u_response * response, void * user_data); int callback_glewlwyd_set_client (const struct _u_request * request, struct _u_response * response, void * user_data); int callback_glewlwyd_delete_client (const struct _u_request * request, struct _u_response * response, void * user_data); int callback_glewlwyd_get_list_scope (const struct _u_request * request, struct _u_response * response, void * user_data); int callback_glewlwyd_get_scope (const struct _u_request * request, struct _u_response * response, void * user_data); int callback_glewlwyd_add_scope (const struct _u_request * request, struct _u_response * response, void * user_data); int callback_glewlwyd_set_scope (const struct _u_request * request, struct _u_response * response, void * user_data); int callback_glewlwyd_delete_scope (const struct _u_request * request, struct _u_response * response, void * user_data); int callback_glewlwyd_get_list_resource (const struct _u_request * request, struct _u_response * response, void * user_data); int callback_glewlwyd_get_resource (const struct _u_request * request, struct _u_response * response, void * user_data); int callback_glewlwyd_add_resource (const struct _u_request * request, struct _u_response * response, void * user_data); int callback_glewlwyd_set_resource (const struct _u_request * request, struct _u_response * response, void * user_data); int callback_glewlwyd_delete_resource (const struct _u_request * request, struct _u_response * response, void * user_data); int callback_glewlwyd_get_authorization (const struct _u_request * request, struct _u_response * response, void * user_data); int callback_glewlwyd_set_authorization (const struct _u_request * request, struct _u_response * response, void * user_data); int callback_glewlwyd_options (const struct _u_request * request, struct _u_response * response, void * user_data); int callback_glewlwyd_static_file (const struct _u_request * request, struct _u_response * response, void * user_data); int callback_glewlwyd_root (const struct _u_request * request, struct _u_response * response, void * user_data); int callback_glewlwyd_server_configuration (const struct _u_request * request, struct _u_response * response, void * user_data); int callback_default (const struct _u_request * request, struct _u_response * response, void * user_data); #endif glewlwyd-1.3.1/src/oauth.c000066400000000000000000001234251322667720100154420ustar00rootroot00000000000000/** * * Glewlwyd OAuth2 Authorization Server * * OAuth2 authentiation server * Users are authenticated with a LDAP server * or users stored in the database * Provides Json Web Tokens (jwt) * * OAuth2 authorization management * * Copyright 2016-2017 Nicolas Mora * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU GENERAL PUBLIC LICENSE * License as published by the Free Software Foundation; * version 3 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU GENERAL PUBLIC LICENSE for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see . * */ #include #include "glewlwyd.h" /** * The most used authorization type: if client is authorized and has granted access to scope, * glewlwyd redirects to redirect_uri with a code in the uri * If necessary, two intermediate steps can be used: login page and grant access page */ int check_auth_type_auth_code_grant (const struct _u_request * request, struct _u_response * response, void * user_data) { struct config_elements * config = (struct config_elements *)user_data; char * authorization_code = NULL, * redirect_url, * cb_encoded, * query; const char * ip_source = get_ip_source(request); json_t * session_payload, * j_scope, * j_client_check; time_t now; // Check if client is allowed to perform this request j_client_check = client_check(config, u_map_get(request->map_url, "client_id"), request->auth_basic_user, request->auth_basic_password, u_map_get(request->map_url, "redirect_uri"), GLEWLWYD_AUHORIZATION_TYPE_AUTHORIZATION_CODE); if (check_result_value(j_client_check, G_OK)) { // Client is allowed to use auth_code grant with this redirection_uri session_payload = session_check(config, u_map_get(request->map_cookie, config->session_key)); if (check_result_value(session_payload, G_OK)) { if (u_map_get(request->map_url, "login_validated") != NULL) { // User Session is valid and confirmed by the owner time(&now); if (config->use_scope) { j_scope = auth_check_user_scope(config, json_string_value(json_object_get(json_object_get(session_payload, "grants"), "username")), u_map_get(request->map_url, "scope")); if (check_result_value(j_scope, G_OK)) { // User is allowed for this scope if (auth_check_client_user_scope(config, u_map_get(request->map_url, "client_id"), json_string_value(json_object_get(json_object_get(session_payload, "grants"), "username")), json_string_value(json_object_get(j_scope, "scope"))) == G_OK) { // User has granted access to the cleaned scope list for this client // Generate code, generate the url and redirect to it authorization_code = generate_authorization_code(config, json_string_value(json_object_get(json_object_get(session_payload, "grants"), "username")), u_map_get(request->map_url, "client_id"), json_string_value(json_object_get(j_scope, "scope")), u_map_get(request->map_url, "redirect_uri"), ip_source); redirect_url = msprintf("%s%scode=%s%s%s", u_map_get(request->map_url, "redirect_uri"), (o_strchr(u_map_get(request->map_url, "redirect_uri"), '?')!=NULL?"&":"?"), authorization_code, (u_map_get(request->map_url, "state")!=NULL?"&state=":""), (u_map_get(request->map_url, "state")!=NULL?u_map_get(request->map_url, "state"):"")); ulfius_add_header_to_response(response, "Location", redirect_url); o_free(redirect_url); o_free(authorization_code); response->status = 302; } else { // User has not granted access to the cleaned scope list for this client, redirect to grant access page cb_encoded = url_encode(request->http_url); query = generate_query_parameters(request); redirect_url = msprintf("%s%s", config->grant_url, query); ulfius_add_header_to_response(response, "Location", redirect_url); o_free(redirect_url); o_free(cb_encoded); o_free(query); response->status = 302; } } else { // Scope is not allowed for this user response->status = 302; redirect_url = msprintf("%s%serror=invalid_scope%s%s", u_map_get(request->map_url, "redirect_uri"), (o_strchr(u_map_get(request->map_url, "redirect_uri"), '?')!=NULL?"&":"?"), (u_map_get(request->map_url, "state")!=NULL?"&state=":""), (u_map_get(request->map_url, "state")!=NULL?u_map_get(request->map_url, "state"):"")); ulfius_add_header_to_response(response, "Location", redirect_url); o_free(redirect_url); } json_decref(j_scope); } else { // Generate code, generate the url and redirect to it authorization_code = generate_authorization_code(config, json_string_value(json_object_get(json_object_get(session_payload, "grants"), "username")), u_map_get(request->map_url, "client_id"), NULL, u_map_get(request->map_url, "redirect_uri"), ip_source); redirect_url = msprintf("%s%scode=%s%s%s", u_map_get(request->map_url, "redirect_uri"), (o_strchr(u_map_get(request->map_url, "redirect_uri"), '?')!=NULL?"&":"?"), authorization_code, (u_map_get(request->map_url, "state")!=NULL?"&state=":""), (u_map_get(request->map_url, "state")!=NULL?u_map_get(request->map_url, "state"):"")); ulfius_add_header_to_response(response, "Location", redirect_url); o_free(redirect_url); o_free(authorization_code); response->status = 302; } } else { // Redirect to login page cb_encoded = url_encode(request->http_url); query = generate_query_parameters(request); redirect_url = msprintf("%s%s", config->login_url, query); ulfius_add_header_to_response(response, "Location", redirect_url); o_free(redirect_url); o_free(cb_encoded); o_free(query); response->status = 302; } } else { // Redirect to login page cb_encoded = url_encode(request->http_url); query = generate_query_parameters(request); redirect_url = msprintf("%s%s", config->login_url, query); ulfius_add_header_to_response(response, "Location", redirect_url); o_free(redirect_url); o_free(cb_encoded); o_free(query); response->status = 302; } json_decref(session_payload); } else { // client is not authorized with this redirect_uri response->status = 302; redirect_url = msprintf("%s%serror=unauthorized_client%s%s", u_map_get(request->map_url, "redirect_uri"), (o_strchr(u_map_get(request->map_url, "redirect_uri"), '?')!=NULL?"&":"?"), (u_map_get(request->map_url, "state")!=NULL?"&state=":""), (u_map_get(request->map_url, "state")!=NULL?u_map_get(request->map_url, "state"):"")); ulfius_add_header_to_response(response, "Location", redirect_url); o_free(redirect_url); } json_decref(j_client_check); return U_OK; } /** * The second step of authentiation code * Validates if code, client_id and redirect_uri sent are valid, then returns a token set */ int check_auth_type_access_token_request (const struct _u_request * request, struct _u_response * response, void * user_data) { struct config_elements * config = (struct config_elements *)user_data; json_t * j_query, * j_validate, * j_auth, * json_body = NULL, * j_user; int res; const char * code = u_map_get(request->map_post_body, "code"), * redirect_uri = u_map_get(request->map_post_body, "redirect_uri"), * ip_source = get_ip_source(request), * client_id = u_map_get(request->map_post_body, "client_id"), * scope_list = NULL; time_t now; char * refresh_token, * access_token; // Check if client is allowed to perform this request j_auth = client_check(config, client_id, request->auth_basic_user, request->auth_basic_password, redirect_uri, GLEWLWYD_AUHORIZATION_TYPE_CODE); if (check_result_value(j_auth, G_OK)) { j_validate = validate_authorization_code(config, code, u_map_get(request->map_post_body, "client_id"), redirect_uri, ip_source); if (check_result_value(j_validate, G_OK)) { j_user = get_user(config, json_string_value(json_object_get(j_validate, "username")), NULL); if (check_result_value(j_user, G_OK)) { if (config->use_scope) { scope_list = json_string_value(json_object_get(j_validate, "scope")); } time(&now); refresh_token = generate_refresh_token(config, request->auth_basic_user, json_string_value(json_object_get(json_object_get(j_user, "user"), "login")), GLEWLWYD_AUHORIZATION_TYPE_CODE, ip_source, scope_list, now); if (refresh_token != NULL) { access_token = generate_access_token(config, refresh_token, json_string_value(json_object_get(json_object_get(j_user, "user"), "login")), GLEWLWYD_AUHORIZATION_TYPE_CODE, ip_source, scope_list, json_object_get(json_object_get(j_user, "user"), "additional_property_name")!=json_null()?json_string_value(json_object_get(json_object_get(j_user, "user"), "additional_property_name")):NULL, json_object_get(json_object_get(j_user, "user"), "additional_property_value")!=json_null()?json_string_value(json_object_get(json_object_get(j_user, "user"), "additional_property_value")):NULL, now); if (access_token != NULL) { // Disable gco_id entry j_query = json_pack("{sss{si}s{sI}}", "table", GLEWLWYD_TABLE_CODE, "set", "gco_enabled", 0, "where", "gco_id", json_integer_value((json_object_get(j_validate, "gco_id")))); res = h_update(config->conn, j_query, NULL); json_decref(j_query); if (res == H_OK) { // Finally, the tokens are all here, no error, no problem json_body = json_pack("{sssssssisi}", "token_type", "bearer", "access_token", access_token, "refresh_token", refresh_token, "iat", now, "expires_in", config->access_token_expiration); ulfius_set_json_body_response(response, 200, json_body); } else { y_log_message(Y_LOG_LEVEL_ERROR, "check_auth_type_access_token_request - error executing j_query update"); response->status = 500; } } else { y_log_message(Y_LOG_LEVEL_ERROR, "check_auth_type_access_token_request - error generating access_token"); response->status = 500; } o_free(access_token); json_decref(j_user); } else { y_log_message(Y_LOG_LEVEL_ERROR, "check_auth_type_access_token_request - error generating refresh_token"); response->status = 500; } o_free(refresh_token); } else { y_log_message(Y_LOG_LEVEL_ERROR, "check_auth_type_access_token_request - error getting user"); response->status = 500; } } else { y_log_message(Y_LOG_LEVEL_WARNING, "Security - Code invalid from IP Address %s", ip_source); json_body = json_pack("{ss}", "error", json_string_value(json_object_get(j_validate, "error"))); ulfius_set_json_body_response(response, 403, json_body); } json_decref(j_validate); } else { json_body = json_pack("{ss}", "error", "unauthorized_client"); ulfius_set_json_body_response(response, 403, json_body); } json_decref(j_auth); json_decref(json_body); return U_OK; } /** * The second more simple authorization type: client redirects user to login page, * Then if authorized, glewlwyd redirects to redirect_uri with the access_token in the uri * If necessary, two intermediate steps can be used: login page and grant access page */ int check_auth_type_implicit_grant (const struct _u_request * request, struct _u_response * response, void * user_data) { struct config_elements * config = (struct config_elements *)user_data; char * access_token = NULL, * redirect_url, * cb_encoded, * query; const char * ip_source = get_ip_source(request); json_t * session_payload, * j_scope, * j_client_check, * j_user; time_t now; // Check if client_id and redirect_uri are valid j_client_check = client_check(config, u_map_get(request->map_url, "client_id"), request->auth_basic_user, request->auth_basic_password, u_map_get(request->map_url, "redirect_uri"), GLEWLWYD_AUHORIZATION_TYPE_IMPLICIT); if (check_result_value(j_client_check, G_OK)) { // Client is allowed to use implicit grant with this redirection_uri session_payload = session_check(config, u_map_get(request->map_cookie, config->session_key)); if (check_result_value(session_payload, G_OK)) { if (u_map_get(request->map_url, "login_validated") != NULL) { // User Session is valid j_user = get_user(config, json_string_value(json_object_get(json_object_get(session_payload, "grants"), "username")), NULL); if (check_result_value(j_user, G_OK)) { time(&now); if (config->use_scope) { j_scope = auth_check_user_scope(config, json_string_value(json_object_get(json_object_get(session_payload, "grants"), "username")), u_map_get(request->map_url, "scope")); if (check_result_value(j_scope, G_OK)) { // User is allowed for this scope if (auth_check_client_user_scope(config, u_map_get(request->map_url, "client_id"), json_string_value(json_object_get(json_object_get(session_payload, "grants"), "username")), json_string_value(json_object_get(j_scope, "scope"))) == G_OK) { // User has granted access to the cleaned scope list for this client access_token = generate_access_token(config, NULL, json_string_value(json_object_get(json_object_get(session_payload, "grants"), "username")), GLEWLWYD_AUHORIZATION_TYPE_RESOURCE_OWNER_PASSWORD_CREDENTIALS, ip_source, json_string_value(json_object_get(j_scope, "scope")), json_object_get(json_object_get(j_user, "user"), "additional_property_name")!=json_null()?json_string_value(json_object_get(json_object_get(j_user, "user"), "additional_property_name")):NULL, json_object_get(json_object_get(j_user, "user"), "additional_property_value")!=json_null()?json_string_value(json_object_get(json_object_get(j_user, "user"), "additional_property_value")):NULL, now); if (u_map_get(request->map_url, "state") != NULL) { redirect_url = msprintf("%s%saccess_token=%s&token_type=bearer&expires_in=%d&state=%s", u_map_get(request->map_url, "redirect_uri"), (o_strchr(u_map_get(request->map_url, "redirect_uri"), '#')!=NULL?"&":"#"), access_token, config->access_token_expiration, u_map_get(request->map_url, "state")); } else { redirect_url = msprintf("%s%saccess_token=%s&token_type=bearer&expires_in=%d", u_map_get(request->map_url, "redirect_uri"), (o_strchr(u_map_get(request->map_url, "redirect_uri"), '#')!=NULL?"&":"#"), access_token, config->access_token_expiration); } ulfius_add_header_to_response(response, "Location", redirect_url); o_free(redirect_url); o_free(access_token); response->status = 302; } else { // User has not granted access to the cleaned scope list for this client, redirect to grant access page cb_encoded = url_encode(request->http_url); query = generate_query_parameters(request); redirect_url = msprintf("%s%s", config->grant_url, query); ulfius_add_header_to_response(response, "Location", redirect_url); o_free(redirect_url); o_free(cb_encoded); o_free(query); response->status = 302; } } else { // Scope is not allowed for this user response->status = 302; redirect_url = msprintf("%s%serror=invalid_scope%s%s", u_map_get(request->map_url, "redirect_uri"), (o_strchr(u_map_get(request->map_url, "redirect_uri"), '#')!=NULL?"&":"#"), (u_map_get(request->map_url, "state")!=NULL?"&state=":""), (u_map_get(request->map_url, "state")!=NULL?u_map_get(request->map_url, "state"):"")); ulfius_add_header_to_response(response, "Location", redirect_url); o_free(redirect_url); } json_decref(j_scope); } else { // Generate access_token, generate the url and redirect to it access_token = generate_access_token(config, NULL, json_string_value(json_object_get(json_object_get(session_payload, "grants"), "username")), GLEWLWYD_AUHORIZATION_TYPE_RESOURCE_OWNER_PASSWORD_CREDENTIALS, ip_source, NULL, json_object_get(json_object_get(j_user, "user"), "additional_property_name")!=json_null()?json_string_value(json_object_get(json_object_get(j_user, "user"), "additional_property_name")):NULL, json_object_get(json_object_get(j_user, "user"), "additional_property_value")!=json_null()?json_string_value(json_object_get(json_object_get(j_user, "user"), "additional_property_value")):NULL, now); redirect_url = msprintf("%s%saccess_token=%s&token_type=bearer&expires_in=%d%s", u_map_get(request->map_url, "redirect_uri"), (o_strchr(u_map_get(request->map_url, "redirect_uri"), '#')!=NULL?"&":"#"), access_token, config->access_token_expiration, (u_map_get(request->map_url, "state")!=NULL?u_map_get(request->map_url, "state"):"")); ulfius_add_header_to_response(response, "Location", redirect_url); o_free(redirect_url); response->status = 302; o_free(access_token); } } else { y_log_message(Y_LOG_LEVEL_ERROR, "check_auth_type_implicit_grant - Error get_user"); response->status = 500; } json_decref(j_user); } else { // Redirect to login page cb_encoded = url_encode(request->http_url); query = generate_query_parameters(request); redirect_url = msprintf("%s%s", config->login_url, query); ulfius_add_header_to_response(response, "Location", redirect_url); o_free(redirect_url); o_free(cb_encoded); o_free(query); response->status = 302; } } else { // Redirect to login page cb_encoded = url_encode(request->http_url); query = generate_query_parameters(request); redirect_url = msprintf("%s%s", config->login_url, query); ulfius_add_header_to_response(response, "Location", redirect_url); o_free(redirect_url); o_free(cb_encoded); o_free(query); response->status = 302; } json_decref(session_payload); } else { // client is not authorized with this redirect_uri response->status = 302; redirect_url = msprintf("%s%serror=unauthorized_client%s%s", u_map_get(request->map_url, "redirect_uri"), (o_strchr(u_map_get(request->map_url, "redirect_uri"), '#')!=NULL?"&":"#"), (u_map_get(request->map_url, "state")!=NULL?"&state=":""), (u_map_get(request->map_url, "state")!=NULL?u_map_get(request->map_url, "state"):"")); ulfius_add_header_to_response(response, "Location", redirect_url); o_free(redirect_url); } json_decref(j_client_check); return U_OK; } /** * The more simple authorization type * username and password are given in the POST parameters, * the access_token and refresh_token in a json object are returned */ int check_auth_type_resource_owner_pwd_cred (const struct _u_request * request, struct _u_response * response, void * user_data) { struct config_elements * config = (struct config_elements *)user_data; time_t now; char * refresh_token, * access_token; const char * ip_source = get_ip_source(request); json_t * j_result, * j_auth = NULL, * json_body = NULL, * j_user; if (request->auth_basic_user != NULL && request->auth_basic_password != NULL) { j_auth = client_check(config, request->auth_basic_user, request->auth_basic_user, request->auth_basic_password, NULL, GLEWLWYD_AUHORIZATION_TYPE_RESOURCE_OWNER_PASSWORD_CREDENTIALS); } if (check_result_value(j_auth, G_OK) || (request->auth_basic_user == NULL && request->auth_basic_password == NULL)) { if (config->use_scope) { j_result = auth_check_user_credentials_scope(config, u_map_get(request->map_post_body, "username"), u_map_get(request->map_post_body, "password"), u_map_get(request->map_post_body, "scope")); } else { j_result = auth_check_user_credentials(config, u_map_get(request->map_post_body, "username"), u_map_get(request->map_post_body, "password")); } if (check_result_value(j_result, G_OK)) { j_user = get_user(config, u_map_get(request->map_post_body, "username"), NULL); if (check_result_value(j_user, G_OK)) { time(&now); refresh_token = generate_refresh_token(config, request->auth_basic_user, json_string_value(json_object_get(json_object_get(j_user, "user"), "login")), GLEWLWYD_AUHORIZATION_TYPE_RESOURCE_OWNER_PASSWORD_CREDENTIALS, ip_source, json_string_value(json_object_get(j_result, "scope")), now); if (refresh_token != NULL) { access_token = generate_access_token(config, refresh_token, json_string_value(json_object_get(json_object_get(j_user, "user"), "login")), GLEWLWYD_AUHORIZATION_TYPE_RESOURCE_OWNER_PASSWORD_CREDENTIALS, ip_source, json_string_value(json_object_get(j_result, "scope")), json_object_get(json_object_get(j_user, "user"), "additional_property_name")!=json_null()?json_string_value(json_object_get(json_object_get(j_user, "user"), "additional_property_name")):NULL, json_object_get(json_object_get(j_user, "user"), "additional_property_value")!=json_null()?json_string_value(json_object_get(json_object_get(j_user, "user"), "additional_property_value")):NULL, now); if (access_token != NULL) { json_body = json_pack("{sssssssisi}", "token_type", "bearer", "access_token", access_token, "refresh_token", refresh_token, "iat", now, "expires_in", config->access_token_expiration); if (json_body != NULL) { if (config->use_scope) { json_object_set(json_body, "scope", json_object_get(j_result, "scope")); } ulfius_set_json_body_response(response, 200, json_body); } else { y_log_message(Y_LOG_LEVEL_ERROR, "check_auth_type_resource_owner_pwd_cred - error allocating resources for json_body"); response->status = 500; } } else { y_log_message(Y_LOG_LEVEL_ERROR, "check_auth_type_resource_owner_pwd_cred - error allocating resources for access_token"); response->status = 500; } o_free(access_token); } else { y_log_message(Y_LOG_LEVEL_ERROR, "check_auth_type_resource_owner_pwd_cred - error allocating resources for refresh_token"); response->status = 500; } o_free(refresh_token); } else { y_log_message(Y_LOG_LEVEL_ERROR, "check_auth_type_resource_owner_pwd_cred - error get_user"); response->status = 500; } json_decref(j_user); } else if (check_result_value(j_result, G_ERROR_UNAUTHORIZED)) { y_log_message(Y_LOG_LEVEL_WARNING, "Security - Error login/password for username %s at IP Address %s", u_map_get(request->map_post_body, "username"), ip_source); response->status = 403; } else { y_log_message(Y_LOG_LEVEL_ERROR, "check_auth_type_resource_owner_pwd_cred - error checking credentials"); response->status = 500; } json_decref(j_result); } else { json_body = json_pack("{ss}", "error", "unauthorized_client"); ulfius_set_json_body_response(response, 400, json_body); } json_decref(json_body); json_decref(j_auth); return U_OK; } /** * Send an access_token to a confidential client */ int check_auth_type_client_credentials_grant (const struct _u_request * request, struct _u_response * response, void * user_data) { struct config_elements * config = (struct config_elements *)user_data; char * access_token; const char * ip_source = get_ip_source(request); time_t now; json_t * j_scope_list = NULL, * j_auth, * json_body = NULL; j_auth = auth_check_client_credentials(config, request->auth_basic_user, request->auth_basic_password); if (check_result_value(j_auth, G_OK)) { if (config->use_scope) { j_scope_list = auth_check_client_scope(config, request->auth_basic_user, u_map_get(request->map_post_body, "scope")); if (check_result_value(j_scope_list, G_OK)) { time(&now); access_token = generate_client_access_token(config, request->auth_basic_user, json_string_value(json_object_get(j_scope_list, "scope")), ip_source, now); if (access_token != NULL) { json_body = json_pack("{sssssisO}", "access_token", access_token, "token_type", "bearer", "expires_in", config->access_token_expiration, "scope", json_object_get(j_scope_list, "scope")); o_free(access_token); ulfius_set_json_body_response(response, 200, json_body); } else { y_log_message(Y_LOG_LEVEL_ERROR, "check_auth_type_client_credentials_grant - Error generating access_token"); json_body = json_pack("{ss}", "error", "server_error"); ulfius_set_json_body_response(response, 500, json_body); } } else { json_body = json_pack("{ss}", "error", "scope_invalid"); ulfius_set_json_body_response(response, 400, json_body); } } else { time(&now); access_token = generate_client_access_token(config, request->auth_basic_user, ip_source, NULL, now); if (access_token != NULL) { json_body = json_pack("{sssssi}", "access_token", access_token, "token_type", "bearer", "expires_in", config->access_token_expiration); ulfius_set_json_body_response(response, 200, json_body); o_free(access_token); } else { y_log_message(Y_LOG_LEVEL_ERROR, "check_auth_type_client_credentials_grant - Error generating access_token"); json_body = json_pack("{ss}", "error", "server_error"); ulfius_set_json_body_response(response, 500, json_body); } } json_decref(j_scope_list); } else { y_log_message(Y_LOG_LEVEL_WARNING, "Security - Error client_id/client_password for client_id %s at IP Address %s", request->auth_basic_user, ip_source); json_body = json_pack("{ss}", "error", "invalid_client"); ulfius_set_json_body_response(response, 403, json_body); } json_decref(j_auth); json_decref(json_body); return U_OK; } /** * Get a new access_token from a refresh_token */ int get_access_token_from_refresh (const struct _u_request * request, struct _u_response * response, void * user_data) { struct config_elements * config = (struct config_elements *)user_data; char * access_token, * token_hash, * clause_expired_at, * last_seen_value, * scope, * scope_list_save, * scope_escaped, * scope_list_escaped = NULL, * saveptr = NULL, * clause_scope_list, * new_scope_list = NULL, * tmp; json_t * j_query, * j_result = NULL, * j_result2 = NULL, * j_element, * j_auth = NULL, * j_user; size_t index; int res; const char * refresh_token = u_map_get(request->map_post_body, "refresh_token"); const char * ip_source = get_ip_source(request); jwt_t * jwt; time_t now; json_t * json_body = NULL; if (request->auth_basic_user != NULL && request->auth_basic_password != NULL) { j_auth = client_check(config, request->auth_basic_user, request->auth_basic_user, request->auth_basic_password, NULL, GLEWLWYD_AUHORIZATION_TYPE_REFRESH_TOKEN); } if (check_result_value(j_auth, G_OK) || (request->auth_basic_user == NULL && request->auth_basic_password == NULL)) { if (refresh_token != NULL) { time(&now); token_hash = generate_hash(config, config->hash_algorithm, refresh_token); if (config->conn->type == HOEL_DB_TYPE_MARIADB) { clause_expired_at = o_strdup("> NOW()"); } else { clause_expired_at = o_strdup("> (strftime('%s','now'))"); } j_query = json_pack("{sss[s]s{sssisos{ssss}}}", "table", GLEWLWYD_TABLE_REFRESH_TOKEN, "columns", "grt_id", "where", "grt_hash", token_hash, "grt_enabled", 1, "gc_client_id", (request->auth_basic_user==NULL?json_null():json_string(request->auth_basic_user)), "grt_expired_at", "operator", "raw", "value", clause_expired_at); o_free(clause_expired_at); if (request->auth_basic_user != NULL) { json_object_set_new(json_object_get(j_query, "where"), "gc_client_id", json_string(request->auth_basic_user)); } else { json_object_set_new(json_object_get(j_query, "where"), "gc_client_id", json_null()); } res = h_select(config->conn, j_query, &j_result, NULL); json_decref(j_query); if (res == H_OK && json_array_size(j_result) > 0) { if (!jwt_decode(&jwt, refresh_token, (const unsigned char *)config->jwt_decode_key, strlen(config->jwt_decode_key)) && jwt_get_alg(jwt) == jwt_get_alg(config->jwt)) { j_user = get_user(config, jwt_get_grant(jwt, "username"), NULL); if (check_result_value(j_user, G_OK)) { if (json_object_get(json_object_get(j_user, "user"), "enabled") == json_true()) { last_seen_value = msprintf(config->conn->type==HOEL_DB_TYPE_MARIADB?"FROM_UNIXTIME(%d)":"%d", now); j_query = json_pack("{sss{s{ss}}s{ss}}", "table", GLEWLWYD_TABLE_REFRESH_TOKEN, "set", "grt_last_seen", "raw", last_seen_value, "where", "grt_hash", token_hash); o_free(last_seen_value); res = h_update(config->conn, j_query, NULL); json_decref(j_query); if (res == H_OK) { if (config->use_scope) { // Get scope if (u_map_get(request->map_post_body, "scope") != NULL) { scope_list_save = o_strdup(u_map_get(request->map_post_body, "scope")); scope = strtok_r(scope_list_save, " ", &saveptr); while (scope != NULL) { scope_escaped = h_escape_string(config->conn, scope); if (scope_list_escaped == NULL) { scope_list_escaped = msprintf("'%s'", scope_escaped); } else { tmp = msprintf("%s,'%s'", scope_list_escaped, scope_escaped); o_free(scope_list_escaped); scope_list_escaped = tmp; } o_free(scope_escaped); scope = strtok_r(NULL, " ", &saveptr); } clause_scope_list = msprintf("IN (SELECT `gs_id` FROM `%s` WHERE `grt_id` = (SELECT `grt_id` FROM `%s` WHERE `grt_hash` = '%s' AND `grt_enabled` = 1) AND `gs_id` IN (SELECT `gs_id` FROM `%s` WHERE `gs_name` IN (%s)))", GLEWLWYD_TABLE_REFRESH_TOKEN_SCOPE, GLEWLWYD_TABLE_REFRESH_TOKEN, token_hash, GLEWLWYD_TABLE_SCOPE, scope_list_escaped); o_free(scope_list_save); o_free(scope_list_escaped); } else { clause_scope_list = msprintf("IN (SELECT `gs_id` FROM `%s` WHERE `grt_id` = (SELECT `grt_id` FROM `%s` WHERE `grt_hash` = '%s' AND `grt_enabled` = 1))", GLEWLWYD_TABLE_REFRESH_TOKEN_SCOPE, GLEWLWYD_TABLE_REFRESH_TOKEN, token_hash); } j_query = json_pack("{sss[s]s{s{ssss}}}", "table", GLEWLWYD_TABLE_SCOPE, "columns", "gs_name", "where", "gs_id", "operator", "raw", "value", clause_scope_list); o_free(clause_scope_list); res = h_select(config->conn, j_query, &j_result2, NULL); json_decref(j_query); if (res == H_OK && json_array_size(j_result2) > 0) { json_array_foreach(j_result2, index, j_element) { if (new_scope_list == NULL) { new_scope_list = o_strdup(json_string_value(json_object_get(j_element, "gs_name"))); } else { tmp = msprintf("%s %s", new_scope_list, json_string_value(json_object_get(j_element, "gs_name"))); o_free(new_scope_list); new_scope_list = tmp; } } access_token = generate_access_token(config, refresh_token, jwt_get_grant(jwt, "username"), GLEWLWYD_AUHORIZATION_TYPE_REFRESH_TOKEN, ip_source, new_scope_list, json_object_get(json_object_get(j_user, "user"), "additional_property_name")!=json_null()?json_string_value(json_object_get(json_object_get(j_user, "user"), "additional_property_name")):NULL, json_object_get(json_object_get(j_user, "user"), "additional_property_value")!=json_null()?json_string_value(json_object_get(json_object_get(j_user, "user"), "additional_property_value")):NULL, now); o_free(new_scope_list); if (access_token != NULL) { json_body = json_pack("{sssssisi}", "access_token", access_token, "token_type", "bearer", "expires_in", config->access_token_expiration, "iat", now); ulfius_set_json_body_response(response, 200, json_body); } else { y_log_message(Y_LOG_LEVEL_ERROR, "get_access_token_from_refresh - Error generating access_token"); json_body = json_pack("{ss}", "error", "server_error"); ulfius_set_json_body_response(response, 500, json_body); } o_free(access_token); } else if (res != H_OK) { y_log_message(Y_LOG_LEVEL_ERROR, "get_access_token_from_refresh - Error database while validating refresh_token"); json_body = json_pack("{ss}", "error", "server_error"); ulfius_set_json_body_response(response, 500, json_body); } else { json_body = json_pack("{ss}", "error", "invalid_scope"); ulfius_set_json_body_response(response, 400, json_body); } json_decref(j_result2); } else { access_token = generate_access_token(config, refresh_token, jwt_get_grant(jwt, "username"), GLEWLWYD_AUHORIZATION_TYPE_REFRESH_TOKEN, ip_source, new_scope_list, json_object_get(json_object_get(j_user, "user"), "additional_property_name")!=json_null()?json_string_value(json_object_get(json_object_get(j_user, "user"), "additional_property_name")):NULL, json_object_get(json_object_get(j_user, "user"), "additional_property_value")!=json_null()?json_string_value(json_object_get(json_object_get(j_user, "user"), "additional_property_value")):NULL, now); o_free(new_scope_list); if (access_token != NULL) { json_body = json_pack("{sssssisi}", "access_token", access_token, "token_type", "bearer", "expires_in", config->access_token_expiration, "iat", now); ulfius_set_json_body_response(response, 200, json_body); } else { y_log_message(Y_LOG_LEVEL_ERROR, "get_access_token_from_refresh - Error generating access_token"); json_body = json_pack("{ss}", "error", "server_error"); ulfius_set_json_body_response(response, 500, json_body); } o_free(access_token); } } else { y_log_message(Y_LOG_LEVEL_ERROR, "get_access_token_from_refresh - Error updating grt_last_seen"); json_body = json_pack("{ss}", "error", "server_error"); ulfius_set_json_body_response(response, 500, json_body); } } else { json_body = json_pack("{ss}", "error", "access_denied"); ulfius_set_json_body_response(response, 401, json_body); } } else { json_body = json_pack("{ss}", "error", "server_error"); ulfius_set_json_body_response(response, 500, json_body); } json_decref(j_user); } else { y_log_message(Y_LOG_LEVEL_ERROR, "get_access_token_from_refresh - Error decoding refresh_token"); json_body = json_pack("{ss}", "error", "server_error"); ulfius_set_json_body_response(response, 500, json_body); } jwt_free(jwt); } else if (res != H_OK) { y_log_message(Y_LOG_LEVEL_ERROR, "get_access_token_from_refresh - Error executing j_query (1)"); json_body = json_pack("{ss}", "error", "server_error"); ulfius_set_json_body_response(response, 500, json_body); } else { json_body = json_pack("{ss}", "error", "invalid_grant"); ulfius_set_json_body_response(response, 400, json_body); } o_free(token_hash); json_decref(j_result); } else { json_body = json_pack("{ss}", "error", "invalid_request"); ulfius_set_json_body_response(response, 400, json_body); } } else { json_body = json_pack("{ss}", "error", "invalid_client"); ulfius_set_json_body_response(response, 400, json_body); } json_decref(j_auth); json_decref(json_body); return U_OK; } /** * Invalidate a valid refresh_token */ int delete_refresh_token (const struct _u_request * request, struct _u_response * response, void * user_data) { struct config_elements * config = (struct config_elements *)user_data; char * token_hash, * clause_expired_at, * last_seen_value; json_t * j_query, * j_result; int res; const char * refresh_token = u_map_get(request->map_post_body, "refresh_token"); time_t now; json_int_t grt_id; if (refresh_token != NULL) { time(&now); token_hash = generate_hash(config, config->hash_algorithm, refresh_token); if (config->conn->type == HOEL_DB_TYPE_MARIADB) { clause_expired_at = o_strdup("> NOW()"); } else { clause_expired_at = o_strdup("> (strftime('%s','now'))"); } j_query = json_pack("{sss[s]s{sssis{ssss}}}", "table", GLEWLWYD_TABLE_REFRESH_TOKEN, "columns", "grt_id", "where", "grt_hash", token_hash, "grt_enabled", 1, "grt_expired_at", "operator", "raw", "value", clause_expired_at); o_free(clause_expired_at); o_free(token_hash); res = h_select(config->conn, j_query, &j_result, NULL); json_decref(j_query); if (res == H_OK && json_array_size(j_result) > 0) { last_seen_value = msprintf(config->conn->type==HOEL_DB_TYPE_MARIADB?"FROM_UNIXTIME(%d)":"%d", now); grt_id = json_integer_value(json_object_get(json_array_get(j_result, 0), "grt_id")); j_query = json_pack("{sss{sis{ss}}s{sI}}", "table", GLEWLWYD_TABLE_REFRESH_TOKEN, "set", "grt_enabled", 0, "grt_last_seen", "raw", last_seen_value, "where", "grt_id", grt_id); o_free(last_seen_value); res = h_update(config->conn, j_query, NULL); json_decref(j_query); if (res != H_OK) { y_log_message(Y_LOG_LEVEL_ERROR, "Error database while setting refresh_token enabled to false"); response->status = 500; } } else { response->status = 400; } json_decref(j_result); } else { response->status = 400; } return U_OK; } glewlwyd-1.3.1/src/password.c000066400000000000000000000212671322667720100161650ustar00rootroot00000000000000/** * * Glewlwyd OAuth2 Authorization Server * * OAuth2 authentiation server * Users are authenticated with a LDAP server * or users stored in the database * Provides Json Web Tokens (jwt) * * password generate_digest, most of this code is inspired by Barry Steyn, * under the MIT licence, thanks to him * * For the rest, * Copyright 2016-2017 Nicolas Mora * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU GENERAL PUBLIC LICENSE * License as published by the Free Software Foundation; * version 3 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU GENERAL PUBLIC LICENSE for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see . * */ #include #include #include "glewlwyd.h" /** * Generates a random string and store it in str */ char * rand_salt(char * str, size_t str_size) { size_t n; if (str_size > 0 && str != NULL) { for (n = 0; n < str_size; n++) { int key = rand()+1; str[n] = key; } str[str_size] = '\0'; return str; } else { return NULL; } } /** * Generates a digest using the digest_algorithm specified from password and add a salt if specified, stores it in out_digest */ int generate_digest(digest_algorithm digest, const char * password, int use_salt, char * out_digest) { unsigned int res = 0; int alg, dig_res; gnutls_datum_t key_data; char * intermediate = NULL, salt[GLEWLWYD_SALT_LENGTH + 1] = {0}; unsigned char encoded_key[128 + GLEWLWYD_SALT_LENGTH + 1] = {0}; size_t encoded_key_size = (128 + GLEWLWYD_SALT_LENGTH), encoded_key_size_base64; if (password != NULL && out_digest != NULL) { switch (digest) { case digest_SHA1: alg = GNUTLS_DIG_SHA1; break; case digest_SHA224: alg = GNUTLS_MAC_SHA224; break; case digest_SHA256: alg = GNUTLS_MAC_SHA256; break; case digest_SHA384: alg = GNUTLS_DIG_SHA384; break; case digest_SHA512: alg = GNUTLS_DIG_SHA512; break; case digest_MD5: alg = GNUTLS_MAC_MD5; break; default: alg = GNUTLS_MAC_UNKNOWN; break; } if(alg != GNUTLS_MAC_UNKNOWN) { if (o_strlen(password) > 0) { intermediate = o_malloc(strlen(password)+((GLEWLWYD_SALT_LENGTH+1)*sizeof(char))); if (intermediate != NULL) { key_data.data = (unsigned char*)intermediate; sprintf(intermediate, "%s", password); if (use_salt) { rand_salt(salt, GLEWLWYD_SALT_LENGTH); strncat(intermediate, salt, GLEWLWYD_SALT_LENGTH); } key_data.size = strlen(intermediate); if (key_data.data != NULL && (dig_res = gnutls_fingerprint(alg, &key_data, encoded_key, &encoded_key_size)) == GNUTLS_E_SUCCESS) { if (use_salt) { memcpy(encoded_key+encoded_key_size, salt, GLEWLWYD_SALT_LENGTH); encoded_key_size += GLEWLWYD_SALT_LENGTH; } if (o_base64_encode(encoded_key, encoded_key_size, (unsigned char *)out_digest, &encoded_key_size_base64)) { res = 1; } else{ res = 0; } } else { res = 0; } } else { res = 0; } o_free(intermediate); } else { // No password, then out_digest becomes an empty string out_digest[0] = '\0'; res = 1; } } else { res = 0; } } else { res = 0; } return res; } /** * Generates a random string and store it in str */ char * rand_string(char * str, size_t str_size) { const char charset[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.\"!/$%?&*()_-+=<>{}[]'"; size_t n; if (str_size > 0 && str != NULL) { for (n = 0; n < str_size; n++) { int key = rand() % (int) (sizeof charset - 1); str[n] = charset[key]; } str[str_size] = '\0'; return str; } else { return NULL; } } /** * Generates a random string and store it in str */ char * rand_crypt_salt(char * str, size_t str_size) { const char charset[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789./"; size_t n; if (str_size > 0 && str != NULL) { for (n = 0; n < str_size; n++) { int key = rand() % (int) (sizeof charset - 1); str[n] = charset[key]; } str[str_size] = '\0'; return str; } else { return NULL; } } /** * Generates a hash from the specified password, using the digest method specified * returned value must be 'd after user */ char * generate_hash(struct config_elements * config, const char * digest, const char * password) { char * to_return = NULL, buffer[1024] = {0}; char salt[GLEWLWYD_SALT_LENGTH + 1] = {0}; if (digest != NULL && password != NULL) { if (!strcmp(digest, "SSHA")) { if (generate_digest(digest_SHA1, password, 1, buffer)) { to_return = msprintf("{SSHA}%s", buffer, strlen(buffer)); } else { y_log_message(Y_LOG_LEVEL_ERROR, "generate_hash - Error generating digest SSHA"); } } else if (!strcmp(digest, "SHA1")) { if (generate_digest(digest_SHA1, password, 0, buffer)) { to_return = msprintf("{SHA}%s", buffer); } else { y_log_message(Y_LOG_LEVEL_ERROR, "generate_hash - Error generating digest SHA"); } } else if (!strcmp(digest, "SHA224")) { if (generate_digest(digest_SHA224, password, 0, buffer)) { to_return = msprintf("{SHA224}%s", buffer); } else { y_log_message(Y_LOG_LEVEL_ERROR, "generate_hash - Error generating digest SHA224"); } } else if (!strcmp(digest, "SSHA224")) { if (generate_digest(digest_SHA224, password, 1, buffer)) { to_return = msprintf("{SSHA224}%s", buffer); } else { y_log_message(Y_LOG_LEVEL_ERROR, "generate_hash - Error generating digest SSHA224"); } } else if (!strcmp(digest, "SHA256")) { if (generate_digest(digest_SHA256, password, 0, buffer)) { to_return = msprintf("{SHA256}%s", buffer); } else { y_log_message(Y_LOG_LEVEL_ERROR, "generate_hash - Error generating digest SHA256"); } } else if (!strcmp(digest, "SSHA256")) { if (generate_digest(digest_SHA256, password, 1, buffer)) { to_return = msprintf("{SSHA256}%s", buffer); } else { y_log_message(Y_LOG_LEVEL_ERROR, "generate_hash - Error generating digest SSHA256"); } } else if (!strcmp(digest, "SHA384")) { if (generate_digest(digest_SHA384, password, 0, buffer)) { to_return = msprintf("{SHA384}%s", buffer); } else { y_log_message(Y_LOG_LEVEL_ERROR, "generate_hash - Error generating digest SHA384"); } } else if (!strcmp(digest, "SSHA384")) { if (generate_digest(digest_SHA384, password, 1, buffer)) { to_return = msprintf("{SSHA384}%s", buffer); } else { y_log_message(Y_LOG_LEVEL_ERROR, "generate_hash - Error generating digest SSHA384"); } } else if (!strcmp(digest, "SHA512")) { if (generate_digest(digest_SHA512, password, 0, buffer)) { to_return = msprintf("{SHA512}%s", buffer); } else { y_log_message(Y_LOG_LEVEL_ERROR, "generate_hash - Error generating digest SHA512"); } } else if (!strcmp(digest, "SSHA512")) { if (generate_digest(digest_SHA512, password, 1, buffer)) { to_return = msprintf("{SSHA512}%s", buffer); } else { y_log_message(Y_LOG_LEVEL_ERROR, "generate_hash - Error generating digest SSHA512"); } } else if (!strcmp(digest, "SMD5")) { if (generate_digest(digest_MD5, password, 1, buffer)) { to_return = msprintf("{SMD5}%s", buffer); } else { y_log_message(Y_LOG_LEVEL_ERROR, "generate_hash - Error generating digest SMD5"); } } else if (!strcmp(digest, "MD5")) { if (generate_digest(digest_MD5, password, 0, buffer)) { to_return = msprintf("{MD5}%s", buffer); } else { y_log_message(Y_LOG_LEVEL_ERROR, "generate_hash - Error generating digest MD5"); } } else if (!strcmp(digest, "CRYPT")) { rand_crypt_salt(salt, GLEWLWYD_SALT_LENGTH); to_return = msprintf("{CRYPT}%s", crypt_r(password, salt, &config->auth_ldap->cur_crypt_data)); } else { to_return = strdup(password); } } return to_return; } glewlwyd-1.3.1/src/resource.c000066400000000000000000000371601322667720100161510ustar00rootroot00000000000000/** * * Glewlwyd OAuth2 Authorization Server * * OAuth2 authentiation server * Users are authenticated with a LDAP server * or users stored in the database * Provides Json Web Tokens (jwt) * * Resource CRUD * * Copyright 2016-2017 Nicolas Mora * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU GENERAL PUBLIC LICENSE * License as published by the Free Software Foundation; * version 3 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU GENERAL PUBLIC LICENSE for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see . * */ #include #include "glewlwyd.h" /** * Get the list of all resources */ json_t * get_resource_list(struct config_elements * config) { json_t * j_query, * j_result, * j_return, * j_element, * j_scope, * j_scope_entry; size_t index; int res, i_scope; char * scope_clause; j_query = json_pack("{sss[ssss]}", "table", GLEWLWYD_TABLE_RESOURCE, "columns", "gr_id", "gr_name AS name", "gr_description AS description", "gr_uri AS uri"); res = h_select(config->conn, j_query, &j_result, NULL); json_decref(j_query); if (res == H_OK) { json_array_foreach(j_result, index, j_element) { if (config->use_scope) { scope_clause = msprintf("IN (SELECT `gs_id` FROM %s WHERE `gr_id`='%" JSON_INTEGER_FORMAT "')", GLEWLWYD_TABLE_RESOURCE_SCOPE, json_integer_value(json_object_get(j_element, "gr_id"))); j_query = json_pack("{sss[s]s{s{ssss}}}", "table", GLEWLWYD_TABLE_SCOPE, "columns", "gs_name", "where", "gs_id", "operator", "raw", "value", scope_clause); o_free(scope_clause); res = h_select(config->conn, j_query, &j_scope, NULL); json_decref(j_query); if (res == H_OK) { json_object_set_new(j_element, "scope", json_array()); json_array_foreach(j_scope, i_scope, j_scope_entry) { json_array_append(json_object_get(j_element, "scope"), json_object_get(j_scope_entry, "gs_name")); } json_decref(j_scope); } } json_object_del(j_element, "gr_id"); } j_return = json_pack("{siso}", "result", G_OK, "resource", j_result); } else { y_log_message(Y_LOG_LEVEL_ERROR, "get_resource_list error getting resource list"); j_return = json_pack("{si}", "result", G_ERROR_DB); } return j_return; } /** * Get a specifric resource */ json_t * get_resource(struct config_elements * config, const char * resource) { json_t * j_query, * j_result, * j_return, * j_scope, * j_scope_entry; int res, i_scope; char * scope_clause; j_query = json_pack("{sss[ssss]s{ss}}", "table", GLEWLWYD_TABLE_RESOURCE, "columns", "gr_id", "gr_name AS name", "gr_description AS description", "gr_uri AS uri", "where", "gr_name", resource); res = h_select(config->conn, j_query, &j_result, NULL); json_decref(j_query); if (res == H_OK) { if (json_array_size(j_result) > 0) { if (config->use_scope) { scope_clause = msprintf("IN (SELECT `gs_id` FROM %s WHERE `gr_id`='%" JSON_INTEGER_FORMAT "')", GLEWLWYD_TABLE_RESOURCE_SCOPE, json_integer_value(json_object_get(json_array_get(j_result, 0), "gr_id"))); j_query = json_pack("{sss[s]s{s{ssss}}}", "table", GLEWLWYD_TABLE_SCOPE, "columns", "gs_name", "where", "gs_id", "operator", "raw", "value", scope_clause); o_free(scope_clause); res = h_select(config->conn, j_query, &j_scope, NULL); json_decref(j_query); if (res == H_OK) { json_object_set_new(json_array_get(j_result, 0), "scope", json_array()); json_array_foreach(j_scope, i_scope, j_scope_entry) { json_array_append(json_object_get(json_array_get(j_result, 0), "scope"), json_object_get(j_scope_entry, "gs_name")); } json_decref(j_scope); } } json_object_del(json_array_get(j_result, 0), "gr_id"); j_return = json_pack("{sisO}", "result", G_OK, "resource", json_array_get(j_result, 0)); } else { j_return = json_pack("{si}", "result", G_ERROR_NOT_FOUND); } json_decref(j_result); } else { y_log_message(Y_LOG_LEVEL_ERROR, "get_resource error getting scoipe list"); j_return = json_pack("{si}", "result", G_ERROR_DB); } return j_return; } /** * Check if the resource parameters are valid */ json_t * is_resource_valid(struct config_elements * config, json_t * j_resource, int add) { json_t * j_return = json_array(), * j_query, * j_result, * j_scope; int res; size_t index; if (j_return != NULL) { if (json_is_object(j_resource)) { if (add) { if (json_is_string(json_object_get(j_resource, "name"))) { j_query = json_pack("{sss{ss}}", "table", GLEWLWYD_TABLE_RESOURCE, "where", "gr_name", json_string_value(json_object_get(j_resource, "name"))); res = h_select(config->conn, j_query, &j_result, NULL); json_decref(j_query); if (res == H_OK) { if (json_array_size(j_result) > 0) { json_array_append_new(j_return, json_pack("{ss}", "name", "resource name alread exist")); } json_decref(j_result); } else { y_log_message(Y_LOG_LEVEL_ERROR, "is_resource_valid - Error executing j_query"); } } if (!json_is_string(json_object_get(j_resource, "name")) || json_string_length(json_object_get(j_resource, "name")) == 0 || json_string_length(json_object_get(j_resource, "name")) > 128 || strchr(json_string_value(json_object_get(j_resource, "name")), ' ') != NULL) { json_array_append_new(j_return, json_pack("{ss}", "name", "resource name must be a non empty string of maximum 128 characters, without space characters")); } } if (json_object_get(j_resource, "description") != NULL && (!json_is_string(json_object_get(j_resource, "description")) || json_string_length(json_object_get(j_resource, "description")) > 512)) { json_array_append_new(j_return, json_pack("{ss}", "description", "resource description is optional and must be a string of maximum 512 characters")); } if (config->use_scope) { if (json_object_get(j_resource, "scope") == NULL || !json_is_array(json_object_get(j_resource, "scope"))) { json_array_append_new(j_return, json_pack("{ss}", "scope", "scope is a mandatory array of scope names")); } else { json_array_foreach(json_object_get(j_resource, "scope"), index, j_scope) { if (!json_is_string(j_scope)) { json_array_append_new(j_return, json_pack("{ss}", "scope", "scope name must be a string")); } else { j_result = get_scope(config, json_string_value(j_scope)); if (check_result_value(j_result, G_ERROR_NOT_FOUND)) { char * message = msprintf("scope name '%s' not found", json_string_value(j_scope)); json_array_append_new(j_return, json_pack("{ss}", "scope", message)); o_free(message); } else if (!check_result_value(j_result, G_OK)) { y_log_message(Y_LOG_LEVEL_ERROR, "is_client_valid - Error while checking scope name '%s'", json_string_value(j_scope)); } json_decref(j_result); } } } } if (json_object_get(j_resource, "uri") == NULL || ((!json_is_string(json_object_get(j_resource, "uri")) || json_string_length(json_object_get(j_resource, "uri")) > 512))) { json_array_append_new(j_return, json_pack("{ss}", "uri", "resource uri is mandatory and must be a string of maximum 512 characters")); } } else { json_array_append_new(j_return, json_pack("{ss}", "resource", "resource must be a json object")); } } else { y_log_message(Y_LOG_LEVEL_ERROR, "is_resource_valid - Error allocating resources for j_result"); } return j_return; } /** * Add a new resource */ int add_resource(struct config_elements * config, json_t * j_resource) { json_t * j_query, * j_scope; int res, to_return; char * clause_scope, * escaped; char * clause_login; size_t index; j_query = json_pack("{sss{ssssss}}", "table", GLEWLWYD_TABLE_RESOURCE, "values", "gr_name", json_string_value(json_object_get(j_resource, "name")), "gr_description", json_object_get(j_resource, "description")!=NULL?json_string_value(json_object_get(j_resource, "description")):"", "gr_uri", json_object_get(j_resource, "uri")!=NULL?json_string_value(json_object_get(j_resource, "uri")):""); if (json_object_get(j_resource, "description") != NULL) { json_object_set(json_object_get(j_query, "values"), "gr_description", json_object_get(j_resource, "description")); } res = h_insert(config->conn, j_query, NULL); json_decref(j_query); if (res == H_OK) { to_return = G_OK; if (json_object_get(j_resource, "scope") != NULL && config->use_scope) { escaped = h_escape_string(config->conn, json_string_value(json_object_get(j_resource, "name"))); clause_login = msprintf("(SELECT `gr_id` FROM `%s` WHERE `gr_name`='%s')", GLEWLWYD_TABLE_RESOURCE, escaped); o_free(escaped); j_query = json_pack("{sss[]}", "table", GLEWLWYD_TABLE_RESOURCE_SCOPE, "values"); json_array_foreach(json_object_get(j_resource, "scope"), index, j_scope) { escaped = h_escape_string(config->conn, json_string_value(j_scope)); clause_scope = msprintf("(SELECT `gs_id` FROM `%s` WHERE `gs_name`='%s')", GLEWLWYD_TABLE_SCOPE, escaped); o_free(escaped); json_array_append_new(json_object_get(j_query, "values"), json_pack("{s{ss}s{ss}}", "gr_id", "raw", clause_login, "gs_id", "raw", clause_scope)); o_free(clause_scope); } if (json_array_size(json_object_get(j_query, "values")) > 0) { if (h_insert(config->conn, j_query, NULL) != H_OK) { y_log_message(Y_LOG_LEVEL_ERROR, "add_client_database - Error adding scope"); to_return = G_ERROR_DB; } } o_free(clause_login); json_decref(j_query); } } else { y_log_message(Y_LOG_LEVEL_ERROR, "add_resource - Error executing j_query"); to_return = G_ERROR_DB; } return to_return; } /** * Updates an existing resource */ int set_resource(struct config_elements * config, const char * resource, json_t * j_resource) { json_t * j_query, * j_scope; int res, to_return; char * clause_scope, * escaped; size_t index; char * clause_login; j_query = json_pack("{sss{ssss}s{ss}}", "table", GLEWLWYD_TABLE_RESOURCE, "set", "gr_uri", json_string_value(json_object_get(j_resource, "uri")), "gr_description", json_object_get(j_resource, "description")!=NULL?json_string_value(json_object_get(j_resource, "description")):"", "where", "gr_name", resource); if (json_object_get(j_resource, "description") != NULL) { json_object_set(json_object_get(j_query, "set"), "gr_description", json_object_get(j_resource, "description")); } res = h_update(config->conn, j_query, NULL); json_decref(j_query); if (res == H_OK) { to_return = G_OK; if (json_object_get(j_resource, "scope") != NULL && config->use_scope) { escaped = h_escape_string(config->conn, resource); clause_login = msprintf("= (SELECT `gr_id` FROM `%s` WHERE `gr_name`='%s')", GLEWLWYD_TABLE_RESOURCE, escaped); o_free(escaped); j_query = json_pack("{sss{s{ssss}}}", "table", GLEWLWYD_TABLE_RESOURCE_SCOPE, "where", "gr_id", "operator", "raw", "value", clause_login); o_free(clause_login); res = h_delete(config->conn, j_query, NULL); json_decref(j_query); if (res == H_OK) { escaped = h_escape_string(config->conn, resource); clause_login = msprintf("(SELECT `gr_id` FROM `%s` WHERE `gr_name`='%s')", GLEWLWYD_TABLE_RESOURCE, escaped); o_free(escaped); j_query = json_pack("{sss[]}", "table", GLEWLWYD_TABLE_RESOURCE_SCOPE, "values"); json_array_foreach(json_object_get(j_resource, "scope"), index, j_scope) { escaped = h_escape_string(config->conn, json_string_value(j_scope)); clause_scope = msprintf("(SELECT `gs_id` FROM `%s` WHERE `gs_name`='%s')", GLEWLWYD_TABLE_SCOPE, escaped); o_free(escaped); json_array_append_new(json_object_get(j_query, "values"), json_pack("{s{ss}s{ss}}", "gr_id", "raw", clause_login, "gs_id", "raw", clause_scope)); o_free(clause_scope); } o_free(clause_login); if (json_array_size(json_object_get(j_query, "values")) > 0) { if (h_insert(config->conn, j_query, NULL) != H_OK) { y_log_message(Y_LOG_LEVEL_ERROR, "add_client_database - Error adding scope"); to_return = G_ERROR_DB; } } json_decref(j_query); } else { y_log_message(Y_LOG_LEVEL_ERROR, "set_client_database - Error deleting old scope"); to_return = G_ERROR_DB; } } } else { y_log_message(Y_LOG_LEVEL_ERROR, "set_resource - Error executing j_query"); to_return = G_ERROR_DB; } return to_return; } /** * Deletes an existing resource */ int delete_resource(struct config_elements * config, const char * resource) { json_t * j_query; int res; j_query = json_pack("{sss{ss}}", "table", GLEWLWYD_TABLE_RESOURCE, "where", "gr_name", resource); res = h_delete(config->conn, j_query, NULL); json_decref(j_query); if (res == H_OK) { return G_OK; } else { y_log_message(Y_LOG_LEVEL_ERROR, "set_resource - Error executing j_query"); return G_ERROR_DB; } } glewlwyd-1.3.1/src/scope.c000066400000000000000000000164271322667720100154360ustar00rootroot00000000000000/** * * Glewlwyd OAuth2 Authorization Server * * OAuth2 authentiation server * Users are authenticated with a LDAP server * or users stored in the database * Provides Json Web Tokens (jwt) * * scope CRUD services * * Copyright 2016-2017 Nicolas Mora * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU GENERAL PUBLIC LICENSE * License as published by the Free Software Foundation; * version 3 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU GENERAL PUBLIC LICENSE for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see . * */ #include #include "glewlwyd.h" /** * Get the list of all scopes */ json_t * get_scope_list(struct config_elements * config) { json_t * j_query, * j_result, * j_return; int res; j_query = json_pack("{sss[ss]}", "table", GLEWLWYD_TABLE_SCOPE, "columns", "gs_name AS name", "gs_description AS description"); res = h_select(config->conn, j_query, &j_result, NULL); json_decref(j_query); if (res == H_OK) { j_return = json_pack("{siso}", "result", G_OK, "scope", j_result); } else { y_log_message(Y_LOG_LEVEL_ERROR, "get_scope_list error getting scope list"); j_return = json_pack("{si}", "result", G_ERROR_DB); } return j_return; } /** * Get a specific scope */ json_t * get_scope(struct config_elements * config, const char * scope) { json_t * j_query, * j_result, * j_return; int res; j_query = json_pack("{sss[ss]s{ss}}", "table", GLEWLWYD_TABLE_SCOPE, "columns", "gs_name AS name", "gs_description AS description", "where", "gs_name", scope); res = h_select(config->conn, j_query, &j_result, NULL); json_decref(j_query); if (res == H_OK) { if (json_array_size(j_result) > 0) { j_return = json_pack("{sisO}", "result", G_OK, "scope", json_array_get(j_result, 0)); } else { j_return = json_pack("{si}", "result", G_ERROR_NOT_FOUND); } json_decref(j_result); } else { y_log_message(Y_LOG_LEVEL_ERROR, "get_scope error getting scoipe list"); j_return = json_pack("{si}", "result", G_ERROR_DB); } return j_return; } /** * Check if the scope has valid parameters */ json_t * is_scope_valid(struct config_elements * config, json_t * j_scope, int add) { json_t * j_return = json_array(), * j_query, * j_result; int res; if (j_return != NULL) { if (json_is_object(j_scope)) { if (add) { if (json_is_string(json_object_get(j_scope, "name"))) { j_query = json_pack("{sss{ss}}", "table", GLEWLWYD_TABLE_SCOPE, "where", "gs_name", json_string_value(json_object_get(j_scope, "name"))); res = h_select(config->conn, j_query, &j_result, NULL); json_decref(j_query); if (res == H_OK) { if (json_array_size(j_result) > 0) { json_array_append_new(j_return, json_pack("{ss}", "name", "scope name alread exist")); } json_decref(j_result); } else { y_log_message(Y_LOG_LEVEL_ERROR, "is_scope_valid - Error executing j_query"); } } if (!json_is_string(json_object_get(j_scope, "name")) || json_string_length(json_object_get(j_scope, "name")) == 0 || json_string_length(json_object_get(j_scope, "name")) > 128 || strchr(json_string_value(json_object_get(j_scope, "name")), ' ') != NULL) { json_array_append_new(j_return, json_pack("{ss}", "name", "scope name must be a non empty string of maximum 128 characters, without space characters")); } if (json_object_get(j_scope, "description") != NULL && (!json_is_string(json_object_get(j_scope, "description")) || json_string_length(json_object_get(j_scope, "description")) > 512)) { json_array_append_new(j_return, json_pack("{ss}", "description", "scope description is optional and must be a string of maximum 512 characters")); } } else { if (json_object_get(j_scope, "description") == NULL || !json_is_string(json_object_get(j_scope, "description")) || json_string_length(json_object_get(j_scope, "description")) > 512) { json_array_append_new(j_return, json_pack("{ss}", "description", "scope description is mandatory and must be a string of maximum 512 characters")); } } } else { json_array_append_new(j_return, json_pack("{ss}", "scope", "scope must be a json object")); } } else { y_log_message(Y_LOG_LEVEL_ERROR, "is_scope_valid - Error allocating resources for j_result"); } return j_return; } /** * Add a new scope */ int add_scope(struct config_elements * config, json_t * j_scope) { json_t * j_query; int res; j_query = json_pack("{sss{ss}}", "table", GLEWLWYD_TABLE_SCOPE, "values", "gs_name", json_string_value(json_object_get(j_scope, "name"))); if (json_object_get(j_scope, "description") != NULL) { json_object_set(json_object_get(j_query, "values"), "gs_description", json_object_get(j_scope, "description")); } res = h_insert(config->conn, j_query, NULL); json_decref(j_query); if (res == H_OK) { return G_OK; } else { y_log_message(Y_LOG_LEVEL_ERROR, "add_scope - Error executing j_query"); return G_ERROR_DB; } } /** * Updates an exising scope */ int set_scope(struct config_elements * config, const char * scope, json_t * j_scope) { json_t * j_query; int res; j_query = json_pack("{sss{ss}s{ss}}", "table", GLEWLWYD_TABLE_SCOPE, "set", "gs_description", json_object_get(j_scope, "description")!=NULL?json_string_value(json_object_get(j_scope, "description")):"", "where", "gs_name", scope); res = h_update(config->conn, j_query, NULL); json_decref(j_query); if (res == H_OK) { return G_OK; } else { y_log_message(Y_LOG_LEVEL_ERROR, "set_scope - Error executing j_query"); return G_ERROR_DB; } } /** * Delete an existing scope */ int delete_scope(struct config_elements * config, const char * scope) { json_t * j_query; int res; j_query = json_pack("{sss{ss}}", "table", GLEWLWYD_TABLE_SCOPE, "where", "gs_name", scope); res = h_delete(config->conn, j_query, NULL); json_decref(j_query); if (res == H_OK) { return G_OK; } else { y_log_message(Y_LOG_LEVEL_ERROR, "set_scope - Error executing j_query"); return G_ERROR_DB; } } glewlwyd-1.3.1/src/token.c000066400000000000000000001226701322667720100154430ustar00rootroot00000000000000/** * * Glewlwyd OAuth2 Authorization Server * * OAuth2 authentiation server * Users are authenticated with a LDAP server * or users stored in the database * Provides Json Web Tokens (jwt) * * Token services * * Copyright 2016-2017 Nicolas Mora * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU GENERAL PUBLIC LICENSE * License as published by the Free Software Foundation; * version 3 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU GENERAL PUBLIC LICENSE for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see . * */ #include #include #include "glewlwyd.h" /** * Serialize in the database a print of a refresh_token */ int serialize_refresh_token(struct config_elements * config, const char * client_id, const char * username, const uint auth_type, const char * ip_source, const char * refresh_token, const char * scope_list, time_t now) { json_t * j_query, * j_result; int res, to_return; char * token_hash, * last_seen_value, * expired_at_value, * scope, * scope_escape, * scope_clause, * save_scope_list, * saveptr = NULL; json_int_t grt_id; token_hash = generate_hash(config, config->hash_algorithm, refresh_token); last_seen_value = msprintf(config->conn->type==HOEL_DB_TYPE_MARIADB?"FROM_UNIXTIME(%d)":"%d", now); expired_at_value = msprintf(config->conn->type==HOEL_DB_TYPE_MARIADB?"FROM_UNIXTIME(%d)":"%d", (now+config->refresh_token_expiration)); if (token_hash != NULL && last_seen_value != NULL && expired_at_value != NULL) { j_query = json_pack("{sss{sssisssss{ss}s{ss}}}", "table", GLEWLWYD_TABLE_REFRESH_TOKEN, "values", "grt_hash", token_hash, "grt_authorization_type", auth_type, "grt_username", username, "grt_ip_source", ip_source, "grt_last_seen", "raw", last_seen_value, "grt_expired_at", "raw", expired_at_value); o_free(last_seen_value); o_free(expired_at_value); if (j_query != NULL) { if (client_id != NULL) { json_object_set_new(json_object_get(j_query, "values"), "gc_client_id", json_string(client_id)); } res = h_insert(config->conn, j_query, NULL); json_decref(j_query); if (res == H_OK) { if (config->use_scope) { j_query = json_pack("{sss[s]s{ss}}", "table", GLEWLWYD_TABLE_REFRESH_TOKEN, "columns", "grt_id", "where", "grt_hash", token_hash); res = h_select(config->conn, j_query, &j_result, NULL); json_decref(j_query); if (res == H_OK) { grt_id = json_integer_value(json_object_get(json_array_get(j_result, 0), "grt_id")); json_decref(j_result); j_query = json_pack("{sss[]}", "table", GLEWLWYD_TABLE_REFRESH_TOKEN_SCOPE, "values"); save_scope_list = o_strdup(scope_list); scope = strtok_r(save_scope_list, " ", &saveptr); while (scope != NULL) { scope_escape = h_escape_string(config->conn, scope); scope_clause = msprintf("(SELECT `gs_id` FROM `%s` WHERE `gs_name` = '%s')", GLEWLWYD_TABLE_SCOPE, scope_escape); json_array_append_new(json_object_get(j_query, "values"), json_pack("{sIs{ss}}", "grt_id", grt_id, "gs_id", "raw", scope_clause)); o_free(scope_clause); o_free(scope_escape); scope = strtok_r(NULL, " ", &saveptr); } o_free(save_scope_list); if (json_array_size(json_object_get(j_query, "values")) > 0) { res = h_insert(config->conn, j_query, NULL); if (res == H_OK) { to_return = G_OK; } else { y_log_message(Y_LOG_LEVEL_ERROR, "serialize_refresh_token - Error executing query insert scope"); to_return = G_ERROR_DB; } } else { y_log_message(Y_LOG_LEVEL_ERROR, "serialize_refresh_token - Error no scope given"); to_return = G_ERROR; } json_decref(j_query); } else { y_log_message(Y_LOG_LEVEL_ERROR, "serialize_refresh_token - Error executing query select"); to_return = G_ERROR_DB; } } else { to_return = G_OK; } } else { y_log_message(Y_LOG_LEVEL_ERROR, "serialize_refresh_token - Error executing query insert"); to_return = G_ERROR_DB; } } else { y_log_message(Y_LOG_LEVEL_ERROR, "serialize_refresh_token - Error allocating resources for j_query"); to_return = G_ERROR; } o_free(token_hash); } else { y_log_message(Y_LOG_LEVEL_ERROR, "serialize_refresh_token - Error allocating resources for token_hash or last_seen_value or expired_at_value"); o_free(last_seen_value); o_free(expired_at_value); o_free(token_hash); to_return = G_ERROR; } return to_return; } /** * Serialize in the database a print of an access_token */ int serialize_access_token(struct config_elements * config, const uint auth_type, const char * ip_source, const char * refresh_token, const char * scope_list) { json_t * j_query; int res, ret; char * refresh_token_hash = NULL, * refresh_token_hash_escaped = NULL, * grt_id_clause = NULL; if (refresh_token != NULL) { refresh_token_hash = generate_hash(config, config->hash_algorithm, refresh_token); refresh_token_hash_escaped = h_escape_string(config->conn, refresh_token_hash); j_query = json_pack("{sss{s{ss}}s{ss}}", "table", GLEWLWYD_TABLE_REFRESH_TOKEN, "set", "grt_last_seen", "raw", (config->conn->type==HOEL_DB_TYPE_MARIADB?"NOW()":"strftime('%s','now')"), "where", "grt_hash", refresh_token_hash_escaped); if (j_query != NULL) { res = h_update(config->conn, j_query, NULL); json_decref(j_query); if (res == H_OK) { grt_id_clause = msprintf("(SELECT `grt_id` FROM `g_refresh_token` WHERE `grt_hash` = '%s')", refresh_token_hash_escaped); j_query = json_pack("{sss{sisss{ss}}}", "table", GLEWLWYD_TABLE_ACCESS_TOKEN, "values", "gat_authorization_type", auth_type, "gat_ip_source", ip_source, "grt_id", "raw", grt_id_clause ); res = h_insert(config->conn, j_query, NULL); json_decref(j_query); o_free(grt_id_clause); if (res == H_OK) { ret = G_OK; } else { y_log_message(Y_LOG_LEVEL_ERROR, "serialize_access_token - Error executing j_query (insert 1)"); ret = G_ERROR_DB; } } else { y_log_message(Y_LOG_LEVEL_ERROR, "serialize_access_token - Error executing j_query (update)"); ret = G_ERROR_DB; } } else { y_log_message(Y_LOG_LEVEL_ERROR, "serialize_access_token - Error allocating resources for j_query"); ret = G_ERROR; } o_free(refresh_token_hash); o_free(refresh_token_hash_escaped); } else { j_query = json_pack("{sss{siss}}", "table", GLEWLWYD_TABLE_ACCESS_TOKEN, "values", "gat_authorization_type", auth_type, "gat_ip_source", ip_source ); res = h_insert(config->conn, j_query, NULL); json_decref(j_query); if (res == H_OK) { ret = G_OK; } else { y_log_message(Y_LOG_LEVEL_ERROR, "serialize_access_token - Error executing j_query (insert 2)"); ret = G_ERROR_DB; } } return ret; } /** * Serialize in the database a print of a session_token */ int serialize_session_token(struct config_elements * config, const char * username, const char * ip_source, const char * session_token, time_t now) { json_t * j_query; int res; char * session_hash = generate_hash(config, config->hash_algorithm, session_token), * last_seen_value, * expired_at_value; if (session_token != NULL) { last_seen_value = msprintf(config->conn->type==HOEL_DB_TYPE_MARIADB?"FROM_UNIXTIME(%d)":"%d", now); expired_at_value = msprintf(config->conn->type==HOEL_DB_TYPE_MARIADB?"FROM_UNIXTIME(%d)":"%d", (now+config->session_expiration)); j_query = json_pack("{sss{sssss{ss}s{ss}s{ss}ss}}", "table", GLEWLWYD_TABLE_SESSION, "values", "gss_hash", session_hash, "gss_username", username, "gss_issued_at", "raw", last_seen_value, "gss_last_seen", "raw", last_seen_value, "gss_expired_at", "raw", expired_at_value, "gss_ip_source", ip_source); o_free(session_hash); o_free(last_seen_value); o_free(expired_at_value); res = h_insert(config->conn, j_query, NULL); json_decref(j_query); return (res==H_OK?G_OK:G_ERROR_DB); } else { return G_ERROR_PARAM; } } /** * Generates a refresh_token from the specified parameters that are considered valid */ char * generate_refresh_token(struct config_elements * config, const char * client_id, const char * username, const uint auth_type, const char * ip_source, const char * scope_list, time_t now) { jwt_t * jwt; char * token = NULL; char salt[GLEWLWYD_SALT_LENGTH + 1] = {0}; jwt = jwt_dup(config->jwt); if (jwt != NULL) { // Build jwt payload rand_string(salt, GLEWLWYD_SALT_LENGTH); jwt_add_grant(jwt, "salt", salt); jwt_add_grant(jwt, "username", username); jwt_add_grant(jwt, "type", "refresh_token"); jwt_add_grant_int(jwt, "iat", now); jwt_add_grant_int(jwt, "expires_in", config->access_token_expiration); if (config->use_scope && scope_list != NULL) { jwt_add_grant(jwt, "scope", scope_list); } if (client_id != NULL) { jwt_add_grant(jwt, "client_id", client_id); } token = jwt_encode_str(jwt); if (token != NULL) { if (serialize_refresh_token(config, client_id, username, auth_type, ip_source, token, scope_list, now) != G_OK) { y_log_message(Y_LOG_LEVEL_ERROR, "generate_refresh_token - Error serializing token"); } } else { y_log_message(Y_LOG_LEVEL_ERROR, "generate_refresh_token - generating token"); } } else { y_log_message(Y_LOG_LEVEL_ERROR, "generate_refresh_token - Error cloning jwt"); } jwt_free(jwt); return token; } /** * Generates a access_token from the specified parameters that are considered valid */ char * generate_access_token(struct config_elements * config, const char * refresh_token, const char * username, const uint auth_type, const char * ip_source, const char * scope_list, const char * additional_property_name, const char * additional_property_value, time_t now) { jwt_t * jwt; char * token = NULL; char salt[GLEWLWYD_SALT_LENGTH + 1] = {0}; jwt = jwt_dup(config->jwt); if (jwt != NULL) { // Build jwt payload rand_string(salt, GLEWLWYD_SALT_LENGTH); jwt_add_grant(jwt, "salt", salt); jwt_add_grant(jwt, "username", username); jwt_add_grant(jwt, "type", "access_token"); jwt_add_grant_int(jwt, "iat", now); jwt_add_grant_int(jwt, "expires_in", config->access_token_expiration); if (config->use_scope && scope_list != NULL) { jwt_add_grant(jwt, "scope", scope_list); } if (additional_property_name != NULL && additional_property_value != NULL && o_strlen(additional_property_name) && o_strlen(additional_property_value)) { jwt_add_grant(jwt, additional_property_name, additional_property_value); } token = jwt_encode_str(jwt); if (token != NULL) { if (serialize_access_token(config, auth_type, ip_source, refresh_token, scope_list) != G_OK) { y_log_message(Y_LOG_LEVEL_ERROR, "generate_access_token - Error serializing token"); } } else { y_log_message(Y_LOG_LEVEL_ERROR, "generate_access_token - Error generating token"); } } else { y_log_message(Y_LOG_LEVEL_ERROR, "generate_access_token - Error cloning jwt"); } jwt_free(jwt); return token; } /** * Generates a session_token from the specified parameters that are considered valid */ char * generate_session_token(struct config_elements * config, const char * username, const char * ip_source, time_t now) { jwt_t * jwt; char * token = NULL; char salt[GLEWLWYD_SALT_LENGTH + 1] = {0}; jwt = jwt_dup(config->jwt); if (jwt != NULL) { // Build jwt payload rand_string(salt, GLEWLWYD_SALT_LENGTH); jwt_add_grant(jwt, "salt", salt); jwt_add_grant(jwt, "username", username); jwt_add_grant(jwt, "type", "session_token"); jwt_add_grant_int(jwt, "iat", now); jwt_add_grant_int(jwt, "expires_in", config->session_expiration); token = jwt_encode_str(jwt); if (token == NULL) { y_log_message(Y_LOG_LEVEL_ERROR, "generate_session_token - generating token"); } else { if (serialize_session_token(config, username, ip_source, token, now) != G_OK) { y_log_message(Y_LOG_LEVEL_ERROR, "generate_session_token - Error serializing session_token"); } } } else { y_log_message(Y_LOG_LEVEL_ERROR, "generate_session_token - Error cloning jwt"); } jwt_free(jwt); return token; } /** * Generates a client_access_token from the specified parameters that are considered valid */ char * generate_client_access_token(struct config_elements * config, const char * client_id, const char * ip_source, const char * scope_list, time_t now) { jwt_t * jwt; char * token = NULL; char salt[GLEWLWYD_SALT_LENGTH + 1] = {0}; jwt = jwt_dup(config->jwt); if (jwt != NULL) { // Build jwt payload rand_string(salt, GLEWLWYD_SALT_LENGTH); jwt_add_grant(jwt, "salt", salt); jwt_add_grant(jwt, "client_id", client_id); jwt_add_grant(jwt, "type", "client_token"); if (config->use_scope && scope_list != NULL) { jwt_add_grant(jwt, "scope", scope_list); } jwt_add_grant_int(jwt, "iat", now); jwt_add_grant_int(jwt, "expires_in", config->access_token_expiration); token = jwt_encode_str(jwt); if (token != NULL) { if (serialize_access_token(config, GLEWLWYD_AUHORIZATION_TYPE_CLIENT_CREDENTIALS, ip_source, NULL, NULL) != G_OK) { y_log_message(Y_LOG_LEVEL_ERROR, "generate_client_access_token - Error serializing token"); } } else { y_log_message(Y_LOG_LEVEL_ERROR, "generate_client_access_token - Error generating token"); } } else { y_log_message(Y_LOG_LEVEL_ERROR, "generate_client_access_token - Error cloning jwt"); } jwt_free(jwt); return token; } /** * Generates a authorization code from the specified parameters that are considered valid */ char * generate_authorization_code(struct config_elements * config, const char * username, const char * client_id, const char * scope_list, const char * redirect_uri, const char * ip_source) { uuid_t uuid; char * code_value = o_malloc(37*sizeof(char)), * code_hash, * clause_scope, * escape; char * save_scope_list, * scope, * saveptr = NULL; json_t * j_query, * j_result; int res; json_int_t gco_id; if (username != NULL && client_id != NULL && redirect_uri != NULL && ip_source != NULL) { uuid_generate_random(uuid); uuid_unparse_lower(uuid, code_value); code_hash = generate_hash(config, config->hash_algorithm, code_value); escape = h_escape_string(config->conn, redirect_uri); j_query = json_pack("{sss{ssssssssss}}", "table", GLEWLWYD_TABLE_CODE, "values", "gco_code_hash", code_hash, "gco_ip_source", ip_source, "gco_username", username, "gc_client_id", client_id, "gco_redirect_uri", escape); res = h_insert(config->conn, j_query, NULL); o_free(escape); json_decref(j_query); if (res == H_OK) { j_query = json_pack("{sss[s]s{ss}}", "table", GLEWLWYD_TABLE_CODE, "columns", "gco_id", "where", "gco_code_hash", code_hash); res = h_select(config->conn, j_query, &j_result, NULL); json_decref(j_query); if (res == H_OK) { if (config->use_scope) { gco_id = json_integer_value(json_object_get(json_array_get(j_result, 0), "gco_id")); json_decref(j_result); j_query = json_pack("{sss[]}", "table", GLEWLWYD_TABLE_CODE_SCOPE, "values"); save_scope_list = o_strdup(scope_list); scope = strtok_r(save_scope_list, " ", &saveptr); while (scope != NULL) { escape = h_escape_string(config->conn, scope); clause_scope = msprintf("(SELECT `gs_id` FROM `%s` WHERE `gs_name` = '%s')", GLEWLWYD_TABLE_SCOPE, escape); json_array_append_new(json_object_get(j_query, "values"), json_pack("{sIs{ss}}", "gco_id", gco_id, "gs_id", "raw", clause_scope)); o_free(clause_scope); o_free(escape); scope = strtok_r(NULL, " ", &saveptr); } if (json_array_size(json_object_get(j_query, "values")) > 0) { res = h_insert(config->conn, j_query, NULL); json_decref(j_query); if (res != H_OK) { o_free(code_value); code_value = NULL; y_log_message(Y_LOG_LEVEL_ERROR, "generate_authorization_code - Error insert into %s", GLEWLWYD_TABLE_CODE_SCOPE); } } o_free(save_scope_list); } else { json_decref(j_result); } } else { y_log_message(Y_LOG_LEVEL_ERROR, "generate_authorization_code - Error getting id from %s", GLEWLWYD_TABLE_CODE); } } else { y_log_message(Y_LOG_LEVEL_ERROR, "generate_authorization_code - Error insert into %s", GLEWLWYD_TABLE_CODE); } o_free(code_hash); } else { y_log_message(Y_LOG_LEVEL_ERROR, "generate_authorization_code - Error input arameters"); } return code_value; } /** * Validates if a session token is valid */ json_t * session_check(struct config_elements * config, const char * session_value) { json_t * j_query, * j_result, * j_return, * j_grants = NULL, * j_user; char * session_hash, * clause_expired_at, * grants = NULL; const char * type; int res; jwt_t * jwt = NULL; time_t now; long expiration; if (session_value != NULL) { if (!jwt_decode(&jwt, session_value, (const unsigned char *)config->jwt_decode_key, strlen(config->jwt_decode_key)) && jwt_get_alg(jwt) == jwt_get_alg(config->jwt)) { time(&now); expiration = jwt_get_grant_int(jwt, "iat") + jwt_get_grant_int(jwt, "expires_in"); type = jwt_get_grant(jwt, "type"); if (now < expiration && 0 == o_strcmp(type, "session_token")) { session_hash = generate_hash(config, config->hash_algorithm, session_value); if (config->conn->type == HOEL_DB_TYPE_MARIADB) { clause_expired_at = o_strdup("> NOW()"); } else { clause_expired_at = o_strdup("> (strftime('%s','now'))"); } j_query = json_pack("{sss[s]s{sssis{ssss}}}", "table", GLEWLWYD_TABLE_SESSION, "columns", "gss_id", "where", "gss_hash", session_hash, "gss_enabled", 1, "gss_expired_at", "operator", "raw", "value", clause_expired_at); o_free(clause_expired_at); res = h_select(config->conn, j_query, &j_result, NULL); json_decref(j_query); if (res == H_OK) { if (json_array_size(j_result) > 0) { j_query = json_pack("{sss{s{ss}}s{ss}}", "table", GLEWLWYD_TABLE_SESSION, "set", "gss_last_seen", "raw", (config->conn->type==HOEL_DB_TYPE_MARIADB?"NOW()":"(strftime('%s','now'))"), "where", "gss_hash", session_hash); res = h_update(config->conn, j_query, NULL); json_decref(j_query); if (res == H_OK) { grants = jwt_get_grants_json(jwt, NULL); j_grants = json_loads(grants, JSON_DECODE_ANY, NULL); o_free(grants); if (j_grants != NULL) { j_user = get_user(config, jwt_get_grant(jwt, "username"), NULL); if (check_result_value(j_user, G_OK)) { if (json_object_get(json_object_get(j_user, "user"), "enabled") == json_true()) { json_object_set(j_grants, "session_token", json_true()); j_return = json_pack("{sisO}", "result", G_OK, "grants", j_grants); } else { j_return = json_pack("{si}", "result", G_ERROR_UNAUTHORIZED); } } else { j_return = json_pack("{si}", "result", G_ERROR); } json_decref(j_user); json_decref(j_grants); } else { j_return = json_pack("{si}", "result", G_ERROR); } } else { j_return = json_pack("{si}", "result", G_ERROR_DB); } } else { j_return = json_pack("{si}", "result", G_ERROR_UNAUTHORIZED); } } else { j_return = json_pack("{si}", "result", G_ERROR_DB); } o_free(session_hash); json_decref(j_result); } else { j_return = json_pack("{si}", "result", G_ERROR_UNAUTHORIZED); } } else { j_return = json_pack("{si}", "result", G_ERROR_UNAUTHORIZED); } jwt_free(jwt); } else { j_return = json_pack("{si}", "result", G_ERROR_PARAM); } return j_return; } /** * Validates if an access_token is valid and contains a scope profile */ json_t * access_token_check_scope_profile(struct config_elements * config, const char * header_value) { json_t * j_return, * j_grants; jwt_t * jwt = NULL; time_t now; long expiration; char * grants; const char * type, * token_value; int scope_found = 0, count, i; char ** scope_list; if (header_value != NULL) { if (strstr(header_value, GLEWLWYD_PREFIX_BEARER) == header_value) { token_value = header_value + strlen(GLEWLWYD_PREFIX_BEARER); if (!jwt_decode(&jwt, token_value, (const unsigned char *)config->jwt_decode_key, strlen(config->jwt_decode_key)) && jwt_get_alg(jwt) == jwt_get_alg(config->jwt)) { time(&now); expiration = jwt_get_grant_int(jwt, "iat") + jwt_get_grant_int(jwt, "expires_in"); type = jwt_get_grant(jwt, "type"); if (now < expiration && 0 == o_strcmp(type, "access_token")) { grants = jwt_get_grants_json(jwt, NULL); j_grants = json_loads(grants, JSON_DECODE_ANY, NULL); if (j_grants != NULL) { count = split_string(json_string_value(json_object_get(j_grants, "scope")), " ", &scope_list); for (i=0; count > 0 && scope_list[i] != NULL; i++) { if (strcmp(scope_list[i], config->profile_scope) == 0) { scope_found = 1; break; } } free_string_array(scope_list); if (scope_found) { json_object_set(j_grants, "session_token", json_false()); j_return = json_pack("{sisO}", "result", G_OK, "grants", j_grants); } else { j_return = json_pack("{si}", "result", G_ERROR_UNAUTHORIZED); } json_decref(j_grants); } else { y_log_message(Y_LOG_LEVEL_ERROR, "access_token_check - Error encoding token grants '%s'", grants); j_return = json_pack("{si}", "result", G_ERROR); } o_free(grants); } else { j_return = json_pack("{si}", "result", G_ERROR_UNAUTHORIZED); } } else { j_return = json_pack("{si}", "result", G_ERROR_UNAUTHORIZED); } jwt_free(jwt); } else { j_return = json_pack("{si}", "result", G_ERROR_UNAUTHORIZED); } } else { j_return = json_pack("{si}", "result", G_ERROR_UNAUTHORIZED); } return j_return; } /** * Validates if an access_token is valid and contains a scope admin */ json_t * access_token_check_scope_admin(struct config_elements * config, const char * header_value) { json_t * j_return, * j_grants; jwt_t * jwt = NULL; time_t now; long expiration; char * grants; const char * type, * token_value; int scope_found = 0, count, i; char ** scope_list = NULL; if (header_value != NULL) { if (strstr(header_value, GLEWLWYD_PREFIX_BEARER) == header_value) { token_value = header_value + strlen(GLEWLWYD_PREFIX_BEARER); if (!jwt_decode(&jwt, token_value, (const unsigned char *)config->jwt_decode_key, strlen(config->jwt_decode_key)) && jwt_get_alg(jwt) == jwt_get_alg(config->jwt)) { time(&now); expiration = jwt_get_grant_int(jwt, "iat") + jwt_get_grant_int(jwt, "expires_in"); type = jwt_get_grant(jwt, "type"); if (now < expiration && 0 == o_strcmp(type, "access_token")) { grants = jwt_get_grants_json(jwt, NULL); j_grants = json_loads(grants, JSON_DECODE_ANY, NULL); if (j_grants != NULL) { count = split_string(json_string_value(json_object_get(j_grants, "scope")), " ", &scope_list); for (i=0; count > 0 && scope_list[i] != NULL; i++) { if (strcmp(scope_list[i], config->admin_scope) == 0) { scope_found = 1; break; } } free_string_array(scope_list); if (scope_found) { j_return = json_pack("{sisO}", "result", G_OK, "grants", j_grants); } else { j_return = json_pack("{si}", "result", G_ERROR_UNAUTHORIZED); } json_decref(j_grants); } else { y_log_message(Y_LOG_LEVEL_ERROR, "access_token_check - Error encoding token grants '%s'", grants); j_return = json_pack("{si}", "result", G_ERROR); } o_free(grants); } else { j_return = json_pack("{si}", "result", G_ERROR_UNAUTHORIZED); } } else { j_return = json_pack("{si}", "result", G_ERROR_UNAUTHORIZED); } jwt_free(jwt); } else { j_return = json_pack("{si}", "result", G_ERROR_UNAUTHORIZED); } } else { j_return = json_pack("{si}", "result", G_ERROR_UNAUTHORIZED); } return j_return; } /** * Validates if a session or an access_token is valid */ json_t * session_or_access_token_check(struct config_elements * config, const char * session_value, const char * header_value) { json_t * j_valid = session_check(config, session_value); if (check_result_value(j_valid, G_OK)) { return j_valid; } else { json_decref(j_valid); return access_token_check_scope_profile(config, header_value); } } /** * Invalidates a session */ int session_delete(struct config_elements * config, const char * session_value) { json_t * j_query; char * session_hash; int res; session_hash = generate_hash(config, config->hash_algorithm, session_value); if (session_hash != NULL) { j_query = json_pack("{sss{si}s{ss}}", "table", GLEWLWYD_TABLE_SESSION, "set", "gss_enabled", 0, "where", "gss_hash", session_hash); res = h_update(config->conn, j_query, NULL); json_decref(j_query); o_free(session_hash); return (res==H_OK?G_OK:G_ERROR_DB); } else { return G_ERROR_PARAM; } } /** * Generates a reset password token, invalidate all other reset password tokens for the same user */ char * generate_user_reset_password_token(struct config_elements * config, const char * username, const char * ip_source) { json_t * j_query; int res; char * token = o_malloc(37*sizeof(char)), * token_hash; uuid_t uuid; if (token != NULL) { uuid_generate_random(uuid); uuid_unparse_lower(uuid, token); token_hash = generate_hash(config, config->hash_algorithm, token); if (token_hash != NULL) { // Disabling all other reset tokens for the user, just in case j_query = json_pack("{sss{si}s{ss}}", "table", GLEWLWYD_TABLE_RESET_PASSWORD, "set", "grp_enabled", 0, "where", "grp_username", username); res = h_update(config->conn, j_query, NULL); json_decref(j_query); if (res == H_OK) { j_query = json_pack("{sss{ssssss}}", "table", GLEWLWYD_TABLE_RESET_PASSWORD, "values", "grp_username", username, "grp_token", token_hash, "grp_ip_source", ip_source); res = h_insert(config->conn, j_query, NULL); json_decref(j_query); if (res != H_OK) { y_log_message(Y_LOG_LEVEL_ERROR, "generate_user_reset_password_token - Error executing j_query insert"); } } else { y_log_message(Y_LOG_LEVEL_ERROR, "generate_user_reset_password_token - Error executing j_query update"); } } else { y_log_message(Y_LOG_LEVEL_ERROR, "generate_user_reset_password_token - Error allocating resources for token_hash"); o_free(token); token = NULL; } o_free(token_hash); } else { y_log_message(Y_LOG_LEVEL_ERROR, "generate_user_reset_password_token - Error allocating resources for token"); } return token; } /** * Return the list of refresh_token for the specified user */ json_t * get_refresh_token_list(struct config_elements * config, const char * username, int valid, long int offset, long int limit) { json_t * j_query, * j_result, * j_return, * j_element; size_t index; int res; j_query = json_pack("{sss[sssssss]s{ss}sisiss}", "table", GLEWLWYD_TABLE_REFRESH_TOKEN, "columns", "grt_hash AS token_hash", "grt_authorization_type", config->conn->type==HOEL_DB_TYPE_MARIADB?"UNIX_TIMESTAMP(grt_issued_at) AS issued_at":"grt_issued_at AS issued_at", config->conn->type==HOEL_DB_TYPE_MARIADB?"UNIX_TIMESTAMP(grt_last_seen) AS last_seen":"grt_last_seen AS last_seen", config->conn->type==HOEL_DB_TYPE_MARIADB?"UNIX_TIMESTAMP(grt_expired_at) AS expired_at":"grt_expired_at AS expired_at", "grt_ip_source AS ip_source", "grt_enabled", "where", "grt_username", username, "offset", offset, "limit", limit, "order_by", "issued_at desc"); if (valid > -1) { json_object_set_new(json_object_get(j_query, "where"), "grt_enabled", json_integer(valid)); } res = h_select(config->conn, j_query, &j_result, NULL); json_decref(j_query); if (res == H_OK) { json_array_foreach(j_result, index, j_element) { if (json_integer_value(json_object_get(j_element, "grt_enabled")) == 1) { json_object_set_new(j_element, "enabled", json_true()); } else { json_object_set_new(j_element, "enabled", json_false()); } json_object_del(j_element, "grt_enabled"); switch(json_integer_value(json_object_get(j_element, "grt_authorization_type"))) { case GLEWLWYD_AUHORIZATION_TYPE_AUTHORIZATION_CODE: json_object_set_new(j_element, "authorization_type", json_string("authorization_code")); break; case GLEWLWYD_AUHORIZATION_TYPE_CODE: json_object_set_new(j_element, "authorization_type", json_string("code")); break; case GLEWLWYD_AUHORIZATION_TYPE_IMPLICIT: json_object_set_new(j_element, "authorization_type", json_string("implicit")); break; case GLEWLWYD_AUHORIZATION_TYPE_RESOURCE_OWNER_PASSWORD_CREDENTIALS: json_object_set_new(j_element, "authorization_type", json_string("password")); break; case GLEWLWYD_AUHORIZATION_TYPE_CLIENT_CREDENTIALS: json_object_set_new(j_element, "authorization_type", json_string("celient_credentials")); break; case GLEWLWYD_AUHORIZATION_TYPE_REFRESH_TOKEN: json_object_set_new(j_element, "authorization_type", json_string("refresh")); break; } json_object_del(j_element, "grt_authorization_type"); } j_return = json_pack("{siso}", "result", G_OK, "token", j_result); } else { y_log_message(Y_LOG_LEVEL_ERROR, "get_refresh_token_list - Error getting token list"); j_return = json_pack("{si}", "result", G_ERROR_DB); } return j_return; } /** * Revoke a refresh_token */ int revoke_token(struct config_elements * config, const char * username, const char * token_hash) { json_t * j_query, * j_result; int res, to_return; if (username != NULL && token_hash != NULL) { j_query = json_pack("{sss[s]s{sssssi}}", "table", GLEWLWYD_TABLE_REFRESH_TOKEN, "columns", "grt_id", "where", "grt_username", username, "grt_hash", token_hash, "grt_enabled", 1); res = h_select(config->conn, j_query, &j_result, NULL); json_decref(j_query); if (res == H_OK) { if (json_array_size(j_result) > 0) { j_query = json_pack("{sss{si}s{sI}}", "table", GLEWLWYD_TABLE_REFRESH_TOKEN, "set", "grt_enabled", 0, "where", "grt_id", json_integer_value(json_object_get(json_array_get(j_result, 0), "grt_id"))); res = h_update(config->conn, j_query, NULL); json_decref(j_query); if (res == H_OK) { to_return = G_OK; } else { y_log_message(Y_LOG_LEVEL_ERROR, "revoke_token - Error revoking token"); to_return = G_ERROR_DB; } } else { to_return = G_ERROR_NOT_FOUND; } } else { y_log_message(Y_LOG_LEVEL_ERROR, "revoke_token - Error getting token"); to_return = G_ERROR_DB; } json_decref(j_result); } else { to_return = G_ERROR_PARAM; } return to_return; } /** * Return the list of sessions for the specified user */ json_t * get_session_list(struct config_elements * config, const char * username, int valid, long int offset, long int limit) { json_t * j_query, * j_result, * j_return, * j_element; size_t index; int res; j_query = json_pack("{sss[ssssss]s{ss}sisiss}", "table", GLEWLWYD_TABLE_SESSION, "columns", "gss_hash AS session_hash", config->conn->type==HOEL_DB_TYPE_MARIADB?"UNIX_TIMESTAMP(gss_issued_at) AS issued_at":"gss_issued_at AS issued_at", config->conn->type==HOEL_DB_TYPE_MARIADB?"UNIX_TIMESTAMP(gss_last_seen) AS last_seen":"gss_last_seen AS last_seen", config->conn->type==HOEL_DB_TYPE_MARIADB?"UNIX_TIMESTAMP(gss_expired_at) AS expired_at":"gss_expired_at AS expired_at", "gss_ip_source AS ip_source", "gss_enabled", "where", "gss_username", username, "offset", offset, "limit", limit, "order_by", "issued_at desc"); if (valid > -1) { json_object_set_new(json_object_get(j_query, "where"), "gss_enabled", json_integer(valid)); } res = h_select(config->conn, j_query, &j_result, NULL); json_decref(j_query); if (res == H_OK) { json_array_foreach(j_result, index, j_element) { if (json_integer_value(json_object_get(j_element, "gss_enabled")) == 1) { json_object_set_new(j_element, "enabled", json_true()); } else { json_object_set_new(j_element, "enabled", json_false()); } json_object_del(j_element, "gss_enabled"); } j_return = json_pack("{siso}", "result", G_OK, "session", j_result); } else { y_log_message(Y_LOG_LEVEL_ERROR, "get_refresh_token_list - Error getting session list"); j_return = json_pack("{si}", "result", G_ERROR_DB); } return j_return; } /** * Get a specific session */ int get_session(struct config_elements * config, const char * username, const char * session_hash) { json_t * j_query, * j_result; int res, to_return; j_query = json_pack("{sss[s]s{sssssi}}", "table", GLEWLWYD_TABLE_SESSION, "columns", "gss_id", "where", "gss_username", username, "gss_hash", session_hash, "gss_enabled", 1); res = h_select(config->conn, j_query, &j_result, NULL); json_decref(j_query); if (res == H_OK) { if (json_array_size(j_result) > 0) { to_return = G_OK; } else { to_return = G_ERROR_NOT_FOUND; } } else { y_log_message(Y_LOG_LEVEL_ERROR, "get_session - Error getting session"); to_return = G_ERROR_DB; } json_decref(j_result); return to_return; } /** * Revokes a session */ int revoke_session(struct config_elements * config, const char * username, const char * session_hash) { json_t * j_query, * j_result; int res, to_return; if (username != NULL && session_hash != NULL) { j_query = json_pack("{sss[s]s{sssssi}}", "table", GLEWLWYD_TABLE_SESSION, "columns", "gss_id", "where", "gss_username", username, "gss_hash", session_hash, "gss_enabled", 1); res = h_select(config->conn, j_query, &j_result, NULL); json_decref(j_query); if (res == H_OK) { if (json_array_size(j_result) > 0) { j_query = json_pack("{sss{si}s{sI}}", "table", GLEWLWYD_TABLE_SESSION, "set", "gss_enabled", 0, "where", "gss_id", json_integer_value(json_object_get(json_array_get(j_result, 0), "gss_id"))); res = h_update(config->conn, j_query, NULL); json_decref(j_query); if (res == H_OK) { to_return = G_OK; } else { y_log_message(Y_LOG_LEVEL_ERROR, "revoke_session - Error revoking session"); to_return = G_ERROR_DB; } } else { to_return = G_ERROR_NOT_FOUND; } } else { y_log_message(Y_LOG_LEVEL_ERROR, "revoke_session - Error getting session"); to_return = G_ERROR_DB; } json_decref(j_result); } else { to_return = G_ERROR_PARAM; } return to_return; } glewlwyd-1.3.1/src/user.c000066400000000000000000003111051322667720100152720ustar00rootroot00000000000000/** * * Glewlwyd OAuth2 Authorization Server * * OAuth2 authentiation server * Users are authenticated with a LDAP server * or users stored in the database * Provides Json Web Tokens (jwt) * * user CRUD services * * Copyright 2016-2017 Nicolas Mora * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU GENERAL PUBLIC LICENSE * License as published by the Free Software Foundation; * version 3 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU GENERAL PUBLIC LICENSE for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see . * */ #include #include "glewlwyd.h" /** * Get a specific user in the database backend */ json_t * get_user_database(struct config_elements * config, const char * username) { json_t * j_query, * j_result, * j_scope, * j_return, * j_scope_entry; int res; char * scope_clause; size_t i_scope; j_query = json_pack("{sss[ssssss]s{ss}}", "table", GLEWLWYD_TABLE_USER, "columns", "gu_id", "gu_name AS name", "gu_email AS email", "gu_login AS login", "gu_additional_property_value AS additional_property_value", "gu_enabled", "where", "gu_login", username); res = h_select(config->conn, j_query, &j_result, NULL); json_decref(j_query); if (res == H_OK) { if (json_array_size(j_result) > 0) { scope_clause = msprintf("IN (SELECT `gs_id` FROM %s WHERE `gu_id`='%" JSON_INTEGER_FORMAT "')", GLEWLWYD_TABLE_USER_SCOPE, json_integer_value(json_object_get(json_array_get(j_result, 0), "gu_id"))); j_query = json_pack("{sss[s]s{s{ssss}}}", "table", GLEWLWYD_TABLE_SCOPE, "columns", "gs_name", "where", "gs_id", "operator", "raw", "value", scope_clause); o_free(scope_clause); res = h_select(config->conn, j_query, &j_scope, NULL); json_decref(j_query); if (res == H_OK) { if (json_integer_value(json_object_get(json_array_get(j_result, 0), "gu_enabled")) == 1) { json_object_set_new(json_array_get(j_result, 0), "enabled", json_true()); } else { json_object_set_new(json_array_get(j_result, 0), "enabled", json_false()); } json_object_del(json_array_get(j_result, 0), "gu_id"); json_object_del(json_array_get(j_result, 0), "gu_enabled"); json_object_set_new(json_array_get(j_result, 0), "scope", json_array()); json_array_foreach(j_scope, i_scope, j_scope_entry) { json_array_append(json_object_get(json_array_get(j_result, 0), "scope"), json_object_get(j_scope_entry, "gs_name")); } json_decref(j_scope); json_object_set_new(json_array_get(j_result, 0), "source", json_string("database")); if (config->additional_property_name != NULL && o_strlen(config->additional_property_name)) { json_object_set_new(json_array_get(j_result, 0), "additional_property_name", json_string(config->additional_property_name)); } else { json_object_del(json_array_get(j_result, 0), "additional_property_value"); } j_return = json_pack("{sisO}", "result", G_OK, "user", json_array_get(j_result, 0)); } else { j_return = json_pack("{si}", "result", G_ERROR_DB); y_log_message(Y_LOG_LEVEL_ERROR, "get_user_database - Error executing j_query for scope"); } } else { j_return = json_pack("{si}", "result", G_ERROR_NOT_FOUND); } json_decref(j_result); } else { y_log_message(Y_LOG_LEVEL_ERROR, "get_user_database - Error executing j_query"); j_return = json_pack("{si}", "result", G_ERROR_DB); } return j_return; } /** * Get a specific user in the http backend * this is not possible, so return an error */ json_t * get_user_http(struct config_elements * config, const char * username) { json_t * j_query, * j_result, * j_return; int res; j_query = json_pack("{sss[ssss]s{ss}}", "table", GLEWLWYD_TABLE_USER, "columns", "gu_name AS name", "gu_email AS email", "gu_login AS login", "gu_additional_property_value AS additional_property_value", "where", "gu_login", username); res = h_select(config->conn, j_query, &j_result, NULL); json_decref(j_query); if (res == H_OK) { if (json_array_size(j_result) > 0) { // An HTTP user is always enabled, because only the authentication server is able to validate the user json_object_set_new(json_array_get(j_result, 0), "enabled", json_true()); j_return = json_pack("{sisO}", "result", G_OK, "user", json_array_get(j_result, 0)); } else { j_return = json_pack("{si}", "result", G_ERROR_NOT_FOUND); } json_decref(j_result); } else { y_log_message(Y_LOG_LEVEL_ERROR, "get_user_http - Error executing j_query"); j_return = json_pack("{si}", "result", G_ERROR_DB); } return j_return; } /** * Get a specific user in the ldap backend */ json_t * get_user_ldap(struct config_elements * config, const char * username) { LDAP * ldap = NULL; LDAPMessage * answer = NULL, * entry; int j; json_t * j_result = NULL, * j_scope_list = get_scope_list(config); char * additional_property_value, * tmp; int result; int ldap_version = LDAP_VERSION3; int scope = LDAP_SCOPE_ONELEVEL; char * filter = NULL; char * attrs[] = {config->auth_ldap->name_property_user_read, config->auth_ldap->email_property_user_read, config->auth_ldap->login_property_user_read, config->auth_ldap->scope_property_user_read, o_strlen(config->auth_ldap->additional_property_value_read)>0?config->auth_ldap->additional_property_value_read:NULL, NULL}; int attrsonly = 0; char * ldap_mech = LDAP_SASL_SIMPLE; struct berval cred; struct berval *servcred, ** name_values, ** email_values, ** login_values, ** scope_values, ** additional_property_values = NULL; cred.bv_val = config->auth_ldap->bind_passwd; cred.bv_len = strlen(config->auth_ldap->bind_passwd); if (!check_result_value(j_scope_list, G_OK)) { y_log_message(Y_LOG_LEVEL_ERROR, "Error getting scope list"); j_result = json_pack("{si}", "result", G_ERROR_PARAM); } else if (ldap_initialize(&ldap, config->auth_ldap->uri) != LDAP_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error initializing ldap"); j_result = json_pack("{si}", "result", G_ERROR_PARAM); } else if (ldap_set_option(ldap, LDAP_OPT_PROTOCOL_VERSION, &ldap_version) != LDAP_OPT_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error setting ldap protocol version"); j_result = json_pack("{si}", "result", G_ERROR_PARAM); } else if ((result = ldap_sasl_bind_s(ldap, config->auth_ldap->bind_dn, ldap_mech, &cred, NULL, NULL, &servcred)) != LDAP_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error binding to ldap server mode %s: %s", ldap_mech, ldap_err2string(result)); j_result = json_pack("{si}", "result", G_ERROR_PARAM); } else { // Connection successful, doing ldap search filter = msprintf("(&(%s)(%s=%s))", config->auth_ldap->filter_user_read, config->auth_ldap->login_property_user_read, username); if ((result = ldap_search_ext_s(ldap, config->auth_ldap->base_search_user, scope, filter, attrs, attrsonly, NULL, NULL, NULL, LDAP_NO_LIMIT, &answer)) != LDAP_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error ldap search: %s", ldap_err2string(result)); j_result = json_pack("{si}", "result", G_ERROR_PARAM); } else { // Looping in results, staring at offset, until the end of the list if (ldap_count_entries(ldap, answer) > 0) { entry = ldap_first_entry(ldap, answer); json_t * j_entry = json_object(); if (j_entry != NULL) { name_values = ldap_get_values_len(ldap, entry, config->auth_ldap->name_property_user_read); email_values = ldap_get_values_len(ldap, entry, config->auth_ldap->email_property_user_read); login_values = ldap_get_values_len(ldap, entry, config->auth_ldap->login_property_user_read); scope_values = ldap_get_values_len(ldap, entry, config->auth_ldap->scope_property_user_read); if (o_strlen(config->auth_ldap->additional_property_value_read)>0) { additional_property_values = ldap_get_values_len(ldap, entry, config->auth_ldap->additional_property_value_read); } if (ldap_count_values_len(name_values) > 0) { json_object_set_new(j_entry, "name", json_stringn(name_values[0]->bv_val, name_values[0]->bv_len)); } if (ldap_count_values_len(email_values) > 0) { json_object_set_new(j_entry, "email", json_stringn(email_values[0]->bv_val, email_values[0]->bv_len)); } if (ldap_count_values_len(login_values) > 0) { json_object_set_new(j_entry, "login", json_stringn(login_values[0]->bv_val, login_values[0]->bv_len)); } if (additional_property_values != NULL && ldap_count_values_len(additional_property_values) > 0) { additional_property_value = NULL; for (j=0; jbv_val, additional_property_values[j]->bv_len); } else { tmp = msprintf("%s,%.*s", additional_property_value, additional_property_values[j]->bv_len, additional_property_values[j]->bv_val); o_free(additional_property_value); additional_property_value = tmp; } } if (config->additional_property_name != NULL && o_strlen(config->additional_property_name)) { json_object_set_new(j_entry, "additional_property_name", json_string(config->additional_property_name)); json_object_set_new(j_entry, "additional_property_value", json_string(additional_property_value)); } o_free(additional_property_value); } // For now a ldap user is always enabled, until I find a standard way to do it json_object_set_new(j_entry, "enabled", json_true()); json_object_set_new(j_entry, "scope", json_array()); for (j=0; j < ldap_count_values_len(scope_values); j++) { json_t * j_scope = json_string(scope_values[j]->bv_val); if (json_search(json_object_get(j_scope_list, "scope"), j_scope) != NULL) { json_array_append_new(json_object_get(j_entry, "scope"), j_scope); } else { json_decref(j_scope); } } json_object_set_new(j_entry, "source", json_string("ldap")); j_result = json_pack("{siso}", "result", G_OK, "user", j_entry); ldap_value_free_len(name_values); ldap_value_free_len(email_values); ldap_value_free_len(login_values); ldap_value_free_len(scope_values); ldap_value_free_len(additional_property_values); } else { y_log_message(Y_LOG_LEVEL_ERROR, "Error allocating resources for j_entry"); } } else { j_result = json_pack("{si}", "result", G_ERROR_NOT_FOUND); } } o_free(filter); ldap_msgfree(answer); } ldap_unbind_ext(ldap, NULL, NULL); json_decref(j_scope_list); return j_result; } /** * Get the list of available scopes for a specific user */ json_t * get_user_scope_grant(struct config_elements * config, const char * username) { json_t * j_res = NULL; if (username != NULL) { if (config->has_auth_ldap) { j_res = get_user_scope_grant_ldap(config, username); } if (config->has_auth_database && !check_result_value(j_res, G_OK)) { json_decref(j_res); j_res = get_user_scope_grant_database(config, username); } } else { j_res = json_pack("{si}", "result", G_ERROR_PARAM); } return j_res; } /** * Get the list of available scopes for a specific user in the database backend */ json_t * get_user_scope_grant_database(struct config_elements * config, const char * username) { json_t * j_query, * j_result, * j_return; int res; char * username_escaped = h_escape_string(config->conn, username), * clause_where_scope = msprintf("IN (SELECT `gs_id` FROM `%s` WHERE `gu_id` = (SELECT `gu_id` FROM `%s` WHERE `gu_login`='%s'))", GLEWLWYD_TABLE_USER_SCOPE, GLEWLWYD_TABLE_USER, username_escaped); j_query = json_pack("{sss[ss]s{s{ssss}}}", "table", GLEWLWYD_TABLE_SCOPE, "columns", "gs_name AS name", "gs_description AS description", "where", "gs_id", "operator", "raw", "value", clause_where_scope); o_free(username_escaped); o_free(clause_where_scope); res = h_select(config->conn, j_query, &j_result, NULL); json_decref(j_query); if (res == H_OK) { j_return = json_pack("{siso}", "result", G_OK, "scope", j_result); } else { j_return = json_pack("{si}", "result", G_ERROR_DB); } return j_return; } /** * Get the list of available scopes for a specific user in the ldap backend */ json_t * get_user_scope_grant_ldap(struct config_elements * config, const char * username) { LDAP * ldap = NULL; LDAPMessage * answer = NULL, * entry; int result; int ldap_version = LDAP_VERSION3; int scope = LDAP_SCOPE_ONELEVEL; char * filter = NULL; char * attrs[] = {"memberOf", config->auth_ldap->scope_property_user_read, NULL}; int attrsonly = 0; json_t * j_return = NULL; char * ldap_mech = LDAP_SASL_SIMPLE; struct berval cred; struct berval *servcred; char * scope_list_escaped = NULL, * scope_escaped, * tmp; int i, res; json_t * j_query, * j_result; cred.bv_val = config->auth_ldap->bind_passwd; cred.bv_len = strlen(config->auth_ldap->bind_passwd); if (ldap_initialize(&ldap, config->auth_ldap->uri) != LDAP_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error initializing ldap"); j_return = json_pack("{si}", "result", G_ERROR_PARAM); } else if (ldap_set_option(ldap, LDAP_OPT_PROTOCOL_VERSION, &ldap_version) != LDAP_OPT_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error setting ldap protocol version"); j_return = json_pack("{si}", "result", G_ERROR_PARAM); } else if ((result = ldap_sasl_bind_s(ldap, config->auth_ldap->bind_dn, ldap_mech, &cred, NULL, NULL, &servcred)) != LDAP_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error binding to ldap server mode %s: %s", ldap_mech, ldap_err2string(result)); j_return = json_pack("{si}", "result", G_ERROR_PARAM); } else { // Connection successful, doing ldap search filter = msprintf("(&(%s)(%s=%s))", config->auth_ldap->filter_user_read, config->auth_ldap->login_property_user_read, username); if (filter != NULL && (result = ldap_search_ext_s(ldap, config->auth_ldap->base_search_user, scope, filter, attrs, attrsonly, NULL, NULL, NULL, LDAP_NO_LIMIT, &answer)) != LDAP_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error ldap search: %s", ldap_err2string(result)); j_return = json_pack("{si}", "result", G_ERROR_PARAM); } else if (ldap_count_entries(ldap, answer) == 0) { // No result found for username j_return = json_pack("{si}", "result", G_ERROR_NOT_FOUND); } else { // ldap found some results, getting the first one entry = ldap_first_entry(ldap, answer); if (entry == NULL) { y_log_message(Y_LOG_LEVEL_ERROR, "ldap search: error getting first result"); j_return = json_pack("{si}", "result", G_ERROR); } else { struct berval ** scope_values = ldap_get_values_len(ldap, entry, config->auth_ldap->scope_property_user_read); for (i=0; i < ldap_count_values_len(scope_values); i++) { scope_escaped = h_escape_string(config->conn, scope_values[i]->bv_val); if (scope_list_escaped == NULL) { scope_list_escaped = msprintf("'%s'", scope_escaped); } else { tmp = msprintf("%s,'%s'", scope_list_escaped, scope_escaped); o_free(scope_list_escaped); scope_list_escaped = tmp; } o_free(scope_escaped); } ldap_value_free_len(scope_values); j_query = json_pack("{sss[ss]s{s{ssss}}}", "table", GLEWLWYD_TABLE_SCOPE, "columns", "gs_name AS name", "gs_description AS description", "where", "gs_name", "operator", "in", "value", scope_list_escaped); o_free(scope_list_escaped); res = h_select(config->conn, j_query, &j_result, NULL); json_decref(j_query); if (res == H_OK) { j_return = json_pack("{siso}", "result", G_OK, "scope", j_result); } else { j_return = json_pack("{si}", "result", G_ERROR_DB); } } } o_free(filter); ldap_msgfree(answer); } ldap_unbind_ext(ldap, NULL, NULL); return j_return; } /** * All inclusive authentication check for a user */ json_t * auth_check_user_credentials_scope(struct config_elements * config, const char * username, const char * password, const char * scope_list) { json_t * j_res_auth = NULL, * j_res_scope = NULL, * j_res; if (scope_list == NULL && config->use_scope) { j_res = json_pack("{si}", "result", G_ERROR_UNAUTHORIZED); } else if (username != NULL && password != NULL) { if (config->has_auth_ldap) { j_res_auth = auth_check_user_credentials_ldap(config, username, password); if (check_result_value(j_res_auth, G_OK)) { j_res_scope = auth_check_user_scope_ldap(config, username, scope_list); } } if (config->has_auth_database && !check_result_value(j_res_auth, G_OK)) { json_decref(j_res_auth); j_res_auth = auth_check_user_credentials_database(config, username, password); if (check_result_value(j_res_auth, G_OK)) { j_res_scope = auth_check_user_scope_database(config, username, scope_list); } } if (check_result_value(j_res_auth, G_OK)) { if (check_result_value(j_res_scope, G_OK)) { j_res = json_copy(j_res_scope); } else if (check_result_value(j_res_scope, G_ERROR_UNAUTHORIZED)) { j_res = json_pack("{si}", "result", G_ERROR_UNAUTHORIZED); } else { j_res = json_pack("{si}", "result", G_ERROR); } } else { j_res = json_pack("{si}", "result", G_ERROR_UNAUTHORIZED); } json_decref(j_res_scope); json_decref(j_res_auth); } else if (check_result_value(j_res_auth, G_ERROR_UNAUTHORIZED)) { j_res = json_pack("{si}", "result", G_ERROR_UNAUTHORIZED); } else { j_res = json_pack("{si}", "result", G_ERROR); } return j_res; } /** * Check if a user has valid credentials */ json_t * auth_check_user_credentials(struct config_elements * config, const char * username, const char * password) { json_t * j_res = NULL; if (username != NULL && password != NULL && strlen(password) > 0) { if (config->has_auth_ldap) { j_res = auth_check_user_credentials_ldap(config, username, password); } if (config->has_auth_database && !check_result_value(j_res, G_OK)) { json_decref(j_res); j_res = auth_check_user_credentials_database(config, username, password); } if (config->has_auth_http && !check_result_value(j_res, G_OK)) { json_decref(j_res); j_res = auth_check_user_credentials_http(config, username, password); } } else { j_res = json_pack("{si}", "result", G_ERROR_UNAUTHORIZED); } return j_res; } /** * Check if the username and password specified are valid as a http user * On success, return a json array with all scope values available */ json_t * auth_check_user_credentials_http(struct config_elements * config, const char * username, const char * password) { int res, to_return; struct _u_request request; struct _u_response response; if (o_strlen(username) <= 0 || o_strlen(password) <= 0) { to_return = G_ERROR_UNAUTHORIZED; } else { ulfius_init_request(&request); ulfius_init_response(&response); request.http_verb = o_strdup("GET"); request.http_url = o_strdup(config->auth_http->url); request.check_server_certificate = config->auth_http->check_server_certificate; request.auth_basic_user = o_strdup(username); request.auth_basic_password = o_strdup(password); /* Set a timeout for the outgoing connection (10 seconds for example), in case the authentication server is down or something like that, this can be hardcoded, or we can add a config value */ request.timeout = 10; res = ulfius_send_http_request(&request, &response); if (res == U_OK) { if (response.status == 200) { to_return = G_OK; } else if (response.status == 403 || response.status == 401) { to_return = G_ERROR_UNAUTHORIZED; } else { y_log_message(Y_LOG_LEVEL_ERROR, "auth_check_user_credentials_http - Error http auth: %d", response.status); to_return = G_ERROR; } } else { y_log_message(Y_LOG_LEVEL_ERROR, "auth_check_user_credentials_http - Error ulfius_send_http_request"); to_return = G_ERROR; } ulfius_clean_response(&response); ulfius_clean_request(&request); } return json_pack("{si}", "result", to_return); } /** * Check if the username and password specified are valid as a database user * On success, return a json array with all scope values available */ json_t * auth_check_user_credentials_database(struct config_elements * config, const char * username, const char * password) { json_t * j_query, * j_result; char * escaped, * str_password; int res, res_size; if (o_strlen(username) <= 0 || o_strlen(password) <= 0) { return json_pack("{si}", "result", G_ERROR_UNAUTHORIZED); } else { if (config->conn->type == HOEL_DB_TYPE_SQLITE) { escaped = generate_hash(config, config->hash_algorithm, password); str_password = msprintf("= '%s'", escaped); o_free(escaped); } else { escaped = h_escape_string(config->conn, password); str_password = msprintf("= PASSWORD('%s')", escaped); o_free(escaped); } j_query = json_pack("{sss{sss{ssss}si}}", "table", GLEWLWYD_TABLE_USER, "where", "gu_login", username, "gu_password", "operator", "raw", "value", str_password, "gu_enabled", 1); res = h_select(config->conn, j_query, &j_result, NULL); json_decref(j_query); o_free(str_password); if (res == H_OK) { res_size = json_array_size(j_result); json_decref(j_result); if (res_size == 0) { return json_pack("{si}", "result", G_ERROR_UNAUTHORIZED); } else if (res_size == 1) { return json_pack("{si}", "result", G_OK); } else { y_log_message(Y_LOG_LEVEL_ERROR, "Error in database while getting credentials (obviously)"); return json_pack("{si}", "result", G_ERROR_DB); } } else { y_log_message(Y_LOG_LEVEL_ERROR, "Error in database while executing query"); return json_pack("{si}", "result", G_ERROR_DB); } } } /** * Check if the username and password specified are valid as a LDAP user */ json_t * auth_check_user_credentials_ldap(struct config_elements * config, const char * username, const char * password) { LDAP * ldap = NULL; LDAPMessage * answer = NULL, * entry; int result, result_login; int ldap_version = LDAP_VERSION3; int scope = LDAP_SCOPE_ONELEVEL; char * filter = NULL; char * attrs[] = {"memberOf", NULL, NULL}; int attrsonly = 0; char * user_dn = NULL; json_t * res = NULL; char * ldap_mech = LDAP_SASL_SIMPLE; struct berval cred; struct berval *servcred; cred.bv_val = config->auth_ldap->bind_passwd; cred.bv_len = strlen(config->auth_ldap->bind_passwd); if (ldap_initialize(&ldap, config->auth_ldap->uri) != LDAP_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error initializing ldap"); res = json_pack("{si}", "result", G_ERROR_PARAM); } else if (ldap_set_option(ldap, LDAP_OPT_PROTOCOL_VERSION, &ldap_version) != LDAP_OPT_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error setting ldap protocol version"); res = json_pack("{si}", "result", G_ERROR_PARAM); } else if ((result = ldap_sasl_bind_s(ldap, config->auth_ldap->bind_dn, ldap_mech, &cred, NULL, NULL, &servcred)) != LDAP_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error binding to ldap server mode %s: %s", ldap_mech, ldap_err2string(result)); res = json_pack("{si}", "result", G_ERROR_PARAM); } else { // Connection successful, doing ldap search filter = msprintf("(&(%s)(%s=%s))", config->auth_ldap->filter_user_read, config->auth_ldap->login_property_user_read, username); if (config->use_scope) { attrs[1] = config->auth_ldap->scope_property_user_read; } if (filter != NULL && (result = ldap_search_ext_s(ldap, config->auth_ldap->base_search_user, scope, filter, attrs, attrsonly, NULL, NULL, NULL, LDAP_NO_LIMIT, &answer)) != LDAP_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error ldap search: %s", ldap_err2string(result)); res = json_pack("{si}", "result", G_ERROR_PARAM); } else if (ldap_count_entries(ldap, answer) == 0) { // No result found for username res = json_pack("{si}", "result", G_ERROR_NOT_FOUND); } else { // ldap found some results, getting the first one entry = ldap_first_entry(ldap, answer); if (entry == NULL) { y_log_message(Y_LOG_LEVEL_ERROR, "ldap search: error getting first result"); res = json_pack("{si}", "result", G_ERROR); } else { // Testing the first result to username with the given password user_dn = ldap_get_dn(ldap, entry); cred.bv_val = (char *)password; cred.bv_len = strlen(password); result_login = ldap_sasl_bind_s(ldap, user_dn, ldap_mech, &cred, NULL, NULL, &servcred); ldap_memfree(user_dn); if (result_login == LDAP_SUCCESS) { res = json_pack("{si}", "result", G_OK); } else { res = json_pack("{si}", "result", G_ERROR_UNAUTHORIZED); } } } o_free(filter); ldap_msgfree(answer); } ldap_unbind_ext(ldap, NULL, NULL); return res; } /** * Check the scope list specified for the database user and return the filtered scope_list */ json_t * auth_check_user_scope_database(struct config_elements * config, const char * username, const char * scope_list) { json_t * j_query, * j_result, * scope_list_allowed, * j_value; int res; char * scope, * scope_escaped, * saveptr, * scope_list_escaped = NULL, * scope_list_save = o_strdup(scope_list), * login_escaped = h_escape_string(config->conn, username), * scope_list_join; char * where_clause, * tmp; size_t index; if (scope_list == NULL || username == NULL) { scope_list_allowed = json_pack("{si}", "result", G_ERROR_PARAM); } else if (scope_list_save != NULL && login_escaped != NULL) { scope = strtok_r(scope_list_save, " ", &saveptr); while (scope != NULL) { scope_escaped = h_escape_string(config->conn, scope); if (scope_list_escaped != NULL) { tmp = msprintf("%s,'%s'", scope_list_escaped, scope_escaped); o_free(scope_list_escaped); scope_list_escaped = tmp; } else { scope_list_escaped = msprintf("'%s'", scope_escaped); } o_free(scope_escaped); scope = strtok_r(NULL, " ", &saveptr); } where_clause = msprintf("IN (SELECT gs_id FROM %s WHERE gu_id = (SELECT gu_id FROM %s WHERE gu_login='%s') AND gs_id IN (SELECT gs_id FROM %s WHERE gs_name IN (%s)))", GLEWLWYD_TABLE_USER_SCOPE, GLEWLWYD_TABLE_USER, login_escaped, GLEWLWYD_TABLE_SCOPE, scope_list_escaped); j_query = json_pack("{sss[s]s{s{ssss}}}", "table", GLEWLWYD_TABLE_SCOPE, "columns", "gs_name", "where", "gs_id", "operator", "raw", "value", where_clause); o_free(scope_list_escaped); o_free(where_clause); if (j_query != NULL) { res = h_select(config->conn, j_query, &j_result, NULL); json_decref(j_query); if (res == H_OK) { if (json_array_size(j_result) > 0) { scope_list_join = NULL; json_array_foreach(j_result, index, j_value) { if (scope_list_join != NULL) { tmp = msprintf("%s %s", scope_list_join, json_string_value(json_object_get(j_value, "gs_name"))); o_free(scope_list_join); scope_list_join = tmp; } else { scope_list_join = strdup(json_string_value(json_object_get(j_value, "gs_name"))); } } scope_list_allowed = json_pack("{siss}", "result", G_OK, "scope", scope_list_join); o_free(scope_list_join); } else { scope_list_allowed = json_pack("{si}", "result", G_ERROR_UNAUTHORIZED); } json_decref(j_result); } else { y_log_message(Y_LOG_LEVEL_ERROR, "auth_check_user_scope_database - Error executing sql query"); scope_list_allowed = json_pack("{si}", "result", G_ERROR_DB); } } else { y_log_message(Y_LOG_LEVEL_ERROR, "auth_check_user_scope_database - Error allocating resources for j_query"); scope_list_allowed = json_pack("{si}", "result", G_ERROR); } } else { y_log_message(Y_LOG_LEVEL_ERROR, "auth_check_user_scope_database - Error allocating resources for scope_list_save %s or login_escaped %s or scope_list_escaped %s", scope_list_save, login_escaped, scope_list_escaped); scope_list_allowed = json_pack("{si}", "result", G_ERROR); } o_free(scope_list_save); o_free(login_escaped); return scope_list_allowed; } /** * Check if user is allowed for the scope_list specified * Return a refined list of scope */ json_t * auth_check_user_scope(struct config_elements * config, const char * username, const char * scope_list) { json_t * j_res = NULL; if (scope_list != NULL) { if (config->has_auth_ldap) { j_res = auth_check_user_scope_ldap(config, username, scope_list); } if (config->has_auth_database && (j_res == NULL || !check_result_value(j_res, G_OK))) { json_decref(j_res); j_res = auth_check_user_scope_database(config, username, scope_list); } } else { j_res = json_pack("{si}", "result", G_ERROR_UNAUTHORIZED); } return j_res; } /** * Check if ldap user is allowed for the scope_list specified * Return a refined list of scope */ json_t * auth_check_user_scope_ldap(struct config_elements * config, const char * username, const char * scope_list) { LDAP * ldap = NULL; LDAPMessage * answer = NULL, * entry; int result; int ldap_version = LDAP_VERSION3; int scope = LDAP_SCOPE_ONELEVEL; char * filter = NULL; char * attrs[] = {"memberOf", NULL, NULL}; int attrsonly = 0; json_t * res = NULL; char * ldap_mech = LDAP_SASL_SIMPLE; struct berval cred; struct berval *servcred; cred.bv_val = config->auth_ldap->bind_passwd; cred.bv_len = strlen(config->auth_ldap->bind_passwd); if (ldap_initialize(&ldap, config->auth_ldap->uri) != LDAP_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error initializing ldap"); res = json_pack("{si}", "result", G_ERROR_PARAM); } else if (ldap_set_option(ldap, LDAP_OPT_PROTOCOL_VERSION, &ldap_version) != LDAP_OPT_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error setting ldap protocol version"); res = json_pack("{si}", "result", G_ERROR_PARAM); } else if ((result = ldap_sasl_bind_s(ldap, config->auth_ldap->bind_dn, ldap_mech, &cred, NULL, NULL, &servcred)) != LDAP_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error binding to ldap server mode %s: %s", ldap_mech, ldap_err2string(result)); res = json_pack("{si}", "result", G_ERROR_PARAM); } else { // Connection successful, doing ldap search filter = msprintf("(&(%s)(%s=%s))", config->auth_ldap->filter_user_read, config->auth_ldap->login_property_user_read, username); if (config->use_scope) { attrs[1] = config->auth_ldap->scope_property_user_read; } if (filter != NULL && (result = ldap_search_ext_s(ldap, config->auth_ldap->base_search_user, scope, filter, attrs, attrsonly, NULL, NULL, NULL, LDAP_NO_LIMIT, &answer)) != LDAP_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error ldap search: %s", ldap_err2string(result)); res = json_pack("{si}", "result", G_ERROR_PARAM); } else if (ldap_count_entries(ldap, answer) == 0) { // No result found for username res = json_pack("{si}", "result", G_ERROR_NOT_FOUND); } else { // ldap found some results, getting the first one entry = ldap_first_entry(ldap, answer); if (entry == NULL) { y_log_message(Y_LOG_LEVEL_ERROR, "ldap search: error getting first result"); res = json_pack("{si}", "result", G_ERROR); } else { struct berval ** values = ldap_get_values_len(ldap, entry, config->auth_ldap->scope_property_user_read); char * new_scope_list = strdup(""); int i; for (i=0; i < ldap_count_values_len(values); i++) { char * str_value = o_malloc(values[i]->bv_len + 1); char * scope_list_dup = o_strdup(scope_list); char * token, * save_ptr = NULL; snprintf(str_value, values[i]->bv_len + 1, "%s", values[i]->bv_val); token = strtok_r(scope_list_dup, " ", &save_ptr); while (token != NULL) { if (0 == strcmp(token, str_value)) { if (strlen(new_scope_list) > 0) { char * tmp = msprintf("%s %s", new_scope_list, token); o_free(new_scope_list); new_scope_list = tmp; } else { o_free(new_scope_list); new_scope_list = strdup(token); } } token = strtok_r(NULL, " ", &save_ptr); } o_free(scope_list_dup); o_free(str_value); } ldap_value_free_len(values); if (o_strlen(new_scope_list) > 0) { res = json_pack("{siss}", "result", G_OK, "scope", new_scope_list); } else { // User hasn't all of part of the scope requested, sending unauthorized answer res = json_pack("{si}", "result", G_ERROR_UNAUTHORIZED); } o_free(new_scope_list); } } o_free(filter); ldap_msgfree(answer); } ldap_unbind_ext(ldap, NULL, NULL); return res; } /** * Return the list of users */ json_t * get_user_list(struct config_elements * config, const char * source, const char * search, long int offset, long int limit) { json_t * j_return, * j_source_list = NULL, * j_result_list = json_array(); if (j_result_list != NULL) { if ((source == NULL || 0 == strcmp(source, "ldap") || 0 == strcmp(source, "all")) && config->has_auth_ldap) { j_source_list = get_user_list_ldap(config, search, offset, limit); if (check_result_value(j_source_list, G_OK)) { json_array_extend(j_result_list, json_object_get(j_source_list, "user")); } else { y_log_message(Y_LOG_LEVEL_ERROR, "get_user_list - Error getting ldap list"); } json_decref(j_source_list); j_source_list = NULL; } if ((source == NULL || 0 == strcmp(source, "database") || 0 == strcmp(source, "all")) && json_array_size(j_result_list) < limit && config->has_auth_database) { j_source_list = get_user_list_database(config, search, offset, (limit - json_array_size(j_result_list))); if (check_result_value(j_source_list, G_OK)) { json_array_extend(j_result_list, json_object_get(j_source_list, "user")); } else { y_log_message(Y_LOG_LEVEL_ERROR, "get_user_list - Error getting database list"); } json_decref(j_source_list); j_source_list = NULL; } j_return = json_pack("{siso}", "result", G_OK, "user", j_result_list); } else { y_log_message(Y_LOG_LEVEL_ERROR, "get_user_list - Error allocating resources for j_result_list"); j_return = json_pack("{si}", "result", G_ERROR_MEMORY); } return j_return; } /** * Return the list of users in the ldap backend */ json_t * get_user_list_ldap(struct config_elements * config, const char * search, long int offset, long int limit) { LDAP * ldap = NULL; LDAPMessage * answer = NULL, * entry; int i, j; json_t * j_result, * j_scope_list = get_scope_list(config); char * additional_property_value, * tmp; int result; int ldap_version = LDAP_VERSION3; int scope = LDAP_SCOPE_ONELEVEL; char * filter = NULL; char * attrs[] = {config->auth_ldap->name_property_user_read, config->auth_ldap->email_property_user_read, config->auth_ldap->login_property_user_read, config->auth_ldap->scope_property_user_read, o_strlen(config->auth_ldap->additional_property_value_read)>0?config->auth_ldap->additional_property_value_read:NULL, NULL}; int attrsonly = 0; char * ldap_mech = LDAP_SASL_SIMPLE; struct berval cred; struct berval *servcred, ** name_values, ** email_values, ** login_values, ** scope_values, ** additional_property_values = NULL; cred.bv_val = config->auth_ldap->bind_passwd; cred.bv_len = strlen(config->auth_ldap->bind_passwd); if (!check_result_value(j_scope_list, G_OK)) { y_log_message(Y_LOG_LEVEL_ERROR, "Error getting scope list"); j_result = json_pack("{si}", "result", G_ERROR_PARAM); } else if (ldap_initialize(&ldap, config->auth_ldap->uri) != LDAP_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error initializing ldap"); j_result = json_pack("{si}", "result", G_ERROR_PARAM); } else if (ldap_set_option(ldap, LDAP_OPT_PROTOCOL_VERSION, &ldap_version) != LDAP_OPT_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error setting ldap protocol version"); j_result = json_pack("{si}", "result", G_ERROR_PARAM); } else if ((result = ldap_sasl_bind_s(ldap, config->auth_ldap->bind_dn, ldap_mech, &cred, NULL, NULL, &servcred)) != LDAP_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error binding to ldap server mode %s: %s", ldap_mech, ldap_err2string(result)); j_result = json_pack("{si}", "result", G_ERROR_PARAM); } else { // Connection successful, doing ldap search if (search != NULL && strcmp("", search) != 0) { char * search_escaped = escape_ldap(search); filter = msprintf("(&(%s)(|(%s=*%s*)(%s=*%s*)(%s=*%s*)))", config->auth_ldap->filter_user_read, config->auth_ldap->login_property_user_read, search_escaped, config->auth_ldap->name_property_user_read, search_escaped, config->auth_ldap->email_property_user_read, search_escaped); o_free(search_escaped); } else { filter = msprintf("(%s)", config->auth_ldap->filter_user_read); } if ((result = ldap_search_ext_s(ldap, config->auth_ldap->base_search_user, scope, filter, attrs, attrsonly, NULL, NULL, NULL, (offset+limit), &answer)) != LDAP_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error ldap search: %s", ldap_err2string(result)); j_result = json_pack("{si}", "result", G_ERROR_PARAM); } else { // Looping in results, staring at offset, until the end of the list j_result = json_pack("{sis[]}", "result", G_OK, "user"); if (ldap_count_entries(ldap, answer) >= offset) { entry = ldap_first_entry(ldap, answer); for (i=0; iauth_ldap->name_property_user_read); email_values = ldap_get_values_len(ldap, entry, config->auth_ldap->email_property_user_read); login_values = ldap_get_values_len(ldap, entry, config->auth_ldap->login_property_user_read); scope_values = ldap_get_values_len(ldap, entry, config->auth_ldap->scope_property_user_read); if (o_strlen(config->auth_ldap->additional_property_value_read)>0 && config->additional_property_name != NULL && o_strlen(config->additional_property_name)) { additional_property_values = ldap_get_values_len(ldap, entry, config->auth_ldap->additional_property_value_read); } if (ldap_count_values_len(name_values) > 0) { json_object_set_new(j_entry, "name", json_stringn(name_values[0]->bv_val, name_values[0]->bv_len)); } if (ldap_count_values_len(email_values) > 0) { json_object_set_new(j_entry, "email", json_stringn(email_values[0]->bv_val, email_values[0]->bv_len)); } if (ldap_count_values_len(login_values) > 0) { json_object_set_new(j_entry, "login", json_stringn(login_values[0]->bv_val, login_values[0]->bv_len)); } if (additional_property_values != NULL && ldap_count_values_len(additional_property_values) > 0) { additional_property_value = NULL; for (j=0; jbv_val, login_values[j]->bv_len); } else { tmp = msprintf("%s,%.*s", additional_property_value, login_values[j]->bv_len, login_values[j]->bv_val); o_free(additional_property_value); additional_property_value = tmp; } } if (config->additional_property_name != NULL && o_strlen(config->additional_property_name)) { json_object_set_new(j_entry, "additional_property_name", json_string(config->additional_property_name)); json_object_set_new(j_entry, "additional_property_value", json_string(additional_property_value)); } o_free(additional_property_value); } // For now a ldap user is always enabled, until I find a standard way to do it json_object_set_new(j_entry, "enabled", json_true()); json_object_set_new(j_entry, "scope", json_array()); for (j=0; j < ldap_count_values_len(scope_values); j++) { json_t * j_scope = json_string(scope_values[j]->bv_val); if (json_search(json_object_get(j_scope_list, "scope"), j_scope) != NULL) { json_array_append_new(json_object_get(j_entry, "scope"), j_scope); } else { json_decref(j_scope); } } json_object_set_new(j_entry, "source", json_string("ldap")); json_array_append_new(json_object_get(j_result, "user"), j_entry); ldap_value_free_len(name_values); ldap_value_free_len(email_values); ldap_value_free_len(login_values); ldap_value_free_len(scope_values); ldap_value_free_len(additional_property_values); } else { y_log_message(Y_LOG_LEVEL_ERROR, "Error allocating resources for j_entry"); } entry = ldap_next_entry(ldap, entry); i++; } } } o_free(filter); ldap_msgfree(answer); } ldap_unbind_ext(ldap, NULL, NULL); json_decref(j_scope_list); return j_result; } /** * Return the list of users in the database backend */ json_t * get_user_list_database(struct config_elements * config, const char * search, long int offset, long int limit) { json_t * j_query, * j_result, * j_scope, * j_return, * j_entry, * j_scope_entry; int res; char * scope_clause; size_t index, i_scope; j_query = json_pack("{sss[ssssss]sisi}", "table", GLEWLWYD_TABLE_USER, "columns", "gu_id", "gu_name AS name", "gu_email AS email", "gu_login AS login", "gu_additional_property_value AS additional_property_value", "gu_enabled", "offset", offset, "limit", limit); if (search != NULL && strcmp("", search) != 0) { char * search_escaped = h_escape_string(config->conn, search); char * clause_search = msprintf("IN (SELECT `gu_id` FROM `%s` WHERE `gu_name` LIKE '%%%s%%' OR `gu_email` LIKE '%%%s%%' OR `gu_login` LIKE '%%%s%%')", GLEWLWYD_TABLE_USER, search_escaped, search_escaped, search_escaped); json_object_set_new(j_query, "where", json_pack("{s{ssss}}", "gu_id", "operator", "raw", "value", clause_search)); o_free(search_escaped); o_free(clause_search); } res = h_select(config->conn, j_query, &j_result, NULL); json_decref(j_query); if (res == H_OK) { j_return = json_pack("{sis[]}", "result", G_OK, "user"); json_array_foreach(j_result, index, j_entry) { scope_clause = msprintf("IN (SELECT `gs_id` FROM %s WHERE `gu_id`='%" JSON_INTEGER_FORMAT "')", GLEWLWYD_TABLE_USER_SCOPE, json_integer_value(json_object_get(j_entry, "gu_id"))); j_query = json_pack("{sss[s]s{s{ssss}}}", "table", GLEWLWYD_TABLE_SCOPE, "columns", "gs_name", "where", "gs_id", "operator", "raw", "value", scope_clause); o_free(scope_clause); res = h_select(config->conn, j_query, &j_scope, NULL); json_decref(j_query); if (res == H_OK) { if (json_integer_value(json_object_get(j_entry, "gu_enabled")) == 1) { json_object_set_new(j_entry, "enabled", json_true()); } else { json_object_set_new(j_entry, "enabled", json_false()); } json_object_del(j_entry, "gu_id"); json_object_del(j_entry, "gu_enabled"); json_object_set_new(j_entry, "scope", json_array()); json_array_foreach(j_scope, i_scope, j_scope_entry) { json_array_append(json_object_get(j_entry, "scope"), json_object_get(j_scope_entry, "gs_name")); } json_decref(j_scope); json_object_set_new(j_entry, "source", json_string("database")); if (config->additional_property_name != NULL && o_strlen(config->additional_property_name)) { json_object_set_new(j_entry, "additional_property_name", json_string(config->additional_property_name)); } else { json_object_del(j_entry, "additional_property_value"); } json_array_append(json_object_get(j_return, "user"), j_entry); } else { y_log_message(Y_LOG_LEVEL_ERROR, "get_user_list_database - Error executing j_query for scope"); } } json_decref(j_result); } else { y_log_message(Y_LOG_LEVEL_ERROR, "get_user_list_database - Error executing j_query"); j_return = json_pack("{si}", "result", G_ERROR_DB); } return j_return; } /** * Return a specific user */ json_t * get_user(struct config_elements * config, const char * login, const char * source) { json_t * j_return = NULL, * j_user = NULL; int search_ldap = (source == NULL || 0 == strcmp(source, "ldap") || 0 == strcmp(source, "all")), search_database = (source == NULL || 0 == strcmp(source, "database") || 0 == strcmp(source, "all")), search_http = (source == NULL || 0 == strcmp(source, "http") || 0 == strcmp(source, "all")); if (search_ldap) { if (config->has_auth_ldap) { j_user = get_user_ldap(config, login); } else if (0 == o_strcmp(source, "ldap") && !config->has_auth_ldap) { j_user = json_pack("{si}", "result", G_ERROR_PARAM); } else { j_user = json_pack("{si}", "result", G_ERROR_NOT_FOUND); } } if ((j_user == NULL || check_result_value(j_user, G_ERROR_NOT_FOUND)) && search_database) { json_decref(j_user); if (config->has_auth_database) { j_user = get_user_database(config, login); } else if (0 == o_strcmp(source, "database") && !config->has_auth_database) { j_user = json_pack("{si}", "result", G_ERROR_PARAM); } else { j_user = json_pack("{si}", "result", G_ERROR_NOT_FOUND); } } if ((j_user == NULL || check_result_value(j_user, G_ERROR_NOT_FOUND)) && search_http) { json_decref(j_user); if (config->has_auth_http) { j_user = get_user_http(config, login); } else if (0 == o_strcmp(source, "http") && !config->has_auth_http) { j_user = json_pack("{si}", "result", G_ERROR_PARAM); } else { j_user = json_pack("{si}", "result", G_ERROR_NOT_FOUND); } } if (check_result_value(j_user, G_OK)) { j_return = json_pack("{sisO}", "result", G_OK, "user", json_object_get(j_user, "user")); } else if (check_result_value(j_user, G_ERROR_NOT_FOUND)) { j_return = json_pack("{si}", "result", G_ERROR_NOT_FOUND); } else if (check_result_value(j_user, G_ERROR_PARAM)) { j_return = json_pack("{si}", "result", G_ERROR_PARAM); } else { y_log_message(Y_LOG_LEVEL_ERROR, "get_user - Error getting user"); j_return = json_pack("{si}", "result", G_ERROR); } json_decref(j_user); return j_return; } /** * Return a specific user for API GET /profile */ json_t * get_user_profile(struct config_elements * config, const char * login, const char * source) { json_t * j_return = NULL, * j_user = NULL; int search_ldap = (source == NULL || 0 == strcmp(source, "ldap") || 0 == strcmp(source, "all")), search_database = (source == NULL || 0 == strcmp(source, "database") || 0 == strcmp(source, "all")); if (search_ldap) { if (config->has_auth_ldap) { j_user = get_user_ldap(config, login); } else { j_user = json_pack("{si}", "result", G_ERROR_PARAM); } } if (!check_result_value(j_user, G_OK) && search_database) { json_decref(j_user); if (config->has_auth_database) { j_user = get_user_database(config, login); } else { j_user = json_pack("{si}", "result", G_ERROR_PARAM); } } if (check_result_value(j_user, G_OK)) { json_object_del(json_object_get(j_user, "user"), "scope"); j_return = json_pack("{sisO}", "result", G_OK, "user", json_object_get(j_user, "user")); } else if (check_result_value(j_user, G_ERROR_NOT_FOUND) || j_user == NULL) { j_return = json_pack("{si}", "result", G_ERROR_NOT_FOUND); } else if (check_result_value(j_user, G_ERROR_PARAM)) { j_return = json_pack("{si}", "result", G_ERROR_PARAM); } else { y_log_message(Y_LOG_LEVEL_ERROR, "get_user - Error getting user"); j_return = json_pack("{si}", "result", G_ERROR); } json_decref(j_user); return j_return; } /** * Checks if the user parameters are valid */ json_t * is_user_valid(struct config_elements * config, json_t * j_user, int add) { json_t * j_return = json_array(), * j_result, * j_scope; size_t index; if (j_return != NULL) { if (json_is_object(j_user)) { if (json_object_get(j_user, "source") != NULL && (!json_is_string(json_object_get(j_user, "source")) || (0 != strcmp(json_string_value(json_object_get(j_user, "source")), "all") && 0 != strcmp(json_string_value(json_object_get(j_user, "source")), "ldap") && 0 != strcmp(json_string_value(json_object_get(j_user, "source")), "database")))) { json_array_append_new(j_return, json_pack("{ss}", "source", "source is an optional string, values available are 'all', 'ldap' or 'database', default is 'database'")); } if (json_object_get(j_user, "name") != NULL && (!json_is_string(json_object_get(j_user, "name")) || json_string_length(json_object_get(j_user, "name")) > 128)) { json_array_append_new(j_return, json_pack("{ss}", "name", "name is an optional string between 0 and 128 characters")); } if (json_object_get(j_user, "email") != NULL && (!json_is_string(json_object_get(j_user, "email")) || json_string_length(json_object_get(j_user, "email")) > 128)) { json_array_append_new(j_return, json_pack("{ss}", "email", "email is an optional string between 0 and 128 characters")); } if (json_object_get(j_user, "additional_property_value") != NULL && json_string_length(json_object_get(j_user, "additional_property_value")) > 512) { json_array_append_new(j_return, json_pack("{ss}", "additional_property_value", "additional_property_value is an optional string between 0 and 512 characters")); } if (json_object_get(j_user, "enabled") != NULL && !json_is_boolean(json_object_get(j_user, "enabled"))) { json_array_append_new(j_return, json_pack("{ss}", "enabled", "enabled is an optional boolean")); } if (add) { if (json_object_get(j_user, "login") == NULL || !json_is_string(json_object_get(j_user, "login")) || json_string_length(json_object_get(j_user, "login")) > 128) { json_array_append_new(j_return, json_pack("{ss}", "login", "login is a mandatory string between 0 and 128 characters")); } else { j_result = get_user(config, json_string_value(json_object_get(j_user, "login")), json_string_value(json_object_get(j_user, "source"))); if (check_result_value(j_result, G_OK)) { char * message = msprintf("login '%s' already exist", json_string_value(json_object_get(j_user, "login"))); json_array_append_new(j_return, json_pack("{ss}", "login", message)); o_free(message); } json_decref(j_result); } if (json_object_get(j_user, "password") != NULL && (!json_is_string(json_object_get(j_user, "password")) || (json_string_length(json_object_get(j_user, "password")) > 0 && json_string_length(json_object_get(j_user, "password")) < 8))) { json_array_append_new(j_return, json_pack("{ss}", "password", "password is a string of at least 8 characters")); } if (config->use_scope) { if (json_object_get(j_user, "scope") == NULL || !json_is_array(json_object_get(j_user, "scope"))) { json_array_append_new(j_return, json_pack("{ss}", "scope", "scope is a mandatory array of scope names")); } else { json_array_foreach(json_object_get(j_user, "scope"), index, j_scope) { if (!json_is_string(j_scope)) { json_array_append_new(j_return, json_pack("{ss}", "scope", "scope name must be a string")); } else { j_result = get_scope(config, json_string_value(j_scope)); if (check_result_value(j_result, G_ERROR_NOT_FOUND)) { char * message = msprintf("scope name '%s' not found", json_string_value(j_scope)); json_array_append_new(j_return, json_pack("{ss}", "scope", message)); o_free(message); } else if (!check_result_value(j_result, G_OK)) { y_log_message(Y_LOG_LEVEL_ERROR, "is_user_valid - Error while checking scope name '%s'", json_string_value(j_scope)); } json_decref(j_result); } } } } } else { if (json_object_get(j_user, "password") != NULL && (!json_is_string(json_object_get(j_user, "password")) || (json_string_length(json_object_get(j_user, "password")) > 0 && json_string_length(json_object_get(j_user, "password")) < 8))) { json_array_append_new(j_return, json_pack("{ss}", "password", "password is a string of at least 8 characters")); } if (config->use_scope) { if (json_object_get(j_user, "scope") != NULL && !json_is_array(json_object_get(j_user, "scope"))) { json_array_append_new(j_return, json_pack("{ss}", "scope", "scope is a mandatory array of scope names")); } else if (json_object_get(j_user, "scope") != NULL) { json_array_foreach(json_object_get(j_user, "scope"), index, j_scope) { if (!json_is_string(j_scope)) { json_array_append_new(j_return, json_pack("{ss}", "scope", "scope name must be a string")); } else { j_result = get_scope(config, json_string_value(j_scope)); if (check_result_value(j_result, G_ERROR_NOT_FOUND)) { char * message = msprintf("scope name '%s' not found", json_string_value(j_scope)); json_array_append_new(j_return, json_pack("{ss}", "scope", message)); o_free(message); } else if (!check_result_value(j_result, G_OK)) { y_log_message(Y_LOG_LEVEL_ERROR, "is_user_valid - Error while checking scope name '%s'", json_string_value(j_scope)); } json_decref(j_result); } } } } } } else { json_array_append_new(j_return, json_pack("{ss}", "user", "user must be a json object")); } } else { y_log_message(Y_LOG_LEVEL_ERROR, "is_user_valid - Error allocating resources for j_result"); } return j_return; } /** * Add a new user */ int add_user(struct config_elements * config, json_t * j_user) { if ((json_object_get(j_user, "source") == NULL || 0 == strcmp("database", json_string_value(json_object_get(j_user, "source")))) && config->has_auth_database) { return add_user_database(config, j_user); } else if (0 == o_strcmp("ldap", json_string_value(json_object_get(j_user, "source"))) && config->has_auth_ldap) { return add_user_ldap(config, j_user); } else { return G_ERROR_PARAM; } } /** * Add a new user in the ldap backend */ int add_user_ldap(struct config_elements * config, json_t * j_user) { LDAP * ldap = NULL; int res; int result; int ldap_version = LDAP_VERSION3; char * ldap_mech = LDAP_SASL_SIMPLE; struct berval cred, * servcred; LDAPMod ** mods = NULL; char ** scope_values = NULL; int nb_scope = 0, nb_attr = 3, i, attr_counter; // Default attributes are objectClass and password json_t * j_scope; size_t index; char * new_dn, * password = NULL; for (i=0; config->auth_ldap->login_property_user_write[i] != NULL; i++) { nb_attr++; } for (i=0; config->auth_ldap->name_property_user_write[i] != NULL; i++) { nb_attr++; } for (i=0; json_object_get(j_user, "email") != NULL && json_string_length(json_object_get(j_user, "email")) > 0 && config->auth_ldap->email_property_user_write[i] != NULL; i++) { nb_attr++; } for (i=0; json_object_get(j_user, "additional_property_value") != NULL && json_string_length(json_object_get(j_user, "additional_property_value")) > 0 && config->auth_ldap->additional_property_value_write[i] != NULL && config->additional_property_name != NULL && o_strlen(config->additional_property_name); i++) { nb_attr++; } for (i=0; config->use_scope && config->auth_ldap->scope_property_user_write[i] != NULL && json_object_get(j_user, "scope") != NULL && json_array_size(json_object_get(j_user, "scope")) > 0; i++) { nb_attr++; } if (config->use_scope && json_object_get(j_user, "scope") != NULL && json_array_size(json_object_get(j_user, "scope")) > 0) { nb_scope = json_array_size(json_object_get(j_user, "scope")); } mods = o_malloc(nb_attr*sizeof(LDAPMod *)); cred.bv_val = config->auth_ldap->bind_passwd; cred.bv_len = strlen(config->auth_ldap->bind_passwd); if (mods == NULL) { y_log_message(Y_LOG_LEVEL_ERROR, "Error allocating resources for mods"); res = G_ERROR; } else if (ldap_initialize(&ldap, config->auth_ldap->uri) != LDAP_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error initializing ldap"); res = G_ERROR; } else if (ldap_set_option(ldap, LDAP_OPT_PROTOCOL_VERSION, &ldap_version) != LDAP_OPT_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error setting ldap protocol version"); res = G_ERROR; } else if ((result = ldap_sasl_bind_s(ldap, config->auth_ldap->bind_dn, ldap_mech, &cred, NULL, NULL, &servcred)) != LDAP_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error binding to ldap server mode %s: %s", ldap_mech, ldap_err2string(result)); res = G_ERROR; } else { int i; new_dn = msprintf("%s=%s,%s", config->auth_ldap->rdn_property_user_write, json_string_value(json_object_get(j_user, "login")), config->auth_ldap->base_search_user); attr_counter = 0; mods[attr_counter] = o_malloc(sizeof(LDAPMod)); mods[attr_counter]->mod_op = LDAP_MOD_ADD; mods[attr_counter]->mod_type = "objectClass"; mods[attr_counter]->mod_values = config->auth_ldap->object_class_user_write; attr_counter++; for (i=0; config->auth_ldap->login_property_user_write[i] != NULL; i++) { mods[attr_counter] = o_malloc(sizeof(LDAPMod)); mods[attr_counter]->mod_values = o_malloc(2 * sizeof(char *)); mods[attr_counter]->mod_op = LDAP_MOD_ADD; mods[attr_counter]->mod_type = config->auth_ldap->login_property_user_write[i]; mods[attr_counter]->mod_values[0] = (char *)json_string_value(json_object_get(j_user, "login")); mods[attr_counter]->mod_values[1] = NULL; attr_counter++; } for (i=0; config->auth_ldap->name_property_user_write[i] != NULL; i++) { mods[attr_counter] = o_malloc(sizeof(LDAPMod)); mods[attr_counter]->mod_values = o_malloc(2 * sizeof(char *)); mods[attr_counter]->mod_op = LDAP_MOD_ADD; mods[attr_counter]->mod_type = config->auth_ldap->name_property_user_write[i]; if (json_object_get(j_user, "name") != NULL && json_string_length(json_object_get(j_user, "name")) > 0) { mods[attr_counter]->mod_values[0] = (char *)json_string_value(json_object_get(j_user, "name")); } else { mods[attr_counter]->mod_values[0] = (char *)json_string_value(json_object_get(j_user, "login")); } mods[attr_counter]->mod_values[1] = NULL; attr_counter++; } for (i=0; json_object_get(j_user, "email") != NULL && json_string_length(json_object_get(j_user, "email")) > 0 && config->auth_ldap->email_property_user_write[i] != NULL; i++) { mods[attr_counter] = o_malloc(sizeof(LDAPMod)); mods[attr_counter]->mod_values = o_malloc(2 * sizeof(char *)); mods[attr_counter]->mod_op = LDAP_MOD_ADD; mods[attr_counter]->mod_type = config->auth_ldap->email_property_user_write[i]; mods[attr_counter]->mod_values[0] = (char *)json_string_value(json_object_get(j_user, "email")); mods[attr_counter]->mod_values[1] = NULL; attr_counter++; } for (i=0; json_object_get(j_user, "additional_property_value") != NULL && json_string_length(json_object_get(j_user, "additional_property_value")) > 0 && config->auth_ldap->additional_property_value_write[i] != NULL && config->additional_property_name != NULL && o_strlen(config->additional_property_name); i++) { mods[attr_counter] = o_malloc(sizeof(LDAPMod)); mods[attr_counter]->mod_values = o_malloc(2 * sizeof(char *)); mods[attr_counter]->mod_op = LDAP_MOD_ADD; mods[attr_counter]->mod_type = config->auth_ldap->additional_property_value_write[i]; mods[attr_counter]->mod_values[0] = (char *)json_string_value(json_object_get(j_user, "additional_property_value")); mods[attr_counter]->mod_values[1] = NULL; attr_counter++; } for (i=0; config->use_scope && config->auth_ldap->scope_property_user_write[i] != NULL && json_object_get(j_user, "scope") != NULL && json_array_size(json_object_get(j_user, "scope")) > 0; i++) { mods[attr_counter] = o_malloc(sizeof(LDAPMod)); mods[attr_counter]->mod_op = LDAP_MOD_ADD; mods[attr_counter]->mod_type = config->auth_ldap->scope_property_user_write[i]; mods[attr_counter]->mod_values = o_realloc(scope_values, (nb_scope+1)*sizeof(char *)); json_array_foreach(json_object_get(j_user, "scope"), index, j_scope) { mods[attr_counter]->mod_values[index] = (char *)json_string_value(j_scope); mods[attr_counter]->mod_values[index+1] = NULL; } attr_counter++; } if (json_object_get(j_user, "password") != NULL) { password = generate_hash(config, config->auth_ldap->password_algorithm_user_write, json_string_value(json_object_get(j_user, "password"))); if (password != NULL) { mods[attr_counter] = o_malloc(sizeof(LDAPMod)); mods[attr_counter]->mod_values = o_malloc(2 * sizeof(char *)); mods[attr_counter]->mod_op = LDAP_MOD_REPLACE; mods[attr_counter]->mod_type = config->auth_ldap->password_property_user_write; mods[attr_counter]->mod_values[0] = password; mods[attr_counter]->mod_values[1] = NULL; attr_counter++; } } mods[attr_counter] = NULL; if ((result = ldap_add_ext_s(ldap, new_dn, mods, NULL, NULL)) != LDAP_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error adding new user %s in the ldap backend: %s", new_dn, ldap_err2string(result)); res = G_ERROR; } else { res = G_OK; } o_free(scope_values); attr_counter=0; o_free(mods[attr_counter]); attr_counter++; for (i=0; config->auth_ldap->login_property_user_write[i] != NULL; i++) { o_free(mods[attr_counter]->mod_values); o_free(mods[attr_counter]); attr_counter++; } for (i=0; config->auth_ldap->name_property_user_write[i] != NULL; i++) { o_free(mods[attr_counter]->mod_values); o_free(mods[attr_counter]); attr_counter++; } for (i=0; json_object_get(j_user, "email") != NULL && json_string_length(json_object_get(j_user, "email")) > 0 && config->auth_ldap->email_property_user_write[i] != NULL; i++) { o_free(mods[attr_counter]->mod_values); o_free(mods[attr_counter]); attr_counter++; } for (i=0; json_object_get(j_user, "additional_property_value") != NULL && json_string_length(json_object_get(j_user, "additional_property_value")) > 0 && config->auth_ldap->additional_property_value_write[i] != NULL && config->additional_property_name != NULL && o_strlen(config->additional_property_name); i++) { o_free(mods[attr_counter]->mod_values); o_free(mods[attr_counter]); attr_counter++; } for (i=0; config->use_scope && config->auth_ldap->scope_property_user_write[i] != NULL && json_object_get(j_user, "scope") != NULL && json_array_size(json_object_get(j_user, "scope")) > 0; i++) { o_free(mods[attr_counter]->mod_values); o_free(mods[attr_counter]); attr_counter++; } if (json_object_get(j_user, "password") != NULL && json_string_length(json_object_get(j_user, "password")) > 0) { o_free(mods[attr_counter]->mod_values); o_free(mods[attr_counter]); attr_counter++; } o_free(mods); o_free(new_dn); o_free(password); } ldap_unbind_ext(ldap, NULL, NULL); return res; } /** * Add a new user in the database backend */ int add_user_database(struct config_elements * config, json_t * j_user) { json_t * j_query, * j_scope; int res, to_return; size_t index; char * clause_login, * clause_scope, * escaped, * password; if (config->conn->type == HOEL_DB_TYPE_MARIADB) { escaped = h_escape_string(config->conn, json_string_value(json_object_get(j_user, "password"))); password = msprintf("PASSWORD('%s')", escaped); } else { escaped = generate_hash(config, config->hash_algorithm,json_string_value(json_object_get(j_user, "password"))); password = msprintf("'%s'", escaped); } j_query = json_pack("{sss{sssssss{ss}si}}", "table", GLEWLWYD_TABLE_USER, "values", "gu_name", json_object_get(j_user, "name")!=NULL?json_string_value(json_object_get(j_user, "name")):"", "gu_email", json_object_get(j_user, "email")!=NULL?json_string_value(json_object_get(j_user, "email")):"", "gu_login", json_string_value(json_object_get(j_user, "login")), "gu_password", "raw", password, "gu_enabled", json_object_get(j_user, "enabled")==json_false()?0:1); if (config->additional_property_name != NULL && o_strlen(config->additional_property_name)) { json_object_set(json_object_get(j_query, "values"), "gu_additional_property_value", json_object_get(j_user, "additional_property_value")!=NULL?json_object_get(j_user, "additional_property_value"):json_null()); } res = h_insert(config->conn, j_query, NULL); json_decref(j_query); o_free(escaped); o_free(password); if (res == H_OK) { if (json_object_get(j_user, "scope") != NULL && config->use_scope) { escaped = h_escape_string(config->conn, json_string_value(json_object_get(j_user, "login"))); clause_login = msprintf("(SELECT `gu_id` FROM `%s` WHERE `gu_login`='%s')", GLEWLWYD_TABLE_USER, escaped); o_free(escaped); j_query = json_pack("{sss[]}", "table", GLEWLWYD_TABLE_USER_SCOPE, "values"); json_array_foreach(json_object_get(j_user, "scope"), index, j_scope) { escaped = h_escape_string(config->conn, json_string_value(j_scope)); clause_scope = msprintf("(SELECT `gs_id` FROM `%s` WHERE `gs_name`='%s')", GLEWLWYD_TABLE_SCOPE, escaped); o_free(escaped); json_array_append_new(json_object_get(j_query, "values"), json_pack("{s{ss}s{ss}}", "gu_id", "raw", clause_login, "gs_id", "raw", clause_scope)); o_free(clause_scope); } if (json_array_size(json_object_get(j_query, "values")) > 0) { if (h_insert(config->conn, j_query, NULL) != H_OK) { y_log_message(Y_LOG_LEVEL_ERROR, "add_user_database - Error adding scope"); } } o_free(clause_login); json_decref(j_query); } to_return = G_OK; } else { y_log_message(Y_LOG_LEVEL_ERROR, "add_user_database - Error adding user"); to_return = G_ERROR_DB; } return to_return; } /** * Update an existing user */ int set_user(struct config_elements * config, const char * user, json_t * j_user, const char * source) { if (source == NULL || 0 == strcmp("ldap", source) || 0 == strcmp("all", source)) { return set_user_ldap(config, user, j_user); } else { return set_user_database(config, user, j_user); } } /** * Update an existing user in the ldap backend */ int set_user_ldap(struct config_elements * config, const char * user, json_t * j_user) { LDAP * ldap = NULL; int res; int result; int ldap_version = LDAP_VERSION3; char * ldap_mech = LDAP_SASL_SIMPLE; struct berval cred, * servcred; LDAPMod ** mods = NULL; char ** scope_values = NULL; int nb_scope = 0, nb_attr = 2, i, attr_counter; json_t * j_scope; size_t index; char * cur_dn, * password = NULL; for (i=0; json_object_get(j_user, "name") != NULL && json_string_length(json_object_get(j_user, "name")) > 0 && config->auth_ldap->name_property_user_write[i] != NULL; i++) { nb_attr++; } for (i=0; json_object_get(j_user, "email") != NULL && json_string_length(json_object_get(j_user, "email")) > 0 && config->auth_ldap->email_property_user_write[i] != NULL; i++) { nb_attr++; } for (i=0; json_object_get(j_user, "additional_property_value") != NULL && json_string_length(json_object_get(j_user, "additional_property_value")) > 0 && config->auth_ldap->additional_property_value_write[i] != NULL && config->additional_property_name != NULL && o_strlen(config->additional_property_name); i++) { nb_attr++; } for (i=0; config->use_scope && config->auth_ldap->scope_property_user_write[i] != NULL && json_object_get(j_user, "scope") != NULL && json_array_size(json_object_get(j_user, "scope")) > 0; i++) { nb_attr++; } if (config->use_scope && json_object_get(j_user, "scope") != NULL) { nb_scope = json_array_size(json_object_get(j_user, "scope")); } mods = o_malloc(nb_attr*sizeof(LDAPMod *)); cred.bv_val = config->auth_ldap->bind_passwd; cred.bv_len = strlen(config->auth_ldap->bind_passwd); if (mods == NULL) { y_log_message(Y_LOG_LEVEL_ERROR, "Error allocating resources for mods"); res = G_ERROR; } else if (ldap_initialize(&ldap, config->auth_ldap->uri) != LDAP_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error initializing ldap"); res = G_ERROR; } else if (ldap_set_option(ldap, LDAP_OPT_PROTOCOL_VERSION, &ldap_version) != LDAP_OPT_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error setting ldap protocol version"); res = G_ERROR; } else if ((result = ldap_sasl_bind_s(ldap, config->auth_ldap->bind_dn, ldap_mech, &cred, NULL, NULL, &servcred)) != LDAP_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error binding to ldap server mode %s: %s", ldap_mech, ldap_err2string(result)); res = G_ERROR; } else { cur_dn = msprintf("%s=%s,%s", config->auth_ldap->rdn_property_user_write, user, config->auth_ldap->base_search_user); attr_counter = 0; for (i=0; json_object_get(j_user, "name") != NULL && json_string_length(json_object_get(j_user, "name")) > 0 && config->auth_ldap->name_property_user_write[i] != NULL; i++) { mods[attr_counter] = o_malloc(sizeof(LDAPMod)); mods[attr_counter]->mod_values = o_malloc(2 * sizeof(char *)); mods[attr_counter]->mod_op = LDAP_MOD_REPLACE; mods[attr_counter]->mod_type = config->auth_ldap->name_property_user_write[i]; mods[attr_counter]->mod_values[0] = (char *)json_string_value(json_object_get(j_user, "name")); mods[attr_counter]->mod_values[1] = NULL; attr_counter++; } for (i=0; json_object_get(j_user, "email") != NULL && json_string_length(json_object_get(j_user, "email")) > 0 && config->auth_ldap->email_property_user_write[i] != NULL; i++) { mods[attr_counter] = o_malloc(sizeof(LDAPMod)); mods[attr_counter]->mod_values = o_malloc(2 * sizeof(char *)); mods[attr_counter]->mod_op = LDAP_MOD_REPLACE; mods[attr_counter]->mod_type = config->auth_ldap->email_property_user_write[i]; mods[attr_counter]->mod_values[0] = (char *)json_string_value(json_object_get(j_user, "email")); mods[attr_counter]->mod_values[1] = NULL; attr_counter++; } for (i=0; json_object_get(j_user, "additional_property_value") != NULL && json_string_length(json_object_get(j_user, "additional_property_value")) > 0 && config->auth_ldap->additional_property_value_write[i] != NULL && config->additional_property_name != NULL && o_strlen(config->additional_property_name); i++) { mods[attr_counter] = o_malloc(sizeof(LDAPMod)); mods[attr_counter]->mod_values = o_malloc(2 * sizeof(char *)); mods[attr_counter]->mod_op = LDAP_MOD_ADD; mods[attr_counter]->mod_type = config->auth_ldap->additional_property_value_write[i]; mods[attr_counter]->mod_values[0] = (char *)json_string_value(json_object_get(j_user, "additional_property_value")); mods[attr_counter]->mod_values[1] = NULL; attr_counter++; } for (i=0; config->use_scope && config->auth_ldap->scope_property_user_write[i] != NULL && json_object_get(j_user, "scope") != NULL && json_array_size(json_object_get(j_user, "scope")) > 0; i++) { mods[attr_counter] = o_malloc(sizeof(LDAPMod)); mods[attr_counter]->mod_op = LDAP_MOD_REPLACE; mods[attr_counter]->mod_type = config->auth_ldap->scope_property_user_write[i]; mods[attr_counter]->mod_values = o_realloc(scope_values, (nb_scope+1)*sizeof(char *)); json_array_foreach(json_object_get(j_user, "scope"), index, j_scope) { mods[attr_counter]->mod_values[index] = (char *)json_string_value(j_scope); mods[attr_counter]->mod_values[index+1] = NULL; } attr_counter++; } if (json_object_get(j_user, "password") != NULL) { password = generate_hash(config, config->auth_ldap->password_algorithm_user_write, json_string_value(json_object_get(j_user, "password"))); if (password != NULL) { mods[attr_counter] = o_malloc(sizeof(LDAPMod)); mods[attr_counter]->mod_values = o_malloc(2 * sizeof(char *)); mods[attr_counter]->mod_op = LDAP_MOD_REPLACE; mods[attr_counter]->mod_type = config->auth_ldap->password_property_user_write; mods[attr_counter]->mod_values[0] = password; mods[attr_counter]->mod_values[1] = NULL; attr_counter++; } } mods[attr_counter] = NULL; if ((result = ldap_modify_ext_s(ldap, cur_dn, mods, NULL, NULL)) != LDAP_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error setting new user %s in the ldap backend: %s", cur_dn, ldap_err2string(result)); res = G_ERROR; } else { res = G_OK; } o_free(scope_values); attr_counter = 0; for (i=0; json_object_get(j_user, "name") != NULL && json_string_length(json_object_get(j_user, "name")) > 0 && config->auth_ldap->name_property_user_write[i] != NULL; i++) { o_free(mods[attr_counter]->mod_values); o_free(mods[attr_counter]); attr_counter++; } for (i=0; json_object_get(j_user, "email") != NULL && json_string_length(json_object_get(j_user, "email")) > 0 && config->auth_ldap->email_property_user_write[i] != NULL; i++) { o_free(mods[attr_counter]->mod_values); o_free(mods[attr_counter]); attr_counter++; } for (i=0; json_object_get(j_user, "additional_property_value") != NULL && json_string_length(json_object_get(j_user, "additional_property_value")) > 0 && config->auth_ldap->additional_property_value_write[i] != NULL && config->additional_property_name != NULL && o_strlen(config->additional_property_name); i++) { o_free(mods[attr_counter]->mod_values); o_free(mods[attr_counter]); attr_counter++; } for (i=0; config->use_scope && config->auth_ldap->scope_property_user_write[i] != NULL && json_object_get(j_user, "scope") != NULL && json_array_size(json_object_get(j_user, "scope")) > 0; i++) { o_free(mods[attr_counter]->mod_values); o_free(mods[attr_counter]); attr_counter++; } if (json_object_get(j_user, "password") != NULL) { o_free(mods[attr_counter]->mod_values); o_free(mods[attr_counter]); attr_counter++; } o_free(mods); o_free(cur_dn); o_free(password); } ldap_unbind_ext(ldap, NULL, NULL); return res; } /** * Update an existing user in the database backend */ int set_user_database(struct config_elements * config, const char * user, json_t * j_user) { json_t * j_query, * j_scope; int res, to_return; size_t index; char * clause_login, * clause_scope, * escaped, * password; j_query = json_pack("{sss{}s{ss}}", "table", GLEWLWYD_TABLE_USER, "set", "where", "gu_login", user); if (json_object_get(j_user, "name") != NULL) { json_object_set(json_object_get(j_query, "set"), "gu_name", json_object_get(j_user, "name")); } if (json_object_get(j_user, "email") != NULL) { json_object_set(json_object_get(j_query, "set"), "gu_email", json_object_get(j_user, "email")); } if (json_object_get(j_user, "password") != NULL) { if (config->conn->type == HOEL_DB_TYPE_MARIADB) { escaped = h_escape_string(config->conn, json_string_value(json_object_get(j_user, "password"))); password = msprintf("PASSWORD('%s')", escaped); } else { escaped = generate_hash(config, config->hash_algorithm, json_string_value(json_object_get(j_user, "password"))); password = msprintf("'%s'", escaped); } json_object_set_new(json_object_get(j_query, "set"), "gu_password", json_pack("{ss}", "raw", password)); o_free(password); o_free(escaped); } if (json_object_get(j_user, "additional_property_value") != NULL && config->additional_property_name != NULL && o_strlen(config->additional_property_name)) { json_object_set(json_object_get(j_query, "set"), "gu_additional_property_value", json_object_get(j_user, "additional_property_value")); } if (json_object_get(j_user, "enabled") != NULL) { json_object_set_new(json_object_get(j_query, "set"), "gu_enabled", json_object_get(j_user, "enabled")==json_false()?json_integer(0):json_integer(1)); } res = h_update(config->conn, j_query, NULL); json_decref(j_query); if (res == H_OK) { if (json_object_get(j_user, "scope") != NULL && config->use_scope) { escaped = h_escape_string(config->conn, user); clause_login = msprintf("= (SELECT `gu_id` FROM `%s` WHERE `gu_login`='%s')", GLEWLWYD_TABLE_USER, escaped); o_free(escaped); j_query = json_pack("{sss{s{ssss}}}", "table", GLEWLWYD_TABLE_USER_SCOPE, "where", "gu_id", "operator", "raw", "value", clause_login); o_free(clause_login); res = h_delete(config->conn, j_query, NULL); json_decref(j_query); if (res == H_OK) { escaped = h_escape_string(config->conn, user); clause_login = msprintf("(SELECT `gu_id` FROM `%s` WHERE `gu_login`='%s')", GLEWLWYD_TABLE_USER, escaped); o_free(escaped); j_query = json_pack("{sss[]}", "table", GLEWLWYD_TABLE_USER_SCOPE, "values"); json_array_foreach(json_object_get(j_user, "scope"), index, j_scope) { escaped = h_escape_string(config->conn, json_string_value(j_scope)); clause_scope = msprintf("(SELECT `gs_id` FROM `%s` WHERE `gs_name`='%s')", GLEWLWYD_TABLE_SCOPE, escaped); o_free(escaped); json_array_append_new(json_object_get(j_query, "values"), json_pack("{s{ss}s{ss}}", "gu_id", "raw", clause_login, "gs_id", "raw", clause_scope)); o_free(clause_scope); } if (json_array_size(json_object_get(j_query, "values")) > 0) { if (h_insert(config->conn, j_query, NULL) != H_OK) { y_log_message(Y_LOG_LEVEL_ERROR, "set_user_database - Error adding scope"); } } json_decref(j_query); } else { y_log_message(Y_LOG_LEVEL_ERROR, "set_user_database - Error deleting old scope"); } } to_return = G_OK; } else { y_log_message(Y_LOG_LEVEL_ERROR, "set_user_database - Error updating user"); to_return = G_ERROR_DB; } return to_return; } /** * Delete an existing user */ int delete_user(struct config_elements * config, const char * user, const char * source) { if (source == NULL || 0 == strcmp("ldap", source) || 0 == strcmp("all", source)) { return delete_user_ldap(config, user); } else { return delete_user_database(config, user); } } /** * Delete an existing user in the ldap backend */ int delete_user_ldap(struct config_elements * config, const char * user) { LDAP * ldap = NULL; int res; int result; int ldap_version = LDAP_VERSION3; char * ldap_mech = LDAP_SASL_SIMPLE; struct berval cred, * servcred; char * cur_dn; cred.bv_val = config->auth_ldap->bind_passwd; cred.bv_len = strlen(config->auth_ldap->bind_passwd); if (ldap_initialize(&ldap, config->auth_ldap->uri) != LDAP_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error initializing ldap"); res = G_ERROR; } else if (ldap_set_option(ldap, LDAP_OPT_PROTOCOL_VERSION, &ldap_version) != LDAP_OPT_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error setting ldap protocol version"); res = G_ERROR; } else if ((result = ldap_sasl_bind_s(ldap, config->auth_ldap->bind_dn, ldap_mech, &cred, NULL, NULL, &servcred)) != LDAP_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error binding to ldap server mode %s: %s", ldap_mech, ldap_err2string(result)); res = G_ERROR; } else { cur_dn = msprintf("%s=%s,%s", config->auth_ldap->rdn_property_user_write, user, config->auth_ldap->base_search_user); if ((result = ldap_delete_ext_s(ldap, cur_dn, NULL, NULL)) != LDAP_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error deleting user %s in the ldap backend: %s", cur_dn, ldap_err2string(result)); res = G_ERROR; } else { res = G_OK; } o_free(cur_dn); } ldap_unbind_ext(ldap, NULL, NULL); return res; } /** * Delete an existing user in the database backend */ int delete_user_database(struct config_elements * config, const char * user) { json_t * j_query; int res; j_query = json_pack("{sss{ss}}", "table", GLEWLWYD_TABLE_USER, "where", "gu_login", user); res = h_delete(config->conn, j_query, NULL); json_decref(j_query); if (res == H_OK) { return G_OK; } else { y_log_message(Y_LOG_LEVEL_ERROR, "delete_user_database - Error deleting user"); return G_ERROR_DB; } } /** * Check if the user profile parameters are valid */ json_t * is_user_profile_valid(struct config_elements * config, const char * username, json_t * profile) { json_t * j_return = json_array(), * j_user; if (j_return != NULL) { if (profile == NULL || !json_is_object(profile)) { json_array_append_new(j_return, json_pack("{ss}", "profile", "profile must be a json object")); } else { if (json_object_get(profile, "name") != NULL && (!json_is_string(json_object_get(profile, "name")) || json_string_length(json_object_get(profile, "name")) > 512 || json_string_length(json_object_get(profile, "name")) < 1)) { json_array_append_new(j_return, json_pack("{ss}", "name", "name is an optional string between 1 and 512 characters")); } if (json_object_get(profile, "new_password") != NULL && !json_is_string(json_object_get(profile, "new_password")) && json_string_length(json_object_get(profile, "new_password")) > 0) { json_array_append_new(j_return, json_pack("{ss}", "new_password", "new_password must be a non empty string")); } if (json_object_get(profile, "old_password") != NULL && !json_is_string(json_object_get(profile, "old_password")) && json_string_length(json_object_get(profile, "old_password")) > 0) { json_array_append_new(j_return, json_pack("{ss}", "old_password", "old_password must be a non empty string")); } if (json_object_get(profile, "new_password") != NULL && json_object_get(profile, "old_password") == NULL) { json_array_append_new(j_return, json_pack("{ss}", "new_password", "old_password is mandatory to set a new password")); } else if (json_object_get(profile, "new_password") != NULL && json_object_get(profile, "old_password") != NULL) { j_user = auth_check_user_credentials(config, username, json_string_value(json_object_get(profile, "old_password"))); if (check_result_value(j_user, G_ERROR_UNAUTHORIZED)) { json_array_append_new(j_return, json_pack("{ss}", "old_password", "old_password does not match")); } json_decref(j_user); if (json_string_length(json_object_get(profile, "new_password")) < 8) { json_array_append_new(j_return, json_pack("{ss}", "new_password", "new_password must be at least 8 characters")); } } if (json_object_get(profile, "name") == NULL && json_object_get(profile, "new_password") == NULL) { json_array_append_new(j_return, json_pack("{ss}", "profile", "you must update at least one value")); } } } else { y_log_message(Y_LOG_LEVEL_ERROR, "is_user_profile_valid - Error allocating resources for j_return"); } return j_return; } /** * Updates a user profile */ int set_user_profile(struct config_elements * config, const char * username, json_t * profile) { json_t * j_user = get_user(config, username, NULL); int res; if (check_result_value(j_user, G_OK)) { if (o_strcmp(json_string_value(json_object_get(json_object_get(j_user, "user"), "source")), "ldap") == 0) { res = set_user_profile_ldap(config, username, profile); } else { res = set_user_profile_database(config, username, profile); } } else { y_log_message(Y_LOG_LEVEL_ERROR, "set_user_profile - Error getting j_user"); res = G_ERROR; } json_decref(j_user); return res; } /** * Updates a user profile in the ldap backend */ int set_user_profile_ldap(struct config_elements * config, const char * username, json_t * profile) { LDAP * ldap = NULL; int res; int result; int ldap_version = LDAP_VERSION3; char * ldap_mech = LDAP_SASL_SIMPLE; struct berval cred, * servcred; LDAPMod ** mods = NULL; char ** scope_values = NULL; int nb_attr = 2, i, attr_counter; char * cur_dn, * password = NULL; for (i=0; json_object_get(profile, "name") != NULL && config->auth_ldap->name_property_user_write[i] != NULL; i++) { nb_attr++; } if (json_object_get(profile, "new_password") != NULL) { nb_attr++; } mods = o_malloc(nb_attr*sizeof(LDAPMod *)); cred.bv_val = config->auth_ldap->bind_passwd; cred.bv_len = strlen(config->auth_ldap->bind_passwd); if (mods == NULL) { y_log_message(Y_LOG_LEVEL_ERROR, "Error allocating resources for mods"); res = G_ERROR; } else if (ldap_initialize(&ldap, config->auth_ldap->uri) != LDAP_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error initializing ldap"); res = G_ERROR; } else if (ldap_set_option(ldap, LDAP_OPT_PROTOCOL_VERSION, &ldap_version) != LDAP_OPT_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error setting ldap protocol version"); res = G_ERROR; } else if ((result = ldap_sasl_bind_s(ldap, config->auth_ldap->bind_dn, ldap_mech, &cred, NULL, NULL, &servcred)) != LDAP_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error binding to ldap server mode %s: %s", ldap_mech, ldap_err2string(result)); res = G_ERROR; } else { cur_dn = msprintf("%s=%s,%s", config->auth_ldap->rdn_property_user_write, username, config->auth_ldap->base_search_user); attr_counter = 0; for (i=0; json_object_get(profile, "name") != NULL && config->auth_ldap->name_property_user_write[i] != NULL; i++) { mods[attr_counter] = o_malloc(sizeof(LDAPMod)); mods[attr_counter]->mod_values = o_malloc(2 * sizeof(char *)); mods[attr_counter]->mod_op = LDAP_MOD_REPLACE; mods[attr_counter]->mod_type = config->auth_ldap->name_property_user_write[i]; mods[attr_counter]->mod_values[0] = (char *)json_string_value(json_object_get(profile, "name")); mods[attr_counter]->mod_values[1] = NULL; attr_counter++; } if (json_object_get(profile, "new_password") != NULL) { password = generate_hash(config, config->auth_ldap->password_algorithm_user_write, json_string_value(json_object_get(profile, "new_password"))); if (password != NULL) { mods[attr_counter] = o_malloc(sizeof(LDAPMod)); mods[attr_counter]->mod_values = o_malloc(2 * sizeof(char *)); mods[attr_counter]->mod_op = LDAP_MOD_REPLACE; mods[attr_counter]->mod_type = config->auth_ldap->password_property_user_write; mods[attr_counter]->mod_values[0] = password; mods[attr_counter]->mod_values[1] = NULL; attr_counter++; } } mods[attr_counter] = NULL; if ((result = ldap_modify_ext_s(ldap, cur_dn, mods, NULL, NULL)) != LDAP_SUCCESS) { y_log_message(Y_LOG_LEVEL_ERROR, "Error setting user %s in the ldap backend: %s", cur_dn, ldap_err2string(result)); res = G_ERROR; } else { res = G_OK; } o_free(scope_values); attr_counter = 0; for (i=0; json_object_get(profile, "name") != NULL && config->auth_ldap->name_property_user_write[i] != NULL; i++) { o_free(mods[attr_counter]->mod_values); o_free(mods[attr_counter]); attr_counter++; } if (json_object_get(profile, "new_password") != NULL) { o_free(mods[attr_counter]->mod_values); o_free(mods[attr_counter]); attr_counter++; } o_free(mods); o_free(cur_dn); o_free(password); } ldap_unbind_ext(ldap, NULL, NULL); return res; } /** * Updates a user profile in the database backend */ int set_user_profile_database(struct config_elements * config, const char * username, json_t * profile) { json_t * j_query; int res, to_return; char * escaped, * password; j_query = json_pack("{sss{}s{ss}}", "table", GLEWLWYD_TABLE_USER, "set", "where", "gu_login", username); if (json_object_get(profile, "name") != NULL) { json_object_set(json_object_get(j_query, "set"), "gu_name", json_object_get(profile, "name")); } if (json_object_get(profile, "new_password") != NULL) { if (config->conn->type == HOEL_DB_TYPE_MARIADB) { escaped = h_escape_string(config->conn, json_string_value(json_object_get(profile, "new_password"))); password = msprintf("PASSWORD('%s')", escaped); } else { escaped = generate_hash(config, config->hash_algorithm, json_string_value(json_object_get(profile, "new_password"))); password = msprintf("'%s'", escaped); } if (password != NULL) { json_object_set_new(json_object_get(j_query, "set"), "gu_password", json_pack("{ss}", "raw", password)); } else { y_log_message(Y_LOG_LEVEL_ERROR, "set_user_profile_database - Error generating password hash"); } o_free(password); o_free(escaped); } res = h_update(config->conn, j_query, NULL); json_decref(j_query); if (res == H_OK) { to_return = G_OK; } else { y_log_message(Y_LOG_LEVEL_ERROR, "set_user_profile_database - Error updating user"); to_return = G_ERROR_DB; } return to_return; } /** * Sends a reset password email to the specified user */ int send_reset_user_profile_email(struct config_elements * config, const char * username, const char * ip_source) { json_t * j_user = get_user(config, username, NULL); char * mail_subject, * mail_body, * tmp, * token = NULL; int res; if (check_result_value(j_user, G_OK) && json_object_get(json_object_get(j_user, "user"), "email") != NULL && json_string_length(json_object_get(json_object_get(j_user, "user"), "email")) > 0) { mail_subject = str_replace(config->reset_password_config->email_subject, "$USERNAME", username); token = generate_user_reset_password_token(config, username, ip_source); if (token != NULL) { mail_body = str_replace(config->reset_password_config->email_template, "$URL", config->reset_password_config->page_url_prefix); tmp = str_replace(mail_body, "$USERNAME", username); o_free(mail_body); mail_body = tmp; tmp = str_replace(mail_body, "$TOKEN", token); o_free(mail_body); mail_body = tmp; if (ulfius_send_smtp_email(config->reset_password_config->smtp_host, config->reset_password_config->smtp_port, config->reset_password_config->smtp_use_tls, config->reset_password_config->smtp_verify_certificate, config->reset_password_config->smtp_user, config->reset_password_config->smtp_password, config->reset_password_config->email_from, json_string_value(json_object_get(json_object_get(j_user, "user"), "email")), NULL, NULL, mail_subject, mail_body) != U_OK) { y_log_message(Y_LOG_LEVEL_ERROR, "send_reset_user_profile_email - Error sending reset email"); res = G_ERROR_PARAM; } else { res = G_OK; } o_free(mail_body); o_free(mail_subject); } else { y_log_message(Y_LOG_LEVEL_ERROR, "send_reset_user_profile_email - Error generating token"); res = G_ERROR; } o_free(token); } else { y_log_message(Y_LOG_LEVEL_ERROR, "send_reset_user_profile_email - Error getting user"); res = G_ERROR; } json_decref(j_user); return res; } /** * Check if the reset token is valid for the specified user */ int is_reset_user_profile_valid(struct config_elements * config, const char * username, const char * token, const char * password) { json_t * j_query, * j_result; int res, to_return; char * token_hash, * col_grp_issued_at, * clause_grp_issued_at; if (token != NULL && password != NULL && strlen(password) >= 8) { token_hash = generate_hash(config, config->hash_algorithm, token); if (config->conn->type == HOEL_DB_TYPE_MARIADB) { col_grp_issued_at = o_strdup("UNIX_TIMESTAMP(`grp_issued_at`)"); clause_grp_issued_at = msprintf("> (UNIX_TIMESTAMP(NOW()) - %d)", config->reset_password_config->token_expiration); } else { col_grp_issued_at = o_strdup("grp_issued_at"); clause_grp_issued_at = msprintf("> (strftime('%%s','now') - %d)", config->reset_password_config->token_expiration); } j_query = json_pack("{sss{sssssis{ssss}}}", "table", GLEWLWYD_TABLE_RESET_PASSWORD, "where", "grp_username", username, "grp_token", token_hash, "grp_enabled", 1, col_grp_issued_at, "operator", "raw", "value", clause_grp_issued_at); o_free(col_grp_issued_at); o_free(clause_grp_issued_at); o_free(token_hash); res = h_select(config->conn, j_query, &j_result, NULL); json_decref(j_query); if (res == H_OK) { if (json_array_size(j_result) > 0) { to_return = G_OK; } else { to_return = G_ERROR_NOT_FOUND; } } else { y_log_message(Y_LOG_LEVEL_ERROR, "is_reset_user_profile_valid - Error executing j_query"); to_return = G_ERROR_DB; } json_decref(j_result); } else { to_return = G_ERROR_PARAM; } return to_return; } /** * Updates the user password */ int reset_user_profile(struct config_elements * config, const char * username, const char * token, const char * password) { json_t * j_query, * j_user, * j_profile; int res, to_return; char * token_hash = generate_hash(config, config->hash_algorithm, token); j_user = get_user(config, username, NULL); if (token_hash != NULL && check_result_value(j_user, G_OK)) { j_query = json_pack("{sss{sis{ss}}s{ssss}}", "table", GLEWLWYD_TABLE_RESET_PASSWORD, "set", "grp_enabled", 0, "grp_reset_at", "raw", (config->conn->type==HOEL_DB_TYPE_MARIADB?"NOW()":"strftime('%s','now')"), "where", "grp_username", username, "grp_token", token_hash); res = h_update(config->conn, j_query, NULL); json_decref(j_query); if (res == H_OK) { j_profile = json_pack("{ss}", "password", password); to_return = set_user(config, username, j_profile, json_string_value(json_object_get(json_object_get(j_user, "user"), "source"))); json_decref(j_profile); } else { y_log_message(Y_LOG_LEVEL_ERROR, "reset_user_profile - Error executing j_query"); to_return = G_ERROR_DB; } } else { y_log_message(Y_LOG_LEVEL_ERROR, "reset_user_profile - Error generating token_hash"); to_return = G_ERROR; } o_free(token_hash); json_decref(j_user); return to_return; } glewlwyd-1.3.1/src/webservice.c000066400000000000000000001663141322667720100164640ustar00rootroot00000000000000/** * * Glewlwyd OAuth2 Authorization Server * * OAuth2 authentiation server * Users are authenticated with a LDAP server * or users stored in the database * Provides Json Web Tokens (jwt) * * Callback functions definition * * Copyright 2016-2017 Nicolas Mora * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU GENERAL PUBLIC LICENSE * License as published by the Free Software Foundation; * version 3 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU GENERAL PUBLIC LICENSE for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see . * */ #include #include "glewlwyd.h" /** * authorization endpoint * handles the following response_types: * - code * - token * POST and GET methods only */ int callback_glewlwyd_authorization (const struct _u_request * request, struct _u_response * response, void * user_data) { const char * response_type = u_map_get(request->map_url, "response_type"); int result = U_CALLBACK_CONTINUE; char * redirect_url; if (0 == o_strcmp("code", response_type)) { if (0 == o_strcasecmp("GET", request->http_verb) && is_authorization_type_enabled((struct config_elements *)user_data, GLEWLWYD_AUHORIZATION_TYPE_CODE) == G_OK && u_map_get(request->map_url, "redirect_uri") != NULL) { result = check_auth_type_auth_code_grant(request, response, user_data); } else { if (u_map_get(request->map_url, "redirect_uri") != NULL) { response->status = 302; redirect_url = msprintf("%s#error=unsupported_response_type%s%s", u_map_get(request->map_url, "redirect_uri"), (u_map_get(request->map_url, "state")!=NULL?"&state=":""), (u_map_get(request->map_url, "state")!=NULL?u_map_get(request->map_url, "state"):"")); ulfius_add_header_to_response(response, "Location", redirect_url); o_free(redirect_url); } else { response->status = 403; } } } else if (0 == o_strcmp("token", response_type)) { if (0 == o_strcasecmp("GET", request->http_verb) && is_authorization_type_enabled((struct config_elements *)user_data, GLEWLWYD_AUHORIZATION_TYPE_IMPLICIT) == G_OK && u_map_get(request->map_url, "redirect_uri") != NULL) { result = check_auth_type_implicit_grant(request, response, user_data); } else { if (u_map_get(request->map_url, "redirect_uri") != NULL) { response->status = 302; redirect_url = msprintf("%s#error=unsupported_response_type%s%s", u_map_get(request->map_url, "redirect_uri"), (u_map_get(request->map_url, "state")!=NULL?"&state=":""), (u_map_get(request->map_url, "state")!=NULL?u_map_get(request->map_url, "state"):"")); ulfius_add_header_to_response(response, "Location", redirect_url); o_free(redirect_url); } else { response->status = 403; } } } else { if (u_map_get(request->map_url, "redirect_uri") != NULL) { response->status = 302; redirect_url = msprintf("%s#error=unsupported_response_type%s%s", u_map_get(request->map_url, "redirect_uri"), (u_map_get(request->map_url, "state")!=NULL?"&state=":""), (u_map_get(request->map_url, "state")!=NULL?u_map_get(request->map_url, "state"):"")); ulfius_add_header_to_response(response, "Location", redirect_url); o_free(redirect_url); } else { if (response_type != NULL) { y_log_message(Y_LOG_LEVEL_ERROR, "response_type %s unknown", response_type); } else { y_log_message(Y_LOG_LEVEL_ERROR, "response_type is NULL"); } response->status = 400; } } return result; } /** * Token endpoint * Handles the following response_types: * - authorization_code * - password * - client_credentials * - refresh_token * - delete_token * POST method only */ int callback_glewlwyd_token (const struct _u_request * request, struct _u_response * response, void * user_data) { const char * grant_type = u_map_get(request->map_post_body, "grant_type"); int result = U_CALLBACK_CONTINUE; if (0 == o_strcmp("authorization_code", grant_type)) { if (is_authorization_type_enabled((struct config_elements *)user_data, GLEWLWYD_AUHORIZATION_TYPE_AUTHORIZATION_CODE) == G_OK) { result = check_auth_type_access_token_request(request, response, user_data); } else { response->status = 403; } } else if (0 == o_strcmp("password", grant_type)) { if (0 == o_strcasecmp("POST", request->http_verb) && is_authorization_type_enabled((struct config_elements *)user_data, GLEWLWYD_AUHORIZATION_TYPE_RESOURCE_OWNER_PASSWORD_CREDENTIALS) == G_OK) { result = check_auth_type_resource_owner_pwd_cred(request, response, user_data); } else { response->status = 403; } } else if (0 == o_strcmp("client_credentials", grant_type)) { if (is_authorization_type_enabled((struct config_elements *)user_data, GLEWLWYD_AUHORIZATION_TYPE_CLIENT_CREDENTIALS) == G_OK) { result = check_auth_type_client_credentials_grant(request, response, user_data); } else { response->status = 403; } } else if (0 == o_strcmp("refresh_token", grant_type)) { result = get_access_token_from_refresh(request, response, user_data); } else if (0 == o_strcmp("delete_token", grant_type)) { result = delete_refresh_token(request, response, user_data); } else { if (grant_type != NULL) { y_log_message(Y_LOG_LEVEL_ERROR, "grant_type %s unknown", grant_type); } else { y_log_message(Y_LOG_LEVEL_ERROR, "grant_type is NULL"); } response->status = 400; } return result; } /** * User authorization endpoint * Validates the user/password * then if user is valid, stores a cookie */ int callback_glewlwyd_validate_user_session (const struct _u_request * request, struct _u_response * response, void * user_data) { struct config_elements * config = (struct config_elements *)user_data; json_t * j_result = auth_check_user_credentials(config, u_map_get(request->map_post_body, "username"), u_map_get(request->map_post_body, "password")), * j_user; char * session_token; const char * ip_source = get_ip_source(request); time_t now; uint max_age = 0; time(&now); if (check_result_value(j_result, G_OK)) { // Store session cookie j_user = get_user(config, u_map_get(request->map_post_body, "username"), NULL); if (check_result_value(j_user, G_OK)) { session_token = generate_session_token(config, json_string_value(json_object_get(json_object_get(j_user, "user"), "login")), ip_source, now); if (0 == o_strcmp(u_map_get(request->map_post_body, "remember"), "true")) { max_age = config->session_expiration; } ulfius_add_cookie_to_response(response, config->session_key, session_token, NULL, max_age, NULL, "/", 0, 0); o_free(session_token); } else { y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_validate_user_session - Error get_user"); response->status = 500; } json_decref(j_user); } else if (check_result_value(j_result, G_ERROR_UNAUTHORIZED)) { y_log_message(Y_LOG_LEVEL_WARNING, "Security - Error login/password for username %s at IP Address %s", u_map_get(request->map_post_body, "username"), ip_source); response->status = 403; } else { y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_validate_user_session - error checking credentials"); response->status = 500; } json_decref(j_result); return U_CALLBACK_CONTINUE; } /** * scope grant for a client_id by a user */ int callback_glewlwyd_set_user_scope_grant (const struct _u_request * request, struct _u_response * response, void * user_data) { struct config_elements * config = (struct config_elements *)user_data; int res; json_t * j_scope, * j_session; j_session = session_or_access_token_check(config, u_map_get(request->map_cookie, config->session_key), u_map_get(request->map_header, "Authorization")); j_scope = auth_check_user_scope(((struct config_elements *)user_data), json_string_value(json_object_get(json_object_get(j_session, "grants"), "username")), u_map_get(request->map_post_body, "scope")); if (!check_result_value(j_scope, G_OK)) { response->status = 403; res = U_CALLBACK_CONTINUE; } else { res = grant_client_user_scope_access(config, u_map_get(request->map_post_body, "client_id"), json_string_value(json_object_get(json_object_get(j_session, "grants"), "username")), u_map_get(request->map_post_body, "scope")); } json_decref(j_scope); json_decref(j_session); return res; } /** * default callback endpoint * return an error 404 */ int callback_default (const struct _u_request * request, struct _u_response * response, void * user_data) { json_t * json_body = json_pack("{ssss}", "error", "resource not found", "message", "no resource available at this address"); ulfius_set_json_body_response(response, 404, json_body); json_decref(json_body); return U_CALLBACK_CONTINUE; } /** * static file callback endpoint */ int callback_glewlwyd_static_file (const struct _u_request * request, struct _u_response * response, void * user_data) { void * buffer = NULL; size_t length, res; FILE * f; char * file_requested; char * file_path; const char * content_type; file_requested = request->http_url + strlen(((struct config_elements *)user_data)->static_files_prefix) + 1; if (file_requested == NULL || strlen(file_requested) == 0 || 0 == o_strcmp("/", file_requested)) { file_requested = "/index.html"; } if (strchr(file_requested, '?') != NULL) { *strchr(file_requested, '?') = '\0'; } file_path = msprintf("%s%s", ((struct config_elements *)user_data)->static_files_path, file_requested); if (access(file_path, F_OK) != -1) { f = fopen (file_path, "rb"); if (f) { fseek (f, 0, SEEK_END); length = ftell (f); fseek (f, 0, SEEK_SET); buffer = o_malloc(length*sizeof(void)); if (buffer) { res = fread (buffer, 1, length, f); if (res != length) { y_log_message(Y_LOG_LEVEL_WARNING, "callback_angharad_static_file - fread warning, reading %ld while expecting %ld", res, length); } } fclose (f); } if (buffer) { content_type = u_map_get_case(((struct config_elements *)user_data)->mime_types, get_filename_ext(file_requested)); if (content_type == NULL) { content_type = u_map_get(((struct config_elements *)user_data)->mime_types, "*"); y_log_message(Y_LOG_LEVEL_WARNING, "Static File Server - Unknown mime type for extension %s", get_filename_ext(file_requested)); } response->binary_body = buffer; response->binary_body_length = length; u_map_put(response->map_header, "Content-Type", content_type); } else { json_t * json_body = json_pack("{ss}", "error", request->http_url); ulfius_set_json_body_response(response, 500, json_body); json_decref(json_body); y_log_message(Y_LOG_LEVEL_ERROR, "Static File Server - Internal error in %s", request->http_url); } } else { json_t * json_body = json_pack("{ss}", "resource not found", request->http_url); ulfius_set_json_body_response(response, 400, json_body); json_decref(json_body); } o_free(file_path); return U_CALLBACK_CONTINUE; } /** * OPTIONS callback function * Send mandatory parameters for browsers to call REST APIs */ int callback_glewlwyd_options (const struct _u_request * request, struct _u_response * response, void * user_data) { u_map_put(response->map_header, "Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS"); u_map_put(response->map_header, "Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Bearer, Authorization"); u_map_put(response->map_header, "Access-Control-Max-Age", "1800"); return U_CALLBACK_COMPLETE; } /** * root endpoint * redirects to static files address */ int callback_glewlwyd_root (const struct _u_request * request, struct _u_response * response, void * user_data) { char * url = msprintf("%s/", ((struct config_elements *)user_data)->static_files_prefix); if (url != NULL) { response->status = 301; ulfius_add_header_to_response(response, "Location", url); o_free(url); } else { response->status = 500; } return U_CALLBACK_CONTINUE; }; /** * api description endpoint * send the location of prefixes */ int callback_glewlwyd_server_configuration (const struct _u_request * request, struct _u_response * response, void * user_data) { json_t * json_body = json_pack("{ssssssss}", "api_prefix", ((struct config_elements *)user_data)->url_prefix, "app_prefix", ((struct config_elements *)user_data)->static_files_prefix, "admin_scope", ((struct config_elements *)user_data)->admin_scope, "profile_scope", ((struct config_elements *)user_data)->profile_scope); ulfius_set_json_body_response(response, 200, json_body); json_decref(json_body); return U_CALLBACK_CONTINUE; }; /** * check if bearer token or session is valid */ int callback_glewlwyd_check_user (const struct _u_request * request, struct _u_response * response, void * user_data) { struct config_elements * config = (struct config_elements *)user_data; json_t * j_auth = NULL; int res = U_CALLBACK_CONTINUE; j_auth = session_or_access_token_check(config, u_map_get(request->map_cookie, config->session_key), u_map_get(request->map_header, "Authorization")); if (!check_result_value(j_auth, G_OK)) { res = U_CALLBACK_UNAUTHORIZED; } else { res = U_CALLBACK_CONTINUE; } json_decref(j_auth); return res; } /** * check if session is valid */ int callback_glewlwyd_check_user_session (const struct _u_request * request, struct _u_response * response, void * user_data) { struct config_elements * config = (struct config_elements *)user_data; json_t * j_session = NULL; int res = U_CALLBACK_CONTINUE; j_session = session_check(config, u_map_get(request->map_cookie, config->session_key)); if (!check_result_value(j_session, G_OK)) { res = U_CALLBACK_UNAUTHORIZED; } else { res = U_CALLBACK_CONTINUE; } json_decref(j_session); return res; } /** * check if bearer token has g_admin scope */ int callback_glewlwyd_check_scope_admin (const struct _u_request * request, struct _u_response * response, void * user_data) { struct config_elements * config = (struct config_elements *)user_data; json_t * j_session = NULL; int res = U_CALLBACK_UNAUTHORIZED; j_session = access_token_check_scope_admin(config, u_map_get(request->map_header, "Authorization")); if (check_result_value(j_session, G_OK)) { res = U_CALLBACK_CONTINUE; } json_decref(j_session); return res; } /** * User session endpoints */ int callback_glewlwyd_get_user_session_profile (const struct _u_request * request, struct _u_response * response, void * user_data) { struct config_elements * config = (struct config_elements *)user_data; json_t * j_session = NULL, * j_user = NULL; j_session = session_or_access_token_check(config, u_map_get(request->map_cookie, config->session_key), u_map_get(request->map_header, "Authorization")); if (check_result_value(j_session, G_OK)) { if (json_object_get(json_object_get(j_session, "grants"), "session_token") == json_true()) { j_user = get_user(config, json_string_value(json_object_get(json_object_get(j_session, "grants"), "username")), NULL); } else { j_user = get_user_profile(config, json_string_value(json_object_get(json_object_get(j_session, "grants"), "username")), NULL); } if (check_result_value(j_user, G_OK)) { json_object_del(json_object_get(j_user, "user"), "source"); json_object_del(json_object_get(j_user, "user"), "enabled"); ulfius_set_json_body_response(response, 200, json_object_get(j_user, "user")); } json_decref(j_user); } else { response->status = 500; } json_decref(j_session); return U_CALLBACK_CONTINUE; } int callback_glewlwyd_delete_user_session (const struct _u_request * request, struct _u_response * response, void * user_data) { struct config_elements * config = (struct config_elements *)user_data; char * session_hash; json_t * j_session; if (u_map_get(request->map_cookie, config->session_key) != NULL && strlen(u_map_get(request->map_cookie, config->session_key)) > 0) { j_session = session_or_access_token_check(config, u_map_get(request->map_cookie, config->session_key), u_map_get(request->map_header, "Authorization")); if (check_result_value(j_session, G_OK)) { session_hash = generate_hash(config, config->hash_algorithm, u_map_get(request->map_cookie, config->session_key)); if (revoke_session(config, json_string_value(json_object_get(json_object_get(j_session, "grants"), "username")), session_hash) != G_OK) { y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_delete_user_session - Error revoking session in database"); response->status = 500; } o_free(session_hash); } json_decref(j_session); } ulfius_add_cookie_to_response(response, config->session_key, "", NULL, 0, NULL, "/", 0, 0); return U_CALLBACK_CONTINUE; } /** * User scope grant endpoints */ int callback_glewlwyd_get_user_session_scope_grant (const struct _u_request * request, struct _u_response * response, void * user_data) { struct config_elements * config = (struct config_elements *)user_data; json_t * j_session = session_or_access_token_check(config, u_map_get(request->map_cookie, config->session_key), u_map_get(request->map_header, "Authorization")); json_t * j_scope_grant; if (!check_result_value(j_session, G_OK)) { response->status = 500; } else { j_scope_grant = get_user_scope_grant(config, json_string_value(json_object_get(json_object_get(j_session, "grants"), "username"))); if (check_result_value(j_scope_grant, G_OK)) { ulfius_set_json_body_response(response, 200, json_object_get(j_scope_grant, "scope")); } else { response->status = 500; } json_decref(j_scope_grant); } json_decref(j_session); return U_CALLBACK_CONTINUE; } int callback_glewlwyd_user_scope_delete (const struct _u_request * request, struct _u_response * response, void * user_data) { struct config_elements * config = (struct config_elements *)user_data; int res; json_t * j_scope, * j_session; // Check if user has access to scopes j_session = session_or_access_token_check(config, u_map_get(request->map_cookie, config->session_key), u_map_get(request->map_header, "Authorization")); j_scope = auth_check_user_scope(((struct config_elements *)user_data), json_string_value(json_object_get(json_object_get(j_session, "grants"), "username")), u_map_get(request->map_post_body, "scope")); if (!check_result_value(j_scope, G_OK)) { response->status = 403; res = U_CALLBACK_CONTINUE; } else { res = delete_client_user_scope_access(config, u_map_get(request->map_post_body, "client_id"), json_string_value(json_object_get(json_object_get(j_session, "grants"), "username")), u_map_get(request->map_post_body, "scope")); } json_decref(j_scope); json_decref(j_session); return res; } /** * Authorization type endpoints */ int callback_glewlwyd_get_authorization (const struct _u_request * request, struct _u_response * response, void * user_data) { struct config_elements * config = (struct config_elements *)user_data; json_t * j_result = get_authorization_type(config, u_map_get(request->map_url, "authorization_type")); if (check_result_value(j_result, G_OK)) { if (u_map_get(request->map_url, "authorization_type") != NULL) { ulfius_set_json_body_response(response, 200, json_array_get(json_object_get(j_result, "authorization"), 0)); } else { ulfius_set_json_body_response(response, 200, json_object_get(j_result, "authorization")); } } else if (check_result_value(j_result, G_ERROR_NOT_FOUND)) { response->status = 404; } else { y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_get_authorization - Error getting authorization list"); response->status = 500; } json_decref(j_result); return U_CALLBACK_CONTINUE; } int callback_glewlwyd_set_authorization (const struct _u_request * request, struct _u_response * response, void * user_data) { struct config_elements * config = (struct config_elements *)user_data; json_t * j_valid, * j_result = get_authorization_type(config, u_map_get(request->map_url, "authorization_type")); if (check_result_value(j_result, G_OK)) { json_t * json_req_body = ulfius_get_json_body_request(request, NULL); j_valid = is_authorization_type_valid(config, json_req_body); if (j_valid != NULL && json_array_size(j_valid) == 0) { if (set_authorization_type(config, u_map_get(request->map_url, "authorization_type"), json_req_body) != G_OK) { response->status = 500; } } else if (j_valid != NULL && json_array_size(j_valid) > 0) { ulfius_set_json_body_response(response, 400, j_valid); } else { y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_get_authorization - Error is_authorization_type_valid"); response->status = 500; } json_decref(j_valid); json_decref(json_req_body); } else if (check_result_value(j_result, G_ERROR_NOT_FOUND)) { response->status = 404; } else { y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_get_authorization - Error getting authorization"); response->status = 500; } json_decref(j_result); return U_CALLBACK_CONTINUE; } /** * Scope CRUD endpoints */ int callback_glewlwyd_get_list_scope (const struct _u_request * request, struct _u_response * response, void * user_data) { struct config_elements * config = (struct config_elements *)user_data; json_t * j_result = get_scope_list(config); if (check_result_value(j_result, G_OK)) { ulfius_set_json_body_response(response, 200, json_object_get(j_result, "scope")); } else { y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_get_list_scope - Error getting scope list"); response->status = 500; } json_decref(j_result); return U_OK; } int callback_glewlwyd_get_scope (const struct _u_request * request, struct _u_response * response, void * user_data) { struct config_elements * config = (struct config_elements *)user_data; json_t * j_result = get_scope(config, u_map_get(request->map_url, "scope")); if (check_result_value(j_result, G_OK)) { ulfius_set_json_body_response(response, 200, json_object_get(j_result, "scope")); } else if (check_result_value(j_result, G_ERROR_NOT_FOUND)) { response->status = 404; } else { y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_get_list_scope - Error getting scope list"); response->status = 500; } json_decref(j_result); return U_CALLBACK_CONTINUE; } int callback_glewlwyd_add_scope (const struct _u_request * request, struct _u_response * response, void * user_data) { struct config_elements * config = (struct config_elements *)user_data; json_t * json_req_body = ulfius_get_json_body_request(request, NULL); json_t * j_result = is_scope_valid(config, json_req_body, 1); if (j_result != NULL && json_array_size(j_result) == 0) { if (add_scope(config, json_req_body) != G_OK) { response->status = 500; y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_add_scope - Error adding new scope"); } } else if (j_result != NULL && json_array_size(j_result) > 0) { ulfius_set_json_body_response(response, 400, j_result); } else { y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_add_scope - Error is_scope_valid"); response->status = 500; } json_decref(j_result); json_decref(json_req_body); return U_CALLBACK_CONTINUE; } int callback_glewlwyd_set_scope (const struct _u_request * request, struct _u_response * response, void * user_data) { struct config_elements * config = (struct config_elements *)user_data; json_t * j_scope = get_scope(config, u_map_get(request->map_url, "scope")), * j_result; if (check_result_value(j_scope, G_OK)) { json_t * json_req_body = ulfius_get_json_body_request(request, NULL); j_result = is_scope_valid(config, json_req_body, 0); if (j_result != NULL && json_array_size(j_result) == 0) { if (set_scope(config, u_map_get(request->map_url, "scope"), json_req_body) != G_OK) { response->status = 500; y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_set_scope - Error adding new scope"); } } else if (j_result != NULL && json_array_size(j_result) > 0) { ulfius_set_json_body_response(response, 400, j_result); } else { y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_set_scope - Error is_scope_valid"); response->status = 500; } json_decref(j_result); json_decref(json_req_body); } else if (check_result_value(j_scope, G_ERROR_NOT_FOUND)) { response->status = 404; } else { y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_set_scope - Error get_scope"); response->status = 500; } json_decref(j_scope); return U_CALLBACK_CONTINUE; } int callback_glewlwyd_delete_scope (const struct _u_request * request, struct _u_response * response, void * user_data) { struct config_elements * config = (struct config_elements *)user_data; json_t * j_scope = get_scope(config, u_map_get(request->map_url, "scope")); if (check_result_value(j_scope, G_OK)) { if (delete_scope(config, u_map_get(request->map_url, "scope")) != G_OK) { response->status = 500; y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_delete_scope - Error adding new scope"); } } else if (check_result_value(j_scope, G_ERROR_NOT_FOUND)) { response->status = 404; } else { y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_delete_scope - Error get_scope"); response->status = 500; } json_decref(j_scope); return U_CALLBACK_CONTINUE; } /** * User CRUD endpoints */ int callback_glewlwyd_get_list_user (const struct _u_request * request, struct _u_response * response, void * user_data) { struct config_elements * config = (struct config_elements *)user_data; long int offset, limit; json_t * j_result; if (u_map_get(request->map_url, "offset") != NULL) { offset = strtol(u_map_get(request->map_url, "offset"), NULL, 10); } else { offset = 0; } if (u_map_get(request->map_url, "limit") != NULL) { limit = strtol(u_map_get(request->map_url, "limit"), NULL, 10); } else { limit = GLEWLWYD_DEFAULT_LIMIT; } j_result = get_user_list(config, u_map_get(request->map_url, "source"), u_map_get(request->map_url, "search"), offset>=0?offset:0, limit>0?limit:GLEWLWYD_DEFAULT_LIMIT); if (check_result_value(j_result, G_OK)) { ulfius_set_json_body_response(response, 200, json_object_get(j_result, "user")); } else { y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_get_list_user - Error getting user list"); response->status = 500; } json_decref(j_result); return U_CALLBACK_CONTINUE; } int callback_glewlwyd_get_user (const struct _u_request * request, struct _u_response * response, void * user_data) { struct config_elements * config = (struct config_elements *)user_data; json_t * j_user; if (u_map_get(request->map_url, "source") == NULL || 0 == strcmp("all", u_map_get(request->map_url, "source")) || 0 == strcmp("ldap", u_map_get(request->map_url, "source")) || 0 == strcmp("database", u_map_get(request->map_url, "source"))) { j_user = get_user(config, u_map_get(request->map_url, "username"), u_map_get(request->map_url, "source")); if (check_result_value(j_user, G_OK)) { ulfius_set_json_body_response(response, 200, json_object_get(j_user, "user")); } else if (check_result_value(j_user, G_ERROR_NOT_FOUND)) { response->status = 404; } else if (check_result_value(j_user, G_ERROR_PARAM)) { response->status = 400; } else { y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_get_user - Error getting user"); response->status = 500; } json_decref(j_user); } else { response->status = 400; } return U_CALLBACK_CONTINUE; } int callback_glewlwyd_add_user (const struct _u_request * request, struct _u_response * response, void * user_data) { struct config_elements * config = (struct config_elements *)user_data; json_t * json_req_body = ulfius_get_json_body_request(request, NULL); json_t * j_result = is_user_valid(config, json_req_body, 1); int res; if (j_result != NULL && json_array_size(j_result) == 0) { res = add_user(config, json_req_body); if (res == G_ERROR_PARAM) { json_t * j_body = json_pack("{sssO}", "error", "Error source parameter", "user", json_req_body); ulfius_set_json_body_response(response, 400, j_body); json_decref(j_body); } else if (res != G_OK) { response->status = 500; y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_add_user - Error adding new user"); } } else if (j_result != NULL && json_array_size(j_result) > 0) { ulfius_set_json_body_response(response, 400, j_result); } else { y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_add_user - Error is_user_valid"); response->status = 500; } json_decref(j_result); json_decref(json_req_body); return U_CALLBACK_CONTINUE; } int callback_glewlwyd_set_user (const struct _u_request * request, struct _u_response * response, void * user_data) { struct config_elements * config = (struct config_elements *)user_data; json_t * j_user, * j_result; if (u_map_get(request->map_url, "source") == NULL || 0 == strcmp("all", u_map_get(request->map_url, "source")) || 0 == strcmp("ldap", u_map_get(request->map_url, "source")) || 0 == strcmp("database", u_map_get(request->map_url, "source"))) { j_user = get_user(config, u_map_get(request->map_url, "username"), u_map_get(request->map_url, "source")); if (check_result_value(j_user, G_OK)) { json_t * json_req_body = ulfius_get_json_body_request(request, NULL); j_result = is_user_valid(config, json_req_body, 0); if (j_result != NULL && json_array_size(j_result) == 0) { if (set_user(config, u_map_get(request->map_url, "username"), json_req_body, json_string_value(json_object_get(json_object_get(j_user, "user"), "source"))) != G_OK) { response->status = 500; y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_set_user - Error adding new user"); } } else if (j_result != NULL && json_array_size(j_result) > 0) { ulfius_set_json_body_response(response, 400, j_result); } else { y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_set_user - Error is_user_valid"); response->status = 500; } json_decref(j_result); json_decref(json_req_body); } else if (check_result_value(j_user, G_ERROR_PARAM)) { response->status = 400; } else if (check_result_value(j_user, G_ERROR_NOT_FOUND)) { response->status = 404; } else { y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_set_user - Error getting user"); response->status = 500; } json_decref(j_user); } else { response->status = 400; } return U_CALLBACK_CONTINUE; } int callback_glewlwyd_delete_user (const struct _u_request * request, struct _u_response * response, void * user_data) { struct config_elements * config = (struct config_elements *)user_data; json_t * j_user; if (u_map_get(request->map_url, "source") == NULL || 0 == strcmp("all", u_map_get(request->map_url, "source")) || 0 == strcmp("ldap", u_map_get(request->map_url, "source")) || 0 == strcmp("database", u_map_get(request->map_url, "source"))) { j_user = get_user(config, u_map_get(request->map_url, "username"), u_map_get(request->map_url, "source")); if (check_result_value(j_user, G_OK)) { if (delete_user(config, u_map_get(request->map_url, "username"), json_string_value(json_object_get(json_object_get(j_user, "user"), "source"))) != G_OK) { response->status = 500; y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_delete_user - Error deleting user"); } } else if (check_result_value(j_user, G_ERROR_PARAM)) { response->status = 400; } else if (check_result_value(j_user, G_ERROR_NOT_FOUND)) { response->status = 404; } else { y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_delete_user - Error get_scope"); response->status = 500; } json_decref(j_user); } else { response->status = 400; } return U_CALLBACK_CONTINUE; } /** * User refresh_token endpoints */ int callback_glewlwyd_get_refresh_token_user (const struct _u_request * request, struct _u_response * response, void * user_data) { struct config_elements * config = (struct config_elements *)user_data; long int offset, limit; json_t * j_result; int valid = -1; if (u_map_get(request->map_url, "valid") != NULL && strlen(u_map_get(request->map_url, "valid")) > 0) { if (strcmp("true", u_map_get(request->map_url, "valid")) == 0) { valid=1; } else { valid=0; } } if (u_map_get(request->map_url, "offset") != NULL) { offset = strtol(u_map_get(request->map_url, "offset"), NULL, 10); } else { offset = 0; } if (u_map_get(request->map_url, "limit") != NULL) { limit = strtol(u_map_get(request->map_url, "limit"), NULL, 10); } else { limit = GLEWLWYD_DEFAULT_LIMIT; } j_result = get_refresh_token_list(config, u_map_get(request->map_url, "username"), valid, offset>=0?offset:0, limit>0?limit:GLEWLWYD_DEFAULT_LIMIT); if (check_result_value(j_result, G_OK)) { ulfius_set_json_body_response(response, 200, json_object_get(j_result, "token")); } else { y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_get_refresh_token_user - Error getting token list"); response->status = 500; } json_decref(j_result); return U_CALLBACK_CONTINUE; } int callback_glewlwyd_delete_refresh_token_user (const struct _u_request * request, struct _u_response * response, void * user_data) { struct config_elements * config = (struct config_elements *)user_data; int res; json_t * json_body = ulfius_get_json_body_request(request, NULL); res = revoke_token(config, u_map_get(request->map_url, "username"), json_string_value(json_object_get(json_body, "token_hash"))); if (res == G_ERROR_NOT_FOUND) { response->status = 404; } else if (res == G_ERROR_PARAM) { response->status = 400; } else if (res != G_OK) { y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_delete_refresh_token_user - Error revoking token list"); response->status = 500; } json_decref(json_body); return U_CALLBACK_CONTINUE; } /** * User session endpoints */ int callback_glewlwyd_get_session_user (const struct _u_request * request, struct _u_response * response, void * user_data) { struct config_elements * config = (struct config_elements *)user_data; long int offset, limit; json_t * j_result; int valid = -1; if (u_map_get(request->map_url, "valid") != NULL && strlen(u_map_get(request->map_url, "valid")) > 0) { if (strcmp("true", u_map_get(request->map_url, "valid")) == 0) { valid=1; } else { valid=0; } } if (u_map_get(request->map_url, "offset") != NULL) { offset = strtol(u_map_get(request->map_url, "offset"), NULL, 10); } else { offset = 0; } if (u_map_get(request->map_url, "limit") != NULL) { limit = strtol(u_map_get(request->map_url, "limit"), NULL, 10); } else { limit = GLEWLWYD_DEFAULT_LIMIT; } j_result = get_session_list(config, u_map_get(request->map_url, "username"), valid, offset>=0?offset:0, limit>0?limit:GLEWLWYD_DEFAULT_LIMIT); if (check_result_value(j_result, G_OK)) { ulfius_set_json_body_response(response, 200, json_object_get(j_result, "session")); } else { y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_get_session_user - Error getting session list"); response->status = 500; } json_decref(j_result); return U_CALLBACK_CONTINUE; } int callback_glewlwyd_delete_session_user (const struct _u_request * request, struct _u_response * response, void * user_data) { struct config_elements * config = (struct config_elements *)user_data; int res; json_t * json_body = ulfius_get_json_body_request(request, NULL); res = revoke_session(config, u_map_get(request->map_url, "username"), json_string_value(json_object_get(json_body, "session_hash"))); if (res == G_ERROR_NOT_FOUND) { response->status = 404; } else if (res == G_ERROR_PARAM) { response->status = 400; } else if (res != G_OK) { y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_delete_session_user - Error revoking session"); response->status = 500; } json_decref(json_body); return U_CALLBACK_CONTINUE; } /** * Client CRUD endpoints */ int callback_glewlwyd_get_list_client (const struct _u_request * request, struct _u_response * response, void * user_data) { struct config_elements * config = (struct config_elements *)user_data; long int offset, limit; json_t * j_result; if (u_map_get(request->map_url, "offset") != NULL) { offset = strtol(u_map_get(request->map_url, "offset"), NULL, 10); } else { offset = 0; } if (u_map_get(request->map_url, "limit") != NULL) { limit = strtol(u_map_get(request->map_url, "limit"), NULL, 10); } else { limit = GLEWLWYD_DEFAULT_LIMIT; } j_result = get_client_list(config, u_map_get(request->map_url, "source"), u_map_get(request->map_url, "search"), offset>=0?offset:0, limit>0?limit:GLEWLWYD_DEFAULT_LIMIT); if (check_result_value(j_result, G_OK)) { ulfius_set_json_body_response(response, 200, json_object_get(j_result, "client")); } else { y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_get_list_client - Error getting client list"); response->status = 500; } json_decref(j_result); return U_CALLBACK_CONTINUE; } int callback_glewlwyd_get_client (const struct _u_request * request, struct _u_response * response, void * user_data) { struct config_elements * config = (struct config_elements *)user_data; json_t * j_client; if (u_map_get(request->map_url, "source") == NULL || 0 == strcmp("all", u_map_get(request->map_url, "source")) || 0 == strcmp("ldap", u_map_get(request->map_url, "source")) || 0 == strcmp("database", u_map_get(request->map_url, "source"))) { j_client = get_client(config, u_map_get(request->map_url, "client_id"), u_map_get(request->map_url, "source")); if (check_result_value(j_client, G_OK)) { ulfius_set_json_body_response(response, 200, json_object_get(j_client, "client")); } else if (check_result_value(j_client, G_ERROR_NOT_FOUND)) { response->status = 404; } else if (check_result_value(j_client, G_ERROR_PARAM)) { response->status = 400; } else { y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_get_client - Error getting client"); response->status = 500; } json_decref(j_client); } else { response->status = 400; } return U_CALLBACK_CONTINUE; } int callback_glewlwyd_add_client (const struct _u_request * request, struct _u_response * response, void * user_data) { struct config_elements * config = (struct config_elements *)user_data; json_t * json_req_body = ulfius_get_json_body_request(request, NULL); json_t * j_result = is_client_valid(config, json_req_body, 1); int res; if (j_result != NULL && json_array_size(j_result) == 0) { json_t * json_body = ulfius_get_json_body_request(request, NULL); res = add_client(config, json_body); if (res == G_ERROR_PARAM) { response->status = 400; } else if (res != G_OK) { response->status = 500; y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_add_client - Error adding new client"); } json_decref(json_body); } else if (j_result != NULL && json_array_size(j_result) > 0) { ulfius_set_json_body_response(response, 400, j_result); } else { y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_add_client - Error is_client_valid"); response->status = 500; } json_decref(j_result); json_decref(json_req_body); return U_CALLBACK_CONTINUE; } int callback_glewlwyd_set_client (const struct _u_request * request, struct _u_response * response, void * user_data) { struct config_elements * config = (struct config_elements *)user_data; json_t * j_client, * j_result; if (u_map_get(request->map_url, "source") == NULL || 0 == strcmp("all", u_map_get(request->map_url, "source")) || 0 == strcmp("ldap", u_map_get(request->map_url, "source")) || 0 == strcmp("database", u_map_get(request->map_url, "source"))) { j_client = get_client(config, u_map_get(request->map_url, "client_id"), u_map_get(request->map_url, "source")); if (check_result_value(j_client, G_OK)) { json_t * json_body = ulfius_get_json_body_request(request, NULL); j_result = is_client_valid(config, json_body, 0); if (j_result != NULL && json_array_size(j_result) == 0) { json_t * json_body = ulfius_get_json_body_request(request, NULL); if (set_client(config, u_map_get(request->map_url, "client_id"), json_body, json_string_value(json_object_get(json_object_get(j_client, "client"), "source"))) != G_OK) { response->status = 500; y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_set_client - Error adding new client"); } json_decref(json_body); } else if (j_result != NULL && json_array_size(j_result) > 0) { ulfius_set_json_body_response(response, 400, j_result); } else { y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_set_client - Error is_client_valid"); response->status = 500; } json_decref(json_body); json_decref(j_result); } else if (check_result_value(j_client, G_ERROR_NOT_FOUND)) { response->status = 404; } else if (check_result_value(j_client, G_ERROR_PARAM)) { response->status = 400; } else { y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_set_client - Error getting client"); response->status = 500; } json_decref(j_client); } else { response->status = 400; } return U_CALLBACK_CONTINUE; } int callback_glewlwyd_delete_client (const struct _u_request * request, struct _u_response * response, void * user_data) { struct config_elements * config = (struct config_elements *)user_data; json_t * j_client; if (u_map_get(request->map_url, "source") == NULL || 0 == strcmp("all", u_map_get(request->map_url, "source")) || 0 == strcmp("ldap", u_map_get(request->map_url, "source")) || 0 == strcmp("database", u_map_get(request->map_url, "source"))) { j_client = get_client(config, u_map_get(request->map_url, "client_id"), u_map_get(request->map_url, "source")); if (check_result_value(j_client, G_OK)) { if (delete_client(config, u_map_get(request->map_url, "client_id"), json_string_value(json_object_get(json_object_get(j_client, "client"), "source"))) != G_OK) { response->status = 500; y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_delete_client - Error deleting client"); } } else if (check_result_value(j_client, G_ERROR_PARAM)) { response->status = 400; } else if (check_result_value(j_client, G_ERROR_NOT_FOUND)) { response->status = 404; } else { y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_delete_client - Error get_scope"); response->status = 500; } json_decref(j_client); } else { response->status = 400; } return U_CALLBACK_CONTINUE; } /** * Resource CRUD endpoints */ int callback_glewlwyd_get_list_resource (const struct _u_request * request, struct _u_response * response, void * user_data) { struct config_elements * config = (struct config_elements *)user_data; json_t * j_result = get_resource_list(config); if (check_result_value(j_result, G_OK)) { ulfius_set_json_body_response(response, 200, json_object_get(j_result, "resource")); } else { y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_get_list_resource - Error getting resource list"); response->status = 500; } json_decref(j_result); return U_CALLBACK_CONTINUE; } int callback_glewlwyd_get_resource (const struct _u_request * request, struct _u_response * response, void * user_data) { struct config_elements * config = (struct config_elements *)user_data; json_t * j_result = get_resource(config, u_map_get(request->map_url, "resource")); if (check_result_value(j_result, G_OK)) { ulfius_set_json_body_response(response, 200, json_object_get(j_result, "resource")); } else if (check_result_value(j_result, G_ERROR_NOT_FOUND)) { response->status = 404; } else { y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_get_list_resource - Error getting resource list"); response->status = 500; } json_decref(j_result); return U_CALLBACK_CONTINUE; } int callback_glewlwyd_add_resource (const struct _u_request * request, struct _u_response * response, void * user_data) { struct config_elements * config = (struct config_elements *)user_data; json_t * json_body = ulfius_get_json_body_request(request, NULL); json_t * j_result = is_resource_valid(config, json_body, 1); if (j_result != NULL && json_array_size(j_result) == 0) { json_t * json_body = ulfius_get_json_body_request(request, NULL); if (add_resource(config, json_body) != G_OK) { response->status = 500; y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_add_resource - Error adding new resource"); } json_decref(json_body); } else if (j_result != NULL && json_array_size(j_result) > 0) { ulfius_set_json_body_response(response, 400, j_result); } else { y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_add_resource - Error is_resource_valid"); response->status = 500; } json_decref(j_result); json_decref(json_body); return U_CALLBACK_CONTINUE; } int callback_glewlwyd_set_resource (const struct _u_request * request, struct _u_response * response, void * user_data) { struct config_elements * config = (struct config_elements *)user_data; json_t * j_resource = get_resource(config, u_map_get(request->map_url, "resource")), * j_result; if (check_result_value(j_resource, G_OK)) { json_t * json_body = ulfius_get_json_body_request(request, NULL); j_result = is_resource_valid(config, json_body, 0); json_decref(json_body); if (j_result != NULL && json_array_size(j_result) == 0) { json_t * json_body = ulfius_get_json_body_request(request, NULL); if (set_resource(config, u_map_get(request->map_url, "resource"), json_body) != G_OK) { response->status = 500; y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_set_resource - Error adding new resource"); } json_decref(json_body); } else if (j_result != NULL && json_array_size(j_result) > 0) { ulfius_set_json_body_response(response, 400, j_result); } else { y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_set_resource - Error is_resource_valid"); response->status = 500; } json_decref(j_result); } else if (check_result_value(j_resource, G_ERROR_NOT_FOUND)) { response->status = 404; } else { y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_set_resource - Error get_resource"); response->status = 500; } json_decref(j_resource); return U_CALLBACK_CONTINUE; } int callback_glewlwyd_delete_resource (const struct _u_request * request, struct _u_response * response, void * user_data) { struct config_elements * config = (struct config_elements *)user_data; json_t * j_resource = get_resource(config, u_map_get(request->map_url, "resource")); if (check_result_value(j_resource, G_OK)) { if (delete_resource(config, u_map_get(request->map_url, "resource")) != G_OK) { response->status = 500; y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_delete_resource - Error adding new resource"); } } else if (check_result_value(j_resource, G_ERROR_NOT_FOUND)) { response->status = 404; } else { y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_delete_resource - Error get_resource"); response->status = 500; } json_decref(j_resource); return U_CALLBACK_CONTINUE; } /** * User profile endpoints */ int callback_glewlwyd_set_user_profile (const struct _u_request * request, struct _u_response * response, void * user_data) { struct config_elements * config = (struct config_elements *)user_data; json_t * j_session = NULL, * j_user_valid = NULL; j_session = session_or_access_token_check(config, u_map_get(request->map_cookie, config->session_key), u_map_get(request->map_header, "Authorization")); if (check_result_value(j_session, G_OK)) { json_t * json_body = ulfius_get_json_body_request(request, NULL); j_user_valid = is_user_profile_valid(config, json_string_value(json_object_get(json_object_get(j_session, "grants"), "username")), json_body); json_decref(json_body); if (j_user_valid != NULL && json_array_size(j_user_valid) == 0) { json_t * json_body = ulfius_get_json_body_request(request, NULL); if (set_user_profile(config, json_string_value(json_object_get(json_object_get(j_session, "grants"), "username")), json_body) != G_OK) { y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_set_user_profile - Error setting profile"); response->status = 500; } json_decref(json_body); } else if (j_user_valid != NULL) { ulfius_set_json_body_response(response, 400, j_user_valid); } else { y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_set_user_profile - Error is_user_profile_valid"); response->status = 500; } json_decref(j_user_valid); } else { y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_set_user_profile - Error get session"); response->status = 500; } json_decref(j_session); return U_CALLBACK_CONTINUE; } int callback_glewlwyd_send_reset_user (const struct _u_request * request, struct _u_response * response, void * user_data) { struct config_elements * config = (struct config_elements *)user_data; json_t * j_user = get_user(config, u_map_get(request->map_url, "username"), NULL); const char * ip_source = get_ip_source(request); if (check_result_value(j_user, G_OK)) { if (json_object_get(json_object_get(j_user, "user"), "email") != NULL && json_string_length(json_object_get(json_object_get(j_user, "user"), "email")) > 0) { if (send_reset_user_profile_email(config, u_map_get(request->map_url, "username"), ip_source) != G_OK) { y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_send_reset_user - Error sending reset profile email"); response->status = 500; } } else { json_t * json_body = json_pack("{ss}", "error", "no email specified for user"); ulfius_set_json_body_response(response, 400, json_body); json_decref(json_body); } } else if (check_result_value(j_user, G_ERROR_NOT_FOUND)) { response->status = 404; } else { y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_send_reset_user - Error getting user profile"); response->status = 500; } json_decref(j_user); return U_CALLBACK_CONTINUE; } int callback_glewlwyd_send_reset_user_profile (const struct _u_request * request, struct _u_response * response, void * user_data) { struct config_elements * config = (struct config_elements *)user_data; json_t * j_user = get_user(config, u_map_get(request->map_url, "username"), NULL); const char * ip_source = get_ip_source(request); y_log_message(Y_LOG_LEVEL_WARNING, "Security - Requesting reset password for user %s at IP Address %s", u_map_get(request->map_url, "username"), ip_source); if (check_result_value(j_user, G_OK)) { if (json_object_get(json_object_get(j_user, "user"), "email") != NULL && json_string_length(json_object_get(json_object_get(j_user, "user"), "email")) > 0) { if (send_reset_user_profile_email(config, u_map_get(request->map_url, "username"), ip_source) != G_OK) { y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_send_reset_user_profile - Error sending reset profile email"); response->status = 500; } } else { json_t * json_body = json_pack("{ss}", "error", "no email specified for user"); ulfius_set_json_body_response(response, 400, json_body); json_decref(json_body); } } else if (check_result_value(j_user, G_ERROR_NOT_FOUND)) { response->status = 404; } else { y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_send_reset_user_profile - Error getting user profile"); response->status = 500; } json_decref(j_user); return U_CALLBACK_CONTINUE; } int callback_glewlwyd_reset_user_profile (const struct _u_request * request, struct _u_response * response, void * user_data) { struct config_elements * config = (struct config_elements *)user_data; int res; res = is_reset_user_profile_valid(config, u_map_get(request->map_url, "username"), u_map_get(request->map_post_body, "token"), u_map_get(request->map_post_body, "password")); if (res == G_OK) { if (reset_user_profile(config, u_map_get(request->map_url, "username"), u_map_get(request->map_post_body, "token"), u_map_get(request->map_post_body, "password")) != G_OK) { y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_reset_user_profile - Error setting profile"); response->status = 500; } } else if (res == G_ERROR_NOT_FOUND) { response->status = 404; } else if (res == G_ERROR_PARAM) { json_t * json_body = json_pack("{ss}", "error", "error input parameters"); ulfius_set_json_body_response(response, 400, json_body); json_decref(json_body); } else { response->status = 500; } return U_CALLBACK_CONTINUE; } /** * User profile refresh_token endpoints */ int callback_glewlwyd_get_refresh_token_profile (const struct _u_request * request, struct _u_response * response, void * user_data) { struct config_elements * config = (struct config_elements *)user_data; long int offset, limit; json_t * j_result, * j_session; int valid = -1; if (u_map_get(request->map_url, "valid") != NULL && strlen(u_map_get(request->map_url, "valid")) > 0) { if (strcmp("true", u_map_get(request->map_url, "valid")) == 0) { valid=1; } else { valid=0; } } j_session = session_or_access_token_check(config, u_map_get(request->map_cookie, config->session_key), u_map_get(request->map_header, "Authorization")); if (check_result_value(j_session, G_OK)) { if (u_map_get(request->map_url, "offset") != NULL) { offset = strtol(u_map_get(request->map_url, "offset"), NULL, 10); } else { offset = 0; } if (u_map_get(request->map_url, "limit") != NULL) { limit = strtol(u_map_get(request->map_url, "limit"), NULL, 10); } else { limit = GLEWLWYD_DEFAULT_LIMIT; } j_result = get_refresh_token_list(config, json_string_value(json_object_get(json_object_get(j_session, "grants"), "username")), valid, offset>=0?offset:0, limit>0?limit:GLEWLWYD_DEFAULT_LIMIT); if (check_result_value(j_result, G_OK)) { ulfius_set_json_body_response(response, 200, json_object_get(j_result, "token")); } else { y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_get_refresh_token_user - Error getting token list"); response->status = 500; } json_decref(j_result); } else { y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_get_refresh_token_user - Error get session"); response->status = 500; } json_decref(j_session); return U_CALLBACK_CONTINUE; } int callback_glewlwyd_delete_refresh_token_profile (const struct _u_request * request, struct _u_response * response, void * user_data) { struct config_elements * config = (struct config_elements *)user_data; json_t * j_session; int res; j_session = session_or_access_token_check(config, u_map_get(request->map_cookie, config->session_key), u_map_get(request->map_header, "Authorization")); if (check_result_value(j_session, G_OK)) { json_t * json_body = ulfius_get_json_body_request(request, NULL); res = revoke_token(config, json_string_value(json_object_get(json_object_get(j_session, "grants"), "username")), json_string_value(json_object_get(json_body, "token_hash"))); if (res == G_ERROR_NOT_FOUND) { response->status = 404; } else if (res == G_ERROR_PARAM) { response->status = 400; } else if (res != G_OK) { y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_delete_refresh_token_user - Error revoking token list"); response->status = 500; } json_decref(json_body); } else { y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_delete_refresh_token_user - Error get session"); response->status = 500; } json_decref(j_session); return U_CALLBACK_CONTINUE; } /** * User profile session endpoints */ int callback_glewlwyd_get_session_profile (const struct _u_request * request, struct _u_response * response, void * user_data) { struct config_elements * config = (struct config_elements *)user_data; long int offset, limit; json_t * j_result, * j_session; int valid = -1; if (u_map_get(request->map_url, "valid") != NULL && strlen(u_map_get(request->map_url, "valid")) > 0) { if (strcmp("true", u_map_get(request->map_url, "valid")) == 0) { valid=1; } else { valid=0; } } j_session = session_or_access_token_check(config, u_map_get(request->map_cookie, config->session_key), u_map_get(request->map_header, "Authorization")); if (check_result_value(j_session, G_OK)) { if (u_map_get(request->map_url, "offset") != NULL) { offset = strtol(u_map_get(request->map_url, "offset"), NULL, 10); } else { offset = 0; } if (u_map_get(request->map_url, "limit") != NULL) { limit = strtol(u_map_get(request->map_url, "limit"), NULL, 10); } else { limit = GLEWLWYD_DEFAULT_LIMIT; } j_result = get_session_list(config, json_string_value(json_object_get(json_object_get(j_session, "grants"), "username")), valid, offset>=0?offset:0, limit>0?limit:GLEWLWYD_DEFAULT_LIMIT); if (check_result_value(j_result, G_OK)) { ulfius_set_json_body_response(response, 200, json_object_get(j_result, "session")); } else { y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_get_session_user - Error getting session list"); response->status = 500; } json_decref(j_result); } else { y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_get_session_user - Error get session"); response->status = 500; } json_decref(j_session); return U_CALLBACK_CONTINUE; } int callback_glewlwyd_delete_session_profile (const struct _u_request * request, struct _u_response * response, void * user_data) { struct config_elements * config = (struct config_elements *)user_data; json_t * j_session, * j_body = ulfius_get_json_body_request(request, NULL); int res; j_session = session_or_access_token_check(config, u_map_get(request->map_cookie, config->session_key), u_map_get(request->map_header, "Authorization")); if (check_result_value(j_session, G_OK)) { json_t * json_body = ulfius_get_json_body_request(request, NULL); res = revoke_session(config, json_string_value(json_object_get(json_object_get(j_session, "grants"), "username")), json_string_value(json_object_get(json_body, "session_hash"))); if (res == G_ERROR_NOT_FOUND) { response->status = 404; } else if (res == G_ERROR_PARAM) { response->status = 400; } else if (res != G_OK) { y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_delete_session_user - Error revoking session"); response->status = 500; } else { response->status = 200; } json_decref(json_body); } else { y_log_message(Y_LOG_LEVEL_ERROR, "callback_glewlwyd_delete_session_user - Error get session"); response->status = 500; } json_decref(j_session); json_decref(j_body); return U_CALLBACK_CONTINUE; } glewlwyd-1.3.1/test/000077500000000000000000000000001322667720100143375ustar00rootroot00000000000000glewlwyd-1.3.1/test/Makefile000066400000000000000000000206711322667720100160050ustar00rootroot00000000000000# # Glewlwyd OAuth2 Authorization Server # # Makefile used to build the software # # Copyright 2016 Nicolas Mora # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU GENERAL PUBLIC LICENSE # License as published by the Free Software Foundation; # version 3 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU GENERAL PUBLIC LICENSE for more details. # # You should have received a copy of the GNU General Public # License along with this program. If not, see . # CC=gcc CFLAGS=-Wall -D_REENTRANT -DDEBUG -g -O0 LIBS=-lc -lulfius -lorcania -ljansson -lyder -lcheck -lpthread -lm -lrt -lsubunit -ljwt all: test clean: rm -f *.o *.log *.err glewlwyd_oauth2_auth_code glewlwyd_oauth2_client_cred glewlwyd_oauth2_code glewlwyd_oauth2_code_client_confidential glewlwyd_oauth2_implicit glewlwyd_oauth2_resource_owner_pwd_cred glewlwyd_oauth2_resource_owner_pwd_cred_client_confidential glewlwyd_oauth2_refresh_token glewlwyd_oauth2_refresh_token_client_confidential glewlwyd_delete_token glewlwyd_admin_authorization glewlwyd_crud_scope glewlwyd_crud_user glewlwyd_crud_client glewlwyd_crud_resource glewlwyd_update_user_profile glewlwyd_user_session_user glewlwyd_user_session_admin glewlwyd_user_refresh_token_user glewlwyd_user_refresh_token_admin glewlwyd_http_auth valgrind.txt unit-tests.o: unit-tests.c unit-tests.h $(CC) $(CFLAGS) -c unit-tests.c glewlwyd_oauth2_auth_code: glewlwyd_oauth2_auth_code.c unit-tests.o $(CC) $(CFLAGS) glewlwyd_oauth2_auth_code.c unit-tests.o -o glewlwyd_oauth2_auth_code $(LIBS) test_glewlwyd_oauth2_auth_code: glewlwyd_oauth2_auth_code -./run_test.sh ./glewlwyd_oauth2_auth_code glewlwyd_oauth2_client_cred: glewlwyd_oauth2_client_cred.c unit-tests.o $(CC) $(CFLAGS) glewlwyd_oauth2_client_cred.c unit-tests.o -o glewlwyd_oauth2_client_cred $(LIBS) test_glewlwyd_oauth2_client_cred: glewlwyd_oauth2_client_cred -./run_test.sh ./glewlwyd_oauth2_client_cred glewlwyd_oauth2_code: glewlwyd_oauth2_code.c unit-tests.o $(CC) $(CFLAGS) glewlwyd_oauth2_code.c unit-tests.o -o glewlwyd_oauth2_code $(LIBS) test_glewlwyd_oauth2_code: glewlwyd_oauth2_code -./run_test.sh ./glewlwyd_oauth2_code glewlwyd_oauth2_code_client_confidential: glewlwyd_oauth2_code_client_confidential.c unit-tests.o $(CC) $(CFLAGS) glewlwyd_oauth2_code_client_confidential.c unit-tests.o -o glewlwyd_oauth2_code_client_confidential $(LIBS) test_glewlwyd_oauth2_code_client_confidential: glewlwyd_oauth2_code_client_confidential -./run_test.sh ./glewlwyd_oauth2_code_client_confidential glewlwyd_oauth2_implicit: glewlwyd_oauth2_implicit.c unit-tests.o $(CC) $(CFLAGS) glewlwyd_oauth2_implicit.c unit-tests.o -o glewlwyd_oauth2_implicit $(LIBS) test_glewlwyd_oauth2_implicit: glewlwyd_oauth2_implicit -./run_test.sh ./glewlwyd_oauth2_implicit glewlwyd_oauth2_resource_owner_pwd_cred: glewlwyd_oauth2_resource_owner_pwd_cred.c unit-tests.o $(CC) $(CFLAGS) glewlwyd_oauth2_resource_owner_pwd_cred.c unit-tests.o -o glewlwyd_oauth2_resource_owner_pwd_cred $(LIBS) test_glewlwyd_oauth2_resource_owner_pwd_cred: glewlwyd_oauth2_resource_owner_pwd_cred -./run_test.sh ./glewlwyd_oauth2_resource_owner_pwd_cred glewlwyd_oauth2_resource_owner_pwd_cred_client_confidential: glewlwyd_oauth2_resource_owner_pwd_cred_client_confidential.c unit-tests.o $(CC) $(CFLAGS) glewlwyd_oauth2_resource_owner_pwd_cred_client_confidential.c unit-tests.o -o glewlwyd_oauth2_resource_owner_pwd_cred_client_confidential $(LIBS) test_glewlwyd_oauth2_resource_owner_pwd_cred_client_confidential: glewlwyd_oauth2_resource_owner_pwd_cred_client_confidential -./run_test.sh ./glewlwyd_oauth2_resource_owner_pwd_cred_client_confidential glewlwyd_oauth2_refresh_token: glewlwyd_oauth2_refresh_token.c unit-tests.o $(CC) $(CFLAGS) glewlwyd_oauth2_refresh_token.c unit-tests.o -o glewlwyd_oauth2_refresh_token $(LIBS) test_glewlwyd_oauth2_refresh_token: glewlwyd_oauth2_refresh_token -./run_test.sh ./glewlwyd_oauth2_refresh_token glewlwyd_oauth2_refresh_token_client_confidential: glewlwyd_oauth2_refresh_token_client_confidential.c unit-tests.o $(CC) $(CFLAGS) glewlwyd_oauth2_refresh_token_client_confidential.c unit-tests.o -o glewlwyd_oauth2_refresh_token_client_confidential $(LIBS) test_glewlwyd_oauth2_refresh_token_client_confidential: glewlwyd_oauth2_refresh_token_client_confidential -./run_test.sh ./glewlwyd_oauth2_refresh_token_client_confidential glewlwyd_delete_token: glewlwyd_delete_token.c unit-tests.o $(CC) $(CFLAGS) glewlwyd_delete_token.c unit-tests.o -o glewlwyd_delete_token $(LIBS) test_glewlwyd_delete_token: glewlwyd_delete_token -./run_test.sh ./glewlwyd_delete_token glewlwyd_admin_authorization: glewlwyd_admin_authorization.c unit-tests.o $(CC) $(CFLAGS) glewlwyd_admin_authorization.c unit-tests.o -o glewlwyd_admin_authorization $(LIBS) test_glewlwyd_admin_authorization: glewlwyd_admin_authorization -./run_test.sh ./glewlwyd_admin_authorization glewlwyd_crud_scope: glewlwyd_crud_scope.c unit-tests.o $(CC) $(CFLAGS) glewlwyd_crud_scope.c unit-tests.o -o glewlwyd_crud_scope $(LIBS) test_glewlwyd_crud_scope: glewlwyd_crud_scope -./run_test.sh ./glewlwyd_crud_scope glewlwyd_crud_user: glewlwyd_crud_user.c unit-tests.o $(CC) $(CFLAGS) glewlwyd_crud_user.c unit-tests.o -o glewlwyd_crud_user $(LIBS) test_glewlwyd_crud_user: glewlwyd_crud_user -./run_test.sh ./glewlwyd_crud_user glewlwyd_crud_client: glewlwyd_crud_client.c unit-tests.o $(CC) $(CFLAGS) glewlwyd_crud_client.c unit-tests.o -o glewlwyd_crud_client $(LIBS) test_glewlwyd_crud_client: glewlwyd_crud_client -./run_test.sh ./glewlwyd_crud_client glewlwyd_crud_resource: glewlwyd_crud_resource.c unit-tests.o $(CC) $(CFLAGS) glewlwyd_crud_resource.c unit-tests.o -o glewlwyd_crud_resource $(LIBS) test_glewlwyd_crud_resource: glewlwyd_crud_resource -./run_test.sh ./glewlwyd_crud_resource glewlwyd_user_session_user: glewlwyd_user_session_user.c unit-tests.o $(CC) $(CFLAGS) glewlwyd_user_session_user.c unit-tests.o -o glewlwyd_user_session_user $(LIBS) test_glewlwyd_user_session_user: glewlwyd_user_session_user -./run_test.sh ./glewlwyd_user_session_user glewlwyd_user_session_admin: glewlwyd_user_session_admin.c unit-tests.o $(CC) $(CFLAGS) glewlwyd_user_session_admin.c unit-tests.o -o glewlwyd_user_session_admin $(LIBS) test_glewlwyd_user_session_admin: glewlwyd_user_session_admin -./run_test.sh ./glewlwyd_user_session_admin glewlwyd_user_refresh_token_user: glewlwyd_user_refresh_token_user.c unit-tests.o $(CC) $(CFLAGS) glewlwyd_user_refresh_token_user.c unit-tests.o -o glewlwyd_user_refresh_token_user $(LIBS) test_glewlwyd_user_refresh_token_user: glewlwyd_user_refresh_token_user -./run_test.sh ./glewlwyd_user_refresh_token_user glewlwyd_user_refresh_token_admin: glewlwyd_user_refresh_token_admin.c unit-tests.o $(CC) $(CFLAGS) glewlwyd_user_refresh_token_admin.c unit-tests.o -o glewlwyd_user_refresh_token_admin $(LIBS) test_glewlwyd_user_refresh_token_admin: glewlwyd_user_refresh_token_admin -./run_test.sh ./glewlwyd_user_refresh_token_admin # This test has to be launched manually, because it expects an input from the user glewlwyd_update_user_profile: glewlwyd_update_user_profile.c unit-tests.o $(CC) $(CFLAGS) glewlwyd_update_user_profile.c unit-tests.o -o glewlwyd_update_user_profile $(LIBS) test_glewlwyd_update_user_profile: glewlwyd_update_user_profile -./run_test.sh ./glewlwyd_update_user_profile # This test has to be launched manually, because it requires a different config file glewlwyd_http_auth: glewlwyd_http_auth.c unit-tests.o $(CC) $(CFLAGS) glewlwyd_http_auth.c unit-tests.o -o glewlwyd_http_auth $(LIBS) test_glewlwyd_http_auth: glewlwyd_http_auth -./run_test.sh ./glewlwyd_http_auth test: test_glewlwyd_oauth2_resource_owner_pwd_cred test_glewlwyd_oauth2_resource_owner_pwd_cred_client_confidential test_glewlwyd_oauth2_implicit test_glewlwyd_oauth2_code test_glewlwyd_oauth2_code_client_confidential test_glewlwyd_oauth2_client_cred test_glewlwyd_oauth2_auth_code test_glewlwyd_oauth2_refresh_token test_glewlwyd_oauth2_refresh_token_client_confidential test_glewlwyd_delete_token test_glewlwyd_admin_authorization test_glewlwyd_crud_scope test_glewlwyd_crud_user test_glewlwyd_crud_client test_glewlwyd_crud_resource test_glewlwyd_user_session_user test_glewlwyd_user_session_admin test_glewlwyd_user_refresh_token_user test_glewlwyd_user_refresh_token_admin glewlwyd-1.3.1/test/README.md000066400000000000000000000025321322667720100156200ustar00rootroot00000000000000# Glewlwyd unit tests These unit tests are based on the [check framework](http://check.sourceforge.net/). You must install check library first. All the unit tests test the behaviour of the functionalities available in the REST API. Which means to run a valid test case, you must have a running instance of Glewlwyd on localhost with the data initialized by the script `init.sql`. When the valid test instance is available, you can build and run each test case. Run `make test` to run all automatic tests. ## Run the test suite Basically, you can use those unit test to validate that all the functionalities are present after a modification in glewlwyd source code. To run a proper set of tests, you must have use a `glewlwyd.conf` file that points to a database initialized with the following scripts: - glewlwyd.[mariadb|sqlite3].sql - test/init.sql Then, on a console, go to the folder `src/`, then run the command `make test-debug` or `make memcheck` to run the tests with valgrind. When glewlwyd is up and running, on another console, go to the folder `test/` and run the command `make test` to run all tests in sequence. To run a single test case, you can run the command `make test_[the test name]`, for example: `make test_glewlwyd_implicit`. If you don't have a LDAP server, the ldap tests will fail, which is normal, you can ignore all the ldap tests. glewlwyd-1.3.1/test/glewlwyd.tests.sql000066400000000000000000000204541322667720100200640ustar00rootroot00000000000000 -- ----------- -- -- Test values -- -- ----------- -- -- Delete initial values DELETE FROM `g_client_user_scope`; DELETE FROM `g_client_authorization_type`; DELETE FROM `g_resource_scope`; DELETE FROM `g_client_scope`; DELETE FROM `g_user_scope`; DELETE FROM `g_resource`; DELETE FROM `g_redirect_uri`; DELETE FROM `g_client`; DELETE FROM `g_scope`; DELETE FROM `g_user`; -- Mariadb/Mysql user add queries INSERT INTO g_user (gu_login, gu_name, gu_email, gu_password, gu_enabled) VALUES ('admin', 'The Boss', 'boss@glewlwyd.domain', PASSWORD('MyAdminPassword2016!'), 1); INSERT INTO g_user (gu_login, gu_name, gu_email, gu_password, gu_additional_property_value, gu_enabled) VALUES ('user1', 'Dave Lopper1', 'user1@glewlwyd.domain', PASSWORD('MyUser1Password!'), 'newValue1', 1); INSERT INTO g_user (gu_login, gu_name, gu_email, gu_password, gu_additional_property_value, gu_enabled) VALUES ('user2', 'Dave Lopper2', 'user2@glewlwyd.domain', PASSWORD('MyUser2Password!'), 'newValue2', 1); INSERT INTO g_user (gu_login, gu_name, gu_email, gu_password, gu_additional_property_value, gu_enabled) VALUES ('user3', 'Dave Lopper3', 'user3@glewlwyd.domain', PASSWORD('MyUser3Password!'), 'newValue3', 1); -- SQLite3 user add queries (passwords are md5/base64 encoded, but they are the same as below) -- INSERT INTO g_user (gu_login, gu_name, gu_email, gu_password, gu_enabled) VALUES ('admin', 'The Boss', 'boss@glewlwyd.domain', '{MD5}Fq5Um/6ZzkTEE01faw8dlw==', 1); -- INSERT INTO g_user (gu_login, gu_name, gu_email, gu_password, gu_additional_property_value, gu_enabled) VALUES ('user1', 'Dave Lopper1', 'user1@glewlwyd.domain', '{MD5}5jDmBvYYgDjSOobF6bsjdw==', 'newValue1', 1); -- INSERT INTO g_user (gu_login, gu_name, gu_email, gu_password, gu_additional_property_value, gu_enabled) VALUES ('user2', 'Dave Lopper2', 'user2@glewlwyd.domain', '{MD5}SGTYDlfN1G2QkANBZgzCIQ==', 'newValue2', 1); -- INSERT INTO g_user (gu_login, gu_name, gu_email, gu_password, gu_additional_property_value, gu_enabled) VALUES ('user3', 'Dave Lopper3', 'user3@glewlwyd.domain', '{MD5}MSs++hzB5w==', 'newValue3', 1); INSERT INTO g_scope (gs_name, gs_description) VALUES ('g_admin', 'Glewlwyd admin scope'); INSERT INTO g_scope (gs_name, gs_description) VALUES ('g_profile', 'Glewlwyd profile scope'); INSERT INTO g_scope (gs_name, gs_description) VALUES ('scope1', 'Description for scope1'); INSERT INTO g_scope (gs_name, gs_description) VALUES ('scope2', 'Description for scope2'); INSERT INTO g_scope (gs_name, gs_description) VALUES ('scope3', 'Description for scope3'); INSERT INTO g_client (gc_name, gc_description, gc_client_id) VALUES ('client1', 'Description for client1', 'client1_id'); INSERT INTO g_client (gc_name, gc_description, gc_client_id) VALUES ('client2', 'Description for client2', 'client2_id'); -- Mariadb/Mysql INSERT INTO g_client (gc_name, gc_description, gc_client_id, gc_client_password, gc_confidential) VALUES ('client3', 'Description for client3', 'client3_id', PASSWORD('client3_password'), 1); -- SQLite3 (password is md5/base64 encoded, but it is the same as below) -- INSERT INTO g_client (gc_name, gc_description, gc_client_id, gc_client_password, gc_confidential) VALUES ('client3', 'Description for client3', 'client3_id', '{MD5}Vaqk5DGQQunyN3gdVjMJGw==', 1); INSERT INTO g_client_scope (gc_id, gs_id) VALUES ((SELECT gc_id from g_client WHERE gc_client_id='client3_id'), (SELECT gs_id from g_scope WHERE gs_name='scope2')); INSERT INTO g_client_scope (gc_id, gs_id) VALUES ((SELECT gc_id from g_client WHERE gc_client_id='client3_id'), (SELECT gs_id from g_scope WHERE gs_name='scope3')); INSERT INTO g_redirect_uri (gru_name, gru_uri, gc_id) VALUES ('uri_client1_1', '../app/test-token.html?param=client1_cb1', (SELECT gc_id from g_client WHERE gc_client_id='client1_id')); INSERT INTO g_redirect_uri (gru_name, gru_uri, gc_id) VALUES ('uri_client1_2', '../app/test-token.html?param=client1_cb2', (SELECT gc_id from g_client WHERE gc_client_id='client1_id')); INSERT INTO g_redirect_uri (gru_name, gru_uri, gc_id) VALUES ('uri_client1_3', 'http://localhost:3000/', (SELECT gc_id from g_client WHERE gc_client_id='client1_id')); INSERT INTO g_redirect_uri (gru_name, gru_uri, gc_id) VALUES ('uri_client2', '../app/test-token.html?param=client2_cb', (SELECT gc_id from g_client WHERE gc_client_id='client2_id')); INSERT INTO g_redirect_uri (gru_name, gru_uri, gc_id) VALUES ('uri_client3', '../app/test-token.html?param=client3_cb', (SELECT gc_id from g_client WHERE gc_client_id='client3_id')); INSERT INTO g_resource (gr_name, gr_description, gr_uri) VALUES ('resource1', 'Description for resource1', 'http://resource1.domain'); INSERT INTO g_resource (gr_name, gr_description, gr_uri) VALUES ('resource2', 'Description for resource2', 'http://resource1.domain'); INSERT INTO g_resource (gr_name, gr_description, gr_uri) VALUES ('resource3', 'Description for resource3', 'http://resource1.domain'); INSERT INTO g_user_scope (gu_id, gs_id) VALUES ((SELECT gu_id from g_user WHERE gu_login='admin'), (SELECT gs_id from g_scope WHERE gs_name='g_admin')); INSERT INTO g_user_scope (gu_id, gs_id) VALUES ((SELECT gu_id from g_user WHERE gu_login='admin'), (SELECT gs_id from g_scope WHERE gs_name='g_profile')); INSERT INTO g_user_scope (gu_id, gs_id) VALUES ((SELECT gu_id from g_user WHERE gu_login='user1'), (SELECT gs_id from g_scope WHERE gs_name='scope1')); INSERT INTO g_user_scope (gu_id, gs_id) VALUES ((SELECT gu_id from g_user WHERE gu_login='user1'), (SELECT gs_id from g_scope WHERE gs_name='scope2')); INSERT INTO g_user_scope (gu_id, gs_id) VALUES ((SELECT gu_id from g_user WHERE gu_login='user1'), (SELECT gs_id from g_scope WHERE gs_name='scope3')); INSERT INTO g_user_scope (gu_id, gs_id) VALUES ((SELECT gu_id from g_user WHERE gu_login='user1'), (SELECT gs_id from g_scope WHERE gs_name='g_profile')); INSERT INTO g_user_scope (gu_id, gs_id) VALUES ((SELECT gu_id from g_user WHERE gu_login='user2'), (SELECT gs_id from g_scope WHERE gs_name='scope1')); INSERT INTO g_user_scope (gu_id, gs_id) VALUES ((SELECT gu_id from g_user WHERE gu_login='user2'), (SELECT gs_id from g_scope WHERE gs_name='g_profile')); INSERT INTO g_user_scope (gu_id, gs_id) VALUES ((SELECT gu_id from g_user WHERE gu_login='user3'), (SELECT gs_id from g_scope WHERE gs_name='scope1')); INSERT INTO g_user_scope (gu_id, gs_id) VALUES ((SELECT gu_id from g_user WHERE gu_login='user3'), (SELECT gs_id from g_scope WHERE gs_name='scope2')); INSERT INTO g_user_scope (gu_id, gs_id) VALUES ((SELECT gu_id from g_user WHERE gu_login='user3'), (SELECT gs_id from g_scope WHERE gs_name='scope3')); INSERT INTO g_user_scope (gu_id, gs_id) VALUES ((SELECT gu_id from g_user WHERE gu_login='user3'), (SELECT gs_id from g_scope WHERE gs_name='g_profile')); INSERT INTO g_resource_scope (gr_id, gs_id) VALUES ((SELECT gr_id from g_resource WHERE gr_name='resource1'), (SELECT gs_id from g_scope WHERE gs_name='scope1')); INSERT INTO g_resource_scope (gr_id, gs_id) VALUES ((SELECT gr_id from g_resource WHERE gr_name='resource1'), (SELECT gs_id from g_scope WHERE gs_name='scope2')); INSERT INTO g_resource_scope (gr_id, gs_id) VALUES ((SELECT gr_id from g_resource WHERE gr_name='resource2'), (SELECT gs_id from g_scope WHERE gs_name='scope2')); INSERT INTO g_resource_scope (gr_id, gs_id) VALUES ((SELECT gr_id from g_resource WHERE gr_name='resource3'), (SELECT gs_id from g_scope WHERE gs_name='scope3')); INSERT INTO g_client_authorization_type (gc_client_id, got_id) VALUES ('client1_id', (SELECT got_id from g_authorization_type WHERE got_name='code')); INSERT INTO g_client_authorization_type (gc_client_id, got_id) VALUES ('client1_id', (SELECT got_id from g_authorization_type WHERE got_name='token')); INSERT INTO g_client_authorization_type (gc_client_id, got_id) VALUES ('client2_id', (SELECT got_id from g_authorization_type WHERE got_name='code')); INSERT INTO g_client_authorization_type (gc_client_id, got_id) VALUES ('client3_id', (SELECT got_id FROM g_authorization_type WHERE got_name='code')); INSERT INTO g_client_authorization_type (gc_client_id, got_id) VALUES ('client3_id', (SELECT got_id from g_authorization_type WHERE got_name='token')); INSERT INTO g_client_authorization_type (gc_client_id, got_id) VALUES ('client3_id', (SELECT got_id from g_authorization_type WHERE got_name='password')); INSERT INTO g_client_authorization_type (gc_client_id, got_id) VALUES ('client3_id', (SELECT got_id FROM g_authorization_type WHERE got_name='client_credentials')); glewlwyd-1.3.1/test/glewlwyd_admin_authorization.c000066400000000000000000000120021322667720100224640ustar00rootroot00000000000000/* Public domain, no copyright. Use at your own risk. */ #include #include #include #include #include #include #include #include #include #include "unit-tests.h" #define SERVER_URI "http://localhost:4593/api" #define USERNAME "admin" #define PASSWORD "MyAdminPassword2016!" #define SCOPE_LIST "g_admin" struct _u_request user_req; START_TEST(test_glwd_admin_authorization_list) { char * url = msprintf("%s/authorization/", SERVER_URI); json_t * j_authorization_code = json_string("authorization_code"); int res = run_simple_test(&user_req, "GET", url, NULL, NULL, NULL, NULL, 200, j_authorization_code, NULL, NULL); free(url); json_decref(j_authorization_code); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_admin_authorization_authorization_code) { char * url = msprintf("%s/authorization/authorization_code", SERVER_URI); json_t * j_authorization_code = json_string("authorization_code"); int res = run_simple_test(&user_req, "GET", url, NULL, NULL, NULL, NULL, 200, j_authorization_code, NULL, NULL); free(url); json_decref(j_authorization_code); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_admin_authorization_not_found) { char * url = msprintf("%s/authorization/not_found", SERVER_URI); int res = run_simple_test(&user_req, "GET", url, NULL, NULL, NULL, NULL, 404, NULL, NULL, NULL); free(url); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_admin_authorization_update_authorization_code_ok) { json_t * res_body, * json_body; char * url = msprintf("%s/authorization/authorization_code", SERVER_URI); int res; json_body = json_pack("{sssb}", "description", "updated description", "enabled", 0); res = run_simple_test(&user_req, "PUT", url, NULL, NULL, json_body, NULL, 200, NULL, NULL, NULL); json_decref(json_body); ck_assert_int_eq(res, 1); res_body = json_string("updated description"); res = run_simple_test(&user_req, "GET", url, NULL, NULL, NULL, NULL, 200, res_body, NULL, NULL); json_decref(res_body); ck_assert_int_eq(res, 1); json_body = json_pack("{sssb}", "description", "Authorization Code Grant - Access token: https://tools.ietf.org/html/rfc6749#section-4.1", "enabled", 1); res = run_simple_test(&user_req, "PUT", url, NULL, NULL, json_body, NULL, 200, NULL, NULL, NULL); json_decref(json_body); ck_assert_int_eq(res, 1); free(url); } END_TEST START_TEST(test_glwd_admin_authorization_update_authorization_code_invalid) { json_t * json_body; char * url = msprintf("%s/authorization/authorization_code", SERVER_URI); int res; json_body = json_pack("{siss}", "description", 1, "enabled", "invalid"); res = run_simple_test(&user_req, "PUT", url, NULL, NULL, json_body, NULL, 400, NULL, NULL, NULL); json_decref(json_body); ck_assert_int_eq(res, 1); free(url); } END_TEST static Suite *glewlwyd_suite(void) { Suite *s; TCase *tc_core; s = suite_create("Glewlwyd admin authorization"); tc_core = tcase_create("test_glwd_admin_authorization"); tcase_add_test(tc_core, test_glwd_admin_authorization_list); tcase_add_test(tc_core, test_glwd_admin_authorization_authorization_code); tcase_add_test(tc_core, test_glwd_admin_authorization_not_found); tcase_add_test(tc_core, test_glwd_admin_authorization_update_authorization_code_ok); tcase_add_test(tc_core, test_glwd_admin_authorization_update_authorization_code_invalid); tcase_set_timeout(tc_core, 30); suite_add_tcase(s, tc_core); return s; } int main(int argc, char *argv[]) { int number_failed; Suite *s; SRunner *sr; struct _u_request auth_req; struct _u_response auth_resp; int res; y_init_logs("Glewlwyd test", Y_LOG_MODE_CONSOLE, Y_LOG_LEVEL_DEBUG, NULL, "Starting Glewlwyd test"); // Getting a valid session id for authenticated http requests ulfius_init_request(&auth_req); ulfius_init_request(&user_req); ulfius_init_response(&auth_resp); auth_req.http_verb = strdup("POST"); auth_req.http_url = msprintf("%s/token/", SERVER_URI); u_map_put(auth_req.map_post_body, "grant_type", "password"); u_map_put(auth_req.map_post_body, "username", USERNAME); u_map_put(auth_req.map_post_body, "password", PASSWORD); u_map_put(auth_req.map_post_body, "scope", SCOPE_LIST); res = ulfius_send_http_request(&auth_req, &auth_resp); if (res == U_OK) { json_t * json_body = ulfius_get_json_body_response(&auth_resp, NULL); char * bearer_token = msprintf("Bearer %s", (json_string_value(json_object_get(json_body, "access_token")))); y_log_message(Y_LOG_LEVEL_INFO, "User %s authenticated", USERNAME); u_map_put(user_req.map_header, "Authorization", bearer_token); free(bearer_token); json_decref(json_body); } ulfius_clean_request(&auth_req); ulfius_clean_response(&auth_resp); s = glewlwyd_suite(); sr = srunner_create(s); srunner_run_all(sr, CK_VERBOSE); number_failed = srunner_ntests_failed(sr); srunner_free(sr); ulfius_clean_request(&user_req); return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE; } glewlwyd-1.3.1/test/glewlwyd_crud_client.c000066400000000000000000000421461322667720100207230ustar00rootroot00000000000000/* Public domain, no copyright. Use at your own risk. */ #include #include #include #include #include #include #include #include #include #include "unit-tests.h" #define SERVER_URI "http://localhost:4593/api" #define USERNAME "admin" #define PASSWORD "MyAdminPassword2016!" #define SCOPE_LIST "g_admin" #define NEW_CLIENT_SCOPE_LIST "scope1 scope2" struct _u_request user_req; START_TEST(test_glwd_crud_client_list) { char * url = msprintf("%s/client/", SERVER_URI); json_t * j_client1 = json_string("client1_id"); int res = run_simple_test(&user_req, "GET", url, NULL, NULL, NULL, NULL, 200, j_client1, NULL, NULL); free(url); json_decref(j_client1); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_crud_client_search_success) { char * url = msprintf("%s/client/?search=new_client", SERVER_URI); json_t * j_client1 = json_string("new_client"); int res = run_simple_test(&user_req, "GET", url, NULL, NULL, NULL, NULL, 200, j_client1, NULL, NULL); free(url); json_decref(j_client1); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_crud_client_get) { char * url = msprintf("%s/client/client1_id", SERVER_URI); json_t * j_client1 = json_string("client1_id"); int res = run_simple_test(&user_req, "GET", url, NULL, NULL, NULL, NULL, 200, j_client1, NULL, NULL); free(url); json_decref(j_client1); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_crud_client_get_not_found) { char * url = msprintf("%s/client/not_found", SERVER_URI); int res = run_simple_test(&user_req, "GET", url, NULL, NULL, NULL, NULL, 404, NULL, NULL, NULL); free(url); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_crud_client_add_ok_database) { json_t * json_body; char * url = msprintf("%s/client/", SERVER_URI); int res; json_body = json_pack("{sssssssssssosos[ss]s[ss]s[{ssss}{ssss}]}", "source", "database", "name", "new_client", "client_id", "new_client", "description", "New Client", "password", "password", "enabled", json_true(), "confidential", json_true(), "scope", "scope1", "scope2", "authorization_type", "code", "client_credentials", "redirect_uri", "name", "uri1", "uri", "http://example1.com/", "name", "uri2", "uri", "https://example2.com/"); res = run_simple_test(&user_req, "POST", url, NULL, NULL, json_body, NULL, 200, NULL, NULL, NULL); json_decref(json_body); ck_assert_int_eq(res, 1); free(url); } END_TEST START_TEST(test_glwd_crud_client_add_invalid_database) { json_t * json_body; char * url = msprintf("%s/client/", SERVER_URI); int res; json_body = json_pack("{sssisss[s]}", "source", "database", "client_id", 4, "name", "invalid_client", "scope", "scope_invalid"); res = run_simple_test(&user_req, "POST", url, NULL, NULL, json_body, NULL, 400, NULL, NULL, NULL); json_decref(json_body); ck_assert_int_eq(res, 1); free(url); } END_TEST START_TEST(test_glwd_crud_client_get_new_database) { char * url = msprintf("%s/client/new_client?source=database", SERVER_URI); json_t * j_new_client = json_string("new_client"); int res = run_simple_test(&user_req, "GET", url, NULL, NULL, NULL, NULL, 200, j_new_client, NULL, NULL); free(url); json_decref(j_new_client); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_crud_client_set_new_database) { json_t * json_body; char * url = msprintf("%s/client/new_client?source=database", SERVER_URI); json_body = json_pack("{sssssosos[ss]s[ss]s[{ssss}{ssss}]}", "name", "new_client", "description", "New Description", "enabled", json_true(), "confidential", json_true(), "scope", "scope1", "scope2", "authorization_type", "code", "client_credentials", "redirect_uri", "name", "uri1", "uri", "http://example1.com/", "name", "uri2", "uri", "https://example2.com/"); int res = run_simple_test(&user_req, "PUT", url, NULL, NULL, json_body, NULL, 200, NULL, NULL, NULL); free(url); json_decref(json_body); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_crud_client_get_new_updated_database) { char * url = msprintf("%s/client/new_client?source=database", SERVER_URI); json_t * j_new_client = json_string("New Description"); int res = run_simple_test(&user_req, "GET", url, NULL, NULL, NULL, NULL, 200, j_new_client, NULL, NULL); free(url); json_decref(j_new_client); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_crud_client_connect_success) { char * url = msprintf("%s/token/", SERVER_URI); struct _u_map body; u_map_init(&body); u_map_put(&body, "grant_type", "client_credentials"); u_map_put(&body, "scope", "scope1"); int res = run_simple_test(NULL, "POST", url, "new_client", "password", NULL, &body, 200, NULL, "access_token", NULL); free(url); u_map_clean(&body); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_crud_client_delete_new_database) { char * url = msprintf("%s/client/new_client?source=database", SERVER_URI); int res = run_simple_test(&user_req, "DELETE", url, NULL, NULL, NULL, NULL, 200, NULL, NULL, NULL); free(url); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_crud_client_connect_fail) { char * url = msprintf("%s/token/", SERVER_URI); struct _u_map body; u_map_init(&body); u_map_put(&body, "grant_type", "client_credentials"); u_map_put(&body, "scope", NEW_CLIENT_SCOPE_LIST); int res = run_simple_test(NULL, "POST", url, "new_client", "password", NULL, &body, 403, NULL, NULL, NULL); free(url); u_map_clean(&body); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_crud_client_add_ok_ldap) { json_t * json_body; char * url = msprintf("%s/client/", SERVER_URI); int res; json_body = json_pack("{sssssssssssosos[ss]s[ss]s[{ssss}]}", "source", "ldap", "name", "New Client", "client_id", "new_client", "description", "New Client", "password", "password", "enabled", json_true(), "confidential", json_true(), "scope", "scope1", "scope2", "authorization_type", "code", "client_credentials", "redirect_uri", "name", "uri1", "uri", "http://example1.com/", "name", "uri2", "uri", "https://example2.com/"); res = run_simple_test(&user_req, "POST", url, NULL, NULL, json_body, NULL, 200, NULL, NULL, NULL); json_decref(json_body); ck_assert_int_eq(res, 1); free(url); } END_TEST START_TEST(test_glwd_crud_client_add_invalid_ldap) { json_t * json_body; char * url = msprintf("%s/client/", SERVER_URI); int res; json_body = json_pack("{sssisss[s]}", "source", "ldap", "client_id", 4, "name", "invalid_client", "scope", "scope_invalid"); res = run_simple_test(&user_req, "POST", url, NULL, NULL, json_body, NULL, 400, NULL, NULL, NULL); json_decref(json_body); ck_assert_int_eq(res, 1); free(url); } END_TEST START_TEST(test_glwd_crud_client_get_new_ldap) { char * url = msprintf("%s/client/new_client?source=ldap", SERVER_URI); json_t * j_new_client = json_string("new_client"); int res = run_simple_test(&user_req, "GET", url, NULL, NULL, NULL, NULL, 200, j_new_client, NULL, NULL); free(url); json_decref(j_new_client); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_crud_client_set_new_ldap) { json_t * json_body; char * url = msprintf("%s/client/new_client?source=ldap", SERVER_URI); json_body = json_pack("{sssssosos[ss]s[ss]s[{ssss}]}", "name", "New Client", "description", "New Description", "enabled", json_true(), "confidential", json_true(), "scope", "scope1", "scope2", "authorization_type", "code", "client_credentials", "redirect_uri", "name", "uri1", "uri", "http://example1.com/", "name", "uri2", "uri", "https://example2.com/"); int res = run_simple_test(&user_req, "PUT", url, NULL, NULL, json_body, NULL, 200, NULL, NULL, NULL); free(url); json_decref(json_body); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_crud_client_get_new_updated_ldap) { char * url = msprintf("%s/client/new_client?source=ldap", SERVER_URI); json_t * j_new_client = json_string("New Description"); int res = run_simple_test(&user_req, "GET", url, NULL, NULL, NULL, NULL, 200, j_new_client, NULL, NULL); free(url); json_decref(j_new_client); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_crud_client_delete_new_ldap) { char * url = msprintf("%s/client/new_client?source=ldap", SERVER_URI); int res = run_simple_test(&user_req, "DELETE", url, NULL, NULL, NULL, NULL, 200, NULL, NULL, NULL); free(url); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_crud_client_add_ok_no_source) { json_t * json_body; char * url = msprintf("%s/client/", SERVER_URI); int res; json_body = json_pack("{sssssssssosos[ss]s[ss]s[{ssss}{ssss}]}", "name", "New Client", "client_id", "new_client", "description", "New Client", "password", "password", "enabled", json_true(), "confidential", json_true(), "scope", "scope1", "scope2", "authorization_type", "code", "client_credentials", "redirect_uri", "name", "uri1", "uri", "http://example1.com/", "name", "uri2", "uri", "https://example2.com/"); res = run_simple_test(&user_req, "POST", url, NULL, NULL, json_body, NULL, 200, NULL, NULL, NULL); json_decref(json_body); ck_assert_int_eq(res, 1); free(url); } END_TEST START_TEST(test_glwd_crud_client_add_invalid_no_source) { json_t * json_body; char * url = msprintf("%s/client/", SERVER_URI); int res; json_body = json_pack("{sisss[s]}", "client_id", 4, "name", "invalid_client", "scope", "scope_invalid"); res = run_simple_test(&user_req, "POST", url, NULL, NULL, json_body, NULL, 400, NULL, NULL, NULL); json_decref(json_body); ck_assert_int_eq(res, 1); free(url); } END_TEST START_TEST(test_glwd_crud_client_get_new_no_source) { char * url = msprintf("%s/client/new_client", SERVER_URI); json_t * j_new_client = json_string("new_client"); int res = run_simple_test(&user_req, "GET", url, NULL, NULL, NULL, NULL, 200, j_new_client, NULL, NULL); free(url); json_decref(j_new_client); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_crud_client_set_new_no_source) { json_t * json_body; char * url = msprintf("%s/client/new_client", SERVER_URI); json_body = json_pack("{sssssosos[ss]s[ss]s[{ssss}{ssss}]}", "name", "New Client", "description", "New Description", "enabled", json_true(), "confidential", json_true(), "scope", "scope1", "scope2", "authorization_type", "code", "client_credentials", "redirect_uri", "name", "uri1", "uri", "http://example1.com/", "name", "uri2", "uri", "https://example2.com/"); int res = run_simple_test(&user_req, "PUT", url, NULL, NULL, json_body, NULL, 200, NULL, NULL, NULL); free(url); json_decref(json_body); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_crud_client_get_new_updated_no_source) { char * url = msprintf("%s/client/new_client", SERVER_URI); json_t * j_new_client = json_string("New Description"); int res = run_simple_test(&user_req, "GET", url, NULL, NULL, NULL, NULL, 200, j_new_client, NULL, NULL); free(url); json_decref(j_new_client); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_crud_client_delete_new_no_source) { char * url = msprintf("%s/client/new_client", SERVER_URI); int res = run_simple_test(&user_req, "DELETE", url, NULL, NULL, NULL, NULL, 200, NULL, NULL, NULL); free(url); ck_assert_int_eq(res, 1); } END_TEST static Suite *glewlwyd_suite(void) { Suite *s; TCase *tc_core; s = suite_create("Glewlwyd client CRUD"); tc_core = tcase_create("test_glwd_crud_client"); tcase_add_test(tc_core, test_glwd_crud_client_list); tcase_add_test(tc_core, test_glwd_crud_client_get); tcase_add_test(tc_core, test_glwd_crud_client_get_not_found); tcase_add_test(tc_core, test_glwd_crud_client_add_ok_database); tcase_add_test(tc_core, test_glwd_crud_client_search_success); tcase_add_test(tc_core, test_glwd_crud_client_add_invalid_database); tcase_add_test(tc_core, test_glwd_crud_client_get_new_database); tcase_add_test(tc_core, test_glwd_crud_client_set_new_database); tcase_add_test(tc_core, test_glwd_crud_client_get_new_updated_database); tcase_add_test(tc_core, test_glwd_crud_client_connect_success); tcase_add_test(tc_core, test_glwd_crud_client_delete_new_database); tcase_add_test(tc_core, test_glwd_crud_client_connect_fail); tcase_add_test(tc_core, test_glwd_crud_client_add_ok_ldap); tcase_add_test(tc_core, test_glwd_crud_client_search_success); tcase_add_test(tc_core, test_glwd_crud_client_add_invalid_ldap); tcase_add_test(tc_core, test_glwd_crud_client_get_new_ldap); tcase_add_test(tc_core, test_glwd_crud_client_set_new_ldap); tcase_add_test(tc_core, test_glwd_crud_client_get_new_updated_ldap); tcase_add_test(tc_core, test_glwd_crud_client_connect_success); tcase_add_test(tc_core, test_glwd_crud_client_delete_new_ldap); tcase_add_test(tc_core, test_glwd_crud_client_connect_fail); tcase_add_test(tc_core, test_glwd_crud_client_add_ok_no_source); tcase_add_test(tc_core, test_glwd_crud_client_search_success); tcase_add_test(tc_core, test_glwd_crud_client_add_invalid_no_source); tcase_add_test(tc_core, test_glwd_crud_client_get_new_no_source); tcase_add_test(tc_core, test_glwd_crud_client_set_new_no_source); tcase_add_test(tc_core, test_glwd_crud_client_get_new_updated_no_source); tcase_add_test(tc_core, test_glwd_crud_client_connect_success); tcase_add_test(tc_core, test_glwd_crud_client_delete_new_no_source); tcase_add_test(tc_core, test_glwd_crud_client_connect_fail); tcase_set_timeout(tc_core, 30); suite_add_tcase(s, tc_core); return s; } int main(int argc, char *argv[]) { int number_failed; Suite *s; SRunner *sr; struct _u_request auth_req; struct _u_response auth_resp; int res; y_init_logs("Glewlwyd test", Y_LOG_MODE_CONSOLE, Y_LOG_LEVEL_DEBUG, NULL, "Starting Glewlwyd test"); // Getting a valid session id for authenticated http requests ulfius_init_request(&auth_req); ulfius_init_request(&user_req); ulfius_init_response(&auth_resp); auth_req.http_verb = strdup("POST"); auth_req.http_url = msprintf("%s/token/", SERVER_URI); u_map_put(auth_req.map_post_body, "grant_type", "password"); u_map_put(auth_req.map_post_body, "username", USERNAME); u_map_put(auth_req.map_post_body, "password", PASSWORD); u_map_put(auth_req.map_post_body, "scope", SCOPE_LIST); res = ulfius_send_http_request(&auth_req, &auth_resp); if (res == U_OK) { json_t * json_body = ulfius_get_json_body_response(&auth_resp, NULL); char * bearer_token = msprintf("Bearer %s", (json_string_value(json_object_get(json_body, "access_token")))); y_log_message(Y_LOG_LEVEL_INFO, "User %s authenticated", USERNAME); u_map_put(user_req.map_header, "Authorization", bearer_token); free(bearer_token); json_decref(json_body); } ulfius_clean_request(&auth_req); ulfius_clean_response(&auth_resp); s = glewlwyd_suite(); sr = srunner_create(s); srunner_run_all(sr, CK_VERBOSE); number_failed = srunner_ntests_failed(sr); srunner_free(sr); ulfius_clean_request(&user_req); return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE; } glewlwyd-1.3.1/test/glewlwyd_crud_resource.c000066400000000000000000000136671322667720100213020ustar00rootroot00000000000000/* Public domain, no copyright. Use at your own risk. */ #include #include #include #include #include #include #include #include #include #include "unit-tests.h" #define SERVER_URI "http://localhost:4593/api" #define USERNAME "admin" #define PASSWORD "MyAdminPassword2016!" #define SCOPE_LIST "g_admin" struct _u_request user_req; START_TEST(test_glwd_crud_resource_list) { char * url = msprintf("%s/resource/", SERVER_URI); json_t * j_resource1 = json_string("resource1"); int res = run_simple_test(&user_req, "GET", url, NULL, NULL, NULL, NULL, 200, j_resource1, NULL, NULL); free(url); json_decref(j_resource1); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_crud_resource_get) { char * url = msprintf("%s/resource/resource1", SERVER_URI); json_t * j_resource1 = json_string("resource1"); int res = run_simple_test(&user_req, "GET", url, NULL, NULL, NULL, NULL, 200, j_resource1, NULL, NULL); free(url); json_decref(j_resource1); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_crud_resource_get_not_found) { char * url = msprintf("%s/resource/not_found", SERVER_URI); int res = run_simple_test(&user_req, "GET", url, NULL, NULL, NULL, NULL, 404, NULL, NULL, NULL); free(url); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_crud_resource_add_ok) { json_t * json_body; char * url = msprintf("%s/resource/", SERVER_URI); int res; json_body = json_pack("{sssssss[ss]}", "description", "New resource description", "name", "new_resource", "uri", "http://new_resource.domain", "scope", "scope1", "scope2"); res = run_simple_test(&user_req, "POST", url, NULL, NULL, json_body, NULL, 200, NULL, NULL, NULL); json_decref(json_body); ck_assert_int_eq(res, 1); free(url); } END_TEST START_TEST(test_glwd_crud_resource_add_invalid) { json_t * json_body; char * url = msprintf("%s/resource/", SERVER_URI); int res; json_body = json_pack("{si}", "description", 22); res = run_simple_test(&user_req, "POST", url, NULL, NULL, json_body, NULL, 400, NULL, NULL, NULL); json_decref(json_body); ck_assert_int_eq(res, 1); free(url); } END_TEST START_TEST(test_glwd_crud_resource_get_new) { char * url = msprintf("%s/resource/new_resource", SERVER_URI); json_t * j_new_resource = json_string("New resource description"); int res = run_simple_test(&user_req, "GET", url, NULL, NULL, NULL, NULL, 200, j_new_resource, NULL, NULL); free(url); json_decref(j_new_resource); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_crud_resource_set_new) { char * url = msprintf("%s/resource/new_resource", SERVER_URI); json_t * json_body = json_pack("{sssss[ss]}", "description", "New new resource description", "uri", "http://new_resource.domain", "scope", "scope1", "scope2"); int res = run_simple_test(&user_req, "PUT", url, NULL, NULL, json_body, NULL, 200, NULL, NULL, NULL); free(url); json_decref(json_body); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_crud_resource_get_new_updated) { char * url = msprintf("%s/resource/new_resource", SERVER_URI); json_t * j_new_resource = json_string("New new resource description"); int res = run_simple_test(&user_req, "GET", url, NULL, NULL, NULL, NULL, 200, j_new_resource, NULL, NULL); free(url); json_decref(j_new_resource); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_crud_resource_delete_new) { char * url = msprintf("%s/resource/new_resource", SERVER_URI); int res = run_simple_test(&user_req, "DELETE", url, NULL, NULL, NULL, NULL, 200, NULL, NULL, NULL); free(url); ck_assert_int_eq(res, 1); } END_TEST static Suite *glewlwyd_suite(void) { Suite *s; TCase *tc_core; s = suite_create("Glewlwyd resource CRUD"); tc_core = tcase_create("test_glwd_crud_resource"); tcase_add_test(tc_core, test_glwd_crud_resource_list); tcase_add_test(tc_core, test_glwd_crud_resource_get); tcase_add_test(tc_core, test_glwd_crud_resource_get_not_found); tcase_add_test(tc_core, test_glwd_crud_resource_add_ok); tcase_add_test(tc_core, test_glwd_crud_resource_add_invalid); tcase_add_test(tc_core, test_glwd_crud_resource_get_new); tcase_add_test(tc_core, test_glwd_crud_resource_set_new); tcase_add_test(tc_core, test_glwd_crud_resource_get_new_updated); tcase_add_test(tc_core, test_glwd_crud_resource_delete_new); tcase_set_timeout(tc_core, 30); suite_add_tcase(s, tc_core); return s; } int main(int argc, char *argv[]) { int number_failed; Suite *s; SRunner *sr; struct _u_request auth_req; struct _u_response auth_resp; int res; y_init_logs("Glewlwyd test", Y_LOG_MODE_CONSOLE, Y_LOG_LEVEL_DEBUG, NULL, "Starting Glewlwyd test"); // Getting a valid session id for authenticated http requests ulfius_init_request(&auth_req); ulfius_init_request(&user_req); ulfius_init_response(&auth_resp); auth_req.http_verb = strdup("POST"); auth_req.http_url = msprintf("%s/token/", SERVER_URI); u_map_put(auth_req.map_post_body, "grant_type", "password"); u_map_put(auth_req.map_post_body, "username", USERNAME); u_map_put(auth_req.map_post_body, "password", PASSWORD); u_map_put(auth_req.map_post_body, "scope", SCOPE_LIST); res = ulfius_send_http_request(&auth_req, &auth_resp); if (res == U_OK) { json_t * json_body = ulfius_get_json_body_response(&auth_resp, NULL); char * bearer_token = msprintf("Bearer %s", (json_string_value(json_object_get(json_body, "access_token")))); y_log_message(Y_LOG_LEVEL_INFO, "User %s authenticated", USERNAME); u_map_put(user_req.map_header, "Authorization", bearer_token); free(bearer_token); json_decref(json_body); } ulfius_clean_request(&auth_req); ulfius_clean_response(&auth_resp); s = glewlwyd_suite(); sr = srunner_create(s); srunner_run_all(sr, CK_VERBOSE); number_failed = srunner_ntests_failed(sr); srunner_free(sr); ulfius_clean_request(&user_req); return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE; } glewlwyd-1.3.1/test/glewlwyd_crud_scope.c000066400000000000000000000132061322667720100205510ustar00rootroot00000000000000/* Public domain, no copyright. Use at your own risk. */ #include #include #include #include #include #include #include #include #include #include "unit-tests.h" #define SERVER_URI "http://localhost:4593/api" #define USERNAME "admin" #define PASSWORD "MyAdminPassword2016!" #define SCOPE_LIST "g_admin" struct _u_request user_req; START_TEST(test_glwd_crud_scope_list) { char * url = msprintf("%s/scope/", SERVER_URI); json_t * j_scope1 = json_string("scope1"); int res = run_simple_test(&user_req, "GET", url, NULL, NULL, NULL, NULL, 200, j_scope1, NULL, NULL); free(url); json_decref(j_scope1); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_crud_scope_get) { char * url = msprintf("%s/scope/scope1", SERVER_URI); json_t * j_scope1 = json_string("scope1"); int res = run_simple_test(&user_req, "GET", url, NULL, NULL, NULL, NULL, 200, j_scope1, NULL, NULL); free(url); json_decref(j_scope1); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_crud_scope_get_not_found) { char * url = msprintf("%s/scope/not_found", SERVER_URI); int res = run_simple_test(&user_req, "GET", url, NULL, NULL, NULL, NULL, 404, NULL, NULL, NULL); free(url); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_crud_scope_add_ok) { json_t * json_body; char * url = msprintf("%s/scope/", SERVER_URI); int res; json_body = json_pack("{ssss}", "description", "New scope description", "name", "new_scope"); res = run_simple_test(&user_req, "POST", url, NULL, NULL, json_body, NULL, 200, NULL, NULL, NULL); json_decref(json_body); ck_assert_int_eq(res, 1); free(url); } END_TEST START_TEST(test_glwd_crud_scope_add_invalid) { json_t * json_body; char * url = msprintf("%s/scope/", SERVER_URI); int res; json_body = json_pack("{si}", "description", 22); res = run_simple_test(&user_req, "POST", url, NULL, NULL, json_body, NULL, 400, NULL, NULL, NULL); json_decref(json_body); ck_assert_int_eq(res, 1); free(url); } END_TEST START_TEST(test_glwd_crud_scope_get_new) { char * url = msprintf("%s/scope/new_scope", SERVER_URI); json_t * j_new_scope = json_string("New scope description"); int res = run_simple_test(&user_req, "GET", url, NULL, NULL, NULL, NULL, 200, j_new_scope, NULL, NULL); free(url); json_decref(j_new_scope); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_crud_scope_set_new) { char * url = msprintf("%s/scope/new_scope", SERVER_URI); json_t * json_body = json_pack("{ss}", "description", "New new scope description"); int res = run_simple_test(&user_req, "PUT", url, NULL, NULL, json_body, NULL, 200, NULL, NULL, NULL); free(url); json_decref(json_body); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_crud_scope_get_new_updated) { char * url = msprintf("%s/scope/new_scope", SERVER_URI); json_t * j_new_scope = json_string("New new scope description"); int res = run_simple_test(&user_req, "GET", url, NULL, NULL, NULL, NULL, 200, j_new_scope, NULL, NULL); free(url); json_decref(j_new_scope); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_crud_scope_delete_new) { char * url = msprintf("%s/scope/new_scope", SERVER_URI); int res = run_simple_test(&user_req, "DELETE", url, NULL, NULL, NULL, NULL, 200, NULL, NULL, NULL); free(url); ck_assert_int_eq(res, 1); } END_TEST static Suite *glewlwyd_suite(void) { Suite *s; TCase *tc_core; s = suite_create("Glewlwyd scope CRUD"); tc_core = tcase_create("test_glwd_crud_scope"); tcase_add_test(tc_core, test_glwd_crud_scope_list); tcase_add_test(tc_core, test_glwd_crud_scope_get); tcase_add_test(tc_core, test_glwd_crud_scope_get_not_found); tcase_add_test(tc_core, test_glwd_crud_scope_add_ok); tcase_add_test(tc_core, test_glwd_crud_scope_add_invalid); tcase_add_test(tc_core, test_glwd_crud_scope_get_new); tcase_add_test(tc_core, test_glwd_crud_scope_set_new); tcase_add_test(tc_core, test_glwd_crud_scope_get_new_updated); tcase_add_test(tc_core, test_glwd_crud_scope_delete_new); tcase_set_timeout(tc_core, 30); suite_add_tcase(s, tc_core); return s; } int main(int argc, char *argv[]) { int number_failed; Suite *s; SRunner *sr; struct _u_request auth_req; struct _u_response auth_resp; int res; y_init_logs("Glewlwyd test", Y_LOG_MODE_CONSOLE, Y_LOG_LEVEL_DEBUG, NULL, "Starting Glewlwyd test"); // Getting a valid session id for authenticated http requests ulfius_init_request(&auth_req); ulfius_init_request(&user_req); ulfius_init_response(&auth_resp); auth_req.http_verb = strdup("POST"); auth_req.http_url = msprintf("%s/token/", SERVER_URI); u_map_put(auth_req.map_post_body, "grant_type", "password"); u_map_put(auth_req.map_post_body, "username", USERNAME); u_map_put(auth_req.map_post_body, "password", PASSWORD); u_map_put(auth_req.map_post_body, "scope", SCOPE_LIST); res = ulfius_send_http_request(&auth_req, &auth_resp); if (res == U_OK) { json_t * json_body = ulfius_get_json_body_response(&auth_resp, NULL); char * bearer_token = msprintf("Bearer %s", (json_string_value(json_object_get(json_body, "access_token")))); y_log_message(Y_LOG_LEVEL_INFO, "User %s authenticated", USERNAME); u_map_put(user_req.map_header, "Authorization", bearer_token); free(bearer_token); json_decref(json_body); } ulfius_clean_request(&auth_req); ulfius_clean_response(&auth_resp); s = glewlwyd_suite(); sr = srunner_create(s); srunner_run_all(sr, CK_VERBOSE); number_failed = srunner_ntests_failed(sr); srunner_free(sr); ulfius_clean_request(&user_req); return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE; } glewlwyd-1.3.1/test/glewlwyd_crud_user.c000066400000000000000000000535151322667720100204250ustar00rootroot00000000000000/* Public domain, no copyright. Use at your own risk. */ #include #include #include #include #include #include #include #include #include #include #include "unit-tests.h" #define SERVER_URI "http://localhost:4593/api" #define USERNAME "admin" #define PASSWORD "MyAdminPassword2016!" #define SCOPE_LIST "g_admin" struct _u_request user_req; START_TEST(test_glwd_crud_user_list) { char * url = msprintf("%s/user/", SERVER_URI); json_t * j_user1 = json_string("user1"); int res = run_simple_test(&user_req, "GET", url, NULL, NULL, NULL, NULL, 200, j_user1, NULL, NULL); free(url); json_decref(j_user1); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_crud_user_search_success) { char * url = msprintf("%s/user/?search=new_user", SERVER_URI); json_t * j_user1 = json_string("new_user"); int res = run_simple_test(&user_req, "GET", url, NULL, NULL, NULL, NULL, 200, j_user1, NULL, NULL); free(url); json_decref(j_user1); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_crud_user_get) { char * url = msprintf("%s/user/user1", SERVER_URI); json_t * j_user1 = json_string("user1"); int res = run_simple_test(&user_req, "GET", url, NULL, NULL, NULL, NULL, 200, j_user1, NULL, NULL); free(url); json_decref(j_user1); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_crud_user_get_not_found) { char * url = msprintf("%s/user/not_found", SERVER_URI); int res = run_simple_test(&user_req, "GET", url, NULL, NULL, NULL, NULL, 404, NULL, NULL, NULL); free(url); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_crud_user_add_ok_database) { json_t * json_body; char * url = msprintf("%s/user/", SERVER_URI); int res; json_body = json_pack("{sssssssssssss[ss]}", "source", "database", "login", "new_user", "name", "New User", "password", "password", "email", "test@glewlwyd.domain", "additional_property_value", "new property value", "scope", "scope1", "scope2"); res = run_simple_test(&user_req, "POST", url, NULL, NULL, json_body, NULL, 200, NULL, NULL, NULL); json_decref(json_body); ck_assert_int_eq(res, 1); free(url); } END_TEST START_TEST(test_glwd_crud_user_add_invalid_database) { json_t * json_body; char * url = msprintf("%s/user/", SERVER_URI); int res; json_body = json_pack("{sssisss[s]}", "source", "database", "login", 4, "email", "test@glewlwyd.domain", "scope", "scope_invalid"); res = run_simple_test(&user_req, "POST", url, NULL, NULL, json_body, NULL, 400, NULL, NULL, NULL); json_decref(json_body); ck_assert_int_eq(res, 1); free(url); } END_TEST START_TEST(test_glwd_crud_user_get_new_database) { char * url = msprintf("%s/user/new_user?source=database", SERVER_URI); json_t * j_new_user = json_pack("{sssssssssssos[ss]}", "login", "new_user", "name", "New User", "email", "test@glewlwyd.domain", "additional_property_name", "new_property", "additional_property_value", "new property value", "enabled", json_true(), "scope", "scope1", "scope2"); int res = run_simple_test(&user_req, "GET", url, NULL, NULL, NULL, NULL, 200, j_new_user, NULL, NULL); free(url); json_decref(j_new_user); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_crud_user_set_new_database) { char * url = msprintf("%s/user/new_user?source=database", SERVER_URI); json_t * json_body = json_pack("{ss}", "email", "test_new@glewlwyd.domain"); int res = run_simple_test(&user_req, "PUT", url, NULL, NULL, json_body, NULL, 200, NULL, NULL, NULL); free(url); json_decref(json_body); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_crud_user_disable_password_new_database) { char * url = msprintf("%s/user/new_user?source=database", SERVER_URI); json_t * json_body = json_pack("{ss}", "password", ""); int res = run_simple_test(&user_req, "PUT", url, NULL, NULL, json_body, NULL, 200, NULL, NULL, NULL); free(url); json_decref(json_body); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_crud_user_get_new_updated_database) { char * url = msprintf("%s/user/new_user?source=database", SERVER_URI); json_t * j_new_user = json_string("test_new@glewlwyd.domain"); int res = run_simple_test(&user_req, "GET", url, NULL, NULL, NULL, NULL, 200, j_new_user, NULL, NULL); free(url); json_decref(j_new_user); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_crud_user_connect_success_new) { struct _u_request auth_req; struct _u_response auth_resp; ulfius_init_request(&auth_req); ulfius_init_response(&auth_resp); auth_req.http_verb = strdup("POST"); auth_req.http_url = msprintf("%s/auth/user", SERVER_URI); u_map_put(auth_req.map_post_body, "username", "new_user"); u_map_put(auth_req.map_post_body, "password", "password"); ulfius_send_http_request(&auth_req, &auth_resp); ck_assert_int_eq(auth_resp.status, 200); ulfius_clean_request(&auth_req); ulfius_clean_response(&auth_resp); } END_TEST START_TEST(test_glwd_crud_user_check_access_token_ok) { struct _u_request auth_req; struct _u_response auth_resp; json_t * j_body; jwt_t * my_jwt; char * grants; ulfius_init_request(&auth_req); ulfius_init_response(&auth_resp); auth_req.http_verb = strdup("POST"); auth_req.http_url = msprintf("%s/token/", SERVER_URI); u_map_put(auth_req.map_post_body, "username", "new_user"); u_map_put(auth_req.map_post_body, "password", "password"); u_map_put(auth_req.map_post_body, "grant_type", "password"); u_map_put(auth_req.map_post_body, "scope", "scope1 scope2"); ulfius_send_http_request(&auth_req, &auth_resp); ck_assert_int_eq(auth_resp.status, 200); j_body = json_loadb(auth_resp.binary_body, auth_resp.binary_body_length, JSON_DECODE_ANY, NULL); ck_assert_ptr_ne(json_object_get(j_body, "access_token"), NULL); ck_assert_ptr_ne(json_object_get(j_body, "refresh_token"), NULL); ck_assert_str_eq(json_string_value(json_object_get(j_body, "token_type")), "bearer"); ck_assert_ptr_ne(json_object_get(j_body, "iat"), NULL); ck_assert_ptr_ne(json_object_get(j_body, "expires_in"), NULL); ck_assert_str_eq(json_string_value(json_object_get(j_body, "scope")), "scope1 scope2"); ck_assert_int_eq(jwt_decode(&my_jwt, json_string_value(json_object_get(j_body, "access_token")), NULL, 0), 0); grants = jwt_get_grants_json(my_jwt, "new_property"); ck_assert_str_eq(grants, "\"new property value\""); free(grants); json_decref(j_body); jwt_free(my_jwt); ulfius_clean_request(&auth_req); ulfius_clean_response(&auth_resp); } END_TEST START_TEST(test_glwd_crud_user_delete_new_database) { char * url = msprintf("%s/user/new_user?source=database", SERVER_URI); int res = run_simple_test(&user_req, "DELETE", url, NULL, NULL, NULL, NULL, 200, NULL, NULL, NULL); free(url); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_crud_user_add_ok_database_empty_additional_property) { json_t * json_body; char * url = msprintf("%s/user/", SERVER_URI); int res; json_body = json_pack("{sssssssssssss[ss]}", "source", "database", "login", "new_user", "name", "New User", "password", "password", "email", "test@glewlwyd.domain", "additional_property_value", "", "scope", "scope1", "scope2"); res = run_simple_test(&user_req, "POST", url, NULL, NULL, json_body, NULL, 200, NULL, NULL, NULL); json_decref(json_body); ck_assert_int_eq(res, 1); free(url); } END_TEST START_TEST(test_glwd_crud_user_get_new_database_empty_additional_property) { char * url = msprintf("%s/user/new_user?source=database", SERVER_URI); json_t * j_new_user = json_pack("{sssssssssssos[ss]}", "login", "new_user", "name", "New User", "email", "test@glewlwyd.domain", "additional_property_name", "new_property", "additional_property_value", "", "enabled", json_true(), "scope", "scope1", "scope2"); int res = run_simple_test(&user_req, "GET", url, NULL, NULL, NULL, NULL, 200, j_new_user, NULL, NULL); free(url); json_decref(j_new_user); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_crud_user_delete_new_database_empty_additional_property) { char * url = msprintf("%s/user/new_user?source=database", SERVER_URI); int res = run_simple_test(&user_req, "DELETE", url, NULL, NULL, NULL, NULL, 200, NULL, NULL, NULL); free(url); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_crud_user_connect_fail_new) { struct _u_request auth_req; struct _u_response auth_resp; ulfius_init_request(&auth_req); ulfius_init_response(&auth_resp); auth_req.http_verb = strdup("POST"); auth_req.http_url = msprintf("%s/auth/user", SERVER_URI); u_map_put(auth_req.map_post_body, "username", "new_user"); u_map_put(auth_req.map_post_body, "password", "password"); ulfius_send_http_request(&auth_req, &auth_resp); ck_assert_int_eq(auth_resp.status, 403); ulfius_clean_request(&auth_req); ulfius_clean_response(&auth_resp); } END_TEST START_TEST(test_glwd_crud_user_connect_fail_empty_password_new) { struct _u_request auth_req; struct _u_response auth_resp; ulfius_init_request(&auth_req); ulfius_init_response(&auth_resp); auth_req.http_verb = strdup("POST"); auth_req.http_url = msprintf("%s/auth/user", SERVER_URI); u_map_put(auth_req.map_post_body, "username", "new_user"); u_map_put(auth_req.map_post_body, "password", ""); ulfius_send_http_request(&auth_req, &auth_resp); ck_assert_int_eq(auth_resp.status, 403); ulfius_clean_request(&auth_req); ulfius_clean_response(&auth_resp); } END_TEST START_TEST(test_glwd_crud_user_add_ok_ldap) { json_t * json_body; char * url = msprintf("%s/user/", SERVER_URI); int res; json_body = json_pack("{sssssssssssss[ss]}", "source", "ldap", "login", "new_user", "name", "New User", "password", "password", "email", "test@glewlwyd.domain", "additional_property_value", "new property value", "scope", "scope1", "scope2"); res = run_simple_test(&user_req, "POST", url, NULL, NULL, json_body, NULL, 200, NULL, NULL, NULL); json_decref(json_body); ck_assert_int_eq(res, 1); free(url); } END_TEST START_TEST(test_glwd_crud_user_add_invalid_ldap) { json_t * json_body; char * url = msprintf("%s/user/", SERVER_URI); int res; json_body = json_pack("{sssisss[s]}", "source", "ldap", "login", 4, "email", "test@glewlwyd.domain", "scope", "scope_invalid"); res = run_simple_test(&user_req, "POST", url, NULL, NULL, json_body, NULL, 400, NULL, NULL, NULL); json_decref(json_body); ck_assert_int_eq(res, 1); free(url); } END_TEST START_TEST(test_glwd_crud_user_get_new_ldap) { char * url = msprintf("%s/user/new_user?source=ldap", SERVER_URI); json_t * j_new_user = json_pack("{sssssssssssos[ss]}", "login", "new_user", "name", "New User", "email", "test@glewlwyd.domain", "additional_property_name", "new_property", "additional_property_value", "new property value", "enabled", json_true(), "scope", "scope1", "scope2"); int res = run_simple_test(&user_req, "GET", url, NULL, NULL, NULL, NULL, 200, j_new_user, NULL, NULL); free(url); json_decref(j_new_user); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_crud_user_set_new_ldap) { char * url = msprintf("%s/user/new_user?source=ldap", SERVER_URI); json_t * json_body = json_pack("{ss}", "email", "test_new@glewlwyd.domain"); int res = run_simple_test(&user_req, "PUT", url, NULL, NULL, json_body, NULL, 200, NULL, NULL, NULL); free(url); json_decref(json_body); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_crud_user_disable_password_new_ldap) { char * url = msprintf("%s/user/new_user?source=ldap", SERVER_URI); json_t * json_body = json_pack("{ss}", "password", ""); int res = run_simple_test(&user_req, "PUT", url, NULL, NULL, json_body, NULL, 200, NULL, NULL, NULL); free(url); json_decref(json_body); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_crud_user_get_new_updated_ldap) { char * url = msprintf("%s/user/new_user?source=ldap", SERVER_URI); json_t * j_new_user = json_string("test_new@glewlwyd.domain"); int res = run_simple_test(&user_req, "GET", url, NULL, NULL, NULL, NULL, 200, j_new_user, NULL, NULL); free(url); json_decref(j_new_user); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_crud_user_delete_new_ldap) { char * url = msprintf("%s/user/new_user?source=ldap", SERVER_URI); int res = run_simple_test(&user_req, "DELETE", url, NULL, NULL, NULL, NULL, 200, NULL, NULL, NULL); free(url); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_crud_user_add_ok_no_source) { json_t * json_body; char * url = msprintf("%s/user/", SERVER_URI); int res; json_body = json_pack("{sssssssssss[ss]}", "login", "new_user", "name", "New User", "password", "password", "email", "test@glewlwyd.domain", "additional_property_value", "new property value", "scope", "scope1", "scope2"); res = run_simple_test(&user_req, "POST", url, NULL, NULL, json_body, NULL, 200, NULL, NULL, NULL); json_decref(json_body); ck_assert_int_eq(res, 1); free(url); } END_TEST START_TEST(test_glwd_crud_user_add_invalid_no_source) { json_t * json_body; char * url = msprintf("%s/user/", SERVER_URI); int res; json_body = json_pack("{sisss[s]}", "login", 4, "email", "test@glewlwyd.domain", "scope", "scope_invalid"); res = run_simple_test(&user_req, "POST", url, NULL, NULL, json_body, NULL, 400, NULL, NULL, NULL); json_decref(json_body); ck_assert_int_eq(res, 1); free(url); } END_TEST START_TEST(test_glwd_crud_user_get_new_no_source) { char * url = msprintf("%s/user/new_user", SERVER_URI); json_t * j_new_user = json_pack("{sssssssssssos[ss]}", "login", "new_user", "name", "New User", "email", "test@glewlwyd.domain", "additional_property_name", "new_property", "additional_property_value", "new property value", "enabled", json_true(), "scope", "scope1", "scope2"); int res = run_simple_test(&user_req, "GET", url, NULL, NULL, NULL, NULL, 200, j_new_user, NULL, NULL); free(url); json_decref(j_new_user); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_crud_user_set_new_no_source) { char * url = msprintf("%s/user/new_user", SERVER_URI); json_t * json_body = json_pack("{ss}", "email", "test_new@glewlwyd.domain"); int res = run_simple_test(&user_req, "PUT", url, NULL, NULL, json_body, NULL, 200, NULL, NULL, NULL); free(url); json_decref(json_body); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_crud_user_disable_password_new_no_source) { char * url = msprintf("%s/user/new_user", SERVER_URI); json_t * json_body = json_pack("{ss}", "password", ""); int res = run_simple_test(&user_req, "PUT", url, NULL, NULL, json_body, NULL, 200, NULL, NULL, NULL); free(url); json_decref(json_body); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_crud_user_get_new_updated_no_source) { char * url = msprintf("%s/user/new_user", SERVER_URI); json_t * j_new_user = json_string("test_new@glewlwyd.domain"); int res = run_simple_test(&user_req, "GET", url, NULL, NULL, NULL, NULL, 200, j_new_user, NULL, NULL); free(url); json_decref(j_new_user); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_crud_user_delete_new_no_source) { char * url = msprintf("%s/user/new_user", SERVER_URI); int res = run_simple_test(&user_req, "DELETE", url, NULL, NULL, NULL, NULL, 200, NULL, NULL, NULL); free(url); ck_assert_int_eq(res, 1); } END_TEST static Suite *glewlwyd_suite(void) { Suite *s; TCase *tc_core; s = suite_create("Glewlwyd user CRUD"); tc_core = tcase_create("test_glwd_crud_user"); tcase_add_test(tc_core, test_glwd_crud_user_list); tcase_add_test(tc_core, test_glwd_crud_user_get); tcase_add_test(tc_core, test_glwd_crud_user_get_not_found); tcase_add_test(tc_core, test_glwd_crud_user_add_ok_database); tcase_add_test(tc_core, test_glwd_crud_user_search_success); tcase_add_test(tc_core, test_glwd_crud_user_connect_success_new); tcase_add_test(tc_core, test_glwd_crud_user_check_access_token_ok); tcase_add_test(tc_core, test_glwd_crud_user_add_invalid_database); tcase_add_test(tc_core, test_glwd_crud_user_get_new_database); tcase_add_test(tc_core, test_glwd_crud_user_set_new_database); tcase_add_test(tc_core, test_glwd_crud_user_get_new_updated_database); tcase_add_test(tc_core, test_glwd_crud_user_connect_success_new); tcase_add_test(tc_core, test_glwd_crud_user_check_access_token_ok); tcase_add_test(tc_core, test_glwd_crud_user_disable_password_new_database); tcase_add_test(tc_core, test_glwd_crud_user_connect_fail_new); tcase_add_test(tc_core, test_glwd_crud_user_connect_fail_empty_password_new); tcase_add_test(tc_core, test_glwd_crud_user_delete_new_database); tcase_add_test(tc_core, test_glwd_crud_user_add_ok_database_empty_additional_property); tcase_add_test(tc_core, test_glwd_crud_user_get_new_database_empty_additional_property); tcase_add_test(tc_core, test_glwd_crud_user_delete_new_database_empty_additional_property); tcase_add_test(tc_core, test_glwd_crud_user_connect_fail_new); tcase_add_test(tc_core, test_glwd_crud_user_add_ok_ldap); tcase_add_test(tc_core, test_glwd_crud_user_search_success); tcase_add_test(tc_core, test_glwd_crud_user_connect_success_new); tcase_add_test(tc_core, test_glwd_crud_user_check_access_token_ok); tcase_add_test(tc_core, test_glwd_crud_user_add_invalid_ldap); tcase_add_test(tc_core, test_glwd_crud_user_get_new_ldap); tcase_add_test(tc_core, test_glwd_crud_user_set_new_ldap); tcase_add_test(tc_core, test_glwd_crud_user_get_new_updated_ldap); tcase_add_test(tc_core, test_glwd_crud_user_connect_success_new); tcase_add_test(tc_core, test_glwd_crud_user_check_access_token_ok); tcase_add_test(tc_core, test_glwd_crud_user_disable_password_new_ldap); tcase_add_test(tc_core, test_glwd_crud_user_connect_fail_new); tcase_add_test(tc_core, test_glwd_crud_user_connect_fail_empty_password_new); tcase_add_test(tc_core, test_glwd_crud_user_delete_new_ldap); tcase_add_test(tc_core, test_glwd_crud_user_connect_fail_new); tcase_add_test(tc_core, test_glwd_crud_user_add_ok_no_source); tcase_add_test(tc_core, test_glwd_crud_user_search_success); tcase_add_test(tc_core, test_glwd_crud_user_connect_success_new); tcase_add_test(tc_core, test_glwd_crud_user_check_access_token_ok); tcase_add_test(tc_core, test_glwd_crud_user_add_invalid_no_source); tcase_add_test(tc_core, test_glwd_crud_user_get_new_no_source); tcase_add_test(tc_core, test_glwd_crud_user_set_new_no_source); tcase_add_test(tc_core, test_glwd_crud_user_get_new_updated_no_source); tcase_add_test(tc_core, test_glwd_crud_user_connect_success_new); tcase_add_test(tc_core, test_glwd_crud_user_check_access_token_ok); tcase_add_test(tc_core, test_glwd_crud_user_disable_password_new_no_source); tcase_add_test(tc_core, test_glwd_crud_user_connect_fail_new); tcase_add_test(tc_core, test_glwd_crud_user_connect_fail_empty_password_new); tcase_add_test(tc_core, test_glwd_crud_user_delete_new_no_source); tcase_add_test(tc_core, test_glwd_crud_user_connect_fail_new); tcase_set_timeout(tc_core, 30); suite_add_tcase(s, tc_core); return s; } int main(int argc, char *argv[]) { int number_failed; Suite *s; SRunner *sr; struct _u_request auth_req; struct _u_response auth_resp; int res; y_init_logs("Glewlwyd test", Y_LOG_MODE_CONSOLE, Y_LOG_LEVEL_DEBUG, NULL, "Starting Glewlwyd test"); // Getting a valid session id for authenticated http requests ulfius_init_request(&auth_req); ulfius_init_request(&user_req); ulfius_init_response(&auth_resp); auth_req.http_verb = strdup("POST"); auth_req.http_url = msprintf("%s/token/", SERVER_URI); u_map_put(auth_req.map_post_body, "grant_type", "password"); u_map_put(auth_req.map_post_body, "username", USERNAME); u_map_put(auth_req.map_post_body, "password", PASSWORD); u_map_put(auth_req.map_post_body, "scope", SCOPE_LIST); res = ulfius_send_http_request(&auth_req, &auth_resp); if (res == U_OK) { json_t * json_body = ulfius_get_json_body_response(&auth_resp, NULL); char * bearer_token = msprintf("Bearer %s", (json_string_value(json_object_get(json_body, "access_token")))); y_log_message(Y_LOG_LEVEL_INFO, "User %s authenticated", USERNAME); u_map_put(user_req.map_header, "Authorization", bearer_token); free(bearer_token); json_decref(json_body); } ulfius_clean_request(&auth_req); ulfius_clean_response(&auth_resp); s = glewlwyd_suite(); sr = srunner_create(s); srunner_run_all(sr, CK_VERBOSE); number_failed = srunner_ntests_failed(sr); srunner_free(sr); ulfius_clean_request(&user_req); return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE; } glewlwyd-1.3.1/test/glewlwyd_delete_token.c000066400000000000000000000067141322667720100210730ustar00rootroot00000000000000/* Public domain, no copyright. Use at your own risk. */ #include #include #include #include #include #include #include #include #include #include "unit-tests.h" #define SERVER_URI "http://localhost:4593/api" #define USERNAME "user1" #define PASSWORD "MyUser1Password!" #define SCOPE_LIST "scope1 scope2" #define CLIENT "client1_id" char * refresh_token; START_TEST(test_glwd_delete_token_token_invalid) { char * url = msprintf("%s/token/", SERVER_URI); struct _u_map body; u_map_init(&body); u_map_put(&body, "grant_type", "delete_token"); u_map_put(&body, "refresh_token", "invalid"); int res = run_simple_test(NULL, "POST", url, NULL, NULL, NULL, &body, 400, NULL, NULL, NULL); free(url); u_map_clean(&body); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_delete_token_ok) { char * url = msprintf("%s/token/", SERVER_URI); struct _u_map body; u_map_init(&body); u_map_put(&body, "grant_type", "delete_token"); u_map_put(&body, "refresh_token", refresh_token); int res = run_simple_test(NULL, "POST", url, NULL, NULL, NULL, &body, 200, NULL, NULL, NULL); free(url); u_map_clean(&body); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_delete_token_token_already_deleted) { char * url = msprintf("%s/token/", SERVER_URI); struct _u_map body; u_map_init(&body); u_map_put(&body, "grant_type", "delete_token"); u_map_put(&body, "refresh_token", refresh_token); int res = run_simple_test(NULL, "POST", url, NULL, NULL, NULL, &body, 400, NULL, NULL, NULL); free(url); u_map_clean(&body); ck_assert_int_eq(res, 1); } END_TEST static Suite *glewlwyd_suite(void) { Suite *s; TCase *tc_core; s = suite_create("Glewlwyd delete token"); tc_core = tcase_create("test_glwd_delete_token"); tcase_add_test(tc_core, test_glwd_delete_token_token_invalid); tcase_add_test(tc_core, test_glwd_delete_token_ok); tcase_add_test(tc_core, test_glwd_delete_token_token_already_deleted); tcase_set_timeout(tc_core, 30); suite_add_tcase(s, tc_core); return s; } int main(int argc, char *argv[]) { int number_failed; Suite *s; SRunner *sr; struct _u_request auth_req; struct _u_response auth_resp; int res; y_init_logs("Glewlwyd test", Y_LOG_MODE_CONSOLE, Y_LOG_LEVEL_DEBUG, NULL, "Starting Glewlwyd test"); // Getting a valid session id for authenticated http requests ulfius_init_request(&auth_req); ulfius_init_response(&auth_resp); auth_req.http_verb = strdup("POST"); auth_req.http_url = msprintf("%s/token/", SERVER_URI); u_map_put(auth_req.map_post_body, "grant_type", "password"); u_map_put(auth_req.map_post_body, "username", USERNAME); u_map_put(auth_req.map_post_body, "password", PASSWORD); u_map_put(auth_req.map_post_body, "scope", SCOPE_LIST); res = ulfius_send_http_request(&auth_req, &auth_resp); if (res == U_OK) { json_t * json_body = ulfius_get_json_body_response(&auth_resp, NULL); refresh_token = o_strdup(json_string_value(json_object_get(json_body, "refresh_token"))); y_log_message(Y_LOG_LEVEL_INFO, "User %s authenticated", USERNAME); json_decref(json_body); } ulfius_clean_request(&auth_req); ulfius_clean_response(&auth_resp); s = glewlwyd_suite(); sr = srunner_create(s); srunner_run_all(sr, CK_VERBOSE); number_failed = srunner_ntests_failed(sr); srunner_free(sr); free(refresh_token); return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE; } glewlwyd-1.3.1/test/glewlwyd_http_auth.c000066400000000000000000000312651322667720100204300ustar00rootroot00000000000000/* Public domain, no copyright. Use at your own risk. */ #include #include #include #include #include #include #include #include #include #include #include "unit-tests.h" #define SERVER_URI "http://localhost:4593/api" #define CLIENT "client1_id" #define PORT 2884 #define PREFIX "/auth" #define HTTP_USER "http_user" #define HTTP_PASSWORD "http_user_password" struct _u_request user_req; char * code; /** * Auth function for basic authentication */ int auth_basic (const struct _u_request * request, struct _u_response * response, void * user_data) { if (request->auth_basic_user != NULL && request->auth_basic_password != NULL) { if (0 == o_strcmp(request->auth_basic_user, HTTP_USER) && 0 == o_strcmp(request->auth_basic_password, HTTP_PASSWORD)) { return U_CALLBACK_CONTINUE; } else { return U_CALLBACK_UNAUTHORIZED; } } else { return U_CALLBACK_UNAUTHORIZED; } } START_TEST(test_glwd_crud_user_connect_http_auth_success) { struct _u_request auth_req; struct _u_response auth_resp; ulfius_init_request(&auth_req); ulfius_init_response(&auth_resp); auth_req.http_verb = strdup("POST"); auth_req.http_url = msprintf("%s/auth/user", SERVER_URI); u_map_put(auth_req.map_post_body, "username", HTTP_USER); u_map_put(auth_req.map_post_body, "password", HTTP_PASSWORD); ulfius_send_http_request(&auth_req, &auth_resp); ck_assert_int_eq(auth_resp.status, 200); ulfius_clean_request(&auth_req); ulfius_clean_response(&auth_resp); } END_TEST START_TEST(test_glwd_crud_user_connect_http_auth_fail) { struct _u_request auth_req; struct _u_response auth_resp; ulfius_init_request(&auth_req); ulfius_init_response(&auth_resp); auth_req.http_verb = strdup("POST"); auth_req.http_url = msprintf("%s/auth/user", SERVER_URI); u_map_put(auth_req.map_post_body, "username", HTTP_USER); u_map_put(auth_req.map_post_body, "password", "invalid"); ulfius_send_http_request(&auth_req, &auth_resp); ck_assert_int_eq(auth_resp.status, 403); ulfius_clean_request(&auth_req); ulfius_clean_response(&auth_resp); } END_TEST START_TEST(test_glwd_crud_user_check_access_token_http_auth_ok) { struct _u_request auth_req; struct _u_response auth_resp; json_t * j_body; ulfius_init_request(&auth_req); ulfius_init_response(&auth_resp); auth_req.http_verb = strdup("POST"); auth_req.http_url = msprintf("%s/token/", SERVER_URI); u_map_put(auth_req.map_post_body, "username", HTTP_USER); u_map_put(auth_req.map_post_body, "password", HTTP_PASSWORD); u_map_put(auth_req.map_post_body, "grant_type", "password"); ulfius_send_http_request(&auth_req, &auth_resp); ck_assert_int_eq(auth_resp.status, 200); j_body = json_loadb(auth_resp.binary_body, auth_resp.binary_body_length, JSON_DECODE_ANY, NULL); ck_assert_ptr_ne(json_object_get(j_body, "access_token"), NULL); ck_assert_ptr_ne(json_object_get(j_body, "refresh_token"), NULL); ck_assert_str_eq(json_string_value(json_object_get(j_body, "token_type")), "bearer"); ck_assert_ptr_ne(json_object_get(j_body, "iat"), NULL); ck_assert_ptr_ne(json_object_get(j_body, "expires_in"), NULL); json_decref(j_body); ulfius_clean_request(&auth_req); ulfius_clean_response(&auth_resp); } END_TEST START_TEST(glewlwyd_resource_owner_pwd_cred_valid_http_auth) { char * url = msprintf("%s/token/", SERVER_URI); struct _u_map body; u_map_init(&body); u_map_put(&body, "grant_type", "password"); u_map_put(&body, "username", HTTP_USER); u_map_put(&body, "password", HTTP_PASSWORD); int res = run_simple_test(NULL, "POST", url, NULL, NULL, NULL, &body, 200, NULL, "refresh_token", NULL); free(url); u_map_clean(&body); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_code_http_auth_ok) { char * url = msprintf("%s/token/", SERVER_URI); struct _u_map body; u_map_init(&body); u_map_put(&body, "grant_type", "authorization_code"); u_map_put(&body, "client_id", CLIENT); u_map_put(&body, "redirect_uri", "../app/test-token.html?param=client1_cb1"); u_map_put(&body, "code", code); free(user_req.http_verb); user_req.http_verb = NULL; int res = run_simple_test(&user_req, "POST", url, NULL, NULL, NULL, &body, 200, NULL, "refresh_token", NULL); free(url); u_map_clean(&body); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_auth_code_ok_redirect_cb_with_code_http_auth) { char * url = msprintf("%s/auth?response_type=code&login_validated=true&client_id=client1_id&redirect_uri=../app/test-token.html?param=client1_cb1&state=xyzabcd", SERVER_URI); int res = run_simple_test(&user_req, "GET", url, NULL, NULL, NULL, NULL, 302, NULL, NULL, "code="); free(url); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_implicit_valid_http_auth) { char * url = msprintf("%s/auth?response_type=token&login_validated=true&client_id=%s&redirect_uri=../app/test-token.html?param=client1_cb1&state=xyzabcd", SERVER_URI, CLIENT); int res = run_simple_test(&user_req, "GET", url, NULL, NULL, NULL, NULL, 302, NULL, NULL, "token="); free(url); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_refresh_token_ok_http_auth) { char * url = msprintf("%s/token/", SERVER_URI), * refresh_token; struct _u_map body; struct _u_request auth_req; struct _u_response auth_resp; int res; ulfius_init_request(&auth_req); ulfius_init_response(&auth_resp); auth_req.http_verb = strdup("POST"); auth_req.http_url = msprintf("%s/token/", SERVER_URI); u_map_put(auth_req.map_post_body, "grant_type", "password"); u_map_put(auth_req.map_post_body, "username", HTTP_USER); u_map_put(auth_req.map_post_body, "password", HTTP_PASSWORD); res = ulfius_send_http_request(&auth_req, &auth_resp); if (res == U_OK) { json_t * json_body = ulfius_get_json_body_response(&auth_resp, NULL); refresh_token = o_strdup(json_string_value(json_object_get(json_body, "refresh_token"))); json_decref(json_body); } ulfius_clean_request(&auth_req); ulfius_clean_response(&auth_resp); u_map_init(&body); u_map_put(&body, "grant_type", "refresh_token"); u_map_put(&body, "refresh_token", refresh_token); res = run_simple_test(NULL, "POST", url, NULL, NULL, NULL, &body, 200, NULL, NULL, NULL); free(url); u_map_clean(&body); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_user_refresh_token_list_all_user) { char * url = msprintf("%s/profile/refresh_token", SERVER_URI); int res = run_simple_test(&user_req, "GET", url, NULL, NULL, NULL, NULL, 200, NULL, NULL, NULL); free(url); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_user_refresh_token_revoke_ok_user) { struct _u_response list_resp, del_resp; int res; json_t * json_body, * json_resp_body; ulfius_init_response(&list_resp); ulfius_init_response(&del_resp); user_req.http_url = msprintf("%s/profile/refresh_token/?valid=true", SERVER_URI); res = ulfius_send_http_request(&user_req, &list_resp); if (res == U_OK) { json_resp_body = ulfius_get_json_body_response(&list_resp, NULL); json_body = json_pack("{ss}", "token_hash", json_string_value(json_object_get(json_array_get(json_resp_body, 0), "token_hash"))); u_map_put(user_req.map_header, "Content-Type", "application/x-www-form-urlencoded"); ulfius_set_json_body_request(&user_req, json_body); json_decref(json_body); json_decref(json_resp_body); } user_req.http_url = msprintf("%s/profile/refresh_token/", SERVER_URI); user_req.http_verb = strdup("DELETE"); ulfius_send_http_request(&user_req, &del_resp); ck_assert_int_eq(del_resp.status, 200); ulfius_clean_response(&list_resp); ulfius_clean_response(&del_resp); } END_TEST START_TEST(test_glwd_user_session_list_all_user) { char * url = msprintf("%s/profile/session", SERVER_URI); int res = run_simple_test(&user_req, "GET", url, NULL, NULL, NULL, NULL, 200, NULL, NULL, NULL); free(url); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_user_session_revoke_ok_user) { struct _u_response list_resp, del_resp; int res; struct _u_map body; json_t * json_resp_body; u_map_init(&body); ulfius_init_response(&list_resp); ulfius_init_response(&del_resp); user_req.http_url = msprintf("%s/profile/session?valid=true", SERVER_URI); res = ulfius_send_http_request(&user_req, &list_resp); if (res == U_OK) { json_resp_body = ulfius_get_json_body_response(&list_resp, NULL); json_t * json_body = json_pack("{ss}", "session_hash", json_string_value(json_object_get(json_array_get(json_resp_body, 0), "session_hash"))); u_map_put(user_req.map_header, "Content-Type", "application/x-www-form-urlencoded"); ulfius_set_json_body_request(&user_req, json_body); json_decref(json_body); json_decref(json_resp_body); } user_req.http_url = msprintf("%s/profile/session/", SERVER_URI); user_req.http_verb = strdup("DELETE"); ulfius_send_http_request(&user_req, &del_resp); ck_assert_int_eq(del_resp.status, 200); u_map_clean(&body); ulfius_clean_response(&list_resp); ulfius_clean_response(&del_resp); } END_TEST static Suite *glewlwyd_suite(void) { Suite *s; TCase *tc_core; s = suite_create("Glewlwyd HTTP Auth"); tc_core = tcase_create("test_glwd_http_auth"); tcase_add_test(tc_core, glewlwyd_resource_owner_pwd_cred_valid_http_auth); tcase_add_test(tc_core, test_glwd_crud_user_connect_http_auth_success); tcase_add_test(tc_core, test_glwd_crud_user_connect_http_auth_fail); tcase_add_test(tc_core, test_glwd_crud_user_check_access_token_http_auth_ok); tcase_add_test(tc_core, test_glwd_auth_code_ok_redirect_cb_with_code_http_auth); tcase_add_test(tc_core, test_glwd_code_http_auth_ok); tcase_add_test(tc_core, test_glwd_implicit_valid_http_auth); tcase_add_test(tc_core, test_glwd_refresh_token_ok_http_auth); tcase_add_test(tc_core, test_glwd_user_refresh_token_list_all_user); tcase_add_test(tc_core, test_glwd_user_refresh_token_revoke_ok_user); tcase_add_test(tc_core, test_glwd_user_session_list_all_user); tcase_add_test(tc_core, test_glwd_user_session_revoke_ok_user); tcase_set_timeout(tc_core, 30); suite_add_tcase(s, tc_core); return s; } int main(int argc, char *argv[]) { int number_failed, res; Suite *s; SRunner *sr; struct _u_instance instance; struct _u_request auth_req; struct _u_response auth_resp, code_resp; y_init_logs("Glewlwyd test", Y_LOG_MODE_CONSOLE, Y_LOG_LEVEL_DEBUG, NULL, "Starting Glewlwyd test"); if (ulfius_init_instance(&instance, PORT, NULL, "auth_basic_default") != U_OK) { y_log_message(Y_LOG_LEVEL_INFO, "Error ulfius_init_instance, abort"); return(1); } ulfius_add_endpoint_by_val(&instance, "GET", PREFIX, NULL, 0, &auth_basic, "auth param"); if (ulfius_start_framework(&instance) == U_OK) { y_log_message(Y_LOG_LEVEL_INFO, "Start framework on port %d", instance.port); } else { y_log_message(Y_LOG_LEVEL_INFO, "Error starting framework"); } // Getting a valid session id for authenticated http requests ulfius_init_request(&auth_req); ulfius_init_request(&user_req); ulfius_init_response(&auth_resp); auth_req.http_verb = strdup("POST"); auth_req.http_url = msprintf("%s/auth/user", SERVER_URI); u_map_put(auth_req.map_post_body, "username", HTTP_USER); u_map_put(auth_req.map_post_body, "password", HTTP_PASSWORD); res = ulfius_send_http_request(&auth_req, &auth_resp); if (res == U_OK) { y_log_message(Y_LOG_LEVEL_INFO, "User %s authenticated", HTTP_USER); int i; for (i=0; i #include #include #include #include #include #include #include #include #include "unit-tests.h" #define SERVER_URI "http://localhost:4593/api" #define USERNAME "user1" #define PASSWORD "MyUser1Password!" #define SCOPE_LIST "scope1 scope2" #define CLIENT "client1_id" struct _u_request user_req; START_TEST(test_glwd_auth_invalid_response_type) { char * url = msprintf("%s/auth?response_type=invalid&login_validated=true&client_id=client1_id&redirect_uri=../app/test-token.html&state=xyzabcd&scope=%s", SERVER_URI, SCOPE_LIST); int res = run_simple_test(NULL, "GET", url, NULL, NULL, NULL, NULL, 302, NULL, NULL, "unsupported_response_type"); free(url); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_auth_code_state_ok) { char * url = msprintf("%s/auth?response_type=code&login_validated=true&client_id=client1_id&redirect_uri=../app/test-token.html&state=xyzabcd&scope=%s", SERVER_URI, SCOPE_LIST); int res = run_simple_test(NULL, "GET", url, NULL, NULL, NULL, NULL, 302, NULL, NULL, "state=xyzabcd"); free(url); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_auth_code_ok_redirect_login) { char * url = msprintf("%s/auth?response_type=code&login_validated=true&client_id=client1_id&redirect_uri=../app/test-token.html?param=client1_cb1&state=xyz&scope=%s", SERVER_URI, SCOPE_LIST); int res = run_simple_test(NULL, "GET", url, NULL, NULL, NULL, NULL, 302, NULL, NULL, "login.html"); free(url); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_auth_code_client_invalid) { char * url = msprintf("%s/auth?response_type=code&login_validated=true&client_id=client_error&redirect_uri=../app/test-token.html?param=client1_cb1&state=xyz&scope=%s", SERVER_URI, SCOPE_LIST); int res = run_simple_test(NULL, "GET", url, NULL, NULL, NULL, NULL, 302, NULL, NULL, "unauthorized_client"); free(url); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_auth_code_uri_invalid) { char * url = msprintf("%s/auth?response_type=code&login_validated=true&client_id=client_error&redirect_uri=../app/test-token.html?param=invalid&state=xyz&scope=%s", SERVER_URI, SCOPE_LIST); int res = run_simple_test(NULL, "GET", url, NULL, NULL, NULL, NULL, 302, NULL, NULL, "unauthorized_client"); free(url); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_auth_code_scope_invalid) { char * url = msprintf("%s/auth?response_type=code&login_validated=true&client_id=client1_id&redirect_uri=../app/test-token.html?param=client1_cb1&state=xyzabcd&scope=scope4", SERVER_URI); int res = run_simple_test(&user_req, "GET", url, NULL, NULL, NULL, NULL, 302, NULL, NULL, "invalid_scope"); free(url); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_auth_code_scope_empty) { char * url = msprintf("%s/auth?response_type=code&login_validated=true&client_id=client1_id&redirect_uri=../app/test-token.html?param=client1_cb1&state=xyzabcd", SERVER_URI); int res = run_simple_test(&user_req, "GET", url, NULL, NULL, NULL, NULL, 302, NULL, NULL, "invalid_scope"); free(url); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_auth_code_ok_redirect_cb_with_code) { char * url = msprintf("%s/auth?response_type=code&login_validated=true&client_id=client1_id&redirect_uri=../app/test-token.html?param=client1_cb1&state=xyzabcd&scope=%s", SERVER_URI, SCOPE_LIST); int res = run_simple_test(&user_req, "GET", url, NULL, NULL, NULL, NULL, 302, NULL, NULL, "code="); free(url); ck_assert_int_eq(res, 1); } END_TEST static Suite *glewlwyd_suite(void) { Suite *s; TCase *tc_core; s = suite_create("Glewlwyd auth_code"); tc_core = tcase_create("test_glwd_auth_code"); tcase_add_test(tc_core, test_glwd_auth_invalid_response_type); tcase_add_test(tc_core, test_glwd_auth_code_ok_redirect_login); tcase_add_test(tc_core, test_glwd_auth_code_state_ok); tcase_add_test(tc_core, test_glwd_auth_code_client_invalid); tcase_add_test(tc_core, test_glwd_auth_code_uri_invalid); tcase_add_test(tc_core, test_glwd_auth_code_scope_invalid); tcase_add_test(tc_core, test_glwd_auth_code_scope_empty); tcase_add_test(tc_core, test_glwd_auth_code_ok_redirect_cb_with_code); tcase_set_timeout(tc_core, 30); suite_add_tcase(s, tc_core); return s; } int main(int argc, char *argv[]) { int number_failed; Suite *s; SRunner *sr; struct _u_request auth_req, scope_req; struct _u_response auth_resp, scope_resp; int res; char * url; y_init_logs("Glewlwyd test", Y_LOG_MODE_CONSOLE, Y_LOG_LEVEL_DEBUG, NULL, "Starting Glewlwyd test"); // Getting a valid session id for authenticated http requests ulfius_init_request(&auth_req); ulfius_init_request(&user_req); ulfius_init_response(&auth_resp); auth_req.http_verb = strdup("POST"); auth_req.http_url = msprintf("%s/auth/user", SERVER_URI); u_map_put(auth_req.map_post_body, "username", USERNAME); u_map_put(auth_req.map_post_body, "password", PASSWORD); res = ulfius_send_http_request(&auth_req, &auth_resp); if (res == U_OK) { y_log_message(Y_LOG_LEVEL_INFO, "User %s authenticated", USERNAME); int i; for (i=0; i #include #include #include #include #include #include #include #include #include "unit-tests.h" #define SERVER_URI "http://localhost:4593/api" #define CLIENT_ID "client3_id" #define CLIENT_PASSWORD "client3_password" #define SCOPE_LIST "scope2 scope3" struct _u_request user_req; char * code; START_TEST(glewlwyd_client_cred_valid) { char * url = msprintf("%s/token/", SERVER_URI); struct _u_map body; u_map_init(&body); u_map_put(&body, "grant_type", "client_credentials"); u_map_put(&body, "scope", SCOPE_LIST); int res = run_simple_test(NULL, "POST", url, CLIENT_ID, CLIENT_PASSWORD, NULL, &body, 200, NULL, "access_token", NULL); free(url); u_map_clean(&body); ck_assert_int_eq(res, 1); } END_TEST START_TEST(glewlwyd_client_cred_valid_reduced_scope) { char * url = msprintf("%s/token/", SERVER_URI); struct _u_map body; u_map_init(&body); u_map_put(&body, "grant_type", "client_credentials"); u_map_put(&body, "scope", SCOPE_LIST " scope1"); int res = run_simple_test(NULL, "POST", url, CLIENT_ID, CLIENT_PASSWORD, NULL, &body, 200, NULL, "scope\":\"scope2 scope3\"", NULL); free(url); u_map_clean(&body); ck_assert_int_eq(res, 1); } END_TEST START_TEST(glewlwyd_client_cred_pwd_invalid) { char * url = msprintf("%s/token/", SERVER_URI); struct _u_map body; u_map_init(&body); u_map_put(&body, "grant_type", "client_credentials"); u_map_put(&body, "scope", SCOPE_LIST); int res = run_simple_test(NULL, "POST", url, CLIENT_ID, "invalid", NULL, &body, 403, NULL, NULL, NULL); free(url); u_map_clean(&body); ck_assert_int_eq(res, 1); } END_TEST START_TEST(glewlwyd_client_cred_client_unauthorized) { char * url = msprintf("%s/token/", SERVER_URI); struct _u_map body; u_map_init(&body); u_map_put(&body, "grant_type", "client_credentials"); u_map_put(&body, "scope", SCOPE_LIST); int res = run_simple_test(NULL, "POST", url, "client1_id", CLIENT_PASSWORD, NULL, &body, 403, NULL, NULL, NULL); free(url); u_map_clean(&body); ck_assert_int_eq(res, 1); } END_TEST START_TEST(glewlwyd_client_cred_client_invalid) { char * url = msprintf("%s/token/", SERVER_URI); struct _u_map body; u_map_init(&body); u_map_put(&body, "grant_type", "client_credentials"); u_map_put(&body, "scope", SCOPE_LIST); int res = run_simple_test(NULL, "POST", url, "invalid", CLIENT_PASSWORD, NULL, &body, 403, NULL, NULL, NULL); free(url); u_map_clean(&body); ck_assert_int_eq(res, 1); } END_TEST START_TEST(glewlwyd_client_cred_scope_invalid) { char * url = msprintf("%s/token/", SERVER_URI); struct _u_map body; u_map_init(&body); u_map_put(&body, "grant_type", "client_credentials"); u_map_put(&body, "scope", "scope4"); int res = run_simple_test(NULL, "POST", url, CLIENT_ID, CLIENT_PASSWORD, NULL, &body, 400, NULL, "scope_invalid", NULL); free(url); u_map_clean(&body); ck_assert_int_eq(res, 1); } END_TEST START_TEST(glewlwyd_client_cred_empty) { char * url = msprintf("%s/token/", SERVER_URI); struct _u_map body; u_map_init(&body); u_map_put(&body, "grant_type", "client_credentials"); u_map_put(&body, "scope", SCOPE_LIST); int res = run_simple_test(NULL, "POST", url, NULL, NULL, NULL, &body, 403, NULL, NULL, NULL); free(url); u_map_clean(&body); ck_assert_int_eq(res, 1); } END_TEST static Suite *glewlwyd_suite(void) { Suite *s; TCase *tc_core; s = suite_create("Glewlwyd client credentials"); tc_core = tcase_create("glewlwyd_client_cred"); tcase_add_test(tc_core, glewlwyd_client_cred_valid); tcase_add_test(tc_core, glewlwyd_client_cred_valid_reduced_scope); tcase_add_test(tc_core, glewlwyd_client_cred_pwd_invalid); tcase_add_test(tc_core, glewlwyd_client_cred_client_unauthorized); tcase_add_test(tc_core, glewlwyd_client_cred_client_invalid); tcase_add_test(tc_core, glewlwyd_client_cred_scope_invalid); tcase_add_test(tc_core, glewlwyd_client_cred_empty); tcase_set_timeout(tc_core, 30); suite_add_tcase(s, tc_core); return s; } int main(int argc, char *argv[]) { int number_failed; Suite *s; SRunner *sr; y_init_logs("Glewlwyd test", Y_LOG_MODE_CONSOLE, Y_LOG_LEVEL_DEBUG, NULL, "Starting Glewlwyd test"); s = glewlwyd_suite(); sr = srunner_create(s); srunner_run_all(sr, CK_VERBOSE); number_failed = srunner_ntests_failed(sr); srunner_free(sr); ulfius_clean_request(&user_req); return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE; } glewlwyd-1.3.1/test/glewlwyd_oauth2_code.c000066400000000000000000000143121322667720100206160ustar00rootroot00000000000000/* Public domain, no copyright. Use at your own risk. */ #include #include #include #include #include #include #include #include #include #include "unit-tests.h" #define SERVER_URI "http://localhost:4593/api" #define USERNAME "user1" #define PASSWORD "MyUser1Password!" #define SCOPE_LIST "scope1 scope2" #define CLIENT "client1_id" struct _u_request user_req; char * code; START_TEST(test_glwd_code_code_invalid) { char * url = msprintf("%s/token/", SERVER_URI); struct _u_map body; u_map_init(&body); u_map_put(&body, "grant_type", "authorization_code"); u_map_put(&body, "client_id", CLIENT); u_map_put(&body, "redirect_uri", "../app/test-token.html?param=client1_cb1"); u_map_put(&body, "code", "invalid"); free(user_req.http_verb); user_req.http_verb = NULL; int res = run_simple_test(&user_req, "POST", url, NULL, NULL, NULL, &body, 403, NULL, NULL, NULL); free(url); u_map_clean(&body); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_code_client_invalid) { char * url = msprintf("%s/token/", SERVER_URI); struct _u_map body; u_map_init(&body); u_map_put(&body, "grant_type", "authorization_code"); u_map_put(&body, "client_id", "invalid"); u_map_put(&body, "redirect_uri", "../app/test-token.html?param=client1_cb1"); u_map_put(&body, "code", code); free(user_req.http_verb); user_req.http_verb = NULL; int res = run_simple_test(&user_req, "POST", url, NULL, NULL, NULL, &body, 403, NULL, "unauthorized_client", NULL); free(url); u_map_clean(&body); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_code_redirect_uri_invalid) { char * url = msprintf("%s/token/", SERVER_URI); struct _u_map body; u_map_init(&body); u_map_put(&body, "grant_type", "authorization_code"); u_map_put(&body, "client_id", CLIENT); u_map_put(&body, "redirect_uri", "invalid"); u_map_put(&body, "code", code); free(user_req.http_verb); user_req.http_verb = NULL; int res = run_simple_test(&user_req, "POST", url, NULL, NULL, NULL, &body, 403, NULL, NULL, NULL); free(url); u_map_clean(&body); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_code_ok) { char * url = msprintf("%s/token/", SERVER_URI); struct _u_map body; u_map_init(&body); u_map_put(&body, "grant_type", "authorization_code"); u_map_put(&body, "client_id", CLIENT); u_map_put(&body, "redirect_uri", "../app/test-token.html?param=client1_cb1"); u_map_put(&body, "code", code); free(user_req.http_verb); user_req.http_verb = NULL; int res = run_simple_test(&user_req, "POST", url, NULL, NULL, NULL, &body, 200, NULL, "refresh_token", NULL); free(url); u_map_clean(&body); ck_assert_int_eq(res, 1); } END_TEST static Suite *glewlwyd_suite(void) { Suite *s; TCase *tc_core; s = suite_create("Glewlwyd code"); tc_core = tcase_create("test_glwd_code"); tcase_add_test(tc_core, test_glwd_code_code_invalid); tcase_add_test(tc_core, test_glwd_code_client_invalid); tcase_add_test(tc_core, test_glwd_code_redirect_uri_invalid); tcase_add_test(tc_core, test_glwd_code_ok); tcase_set_timeout(tc_core, 30); suite_add_tcase(s, tc_core); return s; } int main(int argc, char *argv[]) { int number_failed; Suite *s; SRunner *sr; struct _u_request auth_req, scope_req; struct _u_response auth_resp, code_resp; int res; char * url; y_init_logs("Glewlwyd test", Y_LOG_MODE_CONSOLE, Y_LOG_LEVEL_DEBUG, NULL, "Starting Glewlwyd test"); // Getting a valid session id for authenticated http requests ulfius_init_request(&auth_req); ulfius_init_request(&user_req); ulfius_init_response(&auth_resp); auth_req.http_verb = strdup("POST"); auth_req.http_url = msprintf("%s/auth/user", SERVER_URI); u_map_put(auth_req.map_post_body, "username", USERNAME); u_map_put(auth_req.map_post_body, "password", PASSWORD); res = ulfius_send_http_request(&auth_req, &auth_resp); if (res == U_OK) { y_log_message(Y_LOG_LEVEL_INFO, "User %s authenticated", USERNAME); int i; for (i=0; i #include #include #include #include #include #include #include #include #include "unit-tests.h" #define SERVER_URI "http://localhost:4593/api" #define USERNAME "user1" #define PASSWORD "MyUser1Password!" #define SCOPE_LIST "scope1 scope2" #define CLIENT "client3_id" #define CLIENT_PASSWORD "client3_password" #define REDIRECT_URI "../app/test-token.html?param=client3_cb" struct _u_request user_req; char * code; START_TEST(test_glwd_code_code_invalid) { char * url = msprintf("%s/token/", SERVER_URI); struct _u_map body; u_map_init(&body); u_map_put(&body, "grant_type", "authorization_code"); u_map_put(&body, "client_id", CLIENT); u_map_put(&body, "redirect_uri", REDIRECT_URI); u_map_put(&body, "code", "invalid"); free(user_req.http_verb); user_req.http_verb = NULL; int res = run_simple_test(&user_req, "POST", url, CLIENT, CLIENT_PASSWORD, NULL, &body, 403, NULL, NULL, NULL); free(url); u_map_clean(&body); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_code_client_invalid) { char * url = msprintf("%s/token/", SERVER_URI); struct _u_map body; u_map_init(&body); u_map_put(&body, "grant_type", "authorization_code"); u_map_put(&body, "client_id", "invalid"); u_map_put(&body, "redirect_uri", REDIRECT_URI); u_map_put(&body, "code", code); free(user_req.http_verb); user_req.http_verb = NULL; int res = run_simple_test(&user_req, "POST", url, CLIENT, CLIENT_PASSWORD, NULL, &body, 403, NULL, "unauthorized_client", NULL); free(url); u_map_clean(&body); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_code_redirect_uri_invalid) { char * url = msprintf("%s/token/", SERVER_URI); struct _u_map body; u_map_init(&body); u_map_put(&body, "grant_type", "authorization_code"); u_map_put(&body, "client_id", CLIENT); u_map_put(&body, "redirect_uri", "invalid"); u_map_put(&body, "code", code); free(user_req.http_verb); user_req.http_verb = NULL; int res = run_simple_test(&user_req, "POST", url, CLIENT, CLIENT_PASSWORD, NULL, &body, 403, NULL, NULL, NULL); free(url); u_map_clean(&body); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_code_ok) { char * url = msprintf("%s/token/", SERVER_URI); struct _u_map body; u_map_init(&body); u_map_put(&body, "grant_type", "authorization_code"); u_map_put(&body, "client_id", CLIENT); u_map_put(&body, "redirect_uri", REDIRECT_URI); u_map_put(&body, "code", code); free(user_req.http_verb); user_req.http_verb = NULL; int res = run_simple_test(&user_req, "POST", url, CLIENT, CLIENT_PASSWORD, NULL, &body, 200, NULL, "refresh_token", NULL); free(url); u_map_clean(&body); ck_assert_int_eq(res, 1); } END_TEST static Suite *glewlwyd_suite(void) { Suite *s; TCase *tc_core; s = suite_create("Glewlwyd code client confidential"); tc_core = tcase_create("test_glwd_code"); tcase_add_test(tc_core, test_glwd_code_code_invalid); tcase_add_test(tc_core, test_glwd_code_client_invalid); tcase_add_test(tc_core, test_glwd_code_redirect_uri_invalid); tcase_add_test(tc_core, test_glwd_code_ok); tcase_set_timeout(tc_core, 30); suite_add_tcase(s, tc_core); return s; } int main(int argc, char *argv[]) { int number_failed; Suite *s; SRunner *sr; struct _u_request auth_req, scope_req; struct _u_response auth_resp, code_resp; int res; char * url; y_init_logs("Glewlwyd test", Y_LOG_MODE_CONSOLE, Y_LOG_LEVEL_DEBUG, NULL, "Starting Glewlwyd test"); // Getting a valid session id for authenticated http requests ulfius_init_request(&auth_req); ulfius_init_request(&user_req); ulfius_init_request(&scope_req); ulfius_init_response(&auth_resp); auth_req.http_verb = strdup("POST"); auth_req.http_url = msprintf("%s/auth/user", SERVER_URI); u_map_put(auth_req.map_post_body, "username", USERNAME); u_map_put(auth_req.map_post_body, "password", PASSWORD); res = ulfius_send_http_request(&auth_req, &auth_resp); if (res == U_OK) { y_log_message(Y_LOG_LEVEL_INFO, "User %s authenticated", USERNAME); int i; for (i=0; i #include #include #include #include #include #include #include #include #include "unit-tests.h" #define SERVER_URI "http://localhost:4593/api" #define USERNAME "user1" #define PASSWORD "MyUser1Password!" #define SCOPE_LIST "scope1 scope2" #define CLIENT "client1_id" struct _u_request user_req; char * code; START_TEST(test_glwd_implicit_redirect_login) { char * url = msprintf("%s/auth?response_type=token&login_validated=true&client_id=%s&redirect_uri=../app/test-token.html?param=client1_cb1&state=xyzabcd&scope=%s", SERVER_URI, CLIENT, SCOPE_LIST); int res = run_simple_test(NULL, "GET", url, NULL, NULL, NULL, NULL, 302, NULL, NULL, "login.html"); free(url); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_implicit_valid) { char * url = msprintf("%s/auth?response_type=token&login_validated=true&client_id=%s&redirect_uri=../app/test-token.html?param=client1_cb1&state=xyzabcd&scope=%s", SERVER_URI, CLIENT, SCOPE_LIST); int res = run_simple_test(&user_req, "GET", url, NULL, NULL, NULL, NULL, 302, NULL, NULL, "token="); free(url); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_implicit_client_invalid) { char * url = msprintf("%s/auth?response_type=token&login_validated=true&client_id=%s&redirect_uri=../app/test-token.html?param=client1_cb1&state=xyzabcd&scope=%s", SERVER_URI, "invalid", SCOPE_LIST); int res = run_simple_test(&user_req, "GET", url, NULL, NULL, NULL, NULL, 302, NULL, NULL, "error=unauthorized_client"); free(url); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_implicit_redirect_uri_invalid) { char * url = msprintf("%s/auth?response_type=token&login_validated=true&client_id=%s&redirect_uri=invalid&state=xyzabcd&scope=%s", SERVER_URI, CLIENT, SCOPE_LIST); int res = run_simple_test(&user_req, "GET", url, NULL, NULL, NULL, NULL, 302, NULL, NULL, "error=unauthorized_client"); free(url); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_implicit_scope_invalid) { char * url = msprintf("%s/auth?response_type=token&login_validated=true&client_id=%s&redirect_uri=../app/test-token.html?param=client1_cb1&state=xyzabcd&scope=%s", SERVER_URI, CLIENT, "scope4"); int res = run_simple_test(&user_req, "GET", url, NULL, NULL, NULL, NULL, 302, NULL, NULL, "error=invalid_scope"); free(url); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_implicit_empty) { char * url = msprintf("%s/auth?response_type=token&state=xyzabcd&login_validated=true", SERVER_URI); int res = run_simple_test(&user_req, "GET", url, NULL, NULL, NULL, NULL, 403, NULL, NULL, NULL); free(url); ck_assert_int_eq(res, 1); } END_TEST static Suite *glewlwyd_suite(void) { Suite *s; TCase *tc_core; s = suite_create("Glewlwyd implicit"); tc_core = tcase_create("test_glwd_implicit"); tcase_add_test(tc_core, test_glwd_implicit_redirect_login); tcase_add_test(tc_core, test_glwd_implicit_valid); tcase_add_test(tc_core, test_glwd_implicit_client_invalid); tcase_add_test(tc_core, test_glwd_implicit_redirect_uri_invalid); tcase_add_test(tc_core, test_glwd_implicit_scope_invalid); tcase_add_test(tc_core, test_glwd_implicit_empty); tcase_set_timeout(tc_core, 30); suite_add_tcase(s, tc_core); return s; } int main(int argc, char *argv[]) { int number_failed; Suite *s; SRunner *sr; struct _u_request auth_req, scope_req; struct _u_response auth_resp, scope_resp; int res; char * url; y_init_logs("Glewlwyd test", Y_LOG_MODE_CONSOLE, Y_LOG_LEVEL_DEBUG, NULL, "Starting Glewlwyd test"); // Getting a valid session id for authenticated http requests ulfius_init_request(&auth_req); ulfius_init_request(&user_req); ulfius_init_response(&auth_resp); auth_req.http_verb = strdup("POST"); auth_req.http_url = msprintf("%s/auth/user", SERVER_URI); u_map_put(auth_req.map_post_body, "username", USERNAME); u_map_put(auth_req.map_post_body, "password", PASSWORD); res = ulfius_send_http_request(&auth_req, &auth_resp); if (res == U_OK) { y_log_message(Y_LOG_LEVEL_INFO, "User %s authenticated", USERNAME); int i; for (i=0; i #include #include #include #include #include #include #include #include #include "unit-tests.h" #define SERVER_URI "http://localhost:4593/api" #define USERNAME "user1" #define PASSWORD "MyUser1Password!" #define SCOPE_LIST "scope1 scope2" char * refresh_token; START_TEST(test_glwd_refresh_token_token_invalid) { char * url = msprintf("%s/token/", SERVER_URI); struct _u_map body; u_map_init(&body); u_map_put(&body, "grant_type", "refresh_token"); u_map_put(&body, "refresh_token", "invalid"); int res = run_simple_test(NULL, "POST", url, NULL, NULL, NULL, &body, 400, NULL, NULL, NULL); free(url); u_map_clean(&body); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_refresh_token_ok) { char * url = msprintf("%s/token/", SERVER_URI); struct _u_map body; u_map_init(&body); u_map_put(&body, "grant_type", "refresh_token"); u_map_put(&body, "refresh_token", refresh_token); int res = run_simple_test(NULL, "POST", url, NULL, NULL, NULL, &body, 200, NULL, NULL, NULL); free(url); u_map_clean(&body); ck_assert_int_eq(res, 1); } END_TEST static Suite *glewlwyd_suite(void) { Suite *s; TCase *tc_core; s = suite_create("Glewlwyd refresh token"); tc_core = tcase_create("test_glwd_refresh_token"); tcase_add_test(tc_core, test_glwd_refresh_token_token_invalid); tcase_add_test(tc_core, test_glwd_refresh_token_ok); tcase_set_timeout(tc_core, 30); suite_add_tcase(s, tc_core); return s; } int main(int argc, char *argv[]) { int number_failed; Suite *s; SRunner *sr; struct _u_request auth_req; struct _u_response auth_resp; int res; y_init_logs("Glewlwyd test", Y_LOG_MODE_CONSOLE, Y_LOG_LEVEL_DEBUG, NULL, "Starting Glewlwyd test"); // Getting a valid session id for authenticated http requests ulfius_init_request(&auth_req); ulfius_init_response(&auth_resp); auth_req.http_verb = strdup("POST"); auth_req.http_url = msprintf("%s/token/", SERVER_URI); u_map_put(auth_req.map_post_body, "grant_type", "password"); u_map_put(auth_req.map_post_body, "username", USERNAME); u_map_put(auth_req.map_post_body, "password", PASSWORD); u_map_put(auth_req.map_post_body, "scope", SCOPE_LIST); res = ulfius_send_http_request(&auth_req, &auth_resp); if (res == U_OK) { json_t * json_body = ulfius_get_json_body_response(&auth_resp, NULL); refresh_token = o_strdup(json_string_value(json_object_get(json_body, "refresh_token"))); y_log_message(Y_LOG_LEVEL_INFO, "User %s authenticated", USERNAME); json_decref(json_body); } ulfius_clean_request(&auth_req); ulfius_clean_response(&auth_resp); s = glewlwyd_suite(); sr = srunner_create(s); srunner_run_all(sr, CK_VERBOSE); number_failed = srunner_ntests_failed(sr); srunner_free(sr); free(refresh_token); return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE; } glewlwyd-1.3.1/test/glewlwyd_oauth2_refresh_token_client_confidential.c000066400000000000000000000101571322667720100266220ustar00rootroot00000000000000/* Public domain, no copyright. Use at your own risk. */ #include #include #include #include #include #include #include #include #include #include "unit-tests.h" #define SERVER_URI "http://localhost:4593/api" #define USERNAME "user1" #define PASSWORD "MyUser1Password!" #define SCOPE_LIST "scope1 scope2" #define CLIENT "client3_id" #define CLIENT_PASSWORD "client3_password" char * refresh_token; START_TEST(test_glwd_refresh_token_token_invalid) { char * url = msprintf("%s/token/", SERVER_URI); struct _u_map body; u_map_init(&body); u_map_put(&body, "grant_type", "refresh_token"); u_map_put(&body, "refresh_token", "invalid"); int res = run_simple_test(NULL, "POST", url, CLIENT, CLIENT_PASSWORD, NULL, &body, 400, NULL, NULL, NULL); free(url); u_map_clean(&body); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_refresh_token_client_invalid) { char * url = msprintf("%s/token/", SERVER_URI); struct _u_map body; u_map_init(&body); u_map_put(&body, "grant_type", "refresh_token"); u_map_put(&body, "refresh_token", refresh_token); int res = run_simple_test(NULL, "POST", url, CLIENT, "invalid", NULL, &body, 400, NULL, NULL, NULL); free(url); u_map_clean(&body); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_refresh_token_no_client) { char * url = msprintf("%s/token/", SERVER_URI); struct _u_map body; u_map_init(&body); u_map_put(&body, "grant_type", "refresh_token"); u_map_put(&body, "refresh_token", refresh_token); int res = run_simple_test(NULL, "POST", url, NULL, NULL, NULL, &body, 400, NULL, NULL, NULL); free(url); u_map_clean(&body); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_refresh_token_ok) { char * url = msprintf("%s/token/", SERVER_URI); struct _u_map body; u_map_init(&body); u_map_put(&body, "grant_type", "refresh_token"); u_map_put(&body, "refresh_token", refresh_token); int res = run_simple_test(NULL, "POST", url, CLIENT, CLIENT_PASSWORD, NULL, &body, 200, NULL, NULL, NULL); free(url); u_map_clean(&body); ck_assert_int_eq(res, 1); } END_TEST static Suite *glewlwyd_suite(void) { Suite *s; TCase *tc_core; s = suite_create("Glewlwyd refresh token client confidential"); tc_core = tcase_create("test_glwd_refresh_token"); tcase_add_test(tc_core, test_glwd_refresh_token_token_invalid); tcase_add_test(tc_core, test_glwd_refresh_token_client_invalid); tcase_add_test(tc_core, test_glwd_refresh_token_no_client); tcase_add_test(tc_core, test_glwd_refresh_token_ok); tcase_set_timeout(tc_core, 30); suite_add_tcase(s, tc_core); return s; } int main(int argc, char *argv[]) { int number_failed; Suite *s; SRunner *sr; struct _u_request auth_req; struct _u_response auth_resp; int res; y_init_logs("Glewlwyd test", Y_LOG_MODE_CONSOLE, Y_LOG_LEVEL_DEBUG, NULL, "Starting Glewlwyd test"); // Getting a valid session id for authenticated http requests ulfius_init_request(&auth_req); ulfius_init_response(&auth_resp); auth_req.http_verb = strdup("POST"); auth_req.http_url = msprintf("%s/token/", SERVER_URI); u_map_put(auth_req.map_post_body, "grant_type", "password"); u_map_put(auth_req.map_post_body, "username", USERNAME); u_map_put(auth_req.map_post_body, "password", PASSWORD); u_map_put(auth_req.map_post_body, "scope", SCOPE_LIST); auth_req.auth_basic_user = strdup(CLIENT); auth_req.auth_basic_password = strdup(CLIENT_PASSWORD); res = ulfius_send_http_request(&auth_req, &auth_resp); if (res == U_OK) { json_t * json_body = ulfius_get_json_body_response(&auth_resp, NULL); refresh_token = o_strdup(json_string_value(json_object_get(json_body, "refresh_token"))); y_log_message(Y_LOG_LEVEL_INFO, "User %s authenticated", USERNAME); json_decref(json_body); } ulfius_clean_request(&auth_req); ulfius_clean_response(&auth_resp); s = glewlwyd_suite(); sr = srunner_create(s); srunner_run_all(sr, CK_VERBOSE); number_failed = srunner_ntests_failed(sr); srunner_free(sr); free(refresh_token); return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE; } glewlwyd-1.3.1/test/glewlwyd_oauth2_resource_owner_pwd_cred.c000066400000000000000000000073371322667720100246250ustar00rootroot00000000000000/* Public domain, no copyright. Use at your own risk. */ #include #include #include #include #include #include #include #include #include #include "unit-tests.h" #define SERVER_URI "http://localhost:4593/api" #define USERNAME "user1" #define PASSWORD "MyUser1Password!" #define SCOPE_LIST "scope1 scope2" char * code; START_TEST(glewlwyd_resource_owner_pwd_cred_valid) { char * url = msprintf("%s/token/", SERVER_URI); struct _u_map body; u_map_init(&body); u_map_put(&body, "grant_type", "password"); u_map_put(&body, "scope", SCOPE_LIST); u_map_put(&body, "username", USERNAME); u_map_put(&body, "password", PASSWORD); int res = run_simple_test(NULL, "POST", url, NULL, NULL, NULL, &body, 200, NULL, "refresh_token", NULL); free(url); u_map_clean(&body); ck_assert_int_eq(res, 1); } END_TEST START_TEST(glewlwyd_resource_owner_pwd_cred_pwd_invalid) { char * url = msprintf("%s/token/", SERVER_URI); struct _u_map body; u_map_init(&body); u_map_put(&body, "grant_type", "password"); u_map_put(&body, "scope", SCOPE_LIST); u_map_put(&body, "username", USERNAME); u_map_put(&body, "password", "invalid"); int res = run_simple_test(NULL, "POST", url, NULL, NULL, NULL, &body, 403, NULL, NULL, NULL); free(url); u_map_clean(&body); ck_assert_int_eq(res, 1); } END_TEST START_TEST(glewlwyd_resource_owner_pwd_cred_user_invalid) { char * url = msprintf("%s/token/", SERVER_URI); struct _u_map body; u_map_init(&body); u_map_put(&body, "grant_type", "password"); u_map_put(&body, "scope", SCOPE_LIST); u_map_put(&body, "username", "invalid"); u_map_put(&body, "password", PASSWORD); int res = run_simple_test(NULL, "POST", url, NULL, NULL, NULL, &body, 403, NULL, NULL, NULL); free(url); u_map_clean(&body); ck_assert_int_eq(res, 1); } END_TEST START_TEST(glewlwyd_resource_owner_pwd_cred_scope_invalid) { char * url = msprintf("%s/token/", SERVER_URI); struct _u_map body; u_map_init(&body); u_map_put(&body, "grant_type", "password"); u_map_put(&body, "scope", "invalid"); u_map_put(&body, "username", USERNAME); u_map_put(&body, "password", PASSWORD); int res = run_simple_test(NULL, "POST", url, NULL, NULL, NULL, &body, 403, NULL, NULL, NULL); free(url); u_map_clean(&body); ck_assert_int_eq(res, 1); } END_TEST START_TEST(glewlwyd_resource_owner_pwd_cred_empty) { char * url = msprintf("%s/token/", SERVER_URI); struct _u_map body; u_map_init(&body); u_map_put(&body, "grant_type", "password"); int res = run_simple_test(NULL, "POST", url, NULL, NULL, NULL, &body, 403, NULL, NULL, NULL); free(url); u_map_clean(&body); ck_assert_int_eq(res, 1); } END_TEST static Suite *glewlwyd_suite(void) { Suite *s; TCase *tc_core; s = suite_create("Glewlwyd resource owner password credential"); tc_core = tcase_create("glewlwyd_resource_owner_pwd_cred"); tcase_add_test(tc_core, glewlwyd_resource_owner_pwd_cred_valid); tcase_add_test(tc_core, glewlwyd_resource_owner_pwd_cred_pwd_invalid); tcase_add_test(tc_core, glewlwyd_resource_owner_pwd_cred_user_invalid); tcase_add_test(tc_core, glewlwyd_resource_owner_pwd_cred_scope_invalid); tcase_add_test(tc_core, glewlwyd_resource_owner_pwd_cred_empty); tcase_set_timeout(tc_core, 30); suite_add_tcase(s, tc_core); return s; } int main(int argc, char *argv[]) { int number_failed; Suite *s; SRunner *sr; y_init_logs("Glewlwyd test", Y_LOG_MODE_CONSOLE, Y_LOG_LEVEL_DEBUG, NULL, "Starting Glewlwyd test"); s = glewlwyd_suite(); sr = srunner_create(s); srunner_run_all(sr, CK_VERBOSE); number_failed = srunner_ntests_failed(sr); srunner_free(sr); return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE; } glewlwyd-1.3.1/test/glewlwyd_oauth2_resource_owner_pwd_cred_client_confidential.c000066400000000000000000000107001322667720100306660ustar00rootroot00000000000000/* Public domain, no copyright. Use at your own risk. */ #include #include #include #include #include #include #include #include #include #include "unit-tests.h" #define SERVER_URI "http://localhost:4593/api" #define USERNAME "user1" #define PASSWORD "MyUser1Password!" #define SCOPE_LIST "scope1 scope2" #define CLIENT "client3_id" #define CLIENT_PASSWORD "client3_password" char * code; START_TEST(glewlwyd_resource_owner_pwd_cred_valid) { char * url = msprintf("%s/token/", SERVER_URI); struct _u_map body; u_map_init(&body); u_map_put(&body, "grant_type", "password"); u_map_put(&body, "scope", SCOPE_LIST); u_map_put(&body, "username", USERNAME); u_map_put(&body, "password", PASSWORD); int res = run_simple_test(NULL, "POST", url, CLIENT, CLIENT_PASSWORD, NULL, &body, 200, NULL, "refresh_token", NULL); free(url); u_map_clean(&body); ck_assert_int_eq(res, 1); } END_TEST START_TEST(glewlwyd_resource_owner_pwd_cred_pwd_invalid) { char * url = msprintf("%s/token/", SERVER_URI); struct _u_map body; u_map_init(&body); u_map_put(&body, "grant_type", "password"); u_map_put(&body, "scope", SCOPE_LIST); u_map_put(&body, "username", USERNAME); u_map_put(&body, "password", "invalid"); int res = run_simple_test(NULL, "POST", url, CLIENT, CLIENT_PASSWORD, NULL, &body, 403, NULL, NULL, NULL); free(url); u_map_clean(&body); ck_assert_int_eq(res, 1); } END_TEST START_TEST(glewlwyd_resource_owner_pwd_cred_user_invalid) { char * url = msprintf("%s/token/", SERVER_URI); struct _u_map body; u_map_init(&body); u_map_put(&body, "grant_type", "password"); u_map_put(&body, "scope", SCOPE_LIST); u_map_put(&body, "username", "invalid"); u_map_put(&body, "password", PASSWORD); int res = run_simple_test(NULL, "POST", url, CLIENT, CLIENT_PASSWORD, NULL, &body, 403, NULL, NULL, NULL); free(url); u_map_clean(&body); ck_assert_int_eq(res, 1); } END_TEST START_TEST(glewlwyd_resource_owner_pwd_cred_client_invalid) { char * url = msprintf("%s/token/", SERVER_URI); struct _u_map body; u_map_init(&body); u_map_put(&body, "grant_type", "password"); u_map_put(&body, "scope", SCOPE_LIST); u_map_put(&body, "username", USERNAME); u_map_put(&body, "password", PASSWORD); int res = run_simple_test(NULL, "POST", url, CLIENT, "invalid", NULL, &body, 400, NULL, NULL, NULL); free(url); u_map_clean(&body); ck_assert_int_eq(res, 1); } END_TEST START_TEST(glewlwyd_resource_owner_pwd_cred_scope_invalid) { char * url = msprintf("%s/token/", SERVER_URI); struct _u_map body; u_map_init(&body); u_map_put(&body, "grant_type", "password"); u_map_put(&body, "scope", "invalid"); u_map_put(&body, "username", USERNAME); u_map_put(&body, "password", PASSWORD); int res = run_simple_test(NULL, "POST", url, CLIENT, CLIENT_PASSWORD, NULL, &body, 403, NULL, NULL, NULL); free(url); u_map_clean(&body); ck_assert_int_eq(res, 1); } END_TEST START_TEST(glewlwyd_resource_owner_pwd_cred_empty) { char * url = msprintf("%s/token/", SERVER_URI); struct _u_map body; u_map_init(&body); u_map_put(&body, "grant_type", "password"); int res = run_simple_test(NULL, "POST", url, CLIENT, CLIENT_PASSWORD, NULL, &body, 403, NULL, NULL, NULL); free(url); u_map_clean(&body); ck_assert_int_eq(res, 1); } END_TEST static Suite *glewlwyd_suite(void) { Suite *s; TCase *tc_core; s = suite_create("Glewlwyd resource owner password credential client confidential"); tc_core = tcase_create("glewlwyd_resource_owner_pwd_cred"); tcase_add_test(tc_core, glewlwyd_resource_owner_pwd_cred_valid); tcase_add_test(tc_core, glewlwyd_resource_owner_pwd_cred_pwd_invalid); tcase_add_test(tc_core, glewlwyd_resource_owner_pwd_cred_user_invalid); tcase_add_test(tc_core, glewlwyd_resource_owner_pwd_cred_client_invalid); tcase_add_test(tc_core, glewlwyd_resource_owner_pwd_cred_scope_invalid); tcase_add_test(tc_core, glewlwyd_resource_owner_pwd_cred_empty); tcase_set_timeout(tc_core, 30); suite_add_tcase(s, tc_core); return s; } int main(int argc, char *argv[]) { int number_failed; Suite *s; SRunner *sr; y_init_logs("Glewlwyd test", Y_LOG_MODE_CONSOLE, Y_LOG_LEVEL_DEBUG, NULL, "Starting Glewlwyd test"); s = glewlwyd_suite(); sr = srunner_create(s); srunner_run_all(sr, CK_VERBOSE); number_failed = srunner_ntests_failed(sr); srunner_free(sr); return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE; } glewlwyd-1.3.1/test/glewlwyd_update_user_profile.c000066400000000000000000000405701322667720100224670ustar00rootroot00000000000000/* Public domain, no copyright. Use at your own risk. */ #include #include #include #include #include #include #include #include #include #include "unit-tests.h" #define SERVER_URI "http://localhost:4593/api" #define ADMIN_LOGIN "admin" #define ADMIN_PASSWORD "MyAdminPassword2016!" #define USER_LOGIN "new_user" #define USER_PASSWORD "password" #define USER_PASSWORD_UPDATED "password_updated" #define USER_PASSWORD_RESET "password_reset" #define USER_EMAIL "user@glewlwyd.domain" #define SCOPE_LIST "g_admin" struct _u_request admin_req; struct _u_request user_req; char token[129] = {0}, * cookie; START_TEST(test_glwd_update_user_profile_add_user_database) { json_t * json_body; char * url = msprintf("%s/user/", SERVER_URI); int res; json_body = json_pack("{sssssssssss[ss]}", "source", "database", "login", USER_LOGIN, "name", "New User", "password", USER_PASSWORD, "email", USER_EMAIL, "scope", "scope1", "scope2"); res = run_simple_test(&admin_req, "POST", url, NULL, NULL, json_body, NULL, 200, NULL, NULL, NULL); json_decref(json_body); ck_assert_int_eq(res, 1); free(url); } END_TEST START_TEST(test_glwd_update_user_profile_add_user_ldap) { json_t * json_body; char * url = msprintf("%s/user/", SERVER_URI); int res; json_body = json_pack("{sssssssssss[ss]}", "source", "ldap", "login", USER_LOGIN, "name", "New User", "password", USER_PASSWORD, "email", USER_EMAIL, "scope", "scope1", "scope2"); res = run_simple_test(&admin_req, "POST", url, NULL, NULL, json_body, NULL, 200, NULL, NULL, NULL); json_decref(json_body); ck_assert_int_eq(res, 1); free(url); } END_TEST START_TEST(test_glwd_update_user_connect_user_success) { struct _u_request auth_req; struct _u_response auth_resp; ulfius_init_request(&auth_req); ulfius_init_response(&auth_resp); auth_req.http_verb = strdup("POST"); auth_req.http_url = msprintf("%s/auth/user", SERVER_URI); u_map_put(auth_req.map_post_body, "username", USER_LOGIN); u_map_put(auth_req.map_post_body, "password", USER_PASSWORD); ulfius_send_http_request(&auth_req, &auth_resp); ck_assert_int_eq(auth_resp.status, 200); ulfius_clean_request(&auth_req); ulfius_clean_response(&auth_resp); } END_TEST START_TEST(test_glwd_update_user_profile_update_fail) { json_t * json_body = json_pack("{si}", "name", 1); char * url = msprintf("%s/profile/", SERVER_URI); int res = run_simple_test(&user_req, "PUT", url, NULL, NULL, json_body, NULL, 400, NULL, NULL, NULL); json_decref(json_body); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_update_user_profile_update_success) { json_t * json_body = json_pack("{ss}", "name", "new new user"); char * url = msprintf("%s/profile/", SERVER_URI); int res = run_simple_test(&user_req, "PUT", url, NULL, NULL, json_body, NULL, 200, NULL, NULL, NULL); json_decref(json_body); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_update_user_profile_update_password_success) { json_t * json_body = json_pack("{ssss}", "old_password", USER_PASSWORD, "new_password", USER_PASSWORD_UPDATED); char * url = msprintf("%s/profile/", SERVER_URI); int res = run_simple_test(&user_req, "PUT", url, NULL, NULL, json_body, NULL, 200, NULL, NULL, NULL); json_decref(json_body); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_update_user_profile_connect_user_update_success) { struct _u_request auth_req; struct _u_response auth_resp; ulfius_init_request(&auth_req); ulfius_init_response(&auth_resp); auth_req.http_verb = strdup("POST"); auth_req.http_url = msprintf("%s/auth/user", SERVER_URI); u_map_put(auth_req.map_post_body, "username", USER_LOGIN); u_map_put(auth_req.map_post_body, "password", USER_PASSWORD_UPDATED); ulfius_send_http_request(&auth_req, &auth_resp); ck_assert_int_eq(auth_resp.status, 200); ulfius_clean_request(&auth_req); ulfius_clean_response(&auth_resp); } END_TEST START_TEST(test_glwd_update_user_profile_update_password_fail) { json_t * json_body = json_pack("{ssss}", "old_password", USER_PASSWORD, "new_password", "short"); char * url = msprintf("%s/profile/", SERVER_URI); int res = run_simple_test(&user_req, "PUT", url, NULL, NULL, json_body, NULL, 400, NULL, NULL, NULL); json_decref(json_body); ck_assert_int_eq(res, 1); free(url); } END_TEST START_TEST(test_glwd_update_user_profile_connect_user_update_fail) { struct _u_request auth_req; struct _u_response auth_resp; ulfius_init_request(&auth_req); ulfius_init_response(&auth_resp); auth_req.http_verb = strdup("POST"); auth_req.http_url = msprintf("%s/auth/user", SERVER_URI); u_map_put(auth_req.map_post_body, "username", USER_LOGIN); u_map_put(auth_req.map_post_body, "password", USER_PASSWORD); ulfius_send_http_request(&auth_req, &auth_resp); ck_assert_int_eq(auth_resp.status, 403); ulfius_clean_request(&auth_req); ulfius_clean_response(&auth_resp); } END_TEST START_TEST(test_glwd_update_user_profile_send_reset_password) { int res; char * url; url = msprintf("%s/profile/reset_password/%s", SERVER_URI, USER_LOGIN); res = run_simple_test(&user_req, "POST", url, NULL, NULL, NULL, NULL, 200, NULL, NULL, NULL); free(url); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_update_user_profile_reset_password_token_error) { struct _u_request reset_req; struct _u_response reset_resp; ulfius_init_request(&reset_req); ulfius_init_response(&reset_resp); reset_req.http_verb = strdup("PUT"); reset_req.http_url = msprintf("%s/profile/reset_password/%s", SERVER_URI, USER_LOGIN); u_map_put(reset_req.map_post_body, "token", "error"); u_map_put(reset_req.map_post_body, "password", USER_PASSWORD_RESET); ulfius_send_http_request(&reset_req, &reset_resp); ck_assert_int_eq(reset_resp.status, 404); ulfius_clean_request(&reset_req); ulfius_clean_response(&reset_resp); } END_TEST START_TEST(test_glwd_update_user_profile_reset_password_password_error) { struct _u_request reset_req; struct _u_response reset_resp; ulfius_init_request(&reset_req); ulfius_init_response(&reset_resp); reset_req.http_verb = strdup("PUT"); reset_req.http_url = msprintf("%s/profile/reset_password/%s", SERVER_URI, USER_LOGIN); u_map_put(reset_req.map_post_body, "token", token); u_map_put(reset_req.map_post_body, "password", "short"); ulfius_send_http_request(&reset_req, &reset_resp); ck_assert_int_eq(reset_resp.status, 400); ulfius_clean_request(&reset_req); ulfius_clean_response(&reset_resp); } END_TEST START_TEST(test_glwd_update_user_profile_reset_password_success) { struct _u_request reset_req; struct _u_response reset_resp; ulfius_init_request(&reset_req); ulfius_init_response(&reset_resp); reset_req.http_verb = strdup("PUT"); reset_req.http_url = msprintf("%s/profile/reset_password/%s", SERVER_URI, USER_LOGIN); u_map_put(reset_req.map_post_body, "token", token); u_map_put(reset_req.map_post_body, "password", USER_PASSWORD_RESET); ulfius_send_http_request(&reset_req, &reset_resp); ck_assert_int_eq(reset_resp.status, 200); ulfius_clean_request(&reset_req); ulfius_clean_response(&reset_resp); } END_TEST START_TEST(test_glwd_update_user_profile_reset_password_connect_old_password_error) { struct _u_request auth_req; struct _u_response auth_resp; ulfius_init_request(&auth_req); ulfius_init_response(&auth_resp); auth_req.http_verb = strdup("POST"); auth_req.http_url = msprintf("%s/auth/user", SERVER_URI); u_map_put(auth_req.map_post_body, "username", USER_LOGIN); u_map_put(auth_req.map_post_body, "password", USER_PASSWORD); ulfius_send_http_request(&auth_req, &auth_resp); ck_assert_int_eq(auth_resp.status, 403); ulfius_clean_request(&auth_req); ulfius_clean_response(&auth_resp); } END_TEST START_TEST(test_glwd_update_user_profile_reset_password_connect_new_password_success) { struct _u_request auth_req; struct _u_response auth_resp; ulfius_init_request(&auth_req); ulfius_init_response(&auth_resp); auth_req.http_verb = strdup("POST"); auth_req.http_url = msprintf("%s/auth/user", SERVER_URI); u_map_put(auth_req.map_post_body, "username", USER_LOGIN); u_map_put(auth_req.map_post_body, "password", USER_PASSWORD_RESET); ulfius_send_http_request(&auth_req, &auth_resp); ck_assert_int_eq(auth_resp.status, 200); ulfius_clean_request(&auth_req); ulfius_clean_response(&auth_resp); } END_TEST START_TEST(test_glwd_update_user_profile_delete_user) { char * url = msprintf("%s/user/%s", SERVER_URI, USER_LOGIN); int res = run_simple_test(&admin_req, "DELETE", url, NULL, NULL, NULL, NULL, 200, NULL, NULL, NULL); free(url); ck_assert_int_eq(res, 1); } END_TEST static Suite *libjwt_suite0(void) { Suite *s; TCase *tc_core; s = suite_create("Glewlwyd tests user profile"); tc_core = tcase_create("test_glwd_update_user_profile"); tcase_add_test(tc_core, test_glwd_update_user_profile_add_user_database); tcase_add_test(tc_core, test_glwd_update_user_connect_user_success); tcase_set_timeout(tc_core, 30); suite_add_tcase(s, tc_core); return s; } static Suite *libjwt_suite1(void) { Suite *s; TCase *tc_core; s = suite_create("Glewlwyd tests update user profile"); tc_core = tcase_create("test_glwd_update_user_profile"); tcase_add_test(tc_core, test_glwd_update_user_profile_update_fail); tcase_add_test(tc_core, test_glwd_update_user_profile_update_success); tcase_add_test(tc_core, test_glwd_update_user_profile_update_password_success); tcase_add_test(tc_core, test_glwd_update_user_profile_connect_user_update_success); tcase_add_test(tc_core, test_glwd_update_user_profile_update_password_fail); tcase_add_test(tc_core, test_glwd_update_user_profile_connect_user_update_fail); tcase_add_test(tc_core, test_glwd_update_user_profile_send_reset_password); tcase_set_timeout(tc_core, 30); suite_add_tcase(s, tc_core); return s; } static Suite *libjwt_suite2(void) { Suite *s; TCase *tc_core; s = suite_create("Glewlwyd tests reset password"); tc_core = tcase_create("test_glwd_update_user_profile"); tcase_add_test(tc_core, test_glwd_update_user_profile_reset_password_success); tcase_add_test(tc_core, test_glwd_update_user_profile_reset_password_token_error); tcase_add_test(tc_core, test_glwd_update_user_profile_reset_password_password_error); tcase_add_test(tc_core, test_glwd_update_user_profile_reset_password_connect_old_password_error); tcase_add_test(tc_core, test_glwd_update_user_profile_reset_password_connect_new_password_success); tcase_add_test(tc_core, test_glwd_update_user_profile_delete_user); tcase_set_timeout(tc_core, 30); suite_add_tcase(s, tc_core); return s; } static Suite *libjwt_suite3(void) { Suite *s; TCase *tc_core; s = suite_create("Glewlwyd tests: new user"); tc_core = tcase_create("test_glwd_update_user_profile"); tcase_add_test(tc_core, test_glwd_update_user_profile_add_user_ldap); tcase_add_test(tc_core, test_glwd_update_user_connect_user_success); tcase_set_timeout(tc_core, 30); suite_add_tcase(s, tc_core); return s; } static Suite *libjwt_suite4(void) { Suite *s; TCase *tc_core; s = suite_create("Glewlwyd tests: update user profile"); tc_core = tcase_create("test_glwd_update_user_profile"); tcase_add_test(tc_core, test_glwd_update_user_profile_update_fail); tcase_add_test(tc_core, test_glwd_update_user_profile_update_success); tcase_add_test(tc_core, test_glwd_update_user_profile_update_password_success); tcase_add_test(tc_core, test_glwd_update_user_profile_connect_user_update_success); tcase_add_test(tc_core, test_glwd_update_user_profile_update_password_fail); tcase_add_test(tc_core, test_glwd_update_user_profile_connect_user_update_fail); tcase_add_test(tc_core, test_glwd_update_user_profile_send_reset_password); tcase_set_timeout(tc_core, 30); suite_add_tcase(s, tc_core); return s; } static Suite *glewlwyd_suite(void) { Suite *s; TCase *tc_core; s = suite_create("Glewlwyd tests: reset password"); tc_core = tcase_create("test_glwd_update_user_profile"); tcase_add_test(tc_core, test_glwd_update_user_profile_reset_password_success); tcase_add_test(tc_core, test_glwd_update_user_profile_reset_password_token_error); tcase_add_test(tc_core, test_glwd_update_user_profile_reset_password_password_error); tcase_add_test(tc_core, test_glwd_update_user_profile_reset_password_connect_old_password_error); tcase_add_test(tc_core, test_glwd_update_user_profile_reset_password_connect_new_password_success); tcase_add_test(tc_core, test_glwd_update_user_profile_delete_user); tcase_set_timeout(tc_core, 30); suite_add_tcase(s, tc_core); return s; } int main(int argc, char *argv[]) { int number_failed; Suite *s0, *s1, *s2, *s3, *s4, *s5; SRunner *sr0, *sr1, *sr2, *sr3, *sr4, *sr5; struct _u_request auth_req; struct _u_response auth_resp; int res, i; y_init_logs("Glewlwyd test", Y_LOG_MODE_CONSOLE, Y_LOG_LEVEL_DEBUG, NULL, "Starting Glewlwyd test"); // Getting a valid session id for authenticated http requests ulfius_init_request(&admin_req); ulfius_init_request(&user_req); ulfius_init_request(&auth_req); ulfius_init_response(&auth_resp); auth_req.http_verb = strdup("POST"); auth_req.http_url = msprintf("%s/token/", SERVER_URI); u_map_put(auth_req.map_post_body, "grant_type", "password"); u_map_put(auth_req.map_post_body, "username", ADMIN_LOGIN); u_map_put(auth_req.map_post_body, "password", ADMIN_PASSWORD); u_map_put(auth_req.map_post_body, "scope", SCOPE_LIST); res = ulfius_send_http_request(&auth_req, &auth_resp); if (res == U_OK) { char * bearer_token = msprintf("Bearer %s", (json_string_value(json_object_get(auth_resp.json_body, "access_token")))); y_log_message(Y_LOG_LEVEL_INFO, "User %s authenticated", ADMIN_LOGIN); u_map_put(admin_req.map_header, "Authorization", bearer_token); free(bearer_token); } ulfius_clean_request(&auth_req); ulfius_clean_response(&auth_resp); s0 = libjwt_suite0(); sr0 = srunner_create(s0); srunner_run_all(sr0, CK_VERBOSE); number_failed = srunner_ntests_failed(sr0); srunner_free(sr0); ulfius_init_request(&auth_req); ulfius_init_response(&auth_resp); auth_req.http_verb = strdup("POST"); auth_req.http_url = msprintf("%s/auth/user", SERVER_URI); u_map_put(auth_req.map_post_body, "username", USER_LOGIN); u_map_put(auth_req.map_post_body, "password", USER_PASSWORD); ulfius_send_http_request(&auth_req, &auth_resp); for (i=0; i"); fgets(token, 128, stdin); token[strlen(token) - 1] = '\0'; s2 = libjwt_suite2(); sr2 = srunner_create(s2); srunner_run_all(sr2, CK_VERBOSE); number_failed = srunner_ntests_failed(sr2); srunner_free(sr2); s3 = libjwt_suite3(); sr3 = srunner_create(s3); srunner_run_all(sr3, CK_VERBOSE); number_failed = srunner_ntests_failed(sr3); srunner_free(sr3); ulfius_init_request(&auth_req); ulfius_init_response(&auth_resp); auth_req.http_verb = strdup("POST"); auth_req.http_url = msprintf("%s/auth/user", SERVER_URI); u_map_put(auth_req.map_post_body, "username", USER_LOGIN); u_map_put(auth_req.map_post_body, "password", USER_PASSWORD); ulfius_send_http_request(&auth_req, &auth_resp); for (i=0; i"); fgets(token, 128, stdin); token[strlen(token) - 1] = '\0'; s5 = glewlwyd_suite(); sr5 = srunner_create(s5); srunner_run_all(sr5, CK_VERBOSE); number_failed = srunner_ntests_failed(sr5); srunner_free(sr5); ulfius_clean_request(&admin_req); ulfius_clean_request(&user_req); return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE; } glewlwyd-1.3.1/test/glewlwyd_user_refresh_token_admin.c000066400000000000000000000114151322667720100234670ustar00rootroot00000000000000/* Public domain, no copyright. Use at your own risk. */ #include #include #include #include #include #include #include #include #include #include "unit-tests.h" #define SERVER_URI "http://localhost:4593/api" #define ADMIN_LOGIN "admin" #define ADMIN_PASSWORD "MyAdminPassword2016!" #define ADMIN_SCOPE_LIST "g_admin" #define USER_LOGIN "user1" #define USER_PASSWORD "MyUser1Password!" #define USER_SCOPE_LIST "scope1 g_profile" struct _u_request admin_req; START_TEST(test_glwd_user_refresh_token_list_all_admin) { char * url = msprintf("%s/user/%s/refresh_token", SERVER_URI, USER_LOGIN); int res = run_simple_test(&admin_req, "GET", url, NULL, NULL, NULL, NULL, 200, NULL, NULL, NULL); free(url); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_user_refresh_token_list_enabled_admin) { char * url = msprintf("%s/user/%s/refresh_token?valid=true", SERVER_URI, USER_LOGIN); int res = run_simple_test(&admin_req, "GET", url, NULL, NULL, NULL, NULL, 200, NULL, NULL, NULL); free(url); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_user_refresh_token_revoke_not_found_admin) { char * url = msprintf("%s/user/%s/refresh_token/", SERVER_URI, USER_LOGIN); json_t * json_body = json_pack("{ss}", "token_hash", "not_found"); ulfius_set_json_body_request(&admin_req, json_body); int res = run_simple_test(&admin_req, "DELETE", url, NULL, NULL, NULL, NULL, 404, NULL, NULL, NULL); free(url); json_decref(json_body); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_user_refresh_token_revoke_ok_admin) { struct _u_response list_resp, del_resp; int res; json_t * json_body, * json_resp_body; ulfius_init_response(&list_resp); ulfius_init_response(&del_resp); admin_req.http_url = msprintf("%s/user/%s/refresh_token/?valid=true", SERVER_URI, USER_LOGIN); res = ulfius_send_http_request(&admin_req, &list_resp); if (res == U_OK) { json_resp_body = ulfius_get_json_body_response(&list_resp, NULL); json_body = json_pack("{ss}", "token_hash", json_string_value(json_object_get(json_array_get(json_resp_body, 0), "token_hash"))); u_map_put(admin_req.map_header, "Content-Type", "application/x-www-form-urlencoded"); ulfius_set_json_body_request(&admin_req, json_body); json_decref(json_body); json_decref(json_resp_body); } admin_req.http_url = msprintf("%s/user/%s/refresh_token/", SERVER_URI, USER_LOGIN); admin_req.http_verb = strdup("DELETE"); ulfius_send_http_request(&admin_req, &del_resp); ck_assert_int_eq(del_resp.status, 200); ulfius_clean_response(&list_resp); ulfius_clean_response(&del_resp); } END_TEST static Suite *glewlwyd_suite(void) { Suite *s; TCase *tc_core; s = suite_create("Glewlwyd user refresh_token management admin"); tc_core = tcase_create("test_glwd_user_refresh_token"); tcase_add_test(tc_core, test_glwd_user_refresh_token_list_all_admin); tcase_add_test(tc_core, test_glwd_user_refresh_token_list_enabled_admin); tcase_add_test(tc_core, test_glwd_user_refresh_token_revoke_not_found_admin); tcase_add_test(tc_core, test_glwd_user_refresh_token_revoke_ok_admin); tcase_set_timeout(tc_core, 30); suite_add_tcase(s, tc_core); return s; } int main(int argc, char *argv[]) { int number_failed; Suite *s; SRunner *sr; struct _u_request auth_req; struct _u_response auth_resp; int res; y_init_logs("Glewlwyd test", Y_LOG_MODE_CONSOLE, Y_LOG_LEVEL_DEBUG, NULL, "Starting Glewlwyd test"); // Getting a valid session id for authenticated http requests ulfius_init_request(&auth_req); ulfius_init_request(&admin_req); ulfius_init_response(&auth_resp); auth_req.http_verb = strdup("POST"); auth_req.http_url = msprintf("%s/token/", SERVER_URI); u_map_put(auth_req.map_post_body, "grant_type", "password"); u_map_put(auth_req.map_post_body, "username", ADMIN_LOGIN); u_map_put(auth_req.map_post_body, "password", ADMIN_PASSWORD); u_map_put(auth_req.map_post_body, "scope", ADMIN_SCOPE_LIST); res = ulfius_send_http_request(&auth_req, &auth_resp); if (res == U_OK) { json_t * json_body = ulfius_get_json_body_response(&auth_resp, NULL); char * bearer_token = msprintf("Bearer %s", (json_string_value(json_object_get(json_body, "access_token")))); y_log_message(Y_LOG_LEVEL_INFO, "User %s authenticated", ADMIN_LOGIN); u_map_put(admin_req.map_header, "Authorization", bearer_token); free(bearer_token); json_decref(json_body); } ulfius_clean_request(&auth_req); ulfius_clean_response(&auth_resp); s = glewlwyd_suite(); sr = srunner_create(s); srunner_run_all(sr, CK_VERBOSE); number_failed = srunner_ntests_failed(sr); srunner_free(sr); ulfius_clean_request(&admin_req); return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE; } glewlwyd-1.3.1/test/glewlwyd_user_refresh_token_user.c000066400000000000000000000127571322667720100233670ustar00rootroot00000000000000/* Public domain, no copyright. Use at your own risk. */ #include #include #include #include #include #include #include #include #include #include "unit-tests.h" #define SERVER_URI "http://localhost:4593/api" #define USER_LOGIN "user1" #define USER_PASSWORD "MyUser1Password!" #define USER_SCOPE_LIST "scope1 g_profile" struct _u_request admin_req; struct _u_request user_req; START_TEST(test_glwd_user_refresh_token_list_all_user) { char * url = msprintf("%s/profile/refresh_token", SERVER_URI); int res = run_simple_test(&user_req, "GET", url, NULL, NULL, NULL, NULL, 200, NULL, NULL, NULL); free(url); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_user_refresh_token_list_enabled_user) { char * url = msprintf("%s/profile/refresh_token?valid=true", SERVER_URI); int res = run_simple_test(&user_req, "GET", url, NULL, NULL, NULL, NULL, 200, NULL, NULL, NULL); free(url); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_user_refresh_token_revoke_not_found_user) { char * url = msprintf("%s/profile/refresh_token", SERVER_URI); json_t * json_body = json_pack("{ss}", "token_hash", "not_found"); ulfius_set_json_body_request(&user_req, json_body); int res = run_simple_test(&user_req, "DELETE", url, NULL, NULL, NULL, NULL, 404, NULL, NULL, NULL); free(url); json_decref(json_body); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_user_refresh_token_revoke_ok_user) { struct _u_response list_resp, del_resp; int res; json_t * json_body, * json_resp_body; ulfius_init_response(&list_resp); ulfius_init_response(&del_resp); user_req.http_url = msprintf("%s/profile/refresh_token/?valid=true", SERVER_URI); res = ulfius_send_http_request(&user_req, &list_resp); if (res == U_OK) { json_resp_body = ulfius_get_json_body_response(&list_resp, NULL); json_body = json_pack("{ss}", "token_hash", json_string_value(json_object_get(json_array_get(json_resp_body, 0), "token_hash"))); u_map_put(user_req.map_header, "Content-Type", "application/x-www-form-urlencoded"); ulfius_set_json_body_request(&user_req, json_body); json_decref(json_body); json_decref(json_resp_body); } user_req.http_url = msprintf("%s/profile/refresh_token/", SERVER_URI); user_req.http_verb = strdup("DELETE"); ulfius_send_http_request(&user_req, &del_resp); ck_assert_int_eq(del_resp.status, 200); ulfius_clean_response(&list_resp); ulfius_clean_response(&del_resp); } END_TEST static Suite *glewlwyd_suite(void) { Suite *s; TCase *tc_core; s = suite_create("Glewlwyd user refresh_token management user"); tc_core = tcase_create("test_glwd_user_refresh_token"); tcase_add_test(tc_core, test_glwd_user_refresh_token_list_all_user); tcase_add_test(tc_core, test_glwd_user_refresh_token_list_enabled_user); tcase_add_test(tc_core, test_glwd_user_refresh_token_revoke_not_found_user); tcase_add_test(tc_core, test_glwd_user_refresh_token_revoke_ok_user); tcase_set_timeout(tc_core, 30); suite_add_tcase(s, tc_core); return s; } int main(int argc, char *argv[]) { int number_failed; Suite *s; SRunner *sr; struct _u_request auth_req; struct _u_response auth_resp; int res, i; char * cookie; y_init_logs("Glewlwyd test", Y_LOG_MODE_CONSOLE, Y_LOG_LEVEL_DEBUG, NULL, "Starting Glewlwyd test"); // Getting a refresh_token ulfius_init_request(&auth_req); ulfius_init_request(&admin_req); ulfius_init_request(&user_req); ulfius_init_response(&auth_resp); auth_req.http_verb = strdup("POST"); auth_req.http_url = msprintf("%s/token/", SERVER_URI); u_map_put(auth_req.map_post_body, "grant_type", "password"); u_map_put(auth_req.map_post_body, "username", USER_LOGIN); u_map_put(auth_req.map_post_body, "password", USER_PASSWORD); u_map_put(auth_req.map_post_body, "scope", USER_SCOPE_LIST); res = ulfius_send_http_request(&auth_req, &auth_resp); if (res == U_OK) { json_t * json_body = ulfius_get_json_body_response(&auth_resp, NULL); char * bearer_token = msprintf("Bearer %s", (json_string_value(json_object_get(json_body, "access_token")))); y_log_message(Y_LOG_LEVEL_INFO, "User %s authenticated", USER_LOGIN); u_map_put(user_req.map_header, "Authorization", bearer_token); free(bearer_token); json_decref(json_body); } ulfius_clean_request(&auth_req); ulfius_clean_response(&auth_resp); ulfius_init_request(&auth_req); ulfius_init_response(&auth_resp); auth_req.http_verb = strdup("POST"); auth_req.http_url = msprintf("%s/auth/user", SERVER_URI); u_map_put(auth_req.map_post_body, "username", USER_LOGIN); u_map_put(auth_req.map_post_body, "password", USER_PASSWORD); ulfius_send_http_request(&auth_req, &auth_resp); ulfius_send_http_request(&auth_req, &auth_resp); if (auth_resp.status == 200) { y_log_message(Y_LOG_LEVEL_INFO, "User %s authenticated", USER_LOGIN); } else { y_log_message(Y_LOG_LEVEL_ERROR, "User %s error", USER_LOGIN); } for (i=0; i #include #include #include #include #include #include #include #include #include "unit-tests.h" #define SERVER_URI "http://localhost:4593/api" #define ADMIN_LOGIN "admin" #define ADMIN_PASSWORD "MyAdminPassword2016!" #define ADMIN_SCOPE_LIST "g_admin" #define USER_LOGIN "user1" #define USER_PASSWORD "MyUser1Password!" struct _u_request admin_req; START_TEST(test_glwd_user_session_list_all_admin) { char * url = msprintf("%s/user/%s/session", SERVER_URI, USER_LOGIN); int res = run_simple_test(&admin_req, "GET", url, NULL, NULL, NULL, NULL, 200, NULL, NULL, NULL); free(url); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_user_session_list_enabled_admin) { char * url = msprintf("%s/user/%s/session?valid=true", SERVER_URI, USER_LOGIN); int res = run_simple_test(&admin_req, "GET", url, NULL, NULL, NULL, NULL, 200, NULL, NULL, NULL); free(url); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_user_session_revoke_not_found_admin) { char * url = msprintf("%s/user/%s/session/", SERVER_URI, USER_LOGIN); json_t * json_body = json_pack("{ss}", "session_hash", "not_found"); ulfius_set_json_body_request(&admin_req, json_body); int res = run_simple_test(&admin_req, "DELETE", url, NULL, NULL, NULL, NULL, 404, NULL, NULL, NULL); free(url); json_decref(json_body); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_user_session_revoke_ok_admin) { char * url; struct _u_response list_resp; int res; struct _u_map body; json_t * json_resp_body; u_map_init(&body); ulfius_init_response(&list_resp); admin_req.http_url = msprintf("%s/user/%s/session/?valid=true", SERVER_URI, USER_LOGIN); res = ulfius_send_http_request(&admin_req, &list_resp); if (res == U_OK) { json_resp_body = ulfius_get_json_body_response(&list_resp, NULL); json_t * json_body = json_pack("{ss}", "session_hash", json_string_value(json_object_get(json_array_get(json_resp_body, 0), "session_hash"))); u_map_put(admin_req.map_header, "Content-Type", "application/x-www-form-urlencoded"); ulfius_set_json_body_request(&admin_req, json_body); json_decref(json_body); json_decref(json_resp_body); } url = msprintf("%s/user/%s/session/", SERVER_URI, USER_LOGIN); res = run_simple_test(&admin_req, "DELETE", url, NULL, NULL, NULL, &body, 200, NULL, NULL, NULL); free(url); u_map_clean(&body); ulfius_clean_response(&list_resp); ck_assert_int_eq(res, 1); } END_TEST static Suite *glewlwyd_suite(void) { Suite *s; TCase *tc_core; s = suite_create("Glewlwyd user session management admin"); tc_core = tcase_create("test_glwd_user_session"); tcase_add_test(tc_core, test_glwd_user_session_list_all_admin); tcase_add_test(tc_core, test_glwd_user_session_list_enabled_admin); tcase_add_test(tc_core, test_glwd_user_session_revoke_not_found_admin); tcase_add_test(tc_core, test_glwd_user_session_revoke_ok_admin); tcase_set_timeout(tc_core, 30); suite_add_tcase(s, tc_core); return s; } int main(int argc, char *argv[]) { int number_failed; Suite *s; SRunner *sr; struct _u_request auth_req; struct _u_response auth_resp; int res; y_init_logs("Glewlwyd test", Y_LOG_MODE_CONSOLE, Y_LOG_LEVEL_DEBUG, NULL, "Starting Glewlwyd test"); // Set at least one session ulfius_init_request(&auth_req); ulfius_init_response(&auth_resp); auth_req.http_verb = strdup("POST"); auth_req.http_url = msprintf("%s/auth/user", SERVER_URI); u_map_put(auth_req.map_post_body, "username", USER_LOGIN); u_map_put(auth_req.map_post_body, "password", USER_PASSWORD); ulfius_send_http_request(&auth_req, &auth_resp); if (auth_resp.status == 200) { y_log_message(Y_LOG_LEVEL_INFO, "User %s authenticated", USER_LOGIN); } else { y_log_message(Y_LOG_LEVEL_ERROR, "User %s error", USER_LOGIN); } // Getting a valid session id for authenticated http requests ulfius_init_request(&auth_req); ulfius_init_request(&admin_req); ulfius_init_response(&auth_resp); auth_req.http_verb = strdup("POST"); auth_req.http_url = msprintf("%s/token/", SERVER_URI); u_map_put(auth_req.map_post_body, "grant_type", "password"); u_map_put(auth_req.map_post_body, "username", ADMIN_LOGIN); u_map_put(auth_req.map_post_body, "password", ADMIN_PASSWORD); u_map_put(auth_req.map_post_body, "scope", ADMIN_SCOPE_LIST); res = ulfius_send_http_request(&auth_req, &auth_resp); if (res == U_OK) { json_t * json_body = ulfius_get_json_body_response(&auth_resp, NULL); char * bearer_token = msprintf("Bearer %s", (json_string_value(json_object_get(json_body, "access_token")))); y_log_message(Y_LOG_LEVEL_INFO, "User %s authenticated", ADMIN_LOGIN); u_map_put(admin_req.map_header, "Authorization", bearer_token); free(bearer_token); json_decref(json_body); } ulfius_clean_request(&auth_req); ulfius_clean_response(&auth_resp); s = glewlwyd_suite(); sr = srunner_create(s); srunner_run_all(sr, CK_VERBOSE); number_failed = srunner_ntests_failed(sr); srunner_free(sr); ulfius_clean_request(&admin_req); return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE; } glewlwyd-1.3.1/test/glewlwyd_user_session_user.c000066400000000000000000000106041322667720100222010ustar00rootroot00000000000000/* Public domain, no copyright. Use at your own risk. */ #include #include #include #include #include #include #include #include #include #include "unit-tests.h" #define SERVER_URI "http://localhost:4593/api" #define USER_LOGIN "user1" #define USER_PASSWORD "MyUser1Password!" struct _u_request user_req; START_TEST(test_glwd_user_session_list_all_user) { char * url = msprintf("%s/profile/session", SERVER_URI); int res = run_simple_test(&user_req, "GET", url, NULL, NULL, NULL, NULL, 200, NULL, NULL, NULL); free(url); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_user_session_list_enabled_user) { char * url = msprintf("%s/profile/session?valid=true", SERVER_URI); int res = run_simple_test(&user_req, "GET", url, NULL, NULL, NULL, NULL, 200, NULL, NULL, NULL); free(url); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_user_session_revoke_not_found_user) { char * url = msprintf("%s/profile/session", SERVER_URI); json_t * json_body = json_pack("{ss}", "session_hash", "not_found"); ulfius_set_json_body_request(&user_req, json_body); int res = run_simple_test(&user_req, "DELETE", url, NULL, NULL, NULL, NULL, 404, NULL, NULL, NULL); free(url); json_decref(json_body); ck_assert_int_eq(res, 1); } END_TEST START_TEST(test_glwd_user_session_revoke_ok_user) { struct _u_response list_resp, del_resp; int res; struct _u_map body; json_t * json_resp_body; u_map_init(&body); ulfius_init_response(&list_resp); ulfius_init_response(&del_resp); user_req.http_url = msprintf("%s/profile/session?valid=true", SERVER_URI); res = ulfius_send_http_request(&user_req, &list_resp); if (res == U_OK) { json_resp_body = ulfius_get_json_body_response(&list_resp, NULL); json_t * json_body = json_pack("{ss}", "session_hash", json_string_value(json_object_get(json_array_get(json_resp_body, 0), "session_hash"))); u_map_put(user_req.map_header, "Content-Type", "application/x-www-form-urlencoded"); ulfius_set_json_body_request(&user_req, json_body); json_decref(json_body); json_decref(json_resp_body); } user_req.http_url = msprintf("%s/profile/session/", SERVER_URI, USER_LOGIN); user_req.http_verb = strdup("DELETE"); ulfius_send_http_request(&user_req, &del_resp); ck_assert_int_eq(del_resp.status, 200); u_map_clean(&body); ulfius_clean_response(&list_resp); ulfius_clean_response(&del_resp); } END_TEST static Suite *glewlwyd_suite(void) { Suite *s; TCase *tc_core; s = suite_create("Glewlwyd user session management user"); tc_core = tcase_create("test_glwd_user_session"); tcase_add_test(tc_core, test_glwd_user_session_list_all_user); tcase_add_test(tc_core, test_glwd_user_session_list_enabled_user); tcase_add_test(tc_core, test_glwd_user_session_revoke_not_found_user); tcase_add_test(tc_core, test_glwd_user_session_revoke_ok_user); tcase_set_timeout(tc_core, 30); suite_add_tcase(s, tc_core); return s; } int main(int argc, char *argv[]) { int number_failed; Suite *s; SRunner *sr; struct _u_request auth_req; struct _u_response auth_resp; int i; char * cookie; y_init_logs("Glewlwyd test", Y_LOG_MODE_CONSOLE, Y_LOG_LEVEL_DEBUG, NULL, "Starting Glewlwyd test"); // Getting a valid session id for authenticated http requests ulfius_init_request(&user_req); ulfius_init_request(&auth_req); ulfius_init_response(&auth_resp); auth_req.http_verb = strdup("POST"); auth_req.http_url = msprintf("%s/auth/user", SERVER_URI); u_map_put(auth_req.map_post_body, "username", USER_LOGIN); u_map_put(auth_req.map_post_body, "password", USER_PASSWORD); ulfius_send_http_request(&auth_req, &auth_resp); if (auth_resp.status == 200) { y_log_message(Y_LOG_LEVEL_INFO, "User %s authenticated", USER_LOGIN); } else { y_log_message(Y_LOG_LEVEL_ERROR, "User %s error", USER_LOGIN); } for (i=0; i$1.log 2>$1.err if [ $? -ne 0 ] then printf "${RED}FAIL${NC}\n" else printf "${GREEN}SUCCESS${NC}\n" fi glewlwyd-1.3.1/test/unit-tests.c000066400000000000000000000150671322667720100166330ustar00rootroot00000000000000 #include #include #include #include #include #include "unit-tests.h" /** * decode a u_map into a string */ char * print_map(const struct _u_map * map) { char * line, * to_return = NULL; const char **keys; int len, i; if (map != NULL) { keys = u_map_enum_keys(map); for (i=0; keys[i] != NULL; i++) { len = snprintf(NULL, 0, "key is %s, value is %s\n", keys[i], u_map_get(map, keys[i])); line = malloc((len+1)*sizeof(char)); snprintf(line, (len+1), "key is %s, value is %s\n", keys[i], u_map_get(map, keys[i])); if (to_return != NULL) { len = strlen(to_return) + strlen(line) + 1; to_return = realloc(to_return, (len+1)*sizeof(char)); } else { to_return = malloc((strlen(line) + 1)*sizeof(char)); to_return[0] = 0; } strcat(to_return, line); free(line); } return to_return; } else { return NULL; } } /** * Developper-friendly response print */ void print_response(struct _u_response * response) { char * dump_json = NULL; json_t * json_body; if (response != NULL) { printf("Status: %ld\n\n", response->status); json_body = ulfius_get_json_body_response(response, NULL); if (json_body != NULL) { dump_json = json_dumps(json_body, JSON_INDENT(2)); printf("Json body:\n%s\n\n", dump_json); free(dump_json); } else { printf("String body: %.*s\n\n", (int)response->binary_body_length, (char *)response->binary_body); } json_decref(json_body); } } int test_request(struct _u_request * req, long int expected_status, json_t * expected_json_body, const char * exptected_string_body, const char * expected_redirect_uri_contains) { int res, to_return = 0; struct _u_response response; json_t * json_body; ulfius_init_response(&response); res = ulfius_send_http_request(req, &response); if (res == U_OK) { if (response.status != expected_status) { printf("##########################\nError status (%s %s %ld)\n", req->http_verb, req->http_url, expected_status); print_response(&response); printf("##########################\n\n"); } else if (expected_json_body != NULL) { json_body = ulfius_get_json_body_response(&response, NULL); if (json_body == NULL || json_search(json_body, expected_json_body) == NULL) { char * dump_expected = json_dumps(expected_json_body, JSON_ENCODE_ANY), * dump_response = json_dumps(json_body, JSON_ENCODE_ANY); printf("##########################\nError json (%s %s)\n", req->http_verb, req->http_url); printf("Expected result in response:\n%s\nWhile response is:\n%s\n", dump_expected, dump_response); printf("##########################\n\n"); free(dump_expected); free(dump_response); } else { to_return = 1; } json_decref(json_body); } else if (exptected_string_body != NULL && o_strnstr((const char *)response.binary_body, exptected_string_body, response.binary_body_length) == NULL) { printf("##########################\nError (%s %s)\n", req->http_verb, req->http_url); printf("Expected result in response:\n%s\nWhile response is:\n%s\n", exptected_string_body, (const char *)response.binary_body); printf("##########################\n\n"); } else if (expected_redirect_uri_contains != NULL && o_strstr(u_map_get(response.map_header, "Location"), expected_redirect_uri_contains) == NULL) { printf("##########################\nError (%s %s)\n", req->http_verb, req->http_url); printf("expected_redirect_uri_contains is %s\nwhile redirect_uri is %s\n", expected_redirect_uri_contains, u_map_get(response.map_header, "Location")); printf("##########################\n\n"); } else { to_return = 1; } } else { printf("Error in http request: %d\n", res); } ulfius_clean_response(&response); return to_return; } int run_simple_test(struct _u_request * req, const char * method, const char * url, const char * auth_basic_user, const char * auth_basic_password, json_t * json_body, const struct _u_map * body, int expected_status, json_t * expected_json_body, const char * exptected_string_body, const char * expected_redirect_uri_contains) { struct _u_request * request; int res; if (req != NULL) { request = ulfius_duplicate_request(req); free(request->http_verb); free(request->http_url); } else { request = malloc(sizeof (struct _u_request)); ulfius_init_request(request); } request->http_verb = o_strdup(method); request->http_url = strdup(url); if (body != NULL) { u_map_copy_into(request->map_post_body, body); } else if (json_body != NULL) { ulfius_set_json_body_request(request, json_body); } free(request->auth_basic_user); free(request->auth_basic_password); request->auth_basic_user = o_strdup(auth_basic_user); request->auth_basic_password = o_strdup(auth_basic_password); res = test_request(request, expected_status, expected_json_body, exptected_string_body, expected_redirect_uri_contains); ulfius_clean_request_full(request); return res; } /** * Converts a hex character to its integer value */ char from_hex(char ch) { return isdigit(ch) ? ch - '0' : tolower(ch) - 'a' + 10; } /** * Converts an integer value to its hex character */ char to_hex(char code) { static char hex[] = "0123456789abcdef"; return hex[code & 15]; } /** * Returns a url-encoded version of str * IMPORTANT: be sure to free() the returned string after use * Thanks Geek Hideout! * http://www.geekhideout.com/urlcode.shtml */ char * url_encode(const char * str) { char * pstr = (char*)str, * buf = malloc(strlen(str) * 3 + 1), * pbuf = buf; while (* pstr) { if (isalnum(* pstr) || * pstr == '-' || * pstr == '_' || * pstr == '.' || * pstr == '~') * pbuf++ = * pstr; else if (* pstr == ' ') * pbuf++ = '+'; else * pbuf++ = '%', * pbuf++ = to_hex(* pstr >> 4), * pbuf++ = to_hex(* pstr & 15); pstr++; } * pbuf = '\0'; return buf; } /** * Returns a url-decoded version of str * IMPORTANT: be sure to free() the returned string after use * Thanks Geek Hideout! * http://www.geekhideout.com/urlcode.shtml */ char * url_decode(const char * str) { char * pstr = (char*)str, * buf = malloc(strlen(str) + 1), * pbuf = buf; while (* pstr) { if (* pstr == '%') { if (pstr[1] && pstr[2]) { * pbuf++ = from_hex(pstr[1]) << 4 | from_hex(pstr[2]); pstr += 2; } } else if (* pstr == '+') { * pbuf++ = ' '; } else { * pbuf++ = * pstr; } pstr++; } * pbuf = '\0'; return buf; } glewlwyd-1.3.1/test/unit-tests.h000066400000000000000000000012731322667720100166320ustar00rootroot00000000000000 #include char * print_map(const struct _u_map * map); void print_response(struct _u_response * response); int test_request(struct _u_request * req, long int expected_status, json_t * expected_json_body, const char * exptected_string_body, const char * expected_redirect_uri_contains); int run_simple_test(struct _u_request * req, const char * method, const char * url, const char * auth_basic_user, const char * auth_basic_password, json_t * json_body, const struct _u_map * body, int expected_status, json_t * expected_json_body, const char * exptected_string_body, const char * expected_redirect_uri_contains); char * url_decode(const char * str); char * url_encode(const char * str);glewlwyd-1.3.1/webapp/000077500000000000000000000000001322667720100146365ustar00rootroot00000000000000glewlwyd-1.3.1/webapp/app/000077500000000000000000000000001322667720100154165ustar00rootroot00000000000000glewlwyd-1.3.1/webapp/app/glewlwyd.react.js000066400000000000000000003043731322667720100207210ustar00rootroot00000000000000/** * * Glewlwyd OAuth2 Authorization Server * * Web application for server resource management * * Copyright 2017 Nicolas Mora * * The front-end application is under MIT Licence (MIT) * * The MIT License (MIT) * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * */ var Button = ReactBootstrap.Button; var Checkbox = ReactBootstrap.Checkbox; var Modal = ReactBootstrap.Modal; $(function() { /** * Web application parameters * Except for glewlwyd_server_url which I recommend to update, * the other values are not to be modified if you didn't change * the default parameters values during the installation */ var oauth = { /* redirect_uri to allow this application to connect to Glewlwyd, Uncomment and change this value if you changed the default config, see INSTALL.md */ //redirect_uri: "http://localhost:4593/app/index.html", client_id: "g_admin", /* client_id used for the glewlwyd manager app, default value is "g_admin", update this value if you have changed it in your installation */ glewlwyd_server_url: "../", /* Default value if the web app is hosted by the API server. For security, I recommend to put the absolute url, e.g. https://auth.domain.com/ */ access_token_cookie: "g_access_token", /* Name of the cookie to store the access_token */ /** * * This will contain server config variables, do not modify them. * Anyway, if you do modify them, they will be overwritten * */ access_token: false, admin_scope: "", api_prefix: "" }; // Global lists var scopeList = []; var resourceList = []; var authorizationTypeList = []; // tab menu $('#nav li a').click(function() { $('#nav li').removeClass(); $(this).parent().addClass('active'); if (!$(this).parent().hasClass('dropdown')) $(".navbar-collapse").collapse('hide'); }); // Parse query parameters function getQueryParams(qs) { qs = qs.split('+').join(' '); var params = {}, tokens, re = /[#&]?([^=]+)=([^&]*)/g; while (tokens = re.exec(qs)) { params[decodeURIComponent(tokens[1])] = decodeURIComponent(tokens[2]); } return params; } var currentUser = {loggedIn: false, name: "", email: ""}; // Function that will be used on every API call function APIRequest (method, url, data) { return $.ajax({ method: method, url: oauth.glewlwyd_server_url + oauth.api_prefix + url, data: JSON.stringify(data), contentType: data?"application/json; charset=utf-8":null, headers: {"Authorization": "Bearer " + oauth.access_token} }) .fail(function (error) { if (error.status === 401) { oauth.access_token = false; currentUser.loggedIn = false; ReactDOM.render( , document.getElementById('LoginComponent') ); } }); } /** * get access_token from url, or from cookie */ function init() { if (params.access_token) { oauth.access_token = params.access_token; var expires = new Date(); expires.setTime(expires.getTime() + (params.expires_in * 1000)); Cookies.set(oauth.access_token_cookie, params.access_token, {expires: expires}); document.location = "#"; } else if (params.error) { ReactDOM.render( , document.getElementById('modal') ); } else if (Cookies.get(oauth.access_token_cookie)) { oauth.access_token = Cookies.get(oauth.access_token_cookie); } /** * If an acces_token is present, use it to get all lists * if no access_token, display the login button */ if (oauth.access_token) { APIRequest("GET", "/profile/") .then(function (result) { currentUser.loggedIn = true; currentUser.name = result.name; currentUser.email = result.email; loadLists(); }) .fail(function (error) { if (error.status === 401) { currentUser.loggedIn = false; } }) .always(function () { ReactDOM.render( , document.getElementById('connectMessage') ); ReactDOM.render( , document.getElementById('LoginComponent') ); ReactDOM.render( , document.getElementById('spinner') ); }); } else { ReactDOM.render( , document.getElementById('connectMessage') ); ReactDOM.render( , document.getElementById('LoginComponent') ); ReactDOM.render( , document.getElementById('spinner') ); } } // Load all lists at startup function loadLists () { var promises = [ APIRequest("GET", "/user/"), APIRequest("GET", "/client/"), APIRequest("GET", "/scope/"), APIRequest("GET", "/resource/"), APIRequest("GET", "/authorization/") ]; $.when(promises) .then(function (results) { results[0].done(function (result) { ReactDOM.render( , document.getElementById('users') ); }); results[1].done(function (result) { ReactDOM.render( , document.getElementById('clients') ); }); results[2].done(function (result) { scopeList = result; ReactDOM.render( , document.getElementById('scopes') ); }); results[3].done(function (result) { resourceList = result; ReactDOM.render( , document.getElementById('resources') ); }); results[4].done(function (result) { authorizationTypeList = result; ReactDOM.render( , document.getElementById('authType') ); }); }) .fail(function (error) { if (error.status === 401) { currentUser.loggedIn = false; } }); } /** * User table management component */ class UserTable extends React.Component { constructor(props) { super(props); this.state = { users: this.props.users, }; this.runSearch = this.runSearch.bind(this); this.openModalAdd = this.openModalAdd.bind(this); this.saveUser = this.saveUser.bind(this); this.openModalEdit = this.openModalEdit.bind(this); this.openModalDelete = this.openModalDelete.bind(this); this.deleteUser = this.deleteUser.bind(this); this.openAlertModal = this.openAlertModal.bind(this); this.sendEmailPassword = this.sendEmailPassword.bind(this); } userDetails (user) { ReactDOM.render( , document.getElementById('userDetails') ); APIRequest("GET", "/user/" + user.login + "/session/") .then(function (result) { ReactDOM.render( , document.getElementById('userSessionTable') ); }); APIRequest("GET", "/user/" + user.login + "/refresh_token/") .then(function (result) { ReactDOM.render( , document.getElementById('userTokenTable') ); }); $('.nav-tabs a[href="#userDetail"]').tab('show'); } openModalAdd (event) { event.preventDefault(); ReactDOM.render( , document.getElementById('modal') ); } openModalEdit (user) { var cloneUser = $.extend({}, user); ReactDOM.render( , document.getElementById('modal') ); } openModalDelete (user) { var message = "Are your sure you want to delete user '" + user.login + "'"; ReactDOM.render( , document.getElementById('modal') ); this.setState({editUser: user}); } openAlertModal (message) { ReactDOM.render( , document.getElementById('modal') ); } deleteUser (result) { if (result) { var self = this; APIRequest("DELETE", "/user/" + this.state.editUser.login) .then(function (result) { var users = self.state.users; for (var key in users) { if (users[key].login === self.state.editUser.login) { users.splice(key, 1); break; } }; self.setState({users: users}); self.openAlertModal("User deleted"); }) .fail(function (result) { self.openAlertModal("Error deleting user"); }); } } saveUser (add, user) { var self = this; if (!user.password) { delete(user.password); } if (add) { APIRequest("GET", "/user/" + user.login) .then(function (result) { self.openAlertModal("Error, login '" + user.login + "' already exist"); }) .fail(function () { APIRequest("POST", "/user/", user) .then(function (result) { var users = self.state.users; users.push(user); self.setState({users: users}); self.openAlertModal("User created"); }) .fail(function (error) { self.openAlertModal("Error adding user"); }); }) } else { APIRequest("PUT", "/user/" + user.login, user) .then(function () { var users = self.state.users; for (var key in users) { if (users[key].login === user.login) { users[key] = user; } }; self.setState({users: users}); self.openAlertModal("User updated"); }) .fail(function (error) { self.openAlertModal("Error updating user"); }); } } runSearch (search, offset, limit) { var self = this; if (search) { APIRequest("GET", "/user/?search=" + search + "&limit=" + limit + "&offset=" + offset) .then(function (result) { self.setState({ users: result }); }) .fail(function (error) { self.openAlertModal("Error while searching users"); }); } else { APIRequest("GET", "/user/" + "?limit=" + limit + "&offset=" + offset) .then(function (result) { self.setState({ users: result }); }) .fail(function (error) { self.openAlertModal("Error while searching users"); }); } } sendEmailPassword (user) { var self = this; APIRequest("POST", "/user/" + user.login + "/reset_password") .then(function (result) { self.openAlertModal("Email sent to user"); }) .fail(function (error) { self.openAlertModal("Error sending email"); }); } render() { var self = this; var rows = []; this.state.users.forEach(function(user, index) { rows.push( ); }); return (

{rows}
Backend Login Name E-mail Scopes Enabled
); } } function UserRow (props) { return ( {props.user.source} {props.user.login} {props.user.name} {props.user.email} {props.user.scope.join(", ")} {String(props.user.enabled)}
); } class UserEditModal extends React.Component { constructor(props) { super(props); var user = props.user; if (props.add) { user = { source: "database", name: "", login: "", email: "", enabled: true, scope: [] } } user.password = ""; user.confirmPassword = ""; this.state = { show: props.show, add: this.props.add, user: user, closeModal: this.props.closeModal, loginInvalid: this.props.add, passwordInvalid: false }; this.handleChangeSource = this.handleChangeSource.bind(this); this.handleChangeLogin = this.handleChangeLogin.bind(this); this.handleChangeName = this.handleChangeName.bind(this); this.handleChangeEmail = this.handleChangeEmail.bind(this); this.handleChangeAdditionalValue = this.handleChangeAdditionalValue.bind(this); this.handleChangePassword = this.handleChangePassword.bind(this); this.handleChangeConfirmPassword = this.handleChangeConfirmPassword.bind(this); this.handleChangeEnabled = this.handleChangeEnabled.bind(this); this.updateScopes = this.updateScopes.bind(this); this.closeModal = this.closeModal.bind(this); } componentWillReceiveProps(nextProps) { var user = nextProps.user; if (nextProps.add) { user = { source: "database", name: "", login: "", email: "", enabled: true, scope: [] } } user.password = ""; user.confirmPassword = ""; this.setState({ show: nextProps.show, add: nextProps.add, user: user, closeModal: nextProps.closeModal, loginInvalid: nextProps.add, passwordInvalid: false }); } closeModal (result) { if (result) { this.state.closeModal(this.state.add, this.state.user); } this.setState({show: false}); } handleChangeSource (event) { var newUser = $.extend({}, this.state.user); newUser.source = event.target.value; this.setState({user: newUser}); } handleChangeLogin (event) { var isInvalid = !event.target.value; var newUser = $.extend({}, this.state.user); newUser.login = event.target.value || ""; this.setState({user: newUser, loginInvalid: isInvalid}); } handleChangeName (event) { var newUser = $.extend({}, this.state.user); newUser.name = event.target.value || ""; this.setState({user: newUser}); } handleChangeEmail (event) { var newUser = $.extend({}, this.state.user); newUser.email = event.target.value || ""; this.setState({user: newUser}); } handleChangeAdditionalValue (event) { var newUser = $.extend({}, this.state.user); newUser.additional_property_value = event.target.value || ""; this.setState({user: newUser}); } handleChangePassword (event) { var isInvalid = (!!event.target.value || !!this.state.user.confirmPassword) && (event.target.value !== this.state.user.confirmPassword || event.target.value.length < 8); var newUser = $.extend({}, this.state.user); newUser.password = event.target.value || ""; this.setState({user: newUser, passwordInvalid: isInvalid}); } handleChangeConfirmPassword (event) { var isInvalid = (!!this.state.user.password || !!event.target.value) && (this.state.user.password !== event.target.value || event.target.value.length < 8); var newUser = $.extend({}, this.state.user); newUser.confirmPassword = event.target.value || ""; this.setState({user: newUser, passwordInvalid: isInvalid}); } handleChangeEnabled (event) { var newUser = $.extend({}, this.state.user); newUser.enabled = !newUser.enabled; this.setState({user: newUser}); } updateScopes (scopes) { var newUser = $.extend({}, this.state.user); newUser.scope = scopes; this.setState({user: newUser}); } render () { return ( this.closeModal(false)}> User
); } } /** * Client table management component */ class ClientTable extends React.Component { constructor(props) { super(props); var selectedScope = ""; if (scopeList.length > 0) { selectedScope = scopeList[0].name; } this.state = { clients: this.props.clients, editClient: null }; this.runSearch = this.runSearch.bind(this); this.openModalAdd = this.openModalAdd.bind(this); this.saveClient = this.saveClient.bind(this); this.openModalEdit = this.openModalEdit.bind(this); this.openModalDelete = this.openModalDelete.bind(this); this.deleteClient = this.deleteClient.bind(this); this.openAlertModal = this.openAlertModal.bind(this); } openModalAdd () { ReactDOM.render( , document.getElementById('modal') ); } openModalEdit (client) { var cloneClient = $.extend({}, client); ReactDOM.render( , document.getElementById('modal') ); } openModalDelete (client) { var message = "Are your sure you want to delete client '" + client.name + "'"; ReactDOM.render( , document.getElementById('modal') ); this.setState({editClient: client}); } openAlertModal (message) { ReactDOM.render( , document.getElementById('modal') ); } deleteClient (result) { var self = this; if (result) { APIRequest("DELETE", "/client/" + this.state.editClient.client_id) .then(function (result) { var clients = self.state.clients; for (var key in clients) { if (clients[key].client_id === self.state.editClient.client_id) { clients.splice(key, 1); break; } }; self.setState({clients: clients}); self.openAlertModal("Client deleted"); }) .fail(function (error) { self.openAlertModal("Error deleting client"); }); } } saveClient (add, client) { var self = this; if (!client.password) { delete(client.password); } if (add) { APIRequest("GET", "/client/" + client.client_id) .then(function (result) { self.openAlertModal("Error, client_id '" + client.client_id + "' already exist"); }) .fail(function () { APIRequest("POST", "/client/", client) .then(function (result) { var clients = self.state.clients; clients.push(client); self.setState({clients: clients}); self.openAlertModal("Client created"); }) .fail(function (error) { self.openAlertModal("Error adding client"); }); }); } else { APIRequest("PUT", "/client/" + client.client_id, client) .then(function () { var clients = self.state.clients; for (var key in clients) { if (clients[key].client_id === client.client_id) { clients[key] = client; } }; self.setState({clients: clients}); self.openAlertModal("Client updated"); }) .fail(function (error) { self.openAlertModal("Error updating client"); }); } } runSearch (search, offset, limit) { var self = this; if (search) { APIRequest("GET", "/client/?search=" + search + "&limit=" + limit + "&offset=" + offset) .then(function (result) { self.setState({clients: result}); }) .fail(function (error) { self.openAlertModal("Error while searching clients"); }); } else { APIRequest("GET", "/client/" + "?limit=" + limit + "&offset=" + offset) .then(function (result) { self.setState({clients: result}); }) .fail(function (error) { self.openAlertModal("Error while searching clients"); }); } } render() { var self = this; var rows = []; this.state.clients.forEach(function(client, index) { rows.push( ); }); return (
{rows}
Source Client Id Name Description Confidential Scopes Authorization Types Enabled
); } } function ClientRow (props) { return ( {props.client.source} {props.client.client_id} {props.client.name} {props.client.description} {String(props.client.confidential)} {props.client.scope.join(", ")} {props.client.authorization_type.join(", ")} {String(props.client.enabled)}
); } class ClientEditModal extends React.Component { constructor(props) { super(props); var client = props.client; if (props.add) { client = { source: "database", name: "", description: "", client_id: "", confidential: false, enabled: true, redirect_uri: [], scope: [], authorization_type: [] } } client.password = ""; client.confirmPassword = ""; this.state = { show: props.show, add: this.props.add, client: client, closeModal: this.props.closeModal, nameInvalid: this.props.add, clientIdInvalid: this.props.add, redirectUriNameInvalid: true, redirectUriInvalid: true, }; this.handleChangeSource = this.handleChangeSource.bind(this); this.handleChangeClientId = this.handleChangeClientId.bind(this); this.handleChangeName = this.handleChangeName.bind(this); this.handleChangeDescription = this.handleChangeDescription.bind(this); this.handleChangeConfidential = this.handleChangeConfidential.bind(this); this.handleChangePassword = this.handleChangePassword.bind(this); this.handleChangeConfirmPassword = this.handleChangeConfirmPassword.bind(this); this.handleChangeRedirectUriName = this.handleChangeRedirectUriName.bind(this); this.handleChangeRedirectUri = this.handleChangeRedirectUri.bind(this); this.addRedirectUri = this.addRedirectUri.bind(this); this.removeRedirectUri = this.removeRedirectUri.bind(this); this.handleChangeEnabled = this.handleChangeEnabled.bind(this); this.updateScopes = this.updateScopes.bind(this); this.updateAuthTypes = this.updateAuthTypes.bind(this); this.closeModal = this.closeModal.bind(this); } componentWillReceiveProps(nextProps) { var client = nextProps.client; if (nextProps.add) { client = { source: "database", name: "", description: "", client_id: "", confidential: false, enabled: true, redirect_uri: [], scope: [], authorization_type: [] } } client.password = ""; client.confirmPassword = ""; this.setState({ show: nextProps.show, add: nextProps.add, client: client, closeModal: nextProps.closeModal, nameInvalid: nextProps.add, clientIdInvalid: nextProps.add, redirectUriNameInvalid: true, redirectUriInvalid: true }); } closeModal (result) { if (result) { this.state.closeModal(this.state.add, this.state.client); } this.setState({show: false}); } handleChangeSource (event) { var newClient = $.extend({}, this.state.client); newClient.source = event.target.value; this.setState({client: newClient}); } handleChangeClientId (event) { var isInvalid = !event.target.value; var newClient = $.extend({}, this.state.client); newClient.client_id = event.target.value || ""; this.setState({client: newClient, clientIdInvalid: isInvalid}); } handleChangeName (event) { var isInvalid = !event.target.value; var newClient = $.extend({}, this.state.client); newClient.name = event.target.value || ""; this.setState({client: newClient, nameInvalid: isInvalid}); } handleChangeDescription (event) { var newClient = $.extend({}, this.state.client); newClient.description = event.target.value || ""; this.setState({client: newClient}); } handleChangeRedirectUriName (event) { var isInvalid = !event.target.value.length > 0; this.setState({redirectUriName: event.target.value || "", redirectUriNameInvalid: isInvalid}); } handleChangeRedirectUri (event) { var isInvalid = !event.target.value.startsWith("http://") && !event.target.value.startsWith("https://"); this.setState({redirectUri: event.target.value || "", redirectUriInvalid: isInvalid}); } addRedirectUri (event) { if (this.state.redirectUriName.length > 0 && (this.state.redirectUri.startsWith("http://") || this.state.redirectUri.startsWith("https://"))) { var newClient = $.extend({}, this.state.client); newClient.redirect_uri.push({name: this.state.redirectUriName, uri: this.state.redirectUri}); this.setState({client: newClient}); } } handleChangeConfidential (event) { var newClient = $.extend({}, this.state.client); newClient.confidential = !newClient.confidential; var isInvalid = newClient.confidential && (this.state.client.password !== this.state.client.confirmPassword || !this.state.client.password || this.state.client.password.length < 8); this.setState({client: newClient, passwordInvalid: isInvalid}); } handleChangePassword (event) { var isInvalid = this.state.client.confidential && (event.target.value !== this.state.client.confirmPassword || event.target.value.length < 8); var newClient = $.extend({}, this.state.client); newClient.password = event.target.value || ""; this.setState({client: newClient, passwordInvalid: isInvalid}); } handleChangeConfirmPassword (event) { var isInvalid = this.state.client.confidential && (event.target.value !== this.state.client.password || !this.state.client.password || this.state.client.password.length < 8); var newClient = $.extend({}, this.state.client); newClient.confirmPassword = event.target.value || ""; this.setState({client: newClient, passwordInvalid: isInvalid}); } handleChangeEnabled (event) { var newClient = $.extend({}, this.state.client); newClient.enabled = !newClient.enabled; this.setState({client: newClient}); } updateScopes (scopes) { var newClient = $.extend({}, this.state.resource); newClient.scope = scopes; this.setState({resource: newClient}); } updateAuthTypes (authTypes) { var newClient = $.extend({}, this.state.resource); newClient.authorization_type = authTypes; this.setState({resource: newClient}); } removeRedirectUri (redirectUri, event) { event.preventDefault(); var client = this.state.client; client.redirect_uri.splice(client.redirect_uri.indexOf(client.redirectUri), 1); this.setState({client: client}); } render () { var clientRedirectUriList = []; var self = this; this.state.client.redirect_uri.forEach(function (redirect_uri, index) { clientRedirectUriList.push( self.removeRedirectUri(redirect_uri.name, evt)}>  {redirect_uri.name + " (" + redirect_uri.uri + ")"} ); }); return ( this.closeModal(false)}> Client
{clientRedirectUriList}
); } } class ClientAuthTypeManagement extends React.Component { constructor(props) { super(props); var authTypeSelected = ""; if (authorizationTypeList.length > 0) { authTypeSelected = authorizationTypeList[0].name; } this.state = {authorizationTypes: props.authorizationTypes, authTypeSelected: authTypeSelected, updateAuthTypes: props.updateAuthTypes}; this.handleChangeAuthTypeSelected = this.handleChangeAuthTypeSelected.bind(this); this.addAuthType = this.addAuthType.bind(this); this.removeAuthType = this.removeAuthType.bind(this); } handleChangeAuthTypeSelected (event) { this.setState({authTypeSelected: event.target.value}); } removeAuthType (authType, event) { event.preventDefault(); var authorizationTypes = this.state.authorizationTypes; authorizationTypes.splice(authorizationTypes.indexOf(authType), 1); this.setState({authorizationTypes: authorizationTypes}); this.state.updateAuthTypes(authorizationTypes); } addAuthType () { var authorizationTypes = this.state.authorizationTypes; if (authorizationTypes.indexOf(this.state.authTypeSelected) == -1) { this.setState({authorizationTypes: authorizationTypes}); authorizationTypes.push(this.state.authTypeSelected); } this.state.updateAuthTypes(authorizationTypes); } render () { var self = this; var allAuthTypeList = []; authorizationTypeList.forEach(function (authType, index) { allAuthTypeList.push() }); var curAuthTypeList = []; this.state.authorizationTypes.forEach(function (authType, index) { curAuthTypeList.push( {authType}  self.removeAuthType(authType, evt)}> ); }); return (
{curAuthTypeList}
); } } /** * Scope table management component */ class ScopeTable extends React.Component { constructor(props) { super(props); this.state = { scopes: this.props.scopes, showModal: false, editScope: { name: "", description: "" }, add: false, nameInvalid: false, showConfirmModal: false, messageConfirmModal: "", showAlertModal: false, messageAlertModal: "" }; // Modal functions this.openModalAdd = this.openModalAdd.bind(this); this.closeScopeModal = this.closeScopeModal.bind(this); this.saveScope = this.saveScope.bind(this); this.openModalEdit = this.openModalEdit.bind(this); this.handleChangeName = this.handleChangeName.bind(this); this.handleChangeDescription = this.handleChangeDescription.bind(this); this.openModalDelete = this.openModalDelete.bind(this); this.confirmDelete = this.confirmDelete.bind(this); this.openAlertModal = this.openAlertModal.bind(this); } openModalAdd (event) { event.preventDefault(); ReactDOM.render( , document.getElementById('modal') ); } openModalEdit (scope) { var cloneScope = $.extend({}, scope); this.setState({editScope: cloneScope}); ReactDOM.render( , document.getElementById('modal') ); } openModalDelete (scope) { var message = "Are your sure you want to delete scope '" + scope.name + "'"; ReactDOM.render( , document.getElementById('modal') ); this.setState({editScope: scope}); } openAlertModal (message) { ReactDOM.render( , document.getElementById('modal') ); } confirmDelete (result) { if (result) { var self = this; APIRequest("DELETE", "/scope/" + this.state.editScope.name) .then(function (result) { var scopes = self.state.scopes; for (var key in scopes) { if (scopes[key].name === self.state.editScope.name) { scopes.splice(key, 1); break; } }; self.setState({scopes: scopes}); self.openAlertModal("Scope deleted"); }) .fail(function (error) { self.openAlertModal("Error deleting scope"); }); } } closeScopeModal(result, value) { this.setState({showModal: false}); } saveScope (add, scope) { var self = this; if (add) { APIRequest("GET", "/scope/" + scope.name) .then(function (result) { self.openAlertModal("Error, scope '" + scope.name + "' already exist"); }) .fail(function () { APIRequest("POST", "/scope/", scope) .then(function (result) { var scopes = self.state.scopes; scopes.push(scope); self.setState({scopes: scopes}); self.openAlertModal("Scope created"); }) .fail(function (error) { self.openAlertModal("Error adding scope"); }); }); } else { APIRequest("PUT", "/scope/" + scope.name, scope) .then(function () { var scopes = self.state.scopes; for (var key in scopes) { if (scopes[key].name === scope.name) { scopes[key] = scope; } }; self.setState({scopes: scopes}); self.openAlertModal("Scope updated"); }) .fail(function (error) { self.openAlertModal("Error updating scope"); }); } } handleChangeName (event) { var isInvalid = !event.target.value; var newScope = $.extend({}, this.state.editScope); newScope.name = event.target.value || ""; this.setState({editScope: newScope, nameInvalid: isInvalid}); } handleChangeDescription (event) { var newScope = $.extend({}, this.state.editScope); newScope.description = event.target.value || ""; this.setState({editScope: newScope}); } render() { var self = this; var rows = []; this.state.scopes.forEach(function(scope, index) { rows.push(); }); return (
{rows}
Name Description
); } } function ScopeRow (props) { return ( {props.scope.name} {props.scope.description}
); } class ScopeEditModal extends React.Component { constructor(props) { super(props); this.state = {show: props.show, add: this.props.add, scope: this.props.scope, closeModal: this.props.closeModal, nameInvalid: this.props.add}; this.handleChangeName = this.handleChangeName.bind(this); this.handleChangeDescription = this.handleChangeDescription.bind(this); } componentWillReceiveProps(nextProps) { this.setState({show: nextProps.show, add: nextProps.add, scope: nextProps.scope, closeModal: nextProps.closeModal}); } closeModal (result) { if (result) { this.state.closeModal(this.state.add, this.state.scope); } this.setState({show: false}); } handleChangeName (event) { var isInvalid = !event.target.value; var newScope = $.extend({}, this.state.scope); newScope.name = event.target.value || ""; this.setState({scope: newScope, nameInvalid: isInvalid}); } handleChangeDescription (event) { var newScope = $.extend({}, this.state.scope); newScope.description = event.target.value || ""; this.setState({scope: newScope}); } render () { return ( this.closeModal(false)}> Scope
); } } /** * Resource table management component */ class ResourceTable extends React.Component { constructor(props) { super(props); var selectedScope = ""; if (scopeList.length > 0) { selectedScope = scopeList[0].name; } this.state = { resources: this.props.resources, editResource: {} }; // Modal functions this.openModalAdd = this.openModalAdd.bind(this); this.openModalEdit = this.openModalEdit.bind(this); this.openModalDelete = this.openModalDelete.bind(this); this.openAlertModal = this.openAlertModal.bind(this); this.confirmDelete = this.confirmDelete.bind(this); this.saveResource = this.saveResource.bind(this); } openModalAdd () { ReactDOM.render( , document.getElementById('modal') ); } openModalEdit (resource) { var cloneResource = $.extend({}, resource); this.setState({editResource: cloneResource}); ReactDOM.render( , document.getElementById('modal') ); } openModalDelete (resource) { var message = "Are your sure you want to delete resource '" + resource.name + "'"; ReactDOM.render( , document.getElementById('modal') ); this.setState({editResource: resource}); } openAlertModal (message) { ReactDOM.render( , document.getElementById('modal') ); } confirmDelete (result) { if (result) { var self = this; APIRequest("DELETE", "/resource/" + this.state.editResource.name) .then(function (result) { var resources = self.state.resources; for (var key in resources) { if (resources[key].name === self.state.editResource.name) { resources.splice(key, 1); break; } }; self.setState({resources: resources}); self.openAlertModal("Resource deleted"); }) .fail(function (error) { self.openAlertModal("Error deleting resource"); }); } } saveResource (add, resource) { var self = this; if (add) { APIRequest("GET", "/resource/" + resource.name) .then(function (result) { self.openAlertModal("Error, resource '" + resource.name + "' already exist"); }) .fail(function () { APIRequest("POST", "/resource/", resource) .then(function (result) { var resources = self.state.resources; resources.push(resource); self.setState({resources: resources}); self.openAlertModal("Resource created"); }) .fail(function (error) { self.openAlertModal("Error adding resource"); }); }) } else { APIRequest("PUT", "/resource/" + resource.name, resource) .then(function () { var resources = self.state.resources; for (var key in resources) { if (resources[key].name === resource.name) { resources[key] = resource; } }; self.setState({resources: resources}); self.openAlertModal("Resource updated"); }) .fail(function (error) { self.openAlertModal("Error updating resource"); }); } } render() { var self = this; var rows = []; this.state.resources.forEach(function(resource, index) { rows.push( ); }); return (
{rows}
Name Description URI Scopes
); } } function ResourceRow (props) { return ( {props.resource.name} {props.resource.description} {props.resource.uri} {props.resource.scope.join(", ")}
); } class ResourceEditModal extends React.Component { constructor(props) { super(props); var selectedScope = ""; if (scopeList.length > 0) { selectedScope = scopeList[0].name; } this.state = {show: props.show, add: this.props.add, resource: this.props.resource, selectedScope: selectedScope, closeModal: this.props.closeModal, nameInvalid: this.props.add, uriInvalid: this.props.add}; this.handleChangeName = this.handleChangeName.bind(this); this.handleChangeDescription = this.handleChangeDescription.bind(this); this.handleChangeUri = this.handleChangeUri.bind(this); this.updateScopes = this.updateScopes.bind(this); } componentWillReceiveProps(nextProps) { this.setState({show: nextProps.show, add: nextProps.add, resource: nextProps.resource, closeModal: nextProps.closeModal}); } closeModal (result) { if (result) { this.state.closeModal(this.state.add, this.state.resource); } this.setState({show: false}); } handleChangeName (event) { var isInvalid = !event.target.value; var newResource = $.extend({}, this.state.resource); newResource.name = event.target.value || ""; this.setState({resource: newResource, nameInvalid: isInvalid}); } handleChangeDescription (event) { var newResource = $.extend({}, this.state.resource); newResource.description = event.target.value || ""; this.setState({resource: newResource}); } handleChangeUri (event) { var isInvalid = !event.target.value; var newResource = $.extend({}, this.state.resource); newResource.uri = event.target.value || ""; this.setState({resource: newResource, uriInvalid: isInvalid}); } updateScopes (scopes) { var newResource = $.extend({}, this.state.resource); newResource.scope = scopes; this.setState({resource: newResource}); } render () { return ( this.closeModal(false)}> Resource
); } } /** * User details component */ function UserDetails (props) { return (

{props.user.name}

{props.user.name}
{props.user.email}
{props.user.login}
{props.user.scope.join(", ")}
{String(props.user.enabled)}
); } function UserSessionRow (props) { return ( {props.session.ip_source} {(new Date(props.session.issued_at*1000)).toLocaleString()} {(new Date(props.session.last_seen*1000)).toLocaleString()} {(new Date(props.session.expired_at*1000)).toLocaleString()} {String(props.session.enabled)} {props.session.enabled?:''} ); } class UserSessionTable extends React.Component { constructor(props) { super(props); this.state = {sessionList: this.props.sessionList}; this.refreshSessionList = this.refreshSessionList.bind(this); this.openConfirmModal = this.openConfirmModal.bind(this); this.closeConfirmModal = this.closeConfirmModal.bind(this); this.state = {sessionList: this.props.sessionList, currentSession: {}} } componentWillReceiveProps(nextProps) { this.setState({sessionList: nextProps.sessionList}); } refreshSessionList (valid, offset, limit) { var self = this; APIRequest("GET", "/user/" + this.props.login + "/session/?valid=" + (valid?valid:"") + "&offset=" + (offset?offset:"") + "&limit=" + (limit?limit:"")) .then(function (result) { self.setState({sessionList: result}); }); } openConfirmModal (session, evt) { this.setState({currentSession: session}); ReactDOM.render( , document.getElementById('modal') ); } closeConfirmModal (result, evt) { var self = this; if (result) { APIRequest("DELETE", "/user/" + this.props.login + "/session/", {session_hash: this.state.currentSession.session_hash}) .then(function (result) { var currentSession = self.state.currentSession; currentSession.enabled = false; var sessionList = self.state.sessionList; sessionList.forEach(function (session) { if (session.session_hash === self.state.currentSession.session_hash) { session.enabled = false; } }); self.setState({currentSession: currentSession, sessionList: sessionList}); ReactDOM.render( , document.getElementById('modal') ); }); } } render () { var rows = []; var self = this; this.state.sessionList.forEach(function (session, index) { rows.push(); }); return (

Sessions 

{rows}
Originiated IP Source Issued at Last seen Expires at Enabled
); } } function UserTokenRow (props) { return ( {props.token.ip_source} {props.token.authorization_type} {(new Date(props.token.issued_at*1000)).toLocaleString()} {(new Date(props.token.last_seen*1000)).toLocaleString()} {(new Date(props.token.expired_at*1000)).toLocaleString()} {String(props.token.enabled)} {props.token.enabled?:''} ); } class UserTokenTable extends React.Component { constructor(props) { super(props); this.state = {tokenList: this.props.tokenList}; this.refreshTokenList = this.refreshTokenList.bind(this); this.openConfirmModal = this.openConfirmModal.bind(this); this.closeConfirmModal = this.closeConfirmModal.bind(this); this.state = {tokenList: this.props.tokenList, currentToken: {}} } componentWillReceiveProps(nextProps) { this.setState({tokenList: nextProps.tokenList}); } refreshTokenList (valid, offset, limit) { var self = this; APIRequest("GET", "/user/" + this.props.login + "/refresh_token/?valid=" + (valid?valid:"") + "&offset=" + (offset?offset:"") + "&limit=" + (limit?limit:"")) .then(function (result) { self.setState({tokenList: result}); }); } openConfirmModal (token, evt) { this.setState({currentToken: token}); ReactDOM.render( , document.getElementById('modal') ); } closeConfirmModal (result, evt) { var self = this; if (result) { APIRequest("DELETE", "/user/" + this.props.login + "/refresh_token/", {token_hash: this.state.currentToken.token_hash}) .then(function (result) { var currentToken = self.state.currentToken; currentToken.enabled = false; var tokenList = self.state.tokenList; tokenList.forEach(function (token) { if (token.token_hash === self.state.currentToken.token_hash) { token.enabled = false; } }); self.setState({currentToken: currentToken, tokenList: tokenList}); ReactDOM.render( , document.getElementById('modal') ); }); } } render () { var rows = []; var self = this; this.state.tokenList.forEach(function (token, index) { rows.push(); }); return (

Refresh tokens 

{rows}
Originiated IP Source Authorization type Issued at Last seen Expires at Enabled
); } } /** * Login/Logout button component */ function LoginInformation (props) { return (

); } function ConnectMessage (props) { return (

); } class LogoutButton extends React.Component { constructor(props) { super(props); this.handleLogout = this.handleLogout.bind(this); } render() { return (); } handleLogout() { Cookies.remove(oauth.access_token_cookie); location.reload(); } } class ProfileButton extends React.Component { constructor(props) { super(props); this.handleProfile = this.handleProfile.bind(this); } render() { return (); } handleProfile() { window.location = "profile.html"; } } class LoginButton extends React.Component { constructor(props) { super(props); this.handleLogin = this.handleLogin.bind(this); } render() { return (); } handleLogin() { document.location = oauth.glewlwyd_server_url + oauth.api_prefix + "/auth?response_type=token&client_id="+oauth.client_id+"&redirect_uri="+oauth.redirect_uri+"&scope="+oauth.admin_scope; } } function LoginComponent (props) { if (props.user.loggedIn) { return (
); } else { return (
); } } /** * Scope modal management */ class ScopeManagement extends React.Component { constructor(props) { super(props); var selectedScope = ""; if (scopeList.length > 0) { selectedScope = scopeList[0].name; } this.state = {scopes: props.scopes, selectedScope: selectedScope, updateScopes: props.updateScopes}; this.handleChangeScopeSelected = this.handleChangeScopeSelected.bind(this); this.addScope = this.addScope.bind(this); this.removeScope = this.removeScope.bind(this); } handleChangeScopeSelected (event) { this.setState({selectedScope: event.target.value}); } removeScope (scope, event) { event.preventDefault(); var scopes = this.state.scopes; scopes.splice(scopes.indexOf(scope), 1); this.setState({scopes: scopes}); this.state.updateScopes(scopes); } addScope (event) { var scopes = this.state.scopes; if (scopes.indexOf(this.state.selectedScope) == -1) { scopes.push(this.state.selectedScope); this.setState({scopes: scopes}); } this.state.updateScopes(scopes); } render () { var self = this; var allScopeList = []; scopeList.forEach(function (scope) { allScopeList.push() }); var curScopeList = []; this.state.scopes.forEach(function (scope, index) { curScopeList.push( {scope}  self.removeScope(scope, evt)}> ); }); return (
{curScopeList}
); } } /** * List navigation management */ class ListNavigation extends React.Component { constructor(props) { super(props); this.state = {search: "", limit: 10, offset: 0, updateNavigation: props.updateNavigation}; this.handleChangeSearch = this.handleChangeSearch.bind(this); this.handlePreviousPage = this.handlePreviousPage.bind(this); this.handleChangeLimit = this.handleChangeLimit.bind(this); this.handleNextPage = this.handleNextPage.bind(this); this.handleSearch = this.handleSearch.bind(this); } handleChangeSearch (event) { this.setState({search: event.target.value}); } handleChangeLimit (event) { var limit = parseInt(event.target.value); this.setState({limit: limit}); this.state.updateNavigation(this.state.search, this.state.offset, limit); } handlePreviousPage (event) { var offset = this.state.offset-this.state.limit; this.setState({offset: offset}); this.state.updateNavigation(this.state.search, offset, this.state.limit); } handleNextPage (event) { var offset = this.state.offset+this.state.limit; this.setState({offset: offset}); this.state.updateNavigation(this.state.search, offset, this.state.limit); } handleSearch (event) { event.preventDefault(); this.state.updateNavigation(this.state.search, this.state.offset, this.state.limit); } render () { return (
{this.state.limit} results maximum, starting at result: {this.state.offset}
); } } class TokenNavigation extends React.Component { constructor(props) { super(props); this.state = {valid: "", limit: 10, offset: 0, updateNavigation: props.updateNavigation}; this.handleChangeValid = this.handleChangeValid.bind(this); this.handlePreviousPage = this.handlePreviousPage.bind(this); this.handleChangeLimit = this.handleChangeLimit.bind(this); this.handleNextPage = this.handleNextPage.bind(this); this.handleRefresh = this.handleRefresh.bind(this); } handleChangeValid (event) { this.setState({valid: event.target.value}); this.state.updateNavigation(event.target.value, this.state.offset, this.state.limit); } handleChangeLimit (event) { var limit = parseInt(event.target.value); this.setState({limit: limit}); this.state.updateNavigation(this.state.valid, this.state.offset, limit); } handlePreviousPage (event) { var offset = this.state.offset-this.state.limit; this.setState({offset: offset}); this.state.updateNavigation(this.state.valid, offset, this.state.limit); } handleNextPage (event) { var offset = this.state.offset+this.state.limit; this.setState({offset: offset}); this.state.updateNavigation(this.state.valid, offset, this.state.limit); } handleRefresh (event) { event.preventDefault(); this.state.updateNavigation(this.state.valid, this.state.offset, this.state.limit); } render () { return (
{this.state.limit} results maximum, starting at result: {this.state.offset}
); } } /** * Authentication type table management component */ class AuthTypeEnableButton extends React.Component { constructor(props) { super(props); this.state = {enabled: this.props.authType.enabled, showAlertModal: false, messageAlertModal: ""}; this.handleToggleAuthType = this.handleToggleAuthType.bind(this); this.openAlertModal = this.openAlertModal.bind(this); this.closeAlertModal = this.closeAlertModal.bind(this); } openAlertModal (message) { this.setState({showAlertModal: true, messageAlertModal: message}); } closeAlertModal () { this.setState({showAlertModal: false}); } render() { var modal = Users {this.state.messageAlertModal} if (this.state.enabled) { return (
Authorization Type {this.state.messageAlertModal}
); } else { return (
Authorization Type {this.state.messageAlertModal}
); } } handleToggleAuthType () { var self = this; APIRequest("PUT","/authorization/" + this.props.authType.name, {description: this.props.authType.description, enabled: !this.state.enabled}) .done(function (result) { self.setState(prevState => ({ enabled: !prevState.enabled })); self.openAlertModal("Authorization type updated"); }) .fail(function (error) { self.openAlertModal("Error while changing authorization type"); }); } } class AuthorizationType extends React.Component { constructor(props) { super(props); } render () { return ( {this.props.authType.description} ); } } function AuthorizationTypeList (props) { var rows = []; props.authTypeList.forEach(function(authType) { rows.push(); }); return (
{rows}
Name Description
); } /** * Modals */ class MessageModal extends React.Component { constructor(props) { super(props); this.state = {show: this.props.show, title: this.props.title, message: this.props.message}; this.closeModal = this.closeModal.bind(this); } componentWillReceiveProps(nextProps) { this.setState({show: nextProps.show, title: nextProps.title, message: nextProps.message}); } closeModal () { this.setState({show: false}); } render () { return ( {this.state.title} {this.state.message} ); } } class SpinnerModal extends React.Component { constructor(props) { super(props); this.state = {show: this.props.show, message: this.props.message}; } componentWillReceiveProps(nextProps) { this.setState({show: nextProps.show, message: nextProps.message}); } render () { return (

{this.state.message}

); } } class ConfirmModal extends React.Component { constructor(props) { super(props); this.state = {show: this.props.show, title: this.props.title, message: this.props.message, onClose: this.props.onClose}; this.closeModal = this.closeModal.bind(this); } componentWillReceiveProps(nextProps) { this.setState({show: nextProps.show, title: nextProps.title, message: nextProps.message, onClose: nextProps.onClose}); } closeModal (result) { this.setState({show: false}); this.state.onClose(result); } render () { return ( this.closeModal(false)}> {this.state.title} {this.state.message} ); } } /** * javscript core code */ var params = getQueryParams(location.hash); var message="Loading data..."; ReactDOM.render( , document.getElementById('spinner') ); /** * Get server parameters * And initialize application */ $.ajax({ method: "GET", url: oauth.glewlwyd_server_url + "/config" }) .done(function (result) { oauth.admin_scope = result.admin_scope + " " + result.profile_scope; oauth.api_prefix = result.api_prefix; if (!oauth.redirect_uri) { oauth.redirect_uri = "../" + result.app_prefix + "/index.html"; } init(); }) .fail(function (error) { if (error.status === 401) { oauth.access_token = false; currentUser.loggedIn = false; ReactDOM.render( , document.getElementById('LoginComponent') ); } ReactDOM.render( , document.getElementById('spinner') ); }); }); glewlwyd-1.3.1/webapp/app/profile.react.js000066400000000000000000000771031322667720100205210ustar00rootroot00000000000000/** * * Glewlwyd OAuth2 Authorization Server * * Web application for server resource management * * Copyright 2017 Nicolas Mora * * The front-end application is under MIT Licence (MIT) * * The MIT License (MIT) * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * */ var Button = ReactBootstrap.Button; var Checkbox = ReactBootstrap.Checkbox; var Modal = ReactBootstrap.Modal; $(function() { /** * Web application parameters * Except for glewlwyd_server_url which I recommend to update, * the other values are not to be modified if you didn't change * the default parameters values during the installation */ var oauth = { glewlwyd_server_url: "../", /* Default value if the web app is hosted by the API server. For security, I recommend to put the absolute url, e.g. https://auth.domain.com/ */ /** * * This will contain server config variables, do not modify it. * Anyway, if you do modify it, it will be overwritten * */ api_prefix: "" }; var profile = {}; // Function that will be used on every API call function APIRequest (method, url, data) { return $.ajax({ method: method, url: oauth.glewlwyd_server_url + oauth.api_prefix + url, data: JSON.stringify(data), contentType: data?"application/json; charset=utf-8":null }); } /** * User details component */ function UserDetails (props) { return (

{props.user.name}

{props.user.name}
{props.user.email}
{props.user.login}
{props.user.scope.join(", ")}
); } function UserSessionRow (props) { return ( {props.session.ip_source} {(new Date(props.session.issued_at*1000)).toLocaleString()} {(new Date(props.session.last_seen*1000)).toLocaleString()} {(new Date(props.session.expired_at*1000)).toLocaleString()} {String(props.session.enabled)} {props.session.enabled?:''} ); } class UserSessionTable extends React.Component { constructor(props) { super(props); this.state = {sessionList: this.props.sessionList}; this.refreshSessionList = this.refreshSessionList.bind(this); this.openConfirmModal = this.openConfirmModal.bind(this); this.closeConfirmModal = this.closeConfirmModal.bind(this); this.state = {sessionList: this.props.sessionList, currentSession: {}} } componentWillReceiveProps(nextProps) { this.setState({sessionList: nextProps.sessionList}); } refreshSessionList (valid, offset, limit) { var self = this; APIRequest("GET", "/profile/session/?valid=" + (valid?valid:"") + "&offset=" + (offset?offset:"") + "&limit=" + (limit?limit:"")) .then(function (result) { self.setState({sessionList: result}); }); } openConfirmModal (session, evt) { this.setState({currentSession: session}); ReactDOM.render( , document.getElementById('modal') ); } closeConfirmModal (result, evt) { var self = this; if (result) { APIRequest("DELETE", "/profile/session/", {session_hash: this.state.currentSession.session_hash}) .then(function (result) { var currentSession = self.state.currentSession; currentSession.enabled = false; var sessionList = self.state.sessionList; sessionList.forEach(function (session) { if (session.session_hash === self.state.currentSession.session_hash) { session.enabled = false; } }); self.setState({currentSession: currentSession, sessionList: sessionList}); ReactDOM.render( , document.getElementById('modal') ); }); } } render () { var rows = []; var self = this; this.state.sessionList.forEach(function (session, index) { rows.push(); }); return (

Sessions 

{rows}
Originiated IP Source Issued at Last seen Expires at Enabled
); } } function UserTokenRow (props) { return ( {props.token.ip_source} {props.token.authorization_type} {(new Date(props.token.issued_at*1000)).toLocaleString()} {(new Date(props.token.last_seen*1000)).toLocaleString()} {(new Date(props.token.expired_at*1000)).toLocaleString()} {String(props.token.enabled)} {props.token.enabled?:''} ); } class UserTokenTable extends React.Component { constructor(props) { super(props); this.state = {tokenList: this.props.tokenList}; this.refreshTokenList = this.refreshTokenList.bind(this); this.openConfirmModal = this.openConfirmModal.bind(this); this.closeConfirmModal = this.closeConfirmModal.bind(this); this.state = {tokenList: this.props.tokenList, currentToken: {}} } componentWillReceiveProps(nextProps) { this.setState({tokenList: nextProps.tokenList}); } refreshTokenList (valid, offset, limit) { var self = this; APIRequest("GET", "/profile/refresh_token/?valid=" + (valid?valid:"") + "&offset=" + (offset?offset:"") + "&limit=" + (limit?limit:"")) .then(function (result) { self.setState({tokenList: result}); }); } openConfirmModal (token, evt) { this.setState({currentToken: token}); ReactDOM.render( , document.getElementById('modal') ); } closeConfirmModal (result, evt) { var self = this; if (result) { APIRequest("DELETE", "/profile/refresh_token/", {token_hash: this.state.currentToken.token_hash}) .then(function (result) { var currentToken = self.state.currentToken; currentToken.enabled = false; var tokenList = self.state.tokenList; tokenList.forEach(function (token) { if (token.token_hash === self.state.currentToken.token_hash) { token.enabled = false; } }); self.setState({currentToken: currentToken, tokenList: tokenList}); ReactDOM.render( , document.getElementById('modal') ); }); } } render () { var rows = []; var self = this; this.state.tokenList.forEach(function (token, index) { rows.push(); }); return (

Refresh tokens 

{rows}
Originiated IP Source Authorization type Issued at Last seen Expires at Enabled
); } } class MessageModal extends React.Component { constructor(props) { super(props); this.state = {show: this.props.show, title: this.props.title, message: this.props.message}; this.closeModal = this.closeModal.bind(this); } componentWillReceiveProps(nextProps) { this.setState({show: nextProps.show, title: nextProps.title, message: nextProps.message}); } closeModal () { this.setState({show: false}); } render () { return ( {this.state.title} {this.state.message} ); } } class UpdateProfileButton extends React.Component { constructor(props) { super(props); this.handleOpenModal = this.handleOpenModal.bind(this); } handleOpenModal() { ReactDOM.render( , document.getElementById('modal') ); } saveProfile (profile) { APIRequest("PUT", "/profile/", profile) .then(function (result) { profile = profile; ReactDOM.render( , document.getElementById('userDetails') ); ReactDOM.render( , document.getElementById('modal') ); }) .fail(function (error) { ReactDOM.render( , document.getElementById('modal') ); }); } render() { return ( ); } } class UpdatePasswordButton extends React.Component { constructor(props) { super(props); this.handleOpenModal = this.handleOpenModal.bind(this); } handleOpenModal() { ReactDOM.render( , document.getElementById('modal') ); } saveProfile (profile) { APIRequest("PUT", "/profile/", profile) .then(function (result) { ReactDOM.render( , document.getElementById('modal') ); }) .fail(function (error) { if (error.status === 400) { error.responseJSON.forEach(function (paramError) { for (var key in paramError) { if (key === "old_password" && paramError[key] === "old_password does not match") { ReactDOM.render( , document.getElementById('modal') ); } } }); } else { ReactDOM.render( , document.getElementById('modal') ); } }); } render() { return ( ); } } class LogoutButton extends React.Component { constructor(props) { super(props); this.handleLogout = this.handleLogout.bind(this); } render() { return (); } handleLogout() { APIRequest("DELETE", "/auth/user/") .then(function (){ if (document.search) { document.location = "login.html?" + document.search; } else { document.location = "login.html"; } }) .fail(function (error) { ReactDOM.render( , document.getElementById('modal') ); }); } } class ContinueButton extends React.Component { constructor(props) { super(props); this.handleContinue = this.handleContinue.bind(this); } render() { return (); } handleContinue() { var redirect = "../glewlwyd/auth" + location.search + "&login_validated=true"; window.location = redirect; } } class AdminButton extends React.Component { constructor(props) { super(props); this.handleAdmin = this.handleAdmin.bind(this); } render() { return (); } handleAdmin() { window.location = "index.html"; } } class LoginButton extends React.Component { constructor(props) { super(props); this.handleLogin = this.handleLogin.bind(this); } render() { return (); } handleLogin() { if (document.search) { document.location = "login.html?" + document.search; } else { document.location = "login.html"; } } } function LoginComponent (props) { if (props.loggedIn) { var continueButton = ""; var adminButton = ""; if (location.search) { continueButton =
; } if (props.user.scope.indexOf("g_admin") > -1) { adminButton =
; } return (
{continueButton} {adminButton}
); } else { return (
); } } function userDetails (user) { profile = user; ReactDOM.render( , document.getElementById('userDetails') ); APIRequest("GET", "/profile/session/") .then(function (result) { ReactDOM.render( , document.getElementById('userSessionTable') ); }); APIRequest("GET", "/profile/refresh_token/") .then(function (result) { ReactDOM.render( , document.getElementById('userTokenTable') ); }); $('.nav-tabs a[href="#userDetail"]').tab('show'); } class ProfileEditModal extends React.Component { constructor(props) { super(props); this.state = {show: props.show, profile: profile, closeModal: this.props.closeModal, nameInvalid: false}; this.handleChangeName = this.handleChangeName.bind(this); } componentWillReceiveProps(nextProps) { this.setState({show: nextProps.show, profile: profile, closeModal: nextProps.closeModal, nameInvalid: false}); } closeModal (result) { if (result) { this.state.closeModal(this.state.profile); } this.setState({show: false}); } handleChangeName (event) { var isInvalid = !event.target.value; var newProfile = $.extend({}, this.state.profile); newProfile.name = event.target.value || ""; this.setState({profile: newProfile, nameInvalid: isInvalid}); } handleChangeDescription (event) { var newProfile = $.extend({}, this.state.profile); newProfile.description = event.target.value || ""; this.setState({profile: newProfile}); } render () { return ( this.closeModal(false)}> Profile
); } } class PasswordUpdateModal extends React.Component { constructor(props) { super(props); this.state = {show: props.show, profile: {old_password: "", new_password: ""}, confirmPassword: "", closeModal: this.props.closeModal, curPasswordInvalid: true, newPasswordInvalid: true, newPasswordConfirmInvalid: true}; this.handleChangeCurPassword = this.handleChangeCurPassword.bind(this); this.handleChangeNewPassword = this.handleChangeNewPassword.bind(this); this.handleChangeConfirmNewPassword = this.handleChangeConfirmNewPassword.bind(this); } componentWillReceiveProps(nextProps) { this.setState({show: nextProps.show, profile: {old_password: "", new_password: ""}, confirmPassword: "", closeModal: nextProps.closeModal, curPasswordInvalid: true, newPasswordInvalid: true, newPasswordConfirmInvalid: true}); } closeModal (result) { if (result) { this.state.closeModal(this.state.profile); } this.setState({show: false}); } handleChangeCurPassword (event) { var isInvalid = !event.target.value; var newProfile = $.extend({}, this.state.profile); newProfile.old_password = event.target.value || ""; this.setState({profile: newProfile, curPasswordInvalid: isInvalid}); } handleChangeNewPassword (event) { var isInvalid = !event.target.value || event.target.value.length < 8; var newProfile = $.extend({}, this.state.profile); newProfile.new_password = event.target.value || ""; this.setState({profile: newProfile, newPasswordInvalid: isInvalid}); } handleChangeConfirmNewPassword (event) { var isInvalid = !event.target.value || event.target.value.length < 8 || event.target.value != this.state.profile.new_password; this.setState({confirmPassword: event.target.value, newPasswordConfirmInvalid: isInvalid}); } render () { return ( this.closeModal(false)}> Update password
); } } class ConfirmModal extends React.Component { constructor(props) { super(props); this.state = {show: this.props.show, title: this.props.title, message: this.props.message, onClose: this.props.onClose}; this.closeModal = this.closeModal.bind(this); } componentWillReceiveProps(nextProps) { this.setState({show: nextProps.show, title: nextProps.title, message: nextProps.message, onClose: nextProps.onClose}); } closeModal (result) { this.setState({show: false}); this.state.onClose(result); } render () { return ( this.closeModal(false)}> {this.state.title} {this.state.message} ); } } class TokenNavigation extends React.Component { constructor(props) { super(props); this.state = {valid: "", limit: 10, offset: 0, updateNavigation: props.updateNavigation}; this.handleChangeValid = this.handleChangeValid.bind(this); this.handlePreviousPage = this.handlePreviousPage.bind(this); this.handleChangeLimit = this.handleChangeLimit.bind(this); this.handleNextPage = this.handleNextPage.bind(this); this.handleRefresh = this.handleRefresh.bind(this); } handleChangeValid (event) { this.setState({valid: event.target.value}); this.state.updateNavigation(event.target.value, this.state.offset, this.state.limit); } handleChangeLimit (event) { var limit = parseInt(event.target.value); this.setState({limit: limit}); this.state.updateNavigation(this.state.valid, this.state.offset, limit); } handlePreviousPage (event) { var offset = this.state.offset-this.state.limit; this.setState({offset: offset}); this.state.updateNavigation(this.state.valid, offset, this.state.limit); } handleNextPage (event) { var offset = this.state.offset+this.state.limit; this.setState({offset: offset}); this.state.updateNavigation(this.state.valid, offset, this.state.limit); } handleRefresh (event) { event.preventDefault(); this.state.updateNavigation(this.state.valid, this.state.offset, this.state.limit); } render () { return (
{this.state.limit} results maximum, starting at result: {this.state.offset}
); } } /** * Get server parameters * And initialize application */ $.ajax({ method: "GET", url: oauth.glewlwyd_server_url + "/config" }) .done(function (result) { oauth.api_prefix = result.api_prefix; APIRequest("GET", "/profile/") .then(function (result) { userDetails(result); ReactDOM.render( , document.getElementById('profileActions') ); APIRequest("GET", "/profile/") .then(function (result) { userDetails(result); ReactDOM.render( , document.getElementById('profileActions') ); }) .fail(function () { ReactDOM.render( , document.getElementById('profileActions') ); }); }) .fail(function () { ReactDOM.render( , document.getElementById('profileActions') ); }); }); });glewlwyd-1.3.1/webapp/css/000077500000000000000000000000001322667720100154265ustar00rootroot00000000000000glewlwyd-1.3.1/webapp/css/bootstrap-theme.css000066400000000000000000000630241322667720100212620ustar00rootroot00000000000000/*! * Bootstrap v3.3.7 (http://getbootstrap.com) * Copyright 2011-2016 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) */ .btn-default, .btn-primary, .btn-success, .btn-info, .btn-warning, .btn-danger { text-shadow: 0 -1px 0 rgba(0, 0, 0, .2); -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); } .btn-default:active, .btn-primary:active, .btn-success:active, .btn-info:active, .btn-warning:active, .btn-danger:active, .btn-default.active, .btn-primary.active, .btn-success.active, .btn-info.active, .btn-warning.active, .btn-danger.active { -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); } .btn-default.disabled, .btn-primary.disabled, .btn-success.disabled, .btn-info.disabled, .btn-warning.disabled, .btn-danger.disabled, .btn-default[disabled], .btn-primary[disabled], .btn-success[disabled], .btn-info[disabled], .btn-warning[disabled], .btn-danger[disabled], fieldset[disabled] .btn-default, fieldset[disabled] .btn-primary, fieldset[disabled] .btn-success, fieldset[disabled] .btn-info, fieldset[disabled] .btn-warning, fieldset[disabled] .btn-danger { -webkit-box-shadow: none; box-shadow: none; } .btn-default .badge, .btn-primary .badge, .btn-success .badge, .btn-info .badge, .btn-warning .badge, .btn-danger .badge { text-shadow: none; } .btn:active, .btn.active { background-image: none; } .btn-default { text-shadow: 0 1px 0 #fff; background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%); background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0)); background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-color: #dbdbdb; border-color: #ccc; } .btn-default:hover, .btn-default:focus { background-color: #e0e0e0; background-position: 0 -15px; } .btn-default:active, .btn-default.active { background-color: #e0e0e0; border-color: #dbdbdb; } .btn-default.disabled, .btn-default[disabled], fieldset[disabled] .btn-default, .btn-default.disabled:hover, .btn-default[disabled]:hover, fieldset[disabled] .btn-default:hover, .btn-default.disabled:focus, .btn-default[disabled]:focus, fieldset[disabled] .btn-default:focus, .btn-default.disabled.focus, .btn-default[disabled].focus, fieldset[disabled] .btn-default.focus, .btn-default.disabled:active, .btn-default[disabled]:active, fieldset[disabled] .btn-default:active, .btn-default.disabled.active, .btn-default[disabled].active, fieldset[disabled] .btn-default.active { background-color: #e0e0e0; background-image: none; } .btn-primary { background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%); background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88)); background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-color: #245580; } .btn-primary:hover, .btn-primary:focus { background-color: #265a88; background-position: 0 -15px; } .btn-primary:active, .btn-primary.active { background-color: #265a88; border-color: #245580; } .btn-primary.disabled, .btn-primary[disabled], fieldset[disabled] .btn-primary, .btn-primary.disabled:hover, .btn-primary[disabled]:hover, fieldset[disabled] .btn-primary:hover, .btn-primary.disabled:focus, .btn-primary[disabled]:focus, fieldset[disabled] .btn-primary:focus, .btn-primary.disabled.focus, .btn-primary[disabled].focus, fieldset[disabled] .btn-primary.focus, .btn-primary.disabled:active, .btn-primary[disabled]:active, fieldset[disabled] .btn-primary:active, .btn-primary.disabled.active, .btn-primary[disabled].active, fieldset[disabled] .btn-primary.active { background-color: #265a88; background-image: none; } .btn-success { background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%); background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641)); background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-color: #3e8f3e; } .btn-success:hover, .btn-success:focus { background-color: #419641; background-position: 0 -15px; } .btn-success:active, .btn-success.active { background-color: #419641; border-color: #3e8f3e; } .btn-success.disabled, .btn-success[disabled], fieldset[disabled] .btn-success, .btn-success.disabled:hover, .btn-success[disabled]:hover, fieldset[disabled] .btn-success:hover, .btn-success.disabled:focus, .btn-success[disabled]:focus, fieldset[disabled] .btn-success:focus, .btn-success.disabled.focus, .btn-success[disabled].focus, fieldset[disabled] .btn-success.focus, .btn-success.disabled:active, .btn-success[disabled]:active, fieldset[disabled] .btn-success:active, .btn-success.disabled.active, .btn-success[disabled].active, fieldset[disabled] .btn-success.active { background-color: #419641; background-image: none; } .btn-info { background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2)); background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-color: #28a4c9; } .btn-info:hover, .btn-info:focus { background-color: #2aabd2; background-position: 0 -15px; } .btn-info:active, .btn-info.active { background-color: #2aabd2; border-color: #28a4c9; } .btn-info.disabled, .btn-info[disabled], fieldset[disabled] .btn-info, .btn-info.disabled:hover, .btn-info[disabled]:hover, fieldset[disabled] .btn-info:hover, .btn-info.disabled:focus, .btn-info[disabled]:focus, fieldset[disabled] .btn-info:focus, .btn-info.disabled.focus, .btn-info[disabled].focus, fieldset[disabled] .btn-info.focus, .btn-info.disabled:active, .btn-info[disabled]:active, fieldset[disabled] .btn-info:active, .btn-info.disabled.active, .btn-info[disabled].active, fieldset[disabled] .btn-info.active { background-color: #2aabd2; background-image: none; } .btn-warning { background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316)); background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-color: #e38d13; } .btn-warning:hover, .btn-warning:focus { background-color: #eb9316; background-position: 0 -15px; } .btn-warning:active, .btn-warning.active { background-color: #eb9316; border-color: #e38d13; } .btn-warning.disabled, .btn-warning[disabled], fieldset[disabled] .btn-warning, .btn-warning.disabled:hover, .btn-warning[disabled]:hover, fieldset[disabled] .btn-warning:hover, .btn-warning.disabled:focus, .btn-warning[disabled]:focus, fieldset[disabled] .btn-warning:focus, .btn-warning.disabled.focus, .btn-warning[disabled].focus, fieldset[disabled] .btn-warning.focus, .btn-warning.disabled:active, .btn-warning[disabled]:active, fieldset[disabled] .btn-warning:active, .btn-warning.disabled.active, .btn-warning[disabled].active, fieldset[disabled] .btn-warning.active { background-color: #eb9316; background-image: none; } .btn-danger { background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%); background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a)); background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-color: #b92c28; } .btn-danger:hover, .btn-danger:focus { background-color: #c12e2a; background-position: 0 -15px; } .btn-danger:active, .btn-danger.active { background-color: #c12e2a; border-color: #b92c28; } .btn-danger.disabled, .btn-danger[disabled], fieldset[disabled] .btn-danger, .btn-danger.disabled:hover, .btn-danger[disabled]:hover, fieldset[disabled] .btn-danger:hover, .btn-danger.disabled:focus, .btn-danger[disabled]:focus, fieldset[disabled] .btn-danger:focus, .btn-danger.disabled.focus, .btn-danger[disabled].focus, fieldset[disabled] .btn-danger.focus, .btn-danger.disabled:active, .btn-danger[disabled]:active, fieldset[disabled] .btn-danger:active, .btn-danger.disabled.active, .btn-danger[disabled].active, fieldset[disabled] .btn-danger.active { background-color: #c12e2a; background-image: none; } .thumbnail, .img-thumbnail { -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); box-shadow: 0 1px 2px rgba(0, 0, 0, .075); } .dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus { background-color: #e8e8e8; background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); background-repeat: repeat-x; } .dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus { background-color: #2e6da4; background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); background-repeat: repeat-x; } .navbar-default { background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%); background-image: -o-linear-gradient(top, #fff 0%, #f8f8f8 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8)); background-image: linear-gradient(to bottom, #fff 0%, #f8f8f8 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-radius: 4px; -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); } .navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .active > a { background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2)); background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0); background-repeat: repeat-x; -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); } .navbar-brand, .navbar-nav > li > a { text-shadow: 0 1px 0 rgba(255, 255, 255, .25); } .navbar-inverse { background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%); background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222)); background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-radius: 4px; } .navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .active > a { background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%); background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f)); background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0); background-repeat: repeat-x; -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); } .navbar-inverse .navbar-brand, .navbar-inverse .navbar-nav > li > a { text-shadow: 0 -1px 0 rgba(0, 0, 0, .25); } .navbar-static-top, .navbar-fixed-top, .navbar-fixed-bottom { border-radius: 0; } @media (max-width: 767px) { .navbar .navbar-nav .open .dropdown-menu > .active > a, .navbar .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar .navbar-nav .open .dropdown-menu > .active > a:focus { color: #fff; background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); background-repeat: repeat-x; } } .alert { text-shadow: 0 1px 0 rgba(255, 255, 255, .2); -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); } .alert-success { background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc)); background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); background-repeat: repeat-x; border-color: #b2dba1; } .alert-info { background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%); background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0)); background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); background-repeat: repeat-x; border-color: #9acfea; } .alert-warning { background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0)); background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); background-repeat: repeat-x; border-color: #f5e79e; } .alert-danger { background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3)); background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); background-repeat: repeat-x; border-color: #dca7a7; } .progress { background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5)); background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); background-repeat: repeat-x; } .progress-bar { background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%); background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090)); background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0); background-repeat: repeat-x; } .progress-bar-success { background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%); background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44)); background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); background-repeat: repeat-x; } .progress-bar-info { background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5)); background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); background-repeat: repeat-x; } .progress-bar-warning { background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f)); background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); background-repeat: repeat-x; } .progress-bar-danger { background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%); background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c)); background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); background-repeat: repeat-x; } .progress-bar-striped { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); } .list-group { border-radius: 4px; -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); box-shadow: 0 1px 2px rgba(0, 0, 0, .075); } .list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus { text-shadow: 0 -1px 0 #286090; background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%); background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a)); background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0); background-repeat: repeat-x; border-color: #2b669a; } .list-group-item.active .badge, .list-group-item.active:hover .badge, .list-group-item.active:focus .badge { text-shadow: none; } .panel { -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05); box-shadow: 0 1px 2px rgba(0, 0, 0, .05); } .panel-default > .panel-heading { background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); background-repeat: repeat-x; } .panel-primary > .panel-heading { background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); background-repeat: repeat-x; } .panel-success > .panel-heading { background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6)); background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); background-repeat: repeat-x; } .panel-info > .panel-heading { background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3)); background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); background-repeat: repeat-x; } .panel-warning > .panel-heading { background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc)); background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); background-repeat: repeat-x; } .panel-danger > .panel-heading { background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%); background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc)); background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); background-repeat: repeat-x; } .well { background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5)); background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); background-repeat: repeat-x; border-color: #dcdcdc; -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); } /*# sourceMappingURL=bootstrap-theme.css.map */ glewlwyd-1.3.1/webapp/css/bootstrap-theme.css.map000066400000000000000000001351321322667720100220360ustar00rootroot00000000000000{"version":3,"sources":["bootstrap-theme.css","less/theme.less","less/mixins/vendor-prefixes.less","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":"AAAA;;;;GAIG;ACeH;;;;;;EAME,yCAAA;EC2CA,4FAAA;EACQ,oFAAA;CFvDT;ACgBC;;;;;;;;;;;;ECsCA,yDAAA;EACQ,iDAAA;CFxCT;ACMC;;;;;;;;;;;;;;;;;;ECiCA,yBAAA;EACQ,iBAAA;CFnBT;AC/BD;;;;;;EAuBI,kBAAA;CDgBH;ACyBC;;EAEE,uBAAA;CDvBH;AC4BD;EErEI,sEAAA;EACA,iEAAA;EACA,2FAAA;EAAA,oEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;EAuC2C,0BAAA;EAA2B,mBAAA;CDjBvE;ACpBC;;EAEE,0BAAA;EACA,6BAAA;CDsBH;ACnBC;;EAEE,0BAAA;EACA,sBAAA;CDqBH;ACfG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CD6BL;ACbD;EEtEI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;CD8DD;AC5DC;;EAEE,0BAAA;EACA,6BAAA;CD8DH;AC3DC;;EAEE,0BAAA;EACA,sBAAA;CD6DH;ACvDG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CDqEL;ACpDD;EEvEI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;CDsGD;ACpGC;;EAEE,0BAAA;EACA,6BAAA;CDsGH;ACnGC;;EAEE,0BAAA;EACA,sBAAA;CDqGH;AC/FG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CD6GL;AC3FD;EExEI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;CD8ID;AC5IC;;EAEE,0BAAA;EACA,6BAAA;CD8IH;AC3IC;;EAEE,0BAAA;EACA,sBAAA;CD6IH;ACvIG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CDqJL;AClID;EEzEI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;CDsLD;ACpLC;;EAEE,0BAAA;EACA,6BAAA;CDsLH;ACnLC;;EAEE,0BAAA;EACA,sBAAA;CDqLH;AC/KG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CD6LL;ACzKD;EE1EI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;CD8ND;AC5NC;;EAEE,0BAAA;EACA,6BAAA;CD8NH;AC3NC;;EAEE,0BAAA;EACA,sBAAA;CD6NH;ACvNG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CDqOL;AC1MD;;EClCE,mDAAA;EACQ,2CAAA;CFgPT;ACrMD;;EE3FI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EF0FF,0BAAA;CD2MD;ACzMD;;;EEhGI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EFgGF,0BAAA;CD+MD;ACtMD;EE7GI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;ECnBF,oEAAA;EH+HA,mBAAA;ECjEA,4FAAA;EACQ,oFAAA;CF8QT;ACjND;;EE7GI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;ED2CF,yDAAA;EACQ,iDAAA;CFwRT;AC9MD;;EAEE,+CAAA;CDgND;AC5MD;EEhII,sEAAA;EACA,iEAAA;EACA,2FAAA;EAAA,oEAAA;EACA,4BAAA;EACA,uHAAA;ECnBF,oEAAA;EHkJA,mBAAA;CDkND;ACrND;;EEhII,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;ED2CF,wDAAA;EACQ,gDAAA;CF+ST;AC/ND;;EAYI,0CAAA;CDuNH;AClND;;;EAGE,iBAAA;CDoND;AC/LD;EAfI;;;IAGE,YAAA;IE7JF,yEAAA;IACA,oEAAA;IACA,8FAAA;IAAA,uEAAA;IACA,4BAAA;IACA,uHAAA;GH+WD;CACF;AC3MD;EACE,8CAAA;EC3HA,2FAAA;EACQ,mFAAA;CFyUT;ACnMD;EEtLI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EF8KF,sBAAA;CD+MD;AC1MD;EEvLI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EF8KF,sBAAA;CDuND;ACjND;EExLI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EF8KF,sBAAA;CD+ND;ACxND;EEzLI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EF8KF,sBAAA;CDuOD;ACxND;EEjMI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CH4ZH;ACrND;EE3MI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHmaH;AC3ND;EE5MI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CH0aH;ACjOD;EE7MI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHibH;ACvOD;EE9MI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHwbH;AC7OD;EE/MI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CH+bH;AChPD;EElLI,8MAAA;EACA,yMAAA;EACA,sMAAA;CHqaH;AC5OD;EACE,mBAAA;EC9KA,mDAAA;EACQ,2CAAA;CF6ZT;AC7OD;;;EAGE,8BAAA;EEnOE,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EFiOF,sBAAA;CDmPD;ACxPD;;;EAQI,kBAAA;CDqPH;AC3OD;ECnME,kDAAA;EACQ,0CAAA;CFibT;ACrOD;EE5PI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHoeH;AC3OD;EE7PI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CH2eH;ACjPD;EE9PI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHkfH;ACvPD;EE/PI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHyfH;AC7PD;EEhQI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHggBH;ACnQD;EEjQI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHugBH;ACnQD;EExQI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EFsQF,sBAAA;EC3NA,0FAAA;EACQ,kFAAA;CFqeT","file":"bootstrap-theme.css","sourcesContent":["/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.btn-default:active,\n.btn-primary:active,\n.btn-success:active,\n.btn-info:active,\n.btn-warning:active,\n.btn-danger:active,\n.btn-default.active,\n.btn-primary.active,\n.btn-success.active,\n.btn-info.active,\n.btn-warning.active,\n.btn-danger.active {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-default.disabled,\n.btn-primary.disabled,\n.btn-success.disabled,\n.btn-info.disabled,\n.btn-warning.disabled,\n.btn-danger.disabled,\n.btn-default[disabled],\n.btn-primary[disabled],\n.btn-success[disabled],\n.btn-info[disabled],\n.btn-warning[disabled],\n.btn-danger[disabled],\nfieldset[disabled] .btn-default,\nfieldset[disabled] .btn-primary,\nfieldset[disabled] .btn-success,\nfieldset[disabled] .btn-info,\nfieldset[disabled] .btn-warning,\nfieldset[disabled] .btn-danger {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-default .badge,\n.btn-primary .badge,\n.btn-success .badge,\n.btn-info .badge,\n.btn-warning .badge,\n.btn-danger .badge {\n text-shadow: none;\n}\n.btn:active,\n.btn.active {\n background-image: none;\n}\n.btn-default {\n background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #dbdbdb;\n text-shadow: 0 1px 0 #fff;\n border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus {\n background-color: #e0e0e0;\n background-position: 0 -15px;\n}\n.btn-default:active,\n.btn-default.active {\n background-color: #e0e0e0;\n border-color: #dbdbdb;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n background-color: #e0e0e0;\n background-image: none;\n}\n.btn-primary {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #245580;\n}\n.btn-primary:hover,\n.btn-primary:focus {\n background-color: #265a88;\n background-position: 0 -15px;\n}\n.btn-primary:active,\n.btn-primary.active {\n background-color: #265a88;\n border-color: #245580;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n background-color: #265a88;\n background-image: none;\n}\n.btn-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #3e8f3e;\n}\n.btn-success:hover,\n.btn-success:focus {\n background-color: #419641;\n background-position: 0 -15px;\n}\n.btn-success:active,\n.btn-success.active {\n background-color: #419641;\n border-color: #3e8f3e;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n background-color: #419641;\n background-image: none;\n}\n.btn-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #28a4c9;\n}\n.btn-info:hover,\n.btn-info:focus {\n background-color: #2aabd2;\n background-position: 0 -15px;\n}\n.btn-info:active,\n.btn-info.active {\n background-color: #2aabd2;\n border-color: #28a4c9;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n background-color: #2aabd2;\n background-image: none;\n}\n.btn-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #e38d13;\n}\n.btn-warning:hover,\n.btn-warning:focus {\n background-color: #eb9316;\n background-position: 0 -15px;\n}\n.btn-warning:active,\n.btn-warning.active {\n background-color: #eb9316;\n border-color: #e38d13;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n background-color: #eb9316;\n background-image: none;\n}\n.btn-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #b92c28;\n}\n.btn-danger:hover,\n.btn-danger:focus {\n background-color: #c12e2a;\n background-position: 0 -15px;\n}\n.btn-danger:active,\n.btn-danger.active {\n background-color: #c12e2a;\n border-color: #b92c28;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n background-color: #c12e2a;\n background-image: none;\n}\n.thumbnail,\n.img-thumbnail {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-color: #e8e8e8;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-color: #2e6da4;\n}\n.navbar-default {\n background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: -o-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);\n}\n.navbar-inverse {\n background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);\n background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%);\n background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n}\n.navbar-inverse .navbar-brand,\n.navbar-inverse .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n@media (max-width: 767px) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n }\n}\n.alert {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.alert-success {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);\n border-color: #b2dba1;\n}\n.alert-info {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);\n border-color: #9acfea;\n}\n.alert-warning {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);\n border-color: #f5e79e;\n}\n.alert-danger {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);\n border-color: #dca7a7;\n}\n.progress {\n background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);\n}\n.progress-bar {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);\n}\n.progress-bar-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);\n}\n.progress-bar-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);\n}\n.progress-bar-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);\n}\n.progress-bar-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);\n}\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.list-group {\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 #286090;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);\n border-color: #2b669a;\n}\n.list-group-item.active .badge,\n.list-group-item.active:hover .badge,\n.list-group-item.active:focus .badge {\n text-shadow: none;\n}\n.panel {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.panel-default > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n}\n.panel-primary > .panel-heading {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n}\n.panel-success > .panel-heading {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);\n}\n.panel-info > .panel-heading {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);\n}\n.panel-warning > .panel-heading {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);\n}\n.panel-danger > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);\n}\n.well {\n background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);\n border-color: #dcdcdc;\n -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n/*# sourceMappingURL=bootstrap-theme.css.map */","/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0,0,0,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n // Reset the shadow\n &:active,\n &.active {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n .box-shadow(none);\n }\n\n .badge {\n text-shadow: none;\n }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners; see https://github.com/twbs/bootstrap/issues/10620\n background-repeat: repeat-x;\n border-color: darken(@btn-color, 14%);\n\n &:hover,\n &:focus {\n background-color: darken(@btn-color, 12%);\n background-position: 0 -15px;\n }\n\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n border-color: darken(@btn-color, 14%);\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &.focus,\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n background-image: none;\n }\n }\n}\n\n// Common styles\n.btn {\n // Remove the gradient for the pressed/active state\n &:active,\n &.active {\n background-image: none;\n }\n}\n\n// Apply the mixin to the buttons\n.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger { .btn-styles(@btn-danger-bg); }\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n border-radius: @navbar-border-radius;\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: darken(@navbar-default-link-active-bg, 5%); @end-color: darken(@navbar-default-link-active-bg, 2%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.075));\n }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255,255,255,.25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered; see https://github.com/twbs/bootstrap/issues/10257\n border-radius: @navbar-border-radius;\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: @navbar-inverse-link-active-bg; @end-color: lighten(@navbar-inverse-link-active-bg, 2.5%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.25));\n }\n\n .navbar-brand,\n .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n\n// Fix active state of dropdown items in collapsed mode\n@media (max-width: @grid-float-breakpoint-max) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: #fff;\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n }\n }\n}\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n text-shadow: 0 1px 0 rgba(255,255,255,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);\n .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success { .alert-styles(@alert-success-bg); }\n.alert-info { .alert-styles(@alert-info-bg); }\n.alert-warning { .alert-styles(@alert-warning-bg); }\n.alert-danger { .alert-styles(@alert-danger-bg); }\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); }\n\n// Reset the striped class because our mixins don't do multiple gradients and\n// the above custom styles override the new `.progress-bar-striped` in v3.2.0.\n.progress-bar-striped {\n #gradient > .striped();\n}\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n border-radius: @border-radius-base;\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n border-color: darken(@list-group-active-border, 7.5%);\n\n .badge {\n text-shadow: none;\n }\n}\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n .box-shadow(0 1px 2px rgba(0,0,0,.05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n border-color: darken(@well-bg, 10%);\n @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility) {\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n"]}glewlwyd-1.3.1/webapp/css/bootstrap-theme.min.css000066400000000000000000000555611322667720100220530ustar00rootroot00000000000000/*! * Bootstrap v3.3.7 (http://getbootstrap.com) * Copyright 2011-2016 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) */.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-danger.disabled,.btn-danger[disabled],.btn-default.disabled,.btn-default[disabled],.btn-info.disabled,.btn-info[disabled],.btn-primary.disabled,.btn-primary[disabled],.btn-success.disabled,.btn-success[disabled],.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-danger,fieldset[disabled] .btn-default,fieldset[disabled] .btn-info,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-success,fieldset[disabled] .btn-warning{-webkit-box-shadow:none;box-shadow:none}.btn-danger .badge,.btn-default .badge,.btn-info .badge,.btn-primary .badge,.btn-success .badge,.btn-warning .badge{text-shadow:none}.btn.active,.btn:active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:focus,.btn-default:hover{background-color:#e0e0e0;background-position:0 -15px}.btn-default.active,.btn-default:active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#245580}.btn-primary:focus,.btn-primary:hover{background-color:#265a88;background-position:0 -15px}.btn-primary.active,.btn-primary:active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:focus,.btn-success:hover{background-color:#419641;background-position:0 -15px}.btn-success.active,.btn-success:active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:focus,.btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.btn-info.active,.btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:focus,.btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.btn-warning.active,.btn-warning:active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:focus,.btn-danger:hover{background-color:#c12e2a;background-position:0 -15px}.btn-danger.active,.btn-danger:active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c12e2a;background-image:none}.img-thumbnail,.thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-color:#2e6da4;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:focus .badge,.list-group-item.active:hover .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)} /*# sourceMappingURL=bootstrap-theme.min.css.map */glewlwyd-1.3.1/webapp/css/bootstrap-theme.min.css.map000066400000000000000000000620601322667720100226170ustar00rootroot00000000000000{"version":3,"sources":["less/theme.less","less/mixins/vendor-prefixes.less","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":";;;;AAmBA,YAAA,aAAA,UAAA,aAAA,aAAA,aAME,YAAA,EAAA,KAAA,EAAA,eC2CA,mBAAA,MAAA,EAAA,IAAA,EAAA,sBAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,EAAA,sBAAA,EAAA,IAAA,IAAA,iBDvCR,mBAAA,mBAAA,oBAAA,oBAAA,iBAAA,iBAAA,oBAAA,oBAAA,oBAAA,oBAAA,oBAAA,oBCsCA,mBAAA,MAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,iBDlCR,qBAAA,sBAAA,sBAAA,uBAAA,mBAAA,oBAAA,sBAAA,uBAAA,sBAAA,uBAAA,sBAAA,uBAAA,+BAAA,gCAAA,6BAAA,gCAAA,gCAAA,gCCiCA,mBAAA,KACQ,WAAA,KDlDV,mBAAA,oBAAA,iBAAA,oBAAA,oBAAA,oBAuBI,YAAA,KAyCF,YAAA,YAEE,iBAAA,KAKJ,aErEI,YAAA,EAAA,IAAA,EAAA,KACA,iBAAA,iDACA,iBAAA,4CAAA,iBAAA,qEAEA,iBAAA,+CCnBF,OAAA,+GH4CA,OAAA,0DACA,kBAAA,SAuC2C,aAAA,QAA2B,aAAA,KArCtE,mBAAA,mBAEE,iBAAA,QACA,oBAAA,EAAA,MAGF,oBAAA,oBAEE,iBAAA,QACA,aAAA,QAMA,sBAAA,6BAAA,4BAAA,6BAAA,4BAAA,4BAAA,uBAAA,8BAAA,6BAAA,8BAAA,6BAAA,6BAAA,gCAAA,uCAAA,sCAAA,uCAAA,sCAAA,sCAME,iBAAA,QACA,iBAAA,KAgBN,aEtEI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDAEA,OAAA,+GCnBF,OAAA,0DH4CA,kBAAA,SACA,aAAA,QAEA,mBAAA,mBAEE,iBAAA,QACA,oBAAA,EAAA,MAGF,oBAAA,oBAEE,iBAAA,QACA,aAAA,QAMA,sBAAA,6BAAA,4BAAA,6BAAA,4BAAA,4BAAA,uBAAA,8BAAA,6BAAA,8BAAA,6BAAA,6BAAA,gCAAA,uCAAA,sCAAA,uCAAA,sCAAA,sCAME,iBAAA,QACA,iBAAA,KAiBN,aEvEI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDAEA,OAAA,+GCnBF,OAAA,0DH4CA,kBAAA,SACA,aAAA,QAEA,mBAAA,mBAEE,iBAAA,QACA,oBAAA,EAAA,MAGF,oBAAA,oBAEE,iBAAA,QACA,aAAA,QAMA,sBAAA,6BAAA,4BAAA,6BAAA,4BAAA,4BAAA,uBAAA,8BAAA,6BAAA,8BAAA,6BAAA,6BAAA,gCAAA,uCAAA,sCAAA,uCAAA,sCAAA,sCAME,iBAAA,QACA,iBAAA,KAkBN,UExEI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDAEA,OAAA,+GCnBF,OAAA,0DH4CA,kBAAA,SACA,aAAA,QAEA,gBAAA,gBAEE,iBAAA,QACA,oBAAA,EAAA,MAGF,iBAAA,iBAEE,iBAAA,QACA,aAAA,QAMA,mBAAA,0BAAA,yBAAA,0BAAA,yBAAA,yBAAA,oBAAA,2BAAA,0BAAA,2BAAA,0BAAA,0BAAA,6BAAA,oCAAA,mCAAA,oCAAA,mCAAA,mCAME,iBAAA,QACA,iBAAA,KAmBN,aEzEI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDAEA,OAAA,+GCnBF,OAAA,0DH4CA,kBAAA,SACA,aAAA,QAEA,mBAAA,mBAEE,iBAAA,QACA,oBAAA,EAAA,MAGF,oBAAA,oBAEE,iBAAA,QACA,aAAA,QAMA,sBAAA,6BAAA,4BAAA,6BAAA,4BAAA,4BAAA,uBAAA,8BAAA,6BAAA,8BAAA,6BAAA,6BAAA,gCAAA,uCAAA,sCAAA,uCAAA,sCAAA,sCAME,iBAAA,QACA,iBAAA,KAoBN,YE1EI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDAEA,OAAA,+GCnBF,OAAA,0DH4CA,kBAAA,SACA,aAAA,QAEA,kBAAA,kBAEE,iBAAA,QACA,oBAAA,EAAA,MAGF,mBAAA,mBAEE,iBAAA,QACA,aAAA,QAMA,qBAAA,4BAAA,2BAAA,4BAAA,2BAAA,2BAAA,sBAAA,6BAAA,4BAAA,6BAAA,4BAAA,4BAAA,+BAAA,sCAAA,qCAAA,sCAAA,qCAAA,qCAME,iBAAA,QACA,iBAAA,KA2BN,eAAA,WClCE,mBAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,EAAA,IAAA,IAAA,iBD2CV,0BAAA,0BE3FI,iBAAA,QACA,iBAAA,oDACA,iBAAA,+CAAA,iBAAA,wEACA,iBAAA,kDACA,OAAA,+GF0FF,kBAAA,SAEF,yBAAA,+BAAA,+BEhGI,iBAAA,QACA,iBAAA,oDACA,iBAAA,+CAAA,iBAAA,wEACA,iBAAA,kDACA,OAAA,+GFgGF,kBAAA,SASF,gBE7GI,iBAAA,iDACA,iBAAA,4CACA,iBAAA,qEAAA,iBAAA,+CACA,OAAA,+GACA,OAAA,0DCnBF,kBAAA,SH+HA,cAAA,ICjEA,mBAAA,MAAA,EAAA,IAAA,EAAA,sBAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,EAAA,sBAAA,EAAA,IAAA,IAAA,iBD6DV,sCAAA,oCE7GI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SD2CF,mBAAA,MAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,iBD0EV,cAAA,iBAEE,YAAA,EAAA,IAAA,EAAA,sBAIF,gBEhII,iBAAA,iDACA,iBAAA,4CACA,iBAAA,qEAAA,iBAAA,+CACA,OAAA,+GACA,OAAA,0DCnBF,kBAAA,SHkJA,cAAA,IAHF,sCAAA,oCEhII,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SD2CF,mBAAA,MAAA,EAAA,IAAA,IAAA,gBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,gBDgFV,8BAAA,iCAYI,YAAA,EAAA,KAAA,EAAA,gBAKJ,qBAAA,kBAAA,mBAGE,cAAA,EAqBF,yBAfI,mDAAA,yDAAA,yDAGE,MAAA,KE7JF,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,UFqKJ,OACE,YAAA,EAAA,IAAA,EAAA,qBC3HA,mBAAA,MAAA,EAAA,IAAA,EAAA,sBAAA,EAAA,IAAA,IAAA,gBACQ,WAAA,MAAA,EAAA,IAAA,EAAA,sBAAA,EAAA,IAAA,IAAA,gBDsIV,eEtLI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF8KF,aAAA,QAKF,YEvLI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF8KF,aAAA,QAMF,eExLI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF8KF,aAAA,QAOF,cEzLI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF8KF,aAAA,QAeF,UEjMI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFuMJ,cE3MI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFwMJ,sBE5MI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFyMJ,mBE7MI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF0MJ,sBE9MI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF2MJ,qBE/MI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF+MJ,sBElLI,iBAAA,yKACA,iBAAA,oKACA,iBAAA,iKFyLJ,YACE,cAAA,IC9KA,mBAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,EAAA,IAAA,IAAA,iBDgLV,wBAAA,8BAAA,8BAGE,YAAA,EAAA,KAAA,EAAA,QEnOE,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFiOF,aAAA,QALF,+BAAA,qCAAA,qCAQI,YAAA,KAUJ,OCnME,mBAAA,EAAA,IAAA,IAAA,gBACQ,WAAA,EAAA,IAAA,IAAA,gBD4MV,8BE5PI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFyPJ,8BE7PI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF0PJ,8BE9PI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF2PJ,2BE/PI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF4PJ,8BEhQI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF6PJ,6BEjQI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFoQJ,MExQI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFsQF,aAAA,QC3NA,mBAAA,MAAA,EAAA,IAAA,IAAA,gBAAA,EAAA,IAAA,EAAA,qBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,gBAAA,EAAA,IAAA,EAAA","sourcesContent":["/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0,0,0,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n // Reset the shadow\n &:active,\n &.active {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n .box-shadow(none);\n }\n\n .badge {\n text-shadow: none;\n }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners; see https://github.com/twbs/bootstrap/issues/10620\n background-repeat: repeat-x;\n border-color: darken(@btn-color, 14%);\n\n &:hover,\n &:focus {\n background-color: darken(@btn-color, 12%);\n background-position: 0 -15px;\n }\n\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n border-color: darken(@btn-color, 14%);\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &.focus,\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n background-image: none;\n }\n }\n}\n\n// Common styles\n.btn {\n // Remove the gradient for the pressed/active state\n &:active,\n &.active {\n background-image: none;\n }\n}\n\n// Apply the mixin to the buttons\n.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger { .btn-styles(@btn-danger-bg); }\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n border-radius: @navbar-border-radius;\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: darken(@navbar-default-link-active-bg, 5%); @end-color: darken(@navbar-default-link-active-bg, 2%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.075));\n }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255,255,255,.25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered; see https://github.com/twbs/bootstrap/issues/10257\n border-radius: @navbar-border-radius;\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: @navbar-inverse-link-active-bg; @end-color: lighten(@navbar-inverse-link-active-bg, 2.5%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.25));\n }\n\n .navbar-brand,\n .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n\n// Fix active state of dropdown items in collapsed mode\n@media (max-width: @grid-float-breakpoint-max) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: #fff;\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n }\n }\n}\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n text-shadow: 0 1px 0 rgba(255,255,255,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);\n .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success { .alert-styles(@alert-success-bg); }\n.alert-info { .alert-styles(@alert-info-bg); }\n.alert-warning { .alert-styles(@alert-warning-bg); }\n.alert-danger { .alert-styles(@alert-danger-bg); }\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); }\n\n// Reset the striped class because our mixins don't do multiple gradients and\n// the above custom styles override the new `.progress-bar-striped` in v3.2.0.\n.progress-bar-striped {\n #gradient > .striped();\n}\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n border-radius: @border-radius-base;\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n border-color: darken(@list-group-active-border, 7.5%);\n\n .badge {\n text-shadow: none;\n }\n}\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n .box-shadow(0 1px 2px rgba(0,0,0,.05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n border-color: darken(@well-bg, 10%);\n @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility) {\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n"]}glewlwyd-1.3.1/webapp/css/bootstrap.css000066400000000000000000004351321322667720100201650ustar00rootroot00000000000000/*! * Bootstrap v3.3.7 (http://getbootstrap.com) * Copyright 2011-2016 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) */ /*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ html { font-family: sans-serif; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; } body { margin: 0; } article, aside, details, figcaption, figure, footer, header, hgroup, main, menu, nav, section, summary { display: block; } audio, canvas, progress, video { display: inline-block; vertical-align: baseline; } audio:not([controls]) { display: none; height: 0; } [hidden], template { display: none; } a { background-color: transparent; } a:active, a:hover { outline: 0; } abbr[title] { border-bottom: 1px dotted; } b, strong { font-weight: bold; } dfn { font-style: italic; } h1 { margin: .67em 0; font-size: 2em; } mark { color: #000; background: #ff0; } small { font-size: 80%; } sub, sup { position: relative; font-size: 75%; line-height: 0; vertical-align: baseline; } sup { top: -.5em; } sub { bottom: -.25em; } img { border: 0; } svg:not(:root) { overflow: hidden; } figure { margin: 1em 40px; } hr { height: 0; -webkit-box-sizing: content-box; -moz-box-sizing: content-box; box-sizing: content-box; } pre { overflow: auto; } code, kbd, pre, samp { font-family: monospace, monospace; font-size: 1em; } button, input, optgroup, select, textarea { margin: 0; font: inherit; color: inherit; } button { overflow: visible; } button, select { text-transform: none; } button, html input[type="button"], input[type="reset"], input[type="submit"] { -webkit-appearance: button; cursor: pointer; } button[disabled], html input[disabled] { cursor: default; } button::-moz-focus-inner, input::-moz-focus-inner { padding: 0; border: 0; } input { line-height: normal; } input[type="checkbox"], input[type="radio"] { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; padding: 0; } input[type="number"]::-webkit-inner-spin-button, input[type="number"]::-webkit-outer-spin-button { height: auto; } input[type="search"] { -webkit-box-sizing: content-box; -moz-box-sizing: content-box; box-sizing: content-box; -webkit-appearance: textfield; } input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; } fieldset { padding: .35em .625em .75em; margin: 0 2px; border: 1px solid #c0c0c0; } legend { padding: 0; border: 0; } textarea { overflow: auto; } optgroup { font-weight: bold; } table { border-spacing: 0; border-collapse: collapse; } td, th { padding: 0; } /*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ @media print { *, *:before, *:after { color: #000 !important; text-shadow: none !important; background: transparent !important; -webkit-box-shadow: none !important; box-shadow: none !important; } a, a:visited { text-decoration: underline; } a[href]:after { content: " (" attr(href) ")"; } abbr[title]:after { content: " (" attr(title) ")"; } a[href^="#"]:after, a[href^="javascript:"]:after { content: ""; } pre, blockquote { border: 1px solid #999; page-break-inside: avoid; } thead { display: table-header-group; } tr, img { page-break-inside: avoid; } img { max-width: 100% !important; } p, h2, h3 { orphans: 3; widows: 3; } h2, h3 { page-break-after: avoid; } .navbar { display: none; } .btn > .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px solid #000; } .table { border-collapse: collapse !important; } .table td, .table th { background-color: #fff !important; } .table-bordered th, .table-bordered td { border: 1px solid #ddd !important; } } @font-face { font-family: 'Glyphicons Halflings'; src: url('../fonts/glyphicons-halflings-regular.eot'); src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); } .glyphicon { position: relative; top: 1px; display: inline-block; font-family: 'Glyphicons Halflings'; font-style: normal; font-weight: normal; line-height: 1; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } .glyphicon-asterisk:before { content: "\002a"; } .glyphicon-plus:before { content: "\002b"; } .glyphicon-euro:before, .glyphicon-eur:before { content: "\20ac"; } .glyphicon-minus:before { content: "\2212"; } .glyphicon-cloud:before { content: "\2601"; } .glyphicon-envelope:before { content: "\2709"; } .glyphicon-pencil:before { content: "\270f"; } .glyphicon-glass:before { content: "\e001"; } .glyphicon-music:before { content: "\e002"; } .glyphicon-search:before { content: "\e003"; } .glyphicon-heart:before { content: "\e005"; } .glyphicon-star:before { content: "\e006"; } .glyphicon-star-empty:before { content: "\e007"; } .glyphicon-user:before { content: "\e008"; } .glyphicon-film:before { content: "\e009"; } .glyphicon-th-large:before { content: "\e010"; } .glyphicon-th:before { content: "\e011"; } .glyphicon-th-list:before { content: "\e012"; } .glyphicon-ok:before { content: "\e013"; } .glyphicon-remove:before { content: "\e014"; } .glyphicon-zoom-in:before { content: "\e015"; } .glyphicon-zoom-out:before { content: "\e016"; } .glyphicon-off:before { content: "\e017"; } .glyphicon-signal:before { content: "\e018"; } .glyphicon-cog:before { content: "\e019"; } .glyphicon-trash:before { content: "\e020"; } .glyphicon-home:before { content: "\e021"; } .glyphicon-file:before { content: "\e022"; } .glyphicon-time:before { content: "\e023"; } .glyphicon-road:before { content: "\e024"; } .glyphicon-download-alt:before { content: "\e025"; } .glyphicon-download:before { content: "\e026"; } .glyphicon-upload:before { content: "\e027"; } .glyphicon-inbox:before { content: "\e028"; } .glyphicon-play-circle:before { content: "\e029"; } .glyphicon-repeat:before { content: "\e030"; } .glyphicon-refresh:before { content: "\e031"; } .glyphicon-list-alt:before { content: "\e032"; } .glyphicon-lock:before { content: "\e033"; } .glyphicon-flag:before { content: "\e034"; } .glyphicon-headphones:before { content: "\e035"; } .glyphicon-volume-off:before { content: "\e036"; } .glyphicon-volume-down:before { content: "\e037"; } .glyphicon-volume-up:before { content: "\e038"; } .glyphicon-qrcode:before { content: "\e039"; } .glyphicon-barcode:before { content: "\e040"; } .glyphicon-tag:before { content: "\e041"; } .glyphicon-tags:before { content: "\e042"; } .glyphicon-book:before { content: "\e043"; } .glyphicon-bookmark:before { content: "\e044"; } .glyphicon-print:before { content: "\e045"; } .glyphicon-camera:before { content: "\e046"; } .glyphicon-font:before { content: "\e047"; } .glyphicon-bold:before { content: "\e048"; } .glyphicon-italic:before { content: "\e049"; } .glyphicon-text-height:before { content: "\e050"; } .glyphicon-text-width:before { content: "\e051"; } .glyphicon-align-left:before { content: "\e052"; } .glyphicon-align-center:before { content: "\e053"; } .glyphicon-align-right:before { content: "\e054"; } .glyphicon-align-justify:before { content: "\e055"; } .glyphicon-list:before { content: "\e056"; } .glyphicon-indent-left:before { content: "\e057"; } .glyphicon-indent-right:before { content: "\e058"; } .glyphicon-facetime-video:before { content: "\e059"; } .glyphicon-picture:before { content: "\e060"; } .glyphicon-map-marker:before { content: "\e062"; } .glyphicon-adjust:before { content: "\e063"; } .glyphicon-tint:before { content: "\e064"; } .glyphicon-edit:before { content: "\e065"; } .glyphicon-share:before { content: "\e066"; } .glyphicon-check:before { content: "\e067"; } .glyphicon-move:before { content: "\e068"; } .glyphicon-step-backward:before { content: "\e069"; } .glyphicon-fast-backward:before { content: "\e070"; } .glyphicon-backward:before { content: "\e071"; } .glyphicon-play:before { content: "\e072"; } .glyphicon-pause:before { content: "\e073"; } .glyphicon-stop:before { content: "\e074"; } .glyphicon-forward:before { content: "\e075"; } .glyphicon-fast-forward:before { content: "\e076"; } .glyphicon-step-forward:before { content: "\e077"; } .glyphicon-eject:before { content: "\e078"; } .glyphicon-chevron-left:before { content: "\e079"; } .glyphicon-chevron-right:before { content: "\e080"; } .glyphicon-plus-sign:before { content: "\e081"; } .glyphicon-minus-sign:before { content: "\e082"; } .glyphicon-remove-sign:before { content: "\e083"; } .glyphicon-ok-sign:before { content: "\e084"; } .glyphicon-question-sign:before { content: "\e085"; } .glyphicon-info-sign:before { content: "\e086"; } .glyphicon-screenshot:before { content: "\e087"; } .glyphicon-remove-circle:before { content: "\e088"; } .glyphicon-ok-circle:before { content: "\e089"; } .glyphicon-ban-circle:before { content: "\e090"; } .glyphicon-arrow-left:before { content: "\e091"; } .glyphicon-arrow-right:before { content: "\e092"; } .glyphicon-arrow-up:before { content: "\e093"; } .glyphicon-arrow-down:before { content: "\e094"; } .glyphicon-share-alt:before { content: "\e095"; } .glyphicon-resize-full:before { content: "\e096"; } .glyphicon-resize-small:before { content: "\e097"; } .glyphicon-exclamation-sign:before { content: "\e101"; } .glyphicon-gift:before { content: "\e102"; } .glyphicon-leaf:before { content: "\e103"; } .glyphicon-fire:before { content: "\e104"; } .glyphicon-eye-open:before { content: "\e105"; } .glyphicon-eye-close:before { content: "\e106"; } .glyphicon-warning-sign:before { content: "\e107"; } .glyphicon-plane:before { content: "\e108"; } .glyphicon-calendar:before { content: "\e109"; } .glyphicon-random:before { content: "\e110"; } .glyphicon-comment:before { content: "\e111"; } .glyphicon-magnet:before { content: "\e112"; } .glyphicon-chevron-up:before { content: "\e113"; } .glyphicon-chevron-down:before { content: "\e114"; } .glyphicon-retweet:before { content: "\e115"; } .glyphicon-shopping-cart:before { content: "\e116"; } .glyphicon-folder-close:before { content: "\e117"; } .glyphicon-folder-open:before { content: "\e118"; } .glyphicon-resize-vertical:before { content: "\e119"; } .glyphicon-resize-horizontal:before { content: "\e120"; } .glyphicon-hdd:before { content: "\e121"; } .glyphicon-bullhorn:before { content: "\e122"; } .glyphicon-bell:before { content: "\e123"; } .glyphicon-certificate:before { content: "\e124"; } .glyphicon-thumbs-up:before { content: "\e125"; } .glyphicon-thumbs-down:before { content: "\e126"; } .glyphicon-hand-right:before { content: "\e127"; } .glyphicon-hand-left:before { content: "\e128"; } .glyphicon-hand-up:before { content: "\e129"; } .glyphicon-hand-down:before { content: "\e130"; } .glyphicon-circle-arrow-right:before { content: "\e131"; } .glyphicon-circle-arrow-left:before { content: "\e132"; } .glyphicon-circle-arrow-up:before { content: "\e133"; } .glyphicon-circle-arrow-down:before { content: "\e134"; } .glyphicon-globe:before { content: "\e135"; } .glyphicon-wrench:before { content: "\e136"; } .glyphicon-tasks:before { content: "\e137"; } .glyphicon-filter:before { content: "\e138"; } .glyphicon-briefcase:before { content: "\e139"; } .glyphicon-fullscreen:before { content: "\e140"; } .glyphicon-dashboard:before { content: "\e141"; } .glyphicon-paperclip:before { content: "\e142"; } .glyphicon-heart-empty:before { content: "\e143"; } .glyphicon-link:before { content: "\e144"; } .glyphicon-phone:before { content: "\e145"; } .glyphicon-pushpin:before { content: "\e146"; } .glyphicon-usd:before { content: "\e148"; } .glyphicon-gbp:before { content: "\e149"; } .glyphicon-sort:before { content: "\e150"; } .glyphicon-sort-by-alphabet:before { content: "\e151"; } .glyphicon-sort-by-alphabet-alt:before { content: "\e152"; } .glyphicon-sort-by-order:before { content: "\e153"; } .glyphicon-sort-by-order-alt:before { content: "\e154"; } .glyphicon-sort-by-attributes:before { content: "\e155"; } .glyphicon-sort-by-attributes-alt:before { content: "\e156"; } .glyphicon-unchecked:before { content: "\e157"; } .glyphicon-expand:before { content: "\e158"; } .glyphicon-collapse-down:before { content: "\e159"; } .glyphicon-collapse-up:before { content: "\e160"; } .glyphicon-log-in:before { content: "\e161"; } .glyphicon-flash:before { content: "\e162"; } .glyphicon-log-out:before { content: "\e163"; } .glyphicon-new-window:before { content: "\e164"; } .glyphicon-record:before { content: "\e165"; } .glyphicon-save:before { content: "\e166"; } .glyphicon-open:before { content: "\e167"; } .glyphicon-saved:before { content: "\e168"; } .glyphicon-import:before { content: "\e169"; } .glyphicon-export:before { content: "\e170"; } .glyphicon-send:before { content: "\e171"; } .glyphicon-floppy-disk:before { content: "\e172"; } .glyphicon-floppy-saved:before { content: "\e173"; } .glyphicon-floppy-remove:before { content: "\e174"; } .glyphicon-floppy-save:before { content: "\e175"; } .glyphicon-floppy-open:before { content: "\e176"; } .glyphicon-credit-card:before { content: "\e177"; } .glyphicon-transfer:before { content: "\e178"; } .glyphicon-cutlery:before { content: "\e179"; } .glyphicon-header:before { content: "\e180"; } .glyphicon-compressed:before { content: "\e181"; } .glyphicon-earphone:before { content: "\e182"; } .glyphicon-phone-alt:before { content: "\e183"; } .glyphicon-tower:before { content: "\e184"; } .glyphicon-stats:before { content: "\e185"; } .glyphicon-sd-video:before { content: "\e186"; } .glyphicon-hd-video:before { content: "\e187"; } .glyphicon-subtitles:before { content: "\e188"; } .glyphicon-sound-stereo:before { content: "\e189"; } .glyphicon-sound-dolby:before { content: "\e190"; } .glyphicon-sound-5-1:before { content: "\e191"; } .glyphicon-sound-6-1:before { content: "\e192"; } .glyphicon-sound-7-1:before { content: "\e193"; } .glyphicon-copyright-mark:before { content: "\e194"; } .glyphicon-registration-mark:before { content: "\e195"; } .glyphicon-cloud-download:before { content: "\e197"; } .glyphicon-cloud-upload:before { content: "\e198"; } .glyphicon-tree-conifer:before { content: "\e199"; } .glyphicon-tree-deciduous:before { content: "\e200"; } .glyphicon-cd:before { content: "\e201"; } .glyphicon-save-file:before { content: "\e202"; } .glyphicon-open-file:before { content: "\e203"; } .glyphicon-level-up:before { content: "\e204"; } .glyphicon-copy:before { content: "\e205"; } .glyphicon-paste:before { content: "\e206"; } .glyphicon-alert:before { content: "\e209"; } .glyphicon-equalizer:before { content: "\e210"; } .glyphicon-king:before { content: "\e211"; } .glyphicon-queen:before { content: "\e212"; } .glyphicon-pawn:before { content: "\e213"; } .glyphicon-bishop:before { content: "\e214"; } .glyphicon-knight:before { content: "\e215"; } .glyphicon-baby-formula:before { content: "\e216"; } .glyphicon-tent:before { content: "\26fa"; } .glyphicon-blackboard:before { content: "\e218"; } .glyphicon-bed:before { content: "\e219"; } .glyphicon-apple:before { content: "\f8ff"; } .glyphicon-erase:before { content: "\e221"; } .glyphicon-hourglass:before { content: "\231b"; } .glyphicon-lamp:before { content: "\e223"; } .glyphicon-duplicate:before { content: "\e224"; } .glyphicon-piggy-bank:before { content: "\e225"; } .glyphicon-scissors:before { content: "\e226"; } .glyphicon-bitcoin:before { content: "\e227"; } .glyphicon-btc:before { content: "\e227"; } .glyphicon-xbt:before { content: "\e227"; } .glyphicon-yen:before { content: "\00a5"; } .glyphicon-jpy:before { content: "\00a5"; } .glyphicon-ruble:before { content: "\20bd"; } .glyphicon-rub:before { content: "\20bd"; } .glyphicon-scale:before { content: "\e230"; } .glyphicon-ice-lolly:before { content: "\e231"; } .glyphicon-ice-lolly-tasted:before { content: "\e232"; } .glyphicon-education:before { content: "\e233"; } .glyphicon-option-horizontal:before { content: "\e234"; } .glyphicon-option-vertical:before { content: "\e235"; } .glyphicon-menu-hamburger:before { content: "\e236"; } .glyphicon-modal-window:before { content: "\e237"; } .glyphicon-oil:before { content: "\e238"; } .glyphicon-grain:before { content: "\e239"; } .glyphicon-sunglasses:before { content: "\e240"; } .glyphicon-text-size:before { content: "\e241"; } .glyphicon-text-color:before { content: "\e242"; } .glyphicon-text-background:before { content: "\e243"; } .glyphicon-object-align-top:before { content: "\e244"; } .glyphicon-object-align-bottom:before { content: "\e245"; } .glyphicon-object-align-horizontal:before { content: "\e246"; } .glyphicon-object-align-left:before { content: "\e247"; } .glyphicon-object-align-vertical:before { content: "\e248"; } .glyphicon-object-align-right:before { content: "\e249"; } .glyphicon-triangle-right:before { content: "\e250"; } .glyphicon-triangle-left:before { content: "\e251"; } .glyphicon-triangle-bottom:before { content: "\e252"; } .glyphicon-triangle-top:before { content: "\e253"; } .glyphicon-console:before { content: "\e254"; } .glyphicon-superscript:before { content: "\e255"; } .glyphicon-subscript:before { content: "\e256"; } .glyphicon-menu-left:before { content: "\e257"; } .glyphicon-menu-right:before { content: "\e258"; } .glyphicon-menu-down:before { content: "\e259"; } .glyphicon-menu-up:before { content: "\e260"; } * { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } *:before, *:after { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } html { font-size: 10px; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } body { font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; line-height: 1.42857143; color: #333; background-color: #fff; } input, button, select, textarea { font-family: inherit; font-size: inherit; line-height: inherit; } a { color: #337ab7; text-decoration: none; } a:hover, a:focus { color: #23527c; text-decoration: underline; } a:focus { outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } figure { margin: 0; } img { vertical-align: middle; } .img-responsive, .thumbnail > img, .thumbnail a > img, .carousel-inner > .item > img, .carousel-inner > .item > a > img { display: block; max-width: 100%; height: auto; } .img-rounded { border-radius: 6px; } .img-thumbnail { display: inline-block; max-width: 100%; height: auto; padding: 4px; line-height: 1.42857143; background-color: #fff; border: 1px solid #ddd; border-radius: 4px; -webkit-transition: all .2s ease-in-out; -o-transition: all .2s ease-in-out; transition: all .2s ease-in-out; } .img-circle { border-radius: 50%; } hr { margin-top: 20px; margin-bottom: 20px; border: 0; border-top: 1px solid #eee; } .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); border: 0; } .sr-only-focusable:active, .sr-only-focusable:focus { position: static; width: auto; height: auto; margin: 0; overflow: visible; clip: auto; } [role="button"] { cursor: pointer; } h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 { font-family: inherit; font-weight: 500; line-height: 1.1; color: inherit; } h1 small, h2 small, h3 small, h4 small, h5 small, h6 small, .h1 small, .h2 small, .h3 small, .h4 small, .h5 small, .h6 small, h1 .small, h2 .small, h3 .small, h4 .small, h5 .small, h6 .small, .h1 .small, .h2 .small, .h3 .small, .h4 .small, .h5 .small, .h6 .small { font-weight: normal; line-height: 1; color: #777; } h1, .h1, h2, .h2, h3, .h3 { margin-top: 20px; margin-bottom: 10px; } h1 small, .h1 small, h2 small, .h2 small, h3 small, .h3 small, h1 .small, .h1 .small, h2 .small, .h2 .small, h3 .small, .h3 .small { font-size: 65%; } h4, .h4, h5, .h5, h6, .h6 { margin-top: 10px; margin-bottom: 10px; } h4 small, .h4 small, h5 small, .h5 small, h6 small, .h6 small, h4 .small, .h4 .small, h5 .small, .h5 .small, h6 .small, .h6 .small { font-size: 75%; } h1, .h1 { font-size: 36px; } h2, .h2 { font-size: 30px; } h3, .h3 { font-size: 24px; } h4, .h4 { font-size: 18px; } h5, .h5 { font-size: 14px; } h6, .h6 { font-size: 12px; } p { margin: 0 0 10px; } .lead { margin-bottom: 20px; font-size: 16px; font-weight: 300; line-height: 1.4; } @media (min-width: 768px) { .lead { font-size: 21px; } } small, .small { font-size: 85%; } mark, .mark { padding: .2em; background-color: #fcf8e3; } .text-left { text-align: left; } .text-right { text-align: right; } .text-center { text-align: center; } .text-justify { text-align: justify; } .text-nowrap { white-space: nowrap; } .text-lowercase { text-transform: lowercase; } .text-uppercase { text-transform: uppercase; } .text-capitalize { text-transform: capitalize; } .text-muted { color: #777; } .text-primary { color: #337ab7; } a.text-primary:hover, a.text-primary:focus { color: #286090; } .text-success { color: #3c763d; } a.text-success:hover, a.text-success:focus { color: #2b542c; } .text-info { color: #31708f; } a.text-info:hover, a.text-info:focus { color: #245269; } .text-warning { color: #8a6d3b; } a.text-warning:hover, a.text-warning:focus { color: #66512c; } .text-danger { color: #a94442; } a.text-danger:hover, a.text-danger:focus { color: #843534; } .bg-primary { color: #fff; background-color: #337ab7; } a.bg-primary:hover, a.bg-primary:focus { background-color: #286090; } .bg-success { background-color: #dff0d8; } a.bg-success:hover, a.bg-success:focus { background-color: #c1e2b3; } .bg-info { background-color: #d9edf7; } a.bg-info:hover, a.bg-info:focus { background-color: #afd9ee; } .bg-warning { background-color: #fcf8e3; } a.bg-warning:hover, a.bg-warning:focus { background-color: #f7ecb5; } .bg-danger { background-color: #f2dede; } a.bg-danger:hover, a.bg-danger:focus { background-color: #e4b9b9; } .page-header { padding-bottom: 9px; margin: 40px 0 20px; border-bottom: 1px solid #eee; } ul, ol { margin-top: 0; margin-bottom: 10px; } ul ul, ol ul, ul ol, ol ol { margin-bottom: 0; } .list-unstyled { padding-left: 0; list-style: none; } .list-inline { padding-left: 0; margin-left: -5px; list-style: none; } .list-inline > li { display: inline-block; padding-right: 5px; padding-left: 5px; } dl { margin-top: 0; margin-bottom: 20px; } dt, dd { line-height: 1.42857143; } dt { font-weight: bold; } dd { margin-left: 0; } @media (min-width: 768px) { .dl-horizontal dt { float: left; width: 160px; overflow: hidden; clear: left; text-align: right; text-overflow: ellipsis; white-space: nowrap; } .dl-horizontal dd { margin-left: 180px; } } abbr[title], abbr[data-original-title] { cursor: help; border-bottom: 1px dotted #777; } .initialism { font-size: 90%; text-transform: uppercase; } blockquote { padding: 10px 20px; margin: 0 0 20px; font-size: 17.5px; border-left: 5px solid #eee; } blockquote p:last-child, blockquote ul:last-child, blockquote ol:last-child { margin-bottom: 0; } blockquote footer, blockquote small, blockquote .small { display: block; font-size: 80%; line-height: 1.42857143; color: #777; } blockquote footer:before, blockquote small:before, blockquote .small:before { content: '\2014 \00A0'; } .blockquote-reverse, blockquote.pull-right { padding-right: 15px; padding-left: 0; text-align: right; border-right: 5px solid #eee; border-left: 0; } .blockquote-reverse footer:before, blockquote.pull-right footer:before, .blockquote-reverse small:before, blockquote.pull-right small:before, .blockquote-reverse .small:before, blockquote.pull-right .small:before { content: ''; } .blockquote-reverse footer:after, blockquote.pull-right footer:after, .blockquote-reverse small:after, blockquote.pull-right small:after, .blockquote-reverse .small:after, blockquote.pull-right .small:after { content: '\00A0 \2014'; } address { margin-bottom: 20px; font-style: normal; line-height: 1.42857143; } code, kbd, pre, samp { font-family: Menlo, Monaco, Consolas, "Courier New", monospace; } code { padding: 2px 4px; font-size: 90%; color: #c7254e; background-color: #f9f2f4; border-radius: 4px; } kbd { padding: 2px 4px; font-size: 90%; color: #fff; background-color: #333; border-radius: 3px; -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); } kbd kbd { padding: 0; font-size: 100%; font-weight: bold; -webkit-box-shadow: none; box-shadow: none; } pre { display: block; padding: 9.5px; margin: 0 0 10px; font-size: 13px; line-height: 1.42857143; color: #333; word-break: break-all; word-wrap: break-word; background-color: #f5f5f5; border: 1px solid #ccc; border-radius: 4px; } pre code { padding: 0; font-size: inherit; color: inherit; white-space: pre-wrap; background-color: transparent; border-radius: 0; } .pre-scrollable { max-height: 340px; overflow-y: scroll; } .container { padding-right: 15px; padding-left: 15px; margin-right: auto; margin-left: auto; } @media (min-width: 768px) { .container { width: 750px; } } @media (min-width: 992px) { .container { width: 970px; } } @media (min-width: 1200px) { .container { width: 1170px; } } .container-fluid { padding-right: 15px; padding-left: 15px; margin-right: auto; margin-left: auto; } .row { margin-right: -15px; margin-left: -15px; } .col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { position: relative; min-height: 1px; padding-right: 15px; padding-left: 15px; } .col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { float: left; } .col-xs-12 { width: 100%; } .col-xs-11 { width: 91.66666667%; } .col-xs-10 { width: 83.33333333%; } .col-xs-9 { width: 75%; } .col-xs-8 { width: 66.66666667%; } .col-xs-7 { width: 58.33333333%; } .col-xs-6 { width: 50%; } .col-xs-5 { width: 41.66666667%; } .col-xs-4 { width: 33.33333333%; } .col-xs-3 { width: 25%; } .col-xs-2 { width: 16.66666667%; } .col-xs-1 { width: 8.33333333%; } .col-xs-pull-12 { right: 100%; } .col-xs-pull-11 { right: 91.66666667%; } .col-xs-pull-10 { right: 83.33333333%; } .col-xs-pull-9 { right: 75%; } .col-xs-pull-8 { right: 66.66666667%; } .col-xs-pull-7 { right: 58.33333333%; } .col-xs-pull-6 { right: 50%; } .col-xs-pull-5 { right: 41.66666667%; } .col-xs-pull-4 { right: 33.33333333%; } .col-xs-pull-3 { right: 25%; } .col-xs-pull-2 { right: 16.66666667%; } .col-xs-pull-1 { right: 8.33333333%; } .col-xs-pull-0 { right: auto; } .col-xs-push-12 { left: 100%; } .col-xs-push-11 { left: 91.66666667%; } .col-xs-push-10 { left: 83.33333333%; } .col-xs-push-9 { left: 75%; } .col-xs-push-8 { left: 66.66666667%; } .col-xs-push-7 { left: 58.33333333%; } .col-xs-push-6 { left: 50%; } .col-xs-push-5 { left: 41.66666667%; } .col-xs-push-4 { left: 33.33333333%; } .col-xs-push-3 { left: 25%; } .col-xs-push-2 { left: 16.66666667%; } .col-xs-push-1 { left: 8.33333333%; } .col-xs-push-0 { left: auto; } .col-xs-offset-12 { margin-left: 100%; } .col-xs-offset-11 { margin-left: 91.66666667%; } .col-xs-offset-10 { margin-left: 83.33333333%; } .col-xs-offset-9 { margin-left: 75%; } .col-xs-offset-8 { margin-left: 66.66666667%; } .col-xs-offset-7 { margin-left: 58.33333333%; } .col-xs-offset-6 { margin-left: 50%; } .col-xs-offset-5 { margin-left: 41.66666667%; } .col-xs-offset-4 { margin-left: 33.33333333%; } .col-xs-offset-3 { margin-left: 25%; } .col-xs-offset-2 { margin-left: 16.66666667%; } .col-xs-offset-1 { margin-left: 8.33333333%; } .col-xs-offset-0 { margin-left: 0; } @media (min-width: 768px) { .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { float: left; } .col-sm-12 { width: 100%; } .col-sm-11 { width: 91.66666667%; } .col-sm-10 { width: 83.33333333%; } .col-sm-9 { width: 75%; } .col-sm-8 { width: 66.66666667%; } .col-sm-7 { width: 58.33333333%; } .col-sm-6 { width: 50%; } .col-sm-5 { width: 41.66666667%; } .col-sm-4 { width: 33.33333333%; } .col-sm-3 { width: 25%; } .col-sm-2 { width: 16.66666667%; } .col-sm-1 { width: 8.33333333%; } .col-sm-pull-12 { right: 100%; } .col-sm-pull-11 { right: 91.66666667%; } .col-sm-pull-10 { right: 83.33333333%; } .col-sm-pull-9 { right: 75%; } .col-sm-pull-8 { right: 66.66666667%; } .col-sm-pull-7 { right: 58.33333333%; } .col-sm-pull-6 { right: 50%; } .col-sm-pull-5 { right: 41.66666667%; } .col-sm-pull-4 { right: 33.33333333%; } .col-sm-pull-3 { right: 25%; } .col-sm-pull-2 { right: 16.66666667%; } .col-sm-pull-1 { right: 8.33333333%; } .col-sm-pull-0 { right: auto; } .col-sm-push-12 { left: 100%; } .col-sm-push-11 { left: 91.66666667%; } .col-sm-push-10 { left: 83.33333333%; } .col-sm-push-9 { left: 75%; } .col-sm-push-8 { left: 66.66666667%; } .col-sm-push-7 { left: 58.33333333%; } .col-sm-push-6 { left: 50%; } .col-sm-push-5 { left: 41.66666667%; } .col-sm-push-4 { left: 33.33333333%; } .col-sm-push-3 { left: 25%; } .col-sm-push-2 { left: 16.66666667%; } .col-sm-push-1 { left: 8.33333333%; } .col-sm-push-0 { left: auto; } .col-sm-offset-12 { margin-left: 100%; } .col-sm-offset-11 { margin-left: 91.66666667%; } .col-sm-offset-10 { margin-left: 83.33333333%; } .col-sm-offset-9 { margin-left: 75%; } .col-sm-offset-8 { margin-left: 66.66666667%; } .col-sm-offset-7 { margin-left: 58.33333333%; } .col-sm-offset-6 { margin-left: 50%; } .col-sm-offset-5 { margin-left: 41.66666667%; } .col-sm-offset-4 { margin-left: 33.33333333%; } .col-sm-offset-3 { margin-left: 25%; } .col-sm-offset-2 { margin-left: 16.66666667%; } .col-sm-offset-1 { margin-left: 8.33333333%; } .col-sm-offset-0 { margin-left: 0; } } @media (min-width: 992px) { .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { float: left; } .col-md-12 { width: 100%; } .col-md-11 { width: 91.66666667%; } .col-md-10 { width: 83.33333333%; } .col-md-9 { width: 75%; } .col-md-8 { width: 66.66666667%; } .col-md-7 { width: 58.33333333%; } .col-md-6 { width: 50%; } .col-md-5 { width: 41.66666667%; } .col-md-4 { width: 33.33333333%; } .col-md-3 { width: 25%; } .col-md-2 { width: 16.66666667%; } .col-md-1 { width: 8.33333333%; } .col-md-pull-12 { right: 100%; } .col-md-pull-11 { right: 91.66666667%; } .col-md-pull-10 { right: 83.33333333%; } .col-md-pull-9 { right: 75%; } .col-md-pull-8 { right: 66.66666667%; } .col-md-pull-7 { right: 58.33333333%; } .col-md-pull-6 { right: 50%; } .col-md-pull-5 { right: 41.66666667%; } .col-md-pull-4 { right: 33.33333333%; } .col-md-pull-3 { right: 25%; } .col-md-pull-2 { right: 16.66666667%; } .col-md-pull-1 { right: 8.33333333%; } .col-md-pull-0 { right: auto; } .col-md-push-12 { left: 100%; } .col-md-push-11 { left: 91.66666667%; } .col-md-push-10 { left: 83.33333333%; } .col-md-push-9 { left: 75%; } .col-md-push-8 { left: 66.66666667%; } .col-md-push-7 { left: 58.33333333%; } .col-md-push-6 { left: 50%; } .col-md-push-5 { left: 41.66666667%; } .col-md-push-4 { left: 33.33333333%; } .col-md-push-3 { left: 25%; } .col-md-push-2 { left: 16.66666667%; } .col-md-push-1 { left: 8.33333333%; } .col-md-push-0 { left: auto; } .col-md-offset-12 { margin-left: 100%; } .col-md-offset-11 { margin-left: 91.66666667%; } .col-md-offset-10 { margin-left: 83.33333333%; } .col-md-offset-9 { margin-left: 75%; } .col-md-offset-8 { margin-left: 66.66666667%; } .col-md-offset-7 { margin-left: 58.33333333%; } .col-md-offset-6 { margin-left: 50%; } .col-md-offset-5 { margin-left: 41.66666667%; } .col-md-offset-4 { margin-left: 33.33333333%; } .col-md-offset-3 { margin-left: 25%; } .col-md-offset-2 { margin-left: 16.66666667%; } .col-md-offset-1 { margin-left: 8.33333333%; } .col-md-offset-0 { margin-left: 0; } } @media (min-width: 1200px) { .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { float: left; } .col-lg-12 { width: 100%; } .col-lg-11 { width: 91.66666667%; } .col-lg-10 { width: 83.33333333%; } .col-lg-9 { width: 75%; } .col-lg-8 { width: 66.66666667%; } .col-lg-7 { width: 58.33333333%; } .col-lg-6 { width: 50%; } .col-lg-5 { width: 41.66666667%; } .col-lg-4 { width: 33.33333333%; } .col-lg-3 { width: 25%; } .col-lg-2 { width: 16.66666667%; } .col-lg-1 { width: 8.33333333%; } .col-lg-pull-12 { right: 100%; } .col-lg-pull-11 { right: 91.66666667%; } .col-lg-pull-10 { right: 83.33333333%; } .col-lg-pull-9 { right: 75%; } .col-lg-pull-8 { right: 66.66666667%; } .col-lg-pull-7 { right: 58.33333333%; } .col-lg-pull-6 { right: 50%; } .col-lg-pull-5 { right: 41.66666667%; } .col-lg-pull-4 { right: 33.33333333%; } .col-lg-pull-3 { right: 25%; } .col-lg-pull-2 { right: 16.66666667%; } .col-lg-pull-1 { right: 8.33333333%; } .col-lg-pull-0 { right: auto; } .col-lg-push-12 { left: 100%; } .col-lg-push-11 { left: 91.66666667%; } .col-lg-push-10 { left: 83.33333333%; } .col-lg-push-9 { left: 75%; } .col-lg-push-8 { left: 66.66666667%; } .col-lg-push-7 { left: 58.33333333%; } .col-lg-push-6 { left: 50%; } .col-lg-push-5 { left: 41.66666667%; } .col-lg-push-4 { left: 33.33333333%; } .col-lg-push-3 { left: 25%; } .col-lg-push-2 { left: 16.66666667%; } .col-lg-push-1 { left: 8.33333333%; } .col-lg-push-0 { left: auto; } .col-lg-offset-12 { margin-left: 100%; } .col-lg-offset-11 { margin-left: 91.66666667%; } .col-lg-offset-10 { margin-left: 83.33333333%; } .col-lg-offset-9 { margin-left: 75%; } .col-lg-offset-8 { margin-left: 66.66666667%; } .col-lg-offset-7 { margin-left: 58.33333333%; } .col-lg-offset-6 { margin-left: 50%; } .col-lg-offset-5 { margin-left: 41.66666667%; } .col-lg-offset-4 { margin-left: 33.33333333%; } .col-lg-offset-3 { margin-left: 25%; } .col-lg-offset-2 { margin-left: 16.66666667%; } .col-lg-offset-1 { margin-left: 8.33333333%; } .col-lg-offset-0 { margin-left: 0; } } table { background-color: transparent; } caption { padding-top: 8px; padding-bottom: 8px; color: #777; text-align: left; } th { text-align: left; } .table { width: 100%; max-width: 100%; margin-bottom: 20px; } .table > thead > tr > th, .table > tbody > tr > th, .table > tfoot > tr > th, .table > thead > tr > td, .table > tbody > tr > td, .table > tfoot > tr > td { padding: 8px; line-height: 1.42857143; vertical-align: top; border-top: 1px solid #ddd; } .table > thead > tr > th { vertical-align: bottom; border-bottom: 2px solid #ddd; } .table > caption + thead > tr:first-child > th, .table > colgroup + thead > tr:first-child > th, .table > thead:first-child > tr:first-child > th, .table > caption + thead > tr:first-child > td, .table > colgroup + thead > tr:first-child > td, .table > thead:first-child > tr:first-child > td { border-top: 0; } .table > tbody + tbody { border-top: 2px solid #ddd; } .table .table { background-color: #fff; } .table-condensed > thead > tr > th, .table-condensed > tbody > tr > th, .table-condensed > tfoot > tr > th, .table-condensed > thead > tr > td, .table-condensed > tbody > tr > td, .table-condensed > tfoot > tr > td { padding: 5px; } .table-bordered { border: 1px solid #ddd; } .table-bordered > thead > tr > th, .table-bordered > tbody > tr > th, .table-bordered > tfoot > tr > th, .table-bordered > thead > tr > td, .table-bordered > tbody > tr > td, .table-bordered > tfoot > tr > td { border: 1px solid #ddd; } .table-bordered > thead > tr > th, .table-bordered > thead > tr > td { border-bottom-width: 2px; } .table-striped > tbody > tr:nth-of-type(odd) { background-color: #f9f9f9; } .table-hover > tbody > tr:hover { background-color: #f5f5f5; } table col[class*="col-"] { position: static; display: table-column; float: none; } table td[class*="col-"], table th[class*="col-"] { position: static; display: table-cell; float: none; } .table > thead > tr > td.active, .table > tbody > tr > td.active, .table > tfoot > tr > td.active, .table > thead > tr > th.active, .table > tbody > tr > th.active, .table > tfoot > tr > th.active, .table > thead > tr.active > td, .table > tbody > tr.active > td, .table > tfoot > tr.active > td, .table > thead > tr.active > th, .table > tbody > tr.active > th, .table > tfoot > tr.active > th { background-color: #f5f5f5; } .table-hover > tbody > tr > td.active:hover, .table-hover > tbody > tr > th.active:hover, .table-hover > tbody > tr.active:hover > td, .table-hover > tbody > tr:hover > .active, .table-hover > tbody > tr.active:hover > th { background-color: #e8e8e8; } .table > thead > tr > td.success, .table > tbody > tr > td.success, .table > tfoot > tr > td.success, .table > thead > tr > th.success, .table > tbody > tr > th.success, .table > tfoot > tr > th.success, .table > thead > tr.success > td, .table > tbody > tr.success > td, .table > tfoot > tr.success > td, .table > thead > tr.success > th, .table > tbody > tr.success > th, .table > tfoot > tr.success > th { background-color: #dff0d8; } .table-hover > tbody > tr > td.success:hover, .table-hover > tbody > tr > th.success:hover, .table-hover > tbody > tr.success:hover > td, .table-hover > tbody > tr:hover > .success, .table-hover > tbody > tr.success:hover > th { background-color: #d0e9c6; } .table > thead > tr > td.info, .table > tbody > tr > td.info, .table > tfoot > tr > td.info, .table > thead > tr > th.info, .table > tbody > tr > th.info, .table > tfoot > tr > th.info, .table > thead > tr.info > td, .table > tbody > tr.info > td, .table > tfoot > tr.info > td, .table > thead > tr.info > th, .table > tbody > tr.info > th, .table > tfoot > tr.info > th { background-color: #d9edf7; } .table-hover > tbody > tr > td.info:hover, .table-hover > tbody > tr > th.info:hover, .table-hover > tbody > tr.info:hover > td, .table-hover > tbody > tr:hover > .info, .table-hover > tbody > tr.info:hover > th { background-color: #c4e3f3; } .table > thead > tr > td.warning, .table > tbody > tr > td.warning, .table > tfoot > tr > td.warning, .table > thead > tr > th.warning, .table > tbody > tr > th.warning, .table > tfoot > tr > th.warning, .table > thead > tr.warning > td, .table > tbody > tr.warning > td, .table > tfoot > tr.warning > td, .table > thead > tr.warning > th, .table > tbody > tr.warning > th, .table > tfoot > tr.warning > th { background-color: #fcf8e3; } .table-hover > tbody > tr > td.warning:hover, .table-hover > tbody > tr > th.warning:hover, .table-hover > tbody > tr.warning:hover > td, .table-hover > tbody > tr:hover > .warning, .table-hover > tbody > tr.warning:hover > th { background-color: #faf2cc; } .table > thead > tr > td.danger, .table > tbody > tr > td.danger, .table > tfoot > tr > td.danger, .table > thead > tr > th.danger, .table > tbody > tr > th.danger, .table > tfoot > tr > th.danger, .table > thead > tr.danger > td, .table > tbody > tr.danger > td, .table > tfoot > tr.danger > td, .table > thead > tr.danger > th, .table > tbody > tr.danger > th, .table > tfoot > tr.danger > th { background-color: #f2dede; } .table-hover > tbody > tr > td.danger:hover, .table-hover > tbody > tr > th.danger:hover, .table-hover > tbody > tr.danger:hover > td, .table-hover > tbody > tr:hover > .danger, .table-hover > tbody > tr.danger:hover > th { background-color: #ebcccc; } .table-responsive { min-height: .01%; overflow-x: auto; } @media screen and (max-width: 767px) { .table-responsive { width: 100%; margin-bottom: 15px; overflow-y: hidden; -ms-overflow-style: -ms-autohiding-scrollbar; border: 1px solid #ddd; } .table-responsive > .table { margin-bottom: 0; } .table-responsive > .table > thead > tr > th, .table-responsive > .table > tbody > tr > th, .table-responsive > .table > tfoot > tr > th, .table-responsive > .table > thead > tr > td, .table-responsive > .table > tbody > tr > td, .table-responsive > .table > tfoot > tr > td { white-space: nowrap; } .table-responsive > .table-bordered { border: 0; } .table-responsive > .table-bordered > thead > tr > th:first-child, .table-responsive > .table-bordered > tbody > tr > th:first-child, .table-responsive > .table-bordered > tfoot > tr > th:first-child, .table-responsive > .table-bordered > thead > tr > td:first-child, .table-responsive > .table-bordered > tbody > tr > td:first-child, .table-responsive > .table-bordered > tfoot > tr > td:first-child { border-left: 0; } .table-responsive > .table-bordered > thead > tr > th:last-child, .table-responsive > .table-bordered > tbody > tr > th:last-child, .table-responsive > .table-bordered > tfoot > tr > th:last-child, .table-responsive > .table-bordered > thead > tr > td:last-child, .table-responsive > .table-bordered > tbody > tr > td:last-child, .table-responsive > .table-bordered > tfoot > tr > td:last-child { border-right: 0; } .table-responsive > .table-bordered > tbody > tr:last-child > th, .table-responsive > .table-bordered > tfoot > tr:last-child > th, .table-responsive > .table-bordered > tbody > tr:last-child > td, .table-responsive > .table-bordered > tfoot > tr:last-child > td { border-bottom: 0; } } fieldset { min-width: 0; padding: 0; margin: 0; border: 0; } legend { display: block; width: 100%; padding: 0; margin-bottom: 20px; font-size: 21px; line-height: inherit; color: #333; border: 0; border-bottom: 1px solid #e5e5e5; } label { display: inline-block; max-width: 100%; margin-bottom: 5px; font-weight: bold; } input[type="search"] { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } input[type="radio"], input[type="checkbox"] { margin: 4px 0 0; margin-top: 1px \9; line-height: normal; } input[type="file"] { display: block; } input[type="range"] { display: block; width: 100%; } select[multiple], select[size] { height: auto; } input[type="file"]:focus, input[type="radio"]:focus, input[type="checkbox"]:focus { outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } output { display: block; padding-top: 7px; font-size: 14px; line-height: 1.42857143; color: #555; } .form-control { display: block; width: 100%; height: 34px; padding: 6px 12px; font-size: 14px; line-height: 1.42857143; color: #555; background-color: #fff; background-image: none; border: 1px solid #ccc; border-radius: 4px; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; } .form-control:focus { border-color: #66afe9; outline: 0; -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); } .form-control::-moz-placeholder { color: #999; opacity: 1; } .form-control:-ms-input-placeholder { color: #999; } .form-control::-webkit-input-placeholder { color: #999; } .form-control::-ms-expand { background-color: transparent; border: 0; } .form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control { background-color: #eee; opacity: 1; } .form-control[disabled], fieldset[disabled] .form-control { cursor: not-allowed; } textarea.form-control { height: auto; } input[type="search"] { -webkit-appearance: none; } @media screen and (-webkit-min-device-pixel-ratio: 0) { input[type="date"].form-control, input[type="time"].form-control, input[type="datetime-local"].form-control, input[type="month"].form-control { line-height: 34px; } input[type="date"].input-sm, input[type="time"].input-sm, input[type="datetime-local"].input-sm, input[type="month"].input-sm, .input-group-sm input[type="date"], .input-group-sm input[type="time"], .input-group-sm input[type="datetime-local"], .input-group-sm input[type="month"] { line-height: 30px; } input[type="date"].input-lg, input[type="time"].input-lg, input[type="datetime-local"].input-lg, input[type="month"].input-lg, .input-group-lg input[type="date"], .input-group-lg input[type="time"], .input-group-lg input[type="datetime-local"], .input-group-lg input[type="month"] { line-height: 46px; } } .form-group { margin-bottom: 15px; } .radio, .checkbox { position: relative; display: block; margin-top: 10px; margin-bottom: 10px; } .radio label, .checkbox label { min-height: 20px; padding-left: 20px; margin-bottom: 0; font-weight: normal; cursor: pointer; } .radio input[type="radio"], .radio-inline input[type="radio"], .checkbox input[type="checkbox"], .checkbox-inline input[type="checkbox"] { position: absolute; margin-top: 4px \9; margin-left: -20px; } .radio + .radio, .checkbox + .checkbox { margin-top: -5px; } .radio-inline, .checkbox-inline { position: relative; display: inline-block; padding-left: 20px; margin-bottom: 0; font-weight: normal; vertical-align: middle; cursor: pointer; } .radio-inline + .radio-inline, .checkbox-inline + .checkbox-inline { margin-top: 0; margin-left: 10px; } input[type="radio"][disabled], input[type="checkbox"][disabled], input[type="radio"].disabled, input[type="checkbox"].disabled, fieldset[disabled] input[type="radio"], fieldset[disabled] input[type="checkbox"] { cursor: not-allowed; } .radio-inline.disabled, .checkbox-inline.disabled, fieldset[disabled] .radio-inline, fieldset[disabled] .checkbox-inline { cursor: not-allowed; } .radio.disabled label, .checkbox.disabled label, fieldset[disabled] .radio label, fieldset[disabled] .checkbox label { cursor: not-allowed; } .form-control-static { min-height: 34px; padding-top: 7px; padding-bottom: 7px; margin-bottom: 0; } .form-control-static.input-lg, .form-control-static.input-sm { padding-right: 0; padding-left: 0; } .input-sm { height: 30px; padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } select.input-sm { height: 30px; line-height: 30px; } textarea.input-sm, select[multiple].input-sm { height: auto; } .form-group-sm .form-control { height: 30px; padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } .form-group-sm select.form-control { height: 30px; line-height: 30px; } .form-group-sm textarea.form-control, .form-group-sm select[multiple].form-control { height: auto; } .form-group-sm .form-control-static { height: 30px; min-height: 32px; padding: 6px 10px; font-size: 12px; line-height: 1.5; } .input-lg { height: 46px; padding: 10px 16px; font-size: 18px; line-height: 1.3333333; border-radius: 6px; } select.input-lg { height: 46px; line-height: 46px; } textarea.input-lg, select[multiple].input-lg { height: auto; } .form-group-lg .form-control { height: 46px; padding: 10px 16px; font-size: 18px; line-height: 1.3333333; border-radius: 6px; } .form-group-lg select.form-control { height: 46px; line-height: 46px; } .form-group-lg textarea.form-control, .form-group-lg select[multiple].form-control { height: auto; } .form-group-lg .form-control-static { height: 46px; min-height: 38px; padding: 11px 16px; font-size: 18px; line-height: 1.3333333; } .has-feedback { position: relative; } .has-feedback .form-control { padding-right: 42.5px; } .form-control-feedback { position: absolute; top: 0; right: 0; z-index: 2; display: block; width: 34px; height: 34px; line-height: 34px; text-align: center; pointer-events: none; } .input-lg + .form-control-feedback, .input-group-lg + .form-control-feedback, .form-group-lg .form-control + .form-control-feedback { width: 46px; height: 46px; line-height: 46px; } .input-sm + .form-control-feedback, .input-group-sm + .form-control-feedback, .form-group-sm .form-control + .form-control-feedback { width: 30px; height: 30px; line-height: 30px; } .has-success .help-block, .has-success .control-label, .has-success .radio, .has-success .checkbox, .has-success .radio-inline, .has-success .checkbox-inline, .has-success.radio label, .has-success.checkbox label, .has-success.radio-inline label, .has-success.checkbox-inline label { color: #3c763d; } .has-success .form-control { border-color: #3c763d; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); } .has-success .form-control:focus { border-color: #2b542c; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; } .has-success .input-group-addon { color: #3c763d; background-color: #dff0d8; border-color: #3c763d; } .has-success .form-control-feedback { color: #3c763d; } .has-warning .help-block, .has-warning .control-label, .has-warning .radio, .has-warning .checkbox, .has-warning .radio-inline, .has-warning .checkbox-inline, .has-warning.radio label, .has-warning.checkbox label, .has-warning.radio-inline label, .has-warning.checkbox-inline label { color: #8a6d3b; } .has-warning .form-control { border-color: #8a6d3b; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); } .has-warning .form-control:focus { border-color: #66512c; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; } .has-warning .input-group-addon { color: #8a6d3b; background-color: #fcf8e3; border-color: #8a6d3b; } .has-warning .form-control-feedback { color: #8a6d3b; } .has-error .help-block, .has-error .control-label, .has-error .radio, .has-error .checkbox, .has-error .radio-inline, .has-error .checkbox-inline, .has-error.radio label, .has-error.checkbox label, .has-error.radio-inline label, .has-error.checkbox-inline label { color: #a94442; } .has-error .form-control { border-color: #a94442; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); } .has-error .form-control:focus { border-color: #843534; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; } .has-error .input-group-addon { color: #a94442; background-color: #f2dede; border-color: #a94442; } .has-error .form-control-feedback { color: #a94442; } .has-feedback label ~ .form-control-feedback { top: 25px; } .has-feedback label.sr-only ~ .form-control-feedback { top: 0; } .help-block { display: block; margin-top: 5px; margin-bottom: 10px; color: #737373; } @media (min-width: 768px) { .form-inline .form-group { display: inline-block; margin-bottom: 0; vertical-align: middle; } .form-inline .form-control { display: inline-block; width: auto; vertical-align: middle; } .form-inline .form-control-static { display: inline-block; } .form-inline .input-group { display: inline-table; vertical-align: middle; } .form-inline .input-group .input-group-addon, .form-inline .input-group .input-group-btn, .form-inline .input-group .form-control { width: auto; } .form-inline .input-group > .form-control { width: 100%; } .form-inline .control-label { margin-bottom: 0; vertical-align: middle; } .form-inline .radio, .form-inline .checkbox { display: inline-block; margin-top: 0; margin-bottom: 0; vertical-align: middle; } .form-inline .radio label, .form-inline .checkbox label { padding-left: 0; } .form-inline .radio input[type="radio"], .form-inline .checkbox input[type="checkbox"] { position: relative; margin-left: 0; } .form-inline .has-feedback .form-control-feedback { top: 0; } } .form-horizontal .radio, .form-horizontal .checkbox, .form-horizontal .radio-inline, .form-horizontal .checkbox-inline { padding-top: 7px; margin-top: 0; margin-bottom: 0; } .form-horizontal .radio, .form-horizontal .checkbox { min-height: 27px; } .form-horizontal .form-group { margin-right: -15px; margin-left: -15px; } @media (min-width: 768px) { .form-horizontal .control-label { padding-top: 7px; margin-bottom: 0; text-align: right; } } .form-horizontal .has-feedback .form-control-feedback { right: 15px; } @media (min-width: 768px) { .form-horizontal .form-group-lg .control-label { padding-top: 11px; font-size: 18px; } } @media (min-width: 768px) { .form-horizontal .form-group-sm .control-label { padding-top: 6px; font-size: 12px; } } .btn { display: inline-block; padding: 6px 12px; margin-bottom: 0; font-size: 14px; font-weight: normal; line-height: 1.42857143; text-align: center; white-space: nowrap; vertical-align: middle; -ms-touch-action: manipulation; touch-action: manipulation; cursor: pointer; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; background-image: none; border: 1px solid transparent; border-radius: 4px; } .btn:focus, .btn:active:focus, .btn.active:focus, .btn.focus, .btn:active.focus, .btn.active.focus { outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } .btn:hover, .btn:focus, .btn.focus { color: #333; text-decoration: none; } .btn:active, .btn.active { background-image: none; outline: 0; -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); } .btn.disabled, .btn[disabled], fieldset[disabled] .btn { cursor: not-allowed; filter: alpha(opacity=65); -webkit-box-shadow: none; box-shadow: none; opacity: .65; } a.btn.disabled, fieldset[disabled] a.btn { pointer-events: none; } .btn-default { color: #333; background-color: #fff; border-color: #ccc; } .btn-default:focus, .btn-default.focus { color: #333; background-color: #e6e6e6; border-color: #8c8c8c; } .btn-default:hover { color: #333; background-color: #e6e6e6; border-color: #adadad; } .btn-default:active, .btn-default.active, .open > .dropdown-toggle.btn-default { color: #333; background-color: #e6e6e6; border-color: #adadad; } .btn-default:active:hover, .btn-default.active:hover, .open > .dropdown-toggle.btn-default:hover, .btn-default:active:focus, .btn-default.active:focus, .open > .dropdown-toggle.btn-default:focus, .btn-default:active.focus, .btn-default.active.focus, .open > .dropdown-toggle.btn-default.focus { color: #333; background-color: #d4d4d4; border-color: #8c8c8c; } .btn-default:active, .btn-default.active, .open > .dropdown-toggle.btn-default { background-image: none; } .btn-default.disabled:hover, .btn-default[disabled]:hover, fieldset[disabled] .btn-default:hover, .btn-default.disabled:focus, .btn-default[disabled]:focus, fieldset[disabled] .btn-default:focus, .btn-default.disabled.focus, .btn-default[disabled].focus, fieldset[disabled] .btn-default.focus { background-color: #fff; border-color: #ccc; } .btn-default .badge { color: #fff; background-color: #333; } .btn-primary { color: #fff; background-color: #337ab7; border-color: #2e6da4; } .btn-primary:focus, .btn-primary.focus { color: #fff; background-color: #286090; border-color: #122b40; } .btn-primary:hover { color: #fff; background-color: #286090; border-color: #204d74; } .btn-primary:active, .btn-primary.active, .open > .dropdown-toggle.btn-primary { color: #fff; background-color: #286090; border-color: #204d74; } .btn-primary:active:hover, .btn-primary.active:hover, .open > .dropdown-toggle.btn-primary:hover, .btn-primary:active:focus, .btn-primary.active:focus, .open > .dropdown-toggle.btn-primary:focus, .btn-primary:active.focus, .btn-primary.active.focus, .open > .dropdown-toggle.btn-primary.focus { color: #fff; background-color: #204d74; border-color: #122b40; } .btn-primary:active, .btn-primary.active, .open > .dropdown-toggle.btn-primary { background-image: none; } .btn-primary.disabled:hover, .btn-primary[disabled]:hover, fieldset[disabled] .btn-primary:hover, .btn-primary.disabled:focus, .btn-primary[disabled]:focus, fieldset[disabled] .btn-primary:focus, .btn-primary.disabled.focus, .btn-primary[disabled].focus, fieldset[disabled] .btn-primary.focus { background-color: #337ab7; border-color: #2e6da4; } .btn-primary .badge { color: #337ab7; background-color: #fff; } .btn-success { color: #fff; background-color: #5cb85c; border-color: #4cae4c; } .btn-success:focus, .btn-success.focus { color: #fff; background-color: #449d44; border-color: #255625; } .btn-success:hover { color: #fff; background-color: #449d44; border-color: #398439; } .btn-success:active, .btn-success.active, .open > .dropdown-toggle.btn-success { color: #fff; background-color: #449d44; border-color: #398439; } .btn-success:active:hover, .btn-success.active:hover, .open > .dropdown-toggle.btn-success:hover, .btn-success:active:focus, .btn-success.active:focus, .open > .dropdown-toggle.btn-success:focus, .btn-success:active.focus, .btn-success.active.focus, .open > .dropdown-toggle.btn-success.focus { color: #fff; background-color: #398439; border-color: #255625; } .btn-success:active, .btn-success.active, .open > .dropdown-toggle.btn-success { background-image: none; } .btn-success.disabled:hover, .btn-success[disabled]:hover, fieldset[disabled] .btn-success:hover, .btn-success.disabled:focus, .btn-success[disabled]:focus, fieldset[disabled] .btn-success:focus, .btn-success.disabled.focus, .btn-success[disabled].focus, fieldset[disabled] .btn-success.focus { background-color: #5cb85c; border-color: #4cae4c; } .btn-success .badge { color: #5cb85c; background-color: #fff; } .btn-info { color: #fff; background-color: #5bc0de; border-color: #46b8da; } .btn-info:focus, .btn-info.focus { color: #fff; background-color: #31b0d5; border-color: #1b6d85; } .btn-info:hover { color: #fff; background-color: #31b0d5; border-color: #269abc; } .btn-info:active, .btn-info.active, .open > .dropdown-toggle.btn-info { color: #fff; background-color: #31b0d5; border-color: #269abc; } .btn-info:active:hover, .btn-info.active:hover, .open > .dropdown-toggle.btn-info:hover, .btn-info:active:focus, .btn-info.active:focus, .open > .dropdown-toggle.btn-info:focus, .btn-info:active.focus, .btn-info.active.focus, .open > .dropdown-toggle.btn-info.focus { color: #fff; background-color: #269abc; border-color: #1b6d85; } .btn-info:active, .btn-info.active, .open > .dropdown-toggle.btn-info { background-image: none; } .btn-info.disabled:hover, .btn-info[disabled]:hover, fieldset[disabled] .btn-info:hover, .btn-info.disabled:focus, .btn-info[disabled]:focus, fieldset[disabled] .btn-info:focus, .btn-info.disabled.focus, .btn-info[disabled].focus, fieldset[disabled] .btn-info.focus { background-color: #5bc0de; border-color: #46b8da; } .btn-info .badge { color: #5bc0de; background-color: #fff; } .btn-warning { color: #fff; background-color: #f0ad4e; border-color: #eea236; } .btn-warning:focus, .btn-warning.focus { color: #fff; background-color: #ec971f; border-color: #985f0d; } .btn-warning:hover { color: #fff; background-color: #ec971f; border-color: #d58512; } .btn-warning:active, .btn-warning.active, .open > .dropdown-toggle.btn-warning { color: #fff; background-color: #ec971f; border-color: #d58512; } .btn-warning:active:hover, .btn-warning.active:hover, .open > .dropdown-toggle.btn-warning:hover, .btn-warning:active:focus, .btn-warning.active:focus, .open > .dropdown-toggle.btn-warning:focus, .btn-warning:active.focus, .btn-warning.active.focus, .open > .dropdown-toggle.btn-warning.focus { color: #fff; background-color: #d58512; border-color: #985f0d; } .btn-warning:active, .btn-warning.active, .open > .dropdown-toggle.btn-warning { background-image: none; } .btn-warning.disabled:hover, .btn-warning[disabled]:hover, fieldset[disabled] .btn-warning:hover, .btn-warning.disabled:focus, .btn-warning[disabled]:focus, fieldset[disabled] .btn-warning:focus, .btn-warning.disabled.focus, .btn-warning[disabled].focus, fieldset[disabled] .btn-warning.focus { background-color: #f0ad4e; border-color: #eea236; } .btn-warning .badge { color: #f0ad4e; background-color: #fff; } .btn-danger { color: #fff; background-color: #d9534f; border-color: #d43f3a; } .btn-danger:focus, .btn-danger.focus { color: #fff; background-color: #c9302c; border-color: #761c19; } .btn-danger:hover { color: #fff; background-color: #c9302c; border-color: #ac2925; } .btn-danger:active, .btn-danger.active, .open > .dropdown-toggle.btn-danger { color: #fff; background-color: #c9302c; border-color: #ac2925; } .btn-danger:active:hover, .btn-danger.active:hover, .open > .dropdown-toggle.btn-danger:hover, .btn-danger:active:focus, .btn-danger.active:focus, .open > .dropdown-toggle.btn-danger:focus, .btn-danger:active.focus, .btn-danger.active.focus, .open > .dropdown-toggle.btn-danger.focus { color: #fff; background-color: #ac2925; border-color: #761c19; } .btn-danger:active, .btn-danger.active, .open > .dropdown-toggle.btn-danger { background-image: none; } .btn-danger.disabled:hover, .btn-danger[disabled]:hover, fieldset[disabled] .btn-danger:hover, .btn-danger.disabled:focus, .btn-danger[disabled]:focus, fieldset[disabled] .btn-danger:focus, .btn-danger.disabled.focus, .btn-danger[disabled].focus, fieldset[disabled] .btn-danger.focus { background-color: #d9534f; border-color: #d43f3a; } .btn-danger .badge { color: #d9534f; background-color: #fff; } .btn-link { font-weight: normal; color: #337ab7; border-radius: 0; } .btn-link, .btn-link:active, .btn-link.active, .btn-link[disabled], fieldset[disabled] .btn-link { background-color: transparent; -webkit-box-shadow: none; box-shadow: none; } .btn-link, .btn-link:hover, .btn-link:focus, .btn-link:active { border-color: transparent; } .btn-link:hover, .btn-link:focus { color: #23527c; text-decoration: underline; background-color: transparent; } .btn-link[disabled]:hover, fieldset[disabled] .btn-link:hover, .btn-link[disabled]:focus, fieldset[disabled] .btn-link:focus { color: #777; text-decoration: none; } .btn-lg, .btn-group-lg > .btn { padding: 10px 16px; font-size: 18px; line-height: 1.3333333; border-radius: 6px; } .btn-sm, .btn-group-sm > .btn { padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } .btn-xs, .btn-group-xs > .btn { padding: 1px 5px; font-size: 12px; line-height: 1.5; border-radius: 3px; } .btn-block { display: block; width: 100%; } .btn-block + .btn-block { margin-top: 5px; } input[type="submit"].btn-block, input[type="reset"].btn-block, input[type="button"].btn-block { width: 100%; } .fade { opacity: 0; -webkit-transition: opacity .15s linear; -o-transition: opacity .15s linear; transition: opacity .15s linear; } .fade.in { opacity: 1; } .collapse { display: none; } .collapse.in { display: block; } tr.collapse.in { display: table-row; } tbody.collapse.in { display: table-row-group; } .collapsing { position: relative; height: 0; overflow: hidden; -webkit-transition-timing-function: ease; -o-transition-timing-function: ease; transition-timing-function: ease; -webkit-transition-duration: .35s; -o-transition-duration: .35s; transition-duration: .35s; -webkit-transition-property: height, visibility; -o-transition-property: height, visibility; transition-property: height, visibility; } .caret { display: inline-block; width: 0; height: 0; margin-left: 2px; vertical-align: middle; border-top: 4px dashed; border-top: 4px solid \9; border-right: 4px solid transparent; border-left: 4px solid transparent; } .dropup, .dropdown { position: relative; } .dropdown-toggle:focus { outline: 0; } .dropdown-menu { position: absolute; top: 100%; left: 0; z-index: 1000; display: none; float: left; min-width: 160px; padding: 5px 0; margin: 2px 0 0; font-size: 14px; text-align: left; list-style: none; background-color: #fff; -webkit-background-clip: padding-box; background-clip: padding-box; border: 1px solid #ccc; border: 1px solid rgba(0, 0, 0, .15); border-radius: 4px; -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175); box-shadow: 0 6px 12px rgba(0, 0, 0, .175); } .dropdown-menu.pull-right { right: 0; left: auto; } .dropdown-menu .divider { height: 1px; margin: 9px 0; overflow: hidden; background-color: #e5e5e5; } .dropdown-menu > li > a { display: block; padding: 3px 20px; clear: both; font-weight: normal; line-height: 1.42857143; color: #333; white-space: nowrap; } .dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus { color: #262626; text-decoration: none; background-color: #f5f5f5; } .dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus { color: #fff; text-decoration: none; background-color: #337ab7; outline: 0; } .dropdown-menu > .disabled > a, .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { color: #777; } .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { text-decoration: none; cursor: not-allowed; background-color: transparent; background-image: none; filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); } .open > .dropdown-menu { display: block; } .open > a { outline: 0; } .dropdown-menu-right { right: 0; left: auto; } .dropdown-menu-left { right: auto; left: 0; } .dropdown-header { display: block; padding: 3px 20px; font-size: 12px; line-height: 1.42857143; color: #777; white-space: nowrap; } .dropdown-backdrop { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 990; } .pull-right > .dropdown-menu { right: 0; left: auto; } .dropup .caret, .navbar-fixed-bottom .dropdown .caret { content: ""; border-top: 0; border-bottom: 4px dashed; border-bottom: 4px solid \9; } .dropup .dropdown-menu, .navbar-fixed-bottom .dropdown .dropdown-menu { top: auto; bottom: 100%; margin-bottom: 2px; } @media (min-width: 768px) { .navbar-right .dropdown-menu { right: 0; left: auto; } .navbar-right .dropdown-menu-left { right: auto; left: 0; } } .btn-group, .btn-group-vertical { position: relative; display: inline-block; vertical-align: middle; } .btn-group > .btn, .btn-group-vertical > .btn { position: relative; float: left; } .btn-group > .btn:hover, .btn-group-vertical > .btn:hover, .btn-group > .btn:focus, .btn-group-vertical > .btn:focus, .btn-group > .btn:active, .btn-group-vertical > .btn:active, .btn-group > .btn.active, .btn-group-vertical > .btn.active { z-index: 2; } .btn-group .btn + .btn, .btn-group .btn + .btn-group, .btn-group .btn-group + .btn, .btn-group .btn-group + .btn-group { margin-left: -1px; } .btn-toolbar { margin-left: -5px; } .btn-toolbar .btn, .btn-toolbar .btn-group, .btn-toolbar .input-group { float: left; } .btn-toolbar > .btn, .btn-toolbar > .btn-group, .btn-toolbar > .input-group { margin-left: 5px; } .btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { border-radius: 0; } .btn-group > .btn:first-child { margin-left: 0; } .btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { border-top-right-radius: 0; border-bottom-right-radius: 0; } .btn-group > .btn:last-child:not(:first-child), .btn-group > .dropdown-toggle:not(:first-child) { border-top-left-radius: 0; border-bottom-left-radius: 0; } .btn-group > .btn-group { float: left; } .btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { border-radius: 0; } .btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, .btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { border-top-right-radius: 0; border-bottom-right-radius: 0; } .btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { border-top-left-radius: 0; border-bottom-left-radius: 0; } .btn-group .dropdown-toggle:active, .btn-group.open .dropdown-toggle { outline: 0; } .btn-group > .btn + .dropdown-toggle { padding-right: 8px; padding-left: 8px; } .btn-group > .btn-lg + .dropdown-toggle { padding-right: 12px; padding-left: 12px; } .btn-group.open .dropdown-toggle { -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); } .btn-group.open .dropdown-toggle.btn-link { -webkit-box-shadow: none; box-shadow: none; } .btn .caret { margin-left: 0; } .btn-lg .caret { border-width: 5px 5px 0; border-bottom-width: 0; } .dropup .btn-lg .caret { border-width: 0 5px 5px; } .btn-group-vertical > .btn, .btn-group-vertical > .btn-group, .btn-group-vertical > .btn-group > .btn { display: block; float: none; width: 100%; max-width: 100%; } .btn-group-vertical > .btn-group > .btn { float: none; } .btn-group-vertical > .btn + .btn, .btn-group-vertical > .btn + .btn-group, .btn-group-vertical > .btn-group + .btn, .btn-group-vertical > .btn-group + .btn-group { margin-top: -1px; margin-left: 0; } .btn-group-vertical > .btn:not(:first-child):not(:last-child) { border-radius: 0; } .btn-group-vertical > .btn:first-child:not(:last-child) { border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .btn-group-vertical > .btn:last-child:not(:first-child) { border-top-left-radius: 0; border-top-right-radius: 0; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; } .btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { border-radius: 0; } .btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, .btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { border-top-left-radius: 0; border-top-right-radius: 0; } .btn-group-justified { display: table; width: 100%; table-layout: fixed; border-collapse: separate; } .btn-group-justified > .btn, .btn-group-justified > .btn-group { display: table-cell; float: none; width: 1%; } .btn-group-justified > .btn-group .btn { width: 100%; } .btn-group-justified > .btn-group .dropdown-menu { left: auto; } [data-toggle="buttons"] > .btn input[type="radio"], [data-toggle="buttons"] > .btn-group > .btn input[type="radio"], [data-toggle="buttons"] > .btn input[type="checkbox"], [data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { position: absolute; clip: rect(0, 0, 0, 0); pointer-events: none; } .input-group { position: relative; display: table; border-collapse: separate; } .input-group[class*="col-"] { float: none; padding-right: 0; padding-left: 0; } .input-group .form-control { position: relative; z-index: 2; float: left; width: 100%; margin-bottom: 0; } .input-group .form-control:focus { z-index: 3; } .input-group-lg > .form-control, .input-group-lg > .input-group-addon, .input-group-lg > .input-group-btn > .btn { height: 46px; padding: 10px 16px; font-size: 18px; line-height: 1.3333333; border-radius: 6px; } select.input-group-lg > .form-control, select.input-group-lg > .input-group-addon, select.input-group-lg > .input-group-btn > .btn { height: 46px; line-height: 46px; } textarea.input-group-lg > .form-control, textarea.input-group-lg > .input-group-addon, textarea.input-group-lg > .input-group-btn > .btn, select[multiple].input-group-lg > .form-control, select[multiple].input-group-lg > .input-group-addon, select[multiple].input-group-lg > .input-group-btn > .btn { height: auto; } .input-group-sm > .form-control, .input-group-sm > .input-group-addon, .input-group-sm > .input-group-btn > .btn { height: 30px; padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } select.input-group-sm > .form-control, select.input-group-sm > .input-group-addon, select.input-group-sm > .input-group-btn > .btn { height: 30px; line-height: 30px; } textarea.input-group-sm > .form-control, textarea.input-group-sm > .input-group-addon, textarea.input-group-sm > .input-group-btn > .btn, select[multiple].input-group-sm > .form-control, select[multiple].input-group-sm > .input-group-addon, select[multiple].input-group-sm > .input-group-btn > .btn { height: auto; } .input-group-addon, .input-group-btn, .input-group .form-control { display: table-cell; } .input-group-addon:not(:first-child):not(:last-child), .input-group-btn:not(:first-child):not(:last-child), .input-group .form-control:not(:first-child):not(:last-child) { border-radius: 0; } .input-group-addon, .input-group-btn { width: 1%; white-space: nowrap; vertical-align: middle; } .input-group-addon { padding: 6px 12px; font-size: 14px; font-weight: normal; line-height: 1; color: #555; text-align: center; background-color: #eee; border: 1px solid #ccc; border-radius: 4px; } .input-group-addon.input-sm { padding: 5px 10px; font-size: 12px; border-radius: 3px; } .input-group-addon.input-lg { padding: 10px 16px; font-size: 18px; border-radius: 6px; } .input-group-addon input[type="radio"], .input-group-addon input[type="checkbox"] { margin-top: 0; } .input-group .form-control:first-child, .input-group-addon:first-child, .input-group-btn:first-child > .btn, .input-group-btn:first-child > .btn-group > .btn, .input-group-btn:first-child > .dropdown-toggle, .input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), .input-group-btn:last-child > .btn-group:not(:last-child) > .btn { border-top-right-radius: 0; border-bottom-right-radius: 0; } .input-group-addon:first-child { border-right: 0; } .input-group .form-control:last-child, .input-group-addon:last-child, .input-group-btn:last-child > .btn, .input-group-btn:last-child > .btn-group > .btn, .input-group-btn:last-child > .dropdown-toggle, .input-group-btn:first-child > .btn:not(:first-child), .input-group-btn:first-child > .btn-group:not(:first-child) > .btn { border-top-left-radius: 0; border-bottom-left-radius: 0; } .input-group-addon:last-child { border-left: 0; } .input-group-btn { position: relative; font-size: 0; white-space: nowrap; } .input-group-btn > .btn { position: relative; } .input-group-btn > .btn + .btn { margin-left: -1px; } .input-group-btn > .btn:hover, .input-group-btn > .btn:focus, .input-group-btn > .btn:active { z-index: 2; } .input-group-btn:first-child > .btn, .input-group-btn:first-child > .btn-group { margin-right: -1px; } .input-group-btn:last-child > .btn, .input-group-btn:last-child > .btn-group { z-index: 2; margin-left: -1px; } .nav { padding-left: 0; margin-bottom: 0; list-style: none; } .nav > li { position: relative; display: block; } .nav > li > a { position: relative; display: block; padding: 10px 15px; } .nav > li > a:hover, .nav > li > a:focus { text-decoration: none; background-color: #eee; } .nav > li.disabled > a { color: #777; } .nav > li.disabled > a:hover, .nav > li.disabled > a:focus { color: #777; text-decoration: none; cursor: not-allowed; background-color: transparent; } .nav .open > a, .nav .open > a:hover, .nav .open > a:focus { background-color: #eee; border-color: #337ab7; } .nav .nav-divider { height: 1px; margin: 9px 0; overflow: hidden; background-color: #e5e5e5; } .nav > li > a > img { max-width: none; } .nav-tabs { border-bottom: 1px solid #ddd; } .nav-tabs > li { float: left; margin-bottom: -1px; } .nav-tabs > li > a { margin-right: 2px; line-height: 1.42857143; border: 1px solid transparent; border-radius: 4px 4px 0 0; } .nav-tabs > li > a:hover { border-color: #eee #eee #ddd; } .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus { color: #555; cursor: default; background-color: #fff; border: 1px solid #ddd; border-bottom-color: transparent; } .nav-tabs.nav-justified { width: 100%; border-bottom: 0; } .nav-tabs.nav-justified > li { float: none; } .nav-tabs.nav-justified > li > a { margin-bottom: 5px; text-align: center; } .nav-tabs.nav-justified > .dropdown .dropdown-menu { top: auto; left: auto; } @media (min-width: 768px) { .nav-tabs.nav-justified > li { display: table-cell; width: 1%; } .nav-tabs.nav-justified > li > a { margin-bottom: 0; } } .nav-tabs.nav-justified > li > a { margin-right: 0; border-radius: 4px; } .nav-tabs.nav-justified > .active > a, .nav-tabs.nav-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:focus { border: 1px solid #ddd; } @media (min-width: 768px) { .nav-tabs.nav-justified > li > a { border-bottom: 1px solid #ddd; border-radius: 4px 4px 0 0; } .nav-tabs.nav-justified > .active > a, .nav-tabs.nav-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:focus { border-bottom-color: #fff; } } .nav-pills > li { float: left; } .nav-pills > li > a { border-radius: 4px; } .nav-pills > li + li { margin-left: 2px; } .nav-pills > li.active > a, .nav-pills > li.active > a:hover, .nav-pills > li.active > a:focus { color: #fff; background-color: #337ab7; } .nav-stacked > li { float: none; } .nav-stacked > li + li { margin-top: 2px; margin-left: 0; } .nav-justified { width: 100%; } .nav-justified > li { float: none; } .nav-justified > li > a { margin-bottom: 5px; text-align: center; } .nav-justified > .dropdown .dropdown-menu { top: auto; left: auto; } @media (min-width: 768px) { .nav-justified > li { display: table-cell; width: 1%; } .nav-justified > li > a { margin-bottom: 0; } } .nav-tabs-justified { border-bottom: 0; } .nav-tabs-justified > li > a { margin-right: 0; border-radius: 4px; } .nav-tabs-justified > .active > a, .nav-tabs-justified > .active > a:hover, .nav-tabs-justified > .active > a:focus { border: 1px solid #ddd; } @media (min-width: 768px) { .nav-tabs-justified > li > a { border-bottom: 1px solid #ddd; border-radius: 4px 4px 0 0; } .nav-tabs-justified > .active > a, .nav-tabs-justified > .active > a:hover, .nav-tabs-justified > .active > a:focus { border-bottom-color: #fff; } } .tab-content > .tab-pane { display: none; } .tab-content > .active { display: block; } .nav-tabs .dropdown-menu { margin-top: -1px; border-top-left-radius: 0; border-top-right-radius: 0; } .navbar { position: relative; min-height: 50px; margin-bottom: 20px; border: 1px solid transparent; } @media (min-width: 768px) { .navbar { border-radius: 4px; } } @media (min-width: 768px) { .navbar-header { float: left; } } .navbar-collapse { padding-right: 15px; padding-left: 15px; overflow-x: visible; -webkit-overflow-scrolling: touch; border-top: 1px solid transparent; -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); } .navbar-collapse.in { overflow-y: auto; } @media (min-width: 768px) { .navbar-collapse { width: auto; border-top: 0; -webkit-box-shadow: none; box-shadow: none; } .navbar-collapse.collapse { display: block !important; height: auto !important; padding-bottom: 0; overflow: visible !important; } .navbar-collapse.in { overflow-y: visible; } .navbar-fixed-top .navbar-collapse, .navbar-static-top .navbar-collapse, .navbar-fixed-bottom .navbar-collapse { padding-right: 0; padding-left: 0; } } .navbar-fixed-top .navbar-collapse, .navbar-fixed-bottom .navbar-collapse { max-height: 340px; } @media (max-device-width: 480px) and (orientation: landscape) { .navbar-fixed-top .navbar-collapse, .navbar-fixed-bottom .navbar-collapse { max-height: 200px; } } .container > .navbar-header, .container-fluid > .navbar-header, .container > .navbar-collapse, .container-fluid > .navbar-collapse { margin-right: -15px; margin-left: -15px; } @media (min-width: 768px) { .container > .navbar-header, .container-fluid > .navbar-header, .container > .navbar-collapse, .container-fluid > .navbar-collapse { margin-right: 0; margin-left: 0; } } .navbar-static-top { z-index: 1000; border-width: 0 0 1px; } @media (min-width: 768px) { .navbar-static-top { border-radius: 0; } } .navbar-fixed-top, .navbar-fixed-bottom { position: fixed; right: 0; left: 0; z-index: 1030; } @media (min-width: 768px) { .navbar-fixed-top, .navbar-fixed-bottom { border-radius: 0; } } .navbar-fixed-top { top: 0; border-width: 0 0 1px; } .navbar-fixed-bottom { bottom: 0; margin-bottom: 0; border-width: 1px 0 0; } .navbar-brand { float: left; height: 50px; padding: 15px 15px; font-size: 18px; line-height: 20px; } .navbar-brand:hover, .navbar-brand:focus { text-decoration: none; } .navbar-brand > img { display: block; } @media (min-width: 768px) { .navbar > .container .navbar-brand, .navbar > .container-fluid .navbar-brand { margin-left: -15px; } } .navbar-toggle { position: relative; float: right; padding: 9px 10px; margin-top: 8px; margin-right: 15px; margin-bottom: 8px; background-color: transparent; background-image: none; border: 1px solid transparent; border-radius: 4px; } .navbar-toggle:focus { outline: 0; } .navbar-toggle .icon-bar { display: block; width: 22px; height: 2px; border-radius: 1px; } .navbar-toggle .icon-bar + .icon-bar { margin-top: 4px; } @media (min-width: 768px) { .navbar-toggle { display: none; } } .navbar-nav { margin: 7.5px -15px; } .navbar-nav > li > a { padding-top: 10px; padding-bottom: 10px; line-height: 20px; } @media (max-width: 767px) { .navbar-nav .open .dropdown-menu { position: static; float: none; width: auto; margin-top: 0; background-color: transparent; border: 0; -webkit-box-shadow: none; box-shadow: none; } .navbar-nav .open .dropdown-menu > li > a, .navbar-nav .open .dropdown-menu .dropdown-header { padding: 5px 15px 5px 25px; } .navbar-nav .open .dropdown-menu > li > a { line-height: 20px; } .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-nav .open .dropdown-menu > li > a:focus { background-image: none; } } @media (min-width: 768px) { .navbar-nav { float: left; margin: 0; } .navbar-nav > li { float: left; } .navbar-nav > li > a { padding-top: 15px; padding-bottom: 15px; } } .navbar-form { padding: 10px 15px; margin-top: 8px; margin-right: -15px; margin-bottom: 8px; margin-left: -15px; border-top: 1px solid transparent; border-bottom: 1px solid transparent; -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); } @media (min-width: 768px) { .navbar-form .form-group { display: inline-block; margin-bottom: 0; vertical-align: middle; } .navbar-form .form-control { display: inline-block; width: auto; vertical-align: middle; } .navbar-form .form-control-static { display: inline-block; } .navbar-form .input-group { display: inline-table; vertical-align: middle; } .navbar-form .input-group .input-group-addon, .navbar-form .input-group .input-group-btn, .navbar-form .input-group .form-control { width: auto; } .navbar-form .input-group > .form-control { width: 100%; } .navbar-form .control-label { margin-bottom: 0; vertical-align: middle; } .navbar-form .radio, .navbar-form .checkbox { display: inline-block; margin-top: 0; margin-bottom: 0; vertical-align: middle; } .navbar-form .radio label, .navbar-form .checkbox label { padding-left: 0; } .navbar-form .radio input[type="radio"], .navbar-form .checkbox input[type="checkbox"] { position: relative; margin-left: 0; } .navbar-form .has-feedback .form-control-feedback { top: 0; } } @media (max-width: 767px) { .navbar-form .form-group { margin-bottom: 5px; } .navbar-form .form-group:last-child { margin-bottom: 0; } } @media (min-width: 768px) { .navbar-form { width: auto; padding-top: 0; padding-bottom: 0; margin-right: 0; margin-left: 0; border: 0; -webkit-box-shadow: none; box-shadow: none; } } .navbar-nav > li > .dropdown-menu { margin-top: 0; border-top-left-radius: 0; border-top-right-radius: 0; } .navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { margin-bottom: 0; border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .navbar-btn { margin-top: 8px; margin-bottom: 8px; } .navbar-btn.btn-sm { margin-top: 10px; margin-bottom: 10px; } .navbar-btn.btn-xs { margin-top: 14px; margin-bottom: 14px; } .navbar-text { margin-top: 15px; margin-bottom: 15px; } @media (min-width: 768px) { .navbar-text { float: left; margin-right: 15px; margin-left: 15px; } } @media (min-width: 768px) { .navbar-left { float: left !important; } .navbar-right { float: right !important; margin-right: -15px; } .navbar-right ~ .navbar-right { margin-right: 0; } } .navbar-default { background-color: #f8f8f8; border-color: #e7e7e7; } .navbar-default .navbar-brand { color: #777; } .navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus { color: #5e5e5e; background-color: transparent; } .navbar-default .navbar-text { color: #777; } .navbar-default .navbar-nav > li > a { color: #777; } .navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus { color: #333; background-color: transparent; } .navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus { color: #555; background-color: #e7e7e7; } .navbar-default .navbar-nav > .disabled > a, .navbar-default .navbar-nav > .disabled > a:hover, .navbar-default .navbar-nav > .disabled > a:focus { color: #ccc; background-color: transparent; } .navbar-default .navbar-toggle { border-color: #ddd; } .navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus { background-color: #ddd; } .navbar-default .navbar-toggle .icon-bar { background-color: #888; } .navbar-default .navbar-collapse, .navbar-default .navbar-form { border-color: #e7e7e7; } .navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus { color: #555; background-color: #e7e7e7; } @media (max-width: 767px) { .navbar-default .navbar-nav .open .dropdown-menu > li > a { color: #777; } .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { color: #333; background-color: transparent; } .navbar-default .navbar-nav .open .dropdown-menu > .active > a, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { color: #555; background-color: #e7e7e7; } .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { color: #ccc; background-color: transparent; } } .navbar-default .navbar-link { color: #777; } .navbar-default .navbar-link:hover { color: #333; } .navbar-default .btn-link { color: #777; } .navbar-default .btn-link:hover, .navbar-default .btn-link:focus { color: #333; } .navbar-default .btn-link[disabled]:hover, fieldset[disabled] .navbar-default .btn-link:hover, .navbar-default .btn-link[disabled]:focus, fieldset[disabled] .navbar-default .btn-link:focus { color: #ccc; } .navbar-inverse { background-color: #222; border-color: #080808; } .navbar-inverse .navbar-brand { color: #9d9d9d; } .navbar-inverse .navbar-brand:hover, .navbar-inverse .navbar-brand:focus { color: #fff; background-color: transparent; } .navbar-inverse .navbar-text { color: #9d9d9d; } .navbar-inverse .navbar-nav > li > a { color: #9d9d9d; } .navbar-inverse .navbar-nav > li > a:hover, .navbar-inverse .navbar-nav > li > a:focus { color: #fff; background-color: transparent; } .navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus { color: #fff; background-color: #080808; } .navbar-inverse .navbar-nav > .disabled > a, .navbar-inverse .navbar-nav > .disabled > a:hover, .navbar-inverse .navbar-nav > .disabled > a:focus { color: #444; background-color: transparent; } .navbar-inverse .navbar-toggle { border-color: #333; } .navbar-inverse .navbar-toggle:hover, .navbar-inverse .navbar-toggle:focus { background-color: #333; } .navbar-inverse .navbar-toggle .icon-bar { background-color: #fff; } .navbar-inverse .navbar-collapse, .navbar-inverse .navbar-form { border-color: #101010; } .navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus { color: #fff; background-color: #080808; } @media (max-width: 767px) { .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { border-color: #080808; } .navbar-inverse .navbar-nav .open .dropdown-menu .divider { background-color: #080808; } .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { color: #9d9d9d; } .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { color: #fff; background-color: transparent; } .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { color: #fff; background-color: #080808; } .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { color: #444; background-color: transparent; } } .navbar-inverse .navbar-link { color: #9d9d9d; } .navbar-inverse .navbar-link:hover { color: #fff; } .navbar-inverse .btn-link { color: #9d9d9d; } .navbar-inverse .btn-link:hover, .navbar-inverse .btn-link:focus { color: #fff; } .navbar-inverse .btn-link[disabled]:hover, fieldset[disabled] .navbar-inverse .btn-link:hover, .navbar-inverse .btn-link[disabled]:focus, fieldset[disabled] .navbar-inverse .btn-link:focus { color: #444; } .breadcrumb { padding: 8px 15px; margin-bottom: 20px; list-style: none; background-color: #f5f5f5; border-radius: 4px; } .breadcrumb > li { display: inline-block; } .breadcrumb > li + li:before { padding: 0 5px; color: #ccc; content: "/\00a0"; } .breadcrumb > .active { color: #777; } .pagination { display: inline-block; padding-left: 0; margin: 20px 0; border-radius: 4px; } .pagination > li { display: inline; } .pagination > li > a, .pagination > li > span { position: relative; float: left; padding: 6px 12px; margin-left: -1px; line-height: 1.42857143; color: #337ab7; text-decoration: none; background-color: #fff; border: 1px solid #ddd; } .pagination > li:first-child > a, .pagination > li:first-child > span { margin-left: 0; border-top-left-radius: 4px; border-bottom-left-radius: 4px; } .pagination > li:last-child > a, .pagination > li:last-child > span { border-top-right-radius: 4px; border-bottom-right-radius: 4px; } .pagination > li > a:hover, .pagination > li > span:hover, .pagination > li > a:focus, .pagination > li > span:focus { z-index: 2; color: #23527c; background-color: #eee; border-color: #ddd; } .pagination > .active > a, .pagination > .active > span, .pagination > .active > a:hover, .pagination > .active > span:hover, .pagination > .active > a:focus, .pagination > .active > span:focus { z-index: 3; color: #fff; cursor: default; background-color: #337ab7; border-color: #337ab7; } .pagination > .disabled > span, .pagination > .disabled > span:hover, .pagination > .disabled > span:focus, .pagination > .disabled > a, .pagination > .disabled > a:hover, .pagination > .disabled > a:focus { color: #777; cursor: not-allowed; background-color: #fff; border-color: #ddd; } .pagination-lg > li > a, .pagination-lg > li > span { padding: 10px 16px; font-size: 18px; line-height: 1.3333333; } .pagination-lg > li:first-child > a, .pagination-lg > li:first-child > span { border-top-left-radius: 6px; border-bottom-left-radius: 6px; } .pagination-lg > li:last-child > a, .pagination-lg > li:last-child > span { border-top-right-radius: 6px; border-bottom-right-radius: 6px; } .pagination-sm > li > a, .pagination-sm > li > span { padding: 5px 10px; font-size: 12px; line-height: 1.5; } .pagination-sm > li:first-child > a, .pagination-sm > li:first-child > span { border-top-left-radius: 3px; border-bottom-left-radius: 3px; } .pagination-sm > li:last-child > a, .pagination-sm > li:last-child > span { border-top-right-radius: 3px; border-bottom-right-radius: 3px; } .pager { padding-left: 0; margin: 20px 0; text-align: center; list-style: none; } .pager li { display: inline; } .pager li > a, .pager li > span { display: inline-block; padding: 5px 14px; background-color: #fff; border: 1px solid #ddd; border-radius: 15px; } .pager li > a:hover, .pager li > a:focus { text-decoration: none; background-color: #eee; } .pager .next > a, .pager .next > span { float: right; } .pager .previous > a, .pager .previous > span { float: left; } .pager .disabled > a, .pager .disabled > a:hover, .pager .disabled > a:focus, .pager .disabled > span { color: #777; cursor: not-allowed; background-color: #fff; } .label { display: inline; padding: .2em .6em .3em; font-size: 75%; font-weight: bold; line-height: 1; color: #fff; text-align: center; white-space: nowrap; vertical-align: baseline; border-radius: .25em; } a.label:hover, a.label:focus { color: #fff; text-decoration: none; cursor: pointer; } .label:empty { display: none; } .btn .label { position: relative; top: -1px; } .label-default { background-color: #777; } .label-default[href]:hover, .label-default[href]:focus { background-color: #5e5e5e; } .label-primary { background-color: #337ab7; } .label-primary[href]:hover, .label-primary[href]:focus { background-color: #286090; } .label-success { background-color: #5cb85c; } .label-success[href]:hover, .label-success[href]:focus { background-color: #449d44; } .label-info { background-color: #5bc0de; } .label-info[href]:hover, .label-info[href]:focus { background-color: #31b0d5; } .label-warning { background-color: #f0ad4e; } .label-warning[href]:hover, .label-warning[href]:focus { background-color: #ec971f; } .label-danger { background-color: #d9534f; } .label-danger[href]:hover, .label-danger[href]:focus { background-color: #c9302c; } .badge { display: inline-block; min-width: 10px; padding: 3px 7px; font-size: 12px; font-weight: bold; line-height: 1; color: #fff; text-align: center; white-space: nowrap; vertical-align: middle; background-color: #777; border-radius: 10px; } .badge:empty { display: none; } .btn .badge { position: relative; top: -1px; } .btn-xs .badge, .btn-group-xs > .btn .badge { top: 0; padding: 1px 5px; } a.badge:hover, a.badge:focus { color: #fff; text-decoration: none; cursor: pointer; } .list-group-item.active > .badge, .nav-pills > .active > a > .badge { color: #337ab7; background-color: #fff; } .list-group-item > .badge { float: right; } .list-group-item > .badge + .badge { margin-right: 5px; } .nav-pills > li > a > .badge { margin-left: 3px; } .jumbotron { padding-top: 30px; padding-bottom: 30px; margin-bottom: 30px; color: inherit; background-color: #eee; } .jumbotron h1, .jumbotron .h1 { color: inherit; } .jumbotron p { margin-bottom: 15px; font-size: 21px; font-weight: 200; } .jumbotron > hr { border-top-color: #d5d5d5; } .container .jumbotron, .container-fluid .jumbotron { padding-right: 15px; padding-left: 15px; border-radius: 6px; } .jumbotron .container { max-width: 100%; } @media screen and (min-width: 768px) { .jumbotron { padding-top: 48px; padding-bottom: 48px; } .container .jumbotron, .container-fluid .jumbotron { padding-right: 60px; padding-left: 60px; } .jumbotron h1, .jumbotron .h1 { font-size: 63px; } } .thumbnail { display: block; padding: 4px; margin-bottom: 20px; line-height: 1.42857143; background-color: #fff; border: 1px solid #ddd; border-radius: 4px; -webkit-transition: border .2s ease-in-out; -o-transition: border .2s ease-in-out; transition: border .2s ease-in-out; } .thumbnail > img, .thumbnail a > img { margin-right: auto; margin-left: auto; } a.thumbnail:hover, a.thumbnail:focus, a.thumbnail.active { border-color: #337ab7; } .thumbnail .caption { padding: 9px; color: #333; } .alert { padding: 15px; margin-bottom: 20px; border: 1px solid transparent; border-radius: 4px; } .alert h4 { margin-top: 0; color: inherit; } .alert .alert-link { font-weight: bold; } .alert > p, .alert > ul { margin-bottom: 0; } .alert > p + p { margin-top: 5px; } .alert-dismissable, .alert-dismissible { padding-right: 35px; } .alert-dismissable .close, .alert-dismissible .close { position: relative; top: -2px; right: -21px; color: inherit; } .alert-success { color: #3c763d; background-color: #dff0d8; border-color: #d6e9c6; } .alert-success hr { border-top-color: #c9e2b3; } .alert-success .alert-link { color: #2b542c; } .alert-info { color: #31708f; background-color: #d9edf7; border-color: #bce8f1; } .alert-info hr { border-top-color: #a6e1ec; } .alert-info .alert-link { color: #245269; } .alert-warning { color: #8a6d3b; background-color: #fcf8e3; border-color: #faebcc; } .alert-warning hr { border-top-color: #f7e1b5; } .alert-warning .alert-link { color: #66512c; } .alert-danger { color: #a94442; background-color: #f2dede; border-color: #ebccd1; } .alert-danger hr { border-top-color: #e4b9c0; } .alert-danger .alert-link { color: #843534; } @-webkit-keyframes progress-bar-stripes { from { background-position: 40px 0; } to { background-position: 0 0; } } @-o-keyframes progress-bar-stripes { from { background-position: 40px 0; } to { background-position: 0 0; } } @keyframes progress-bar-stripes { from { background-position: 40px 0; } to { background-position: 0 0; } } .progress { height: 20px; margin-bottom: 20px; overflow: hidden; background-color: #f5f5f5; border-radius: 4px; -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); } .progress-bar { float: left; width: 0; height: 100%; font-size: 12px; line-height: 20px; color: #fff; text-align: center; background-color: #337ab7; -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); -webkit-transition: width .6s ease; -o-transition: width .6s ease; transition: width .6s ease; } .progress-striped .progress-bar, .progress-bar-striped { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); -webkit-background-size: 40px 40px; background-size: 40px 40px; } .progress.active .progress-bar, .progress-bar.active { -webkit-animation: progress-bar-stripes 2s linear infinite; -o-animation: progress-bar-stripes 2s linear infinite; animation: progress-bar-stripes 2s linear infinite; } .progress-bar-success { background-color: #5cb85c; } .progress-striped .progress-bar-success { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); } .progress-bar-info { background-color: #5bc0de; } .progress-striped .progress-bar-info { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); } .progress-bar-warning { background-color: #f0ad4e; } .progress-striped .progress-bar-warning { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); } .progress-bar-danger { background-color: #d9534f; } .progress-striped .progress-bar-danger { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); } .media { margin-top: 15px; } .media:first-child { margin-top: 0; } .media, .media-body { overflow: hidden; zoom: 1; } .media-body { width: 10000px; } .media-object { display: block; } .media-object.img-thumbnail { max-width: none; } .media-right, .media > .pull-right { padding-left: 10px; } .media-left, .media > .pull-left { padding-right: 10px; } .media-left, .media-right, .media-body { display: table-cell; vertical-align: top; } .media-middle { vertical-align: middle; } .media-bottom { vertical-align: bottom; } .media-heading { margin-top: 0; margin-bottom: 5px; } .media-list { padding-left: 0; list-style: none; } .list-group { padding-left: 0; margin-bottom: 20px; } .list-group-item { position: relative; display: block; padding: 10px 15px; margin-bottom: -1px; background-color: #fff; border: 1px solid #ddd; } .list-group-item:first-child { border-top-left-radius: 4px; border-top-right-radius: 4px; } .list-group-item:last-child { margin-bottom: 0; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; } a.list-group-item, button.list-group-item { color: #555; } a.list-group-item .list-group-item-heading, button.list-group-item .list-group-item-heading { color: #333; } a.list-group-item:hover, button.list-group-item:hover, a.list-group-item:focus, button.list-group-item:focus { color: #555; text-decoration: none; background-color: #f5f5f5; } button.list-group-item { width: 100%; text-align: left; } .list-group-item.disabled, .list-group-item.disabled:hover, .list-group-item.disabled:focus { color: #777; cursor: not-allowed; background-color: #eee; } .list-group-item.disabled .list-group-item-heading, .list-group-item.disabled:hover .list-group-item-heading, .list-group-item.disabled:focus .list-group-item-heading { color: inherit; } .list-group-item.disabled .list-group-item-text, .list-group-item.disabled:hover .list-group-item-text, .list-group-item.disabled:focus .list-group-item-text { color: #777; } .list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus { z-index: 2; color: #fff; background-color: #337ab7; border-color: #337ab7; } .list-group-item.active .list-group-item-heading, .list-group-item.active:hover .list-group-item-heading, .list-group-item.active:focus .list-group-item-heading, .list-group-item.active .list-group-item-heading > small, .list-group-item.active:hover .list-group-item-heading > small, .list-group-item.active:focus .list-group-item-heading > small, .list-group-item.active .list-group-item-heading > .small, .list-group-item.active:hover .list-group-item-heading > .small, .list-group-item.active:focus .list-group-item-heading > .small { color: inherit; } .list-group-item.active .list-group-item-text, .list-group-item.active:hover .list-group-item-text, .list-group-item.active:focus .list-group-item-text { color: #c7ddef; } .list-group-item-success { color: #3c763d; background-color: #dff0d8; } a.list-group-item-success, button.list-group-item-success { color: #3c763d; } a.list-group-item-success .list-group-item-heading, button.list-group-item-success .list-group-item-heading { color: inherit; } a.list-group-item-success:hover, button.list-group-item-success:hover, a.list-group-item-success:focus, button.list-group-item-success:focus { color: #3c763d; background-color: #d0e9c6; } a.list-group-item-success.active, button.list-group-item-success.active, a.list-group-item-success.active:hover, button.list-group-item-success.active:hover, a.list-group-item-success.active:focus, button.list-group-item-success.active:focus { color: #fff; background-color: #3c763d; border-color: #3c763d; } .list-group-item-info { color: #31708f; background-color: #d9edf7; } a.list-group-item-info, button.list-group-item-info { color: #31708f; } a.list-group-item-info .list-group-item-heading, button.list-group-item-info .list-group-item-heading { color: inherit; } a.list-group-item-info:hover, button.list-group-item-info:hover, a.list-group-item-info:focus, button.list-group-item-info:focus { color: #31708f; background-color: #c4e3f3; } a.list-group-item-info.active, button.list-group-item-info.active, a.list-group-item-info.active:hover, button.list-group-item-info.active:hover, a.list-group-item-info.active:focus, button.list-group-item-info.active:focus { color: #fff; background-color: #31708f; border-color: #31708f; } .list-group-item-warning { color: #8a6d3b; background-color: #fcf8e3; } a.list-group-item-warning, button.list-group-item-warning { color: #8a6d3b; } a.list-group-item-warning .list-group-item-heading, button.list-group-item-warning .list-group-item-heading { color: inherit; } a.list-group-item-warning:hover, button.list-group-item-warning:hover, a.list-group-item-warning:focus, button.list-group-item-warning:focus { color: #8a6d3b; background-color: #faf2cc; } a.list-group-item-warning.active, button.list-group-item-warning.active, a.list-group-item-warning.active:hover, button.list-group-item-warning.active:hover, a.list-group-item-warning.active:focus, button.list-group-item-warning.active:focus { color: #fff; background-color: #8a6d3b; border-color: #8a6d3b; } .list-group-item-danger { color: #a94442; background-color: #f2dede; } a.list-group-item-danger, button.list-group-item-danger { color: #a94442; } a.list-group-item-danger .list-group-item-heading, button.list-group-item-danger .list-group-item-heading { color: inherit; } a.list-group-item-danger:hover, button.list-group-item-danger:hover, a.list-group-item-danger:focus, button.list-group-item-danger:focus { color: #a94442; background-color: #ebcccc; } a.list-group-item-danger.active, button.list-group-item-danger.active, a.list-group-item-danger.active:hover, button.list-group-item-danger.active:hover, a.list-group-item-danger.active:focus, button.list-group-item-danger.active:focus { color: #fff; background-color: #a94442; border-color: #a94442; } .list-group-item-heading { margin-top: 0; margin-bottom: 5px; } .list-group-item-text { margin-bottom: 0; line-height: 1.3; } .panel { margin-bottom: 20px; background-color: #fff; border: 1px solid transparent; border-radius: 4px; -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05); box-shadow: 0 1px 1px rgba(0, 0, 0, .05); } .panel-body { padding: 15px; } .panel-heading { padding: 10px 15px; border-bottom: 1px solid transparent; border-top-left-radius: 3px; border-top-right-radius: 3px; } .panel-heading > .dropdown .dropdown-toggle { color: inherit; } .panel-title { margin-top: 0; margin-bottom: 0; font-size: 16px; color: inherit; } .panel-title > a, .panel-title > small, .panel-title > .small, .panel-title > small > a, .panel-title > .small > a { color: inherit; } .panel-footer { padding: 10px 15px; background-color: #f5f5f5; border-top: 1px solid #ddd; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } .panel > .list-group, .panel > .panel-collapse > .list-group { margin-bottom: 0; } .panel > .list-group .list-group-item, .panel > .panel-collapse > .list-group .list-group-item { border-width: 1px 0; border-radius: 0; } .panel > .list-group:first-child .list-group-item:first-child, .panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { border-top: 0; border-top-left-radius: 3px; border-top-right-radius: 3px; } .panel > .list-group:last-child .list-group-item:last-child, .panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { border-bottom: 0; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } .panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child { border-top-left-radius: 0; border-top-right-radius: 0; } .panel-heading + .list-group .list-group-item:first-child { border-top-width: 0; } .list-group + .panel-footer { border-top-width: 0; } .panel > .table, .panel > .table-responsive > .table, .panel > .panel-collapse > .table { margin-bottom: 0; } .panel > .table caption, .panel > .table-responsive > .table caption, .panel > .panel-collapse > .table caption { padding-right: 15px; padding-left: 15px; } .panel > .table:first-child, .panel > .table-responsive:first-child > .table:first-child { border-top-left-radius: 3px; border-top-right-radius: 3px; } .panel > .table:first-child > thead:first-child > tr:first-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, .panel > .table:first-child > tbody:first-child > tr:first-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { border-top-left-radius: 3px; border-top-right-radius: 3px; } .panel > .table:first-child > thead:first-child > tr:first-child td:first-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, .panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, .panel > .table:first-child > thead:first-child > tr:first-child th:first-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, .panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { border-top-left-radius: 3px; } .panel > .table:first-child > thead:first-child > tr:first-child td:last-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, .panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, .panel > .table:first-child > thead:first-child > tr:first-child th:last-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, .panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { border-top-right-radius: 3px; } .panel > .table:last-child, .panel > .table-responsive:last-child > .table:last-child { border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } .panel > .table:last-child > tbody:last-child > tr:last-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, .panel > .table:last-child > tfoot:last-child > tr:last-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } .panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, .panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, .panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, .panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { border-bottom-left-radius: 3px; } .panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, .panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, .panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, .panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { border-bottom-right-radius: 3px; } .panel > .panel-body + .table, .panel > .panel-body + .table-responsive, .panel > .table + .panel-body, .panel > .table-responsive + .panel-body { border-top: 1px solid #ddd; } .panel > .table > tbody:first-child > tr:first-child th, .panel > .table > tbody:first-child > tr:first-child td { border-top: 0; } .panel > .table-bordered, .panel > .table-responsive > .table-bordered { border: 0; } .panel > .table-bordered > thead > tr > th:first-child, .panel > .table-responsive > .table-bordered > thead > tr > th:first-child, .panel > .table-bordered > tbody > tr > th:first-child, .panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, .panel > .table-bordered > tfoot > tr > th:first-child, .panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, .panel > .table-bordered > thead > tr > td:first-child, .panel > .table-responsive > .table-bordered > thead > tr > td:first-child, .panel > .table-bordered > tbody > tr > td:first-child, .panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, .panel > .table-bordered > tfoot > tr > td:first-child, .panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { border-left: 0; } .panel > .table-bordered > thead > tr > th:last-child, .panel > .table-responsive > .table-bordered > thead > tr > th:last-child, .panel > .table-bordered > tbody > tr > th:last-child, .panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, .panel > .table-bordered > tfoot > tr > th:last-child, .panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, .panel > .table-bordered > thead > tr > td:last-child, .panel > .table-responsive > .table-bordered > thead > tr > td:last-child, .panel > .table-bordered > tbody > tr > td:last-child, .panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, .panel > .table-bordered > tfoot > tr > td:last-child, .panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { border-right: 0; } .panel > .table-bordered > thead > tr:first-child > td, .panel > .table-responsive > .table-bordered > thead > tr:first-child > td, .panel > .table-bordered > tbody > tr:first-child > td, .panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, .panel > .table-bordered > thead > tr:first-child > th, .panel > .table-responsive > .table-bordered > thead > tr:first-child > th, .panel > .table-bordered > tbody > tr:first-child > th, .panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { border-bottom: 0; } .panel > .table-bordered > tbody > tr:last-child > td, .panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, .panel > .table-bordered > tfoot > tr:last-child > td, .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, .panel > .table-bordered > tbody > tr:last-child > th, .panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, .panel > .table-bordered > tfoot > tr:last-child > th, .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { border-bottom: 0; } .panel > .table-responsive { margin-bottom: 0; border: 0; } .panel-group { margin-bottom: 20px; } .panel-group .panel { margin-bottom: 0; border-radius: 4px; } .panel-group .panel + .panel { margin-top: 5px; } .panel-group .panel-heading { border-bottom: 0; } .panel-group .panel-heading + .panel-collapse > .panel-body, .panel-group .panel-heading + .panel-collapse > .list-group { border-top: 1px solid #ddd; } .panel-group .panel-footer { border-top: 0; } .panel-group .panel-footer + .panel-collapse .panel-body { border-bottom: 1px solid #ddd; } .panel-default { border-color: #ddd; } .panel-default > .panel-heading { color: #333; background-color: #f5f5f5; border-color: #ddd; } .panel-default > .panel-heading + .panel-collapse > .panel-body { border-top-color: #ddd; } .panel-default > .panel-heading .badge { color: #f5f5f5; background-color: #333; } .panel-default > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #ddd; } .panel-primary { border-color: #337ab7; } .panel-primary > .panel-heading { color: #fff; background-color: #337ab7; border-color: #337ab7; } .panel-primary > .panel-heading + .panel-collapse > .panel-body { border-top-color: #337ab7; } .panel-primary > .panel-heading .badge { color: #337ab7; background-color: #fff; } .panel-primary > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #337ab7; } .panel-success { border-color: #d6e9c6; } .panel-success > .panel-heading { color: #3c763d; background-color: #dff0d8; border-color: #d6e9c6; } .panel-success > .panel-heading + .panel-collapse > .panel-body { border-top-color: #d6e9c6; } .panel-success > .panel-heading .badge { color: #dff0d8; background-color: #3c763d; } .panel-success > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #d6e9c6; } .panel-info { border-color: #bce8f1; } .panel-info > .panel-heading { color: #31708f; background-color: #d9edf7; border-color: #bce8f1; } .panel-info > .panel-heading + .panel-collapse > .panel-body { border-top-color: #bce8f1; } .panel-info > .panel-heading .badge { color: #d9edf7; background-color: #31708f; } .panel-info > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #bce8f1; } .panel-warning { border-color: #faebcc; } .panel-warning > .panel-heading { color: #8a6d3b; background-color: #fcf8e3; border-color: #faebcc; } .panel-warning > .panel-heading + .panel-collapse > .panel-body { border-top-color: #faebcc; } .panel-warning > .panel-heading .badge { color: #fcf8e3; background-color: #8a6d3b; } .panel-warning > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #faebcc; } .panel-danger { border-color: #ebccd1; } .panel-danger > .panel-heading { color: #a94442; background-color: #f2dede; border-color: #ebccd1; } .panel-danger > .panel-heading + .panel-collapse > .panel-body { border-top-color: #ebccd1; } .panel-danger > .panel-heading .badge { color: #f2dede; background-color: #a94442; } .panel-danger > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #ebccd1; } .embed-responsive { position: relative; display: block; height: 0; padding: 0; overflow: hidden; } .embed-responsive .embed-responsive-item, .embed-responsive iframe, .embed-responsive embed, .embed-responsive object, .embed-responsive video { position: absolute; top: 0; bottom: 0; left: 0; width: 100%; height: 100%; border: 0; } .embed-responsive-16by9 { padding-bottom: 56.25%; } .embed-responsive-4by3 { padding-bottom: 75%; } .well { min-height: 20px; padding: 19px; margin-bottom: 20px; background-color: #f5f5f5; border: 1px solid #e3e3e3; border-radius: 4px; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); } .well blockquote { border-color: #ddd; border-color: rgba(0, 0, 0, .15); } .well-lg { padding: 24px; border-radius: 6px; } .well-sm { padding: 9px; border-radius: 3px; } .close { float: right; font-size: 21px; font-weight: bold; line-height: 1; color: #000; text-shadow: 0 1px 0 #fff; filter: alpha(opacity=20); opacity: .2; } .close:hover, .close:focus { color: #000; text-decoration: none; cursor: pointer; filter: alpha(opacity=50); opacity: .5; } button.close { -webkit-appearance: none; padding: 0; cursor: pointer; background: transparent; border: 0; } .modal-open { overflow: hidden; } .modal { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1050; display: none; overflow: hidden; -webkit-overflow-scrolling: touch; outline: 0; } .modal.fade .modal-dialog { -webkit-transition: -webkit-transform .3s ease-out; -o-transition: -o-transform .3s ease-out; transition: transform .3s ease-out; -webkit-transform: translate(0, -25%); -ms-transform: translate(0, -25%); -o-transform: translate(0, -25%); transform: translate(0, -25%); } .modal.in .modal-dialog { -webkit-transform: translate(0, 0); -ms-transform: translate(0, 0); -o-transform: translate(0, 0); transform: translate(0, 0); } .modal-open .modal { overflow-x: hidden; overflow-y: auto; } .modal-dialog { position: relative; width: auto; margin: 10px; } .modal-content { position: relative; background-color: #fff; -webkit-background-clip: padding-box; background-clip: padding-box; border: 1px solid #999; border: 1px solid rgba(0, 0, 0, .2); border-radius: 6px; outline: 0; -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5); box-shadow: 0 3px 9px rgba(0, 0, 0, .5); } .modal-backdrop { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1040; background-color: #000; } .modal-backdrop.fade { filter: alpha(opacity=0); opacity: 0; } .modal-backdrop.in { filter: alpha(opacity=50); opacity: .5; } .modal-header { padding: 15px; border-bottom: 1px solid #e5e5e5; } .modal-header .close { margin-top: -2px; } .modal-title { margin: 0; line-height: 1.42857143; } .modal-body { position: relative; padding: 15px; } .modal-footer { padding: 15px; text-align: right; border-top: 1px solid #e5e5e5; } .modal-footer .btn + .btn { margin-bottom: 0; margin-left: 5px; } .modal-footer .btn-group .btn + .btn { margin-left: -1px; } .modal-footer .btn-block + .btn-block { margin-left: 0; } .modal-scrollbar-measure { position: absolute; top: -9999px; width: 50px; height: 50px; overflow: scroll; } @media (min-width: 768px) { .modal-dialog { width: 600px; margin: 30px auto; } .modal-content { -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5); box-shadow: 0 5px 15px rgba(0, 0, 0, .5); } .modal-sm { width: 300px; } } @media (min-width: 992px) { .modal-lg { width: 900px; } } .tooltip { position: absolute; z-index: 1070; display: block; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 12px; font-style: normal; font-weight: normal; line-height: 1.42857143; text-align: left; text-align: start; text-decoration: none; text-shadow: none; text-transform: none; letter-spacing: normal; word-break: normal; word-spacing: normal; word-wrap: normal; white-space: normal; filter: alpha(opacity=0); opacity: 0; line-break: auto; } .tooltip.in { filter: alpha(opacity=90); opacity: .9; } .tooltip.top { padding: 5px 0; margin-top: -3px; } .tooltip.right { padding: 0 5px; margin-left: 3px; } .tooltip.bottom { padding: 5px 0; margin-top: 3px; } .tooltip.left { padding: 0 5px; margin-left: -3px; } .tooltip-inner { max-width: 200px; padding: 3px 8px; color: #fff; text-align: center; background-color: #000; border-radius: 4px; } .tooltip-arrow { position: absolute; width: 0; height: 0; border-color: transparent; border-style: solid; } .tooltip.top .tooltip-arrow { bottom: 0; left: 50%; margin-left: -5px; border-width: 5px 5px 0; border-top-color: #000; } .tooltip.top-left .tooltip-arrow { right: 5px; bottom: 0; margin-bottom: -5px; border-width: 5px 5px 0; border-top-color: #000; } .tooltip.top-right .tooltip-arrow { bottom: 0; left: 5px; margin-bottom: -5px; border-width: 5px 5px 0; border-top-color: #000; } .tooltip.right .tooltip-arrow { top: 50%; left: 0; margin-top: -5px; border-width: 5px 5px 5px 0; border-right-color: #000; } .tooltip.left .tooltip-arrow { top: 50%; right: 0; margin-top: -5px; border-width: 5px 0 5px 5px; border-left-color: #000; } .tooltip.bottom .tooltip-arrow { top: 0; left: 50%; margin-left: -5px; border-width: 0 5px 5px; border-bottom-color: #000; } .tooltip.bottom-left .tooltip-arrow { top: 0; right: 5px; margin-top: -5px; border-width: 0 5px 5px; border-bottom-color: #000; } .tooltip.bottom-right .tooltip-arrow { top: 0; left: 5px; margin-top: -5px; border-width: 0 5px 5px; border-bottom-color: #000; } .popover { position: absolute; top: 0; left: 0; z-index: 1060; display: none; max-width: 276px; padding: 1px; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; font-style: normal; font-weight: normal; line-height: 1.42857143; text-align: left; text-align: start; text-decoration: none; text-shadow: none; text-transform: none; letter-spacing: normal; word-break: normal; word-spacing: normal; word-wrap: normal; white-space: normal; background-color: #fff; -webkit-background-clip: padding-box; background-clip: padding-box; border: 1px solid #ccc; border: 1px solid rgba(0, 0, 0, .2); border-radius: 6px; -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2); box-shadow: 0 5px 10px rgba(0, 0, 0, .2); line-break: auto; } .popover.top { margin-top: -10px; } .popover.right { margin-left: 10px; } .popover.bottom { margin-top: 10px; } .popover.left { margin-left: -10px; } .popover-title { padding: 8px 14px; margin: 0; font-size: 14px; background-color: #f7f7f7; border-bottom: 1px solid #ebebeb; border-radius: 5px 5px 0 0; } .popover-content { padding: 9px 14px; } .popover > .arrow, .popover > .arrow:after { position: absolute; display: block; width: 0; height: 0; border-color: transparent; border-style: solid; } .popover > .arrow { border-width: 11px; } .popover > .arrow:after { content: ""; border-width: 10px; } .popover.top > .arrow { bottom: -11px; left: 50%; margin-left: -11px; border-top-color: #999; border-top-color: rgba(0, 0, 0, .25); border-bottom-width: 0; } .popover.top > .arrow:after { bottom: 1px; margin-left: -10px; content: " "; border-top-color: #fff; border-bottom-width: 0; } .popover.right > .arrow { top: 50%; left: -11px; margin-top: -11px; border-right-color: #999; border-right-color: rgba(0, 0, 0, .25); border-left-width: 0; } .popover.right > .arrow:after { bottom: -10px; left: 1px; content: " "; border-right-color: #fff; border-left-width: 0; } .popover.bottom > .arrow { top: -11px; left: 50%; margin-left: -11px; border-top-width: 0; border-bottom-color: #999; border-bottom-color: rgba(0, 0, 0, .25); } .popover.bottom > .arrow:after { top: 1px; margin-left: -10px; content: " "; border-top-width: 0; border-bottom-color: #fff; } .popover.left > .arrow { top: 50%; right: -11px; margin-top: -11px; border-right-width: 0; border-left-color: #999; border-left-color: rgba(0, 0, 0, .25); } .popover.left > .arrow:after { right: 1px; bottom: -10px; content: " "; border-right-width: 0; border-left-color: #fff; } .carousel { position: relative; } .carousel-inner { position: relative; width: 100%; overflow: hidden; } .carousel-inner > .item { position: relative; display: none; -webkit-transition: .6s ease-in-out left; -o-transition: .6s ease-in-out left; transition: .6s ease-in-out left; } .carousel-inner > .item > img, .carousel-inner > .item > a > img { line-height: 1; } @media all and (transform-3d), (-webkit-transform-3d) { .carousel-inner > .item { -webkit-transition: -webkit-transform .6s ease-in-out; -o-transition: -o-transform .6s ease-in-out; transition: transform .6s ease-in-out; -webkit-backface-visibility: hidden; backface-visibility: hidden; -webkit-perspective: 1000px; perspective: 1000px; } .carousel-inner > .item.next, .carousel-inner > .item.active.right { left: 0; -webkit-transform: translate3d(100%, 0, 0); transform: translate3d(100%, 0, 0); } .carousel-inner > .item.prev, .carousel-inner > .item.active.left { left: 0; -webkit-transform: translate3d(-100%, 0, 0); transform: translate3d(-100%, 0, 0); } .carousel-inner > .item.next.left, .carousel-inner > .item.prev.right, .carousel-inner > .item.active { left: 0; -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); } } .carousel-inner > .active, .carousel-inner > .next, .carousel-inner > .prev { display: block; } .carousel-inner > .active { left: 0; } .carousel-inner > .next, .carousel-inner > .prev { position: absolute; top: 0; width: 100%; } .carousel-inner > .next { left: 100%; } .carousel-inner > .prev { left: -100%; } .carousel-inner > .next.left, .carousel-inner > .prev.right { left: 0; } .carousel-inner > .active.left { left: -100%; } .carousel-inner > .active.right { left: 100%; } .carousel-control { position: absolute; top: 0; bottom: 0; left: 0; width: 15%; font-size: 20px; color: #fff; text-align: center; text-shadow: 0 1px 2px rgba(0, 0, 0, .6); background-color: rgba(0, 0, 0, 0); filter: alpha(opacity=50); opacity: .5; } .carousel-control.left { background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001))); background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); background-repeat: repeat-x; } .carousel-control.right { right: 0; left: auto; background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); background-image: -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5))); background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); background-repeat: repeat-x; } .carousel-control:hover, .carousel-control:focus { color: #fff; text-decoration: none; filter: alpha(opacity=90); outline: 0; opacity: .9; } .carousel-control .icon-prev, .carousel-control .icon-next, .carousel-control .glyphicon-chevron-left, .carousel-control .glyphicon-chevron-right { position: absolute; top: 50%; z-index: 5; display: inline-block; margin-top: -10px; } .carousel-control .icon-prev, .carousel-control .glyphicon-chevron-left { left: 50%; margin-left: -10px; } .carousel-control .icon-next, .carousel-control .glyphicon-chevron-right { right: 50%; margin-right: -10px; } .carousel-control .icon-prev, .carousel-control .icon-next { width: 20px; height: 20px; font-family: serif; line-height: 1; } .carousel-control .icon-prev:before { content: '\2039'; } .carousel-control .icon-next:before { content: '\203a'; } .carousel-indicators { position: absolute; bottom: 10px; left: 50%; z-index: 15; width: 60%; padding-left: 0; margin-left: -30%; text-align: center; list-style: none; } .carousel-indicators li { display: inline-block; width: 10px; height: 10px; margin: 1px; text-indent: -999px; cursor: pointer; background-color: #000 \9; background-color: rgba(0, 0, 0, 0); border: 1px solid #fff; border-radius: 10px; } .carousel-indicators .active { width: 12px; height: 12px; margin: 0; background-color: #fff; } .carousel-caption { position: absolute; right: 15%; bottom: 20px; left: 15%; z-index: 10; padding-top: 20px; padding-bottom: 20px; color: #fff; text-align: center; text-shadow: 0 1px 2px rgba(0, 0, 0, .6); } .carousel-caption .btn { text-shadow: none; } @media screen and (min-width: 768px) { .carousel-control .glyphicon-chevron-left, .carousel-control .glyphicon-chevron-right, .carousel-control .icon-prev, .carousel-control .icon-next { width: 30px; height: 30px; margin-top: -10px; font-size: 30px; } .carousel-control .glyphicon-chevron-left, .carousel-control .icon-prev { margin-left: -10px; } .carousel-control .glyphicon-chevron-right, .carousel-control .icon-next { margin-right: -10px; } .carousel-caption { right: 20%; left: 20%; padding-bottom: 30px; } .carousel-indicators { bottom: 20px; } } .clearfix:before, .clearfix:after, .dl-horizontal dd:before, .dl-horizontal dd:after, .container:before, .container:after, .container-fluid:before, .container-fluid:after, .row:before, .row:after, .form-horizontal .form-group:before, .form-horizontal .form-group:after, .btn-toolbar:before, .btn-toolbar:after, .btn-group-vertical > .btn-group:before, .btn-group-vertical > .btn-group:after, .nav:before, .nav:after, .navbar:before, .navbar:after, .navbar-header:before, .navbar-header:after, .navbar-collapse:before, .navbar-collapse:after, .pager:before, .pager:after, .panel-body:before, .panel-body:after, .modal-header:before, .modal-header:after, .modal-footer:before, .modal-footer:after { display: table; content: " "; } .clearfix:after, .dl-horizontal dd:after, .container:after, .container-fluid:after, .row:after, .form-horizontal .form-group:after, .btn-toolbar:after, .btn-group-vertical > .btn-group:after, .nav:after, .navbar:after, .navbar-header:after, .navbar-collapse:after, .pager:after, .panel-body:after, .modal-header:after, .modal-footer:after { clear: both; } .center-block { display: block; margin-right: auto; margin-left: auto; } .pull-right { float: right !important; } .pull-left { float: left !important; } .hide { display: none !important; } .show { display: block !important; } .invisible { visibility: hidden; } .text-hide { font: 0/0 a; color: transparent; text-shadow: none; background-color: transparent; border: 0; } .hidden { display: none !important; } .affix { position: fixed; } @-ms-viewport { width: device-width; } .visible-xs, .visible-sm, .visible-md, .visible-lg { display: none !important; } .visible-xs-block, .visible-xs-inline, .visible-xs-inline-block, .visible-sm-block, .visible-sm-inline, .visible-sm-inline-block, .visible-md-block, .visible-md-inline, .visible-md-inline-block, .visible-lg-block, .visible-lg-inline, .visible-lg-inline-block { display: none !important; } @media (max-width: 767px) { .visible-xs { display: block !important; } table.visible-xs { display: table !important; } tr.visible-xs { display: table-row !important; } th.visible-xs, td.visible-xs { display: table-cell !important; } } @media (max-width: 767px) { .visible-xs-block { display: block !important; } } @media (max-width: 767px) { .visible-xs-inline { display: inline !important; } } @media (max-width: 767px) { .visible-xs-inline-block { display: inline-block !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-sm { display: block !important; } table.visible-sm { display: table !important; } tr.visible-sm { display: table-row !important; } th.visible-sm, td.visible-sm { display: table-cell !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-sm-block { display: block !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-sm-inline { display: inline !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-sm-inline-block { display: inline-block !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-md { display: block !important; } table.visible-md { display: table !important; } tr.visible-md { display: table-row !important; } th.visible-md, td.visible-md { display: table-cell !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-md-block { display: block !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-md-inline { display: inline !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-md-inline-block { display: inline-block !important; } } @media (min-width: 1200px) { .visible-lg { display: block !important; } table.visible-lg { display: table !important; } tr.visible-lg { display: table-row !important; } th.visible-lg, td.visible-lg { display: table-cell !important; } } @media (min-width: 1200px) { .visible-lg-block { display: block !important; } } @media (min-width: 1200px) { .visible-lg-inline { display: inline !important; } } @media (min-width: 1200px) { .visible-lg-inline-block { display: inline-block !important; } } @media (max-width: 767px) { .hidden-xs { display: none !important; } } @media (min-width: 768px) and (max-width: 991px) { .hidden-sm { display: none !important; } } @media (min-width: 992px) and (max-width: 1199px) { .hidden-md { display: none !important; } } @media (min-width: 1200px) { .hidden-lg { display: none !important; } } .visible-print { display: none !important; } @media print { .visible-print { display: block !important; } table.visible-print { display: table !important; } tr.visible-print { display: table-row !important; } th.visible-print, td.visible-print { display: table-cell !important; } } .visible-print-block { display: none !important; } @media print { .visible-print-block { display: block !important; } } .visible-print-inline { display: none !important; } @media print { .visible-print-inline { display: inline !important; } } .visible-print-inline-block { display: none !important; } @media print { .visible-print-inline-block { display: inline-block !important; } } @media print { .hidden-print { display: none !important; } } /*# sourceMappingURL=bootstrap.css.map */ glewlwyd-1.3.1/webapp/css/bootstrap.css.map000066400000000000000000013702471322667720100207470ustar00rootroot00000000000000{"version":3,"sources":["bootstrap.css","less/normalize.less","less/print.less","less/glyphicons.less","less/scaffolding.less","less/mixins/vendor-prefixes.less","less/mixins/tab-focus.less","less/mixins/image.less","less/type.less","less/mixins/text-emphasis.less","less/mixins/background-variant.less","less/mixins/text-overflow.less","less/code.less","less/grid.less","less/mixins/grid.less","less/mixins/grid-framework.less","less/tables.less","less/mixins/table-row.less","less/forms.less","less/mixins/forms.less","less/buttons.less","less/mixins/buttons.less","less/mixins/opacity.less","less/component-animations.less","less/dropdowns.less","less/mixins/nav-divider.less","less/mixins/reset-filter.less","less/button-groups.less","less/mixins/border-radius.less","less/input-groups.less","less/navs.less","less/navbar.less","less/mixins/nav-vertical-align.less","less/utilities.less","less/breadcrumbs.less","less/pagination.less","less/mixins/pagination.less","less/pager.less","less/labels.less","less/mixins/labels.less","less/badges.less","less/jumbotron.less","less/thumbnails.less","less/alerts.less","less/mixins/alerts.less","less/progress-bars.less","less/mixins/gradients.less","less/mixins/progress-bar.less","less/media.less","less/list-group.less","less/mixins/list-group.less","less/panels.less","less/mixins/panels.less","less/responsive-embed.less","less/wells.less","less/close.less","less/modals.less","less/tooltip.less","less/mixins/reset-text.less","less/popovers.less","less/carousel.less","less/mixins/clearfix.less","less/mixins/center-block.less","less/mixins/hide-text.less","less/responsive-utilities.less","less/mixins/responsive-visibility.less"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,4EAA4E;ACG5E;EACE,wBAAA;EACA,2BAAA;EACA,+BAAA;CDDD;ACQD;EACE,UAAA;CDND;ACmBD;;;;;;;;;;;;;EAaE,eAAA;CDjBD;ACyBD;;;;EAIE,sBAAA;EACA,yBAAA;CDvBD;AC+BD;EACE,cAAA;EACA,UAAA;CD7BD;ACqCD;;EAEE,cAAA;CDnCD;AC6CD;EACE,8BAAA;CD3CD;ACmDD;;EAEE,WAAA;CDjDD;AC2DD;EACE,0BAAA;CDzDD;ACgED;;EAEE,kBAAA;CD9DD;ACqED;EACE,mBAAA;CDnED;AC2ED;EACE,eAAA;EACA,iBAAA;CDzED;ACgFD;EACE,iBAAA;EACA,YAAA;CD9ED;ACqFD;EACE,eAAA;CDnFD;AC0FD;;EAEE,eAAA;EACA,eAAA;EACA,mBAAA;EACA,yBAAA;CDxFD;AC2FD;EACE,YAAA;CDzFD;AC4FD;EACE,gBAAA;CD1FD;ACoGD;EACE,UAAA;CDlGD;ACyGD;EACE,iBAAA;CDvGD;ACiHD;EACE,iBAAA;CD/GD;ACsHD;EACE,gCAAA;KAAA,6BAAA;UAAA,wBAAA;EACA,UAAA;CDpHD;AC2HD;EACE,eAAA;CDzHD;ACgID;;;;EAIE,kCAAA;EACA,eAAA;CD9HD;ACgJD;;;;;EAKE,eAAA;EACA,cAAA;EACA,UAAA;CD9ID;ACqJD;EACE,kBAAA;CDnJD;AC6JD;;EAEE,qBAAA;CD3JD;ACsKD;;;;EAIE,2BAAA;EACA,gBAAA;CDpKD;AC2KD;;EAEE,gBAAA;CDzKD;ACgLD;;EAEE,UAAA;EACA,WAAA;CD9KD;ACsLD;EACE,oBAAA;CDpLD;AC+LD;;EAEE,+BAAA;KAAA,4BAAA;UAAA,uBAAA;EACA,WAAA;CD7LD;ACsMD;;EAEE,aAAA;CDpMD;AC4MD;EACE,8BAAA;EACA,gCAAA;KAAA,6BAAA;UAAA,wBAAA;CD1MD;ACmND;;EAEE,yBAAA;CDjND;ACwND;EACE,0BAAA;EACA,cAAA;EACA,+BAAA;CDtND;AC8ND;EACE,UAAA;EACA,WAAA;CD5ND;ACmOD;EACE,eAAA;CDjOD;ACyOD;EACE,kBAAA;CDvOD;ACiPD;EACE,0BAAA;EACA,kBAAA;CD/OD;ACkPD;;EAEE,WAAA;CDhPD;AACD,qFAAqF;AElFrF;EA7FI;;;IAGI,mCAAA;IACA,uBAAA;IACA,oCAAA;YAAA,4BAAA;IACA,6BAAA;GFkLL;EE/KC;;IAEI,2BAAA;GFiLL;EE9KC;IACI,6BAAA;GFgLL;EE7KC;IACI,8BAAA;GF+KL;EE1KC;;IAEI,YAAA;GF4KL;EEzKC;;IAEI,uBAAA;IACA,yBAAA;GF2KL;EExKC;IACI,4BAAA;GF0KL;EEvKC;;IAEI,yBAAA;GFyKL;EEtKC;IACI,2BAAA;GFwKL;EErKC;;;IAGI,WAAA;IACA,UAAA;GFuKL;EEpKC;;IAEI,wBAAA;GFsKL;EEhKC;IACI,cAAA;GFkKL;EEhKC;;IAGQ,kCAAA;GFiKT;EE9JC;IACI,uBAAA;GFgKL;EE7JC;IACI,qCAAA;GF+JL;EEhKC;;IAKQ,kCAAA;GF+JT;EE5JC;;IAGQ,kCAAA;GF6JT;CACF;AGnPD;EACE,oCAAA;EACA,sDAAA;EACA,gYAAA;CHqPD;AG7OD;EACE,mBAAA;EACA,SAAA;EACA,sBAAA;EACA,oCAAA;EACA,mBAAA;EACA,oBAAA;EACA,eAAA;EACA,oCAAA;EACA,mCAAA;CH+OD;AG3OmC;EAAW,iBAAA;CH8O9C;AG7OmC;EAAW,iBAAA;CHgP9C;AG9OmC;;EAAW,iBAAA;CHkP9C;AGjPmC;EAAW,iBAAA;CHoP9C;AGnPmC;EAAW,iBAAA;CHsP9C;AGrPmC;EAAW,iBAAA;CHwP9C;AGvPmC;EAAW,iBAAA;CH0P9C;AGzPmC;EAAW,iBAAA;CH4P9C;AG3PmC;EAAW,iBAAA;CH8P9C;AG7PmC;EAAW,iBAAA;CHgQ9C;AG/PmC;EAAW,iBAAA;CHkQ9C;AGjQmC;EAAW,iBAAA;CHoQ9C;AGnQmC;EAAW,iBAAA;CHsQ9C;AGrQmC;EAAW,iBAAA;CHwQ9C;AGvQmC;EAAW,iBAAA;CH0Q9C;AGzQmC;EAAW,iBAAA;CH4Q9C;AG3QmC;EAAW,iBAAA;CH8Q9C;AG7QmC;EAAW,iBAAA;CHgR9C;AG/QmC;EAAW,iBAAA;CHkR9C;AGjRmC;EAAW,iBAAA;CHoR9C;AGnRmC;EAAW,iBAAA;CHsR9C;AGrRmC;EAAW,iBAAA;CHwR9C;AGvRmC;EAAW,iBAAA;CH0R9C;AGzRmC;EAAW,iBAAA;CH4R9C;AG3RmC;EAAW,iBAAA;CH8R9C;AG7RmC;EAAW,iBAAA;CHgS9C;AG/RmC;EAAW,iBAAA;CHkS9C;AGjSmC;EAAW,iBAAA;CHoS9C;AGnSmC;EAAW,iBAAA;CHsS9C;AGrSmC;EAAW,iBAAA;CHwS9C;AGvSmC;EAAW,iBAAA;CH0S9C;AGzSmC;EAAW,iBAAA;CH4S9C;AG3SmC;EAAW,iBAAA;CH8S9C;AG7SmC;EAAW,iBAAA;CHgT9C;AG/SmC;EAAW,iBAAA;CHkT9C;AGjTmC;EAAW,iBAAA;CHoT9C;AGnTmC;EAAW,iBAAA;CHsT9C;AGrTmC;EAAW,iBAAA;CHwT9C;AGvTmC;EAAW,iBAAA;CH0T9C;AGzTmC;EAAW,iBAAA;CH4T9C;AG3TmC;EAAW,iBAAA;CH8T9C;AG7TmC;EAAW,iBAAA;CHgU9C;AG/TmC;EAAW,iBAAA;CHkU9C;AGjUmC;EAAW,iBAAA;CHoU9C;AGnUmC;EAAW,iBAAA;CHsU9C;AGrUmC;EAAW,iBAAA;CHwU9C;AGvUmC;EAAW,iBAAA;CH0U9C;AGzUmC;EAAW,iBAAA;CH4U9C;AG3UmC;EAAW,iBAAA;CH8U9C;AG7UmC;EAAW,iBAAA;CHgV9C;AG/UmC;EAAW,iBAAA;CHkV9C;AGjVmC;EAAW,iBAAA;CHoV9C;AGnVmC;EAAW,iBAAA;CHsV9C;AGrVmC;EAAW,iBAAA;CHwV9C;AGvVmC;EAAW,iBAAA;CH0V9C;AGzVmC;EAAW,iBAAA;CH4V9C;AG3VmC;EAAW,iBAAA;CH8V9C;AG7VmC;EAAW,iBAAA;CHgW9C;AG/VmC;EAAW,iBAAA;CHkW9C;AGjWmC;EAAW,iBAAA;CHoW9C;AGnWmC;EAAW,iBAAA;CHsW9C;AGrWmC;EAAW,iBAAA;CHwW9C;AGvWmC;EAAW,iBAAA;CH0W9C;AGzWmC;EAAW,iBAAA;CH4W9C;AG3WmC;EAAW,iBAAA;CH8W9C;AG7WmC;EAAW,iBAAA;CHgX9C;AG/WmC;EAAW,iBAAA;CHkX9C;AGjXmC;EAAW,iBAAA;CHoX9C;AGnXmC;EAAW,iBAAA;CHsX9C;AGrXmC;EAAW,iBAAA;CHwX9C;AGvXmC;EAAW,iBAAA;CH0X9C;AGzXmC;EAAW,iBAAA;CH4X9C;AG3XmC;EAAW,iBAAA;CH8X9C;AG7XmC;EAAW,iBAAA;CHgY9C;AG/XmC;EAAW,iBAAA;CHkY9C;AGjYmC;EAAW,iBAAA;CHoY9C;AGnYmC;EAAW,iBAAA;CHsY9C;AGrYmC;EAAW,iBAAA;CHwY9C;AGvYmC;EAAW,iBAAA;CH0Y9C;AGzYmC;EAAW,iBAAA;CH4Y9C;AG3YmC;EAAW,iBAAA;CH8Y9C;AG7YmC;EAAW,iBAAA;CHgZ9C;AG/YmC;EAAW,iBAAA;CHkZ9C;AGjZmC;EAAW,iBAAA;CHoZ9C;AGnZmC;EAAW,iBAAA;CHsZ9C;AGrZmC;EAAW,iBAAA;CHwZ9C;AGvZmC;EAAW,iBAAA;CH0Z9C;AGzZmC;EAAW,iBAAA;CH4Z9C;AG3ZmC;EAAW,iBAAA;CH8Z9C;AG7ZmC;EAAW,iBAAA;CHga9C;AG/ZmC;EAAW,iBAAA;CHka9C;AGjamC;EAAW,iBAAA;CHoa9C;AGnamC;EAAW,iBAAA;CHsa9C;AGramC;EAAW,iBAAA;CHwa9C;AGvamC;EAAW,iBAAA;CH0a9C;AGzamC;EAAW,iBAAA;CH4a9C;AG3amC;EAAW,iBAAA;CH8a9C;AG7amC;EAAW,iBAAA;CHgb9C;AG/amC;EAAW,iBAAA;CHkb9C;AGjbmC;EAAW,iBAAA;CHob9C;AGnbmC;EAAW,iBAAA;CHsb9C;AGrbmC;EAAW,iBAAA;CHwb9C;AGvbmC;EAAW,iBAAA;CH0b9C;AGzbmC;EAAW,iBAAA;CH4b9C;AG3bmC;EAAW,iBAAA;CH8b9C;AG7bmC;EAAW,iBAAA;CHgc9C;AG/bmC;EAAW,iBAAA;CHkc9C;AGjcmC;EAAW,iBAAA;CHoc9C;AGncmC;EAAW,iBAAA;CHsc9C;AGrcmC;EAAW,iBAAA;CHwc9C;AGvcmC;EAAW,iBAAA;CH0c9C;AGzcmC;EAAW,iBAAA;CH4c9C;AG3cmC;EAAW,iBAAA;CH8c9C;AG7cmC;EAAW,iBAAA;CHgd9C;AG/cmC;EAAW,iBAAA;CHkd9C;AGjdmC;EAAW,iBAAA;CHod9C;AGndmC;EAAW,iBAAA;CHsd9C;AGrdmC;EAAW,iBAAA;CHwd9C;AGvdmC;EAAW,iBAAA;CH0d9C;AGzdmC;EAAW,iBAAA;CH4d9C;AG3dmC;EAAW,iBAAA;CH8d9C;AG7dmC;EAAW,iBAAA;CHge9C;AG/dmC;EAAW,iBAAA;CHke9C;AGjemC;EAAW,iBAAA;CHoe9C;AGnemC;EAAW,iBAAA;CHse9C;AGremC;EAAW,iBAAA;CHwe9C;AGvemC;EAAW,iBAAA;CH0e9C;AGzemC;EAAW,iBAAA;CH4e9C;AG3emC;EAAW,iBAAA;CH8e9C;AG7emC;EAAW,iBAAA;CHgf9C;AG/emC;EAAW,iBAAA;CHkf9C;AGjfmC;EAAW,iBAAA;CHof9C;AGnfmC;EAAW,iBAAA;CHsf9C;AGrfmC;EAAW,iBAAA;CHwf9C;AGvfmC;EAAW,iBAAA;CH0f9C;AGzfmC;EAAW,iBAAA;CH4f9C;AG3fmC;EAAW,iBAAA;CH8f9C;AG7fmC;EAAW,iBAAA;CHggB9C;AG/fmC;EAAW,iBAAA;CHkgB9C;AGjgBmC;EAAW,iBAAA;CHogB9C;AGngBmC;EAAW,iBAAA;CHsgB9C;AGrgBmC;EAAW,iBAAA;CHwgB9C;AGvgBmC;EAAW,iBAAA;CH0gB9C;AGzgBmC;EAAW,iBAAA;CH4gB9C;AG3gBmC;EAAW,iBAAA;CH8gB9C;AG7gBmC;EAAW,iBAAA;CHghB9C;AG/gBmC;EAAW,iBAAA;CHkhB9C;AGjhBmC;EAAW,iBAAA;CHohB9C;AGnhBmC;EAAW,iBAAA;CHshB9C;AGrhBmC;EAAW,iBAAA;CHwhB9C;AGvhBmC;EAAW,iBAAA;CH0hB9C;AGzhBmC;EAAW,iBAAA;CH4hB9C;AG3hBmC;EAAW,iBAAA;CH8hB9C;AG7hBmC;EAAW,iBAAA;CHgiB9C;AG/hBmC;EAAW,iBAAA;CHkiB9C;AGjiBmC;EAAW,iBAAA;CHoiB9C;AGniBmC;EAAW,iBAAA;CHsiB9C;AGriBmC;EAAW,iBAAA;CHwiB9C;AGviBmC;EAAW,iBAAA;CH0iB9C;AGziBmC;EAAW,iBAAA;CH4iB9C;AG3iBmC;EAAW,iBAAA;CH8iB9C;AG7iBmC;EAAW,iBAAA;CHgjB9C;AG/iBmC;EAAW,iBAAA;CHkjB9C;AGjjBmC;EAAW,iBAAA;CHojB9C;AGnjBmC;EAAW,iBAAA;CHsjB9C;AGrjBmC;EAAW,iBAAA;CHwjB9C;AGvjBmC;EAAW,iBAAA;CH0jB9C;AGzjBmC;EAAW,iBAAA;CH4jB9C;AG3jBmC;EAAW,iBAAA;CH8jB9C;AG7jBmC;EAAW,iBAAA;CHgkB9C;AG/jBmC;EAAW,iBAAA;CHkkB9C;AGjkBmC;EAAW,iBAAA;CHokB9C;AGnkBmC;EAAW,iBAAA;CHskB9C;AGrkBmC;EAAW,iBAAA;CHwkB9C;AGvkBmC;EAAW,iBAAA;CH0kB9C;AGzkBmC;EAAW,iBAAA;CH4kB9C;AG3kBmC;EAAW,iBAAA;CH8kB9C;AG7kBmC;EAAW,iBAAA;CHglB9C;AG/kBmC;EAAW,iBAAA;CHklB9C;AGjlBmC;EAAW,iBAAA;CHolB9C;AGnlBmC;EAAW,iBAAA;CHslB9C;AGrlBmC;EAAW,iBAAA;CHwlB9C;AGvlBmC;EAAW,iBAAA;CH0lB9C;AGzlBmC;EAAW,iBAAA;CH4lB9C;AG3lBmC;EAAW,iBAAA;CH8lB9C;AG7lBmC;EAAW,iBAAA;CHgmB9C;AG/lBmC;EAAW,iBAAA;CHkmB9C;AGjmBmC;EAAW,iBAAA;CHomB9C;AGnmBmC;EAAW,iBAAA;CHsmB9C;AGrmBmC;EAAW,iBAAA;CHwmB9C;AGvmBmC;EAAW,iBAAA;CH0mB9C;AGzmBmC;EAAW,iBAAA;CH4mB9C;AG3mBmC;EAAW,iBAAA;CH8mB9C;AG7mBmC;EAAW,iBAAA;CHgnB9C;AG/mBmC;EAAW,iBAAA;CHknB9C;AGjnBmC;EAAW,iBAAA;CHonB9C;AGnnBmC;EAAW,iBAAA;CHsnB9C;AGrnBmC;EAAW,iBAAA;CHwnB9C;AGvnBmC;EAAW,iBAAA;CH0nB9C;AGznBmC;EAAW,iBAAA;CH4nB9C;AG3nBmC;EAAW,iBAAA;CH8nB9C;AG7nBmC;EAAW,iBAAA;CHgoB9C;AG/nBmC;EAAW,iBAAA;CHkoB9C;AGjoBmC;EAAW,iBAAA;CHooB9C;AGnoBmC;EAAW,iBAAA;CHsoB9C;AGroBmC;EAAW,iBAAA;CHwoB9C;AG/nBmC;EAAW,iBAAA;CHkoB9C;AGjoBmC;EAAW,iBAAA;CHooB9C;AGnoBmC;EAAW,iBAAA;CHsoB9C;AGroBmC;EAAW,iBAAA;CHwoB9C;AGvoBmC;EAAW,iBAAA;CH0oB9C;AGzoBmC;EAAW,iBAAA;CH4oB9C;AG3oBmC;EAAW,iBAAA;CH8oB9C;AG7oBmC;EAAW,iBAAA;CHgpB9C;AG/oBmC;EAAW,iBAAA;CHkpB9C;AGjpBmC;EAAW,iBAAA;CHopB9C;AGnpBmC;EAAW,iBAAA;CHspB9C;AGrpBmC;EAAW,iBAAA;CHwpB9C;AGvpBmC;EAAW,iBAAA;CH0pB9C;AGzpBmC;EAAW,iBAAA;CH4pB9C;AG3pBmC;EAAW,iBAAA;CH8pB9C;AG7pBmC;EAAW,iBAAA;CHgqB9C;AG/pBmC;EAAW,iBAAA;CHkqB9C;AGjqBmC;EAAW,iBAAA;CHoqB9C;AGnqBmC;EAAW,iBAAA;CHsqB9C;AGrqBmC;EAAW,iBAAA;CHwqB9C;AGvqBmC;EAAW,iBAAA;CH0qB9C;AGzqBmC;EAAW,iBAAA;CH4qB9C;AG3qBmC;EAAW,iBAAA;CH8qB9C;AG7qBmC;EAAW,iBAAA;CHgrB9C;AG/qBmC;EAAW,iBAAA;CHkrB9C;AGjrBmC;EAAW,iBAAA;CHorB9C;AGnrBmC;EAAW,iBAAA;CHsrB9C;AGrrBmC;EAAW,iBAAA;CHwrB9C;AGvrBmC;EAAW,iBAAA;CH0rB9C;AGzrBmC;EAAW,iBAAA;CH4rB9C;AG3rBmC;EAAW,iBAAA;CH8rB9C;AG7rBmC;EAAW,iBAAA;CHgsB9C;AG/rBmC;EAAW,iBAAA;CHksB9C;AGjsBmC;EAAW,iBAAA;CHosB9C;AGnsBmC;EAAW,iBAAA;CHssB9C;AGrsBmC;EAAW,iBAAA;CHwsB9C;AGvsBmC;EAAW,iBAAA;CH0sB9C;AGzsBmC;EAAW,iBAAA;CH4sB9C;AG3sBmC;EAAW,iBAAA;CH8sB9C;AG7sBmC;EAAW,iBAAA;CHgtB9C;AG/sBmC;EAAW,iBAAA;CHktB9C;AGjtBmC;EAAW,iBAAA;CHotB9C;AGntBmC;EAAW,iBAAA;CHstB9C;AGrtBmC;EAAW,iBAAA;CHwtB9C;AGvtBmC;EAAW,iBAAA;CH0tB9C;AGztBmC;EAAW,iBAAA;CH4tB9C;AG3tBmC;EAAW,iBAAA;CH8tB9C;AG7tBmC;EAAW,iBAAA;CHguB9C;AG/tBmC;EAAW,iBAAA;CHkuB9C;AGjuBmC;EAAW,iBAAA;CHouB9C;AGnuBmC;EAAW,iBAAA;CHsuB9C;AGruBmC;EAAW,iBAAA;CHwuB9C;AGvuBmC;EAAW,iBAAA;CH0uB9C;AGzuBmC;EAAW,iBAAA;CH4uB9C;AG3uBmC;EAAW,iBAAA;CH8uB9C;AG7uBmC;EAAW,iBAAA;CHgvB9C;AIthCD;ECgEE,+BAAA;EACG,4BAAA;EACK,uBAAA;CLy9BT;AIxhCD;;EC6DE,+BAAA;EACG,4BAAA;EACK,uBAAA;CL+9BT;AIthCD;EACE,gBAAA;EACA,8CAAA;CJwhCD;AIrhCD;EACE,4DAAA;EACA,gBAAA;EACA,wBAAA;EACA,eAAA;EACA,uBAAA;CJuhCD;AInhCD;;;;EAIE,qBAAA;EACA,mBAAA;EACA,qBAAA;CJqhCD;AI/gCD;EACE,eAAA;EACA,sBAAA;CJihCD;AI/gCC;;EAEE,eAAA;EACA,2BAAA;CJihCH;AI9gCC;EEnDA,2CAAA;EACA,qBAAA;CNokCD;AIvgCD;EACE,UAAA;CJygCD;AIngCD;EACE,uBAAA;CJqgCD;AIjgCD;;;;;EGvEE,eAAA;EACA,gBAAA;EACA,aAAA;CP+kCD;AIrgCD;EACE,mBAAA;CJugCD;AIjgCD;EACE,aAAA;EACA,wBAAA;EACA,uBAAA;EACA,uBAAA;EACA,mBAAA;EC6FA,yCAAA;EACK,oCAAA;EACG,iCAAA;EEvLR,sBAAA;EACA,gBAAA;EACA,aAAA;CP+lCD;AIjgCD;EACE,mBAAA;CJmgCD;AI7/BD;EACE,iBAAA;EACA,oBAAA;EACA,UAAA;EACA,8BAAA;CJ+/BD;AIv/BD;EACE,mBAAA;EACA,WAAA;EACA,YAAA;EACA,aAAA;EACA,WAAA;EACA,iBAAA;EACA,uBAAA;EACA,UAAA;CJy/BD;AIj/BC;;EAEE,iBAAA;EACA,YAAA;EACA,aAAA;EACA,UAAA;EACA,kBAAA;EACA,WAAA;CJm/BH;AIx+BD;EACE,gBAAA;CJ0+BD;AQjoCD;;;;;;;;;;;;EAEE,qBAAA;EACA,iBAAA;EACA,iBAAA;EACA,eAAA;CR6oCD;AQlpCD;;;;;;;;;;;;;;;;;;;;;;;;EASI,oBAAA;EACA,eAAA;EACA,eAAA;CRmqCH;AQ/pCD;;;;;;EAGE,iBAAA;EACA,oBAAA;CRoqCD;AQxqCD;;;;;;;;;;;;EAQI,eAAA;CR8qCH;AQ3qCD;;;;;;EAGE,iBAAA;EACA,oBAAA;CRgrCD;AQprCD;;;;;;;;;;;;EAQI,eAAA;CR0rCH;AQtrCD;;EAAU,gBAAA;CR0rCT;AQzrCD;;EAAU,gBAAA;CR6rCT;AQ5rCD;;EAAU,gBAAA;CRgsCT;AQ/rCD;;EAAU,gBAAA;CRmsCT;AQlsCD;;EAAU,gBAAA;CRssCT;AQrsCD;;EAAU,gBAAA;CRysCT;AQnsCD;EACE,iBAAA;CRqsCD;AQlsCD;EACE,oBAAA;EACA,gBAAA;EACA,iBAAA;EACA,iBAAA;CRosCD;AQ/rCD;EAwOA;IA1OI,gBAAA;GRqsCD;CACF;AQ7rCD;;EAEE,eAAA;CR+rCD;AQ5rCD;;EAEE,0BAAA;EACA,cAAA;CR8rCD;AQ1rCD;EAAuB,iBAAA;CR6rCtB;AQ5rCD;EAAuB,kBAAA;CR+rCtB;AQ9rCD;EAAuB,mBAAA;CRisCtB;AQhsCD;EAAuB,oBAAA;CRmsCtB;AQlsCD;EAAuB,oBAAA;CRqsCtB;AQlsCD;EAAuB,0BAAA;CRqsCtB;AQpsCD;EAAuB,0BAAA;CRusCtB;AQtsCD;EAAuB,2BAAA;CRysCtB;AQtsCD;EACE,eAAA;CRwsCD;AQtsCD;ECrGE,eAAA;CT8yCD;AS7yCC;;EAEE,eAAA;CT+yCH;AQ1sCD;ECxGE,eAAA;CTqzCD;ASpzCC;;EAEE,eAAA;CTszCH;AQ9sCD;EC3GE,eAAA;CT4zCD;AS3zCC;;EAEE,eAAA;CT6zCH;AQltCD;EC9GE,eAAA;CTm0CD;ASl0CC;;EAEE,eAAA;CTo0CH;AQttCD;ECjHE,eAAA;CT00CD;ASz0CC;;EAEE,eAAA;CT20CH;AQttCD;EAGE,YAAA;EE3HA,0BAAA;CVk1CD;AUj1CC;;EAEE,0BAAA;CVm1CH;AQxtCD;EE9HE,0BAAA;CVy1CD;AUx1CC;;EAEE,0BAAA;CV01CH;AQ5tCD;EEjIE,0BAAA;CVg2CD;AU/1CC;;EAEE,0BAAA;CVi2CH;AQhuCD;EEpIE,0BAAA;CVu2CD;AUt2CC;;EAEE,0BAAA;CVw2CH;AQpuCD;EEvIE,0BAAA;CV82CD;AU72CC;;EAEE,0BAAA;CV+2CH;AQnuCD;EACE,oBAAA;EACA,oBAAA;EACA,iCAAA;CRquCD;AQ7tCD;;EAEE,cAAA;EACA,oBAAA;CR+tCD;AQluCD;;;;EAMI,iBAAA;CRkuCH;AQ3tCD;EACE,gBAAA;EACA,iBAAA;CR6tCD;AQztCD;EALE,gBAAA;EACA,iBAAA;EAMA,kBAAA;CR4tCD;AQ9tCD;EAKI,sBAAA;EACA,kBAAA;EACA,mBAAA;CR4tCH;AQvtCD;EACE,cAAA;EACA,oBAAA;CRytCD;AQvtCD;;EAEE,wBAAA;CRytCD;AQvtCD;EACE,kBAAA;CRytCD;AQvtCD;EACE,eAAA;CRytCD;AQhsCD;EA6EA;IAvFM,YAAA;IACA,aAAA;IACA,YAAA;IACA,kBAAA;IGtNJ,iBAAA;IACA,wBAAA;IACA,oBAAA;GXq6CC;EQ7nCH;IAhFM,mBAAA;GRgtCH;CACF;AQvsCD;;EAGE,aAAA;EACA,kCAAA;CRwsCD;AQtsCD;EACE,eAAA;EA9IqB,0BAAA;CRu1CtB;AQpsCD;EACE,mBAAA;EACA,iBAAA;EACA,kBAAA;EACA,+BAAA;CRssCD;AQjsCG;;;EACE,iBAAA;CRqsCL;AQ/sCD;;;EAmBI,eAAA;EACA,eAAA;EACA,wBAAA;EACA,eAAA;CRisCH;AQ/rCG;;;EACE,uBAAA;CRmsCL;AQ3rCD;;EAEE,oBAAA;EACA,gBAAA;EACA,gCAAA;EACA,eAAA;EACA,kBAAA;CR6rCD;AQvrCG;;;;;;EAAW,YAAA;CR+rCd;AQ9rCG;;;;;;EACE,uBAAA;CRqsCL;AQ/rCD;EACE,oBAAA;EACA,mBAAA;EACA,wBAAA;CRisCD;AYv+CD;;;;EAIE,+DAAA;CZy+CD;AYr+CD;EACE,iBAAA;EACA,eAAA;EACA,eAAA;EACA,0BAAA;EACA,mBAAA;CZu+CD;AYn+CD;EACE,iBAAA;EACA,eAAA;EACA,YAAA;EACA,uBAAA;EACA,mBAAA;EACA,uDAAA;UAAA,+CAAA;CZq+CD;AY3+CD;EASI,WAAA;EACA,gBAAA;EACA,kBAAA;EACA,yBAAA;UAAA,iBAAA;CZq+CH;AYh+CD;EACE,eAAA;EACA,eAAA;EACA,iBAAA;EACA,gBAAA;EACA,wBAAA;EACA,sBAAA;EACA,sBAAA;EACA,eAAA;EACA,0BAAA;EACA,uBAAA;EACA,mBAAA;CZk+CD;AY7+CD;EAeI,WAAA;EACA,mBAAA;EACA,eAAA;EACA,sBAAA;EACA,8BAAA;EACA,iBAAA;CZi+CH;AY59CD;EACE,kBAAA;EACA,mBAAA;CZ89CD;AaxhDD;ECHE,mBAAA;EACA,kBAAA;EACA,mBAAA;EACA,oBAAA;Cd8hDD;AaxhDC;EAqEF;IAvEI,aAAA;Gb8hDD;CACF;Aa1hDC;EAkEF;IApEI,aAAA;GbgiDD;CACF;Aa5hDD;EA+DA;IAjEI,cAAA;GbkiDD;CACF;AazhDD;ECvBE,mBAAA;EACA,kBAAA;EACA,mBAAA;EACA,oBAAA;CdmjDD;AathDD;ECvBE,mBAAA;EACA,oBAAA;CdgjDD;AehjDG;EACE,mBAAA;EAEA,gBAAA;EAEA,mBAAA;EACA,oBAAA;CfgjDL;AehiDG;EACE,YAAA;CfkiDL;Ae3hDC;EACE,YAAA;Cf6hDH;Ae9hDC;EACE,oBAAA;CfgiDH;AejiDC;EACE,oBAAA;CfmiDH;AepiDC;EACE,WAAA;CfsiDH;AeviDC;EACE,oBAAA;CfyiDH;Ae1iDC;EACE,oBAAA;Cf4iDH;Ae7iDC;EACE,WAAA;Cf+iDH;AehjDC;EACE,oBAAA;CfkjDH;AenjDC;EACE,oBAAA;CfqjDH;AetjDC;EACE,WAAA;CfwjDH;AezjDC;EACE,oBAAA;Cf2jDH;Ae5jDC;EACE,mBAAA;Cf8jDH;AehjDC;EACE,YAAA;CfkjDH;AenjDC;EACE,oBAAA;CfqjDH;AetjDC;EACE,oBAAA;CfwjDH;AezjDC;EACE,WAAA;Cf2jDH;Ae5jDC;EACE,oBAAA;Cf8jDH;Ae/jDC;EACE,oBAAA;CfikDH;AelkDC;EACE,WAAA;CfokDH;AerkDC;EACE,oBAAA;CfukDH;AexkDC;EACE,oBAAA;Cf0kDH;Ae3kDC;EACE,WAAA;Cf6kDH;Ae9kDC;EACE,oBAAA;CfglDH;AejlDC;EACE,mBAAA;CfmlDH;Ae/kDC;EACE,YAAA;CfilDH;AejmDC;EACE,WAAA;CfmmDH;AepmDC;EACE,mBAAA;CfsmDH;AevmDC;EACE,mBAAA;CfymDH;Ae1mDC;EACE,UAAA;Cf4mDH;Ae7mDC;EACE,mBAAA;Cf+mDH;AehnDC;EACE,mBAAA;CfknDH;AennDC;EACE,UAAA;CfqnDH;AetnDC;EACE,mBAAA;CfwnDH;AeznDC;EACE,mBAAA;Cf2nDH;Ae5nDC;EACE,UAAA;Cf8nDH;Ae/nDC;EACE,mBAAA;CfioDH;AeloDC;EACE,kBAAA;CfooDH;AehoDC;EACE,WAAA;CfkoDH;AepnDC;EACE,kBAAA;CfsnDH;AevnDC;EACE,0BAAA;CfynDH;Ae1nDC;EACE,0BAAA;Cf4nDH;Ae7nDC;EACE,iBAAA;Cf+nDH;AehoDC;EACE,0BAAA;CfkoDH;AenoDC;EACE,0BAAA;CfqoDH;AetoDC;EACE,iBAAA;CfwoDH;AezoDC;EACE,0BAAA;Cf2oDH;Ae5oDC;EACE,0BAAA;Cf8oDH;Ae/oDC;EACE,iBAAA;CfipDH;AelpDC;EACE,0BAAA;CfopDH;AerpDC;EACE,yBAAA;CfupDH;AexpDC;EACE,gBAAA;Cf0pDH;Aa1pDD;EElCI;IACE,YAAA;Gf+rDH;EexrDD;IACE,YAAA;Gf0rDD;Ee3rDD;IACE,oBAAA;Gf6rDD;Ee9rDD;IACE,oBAAA;GfgsDD;EejsDD;IACE,WAAA;GfmsDD;EepsDD;IACE,oBAAA;GfssDD;EevsDD;IACE,oBAAA;GfysDD;Ee1sDD;IACE,WAAA;Gf4sDD;Ee7sDD;IACE,oBAAA;Gf+sDD;EehtDD;IACE,oBAAA;GfktDD;EentDD;IACE,WAAA;GfqtDD;EettDD;IACE,oBAAA;GfwtDD;EeztDD;IACE,mBAAA;Gf2tDD;Ee7sDD;IACE,YAAA;Gf+sDD;EehtDD;IACE,oBAAA;GfktDD;EentDD;IACE,oBAAA;GfqtDD;EettDD;IACE,WAAA;GfwtDD;EeztDD;IACE,oBAAA;Gf2tDD;Ee5tDD;IACE,oBAAA;Gf8tDD;Ee/tDD;IACE,WAAA;GfiuDD;EeluDD;IACE,oBAAA;GfouDD;EeruDD;IACE,oBAAA;GfuuDD;EexuDD;IACE,WAAA;Gf0uDD;Ee3uDD;IACE,oBAAA;Gf6uDD;Ee9uDD;IACE,mBAAA;GfgvDD;Ee5uDD;IACE,YAAA;Gf8uDD;Ee9vDD;IACE,WAAA;GfgwDD;EejwDD;IACE,mBAAA;GfmwDD;EepwDD;IACE,mBAAA;GfswDD;EevwDD;IACE,UAAA;GfywDD;Ee1wDD;IACE,mBAAA;Gf4wDD;Ee7wDD;IACE,mBAAA;Gf+wDD;EehxDD;IACE,UAAA;GfkxDD;EenxDD;IACE,mBAAA;GfqxDD;EetxDD;IACE,mBAAA;GfwxDD;EezxDD;IACE,UAAA;Gf2xDD;Ee5xDD;IACE,mBAAA;Gf8xDD;Ee/xDD;IACE,kBAAA;GfiyDD;Ee7xDD;IACE,WAAA;Gf+xDD;EejxDD;IACE,kBAAA;GfmxDD;EepxDD;IACE,0BAAA;GfsxDD;EevxDD;IACE,0BAAA;GfyxDD;Ee1xDD;IACE,iBAAA;Gf4xDD;Ee7xDD;IACE,0BAAA;Gf+xDD;EehyDD;IACE,0BAAA;GfkyDD;EenyDD;IACE,iBAAA;GfqyDD;EetyDD;IACE,0BAAA;GfwyDD;EezyDD;IACE,0BAAA;Gf2yDD;Ee5yDD;IACE,iBAAA;Gf8yDD;Ee/yDD;IACE,0BAAA;GfizDD;EelzDD;IACE,yBAAA;GfozDD;EerzDD;IACE,gBAAA;GfuzDD;CACF;Aa/yDD;EE3CI;IACE,YAAA;Gf61DH;Eet1DD;IACE,YAAA;Gfw1DD;Eez1DD;IACE,oBAAA;Gf21DD;Ee51DD;IACE,oBAAA;Gf81DD;Ee/1DD;IACE,WAAA;Gfi2DD;Eel2DD;IACE,oBAAA;Gfo2DD;Eer2DD;IACE,oBAAA;Gfu2DD;Eex2DD;IACE,WAAA;Gf02DD;Ee32DD;IACE,oBAAA;Gf62DD;Ee92DD;IACE,oBAAA;Gfg3DD;Eej3DD;IACE,WAAA;Gfm3DD;Eep3DD;IACE,oBAAA;Gfs3DD;Eev3DD;IACE,mBAAA;Gfy3DD;Ee32DD;IACE,YAAA;Gf62DD;Ee92DD;IACE,oBAAA;Gfg3DD;Eej3DD;IACE,oBAAA;Gfm3DD;Eep3DD;IACE,WAAA;Gfs3DD;Eev3DD;IACE,oBAAA;Gfy3DD;Ee13DD;IACE,oBAAA;Gf43DD;Ee73DD;IACE,WAAA;Gf+3DD;Eeh4DD;IACE,oBAAA;Gfk4DD;Een4DD;IACE,oBAAA;Gfq4DD;Eet4DD;IACE,WAAA;Gfw4DD;Eez4DD;IACE,oBAAA;Gf24DD;Ee54DD;IACE,mBAAA;Gf84DD;Ee14DD;IACE,YAAA;Gf44DD;Ee55DD;IACE,WAAA;Gf85DD;Ee/5DD;IACE,mBAAA;Gfi6DD;Eel6DD;IACE,mBAAA;Gfo6DD;Eer6DD;IACE,UAAA;Gfu6DD;Eex6DD;IACE,mBAAA;Gf06DD;Ee36DD;IACE,mBAAA;Gf66DD;Ee96DD;IACE,UAAA;Gfg7DD;Eej7DD;IACE,mBAAA;Gfm7DD;Eep7DD;IACE,mBAAA;Gfs7DD;Eev7DD;IACE,UAAA;Gfy7DD;Ee17DD;IACE,mBAAA;Gf47DD;Ee77DD;IACE,kBAAA;Gf+7DD;Ee37DD;IACE,WAAA;Gf67DD;Ee/6DD;IACE,kBAAA;Gfi7DD;Eel7DD;IACE,0BAAA;Gfo7DD;Eer7DD;IACE,0BAAA;Gfu7DD;Eex7DD;IACE,iBAAA;Gf07DD;Ee37DD;IACE,0BAAA;Gf67DD;Ee97DD;IACE,0BAAA;Gfg8DD;Eej8DD;IACE,iBAAA;Gfm8DD;Eep8DD;IACE,0BAAA;Gfs8DD;Eev8DD;IACE,0BAAA;Gfy8DD;Ee18DD;IACE,iBAAA;Gf48DD;Ee78DD;IACE,0BAAA;Gf+8DD;Eeh9DD;IACE,yBAAA;Gfk9DD;Een9DD;IACE,gBAAA;Gfq9DD;CACF;Aa18DD;EE9CI;IACE,YAAA;Gf2/DH;Eep/DD;IACE,YAAA;Gfs/DD;Eev/DD;IACE,oBAAA;Gfy/DD;Ee1/DD;IACE,oBAAA;Gf4/DD;Ee7/DD;IACE,WAAA;Gf+/DD;EehgED;IACE,oBAAA;GfkgED;EengED;IACE,oBAAA;GfqgED;EetgED;IACE,WAAA;GfwgED;EezgED;IACE,oBAAA;Gf2gED;Ee5gED;IACE,oBAAA;Gf8gED;Ee/gED;IACE,WAAA;GfihED;EelhED;IACE,oBAAA;GfohED;EerhED;IACE,mBAAA;GfuhED;EezgED;IACE,YAAA;Gf2gED;Ee5gED;IACE,oBAAA;Gf8gED;Ee/gED;IACE,oBAAA;GfihED;EelhED;IACE,WAAA;GfohED;EerhED;IACE,oBAAA;GfuhED;EexhED;IACE,oBAAA;Gf0hED;Ee3hED;IACE,WAAA;Gf6hED;Ee9hED;IACE,oBAAA;GfgiED;EejiED;IACE,oBAAA;GfmiED;EepiED;IACE,WAAA;GfsiED;EeviED;IACE,oBAAA;GfyiED;Ee1iED;IACE,mBAAA;Gf4iED;EexiED;IACE,YAAA;Gf0iED;Ee1jED;IACE,WAAA;Gf4jED;Ee7jED;IACE,mBAAA;Gf+jED;EehkED;IACE,mBAAA;GfkkED;EenkED;IACE,UAAA;GfqkED;EetkED;IACE,mBAAA;GfwkED;EezkED;IACE,mBAAA;Gf2kED;Ee5kED;IACE,UAAA;Gf8kED;Ee/kED;IACE,mBAAA;GfilED;EellED;IACE,mBAAA;GfolED;EerlED;IACE,UAAA;GfulED;EexlED;IACE,mBAAA;Gf0lED;Ee3lED;IACE,kBAAA;Gf6lED;EezlED;IACE,WAAA;Gf2lED;Ee7kED;IACE,kBAAA;Gf+kED;EehlED;IACE,0BAAA;GfklED;EenlED;IACE,0BAAA;GfqlED;EetlED;IACE,iBAAA;GfwlED;EezlED;IACE,0BAAA;Gf2lED;Ee5lED;IACE,0BAAA;Gf8lED;Ee/lED;IACE,iBAAA;GfimED;EelmED;IACE,0BAAA;GfomED;EermED;IACE,0BAAA;GfumED;EexmED;IACE,iBAAA;Gf0mED;Ee3mED;IACE,0BAAA;Gf6mED;Ee9mED;IACE,yBAAA;GfgnED;EejnED;IACE,gBAAA;GfmnED;CACF;AgBvrED;EACE,8BAAA;ChByrED;AgBvrED;EACE,iBAAA;EACA,oBAAA;EACA,eAAA;EACA,iBAAA;ChByrED;AgBvrED;EACE,iBAAA;ChByrED;AgBnrED;EACE,YAAA;EACA,gBAAA;EACA,oBAAA;ChBqrED;AgBxrED;;;;;;EAWQ,aAAA;EACA,wBAAA;EACA,oBAAA;EACA,2BAAA;ChBqrEP;AgBnsED;EAoBI,uBAAA;EACA,8BAAA;ChBkrEH;AgBvsED;;;;;;EA8BQ,cAAA;ChBirEP;AgB/sED;EAoCI,2BAAA;ChB8qEH;AgBltED;EAyCI,uBAAA;ChB4qEH;AgBrqED;;;;;;EAOQ,aAAA;ChBsqEP;AgB3pED;EACE,uBAAA;ChB6pED;AgB9pED;;;;;;EAQQ,uBAAA;ChB8pEP;AgBtqED;;EAeM,yBAAA;ChB2pEL;AgBjpED;EAEI,0BAAA;ChBkpEH;AgBzoED;EAEI,0BAAA;ChB0oEH;AgBjoED;EACE,iBAAA;EACA,YAAA;EACA,sBAAA;ChBmoED;AgB9nEG;;EACE,iBAAA;EACA,YAAA;EACA,oBAAA;ChBioEL;AiB7wEC;;;;;;;;;;;;EAOI,0BAAA;CjBoxEL;AiB9wEC;;;;;EAMI,0BAAA;CjB+wEL;AiBlyEC;;;;;;;;;;;;EAOI,0BAAA;CjByyEL;AiBnyEC;;;;;EAMI,0BAAA;CjBoyEL;AiBvzEC;;;;;;;;;;;;EAOI,0BAAA;CjB8zEL;AiBxzEC;;;;;EAMI,0BAAA;CjByzEL;AiB50EC;;;;;;;;;;;;EAOI,0BAAA;CjBm1EL;AiB70EC;;;;;EAMI,0BAAA;CjB80EL;AiBj2EC;;;;;;;;;;;;EAOI,0BAAA;CjBw2EL;AiBl2EC;;;;;EAMI,0BAAA;CjBm2EL;AgBjtED;EACE,iBAAA;EACA,kBAAA;ChBmtED;AgBtpED;EACA;IA3DI,YAAA;IACA,oBAAA;IACA,mBAAA;IACA,6CAAA;IACA,uBAAA;GhBotED;EgB7pEH;IAnDM,iBAAA;GhBmtEH;EgBhqEH;;;;;;IA1CY,oBAAA;GhBktET;EgBxqEH;IAlCM,UAAA;GhB6sEH;EgB3qEH;;;;;;IAzBY,eAAA;GhB4sET;EgBnrEH;;;;;;IArBY,gBAAA;GhBgtET;EgB3rEH;;;;IARY,iBAAA;GhBysET;CACF;AkBn6ED;EACE,WAAA;EACA,UAAA;EACA,UAAA;EAIA,aAAA;ClBk6ED;AkB/5ED;EACE,eAAA;EACA,YAAA;EACA,WAAA;EACA,oBAAA;EACA,gBAAA;EACA,qBAAA;EACA,eAAA;EACA,UAAA;EACA,iCAAA;ClBi6ED;AkB95ED;EACE,sBAAA;EACA,gBAAA;EACA,mBAAA;EACA,kBAAA;ClBg6ED;AkBr5ED;Eb4BE,+BAAA;EACG,4BAAA;EACK,uBAAA;CL43ET;AkBr5ED;;EAEE,gBAAA;EACA,mBAAA;EACA,oBAAA;ClBu5ED;AkBp5ED;EACE,eAAA;ClBs5ED;AkBl5ED;EACE,eAAA;EACA,YAAA;ClBo5ED;AkBh5ED;;EAEE,aAAA;ClBk5ED;AkB94ED;;;EZrEE,2CAAA;EACA,qBAAA;CNw9ED;AkB74ED;EACE,eAAA;EACA,iBAAA;EACA,gBAAA;EACA,wBAAA;EACA,eAAA;ClB+4ED;AkBr3ED;EACE,eAAA;EACA,YAAA;EACA,aAAA;EACA,kBAAA;EACA,gBAAA;EACA,wBAAA;EACA,eAAA;EACA,uBAAA;EACA,uBAAA;EACA,uBAAA;EACA,mBAAA;EbxDA,yDAAA;EACQ,iDAAA;EAyHR,uFAAA;EACK,0EAAA;EACG,uEAAA;CLwzET;AmBh8EC;EACE,sBAAA;EACA,WAAA;EdUF,uFAAA;EACQ,+EAAA;CLy7ET;AKx5EC;EACE,YAAA;EACA,WAAA;CL05EH;AKx5EC;EAA0B,YAAA;CL25E3B;AK15EC;EAAgC,YAAA;CL65EjC;AkBj4EC;EACE,UAAA;EACA,8BAAA;ClBm4EH;AkB33EC;;;EAGE,0BAAA;EACA,WAAA;ClB63EH;AkB13EC;;EAEE,oBAAA;ClB43EH;AkBx3EC;EACE,aAAA;ClB03EH;AkB92ED;EACE,yBAAA;ClBg3ED;AkBx0ED;EAtBI;;;;IACE,kBAAA;GlBo2EH;EkBj2EC;;;;;;;;IAEE,kBAAA;GlBy2EH;EkBt2EC;;;;;;;;IAEE,kBAAA;GlB82EH;CACF;AkBp2ED;EACE,oBAAA;ClBs2ED;AkB91ED;;EAEE,mBAAA;EACA,eAAA;EACA,iBAAA;EACA,oBAAA;ClBg2ED;AkBr2ED;;EAQI,iBAAA;EACA,mBAAA;EACA,iBAAA;EACA,oBAAA;EACA,gBAAA;ClBi2EH;AkB91ED;;;;EAIE,mBAAA;EACA,mBAAA;EACA,mBAAA;ClBg2ED;AkB71ED;;EAEE,iBAAA;ClB+1ED;AkB31ED;;EAEE,mBAAA;EACA,sBAAA;EACA,mBAAA;EACA,iBAAA;EACA,uBAAA;EACA,oBAAA;EACA,gBAAA;ClB61ED;AkB31ED;;EAEE,cAAA;EACA,kBAAA;ClB61ED;AkBp1EC;;;;;;EAGE,oBAAA;ClBy1EH;AkBn1EC;;;;EAEE,oBAAA;ClBu1EH;AkBj1EC;;;;EAGI,oBAAA;ClBo1EL;AkBz0ED;EAEE,iBAAA;EACA,oBAAA;EAEA,iBAAA;EACA,iBAAA;ClBy0ED;AkBv0EC;;EAEE,gBAAA;EACA,iBAAA;ClBy0EH;AkB5zED;ECnQE,aAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;CnBkkFD;AmBhkFC;EACE,aAAA;EACA,kBAAA;CnBkkFH;AmB/jFC;;EAEE,aAAA;CnBikFH;AkBx0ED;EAEI,aAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;ClBy0EH;AkB/0ED;EASI,aAAA;EACA,kBAAA;ClBy0EH;AkBn1ED;;EAcI,aAAA;ClBy0EH;AkBv1ED;EAiBI,aAAA;EACA,iBAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;ClBy0EH;AkBr0ED;EC/RE,aAAA;EACA,mBAAA;EACA,gBAAA;EACA,uBAAA;EACA,mBAAA;CnBumFD;AmBrmFC;EACE,aAAA;EACA,kBAAA;CnBumFH;AmBpmFC;;EAEE,aAAA;CnBsmFH;AkBj1ED;EAEI,aAAA;EACA,mBAAA;EACA,gBAAA;EACA,uBAAA;EACA,mBAAA;ClBk1EH;AkBx1ED;EASI,aAAA;EACA,kBAAA;ClBk1EH;AkB51ED;;EAcI,aAAA;ClBk1EH;AkBh2ED;EAiBI,aAAA;EACA,iBAAA;EACA,mBAAA;EACA,gBAAA;EACA,uBAAA;ClBk1EH;AkBz0ED;EAEE,mBAAA;ClB00ED;AkB50ED;EAMI,sBAAA;ClBy0EH;AkBr0ED;EACE,mBAAA;EACA,OAAA;EACA,SAAA;EACA,WAAA;EACA,eAAA;EACA,YAAA;EACA,aAAA;EACA,kBAAA;EACA,mBAAA;EACA,qBAAA;ClBu0ED;AkBr0ED;;;EAGE,YAAA;EACA,aAAA;EACA,kBAAA;ClBu0ED;AkBr0ED;;;EAGE,YAAA;EACA,aAAA;EACA,kBAAA;ClBu0ED;AkBn0ED;;;;;;;;;;EC1ZI,eAAA;CnByuFH;AkB/0ED;ECtZI,sBAAA;Ed+CF,yDAAA;EACQ,iDAAA;CL0rFT;AmBxuFG;EACE,sBAAA;Ed4CJ,0EAAA;EACQ,kEAAA;CL+rFT;AkBz1ED;EC5YI,eAAA;EACA,sBAAA;EACA,0BAAA;CnBwuFH;AkB91ED;ECtYI,eAAA;CnBuuFH;AkB91ED;;;;;;;;;;EC7ZI,eAAA;CnBuwFH;AkB12ED;ECzZI,sBAAA;Ed+CF,yDAAA;EACQ,iDAAA;CLwtFT;AmBtwFG;EACE,sBAAA;Ed4CJ,0EAAA;EACQ,kEAAA;CL6tFT;AkBp3ED;EC/YI,eAAA;EACA,sBAAA;EACA,0BAAA;CnBswFH;AkBz3ED;ECzYI,eAAA;CnBqwFH;AkBz3ED;;;;;;;;;;EChaI,eAAA;CnBqyFH;AkBr4ED;EC5ZI,sBAAA;Ed+CF,yDAAA;EACQ,iDAAA;CLsvFT;AmBpyFG;EACE,sBAAA;Ed4CJ,0EAAA;EACQ,kEAAA;CL2vFT;AkB/4ED;EClZI,eAAA;EACA,sBAAA;EACA,0BAAA;CnBoyFH;AkBp5ED;EC5YI,eAAA;CnBmyFH;AkBh5EC;EACE,UAAA;ClBk5EH;AkBh5EC;EACE,OAAA;ClBk5EH;AkBx4ED;EACE,eAAA;EACA,gBAAA;EACA,oBAAA;EACA,eAAA;ClB04ED;AkBvzED;EAwEA;IAtIM,sBAAA;IACA,iBAAA;IACA,uBAAA;GlBy3EH;EkBrvEH;IA/HM,sBAAA;IACA,YAAA;IACA,uBAAA;GlBu3EH;EkB1vEH;IAxHM,sBAAA;GlBq3EH;EkB7vEH;IApHM,sBAAA;IACA,uBAAA;GlBo3EH;EkBjwEH;;;IA9GQ,YAAA;GlBo3EL;EkBtwEH;IAxGM,YAAA;GlBi3EH;EkBzwEH;IApGM,iBAAA;IACA,uBAAA;GlBg3EH;EkB7wEH;;IA5FM,sBAAA;IACA,cAAA;IACA,iBAAA;IACA,uBAAA;GlB62EH;EkBpxEH;;IAtFQ,gBAAA;GlB82EL;EkBxxEH;;IAjFM,mBAAA;IACA,eAAA;GlB62EH;EkB7xEH;IA3EM,OAAA;GlB22EH;CACF;AkBj2ED;;;;EASI,cAAA;EACA,iBAAA;EACA,iBAAA;ClB81EH;AkBz2ED;;EAiBI,iBAAA;ClB41EH;AkB72ED;EJthBE,mBAAA;EACA,oBAAA;Cds4FD;AkB10EC;EAyBF;IAnCM,kBAAA;IACA,iBAAA;IACA,iBAAA;GlBw1EH;CACF;AkBx3ED;EAwCI,YAAA;ClBm1EH;AkBr0EC;EAUF;IAdQ,kBAAA;IACA,gBAAA;GlB60EL;CACF;AkBn0EC;EAEF;IANQ,iBAAA;IACA,gBAAA;GlB20EL;CACF;AoBp6FD;EACE,sBAAA;EACA,iBAAA;EACA,oBAAA;EACA,mBAAA;EACA,uBAAA;EACA,+BAAA;MAAA,2BAAA;EACA,gBAAA;EACA,uBAAA;EACA,8BAAA;EACA,oBAAA;EC0CA,kBAAA;EACA,gBAAA;EACA,wBAAA;EACA,mBAAA;EhB+JA,0BAAA;EACG,uBAAA;EACC,sBAAA;EACI,kBAAA;CL+tFT;AoBv6FG;;;;;;EdnBF,2CAAA;EACA,qBAAA;CNk8FD;AoB16FC;;;EAGE,YAAA;EACA,sBAAA;CpB46FH;AoBz6FC;;EAEE,WAAA;EACA,uBAAA;Ef2BF,yDAAA;EACQ,iDAAA;CLi5FT;AoBz6FC;;;EAGE,oBAAA;EE7CF,cAAA;EAGA,0BAAA;EjB8DA,yBAAA;EACQ,iBAAA;CL05FT;AoBz6FG;;EAEE,qBAAA;CpB26FL;AoBl6FD;EC3DE,YAAA;EACA,uBAAA;EACA,mBAAA;CrBg+FD;AqB99FC;;EAEE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBg+FP;AqB99FC;EACE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBg+FP;AqB99FC;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBg+FP;AqB99FG;;;;;;;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBs+FT;AqBn+FC;;;EAGE,uBAAA;CrBq+FH;AqBh+FG;;;;;;;;;EAGE,uBAAA;EACI,mBAAA;CrBw+FT;AoBv9FD;ECZI,YAAA;EACA,uBAAA;CrBs+FH;AoBx9FD;EC9DE,YAAA;EACA,0BAAA;EACA,sBAAA;CrByhGD;AqBvhGC;;EAEE,YAAA;EACA,0BAAA;EACI,sBAAA;CrByhGP;AqBvhGC;EACE,YAAA;EACA,0BAAA;EACI,sBAAA;CrByhGP;AqBvhGC;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrByhGP;AqBvhGG;;;;;;;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrB+hGT;AqB5hGC;;;EAGE,uBAAA;CrB8hGH;AqBzhGG;;;;;;;;;EAGE,0BAAA;EACI,sBAAA;CrBiiGT;AoB7gGD;ECfI,eAAA;EACA,uBAAA;CrB+hGH;AoB7gGD;EClEE,YAAA;EACA,0BAAA;EACA,sBAAA;CrBklGD;AqBhlGC;;EAEE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBklGP;AqBhlGC;EACE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBklGP;AqBhlGC;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBklGP;AqBhlGG;;;;;;;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBwlGT;AqBrlGC;;;EAGE,uBAAA;CrBulGH;AqBllGG;;;;;;;;;EAGE,0BAAA;EACI,sBAAA;CrB0lGT;AoBlkGD;ECnBI,eAAA;EACA,uBAAA;CrBwlGH;AoBlkGD;ECtEE,YAAA;EACA,0BAAA;EACA,sBAAA;CrB2oGD;AqBzoGC;;EAEE,YAAA;EACA,0BAAA;EACI,sBAAA;CrB2oGP;AqBzoGC;EACE,YAAA;EACA,0BAAA;EACI,sBAAA;CrB2oGP;AqBzoGC;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrB2oGP;AqBzoGG;;;;;;;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBipGT;AqB9oGC;;;EAGE,uBAAA;CrBgpGH;AqB3oGG;;;;;;;;;EAGE,0BAAA;EACI,sBAAA;CrBmpGT;AoBvnGD;ECvBI,eAAA;EACA,uBAAA;CrBipGH;AoBvnGD;EC1EE,YAAA;EACA,0BAAA;EACA,sBAAA;CrBosGD;AqBlsGC;;EAEE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBosGP;AqBlsGC;EACE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBosGP;AqBlsGC;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBosGP;AqBlsGG;;;;;;;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrB0sGT;AqBvsGC;;;EAGE,uBAAA;CrBysGH;AqBpsGG;;;;;;;;;EAGE,0BAAA;EACI,sBAAA;CrB4sGT;AoB5qGD;EC3BI,eAAA;EACA,uBAAA;CrB0sGH;AoB5qGD;EC9EE,YAAA;EACA,0BAAA;EACA,sBAAA;CrB6vGD;AqB3vGC;;EAEE,YAAA;EACA,0BAAA;EACI,sBAAA;CrB6vGP;AqB3vGC;EACE,YAAA;EACA,0BAAA;EACI,sBAAA;CrB6vGP;AqB3vGC;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrB6vGP;AqB3vGG;;;;;;;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBmwGT;AqBhwGC;;;EAGE,uBAAA;CrBkwGH;AqB7vGG;;;;;;;;;EAGE,0BAAA;EACI,sBAAA;CrBqwGT;AoBjuGD;EC/BI,eAAA;EACA,uBAAA;CrBmwGH;AoB5tGD;EACE,eAAA;EACA,oBAAA;EACA,iBAAA;CpB8tGD;AoB5tGC;;;;;EAKE,8BAAA;EfnCF,yBAAA;EACQ,iBAAA;CLkwGT;AoB7tGC;;;;EAIE,0BAAA;CpB+tGH;AoB7tGC;;EAEE,eAAA;EACA,2BAAA;EACA,8BAAA;CpB+tGH;AoB3tGG;;;;EAEE,eAAA;EACA,sBAAA;CpB+tGL;AoBttGD;;ECxEE,mBAAA;EACA,gBAAA;EACA,uBAAA;EACA,mBAAA;CrBkyGD;AoBztGD;;EC5EE,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;CrByyGD;AoB5tGD;;EChFE,iBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;CrBgzGD;AoB3tGD;EACE,eAAA;EACA,YAAA;CpB6tGD;AoBztGD;EACE,gBAAA;CpB2tGD;AoBptGC;;;EACE,YAAA;CpBwtGH;AuBl3GD;EACE,WAAA;ElBoLA,yCAAA;EACK,oCAAA;EACG,iCAAA;CLisGT;AuBr3GC;EACE,WAAA;CvBu3GH;AuBn3GD;EACE,cAAA;CvBq3GD;AuBn3GC;EAAY,eAAA;CvBs3Gb;AuBr3GC;EAAY,mBAAA;CvBw3Gb;AuBv3GC;EAAY,yBAAA;CvB03Gb;AuBv3GD;EACE,mBAAA;EACA,UAAA;EACA,iBAAA;ElBuKA,gDAAA;EACQ,2CAAA;KAAA,wCAAA;EAOR,mCAAA;EACQ,8BAAA;KAAA,2BAAA;EAGR,yCAAA;EACQ,oCAAA;KAAA,iCAAA;CL2sGT;AwBr5GD;EACE,sBAAA;EACA,SAAA;EACA,UAAA;EACA,iBAAA;EACA,uBAAA;EACA,uBAAA;EACA,yBAAA;EACA,oCAAA;EACA,mCAAA;CxBu5GD;AwBn5GD;;EAEE,mBAAA;CxBq5GD;AwBj5GD;EACE,WAAA;CxBm5GD;AwB/4GD;EACE,mBAAA;EACA,UAAA;EACA,QAAA;EACA,cAAA;EACA,cAAA;EACA,YAAA;EACA,iBAAA;EACA,eAAA;EACA,gBAAA;EACA,iBAAA;EACA,gBAAA;EACA,iBAAA;EACA,uBAAA;EACA,uBAAA;EACA,sCAAA;EACA,mBAAA;EnBsBA,oDAAA;EACQ,4CAAA;EmBrBR,qCAAA;UAAA,6BAAA;CxBk5GD;AwB74GC;EACE,SAAA;EACA,WAAA;CxB+4GH;AwBx6GD;ECzBE,YAAA;EACA,cAAA;EACA,iBAAA;EACA,0BAAA;CzBo8GD;AwB96GD;EAmCI,eAAA;EACA,kBAAA;EACA,YAAA;EACA,oBAAA;EACA,wBAAA;EACA,eAAA;EACA,oBAAA;CxB84GH;AwBx4GC;;EAEE,sBAAA;EACA,eAAA;EACA,0BAAA;CxB04GH;AwBp4GC;;;EAGE,YAAA;EACA,sBAAA;EACA,WAAA;EACA,0BAAA;CxBs4GH;AwB73GC;;;EAGE,eAAA;CxB+3GH;AwB33GC;;EAEE,sBAAA;EACA,8BAAA;EACA,uBAAA;EE3GF,oEAAA;EF6GE,oBAAA;CxB63GH;AwBx3GD;EAGI,eAAA;CxBw3GH;AwB33GD;EAQI,WAAA;CxBs3GH;AwB92GD;EACE,WAAA;EACA,SAAA;CxBg3GD;AwBx2GD;EACE,QAAA;EACA,YAAA;CxB02GD;AwBt2GD;EACE,eAAA;EACA,kBAAA;EACA,gBAAA;EACA,wBAAA;EACA,eAAA;EACA,oBAAA;CxBw2GD;AwBp2GD;EACE,gBAAA;EACA,QAAA;EACA,SAAA;EACA,UAAA;EACA,OAAA;EACA,aAAA;CxBs2GD;AwBl2GD;EACE,SAAA;EACA,WAAA;CxBo2GD;AwB51GD;;EAII,cAAA;EACA,0BAAA;EACA,4BAAA;EACA,YAAA;CxB41GH;AwBn2GD;;EAWI,UAAA;EACA,aAAA;EACA,mBAAA;CxB41GH;AwBv0GD;EAXE;IApEA,WAAA;IACA,SAAA;GxB05GC;EwBv1GD;IA1DA,QAAA;IACA,YAAA;GxBo5GC;CACF;A2BpiHD;;EAEE,mBAAA;EACA,sBAAA;EACA,uBAAA;C3BsiHD;A2B1iHD;;EAMI,mBAAA;EACA,YAAA;C3BwiHH;A2BtiHG;;;;;;;;EAIE,WAAA;C3B4iHL;A2BtiHD;;;;EAKI,kBAAA;C3BuiHH;A2BliHD;EACE,kBAAA;C3BoiHD;A2BriHD;;;EAOI,YAAA;C3BmiHH;A2B1iHD;;;EAYI,iBAAA;C3BmiHH;A2B/hHD;EACE,iBAAA;C3BiiHD;A2B7hHD;EACE,eAAA;C3B+hHD;A2B9hHC;EClDA,8BAAA;EACG,2BAAA;C5BmlHJ;A2B7hHD;;EC/CE,6BAAA;EACG,0BAAA;C5BglHJ;A2B5hHD;EACE,YAAA;C3B8hHD;A2B5hHD;EACE,iBAAA;C3B8hHD;A2B5hHD;;ECnEE,8BAAA;EACG,2BAAA;C5BmmHJ;A2B3hHD;ECjEE,6BAAA;EACG,0BAAA;C5B+lHJ;A2B1hHD;;EAEE,WAAA;C3B4hHD;A2B3gHD;EACE,kBAAA;EACA,mBAAA;C3B6gHD;A2B3gHD;EACE,mBAAA;EACA,oBAAA;C3B6gHD;A2BxgHD;EtB/CE,yDAAA;EACQ,iDAAA;CL0jHT;A2BxgHC;EtBnDA,yBAAA;EACQ,iBAAA;CL8jHT;A2BrgHD;EACE,eAAA;C3BugHD;A2BpgHD;EACE,wBAAA;EACA,uBAAA;C3BsgHD;A2BngHD;EACE,wBAAA;C3BqgHD;A2B9/GD;;;EAII,eAAA;EACA,YAAA;EACA,YAAA;EACA,gBAAA;C3B+/GH;A2BtgHD;EAcM,YAAA;C3B2/GL;A2BzgHD;;;;EAsBI,iBAAA;EACA,eAAA;C3By/GH;A2Bp/GC;EACE,iBAAA;C3Bs/GH;A2Bp/GC;EC3KA,6BAAA;EACC,4BAAA;EAOD,8BAAA;EACC,6BAAA;C5B4pHF;A2Bt/GC;EC/KA,2BAAA;EACC,0BAAA;EAOD,gCAAA;EACC,+BAAA;C5BkqHF;A2Bv/GD;EACE,iBAAA;C3By/GD;A2Bv/GD;;EC/KE,8BAAA;EACC,6BAAA;C5B0qHF;A2Bt/GD;EC7LE,2BAAA;EACC,0BAAA;C5BsrHF;A2Bl/GD;EACE,eAAA;EACA,YAAA;EACA,oBAAA;EACA,0BAAA;C3Bo/GD;A2Bx/GD;;EAOI,YAAA;EACA,oBAAA;EACA,UAAA;C3Bq/GH;A2B9/GD;EAYI,YAAA;C3Bq/GH;A2BjgHD;EAgBI,WAAA;C3Bo/GH;A2Bn+GD;;;;EAKM,mBAAA;EACA,uBAAA;EACA,qBAAA;C3Bo+GL;A6B9sHD;EACE,mBAAA;EACA,eAAA;EACA,0BAAA;C7BgtHD;A6B7sHC;EACE,YAAA;EACA,gBAAA;EACA,iBAAA;C7B+sHH;A6BxtHD;EAeI,mBAAA;EACA,WAAA;EAKA,YAAA;EAEA,YAAA;EACA,iBAAA;C7BusHH;A6BrsHG;EACE,WAAA;C7BusHL;A6B7rHD;;;EV0BE,aAAA;EACA,mBAAA;EACA,gBAAA;EACA,uBAAA;EACA,mBAAA;CnBwqHD;AmBtqHC;;;EACE,aAAA;EACA,kBAAA;CnB0qHH;AmBvqHC;;;;;;EAEE,aAAA;CnB6qHH;A6B/sHD;;;EVqBE,aAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;CnB+rHD;AmB7rHC;;;EACE,aAAA;EACA,kBAAA;CnBisHH;AmB9rHC;;;;;;EAEE,aAAA;CnBosHH;A6B7tHD;;;EAGE,oBAAA;C7B+tHD;A6B7tHC;;;EACE,iBAAA;C7BiuHH;A6B7tHD;;EAEE,UAAA;EACA,oBAAA;EACA,uBAAA;C7B+tHD;A6B1tHD;EACE,kBAAA;EACA,gBAAA;EACA,oBAAA;EACA,eAAA;EACA,eAAA;EACA,mBAAA;EACA,0BAAA;EACA,uBAAA;EACA,mBAAA;C7B4tHD;A6BztHC;EACE,kBAAA;EACA,gBAAA;EACA,mBAAA;C7B2tHH;A6BztHC;EACE,mBAAA;EACA,gBAAA;EACA,mBAAA;C7B2tHH;A6B/uHD;;EA0BI,cAAA;C7BytHH;A6BptHD;;;;;;;EDpGE,8BAAA;EACG,2BAAA;C5Bi0HJ;A6BrtHD;EACE,gBAAA;C7ButHD;A6BrtHD;;;;;;;EDxGE,6BAAA;EACG,0BAAA;C5Bs0HJ;A6BttHD;EACE,eAAA;C7BwtHD;A6BntHD;EACE,mBAAA;EAGA,aAAA;EACA,oBAAA;C7BmtHD;A6BxtHD;EAUI,mBAAA;C7BitHH;A6B3tHD;EAYM,kBAAA;C7BktHL;A6B/sHG;;;EAGE,WAAA;C7BitHL;A6B5sHC;;EAGI,mBAAA;C7B6sHL;A6B1sHC;;EAGI,WAAA;EACA,kBAAA;C7B2sHL;A8B12HD;EACE,iBAAA;EACA,gBAAA;EACA,iBAAA;C9B42HD;A8B/2HD;EAOI,mBAAA;EACA,eAAA;C9B22HH;A8Bn3HD;EAWM,mBAAA;EACA,eAAA;EACA,mBAAA;C9B22HL;A8B12HK;;EAEE,sBAAA;EACA,0BAAA;C9B42HP;A8Bv2HG;EACE,eAAA;C9By2HL;A8Bv2HK;;EAEE,eAAA;EACA,sBAAA;EACA,8BAAA;EACA,oBAAA;C9By2HP;A8Bl2HG;;;EAGE,0BAAA;EACA,sBAAA;C9Bo2HL;A8B74HD;ELHE,YAAA;EACA,cAAA;EACA,iBAAA;EACA,0BAAA;CzBm5HD;A8Bn5HD;EA0DI,gBAAA;C9B41HH;A8Bn1HD;EACE,8BAAA;C9Bq1HD;A8Bt1HD;EAGI,YAAA;EAEA,oBAAA;C9Bq1HH;A8B11HD;EASM,kBAAA;EACA,wBAAA;EACA,8BAAA;EACA,2BAAA;C9Bo1HL;A8Bn1HK;EACE,mCAAA;C9Bq1HP;A8B/0HK;;;EAGE,eAAA;EACA,uBAAA;EACA,uBAAA;EACA,iCAAA;EACA,gBAAA;C9Bi1HP;A8B50HC;EAqDA,YAAA;EA8BA,iBAAA;C9B6vHD;A8Bh1HC;EAwDE,YAAA;C9B2xHH;A8Bn1HC;EA0DI,mBAAA;EACA,mBAAA;C9B4xHL;A8Bv1HC;EAgEE,UAAA;EACA,WAAA;C9B0xHH;A8B9wHD;EA0DA;IAjEM,oBAAA;IACA,UAAA;G9ByxHH;E8BztHH;IA9DQ,iBAAA;G9B0xHL;CACF;A8Bp2HC;EAuFE,gBAAA;EACA,mBAAA;C9BgxHH;A8Bx2HC;;;EA8FE,uBAAA;C9B+wHH;A8BjwHD;EA2BA;IApCM,8BAAA;IACA,2BAAA;G9B8wHH;E8B3uHH;;;IA9BM,0BAAA;G9B8wHH;CACF;A8B/2HD;EAEI,YAAA;C9Bg3HH;A8Bl3HD;EAMM,mBAAA;C9B+2HL;A8Br3HD;EASM,iBAAA;C9B+2HL;A8B12HK;;;EAGE,YAAA;EACA,0BAAA;C9B42HP;A8Bp2HD;EAEI,YAAA;C9Bq2HH;A8Bv2HD;EAIM,gBAAA;EACA,eAAA;C9Bs2HL;A8B11HD;EACE,YAAA;C9B41HD;A8B71HD;EAII,YAAA;C9B41HH;A8Bh2HD;EAMM,mBAAA;EACA,mBAAA;C9B61HL;A8Bp2HD;EAYI,UAAA;EACA,WAAA;C9B21HH;A8B/0HD;EA0DA;IAjEM,oBAAA;IACA,UAAA;G9B01HH;E8B1xHH;IA9DQ,iBAAA;G9B21HL;CACF;A8Bn1HD;EACE,iBAAA;C9Bq1HD;A8Bt1HD;EAKI,gBAAA;EACA,mBAAA;C9Bo1HH;A8B11HD;;;EAYI,uBAAA;C9Bm1HH;A8Br0HD;EA2BA;IApCM,8BAAA;IACA,2BAAA;G9Bk1HH;E8B/yHH;;;IA9BM,0BAAA;G9Bk1HH;CACF;A8Bz0HD;EAEI,cAAA;C9B00HH;A8B50HD;EAKI,eAAA;C9B00HH;A8Bj0HD;EAEE,iBAAA;EF3OA,2BAAA;EACC,0BAAA;C5B8iIF;A+BxiID;EACE,mBAAA;EACA,iBAAA;EACA,oBAAA;EACA,8BAAA;C/B0iID;A+BliID;EA8nBA;IAhoBI,mBAAA;G/BwiID;CACF;A+BzhID;EAgnBA;IAlnBI,YAAA;G/B+hID;CACF;A+BjhID;EACE,oBAAA;EACA,oBAAA;EACA,mBAAA;EACA,kCAAA;EACA,2DAAA;UAAA,mDAAA;EAEA,kCAAA;C/BkhID;A+BhhIC;EACE,iBAAA;C/BkhIH;A+Bt/HD;EA6jBA;IArlBI,YAAA;IACA,cAAA;IACA,yBAAA;YAAA,iBAAA;G/BkhID;E+BhhIC;IACE,0BAAA;IACA,wBAAA;IACA,kBAAA;IACA,6BAAA;G/BkhIH;E+B/gIC;IACE,oBAAA;G/BihIH;E+B5gIC;;;IAGE,gBAAA;IACA,iBAAA;G/B8gIH;CACF;A+B1gID;;EAGI,kBAAA;C/B2gIH;A+BtgIC;EAmjBF;;IArjBM,kBAAA;G/B6gIH;CACF;A+BpgID;;;;EAII,oBAAA;EACA,mBAAA;C/BsgIH;A+BhgIC;EAgiBF;;;;IAniBM,gBAAA;IACA,eAAA;G/B0gIH;CACF;A+B9/HD;EACE,cAAA;EACA,sBAAA;C/BggID;A+B3/HD;EA8gBA;IAhhBI,iBAAA;G/BigID;CACF;A+B7/HD;;EAEE,gBAAA;EACA,SAAA;EACA,QAAA;EACA,cAAA;C/B+/HD;A+Bz/HD;EAggBA;;IAlgBI,iBAAA;G/BggID;CACF;A+B9/HD;EACE,OAAA;EACA,sBAAA;C/BggID;A+B9/HD;EACE,UAAA;EACA,iBAAA;EACA,sBAAA;C/BggID;A+B1/HD;EACE,YAAA;EACA,mBAAA;EACA,gBAAA;EACA,kBAAA;EACA,aAAA;C/B4/HD;A+B1/HC;;EAEE,sBAAA;C/B4/HH;A+BrgID;EAaI,eAAA;C/B2/HH;A+Bl/HD;EALI;;IAEE,mBAAA;G/B0/HH;CACF;A+Bh/HD;EACE,mBAAA;EACA,aAAA;EACA,mBAAA;EACA,kBAAA;EC9LA,gBAAA;EACA,mBAAA;ED+LA,8BAAA;EACA,uBAAA;EACA,8BAAA;EACA,mBAAA;C/Bm/HD;A+B/+HC;EACE,WAAA;C/Bi/HH;A+B//HD;EAmBI,eAAA;EACA,YAAA;EACA,YAAA;EACA,mBAAA;C/B++HH;A+BrgID;EAyBI,gBAAA;C/B++HH;A+Bz+HD;EAqbA;IAvbI,cAAA;G/B++HD;CACF;A+Bt+HD;EACE,oBAAA;C/Bw+HD;A+Bz+HD;EAII,kBAAA;EACA,qBAAA;EACA,kBAAA;C/Bw+HH;A+B58HC;EA2YF;IAjaM,iBAAA;IACA,YAAA;IACA,YAAA;IACA,cAAA;IACA,8BAAA;IACA,UAAA;IACA,yBAAA;YAAA,iBAAA;G/Bs+HH;E+B3kHH;;IAxZQ,2BAAA;G/Bu+HL;E+B/kHH;IArZQ,kBAAA;G/Bu+HL;E+Bt+HK;;IAEE,uBAAA;G/Bw+HP;CACF;A+Bt9HD;EA+XA;IA1YI,YAAA;IACA,UAAA;G/Bq+HD;E+B5lHH;IAtYM,YAAA;G/Bq+HH;E+B/lHH;IApYQ,kBAAA;IACA,qBAAA;G/Bs+HL;CACF;A+B39HD;EACE,mBAAA;EACA,oBAAA;EACA,mBAAA;EACA,kCAAA;EACA,qCAAA;E1B9NA,6FAAA;EACQ,qFAAA;E2B/DR,gBAAA;EACA,mBAAA;ChC4vID;AkBtuHD;EAwEA;IAtIM,sBAAA;IACA,iBAAA;IACA,uBAAA;GlBwyHH;EkBpqHH;IA/HM,sBAAA;IACA,YAAA;IACA,uBAAA;GlBsyHH;EkBzqHH;IAxHM,sBAAA;GlBoyHH;EkB5qHH;IApHM,sBAAA;IACA,uBAAA;GlBmyHH;EkBhrHH;;;IA9GQ,YAAA;GlBmyHL;EkBrrHH;IAxGM,YAAA;GlBgyHH;EkBxrHH;IApGM,iBAAA;IACA,uBAAA;GlB+xHH;EkB5rHH;;IA5FM,sBAAA;IACA,cAAA;IACA,iBAAA;IACA,uBAAA;GlB4xHH;EkBnsHH;;IAtFQ,gBAAA;GlB6xHL;EkBvsHH;;IAjFM,mBAAA;IACA,eAAA;GlB4xHH;EkB5sHH;IA3EM,OAAA;GlB0xHH;CACF;A+BpgIC;EAmWF;IAzWM,mBAAA;G/B8gIH;E+B5gIG;IACE,iBAAA;G/B8gIL;CACF;A+B7/HD;EAoVA;IA5VI,YAAA;IACA,UAAA;IACA,eAAA;IACA,gBAAA;IACA,eAAA;IACA,kBAAA;I1BzPF,yBAAA;IACQ,iBAAA;GLmwIP;CACF;A+BngID;EACE,cAAA;EHpUA,2BAAA;EACC,0BAAA;C5B00IF;A+BngID;EACE,iBAAA;EHzUA,6BAAA;EACC,4BAAA;EAOD,8BAAA;EACC,6BAAA;C5By0IF;A+B//HD;EChVE,gBAAA;EACA,mBAAA;ChCk1ID;A+BhgIC;ECnVA,iBAAA;EACA,oBAAA;ChCs1ID;A+BjgIC;ECtVA,iBAAA;EACA,oBAAA;ChC01ID;A+B3/HD;EChWE,iBAAA;EACA,oBAAA;ChC81ID;A+Bv/HD;EAsSA;IA1SI,YAAA;IACA,kBAAA;IACA,mBAAA;G/B+/HD;CACF;A+Bl+HD;EAhBE;IExWA,uBAAA;GjC81IC;E+Br/HD;IE5WA,wBAAA;IF8WE,oBAAA;G/Bu/HD;E+Bz/HD;IAKI,gBAAA;G/Bu/HH;CACF;A+B9+HD;EACE,0BAAA;EACA,sBAAA;C/Bg/HD;A+Bl/HD;EAKI,YAAA;C/Bg/HH;A+B/+HG;;EAEE,eAAA;EACA,8BAAA;C/Bi/HL;A+B1/HD;EAcI,YAAA;C/B++HH;A+B7/HD;EAmBM,YAAA;C/B6+HL;A+B3+HK;;EAEE,YAAA;EACA,8BAAA;C/B6+HP;A+Bz+HK;;;EAGE,YAAA;EACA,0BAAA;C/B2+HP;A+Bv+HK;;;EAGE,YAAA;EACA,8BAAA;C/By+HP;A+BjhID;EA8CI,mBAAA;C/Bs+HH;A+Br+HG;;EAEE,uBAAA;C/Bu+HL;A+BxhID;EAoDM,uBAAA;C/Bu+HL;A+B3hID;;EA0DI,sBAAA;C/Bq+HH;A+B99HK;;;EAGE,0BAAA;EACA,YAAA;C/Bg+HP;A+B/7HC;EAoKF;IA7LU,YAAA;G/B49HP;E+B39HO;;IAEE,YAAA;IACA,8BAAA;G/B69HT;E+Bz9HO;;;IAGE,YAAA;IACA,0BAAA;G/B29HT;E+Bv9HO;;;IAGE,YAAA;IACA,8BAAA;G/By9HT;CACF;A+B3jID;EA8GI,YAAA;C/Bg9HH;A+B/8HG;EACE,YAAA;C/Bi9HL;A+BjkID;EAqHI,YAAA;C/B+8HH;A+B98HG;;EAEE,YAAA;C/Bg9HL;A+B58HK;;;;EAEE,YAAA;C/Bg9HP;A+Bx8HD;EACE,uBAAA;EACA,sBAAA;C/B08HD;A+B58HD;EAKI,eAAA;C/B08HH;A+Bz8HG;;EAEE,YAAA;EACA,8BAAA;C/B28HL;A+Bp9HD;EAcI,eAAA;C/By8HH;A+Bv9HD;EAmBM,eAAA;C/Bu8HL;A+Br8HK;;EAEE,YAAA;EACA,8BAAA;C/Bu8HP;A+Bn8HK;;;EAGE,YAAA;EACA,0BAAA;C/Bq8HP;A+Bj8HK;;;EAGE,YAAA;EACA,8BAAA;C/Bm8HP;A+B3+HD;EA+CI,mBAAA;C/B+7HH;A+B97HG;;EAEE,uBAAA;C/Bg8HL;A+Bl/HD;EAqDM,uBAAA;C/Bg8HL;A+Br/HD;;EA2DI,sBAAA;C/B87HH;A+Bx7HK;;;EAGE,0BAAA;EACA,YAAA;C/B07HP;A+Bn5HC;EAwBF;IAvDU,sBAAA;G/Bs7HP;E+B/3HH;IApDU,0BAAA;G/Bs7HP;E+Bl4HH;IAjDU,eAAA;G/Bs7HP;E+Br7HO;;IAEE,YAAA;IACA,8BAAA;G/Bu7HT;E+Bn7HO;;;IAGE,YAAA;IACA,0BAAA;G/Bq7HT;E+Bj7HO;;;IAGE,YAAA;IACA,8BAAA;G/Bm7HT;CACF;A+B3hID;EA+GI,eAAA;C/B+6HH;A+B96HG;EACE,YAAA;C/Bg7HL;A+BjiID;EAsHI,eAAA;C/B86HH;A+B76HG;;EAEE,YAAA;C/B+6HL;A+B36HK;;;;EAEE,YAAA;C/B+6HP;AkCzjJD;EACE,kBAAA;EACA,oBAAA;EACA,iBAAA;EACA,0BAAA;EACA,mBAAA;ClC2jJD;AkChkJD;EAQI,sBAAA;ClC2jJH;AkCnkJD;EAWM,kBAAA;EACA,eAAA;EACA,YAAA;ClC2jJL;AkCxkJD;EAkBI,eAAA;ClCyjJH;AmC7kJD;EACE,sBAAA;EACA,gBAAA;EACA,eAAA;EACA,mBAAA;CnC+kJD;AmCnlJD;EAOI,gBAAA;CnC+kJH;AmCtlJD;;EAUM,mBAAA;EACA,YAAA;EACA,kBAAA;EACA,wBAAA;EACA,sBAAA;EACA,eAAA;EACA,uBAAA;EACA,uBAAA;EACA,kBAAA;CnCglJL;AmC9kJG;;EAGI,eAAA;EPXN,+BAAA;EACG,4BAAA;C5B2lJJ;AmC7kJG;;EPvBF,gCAAA;EACG,6BAAA;C5BwmJJ;AmCxkJG;;;;EAEE,WAAA;EACA,eAAA;EACA,0BAAA;EACA,mBAAA;CnC4kJL;AmCtkJG;;;;;;EAGE,WAAA;EACA,YAAA;EACA,0BAAA;EACA,sBAAA;EACA,gBAAA;CnC2kJL;AmCloJD;;;;;;EAkEM,eAAA;EACA,uBAAA;EACA,mBAAA;EACA,oBAAA;CnCwkJL;AmC/jJD;;EC3EM,mBAAA;EACA,gBAAA;EACA,uBAAA;CpC8oJL;AoC5oJG;;ERKF,+BAAA;EACG,4BAAA;C5B2oJJ;AoC3oJG;;ERTF,gCAAA;EACG,6BAAA;C5BwpJJ;AmC1kJD;;EChFM,kBAAA;EACA,gBAAA;EACA,iBAAA;CpC8pJL;AoC5pJG;;ERKF,+BAAA;EACG,4BAAA;C5B2pJJ;AoC3pJG;;ERTF,gCAAA;EACG,6BAAA;C5BwqJJ;AqC3qJD;EACE,gBAAA;EACA,eAAA;EACA,iBAAA;EACA,mBAAA;CrC6qJD;AqCjrJD;EAOI,gBAAA;CrC6qJH;AqCprJD;;EAUM,sBAAA;EACA,kBAAA;EACA,uBAAA;EACA,uBAAA;EACA,oBAAA;CrC8qJL;AqC5rJD;;EAmBM,sBAAA;EACA,0BAAA;CrC6qJL;AqCjsJD;;EA2BM,aAAA;CrC0qJL;AqCrsJD;;EAkCM,YAAA;CrCuqJL;AqCzsJD;;;;EA2CM,eAAA;EACA,uBAAA;EACA,oBAAA;CrCoqJL;AsCltJD;EACE,gBAAA;EACA,wBAAA;EACA,eAAA;EACA,kBAAA;EACA,eAAA;EACA,YAAA;EACA,mBAAA;EACA,oBAAA;EACA,yBAAA;EACA,qBAAA;CtCotJD;AsChtJG;;EAEE,YAAA;EACA,sBAAA;EACA,gBAAA;CtCktJL;AsC7sJC;EACE,cAAA;CtC+sJH;AsC3sJC;EACE,mBAAA;EACA,UAAA;CtC6sJH;AsCtsJD;ECtCE,0BAAA;CvC+uJD;AuC5uJG;;EAEE,0BAAA;CvC8uJL;AsCzsJD;EC1CE,0BAAA;CvCsvJD;AuCnvJG;;EAEE,0BAAA;CvCqvJL;AsC5sJD;EC9CE,0BAAA;CvC6vJD;AuC1vJG;;EAEE,0BAAA;CvC4vJL;AsC/sJD;EClDE,0BAAA;CvCowJD;AuCjwJG;;EAEE,0BAAA;CvCmwJL;AsCltJD;ECtDE,0BAAA;CvC2wJD;AuCxwJG;;EAEE,0BAAA;CvC0wJL;AsCrtJD;EC1DE,0BAAA;CvCkxJD;AuC/wJG;;EAEE,0BAAA;CvCixJL;AwCnxJD;EACE,sBAAA;EACA,gBAAA;EACA,iBAAA;EACA,gBAAA;EACA,kBAAA;EACA,YAAA;EACA,eAAA;EACA,uBAAA;EACA,oBAAA;EACA,mBAAA;EACA,0BAAA;EACA,oBAAA;CxCqxJD;AwClxJC;EACE,cAAA;CxCoxJH;AwChxJC;EACE,mBAAA;EACA,UAAA;CxCkxJH;AwC/wJC;;EAEE,OAAA;EACA,iBAAA;CxCixJH;AwC5wJG;;EAEE,YAAA;EACA,sBAAA;EACA,gBAAA;CxC8wJL;AwCzwJC;;EAEE,eAAA;EACA,uBAAA;CxC2wJH;AwCxwJC;EACE,aAAA;CxC0wJH;AwCvwJC;EACE,kBAAA;CxCywJH;AwCtwJC;EACE,iBAAA;CxCwwJH;AyCl0JD;EACE,kBAAA;EACA,qBAAA;EACA,oBAAA;EACA,eAAA;EACA,0BAAA;CzCo0JD;AyCz0JD;;EASI,eAAA;CzCo0JH;AyC70JD;EAaI,oBAAA;EACA,gBAAA;EACA,iBAAA;CzCm0JH;AyCl1JD;EAmBI,0BAAA;CzCk0JH;AyC/zJC;;EAEE,mBAAA;EACA,mBAAA;EACA,oBAAA;CzCi0JH;AyC31JD;EA8BI,gBAAA;CzCg0JH;AyC9yJD;EACA;IAfI,kBAAA;IACA,qBAAA;GzCg0JD;EyC9zJC;;IAEE,mBAAA;IACA,oBAAA;GzCg0JH;EyCvzJH;;IAJM,gBAAA;GzC+zJH;CACF;A0C52JD;EACE,eAAA;EACA,aAAA;EACA,oBAAA;EACA,wBAAA;EACA,uBAAA;EACA,uBAAA;EACA,mBAAA;ErCiLA,4CAAA;EACK,uCAAA;EACG,oCAAA;CL8rJT;A0Cx3JD;;EAaI,kBAAA;EACA,mBAAA;C1C+2JH;A0C32JC;;;EAGE,sBAAA;C1C62JH;A0Cl4JD;EA0BI,aAAA;EACA,eAAA;C1C22JH;A2Cp4JD;EACE,cAAA;EACA,oBAAA;EACA,8BAAA;EACA,mBAAA;C3Cs4JD;A2C14JD;EAQI,cAAA;EAEA,eAAA;C3Co4JH;A2C94JD;EAeI,kBAAA;C3Ck4JH;A2Cj5JD;;EAqBI,iBAAA;C3Cg4JH;A2Cr5JD;EAyBI,gBAAA;C3C+3JH;A2Cv3JD;;EAEE,oBAAA;C3Cy3JD;A2C33JD;;EAMI,mBAAA;EACA,UAAA;EACA,aAAA;EACA,eAAA;C3Cy3JH;A2Cj3JD;ECvDE,0BAAA;EACA,sBAAA;EACA,eAAA;C5C26JD;A2Ct3JD;EClDI,0BAAA;C5C26JH;A2Cz3JD;EC/CI,eAAA;C5C26JH;A2Cx3JD;EC3DE,0BAAA;EACA,sBAAA;EACA,eAAA;C5Cs7JD;A2C73JD;ECtDI,0BAAA;C5Cs7JH;A2Ch4JD;ECnDI,eAAA;C5Cs7JH;A2C/3JD;EC/DE,0BAAA;EACA,sBAAA;EACA,eAAA;C5Ci8JD;A2Cp4JD;EC1DI,0BAAA;C5Ci8JH;A2Cv4JD;ECvDI,eAAA;C5Ci8JH;A2Ct4JD;ECnEE,0BAAA;EACA,sBAAA;EACA,eAAA;C5C48JD;A2C34JD;EC9DI,0BAAA;C5C48JH;A2C94JD;EC3DI,eAAA;C5C48JH;A6C98JD;EACE;IAAQ,4BAAA;G7Ci9JP;E6Ch9JD;IAAQ,yBAAA;G7Cm9JP;CACF;A6Ch9JD;EACE;IAAQ,4BAAA;G7Cm9JP;E6Cl9JD;IAAQ,yBAAA;G7Cq9JP;CACF;A6Cx9JD;EACE;IAAQ,4BAAA;G7Cm9JP;E6Cl9JD;IAAQ,yBAAA;G7Cq9JP;CACF;A6C98JD;EACE,iBAAA;EACA,aAAA;EACA,oBAAA;EACA,0BAAA;EACA,mBAAA;ExCsCA,uDAAA;EACQ,+CAAA;CL26JT;A6C78JD;EACE,YAAA;EACA,UAAA;EACA,aAAA;EACA,gBAAA;EACA,kBAAA;EACA,YAAA;EACA,mBAAA;EACA,0BAAA;ExCyBA,uDAAA;EACQ,+CAAA;EAyHR,oCAAA;EACK,+BAAA;EACG,4BAAA;CL+zJT;A6C18JD;;ECCI,8MAAA;EACA,yMAAA;EACA,sMAAA;EDAF,mCAAA;UAAA,2BAAA;C7C88JD;A6Cv8JD;;ExC5CE,2DAAA;EACK,sDAAA;EACG,mDAAA;CLu/JT;A6Cp8JD;EErEE,0BAAA;C/C4gKD;A+CzgKC;EDgDE,8MAAA;EACA,yMAAA;EACA,sMAAA;C9C49JH;A6Cx8JD;EEzEE,0BAAA;C/CohKD;A+CjhKC;EDgDE,8MAAA;EACA,yMAAA;EACA,sMAAA;C9Co+JH;A6C58JD;EE7EE,0BAAA;C/C4hKD;A+CzhKC;EDgDE,8MAAA;EACA,yMAAA;EACA,sMAAA;C9C4+JH;A6Ch9JD;EEjFE,0BAAA;C/CoiKD;A+CjiKC;EDgDE,8MAAA;EACA,yMAAA;EACA,sMAAA;C9Co/JH;AgD5iKD;EAEE,iBAAA;ChD6iKD;AgD3iKC;EACE,cAAA;ChD6iKH;AgDziKD;;EAEE,QAAA;EACA,iBAAA;ChD2iKD;AgDxiKD;EACE,eAAA;ChD0iKD;AgDviKD;EACE,eAAA;ChDyiKD;AgDtiKC;EACE,gBAAA;ChDwiKH;AgDpiKD;;EAEE,mBAAA;ChDsiKD;AgDniKD;;EAEE,oBAAA;ChDqiKD;AgDliKD;;;EAGE,oBAAA;EACA,oBAAA;ChDoiKD;AgDjiKD;EACE,uBAAA;ChDmiKD;AgDhiKD;EACE,uBAAA;ChDkiKD;AgD9hKD;EACE,cAAA;EACA,mBAAA;ChDgiKD;AgD1hKD;EACE,gBAAA;EACA,iBAAA;ChD4hKD;AiDnlKD;EAEE,oBAAA;EACA,gBAAA;CjDolKD;AiD5kKD;EACE,mBAAA;EACA,eAAA;EACA,mBAAA;EAEA,oBAAA;EACA,uBAAA;EACA,uBAAA;CjD6kKD;AiD1kKC;ErB3BA,6BAAA;EACC,4BAAA;C5BwmKF;AiD3kKC;EACE,iBAAA;ErBvBF,gCAAA;EACC,+BAAA;C5BqmKF;AiDpkKD;;EAEE,YAAA;CjDskKD;AiDxkKD;;EAKI,YAAA;CjDukKH;AiDnkKC;;;;EAEE,sBAAA;EACA,YAAA;EACA,0BAAA;CjDukKH;AiDnkKD;EACE,YAAA;EACA,iBAAA;CjDqkKD;AiDhkKC;;;EAGE,0BAAA;EACA,eAAA;EACA,oBAAA;CjDkkKH;AiDvkKC;;;EASI,eAAA;CjDmkKL;AiD5kKC;;;EAYI,eAAA;CjDqkKL;AiDhkKC;;;EAGE,WAAA;EACA,YAAA;EACA,0BAAA;EACA,sBAAA;CjDkkKH;AiDxkKC;;;;;;;;;EAYI,eAAA;CjDukKL;AiDnlKC;;;EAeI,eAAA;CjDykKL;AkD3qKC;EACE,eAAA;EACA,0BAAA;ClD6qKH;AkD3qKG;;EAEE,eAAA;ClD6qKL;AkD/qKG;;EAKI,eAAA;ClD8qKP;AkD3qKK;;;;EAEE,eAAA;EACA,0BAAA;ClD+qKP;AkD7qKK;;;;;;EAGE,YAAA;EACA,0BAAA;EACA,sBAAA;ClDkrKP;AkDxsKC;EACE,eAAA;EACA,0BAAA;ClD0sKH;AkDxsKG;;EAEE,eAAA;ClD0sKL;AkD5sKG;;EAKI,eAAA;ClD2sKP;AkDxsKK;;;;EAEE,eAAA;EACA,0BAAA;ClD4sKP;AkD1sKK;;;;;;EAGE,YAAA;EACA,0BAAA;EACA,sBAAA;ClD+sKP;AkDruKC;EACE,eAAA;EACA,0BAAA;ClDuuKH;AkDruKG;;EAEE,eAAA;ClDuuKL;AkDzuKG;;EAKI,eAAA;ClDwuKP;AkDruKK;;;;EAEE,eAAA;EACA,0BAAA;ClDyuKP;AkDvuKK;;;;;;EAGE,YAAA;EACA,0BAAA;EACA,sBAAA;ClD4uKP;AkDlwKC;EACE,eAAA;EACA,0BAAA;ClDowKH;AkDlwKG;;EAEE,eAAA;ClDowKL;AkDtwKG;;EAKI,eAAA;ClDqwKP;AkDlwKK;;;;EAEE,eAAA;EACA,0BAAA;ClDswKP;AkDpwKK;;;;;;EAGE,YAAA;EACA,0BAAA;EACA,sBAAA;ClDywKP;AiDxqKD;EACE,cAAA;EACA,mBAAA;CjD0qKD;AiDxqKD;EACE,iBAAA;EACA,iBAAA;CjD0qKD;AmDpyKD;EACE,oBAAA;EACA,uBAAA;EACA,8BAAA;EACA,mBAAA;E9C0DA,kDAAA;EACQ,0CAAA;CL6uKT;AmDnyKD;EACE,cAAA;CnDqyKD;AmDhyKD;EACE,mBAAA;EACA,qCAAA;EvBpBA,6BAAA;EACC,4BAAA;C5BuzKF;AmDtyKD;EAMI,eAAA;CnDmyKH;AmD9xKD;EACE,cAAA;EACA,iBAAA;EACA,gBAAA;EACA,eAAA;CnDgyKD;AmDpyKD;;;;;EAWI,eAAA;CnDgyKH;AmD3xKD;EACE,mBAAA;EACA,0BAAA;EACA,2BAAA;EvBxCA,gCAAA;EACC,+BAAA;C5Bs0KF;AmDrxKD;;EAGI,iBAAA;CnDsxKH;AmDzxKD;;EAMM,oBAAA;EACA,iBAAA;CnDuxKL;AmDnxKG;;EAEI,cAAA;EvBvEN,6BAAA;EACC,4BAAA;C5B61KF;AmDjxKG;;EAEI,iBAAA;EvBvEN,gCAAA;EACC,+BAAA;C5B21KF;AmD1yKD;EvB1DE,2BAAA;EACC,0BAAA;C5Bu2KF;AmD7wKD;EAEI,oBAAA;CnD8wKH;AmD3wKD;EACE,oBAAA;CnD6wKD;AmDrwKD;;;EAII,iBAAA;CnDswKH;AmD1wKD;;;EAOM,mBAAA;EACA,oBAAA;CnDwwKL;AmDhxKD;;EvBzGE,6BAAA;EACC,4BAAA;C5B63KF;AmDrxKD;;;;EAmBQ,4BAAA;EACA,6BAAA;CnDwwKP;AmD5xKD;;;;;;;;EAwBU,4BAAA;CnD8wKT;AmDtyKD;;;;;;;;EA4BU,6BAAA;CnDoxKT;AmDhzKD;;EvBjGE,gCAAA;EACC,+BAAA;C5Bq5KF;AmDrzKD;;;;EAyCQ,+BAAA;EACA,gCAAA;CnDkxKP;AmD5zKD;;;;;;;;EA8CU,+BAAA;CnDwxKT;AmDt0KD;;;;;;;;EAkDU,gCAAA;CnD8xKT;AmDh1KD;;;;EA2DI,2BAAA;CnD2xKH;AmDt1KD;;EA+DI,cAAA;CnD2xKH;AmD11KD;;EAmEI,UAAA;CnD2xKH;AmD91KD;;;;;;;;;;;;EA0EU,eAAA;CnDkyKT;AmD52KD;;;;;;;;;;;;EA8EU,gBAAA;CnD4yKT;AmD13KD;;;;;;;;EAuFU,iBAAA;CnD6yKT;AmDp4KD;;;;;;;;EAgGU,iBAAA;CnD8yKT;AmD94KD;EAsGI,UAAA;EACA,iBAAA;CnD2yKH;AmDjyKD;EACE,oBAAA;CnDmyKD;AmDpyKD;EAKI,iBAAA;EACA,mBAAA;CnDkyKH;AmDxyKD;EASM,gBAAA;CnDkyKL;AmD3yKD;EAcI,iBAAA;CnDgyKH;AmD9yKD;;EAkBM,2BAAA;CnDgyKL;AmDlzKD;EAuBI,cAAA;CnD8xKH;AmDrzKD;EAyBM,8BAAA;CnD+xKL;AmDxxKD;EC1PE,mBAAA;CpDqhLD;AoDnhLC;EACE,eAAA;EACA,0BAAA;EACA,mBAAA;CpDqhLH;AoDxhLC;EAMI,uBAAA;CpDqhLL;AoD3hLC;EASI,eAAA;EACA,0BAAA;CpDqhLL;AoDlhLC;EAEI,0BAAA;CpDmhLL;AmDvyKD;EC7PE,sBAAA;CpDuiLD;AoDriLC;EACE,YAAA;EACA,0BAAA;EACA,sBAAA;CpDuiLH;AoD1iLC;EAMI,0BAAA;CpDuiLL;AoD7iLC;EASI,eAAA;EACA,uBAAA;CpDuiLL;AoDpiLC;EAEI,6BAAA;CpDqiLL;AmDtzKD;EChQE,sBAAA;CpDyjLD;AoDvjLC;EACE,eAAA;EACA,0BAAA;EACA,sBAAA;CpDyjLH;AoD5jLC;EAMI,0BAAA;CpDyjLL;AoD/jLC;EASI,eAAA;EACA,0BAAA;CpDyjLL;AoDtjLC;EAEI,6BAAA;CpDujLL;AmDr0KD;ECnQE,sBAAA;CpD2kLD;AoDzkLC;EACE,eAAA;EACA,0BAAA;EACA,sBAAA;CpD2kLH;AoD9kLC;EAMI,0BAAA;CpD2kLL;AoDjlLC;EASI,eAAA;EACA,0BAAA;CpD2kLL;AoDxkLC;EAEI,6BAAA;CpDykLL;AmDp1KD;ECtQE,sBAAA;CpD6lLD;AoD3lLC;EACE,eAAA;EACA,0BAAA;EACA,sBAAA;CpD6lLH;AoDhmLC;EAMI,0BAAA;CpD6lLL;AoDnmLC;EASI,eAAA;EACA,0BAAA;CpD6lLL;AoD1lLC;EAEI,6BAAA;CpD2lLL;AmDn2KD;ECzQE,sBAAA;CpD+mLD;AoD7mLC;EACE,eAAA;EACA,0BAAA;EACA,sBAAA;CpD+mLH;AoDlnLC;EAMI,0BAAA;CpD+mLL;AoDrnLC;EASI,eAAA;EACA,0BAAA;CpD+mLL;AoD5mLC;EAEI,6BAAA;CpD6mLL;AqD7nLD;EACE,mBAAA;EACA,eAAA;EACA,UAAA;EACA,WAAA;EACA,iBAAA;CrD+nLD;AqDpoLD;;;;;EAYI,mBAAA;EACA,OAAA;EACA,QAAA;EACA,UAAA;EACA,aAAA;EACA,YAAA;EACA,UAAA;CrD+nLH;AqD1nLD;EACE,uBAAA;CrD4nLD;AqDxnLD;EACE,oBAAA;CrD0nLD;AsDrpLD;EACE,iBAAA;EACA,cAAA;EACA,oBAAA;EACA,0BAAA;EACA,0BAAA;EACA,mBAAA;EjDwDA,wDAAA;EACQ,gDAAA;CLgmLT;AsD/pLD;EASI,mBAAA;EACA,kCAAA;CtDypLH;AsDppLD;EACE,cAAA;EACA,mBAAA;CtDspLD;AsDppLD;EACE,aAAA;EACA,mBAAA;CtDspLD;AuD5qLD;EACE,aAAA;EACA,gBAAA;EACA,kBAAA;EACA,eAAA;EACA,YAAA;EACA,0BAAA;EjCRA,aAAA;EAGA,0BAAA;CtBqrLD;AuD7qLC;;EAEE,YAAA;EACA,sBAAA;EACA,gBAAA;EjCfF,aAAA;EAGA,0BAAA;CtB6rLD;AuDzqLC;EACE,WAAA;EACA,gBAAA;EACA,wBAAA;EACA,UAAA;EACA,yBAAA;CvD2qLH;AwDhsLD;EACE,iBAAA;CxDksLD;AwD9rLD;EACE,cAAA;EACA,iBAAA;EACA,gBAAA;EACA,OAAA;EACA,SAAA;EACA,UAAA;EACA,QAAA;EACA,cAAA;EACA,kCAAA;EAIA,WAAA;CxD6rLD;AwD1rLC;EnD+GA,sCAAA;EACI,kCAAA;EACC,iCAAA;EACG,8BAAA;EAkER,oDAAA;EAEK,0CAAA;EACG,oCAAA;CL6gLT;AwDhsLC;EnD2GA,mCAAA;EACI,+BAAA;EACC,8BAAA;EACG,2BAAA;CLwlLT;AwDpsLD;EACE,mBAAA;EACA,iBAAA;CxDssLD;AwDlsLD;EACE,mBAAA;EACA,YAAA;EACA,aAAA;CxDosLD;AwDhsLD;EACE,mBAAA;EACA,uBAAA;EACA,uBAAA;EACA,qCAAA;EACA,mBAAA;EnDaA,iDAAA;EACQ,yCAAA;EmDZR,qCAAA;UAAA,6BAAA;EAEA,WAAA;CxDksLD;AwD9rLD;EACE,gBAAA;EACA,OAAA;EACA,SAAA;EACA,UAAA;EACA,QAAA;EACA,cAAA;EACA,uBAAA;CxDgsLD;AwD9rLC;ElCrEA,WAAA;EAGA,yBAAA;CtBowLD;AwDjsLC;ElCtEA,aAAA;EAGA,0BAAA;CtBwwLD;AwDhsLD;EACE,cAAA;EACA,iCAAA;CxDksLD;AwD9rLD;EACE,iBAAA;CxDgsLD;AwD5rLD;EACE,UAAA;EACA,wBAAA;CxD8rLD;AwDzrLD;EACE,mBAAA;EACA,cAAA;CxD2rLD;AwDvrLD;EACE,cAAA;EACA,kBAAA;EACA,8BAAA;CxDyrLD;AwD5rLD;EAQI,iBAAA;EACA,iBAAA;CxDurLH;AwDhsLD;EAaI,kBAAA;CxDsrLH;AwDnsLD;EAiBI,eAAA;CxDqrLH;AwDhrLD;EACE,mBAAA;EACA,aAAA;EACA,YAAA;EACA,aAAA;EACA,iBAAA;CxDkrLD;AwDhqLD;EAZE;IACE,aAAA;IACA,kBAAA;GxD+qLD;EwD7qLD;InDvEA,kDAAA;IACQ,0CAAA;GLuvLP;EwD5qLD;IAAY,aAAA;GxD+qLX;CACF;AwD1qLD;EAFE;IAAY,aAAA;GxDgrLX;CACF;AyD/zLD;EACE,mBAAA;EACA,cAAA;EACA,eAAA;ECRA,4DAAA;EAEA,mBAAA;EACA,oBAAA;EACA,uBAAA;EACA,iBAAA;EACA,wBAAA;EACA,iBAAA;EACA,kBAAA;EACA,sBAAA;EACA,kBAAA;EACA,qBAAA;EACA,oBAAA;EACA,mBAAA;EACA,qBAAA;EACA,kBAAA;EDHA,gBAAA;EnCVA,WAAA;EAGA,yBAAA;CtBs1LD;AyD30LC;EnCdA,aAAA;EAGA,0BAAA;CtB01LD;AyD90LC;EAAW,iBAAA;EAAmB,eAAA;CzDk1L/B;AyDj1LC;EAAW,iBAAA;EAAmB,eAAA;CzDq1L/B;AyDp1LC;EAAW,gBAAA;EAAmB,eAAA;CzDw1L/B;AyDv1LC;EAAW,kBAAA;EAAmB,eAAA;CzD21L/B;AyDv1LD;EACE,iBAAA;EACA,iBAAA;EACA,YAAA;EACA,mBAAA;EACA,uBAAA;EACA,mBAAA;CzDy1LD;AyDr1LD;EACE,mBAAA;EACA,SAAA;EACA,UAAA;EACA,0BAAA;EACA,oBAAA;CzDu1LD;AyDn1LC;EACE,UAAA;EACA,UAAA;EACA,kBAAA;EACA,wBAAA;EACA,uBAAA;CzDq1LH;AyDn1LC;EACE,UAAA;EACA,WAAA;EACA,oBAAA;EACA,wBAAA;EACA,uBAAA;CzDq1LH;AyDn1LC;EACE,UAAA;EACA,UAAA;EACA,oBAAA;EACA,wBAAA;EACA,uBAAA;CzDq1LH;AyDn1LC;EACE,SAAA;EACA,QAAA;EACA,iBAAA;EACA,4BAAA;EACA,yBAAA;CzDq1LH;AyDn1LC;EACE,SAAA;EACA,SAAA;EACA,iBAAA;EACA,4BAAA;EACA,wBAAA;CzDq1LH;AyDn1LC;EACE,OAAA;EACA,UAAA;EACA,kBAAA;EACA,wBAAA;EACA,0BAAA;CzDq1LH;AyDn1LC;EACE,OAAA;EACA,WAAA;EACA,iBAAA;EACA,wBAAA;EACA,0BAAA;CzDq1LH;AyDn1LC;EACE,OAAA;EACA,UAAA;EACA,iBAAA;EACA,wBAAA;EACA,0BAAA;CzDq1LH;A2Dl7LD;EACE,mBAAA;EACA,OAAA;EACA,QAAA;EACA,cAAA;EACA,cAAA;EACA,iBAAA;EACA,aAAA;EDXA,4DAAA;EAEA,mBAAA;EACA,oBAAA;EACA,uBAAA;EACA,iBAAA;EACA,wBAAA;EACA,iBAAA;EACA,kBAAA;EACA,sBAAA;EACA,kBAAA;EACA,qBAAA;EACA,oBAAA;EACA,mBAAA;EACA,qBAAA;EACA,kBAAA;ECAA,gBAAA;EAEA,uBAAA;EACA,qCAAA;UAAA,6BAAA;EACA,uBAAA;EACA,qCAAA;EACA,mBAAA;EtD8CA,kDAAA;EACQ,0CAAA;CLk5LT;A2D77LC;EAAY,kBAAA;C3Dg8Lb;A2D/7LC;EAAY,kBAAA;C3Dk8Lb;A2Dj8LC;EAAY,iBAAA;C3Do8Lb;A2Dn8LC;EAAY,mBAAA;C3Ds8Lb;A2Dn8LD;EACE,UAAA;EACA,kBAAA;EACA,gBAAA;EACA,0BAAA;EACA,iCAAA;EACA,2BAAA;C3Dq8LD;A2Dl8LD;EACE,kBAAA;C3Do8LD;A2D57LC;;EAEE,mBAAA;EACA,eAAA;EACA,SAAA;EACA,UAAA;EACA,0BAAA;EACA,oBAAA;C3D87LH;A2D37LD;EACE,mBAAA;C3D67LD;A2D37LD;EACE,mBAAA;EACA,YAAA;C3D67LD;A2Dz7LC;EACE,UAAA;EACA,mBAAA;EACA,uBAAA;EACA,0BAAA;EACA,sCAAA;EACA,cAAA;C3D27LH;A2D17LG;EACE,aAAA;EACA,YAAA;EACA,mBAAA;EACA,uBAAA;EACA,uBAAA;C3D47LL;A2Dz7LC;EACE,SAAA;EACA,YAAA;EACA,kBAAA;EACA,qBAAA;EACA,4BAAA;EACA,wCAAA;C3D27LH;A2D17LG;EACE,aAAA;EACA,UAAA;EACA,cAAA;EACA,qBAAA;EACA,yBAAA;C3D47LL;A2Dz7LC;EACE,UAAA;EACA,mBAAA;EACA,oBAAA;EACA,6BAAA;EACA,yCAAA;EACA,WAAA;C3D27LH;A2D17LG;EACE,aAAA;EACA,SAAA;EACA,mBAAA;EACA,oBAAA;EACA,0BAAA;C3D47LL;A2Dx7LC;EACE,SAAA;EACA,aAAA;EACA,kBAAA;EACA,sBAAA;EACA,2BAAA;EACA,uCAAA;C3D07LH;A2Dz7LG;EACE,aAAA;EACA,WAAA;EACA,sBAAA;EACA,wBAAA;EACA,cAAA;C3D27LL;A4DpjMD;EACE,mBAAA;C5DsjMD;A4DnjMD;EACE,mBAAA;EACA,iBAAA;EACA,YAAA;C5DqjMD;A4DxjMD;EAMI,cAAA;EACA,mBAAA;EvD6KF,0CAAA;EACK,qCAAA;EACG,kCAAA;CLy4LT;A4D/jMD;;EAcM,eAAA;C5DqjML;A4D3hMC;EA4NF;IvD3DE,uDAAA;IAEK,6CAAA;IACG,uCAAA;IA7JR,oCAAA;IAEQ,4BAAA;IA+GR,4BAAA;IAEQ,oBAAA;GL86LP;E4DzjMG;;IvDmHJ,2CAAA;IACQ,mCAAA;IuDjHF,QAAA;G5D4jML;E4D1jMG;;IvD8GJ,4CAAA;IACQ,oCAAA;IuD5GF,QAAA;G5D6jML;E4D3jMG;;;IvDyGJ,wCAAA;IACQ,gCAAA;IuDtGF,QAAA;G5D8jML;CACF;A4DpmMD;;;EA6CI,eAAA;C5D4jMH;A4DzmMD;EAiDI,QAAA;C5D2jMH;A4D5mMD;;EAsDI,mBAAA;EACA,OAAA;EACA,YAAA;C5D0jMH;A4DlnMD;EA4DI,WAAA;C5DyjMH;A4DrnMD;EA+DI,YAAA;C5DyjMH;A4DxnMD;;EAmEI,QAAA;C5DyjMH;A4D5nMD;EAuEI,YAAA;C5DwjMH;A4D/nMD;EA0EI,WAAA;C5DwjMH;A4DhjMD;EACE,mBAAA;EACA,OAAA;EACA,QAAA;EACA,UAAA;EACA,WAAA;EtC9FA,aAAA;EAGA,0BAAA;EsC6FA,gBAAA;EACA,YAAA;EACA,mBAAA;EACA,0CAAA;EACA,mCAAA;C5DmjMD;A4D9iMC;EdnGE,mGAAA;EACA,8FAAA;EACA,qHAAA;EAAA,+FAAA;EACA,4BAAA;EACA,uHAAA;C9CopMH;A4DljMC;EACE,WAAA;EACA,SAAA;EdxGA,mGAAA;EACA,8FAAA;EACA,qHAAA;EAAA,+FAAA;EACA,4BAAA;EACA,uHAAA;C9C6pMH;A4DpjMC;;EAEE,WAAA;EACA,YAAA;EACA,sBAAA;EtCvHF,aAAA;EAGA,0BAAA;CtB4qMD;A4DtlMD;;;;EAuCI,mBAAA;EACA,SAAA;EACA,kBAAA;EACA,WAAA;EACA,sBAAA;C5DqjMH;A4DhmMD;;EA+CI,UAAA;EACA,mBAAA;C5DqjMH;A4DrmMD;;EAoDI,WAAA;EACA,oBAAA;C5DqjMH;A4D1mMD;;EAyDI,YAAA;EACA,aAAA;EACA,eAAA;EACA,mBAAA;C5DqjMH;A4DhjMG;EACE,iBAAA;C5DkjML;A4D9iMG;EACE,iBAAA;C5DgjML;A4DtiMD;EACE,mBAAA;EACA,aAAA;EACA,UAAA;EACA,YAAA;EACA,WAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;C5DwiMD;A4DjjMD;EAYI,sBAAA;EACA,YAAA;EACA,aAAA;EACA,YAAA;EACA,oBAAA;EACA,uBAAA;EACA,oBAAA;EACA,gBAAA;EAWA,0BAAA;EACA,mCAAA;C5D8hMH;A4D7jMD;EAkCI,UAAA;EACA,YAAA;EACA,aAAA;EACA,uBAAA;C5D8hMH;A4DvhMD;EACE,mBAAA;EACA,UAAA;EACA,WAAA;EACA,aAAA;EACA,YAAA;EACA,kBAAA;EACA,qBAAA;EACA,YAAA;EACA,mBAAA;EACA,0CAAA;C5DyhMD;A4DxhMC;EACE,kBAAA;C5D0hMH;A4Dj/LD;EAhCE;;;;IAKI,YAAA;IACA,aAAA;IACA,kBAAA;IACA,gBAAA;G5DmhMH;E4D3hMD;;IAYI,mBAAA;G5DmhMH;E4D/hMD;;IAgBI,oBAAA;G5DmhMH;E4D9gMD;IACE,UAAA;IACA,WAAA;IACA,qBAAA;G5DghMD;E4D5gMD;IACE,aAAA;G5D8gMD;CACF;A6D7wMC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEE,aAAA;EACA,eAAA;C7D6yMH;A6D3yMC;;;;;;;;;;;;;;;;EACE,YAAA;C7D4zMH;AiCp0MD;E6BRE,eAAA;EACA,kBAAA;EACA,mBAAA;C9D+0MD;AiCt0MD;EACE,wBAAA;CjCw0MD;AiCt0MD;EACE,uBAAA;CjCw0MD;AiCh0MD;EACE,yBAAA;CjCk0MD;AiCh0MD;EACE,0BAAA;CjCk0MD;AiCh0MD;EACE,mBAAA;CjCk0MD;AiCh0MD;E8BzBE,YAAA;EACA,mBAAA;EACA,kBAAA;EACA,8BAAA;EACA,UAAA;C/D41MD;AiC9zMD;EACE,yBAAA;CjCg0MD;AiCzzMD;EACE,gBAAA;CjC2zMD;AgE51MD;EACE,oBAAA;ChE81MD;AgEx1MD;;;;ECdE,yBAAA;CjE42MD;AgEv1MD;;;;;;;;;;;;EAYE,yBAAA;ChEy1MD;AgEl1MD;EA6IA;IC7LE,0BAAA;GjEs4MC;EiEr4MD;IAAU,0BAAA;GjEw4MT;EiEv4MD;IAAU,8BAAA;GjE04MT;EiEz4MD;;IACU,+BAAA;GjE44MT;CACF;AgE51MD;EAwIA;IA1II,0BAAA;GhEk2MD;CACF;AgE51MD;EAmIA;IArII,2BAAA;GhEk2MD;CACF;AgE51MD;EA8HA;IAhII,iCAAA;GhEk2MD;CACF;AgE31MD;EAwHA;IC7LE,0BAAA;GjEo6MC;EiEn6MD;IAAU,0BAAA;GjEs6MT;EiEr6MD;IAAU,8BAAA;GjEw6MT;EiEv6MD;;IACU,+BAAA;GjE06MT;CACF;AgEr2MD;EAmHA;IArHI,0BAAA;GhE22MD;CACF;AgEr2MD;EA8GA;IAhHI,2BAAA;GhE22MD;CACF;AgEr2MD;EAyGA;IA3GI,iCAAA;GhE22MD;CACF;AgEp2MD;EAmGA;IC7LE,0BAAA;GjEk8MC;EiEj8MD;IAAU,0BAAA;GjEo8MT;EiEn8MD;IAAU,8BAAA;GjEs8MT;EiEr8MD;;IACU,+BAAA;GjEw8MT;CACF;AgE92MD;EA8FA;IAhGI,0BAAA;GhEo3MD;CACF;AgE92MD;EAyFA;IA3FI,2BAAA;GhEo3MD;CACF;AgE92MD;EAoFA;IAtFI,iCAAA;GhEo3MD;CACF;AgE72MD;EA8EA;IC7LE,0BAAA;GjEg+MC;EiE/9MD;IAAU,0BAAA;GjEk+MT;EiEj+MD;IAAU,8BAAA;GjEo+MT;EiEn+MD;;IACU,+BAAA;GjEs+MT;CACF;AgEv3MD;EAyEA;IA3EI,0BAAA;GhE63MD;CACF;AgEv3MD;EAoEA;IAtEI,2BAAA;GhE63MD;CACF;AgEv3MD;EA+DA;IAjEI,iCAAA;GhE63MD;CACF;AgEt3MD;EAyDA;ICrLE,yBAAA;GjEs/MC;CACF;AgEt3MD;EAoDA;ICrLE,yBAAA;GjE2/MC;CACF;AgEt3MD;EA+CA;ICrLE,yBAAA;GjEggNC;CACF;AgEt3MD;EA0CA;ICrLE,yBAAA;GjEqgNC;CACF;AgEn3MD;ECnJE,yBAAA;CjEygND;AgEh3MD;EA4BA;IC7LE,0BAAA;GjEqhNC;EiEphND;IAAU,0BAAA;GjEuhNT;EiEthND;IAAU,8BAAA;GjEyhNT;EiExhND;;IACU,+BAAA;GjE2hNT;CACF;AgE93MD;EACE,yBAAA;ChEg4MD;AgE33MD;EAqBA;IAvBI,0BAAA;GhEi4MD;CACF;AgE/3MD;EACE,yBAAA;ChEi4MD;AgE53MD;EAcA;IAhBI,2BAAA;GhEk4MD;CACF;AgEh4MD;EACE,yBAAA;ChEk4MD;AgE73MD;EAOA;IATI,iCAAA;GhEm4MD;CACF;AgE53MD;EACA;ICrLE,yBAAA;GjEojNC;CACF","file":"bootstrap.css","sourcesContent":["/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\nhtml {\n font-family: sans-serif;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%;\n}\nbody {\n margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block;\n vertical-align: baseline;\n}\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n[hidden],\ntemplate {\n display: none;\n}\na {\n background-color: transparent;\n}\na:active,\na:hover {\n outline: 0;\n}\nabbr[title] {\n border-bottom: 1px dotted;\n}\nb,\nstrong {\n font-weight: bold;\n}\ndfn {\n font-style: italic;\n}\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\nmark {\n background: #ff0;\n color: #000;\n}\nsmall {\n font-size: 80%;\n}\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\nsup {\n top: -0.5em;\n}\nsub {\n bottom: -0.25em;\n}\nimg {\n border: 0;\n}\nsvg:not(:root) {\n overflow: hidden;\n}\nfigure {\n margin: 1em 40px;\n}\nhr {\n box-sizing: content-box;\n height: 0;\n}\npre {\n overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit;\n font: inherit;\n margin: 0;\n}\nbutton {\n overflow: visible;\n}\nbutton,\nselect {\n text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button;\n cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\ninput {\n line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box;\n padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: textfield;\n box-sizing: content-box;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\nlegend {\n border: 0;\n padding: 0;\n}\ntextarea {\n overflow: auto;\n}\noptgroup {\n font-weight: bold;\n}\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\ntd,\nth {\n padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important;\n box-shadow: none !important;\n text-shadow: none !important;\n }\n a,\n a:visited {\n text-decoration: underline;\n }\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n img {\n max-width: 100% !important;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n .navbar {\n display: none;\n }\n .btn > .caret,\n .dropup > .btn > .caret {\n border-top-color: #000 !important;\n }\n .label {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #ddd !important;\n }\n}\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('../fonts/glyphicons-halflings-regular.eot');\n src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');\n}\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n content: \"\\002a\";\n}\n.glyphicon-plus:before {\n content: \"\\002b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n content: \"\\270f\";\n}\n.glyphicon-glass:before {\n content: \"\\e001\";\n}\n.glyphicon-music:before {\n content: \"\\e002\";\n}\n.glyphicon-search:before {\n content: \"\\e003\";\n}\n.glyphicon-heart:before {\n content: \"\\e005\";\n}\n.glyphicon-star:before {\n content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n content: \"\\e007\";\n}\n.glyphicon-user:before {\n content: \"\\e008\";\n}\n.glyphicon-film:before {\n content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n content: \"\\e010\";\n}\n.glyphicon-th:before {\n content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n content: \"\\e012\";\n}\n.glyphicon-ok:before {\n content: \"\\e013\";\n}\n.glyphicon-remove:before {\n content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n content: \"\\e016\";\n}\n.glyphicon-off:before {\n content: \"\\e017\";\n}\n.glyphicon-signal:before {\n content: \"\\e018\";\n}\n.glyphicon-cog:before {\n content: \"\\e019\";\n}\n.glyphicon-trash:before {\n content: \"\\e020\";\n}\n.glyphicon-home:before {\n content: \"\\e021\";\n}\n.glyphicon-file:before {\n content: \"\\e022\";\n}\n.glyphicon-time:before {\n content: \"\\e023\";\n}\n.glyphicon-road:before {\n content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n content: \"\\e025\";\n}\n.glyphicon-download:before {\n content: \"\\e026\";\n}\n.glyphicon-upload:before {\n content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n content: \"\\e032\";\n}\n.glyphicon-lock:before {\n content: \"\\e033\";\n}\n.glyphicon-flag:before {\n content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n content: \"\\e040\";\n}\n.glyphicon-tag:before {\n content: \"\\e041\";\n}\n.glyphicon-tags:before {\n content: \"\\e042\";\n}\n.glyphicon-book:before {\n content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n content: \"\\e044\";\n}\n.glyphicon-print:before {\n content: \"\\e045\";\n}\n.glyphicon-camera:before {\n content: \"\\e046\";\n}\n.glyphicon-font:before {\n content: \"\\e047\";\n}\n.glyphicon-bold:before {\n content: \"\\e048\";\n}\n.glyphicon-italic:before {\n content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n content: \"\\e055\";\n}\n.glyphicon-list:before {\n content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n content: \"\\e059\";\n}\n.glyphicon-picture:before {\n content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n content: \"\\e063\";\n}\n.glyphicon-tint:before {\n content: \"\\e064\";\n}\n.glyphicon-edit:before {\n content: \"\\e065\";\n}\n.glyphicon-share:before {\n content: \"\\e066\";\n}\n.glyphicon-check:before {\n content: \"\\e067\";\n}\n.glyphicon-move:before {\n content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n content: \"\\e070\";\n}\n.glyphicon-backward:before {\n content: \"\\e071\";\n}\n.glyphicon-play:before {\n content: \"\\e072\";\n}\n.glyphicon-pause:before {\n content: \"\\e073\";\n}\n.glyphicon-stop:before {\n content: \"\\e074\";\n}\n.glyphicon-forward:before {\n content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n content: \"\\e077\";\n}\n.glyphicon-eject:before {\n content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n content: \"\\e101\";\n}\n.glyphicon-gift:before {\n content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n content: \"\\e103\";\n}\n.glyphicon-fire:before {\n content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n content: \"\\e107\";\n}\n.glyphicon-plane:before {\n content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n content: \"\\e109\";\n}\n.glyphicon-random:before {\n content: \"\\e110\";\n}\n.glyphicon-comment:before {\n content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n content: \"\\e122\";\n}\n.glyphicon-bell:before {\n content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n content: \"\\e134\";\n}\n.glyphicon-globe:before {\n content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n content: \"\\e137\";\n}\n.glyphicon-filter:before {\n content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n content: \"\\e143\";\n}\n.glyphicon-link:before {\n content: \"\\e144\";\n}\n.glyphicon-phone:before {\n content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n content: \"\\e146\";\n}\n.glyphicon-usd:before {\n content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n content: \"\\e149\";\n}\n.glyphicon-sort:before {\n content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n content: \"\\e157\";\n}\n.glyphicon-expand:before {\n content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n content: \"\\e161\";\n}\n.glyphicon-flash:before {\n content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n content: \"\\e164\";\n}\n.glyphicon-record:before {\n content: \"\\e165\";\n}\n.glyphicon-save:before {\n content: \"\\e166\";\n}\n.glyphicon-open:before {\n content: \"\\e167\";\n}\n.glyphicon-saved:before {\n content: \"\\e168\";\n}\n.glyphicon-import:before {\n content: \"\\e169\";\n}\n.glyphicon-export:before {\n content: \"\\e170\";\n}\n.glyphicon-send:before {\n content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n content: \"\\e179\";\n}\n.glyphicon-header:before {\n content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n content: \"\\e183\";\n}\n.glyphicon-tower:before {\n content: \"\\e184\";\n}\n.glyphicon-stats:before {\n content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n content: \"\\e200\";\n}\n.glyphicon-cd:before {\n content: \"\\e201\";\n}\n.glyphicon-save-file:before {\n content: \"\\e202\";\n}\n.glyphicon-open-file:before {\n content: \"\\e203\";\n}\n.glyphicon-level-up:before {\n content: \"\\e204\";\n}\n.glyphicon-copy:before {\n content: \"\\e205\";\n}\n.glyphicon-paste:before {\n content: \"\\e206\";\n}\n.glyphicon-alert:before {\n content: \"\\e209\";\n}\n.glyphicon-equalizer:before {\n content: \"\\e210\";\n}\n.glyphicon-king:before {\n content: \"\\e211\";\n}\n.glyphicon-queen:before {\n content: \"\\e212\";\n}\n.glyphicon-pawn:before {\n content: \"\\e213\";\n}\n.glyphicon-bishop:before {\n content: \"\\e214\";\n}\n.glyphicon-knight:before {\n content: \"\\e215\";\n}\n.glyphicon-baby-formula:before {\n content: \"\\e216\";\n}\n.glyphicon-tent:before {\n content: \"\\26fa\";\n}\n.glyphicon-blackboard:before {\n content: \"\\e218\";\n}\n.glyphicon-bed:before {\n content: \"\\e219\";\n}\n.glyphicon-apple:before {\n content: \"\\f8ff\";\n}\n.glyphicon-erase:before {\n content: \"\\e221\";\n}\n.glyphicon-hourglass:before {\n content: \"\\231b\";\n}\n.glyphicon-lamp:before {\n content: \"\\e223\";\n}\n.glyphicon-duplicate:before {\n content: \"\\e224\";\n}\n.glyphicon-piggy-bank:before {\n content: \"\\e225\";\n}\n.glyphicon-scissors:before {\n content: \"\\e226\";\n}\n.glyphicon-bitcoin:before {\n content: \"\\e227\";\n}\n.glyphicon-btc:before {\n content: \"\\e227\";\n}\n.glyphicon-xbt:before {\n content: \"\\e227\";\n}\n.glyphicon-yen:before {\n content: \"\\00a5\";\n}\n.glyphicon-jpy:before {\n content: \"\\00a5\";\n}\n.glyphicon-ruble:before {\n content: \"\\20bd\";\n}\n.glyphicon-rub:before {\n content: \"\\20bd\";\n}\n.glyphicon-scale:before {\n content: \"\\e230\";\n}\n.glyphicon-ice-lolly:before {\n content: \"\\e231\";\n}\n.glyphicon-ice-lolly-tasted:before {\n content: \"\\e232\";\n}\n.glyphicon-education:before {\n content: \"\\e233\";\n}\n.glyphicon-option-horizontal:before {\n content: \"\\e234\";\n}\n.glyphicon-option-vertical:before {\n content: \"\\e235\";\n}\n.glyphicon-menu-hamburger:before {\n content: \"\\e236\";\n}\n.glyphicon-modal-window:before {\n content: \"\\e237\";\n}\n.glyphicon-oil:before {\n content: \"\\e238\";\n}\n.glyphicon-grain:before {\n content: \"\\e239\";\n}\n.glyphicon-sunglasses:before {\n content: \"\\e240\";\n}\n.glyphicon-text-size:before {\n content: \"\\e241\";\n}\n.glyphicon-text-color:before {\n content: \"\\e242\";\n}\n.glyphicon-text-background:before {\n content: \"\\e243\";\n}\n.glyphicon-object-align-top:before {\n content: \"\\e244\";\n}\n.glyphicon-object-align-bottom:before {\n content: \"\\e245\";\n}\n.glyphicon-object-align-horizontal:before {\n content: \"\\e246\";\n}\n.glyphicon-object-align-left:before {\n content: \"\\e247\";\n}\n.glyphicon-object-align-vertical:before {\n content: \"\\e248\";\n}\n.glyphicon-object-align-right:before {\n content: \"\\e249\";\n}\n.glyphicon-triangle-right:before {\n content: \"\\e250\";\n}\n.glyphicon-triangle-left:before {\n content: \"\\e251\";\n}\n.glyphicon-triangle-bottom:before {\n content: \"\\e252\";\n}\n.glyphicon-triangle-top:before {\n content: \"\\e253\";\n}\n.glyphicon-console:before {\n content: \"\\e254\";\n}\n.glyphicon-superscript:before {\n content: \"\\e255\";\n}\n.glyphicon-subscript:before {\n content: \"\\e256\";\n}\n.glyphicon-menu-left:before {\n content: \"\\e257\";\n}\n.glyphicon-menu-right:before {\n content: \"\\e258\";\n}\n.glyphicon-menu-down:before {\n content: \"\\e259\";\n}\n.glyphicon-menu-up:before {\n content: \"\\e260\";\n}\n* {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n*:before,\n*:after {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 14px;\n line-height: 1.42857143;\n color: #333333;\n background-color: #fff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\na {\n color: #337ab7;\n text-decoration: none;\n}\na:hover,\na:focus {\n color: #23527c;\n text-decoration: underline;\n}\na:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\nfigure {\n margin: 0;\n}\nimg {\n vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n display: block;\n max-width: 100%;\n height: auto;\n}\n.img-rounded {\n border-radius: 6px;\n}\n.img-thumbnail {\n padding: 4px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: all 0.2s ease-in-out;\n -o-transition: all 0.2s ease-in-out;\n transition: all 0.2s ease-in-out;\n display: inline-block;\n max-width: 100%;\n height: auto;\n}\n.img-circle {\n border-radius: 50%;\n}\nhr {\n margin-top: 20px;\n margin-bottom: 20px;\n border: 0;\n border-top: 1px solid #eeeeee;\n}\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n}\n[role=\"button\"] {\n cursor: pointer;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n font-family: inherit;\n font-weight: 500;\n line-height: 1.1;\n color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n font-weight: normal;\n line-height: 1;\n color: #777777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n margin-top: 20px;\n margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n margin-top: 10px;\n margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n font-size: 75%;\n}\nh1,\n.h1 {\n font-size: 36px;\n}\nh2,\n.h2 {\n font-size: 30px;\n}\nh3,\n.h3 {\n font-size: 24px;\n}\nh4,\n.h4 {\n font-size: 18px;\n}\nh5,\n.h5 {\n font-size: 14px;\n}\nh6,\n.h6 {\n font-size: 12px;\n}\np {\n margin: 0 0 10px;\n}\n.lead {\n margin-bottom: 20px;\n font-size: 16px;\n font-weight: 300;\n line-height: 1.4;\n}\n@media (min-width: 768px) {\n .lead {\n font-size: 21px;\n }\n}\nsmall,\n.small {\n font-size: 85%;\n}\nmark,\n.mark {\n background-color: #fcf8e3;\n padding: .2em;\n}\n.text-left {\n text-align: left;\n}\n.text-right {\n text-align: right;\n}\n.text-center {\n text-align: center;\n}\n.text-justify {\n text-align: justify;\n}\n.text-nowrap {\n white-space: nowrap;\n}\n.text-lowercase {\n text-transform: lowercase;\n}\n.text-uppercase {\n text-transform: uppercase;\n}\n.text-capitalize {\n text-transform: capitalize;\n}\n.text-muted {\n color: #777777;\n}\n.text-primary {\n color: #337ab7;\n}\na.text-primary:hover,\na.text-primary:focus {\n color: #286090;\n}\n.text-success {\n color: #3c763d;\n}\na.text-success:hover,\na.text-success:focus {\n color: #2b542c;\n}\n.text-info {\n color: #31708f;\n}\na.text-info:hover,\na.text-info:focus {\n color: #245269;\n}\n.text-warning {\n color: #8a6d3b;\n}\na.text-warning:hover,\na.text-warning:focus {\n color: #66512c;\n}\n.text-danger {\n color: #a94442;\n}\na.text-danger:hover,\na.text-danger:focus {\n color: #843534;\n}\n.bg-primary {\n color: #fff;\n background-color: #337ab7;\n}\na.bg-primary:hover,\na.bg-primary:focus {\n background-color: #286090;\n}\n.bg-success {\n background-color: #dff0d8;\n}\na.bg-success:hover,\na.bg-success:focus {\n background-color: #c1e2b3;\n}\n.bg-info {\n background-color: #d9edf7;\n}\na.bg-info:hover,\na.bg-info:focus {\n background-color: #afd9ee;\n}\n.bg-warning {\n background-color: #fcf8e3;\n}\na.bg-warning:hover,\na.bg-warning:focus {\n background-color: #f7ecb5;\n}\n.bg-danger {\n background-color: #f2dede;\n}\na.bg-danger:hover,\na.bg-danger:focus {\n background-color: #e4b9b9;\n}\n.page-header {\n padding-bottom: 9px;\n margin: 40px 0 20px;\n border-bottom: 1px solid #eeeeee;\n}\nul,\nol {\n margin-top: 0;\n margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n margin-bottom: 0;\n}\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n.list-inline {\n padding-left: 0;\n list-style: none;\n margin-left: -5px;\n}\n.list-inline > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n}\ndl {\n margin-top: 0;\n margin-bottom: 20px;\n}\ndt,\ndd {\n line-height: 1.42857143;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0;\n}\n@media (min-width: 768px) {\n .dl-horizontal dt {\n float: left;\n width: 160px;\n clear: left;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .dl-horizontal dd {\n margin-left: 180px;\n }\n}\nabbr[title],\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted #777777;\n}\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\nblockquote {\n padding: 10px 20px;\n margin: 0 0 20px;\n font-size: 17.5px;\n border-left: 5px solid #eeeeee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n display: block;\n font-size: 80%;\n line-height: 1.42857143;\n color: #777777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n content: '\\2014 \\00A0';\n}\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid #eeeeee;\n border-left: 0;\n text-align: right;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n content: '';\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n content: '\\00A0 \\2014';\n}\naddress {\n margin-bottom: 20px;\n font-style: normal;\n line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: #c7254e;\n background-color: #f9f2f4;\n border-radius: 4px;\n}\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: #fff;\n background-color: #333;\n border-radius: 3px;\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n}\npre {\n display: block;\n padding: 9.5px;\n margin: 0 0 10px;\n font-size: 13px;\n line-height: 1.42857143;\n word-break: break-all;\n word-wrap: break-word;\n color: #333333;\n background-color: #f5f5f5;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\npre code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n}\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n.container {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n}\n@media (min-width: 768px) {\n .container {\n width: 750px;\n }\n}\n@media (min-width: 992px) {\n .container {\n width: 970px;\n }\n}\n@media (min-width: 1200px) {\n .container {\n width: 1170px;\n }\n}\n.container-fluid {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n}\n.row {\n margin-left: -15px;\n margin-right: -15px;\n}\n.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {\n position: relative;\n min-height: 1px;\n padding-left: 15px;\n padding-right: 15px;\n}\n.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {\n float: left;\n}\n.col-xs-12 {\n width: 100%;\n}\n.col-xs-11 {\n width: 91.66666667%;\n}\n.col-xs-10 {\n width: 83.33333333%;\n}\n.col-xs-9 {\n width: 75%;\n}\n.col-xs-8 {\n width: 66.66666667%;\n}\n.col-xs-7 {\n width: 58.33333333%;\n}\n.col-xs-6 {\n width: 50%;\n}\n.col-xs-5 {\n width: 41.66666667%;\n}\n.col-xs-4 {\n width: 33.33333333%;\n}\n.col-xs-3 {\n width: 25%;\n}\n.col-xs-2 {\n width: 16.66666667%;\n}\n.col-xs-1 {\n width: 8.33333333%;\n}\n.col-xs-pull-12 {\n right: 100%;\n}\n.col-xs-pull-11 {\n right: 91.66666667%;\n}\n.col-xs-pull-10 {\n right: 83.33333333%;\n}\n.col-xs-pull-9 {\n right: 75%;\n}\n.col-xs-pull-8 {\n right: 66.66666667%;\n}\n.col-xs-pull-7 {\n right: 58.33333333%;\n}\n.col-xs-pull-6 {\n right: 50%;\n}\n.col-xs-pull-5 {\n right: 41.66666667%;\n}\n.col-xs-pull-4 {\n right: 33.33333333%;\n}\n.col-xs-pull-3 {\n right: 25%;\n}\n.col-xs-pull-2 {\n right: 16.66666667%;\n}\n.col-xs-pull-1 {\n right: 8.33333333%;\n}\n.col-xs-pull-0 {\n right: auto;\n}\n.col-xs-push-12 {\n left: 100%;\n}\n.col-xs-push-11 {\n left: 91.66666667%;\n}\n.col-xs-push-10 {\n left: 83.33333333%;\n}\n.col-xs-push-9 {\n left: 75%;\n}\n.col-xs-push-8 {\n left: 66.66666667%;\n}\n.col-xs-push-7 {\n left: 58.33333333%;\n}\n.col-xs-push-6 {\n left: 50%;\n}\n.col-xs-push-5 {\n left: 41.66666667%;\n}\n.col-xs-push-4 {\n left: 33.33333333%;\n}\n.col-xs-push-3 {\n left: 25%;\n}\n.col-xs-push-2 {\n left: 16.66666667%;\n}\n.col-xs-push-1 {\n left: 8.33333333%;\n}\n.col-xs-push-0 {\n left: auto;\n}\n.col-xs-offset-12 {\n margin-left: 100%;\n}\n.col-xs-offset-11 {\n margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n margin-left: 75%;\n}\n.col-xs-offset-8 {\n margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n margin-left: 50%;\n}\n.col-xs-offset-5 {\n margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n margin-left: 25%;\n}\n.col-xs-offset-2 {\n margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n margin-left: 0%;\n}\n@media (min-width: 768px) {\n .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {\n float: left;\n }\n .col-sm-12 {\n width: 100%;\n }\n .col-sm-11 {\n width: 91.66666667%;\n }\n .col-sm-10 {\n width: 83.33333333%;\n }\n .col-sm-9 {\n width: 75%;\n }\n .col-sm-8 {\n width: 66.66666667%;\n }\n .col-sm-7 {\n width: 58.33333333%;\n }\n .col-sm-6 {\n width: 50%;\n }\n .col-sm-5 {\n width: 41.66666667%;\n }\n .col-sm-4 {\n width: 33.33333333%;\n }\n .col-sm-3 {\n width: 25%;\n }\n .col-sm-2 {\n width: 16.66666667%;\n }\n .col-sm-1 {\n width: 8.33333333%;\n }\n .col-sm-pull-12 {\n right: 100%;\n }\n .col-sm-pull-11 {\n right: 91.66666667%;\n }\n .col-sm-pull-10 {\n right: 83.33333333%;\n }\n .col-sm-pull-9 {\n right: 75%;\n }\n .col-sm-pull-8 {\n right: 66.66666667%;\n }\n .col-sm-pull-7 {\n right: 58.33333333%;\n }\n .col-sm-pull-6 {\n right: 50%;\n }\n .col-sm-pull-5 {\n right: 41.66666667%;\n }\n .col-sm-pull-4 {\n right: 33.33333333%;\n }\n .col-sm-pull-3 {\n right: 25%;\n }\n .col-sm-pull-2 {\n right: 16.66666667%;\n }\n .col-sm-pull-1 {\n right: 8.33333333%;\n }\n .col-sm-pull-0 {\n right: auto;\n }\n .col-sm-push-12 {\n left: 100%;\n }\n .col-sm-push-11 {\n left: 91.66666667%;\n }\n .col-sm-push-10 {\n left: 83.33333333%;\n }\n .col-sm-push-9 {\n left: 75%;\n }\n .col-sm-push-8 {\n left: 66.66666667%;\n }\n .col-sm-push-7 {\n left: 58.33333333%;\n }\n .col-sm-push-6 {\n left: 50%;\n }\n .col-sm-push-5 {\n left: 41.66666667%;\n }\n .col-sm-push-4 {\n left: 33.33333333%;\n }\n .col-sm-push-3 {\n left: 25%;\n }\n .col-sm-push-2 {\n left: 16.66666667%;\n }\n .col-sm-push-1 {\n left: 8.33333333%;\n }\n .col-sm-push-0 {\n left: auto;\n }\n .col-sm-offset-12 {\n margin-left: 100%;\n }\n .col-sm-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-sm-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-sm-offset-9 {\n margin-left: 75%;\n }\n .col-sm-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-sm-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-sm-offset-6 {\n margin-left: 50%;\n }\n .col-sm-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-sm-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-sm-offset-3 {\n margin-left: 25%;\n }\n .col-sm-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-sm-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-sm-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 992px) {\n .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {\n float: left;\n }\n .col-md-12 {\n width: 100%;\n }\n .col-md-11 {\n width: 91.66666667%;\n }\n .col-md-10 {\n width: 83.33333333%;\n }\n .col-md-9 {\n width: 75%;\n }\n .col-md-8 {\n width: 66.66666667%;\n }\n .col-md-7 {\n width: 58.33333333%;\n }\n .col-md-6 {\n width: 50%;\n }\n .col-md-5 {\n width: 41.66666667%;\n }\n .col-md-4 {\n width: 33.33333333%;\n }\n .col-md-3 {\n width: 25%;\n }\n .col-md-2 {\n width: 16.66666667%;\n }\n .col-md-1 {\n width: 8.33333333%;\n }\n .col-md-pull-12 {\n right: 100%;\n }\n .col-md-pull-11 {\n right: 91.66666667%;\n }\n .col-md-pull-10 {\n right: 83.33333333%;\n }\n .col-md-pull-9 {\n right: 75%;\n }\n .col-md-pull-8 {\n right: 66.66666667%;\n }\n .col-md-pull-7 {\n right: 58.33333333%;\n }\n .col-md-pull-6 {\n right: 50%;\n }\n .col-md-pull-5 {\n right: 41.66666667%;\n }\n .col-md-pull-4 {\n right: 33.33333333%;\n }\n .col-md-pull-3 {\n right: 25%;\n }\n .col-md-pull-2 {\n right: 16.66666667%;\n }\n .col-md-pull-1 {\n right: 8.33333333%;\n }\n .col-md-pull-0 {\n right: auto;\n }\n .col-md-push-12 {\n left: 100%;\n }\n .col-md-push-11 {\n left: 91.66666667%;\n }\n .col-md-push-10 {\n left: 83.33333333%;\n }\n .col-md-push-9 {\n left: 75%;\n }\n .col-md-push-8 {\n left: 66.66666667%;\n }\n .col-md-push-7 {\n left: 58.33333333%;\n }\n .col-md-push-6 {\n left: 50%;\n }\n .col-md-push-5 {\n left: 41.66666667%;\n }\n .col-md-push-4 {\n left: 33.33333333%;\n }\n .col-md-push-3 {\n left: 25%;\n }\n .col-md-push-2 {\n left: 16.66666667%;\n }\n .col-md-push-1 {\n left: 8.33333333%;\n }\n .col-md-push-0 {\n left: auto;\n }\n .col-md-offset-12 {\n margin-left: 100%;\n }\n .col-md-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-md-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-md-offset-9 {\n margin-left: 75%;\n }\n .col-md-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-md-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-md-offset-6 {\n margin-left: 50%;\n }\n .col-md-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-md-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-md-offset-3 {\n margin-left: 25%;\n }\n .col-md-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-md-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-md-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 1200px) {\n .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {\n float: left;\n }\n .col-lg-12 {\n width: 100%;\n }\n .col-lg-11 {\n width: 91.66666667%;\n }\n .col-lg-10 {\n width: 83.33333333%;\n }\n .col-lg-9 {\n width: 75%;\n }\n .col-lg-8 {\n width: 66.66666667%;\n }\n .col-lg-7 {\n width: 58.33333333%;\n }\n .col-lg-6 {\n width: 50%;\n }\n .col-lg-5 {\n width: 41.66666667%;\n }\n .col-lg-4 {\n width: 33.33333333%;\n }\n .col-lg-3 {\n width: 25%;\n }\n .col-lg-2 {\n width: 16.66666667%;\n }\n .col-lg-1 {\n width: 8.33333333%;\n }\n .col-lg-pull-12 {\n right: 100%;\n }\n .col-lg-pull-11 {\n right: 91.66666667%;\n }\n .col-lg-pull-10 {\n right: 83.33333333%;\n }\n .col-lg-pull-9 {\n right: 75%;\n }\n .col-lg-pull-8 {\n right: 66.66666667%;\n }\n .col-lg-pull-7 {\n right: 58.33333333%;\n }\n .col-lg-pull-6 {\n right: 50%;\n }\n .col-lg-pull-5 {\n right: 41.66666667%;\n }\n .col-lg-pull-4 {\n right: 33.33333333%;\n }\n .col-lg-pull-3 {\n right: 25%;\n }\n .col-lg-pull-2 {\n right: 16.66666667%;\n }\n .col-lg-pull-1 {\n right: 8.33333333%;\n }\n .col-lg-pull-0 {\n right: auto;\n }\n .col-lg-push-12 {\n left: 100%;\n }\n .col-lg-push-11 {\n left: 91.66666667%;\n }\n .col-lg-push-10 {\n left: 83.33333333%;\n }\n .col-lg-push-9 {\n left: 75%;\n }\n .col-lg-push-8 {\n left: 66.66666667%;\n }\n .col-lg-push-7 {\n left: 58.33333333%;\n }\n .col-lg-push-6 {\n left: 50%;\n }\n .col-lg-push-5 {\n left: 41.66666667%;\n }\n .col-lg-push-4 {\n left: 33.33333333%;\n }\n .col-lg-push-3 {\n left: 25%;\n }\n .col-lg-push-2 {\n left: 16.66666667%;\n }\n .col-lg-push-1 {\n left: 8.33333333%;\n }\n .col-lg-push-0 {\n left: auto;\n }\n .col-lg-offset-12 {\n margin-left: 100%;\n }\n .col-lg-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-lg-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-lg-offset-9 {\n margin-left: 75%;\n }\n .col-lg-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-lg-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-lg-offset-6 {\n margin-left: 50%;\n }\n .col-lg-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-lg-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-lg-offset-3 {\n margin-left: 25%;\n }\n .col-lg-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-lg-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-lg-offset-0 {\n margin-left: 0%;\n }\n}\ntable {\n background-color: transparent;\n}\ncaption {\n padding-top: 8px;\n padding-bottom: 8px;\n color: #777777;\n text-align: left;\n}\nth {\n text-align: left;\n}\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n padding: 8px;\n line-height: 1.42857143;\n vertical-align: top;\n border-top: 1px solid #ddd;\n}\n.table > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid #ddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n border-top: 0;\n}\n.table > tbody + tbody {\n border-top: 2px solid #ddd;\n}\n.table .table {\n background-color: #fff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n padding: 5px;\n}\n.table-bordered {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-of-type(odd) {\n background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-column;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-cell;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n background-color: #ebcccc;\n}\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%;\n}\n@media screen and (max-width: 767px) {\n .table-responsive {\n width: 100%;\n margin-bottom: 15px;\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid #ddd;\n }\n .table-responsive > .table {\n margin-bottom: 0;\n }\n .table-responsive > .table > thead > tr > th,\n .table-responsive > .table > tbody > tr > th,\n .table-responsive > .table > tfoot > tr > th,\n .table-responsive > .table > thead > tr > td,\n .table-responsive > .table > tbody > tr > td,\n .table-responsive > .table > tfoot > tr > td {\n white-space: nowrap;\n }\n .table-responsive > .table-bordered {\n border: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:first-child,\n .table-responsive > .table-bordered > tbody > tr > th:first-child,\n .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n .table-responsive > .table-bordered > thead > tr > td:first-child,\n .table-responsive > .table-bordered > tbody > tr > td:first-child,\n .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:last-child,\n .table-responsive > .table-bordered > tbody > tr > th:last-child,\n .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n .table-responsive > .table-bordered > thead > tr > td:last-child,\n .table-responsive > .table-bordered > tbody > tr > td:last-child,\n .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n }\n .table-responsive > .table-bordered > tbody > tr:last-child > th,\n .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n .table-responsive > .table-bordered > tbody > tr:last-child > td,\n .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n border-bottom: 0;\n }\n}\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n min-width: 0;\n}\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: 20px;\n font-size: 21px;\n line-height: inherit;\n color: #333333;\n border: 0;\n border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n display: inline-block;\n max-width: 100%;\n margin-bottom: 5px;\n font-weight: bold;\n}\ninput[type=\"search\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9;\n line-height: normal;\n}\ninput[type=\"file\"] {\n display: block;\n}\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\nselect[multiple],\nselect[size] {\n height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\noutput {\n display: block;\n padding-top: 7px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n}\n.form-control {\n display: block;\n width: 100%;\n height: 34px;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n background-color: #fff;\n background-image: none;\n border: 1px solid #ccc;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n border-color: #66afe9;\n outline: 0;\n -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n.form-control::-moz-placeholder {\n color: #999;\n opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n color: #999;\n}\n.form-control::-webkit-input-placeholder {\n color: #999;\n}\n.form-control::-ms-expand {\n border: 0;\n background-color: transparent;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n background-color: #eeeeee;\n opacity: 1;\n}\n.form-control[disabled],\nfieldset[disabled] .form-control {\n cursor: not-allowed;\n}\ntextarea.form-control {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: none;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"].form-control,\n input[type=\"time\"].form-control,\n input[type=\"datetime-local\"].form-control,\n input[type=\"month\"].form-control {\n line-height: 34px;\n }\n input[type=\"date\"].input-sm,\n input[type=\"time\"].input-sm,\n input[type=\"datetime-local\"].input-sm,\n input[type=\"month\"].input-sm,\n .input-group-sm input[type=\"date\"],\n .input-group-sm input[type=\"time\"],\n .input-group-sm input[type=\"datetime-local\"],\n .input-group-sm input[type=\"month\"] {\n line-height: 30px;\n }\n input[type=\"date\"].input-lg,\n input[type=\"time\"].input-lg,\n input[type=\"datetime-local\"].input-lg,\n input[type=\"month\"].input-lg,\n .input-group-lg input[type=\"date\"],\n .input-group-lg input[type=\"time\"],\n .input-group-lg input[type=\"datetime-local\"],\n .input-group-lg input[type=\"month\"] {\n line-height: 46px;\n }\n}\n.form-group {\n margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.radio label,\n.checkbox label {\n min-height: 20px;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-left: -20px;\n margin-top: 4px \\9;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n cursor: not-allowed;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n cursor: not-allowed;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n cursor: not-allowed;\n}\n.form-control-static {\n padding-top: 7px;\n padding-bottom: 7px;\n margin-bottom: 0;\n min-height: 34px;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n padding-left: 0;\n padding-right: 0;\n}\n.input-sm {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-sm {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-sm,\nselect[multiple].input-sm {\n height: auto;\n}\n.form-group-sm .form-control {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.form-group-sm select.form-control {\n height: 30px;\n line-height: 30px;\n}\n.form-group-sm textarea.form-control,\n.form-group-sm select[multiple].form-control {\n height: auto;\n}\n.form-group-sm .form-control-static {\n height: 30px;\n min-height: 32px;\n padding: 6px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.input-lg {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-lg {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-lg,\nselect[multiple].input-lg {\n height: auto;\n}\n.form-group-lg .form-control {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.form-group-lg select.form-control {\n height: 46px;\n line-height: 46px;\n}\n.form-group-lg textarea.form-control,\n.form-group-lg select[multiple].form-control {\n height: auto;\n}\n.form-group-lg .form-control-static {\n height: 46px;\n min-height: 38px;\n padding: 11px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.has-feedback {\n position: relative;\n}\n.has-feedback .form-control {\n padding-right: 42.5px;\n}\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n display: block;\n width: 34px;\n height: 34px;\n line-height: 34px;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n width: 46px;\n height: 46px;\n line-height: 46px;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n width: 30px;\n height: 30px;\n line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n color: #3c763d;\n}\n.has-success .form-control {\n border-color: #3c763d;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-success .form-control:focus {\n border-color: #2b542c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n color: #3c763d;\n border-color: #3c763d;\n background-color: #dff0d8;\n}\n.has-success .form-control-feedback {\n color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n color: #8a6d3b;\n}\n.has-warning .form-control {\n border-color: #8a6d3b;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-warning .form-control:focus {\n border-color: #66512c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n color: #8a6d3b;\n border-color: #8a6d3b;\n background-color: #fcf8e3;\n}\n.has-warning .form-control-feedback {\n color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n color: #a94442;\n}\n.has-error .form-control {\n border-color: #a94442;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-error .form-control:focus {\n border-color: #843534;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n color: #a94442;\n border-color: #a94442;\n background-color: #f2dede;\n}\n.has-error .form-control-feedback {\n color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n top: 0;\n}\n.help-block {\n display: block;\n margin-top: 5px;\n margin-bottom: 10px;\n color: #737373;\n}\n@media (min-width: 768px) {\n .form-inline .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-static {\n display: inline-block;\n }\n .form-inline .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .form-inline .input-group .input-group-addon,\n .form-inline .input-group .input-group-btn,\n .form-inline .input-group .form-control {\n width: auto;\n }\n .form-inline .input-group > .form-control {\n width: 100%;\n }\n .form-inline .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio,\n .form-inline .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio label,\n .form-inline .checkbox label {\n padding-left: 0;\n }\n .form-inline .radio input[type=\"radio\"],\n .form-inline .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .form-inline .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n margin-top: 0;\n margin-bottom: 0;\n padding-top: 7px;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n min-height: 27px;\n}\n.form-horizontal .form-group {\n margin-left: -15px;\n margin-right: -15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .control-label {\n text-align: right;\n margin-bottom: 0;\n padding-top: 7px;\n }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n right: 15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-lg .control-label {\n padding-top: 11px;\n font-size: 18px;\n }\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-sm .control-label {\n padding-top: 6px;\n font-size: 12px;\n }\n}\n.btn {\n display: inline-block;\n margin-bottom: 0;\n font-weight: normal;\n text-align: center;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none;\n border: 1px solid transparent;\n white-space: nowrap;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n border-radius: 4px;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n color: #333;\n text-decoration: none;\n}\n.btn:active,\n.btn.active {\n outline: 0;\n background-image: none;\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n cursor: not-allowed;\n opacity: 0.65;\n filter: alpha(opacity=65);\n -webkit-box-shadow: none;\n box-shadow: none;\n}\na.btn.disabled,\nfieldset[disabled] a.btn {\n pointer-events: none;\n}\n.btn-default {\n color: #333;\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default:focus,\n.btn-default.focus {\n color: #333;\n background-color: #e6e6e6;\n border-color: #8c8c8c;\n}\n.btn-default:hover {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active:hover,\n.btn-default.active:hover,\n.open > .dropdown-toggle.btn-default:hover,\n.btn-default:active:focus,\n.btn-default.active:focus,\n.open > .dropdown-toggle.btn-default:focus,\n.btn-default:active.focus,\n.btn-default.active.focus,\n.open > .dropdown-toggle.btn-default.focus {\n color: #333;\n background-color: #d4d4d4;\n border-color: #8c8c8c;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n background-image: none;\n}\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus {\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default .badge {\n color: #fff;\n background-color: #333;\n}\n.btn-primary {\n color: #fff;\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary:focus,\n.btn-primary.focus {\n color: #fff;\n background-color: #286090;\n border-color: #122b40;\n}\n.btn-primary:hover {\n color: #fff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n color: #fff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active:hover,\n.btn-primary.active:hover,\n.open > .dropdown-toggle.btn-primary:hover,\n.btn-primary:active:focus,\n.btn-primary.active:focus,\n.open > .dropdown-toggle.btn-primary:focus,\n.btn-primary:active.focus,\n.btn-primary.active.focus,\n.open > .dropdown-toggle.btn-primary.focus {\n color: #fff;\n background-color: #204d74;\n border-color: #122b40;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n background-image: none;\n}\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus {\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.btn-success {\n color: #fff;\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success:focus,\n.btn-success.focus {\n color: #fff;\n background-color: #449d44;\n border-color: #255625;\n}\n.btn-success:hover {\n color: #fff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n color: #fff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active:hover,\n.btn-success.active:hover,\n.open > .dropdown-toggle.btn-success:hover,\n.btn-success:active:focus,\n.btn-success.active:focus,\n.open > .dropdown-toggle.btn-success:focus,\n.btn-success:active.focus,\n.btn-success.active.focus,\n.open > .dropdown-toggle.btn-success.focus {\n color: #fff;\n background-color: #398439;\n border-color: #255625;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n background-image: none;\n}\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus {\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success .badge {\n color: #5cb85c;\n background-color: #fff;\n}\n.btn-info {\n color: #fff;\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info:focus,\n.btn-info.focus {\n color: #fff;\n background-color: #31b0d5;\n border-color: #1b6d85;\n}\n.btn-info:hover {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active:hover,\n.btn-info.active:hover,\n.open > .dropdown-toggle.btn-info:hover,\n.btn-info:active:focus,\n.btn-info.active:focus,\n.open > .dropdown-toggle.btn-info:focus,\n.btn-info:active.focus,\n.btn-info.active.focus,\n.open > .dropdown-toggle.btn-info.focus {\n color: #fff;\n background-color: #269abc;\n border-color: #1b6d85;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n background-image: none;\n}\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus {\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info .badge {\n color: #5bc0de;\n background-color: #fff;\n}\n.btn-warning {\n color: #fff;\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning:focus,\n.btn-warning.focus {\n color: #fff;\n background-color: #ec971f;\n border-color: #985f0d;\n}\n.btn-warning:hover {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active:hover,\n.btn-warning.active:hover,\n.open > .dropdown-toggle.btn-warning:hover,\n.btn-warning:active:focus,\n.btn-warning.active:focus,\n.open > .dropdown-toggle.btn-warning:focus,\n.btn-warning:active.focus,\n.btn-warning.active.focus,\n.open > .dropdown-toggle.btn-warning.focus {\n color: #fff;\n background-color: #d58512;\n border-color: #985f0d;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n background-image: none;\n}\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus {\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning .badge {\n color: #f0ad4e;\n background-color: #fff;\n}\n.btn-danger {\n color: #fff;\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger:focus,\n.btn-danger.focus {\n color: #fff;\n background-color: #c9302c;\n border-color: #761c19;\n}\n.btn-danger:hover {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active:hover,\n.btn-danger.active:hover,\n.open > .dropdown-toggle.btn-danger:hover,\n.btn-danger:active:focus,\n.btn-danger.active:focus,\n.open > .dropdown-toggle.btn-danger:focus,\n.btn-danger:active.focus,\n.btn-danger.active.focus,\n.open > .dropdown-toggle.btn-danger.focus {\n color: #fff;\n background-color: #ac2925;\n border-color: #761c19;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n background-image: none;\n}\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus {\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger .badge {\n color: #d9534f;\n background-color: #fff;\n}\n.btn-link {\n color: #337ab7;\n font-weight: normal;\n border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n background-color: transparent;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n color: #23527c;\n text-decoration: underline;\n background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n color: #777777;\n text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n padding: 1px 5px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-block {\n display: block;\n width: 100%;\n}\n.btn-block + .btn-block {\n margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n.fade {\n opacity: 0;\n -webkit-transition: opacity 0.15s linear;\n -o-transition: opacity 0.15s linear;\n transition: opacity 0.15s linear;\n}\n.fade.in {\n opacity: 1;\n}\n.collapse {\n display: none;\n}\n.collapse.in {\n display: block;\n}\ntr.collapse.in {\n display: table-row;\n}\ntbody.collapse.in {\n display: table-row-group;\n}\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n -webkit-transition-property: height, visibility;\n transition-property: height, visibility;\n -webkit-transition-duration: 0.35s;\n transition-duration: 0.35s;\n -webkit-transition-timing-function: ease;\n transition-timing-function: ease;\n}\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: 4px dashed;\n border-top: 4px solid \\9;\n border-right: 4px solid transparent;\n border-left: 4px solid transparent;\n}\n.dropup,\n.dropdown {\n position: relative;\n}\n.dropdown-toggle:focus {\n outline: 0;\n}\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0;\n list-style: none;\n font-size: 14px;\n text-align: left;\n background-color: #fff;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 4px;\n -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n background-clip: padding-box;\n}\n.dropdown-menu.pull-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu .divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: 1.42857143;\n color: #333333;\n white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n text-decoration: none;\n color: #262626;\n background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n color: #fff;\n text-decoration: none;\n outline: 0;\n background-color: #337ab7;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n color: #777777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n cursor: not-allowed;\n}\n.open > .dropdown-menu {\n display: block;\n}\n.open > a {\n outline: 0;\n}\n.dropdown-menu-right {\n left: auto;\n right: 0;\n}\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: 12px;\n line-height: 1.42857143;\n color: #777777;\n white-space: nowrap;\n}\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: 990;\n}\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n border-top: 0;\n border-bottom: 4px dashed;\n border-bottom: 4px solid \\9;\n content: \"\";\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n}\n@media (min-width: 768px) {\n .navbar-right .dropdown-menu {\n left: auto;\n right: 0;\n }\n .navbar-right .dropdown-menu-left {\n left: 0;\n right: auto;\n }\n}\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n z-index: 2;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n margin-left: -1px;\n}\n.btn-toolbar {\n margin-left: -5px;\n}\n.btn-toolbar .btn,\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n.btn-group > .btn:first-child {\n margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n.btn-group.open .dropdown-toggle {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn .caret {\n margin-left: 0;\n}\n.btn-lg .caret {\n border-width: 5px 5px 0;\n border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n.input-group {\n position: relative;\n display: table;\n border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n}\n.input-group .form-control {\n position: relative;\n z-index: 2;\n float: left;\n width: 100%;\n margin-bottom: 0;\n}\n.input-group .form-control:focus {\n z-index: 3;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle;\n}\n.input-group-addon {\n padding: 6px 12px;\n font-size: 14px;\n font-weight: normal;\n line-height: 1;\n color: #555555;\n text-align: center;\n background-color: #eeeeee;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\n.input-group-addon.input-sm {\n padding: 5px 10px;\n font-size: 12px;\n border-radius: 3px;\n}\n.input-group-addon.input-lg {\n padding: 10px 16px;\n font-size: 18px;\n border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n.input-group-btn {\n position: relative;\n font-size: 0;\n white-space: nowrap;\n}\n.input-group-btn > .btn {\n position: relative;\n}\n.input-group-btn > .btn + .btn {\n margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n z-index: 2;\n margin-left: -1px;\n}\n.nav {\n margin-bottom: 0;\n padding-left: 0;\n list-style: none;\n}\n.nav > li {\n position: relative;\n display: block;\n}\n.nav > li > a {\n position: relative;\n display: block;\n padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.nav > li.disabled > a {\n color: #777777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n color: #777777;\n text-decoration: none;\n background-color: transparent;\n cursor: not-allowed;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n background-color: #eeeeee;\n border-color: #337ab7;\n}\n.nav .nav-divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.nav > li > a > img {\n max-width: none;\n}\n.nav-tabs {\n border-bottom: 1px solid #ddd;\n}\n.nav-tabs > li {\n float: left;\n margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n margin-right: 2px;\n line-height: 1.42857143;\n border: 1px solid transparent;\n border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n border-color: #eeeeee #eeeeee #ddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n color: #555555;\n background-color: #fff;\n border: 1px solid #ddd;\n border-bottom-color: transparent;\n cursor: default;\n}\n.nav-tabs.nav-justified {\n width: 100%;\n border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n float: none;\n}\n.nav-tabs.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-tabs.nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs.nav-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs.nav-justified > .active > a,\n .nav-tabs.nav-justified > .active > a:hover,\n .nav-tabs.nav-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.nav-pills > li {\n float: left;\n}\n.nav-pills > li > a {\n border-radius: 4px;\n}\n.nav-pills > li + li {\n margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n color: #fff;\n background-color: #337ab7;\n}\n.nav-stacked > li {\n float: none;\n}\n.nav-stacked > li + li {\n margin-top: 2px;\n margin-left: 0;\n}\n.nav-justified {\n width: 100%;\n}\n.nav-justified > li {\n float: none;\n}\n.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px;\n}\n.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs-justified {\n border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs-justified > .active > a,\n .nav-tabs-justified > .active > a:hover,\n .nav-tabs-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.tab-content > .tab-pane {\n display: none;\n}\n.tab-content > .active {\n display: block;\n}\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.navbar {\n position: relative;\n min-height: 50px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n .navbar {\n border-radius: 4px;\n }\n}\n@media (min-width: 768px) {\n .navbar-header {\n float: left;\n }\n}\n.navbar-collapse {\n overflow-x: visible;\n padding-right: 15px;\n padding-left: 15px;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n -webkit-overflow-scrolling: touch;\n}\n.navbar-collapse.in {\n overflow-y: auto;\n}\n@media (min-width: 768px) {\n .navbar-collapse {\n width: auto;\n border-top: 0;\n box-shadow: none;\n }\n .navbar-collapse.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0;\n overflow: visible !important;\n }\n .navbar-collapse.in {\n overflow-y: visible;\n }\n .navbar-fixed-top .navbar-collapse,\n .navbar-static-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n padding-left: 0;\n padding-right: 0;\n }\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n .navbar-fixed-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n max-height: 200px;\n }\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .container > .navbar-header,\n .container-fluid > .navbar-header,\n .container > .navbar-collapse,\n .container-fluid > .navbar-collapse {\n margin-right: 0;\n margin-left: 0;\n }\n}\n.navbar-static-top {\n z-index: 1000;\n border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n .navbar-static-top {\n border-radius: 0;\n }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n@media (min-width: 768px) {\n .navbar-fixed-top,\n .navbar-fixed-bottom {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0;\n border-width: 1px 0 0;\n}\n.navbar-brand {\n float: left;\n padding: 15px 15px;\n font-size: 18px;\n line-height: 20px;\n height: 50px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n text-decoration: none;\n}\n.navbar-brand > img {\n display: block;\n}\n@media (min-width: 768px) {\n .navbar > .container .navbar-brand,\n .navbar > .container-fluid .navbar-brand {\n margin-left: -15px;\n }\n}\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: 15px;\n padding: 9px 10px;\n margin-top: 8px;\n margin-bottom: 8px;\n background-color: transparent;\n background-image: none;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.navbar-toggle:focus {\n outline: 0;\n}\n.navbar-toggle .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n margin-top: 4px;\n}\n@media (min-width: 768px) {\n .navbar-toggle {\n display: none;\n }\n}\n.navbar-nav {\n margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: 20px;\n}\n@media (max-width: 767px) {\n .navbar-nav .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n }\n .navbar-nav .open .dropdown-menu > li > a,\n .navbar-nav .open .dropdown-menu .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n .navbar-nav .open .dropdown-menu > li > a {\n line-height: 20px;\n }\n .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-nav .open .dropdown-menu > li > a:focus {\n background-image: none;\n }\n}\n@media (min-width: 768px) {\n .navbar-nav {\n float: left;\n margin: 0;\n }\n .navbar-nav > li {\n float: left;\n }\n .navbar-nav > li > a {\n padding-top: 15px;\n padding-bottom: 15px;\n }\n}\n.navbar-form {\n margin-left: -15px;\n margin-right: -15px;\n padding: 10px 15px;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n margin-top: 8px;\n margin-bottom: 8px;\n}\n@media (min-width: 768px) {\n .navbar-form .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .navbar-form .form-control-static {\n display: inline-block;\n }\n .navbar-form .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .navbar-form .input-group .input-group-addon,\n .navbar-form .input-group .input-group-btn,\n .navbar-form .input-group .form-control {\n width: auto;\n }\n .navbar-form .input-group > .form-control {\n width: 100%;\n }\n .navbar-form .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio,\n .navbar-form .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio label,\n .navbar-form .checkbox label {\n padding-left: 0;\n }\n .navbar-form .radio input[type=\"radio\"],\n .navbar-form .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .navbar-form .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n@media (max-width: 767px) {\n .navbar-form .form-group {\n margin-bottom: 5px;\n }\n .navbar-form .form-group:last-child {\n margin-bottom: 0;\n }\n}\n@media (min-width: 768px) {\n .navbar-form {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n}\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.navbar-btn {\n margin-top: 8px;\n margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n margin-top: 14px;\n margin-bottom: 14px;\n}\n.navbar-text {\n margin-top: 15px;\n margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n .navbar-text {\n float: left;\n margin-left: 15px;\n margin-right: 15px;\n }\n}\n@media (min-width: 768px) {\n .navbar-left {\n float: left !important;\n }\n .navbar-right {\n float: right !important;\n margin-right: -15px;\n }\n .navbar-right ~ .navbar-right {\n margin-right: 0;\n }\n}\n.navbar-default {\n background-color: #f8f8f8;\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n color: #777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n color: #5e5e5e;\n background-color: transparent;\n}\n.navbar-default .navbar-text {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n color: #333;\n background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n border-color: #ddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n background-color: #ddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n background-color: #888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n background-color: #e7e7e7;\n color: #555;\n}\n@media (max-width: 767px) {\n .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n color: #777;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #333;\n background-color: transparent;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n }\n}\n.navbar-default .navbar-link {\n color: #777;\n}\n.navbar-default .navbar-link:hover {\n color: #333;\n}\n.navbar-default .btn-link {\n color: #777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n color: #333;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n color: #ccc;\n}\n.navbar-inverse {\n background-color: #222;\n border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n color: #fff;\n background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n border-color: #333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n background-color: #333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n background-color: #fff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n border-color: #101010;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n background-color: #080808;\n color: #fff;\n}\n@media (max-width: 767px) {\n .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n border-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n color: #9d9d9d;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #fff;\n background-color: transparent;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n }\n}\n.navbar-inverse .navbar-link {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n color: #fff;\n}\n.navbar-inverse .btn-link {\n color: #9d9d9d;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n color: #fff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n color: #444;\n}\n.breadcrumb {\n padding: 8px 15px;\n margin-bottom: 20px;\n list-style: none;\n background-color: #f5f5f5;\n border-radius: 4px;\n}\n.breadcrumb > li {\n display: inline-block;\n}\n.breadcrumb > li + li:before {\n content: \"/\\00a0\";\n padding: 0 5px;\n color: #ccc;\n}\n.breadcrumb > .active {\n color: #777777;\n}\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: 20px 0;\n border-radius: 4px;\n}\n.pagination > li {\n display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n position: relative;\n float: left;\n padding: 6px 12px;\n line-height: 1.42857143;\n text-decoration: none;\n color: #337ab7;\n background-color: #fff;\n border: 1px solid #ddd;\n margin-left: -1px;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n margin-left: 0;\n border-bottom-left-radius: 4px;\n border-top-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n border-bottom-right-radius: 4px;\n border-top-right-radius: 4px;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n z-index: 2;\n color: #23527c;\n background-color: #eeeeee;\n border-color: #ddd;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n z-index: 3;\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n cursor: default;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n color: #777777;\n background-color: #fff;\n border-color: #ddd;\n cursor: not-allowed;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n border-bottom-left-radius: 6px;\n border-top-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n border-bottom-right-radius: 6px;\n border-top-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n border-bottom-left-radius: 3px;\n border-top-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n border-bottom-right-radius: 3px;\n border-top-right-radius: 3px;\n}\n.pager {\n padding-left: 0;\n margin: 20px 0;\n list-style: none;\n text-align: center;\n}\n.pager li {\n display: inline;\n}\n.pager li > a,\n.pager li > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.pager .next > a,\n.pager .next > span {\n float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n color: #777777;\n background-color: #fff;\n cursor: not-allowed;\n}\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n}\na.label:hover,\na.label:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.label:empty {\n display: none;\n}\n.btn .label {\n position: relative;\n top: -1px;\n}\n.label-default {\n background-color: #777777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n background-color: #5e5e5e;\n}\n.label-primary {\n background-color: #337ab7;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n background-color: #286090;\n}\n.label-success {\n background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n background-color: #449d44;\n}\n.label-info {\n background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n background-color: #31b0d5;\n}\n.label-warning {\n background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n background-color: #ec971f;\n}\n.label-danger {\n background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n background-color: #c9302c;\n}\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: 12px;\n font-weight: bold;\n color: #fff;\n line-height: 1;\n vertical-align: middle;\n white-space: nowrap;\n text-align: center;\n background-color: #777777;\n border-radius: 10px;\n}\n.badge:empty {\n display: none;\n}\n.btn .badge {\n position: relative;\n top: -1px;\n}\n.btn-xs .badge,\n.btn-group-xs > .btn .badge {\n top: 0;\n padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.list-group-item > .badge {\n float: right;\n}\n.list-group-item > .badge + .badge {\n margin-right: 5px;\n}\n.nav-pills > li > a > .badge {\n margin-left: 3px;\n}\n.jumbotron {\n padding-top: 30px;\n padding-bottom: 30px;\n margin-bottom: 30px;\n color: inherit;\n background-color: #eeeeee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n color: inherit;\n}\n.jumbotron p {\n margin-bottom: 15px;\n font-size: 21px;\n font-weight: 200;\n}\n.jumbotron > hr {\n border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n border-radius: 6px;\n padding-left: 15px;\n padding-right: 15px;\n}\n.jumbotron .container {\n max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n .jumbotron {\n padding-top: 48px;\n padding-bottom: 48px;\n }\n .container .jumbotron,\n .container-fluid .jumbotron {\n padding-left: 60px;\n padding-right: 60px;\n }\n .jumbotron h1,\n .jumbotron .h1 {\n font-size: 63px;\n }\n}\n.thumbnail {\n display: block;\n padding: 4px;\n margin-bottom: 20px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: border 0.2s ease-in-out;\n -o-transition: border 0.2s ease-in-out;\n transition: border 0.2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n margin-left: auto;\n margin-right: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n border-color: #337ab7;\n}\n.thumbnail .caption {\n padding: 9px;\n color: #333333;\n}\n.alert {\n padding: 15px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.alert h4 {\n margin-top: 0;\n color: inherit;\n}\n.alert .alert-link {\n font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n margin-bottom: 0;\n}\n.alert > p + p {\n margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n}\n.alert-success {\n background-color: #dff0d8;\n border-color: #d6e9c6;\n color: #3c763d;\n}\n.alert-success hr {\n border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n color: #2b542c;\n}\n.alert-info {\n background-color: #d9edf7;\n border-color: #bce8f1;\n color: #31708f;\n}\n.alert-info hr {\n border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n color: #245269;\n}\n.alert-warning {\n background-color: #fcf8e3;\n border-color: #faebcc;\n color: #8a6d3b;\n}\n.alert-warning hr {\n border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n color: #66512c;\n}\n.alert-danger {\n background-color: #f2dede;\n border-color: #ebccd1;\n color: #a94442;\n}\n.alert-danger hr {\n border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n@keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n.progress {\n overflow: hidden;\n height: 20px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: 12px;\n line-height: 20px;\n color: #fff;\n text-align: center;\n background-color: #337ab7;\n -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n -webkit-transition: width 0.6s ease;\n -o-transition: width 0.6s ease;\n transition: width 0.6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n -webkit-animation: progress-bar-stripes 2s linear infinite;\n -o-animation: progress-bar-stripes 2s linear infinite;\n animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-info {\n background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-warning {\n background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-danger {\n background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.media {\n margin-top: 15px;\n}\n.media:first-child {\n margin-top: 0;\n}\n.media,\n.media-body {\n zoom: 1;\n overflow: hidden;\n}\n.media-body {\n width: 10000px;\n}\n.media-object {\n display: block;\n}\n.media-object.img-thumbnail {\n max-width: none;\n}\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n.media-middle {\n vertical-align: middle;\n}\n.media-bottom {\n vertical-align: bottom;\n}\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n.list-group {\n margin-bottom: 20px;\n padding-left: 0;\n}\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n margin-bottom: -1px;\n background-color: #fff;\n border: 1px solid #ddd;\n}\n.list-group-item:first-child {\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n}\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\na.list-group-item,\nbutton.list-group-item {\n color: #555;\n}\na.list-group-item .list-group-item-heading,\nbutton.list-group-item .list-group-item-heading {\n color: #333;\n}\na.list-group-item:hover,\nbutton.list-group-item:hover,\na.list-group-item:focus,\nbutton.list-group-item:focus {\n text-decoration: none;\n color: #555;\n background-color: #f5f5f5;\n}\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n background-color: #eeeeee;\n color: #777777;\n cursor: not-allowed;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n color: #777777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n z-index: 2;\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n color: #c7ddef;\n}\n.list-group-item-success {\n color: #3c763d;\n background-color: #dff0d8;\n}\na.list-group-item-success,\nbutton.list-group-item-success {\n color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading,\nbutton.list-group-item-success .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-success:hover,\nbutton.list-group-item-success:hover,\na.list-group-item-success:focus,\nbutton.list-group-item-success:focus {\n color: #3c763d;\n background-color: #d0e9c6;\n}\na.list-group-item-success.active,\nbutton.list-group-item-success.active,\na.list-group-item-success.active:hover,\nbutton.list-group-item-success.active:hover,\na.list-group-item-success.active:focus,\nbutton.list-group-item-success.active:focus {\n color: #fff;\n background-color: #3c763d;\n border-color: #3c763d;\n}\n.list-group-item-info {\n color: #31708f;\n background-color: #d9edf7;\n}\na.list-group-item-info,\nbutton.list-group-item-info {\n color: #31708f;\n}\na.list-group-item-info .list-group-item-heading,\nbutton.list-group-item-info .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-info:hover,\nbutton.list-group-item-info:hover,\na.list-group-item-info:focus,\nbutton.list-group-item-info:focus {\n color: #31708f;\n background-color: #c4e3f3;\n}\na.list-group-item-info.active,\nbutton.list-group-item-info.active,\na.list-group-item-info.active:hover,\nbutton.list-group-item-info.active:hover,\na.list-group-item-info.active:focus,\nbutton.list-group-item-info.active:focus {\n color: #fff;\n background-color: #31708f;\n border-color: #31708f;\n}\n.list-group-item-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n}\na.list-group-item-warning,\nbutton.list-group-item-warning {\n color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading,\nbutton.list-group-item-warning .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-warning:hover,\nbutton.list-group-item-warning:hover,\na.list-group-item-warning:focus,\nbutton.list-group-item-warning:focus {\n color: #8a6d3b;\n background-color: #faf2cc;\n}\na.list-group-item-warning.active,\nbutton.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\nbutton.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus,\nbutton.list-group-item-warning.active:focus {\n color: #fff;\n background-color: #8a6d3b;\n border-color: #8a6d3b;\n}\n.list-group-item-danger {\n color: #a94442;\n background-color: #f2dede;\n}\na.list-group-item-danger,\nbutton.list-group-item-danger {\n color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading,\nbutton.list-group-item-danger .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-danger:hover,\nbutton.list-group-item-danger:hover,\na.list-group-item-danger:focus,\nbutton.list-group-item-danger:focus {\n color: #a94442;\n background-color: #ebcccc;\n}\na.list-group-item-danger.active,\nbutton.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\nbutton.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus,\nbutton.list-group-item-danger.active:focus {\n color: #fff;\n background-color: #a94442;\n border-color: #a94442;\n}\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n.panel {\n margin-bottom: 20px;\n background-color: #fff;\n border: 1px solid transparent;\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.panel-body {\n padding: 15px;\n}\n.panel-heading {\n padding: 10px 15px;\n border-bottom: 1px solid transparent;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n color: inherit;\n}\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: 16px;\n color: inherit;\n}\n.panel-title > a,\n.panel-title > small,\n.panel-title > .small,\n.panel-title > small > a,\n.panel-title > .small > a {\n color: inherit;\n}\n.panel-footer {\n padding: 10px 15px;\n background-color: #f5f5f5;\n border-top: 1px solid #ddd;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n border-top: 0;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n border-bottom: 0;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n border-top-width: 0;\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n padding-left: 15px;\n padding-right: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n border-bottom-left-radius: 3px;\n border-bottom-right-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n border-top: 1px solid #ddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n border-bottom: 0;\n}\n.panel > .table-responsive {\n border: 0;\n margin-bottom: 0;\n}\n.panel-group {\n margin-bottom: 20px;\n}\n.panel-group .panel {\n margin-bottom: 0;\n border-radius: 4px;\n}\n.panel-group .panel + .panel {\n margin-top: 5px;\n}\n.panel-group .panel-heading {\n border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n border-top: 1px solid #ddd;\n}\n.panel-group .panel-footer {\n border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n border-bottom: 1px solid #ddd;\n}\n.panel-default {\n border-color: #ddd;\n}\n.panel-default > .panel-heading {\n color: #333333;\n background-color: #f5f5f5;\n border-color: #ddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ddd;\n}\n.panel-default > .panel-heading .badge {\n color: #f5f5f5;\n background-color: #333333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ddd;\n}\n.panel-primary {\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading {\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #337ab7;\n}\n.panel-primary > .panel-heading .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #337ab7;\n}\n.panel-success {\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n color: #dff0d8;\n background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #d6e9c6;\n}\n.panel-info {\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n color: #d9edf7;\n background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #bce8f1;\n}\n.panel-warning {\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n color: #fcf8e3;\n background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #faebcc;\n}\n.panel-danger {\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n color: #f2dede;\n background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0;\n}\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border: 1px solid #e3e3e3;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.well blockquote {\n border-color: #ddd;\n border-color: rgba(0, 0, 0, 0.15);\n}\n.well-lg {\n padding: 24px;\n border-radius: 6px;\n}\n.well-sm {\n padding: 9px;\n border-radius: 3px;\n}\n.close {\n float: right;\n font-size: 21px;\n font-weight: bold;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n opacity: 0.2;\n filter: alpha(opacity=20);\n}\n.close:hover,\n.close:focus {\n color: #000;\n text-decoration: none;\n cursor: pointer;\n opacity: 0.5;\n filter: alpha(opacity=50);\n}\nbutton.close {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n}\n.modal-open {\n overflow: hidden;\n}\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1050;\n -webkit-overflow-scrolling: touch;\n outline: 0;\n}\n.modal.fade .modal-dialog {\n -webkit-transform: translate(0, -25%);\n -ms-transform: translate(0, -25%);\n -o-transform: translate(0, -25%);\n transform: translate(0, -25%);\n -webkit-transition: -webkit-transform 0.3s ease-out;\n -moz-transition: -moz-transform 0.3s ease-out;\n -o-transition: -o-transform 0.3s ease-out;\n transition: transform 0.3s ease-out;\n}\n.modal.in .modal-dialog {\n -webkit-transform: translate(0, 0);\n -ms-transform: translate(0, 0);\n -o-transform: translate(0, 0);\n transform: translate(0, 0);\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n.modal-content {\n position: relative;\n background-color: #fff;\n border: 1px solid #999;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n background-clip: padding-box;\n outline: 0;\n}\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1040;\n background-color: #000;\n}\n.modal-backdrop.fade {\n opacity: 0;\n filter: alpha(opacity=0);\n}\n.modal-backdrop.in {\n opacity: 0.5;\n filter: alpha(opacity=50);\n}\n.modal-header {\n padding: 15px;\n border-bottom: 1px solid #e5e5e5;\n}\n.modal-header .close {\n margin-top: -2px;\n}\n.modal-title {\n margin: 0;\n line-height: 1.42857143;\n}\n.modal-body {\n position: relative;\n padding: 15px;\n}\n.modal-footer {\n padding: 15px;\n text-align: right;\n border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0;\n}\n.modal-footer .btn-group .btn + .btn {\n margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n margin-left: 0;\n}\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n@media (min-width: 768px) {\n .modal-dialog {\n width: 600px;\n margin: 30px auto;\n }\n .modal-content {\n -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n }\n .modal-sm {\n width: 300px;\n }\n}\n@media (min-width: 992px) {\n .modal-lg {\n width: 900px;\n }\n}\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: 1.42857143;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n font-size: 12px;\n opacity: 0;\n filter: alpha(opacity=0);\n}\n.tooltip.in {\n opacity: 0.9;\n filter: alpha(opacity=90);\n}\n.tooltip.top {\n margin-top: -3px;\n padding: 5px 0;\n}\n.tooltip.right {\n margin-left: 3px;\n padding: 0 5px;\n}\n.tooltip.bottom {\n margin-top: 3px;\n padding: 5px 0;\n}\n.tooltip.left {\n margin-left: -3px;\n padding: 0 5px;\n}\n.tooltip-inner {\n max-width: 200px;\n padding: 3px 8px;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 4px;\n}\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-left .tooltip-arrow {\n bottom: 0;\n right: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-right .tooltip-arrow {\n bottom: 0;\n left: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: #000;\n}\n.tooltip.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: #000;\n}\n.tooltip.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n top: 0;\n right: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n top: 0;\n left: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: none;\n max-width: 276px;\n padding: 1px;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: 1.42857143;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n font-size: 14px;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n}\n.popover.top {\n margin-top: -10px;\n}\n.popover.right {\n margin-left: 10px;\n}\n.popover.bottom {\n margin-top: 10px;\n}\n.popover.left {\n margin-left: -10px;\n}\n.popover-title {\n margin: 0;\n padding: 8px 14px;\n font-size: 14px;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-radius: 5px 5px 0 0;\n}\n.popover-content {\n padding: 9px 14px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.popover > .arrow {\n border-width: 11px;\n}\n.popover > .arrow:after {\n border-width: 10px;\n content: \"\";\n}\n.popover.top > .arrow {\n left: 50%;\n margin-left: -11px;\n border-bottom-width: 0;\n border-top-color: #999999;\n border-top-color: rgba(0, 0, 0, 0.25);\n bottom: -11px;\n}\n.popover.top > .arrow:after {\n content: \" \";\n bottom: 1px;\n margin-left: -10px;\n border-bottom-width: 0;\n border-top-color: #fff;\n}\n.popover.right > .arrow {\n top: 50%;\n left: -11px;\n margin-top: -11px;\n border-left-width: 0;\n border-right-color: #999999;\n border-right-color: rgba(0, 0, 0, 0.25);\n}\n.popover.right > .arrow:after {\n content: \" \";\n left: 1px;\n bottom: -10px;\n border-left-width: 0;\n border-right-color: #fff;\n}\n.popover.bottom > .arrow {\n left: 50%;\n margin-left: -11px;\n border-top-width: 0;\n border-bottom-color: #999999;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n top: -11px;\n}\n.popover.bottom > .arrow:after {\n content: \" \";\n top: 1px;\n margin-left: -10px;\n border-top-width: 0;\n border-bottom-color: #fff;\n}\n.popover.left > .arrow {\n top: 50%;\n right: -11px;\n margin-top: -11px;\n border-right-width: 0;\n border-left-color: #999999;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n.popover.left > .arrow:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: #fff;\n bottom: -10px;\n}\n.carousel {\n position: relative;\n}\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n}\n.carousel-inner > .item {\n display: none;\n position: relative;\n -webkit-transition: 0.6s ease-in-out left;\n -o-transition: 0.6s ease-in-out left;\n transition: 0.6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n .carousel-inner > .item {\n -webkit-transition: -webkit-transform 0.6s ease-in-out;\n -moz-transition: -moz-transform 0.6s ease-in-out;\n -o-transition: -o-transform 0.6s ease-in-out;\n transition: transform 0.6s ease-in-out;\n -webkit-backface-visibility: hidden;\n -moz-backface-visibility: hidden;\n backface-visibility: hidden;\n -webkit-perspective: 1000px;\n -moz-perspective: 1000px;\n perspective: 1000px;\n }\n .carousel-inner > .item.next,\n .carousel-inner > .item.active.right {\n -webkit-transform: translate3d(100%, 0, 0);\n transform: translate3d(100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.prev,\n .carousel-inner > .item.active.left {\n -webkit-transform: translate3d(-100%, 0, 0);\n transform: translate3d(-100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.next.left,\n .carousel-inner > .item.prev.right,\n .carousel-inner > .item.active {\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n left: 0;\n }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n display: block;\n}\n.carousel-inner > .active {\n left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n}\n.carousel-inner > .next {\n left: 100%;\n}\n.carousel-inner > .prev {\n left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n left: 0;\n}\n.carousel-inner > .active.left {\n left: -100%;\n}\n.carousel-inner > .active.right {\n left: 100%;\n}\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: 15%;\n opacity: 0.5;\n filter: alpha(opacity=50);\n font-size: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n background-color: rgba(0, 0, 0, 0);\n}\n.carousel-control.left {\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n}\n.carousel-control.right {\n left: auto;\n right: 0;\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n}\n.carousel-control:hover,\n.carousel-control:focus {\n outline: 0;\n color: #fff;\n text-decoration: none;\n opacity: 0.9;\n filter: alpha(opacity=90);\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n margin-top: -10px;\n z-index: 5;\n display: inline-block;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n width: 20px;\n height: 20px;\n line-height: 1;\n font-family: serif;\n}\n.carousel-control .icon-prev:before {\n content: '\\2039';\n}\n.carousel-control .icon-next:before {\n content: '\\203a';\n}\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n}\n.carousel-indicators li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid #fff;\n border-radius: 10px;\n cursor: pointer;\n background-color: #000 \\9;\n background-color: rgba(0, 0, 0, 0);\n}\n.carousel-indicators .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: #fff;\n}\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-caption .btn {\n text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-prev,\n .carousel-control .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -10px;\n font-size: 30px;\n }\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .icon-prev {\n margin-left: -10px;\n }\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-next {\n margin-right: -10px;\n }\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n .carousel-indicators {\n bottom: 20px;\n }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-header:before,\n.modal-header:after,\n.modal-footer:before,\n.modal-footer:after {\n content: \" \";\n display: table;\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-header:after,\n.modal-footer:after {\n clear: both;\n}\n.center-block {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n.hidden {\n display: none !important;\n}\n.affix {\n position: fixed;\n}\n@-ms-viewport {\n width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n@media (max-width: 767px) {\n .visible-xs {\n display: block !important;\n }\n table.visible-xs {\n display: table !important;\n }\n tr.visible-xs {\n display: table-row !important;\n }\n th.visible-xs,\n td.visible-xs {\n display: table-cell !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-block {\n display: block !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline {\n display: inline !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm {\n display: block !important;\n }\n table.visible-sm {\n display: table !important;\n }\n tr.visible-sm {\n display: table-row !important;\n }\n th.visible-sm,\n td.visible-sm {\n display: table-cell !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-block {\n display: block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline {\n display: inline !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md {\n display: block !important;\n }\n table.visible-md {\n display: table !important;\n }\n tr.visible-md {\n display: table-row !important;\n }\n th.visible-md,\n td.visible-md {\n display: table-cell !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-block {\n display: block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline {\n display: inline !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg {\n display: block !important;\n }\n table.visible-lg {\n display: table !important;\n }\n tr.visible-lg {\n display: table-row !important;\n }\n th.visible-lg,\n td.visible-lg {\n display: table-cell !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-block {\n display: block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline {\n display: inline !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline-block {\n display: inline-block !important;\n }\n}\n@media (max-width: 767px) {\n .hidden-xs {\n display: none !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .hidden-sm {\n display: none !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .hidden-md {\n display: none !important;\n }\n}\n@media (min-width: 1200px) {\n .hidden-lg {\n display: none !important;\n }\n}\n.visible-print {\n display: none !important;\n}\n@media print {\n .visible-print {\n display: block !important;\n }\n table.visible-print {\n display: table !important;\n }\n tr.visible-print {\n display: table-row !important;\n }\n th.visible-print,\n td.visible-print {\n display: table-cell !important;\n }\n}\n.visible-print-block {\n display: none !important;\n}\n@media print {\n .visible-print-block {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n}\n@media print {\n .visible-print-inline {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n}\n@media print {\n .visible-print-inline-block {\n display: inline-block !important;\n }\n}\n@media print {\n .hidden-print {\n display: none !important;\n }\n}\n/*# sourceMappingURL=bootstrap.css.map */","/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS and IE text size adjust after device orientation change,\n// without disabling user zoom.\n//\n\nhtml {\n font-family: sans-serif; // 1\n -ms-text-size-adjust: 100%; // 2\n -webkit-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined for any HTML5 element in IE 8/9.\n// Correct `block` display not defined for `details` or `summary` in IE 10/11\n// and Firefox.\n// Correct `block` display not defined for `main` in IE 11.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\n\n//\n// 1. Correct `inline-block` display not defined in IE 8/9.\n// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block; // 1\n vertical-align: baseline; // 2\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9/10.\n// Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n background-color: transparent;\n}\n\n//\n// Improve readability of focused elements when they are also in an\n// active/hover state.\n//\n\na:active,\na:hover {\n outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n//\n\nabbr[title] {\n border-bottom: 1px dotted;\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n//\n\nb,\nstrong {\n font-weight: bold;\n}\n\n//\n// Address styling not present in Safari and Chrome.\n//\n\ndfn {\n font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari, and Chrome.\n//\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n background: #ff0;\n color: #000;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsup {\n top: -0.5em;\n}\n\nsub {\n bottom: -0.25em;\n}\n\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9/10.\n//\n\nimg {\n border: 0;\n}\n\n//\n// Correct overflow not hidden in IE 9/10/11.\n//\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari.\n//\n\nfigure {\n margin: 1em 40px;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n box-sizing: content-box;\n height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n// Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit; // 1\n font: inherit; // 2\n margin: 0; // 3\n}\n\n//\n// Address `overflow` set to `hidden` in IE 8/9/10/11.\n//\n\nbutton {\n overflow: visible;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n// Correct `select` style inheritance in Firefox.\n//\n\nbutton,\nselect {\n text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n// and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n// `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button; // 2\n cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\ninput {\n line-height: normal;\n}\n\n//\n// It's recommended that you don't attempt to style these elements.\n// Firefox's implementation doesn't respect box-sizing, padding, or width.\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/10.\n// 2. Remove excess padding in IE 8/9/10.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box; // 1\n padding: 0; // 2\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari and Chrome.\n//\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield; // 1\n box-sizing: content-box; //2\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9/10/11.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n border: 0; // 1\n padding: 0; // 2\n}\n\n//\n// Remove default vertical scrollbar in IE 8/9/10/11.\n//\n\ntextarea {\n overflow: auto;\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ntd,\nth {\n padding: 0;\n}\n","/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request: h5bp.com/r\n// ==========================================================================\n\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important; // Black prints faster: h5bp.com/s\n box-shadow: none !important;\n text-shadow: none !important;\n }\n\n a,\n a:visited {\n text-decoration: underline;\n }\n\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n\n // Don't show links that are fragment identifiers,\n // or use the `javascript:` pseudo protocol\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n\n thead {\n display: table-header-group; // h5bp.com/t\n }\n\n tr,\n img {\n page-break-inside: avoid;\n }\n\n img {\n max-width: 100% !important;\n }\n\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n\n h2,\n h3 {\n page-break-after: avoid;\n }\n\n // Bootstrap specific changes start\n\n // Bootstrap components\n .navbar {\n display: none;\n }\n .btn,\n .dropup > .btn {\n > .caret {\n border-top-color: #000 !important;\n }\n }\n .label {\n border: 1px solid #000;\n }\n\n .table {\n border-collapse: collapse !important;\n\n td,\n th {\n background-color: #fff !important;\n }\n }\n .table-bordered {\n th,\n td {\n border: 1px solid #ddd !important;\n }\n }\n\n // Bootstrap specific changes end\n}\n","//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n// Star\n\n// Import the fonts\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('@{icon-font-path}@{icon-font-name}.eot');\n src: url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype'),\n url('@{icon-font-path}@{icon-font-name}.woff2') format('woff2'),\n url('@{icon-font-path}@{icon-font-name}.woff') format('woff'),\n url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype'),\n url('@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}') format('svg');\n}\n\n// Catchall baseclass\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk { &:before { content: \"\\002a\"; } }\n.glyphicon-plus { &:before { content: \"\\002b\"; } }\n.glyphicon-euro,\n.glyphicon-eur { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil { &:before { content: \"\\270f\"; } }\n.glyphicon-glass { &:before { content: \"\\e001\"; } }\n.glyphicon-music { &:before { content: \"\\e002\"; } }\n.glyphicon-search { &:before { content: \"\\e003\"; } }\n.glyphicon-heart { &:before { content: \"\\e005\"; } }\n.glyphicon-star { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty { &:before { content: \"\\e007\"; } }\n.glyphicon-user { &:before { content: \"\\e008\"; } }\n.glyphicon-film { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large { &:before { content: \"\\e010\"; } }\n.glyphicon-th { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list { &:before { content: \"\\e012\"; } }\n.glyphicon-ok { &:before { content: \"\\e013\"; } }\n.glyphicon-remove { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out { &:before { content: \"\\e016\"; } }\n.glyphicon-off { &:before { content: \"\\e017\"; } }\n.glyphicon-signal { &:before { content: \"\\e018\"; } }\n.glyphicon-cog { &:before { content: \"\\e019\"; } }\n.glyphicon-trash { &:before { content: \"\\e020\"; } }\n.glyphicon-home { &:before { content: \"\\e021\"; } }\n.glyphicon-file { &:before { content: \"\\e022\"; } }\n.glyphicon-time { &:before { content: \"\\e023\"; } }\n.glyphicon-road { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt { &:before { content: \"\\e025\"; } }\n.glyphicon-download { &:before { content: \"\\e026\"; } }\n.glyphicon-upload { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt { &:before { content: \"\\e032\"; } }\n.glyphicon-lock { &:before { content: \"\\e033\"; } }\n.glyphicon-flag { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode { &:before { content: \"\\e040\"; } }\n.glyphicon-tag { &:before { content: \"\\e041\"; } }\n.glyphicon-tags { &:before { content: \"\\e042\"; } }\n.glyphicon-book { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark { &:before { content: \"\\e044\"; } }\n.glyphicon-print { &:before { content: \"\\e045\"; } }\n.glyphicon-camera { &:before { content: \"\\e046\"; } }\n.glyphicon-font { &:before { content: \"\\e047\"; } }\n.glyphicon-bold { &:before { content: \"\\e048\"; } }\n.glyphicon-italic { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify { &:before { content: \"\\e055\"; } }\n.glyphicon-list { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video { &:before { content: \"\\e059\"; } }\n.glyphicon-picture { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust { &:before { content: \"\\e063\"; } }\n.glyphicon-tint { &:before { content: \"\\e064\"; } }\n.glyphicon-edit { &:before { content: \"\\e065\"; } }\n.glyphicon-share { &:before { content: \"\\e066\"; } }\n.glyphicon-check { &:before { content: \"\\e067\"; } }\n.glyphicon-move { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward { &:before { content: \"\\e070\"; } }\n.glyphicon-backward { &:before { content: \"\\e071\"; } }\n.glyphicon-play { &:before { content: \"\\e072\"; } }\n.glyphicon-pause { &:before { content: \"\\e073\"; } }\n.glyphicon-stop { &:before { content: \"\\e074\"; } }\n.glyphicon-forward { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward { &:before { content: \"\\e077\"; } }\n.glyphicon-eject { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign { &:before { content: \"\\e101\"; } }\n.glyphicon-gift { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf { &:before { content: \"\\e103\"; } }\n.glyphicon-fire { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign { &:before { content: \"\\e107\"; } }\n.glyphicon-plane { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar { &:before { content: \"\\e109\"; } }\n.glyphicon-random { &:before { content: \"\\e110\"; } }\n.glyphicon-comment { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn { &:before { content: \"\\e122\"; } }\n.glyphicon-bell { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down { &:before { content: \"\\e134\"; } }\n.glyphicon-globe { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks { &:before { content: \"\\e137\"; } }\n.glyphicon-filter { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty { &:before { content: \"\\e143\"; } }\n.glyphicon-link { &:before { content: \"\\e144\"; } }\n.glyphicon-phone { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin { &:before { content: \"\\e146\"; } }\n.glyphicon-usd { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp { &:before { content: \"\\e149\"; } }\n.glyphicon-sort { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked { &:before { content: \"\\e157\"; } }\n.glyphicon-expand { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in { &:before { content: \"\\e161\"; } }\n.glyphicon-flash { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window { &:before { content: \"\\e164\"; } }\n.glyphicon-record { &:before { content: \"\\e165\"; } }\n.glyphicon-save { &:before { content: \"\\e166\"; } }\n.glyphicon-open { &:before { content: \"\\e167\"; } }\n.glyphicon-saved { &:before { content: \"\\e168\"; } }\n.glyphicon-import { &:before { content: \"\\e169\"; } }\n.glyphicon-export { &:before { content: \"\\e170\"; } }\n.glyphicon-send { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery { &:before { content: \"\\e179\"; } }\n.glyphicon-header { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt { &:before { content: \"\\e183\"; } }\n.glyphicon-tower { &:before { content: \"\\e184\"; } }\n.glyphicon-stats { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1 { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1 { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1 { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous { &:before { content: \"\\e200\"; } }\n.glyphicon-cd { &:before { content: \"\\e201\"; } }\n.glyphicon-save-file { &:before { content: \"\\e202\"; } }\n.glyphicon-open-file { &:before { content: \"\\e203\"; } }\n.glyphicon-level-up { &:before { content: \"\\e204\"; } }\n.glyphicon-copy { &:before { content: \"\\e205\"; } }\n.glyphicon-paste { &:before { content: \"\\e206\"; } }\n// The following 2 Glyphicons are omitted for the time being because\n// they currently use Unicode codepoints that are outside the\n// Basic Multilingual Plane (BMP). Older buggy versions of WebKit can't handle\n// non-BMP codepoints in CSS string escapes, and thus can't display these two icons.\n// Notably, the bug affects some older versions of the Android Browser.\n// More info: https://github.com/twbs/bootstrap/issues/10106\n// .glyphicon-door { &:before { content: \"\\1f6aa\"; } }\n// .glyphicon-key { &:before { content: \"\\1f511\"; } }\n.glyphicon-alert { &:before { content: \"\\e209\"; } }\n.glyphicon-equalizer { &:before { content: \"\\e210\"; } }\n.glyphicon-king { &:before { content: \"\\e211\"; } }\n.glyphicon-queen { &:before { content: \"\\e212\"; } }\n.glyphicon-pawn { &:before { content: \"\\e213\"; } }\n.glyphicon-bishop { &:before { content: \"\\e214\"; } }\n.glyphicon-knight { &:before { content: \"\\e215\"; } }\n.glyphicon-baby-formula { &:before { content: \"\\e216\"; } }\n.glyphicon-tent { &:before { content: \"\\26fa\"; } }\n.glyphicon-blackboard { &:before { content: \"\\e218\"; } }\n.glyphicon-bed { &:before { content: \"\\e219\"; } }\n.glyphicon-apple { &:before { content: \"\\f8ff\"; } }\n.glyphicon-erase { &:before { content: \"\\e221\"; } }\n.glyphicon-hourglass { &:before { content: \"\\231b\"; } }\n.glyphicon-lamp { &:before { content: \"\\e223\"; } }\n.glyphicon-duplicate { &:before { content: \"\\e224\"; } }\n.glyphicon-piggy-bank { &:before { content: \"\\e225\"; } }\n.glyphicon-scissors { &:before { content: \"\\e226\"; } }\n.glyphicon-bitcoin { &:before { content: \"\\e227\"; } }\n.glyphicon-btc { &:before { content: \"\\e227\"; } }\n.glyphicon-xbt { &:before { content: \"\\e227\"; } }\n.glyphicon-yen { &:before { content: \"\\00a5\"; } }\n.glyphicon-jpy { &:before { content: \"\\00a5\"; } }\n.glyphicon-ruble { &:before { content: \"\\20bd\"; } }\n.glyphicon-rub { &:before { content: \"\\20bd\"; } }\n.glyphicon-scale { &:before { content: \"\\e230\"; } }\n.glyphicon-ice-lolly { &:before { content: \"\\e231\"; } }\n.glyphicon-ice-lolly-tasted { &:before { content: \"\\e232\"; } }\n.glyphicon-education { &:before { content: \"\\e233\"; } }\n.glyphicon-option-horizontal { &:before { content: \"\\e234\"; } }\n.glyphicon-option-vertical { &:before { content: \"\\e235\"; } }\n.glyphicon-menu-hamburger { &:before { content: \"\\e236\"; } }\n.glyphicon-modal-window { &:before { content: \"\\e237\"; } }\n.glyphicon-oil { &:before { content: \"\\e238\"; } }\n.glyphicon-grain { &:before { content: \"\\e239\"; } }\n.glyphicon-sunglasses { &:before { content: \"\\e240\"; } }\n.glyphicon-text-size { &:before { content: \"\\e241\"; } }\n.glyphicon-text-color { &:before { content: \"\\e242\"; } }\n.glyphicon-text-background { &:before { content: \"\\e243\"; } }\n.glyphicon-object-align-top { &:before { content: \"\\e244\"; } }\n.glyphicon-object-align-bottom { &:before { content: \"\\e245\"; } }\n.glyphicon-object-align-horizontal{ &:before { content: \"\\e246\"; } }\n.glyphicon-object-align-left { &:before { content: \"\\e247\"; } }\n.glyphicon-object-align-vertical { &:before { content: \"\\e248\"; } }\n.glyphicon-object-align-right { &:before { content: \"\\e249\"; } }\n.glyphicon-triangle-right { &:before { content: \"\\e250\"; } }\n.glyphicon-triangle-left { &:before { content: \"\\e251\"; } }\n.glyphicon-triangle-bottom { &:before { content: \"\\e252\"; } }\n.glyphicon-triangle-top { &:before { content: \"\\e253\"; } }\n.glyphicon-console { &:before { content: \"\\e254\"; } }\n.glyphicon-superscript { &:before { content: \"\\e255\"; } }\n.glyphicon-subscript { &:before { content: \"\\e256\"; } }\n.glyphicon-menu-left { &:before { content: \"\\e257\"; } }\n.glyphicon-menu-right { &:before { content: \"\\e258\"; } }\n.glyphicon-menu-down { &:before { content: \"\\e259\"; } }\n.glyphicon-menu-up { &:before { content: \"\\e260\"; } }\n","//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// http://getbootstrap.com/getting-started/#third-box-sizing\n* {\n .box-sizing(border-box);\n}\n*:before,\n*:after {\n .box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0,0,0,0);\n}\n\nbody {\n font-family: @font-family-base;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @text-color;\n background-color: @body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\n\n// Links\n\na {\n color: @link-color;\n text-decoration: none;\n\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n }\n\n &:focus {\n .tab-focus();\n }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n margin: 0;\n}\n\n\n// Images\n\nimg {\n vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n .img-responsive();\n}\n\n// Rounded corners\n.img-rounded {\n border-radius: @border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n padding: @thumbnail-padding;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(all .2s ease-in-out);\n\n // Keep them at most 100% wide\n .img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n margin-top: @line-height-computed;\n margin-bottom: @line-height-computed;\n border: 0;\n border-top: 1px solid @hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: http://a11yproject.com/posts/how-to-hide-content\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0,0,0,0);\n border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n// Useful for \"Skip to main content\" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable {\n &:active,\n &:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n }\n}\n\n\n// iOS \"clickable elements\" fix for role=\"button\"\n//\n// Fixes \"clickability\" issue (and more generally, the firing of events such as focus as well)\n// for traditionally non-focusable elements with role=\"button\"\n// see https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n\n[role=\"button\"] {\n cursor: pointer;\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility) {\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// WebKit-style focus\n\n.tab-focus() {\n // WebKit-specific. Other browsers will keep their default outline style.\n // (Initially tried to also force default via `outline: initial`,\n // but that seems to erroneously remove the outline in Firefox altogether.)\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n.img-responsive(@display: block) {\n display: @display;\n max-width: 100%; // Part 1: Set a maximum relative to the parent\n height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size. Note that the\n// spelling of `min--moz-device-pixel-ratio` is intentional.\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\n background-image: url(\"@{file-1x}\");\n\n @media\n only screen and (-webkit-min-device-pixel-ratio: 2),\n only screen and ( min--moz-device-pixel-ratio: 2),\n only screen and ( -o-min-device-pixel-ratio: 2/1),\n only screen and ( min-device-pixel-ratio: 2),\n only screen and ( min-resolution: 192dpi),\n only screen and ( min-resolution: 2dppx) {\n background-image: url(\"@{file-2x}\");\n background-size: @width-1x @height-1x;\n }\n}\n","//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n font-family: @headings-font-family;\n font-weight: @headings-font-weight;\n line-height: @headings-line-height;\n color: @headings-color;\n\n small,\n .small {\n font-weight: normal;\n line-height: 1;\n color: @headings-small-color;\n }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n margin-top: @line-height-computed;\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 65%;\n }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n margin-top: (@line-height-computed / 2);\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 75%;\n }\n}\n\nh1, .h1 { font-size: @font-size-h1; }\nh2, .h2 { font-size: @font-size-h2; }\nh3, .h3 { font-size: @font-size-h3; }\nh4, .h4 { font-size: @font-size-h4; }\nh5, .h5 { font-size: @font-size-h5; }\nh6, .h6 { font-size: @font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n margin: 0 0 (@line-height-computed / 2);\n}\n\n.lead {\n margin-bottom: @line-height-computed;\n font-size: floor((@font-size-base * 1.15));\n font-weight: 300;\n line-height: 1.4;\n\n @media (min-width: @screen-sm-min) {\n font-size: (@font-size-base * 1.5);\n }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: (12px small font / 14px base font) * 100% = about 85%\nsmall,\n.small {\n font-size: floor((100% * @font-size-small / @font-size-base));\n}\n\nmark,\n.mark {\n background-color: @state-warning-bg;\n padding: .2em;\n}\n\n// Alignment\n.text-left { text-align: left; }\n.text-right { text-align: right; }\n.text-center { text-align: center; }\n.text-justify { text-align: justify; }\n.text-nowrap { white-space: nowrap; }\n\n// Transformation\n.text-lowercase { text-transform: lowercase; }\n.text-uppercase { text-transform: uppercase; }\n.text-capitalize { text-transform: capitalize; }\n\n// Contextual colors\n.text-muted {\n color: @text-muted;\n}\n.text-primary {\n .text-emphasis-variant(@brand-primary);\n}\n.text-success {\n .text-emphasis-variant(@state-success-text);\n}\n.text-info {\n .text-emphasis-variant(@state-info-text);\n}\n.text-warning {\n .text-emphasis-variant(@state-warning-text);\n}\n.text-danger {\n .text-emphasis-variant(@state-danger-text);\n}\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n // Given the contrast here, this is the only class to have its color inverted\n // automatically.\n color: #fff;\n .bg-variant(@brand-primary);\n}\n.bg-success {\n .bg-variant(@state-success-bg);\n}\n.bg-info {\n .bg-variant(@state-info-bg);\n}\n.bg-warning {\n .bg-variant(@state-warning-bg);\n}\n.bg-danger {\n .bg-variant(@state-danger-bg);\n}\n\n\n// Page header\n// -------------------------\n\n.page-header {\n padding-bottom: ((@line-height-computed / 2) - 1);\n margin: (@line-height-computed * 2) 0 @line-height-computed;\n border-bottom: 1px solid @page-header-border-color;\n}\n\n\n// Lists\n// -------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n margin-top: 0;\n margin-bottom: (@line-height-computed / 2);\n ul,\n ol {\n margin-bottom: 0;\n }\n}\n\n// List options\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n .list-unstyled();\n margin-left: -5px;\n\n > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n }\n}\n\n// Description Lists\ndl {\n margin-top: 0; // Remove browser default\n margin-bottom: @line-height-computed;\n}\ndt,\ndd {\n line-height: @line-height-base;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n.dl-horizontal {\n dd {\n &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present\n }\n\n @media (min-width: @dl-horizontal-breakpoint) {\n dt {\n float: left;\n width: (@dl-horizontal-offset - 20);\n clear: left;\n text-align: right;\n .text-overflow();\n }\n dd {\n margin-left: @dl-horizontal-offset;\n }\n }\n}\n\n\n// Misc\n// -------------------------\n\n// Abbreviations and acronyms\nabbr[title],\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted @abbr-border-color;\n}\n.initialism {\n font-size: 90%;\n .text-uppercase();\n}\n\n// Blockquotes\nblockquote {\n padding: (@line-height-computed / 2) @line-height-computed;\n margin: 0 0 @line-height-computed;\n font-size: @blockquote-font-size;\n border-left: 5px solid @blockquote-border-color;\n\n p,\n ul,\n ol {\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n // Note: Deprecated small and .small as of v3.1.0\n // Context: https://github.com/twbs/bootstrap/issues/11660\n footer,\n small,\n .small {\n display: block;\n font-size: 80%; // back to default font-size\n line-height: @line-height-base;\n color: @blockquote-small-color;\n\n &:before {\n content: '\\2014 \\00A0'; // em dash, nbsp\n }\n }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid @blockquote-border-color;\n border-left: 0;\n text-align: right;\n\n // Account for citation\n footer,\n small,\n .small {\n &:before { content: ''; }\n &:after {\n content: '\\00A0 \\2014'; // nbsp, em dash\n }\n }\n}\n\n// Addresses\naddress {\n margin-bottom: @line-height-computed;\n font-style: normal;\n line-height: @line-height-base;\n}\n","// Typography\n\n.text-emphasis-variant(@color) {\n color: @color;\n a&:hover,\n a&:focus {\n color: darken(@color, 10%);\n }\n}\n","// Contextual backgrounds\n\n.bg-variant(@color) {\n background-color: @color;\n a&:hover,\n a&:focus {\n background-color: darken(@color, 10%);\n }\n}\n","// Text overflow\n// Requires inline-block or block for proper styling\n\n.text-overflow() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n font-family: @font-family-monospace;\n}\n\n// Inline code\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: @code-color;\n background-color: @code-bg;\n border-radius: @border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: @kbd-color;\n background-color: @kbd-bg;\n border-radius: @border-radius-small;\n box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);\n\n kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n }\n}\n\n// Blocks of code\npre {\n display: block;\n padding: ((@line-height-computed - 1) / 2);\n margin: 0 0 (@line-height-computed / 2);\n font-size: (@font-size-base - 1); // 14px to 13px\n line-height: @line-height-base;\n word-break: break-all;\n word-wrap: break-word;\n color: @pre-color;\n background-color: @pre-bg;\n border: 1px solid @pre-border-color;\n border-radius: @border-radius-base;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: @pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n .container-fixed();\n\n @media (min-width: @screen-sm-min) {\n width: @container-sm;\n }\n @media (min-width: @screen-md-min) {\n width: @container-md;\n }\n @media (min-width: @screen-lg-min) {\n width: @container-lg;\n }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n .container-fixed();\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n .make-row();\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n.make-grid-columns();\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n.make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: @screen-sm-min) {\n .make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: @screen-md-min) {\n .make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: @screen-lg-min) {\n .make-grid(lg);\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n.container-fixed(@gutter: @grid-gutter-width) {\n margin-right: auto;\n margin-left: auto;\n padding-left: floor((@gutter / 2));\n padding-right: ceil((@gutter / 2));\n &:extend(.clearfix all);\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n margin-left: ceil((@gutter / -2));\n margin-right: floor((@gutter / -2));\n &:extend(.clearfix all);\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n float: left;\n width: percentage((@columns / @grid-columns));\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n}\n.make-xs-column-offset(@columns) {\n margin-left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-push(@columns) {\n left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-pull(@columns) {\n right: percentage((@columns / @grid-columns));\n}\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-sm-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-offset(@columns) {\n @media (min-width: @screen-sm-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-push(@columns) {\n @media (min-width: @screen-sm-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-pull(@columns) {\n @media (min-width: @screen-sm-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-md-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-offset(@columns) {\n @media (min-width: @screen-md-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-push(@columns) {\n @media (min-width: @screen-md-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-pull(@columns) {\n @media (min-width: @screen-md-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-lg-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-offset(@columns) {\n @media (min-width: @screen-lg-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-push(@columns) {\n @media (min-width: @screen-lg-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-pull(@columns) {\n @media (min-width: @screen-lg-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `@grid-columns`.\n\n.make-grid-columns() {\n // Common styles for all sizes of grid columns, widths 1-12\n .col(@index) { // initial\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general; \"=<\" isn't a typo\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n position: relative;\n // Prevent columns from collapsing when empty\n min-height: 1px;\n // Inner gutter via padding\n padding-left: ceil((@grid-gutter-width / 2));\n padding-right: floor((@grid-gutter-width / 2));\n }\n }\n .col(1); // kickstart it\n}\n\n.float-grid-columns(@class) {\n .col(@index) { // initial\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n float: left;\n }\n }\n .col(1); // kickstart it\n}\n\n.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {\n .col-@{class}-@{index} {\n width: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) {\n .col-@{class}-push-@{index} {\n left: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) {\n .col-@{class}-push-0 {\n left: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) {\n .col-@{class}-pull-@{index} {\n right: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) {\n .col-@{class}-pull-0 {\n right: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = offset) {\n .col-@{class}-offset-@{index} {\n margin-left: percentage((@index / @grid-columns));\n }\n}\n\n// Basic looping in LESS\n.loop-grid-columns(@index, @class, @type) when (@index >= 0) {\n .calc-grid-column(@index, @class, @type);\n // next iteration\n .loop-grid-columns((@index - 1), @class, @type);\n}\n\n// Create grid for specific class\n.make-grid(@class) {\n .float-grid-columns(@class);\n .loop-grid-columns(@grid-columns, @class, width);\n .loop-grid-columns(@grid-columns, @class, pull);\n .loop-grid-columns(@grid-columns, @class, push);\n .loop-grid-columns(@grid-columns, @class, offset);\n}\n","//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n background-color: @table-bg;\n}\ncaption {\n padding-top: @table-cell-padding;\n padding-bottom: @table-cell-padding;\n color: @text-muted;\n text-align: left;\n}\nth {\n text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: @line-height-computed;\n // Cells\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-cell-padding;\n line-height: @line-height-base;\n vertical-align: top;\n border-top: 1px solid @table-border-color;\n }\n }\n }\n // Bottom align for column headings\n > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid @table-border-color;\n }\n // Remove top border from thead by default\n > caption + thead,\n > colgroup + thead,\n > thead:first-child {\n > tr:first-child {\n > th,\n > td {\n border-top: 0;\n }\n }\n }\n // Account for multiple tbody instances\n > tbody + tbody {\n border-top: 2px solid @table-border-color;\n }\n\n // Nesting\n .table {\n background-color: @body-bg;\n }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-condensed-cell-padding;\n }\n }\n }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n border: 1px solid @table-border-color;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n border: 1px solid @table-border-color;\n }\n }\n }\n > thead > tr {\n > th,\n > td {\n border-bottom-width: 2px;\n }\n }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n > tbody > tr:nth-of-type(odd) {\n background-color: @table-bg-accent;\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n > tbody > tr:hover {\n background-color: @table-bg-hover;\n }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-column;\n}\ntable {\n td,\n th {\n &[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-cell;\n }\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n.table-row-variant(active; @table-bg-active);\n.table-row-variant(success; @state-success-bg);\n.table-row-variant(info; @state-info-bg);\n.table-row-variant(warning; @state-warning-bg);\n.table-row-variant(danger; @state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)\n\n @media screen and (max-width: @screen-xs-max) {\n width: 100%;\n margin-bottom: (@line-height-computed * 0.75);\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid @table-border-color;\n\n // Tighten up spacing\n > .table {\n margin-bottom: 0;\n\n // Ensure the content doesn't wrap\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n white-space: nowrap;\n }\n }\n }\n }\n\n // Special overrides for the bordered tables\n > .table-bordered {\n border: 0;\n\n // Nuke the appropriate borders so that the parent can handle them\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n\n // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n // chances are there will be only one `tr` in a `thead` and that would\n // remove the border altogether.\n > tbody,\n > tfoot {\n > tr:last-child {\n > th,\n > td {\n border-bottom: 0;\n }\n }\n }\n\n }\n }\n}\n","// Tables\n\n.table-row-variant(@state; @background) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table > thead > tr,\n .table > tbody > tr,\n .table > tfoot > tr {\n > td.@{state},\n > th.@{state},\n &.@{state} > td,\n &.@{state} > th {\n background-color: @background;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover > tbody > tr {\n > td.@{state}:hover,\n > th.@{state}:hover,\n &.@{state}:hover > td,\n &:hover > .@{state},\n &.@{state}:hover > th {\n background-color: darken(@background, 5%);\n }\n }\n}\n","//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n // Chrome and Firefox set a `min-width: min-content;` on fieldsets,\n // so we reset that to ensure it behaves more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359.\n min-width: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: @line-height-computed;\n font-size: (@font-size-base * 1.5);\n line-height: inherit;\n color: @legend-color;\n border: 0;\n border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n display: inline-block;\n max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)\n margin-bottom: 5px;\n font-weight: bold;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n .box-sizing(border-box);\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9; // IE8-9\n line-height: normal;\n}\n\ninput[type=\"file\"] {\n display: block;\n}\n\n// Make range inputs behave like textual form controls\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n height: auto;\n}\n\n// Focus for file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n .tab-focus();\n}\n\n// Adjust output element\noutput {\n display: block;\n padding-top: (@padding-base-vertical + 1);\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n display: block;\n width: 100%;\n height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n background-color: @input-bg;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid @input-border;\n border-radius: @input-border-radius; // Note: This has no effect on s in CSS.\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n .transition(~\"border-color ease-in-out .15s, box-shadow ease-in-out .15s\");\n\n // Customize the `:focus` state to imitate native WebKit styles.\n .form-control-focus();\n\n // Placeholder\n .placeholder();\n\n // Unstyle the caret on ``\n// element gets special love because it's special, and that's a fact!\n.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n height: @input-height;\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n\n select& {\n height: @input-height;\n line-height: @input-height;\n }\n\n textarea&,\n select[multiple]& {\n height: auto;\n }\n}\n","//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------------------------\n\n.btn {\n display: inline-block;\n margin-bottom: 0; // For input.btn\n font-weight: @btn-font-weight;\n text-align: center;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n white-space: nowrap;\n .button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @btn-border-radius-base);\n .user-select(none);\n\n &,\n &:active,\n &.active {\n &:focus,\n &.focus {\n .tab-focus();\n }\n }\n\n &:hover,\n &:focus,\n &.focus {\n color: @btn-default-color;\n text-decoration: none;\n }\n\n &:active,\n &.active {\n outline: 0;\n background-image: none;\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n .opacity(.65);\n .box-shadow(none);\n }\n\n a& {\n &.disabled,\n fieldset[disabled] & {\n pointer-events: none; // Future-proof disabling of clicks on `` elements\n }\n }\n}\n\n\n// Alternate buttons\n// --------------------------------------------------\n\n.btn-default {\n .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border);\n}\n.btn-primary {\n .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border);\n}\n// Success appears as green\n.btn-success {\n .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border);\n}\n// Info appears as blue-green\n.btn-info {\n .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border);\n}\n// Warning appears as orange\n.btn-warning {\n .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border);\n}\n// Danger and error appear as red\n.btn-danger {\n .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border);\n}\n\n\n// Link buttons\n// -------------------------\n\n// Make a button look and behave like a link\n.btn-link {\n color: @link-color;\n font-weight: normal;\n border-radius: 0;\n\n &,\n &:active,\n &.active,\n &[disabled],\n fieldset[disabled] & {\n background-color: transparent;\n .box-shadow(none);\n }\n &,\n &:hover,\n &:focus,\n &:active {\n border-color: transparent;\n }\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n background-color: transparent;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @btn-link-disabled-color;\n text-decoration: none;\n }\n }\n}\n\n\n// Button Sizes\n// --------------------------------------------------\n\n.btn-lg {\n // line-height: ensure even-numbered height of button next to large input\n .button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @btn-border-radius-large);\n}\n.btn-sm {\n // line-height: ensure proper height of button next to small input\n .button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @btn-border-radius-small);\n}\n.btn-xs {\n .button-size(@padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @btn-border-radius-small);\n}\n\n\n// Block button\n// --------------------------------------------------\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n// Vertically space out multiple block buttons\n.btn-block + .btn-block {\n margin-top: 5px;\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n &.btn-block {\n width: 100%;\n }\n}\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n.button-variant(@color; @background; @border) {\n color: @color;\n background-color: @background;\n border-color: @border;\n\n &:focus,\n &.focus {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 25%);\n }\n &:hover {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 12%);\n }\n &:active,\n &.active,\n .open > .dropdown-toggle& {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 12%);\n\n &:hover,\n &:focus,\n &.focus {\n color: @color;\n background-color: darken(@background, 17%);\n border-color: darken(@border, 25%);\n }\n }\n &:active,\n &.active,\n .open > .dropdown-toggle& {\n background-image: none;\n }\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus,\n &.focus {\n background-color: @background;\n border-color: @border;\n }\n }\n\n .badge {\n color: @background;\n background-color: @color;\n }\n}\n\n// Button sizes\n.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n}\n","// Opacity\n\n.opacity(@opacity) {\n opacity: @opacity;\n // IE8 filter\n @opacity-ie: (@opacity * 100);\n filter: ~\"alpha(opacity=@{opacity-ie})\";\n}\n","//\n// Component animations\n// --------------------------------------------------\n\n// Heads up!\n//\n// We don't use the `.opacity()` mixin here since it causes a bug with text\n// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552.\n\n.fade {\n opacity: 0;\n .transition(opacity .15s linear);\n &.in {\n opacity: 1;\n }\n}\n\n.collapse {\n display: none;\n\n &.in { display: block; }\n tr&.in { display: table-row; }\n tbody&.in { display: table-row-group; }\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n .transition-property(~\"height, visibility\");\n .transition-duration(.35s);\n .transition-timing-function(ease);\n}\n","//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Dropdown arrow/caret\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: @caret-width-base dashed;\n border-top: @caret-width-base solid ~\"\\9\"; // IE8\n border-right: @caret-width-base solid transparent;\n border-left: @caret-width-base solid transparent;\n}\n\n// The dropdown wrapper (div)\n.dropup,\n.dropdown {\n position: relative;\n}\n\n// Prevent the focus on the dropdown toggle when closing dropdowns\n.dropdown-toggle:focus {\n outline: 0;\n}\n\n// The dropdown menu (ul)\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: @zindex-dropdown;\n display: none; // none by default, but block on \"open\" of the menu\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0; // override default ul\n list-style: none;\n font-size: @font-size-base;\n text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n background-color: @dropdown-bg;\n border: 1px solid @dropdown-fallback-border; // IE8 fallback\n border: 1px solid @dropdown-border;\n border-radius: @border-radius-base;\n .box-shadow(0 6px 12px rgba(0,0,0,.175));\n background-clip: padding-box;\n\n // Aligns the dropdown menu to right\n //\n // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`\n &.pull-right {\n right: 0;\n left: auto;\n }\n\n // Dividers (basically an hr) within the dropdown\n .divider {\n .nav-divider(@dropdown-divider-bg);\n }\n\n // Links within the dropdown menu\n > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: @line-height-base;\n color: @dropdown-link-color;\n white-space: nowrap; // prevent links from randomly breaking onto new lines\n }\n}\n\n// Hover/Focus state\n.dropdown-menu > li > a {\n &:hover,\n &:focus {\n text-decoration: none;\n color: @dropdown-link-hover-color;\n background-color: @dropdown-link-hover-bg;\n }\n}\n\n// Active state\n.dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-active-color;\n text-decoration: none;\n outline: 0;\n background-color: @dropdown-link-active-bg;\n }\n}\n\n// Disabled state\n//\n// Gray out text and ensure the hover/focus state remains gray\n\n.dropdown-menu > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-disabled-color;\n }\n\n // Nuke hover/focus effects\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none; // Remove CSS gradient\n .reset-filter();\n cursor: @cursor-disabled;\n }\n}\n\n// Open state for the dropdown\n.open {\n // Show the menu\n > .dropdown-menu {\n display: block;\n }\n\n // Remove the outline when :focus is triggered\n > a {\n outline: 0;\n }\n}\n\n// Menu positioning\n//\n// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown\n// menu with the parent.\n.dropdown-menu-right {\n left: auto; // Reset the default from `.dropdown-menu`\n right: 0;\n}\n// With v3, we enabled auto-flipping if you have a dropdown within a right\n// aligned nav component. To enable the undoing of that, we provide an override\n// to restore the default dropdown menu alignment.\n//\n// This is only for left-aligning a dropdown menu within a `.navbar-right` or\n// `.pull-right` nav component.\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n\n// Dropdown section headers\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: @font-size-small;\n line-height: @line-height-base;\n color: @dropdown-header-color;\n white-space: nowrap; // as with > li > a\n}\n\n// Backdrop to catch body clicks on mobile, etc.\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: (@zindex-dropdown - 10);\n}\n\n// Right aligned dropdowns\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n//\n// Just add .dropup after the standard .dropdown class and you're set, bro.\n// TODO: abstract this so that the navbar fixed styles are not placed here?\n\n.dropup,\n.navbar-fixed-bottom .dropdown {\n // Reverse the caret\n .caret {\n border-top: 0;\n border-bottom: @caret-width-base dashed;\n border-bottom: @caret-width-base solid ~\"\\9\"; // IE8\n content: \"\";\n }\n // Different positioning for bottom up menu\n .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n }\n}\n\n\n// Component alignment\n//\n// Reiterate per navbar.less and the modified component alignment there.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-right {\n .dropdown-menu {\n .dropdown-menu-right();\n }\n // Necessary for overrides of the default right aligned menu.\n // Will remove come v4 in all likelihood.\n .dropdown-menu-left {\n .dropdown-menu-left();\n }\n }\n}\n","// Horizontal dividers\n//\n// Dividers (basically an hr) within dropdowns and nav lists\n\n.nav-divider(@color: #e5e5e5) {\n height: 1px;\n margin: ((@line-height-computed / 2) - 1) 0;\n overflow: hidden;\n background-color: @color;\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n","//\n// Button groups\n// --------------------------------------------------\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle; // match .btn alignment given font-size hack above\n > .btn {\n position: relative;\n float: left;\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active,\n &.active {\n z-index: 2;\n }\n }\n}\n\n// Prevent double borders when buttons are next to each other\n.btn-group {\n .btn + .btn,\n .btn + .btn-group,\n .btn-group + .btn,\n .btn-group + .btn-group {\n margin-left: -1px;\n }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n margin-left: -5px; // Offset the first child's margin\n &:extend(.clearfix all);\n\n .btn,\n .btn-group,\n .input-group {\n float: left;\n }\n > .btn,\n > .btn-group,\n > .input-group {\n margin-left: 5px;\n }\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n\n// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match\n.btn-group > .btn:first-child {\n margin-left: 0;\n &:not(:last-child):not(.dropdown-toggle) {\n .border-right-radius(0);\n }\n}\n// Need .dropdown-toggle since :last-child doesn't apply, given that a .dropdown-menu is used immediately after it\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n .border-left-radius(0);\n}\n\n// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-right-radius(0);\n }\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n .border-left-radius(0);\n}\n\n// On active and open, don't show outline\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-xs > .btn { &:extend(.btn-xs); }\n.btn-group-sm > .btn { &:extend(.btn-sm); }\n.btn-group-lg > .btn { &:extend(.btn-lg); }\n\n\n// Split button dropdowns\n// ----------------------\n\n// Give the line between buttons some depth\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n\n// The clickable button for toggling the menu\n// Remove the gradient and set the same inset shadow as the :active state\n.btn-group.open .dropdown-toggle {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n\n // Show no shadow for `.btn-link` since it has no other button styles.\n &.btn-link {\n .box-shadow(none);\n }\n}\n\n\n// Reposition the caret\n.btn .caret {\n margin-left: 0;\n}\n// Carets in other button sizes\n.btn-lg .caret {\n border-width: @caret-width-large @caret-width-large 0;\n border-bottom-width: 0;\n}\n// Upside down carets for .dropup\n.dropup .btn-lg .caret {\n border-width: 0 @caret-width-large @caret-width-large;\n}\n\n\n// Vertical button groups\n// ----------------------\n\n.btn-group-vertical {\n > .btn,\n > .btn-group,\n > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n }\n\n // Clear floats so dropdown menus can be properly placed\n > .btn-group {\n &:extend(.clearfix all);\n > .btn {\n float: none;\n }\n }\n\n > .btn + .btn,\n > .btn + .btn-group,\n > .btn-group + .btn,\n > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n }\n}\n\n.btn-group-vertical > .btn {\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n &:first-child:not(:last-child) {\n .border-top-radius(@btn-border-radius-base);\n .border-bottom-radius(0);\n }\n &:last-child:not(:first-child) {\n .border-top-radius(0);\n .border-bottom-radius(@btn-border-radius-base);\n }\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-bottom-radius(0);\n }\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n .border-top-radius(0);\n}\n\n\n// Justified button groups\n// ----------------------\n\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n > .btn,\n > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n }\n > .btn-group .btn {\n width: 100%;\n }\n\n > .btn-group .dropdown-menu {\n left: auto;\n }\n}\n\n\n// Checkbox and radio options\n//\n// In order to support the browser's form validation feedback, powered by the\n// `required` attribute, we have to \"hide\" the inputs via `clip`. We cannot use\n// `display: none;` or `visibility: hidden;` as that also hides the popover.\n// Simply visually hiding the inputs via `opacity` would leave them clickable in\n// certain cases which is prevented by using `clip` and `pointer-events`.\n// This way, we ensure a DOM element is visible to position the popover from.\n//\n// See https://github.com/twbs/bootstrap/pull/12794 and\n// https://github.com/twbs/bootstrap/pull/14559 for more information.\n\n[data-toggle=\"buttons\"] {\n > .btn,\n > .btn-group > .btn {\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0,0,0,0);\n pointer-events: none;\n }\n }\n}\n","// Single side border-radius\n\n.border-top-radius(@radius) {\n border-top-right-radius: @radius;\n border-top-left-radius: @radius;\n}\n.border-right-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-top-right-radius: @radius;\n}\n.border-bottom-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-bottom-left-radius: @radius;\n}\n.border-left-radius(@radius) {\n border-bottom-left-radius: @radius;\n border-top-left-radius: @radius;\n}\n","//\n// Input groups\n// --------------------------------------------------\n\n// Base styles\n// -------------------------\n.input-group {\n position: relative; // For dropdowns\n display: table;\n border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table\n\n // Undo padding and float of grid classes\n &[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n }\n\n .form-control {\n // Ensure that the input is always above the *appended* addon button for\n // proper border colors.\n position: relative;\n z-index: 2;\n\n // IE9 fubars the placeholder attribute in text inputs and the arrows on\n // select elements in input groups. To fix it, we float the input. Details:\n // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855\n float: left;\n\n width: 100%;\n margin-bottom: 0;\n\n &:focus {\n z-index: 3;\n }\n }\n}\n\n// Sizing options\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n .input-lg();\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n .input-sm();\n}\n\n\n// Display as table-cell\n// -------------------------\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n}\n// Addon and addon wrapper for buttons\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle; // Match the inputs\n}\n\n// Text input groups\n// -------------------------\n.input-group-addon {\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n font-weight: normal;\n line-height: 1;\n color: @input-color;\n text-align: center;\n background-color: @input-group-addon-bg;\n border: 1px solid @input-group-addon-border-color;\n border-radius: @input-border-radius;\n\n // Sizing\n &.input-sm {\n padding: @padding-small-vertical @padding-small-horizontal;\n font-size: @font-size-small;\n border-radius: @input-border-radius-small;\n }\n &.input-lg {\n padding: @padding-large-vertical @padding-large-horizontal;\n font-size: @font-size-large;\n border-radius: @input-border-radius-large;\n }\n\n // Nuke default margins from checkboxes and radios to vertically center within.\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n margin-top: 0;\n }\n}\n\n// Reset rounded corners\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n .border-right-radius(0);\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n .border-left-radius(0);\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n\n// Button input groups\n// -------------------------\n.input-group-btn {\n position: relative;\n // Jankily prevent input button groups from wrapping with `white-space` and\n // `font-size` in combination with `inline-block` on buttons.\n font-size: 0;\n white-space: nowrap;\n\n // Negative margin for spacing, position for bringing hovered/focused/actived\n // element above the siblings.\n > .btn {\n position: relative;\n + .btn {\n margin-left: -1px;\n }\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active {\n z-index: 2;\n }\n }\n\n // Negative margin to only have a 1px border between the two\n &:first-child {\n > .btn,\n > .btn-group {\n margin-right: -1px;\n }\n }\n &:last-child {\n > .btn,\n > .btn-group {\n z-index: 2;\n margin-left: -1px;\n }\n }\n}\n","//\n// Navs\n// --------------------------------------------------\n\n\n// Base class\n// --------------------------------------------------\n\n.nav {\n margin-bottom: 0;\n padding-left: 0; // Override default ul/ol\n list-style: none;\n &:extend(.clearfix all);\n\n > li {\n position: relative;\n display: block;\n\n > a {\n position: relative;\n display: block;\n padding: @nav-link-padding;\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: @nav-link-hover-bg;\n }\n }\n\n // Disabled state sets text to gray and nukes hover/tab effects\n &.disabled > a {\n color: @nav-disabled-link-color;\n\n &:hover,\n &:focus {\n color: @nav-disabled-link-hover-color;\n text-decoration: none;\n background-color: transparent;\n cursor: @cursor-disabled;\n }\n }\n }\n\n // Open dropdowns\n .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @nav-link-hover-bg;\n border-color: @link-color;\n }\n }\n\n // Nav dividers (deprecated with v3.0.1)\n //\n // This should have been removed in v3 with the dropping of `.nav-list`, but\n // we missed it. We don't currently support this anywhere, but in the interest\n // of maintaining backward compatibility in case you use it, it's deprecated.\n .nav-divider {\n .nav-divider();\n }\n\n // Prevent IE8 from misplacing imgs\n //\n // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989\n > li > a > img {\n max-width: none;\n }\n}\n\n\n// Tabs\n// -------------------------\n\n// Give the tabs something to sit on\n.nav-tabs {\n border-bottom: 1px solid @nav-tabs-border-color;\n > li {\n float: left;\n // Make the list-items overlay the bottom border\n margin-bottom: -1px;\n\n // Actual tabs (as links)\n > a {\n margin-right: 2px;\n line-height: @line-height-base;\n border: 1px solid transparent;\n border-radius: @border-radius-base @border-radius-base 0 0;\n &:hover {\n border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color @nav-tabs-border-color;\n }\n }\n\n // Active state, and its :hover to override normal :hover\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-tabs-active-link-hover-color;\n background-color: @nav-tabs-active-link-hover-bg;\n border: 1px solid @nav-tabs-active-link-hover-border-color;\n border-bottom-color: transparent;\n cursor: default;\n }\n }\n }\n // pulling this in mainly for less shorthand\n &.nav-justified {\n .nav-justified();\n .nav-tabs-justified();\n }\n}\n\n\n// Pills\n// -------------------------\n.nav-pills {\n > li {\n float: left;\n\n // Links rendered as pills\n > a {\n border-radius: @nav-pills-border-radius;\n }\n + li {\n margin-left: 2px;\n }\n\n // Active state\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-pills-active-link-hover-color;\n background-color: @nav-pills-active-link-hover-bg;\n }\n }\n }\n}\n\n\n// Stacked pills\n.nav-stacked {\n > li {\n float: none;\n + li {\n margin-top: 2px;\n margin-left: 0; // no need for this gap between nav items\n }\n }\n}\n\n\n// Nav variations\n// --------------------------------------------------\n\n// Justified nav links\n// -------------------------\n\n.nav-justified {\n width: 100%;\n\n > li {\n float: none;\n > a {\n text-align: center;\n margin-bottom: 5px;\n }\n }\n\n > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n }\n\n @media (min-width: @screen-sm-min) {\n > li {\n display: table-cell;\n width: 1%;\n > a {\n margin-bottom: 0;\n }\n }\n }\n}\n\n// Move borders to anchors instead of bottom of list\n//\n// Mixin for adding on top the shared `.nav-justified` styles for our tabs\n.nav-tabs-justified {\n border-bottom: 0;\n\n > li > a {\n // Override margin from .nav-tabs\n margin-right: 0;\n border-radius: @border-radius-base;\n }\n\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border: 1px solid @nav-tabs-justified-link-border-color;\n }\n\n @media (min-width: @screen-sm-min) {\n > li > a {\n border-bottom: 1px solid @nav-tabs-justified-link-border-color;\n border-radius: @border-radius-base @border-radius-base 0 0;\n }\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border-bottom-color: @nav-tabs-justified-active-link-border-color;\n }\n }\n}\n\n\n// Tabbable tabs\n// -------------------------\n\n// Hide tabbable panes to start, show them when `.active`\n.tab-content {\n > .tab-pane {\n display: none;\n }\n > .active {\n display: block;\n }\n}\n\n\n// Dropdowns\n// -------------------------\n\n// Specific dropdowns\n.nav-tabs .dropdown-menu {\n // make dropdown border overlap tab border\n margin-top: -1px;\n // Remove the top rounded corners here since there is a hard edge above the menu\n .border-top-radius(0);\n}\n","//\n// Navbars\n// --------------------------------------------------\n\n\n// Wrapper and base class\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n position: relative;\n min-height: @navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)\n margin-bottom: @navbar-margin-bottom;\n border: 1px solid transparent;\n\n // Prevent floats from breaking the navbar\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: @navbar-border-radius;\n }\n}\n\n\n// Navbar heading\n//\n// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy\n// styling of responsive aspects.\n\n.navbar-header {\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n }\n}\n\n\n// Navbar collapse (body)\n//\n// Group your navbar content into this for easy collapsing and expanding across\n// various device sizes. By default, this content is collapsed when <768px, but\n// will expand past that for a horizontal display.\n//\n// To start (on mobile devices) the navbar links, forms, and buttons are stacked\n// vertically and include a `max-height` to overflow in case you have too much\n// content for the user's viewport.\n\n.navbar-collapse {\n overflow-x: visible;\n padding-right: @navbar-padding-horizontal;\n padding-left: @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255,255,255,.1);\n &:extend(.clearfix all);\n -webkit-overflow-scrolling: touch;\n\n &.in {\n overflow-y: auto;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border-top: 0;\n box-shadow: none;\n\n &.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0; // Override default setting\n overflow: visible !important;\n }\n\n &.in {\n overflow-y: visible;\n }\n\n // Undo the collapse side padding for navbars with containers to ensure\n // alignment of right-aligned contents.\n .navbar-fixed-top &,\n .navbar-static-top &,\n .navbar-fixed-bottom & {\n padding-left: 0;\n padding-right: 0;\n }\n }\n}\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n .navbar-collapse {\n max-height: @navbar-collapse-max-height;\n\n @media (max-device-width: @screen-xs-min) and (orientation: landscape) {\n max-height: 200px;\n }\n }\n}\n\n\n// Both navbar header and collapse\n//\n// When a container is present, change the behavior of the header and collapse.\n\n.container,\n.container-fluid {\n > .navbar-header,\n > .navbar-collapse {\n margin-right: -@navbar-padding-horizontal;\n margin-left: -@navbar-padding-horizontal;\n\n @media (min-width: @grid-float-breakpoint) {\n margin-right: 0;\n margin-left: 0;\n }\n }\n}\n\n\n//\n// Navbar alignment options\n//\n// Display the navbar across the entirety of the page or fixed it to the top or\n// bottom of the page.\n\n// Static top (unfixed, but 100% wide) navbar\n.navbar-static-top {\n z-index: @zindex-navbar;\n border-width: 0 0 1px;\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n\n// Fix the top/bottom navbars when screen real estate supports it\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: @zindex-navbar-fixed;\n\n // Undo the rounded corners\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0; // override .navbar defaults\n border-width: 1px 0 0;\n}\n\n\n// Brand/project name\n\n.navbar-brand {\n float: left;\n padding: @navbar-padding-vertical @navbar-padding-horizontal;\n font-size: @font-size-large;\n line-height: @line-height-computed;\n height: @navbar-height;\n\n &:hover,\n &:focus {\n text-decoration: none;\n }\n\n > img {\n display: block;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n .navbar > .container &,\n .navbar > .container-fluid & {\n margin-left: -@navbar-padding-horizontal;\n }\n }\n}\n\n\n// Navbar toggle\n//\n// Custom button for toggling the `.navbar-collapse`, powered by the collapse\n// JavaScript plugin.\n\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: @navbar-padding-horizontal;\n padding: 9px 10px;\n .navbar-vertical-align(34px);\n background-color: transparent;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n border-radius: @border-radius-base;\n\n // We remove the `outline` here, but later compensate by attaching `:hover`\n // styles to `:focus`.\n &:focus {\n outline: 0;\n }\n\n // Bars\n .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n }\n .icon-bar + .icon-bar {\n margin-top: 4px;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n display: none;\n }\n}\n\n\n// Navbar nav links\n//\n// Builds on top of the `.nav` components with its own modifier class to make\n// the nav the full height of the horizontal nav (above 768px).\n\n.navbar-nav {\n margin: (@navbar-padding-vertical / 2) -@navbar-padding-horizontal;\n\n > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: @line-height-computed;\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n > li > a,\n .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n > li > a {\n line-height: @line-height-computed;\n &:hover,\n &:focus {\n background-image: none;\n }\n }\n }\n }\n\n // Uncollapse the nav\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin: 0;\n\n > li {\n float: left;\n > a {\n padding-top: @navbar-padding-vertical;\n padding-bottom: @navbar-padding-vertical;\n }\n }\n }\n}\n\n\n// Navbar form\n//\n// Extension of the `.form-inline` with some extra flavor for optimum display in\n// our navbars.\n\n.navbar-form {\n margin-left: -@navbar-padding-horizontal;\n margin-right: -@navbar-padding-horizontal;\n padding: 10px @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n @shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n\n // Mixin behavior for optimum display\n .form-inline();\n\n .form-group {\n @media (max-width: @grid-float-breakpoint-max) {\n margin-bottom: 5px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n }\n\n // Vertically center in expanded, horizontal navbar\n .navbar-vertical-align(@input-height-base);\n\n // Undo 100% width for pull classes\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n .box-shadow(none);\n }\n}\n\n\n// Dropdown menus\n\n// Menu position and menu carets\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n .border-top-radius(0);\n}\n// Menu position and menu caret support for dropups via extra dropup class\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n .border-top-radius(@navbar-border-radius);\n .border-bottom-radius(0);\n}\n\n\n// Buttons in navbars\n//\n// Vertically center a button within a navbar (when *not* in a form).\n\n.navbar-btn {\n .navbar-vertical-align(@input-height-base);\n\n &.btn-sm {\n .navbar-vertical-align(@input-height-small);\n }\n &.btn-xs {\n .navbar-vertical-align(22);\n }\n}\n\n\n// Text in navbars\n//\n// Add a class to make any element properly align itself vertically within the navbars.\n\n.navbar-text {\n .navbar-vertical-align(@line-height-computed);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin-left: @navbar-padding-horizontal;\n margin-right: @navbar-padding-horizontal;\n }\n}\n\n\n// Component alignment\n//\n// Repurpose the pull utilities as their own navbar utilities to avoid specificity\n// issues with parents and chaining. Only do this when the navbar is uncollapsed\n// though so that navbar contents properly stack and align in mobile.\n//\n// Declared after the navbar components to ensure more specificity on the margins.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-left { .pull-left(); }\n .navbar-right {\n .pull-right();\n margin-right: -@navbar-padding-horizontal;\n\n ~ .navbar-right {\n margin-right: 0;\n }\n }\n}\n\n\n// Alternate navbars\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n background-color: @navbar-default-bg;\n border-color: @navbar-default-border;\n\n .navbar-brand {\n color: @navbar-default-brand-color;\n &:hover,\n &:focus {\n color: @navbar-default-brand-hover-color;\n background-color: @navbar-default-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-default-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-default-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n\n .navbar-toggle {\n border-color: @navbar-default-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-default-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-default-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: @navbar-default-border;\n }\n\n // Dropdown menu items\n .navbar-nav {\n // Remove background color from open dropdown\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-default-link-active-bg;\n color: @navbar-default-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n > li > a {\n color: @navbar-default-link-color;\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n }\n }\n\n\n // Links in navbars\n //\n // Add a class to ensure links outside the navbar nav are colored correctly.\n\n .navbar-link {\n color: @navbar-default-link-color;\n &:hover {\n color: @navbar-default-link-hover-color;\n }\n }\n\n .btn-link {\n color: @navbar-default-link-color;\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n }\n }\n }\n}\n\n// Inverse navbar\n\n.navbar-inverse {\n background-color: @navbar-inverse-bg;\n border-color: @navbar-inverse-border;\n\n .navbar-brand {\n color: @navbar-inverse-brand-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-brand-hover-color;\n background-color: @navbar-inverse-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-inverse-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-inverse-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n\n // Darken the responsive nav toggle\n .navbar-toggle {\n border-color: @navbar-inverse-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-inverse-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-inverse-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: darken(@navbar-inverse-bg, 7%);\n }\n\n // Dropdowns\n .navbar-nav {\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-inverse-link-active-bg;\n color: @navbar-inverse-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display\n .open .dropdown-menu {\n > .dropdown-header {\n border-color: @navbar-inverse-border;\n }\n .divider {\n background-color: @navbar-inverse-border;\n }\n > li > a {\n color: @navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n }\n }\n\n .navbar-link {\n color: @navbar-inverse-link-color;\n &:hover {\n color: @navbar-inverse-link-hover-color;\n }\n }\n\n .btn-link {\n color: @navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n }\n }\n }\n}\n","// Navbar vertical align\n//\n// Vertically center elements in the navbar.\n// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.\n\n.navbar-vertical-align(@element-height) {\n margin-top: ((@navbar-height - @element-height) / 2);\n margin-bottom: ((@navbar-height - @element-height) / 2);\n}\n","//\n// Utility classes\n// --------------------------------------------------\n\n\n// Floats\n// -------------------------\n\n.clearfix {\n .clearfix();\n}\n.center-block {\n .center-block();\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n\n\n// Toggling content\n// -------------------------\n\n// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n .text-hide();\n}\n\n\n// Hide from screenreaders and browsers\n//\n// Credit: HTML5 Boilerplate\n\n.hidden {\n display: none !important;\n}\n\n\n// For Affix plugin\n// -------------------------\n\n.affix {\n position: fixed;\n}\n","//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal;\n margin-bottom: @line-height-computed;\n list-style: none;\n background-color: @breadcrumb-bg;\n border-radius: @border-radius-base;\n\n > li {\n display: inline-block;\n\n + li:before {\n content: \"@{breadcrumb-separator}\\00a0\"; // Unicode space added since inline-block means non-collapsing white-space\n padding: 0 5px;\n color: @breadcrumb-color;\n }\n }\n\n > .active {\n color: @breadcrumb-active-color;\n }\n}\n","//\n// Pagination (multiple pages)\n// --------------------------------------------------\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: @line-height-computed 0;\n border-radius: @border-radius-base;\n\n > li {\n display: inline; // Remove list-style and block-level defaults\n > a,\n > span {\n position: relative;\n float: left; // Collapse white-space\n padding: @padding-base-vertical @padding-base-horizontal;\n line-height: @line-height-base;\n text-decoration: none;\n color: @pagination-color;\n background-color: @pagination-bg;\n border: 1px solid @pagination-border;\n margin-left: -1px;\n }\n &:first-child {\n > a,\n > span {\n margin-left: 0;\n .border-left-radius(@border-radius-base);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius-base);\n }\n }\n }\n\n > li > a,\n > li > span {\n &:hover,\n &:focus {\n z-index: 2;\n color: @pagination-hover-color;\n background-color: @pagination-hover-bg;\n border-color: @pagination-hover-border;\n }\n }\n\n > .active > a,\n > .active > span {\n &,\n &:hover,\n &:focus {\n z-index: 3;\n color: @pagination-active-color;\n background-color: @pagination-active-bg;\n border-color: @pagination-active-border;\n cursor: default;\n }\n }\n\n > .disabled {\n > span,\n > span:hover,\n > span:focus,\n > a,\n > a:hover,\n > a:focus {\n color: @pagination-disabled-color;\n background-color: @pagination-disabled-bg;\n border-color: @pagination-disabled-border;\n cursor: @cursor-disabled;\n }\n }\n}\n\n// Sizing\n// --------------------------------------------------\n\n// Large\n.pagination-lg {\n .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n\n// Small\n.pagination-sm {\n .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n","// Pagination\n\n.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n > li {\n > a,\n > span {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n }\n &:first-child {\n > a,\n > span {\n .border-left-radius(@border-radius);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius);\n }\n }\n }\n}\n","//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n padding-left: 0;\n margin: @line-height-computed 0;\n list-style: none;\n text-align: center;\n &:extend(.clearfix all);\n li {\n display: inline;\n > a,\n > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: @pager-bg;\n border: 1px solid @pager-border;\n border-radius: @pager-border-radius;\n }\n\n > a:hover,\n > a:focus {\n text-decoration: none;\n background-color: @pager-hover-bg;\n }\n }\n\n .next {\n > a,\n > span {\n float: right;\n }\n }\n\n .previous {\n > a,\n > span {\n float: left;\n }\n }\n\n .disabled {\n > a,\n > a:hover,\n > a:focus,\n > span {\n color: @pager-disabled-color;\n background-color: @pager-bg;\n cursor: @cursor-disabled;\n }\n }\n}\n","//\n// Labels\n// --------------------------------------------------\n\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: @label-color;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n\n // Add hover effects, but only for links\n a& {\n &:hover,\n &:focus {\n color: @label-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Empty labels collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for labels in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n}\n\n// Colors\n// Contextual variations (linked labels get darker on :hover)\n\n.label-default {\n .label-variant(@label-default-bg);\n}\n\n.label-primary {\n .label-variant(@label-primary-bg);\n}\n\n.label-success {\n .label-variant(@label-success-bg);\n}\n\n.label-info {\n .label-variant(@label-info-bg);\n}\n\n.label-warning {\n .label-variant(@label-warning-bg);\n}\n\n.label-danger {\n .label-variant(@label-danger-bg);\n}\n","// Labels\n\n.label-variant(@color) {\n background-color: @color;\n\n &[href] {\n &:hover,\n &:focus {\n background-color: darken(@color, 10%);\n }\n }\n}\n","//\n// Badges\n// --------------------------------------------------\n\n\n// Base class\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: @font-size-small;\n font-weight: @badge-font-weight;\n color: @badge-color;\n line-height: @badge-line-height;\n vertical-align: middle;\n white-space: nowrap;\n text-align: center;\n background-color: @badge-bg;\n border-radius: @badge-border-radius;\n\n // Empty badges collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for badges in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n\n .btn-xs &,\n .btn-group-xs > .btn & {\n top: 0;\n padding: 1px 5px;\n }\n\n // Hover state, but only for links\n a& {\n &:hover,\n &:focus {\n color: @badge-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Account for badges in navs\n .list-group-item.active > &,\n .nav-pills > .active > a > & {\n color: @badge-active-color;\n background-color: @badge-active-bg;\n }\n\n .list-group-item > & {\n float: right;\n }\n\n .list-group-item > & + & {\n margin-right: 5px;\n }\n\n .nav-pills > li > a > & {\n margin-left: 3px;\n }\n}\n","//\n// Jumbotron\n// --------------------------------------------------\n\n\n.jumbotron {\n padding-top: @jumbotron-padding;\n padding-bottom: @jumbotron-padding;\n margin-bottom: @jumbotron-padding;\n color: @jumbotron-color;\n background-color: @jumbotron-bg;\n\n h1,\n .h1 {\n color: @jumbotron-heading-color;\n }\n\n p {\n margin-bottom: (@jumbotron-padding / 2);\n font-size: @jumbotron-font-size;\n font-weight: 200;\n }\n\n > hr {\n border-top-color: darken(@jumbotron-bg, 10%);\n }\n\n .container &,\n .container-fluid & {\n border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container\n padding-left: (@grid-gutter-width / 2);\n padding-right: (@grid-gutter-width / 2);\n }\n\n .container {\n max-width: 100%;\n }\n\n @media screen and (min-width: @screen-sm-min) {\n padding-top: (@jumbotron-padding * 1.6);\n padding-bottom: (@jumbotron-padding * 1.6);\n\n .container &,\n .container-fluid & {\n padding-left: (@jumbotron-padding * 2);\n padding-right: (@jumbotron-padding * 2);\n }\n\n h1,\n .h1 {\n font-size: @jumbotron-heading-font-size;\n }\n }\n}\n","//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Mixin and adjust the regular image class\n.thumbnail {\n display: block;\n padding: @thumbnail-padding;\n margin-bottom: @line-height-computed;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(border .2s ease-in-out);\n\n > img,\n a > img {\n &:extend(.img-responsive);\n margin-left: auto;\n margin-right: auto;\n }\n\n // Add a hover state for linked versions only\n a&:hover,\n a&:focus,\n a&.active {\n border-color: @link-color;\n }\n\n // Image captions\n .caption {\n padding: @thumbnail-caption-padding;\n color: @thumbnail-caption-color;\n }\n}\n","//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert {\n padding: @alert-padding;\n margin-bottom: @line-height-computed;\n border: 1px solid transparent;\n border-radius: @alert-border-radius;\n\n // Headings for larger alerts\n h4 {\n margin-top: 0;\n // Specified for the h4 to prevent conflicts of changing @headings-color\n color: inherit;\n }\n\n // Provide class for links that match alerts\n .alert-link {\n font-weight: @alert-link-font-weight;\n }\n\n // Improve alignment and spacing of inner content\n > p,\n > ul {\n margin-bottom: 0;\n }\n\n > p + p {\n margin-top: 5px;\n }\n}\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0.\n.alert-dismissible {\n padding-right: (@alert-padding + 20);\n\n // Adjust close link position\n .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n }\n}\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n.alert-success {\n .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text);\n}\n\n.alert-info {\n .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text);\n}\n\n.alert-warning {\n .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text);\n}\n\n.alert-danger {\n .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text);\n}\n","// Alerts\n\n.alert-variant(@background; @border; @text-color) {\n background-color: @background;\n border-color: @border;\n color: @text-color;\n\n hr {\n border-top-color: darken(@border, 5%);\n }\n .alert-link {\n color: darken(@text-color, 10%);\n }\n}\n","//\n// Progress bars\n// --------------------------------------------------\n\n\n// Bar animations\n// -------------------------\n\n// WebKit\n@-webkit-keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n// Spec and IE10+\n@keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n\n// Bar itself\n// -------------------------\n\n// Outer container\n.progress {\n overflow: hidden;\n height: @line-height-computed;\n margin-bottom: @line-height-computed;\n background-color: @progress-bg;\n border-radius: @progress-border-radius;\n .box-shadow(inset 0 1px 2px rgba(0,0,0,.1));\n}\n\n// Bar of progress\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: @font-size-small;\n line-height: @line-height-computed;\n color: @progress-bar-color;\n text-align: center;\n background-color: @progress-bar-bg;\n .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));\n .transition(width .6s ease);\n}\n\n// Striped bars\n//\n// `.progress-striped .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar-striped` class, which you just add to an existing\n// `.progress-bar`.\n.progress-striped .progress-bar,\n.progress-bar-striped {\n #gradient > .striped();\n background-size: 40px 40px;\n}\n\n// Call animation for the active one\n//\n// `.progress.active .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar.active` approach.\n.progress.active .progress-bar,\n.progress-bar.active {\n .animation(progress-bar-stripes 2s linear infinite);\n}\n\n\n// Variations\n// -------------------------\n\n.progress-bar-success {\n .progress-bar-variant(@progress-bar-success-bg);\n}\n\n.progress-bar-info {\n .progress-bar-variant(@progress-bar-info-bg);\n}\n\n.progress-bar-warning {\n .progress-bar-variant(@progress-bar-warning-bg);\n}\n\n.progress-bar-danger {\n .progress-bar-variant(@progress-bar-danger-bg);\n}\n","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Progress bars\n\n.progress-bar-variant(@color) {\n background-color: @color;\n\n // Deprecated parent class requirement as of v3.2.0\n .progress-striped & {\n #gradient > .striped();\n }\n}\n",".media {\n // Proper spacing between instances of .media\n margin-top: 15px;\n\n &:first-child {\n margin-top: 0;\n }\n}\n\n.media,\n.media-body {\n zoom: 1;\n overflow: hidden;\n}\n\n.media-body {\n width: 10000px;\n}\n\n.media-object {\n display: block;\n\n // Fix collapse in webkit from max-width: 100% and display: table-cell.\n &.img-thumbnail {\n max-width: none;\n }\n}\n\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n\n.media-middle {\n vertical-align: middle;\n}\n\n.media-bottom {\n vertical-align: bottom;\n}\n\n// Reset margins on headings for tighter default spacing\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n\n// Media list variation\n//\n// Undo default ul/ol styles\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n","//\n// List groups\n// --------------------------------------------------\n\n\n// Base class\n//\n// Easily usable on