pnp4nagios-0.6.16/0000775000000000000000000000000011662503006012365 5ustar rootrootpnp4nagios-0.6.16/include/0000775000000000000000000000000011662503006014010 5ustar rootrootpnp4nagios-0.6.16/include/broker.h0000664000000000000000000002434211662503006015452 0ustar rootroot/***************************************************************************** * * BROKER.H - Event broker includes for Nagios * * Copyright (c) 2002-2006 Ethan Galstad (nagios@nagios.org) * Last Modified: 12-12-2006 * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #ifndef _BROKER_H #define _BROKER_H #include "config.h" #include "nagios.h" #ifdef __cplusplus extern "C" { #endif /*************** EVENT BROKER OPTIONS *****************/ #define BROKER_NOTHING 0 #define BROKER_EVERYTHING 1048575 #define BROKER_PROGRAM_STATE 1 /* DONE */ #define BROKER_TIMED_EVENTS 2 /* DONE */ #define BROKER_SERVICE_CHECKS 4 /* DONE */ #define BROKER_HOST_CHECKS 8 /* DONE */ #define BROKER_EVENT_HANDLERS 16 /* DONE */ #define BROKER_LOGGED_DATA 32 /* DONE */ #define BROKER_NOTIFICATIONS 64 /* DONE */ #define BROKER_FLAPPING_DATA 128 /* DONE */ #define BROKER_COMMENT_DATA 256 /* DONE */ #define BROKER_DOWNTIME_DATA 512 /* DONE */ #define BROKER_SYSTEM_COMMANDS 1024 /* DONE */ #define BROKER_OCP_DATA 2048 /* DONE */ #define BROKER_STATUS_DATA 4096 /* DONE */ #define BROKER_ADAPTIVE_DATA 8192 /* DONE */ #define BROKER_EXTERNALCOMMAND_DATA 16384 /* DONE */ #define BROKER_RETENTION_DATA 32768 /* DONE */ #define BROKER_ACKNOWLEDGEMENT_DATA 65536 #define BROKER_STATECHANGE_DATA 131072 #define BROKER_RESERVED18 262144 #define BROKER_RESERVED19 524288 /****** EVENT TYPES ************************/ #define NEBTYPE_NONE 0 #define NEBTYPE_HELLO 1 #define NEBTYPE_GOODBYE 2 #define NEBTYPE_INFO 3 #define NEBTYPE_PROCESS_START 100 #define NEBTYPE_PROCESS_DAEMONIZE 101 #define NEBTYPE_PROCESS_RESTART 102 #define NEBTYPE_PROCESS_SHUTDOWN 103 #define NEBTYPE_PROCESS_PRELAUNCH 104 /* before objects are read or verified */ #define NEBTYPE_PROCESS_EVENTLOOPSTART 105 #define NEBTYPE_PROCESS_EVENTLOOPEND 106 #define NEBTYPE_TIMEDEVENT_ADD 200 #define NEBTYPE_TIMEDEVENT_REMOVE 201 #define NEBTYPE_TIMEDEVENT_EXECUTE 202 #define NEBTYPE_TIMEDEVENT_DELAY 203 /* NOT IMPLEMENTED */ #define NEBTYPE_TIMEDEVENT_SKIP 204 /* NOT IMPLEMENTED */ #define NEBTYPE_TIMEDEVENT_SLEEP 205 #define NEBTYPE_LOG_DATA 300 #define NEBTYPE_LOG_ROTATION 301 #define NEBTYPE_SYSTEM_COMMAND_START 400 #define NEBTYPE_SYSTEM_COMMAND_END 401 #define NEBTYPE_EVENTHANDLER_START 500 #define NEBTYPE_EVENTHANDLER_END 501 #define NEBTYPE_NOTIFICATION_START 600 #define NEBTYPE_NOTIFICATION_END 601 #define NEBTYPE_CONTACTNOTIFICATION_START 602 #define NEBTYPE_CONTACTNOTIFICATION_END 603 #define NEBTYPE_CONTACTNOTIFICATIONMETHOD_START 604 #define NEBTYPE_CONTACTNOTIFICATIONMETHOD_END 605 #define NEBTYPE_SERVICECHECK_INITIATE 700 #define NEBTYPE_SERVICECHECK_PROCESSED 701 #define NEBTYPE_SERVICECHECK_RAW_START 702 /* NOT IMPLEMENTED */ #define NEBTYPE_SERVICECHECK_RAW_END 703 /* NOT IMPLEMENTED */ #define NEBTYPE_SERVICECHECK_ASYNC_PRECHECK 704 #define NEBTYPE_HOSTCHECK_INITIATE 800 /* a check of the route to the host has been initiated */ #define NEBTYPE_HOSTCHECK_PROCESSED 801 /* the processed/final result of a host check */ #define NEBTYPE_HOSTCHECK_RAW_START 802 /* the start of a "raw" host check */ #define NEBTYPE_HOSTCHECK_RAW_END 803 /* a finished "raw" host check */ #define NEBTYPE_HOSTCHECK_ASYNC_PRECHECK 804 #define NEBTYPE_HOSTCHECK_SYNC_PRECHECK 805 #define NEBTYPE_COMMENT_ADD 900 #define NEBTYPE_COMMENT_DELETE 901 #define NEBTYPE_COMMENT_LOAD 902 #define NEBTYPE_FLAPPING_START 1000 #define NEBTYPE_FLAPPING_STOP 1001 #define NEBTYPE_DOWNTIME_ADD 1100 #define NEBTYPE_DOWNTIME_DELETE 1101 #define NEBTYPE_DOWNTIME_LOAD 1102 #define NEBTYPE_DOWNTIME_START 1103 #define NEBTYPE_DOWNTIME_STOP 1104 #define NEBTYPE_PROGRAMSTATUS_UPDATE 1200 #define NEBTYPE_HOSTSTATUS_UPDATE 1201 #define NEBTYPE_SERVICESTATUS_UPDATE 1202 #define NEBTYPE_CONTACTSTATUS_UPDATE 1203 #define NEBTYPE_ADAPTIVEPROGRAM_UPDATE 1300 #define NEBTYPE_ADAPTIVEHOST_UPDATE 1301 #define NEBTYPE_ADAPTIVESERVICE_UPDATE 1302 #define NEBTYPE_ADAPTIVECONTACT_UPDATE 1303 #define NEBTYPE_EXTERNALCOMMAND_START 1400 #define NEBTYPE_EXTERNALCOMMAND_END 1401 #define NEBTYPE_AGGREGATEDSTATUS_STARTDUMP 1500 #define NEBTYPE_AGGREGATEDSTATUS_ENDDUMP 1501 #define NEBTYPE_RETENTIONDATA_STARTLOAD 1600 #define NEBTYPE_RETENTIONDATA_ENDLOAD 1601 #define NEBTYPE_RETENTIONDATA_STARTSAVE 1602 #define NEBTYPE_RETENTIONDATA_ENDSAVE 1603 #define NEBTYPE_ACKNOWLEDGEMENT_ADD 1700 #define NEBTYPE_ACKNOWLEDGEMENT_REMOVE 1701 /* NOT IMPLEMENTED */ #define NEBTYPE_ACKNOWLEDGEMENT_LOAD 1702 /* NOT IMPLEMENTED */ #define NEBTYPE_STATECHANGE_START 1800 /* NOT IMPLEMENTED */ #define NEBTYPE_STATECHANGE_END 1801 /****** EVENT FLAGS ************************/ #define NEBFLAG_NONE 0 #define NEBFLAG_PROCESS_INITIATED 1 /* event was initiated by Nagios process */ #define NEBFLAG_USER_INITIATED 2 /* event was initiated by a user request */ #define NEBFLAG_MODULE_INITIATED 3 /* event was initiated by an event broker module */ /****** EVENT ATTRIBUTES *******************/ #define NEBATTR_NONE 0 #define NEBATTR_SHUTDOWN_NORMAL 1 #define NEBATTR_SHUTDOWN_ABNORMAL 2 #define NEBATTR_RESTART_NORMAL 4 #define NEBATTR_RESTART_ABNORMAL 8 #define NEBATTR_FLAPPING_STOP_NORMAL 1 #define NEBATTR_FLAPPING_STOP_DISABLED 2 /* flapping stopped because flap detection was disabled */ #define NEBATTR_DOWNTIME_STOP_NORMAL 1 #define NEBATTR_DOWNTIME_STOP_CANCELLED 2 /****** EVENT BROKER FUNCTIONS *************/ #ifdef USE_EVENT_BROKER struct timeval get_broker_timestamp(struct timeval *); void broker_program_state(int,int,int,struct timeval *); void broker_timed_event(int,int,int,timed_event *,struct timeval *); void broker_log_data(int,int,int,char *,unsigned long,time_t,struct timeval *); void broker_event_handler(int,int,int,int,void *,int,int,struct timeval,struct timeval,double,int,int,int,char *,char *,char *,struct timeval *); void broker_ocp_data(int,int,int,void *,int,int,double,int,int,struct timeval *); void broker_system_command(int,int,int,struct timeval,struct timeval,double,int,int,int,char *,char *,struct timeval *); int broker_host_check(int,int,int,host *,int,int,int,struct timeval,struct timeval,char *,double,double,int,int,int,char *,char *,char *,char *,struct timeval *); int broker_service_check(int,int,int,service *,int,struct timeval,struct timeval,char *,double,double,int,int,int,char *,struct timeval *); void broker_comment_data(int,int,int,int,int,char *,char *,time_t,char *,char *,int,int,int,time_t,unsigned long,struct timeval *); void broker_downtime_data(int,int,int,int,char *,char *,time_t,char *,char *,time_t,time_t,int,unsigned long,unsigned long,unsigned long,struct timeval *); void broker_flapping_data(int,int,int,int,void *,double,double,double,struct timeval *); void broker_program_status(int,int,int,struct timeval *); void broker_host_status(int,int,int,host *,struct timeval *); void broker_service_status(int,int,int,service *,struct timeval *); void broker_contact_status(int,int,int,contact *,struct timeval *); void broker_notification_data(int,int,int,int,int,struct timeval,struct timeval,void *,char *,char *,int,int,struct timeval *); void broker_contact_notification_data(int,int,int,int,int,struct timeval,struct timeval,void *,contact *,char *,char *,int,struct timeval *); void broker_contact_notification_method_data(int,int,int,int,int,struct timeval,struct timeval,void *,contact *,char *,char *,char *,int,struct timeval *); void broker_adaptive_program_data(int,int,int,int,unsigned long,unsigned long,unsigned long,unsigned long,struct timeval *); void broker_adaptive_host_data(int,int,int,host *,int,unsigned long,unsigned long,struct timeval *); void broker_adaptive_service_data(int,int,int,service *,int,unsigned long,unsigned long,struct timeval *); void broker_adaptive_contact_data(int,int,int,contact *,int,unsigned long,unsigned long,unsigned long,unsigned long,unsigned long,unsigned long, struct timeval *); void broker_external_command(int,int,int,int,time_t,char *,char *,struct timeval *); void broker_aggregated_status_data(int,int,int,struct timeval *); void broker_retention_data(int,int,int,struct timeval *); void broker_acknowledgement_data(int,int,int,int,void *,char *,char *,int,int,int,struct timeval *); void broker_statechange_data(int,int,int,int,void *,int,int,int,int,struct timeval *); #endif #ifdef __cplusplus } #endif #endif pnp4nagios-0.6.16/include/nebmodules.h0000664000000000000000000000562111662503006016322 0ustar rootroot/***************************************************************************** * * NEBMODULES.H - Include file for event broker modules * * Copyright (c) 2002-2006 Ethan Galstad (nagios@nagios.org) * Last Modified: 02-27-2006 * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #ifndef _NEBMODULES_H #define _NEBMODULES_H #ifdef __cplusplus extern "C" { #endif /***** MODULE VERSION INFORMATION *****/ #define NEB_API_VERSION(x) int __neb_api_version = x; #define CURRENT_NEB_API_VERSION 3 /***** MODULE INFORMATION *****/ #define NEBMODULE_MODINFO_NUMITEMS 6 #define NEBMODULE_MODINFO_TITLE 0 #define NEBMODULE_MODINFO_AUTHOR 1 #define NEBMODULE_MODINFO_COPYRIGHT 2 #define NEBMODULE_MODINFO_VERSION 3 #define NEBMODULE_MODINFO_LICENSE 4 #define NEBMODULE_MODINFO_DESC 5 /***** MODULE LOAD/UNLOAD OPTIONS *****/ #define NEBMODULE_NORMAL_LOAD 0 /* module is being loaded normally */ #define NEBMODULE_REQUEST_UNLOAD 0 /* request module to unload (but don't force it) */ #define NEBMODULE_FORCE_UNLOAD 1 /* force module to unload */ /***** MODULES UNLOAD REASONS *****/ #define NEBMODULE_NEB_SHUTDOWN 1 /* event broker is shutting down */ #define NEBMODULE_NEB_RESTART 2 /* event broker is restarting */ #define NEBMODULE_ERROR_NO_INIT 3 /* _module_init() function was not found in module */ #define NEBMODULE_ERROR_BAD_INIT 4 /* _module_init() function returned a bad code */ #define NEBMODULE_ERROR_API_VERSION 5 /* module version is incompatible with current api */ /***** MODULE STRUCTURES *****/ /* NEB module structure */ typedef struct nebmodule_struct{ char *filename; char *args; char *info[NEBMODULE_MODINFO_NUMITEMS]; int should_be_loaded; int is_currently_loaded; #ifdef USE_LTDL lt_dlhandle module_handle; lt_ptr init_func; lt_ptr deinit_func; #else void *module_handle; void *init_func; void *deinit_func; #endif #ifdef HAVE_PTHREAD_H pthread_t thread_id; #endif struct nebmodule_struct *next; }nebmodule; /***** MODULE FUNCTIONS *****/ int neb_set_module_info(void *,int,char *); #ifdef __cplusplus } #endif #endif pnp4nagios-0.6.16/include/locations.h0000664000000000000000000000461711662503006016164 0ustar rootroot/************************************************************************ * * Nagios Locations Header File * Written By: Ethan Galstad (nagios@nagios.org) * Last Modified: 04-30-2007 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ************************************************************************/ #define DEFAULT_TEMP_FILE "/usr/local/nagios/var/tempfile" #define DEFAULT_TEMP_PATH "/tmp" #define DEFAULT_CHECK_RESULT_PATH "/usr/local/nagios/var/spool/checkresults" #define DEFAULT_STATUS_FILE "/usr/local/nagios/var/status.dat" #define DEFAULT_LOG_FILE "/usr/local/nagios/var/nagios.log" #define DEFAULT_LOG_ARCHIVE_PATH "/usr/local/nagios/var/archives/" #define DEFAULT_DEBUG_FILE "/usr/local/nagios/var/nagios.debug" #define DEFAULT_COMMENT_FILE "/usr/local/nagios/var/comments.dat" #define DEFAULT_DOWNTIME_FILE "/usr/local/nagios/var/downtime.dat" #define DEFAULT_RETENTION_FILE "/usr/local/nagios/var/retention.dat" #define DEFAULT_COMMAND_FILE "/usr/local/nagios/var/rw/nagios.cmd" #define DEFAULT_CONFIG_FILE "/usr/local/nagios/etc/nagios.cfg" #define DEFAULT_PHYSICAL_HTML_PATH "/usr/local/nagios/share" #define DEFAULT_URL_HTML_PATH "/nagios" #define DEFAULT_PHYSICAL_CGIBIN_PATH "/usr/local/nagios/sbin" #define DEFAULT_URL_CGIBIN_PATH "/nagios/cgi-bin" #define DEFAULT_CGI_CONFIG_FILE "/usr/local/nagios/etc/cgi.cfg" #define DEFAULT_LOCK_FILE "/usr/local/nagios/var/nagios.lock" #define DEFAULT_OBJECT_CACHE_FILE "/usr/local/nagios/var/objects.cache" #define DEFAULT_PRECACHED_OBJECT_FILE "/usr/local/nagios/var/objects.precache" #define DEFAULT_EVENT_BROKER_FILE "/usr/local/nagios/var/broker.socket" #define DEFAULT_P1_FILE "/usr/local/nagios/bin/p1.pl" /**** EMBEDDED PERL ****/ #define DEFAULT_AUTH_FILE "" /**** EMBEDDED PERL - IS THIS USED? ****/ pnp4nagios-0.6.16/include/common.h0000664000000000000000000004325111662503006015456 0ustar rootroot/************************************************************************ * * Nagios Common Header File * Written By: Ethan Galstad (nagios@nagios.org) * Last Modified: 10-22-2007 * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ************************************************************************/ #define PROGRAM_VERSION "3.0" #define PROGRAM_MODIFICATION_DATE "03-13-2008" /*#define DEBUG_CHECK_IPC 1 */ /*#define DEBUG_CHECK_IPC2 1*/ /* daemon is thread safe */ #ifdef NSCORE #ifndef _REENTRANT #define _REENTRANT #endif #ifndef _THREAD_SAFE #define _THREAD_SAFE #endif #endif /* Experimental performance tweaks - use with caution */ #undef USE_MEMORY_PERFORMANCE_TWEAKS /* my_free has been freed from bondage as a function */ #define my_free(ptr) { if(ptr) { free(ptr); ptr = NULL; } } /***************************** COMMANDS *********************************/ #define CMD_NONE 0 #define CMD_ADD_HOST_COMMENT 1 #define CMD_DEL_HOST_COMMENT 2 #define CMD_ADD_SVC_COMMENT 3 #define CMD_DEL_SVC_COMMENT 4 #define CMD_ENABLE_SVC_CHECK 5 #define CMD_DISABLE_SVC_CHECK 6 #define CMD_SCHEDULE_SVC_CHECK 7 #define CMD_DELAY_SVC_NOTIFICATION 9 #define CMD_DELAY_HOST_NOTIFICATION 10 #define CMD_DISABLE_NOTIFICATIONS 11 #define CMD_ENABLE_NOTIFICATIONS 12 #define CMD_RESTART_PROCESS 13 #define CMD_SHUTDOWN_PROCESS 14 #define CMD_ENABLE_HOST_SVC_CHECKS 15 #define CMD_DISABLE_HOST_SVC_CHECKS 16 #define CMD_SCHEDULE_HOST_SVC_CHECKS 17 #define CMD_DELAY_HOST_SVC_NOTIFICATIONS 19 /* currently unimplemented */ #define CMD_DEL_ALL_HOST_COMMENTS 20 #define CMD_DEL_ALL_SVC_COMMENTS 21 #define CMD_ENABLE_SVC_NOTIFICATIONS 22 #define CMD_DISABLE_SVC_NOTIFICATIONS 23 #define CMD_ENABLE_HOST_NOTIFICATIONS 24 #define CMD_DISABLE_HOST_NOTIFICATIONS 25 #define CMD_ENABLE_ALL_NOTIFICATIONS_BEYOND_HOST 26 #define CMD_DISABLE_ALL_NOTIFICATIONS_BEYOND_HOST 27 #define CMD_ENABLE_HOST_SVC_NOTIFICATIONS 28 #define CMD_DISABLE_HOST_SVC_NOTIFICATIONS 29 #define CMD_PROCESS_SERVICE_CHECK_RESULT 30 #define CMD_SAVE_STATE_INFORMATION 31 #define CMD_READ_STATE_INFORMATION 32 #define CMD_ACKNOWLEDGE_HOST_PROBLEM 33 #define CMD_ACKNOWLEDGE_SVC_PROBLEM 34 #define CMD_START_EXECUTING_SVC_CHECKS 35 #define CMD_STOP_EXECUTING_SVC_CHECKS 36 #define CMD_START_ACCEPTING_PASSIVE_SVC_CHECKS 37 #define CMD_STOP_ACCEPTING_PASSIVE_SVC_CHECKS 38 #define CMD_ENABLE_PASSIVE_SVC_CHECKS 39 #define CMD_DISABLE_PASSIVE_SVC_CHECKS 40 #define CMD_ENABLE_EVENT_HANDLERS 41 #define CMD_DISABLE_EVENT_HANDLERS 42 #define CMD_ENABLE_HOST_EVENT_HANDLER 43 #define CMD_DISABLE_HOST_EVENT_HANDLER 44 #define CMD_ENABLE_SVC_EVENT_HANDLER 45 #define CMD_DISABLE_SVC_EVENT_HANDLER 46 #define CMD_ENABLE_HOST_CHECK 47 #define CMD_DISABLE_HOST_CHECK 48 #define CMD_START_OBSESSING_OVER_SVC_CHECKS 49 #define CMD_STOP_OBSESSING_OVER_SVC_CHECKS 50 #define CMD_REMOVE_HOST_ACKNOWLEDGEMENT 51 #define CMD_REMOVE_SVC_ACKNOWLEDGEMENT 52 #define CMD_SCHEDULE_FORCED_HOST_SVC_CHECKS 53 #define CMD_SCHEDULE_FORCED_SVC_CHECK 54 #define CMD_SCHEDULE_HOST_DOWNTIME 55 #define CMD_SCHEDULE_SVC_DOWNTIME 56 #define CMD_ENABLE_HOST_FLAP_DETECTION 57 #define CMD_DISABLE_HOST_FLAP_DETECTION 58 #define CMD_ENABLE_SVC_FLAP_DETECTION 59 #define CMD_DISABLE_SVC_FLAP_DETECTION 60 #define CMD_ENABLE_FLAP_DETECTION 61 #define CMD_DISABLE_FLAP_DETECTION 62 #define CMD_ENABLE_HOSTGROUP_SVC_NOTIFICATIONS 63 #define CMD_DISABLE_HOSTGROUP_SVC_NOTIFICATIONS 64 #define CMD_ENABLE_HOSTGROUP_HOST_NOTIFICATIONS 65 #define CMD_DISABLE_HOSTGROUP_HOST_NOTIFICATIONS 66 #define CMD_ENABLE_HOSTGROUP_SVC_CHECKS 67 #define CMD_DISABLE_HOSTGROUP_SVC_CHECKS 68 #define CMD_CANCEL_HOST_DOWNTIME 69 /* not internally implemented */ #define CMD_CANCEL_SVC_DOWNTIME 70 /* not internally implemented */ #define CMD_CANCEL_ACTIVE_HOST_DOWNTIME 71 /* old - no longer used */ #define CMD_CANCEL_PENDING_HOST_DOWNTIME 72 /* old - no longer used */ #define CMD_CANCEL_ACTIVE_SVC_DOWNTIME 73 /* old - no longer used */ #define CMD_CANCEL_PENDING_SVC_DOWNTIME 74 /* old - no longer used */ #define CMD_CANCEL_ACTIVE_HOST_SVC_DOWNTIME 75 /* unimplemented */ #define CMD_CANCEL_PENDING_HOST_SVC_DOWNTIME 76 /* unimplemented */ #define CMD_FLUSH_PENDING_COMMANDS 77 #define CMD_DEL_HOST_DOWNTIME 78 #define CMD_DEL_SVC_DOWNTIME 79 #define CMD_ENABLE_FAILURE_PREDICTION 80 #define CMD_DISABLE_FAILURE_PREDICTION 81 #define CMD_ENABLE_PERFORMANCE_DATA 82 #define CMD_DISABLE_PERFORMANCE_DATA 83 #define CMD_SCHEDULE_HOSTGROUP_HOST_DOWNTIME 84 #define CMD_SCHEDULE_HOSTGROUP_SVC_DOWNTIME 85 #define CMD_SCHEDULE_HOST_SVC_DOWNTIME 86 /* new commands in Nagios 2.x found below... */ #define CMD_PROCESS_HOST_CHECK_RESULT 87 #define CMD_START_EXECUTING_HOST_CHECKS 88 #define CMD_STOP_EXECUTING_HOST_CHECKS 89 #define CMD_START_ACCEPTING_PASSIVE_HOST_CHECKS 90 #define CMD_STOP_ACCEPTING_PASSIVE_HOST_CHECKS 91 #define CMD_ENABLE_PASSIVE_HOST_CHECKS 92 #define CMD_DISABLE_PASSIVE_HOST_CHECKS 93 #define CMD_START_OBSESSING_OVER_HOST_CHECKS 94 #define CMD_STOP_OBSESSING_OVER_HOST_CHECKS 95 #define CMD_SCHEDULE_HOST_CHECK 96 #define CMD_SCHEDULE_FORCED_HOST_CHECK 98 #define CMD_START_OBSESSING_OVER_SVC 99 #define CMD_STOP_OBSESSING_OVER_SVC 100 #define CMD_START_OBSESSING_OVER_HOST 101 #define CMD_STOP_OBSESSING_OVER_HOST 102 #define CMD_ENABLE_HOSTGROUP_HOST_CHECKS 103 #define CMD_DISABLE_HOSTGROUP_HOST_CHECKS 104 #define CMD_ENABLE_HOSTGROUP_PASSIVE_SVC_CHECKS 105 #define CMD_DISABLE_HOSTGROUP_PASSIVE_SVC_CHECKS 106 #define CMD_ENABLE_HOSTGROUP_PASSIVE_HOST_CHECKS 107 #define CMD_DISABLE_HOSTGROUP_PASSIVE_HOST_CHECKS 108 #define CMD_ENABLE_SERVICEGROUP_SVC_NOTIFICATIONS 109 #define CMD_DISABLE_SERVICEGROUP_SVC_NOTIFICATIONS 110 #define CMD_ENABLE_SERVICEGROUP_HOST_NOTIFICATIONS 111 #define CMD_DISABLE_SERVICEGROUP_HOST_NOTIFICATIONS 112 #define CMD_ENABLE_SERVICEGROUP_SVC_CHECKS 113 #define CMD_DISABLE_SERVICEGROUP_SVC_CHECKS 114 #define CMD_ENABLE_SERVICEGROUP_HOST_CHECKS 115 #define CMD_DISABLE_SERVICEGROUP_HOST_CHECKS 116 #define CMD_ENABLE_SERVICEGROUP_PASSIVE_SVC_CHECKS 117 #define CMD_DISABLE_SERVICEGROUP_PASSIVE_SVC_CHECKS 118 #define CMD_ENABLE_SERVICEGROUP_PASSIVE_HOST_CHECKS 119 #define CMD_DISABLE_SERVICEGROUP_PASSIVE_HOST_CHECKS 120 #define CMD_SCHEDULE_SERVICEGROUP_HOST_DOWNTIME 121 #define CMD_SCHEDULE_SERVICEGROUP_SVC_DOWNTIME 122 #define CMD_CHANGE_GLOBAL_HOST_EVENT_HANDLER 123 #define CMD_CHANGE_GLOBAL_SVC_EVENT_HANDLER 124 #define CMD_CHANGE_HOST_EVENT_HANDLER 125 #define CMD_CHANGE_SVC_EVENT_HANDLER 126 #define CMD_CHANGE_HOST_CHECK_COMMAND 127 #define CMD_CHANGE_SVC_CHECK_COMMAND 128 #define CMD_CHANGE_NORMAL_HOST_CHECK_INTERVAL 129 #define CMD_CHANGE_NORMAL_SVC_CHECK_INTERVAL 130 #define CMD_CHANGE_RETRY_SVC_CHECK_INTERVAL 131 #define CMD_CHANGE_MAX_HOST_CHECK_ATTEMPTS 132 #define CMD_CHANGE_MAX_SVC_CHECK_ATTEMPTS 133 #define CMD_SCHEDULE_AND_PROPAGATE_TRIGGERED_HOST_DOWNTIME 134 #define CMD_ENABLE_HOST_AND_CHILD_NOTIFICATIONS 135 #define CMD_DISABLE_HOST_AND_CHILD_NOTIFICATIONS 136 #define CMD_SCHEDULE_AND_PROPAGATE_HOST_DOWNTIME 137 #define CMD_ENABLE_SERVICE_FRESHNESS_CHECKS 138 #define CMD_DISABLE_SERVICE_FRESHNESS_CHECKS 139 #define CMD_ENABLE_HOST_FRESHNESS_CHECKS 140 #define CMD_DISABLE_HOST_FRESHNESS_CHECKS 141 #define CMD_SET_HOST_NOTIFICATION_NUMBER 142 #define CMD_SET_SVC_NOTIFICATION_NUMBER 143 /* new commands in Nagios 3.x found below... */ #define CMD_CHANGE_HOST_CHECK_TIMEPERIOD 144 #define CMD_CHANGE_SVC_CHECK_TIMEPERIOD 145 #define CMD_PROCESS_FILE 146 #define CMD_CHANGE_CUSTOM_HOST_VAR 147 #define CMD_CHANGE_CUSTOM_SVC_VAR 148 #define CMD_CHANGE_CUSTOM_CONTACT_VAR 149 #define CMD_ENABLE_CONTACT_HOST_NOTIFICATIONS 150 #define CMD_DISABLE_CONTACT_HOST_NOTIFICATIONS 151 #define CMD_ENABLE_CONTACT_SVC_NOTIFICATIONS 152 #define CMD_DISABLE_CONTACT_SVC_NOTIFICATIONS 153 #define CMD_ENABLE_CONTACTGROUP_HOST_NOTIFICATIONS 154 #define CMD_DISABLE_CONTACTGROUP_HOST_NOTIFICATIONS 155 #define CMD_ENABLE_CONTACTGROUP_SVC_NOTIFICATIONS 156 #define CMD_DISABLE_CONTACTGROUP_SVC_NOTIFICATIONS 157 #define CMD_CHANGE_RETRY_HOST_CHECK_INTERVAL 158 #define CMD_SEND_CUSTOM_HOST_NOTIFICATION 159 #define CMD_SEND_CUSTOM_SVC_NOTIFICATION 160 #define CMD_CHANGE_HOST_NOTIFICATION_TIMEPERIOD 161 #define CMD_CHANGE_SVC_NOTIFICATION_TIMEPERIOD 162 #define CMD_CHANGE_CONTACT_HOST_NOTIFICATION_TIMEPERIOD 163 #define CMD_CHANGE_CONTACT_SVC_NOTIFICATION_TIMEPERIOD 164 #define CMD_CHANGE_HOST_MODATTR 165 #define CMD_CHANGE_SVC_MODATTR 166 #define CMD_CHANGE_CONTACT_MODATTR 167 #define CMD_CHANGE_CONTACT_MODHATTR 168 #define CMD_CHANGE_CONTACT_MODSATTR 169 /* custom command introduced in Nagios 3.x */ #define CMD_CUSTOM_COMMAND 999 /************************ SERVICE CHECK TYPES ****************************/ #define SERVICE_CHECK_ACTIVE 0 /* Nagios performed the service check */ #define SERVICE_CHECK_PASSIVE 1 /* the service check result was submitted by an external source */ /************************** HOST CHECK TYPES *****************************/ #define HOST_CHECK_ACTIVE 0 /* Nagios performed the host check */ #define HOST_CHECK_PASSIVE 1 /* the host check result was submitted by an external source */ /************************ SERVICE STATE TYPES ****************************/ #define SOFT_STATE 0 #define HARD_STATE 1 /************************* SCHEDULED DOWNTIME TYPES **********************/ #define SERVICE_DOWNTIME 1 /* service downtime */ #define HOST_DOWNTIME 2 /* host downtime */ #define ANY_DOWNTIME 3 /* host or service downtime */ /************************** NOTIFICATION OPTIONS *************************/ #define NOTIFICATION_OPTION_NONE 0 #define NOTIFICATION_OPTION_BROADCAST 1 #define NOTIFICATION_OPTION_FORCED 2 #define NOTIFICATION_OPTION_INCREMENT 4 /************************** ACKNOWLEDGEMENT TYPES ************************/ #define HOST_ACKNOWLEDGEMENT 0 #define SERVICE_ACKNOWLEDGEMENT 1 #define ACKNOWLEDGEMENT_NONE 0 #define ACKNOWLEDGEMENT_NORMAL 1 #define ACKNOWLEDGEMENT_STICKY 2 /**************************** DEPENDENCY TYPES ***************************/ #define NOTIFICATION_DEPENDENCY 1 #define EXECUTION_DEPENDENCY 2 /********************** HOST/SERVICE CHECK OPTIONS ***********************/ #define CHECK_OPTION_NONE 0 /* no check options */ #define CHECK_OPTION_FORCE_EXECUTION 1 /* force execution of a check (ignores disabled services/hosts, invalid timeperiods) */ #define CHECK_OPTION_FRESHNESS_CHECK 2 /* this is a freshness check */ #define CHECK_OPTION_ORPHAN_CHECK 4 /* this is an orphan check */ /**************************** PROGRAM MODES ******************************/ #define STANDBY_MODE 0 #define ACTIVE_MODE 1 /************************** LOG ROTATION MODES ***************************/ #define LOG_ROTATION_NONE 0 #define LOG_ROTATION_HOURLY 1 #define LOG_ROTATION_DAILY 2 #define LOG_ROTATION_WEEKLY 3 #define LOG_ROTATION_MONTHLY 4 /***************************** LOG VERSIONS ******************************/ #define LOG_VERSION_1 "1.0" #define LOG_VERSION_2 "2.0" /*************************** CHECK STATISTICS ****************************/ #define ACTIVE_SCHEDULED_SERVICE_CHECK_STATS 0 #define ACTIVE_ONDEMAND_SERVICE_CHECK_STATS 1 #define PASSIVE_SERVICE_CHECK_STATS 2 #define ACTIVE_SCHEDULED_HOST_CHECK_STATS 3 #define ACTIVE_ONDEMAND_HOST_CHECK_STATS 4 #define PASSIVE_HOST_CHECK_STATS 5 #define ACTIVE_CACHED_HOST_CHECK_STATS 6 #define ACTIVE_CACHED_SERVICE_CHECK_STATS 7 #define EXTERNAL_COMMAND_STATS 8 #define PARALLEL_HOST_CHECK_STATS 9 #define SERIAL_HOST_CHECK_STATS 10 #define MAX_CHECK_STATS_TYPES 11 /************************* GENERAL DEFINITIONS **************************/ #define OK 0 #define ERROR -2 /* value was changed from -1 so as to not interfere with STATUS_UNKNOWN plugin result */ #ifndef TRUE #define TRUE 1 #elif (TRUE!=1) #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #elif (FALSE!=0) #define FALSE 0 #endif /****************** HOST CONFIG FILE READING OPTIONS ********************/ #define READ_HOSTS 1 #define READ_HOSTGROUPS 2 #define READ_CONTACTS 4 #define READ_CONTACTGROUPS 8 #define READ_SERVICES 16 #define READ_COMMANDS 32 #define READ_TIMEPERIODS 64 #define READ_SERVICEESCALATIONS 128 #define READ_HOSTGROUPESCALATIONS 256 /* no longer implemented */ #define READ_SERVICEDEPENDENCIES 512 #define READ_HOSTDEPENDENCIES 1024 #define READ_HOSTESCALATIONS 2048 #define READ_HOSTEXTINFO 4096 #define READ_SERVICEEXTINFO 8192 #define READ_SERVICEGROUPS 16384 #define READ_ALL_OBJECT_DATA READ_HOSTS | READ_HOSTGROUPS | READ_CONTACTS | READ_CONTACTGROUPS | READ_SERVICES | READ_COMMANDS | READ_TIMEPERIODS | READ_SERVICEESCALATIONS | READ_SERVICEDEPENDENCIES | READ_HOSTDEPENDENCIES | READ_HOSTESCALATIONS | READ_HOSTEXTINFO | READ_SERVICEEXTINFO | READ_SERVICEGROUPS /************************** DATE RANGE TYPES ****************************/ #define DATERANGE_CALENDAR_DATE 0 /* 2008-12-25 */ #define DATERANGE_MONTH_DATE 1 /* july 4 (specific month) */ #define DATERANGE_MONTH_DAY 2 /* day 21 (generic month) */ #define DATERANGE_MONTH_WEEK_DAY 3 /* 3rd thursday (specific month) */ #define DATERANGE_WEEK_DAY 4 /* 3rd thursday (generic month) */ #define DATERANGE_TYPES 5 /************************** DATE/TIME TYPES *****************************/ #define LONG_DATE_TIME 0 #define SHORT_DATE_TIME 1 #define SHORT_DATE 2 #define SHORT_TIME 3 #define HTTP_DATE_TIME 4 /* time formatted for use in HTTP headers */ /**************************** DATE FORMATS ******************************/ #define DATE_FORMAT_US 0 /* U.S. (MM-DD-YYYY HH:MM:SS) */ #define DATE_FORMAT_EURO 1 /* European (DD-MM-YYYY HH:MM:SS) */ #define DATE_FORMAT_ISO8601 2 /* ISO8601 (YYYY-MM-DD HH:MM:SS) */ #define DATE_FORMAT_STRICT_ISO8601 3 /* ISO8601 (YYYY-MM-DDTHH:MM:SS) */ /************************** MISC DEFINITIONS ****************************/ #define MAX_FILENAME_LENGTH 256 /* max length of path/filename that Nagios will process */ #define MAX_INPUT_BUFFER 1024 /* size in bytes of max. input buffer (for reading files, misc stuff) */ #define MAX_COMMAND_BUFFER 8192 /* max length of raw or processed command line */ #define MAX_EXTERNAL_COMMAND_LENGTH 8192 /* max length of an external command */ #define MAX_DATETIME_LENGTH 48 /************************* MODIFIED ATTRIBUTES **************************/ #define MODATTR_NONE 0 #define MODATTR_NOTIFICATIONS_ENABLED 1 #define MODATTR_ACTIVE_CHECKS_ENABLED 2 #define MODATTR_PASSIVE_CHECKS_ENABLED 4 #define MODATTR_EVENT_HANDLER_ENABLED 8 #define MODATTR_FLAP_DETECTION_ENABLED 16 #define MODATTR_FAILURE_PREDICTION_ENABLED 32 #define MODATTR_PERFORMANCE_DATA_ENABLED 64 #define MODATTR_OBSESSIVE_HANDLER_ENABLED 128 #define MODATTR_EVENT_HANDLER_COMMAND 256 #define MODATTR_CHECK_COMMAND 512 #define MODATTR_NORMAL_CHECK_INTERVAL 1024 #define MODATTR_RETRY_CHECK_INTERVAL 2048 #define MODATTR_MAX_CHECK_ATTEMPTS 4096 #define MODATTR_FRESHNESS_CHECKS_ENABLED 8192 #define MODATTR_CHECK_TIMEPERIOD 16384 #define MODATTR_CUSTOM_VARIABLE 32768 #define MODATTR_NOTIFICATION_TIMEPERIOD 65536 pnp4nagios-0.6.16/include/nebcallbacks.h0000664000000000000000000000661311662503006016573 0ustar rootroot/***************************************************************************** * * NEBCALLBACKS.H - Include file for event broker modules * * Copyright (c) 2002-2007 Ethan Galstad (nagios@nagios.org) * Last Modified: 01-06-2007 * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #ifndef _NEBCALLBACKS_H #define _NEBCALLBACKS_H #include "config.h" #include "nebmodules.h" #ifdef __cplusplus extern "C" { #endif /***** CALLBACK TYPES *****/ #define NEBCALLBACK_NUMITEMS 33 /* total number of callback types we have */ #define NEBCALLBACK_RESERVED0 0 /* reserved for future use */ #define NEBCALLBACK_RESERVED1 1 #define NEBCALLBACK_RESERVED2 2 #define NEBCALLBACK_RESERVED3 3 #define NEBCALLBACK_RESERVED4 4 #define NEBCALLBACK_RAW_DATA 5 #define NEBCALLBACK_NEB_DATA 6 #define NEBCALLBACK_PROCESS_DATA 7 #define NEBCALLBACK_TIMED_EVENT_DATA 8 #define NEBCALLBACK_LOG_DATA 9 #define NEBCALLBACK_SYSTEM_COMMAND_DATA 10 #define NEBCALLBACK_EVENT_HANDLER_DATA 11 #define NEBCALLBACK_NOTIFICATION_DATA 12 #define NEBCALLBACK_SERVICE_CHECK_DATA 13 #define NEBCALLBACK_HOST_CHECK_DATA 14 #define NEBCALLBACK_COMMENT_DATA 15 #define NEBCALLBACK_DOWNTIME_DATA 16 #define NEBCALLBACK_FLAPPING_DATA 17 #define NEBCALLBACK_PROGRAM_STATUS_DATA 18 #define NEBCALLBACK_HOST_STATUS_DATA 19 #define NEBCALLBACK_SERVICE_STATUS_DATA 20 #define NEBCALLBACK_ADAPTIVE_PROGRAM_DATA 21 #define NEBCALLBACK_ADAPTIVE_HOST_DATA 22 #define NEBCALLBACK_ADAPTIVE_SERVICE_DATA 23 #define NEBCALLBACK_EXTERNAL_COMMAND_DATA 24 #define NEBCALLBACK_AGGREGATED_STATUS_DATA 25 #define NEBCALLBACK_RETENTION_DATA 26 #define NEBCALLBACK_CONTACT_NOTIFICATION_DATA 27 #define NEBCALLBACK_CONTACT_NOTIFICATION_METHOD_DATA 28 #define NEBCALLBACK_ACKNOWLEDGEMENT_DATA 29 #define NEBCALLBACK_STATE_CHANGE_DATA 30 #define NEBCALLBACK_CONTACT_STATUS_DATA 31 #define NEBCALLBACK_ADAPTIVE_CONTACT_DATA 32 /***** CALLBACK FUNCTIONS *****/ int neb_register_callback(int callback_type, void *mod_handle, int priority, int (*callback_func)(int,void *)); int neb_deregister_callback(int callback_type, int (*callback_func)(int,void *)); int neb_deregister_module_callbacks(nebmodule *); #ifdef __cplusplus } #endif #endif pnp4nagios-0.6.16/include/objects.h0000664000000000000000000006641211662503006015623 0ustar rootroot/***************************************************************************** * * OBJECTS.H - Header file for object addition/search functions * * Copyright (c) 1999-2007 Ethan Galstad (nagios@nagios.org) * Last Modified: 11-10-2007 * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #ifndef _OBJECTS_H #define _OBJECTS_H #include "config.h" #include "common.h" #ifdef __cplusplus extern "C" { #endif /*************** CURRENT OBJECT REVISION **************/ #define CURRENT_OBJECT_STRUCTURE_VERSION 307 /* increment when changes are made to data structures... */ /* Nagios 3 starts at 300, Nagios 4 at 400, etc. */ /***************** OBJECT SIZE LIMITS *****************/ #define MAX_STATE_HISTORY_ENTRIES 21 /* max number of old states to keep track of for flap detection */ #define MAX_CONTACT_ADDRESSES 6 /* max number of custom addresses a contact can have */ /***************** SKIP LISTS ****************/ #define NUM_OBJECT_SKIPLISTS 13 #define HOST_SKIPLIST 1 #define SERVICE_SKIPLIST 2 #define COMMAND_SKIPLIST 3 #define TIMEPERIOD_SKIPLIST 4 #define CONTACT_SKIPLIST 5 #define CONTACTGROUP_SKIPLIST 6 #define HOSTGROUP_SKIPLIST 7 #define SERVICEGROUP_SKIPLIST 8 #define HOSTDEPENDENCY_SKIPLIST 9 #define SERVICEDEPENDENCY_SKIPLIST 10 #define HOSTESCALATION_SKIPLIST 11 #define SERVICEESCALATION_SKIPLIST 12 /****************** DATA STRUCTURES *******************/ typedef struct host_struct host; typedef struct service_struct service; typedef struct contact_struct contact; /* OBJECT LIST STRUCTURE */ typedef struct objectlist_struct{ void *object_ptr; struct objectlist_struct *next; }objectlist; /* TIMERANGE structure */ typedef struct timerange_struct{ unsigned long range_start; unsigned long range_end; struct timerange_struct *next; }timerange; /* DATERANGE structure */ typedef struct daterange_struct{ int type; int syear; /* start year */ int smon; /* start month */ int smday; /* start day of month (may 3rd, last day in feb) */ int swday; /* start day of week (thursday) */ int swday_offset; /* start weekday offset (3rd thursday, last monday in jan) */ int eyear; int emon; int emday; int ewday; int ewday_offset; int skip_interval; timerange *times; struct daterange_struct *next; }daterange; /* TIMEPERIODEXCLUSION structure */ typedef struct timeperiodexclusion_struct{ char *timeperiod_name; struct timeperiod_struct *timeperiod_ptr; struct timeperiodexclusion_struct *next; }timeperiodexclusion; /* TIMEPERIOD structure */ typedef struct timeperiod_struct{ char *name; char *alias; timerange *days[7]; daterange *exceptions[DATERANGE_TYPES]; timeperiodexclusion *exclusions; struct timeperiod_struct *next; struct timeperiod_struct *nexthash; }timeperiod; /* CONTACTSMEMBER structure */ typedef struct contactsmember_struct{ char *contact_name; #ifdef NSCORE contact *contact_ptr; #endif struct contactsmember_struct *next; }contactsmember; /* CONTACTGROUP structure */ typedef struct contactgroup_struct{ char *group_name; char *alias; contactsmember *members; struct contactgroup_struct *next; struct contactgroup_struct *nexthash; }contactgroup; /* CONTACTGROUPSMEMBER structure */ typedef struct contactgroupsmember_struct{ char *group_name; #ifdef NSCORE contactgroup *group_ptr; #endif struct contactgroupsmember_struct *next; }contactgroupsmember; /* CUSTOMVARIABLESMEMBER structure */ typedef struct customvariablesmember_struct{ char *variable_name; char *variable_value; int has_been_modified; struct customvariablesmember_struct *next; }customvariablesmember; /* COMMAND structure */ typedef struct command_struct{ char *name; char *command_line; struct command_struct *next; struct command_struct *nexthash; }command; /* COMMANDSMEMBER structure */ typedef struct commandsmember_struct{ char *command; #ifdef NSCORE command *command_ptr; #endif struct commandsmember_struct *next; }commandsmember; /* CONTACT structure */ struct contact_struct{ char *name; char *alias; char *email; char *pager; char *address[MAX_CONTACT_ADDRESSES]; commandsmember *host_notification_commands; commandsmember *service_notification_commands; int notify_on_service_unknown; int notify_on_service_warning; int notify_on_service_critical; int notify_on_service_recovery; int notify_on_service_flapping; int notify_on_service_downtime; int notify_on_host_down; int notify_on_host_unreachable; int notify_on_host_recovery; int notify_on_host_flapping; int notify_on_host_downtime; char *host_notification_period; char *service_notification_period; int host_notifications_enabled; int service_notifications_enabled; int can_submit_commands; int retain_status_information; int retain_nonstatus_information; customvariablesmember *custom_variables; #ifdef NSCORE time_t last_host_notification; time_t last_service_notification; unsigned long modified_attributes; unsigned long modified_host_attributes; unsigned long modified_service_attributes; timeperiod *host_notification_period_ptr; timeperiod *service_notification_period_ptr; objectlist *contactgroups_ptr; #endif struct contact_struct *next; struct contact_struct *nexthash; }; /* SERVICESMEMBER structure */ typedef struct servicesmember_struct{ char *host_name; char *service_description; #ifdef NSCORE service *service_ptr; #endif struct servicesmember_struct *next; }servicesmember; /* HOSTSMEMBER structure */ typedef struct hostsmember_struct{ char *host_name; #ifdef NSCORE host *host_ptr; #endif struct hostsmember_struct *next; }hostsmember; /* HOSTGROUP structure */ typedef struct hostgroup_struct{ char *group_name; char *alias; hostsmember *members; char *notes; char *notes_url; char *action_url; struct hostgroup_struct *next; struct hostgroup_struct *nexthash; }hostgroup; /* HOST structure */ struct host_struct{ char *name; char *display_name; char *alias; char *address; hostsmember *parent_hosts; hostsmember *child_hosts; servicesmember *services; char *host_check_command; int initial_state; double check_interval; double retry_interval; int max_attempts; char *event_handler; contactgroupsmember *contact_groups; contactsmember *contacts; double notification_interval; double first_notification_delay; int notify_on_down; int notify_on_unreachable; int notify_on_recovery; int notify_on_flapping; int notify_on_downtime; char *notification_period; char *check_period; int flap_detection_enabled; double low_flap_threshold; double high_flap_threshold; int flap_detection_on_up; int flap_detection_on_down; int flap_detection_on_unreachable; int stalk_on_up; int stalk_on_down; int stalk_on_unreachable; int check_freshness; int freshness_threshold; int process_performance_data; int checks_enabled; int accept_passive_host_checks; int event_handler_enabled; int retain_status_information; int retain_nonstatus_information; int failure_prediction_enabled; char *failure_prediction_options; int obsess_over_host; char *notes; char *notes_url; char *action_url; char *icon_image; char *icon_image_alt; char *vrml_image; char *statusmap_image; int have_2d_coords; int x_2d; int y_2d; int have_3d_coords; double x_3d; double y_3d; double z_3d; int should_be_drawn; customvariablesmember *custom_variables; #ifdef NSCORE int problem_has_been_acknowledged; int acknowledgement_type; int check_type; int current_state; int last_state; int last_hard_state; char *plugin_output; char *long_plugin_output; char *perf_data; int state_type; int current_attempt; unsigned long current_event_id; unsigned long last_event_id; unsigned long current_problem_id; unsigned long last_problem_id; double latency; double execution_time; int is_executing; int check_options; int notifications_enabled; time_t last_host_notification; time_t next_host_notification; time_t next_check; int should_be_scheduled; time_t last_check; time_t last_state_change; time_t last_hard_state_change; time_t last_time_up; time_t last_time_down; time_t last_time_unreachable; int has_been_checked; int is_being_freshened; int notified_on_down; int notified_on_unreachable; int current_notification_number; int no_more_notifications; unsigned long current_notification_id; int check_flapping_recovery_notification; int scheduled_downtime_depth; int pending_flex_downtime; int state_history[MAX_STATE_HISTORY_ENTRIES]; /* flap detection */ int state_history_index; time_t last_state_history_update; int is_flapping; unsigned long flapping_comment_id; double percent_state_change; int total_services; unsigned long total_service_check_interval; unsigned long modified_attributes; int circular_path_checked; int contains_circular_path; command *event_handler_ptr; command *check_command_ptr; timeperiod *check_period_ptr; timeperiod *notification_period_ptr; objectlist *hostgroups_ptr; #endif struct host_struct *next; struct host_struct *nexthash; }; /* SERVICEGROUP structure */ typedef struct servicegroup_struct{ char *group_name; char *alias; servicesmember *members; char *notes; char *notes_url; char *action_url; struct servicegroup_struct *next; struct servicegroup_struct *nexthash; }servicegroup; /* SERVICE structure */ struct service_struct{ char *host_name; char *description; char *display_name; char *service_check_command; char *event_handler; int initial_state; double check_interval; double retry_interval; int max_attempts; int parallelize; contactgroupsmember *contact_groups; contactsmember *contacts; double notification_interval; double first_notification_delay; int notify_on_unknown; int notify_on_warning; int notify_on_critical; int notify_on_recovery; int notify_on_flapping; int notify_on_downtime; int stalk_on_ok; int stalk_on_warning; int stalk_on_unknown; int stalk_on_critical; int is_volatile; char *notification_period; char *check_period; int flap_detection_enabled; double low_flap_threshold; double high_flap_threshold; int flap_detection_on_ok; int flap_detection_on_warning; int flap_detection_on_unknown; int flap_detection_on_critical; int process_performance_data; int check_freshness; int freshness_threshold; int accept_passive_service_checks; int event_handler_enabled; int checks_enabled; int retain_status_information; int retain_nonstatus_information; int notifications_enabled; int obsess_over_service; int failure_prediction_enabled; char *failure_prediction_options; char *notes; char *notes_url; char *action_url; char *icon_image; char *icon_image_alt; customvariablesmember *custom_variables; #ifdef NSCORE int problem_has_been_acknowledged; int acknowledgement_type; int host_problem_at_last_check; int check_type; int current_state; int last_state; int last_hard_state; char *plugin_output; char *long_plugin_output; char *perf_data; int state_type; time_t next_check; int should_be_scheduled; time_t last_check; int current_attempt; unsigned long current_event_id; unsigned long last_event_id; unsigned long current_problem_id; unsigned long last_problem_id; time_t last_notification; time_t next_notification; int no_more_notifications; int check_flapping_recovery_notification; time_t last_state_change; time_t last_hard_state_change; time_t last_time_ok; time_t last_time_warning; time_t last_time_unknown; time_t last_time_critical; int has_been_checked; int is_being_freshened; int notified_on_unknown; int notified_on_warning; int notified_on_critical; int current_notification_number; unsigned long current_notification_id; double latency; double execution_time; int is_executing; int check_options; int scheduled_downtime_depth; int pending_flex_downtime; int state_history[MAX_STATE_HISTORY_ENTRIES]; /* flap detection */ int state_history_index; int is_flapping; unsigned long flapping_comment_id; double percent_state_change; unsigned long modified_attributes; host *host_ptr; command *event_handler_ptr; char *event_handler_args; command *check_command_ptr; char *check_command_args; timeperiod *check_period_ptr; timeperiod *notification_period_ptr; objectlist *servicegroups_ptr; #endif struct service_struct *next; struct service_struct *nexthash; }; /* SERVICE ESCALATION structure */ typedef struct serviceescalation_struct{ char *host_name; char *description; int first_notification; int last_notification; double notification_interval; char *escalation_period; int escalate_on_recovery; int escalate_on_warning; int escalate_on_unknown; int escalate_on_critical; contactgroupsmember *contact_groups; contactsmember *contacts; #ifdef NSCORE service *service_ptr; timeperiod *escalation_period_ptr; #endif struct serviceescalation_struct *next; struct serviceescalation_struct *nexthash; }serviceescalation; /* SERVICE DEPENDENCY structure */ typedef struct servicedependency_struct{ int dependency_type; char *dependent_host_name; char *dependent_service_description; char *host_name; char *service_description; char *dependency_period; int inherits_parent; int fail_on_ok; int fail_on_warning; int fail_on_unknown; int fail_on_critical; int fail_on_pending; #ifdef NSCORE int circular_path_checked; int contains_circular_path; service *master_service_ptr; service *dependent_service_ptr; timeperiod *dependency_period_ptr; #endif struct servicedependency_struct *next; struct servicedependency_struct *nexthash; }servicedependency; /* HOST ESCALATION structure */ typedef struct hostescalation_struct{ char *host_name; int first_notification; int last_notification; double notification_interval; char *escalation_period; int escalate_on_recovery; int escalate_on_down; int escalate_on_unreachable; contactgroupsmember *contact_groups; contactsmember *contacts; #ifdef NSCORE host *host_ptr; timeperiod *escalation_period_ptr; #endif struct hostescalation_struct *next; struct hostescalation_struct *nexthash; }hostescalation; /* HOST DEPENDENCY structure */ typedef struct hostdependency_struct{ int dependency_type; char *dependent_host_name; char *host_name; char *dependency_period; int inherits_parent; int fail_on_up; int fail_on_down; int fail_on_unreachable; int fail_on_pending; #ifdef NSCORE int circular_path_checked; int contains_circular_path; host *master_host_ptr; host *dependent_host_ptr; timeperiod *dependency_period_ptr; #endif struct hostdependency_struct *next; struct hostdependency_struct *nexthash; }hostdependency; /****************** HASH STRUCTURES ********************/ typedef struct host_cursor_struct{ int host_hashchain_iterator; host *current_host_pointer; }host_cursor; /********************* FUNCTIONS **********************/ /**** Top-level input functions ****/ int read_object_config_data(char *,int,int,int); /* reads all external configuration data of specific types */ /**** Object Creation Functions ****/ contact *add_contact(char *,char *,char *,char *,char **,char *,char *,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int); /* adds a contact definition */ commandsmember *add_service_notification_command_to_contact(contact *,char *); /* adds a service notification command to a contact definition */ commandsmember *add_host_notification_command_to_contact(contact *,char *); /* adds a host notification command to a contact definition */ customvariablesmember *add_custom_variable_to_contact(contact *,char *,char *); /* adds a custom variable to a service definition */ host *add_host(char *,char *,char *,char *,char *,int,double,double,int,int,int,int,int,int,double,double,char *,int,char *,int,int,char *,int,int,double,double,int,int,int,int,int,int,int,int,char *,int,int,char *,char *,char *,char *,char *,char *,char *,int,int,int,double,double,double,int,int,int,int,int); /* adds a host definition */ hostsmember *add_parent_host_to_host(host *,char *); /* adds a parent host to a host definition */ hostsmember *add_child_link_to_host(host *,host *); /* adds a child host to a host definition */ contactgroupsmember *add_contactgroup_to_host(host *,char *); /* adds a contactgroup to a host definition */ contactsmember *add_contact_to_host(host *,char *); /* adds a contact to a host definition */ customvariablesmember *add_custom_variable_to_host(host *,char *,char *); /* adds a custom variable to a host definition */ timeperiod *add_timeperiod(char *,char *); /* adds a timeperiod definition */ timeperiodexclusion *add_exclusion_to_timeperiod(timeperiod *,char *); /* adds an exclusion to a timeperiod */ timerange *add_timerange_to_timeperiod(timeperiod *,int,unsigned long,unsigned long); /* adds a timerange to a timeperiod definition */ daterange *add_exception_to_timeperiod(timeperiod *,int,int,int,int,int,int,int,int,int,int,int,int); timerange *add_timerange_to_daterange(daterange *,unsigned long,unsigned long); hostgroup *add_hostgroup(char *,char *,char *,char *,char *); /* adds a hostgroup definition */ hostsmember *add_host_to_hostgroup(hostgroup *, char *); /* adds a host to a hostgroup definition */ servicegroup *add_servicegroup(char *,char *,char *,char *,char *); /* adds a servicegroup definition */ servicesmember *add_service_to_servicegroup(servicegroup *,char *,char *); /* adds a service to a servicegroup definition */ contactgroup *add_contactgroup(char *,char *); /* adds a contactgroup definition */ contactsmember *add_contact_to_contactgroup(contactgroup *,char *); /* adds a contact to a contact group definition */ command *add_command(char *,char *); /* adds a command definition */ service *add_service(char *,char *,char *,char *,int,int,int,int,double,double,double,double,char *,int,int,int,int,int,int,int,int,char *,int,char *,int,int,double,double,int,int,int,int,int,int,int,int,int,int,char *,int,int,char *,char *,char *,char *,char *,int,int,int); /* adds a service definition */ contactgroupsmember *add_contactgroup_to_service(service *,char *); /* adds a contact group to a service definition */ contactsmember *add_contact_to_service(service *,char *); /* adds a contact to a host definition */ serviceescalation *add_serviceescalation(char *,char *,int,int,double,char *,int,int,int,int); /* adds a service escalation definition */ contactgroupsmember *add_contactgroup_to_serviceescalation(serviceescalation *,char *); /* adds a contact group to a service escalation definition */ contactsmember *add_contact_to_serviceescalation(serviceescalation *,char *); /* adds a contact to a service escalation definition */ customvariablesmember *add_custom_variable_to_service(service *,char *,char *); /* adds a custom variable to a service definition */ servicedependency *add_service_dependency(char *,char *,char *,char *,int,int,int,int,int,int,int,char *); /* adds a service dependency definition */ hostdependency *add_host_dependency(char *,char *,int,int,int,int,int,int,char *); /* adds a host dependency definition */ hostescalation *add_hostescalation(char *,int,int,double,char *,int,int,int); /* adds a host escalation definition */ contactsmember *add_contact_to_hostescalation(hostescalation *,char *); /* adds a contact to a host escalation definition */ contactgroupsmember *add_contactgroup_to_hostescalation(hostescalation *,char *); /* adds a contact group to a host escalation definition */ contactsmember *add_contact_to_object(contactsmember **,char *); /* adds a contact to an object */ customvariablesmember *add_custom_variable_to_object(customvariablesmember **,char *,char *); /* adds a custom variable to an object */ servicesmember *add_service_link_to_host(host *,service *); /*** Object Skiplist Functions ****/ int init_object_skiplists(void); int free_object_skiplists(void); int skiplist_compare_text(const char *val1a, const char *val1b, const char *val2a, const char *val2b); int skiplist_compare_host(void *a, void *b); int skiplist_compare_service(void *a, void *b); int skiplist_compare_command(void *a, void *b); int skiplist_compare_timeperiod(void *a, void *b); int skiplist_compare_contact(void *a, void *b); int skiplist_compare_contactgroup(void *a, void *b); int skiplist_compare_hostgroup(void *a, void *b); int skiplist_compare_servicegroup(void *a, void *b); int skiplist_compare_hostescalation(void *a, void *b); int skiplist_compare_serviceescalation(void *a, void *b); int skiplist_compare_hostdependency(void *a, void *b); int skiplist_compare_servicedependency(void *a, void *b); int get_host_count(void); int get_service_count(void); /**** Object Hash Functions ****/ int add_servicedependency_to_hashlist(servicedependency *); /**** Object Search Functions ****/ timeperiod * find_timeperiod(char *); /* finds a timeperiod object */ host * find_host(char *); /* finds a host object */ hostgroup * find_hostgroup(char *); /* finds a hostgroup object */ servicegroup * find_servicegroup(char *); /* finds a servicegroup object */ contact * find_contact(char *); /* finds a contact object */ contactgroup * find_contactgroup(char *); /* finds a contactgroup object */ command * find_command(char *); /* finds a command object */ service * find_service(char *,char *); /* finds a service object */ /**** Object Traversal Functions ****/ hostescalation *get_first_hostescalation_by_host(char *, void **); hostescalation *get_next_hostescalation_by_host(char *,void **); serviceescalation *get_first_serviceescalation_by_service(char *,char *, void **); serviceescalation *get_next_serviceescalation_by_service(char *,char *,void **); hostdependency *get_first_hostdependency_by_dependent_host(char *, void **); hostdependency *get_next_hostdependency_by_dependent_host(char *, void **); servicedependency *get_first_servicedependency_by_dependent_service(char *,char *, void **); servicedependency *get_next_servicedependency_by_dependent_service(char *,char *,void **); #ifdef NSCORE int add_object_to_objectlist(objectlist **,void *); int free_objectlist(objectlist **); #endif /**** Object Query Functions ****/ int is_host_immediate_child_of_host(host *,host *); /* checks if a host is an immediate child of another host */ int is_host_primary_immediate_child_of_host(host *,host *); /* checks if a host is an immediate child (and primary child) of another host */ int is_host_immediate_parent_of_host(host *,host *); /* checks if a host is an immediate child of another host */ int is_host_member_of_hostgroup(hostgroup *,host *); /* tests whether or not a host is a member of a specific hostgroup */ int is_host_member_of_servicegroup(servicegroup *,host *); /* tests whether or not a service is a member of a specific servicegroup */ int is_service_member_of_servicegroup(servicegroup *,service *); /* tests whether or not a service is a member of a specific servicegroup */ int is_contact_member_of_contactgroup(contactgroup *, contact *); /* tests whether or not a contact is a member of a specific contact group */ int is_contact_for_hostgroup(hostgroup *,contact *); /* tests whether or not a contact is a member of a specific hostgroup */ int is_contact_for_servicegroup(servicegroup *,contact *); /* tests whether or not a contact is a member of a specific servicegroup */ int is_contact_for_host(host *,contact *); /* tests whether or not a contact is a contact member for a specific host */ int is_escalated_contact_for_host(host *,contact *); /* checks whether or not a contact is an escalated contact for a specific host */ int is_contact_for_service(service *,contact *); /* tests whether or not a contact is a contact member for a specific service */ int is_escalated_contact_for_service(service *,contact *); /* checks whether or not a contact is an escalated contact for a specific service */ int is_host_immediate_parent_of_host(host *,host *); /* tests whether or not a host is an immediate parent of another host */ int number_of_immediate_child_hosts(host *); /* counts the number of immediate child hosts for a particular host */ int number_of_total_child_hosts(host *); /* counts the number of total child hosts for a particular host */ int number_of_immediate_parent_hosts(host *); /* counts the number of immediate parents hosts for a particular host */ int number_of_total_parent_hosts(host *); /* counts the number of total parents hosts for a particular host */ #ifdef NSCORE int check_for_circular_host_path(host *,host *); /* checks if a circular path exists for a given host */ int check_for_circular_servicedependency_path(servicedependency *,servicedependency *,int); /* checks if a circular dependency exists for a given service */ int check_for_circular_hostdependency_path(hostdependency *,hostdependency *,int); /* checks if a circular dependency exists for a given host */ #endif /**** Object Cleanup Functions ****/ int free_object_data(void); /* frees all allocated memory for the object definitions */ #ifdef __cplusplus } #endif #endif pnp4nagios-0.6.16/include/global.h0000664000000000000000000000007211662503006015420 0ustar rootroot#ifndef GLOBAL_H_ #define GLOBAL_H_ #endif /*GLOBAL_H_*/ pnp4nagios-0.6.16/include/config.h.in0000664000000000000000000001115311662503006016034 0ustar rootroot/* include/config.h.in. Generated from configure.ac by autoheader. */ /* Default Nagios Group */ #undef DEFAULT_NAGIOS_GROUP /* Default Nagios User */ #undef DEFAULT_NAGIOS_USER /* Define to 1 if you have the `alarm' function. */ #undef HAVE_ALARM /* Define to 1 if you have the `bzero' function. */ #undef HAVE_BZERO /* Define to 1 if you have the `getloadavg' function. */ #undef HAVE_GETLOADAVG /* Define to 1 if you have the header file. */ #undef HAVE_DIRENT_H /* Define to 1 if you have the header file. */ #undef HAVE_ERRNO_H /* Define to 1 if you have the header file. */ #undef HAVE_FCNTL_H /* Define to 1 if you have the `fork' function. */ #undef HAVE_FORK /* Define to 1 if you have the header file. */ #undef HAVE_GETOPT_H /* Define to 1 if you have the header file. */ #undef HAVE_GRP_H /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_LIMITS_H /* Define to 1 if your system has a GNU libc compatible `malloc' function, and to 0 otherwise. */ #undef HAVE_MALLOC /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_NDIR_H /* Define to 1 if you have the header file. */ #undef HAVE_NETINET_IN_H /* Define to 1 if you have the header file. */ #undef HAVE_PTHREAD_H /* Define to 1 if you have the header file. */ #undef HAVE_PWD_H /* Define to 1 if you have the header file. */ #undef HAVE_SIGNAL_H /* Define to 1 if you have the `socket' function. */ #undef HAVE_SOCKET /* Define to 1 if `stat' has the bug that it succeeds when given the zero-length file name argument. */ #undef HAVE_STAT_EMPTY_STRING_BUG /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDIO_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the `strerror' function. */ #undef HAVE_STRERROR /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the `strspn' function. */ #undef HAVE_STRSPN /* Define to 1 if `d_type' is member of `struct dirent'. */ #undef HAVE_STRUCT_DIRENT_D_TYPE /* Define to 1 if you have the header file. */ #undef HAVE_SYSLOG_H /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_SYS_DIR_H /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_SYS_NDIR_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SOCKET_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_WAIT_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_MMAN_H /* Define to 1 if you have the `vfork' function. */ #undef HAVE_VFORK /* Define to 1 if you have the header file. */ #undef HAVE_VFORK_H /* Define to 1 if `fork' works. */ #undef HAVE_WORKING_FORK /* Define to 1 if `vfork' works. */ #undef HAVE_WORKING_VFORK /* Define to 1 if `lstat' dereferences a symlink specified with a trailing slash. */ #undef LSTAT_FOLLOWS_SLASHED_SYMLINK /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define as the return type of signal handlers (`int' or `void'). */ #undef RETSIGTYPE /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Define to empty if `const' does not conform to ANSI C. */ #undef const /* Define to `int' if doesn't define. */ #undef gid_t /* Define to rpl_malloc if the replacement function should be used. */ #undef malloc /* Define to `int' if does not define. */ #undef pid_t /* Define to `int' if doesn't define. */ #undef uid_t /* Define as `fork' if `vfork' does not work. */ #undef vfork pnp4nagios-0.6.16/include/nagios.h0000664000000000000000000012435711662503006015455 0ustar rootroot/************************************************************************ * * Nagios Main Header File * Written By: Ethan Galstad (nagios@nagios.org) * Last Modified: 02-23-2008 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ************************************************************************/ #ifndef _NAGIOS_H #define _NAGIOS_H #ifndef __GNUC__ # define __attribute__(x) /* nothing */ #endif #include "config.h" //#include "pnp.h" #include "common.h" #include "locations.h" #include "objects.h" #ifdef __cplusplus extern "C" { #endif /************* MISC LENGTH/SIZE DEFINITIONS ***********/ /* NOTE: Plugin length is artificially capped at 8k to prevent runaway plugins from returning MBs/GBs of data back to Nagios. If you increase the 8k cap by modifying this value, make sure you also increase the value of MAX_EXTERNAL_COMMAND_LENGTH in common.h to allow for passive checks results received through the external command file. EG 10/19/07 */ #define MAX_PLUGIN_OUTPUT_LENGTH 8192 /* max length of plugin output (including perf data) */ /******************* DEFAULT VALUES *******************/ #define DEFAULT_LOG_LEVEL 1 /* log all events to main log file */ #define DEFAULT_USE_SYSLOG 1 /* log events to syslog? 1=yes, 0=no */ #define DEFAULT_SYSLOG_LEVEL 2 /* log only severe events to syslog */ #define DEFAULT_NOTIFICATION_LOGGING 1 /* log notification events? 1=yes, 0=no */ #define DEFAULT_INTER_CHECK_DELAY 5.0 /* seconds between initial service check scheduling */ #define DEFAULT_INTERLEAVE_FACTOR 1 /* default interleave to use when scheduling checks */ #define DEFAULT_SLEEP_TIME 0.5 /* seconds between event run checks */ #define DEFAULT_INTERVAL_LENGTH 60 /* seconds per interval unit for check scheduling */ #define DEFAULT_RETRY_INTERVAL 30 /* services are retried in 30 seconds if they're not OK */ #define DEFAULT_COMMAND_CHECK_INTERVAL -1 /* interval to check for external commands (default = as often as possible) */ #define DEFAULT_CHECK_REAPER_INTERVAL 10 /* interval in seconds to reap host and service check results */ #define DEFAULT_MAX_REAPER_TIME 30 /* maximum number of seconds to spend reaping service checks before we break out for a while */ #define DEFAULT_MAX_CHECK_RESULT_AGE 3600 /* maximum number of seconds that a check result file is considered to be valid */ #define DEFAULT_MAX_PARALLEL_SERVICE_CHECKS 0 /* maximum number of service checks we can have running at any given time (0=unlimited) */ #define DEFAULT_RETENTION_UPDATE_INTERVAL 60 /* minutes between auto-save of retention data */ #define DEFAULT_RETENTION_SCHEDULING_HORIZON 900 /* max seconds between program restarts that we will preserve scheduling information */ #define DEFAULT_STATUS_UPDATE_INTERVAL 60 /* seconds between aggregated status data updates */ #define DEFAULT_FRESHNESS_CHECK_INTERVAL 60 /* seconds between service result freshness checks */ #define DEFAULT_AUTO_RESCHEDULING_INTERVAL 30 /* seconds between host and service check rescheduling events */ #define DEFAULT_AUTO_RESCHEDULING_WINDOW 180 /* window of time (in seconds) for which we should reschedule host and service checks */ #define DEFAULT_ORPHAN_CHECK_INTERVAL 60 /* seconds between checks for orphaned hosts and services */ #define DEFAULT_NOTIFICATION_TIMEOUT 30 /* max time in seconds to wait for notification commands to complete */ #define DEFAULT_EVENT_HANDLER_TIMEOUT 30 /* max time in seconds to wait for event handler commands to complete */ #define DEFAULT_HOST_CHECK_TIMEOUT 30 /* max time in seconds to wait for host check commands to complete */ #define DEFAULT_SERVICE_CHECK_TIMEOUT 60 /* max time in seconds to wait for service check commands to complete */ #define DEFAULT_OCSP_TIMEOUT 15 /* max time in seconds to wait for obsessive compulsive processing commands to complete */ #define DEFAULT_OCHP_TIMEOUT 15 /* max time in seconds to wait for obsessive compulsive processing commands to complete */ #define DEFAULT_PERFDATA_TIMEOUT 5 /* max time in seconds to wait for performance data commands to complete */ #define DEFAULT_TIME_CHANGE_THRESHOLD 900 /* compensate for time changes of more than 15 minutes */ #define DEFAULT_LOG_HOST_RETRIES 0 /* don't log host retries */ #define DEFAULT_LOG_SERVICE_RETRIES 0 /* don't log service retries */ #define DEFAULT_LOG_EVENT_HANDLERS 1 /* log event handlers */ #define DEFAULT_LOG_INITIAL_STATES 0 /* don't log initial service and host states */ #define DEFAULT_LOG_EXTERNAL_COMMANDS 1 /* log external commands */ #define DEFAULT_LOG_PASSIVE_CHECKS 1 /* log passive service checks */ #define DEFAULT_DEBUG_LEVEL 0 /* don't log any debugging information */ #define DEFAULT_DEBUG_VERBOSITY 1 #define DEFAULT_MAX_DEBUG_FILE_SIZE 1000000 /* max size of debug log */ #define DEFAULT_AGGRESSIVE_HOST_CHECKING 0 /* don't use "aggressive" host checking */ #define DEFAULT_CHECK_EXTERNAL_COMMANDS 1 /* check for external commands */ #define DEFAULT_CHECK_ORPHANED_SERVICES 1 /* check for orphaned services */ #define DEFAULT_CHECK_ORPHANED_HOSTS 1 /* check for orphaned hosts */ #define DEFAULT_ENABLE_FLAP_DETECTION 0 /* don't enable flap detection */ #define DEFAULT_PROCESS_PERFORMANCE_DATA 0 /* don't process performance data */ #define DEFAULT_CHECK_SERVICE_FRESHNESS 1 /* check service result freshness */ #define DEFAULT_CHECK_HOST_FRESHNESS 0 /* don't check host result freshness */ #define DEFAULT_AUTO_RESCHEDULE_CHECKS 0 /* don't auto-reschedule host and service checks */ #define DEFAULT_TRANSLATE_PASSIVE_HOST_CHECKS 0 /* should we translate DOWN/UNREACHABLE passive host checks? */ #define DEFAULT_PASSIVE_HOST_CHECKS_SOFT 0 /* passive host checks are treated as HARD by default */ #define DEFAULT_LOW_SERVICE_FLAP_THRESHOLD 20.0 /* low threshold for detection of service flapping */ #define DEFAULT_HIGH_SERVICE_FLAP_THRESHOLD 30.0 /* high threshold for detection of service flapping */ #define DEFAULT_LOW_HOST_FLAP_THRESHOLD 20.0 /* low threshold for detection of host flapping */ #define DEFAULT_HIGH_HOST_FLAP_THRESHOLD 30.0 /* high threshold for detection of host flapping */ #define DEFAULT_HOST_CHECK_SPREAD 30 /* max minutes to schedule all initial host checks */ #define DEFAULT_SERVICE_CHECK_SPREAD 30 /* max minutes to schedule all initial service checks */ #define DEFAULT_CACHED_HOST_CHECK_HORIZON 15 /* max age in seconds that cached host checks can be used */ #define DEFAULT_CACHED_SERVICE_CHECK_HORIZON 15 /* max age in seconds that cached service checks can be used */ #define DEFAULT_ENABLE_PREDICTIVE_HOST_DEPENDENCY_CHECKS 1 /* should we use predictive host dependency checks? */ #define DEFAULT_ENABLE_PREDICTIVE_SERVICE_DEPENDENCY_CHECKS 1 /* should we use predictive service dependency checks? */ #define DEFAULT_USE_LARGE_INSTALLATION_TWEAKS 0 /* don't use tweaks for large Nagios installations */ #define DEFAULT_ENABLE_EMBEDDED_PERL 1 /* enable embedded Perl interpreter (if compiled in) */ #define DEFAULT_USE_EMBEDDED_PERL_IMPLICITLY 1 /* by default, embedded Perl is used for Perl plugins that don't explicitly disable it */ #define DEFAULT_ADDITIONAL_FRESHNESS_LATENCY 15 /* seconds to be added to freshness thresholds when automatically calculated by Nagios */ /******************* LOGGING TYPES ********************/ #define NSLOG_RUNTIME_ERROR 1 #define NSLOG_RUNTIME_WARNING 2 #define NSLOG_VERIFICATION_ERROR 4 #define NSLOG_VERIFICATION_WARNING 8 #define NSLOG_CONFIG_ERROR 16 #define NSLOG_CONFIG_WARNING 32 #define NSLOG_PROCESS_INFO 64 #define NSLOG_EVENT_HANDLER 128 /*#define NSLOG_NOTIFICATION 256*/ /* NOT USED ANYMORE - CAN BE REUSED */ #define NSLOG_EXTERNAL_COMMAND 512 #define NSLOG_HOST_UP 1024 #define NSLOG_HOST_DOWN 2048 #define NSLOG_HOST_UNREACHABLE 4096 #define NSLOG_SERVICE_OK 8192 #define NSLOG_SERVICE_UNKNOWN 16384 #define NSLOG_SERVICE_WARNING 32768 #define NSLOG_SERVICE_CRITICAL 65536 #define NSLOG_PASSIVE_CHECK 131072 #define NSLOG_INFO_MESSAGE 262144 #define NSLOG_HOST_NOTIFICATION 524288 #define NSLOG_SERVICE_NOTIFICATION 1048576 /***************** DEBUGGING LEVELS *******************/ #define DEBUGL_ALL -1 #define DEBUGL_NONE 0 #define DEBUGL_FUNCTIONS 1 #define DEBUGL_CONFIG 2 #define DEBUGL_PROCESS 4 #define DEBUGL_STATUSDATA 4 #define DEBUGL_RETENTIONDATA 4 #define DEBUGL_EVENTS 8 #define DEBUGL_CHECKS 16 #define DEBUGL_IPC 16 #define DEBUGL_FLAPPING 16 #define DEBUGL_EVENTHANDLERS 16 #define DEBUGL_PERFDATA 16 #define DEBUGL_NOTIFICATIONS 32 #define DEBUGL_EVENTBROKER 64 #define DEBUGL_EXTERNALCOMMANDS 128 #define DEBUGL_COMMANDS 256 #define DEBUGL_DOWNTIME 512 #define DEBUGL_COMMENTS 1024 #define DEBUGL_MACROS 2048 #define DEBUGV_BASIC 0 #define DEBUGV_MORE 1 #define DEBUGV_MOST 2 /******************** HOST STATUS *********************/ #define HOST_UP 0 #define HOST_DOWN 1 #define HOST_UNREACHABLE 2 /******************* STATE LOGGING TYPES **************/ #define INITIAL_STATES 1 #define CURRENT_STATES 2 /************ SERVICE DEPENDENCY VALUES ***************/ #define DEPENDENCIES_OK 0 #define DEPENDENCIES_FAILED 1 /*********** ROUTE CHECK PROPAGATION TYPES ************/ #define PROPAGATE_TO_PARENT_HOSTS 1 #define PROPAGATE_TO_CHILD_HOSTS 2 /****************** SERVICE STATES ********************/ #define STATE_OK 0 #define STATE_WARNING 1 #define STATE_CRITICAL 2 #define STATE_UNKNOWN 3 /* changed from -1 on 02/24/2001 */ /****************** FLAPPING TYPES ********************/ #define HOST_FLAPPING 0 #define SERVICE_FLAPPING 1 /**************** NOTIFICATION TYPES ******************/ #define HOST_NOTIFICATION 0 #define SERVICE_NOTIFICATION 1 /************* NOTIFICATION REASON TYPES ***************/ #define NOTIFICATION_NORMAL 0 #define NOTIFICATION_ACKNOWLEDGEMENT 1 #define NOTIFICATION_FLAPPINGSTART 2 #define NOTIFICATION_FLAPPINGSTOP 3 #define NOTIFICATION_FLAPPINGDISABLED 4 #define NOTIFICATION_DOWNTIMESTART 5 #define NOTIFICATION_DOWNTIMEEND 6 #define NOTIFICATION_DOWNTIMECANCELLED 7 #define NOTIFICATION_CUSTOM 99 /**************** EVENT HANDLER TYPES *****************/ #define HOST_EVENTHANDLER 0 #define SERVICE_EVENTHANDLER 1 #define GLOBAL_HOST_EVENTHANDLER 2 #define GLOBAL_SERVICE_EVENTHANDLER 3 /***************** STATE CHANGE TYPES *****************/ #define HOST_STATECHANGE 0 #define SERVICE_STATECHANGE 1 /***************** OBJECT CHECK TYPES *****************/ #define SERVICE_CHECK 0 #define HOST_CHECK 1 /******************* EVENT TYPES **********************/ #define EVENT_SERVICE_CHECK 0 /* active service check */ #define EVENT_COMMAND_CHECK 1 /* external command check */ #define EVENT_LOG_ROTATION 2 /* log file rotation */ #define EVENT_PROGRAM_SHUTDOWN 3 /* program shutdown */ #define EVENT_PROGRAM_RESTART 4 /* program restart */ #define EVENT_CHECK_REAPER 5 /* reaps results from host and service checks */ #define EVENT_ORPHAN_CHECK 6 /* checks for orphaned hosts and services */ #define EVENT_RETENTION_SAVE 7 /* save (dump) retention data */ #define EVENT_STATUS_SAVE 8 /* save (dump) status data */ #define EVENT_SCHEDULED_DOWNTIME 9 /* scheduled host or service downtime */ #define EVENT_SFRESHNESS_CHECK 10 /* checks service result "freshness" */ #define EVENT_EXPIRE_DOWNTIME 11 /* checks for (and removes) expired scheduled downtime */ #define EVENT_HOST_CHECK 12 /* active host check */ #define EVENT_HFRESHNESS_CHECK 13 /* checks host result "freshness" */ #define EVENT_RESCHEDULE_CHECKS 14 /* adjust scheduling of host and service checks */ #define EVENT_EXPIRE_COMMENT 15 /* removes expired comments */ #define EVENT_SLEEP 98 /* asynchronous sleep event that occurs when event queues are empty */ #define EVENT_USER_FUNCTION 99 /* USER-defined function (modules) */ /******* INTER-CHECK DELAY CALCULATION TYPES **********/ #define ICD_NONE 0 /* no inter-check delay */ #define ICD_DUMB 1 /* dumb delay of 1 second */ #define ICD_SMART 2 /* smart delay */ #define ICD_USER 3 /* user-specified delay */ /******* INTERLEAVE FACTOR CALCULATION TYPES **********/ #define ILF_USER 0 /* user-specified interleave factor */ #define ILF_SMART 1 /* smart interleave */ /************ SCHEDULED DOWNTIME TYPES ****************/ #define ACTIVE_DOWNTIME 0 /* active downtime - currently in effect */ #define PENDING_DOWNTIME 1 /* pending downtime - scheduled for the future */ /****************** DATA STRUCTURES *******************/ /* TIMED_EVENT structure */ typedef struct timed_event_struct{ int event_type; time_t run_time; int recurring; unsigned long event_interval; int compensate_for_time_change; void *timing_func; void *event_data; void *event_args; int event_options; struct timed_event_struct *next; struct timed_event_struct *prev; }timed_event; /* NOTIFY_LIST structure */ typedef struct notify_list_struct{ contact *contact; struct notify_list_struct *next; }notification; /* CHECK_RESULT structure */ typedef struct check_result_struct{ int object_check_type; /* is this a service or a host check? */ char *host_name; /* host name */ char *service_description; /* service description */ int check_type; /* was this an active or passive service check? */ int check_options; int scheduled_check; /* was this a scheduled or an on-demand check? */ int reschedule_check; /* should we reschedule the next check */ char *output_file; /* what file is the output stored in? */ FILE *output_file_fp; int output_file_fd; double latency; struct timeval start_time; /* time the service check was initiated */ struct timeval finish_time; /* time the service check was completed */ int early_timeout; /* did the service check timeout? */ int exited_ok; /* did the plugin check return okay? */ int return_code; /* plugin return code */ char *output; /* plugin output */ struct check_result_struct *next; }check_result; /* SCHED_INFO structure */ typedef struct sched_info_struct{ int total_services; int total_scheduled_services; int total_hosts; int total_scheduled_hosts; double average_services_per_host; double average_scheduled_services_per_host; unsigned long service_check_interval_total; unsigned long host_check_interval_total; double average_service_execution_time; double average_service_check_interval; double average_host_check_interval; double average_service_inter_check_delay; double average_host_inter_check_delay; double service_inter_check_delay; double host_inter_check_delay; int service_interleave_factor; int max_service_check_spread; int max_host_check_spread; time_t first_service_check; time_t last_service_check; time_t first_host_check; time_t last_host_check; }sched_info; /* PASSIVE_CHECK_RESULT structure */ typedef struct passive_check_result_struct{ int object_check_type; char *host_name; char *service_description; int return_code; char *output; time_t check_time; double latency; struct passive_check_result_struct *next; }passive_check_result; /* CIRCULAR_BUFFER structure - used by worker threads */ typedef struct circular_buffer_struct{ void **buffer; int tail; int head; int items; int high; /* highest number of items that has ever been stored in buffer */ unsigned long overflow; pthread_mutex_t buffer_lock; }circular_buffer; /* MMAPFILE structure - used for reading files via mmap() */ typedef struct mmapfile_struct{ char *path; int mode; int fd; unsigned long file_size; unsigned long current_position; unsigned long current_line; void *mmap_buf; }mmapfile; /* DBUF structure - dynamic string storage */ typedef struct dbuf_struct{ char *buf; unsigned long used_size; unsigned long allocated_size; unsigned long chunk_size; }dbuf; #define CHECK_STATS_BUCKETS 15 /* used for tracking host and service check statistics */ typedef struct check_stats_struct{ int current_bucket; int bucket[CHECK_STATS_BUCKETS]; int overflow_bucket; int minute_stats[3]; time_t last_update; }check_stats; /******************* THREAD STUFF ********************/ /* slots in circular buffers */ #define DEFAULT_EXTERNAL_COMMAND_BUFFER_SLOTS 4096 /* worker threads */ #define TOTAL_WORKER_THREADS 1 #define COMMAND_WORKER_THREAD 0 /******************** FUNCTIONS **********************/ /**** Configuration Functions ****/ int read_main_config_file(char *); /* reads the main config file (nagios.cfg) */ int read_resource_file(char *); /* processes macros in resource file */ int read_all_object_data(char *); /* reads all object config data */ /**** Setup Functions ****/ int pre_flight_check(void); /* try and verify the configuration data */ int pre_flight_object_check(int *,int *); /* verify object relationships and settings */ int pre_flight_circular_check(int *,int *); /* detects circular dependencies and paths */ void init_timing_loop(void); /* setup the initial scheduling queue */ void setup_sighandler(void); /* trap signals */ void reset_sighandler(void); /* reset signals to default action */ int daemon_init(void); /* switches to daemon mode */ int drop_privileges(char *,char *); /* drops privileges before startup */ void display_scheduling_info(void); /* displays service check scheduling information */ /**** Event Queue Functions ****/ int schedule_new_event(int,int,time_t,int,unsigned long,void *,int,void *,void *,int); /* schedules a new timed event */ void reschedule_event(timed_event *,timed_event **,timed_event **); /* reschedules an event */ void add_event(timed_event *,timed_event **,timed_event **); /* adds an event to the execution queue */ void remove_event(timed_event *,timed_event **,timed_event **); /* remove an event from the execution queue */ int event_execution_loop(void); /* main monitoring/event handler loop */ int handle_timed_event(timed_event *); /* top level handler for timed events */ void adjust_check_scheduling(void); /* auto-adjusts scheduling of host and service checks */ void compensate_for_system_time_change(unsigned long,unsigned long); /* attempts to compensate for a change in the system time */ void adjust_timestamp_for_time_change(time_t,time_t,unsigned long,time_t *); /* adjusts a timestamp variable for a system time change */ void resort_event_list(timed_event **,timed_event **); /* resorts event list by event run time for system time changes */ /**** IPC Functions ****/ int move_check_result_to_queue(char *); int process_check_result_queue(char *); int process_check_result_file(char *); int add_check_result_to_list(check_result *); check_result *read_check_result(void); /* reads a host/service check result from the list in memory */ int delete_check_result_file(char *); int free_check_result_list(void); int init_check_result(check_result *); int free_check_result(check_result *); /* frees memory associated with a host/service check result */ int parse_check_output(char *,char **,char **,char **,int,int); int open_command_file(void); /* creates the external command file as a named pipe (FIFO) and opens it for reading */ int close_command_file(void); /* closes and deletes the external command file (FIFO) */ /**** Monitoring/Event Handler Functions ****/ int check_service_dependencies(service *,int); /* checks service dependencies */ int check_host_dependencies(host *,int); /* checks host dependencies */ void check_for_orphaned_services(void); /* checks for orphaned services */ void check_for_orphaned_hosts(void); /* checks for orphaned hosts */ void check_service_result_freshness(void); /* checks the "freshness" of service check results */ int is_service_result_fresh(service *,time_t,int); /* determines if a service's check results are fresh */ void check_host_result_freshness(void); /* checks the "freshness" of host check results */ int is_host_result_fresh(host *,time_t,int); /* determines if a host's check results are fresh */ int my_system(char *,int,int *,double *,char **,int); /* executes a command via popen(), but also protects against timeouts */ /**** Flap Detection Functions ****/ void check_for_service_flapping(service *,int,int); /* determines whether or not a service is "flapping" between states */ void check_for_host_flapping(host *,int,int,int); /* determines whether or not a host is "flapping" between states */ void set_service_flap(service *,double,double,double,int); /* handles a service that is flapping */ void clear_service_flap(service *,double,double,double); /* handles a service that has stopped flapping */ void set_host_flap(host *,double,double,double,int); /* handles a host that is flapping */ void clear_host_flap(host *,double,double,double); /* handles a host that has stopped flapping */ void enable_flap_detection_routines(void); /* enables flap detection on a program-wide basis */ void disable_flap_detection_routines(void); /* disables flap detection on a program-wide basis */ void enable_host_flap_detection(host *); /* enables flap detection for a particular host */ void disable_host_flap_detection(host *); /* disables flap detection for a particular host */ void enable_service_flap_detection(service *); /* enables flap detection for a particular service */ void disable_service_flap_detection(service *); /* disables flap detection for a particular service */ void handle_host_flap_detection_disabled(host *); /* handles the details when flap detection is disabled globally or on a per-host basis */ void handle_service_flap_detection_disabled(service *); /* handles the details when flap detection is disabled globally or on a per-service basis */ /**** Route/Host Check Functions ****/ int perform_on_demand_host_check(host *,int *,int,int,unsigned long); int perform_scheduled_host_check(host *,int,double); int check_host_check_viability_3x(host *,int,int *,time_t *); int adjust_host_check_attempt_3x(host *,int); int determine_host_reachability(host *); int process_host_check_result_3x(host *,int,char *,int,int,int,unsigned long); int perform_on_demand_host_check_3x(host *,int *,int,int,unsigned long); int run_sync_host_check_3x(host *,int *,int,int,unsigned long); int execute_sync_host_check_3x(host *); int run_scheduled_host_check_3x(host *,int,double); int run_async_host_check_3x(host *,int,double,int,int,int *,time_t *); int handle_async_host_check_result_3x(host *,check_result *); /**** Service Check Functions ****/ int check_service_check_viability(service *,int,int *,time_t *); int run_scheduled_service_check(service *,int,double); int run_async_service_check(service *,int,double,int,int,int *,time_t *); int handle_async_service_check_result(service *,check_result *); /**** Event Handler Functions ****/ int handle_host_state(host *); /* top level host state handler */ /**** Common Check Fucntions *****/ int reap_check_results(void); /**** Check Statistics Functions ****/ int init_check_stats(void); int update_check_stats(int,time_t); int generate_check_stats(void); /**** Event Handler Functions ****/ int obsessive_compulsive_service_check_processor(service *); /* distributed monitoring craziness... */ int obsessive_compulsive_host_check_processor(host *); /* distributed monitoring craziness... */ int handle_service_event(service *); /* top level service event logic */ int run_service_event_handler(service *); /* runs the event handler for a specific service */ int run_global_service_event_handler(service *); /* runs the global service event handler */ int handle_host_event(host *); /* top level host event logic */ int run_host_event_handler(host *); /* runs the event handler for a specific host */ int run_global_host_event_handler(host *); /* runs the global host event handler */ /**** Notification Functions ****/ int check_service_notification_viability(service *,int,int); /* checks viability of notifying all contacts about a service */ int is_valid_escalation_for_service_notification(service *,serviceescalation *,int); /* checks if an escalation entry is valid for a particular service notification */ int should_service_notification_be_escalated(service *); /* checks if a service notification should be escalated */ int service_notification(service *,int,char *,char *,int); /* notify all contacts about a service (problem or recovery) */ int check_contact_service_notification_viability(contact *,service *,int,int); /* checks viability of notifying a contact about a service */ int notify_contact_of_service(contact *,service *,int,char *,char *,int,int); /* notify a single contact about a service */ int check_host_notification_viability(host *,int,int); /* checks viability of notifying all contacts about a host */ int is_valid_escalation_for_host_notification(host *,hostescalation *,int); /* checks if an escalation entry is valid for a particular host notification */ int should_host_notification_be_escalated(host *); /* checks if a host notification should be escalated */ int host_notification(host *,int,char *,char *,int); /* notify all contacts about a host (problem or recovery) */ int check_contact_host_notification_viability(contact *,host *,int,int); /* checks viability of notifying a contact about a host */ int notify_contact_of_host(contact *,host *,int,char *,char *,int,int); /* notify a single contact about a host */ int create_notification_list_from_host(host *,int,int *); /* given a host, create list of contacts to be notified (remove duplicates) */ int create_notification_list_from_service(service *,int,int *); /* given a service, create list of contacts to be notified (remove duplicates) */ int add_notification(contact *); /* adds a notification instance */ notification *find_notification(contact *); /* finds a notification object */ time_t get_next_host_notification_time(host *,time_t); /* calculates nex acceptable re-notification time for a host */ time_t get_next_service_notification_time(service *,time_t); /* calculates nex acceptable re-notification time for a service */ /**** Logging Functions ****/ void logit(int,int,const char *, ...) __attribute__((__format__(__printf__, 3, 4))); int write_to_logs_and_console(char *,unsigned long,int); /* writes a string to screen and logs */ int write_to_console(char *); /* writes a string to screen */ int write_to_all_logs(char *,unsigned long); /* writes a string to main log file and syslog facility */ int write_to_all_logs_with_timestamp(char *,unsigned long,time_t *); /* writes a string to main log file and syslog facility */ int write_to_log(char *,unsigned long,time_t *); /* write a string to the main log file */ int write_to_syslog(char *,unsigned long); /* write a string to the syslog facility */ int log_service_event(service *); /* logs a service event */ int log_host_event(host *); /* logs a host event */ int log_host_states(int,time_t *); /* logs initial/current host states */ int log_service_states(int,time_t *); /* logs initial/current service states */ int rotate_log_file(time_t); /* rotates the main log file */ int write_log_file_info(time_t *); /* records log file/version info */ int open_debug_log(void); int log_debug_info(int,int,const char *,...) __attribute__((__format__(__printf__, 3, 4))); int close_debug_log(void); /**** Cleanup Functions ****/ void cleanup(void); /* cleanup after ourselves (before quitting or restarting) */ void free_memory(void); /* free memory allocated to all linked lists in memory */ int reset_variables(void); /* reset all global variables */ void free_notification_list(void); /* frees all memory allocated to the notification list */ /**** Hash Functions ****/ int hashfunc(const char *name1, const char *name2, int hashslots); int compare_hashdata(const char *,const char *,const char *,const char *); /**** Miscellaneous Functions ****/ void sighandler(int); /* handles signals */ void service_check_sighandler(int); /* handles timeouts when executing service checks */ void host_check_sighandler(int); /* handles timeouts when executing host checks */ void my_system_sighandler(int); /* handles timeouts when executing commands via my_system() */ void file_lock_sighandler(int); /* handles timeouts while waiting for file locks */ void strip(char *); /* strips whitespace from string */ char *my_strtok(char *,char *); /* my replacement for strtok() function (doesn't skip consecutive tokens) */ char *my_strsep(char **,const char *); /* Solaris doesn't have strsep(), so I took this from the glibc source code */ #ifdef REMOVED_10182007 int my_free(void **); /* my wrapper for free() */ #endif int compare_strings(char *,char *); /* compares two strings for equality */ char *escape_newlines(char *); int contains_illegal_object_chars(char *); /* tests whether or not an object name (host, service, etc.) contains illegal characters */ int my_rename(char *,char *); /* renames a file - works across filesystems */ int my_fcopy(char *,char *); /* copies a file - works across filesystems */ int get_raw_command_line(command *,char *,char **,int); /* given a raw command line, determine the actual command to run */ int check_time_against_period(time_t,timeperiod *); /* check to see if a specific time is covered by a time period */ int is_daterange_single_day(daterange *); time_t calculate_time_from_weekday_of_month(int,int,int,int); /* calculates midnight time of specific (3rd, last, etc.) weekday of a particular month */ time_t calculate_time_from_day_of_month(int,int,int); /* calculates midnight time of specific (1st, last, etc.) day of a particular month */ void get_next_valid_time(time_t, time_t *,timeperiod *); /* get the next valid time in a time period */ void get_datetime_string(time_t *,char *,int,int); /* get a date/time string for use in output */ void get_time_breakdown(unsigned long,int *,int *,int *, int *); time_t get_next_log_rotation_time(void); /* determine the next time to schedule a log rotation */ int init_embedded_perl(char **); /* initialized embedded perl interpreter */ int deinit_embedded_perl(void); /* cleans up embedded perl */ int file_uses_embedded_perl(char *); /* tests whether or not the embedded perl interpreter should be used on a file */ int dbuf_init(dbuf *,int); int dbuf_free(dbuf *); int dbuf_strcat(dbuf *,char *); int set_environment_var(char *,char *,int); /* sets/clears and environment variable */ /**** External Command Functions ****/ int check_for_external_commands(void); /* checks for any external commands */ int process_external_command1(char *); /* top-level external command processor */ int process_external_command2(int,time_t,char *); /* process an external command */ int process_external_commands_from_file(char *,int); /* process external commands in a file */ int process_host_command(int,time_t,char *); /* process an external host command */ int process_hostgroup_command(int,time_t,char *); /* process an external hostgroup command */ int process_service_command(int,time_t,char *); /* process an external service command */ int process_servicegroup_command(int,time_t,char *); /* process an external servicegroup command */ int process_contact_command(int,time_t,char *); /* process an external contact command */ int process_contactgroup_command(int,time_t,char *); /* process an external contactgroup command */ /**** External Command Implementations ****/ int cmd_add_comment(int,time_t,char *); /* add a service or host comment */ int cmd_delete_comment(int,char *); /* delete a service or host comment */ int cmd_delete_all_comments(int,char *); /* delete all comments associated with a host or service */ int cmd_delay_notification(int,char *); /* delay a service or host notification */ int cmd_schedule_service_check(int,char *,int); /* schedule an immediate or delayed service check */ int cmd_schedule_check(int,char *); /* schedule an immediate or delayed host check */ int cmd_schedule_host_service_checks(int,char *,int); /* schedule an immediate or delayed checks of all services on a host */ int cmd_signal_process(int,char *); /* schedules a program shutdown or restart */ int cmd_process_service_check_result(int,time_t,char *); /* processes a passive service check */ int cmd_process_host_check_result(int,time_t,char *); /* processes a passive host check */ int cmd_acknowledge_problem(int,char *); /* acknowledges a host or service problem */ int cmd_remove_acknowledgement(int,char *); /* removes a host or service acknowledgement */ int cmd_schedule_downtime(int,time_t,char *); /* schedules host or service downtime */ int cmd_delete_downtime(int,char *); /* cancels active/pending host or service scheduled downtime */ int cmd_change_object_int_var(int,char *); /* changes host/svc (int) variable */ int cmd_change_object_char_var(int,char *); /* changes host/svc (char) variable */ int cmd_change_object_custom_var(int,char *); /* changes host/svc custom variable */ int cmd_process_external_commands_from_file(int,char *); /* process external commands from a file */ int process_passive_service_check(time_t,char *,char *,int,char *); int process_passive_host_check(time_t,char *,int,char *); /**** Internal Command Implementations ****/ void disable_service_checks(service *); /* disables a service check */ void enable_service_checks(service *); /* enables a service check */ void schedule_service_check(service *,time_t,int); /* schedules an immediate or delayed service check */ void schedule_host_check(host *,time_t,int); /* schedules an immediate or delayed host check */ void enable_all_notifications(void); /* enables notifications on a program-wide basis */ void disable_all_notifications(void); /* disables notifications on a program-wide basis */ void enable_service_notifications(service *); /* enables service notifications */ void disable_service_notifications(service *); /* disables service notifications */ void enable_host_notifications(host *); /* enables host notifications */ void disable_host_notifications(host *); /* disables host notifications */ void enable_and_propagate_notifications(host *,int,int,int,int); /* enables notifications for all hosts and services beyond a given host */ void disable_and_propagate_notifications(host *,int,int,int,int); /* disables notifications for all hosts and services beyond a given host */ void schedule_and_propagate_downtime(host *,time_t,char *,char *,time_t,time_t,int,unsigned long,unsigned long); /* schedules downtime for all hosts beyond a given host */ void acknowledge_host_problem(host *,char *,char *,int,int,int); /* acknowledges a host problem */ void acknowledge_service_problem(service *,char *,char *,int,int,int); /* acknowledges a service problem */ void remove_host_acknowledgement(host *); /* removes a host acknowledgement */ void remove_service_acknowledgement(service *); /* removes a service acknowledgement */ void start_executing_service_checks(void); /* starts executing service checks */ void stop_executing_service_checks(void); /* stops executing service checks */ void start_accepting_passive_service_checks(void); /* starts accepting passive service check results */ void stop_accepting_passive_service_checks(void); /* stops accepting passive service check results */ void enable_passive_service_checks(service *); /* enables passive service checks for a particular service */ void disable_passive_service_checks(service *); /* disables passive service checks for a particular service */ void start_using_event_handlers(void); /* enables event handlers on a program-wide basis */ void stop_using_event_handlers(void); /* disables event handlers on a program-wide basis */ void enable_service_event_handler(service *); /* enables the event handler for a particular service */ void disable_service_event_handler(service *); /* disables the event handler for a particular service */ void enable_host_event_handler(host *); /* enables the event handler for a particular host */ void disable_host_event_handler(host *); /* disables the event handler for a particular host */ void enable_host_checks(host *); /* enables checks of a particular host */ void disable_host_checks(host *); /* disables checks of a particular host */ void start_obsessing_over_service_checks(void); /* start obsessing about service check results */ void stop_obsessing_over_service_checks(void); /* stop obsessing about service check results */ void start_obsessing_over_host_checks(void); /* start obsessing about host check results */ void stop_obsessing_over_host_checks(void); /* stop obsessing about host check results */ void enable_service_freshness_checks(void); /* enable service freshness checks */ void disable_service_freshness_checks(void); /* disable service freshness checks */ void enable_host_freshness_checks(void); /* enable host freshness checks */ void disable_host_freshness_checks(void); /* disable host freshness checks */ void process_passive_checks(void); /* processes passive host and service check results */ void enable_all_failure_prediction(void); /* enables failure prediction on a program-wide basis */ void disable_all_failure_prediction(void); /* disables failure prediction on a program-wide basis */ void enable_performance_data(void); /* enables processing of performance data on a program-wide basis */ void disable_performance_data(void); /* disables processing of performance data on a program-wide basis */ void start_executing_host_checks(void); /* starts executing host checks */ void stop_executing_host_checks(void); /* stops executing host checks */ void start_accepting_passive_host_checks(void); /* starts accepting passive host check results */ void stop_accepting_passive_host_checks(void); /* stops accepting passive host check results */ void enable_passive_host_checks(host *); /* enables passive host checks for a particular host */ void disable_passive_host_checks(host *); /* disables passive host checks for a particular host */ void start_obsessing_over_service(service *); /* start obsessing about specific service check results */ void stop_obsessing_over_service(service *); /* stop obsessing about specific service check results */ void start_obsessing_over_host(host *); /* start obsessing about specific host check results */ void stop_obsessing_over_host(host *); /* stop obsessing about specific host check results */ void set_host_notification_number(host *,int); /* sets current notification number for a specific host */ void set_service_notification_number(service *,int); /* sets current notification number for a specific service */ void enable_contact_host_notifications(contact *); /* enables host notifications for a specific contact */ void disable_contact_host_notifications(contact *); /* disables host notifications for a specific contact */ void enable_contact_service_notifications(contact *); /* enables service notifications for a specific contact */ void disable_contact_service_notifications(contact *); /* disables service notifications for a specific contact */ int init_check_result_worker_thread(void); int shutdown_check_result_worker_thread(void); void * check_result_worker_thread(void *); void cleanup_check_result_worker_thread(void *); int init_command_file_worker_thread(void); int shutdown_command_file_worker_thread(void); void * command_file_worker_thread(void *); void cleanup_command_file_worker_thread(void *); int submit_external_command(char *,int *); int submit_raw_external_command(char *,time_t *,int *); char *get_program_version(void); char *get_program_modification_date(void); mmapfile *mmap_fopen(char *); /* open a file read-only via mmap() */ int mmap_fclose(mmapfile *); char *mmap_fgets(mmapfile *); char *mmap_fgets_multiline(mmapfile *); #ifdef __cplusplus } #endif #endif pnp4nagios-0.6.16/include/nebstructs.h0000664000000000000000000003314511662503006016363 0ustar rootroot/***************************************************************************** * * NEBSTRUCTS.H - Event broker includes for Nagios * * Copyright (c) 2003-2007 Ethan Galstad (nagios@nagios.org) * Last Modified: 10-28-2007 * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #ifndef _NEBSTRUCTS_H #define _NEBSTRUCTS_H #include "config.h" #include "pnp.h" #include "objects.h" #include "nagios.h" #ifdef __cplusplus extern "C" { #endif /****** STRUCTURES *************************/ /* process data structure */ typedef struct nebstruct_process_struct{ int type; int flags; int attr; struct timeval timestamp; }nebstruct_process_data; /* timed event data structure */ typedef struct nebstruct_timed_event_struct{ int type; int flags; int attr; struct timeval timestamp; int event_type; int recurring; time_t run_time; void *event_data; void *event_ptr; }nebstruct_timed_event_data; /* log data structure */ typedef struct nebstruct_log_struct{ int type; int flags; int attr; struct timeval timestamp; time_t entry_time; int data_type; char *data; }nebstruct_log_data; /* system command structure */ typedef struct nebstruct_system_command_struct{ int type; int flags; int attr; struct timeval timestamp; struct timeval start_time; struct timeval end_time; int timeout; char *command_line; int early_timeout; double execution_time; int return_code; char *output; }nebstruct_system_command_data; /* event handler structure */ typedef struct nebstruct_event_handler_struct{ int type; int flags; int attr; struct timeval timestamp; int eventhandler_type; char *host_name; char *service_description; int state_type; int state; int timeout; char *command_name; char *command_args; char *command_line; struct timeval start_time; struct timeval end_time; int early_timeout; double execution_time; int return_code; char *output; void *object_ptr; }nebstruct_event_handler_data; /* host check structure */ typedef struct nebstruct_host_check_struct{ int type; int flags; int attr; struct timeval timestamp; char *host_name; int current_attempt; int check_type; int max_attempts; int state_type; int state; int timeout; char *command_name; char *command_args; char *command_line; struct timeval start_time; struct timeval end_time; int early_timeout; double execution_time; double latency; int return_code; char *output; char *long_output; char *perf_data; void *object_ptr; }nebstruct_host_check_data; /* service check structure */ typedef struct nebstruct_service_check_struct{ int type; int flags; int attr; struct timeval timestamp; char *host_name; char *service_description; int check_type; int current_attempt; int max_attempts; int state_type; int state; int timeout; char *command_name; char *command_args; char *command_line; struct timeval start_time; struct timeval end_time; int early_timeout; double execution_time; double latency; int return_code; char *output; char *long_output; char *perf_data; void *object_ptr; }nebstruct_service_check_data; /* comment data structure */ typedef struct nebstruct_comment_struct{ int type; int flags; int attr; struct timeval timestamp; int comment_type; char *host_name; char *service_description; time_t entry_time; char *author_name; char *comment_data; int persistent; int source; int entry_type; int expires; time_t expire_time; unsigned long comment_id; void *object_ptr; /* not implemented yet */ }nebstruct_comment_data; /* downtime data structure */ typedef struct nebstruct_downtime_struct{ int type; int flags; int attr; struct timeval timestamp; int downtime_type; char *host_name; char *service_description; time_t entry_time; char *author_name; char *comment_data; time_t start_time; time_t end_time; int fixed; unsigned long duration; unsigned long triggered_by; unsigned long downtime_id; void *object_ptr; /* not implemented yet */ }nebstruct_downtime_data; /* flapping data structure */ typedef struct nebstruct_flapping_struct{ int type; int flags; int attr; struct timeval timestamp; int flapping_type; char *host_name; char *service_description; double percent_change; double high_threshold; double low_threshold; unsigned long comment_id; void *object_ptr; }nebstruct_flapping_data; /* program status structure */ typedef struct nebstruct_program_status_struct{ int type; int flags; int attr; struct timeval timestamp; time_t program_start; int pid; int daemon_mode; time_t last_command_check; time_t last_log_rotation; int notifications_enabled; int active_service_checks_enabled; int passive_service_checks_enabled; int active_host_checks_enabled; int passive_host_checks_enabled; int event_handlers_enabled; int flap_detection_enabled; int failure_prediction_enabled; int process_performance_data; int obsess_over_hosts; int obsess_over_services; unsigned long modified_host_attributes; unsigned long modified_service_attributes; char *global_host_event_handler; char *global_service_event_handler; }nebstruct_program_status_data; /* host status structure */ typedef struct nebstruct_host_status_struct{ int type; int flags; int attr; struct timeval timestamp; void *object_ptr; }nebstruct_host_status_data; /* service status structure */ typedef struct nebstruct_service_status_struct{ int type; int flags; int attr; struct timeval timestamp; void *object_ptr; }nebstruct_service_status_data; /* contact status structure */ typedef struct nebstruct_contact_status_struct{ int type; int flags; int attr; struct timeval timestamp; void *object_ptr; }nebstruct_contact_status_data; /* notification data structure */ typedef struct nebstruct_notification_struct{ int type; int flags; int attr; struct timeval timestamp; int notification_type; struct timeval start_time; struct timeval end_time; char *host_name; char *service_description; int reason_type; int state; char *output; char *ack_author; char *ack_data; int escalated; int contacts_notified; void *object_ptr; }nebstruct_notification_data; /* contact notification data structure */ typedef struct nebstruct_contact_notification_struct{ int type; int flags; int attr; struct timeval timestamp; int notification_type; struct timeval start_time; struct timeval end_time; char *host_name; char *service_description; char *contact_name; int reason_type; int state; char *output; char *ack_author; char *ack_data; int escalated; void *object_ptr; void *contact_ptr; }nebstruct_contact_notification_data; /* contact notification method data structure */ typedef struct nebstruct_contact_notification_method_struct{ int type; int flags; int attr; struct timeval timestamp; int notification_type; struct timeval start_time; struct timeval end_time; char *host_name; char *service_description; char *contact_name; char *command_name; char *command_args; int reason_type; int state; char *output; char *ack_author; char *ack_data; int escalated; void *object_ptr; void *contact_ptr; }nebstruct_contact_notification_method_data; /* adaptive program data structure */ typedef struct nebstruct_adaptive_program_data_struct{ int type; int flags; int attr; struct timeval timestamp; int command_type; unsigned long modified_host_attribute; unsigned long modified_host_attributes; unsigned long modified_service_attribute; unsigned long modified_service_attributes; }nebstruct_adaptive_program_data; /* adaptive host data structure */ typedef struct nebstruct_adaptive_host_data_struct{ int type; int flags; int attr; struct timeval timestamp; int command_type; unsigned long modified_attribute; unsigned long modified_attributes; void *object_ptr; }nebstruct_adaptive_host_data; /* adaptive service data structure */ typedef struct nebstruct_adaptive_service_data_struct{ int type; int flags; int attr; struct timeval timestamp; int command_type; unsigned long modified_attribute; unsigned long modified_attributes; void *object_ptr; }nebstruct_adaptive_service_data; /* adaptive contact data structure */ typedef struct nebstruct_adaptive_contact_data_struct{ int type; int flags; int attr; struct timeval timestamp; int command_type; unsigned long modified_attribute; unsigned long modified_attributes; unsigned long modified_host_attribute; unsigned long modified_host_attributes; unsigned long modified_service_attribute; unsigned long modified_service_attributes; void *object_ptr; }nebstruct_adaptive_contact_data; /* external command data structure */ typedef struct nebstruct_external_command_struct{ int type; int flags; int attr; struct timeval timestamp; int command_type; time_t entry_time; char *command_string; char *command_args; }nebstruct_external_command_data; /* aggregated status data structure */ typedef struct nebstruct_aggregated_status_struct{ int type; int flags; int attr; struct timeval timestamp; }nebstruct_aggregated_status_data; /* retention data structure */ typedef struct nebstruct_retention_struct{ int type; int flags; int attr; struct timeval timestamp; }nebstruct_retention_data; /* acknowledgement structure */ typedef struct nebstruct_acknowledgement_struct{ int type; int flags; int attr; struct timeval timestamp; int acknowledgement_type; char *host_name; char *service_description; int state; char *author_name; char *comment_data; int is_sticky; int persistent_comment; int notify_contacts; void *object_ptr; }nebstruct_acknowledgement_data; /* state change structure */ typedef struct nebstruct_statechange_struct{ int type; int flags; int attr; struct timeval timestamp; int statechange_type; char *host_name; char *service_description; int state; int state_type; int current_attempt; int max_attempts; char *output; void *object_ptr; }nebstruct_statechange_data; #ifdef __cplusplus } #endif #endif pnp4nagios-0.6.16/include/npcdmod.h0000664000000000000000000000260611662503006015611 0ustar rootroot/***************************************************************************** * * NPCDMOD.H * * Copyright (c) 2008 Hendrik Baecker (http://www.pnp4nagios.org) * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation; * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Last Modified: 11-18-2008 * *****************************************************************************/ /* MMAPFILE structure - used for reading files via mmap() */ typedef struct pnp_mmapfile_struct { char *path; int mode; int fd; unsigned long file_size; unsigned long current_position; unsigned long current_line; void *mmap_buf; } pnp_mmapfile; pnp_mmapfile *pnp_mmap_fopen(char *); /* open a file read-only via mmap() */ int pnp_mmap_fclose(pnp_mmapfile *); char *pnp_mmap_fgets(pnp_mmapfile *); char *pnp_mmap_fgets_multiline(pnp_mmapfile *); extern void pnp_strip(char *); pnp4nagios-0.6.16/include/pnp.h0000664000000000000000000000430611662503006014761 0ustar rootroot/* #include "../include/global.h" */ /************************************* * General Header Files *************************************/ #ifdef HAVE_STDIO_H #include #endif #ifdef HAVE_ERRNO_H #include #endif #ifdef HAVE_UNISTD_H #include #endif #ifdef HAVE_SYSLOG_H #include #endif #ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_SYS_WAIT_H #include #endif #ifdef HAVE_SYS_STAT_H #include #endif #ifdef HAVE_SYS_TIME_H #include #endif #ifdef HAVE_SIGNAL_H #include #endif #ifdef HAVE_STDLIB_H #include #endif #ifdef HAVE_DIRENT_H #include #endif #ifdef HAVE_STRING_H #include #endif #ifdef HAVE_TIME_H #include #endif #ifdef HAVE_PTHREAD_H #include #endif #ifdef HAVE_GETOPT_H #include #endif #ifdef HAVE_GRP_H #include #endif #ifdef HAVE_PWD_H #include #endif #ifdef HAVE_FCNTL_H #include #endif #ifdef HAVE_LIMITS_H #include #endif #ifdef HAVE_SYS_MMAN_H #include #endif /************************************* Default defines **************************************/ extern int do_log(char*); #define LOG(level, msg) (loglevel >= level || loglevel == -1) ? (do_log(msg)) : (0) #define TRUE 1 #define FALSE 0 #define OK 0 #define ERROR -2 #define MAX_FILENAME_LENGTH 256 #define MAX_VARIABLE_LENGTH 256 #define MAX_VALUE_LENGTH 256 #define MAX_COMMANDLINE_LENGTH 512 #define MAX_BUFFER_SIZE 1024 #define MAX_LOGMESSAGE_SIZE 768 #define CONFIG_OPT_COUNT 15 #define CONFIG_OPT_LOGTYPE 0 #define CONFIG_OPT_LOGFILE 1 #define CONFIG_OPT_LOGFILESIZE 2 #define CONFIG_OPT_LOGLEVEL 3 #define CONFIG_OPT_SCANDIR 4 #define CONFIG_OPT_RUNCMD 5 #define CONFIG_OPT_RUNCMD_ARG 6 #define CONFIG_OPT_MAXTHREADS 7 #define CONFIG_OPT_USER 8 #define CONFIG_OPT_GROUP 9 #define CONFIG_OPT_PIDFILE 10 #define CONFIG_OPT_USELOAD 11 #define CONFIG_OPT_LOAD 12 #define CONFIG_OPT_SLEEPTIME 13 #define CONFIG_OPT_IDENTMYSELF 14 pnp4nagios-0.6.16/configure.ac0000664000000000000000000002235611662503006014663 0ustar rootroot# -*- Autoconf -*- # Process this file with autoconf to produce a configure script. AC_PREREQ(2.61) AC_INIT(pnp, 0.6.16, pnp4nagios-devel@lists.sourceforge.net) AC_CONFIG_SRCDIR(src/) AC_CONFIG_HEADERS(include/config.h:include/config.h.in) AC_PREFIX_DEFAULT(/usr/local/pnp4nagios) AC_DEFINE([DEFAULT_NAGIOS_USER], [nagios], [Default Nagios User]) AC_DEFINE([DEFAULT_NAGIOS_GROUP], [nagios], [Default Nagios Group]) PKG_NAME=pnp4nagios PKG_VERSION="0.6.16" PKG_HOME_URL="http://www.pnp4nagios.org/pnp/start" PKG_REL_DATE="11-21-2011" AC_SUBST(PKG_NAME) AC_SUBST(PKG_VERSION) AC_SUBST(PKG_HOME_URL) AC_SUBST(PKG_REL_DATE) AC_SUBST(ac_configure_args) XML_STRUCTURE_VERSION="4" AC_SUBST(XML_STRUCTURE_VERSION) dnl Figure out how to invoke "install" and what install options to use. AC_PROG_INSTALL AC_SUBST(INSTALL) #dnl What OS are we running? AC_CANONICAL_HOST dnl Checks for programs. AC_PROG_CC AC_PROG_MAKE_SET AC_PATH_PROG([STRIP],[strip],[true]) AC_PATH_PROG(CP,cp) # Checks for libraries. # Checks for header files. AC_HEADER_STDC AC_HEADER_DIRENT AC_HEADER_SYS_WAIT #AC_CHECK_HEADERS(netinet/in.h string.h sys/socket.h unistd.h stdio.h stdlib.h getopt.h signal.h) AC_CHECK_HEADERS(dirent.h stdio.h errno.h unistd.h syslog.h signal.h stdlib.h dirent.h string.h pthread.h getopt.h grp.h pwd.h sys/mman.h sys/types.h sys/wait.h sys/stat.h sys/socket.h sys/loadavg.h netinet/in.h fcntl.h limits.h) # Checks for typedefs, structures, and compiler characteristics. AC_TYPE_PID_T AC_TYPE_SIGNAL AC_TYPE_UID_T # Checks for structure members #AC_CHECK_MEMBER([struct dirent.d_type], [AC_MSG_RESULT([We successfully have a `dirent_d_type'!])], # [AC_MSG_ERROR([We need `dirent.d_type'!])], # [#include ]) AC_STRUCT_DIRENT_D_TYPE # Checks for library functions. AC_FUNC_FORK AC_CHECK_FUNCS([bzero socket alarm strerror strspn getloadavg]) AC_FUNC_MALLOC AC_FUNC_STAT AC_C_CONST dnl Layout Methods layout="default" AC_ARG_WITH(layout,[ --with-layout=\[default,debian\] sets directory layout],layout=$withval) case $layout in debian) prefix="/" sysconfdir="/etc/${PKG_NAME}" localstatedir="/var/log/${PKG_NAME}" libexecdir="/usr/lib/${PKG_NAME}/libexec" libdir="/usr/lib/${PKG_NAME}" datarootdir="/usr/share/${PKG_NAME}/html" PERFDATA_LOG="/var/log/${PKG_NAME}/perfdata.log" PERFDATA_DIR="/var/lib/${PKG_NAME}/perfdata" PERFDATA_SPOOL_DIR="/var/spool/${PKG_NAME}" bindir="/usr/bin" sbindir="/usr/sbin" ;; default-0.4) prefix="/usr/local/nagios" sysconfdir="\${prefix}/etc/pnp" localstatedir="\${prefix}/var" libexecdir="\${prefix}/libexec" datarootdir="\${prefix}/share/pnp" libdir="\${prefix}/lib/pnp" PERFDATA_LOG="\${prefix}/var/perfdata.log" PERFDATA_DIR="\${prefix}/share/perfdata" PERFDATA_SPOOL_DIR="\${prefix}/var/spool/perfdata" ;; default) PERFDATA_LOG="${localstatedir}/perfdata.log" PERFDATA_DIR="${localstatedir}/perfdata" PERFDATA_SPOOL_DIR="${localstatedir}/spool" mandir="\${prefix}/man" ;; esac AC_ARG_WITH(kohana,[ --without-kohana does not install the kohana framework],KOHANA=no,KOHANA=yes) AC_SUBST(KOHANA) AC_ARG_WITH(kohana_system,[ --with-kohana_system= Points to an already installed kohana framework],KOHANA_SYSTEM=$withval,KOHANA_SYSTEM=$libdir/kohana/system) AC_SUBST(KOHANA_SYSTEM) AC_ARG_WITH(nagios_user,[ --with-nagios-user= sets user name to run nagios],nagios_user=$withval,nagios_user=nagios) AC_ARG_WITH(nagios_group,[ --with-nagios-group= sets group name to run nagios],nagios_grp=$withval,nagios_grp=nagios) AC_SUBST(nagios_user) AC_SUBST(nagios_grp) AC_DEFINE_UNQUOTED(DEFAULT_NAGIOS_USER,"$nagios_user") AC_DEFINE_UNQUOTED(DEFAULT_NAGIOS_GROUP,"$nagios_grp") INSTALL_OPTS="-o $nagios_user -g $nagios_grp" AC_SUBST(INSTALL_OPTS) # Checks for programs. AC_PATH_PROG(PERL,perl) # Check for Perl lib path PERL_LIB_PATH=no AC_ARG_WITH(perl_lib_path,[ --with-perl_lib_path= sets path to rrdtool RRDs perl modules.],PERL_LIB_PATH=$withval,PERL_LIB_PATH=no) AC_SUBST(PERL_LIB_PATH) # Check for rrdtool RRDTOOL=no AC_ARG_WITH(rrdtool,[ --with-rrdtool= sets path to rrdtool],RRDTOOL=$withval,RRDTOOL=no) if test RRDTOOL=no; then AC_PATH_PROG(RRDTOOL,rrdtool) fi AC_MSG_CHECKING(rrdtool path $RRDTOOL) if [ test -d $RRDTOOL ];then AC_MSG_RESULT(no) AC_MSG_ERROR([$RRDTOOL is a directory! PNP needs the Path to the rrdtool binary!]) fi AC_MSG_RESULT(yes) AC_MSG_CHECKING(for executable Bit on $RRDTOOL) if [ ! test -x $RRDTOOL] ;then AC_MSG_RESULT(no) AC_MSG_ERROR([$RRDTOOL is not executable!]) fi AC_MSG_RESULT(yes) AC_SUBST(RRDTOOL) AC_ARG_WITH(perfdata-logfile,[ --with-perfdata-logfile= Tell me where I should store the 'process_perfdata.pl' Logfile], PERFDATA_LOG=$withval ) AC_SUBST(PERFDATA_LOG) AC_ARG_WITH(perfdata-dir,[ --with-perfdata-dir= Tell me where I should store the RRD Database Files], PERFDATA_DIR=$withval ) AC_SUBST(PERFDATA_DIR) AC_ARG_WITH(perfdata-spool-dir,[ --with-perfdata-spool-dir= Tell me where I should store perfdata files for bulk mode with npcd], PERFDATA_SPOOL_DIR=$withval ) AC_SUBST(PERFDATA_SPOOL_DIR) AC_ARG_WITH(debug,[ --with-debug Enable debuging for process_perfdata.pl], DEBUG="2", DEBUG="0" ) AC_SUBST(DEBUG) dnl Check for location of Apache conf.d directory HTTP_CONF=no AC_ARG_WITH(httpd_conf,[ --with-httpd-conf= sets path to Apache conf.d directory],HTTPD_CONF=$withval,HTTPD_CONF=no) if test x$HTTPD_CONF = xno; then if test -d /etc/httpd/conf.d; then HTTPD_CONF="/etc/httpd/conf.d" elif test -d /etc/apache2/conf.d; then HTTPD_CONF="/etc/apache2/conf.d" elif test -d /etc/apache/conf.d; then HTTPD_CONF="/etc/apache/conf.d" else HTTPD_CONF="/etc/httpd/conf.d" fi fi AC_SUBST(HTTPD_CONF) dnl Check for location of init scripts init_dir=/etc/rc.d/init.d if test -d /etc/rc.d/init.d; then init_dir="/etc/rc.d/init.d" elif test -d /usr/local/etc/rc.d; then init_dir="/usr/local/etc/rc.d" elif test -d /etc/rc.d; then init_dir="/etc/rc.d" elif test -d /etc/init.d; then init_dir="/etc/init.d" elif test -d /sbin/init.d; then init_dir="/sbin/init.d" fi BASE_URL=${PKG_NAME} AC_ARG_WITH(base-url,[ --with-base-url=/${PKG_NAME} ],BASE_URL=$withval,BASE_URL=/${PKG_NAME}) AC_SUBST(BASE_URL) dnl User can override init script location AC_ARG_WITH(init_dir,[ --with-init-dir= sets directory to place init script into],init_dir=$withval) AC_SUBST(init_dir) pnpsender_name=pnpsender AC_SUBST(pnpsender_name) npcd_name=npcd AC_SUBST(npcd_name) pp_pl_name=process_perfdata.pl AC_SUBST(pp_pl_name) dnl - Modified version from www.erlang.org dnl - Some 12/15/05 mods made after reading http://xaxxon.slackworks.com/phuku/dl.html AC_MSG_CHECKING(for linker flags for loadable modules) case $host_os in solaris2*|sysv4*) MOD_LDFLAGS="-G" ;; aix4*|aix5*) #MOD_LDFLAGS="-G -bnoentry -bexpall" MOD_LDFLAGS="-shared -Wl,-G -Wl,-bM:SRE -Wl,-bnoentry -Wl,-bexpall" ;; freebsd2*) # Non-ELF GNU linker MOD_LDFLAGS="-Bshareable" ;; darwin*) # Mach-O linker, a shared lib and a loadable # object file is not the same thing. MOD_LDFLAGS="-bundle -flat_namespace -undefined suppress" MOD_CFLAGS="$MOD_CFLAGS -fno-common" ;; linux* | k*bsd*-gnu*) # assume GNU linker and ELF MOD_LDFLAGS="-shared" MOD_CFLAGS="-fPIC" ;; *) # assume GNU linker and ELF MOD_LDFLAGS="-shared" ;; esac AC_MSG_RESULT([$MOD_LDFLAGS]) AC_SUBST(MOD_CFLAGS) AC_SUBST(MOD_LDFLAGS) # # Checking for Perl Modules # AC_MSG_CHECKING(for Perl Module Time::HiRes) $PERL -MTime::HiRes -e exit >/dev/null 2>&1 if test $? -ne 0; then AC_MSG_RESULT(no) AC_MSG_ERROR(Perl Module Time::HiRes not available) else AC_MSG_RESULT(yes) fi AC_MSG_CHECKING(for Perl Module Getopt::Long) $PERL -MGetopt::Long -e exit >/dev/null 2>&1 if test $? -ne 0; then AC_MSG_RESULT(no) AC_MSG_ERROR(Perl Module Getopt::Long not available) else AC_MSG_RESULT(yes) fi RRDS=0 AC_MSG_CHECKING(for optional Perl Module RRDs) $PERL -I${PERL_LIB_PATH} -MRRDs -e exit >/dev/null 2>&1 if test $? -ne 0; then AC_MSG_RESULT(no) AC_MSG_WARN(Perl Module RRDs not available) RRDS=0 else AC_MSG_RESULT(yes) RRDS=1 fi AC_SUBST(RRDS) AC_CONFIG_FILES( subst Makefile share/Makefile lib/Makefile scripts/Makefile src/Makefile sample-config/Makefile man/Makefile ) AC_OUTPUT() $PERL subst summary $PERL subst scripts/process_perfdata.pl $PERL subst scripts/rrd_convert.pl $PERL subst scripts/rc.npcd $PERL subst scripts/rc.pnp_gearman_worker $PERL subst scripts/check_pnp_rrds.pl $PERL subst share/pnp/index.php $PERL subst share/pnp/install.php $PERL subst sample-config/httpd.conf $PERL subst sample-config/lighttpd.pnp4nagios.conf $PERL subst sample-config/nginx.pnp4nagios.conf $PERL subst sample-config/nagios.cfg-sample $PERL subst sample-config/misccommands.cfg-sample $PERL subst sample-config/pnp/config.php $PERL subst sample-config/pnp/npcd.cfg-sample $PERL subst sample-config/pnp/process_perfdata.cfg-sample $PERL subst sample-config/pnp/pnp4nagios_release $PERL subst contrib/ssi/status-header.ssi $PERL subst helpers/w2h.pl $PERL subst man/npcd.8 $PERL summary pnp4nagios-0.6.16/share/0000775000000000000000000000000011662503006013467 5ustar rootrootpnp4nagios-0.6.16/share/pnp/0000775000000000000000000000000011662503006014264 5ustar rootrootpnp4nagios-0.6.16/share/pnp/install.php.in0000664000000000000000000001611611662503006017055 0ustar rootroot Installation

PNP4Nagios Environment Tests

The following options are determined by "configure". If any of the tests have failed, consult the documentation for more information on how to correct the problem.

PNP4Nagios Version @PKG_NAME@-@PKG_VERSION@
Prefix @prefix@
Configure Arguments ./configure @ac_configure_args@
RRD Storage @PERFDATA_DIR@ is readable. @PERFDATA_DIR@ is not readable.
RRDtool Binary @RRDTOOL@ is executable by PHP @RRDTOOL@ is not executable by PHP
PHP GD extension Pass PHP GD extension not available
PHP function proc_open() Pass PHP function proc_open not available/enabled
PHP zlib extension Pass PHP zlib extension not available
PHP session extension Pass PHP session extension not available
PHP JSON extension Pass PHP JSON extension not available
PHP magic_quotes_gpc Off PHP magic_quotes_gpc is deprecated
PHP socket extension Pass PHP socket extension not available
Apache Rewrite Module Pass Apache mod_rewrite is not enabled
Apache Rewrite Module Not running within Apache mod_php

Kohana Environment Tests

The following tests have been run to determine if Kohana will work in your environment. If any of the tests have failed, consult the documentation for more information on how to correct the problem.

=')): ?>
PHP Version Kohana requires PHP 5.1 or newer, this version is .
System Directory The configured system directory
('')
does not exist or does not contain required files.
Application Directory The configured application directory
('')
does not exist or does not contain required files.
Reflection Enabled Pass PHP reflection is either not loaded or not compiled in.
Iconv Extension Loaded Pass The iconv extension is not loaded.
Mbstring Not Overloaded The mbstring extension is overloading PHP's native string functions. Pass
URI Determination Pass Neither $_SERVER['REQUEST_URI'] or $_SERVER['PHP_SELF'] is available.
0): ?>

@PKG_NAME@ may not work correctly with your environment. Remove or rename the file on your own risk.

Your environment passed all requirements. Remove or rename the file now.

pnp4nagios-0.6.16/share/pnp/documents/0000775000000000000000000000000011662503006016265 5ustar rootrootpnp4nagios-0.6.16/share/pnp/documents/_media/0000775000000000000000000000000011662503006017503 5ustar rootrootpnp4nagios-0.6.16/share/pnp/documents/_media/gearman.png0000664000000000000000000025357011662503006021637 0ustar rootrootPNG  IHDRb iCCPICC ProfilexTkA6n"Zkx"IYhE6bk Ed3In6&*Ezd/JZE(ޫ(b-nL~7}ov r4 Ril|Bj A4%UN$As{z[V{wwҶ@G*q Y<ߡ)t9Nyx+=Y"|@5-MS%@H8qR>׋infObN~N>! ?F?aĆ=5`5_M'Tq. VJp8dasZHOLn}&wVQygE0  HPEaP@<14r?#{2u$jtbDA{6=Q<("qCA*Oy\V;噹sM^|vWGyz?W15s-_̗)UKuZ17ߟl;=..s7VgjHUO^gc)1&v!.K `m)m$``/]?[xF QT*d4o(/lșmSqens}nk~8X<R5 vz)Ӗ9R,bRPCRR%eKUbvؙn9BħJeRR~NցoEx pHYs   IDATx]`UE>7H: E EzG6uu\VŮXVŊ " ){'@zwν$=f o̙)93S c0 ALrA `0!I~~?0i A PM(22իW*&1&./b'H1 A LlsIEB&[WpIkP b A `\,0 LL]p0c A `0h(M6x_\&c׮]r,x}?A `0BVZn˔dp&HA `0  Ub2pWNN\❠y6 A j^SEa`A `0 !KQq+nb6>B>,yGgu>j*MA.# 5`A `vz> <@Pi>Ge+5I  DEEQ߾}믧#FCL Ad2 i[g\6qD9otgPm(~jL\҆-3 L8.]J\s 2Vn]Pq DX6 ` ٴ0|$ Ί2."a*. a'JDhCό/(O˖O>rO$~G/0 <`^}Uhڵr`9QA dHIIaÆN~L܇w w…ԣG> ro6 ;QwipO7ۊ6Qϑ#駟No7oz뭔I=z:RÆ)|"&@ݧԓ5q?7*}OQQ!޽%iW|;@%e$5;#6! _7MV.$4^Ag㶡l?P⋅5kѐ@̜9&M$\$0YN1)qxaaWOi"09r$} -lB(WI\ |W\! TJ/[~קZ.| w;Aۨn vFᐶ-'(;;礵^zO)SHB) #(!n!%įqO=*,L쮔Ӈ*{2Eܨ۝m'/[~vҡxk񸂱Di#JJcy?BH`E)A!Ӧ7M#ϙg$ܬO /w|q@aɹkse NAp>@ jp0i?a޺)GP/ReB') 0%l-:P7y Z(b'Hc :c Xc~`O0z5j ~~ ݻ}l7&Co%s@S T ^=ݰahfCn\ ODdiӌ%PXrQ]9`>Қ,7Ӧ7Svi=T:1nZW̃|x~^ Kc,ˍIl?,^>z(5h@oߘ wD<[Ds;aLhz߉lJhJ)IsuwY= [lY7힡&PIAqh(z߲% ]Hs`Ԙ7Mv%C0n3nUOlL Qwc-P6.6h+vT85c6_˖)!v{ 0'yyxF[yD#Dxp{S-Zqaf,quְM!zj7U$Y+}Co6PW+ڏ/]& U~L1zPªW/U=pNMz0h?8/6T((-Y%T?5b$0m2u/x;k< zKPڃsڴi|&2*""pqSNhРA0C-b,TM0+JGO&a([3?8Np5o֔"ӻir@=sεWQnzG[ f^?vGm,sFZ[e&@᝽:Wϗ&&!06IYٳ챷Oدݶ4_K/r{{JK}d= TNz,.P`ذ`V`H0,.-țA:%V8G3ܚU yYwjJbժMơ:z&"p'@ImWMCq ?C&&~ʵ\AӀK KiWYpn=F٫="[HPfZb(??O&__y/'w>rzeIAI1KAy %n{)0,M4wߛ[[m?ЛoFg1PɓKCSϋ{Q4i*5ܜlZr9u\,s|]ڼy]"#%^z(9.6uIKhe֒?ƿbZ;68T4hm ~~Ph"ΐ;6j@vĞ: =hX'_OBBoQR$νd=R,tܐf ̈́2Qj <~7馽{ZW=|`ZA^#⹸D B ݽ{7/ye+o~.))hi-[K0NN7-[6el$l?O[{B:JKy$Eдis^-,9]tܸ\4jhJMm$iǽO_`!vwy8y[r9׮]K;%| .D`ty4pILEe聚ϫ6w& j;G\WWLy|j?GK)NM(~ҌTØ~7t$/x+z=BJwo^R^Ȗ3<;o OHN'ʲb,U-[Yԭk7/8W[޳:лpaRnqǷ2sexQuCkۭV9oK?7F<֘43kPQQ1 cq'>8:% O#D!K)o ѭ{Oj]+ĕcL$L~>tH4oRhR"M =m !aVplq/ ~*ʕ8>E,'CUNޣVMZ nd`DQpkFeڵo8(ꜜ\ZrŰ]ݑ2ehV襕?Sү\vIII)|q*W,(_\\q/ā6)}j4qW 9 ]JGY⊉s/2XX〄#DL>+fANRuPS"F|,RG8@_] d\("úx+(LjЋ$pO ן%6`G}L:>kVAA_\BhڵuI˓C _*p>:5ڐT׽Wˡeo`n`2Jն/+_Ih5jfvVeddh 8p`䁋ٳ5[kEj>B%𫌸XREB¥f#ʛX9" V YA۷o{Âc_ђ _c[n5:߅oe'.>g##lM3EX/(B%mW5DU&4[MڏdXZ,_Æ m6Vj)?/׸hȣиܸ\JNNMShwv)[7oAY$))z_fő X$ۤIر0]L ! ;"G2WwUՑӈkyJ_~M ~٧pBog}+bJm?3e;",]fϞM]yل Gy۶;S^(SߧO;}\mu8JoW'.vÔ[Ng 2rU?NEcN,J.ZY+w2@A[pΔ)`>}d?=6lX*RC穱³~Yu~:;LCX$nRz40ղF~~KCƺrCP0]v=SU*di_01DQl$KD/WqơYOÏE"/;p @ǔRc&Ԓ i=+f\W?WYeƫ:ZxDx9&ȿLo6v%Y6PJ_~9MnN/zaQT^L$)~}gYѫ$Ӿ};?X>Q#(y@SpF~PLMM/D RSYyz9W踞| TgUl'T|hvVھ@6n^ ̅6.]$K[!XiB 5I JKzf w&ĦIw nw)3#Xv-w-)̙+J$-[%H&_K57۪L.v4:rYpdM} 8Fԩt #{0?]^.T?ۀelnFjҴ"*:Jݻ/IUܚY&‚28 t=FSl],0]">j rw);ȶ={RnnCPr*Ldc_m׶~j'P.dlu`/z6d`tFF2 57:G;r9W,[\g<+/qa /TڏL{b'N{2ԳZK<-}\g8 ӥ40q&m4@?C!мel2>P||2?HZ6;?]zӧS(.>V?LTӦ}.ʦ-[֭Y`2W⮿x6O 'd_c^Ӊ1)8uza & xW8['i%ÇnaE\MHJʟ-gF²U< =@@` ~~pWHV[-'@ 0b9 :X`(N?Ɠzk9;9ylG5\p!+a~${ġY^,R4AypЗ}iJv1 Dvi*SQWTQEaîW%0A/4g8 R){;/O`z:]!G~Iy䑿+Ĺ29e9W>xrmF[Pf˥{Vr"syeq=}i9_|X‹h-Gs UYݜ.S=97 0j??,TXHlhiw3onӍW cK{ Qҟou2Co H&UZd^0po/u}ۃ Lʧ^EN9rfIǁ'QQQ|cg+OTNcޔVqUA]~0`^ถn B\6ڲ~V;Kpg2Uz|#?{Rk?jg+L<~.&0:kzP}mV,R55>1t7ES_ޓT?m[ƅZ,`ry9%w)^+)Qʎ/TKO<&>ep`[P~lGc;ա0m`(`-+*Ɯ Li#x|y3P>tXƺqD1hvq KLp.Q㈄+GCoS7V9fЄ` ߙ P%2쮙<"C3rQc}]9aKhQK֞":L꯳0wWY ؑo߾ ԺU;7 Wh1R#QPI7inCos`~vAmڴ)skt ?pʌmq&:5،X'OcgIÆr2ɕxo?˜I&5&M|nk J@>TSL C4&Zl'776m^OrK0ܵуѯ ['\5r:>ULCo =Bwc38fp|:j b7Fls q -]a6†m@j?K ;oF&&< !6c th pH4ǭOh?ꭚ_ /gٳѩ]P-e߻?(Kd`d)De2?Q0<>baٲ4)ed ؊В A@p܆zG3؁B>8/ |}Q>5%Z·dݰa8Ɨm聆s'o:ŎXHz뭷h b$+0:DY6z҈w{~hՕkl0SLYf/L?yN,2pWOoN2a24L|>e? ܆^1?TRA0|?V{哚@P#wd< nl#\أ/IaĈ_k垡\7$PA BVV^$'M3 4ha*8_6:OlWL8`l?Gqcڵkit8(QDx$>d BbnܚvMvMvMvMvMvMvMvMvMvMv{""ܩգGޕN] ߙ TcSbp1Pn?[!iŊ+hժUIQ H9M{4 qu+D ~e([<: d)X4 rgw&_hwps`Fz-:Co `͚5,M89j`c0@IiJ{VR(PK'~g2o!| CyOC9>`zp` ǣgchݺuԈ/5LJLf iטC}S@B|DG;`ԸqTL,@Ta-. USϜV<[K: 2 ~.Цh2 AdݬvW `T 8JxE1`i?)|xm߾= u/&H|}?_H&q m dڏN~TOq UE %%;ZUj$C>4mJ ` [q!LI)7` ~~ݷJ)) )O/|jjaڸngmks Omۍvn?zSNN.m3" A-yX:vl:#r^7 CGu&|t_ +UnT  ldQ',Bldl0Mґvz'AxD qX5w&z"qv .Ne53FpQߙ {\1;m];?B=."7`u< B((b$Nx]2T:vو_G_)G2~g2P7c _I=PS a[OCπBj +DFFa\ UG-G2a2tellOu=kDXck?H=1zKBRVz  s`nVɤ`/g۩:mBiۉb ˩qӶqj7~Λ2. V]<AiɺU"f93RlLzFX ?Tu|a5X{`lGjh~4br ,RI&! [l%Pׇ;-αw^f ~vwi?vbx9P۷233 5BD˖- 0,(h|ZE7׎ /ۏne!6m=3য়(;+p1 u0hܸtʱ.w 6Fxl8Sg[46=|GYѣGihoickצ^E2Z@QQ)mvziOG-g` k2˚K1xT%4 0?!O@ڟ{ BNvIQvoL{:k$͞z+?qԷش s[aI=@0@Ы`S%T1@cɒ y2DmZӭD^z)O3УvCJKCM2]C`a mt0DO-'X J"'OK;vlg{r%N<ߙ a/ӓ]` wP Wm8b6 =b_Wu'1r{=@Geon`=vX@ dxTL8x؈lzBq u ++-лc?6H{;~d5$ܠy0Y 86h<n6NfӋ/-{g6hڻ":v,f4KѠA&4_J3' ۽Xѳߙ d'G1Fi[z/4ڏn6䗗ݻ/=Ds|OYYYL5nn>7 4ljMM]Iv_;JzҽXs@K LnPg;3|Am /TO y Ν;)2RIlΖBTHσAg#77%R||aA Pr˯`0P\Zs' :(z!),,$710n<#f4 ת0z0ʨr3<;~* ^B}...rW^^ '15<GqUڞ~LG q[mHiSNK`l@e/6SC}aa1͞U@~Y&ll*UD6Q-p[r0e?rCCozkFŗJ(:f 菱t|(l0̄q_gI:cjztƒ0v&XI@ؘE ..3xJ;"wNB 'o?BsGzs聿yy:}*ZǍ+ O}EwoEv)u 3P }ݮf #ҠAfZQ۶mi)qtU86lp;b@ofL*/?5|[?QFEw`߱c;dntՕ=sGSV,F:523i{nR.+㯊*Um|q&+~'At-x ߠuk/ÜkCNS׷%fRzetm3>Nr73R)Azګa8 Si,f4>R$u}1tpWzrЖ{ FFhԨQ€̚5K$P2 ۶mc>vрD2Y`~K/Fgeb24,0@Tj b7 |U>!-Zx+K.6y.Н@2G2WI7q<'{K I)9qy$so#}L?/A tGr۶LΠēEuޜs87L b3?~?z{JNȨ05nu uFwؙI]:ѻ\$H:Fy'1znI9ԤI}z->}GE?#-^E1tC跿+?fӻ.r1KIOJ'/#oKWwmJW_N/L ьo~%t铏W|SO^xC=%NRcJe[/0_|l|7v0իW֭[3ϤcG}$'Vٵ;8iZ\\D(Vo^p:[Ū ~9C|^%@殽q?O_@ ]+tگ& H^:Ph<1ͤeKwJYgqӴe!ItEFy.e?'|7- 7~<=5nO×g5H.-f>_?M &&Lx[j_BӾ\^{WEW\.jh ׇfÏL 9mhw3`Xxki_Lv[nL;m r Ie/3i/Ցq+Κ, ђ$n 3d`:uj,iOeFo}2cY)xwk,}xiryh^j,oH(+Ka.zՅt]iم6~ޣVg\;w&,=Z H% 3;a)q?#;J 9oc̘1M%O];~ֶW2xyxdB3 ]c|ya?.uŪw;va\sy?$޵לNiMϦyth.-[v'5NU80:ҵu #_3ЖT@hGsY2<<%Zͩ_DJ% aJyw7^If7NN챼{ذ6Ժ3:3̣B}x_w]Jm}eO̡K.9aBIO IDAT6dp:L=:~|wl(ϥ<_s;4ctYg̘4qs}M4JL# ׿_+D`I3&1OytK`.3Y93 R0λOVc>ߎ>%_iz% _Q*ovΚ'mifI@q  F q )~0?ę1crIgܹ\8K&`\q(LqөUQYQN=Jvu!LߝL?Qˊڨ˘j!q!:r$F ok'$D1c0m'0v,M*2kn'E֍ ѣώ wjc bbyQbAᕗ/奆˴utO!)]Ytj yI* R&%:G_~2LI6xב"XqS$> r ̞~%Lo @֌6o9 ZXfce!HX?O'.#̠),F7Sn-M~bZ,wqQji_Q^8,ɥc<чŢ+EJ 0 |pWVv%keh`'I߾t{Cֻ8[ar2nG1bfی L 2T)n,o3W| Jb(D\gQWYA~vǯYǸ!j\'ԯROT5/#H%0,Mo}O 0a$=,|{^=v߬5kp9tg.W,s!C: 'ڶk 01{͌ ̩04C.>3idd&:/6nIӦ͑0zd }n I9N 4Ȩ1ZF]nq6x譊+$rcLWa<|JQ"ݎf^?x/pf.-]e)4%;F'YTkz󤂄w@?hZ/;"$ɠHoС6 W5Ӏ(n7r8C_0˺kuwߘ!y ~z|1RS죰ECe-% eS4gD݂yg?U Y58:U+P9⭡XOcqx8hhϧ;οuޖzE97Ξ5U:)w04mH'r=ʎXs^~xHp+‹^\y啽Ow܌:J[>])osMގy̾Rlfpy1/ѳ\Ly SObcto a%":̩L3;Ig%p_;xP>SLT?z> ƎTKIqσΞLyy(/-fxr[nr4E@ʗ0S^]@~G$ⅷі%Y?iv[=i?{=I>-c+ZR>+9K& P>O,I=`G %?~MYk{)21NAŇs%ZWME]GiD>կ|`bؑg`x*bǎ޵ek&߻+$zImc4ݬg+R( t-:¸w*20ѻLtpʥ폝+~#STkQoO&gL)2|VKeDQڷw29:eE8K./C͛'k& I;7UW]?ǸQ)SҫjߐD?$aJ,ELJ?_-0wTZ+^\H%Q;pSLC1ׄ=5r<בj?wzk/&FtHh<Vem)|0 8xRAWI&[bg)IG>-k*Ja{*$i09p׷%d G<͘L v`kme0P?d 6Z`59~!iaEz) 9C鉴AUZ&N]IZ4Iή$`N:82-[C#ܹKX!6%ZqQ opă, =>܈?H>`|v2L`$@C** H1\W9hjW!`yvTSMg i mW /o"KP𓊚GK ^jJ9jWn[ʠ9`.5kֈ|黼S9LN:&Z h4X %6Ut%;pSچ=xg1LFvЋLFg~BUQ0H#qu ^=3phEw>;U,6oٝ/JJ$FY00ږ[!Lg Ã[l#5?fQWݾu+j: ڌ.(g3Έ$I 67rH øı uYBtt‘&1 SAI3~g2ˍւma8 gif@ ٰ ܈H2NZc?W[_vSA*4kgc `2 ߸iӦrQ.LZ(g}x.F6X\tJMLp{[{ҙgz; Lx0`df W2*ܚVK/s7 2׽72u6eLD'WhP2`s.-[&[[mr'lӶmDG̊7Fݻ%72j l*`L?p Q1$-ox* "e;xMvjRxSADF: `)ٴzjvV Y}<FBWH֣RFܽe t*јqO~ҹJ+>)MtF$\vЃ0> |'LIΘ|2I.0mҐ ߙ LГD\#1+/=$86Ŵazzw4{RaPAt=(yR |Ğwhֶ zaʵiϩchk>[xwz&{fжKpqUu)zhz31zpk&t?-D._KG+]{m+Z*jUP ځ/Hzj20ll<]zVG5MT'ZFEQS̻" >~6ڜK[讴lDꚀܻPϖ7gҹ'tӄ),\<"l..ԛ:_ {s*ϥ>J}/s|#IKiHU/viї/KFby$Vas7wV~M-N{=FFWD7 C?ur6qWG'[;S61Uk5I `0dz9̆b& P ψm U$ JJ#թOѰKkX , [饟nI&Gs)c;SxȞu>w, R} \ţZ~qԡ{45Z)yYNHT4.Krr,%%9)b)~?4r4g{ ڝ^,c3Y\ew\R|̝ft|USX# e0~d8 0AkN !g˪Txi^}:OL.-O~Hm6ѹqPМUi_JQ_Wo(^Xl2ulIS8ÜG|%H^y9tSK߯rBGyhIܒ](,Ɠyj(W_q& `0F.ɐ9G8 %YwDQbh}y.;2!tHܕhg&Ͻ1TB]ݩpALFe-JXoD{bc}[5dswKG O^lI{)vh+._e^ˣ.89 se~x|DZ<oHzG`djԯ-5ؼ6's>ܳ5y9Ǹ\AGg3@򬩟ʶϤc0Nc2P9>Xd._u"ŀÊZ$@oUZV臍B[8LΕZYŬ Mu{(}gʶLo/^K;-o}Q{(%B?r$}u={6m6\~=zAwB=ZN9ҥKO>%AV<Č-n$7!<L5Fk]BaԲ֕kOLI @UڒPvXF%|KYЉ&`8;4jML `@L-0E8" ThQu`cPenrn `0|\w b,CBv .x ie M=FkSHvbkЩMb!I͚5H NV~g2܅+anB-B )`c9ǎ‰­M0ЛICгrjוmRxΣ3iWkhN$ښɤh,Ԧm*]2aTu|r`Qan~g24KBǥ qGىzԘE- A1Ot?0j7(z]َ#(vU†2d(;&(̡_^|)~Zߙ T@i-`9c avå Sͤ^Uۨ;l"S:nH}'Qd,*W7HiC{֧cтҸoҫ't5sXe[XyXx "z\RkھGAJ$RvvE}EFPdT5h |7~gr oM/,1 /u0_J?7E՟ADŽ8GOFKK/l]d솵 58x,}iPfe7e XQ()>Q&oM .ɐ3wAJhΑ^Y(}6A&qAQ]=Zdg<2r ;;b|JJGl\HA pjGã8TTT$ADM\"~H8 y)ggKЗE9xp& }4,3z(ԇ1g=HN)`0:ӎ7)hBtujw _%ZvX:6mm4B Ș+ ʱ7`2'1T_T0cA?f>W4OMޡl2-?KP[[LL) F8"#1sƟ)-n2]~sץC#)"E6taT @ 967u8g\-hIN`-f4`t6p|cXK|<(3v&6Ӧ)t6 ȟEpLC֦,1_D@!"1U~,>}YfxxhR@oo*+#=)'ԏ8k> atu$"1#CP}Ȋ.d[1j۫5uV];LXAu~DvI4NJ^^ 3K} 3A,#)&DziAz-AX þ:DWk^7o.ÙgNa7ڱr4wn%2!|[S }>mOdWW5'`%-vƨ5V㨥rGLd&ؖWXAs٤[w1޽ S ͖^o4x֩΄\U iX#>X,Iឞ# g=ǎ5ફjUNǬ+%D` ,[ +lD&>:$)Uh:}D)C"n]܄۳8ͩ-gz^pQ(+p[l:#ЋmǵuKfp|2ގ^iŕ0DMݹFI}ME[6(c@Zj ne]v>.SN÷Ę };Zzp@ɤFpFmj)Whs+H 4gm6Moޱ%;`Cj~}%48Jq`Ӓ23yJtgmc3ը/턙}Yt4#/L|j=RCK(fQκ(Yk麬(C1&}3⤠|O>" 6/JF1Iّ{~{ R:\o˂>RI:I#``n!ؖ|v+L%CϵR&fMu^32G<ނݨcyksFp8fJg.gxi__RF4Vmmk1?&ͦ _<"]pZP|q_S#K6K)Q!y^F G7r=_U31&E 6y?5gR!H'NJzYn6Y"g&۵RmH5h Bכj|zaۛn%hhWR !?3 O?{\S;Im,KߧI;Bi[.Efj 4AׇsЈ AmKUkK,x/|qμyxۍ}IDDiLg7͖V;"Ie t;:jgtI+ cv@^6`X- ?25J02Nh O|ͣ`Q$`RLd8B)iS]kH)8a ;RHMQ;b. λ=ڱ72 є#`2\n,o)mSc|׊,[=! d`dXczz$BQPP$$`fk޼)n6ԸD6( jI+xieY3֭`1]q'2Ϡ] JUs~B3x 2 4^1tĦp>0Fp|#<;c%oG9pF_"YH2KHRwCVwR bNz%,'QN[=zRMMd12=ORѽ ^_ !>r3?\d0VZkN]]9fA;v|( .vhkɆur9bioƚ5k0}t],,,Ă z͘3[c9`QEۻ] ϻ0nl[U'`%NV,B3坚#Vǻ>KdxhO?_!PUHuU-HKL}P&3SR9e*L+IQڐ٦ީÆu@>dB&$yʞO0O78Qx9#:g!&Y\Yd/Kl6; -c'g t^Ӝ,x\wE.x4|@HkaȚOV6Mi'c۵ػ)Ys^*mlt|2o!}#Fcp9ȚOwXX#%4a8v)qNe˳sm lliy{Nj6 RoJSfbU ʙ/rA} 󾙍r+r|B*+>+Ud\WnLJi29Xvl^Yܲ:mI<15-o&f.M2gD}y%NAtи?c1'pywP7q7uVuxܙEVy.Bd@HR_ K2+-B$,Ř>=\Hh6LJ욗/"F⭤sR>?EW[x)3Zi5u ݇nJYei =n /O7͜%F&mA}Y?%9tc h皳pqQFݴc%T0mjIxVLʓi~/MŁ))¢14,YO!9=Hqq3#$g.)9\:W;-Zz6,2E3#aCScf;vIʞ=%3"&-@bb3چ[PDaZit= Ꙧa`Fzᆅ߿4iOoxkwUPeAi== suЇ 掫Lg$ g' uc `-;ԜEoQ ؏MM6ʏ.Ƃy0-OD8XRM2u4 * |2=GDT|B L%b94 Ggklp+ 9>l> 6k/Hᙨۇ M>܌0ߋJRԃX#~>??Y&h,`j ZbMӔ3@&uaI7ڪ!5JƢ~g29ptUtp a.";%áQQ1gre{MK_!3ae׻݋p)v߾jDEEґf|쿎h>"i$&j3xB#F:бfzGjXoǩ/h?G FNNpH^D~$`f~}4a'=Wu~Q@bb#C]7P\r+`sll`4Z& |1/>K>*@FF,ʌ E󜌱)˵tIMOlpH2d9 .K]4XHCјG?c|}m?v~V9ހ 1/s̚XEښAǃ;}no[#EFeϑZK k6K1~XHdF}|  ϝ7Cl,kX qo7.ւvFД%0Τʭ-h&9'a߾Wc'dv <Q9}?ZZԼWJ8?+1M>F;QZH$P5])ZLܜ:4  8c߰?tIX'>) 9WT";; ?9G`ߙ T/MHB\gSPD u¢3ƚox_I9G&𯷷N!0#a#i0 K00"q`u~G??/]XBה2 մ'77~#&`24!xə ?9ŧX 4y&'L,4:fzlذ/zr.t6%QQ!]$:DRP0'd& xG<ƺ?٤?c~{19Tt6D7ƺyT'@_ [ %txկ%'݈d/%}h]" I#rpfѧquaxi!Th tqjg$~Ks5/l'5z[2?(32r^#vTU=MFR5QQOc{5%2LK+\J}͇> Rw.-cK:ix>d ΡN6Ա[ޮ!媓p[rsEa"q#qJ q7羮z7b[|G_=tAVm];)v,5HFEUt;f IDAT]SSh:p^Ǫ~g2$/5Y<2j4szEO&)z?ڎ7b\[QنvVxe zMeaQQGutU#a.CLXfJŢsHa}`a{ixfh@nSH>xK/P8l=\ ^ph)o~lTN 2Fhb0B[1"L#Q(B>N3 Q oo[wŎ}hg\\/ %!4(|ptEKu@LZm_mǔx$%}/Ih 𯿹ha *gҐ"vPM&nJ,`30vQ(x.)*&v7@ DCφ2|\@rZ"~G U ;ph#yc9.dƄPULfV ޯ?])lRtqqq`xPd#ft SxC.988%dI+ V{5(zG(&tZRb>@&K,o.4Di'ƜY,}ƷI8P> 0:ԣ1`7F T YbƽgCtJME{Q :'t*+X!p MՐ6HfQ=rDWz?EͣSԌ;jnx)ehbHnBHlX`ɝ/g &GOzڜGӛpN~y |]^<1pi 0PBF~" ?N3ޠ~Dj[D}A[z[Hb&H 'J;1I WۏQ_dpiqw#?6b?`pųṗqis)z$?9}P/^t~p9N0%JiPw2F "O>2HۢE8Lkm4G@@~=9_sgZol# ч8m82Q AX7=9.>1fԴ"3#||ҁ=$x{}!.lyv!eK3E @3u !%*U/o~{e4|Y"&$.#`3TPb<sz\g/%6$c#菇no} rrrɾ#. n&$*D/J206~Y.fօa8LCW9?=˴V:o=Rƅ/ytCB q"#hP2 AQLFA3 l4/BI*C\KNKlxXmb:J2@q8A# vsڂ8r~\|;Hh_S$ȌoOqǷ}qx(ф$,TPJ3q(\,sq8x3F?s<./^pf 8,~&W:("=GGy1V7י;քKFii V^M㎶vZz\'|W\qoH'KH$VpC&6Y02BA<9G\.u̇t*zg8VD?8|x'g}V4wDeX+~-ēq}Bb"O{I i,OM,/O7P\Q'<3=s4v‚xѫlڎ;qw+7S>,\8%}!|xdž0GKzZ0WFqin=>qmG5 t6]qc׻]3L>K['QVka 3P;ׯ#{?2Gw{g8g[=nO:GwgI'=nֻ=g-{ڞqz'?Y1}tq /(3[l];0{N"fȥg7.VrQf,* ET:Xf%iF'M`ǟÊ .PH7tQ;3>G3q ɴiY? 1p}5zV* ? `?,AMlB Xl2J.8jg"ymgrHodö:pA HJEFz"1xĠ /~4"عs'*)0yڋa鹓gF+o CdT:;ؽ{7"""t 6mec,bLbsDxL 32q9v.ڽ6YYY)_ --)L7(R xX3q>L3zx?,rΎvZG4]\ 18{Օ$#8[(::3gebǎЯ2qg<i{E %q6ݮ "H#6.ŊptfO FEʠe::x~c2xt;}f"w:^BhX ?=n=fz>K$#+ӭaJ#6[[+dUh`ߘ(oߘ 8Nk˚ֱ@J?qgz>n=ޭ~wޭc2z0 몘R'-\R6,?q9[d0s!ns;8 tKqQo{7a|NvD{Ͷj`j}YxsG2~I0tp}$3kcy3!$\IyɟVixڼ[{z%mԁtF4ޅ{ קCZKI2{m> > rOMI+1>5OxFIO[gi<3{sKZ}W0Ow! =1.J%=M?-{ BHCSA@ f(?A)ɰ͜Qd<>Buz2qal I'ܼRqYD`i+; yF8^pWe6CkONCZ*qK!:ۈDg?0aH&C2ݝm𜸯`2IJ x IK ~H['ԱVIb^VU`̶ ƢN23` b4e2< nNWFC,m۔;- WFDrLڇ0j N'xۇ$=^ = fd4̹y ze2,G٭WD<)B̲!N'Ĉs$>CK1\qEyϽ/q2d\f:,$?[js&T]8 G1`/%zZhzo۰'tǎ[4d0$%'՟Cۡi7م_ط8&'U,kzSA)m [>pv7?O!tlJ(Q)].Z:؈Rubq?t7?D92_Xs,̿ߏލU&[iVO>tW㨻fוWjX}s7?/58߇[ϾdH[ȓqoY%|U8nOiM-/#c-u4;5 A GuҶVT2}(_*?vѧ^?-|5­5O{䎣}왡iwgn@V =7(-ׇ[JXr?n:ף-!CL8t<}g=!ı[>ԅSees k(zoݺU׹S3O~(|a_57Җ===(z/*_Xg I;pS1khqt7׿M"tgWnV7Gm*^H[-zQ/4 o /{~|IVF[>OmߌW]Q9!h+_H[X-U܈5!-RdC_XA;8#lL[1m{WPOޣ|Z~%i 78n Ši -_ȷQ/j=rϷ⥵|?Ю~Mq0~.~1E(T~u;?z㎯`Ȉ30i#졏Hm| cGLXg| inѢrra-<3?94/,2 & (/6$6Or9 "#aonGhl2ނP3H׍j-D96=#ڈ=Y䑯Fo&RVpuh=LYUD;͝6niDhTRߊp|ːp D;-_Aۦ&К)_9 m ! H2S9pfWr @DRnXfsFGFM.g\xn|#E)߸/-wкڏi{:DC;In>_>m6yWmVlJ/3Q[|Sn`Z| g"rK7D==DnwÝ֜:s/ei&;{`|g'o vtTX!BₓmW/Lhޏ)_wڨh&I9 Zȿ=#_ Rr+W4Z3D-w1m3~r'"4݇9:91t|0q8|&ͻF]`@K3;iԛ9_OZʣ v/sT^]h@K+D߁W!nL;h\߃G1&=$ LM?@\6A#c?FOEȻ/}*kq+W<-B.{*+WinR ,.'-B]ܘp /r_ӸOzJRAJ~iOHN~>ynmІ[A;cS}ɧ̷ڷ'S.7#纛 \T2]Ę0u<7=Ȍ^"qm0*M'ceoM2OuhkL~k=].w3,WMQee.27&ߣfSc,\d~EcϞ> s;A_Zjr,ZoҧX'㨥/Fnb\q4ccN&4C12>ϼt/bf ]82(z7 %g4diFK0d]&;m/0J66g;l,>ˆ`?x#3tfFJR_ Lla%.F N` |f"O?EA34- uwobVoJO6%?#9OD*: x d0``A\W;wZv‡6ӏ =>zO7O14*!I2xbJcl{lKriFxK-l 6,8?9!hH7۾8 :٥#J:iR}I'm}/nI'm_hq$a%}ǑtևtFGI[[I}I'm}/nI'm_hq$an~aFB4dO}A դ#]e 3o0R!%1W|>Hf8y'U273|7:O>K[f{ƓF'=gixlxY褿g<,mϛO>K'-y=gi{䳴ezZ}.m}[i{p=> >ӭOC=idVGK[֧!{ڞ42\O#åtӐ=mOǑևyiՃzl~Ͷ>)&0uJk2-e+&#bAo dH)FhW+u6|] )~e2ĬV3`n\@?jJjąH<&ZIY.L;R+&u[1301*R"Dτd&U(fc li8>C㸞ϊ߄?ApT$.„+ ů ʟCkk==Q3" ?/<糌'?}0.@֖`XӍL=>|8ّL `d ,R{T\ ~%p d` Bۧv==?5Q2Hf͟઴ >HC7E"11lŊֶX-MٙИ^DFFbcW~Sd0̝ԱN*2b4%?[.Gw q1[!""ꈙD_o=qhoP[t* @G~c2xGk:AB Aa\kJnO>SZW80Z466w=/2.]*7I1-U AZLMSQSC6`&7|G  kK%(F $\?vL K#ݒKgͷ, }sscPb Ss~J=x)eO c/AK)/vW&?%jr"_E q4&Ly29Xxソ5\3ѢCG[[xx^,hnjŒ!&V n>L+XR g̅עxt|QxDBџXwPOܩ@~N %So8yG+… E$f(jjjm`p8Buu%r26!Kҏ}$HV0ݞPT :(N_0`pOU#6Syom#m|1іI?]I`m2y4}*ot2#)m"=F-񒸰-c7l>7i/ <~DdHo@+.Ҍ={ ^b\NRNb Yr@㾯Vw/8oM+N#&ւMԼ Jd0ij0uJP*8@7_ kP0)hiiETd!-Xalr2~!oՎfܿ<ɐ&%UV, 7hPOh2<T?uTu*?!͐YH] ~noo0ޓA 4яkSE]x9ՑV8 .ɠz{Jy }_zQz[1alnO)zݲ?l@0")ФZI{vkx6W[(tn`0BCQ骀@LhN J [F3alnO)zݲɰPd$Cr#Rz)Foo/`6ux-`͊ h%U;}xa6n7:(+ddcUMB`"؃s+J)OƈH E^߉C` @sp3KGއի_<(zòg_OI2NJE>P }:<'QJ}`6 #ɶ1;ӷe榩$!&[ -YHĠUKJ;V( |K9yd?ۊ^_~"å-H_`s͞u Ț])lS hN@y%#cKj0H+"R+ZZ\w ?)&"HI.O0E'v>1F2JW'V0~1&[^%3uGpe=Bzaf3(kݏjdIxM $&&JoFbQLc2 JH!0aPЄmIWƮ lx5GyEa?xk;ޯe!:>*)@NJ(IFp*ڒҾ\f=ĤJziغͨŽÖG?ɐW8TI6Q%9 xW89B{Ahq2q-1;SlY4t'UC}g3Uc_ 1c5ߥbcX!/$D܂mTF@O ս ";vrb 9lD Kwj:e%ZkGsdp˯c*BoB`"gGY>u+ %]L I`: Tģ@W[8\M)O?e1~P(C"ފ :ۋyDž8K73$%eqŧ#౯b'-Xc$',T7JqR K&E3{%I9Vta:"éG'IE~Wt, ǝ4jT"kn _ \x Z.OU$kûz13?i æC7+&?]ƙ_ g.ʡP(gLBsU7*V:3]&N$.etl{b./ĦR sx(rOòd:nk/>~ G0Q;4ĥiomghC|Z\4{f[b I8;%N[z#Z`E()I2Krv{.iWMh(tKnD|׌}ybPՎJjm"}['cP:ŠOw~r1\:"sR NRZ wV.oz/LKIZb}I"༹mw@t\m ~EV S>0>Gk<ޅkjhݿgޒ6DzXށ-Gxt[i]@1bSqhy S T<1=9/⑷P[x<؎iKV6gوocX\\֗PU0 .Ҝ$Anm"iE󾙃=m*g39mZb(Uܣ1{8x׌gcSܳϛ;vQ>^o/xG=\xgvnlqNFKr<; 42/Sx` u\NQ;ϴX#$<ئAz,v{K3018?{%]!hs`1#%;dQ|g$$Z=h`cOLy%$]`F|g3 "៥L*C:^*Xf4waY ;I%D &svN)@Mՙc5~3%2=?Iz){;ὼ|[]dMBBtow{3LkIزKnO yb(jB@!Tx[xcQ<?]#0*siWI9wQSc=DDņh=HB;WI#BIG!Q(U [)bJViv~n zi&J^)ъO_ɦg8?fL|5Ջf`xއgkKBCϗ}.ᶯ+5\}7#eF%uHU @0!0ef,6?_yXJVof璄ۏ *:$tKhF4.Q Bqxtd11Nř7gՎwW"zzz1dkyO\s_!b#D {v k[XO#eOım4``U}1({+?Uw£LXr]XP1}=d߄A/1%ťRjw^f.MƂq/ Oϕ'_"$>+|vBe7M敕8.airw{[ }= ٹ3z9!F覆Յm۶SOEdog( ob !spe@Kwg_yK&JhD8 . ls&n6̏%#M,O,6mIƥK!x@[`;ZzD <3.X"W=uD~,UYua\뙴c#%/Fq[>!a\zD*dȳ( |fy0K>ذrmd\3= O={"Ѱ9c֬Yvŋx%5UB @0!0FDِs !%fjg99)UScDdpC3Ic8ej-CvJt$~I KmE(I.:܉oi@ |F5;nԶz̓viFI31fЫ "IDBI`t8͸ٰ_1:|W˹T=馞\7V~:{23RӅ3b|:tkLw=f4XlxЕn '̘oz/6y`99^i3ފJz1`\84,)f#_ٸ1R˂l`#N=f,w2" $A8h Ad[ \brM?fyЙgkT;tD!~42&tϤY9<kopvN㦿! c/8{ i=y X I ˵AҋS^cT IDAToe;E5Bz,,9¯6Ys$cԷ*M][['HR42̀وc I Gg-b[+%I2,&)Mp `0ݎ5+GFinO-b7MYnK-(=-q(sO&8Jɏ/lR( a"bsIŻ鷀:m`ͽo6iUx6@|!np}_= yǁ B7F ^fD3.T˻a^bLq p;VҦ0-N;](&#[GM!1=_Is"|x&"}8t%HxƬVTMU4X\=/V|:8|k91GOFniL^uKS3HbZps04s0/ 9a͑DWӭF[*yȡPpFSbTdް&!]V!CwG1cuBF#BMNzl$c7megĀ&E0 K̂c){2THR3^SLB@!0լz1bչ:|M:+`]kY9Mfom]30-ؔln&@B`&k3?-*:a8??*= +V~\_\1)-kNY5!5ʩ b< ֿL Kvڛ; ct}e0iɬr'r*cMZ:L ulg)y0Bʘ~5ikDtiK,q4l~92:ᴌrtK+-X._9L{ܷ2S ]Y-<ӭ.}ޔ!:+Q;wJ,)6ypW,ῪH*iㅴ(57V#AWQyYgVmo:-a`jǃ4Շ;E6M!iqb@30'$,EϬ :T=d>z̩ҙb2(B@!2XiW?#Lں7?& -Ϧ'58{)lҖ͙KStvC;,Jp늹Rc>{Ε?>LK?'%e7M敕bqWZ4t%Fc K(Kc*f)>;q32hk#NR`2N#fdzfʢ2Y 6_q^+rH}DETgh?ä۩8;Dt\NV$ 3aQ!w" ܁2T=amK~e`h] -D[PJ JZ3̰6Xں_(ÚN* ]9xnTр3%4e4.i[H2AMXnjE2)Ɠ4oIC$%[F""i`R*kKb̼ҁ\ +z sǬYF .ڵ /FdrɨAR(#wA+tTTNLvQ&@1o^)m,ʺԋ.=8wR47z_v@-'-r^[`7|3(L1F(?B` E_͋ob+U]뀋hr`{/ػFn,Ğb%v{){5vQEo]Au۷;;eΠs!Kr4MJV.|_$> ;Z %2p&8!W%(r+e/<9;|cGEp,Ѳ8亿g#/l2Hr[|p!vsG 8MA-pO.d|ט#p82v(G#p>} Xt0͛ &}9æ<V=,Q EѴ"FJkqyWg(L1N . P0-ɵ5K'ּ@i(.<+;gfGP}?g7 Jֱ~ Ҍ܃G h%[w6Y6=ac])JԶGn`q7n|"C?$-p2G c3A'VE3JBOa޷\ڊ/J3e/:%9}$dj-8zV,cryvQvſ]{U5+;rP=lI9b?XFUg!=ځ8Qf!CAx|%{AyNTBoy_UK!ϔv=NHE{U$G',1)j>RĄ#+4䅔%8(`";!A/82P˟G-( AQ.oȧ_J$AB1)ҧ""F) l#:詪 ȳ?]3ml)i0Z VEt.`11ri 5Q,šLHoƆW6M3hS&BflVQG4X$ɉr ( 5=Z9 S %eXlmZhS"cpߟ)UK=͋>Oƈj#1*|G#0!Yls.*Z놫Tocx6|^XEvmOS6Swc6©wa3h}k6[G+bvMeKQTL%ƚe'1{[^W]X \+JZ;S`ШjԻʽg`O 5t"xv7:X UC|岰ULEˆ֍󧊙~[u:.d<6+Ni*cVA+,%&nOGoƌq^ę  ,`CAKQ(^`I*!搥 Ob*1`LX*J6N7 gIo_(N(edv!g7H6j"d:D?ĩ1#P(lh&ţ Mdba%JƦ3gᗩve ƌZ:wjL +Tٴo:j&fa"0ın/tN4Z GjfNG\Y5=;~QW\;Pu] XG5_eX15C5i W jU2ݭ،:qߣ:wIT?<,ԱkFh<9K6$ $}qlL|3pmy4J{Tlǥp,+v*2"Hډ9Sc Yg4cOq-a/h^ m(GX9&pSﶠ$-AM$텱jyhjVHi… 0/FDARB"P2nrW2C7Tʫ׷O~dPH6İuS|(P&ؤ}:r.d_%AM4-*hb}鱪sg\^a*deI7qK4hN -M]kUC䒽~ټhSqA;p̯Y:?P6$;`O[k;`Ygrͣ{8HSD s7!n18%Էr-V.PvQz􀤯-l=JZXXl t9%?ZE Wh s %l=~W6GesbNP[H\k˯Ņ}6L@{8J>JjhZ+WTTuy'cK/;V:KOU8zE 39`^H%2I)rk- ;#{Y@6x}wo=CCԨg8~N Si%Ez*ajUqЍmsO*i"guۅf׆b\ {Nʅ y k !IPIeС|Qӵ(rC-z({/VoPNɧ2V%i2:VJgm: NhE%hEeSNt06֪!?5nS,UL{M Mz~O"=@Y洊Fa`J^YT{^#p!#:zׅ*=ݺx(D50Ė]=OR8ٶvֱҗͣаor_NiǹJf4(7)a62/yZ5K$IwRZ|0EQ Rb Fݫ5%ۧWĩux<=5nl.V-&dxO%O(qJC T{ aԝݸ2= ee Err2b1iN3[X/ ]G}B6!AXnSFQ[;+e4We8&cw.{V%/G2R2aQ>ˤal*M4f脩rFu= ӡ\G9k]!xE4]^J LJf>G ?BF.Q7Ɩ f<0ӮK*T[#Kk)sγ&(bP~ -Hސ-!C@;E (KJHLo1Dk׊*[N58̙WP\IV)R)w:*j!*N{M dq4!FyK~ R (@|`VlIZuz5-9 WVWsAHYI$;VS+a2vR[p5_ޫW-@]jֶ(m䑄5|A*f[nM4WFllPZ898j-&L 9ݗhUk٤4qfZ3z8>dQW1xӪ}+'z$NMcC~0CŇp8.d"8 ê>Z"Cڥ!3Kg0^ܻiYA]\Q]{֮+U[,ۣ 6GAQJ"drTxR;/z f¼eXjQr OiUp8p1!*1k |PX\}jA$*}7_'byW  MTCHKMn¬26m-hq:i8h3S.gd($}hGb'k؉Xku\; )V+W,5Ay9qm'V +tɮsdw^ؕ6ii&u/SRB(؅> Kkt+T{<9@A@@FID\|UV)m wȄ$p9G@p =Iq8y;l9Cd%Ͻ{p8" p82>k{p8" p8_]\kSGP o"0 5(y) p! ^G#;;ܤ7z'FҶ7xwedQm{WKxFXB IDATUF.`GAM Tff y+2]N#...XJ" .%,F7n|`niﺶp,Jw= @>j2I:#FBM0{1oabb!2(kK7QQx{gQ *uqͳ ù\+g} :LUS4 74ʼ G@/- Qz"e}k솪0?bscSUZPy\bÓB4~s!#9!ЦM4k6F\(ts[.cJ tADVwWxZ7sBa)o0a0yC>غu\ܱ{zPi4ҀOcQ>i|ml׏c(Zdw.!*WaFXZZ)na0yC> н{7GZ6/l3K|7%IB!XIx0NXjRd ãsQa] lfPVaPyc>`a.^sDĔzϨ;qpQ 5N 2pC2ą Cp`?޼yHόXPPڵkiP!~xyy cll wwwXXro.dv8#o"66RzoCA.O C D"DGGaN {8;; N\04=G  DTsUx |:"ï@b)I2&4^żPvm8;x.dnG#[qyܸq bxؗ0&F02'I3]>ˬ ]zn\?&L~Iy5$V$abB,% R2>MW/ \ËIs8GΝ;z2\˚V͓\01^BQ?9Y UCp;MĚ ,$fxv!Νu:1өnpޏ۾x"L\ DW祭qk8{ZVBp4PjK-Ls(—71x\0[˱D2}u/0^[XfJL8н :]5Y\ZOִ0I,&/#arX3E1Av1,amyA@"^&&&F6=c|ث3^,6vȈ?d(ߤ{`J^jbi3o{AZ]5+]2 0HR''5n%bae-5=GJ.¥ӷr/x:XEhl:H;PwcbԷ@;i6]ŒQ'~󶂇4[KSt/x}lE<=xp':7(Ym{^.PEZe $] FHVQ1;L= ʼNJb8=%26gP?XEeoTFλ}[5B$r -?c &ʽڹo `,lf{ &d,(M?IQ!!!` cdo[ahpaר<.+׬WEhxz3*hcbFػjqΧѩ#صT2vEy \u$>Zj^3@c:'8ĩxzia=~ &4.E\[FgUE^^;! }_ԃByN0Y]AJZ 2ֳ /ƢEV j@Ʃrzjs9\dnG2iml`'U[OIZ{aFPz2Қ̻~D&aw0[i?mk~\!("n4ic(P2qogxf6Fk2 ocD[)n_Df:s[`6eTYߢ@6 did{`Ywj|&m? UKN"}[!!KLŎѽQ$AldN_M@Q B`ʑWCQ%%n|C0I8V&"Ȳ7P$dus%?M*;Kخ"zj#㔉P,q1o[JUbEuC=:TPeWmJ凵I0 ̈]ݡ/DSeN#A[yy3&CԮ/OYSؖJّ [ UjoDR1G K+Y|``}4)c 1KN@,$^Uӗ̽4fa/$ ?3Б1!6eˆ0F&0u)uғi[٦?͏9EML&)1 |o:`dmc.ddV!|ZBɣDXW(oaf1o^ U3g~dMJ+Yh's[tˑx~g OUM E_42iLeH #vf̛'hSXػ;n\=!C.R^ X3Ԛ| :&Q|r\ ڼO.( .1g8 SMiJ>SMF4 ű,f'g#ǼM1>2m~fbsg|jG5 nĨNpibZQ{Y1G-AvX5)n'ljSŰ"mG1qyY Y? &SZʗ*T{aA5`3@8F@\\noRa햨C wfaɄ游jfi KmOѱZ{1pC+֤up &t.) 7'zaM(]Z4|@l)kEDƥ[}%v!"/zZ3򉉉|2V s\,Vo_䱪vrw Mnkf2ffg2` "Mg)ڝDS'1Iz2?fk7{ęH=o&,J ߖcyȅ(F`ݪM^?KKPѺ=\ڪ&'_h:i*vw8 <~1l+}6 [h XA֓AhZ z,,*;)*T-Nv1?KImP!k33f#^$/W}󐿡ʾΨI;\ ~+N i|͆z»-=#/@qt~;??+MpPfF&q'.D^yRj /PR%8d7nGKvC~1J|REP-EyqBn]rBKC:z6C]1O9sP{+'UuM^D/PS*:F;ɷ#i!݃69ʳwUID]7Q K,<ݭ`R%H>v5yC"^l'3CG?I%g g@Dd(/A;_egl_ɣi*4ug踌[yzCGSP^7]ۏF0iJTTqj4+#WgMZٞ&A=~^ff}`K=H}e{"(TʌOl.A8‘;fwWw e;L"P%f[PF'vHAvom1dPp-GN t><.g_:d?uWx"94,/" 5QV$46\=0&O"^~yyi_}lPiKX;ƾ7c s҄T<2 T& W]L#.Dh<1aRظPښL..$d }+ &\ (\Zٔ}{'ޑbrmn5lLd$]kG8G}d=QmjQ s8 ]VkߚC\!fwϓ(x+l FH %9y _3bI`8A,1KЧ1H8FHAH[;ALB՝j#SptE04FEP!w[yz_5PԨg8?B:Y*]hܴZ^5ndXH!;(kbpmF?0< PID͌K0B4>j}BU:⎗(wƾج]r $P9ݔ$y$޷`[8tC.D]Hx*ZZmGM d N LL{),}T=i)ZKyeΖh۳?0 Aֵ;tI5󚗇g]i,{'W;.p=in,Xp3"{7٫ؼ,W= KM2׏^Ɗmc?TNV82Ѭ\Ɠ#ɘ4+b$I}AP+RQ=Vn_ 085Gq#eewm] 092T2ؓrkt3~8kU')g“g&ZBný`<Ǵ5=E89[7cXf}شi=LCJC.8D?0]#ԜYLh$}Hl+?80OݭtE/TKBpi$xtJ̼i]|`h]Bц @Ώ3 oїb꟩ԅ0$'/ m[ Cb=+q`[qk;J|0-=؊aI}%m-Ow "1зJ _)(K-.K"ppw/艣+!A=okqwOcx]PU$J(j{vNl옋&iiIy_inJOMq$p<6N퉾SOeG|#;WZ++ۊiB:@fhFJ36Cf_  m?{pPڿW`ѪPJISPZG !1GsnckW+blZ4%aeg Sk^O;y 0b?UO?) {&~<#=!̄1Re,$&c q<3xZaR(9Y="^E @)J4ŕQU5<>%xM#ڹM 92T2PKp)WCeb N)B[:#ҞBʽRcxvmEe(g![;Cx{|y/֟ڈT~Þ(7r⨸-k+SLjs0|Bp,4&~UZbO;.\z7bP%lj(]8ȍi1`e4 ʡX6M J=~ zKϢ`n@_"M1}Yh6 9$nB8>RHfh1Ɇ'._6UUblS{%0L,؊Tu]!B-(QoZ" Z.ՂscV(M9Bf@zqak%e5t\A\^dL_1@0F8fEAky1Z5:?Ǩ={"nH!sIy P OEb^X] XыOL\^k`V LKɰEѽv} ~q#LBQSL.[JO{Ry#( T]X^9leB, e`0QM2b/yG>4 ^A q(wh`:8B~T!tk:H$Y~ 5ハcN8#9T4Elu3d[1 7( V*cL -ql(Hi͚7کVNãcU/ ώ cVRnղ$q+SM|c;6/˿sœ8X'^G?QkP֡xc":MQOt a $=Bp{G@^W~kqz/_`8w^*'kQXX&lOO*[$&氳9;뫴D= &,R[D@dtSħ$m-Af51Ccp@8ohwV݃$kRl$K$M#܊yAThL;wPJ̣N-1ف-bђ "d4(dn`jj7pxx15H)\=2 MӴ%E ::(<{A]v")dӊ+{;;gjkJy)I]`$ CB(yUv#((ڵC^ L{ѨH7puLڔ̥#Lׯ}6Ob󍟅VCbb_hA[~ó,mR1^CDT[n;uV)d䭐/L0tI:nr}(w Tʷ[igzzjgd8!Z3*3nOO[έ;g]Dnp -<\u rXWنl")hN "Z$*gJ<' C:zsG3C %%o޼AdT$UZ11 a`þ}-J-{_3L)TloAt:MGSXHnZ}<#:xN}('i1A]홚&s".02fWWQTp/_ڵkxRL#al oBB(= bq ;-$(_zF˿sJF I`\ˣ/a*G]bD^UC CūKX[J^^is *lZxN09rhXA-}.aW޶MS90mzޞ fc9^ݣ' L+sC U4Ƙ D'?4BحP> O\xlUv$݊M,$>k4}>è.a!;,̊V" {O>S'"o~RfiEG;aF^ v8|}zq:2i CG#Ȉ@0GƆXYg88Ăfx2v5`NQ]hu{Ԗamw?EBUMFct?Tŗn"`lwyu֑ mCqz1sqòhլWO)}xܿrw)R܋VOU/jQR !e`+ r %MhFzֻF}v\YyVb)8}> Ď 9z/?V9#ʊVI6~fTR/2emDS!"KR  \芢=9.e 0߫a}AXɡ|R^Kp4+S?:v D`BƥC~>\o^BRxuj'"/11K'vGxxĴ;1E6i|1 i|7zs1Kx+Z[~D^[퇮 f-8m2R9ǂәҊcl&O7OtdinlE44%/ k׮WZ2M &8 [X Wn'v 8d$6 B㴻ֽ jT.b.;OH)g&BDנFL횤pczG a-rh3M`SjՃy~@AS076toמGE+m)YZoP^# cπRZPtT8 F!ZnmiccCřH(S潥eE?vgMd8ڋѧ =Üչ賣wM4W$fS{RUt-H;6S&_ÄѬm_,YJSUXL$DJPZ\G ,I>IװWEaGٕBvp7c\ 8ˍ4e_X2+Kq9́}Q_; څ!Y(cJ\ JwĂ?#PHA_飭35o3ŭwm>|±הyt%ja2T| Kl27VeMYŋRDB21|"<?}o8-l2ˆ41=i? :_a̙pqq G J8l~94q iMߡW6u+/DbuX0<׮Ⱦ-ػgܷ {nChꢓo)J=@dU;Pr>ѳ\`{47G{tTiS`a@Tl 5+daĈv$(m"ITV`0 Ü@q{(JN_-d=CD`YStݸ/L T'ď9L`bZYb8i]vFh7RK۰pDE3DE-{B&WR1Y1wo4"`lD(3ƜJQAh,H38^O_Uy،TBt2sp 666? iɯp`a>РY1Y+de8} ճ72p'F_-Z6ZvP51͋YmU VTL֐WĦlD15kc<`oA4!"9 5zfeblBbC_FLLS3DmUx)d]Ӂ('M"6S qZ Ƅ'd`sG~/p\<)JW \uk| Y>%0&"22oll,(굽011PECdgiq0f0$7O*4zggL.$|~[Lo>A{E 2cӤH8'd'QN.5M (zoōu:iq%0 Zdu JWEmׄǓ3Pehک sCEǔr!Hcɤi>F~jՒc@_`P6Uw8 2HC!#4O捛xAAՌh! &4NJ_m(>2~udFlB*56"_gYc:Z&&0SPXKk VFxښft=29 w$DĻbpp|-fQ H_X&!`^DZnѻ^CK!## )ŒyѴYS<;o?S6S_|UVU'r#q]1jJd WYf-dJlih|A{l}5WЉh{5h_ G)U;O74ˌ<_=Ci8iB}VboڰX)z1uq\=_*9)[#atWZzSzuC~m= O X: L@Np:8B~[Э AR6cX5o9\ LD4UPccppH"Tȋ-^5[TcYa $4  _90&P&rsseÜ'N߳GQ+w}Ee^pRy^kd>F5 ))$Lmyw ^KZQ'#${x_BѰ5a+%NS=QvmV;UF(-´IoC`TV"|0͛` ԦIKt]̥WKLJƭYuHGz枵%i{)t1mF;CrI(S4bѭ pG;i1%beuղ%"TV"|0:QY6ѩY\Uhnƭو6 Ruk4ҳ 9gYEJ9A~YMsƅ+_c=р$J,Ą DߞH k@rWEe׭OɫΑL 0+' WvډFnpt.q T[iL0bᾇo ZF/ҍ<Ɓ K`Sk IDAT>[.K.<7Wp;7+9g!x ۱~ or.aRR A{ ݏƋMUsZ_QEl%рw^֙?<حP1{F= &΅c@% {nUױ]f[8 n ,N60\'K%#0Ek$,)ő6 +*]4FD`ζds͵sxZΦmU:L2z~5U,p|3 dЏ 7~8 [{j[ C}|N#I`dDF/S55*3ٖè2\eW$'[a(q}6ʚs+etBvӚb,Q[U dGjRP;jfOdL;1Tx{ >AuLkN8fE9%˪ wvH@Bx/7^pqiu-fI+%2t$MvjaQJ'HR7(e&=ڑQ /|a(r0L8IvB0\'K5X=V>-blJH|j<~npqA'HT7a=tڰh^}1 ʃF$ >(wtF_Q`|W \/^~3-yROǖP[jSuBtuڐ4\ tqS8wSGNb0-m6`j+Ȫ[e?224#|c*W=)rPY1$ͺW W#SN_7^o)H_0Rp"G 2ԧSTOoʯ6JDυx>-THƕ#sp+w].<#/p9g󳖠ch0IWYf[9o|(E}0}n<#VcѬ}q7 컄 QB Ͱ <A*,~cZebt+bڪU!e_þCꗵǢJ5nN8s{i\A _|U$ղ'6ʌP*"dp0Fr8`~c0”p<3#x_yg> Q8+bH4i#l)],+o<9ʉP .(Jt [<- kl(S1lWv.+SVדӌx^ &wCJ5dJyrdlxykIt>* 5k1/£ T"cI}!{{_GS |W S9Njh13|)|5$2Ѩ`ڳiw`ЌFNv>ʟ KGs&PbD8U1*AЈ +8 cRB|2>3:`Ʒ,,NNw Ƶ4 ,õ?h76\zMcXPr1t?\Ռtd/s+.=)k{xi ]g'r6}ick; $>XGAeﭚ#I{TIj6afMk ^V⯈z9򧁲2(lĔ\)ֱ`ԧa>ho6.[7rD砤_ϡ{DZS`=^ p~e/Rfor2jluPNbEjK>?žYV U3%ReGL~9^+)d"EjBe4oF&H*޴`؈4P?Εz?ȋ:IU0wld;FqVMyO ). =p=QBvRlA.EXP6x>c:fDGe}FL@10|6Lgf0--\J,Ӧ;bݦ]ع~">VO=#N ݿ_yI5V2$N)x,N(6. pWȠHiں:җALjs_l|Шepx65%&\= ۓ恶rmq6jؿIUҨZ)ں=MnJOCOQr^Uu6!# br1RZ8zZ;% m0+Rb}KH[CSgݣf4 N6];{XH0UV"Oݟϥ!h,LI{륲x F6UrFϺƔO9g8ϺŖxg 6KoMcF+7H=|JK@(U!QQPRE2헊Q20f^Z'`14_/^ɘ׳.Mw`qKn•` .E?yO~s~R]OaH"ܣ.Ǎn$&|=?-ij=r܁ /z @SgIhvңl~^NX,ޞw~ԓ,:8(K/J>M2qUAvH=k5%1մWDpv2~mՙ㧐adH[byWWSYS4 {u{e: GCxpZ2 ]4rCq?L 0&`y ޽{dt._/vWwɣͻ,uY:?ǖǿutdsE+s|z2:׃#4iüAzi4Wh)+4Rn:mo?ڹvk,Sf@[?[\&3]VQF~E4di-oCMO4[#s%"+dIQ|?gەɞCp2łmrڏg>*g|m8Kx.Zh!GKoeՑ9 t`1^XEj5%EOܥHZO莠 ?Bnck^ p;&jLD@#1Ipi5(\? w?x;SښCFȸT! >Ov$W\j YAH򓢀pWX'^Wu w PԸHJT3|Ј&7@#L C4Xu(L5j\&8&!?8AF|*@۶mq KG-gL 0&`rĚ;`LRXHFb\4hBPT7/ŮELj +M%DG Aʢ-TpoE2n Zh^bWEltzPD"mJR)T#pFXl]#::Hv.>3Ep`LJTHF:~1dKbcN'O6Chh'G'/"48.8f x3;#8#&*ٱGkkbKn'K)Eh \IC/e`:OׇE_Oc. []W ^yQ:Mf N4Puf7~dnW>@_2Et3~ T@MQ^Y &(Sdd_楿`UXJ[^*wX&(kdH*2W,?,j"-M7H1kҩ|iNߣ=}~+"\?yXwHvE/F^o?-@crG=<ĭR[.۱4~—Lڙ0ta8Ϸ@ؿau?IXG*a OԞc5n- J*lBvir <1E츼KV4Dz?bJ,Q\}L̂Ř`LBTtV@A95?SZh!"z_=[A|ϛmԣ;aoߠR;p3"ph+4`&bG9n>X0}E~V(|\W)6x[e'o&0^Iw$?슭Sd?BuFs)?1&mQ3!"?|'Yt[;L^闼,茦UjN.]̎C[^cő(Jk>1mXw!XGȖ<>2&@0%CR`wz>CGJ|1iq8.H:K~%ƦCi;G-._\ahΑ_?ưAp9#aRNW%(7^<K aןc}'0{Cp:EOʗA~U0gdo5 Or-"ٗ/ F3y}ŠțqB?JJuLHɚ++V`SOܢ ƂiGм\ 4?\OCS_ߐs9,5c?T;#3y n(^t[=>mcUdvz)XHè=p9~f:{5ӛ2N,`eC”3v5^GP9@xhz_ƛC>.{&=~!S";7E@ؤjH6yj3iѩYVGV2D"dWm䗿o?Qm}3 QՒ;MG#xxڿBaIXL~9Kd,˥75%% NG-Y\jPh;KNht!% }f@Zw.PM=+F} 4* tT5XN>(HiO`X _PBYR%=a,пo[:&)]>>ԣ$b&hϺ()T7i+&P :t`YPF 1w\ :̩{bF2lv[g}f.l^1 }.~8Zy=}bs)оKk5Ez<%zGyCD4Y pr/Ӑ|;Ṿn}g/D`{#}O B( _.M RZRMbBCGizjH )/MԩMwP) [v;k.Ml穟59a6y\O M=t4u 5|r v$ۗg>Ρ;p, Ō3䟘jiZZNJz$3#4aDyj6h yJ{&?O-?lNP8 bʔ)ʄn"^rQ[ȧ׉~}T} ii[ <dFm۶8qB=}h4}m9 th׎`d{S8&0-[0`}iZt1%bd{9&0P h YPaNc%l8r.L 0*I6X/cA12i"+e3aL TMyh_1L"y0&0_ㅯp+jXIadXIGr3`~(1Jרhְ0'̹J9X 0&`4_嚣6ܫ<9IDAT9{V^1&P SE111 cFZdwĈ .[Y Bqs 0''QQQ*tl/+DllZ.UnndT.. 0jJرcxpq V*R/ ´iޠ% [Źs&*EmZau|Ծ*qUi. 0&@_A\ ͗KSpt*. g'%.30Ju&1˟:+?n<9Yb0f2[c=ufL `|l): @N wm'i冖|phe,e-СCMn/<{v)uP,EAM\вMķ}1uZJLu&5`K@LvCjZKKnq_B$2%ٳ7nDgR(@(φxF)aMmaLJk0`@8a̙Dg5 5q}ͭoC:φxF)aMmaLCbXQ݂-t]\:u+K6lgstn&+}\y&,۷]$bgu ~b̌Lq*VogC4[%a-=`LJHIIg-H̅j''IHH(6ҫK<m3(㛬d1PΎ 0&P`%&`L\Q.X9S&`L ~`L 0r!JF`L`L 0V2`L 0&ʅ+傕3eL 0&Fds&˕t"wqw{ME͑=66 ޵ahIAʓ+HCPфk%#k!(y`1v~!nxݺ ]cEpһ`'dXys> xhJ칋Eb{s3Gהr$܉ąiUx6Y9t[t]ƁoZGQ@Q8s5YiJ^m4Lsڿ9ObL TM7WyVfnLի9[yqG5of0m3sC&tՈDS[[=.))xpd2飤vd=v 7p7:6=epJF@,`M]=0-K ʺ8޸}9 73Kʶo7&8RU81u[{n;wЛ0+Iҋwͷ`dHO/J$JFX 0&P n#nQW9=jC0P;[;tDZe c I4I<^{w\NEvF:aU#Gs s<`L ۗS$ycf =}4n0GV7Wh2=)GeQGJ6tǍ3IF%"LNFGt; 7Kpl}8AG2̀ŢL 0@3:˿=P]prG G\؟ #ʒ-=S&WL./?%۲vTᑌ#\&@ +Gֹt5) b^׎NaPU:N?ij <}Xe/Bw_v"]$NoQ5ʌH02&*z[Zǒ)98ZJ;Xb߲[JU답 okqv] ;;;;7RӠGNG2LgŒL 0*KYd,\4VYc7NW!Bĩpro7Ut0 GdLL=Ӵ7M_cPlL);cS%uO\J/25ÂQ$ݼ9+յL XGW;(pp2?Vضm:_%ĢIjI!FÿZѫzh|uOwO\QqJ".6 O.gja#Qmoff&>089t9`L O… hڴ)-l\DY| +vk9>} 40*\9(J!tkNOwIJE3&``%tV,`L A 3`(`L 0&`:V2LgŒL 0&X02&``%tV,`L A 3`(`L 0&`:V2LgŒL 0&X02&``%tV,`L A 3`(`LԾ0T}, ggb[*OO)Vof9:ZyV2I61&P \*B YptrDZ-OY5L=ydXMWrClllp&/SAxmٲ₝BǝkOɸy:!P(CdQXɰ2&`4"#pz@HAI8aI71v<e{u i *\; &aUɍaL*x?@UeQXvbȐ!&e9i$O&[СpvRbڴimXТ&@+WBll:r˷J)XV$<ݼ &FL|z,Kk YNv&"O$aoY l2*.h_cL Xcu>|6F]=@ '7;hE"y5bD`FfwXh6 QOԨu|g"R.'!#9˾[~mhNOEÇ'''Khב 0&`qbcc1c lڼ W*,vh&lN:3cHO0&fhƠ7Mvdh 0&PIܹwVRe[!R͛7a|}}Pe)<]Re+5ALL  qm !%%EV\\\䗨=5Kn߾$QnucIMMELl /d="UOtZ2|('wF+q `kok < yRoazFGG9.6-F9uYg4@Zu@Pf2/2Tۍ [+-dmJ seggCTVT&@ +7C@C%8}puDߧӓph2䗨]cjXxx8R!+>w%%\ d"+< o/]q#:d{AV2L 0&P bHY,s [ׄvV,pC Μiw4oޢ'O"EuZɜdCΆ~o董֭43 UJ(6T2p`eG@,|24gM߽ _gJ :ukׁ'i%8v-|k=&5۱36θq$((ȘhOOO7]p'31ѺTUٞ1&PmDFF>nt^i"-[ʕ+pqlr(~J#FWaiJ/0#b[*$? &wbOQ ]Zd/э7v.8yɡx[j,b,Rû5J0k*Leb0`L-b3ոlm3[Tmiu3q] n Ж bzK0.F3djQ k?W 0&Pė0TLTDdpŽS2&8V;N6Ny%20 GaM5jڴU2j׮-+B80&/OG{GQb[JJidNFIWF,6֨!=ԩCP"emA*)\`L C mQ>>5=fk#NUFbnhF "00˗ѰaC &(-^n ZY|ڒAGGw1R]9Hl\ 3/^aBX(VݤIxp/q p<`L")N(r2i$GJ9w\]]Q^b )V)ŰP4]aK,`CeZz 89ETWN2gA(ϟp0dĢPyhD$#Q̎岙|9)i@GL Օ9LX2/F0Yf.$%C$#B<{, ʫ^ 5`L:J;a:jy~Ӕj FFHty@FLR0DmhO21=BPAރnݺfi]ϸvu6lԨQC^G&' [o'@d̤j FOV^ bk-~Rw| $Ql 55Uv$L C*bK̫#&`LbHrTa`K^)҆{R2t (BIHHgeeJ 3&`U?GERK!L0LtT*(k󭬉r~L@lEyrU2ʫҜ/`L 0&P 귃k`L T1dT0&dXKOr;`L T1dT0&;n_XgIENDB`pnp4nagios-0.6.16/share/pnp/documents/_media/mobile-hostlist.png0000664000000000000000000036604211662503006023342 0ustar rootrootPNG  IHDR IDATx]]>M6JBHCp)Pww(8(B bD ͺ7w}o[$3{sg96^W]sm]l\@9xyyݗ770؏ Pר/u龈76¹+PSS-;SRO>L뮼z7gu4+*ge4x!ka ` ` ` ` ` ` 6['^Eu>ط) w***G4@@@@@@@@`| hC; h70000008 `#.![k0’*Y6G͕ db)*v!,W #dh<:FCҘWZN~rz=^HY^^.RvHʎR_ 'oGWdyyGi4^p',7t?  Ѿ1jkjRKʥJjIr czRL[:tK^Q8o=ѨƏ(?Q|SI{ 7Tf߽;-urnsm6U$#}$$!Ciϑxq,M /WKݘ8UW̕IƵp=^(N)N`[,HeeS|Dvک'w9l9xd]ݱ}ᅤs=#=] t9 d?999#ˏ/TN!7gIm~?y伋.ˮmwfgKMuָKeq>>R4qEaɑ?2މk ag_}9l/qzy%:9UG0y%5[;3/vJ7Ɨd{pz?[qvrEOM0؟ cnZٽs:^6|,Y\|r:uޗxLo 8?\{? JBBBԫU+/P}UHzۓK" {7(NצW^|םOmhģ P뮻c>L|Aٵk*oؼ8QL@@MM<׿H&w'8BJKKt-DבGzbRy$,,L3fk֬{|/??x-ױD&L o^x]V+r]8Jn rzԃ/Tn(wڻD냶lk]y[ַ!*%:3Qv==Zť_2#6m܀C3$6sE9u;<ݯ\,?CJ}$fB? &R'RZ!A2cPM~oQu#J~KɢRN@Iܨ`) W1DnH7p<}?MzjXDlw{]rGܭ*oz)G{o-+$z)kӾ,eȰRCφEP'x#͂oR0G1!}VE7uT馛$ 7ٽ{:~8e{(⏄!CT\Je۶mR˼B: %22R;0-ĦfgF}`oKNbUn /aRR6]gGzJwj ccSuw 2if ;{Mu*\/]"{޽{;92q!z ^Qal@}%12k,,:VY-[6n[7KDD 2T`a;۸~5b_h2x07\v^*W=Kj"%vT/&ށ~^%{ e@\r|(ၘ5VJqA)-Cb!RX^'l.WX WUKXbDOp۫|~2z`pGtÔMXt6Y %R  oQ~੧I9/.UQF09fXx_TT +-m]8wWZwWJA%܈j;Bm# /t~-^ E p]suR^]+ bauCsυvO?Ï|$#(^ZTzࢿYn g>Z K 4A@@*=0{ȱ<Y%|j*;*]Cl n}rWD,.OpjW.Fx}S ]fn@^z 4:'Y?qd)O p2 7Ή(oQ{R܃Ѝ=,+9ܹh܃'hv|Nao]hὅER&!R#%%N.O FWY. ֢8SA^ +a؉:i<:H^Z\*/㗑@1]b;彅2ww27['.8]5W\,]qr>s serg;e_r'$8 6kO’RBb3S%yy s;߱]NAS>` /C }oҽ#JRH(.%GA>So3tgzGRU|"(Ǵ$@zBB9Haz) <-++W' ?a<׋ 8%f?Us6ݝXo=/.i'AճNN: PW@uc`E`D2Nw[8"X^~^=wCUnT\5yUQ1{kkd=@Sϧ@񕺇^LgUY#+;w5ˤR.zmw@p4vnL)ޙ#}äO"1骱Zˊe͖2ټ :1-C!r7"ؽʕӃQ_$vcgc}h/yH vF;J7ބ;NMg&8gׯH#1>ΧΔ_ <̱1Lϐ>HmcuYUpo_%La'89.b9#^`p~wթPɆk 9m4O#=^㇅ U+"4uYuL8eYE{U}(*<)i.KOj g4bιWCق;)ACEu 2hU5WfZ]F|+}?ZPx' /-?/Q!adC9u[vl3R:ګ[sϝ?ȣ+IJ*%(D"B%dHBG.a| ^:jj _+dwf\d85DPCR}vj4\Tm> ǜ=ZSKn* :(u*!>oeOP uI||AD|q#.R7Ԭ__pIfeފ[B2aV[&0x\;Qr=*a 81U{I :l`dz{zѮT*uQP(JiA*\|*~A4g` !~2Ϯ8;4ȑ#%:.^r Rr91;{`:֮!ډ6<hDR iP;.ȉ#$zV9x.w?2dmj M J/>Ӱ*xb[,-D*JiW1`ajzL!y\k@sxRԁVt2;}GuPDC'GBdT ,F1 G8*k$x߿[)))j~믲ܼ/}[HP?!<&?AhUc58r `u{x͕N~櫯ǞGѬ*%'R wʮ]U=`I0ְ`RmJ0QJ@W%ֶEgWoosVes5pa'Qu;WrtHw hVWC,tdzmRY33_6"99ag炈$h{Q64im1P.rl.Qi]0Y#c d6ya^ %ŎL؂9`ÓKZʝ5ogHCGP @_ࡼT, */t>"7%x(+K>m-Pلz4# /Ρ ^@Q5Ks+5}p06:@ZںiO=T۔SmmD%;+ڡ\!` ?@z}v"L%paA>.Fh.WW E)Pa"gMvC,2֭nvhUq`od`Kە;\kC!øe՛Ӓ7>~J$hp<Ɍrarİe ysI5[|á#Ѡ>R];DT$u57Z2Fq[ݼ9VU-@*uGsuq;E BN9C2Q$[: YesCh#{lbp(O{0QXcit'u!PITȇ!Z:|d Y`c5y;Cё)g68ԅl\N_-k ]5-CX`wtĮ,]o\'罒#6Wʇ7^ Ne؉U`tBıp#'<% \?cIȑ22 eУJԆM{2ͺ ۔ ]ǐKyr|/PJQz1q/q2 =KU+U&| p3^C7^` 9 ʳh AkkN;T?;堃'c6[gĈ$bH^O[3@}iE 0za%=Xn~:U>%N9.LRRӑ' ŹIB҄z͛6EZm*I?7y7DzkpWG<c9NaXb57,Vo\p+ϵNl /@`JR-Jx" _q$i眫N4l2 ټy"y՗^$#A<2gS Ì3$1>"8 !C9Q /8u4O5YJvF{P.&'28ICE%y=F RMYy-k,_Ζn=4EuW|k7p^`؅  tf,k[KœO:ɱ{&|-Bܽxƞ+ >2 ^h4ʤU>~yKʕf̅'A-Pn*?žq4tdެ]J>":OSϬٳp7 >Vq G蛾H@}:Jc HSb4,B:|R*½e<$a[9maKL}ͩXC/塂T>leq('<@sٕh魷IbݕըBa @ֶЫ{>_~EerSO5 ⢓I*5_Wqx cy4ӟ${NyKé'L}@HU'7W 8(^YC"bo _v}$ 5ŗnS.Ҝŏ=NI$3q:b;k Z`NYy!R5WSu{w9һƑRlTġws̩#HWQ;.u21rCչAd_N]oS~ x1=lsysTuW_}E9sN Ni&O7q=0_?_/`0P-?棵nk׈0Ew8Sz"iWq6|PkvSwוHdB<|ڑx& @v]`% ]j ,vġ3i2ڢA^q_ig       z       V       z       V        VkAnj3000000^        A{]Z@@@@@@@@;!;cm ` ` ` ` ` ` ` 0.@@@@@@@!`t0t1 n3000000n`wS@Cp:v0t1 n3000000nM0t% +m2000000:5RX\,9y'9RZ^&%eR]S5WB%80Hc$.2Jb"$<4T|~aG >_i_ś^wwYWHjfad/~,>*Z1Jz'e]Ϊ'Cn*KZNw8H@ G|ˑܴPʪ)\%7\ɒ GIA#e`\#3a|aÇ/77KmxLǛ=ov;^X"K׭i$))Y&> qo뿌a(2IMϔ]wJZnRJ+'!V)@@@@‡kz+73^oz%"e[˺ +ܧ0p ?@ĄILh;WIqEWUů[hsC>$@pXC|%?_.kNq.;wȎ훥B5bL2P|C->|rv^Jx3xӆ 掞7/W/4E!na)!]{7e =onx YtJpp;hMVC-g *}_Lh$@ Kb+De!GHR (@@mhǹCx(0mxl4xsMM\roW)%+_eÒtĩ2"9A#T@x^zHsI7Gbw"Q R\\$pٳ#5Ez:aZd ` `   >]MpM|OY5›%݇7}f{ջfޛ_?Oƍ9XFVm`oWX\?Bz, ș-*$`lXHyE.(1'%Kh_ GIf ` ` p`@%>LVk)L><0@xx xx1z1݄7}f{;rwʍܸV6 *zoA9J0q {EJYy=*}{ 3pW|8Cğ/x3o[7˻o8s9nf),̓D=z J"(p>3}v0N`y/EEg:wt'Crwꚺf(fZ7N/ټ]vڢ >&L">'HЯ١&7e[XyN`TzJrlQ 6B6n?xӗ\ ajE=.D|,6)ϒBeR]Q&{Z߀  h  c0wX~k~Rc``b/8ׂ@⺵^fk|Mi\2y-=(쨗Ӥ]&֏ipE.lOC>/e|:=wZ*&AMס`/˹]{^'\uk@H{PmҖlk ||Xi|X \XaqV"a]\F2.MNmsYeU+ds~gd;`5[SLi^dX'U%S_;`Gŵ c2Q"jlC W79WOx|c$xJKYYT՗ɼL$<ՁY鬬T4|QOP`(4S`a9hgS^kEy/XfYoWeeb+@"C16|F(Q03‡89&~ !d&\ I'ĘLi7)FrRIaubKyJGrWbzDOM|Bߞc` 11 nrVFD@HEB➺SYHHJ0:w:TX*,*8.U! '"j32`S'8J$KJ$3+[,"@t( HC5EXM p gD& H=2"B;췮S_#Ɓc'?@m ]s;k!LJ0ckmzvÄ~# >l;?VM›Mj X|$1gaR7,{t秥H,GL?븹),8v8 y7IG RU$^n9>D‰?~ D O!G Aw 2!WrI ΚQ /D`1,P %-\7U6,ijD!ndz@pBU{IYs/] `^Dž DIl3؍B/'aY&@ 6۟kg$2W|jAo~^{yvw;ະćBKT|:j*ݕcǬrtl9kP؛R'RʿK39fo3ū$,"I$RbU߫\-h<$hn^ՉV9Mttch±K86zuttyO&n[$;,y󋥊8"RQz_a `l9~H/㾳,)z[p *taAW;{ $Lߺ4XgJZ ̑EPBε l?d, 9y$<95^b{.m :ߞzؽ$xmSavy뻍0S>ĸmIP*P-ÁGw,>p!kM^-ixgM_!:mĿqZdK`6}ִu^#MxUZzAQLo\5lk-9PT V39IJ,ញU  @>8 &j 50͂&>:L46k|`듥JL? N,g\_O,]SZ|C| jPʺXg\+!?=PP2Q?01}%'L[ nA-7f%kEGYA3߮ M;I5Go@;L%9a7- YgPd<~bWA\ISTkz(F;и $1CCaY}O;&m,{Crq oErLddHdhXtj?.l\4ux+ɇwKjA=W![D9Lnzc  DSYC1rf_Q`,:(DCVW5sׯu~[HVmh|Aint+i$HTZ.-.JGCZ^.ּ%F'%wpeW:SYbe N*Ex[uB$| fV]PV_e|] ɠa OoD7 ͅS&o.n*mVؒ!RRR'7 ذp'OWk[!@?yrjyP 9x @rZ(gd8Su]Wj Ⱥ{G:-n͵k*'/;A|,N4kQ:/. tnraۛϞު0,QC^JXVTV--s6t= @C6']$)ʕ7!2X$E$9ٷ橇/w"=2qd?8l؝/ԜO[hvς ޠ3}"±Fʼkbd8fy˗b5ɇe'OpˁNc+շ7'^bQa16QC*a<ߣJ5p =arN,7-I*"ߚ]hH",.[ISbpoW7<=4aQQ:]'] -PAA:īv4\;&7'!j'`OEkqZ<˲hĕmپaRDYa0a\ V}(CWW IDATC}S"%ۊ'}S!"e7\q{ٳ$2_xi\9=r4Mw*LƷ&k9=+ 3f+@q@:I'mQrt"t ~EryKQu4~zelE4OMU0vͅSdJaW\%: @r1^ey(b5^t dAUw~өcok˕ccOBaޖ<_TP_*م׭GHX0v_b" tkN.ל~\Gl8Uׂ$#Sb-$1jqC v8[ /B#uc8&8F\a^x¨j{.|D\D.XG[.@(&k\~fwdĩ͊#D7¢SuS6Bq$}zS.EcZ\n꒒˗c]usZ8#d$s^p*Iib5&W~L7Xxs5yJɁ@.*bC >hSwٚ"tӎn|m9-‡?S~)U23lQPE`T[L#b Dxӌ |X W c0F&/zG# 4`Nb)tҙuc 0&2ҍWj$&%%I}Ge~_= eۨ-Єhg[6Sb"H e-ұYpŒg%5#cw/@7]b7q>294I7o5z@"&LdN/??WTAJE9Y@\6.95)c<ƪ{EGHp\8H)jPģ!Ldf8q|u 6ULcB֗p`堑,T'HNExvo ŤeU [aWB&Âna z˧u#s)F{OhTlab/y|՟uϛ7ft$ڒ@Q.|=řᜧn-MG=T>΂+pdyʓf\^˹r}U"_P/lTFiy!?b[6Fzk&*ʳ<qjQ^|1gaRZBYaq>6'"Bd`bT_$- hywᑊсAeD0/L!\>.JրXL.6e S:<\:˼!%Ո/-(q%0e(|~s^G{걣ǒgG\;X@bE5 ; "Ao89z9. ׆s BĖ;PomA'VDn_opPl丕b^rd9iX+C s -ݐ"J>[Eh#!gT% "c'!} 4׾\|S/z(܁5wʂ-Z6WC$uKlD"vY{Vm`iO9 6MPY]'!}WvuzAyryq(<|̇[B,\8}ez]8BN-X(uw5!W*)4^O`mK˕_d֏j*:s; G5"~^KlHJʈ$?~.pa?vfִ|3}c@pqdDž8]W]uZQӮٞ)ȖrI h{r|gmț?@$ @yqg}/r7!kx߫Ak؁bf]rҁбJCӎ_ ?]{mTmi>7T:z.I(H1l*&:25h'8!#HLx#9qoS?TQJWC>Xr>yDzDo4{1rA-)pFÚ-߁,U8OB |7;߁G+|pA(*{D8ؿul/QbStն E]Y><]^}メb_9@ZΟm]ܹb`X"`Cw G4A1b H pylLR2} ;_;Ht7n'>4*W8SΙ5I<(W8Nm%!ˬ I~ސ* צEindD8:9'6D.'űm֊`Qye]rظ~*3ϐ֧9UA^$Ry.r쁢ɂRkHQ7LgZ9FpYܼno SvD=T+#_z' d+^%=|1G \ɱ3P \l\KMi =ا@i\zh횴e . L6IG|d|r"ٿ4x(=[{(?qoQ0Ec{ղns 1#7 ×HF~ue(xan8ݭ$4xG+/wMD`Kۢur#C)2<:O& %Tէ)&kdN+>oVcAJQ0È rXD?H0RqF<@`4w!2~pjMN3 3i+Ffm<vQeiO vNmUUGo.4GwczPm lKse3N.*,X4iPAh>2{U-@TĔ2HH8608||zl(^F_.)! NsHѵ$V9Y)C5;2 jj.wmWW',ΚP劝j\y"hA-/!'"&ê}$Y<Q7m)c - /݊p֫ṣWyOJknp,;'Xo T_qe(] OAZmm á8T xwxuM .:_7jL"m4=XR,@oy泜rGrax ߒ팆 9 ?z{!8{T{O>\=2W z Z&:Mʰjmo=T:!`@J>>0El |:C-\lf8VI~a4ydO^Unϵ$L[6݆Kx̤Г8N%2WZo\ҁ%[Emž_HQ;oñc}CĪiZ*3$KbtJ ?>F>i=khm|fHRGT]\4W>I6mm vwCG(t/byGs~t2S/<֎24>OkLR\M ;uNJeRx hGm:|RğTx/C;Huiox.~ p1ʷK7k,ƷUA?%lnTC=߱@ic:$;jYzz1 P9?ߺ!S[jD5^aqST XqZh6lӟpS`G.;e|ms)J{ -[)h/whYة6##'z$p qGNj{7pP8EGer7#oEB M+O!soۊW<4i۞\U:L@q2^:nkǀ7j66^Y A:9..~~L9a ȃcZmNe(>‡P NCr,*P1x}Eة#iH}l&Lg-=5tC@f %c :{w %4P |D`1wr\\5bdGN&=3{ lR~B A+J<r Dc$}UvHꒀmi: ӹv麗Un` fD0y`·% ~S/-C%Mk^&\om;!2&5ZZQRv@"Si4dWS?`Ca욾-ϝ5ҖC8e$o-T8ё@߸ HU&B4ʕ=-̵Ptv 7:R~_UX5~9A<+VOd#מ޿rY'tBGb>/8~2C)bS[Ss[Kg;]\ܰV8ԁw&$!Fw?EE%F==~Z.oT_R~=MpT?ʓ韽ۋ>m}y Ӏ^bdw%cܤ@֋\Z|t4=Qߨ6r*ZkJ`ϕкw*Ző5*{''%ߪ|)Zty>MĆGHa>~nJ~gtm!ٖ/fbq'n?}U!ep-8*F(VxDupJ!(-X t}:H6:3ֱ lkyJF{BC̱\hKy9No©~FeRWYpShٟ ]M;.TVlJW\9e0&~m'|kn}Jq>&?ravt2POHR)I@fffڭuhXQ0j(B˜YIğ.\ +ķ m@W.tf'ZƓ?|:sBY 8Hɲt5SkMONc&MJbdO 慜@OD`2Dŏ~\z[w9omnAP 쁋b8yqZȅw= `1 1҉N"+dH:ȅ-ϱ ǠAsU"MrM 'zw-rQ^!۽Kyu 9#mg[8FLE tmH IDATdꝰ-R |{?ݓMP jmIH ;ny % :$@2p/qZZ+8 c}\$G1}lqݳ z}tcSDžp2U1pf5r] N{%NY,az8c,<7 APgr| |E qۺSi#?t<[7.XǨC 7NVZQCj3 T*78 ȤDRZ3Yh%NY-Ο-4ҁj8y  ^Eq96Fq Mй[L8  Ny qS:ON @MKNw\"7?B0-'ٖ|(5QϮŁGb0 =B$EphNXr27gɰ>69. ȧ 0T*;"$ɻQ߬y?l*u/~%ur~2q!}YnTnߎ`1g@cVćM3٭dv,lj>KaXwQ"Jks={KBk@HDfnk=PGJ6XaASgDg-w_zNҦ+Ix @cw6tBE(7ch+mNྱrΑ lغiVT+eu{ 6kR"!y‡~k~ݘtzc^`ҡs=>xeJ?d2xdϰ'C>KuB :>֡9{iO*2K:ѩ` 9~~8r't&@B @7> ,w+v]O+^"p4&v\y@bGpQH5PJlI-%38JILtv/;N:qzjwNlǑŚX ,JpAb  F}}u=Dkw_y?0'v+kϭtCJlmXqrw}v]r2o];$y~/?S1@]o?"x$u ?i.CO/qm2!u\ >O`ؿov L+.*?.-]OvnQ߿g>P_Ly8Hq˶򶛯ʓ<$TO5d>*·wM|spÓx|_yBN7 Mh0R0]m{oxN Η~u|bm=}gD=O[ɺv?}pNo̹gܔ?~SMC-S/^:xP 'c-r@f9^^d{] Sg%쮲n.;_rl[?|cr;{ aw˸7|:|/?wKT Rʡr_݇ˇo}{\]^>N%!sbjcѽvNVFϚ)C¯7 Lj)>t @uN S.޽;A,mL q4Xre8 rWTrj2xod#u/>.3{:W ˣNgdwy9 bڜXzǩR 쀘]0K.pg?*l]?u#w^,?u1%+//9)~gru{/p.|881p,BuF{`uYMPmBoX+_lī{M {myy}\ۜӪ}0X$cs|rx|74]uW[Cz/\QyЩ1֏xoRir>ϛ_J^|2ɡbd~wm{3/]a'>|w9Tl?X9:5^']&R_7T||.As?А;_}"ԧzG/~;uܧN uHG?T~/h+9>:qӕT?vwg㘠pv.ŧ`iZ-Q&Oυ%S 39_Wo?CzYCcN\ l: A{g)?}% MuVu&;}|͸X7NXTg~Qua姇\j?;B.7{6.?̉{)5/}tY"NlDz"/7U}_g!\hXf듞d9טa6XqO/pAb[XNyIcquG49n[v3R}NDTcî_}hѦMu=7 o<>u`6|7RkϦ[6 ~ vXwΰOӴݧfO˓ fJ &-:U fU1>|T}uU!4'>_#lwܿk.\̝˗KN?XN7 +ȟ޼Zg^P dUyw̃r^WZ^gc573wK݀kk˽`D~W͊F_[_=hyإT|bds?_9+ؖk/{_ml"_VWQcW^X'+<9X{dǾ}~ߨ?TK7gm~H5׼{꽈=sD$ =,*b\2[SgT7nP_:KX:\~a_֛:~obIo_.ri߱UfKegXoyw_z#tUCtU] A]l~\=C>#|xSg w!j-z^ueC I ,V.6s.ze2igϛs>Ks]kVF[w[=?³'ۍ7oi֣ky6BQxX?]Lj8SY{\4/:'q:Δ^ cٱf.ٮ],R3Ե=boSTzGsfYzg5[N3j?/~Wz{t}Iqs 8Iχ9v>>p@؆|7Wu. SyP>*]Z꠭3?T>_//xmoE0p,P868F[p/F`JI{3^%95{ǫ>WY`sm}dee׿:7|#\Jeє<_UgKg^ҌC]z5?O|i~χolz.O. 1C@sܟrE5^ؿھCYu)|-GӜG>E. cc,E`iS_*.'-_/?7F@f{w(+@<;wז?\U6#(-ǔχ~0LM|7yfa7o9]eϖ/Tvԛ/|?P~< /練y42dTs޾g4|ss>h'4x *,Kry}}{T!yj[N05|\w>uw|YCCU^=?7n@pr וM[{bvci SymoySwx%;LtX~.vgw#`@:;sYD<_WwXнƻ9p>ܺiK}Sʉ·; ֧o4.=:(߰[ٱJ4=2)?8o>ڜ7䛏抷}O}bwT}uU,I~es_Cx'g-/S|>mqy咋/.W]yeCf=O4''\?@bXJuWuV|8eٝ;ˁ뻲׮]W6w^Kp,~>.##O_9eܼ@ M~;ugzʶoh"f}-uI kP=^WQ/+,<ܻ{.wXP]L=#`N?3χ7|xE5y;o+\}?P6=\~ѶYò.pA]"ȯ5eb?T=fviuiAYO?XV剺P&o8q1F,EN?_χϟ8^35'·+a]G.ͺ.y-y?o. dfP՛MM/lbqTT}!޺X|eu}3κΔ0F`)#08Zχ +2$d8o~7yss|yA@`.g|"|||.F|:p :o^f}1xn|.wx:x@,dQ:. '~9BdgX|>\Ϡ.Nys[a?/H>xh ..<-_tڜ7/@]je.¯/x|eK]pӺM }k.{]㷿^_,ΦAرF,N[->-As|zެoaٺ>o.oX@}郙@#ٯ~|يqaݦTnCW/pec%ree^;Zw1F~|>LXB2y[Kk>S2da57DsV5ˊq5~`0|_*TDz=G)7=TΫL[m7\4ڪg4Fqpϙz\c?z^Sg/`C4\pNp*oXyM%u-Euۼa}Ԭˇ]~\\FϬcL=o.毙7׽mZ^=E8 ]~trJW|<QzSԱQb[֙ʍd#Frk!㘢ۢ>Tn$18]KԆulur#و'~fZxȦ68cĶ3?F833NגC61E%E}`H6b$ljq< =)(-OF#9ŇӵMmqLQFmQXg~*7qgf%ljCc:6Jl:SlH?3t-yskl}NL,9rKs9>|?ۉXr~?js|g;1-զel'^cCvbb[2gM'NƆĤ\ IDAT+d1WOΗx ?ۉ%Wnc6=g/g;zKίܒ9>\mz>9_v56>l'&_%s|}rkl}NL,9rKs9>|?ۉ$b.m;<Ii;@檯Řj߿ _7y E$A鳵}sbȨ+o_iKq}֮~d_7+o_iKq}֮~d_7+o_iKq}֮~d_7+o_iKq}֮~d_7+o_iKq}oAgO܌AD Lo~qӎ76_ߴoe?s{u&}g?9m()QME/SW!Eَoԯd]y$ܧmї<1c[ǵO2vIq?E_bc.Ƕkdq9>}l\mQ.?ɘ#'s}*}ۢ>]~1GǵO2@U-s?E}\$ckd́)c[%6lvIQ.?ɘ=SWǶKl%q9>]~1zܧmїؘK-'sD}\$cOוrFF'1:EQokǎ$EH/cǎ#GCG6m꫓tm_#`0F,D`sis=[YsHt.;>+?ئ~@H$aخ|}!u({-Kg0F#`F"iӦr痍7b['}m lu8q)8ۨ,56{_bcӸ<'KZ~}W\|ibH'#`0K8xɤǏ7W _z饡+[l)\rIYz?]_!NJc¶ܡ:Fcc=V>܄B;RjժJ(d#`0F`I#D!di 1m۶R1?I7g.E]{~L߆ ʊ+/ O6-0F8M,&W^y⋅A ^1B>K8<#:6_->lcqM^O)mE0r#`8ab/# ."\|K/=1c(.ޑ#gl?M mjǩ+Ip w_sMunZto_$"~l1u#`0F`i" ^" lQ WpϞ= #<1|77RE`>_|dvtxpyWatH0_`n0FYA(Ȯ-?A. k׽umi4 _$6һ*m#gG%֖Pmm!)ybx=袋zE2 'Qצr]0FHk! ɟt~mV!H+2C 4p<` \2g9~׮]駟nf%_>I>d5,[m]p0F#tH@!9}<2q5N'ǐ[>ؤkَm*m+tIF9-mmv$3?.Ϻ0F#p" rP );R$PD0sL8 3S$ho([pk8fU|W qJ*֡lȮ{fO/@H@H3ni0F,M"7|4M:"qv傻ܹ2<³ _單>.I7Bt@ٖ?ap \Hć6q)'uىEW^| Xɕ0v,Osaga^"5ۇ[Bbʫ60F#`]//p8 ܆qx$NmQﲏQ &aavda'g`̼7uo#~y?b} c0F@$XxI*Qm8pIJGF%E}`iWIƋq7r-61.{aPۗr Ȱ5'>gln0F"uH E\=礭WuE;zWD?+#B9m&]>|`\#` Hȣqe0F#`}ga;H (]}tg$s>#yO=v.]; %RI"$.FIrC0SO#G4oa}ld_xᅍ~W6Sz%n0F\"Nhg)]$Y@ Oo VT{&]rR~֌OA$dH#8#ob6En('P>njCXQvb4!,/7:m#`0F ESÈ߈},*'Y'ˏ>5|U.YRHbrǶˮX;p@36ͺ?s5|9-*9SQ`?{ʺu_ސRY#`0F`'-ٳ߿l޼I'$GI?K]GzY)y_bØc޽Muڵ @"|kqqh?Aؘğ!?:ӥb9\0F#G q$dP$>摎d{>$f%稷a SvJ >۷o_+fIXɶ|{73d&+h´q}͌O<ѐGh{L ďS.b/κ0F#0<nA 3F9'SI!'!C$e@ 'b2Srfe_š;\ݸqcYfMC@2ɣ_p٘>ɧ/LmY袋&߼N򖷼lٲxG 7lݺ/}K'gz#`Yغ0͵]uګp#Evΐ'3d0F,0=q =@~w[^CҠ@z@>Kyg c Ɔ>S>Ȣfc'/]^ؖRѫu>{_0F`" G n[_H7?ǂN_CFsm6HG:v-Jӈ^x!n ={MB/~c!3Fw&֙Zw0n!:=fLy` %{f0q1FŃ8 #wm>>{} $Q.9]1䉹;JB>TNl23c1KR b)}PD,Ԏ;ɧe@s77.}" 5Dr&ߙ _6J<5\AZoVrcQOH$$:}vm7fC|8t$U7v0FDG]#P8|-R(QIԎ =kW~ɘ주w%ƌ2 "6mQ}No)ѡ0X B6@R -?g'Xo<]YH s1kŸdLfX ַ,}a0c~]s5%l*3| >L(cG 3,n.R Fa_Y}blC,d_zy=DM'0FwAJ$Q'u}}!5Pɶ&$]R>YbQ 'Av=3A8sBl=Q\$"G~qӖw6y'}i 7ЄsS\Y.f(eT p)p\y2s39? "6ab D Қ;$c!!v]|Ǜ擗z}u}B;hfU!j8jl yclM74sɘq|;1C!`.F#g7$cH2{s"=ٮ*a'lҳWΉK_G[llß-Ɠ"gb\|+c-Dx0.?Q[˗Kf _\<? ܺw1r4?2>X8MGxrLqIYO~̨BD!8Hֆ@lK!<3]0F` ω-6R]~m9#Q$ۜe=oy[AD8A3dV }@nɖ\^;[F$Q ,2uH^n eF0vcbOƨ%tF [ !H!].DªT$y5w}w#`)JGΰu9'eILF#Ў&t>ĻMm1cS$# T'G)Rjkdhc2-ytc9.YC铓&~>ڱM#YK̲-gCa_8(@8O+NM!&~P텺_t6#`RB M,&Նl?!_67YX ?Iƶcl$gK쨢' liHAXȗ\ZMl[}@h!KǽJ aX3Jl,G -뺾sj,rP=4XlW\qE}=ɬY#`tk,>"xzu"UN[s XÜϮN$ڑ&4裶N>$k91"ic>ԏN:yBN 3?¥8Qb b DR3oۍ:oX\]F-o}_W?H.kB 4q,f]QtGF#0_ab/j'?m*)_#IfPs)7z`Ȗv)I D%1#2ɐ@YxzD {qg&P}q6(B  6t֢_r?OҊxLZ}b,< c-p1ɾ;%OX cwsXq&;χY^ͪϬ0F# I&S3sSy0F>t%qz &|KoPWOiJCB^i@N0pk;y4$?B;gCQ=U Aup2; +< 8^UiݿB3>YOwBǀ5x9]d+|1u "˾K,Ѭ`O|ތBӅI/FŎ)"Ō6I*QtLjW^I Q2@QjpIm:)1Rc='Ffȥ@$?u B 8T1}N/KDl(]^A6;fYyt0 Uym$dY[f/|׻u2K '3f L(:zWzq~rrܪpa#`8=3;P8gUĴjSn$ >JlQ8iErx8fdf(쫙@98c9| k|q 0!R7ሤu7w  IDAT+|3Cv=<ꫛ$ X\~K-웞dKou#`R@Ǩ@*9mMj'&|bзoܫl Bp`%M|=B?-԰$H(B;׋/21^v1A%q<Q_|;̎@9]u0g?+6U%yfn.k#3s &J:=cj]JGIr4p:dyٟ{Y-'.q}G~E| ɕ1hfHɌ8F(Q"}cbzO10F, (?/ m*ɇ6'}؇K Iԉ, '`@Aj<ʙj/l$ Kl #`0F Za!ilWIj'$U'e ',‡ٵs/D10Ș?7f b,#`83/AupD:{.ldG}pv չ9α_r% r؟؅*ܤyu5V#`0F"ґt?ɊH*o&]~wC-Ot Xö5fxf*IQ?0F#pzȤzD8p8O|wQK˿rN&<˕ gHwFz8E>La]9ɦ#`0F,2Uˠk~8ODych*).q'4h#zWQиS?zf+8q*0F#`șS"w0(G&lM>QJkm+ ]N@b3 :$]믿1ܹQ0F#`AO,H6P:mHmȨk?b|_q]ߡwZY I@ dMei-PcýK#`0F`>!i6p-Im|ŽAU K:M8(g*/An)$$=is1F#`\"R/r n?yF8G!m HF-S$щTޛni۱cG+1lkO|=Y7F#`d:2r@^ .>C|ؤ#۶裼'ٶsh:#]U˞eM9Y`nhrkmm֍0F#0)d^¤)4|d~ZOrqy 87q&"F$7m,>& 9U`M:W͓=X3/lڴx!HSl|ln3F#`@m{+[>IVo37onKٴALko|@L;噭F6iNlaGΟsK9 'fI9wE˺83\^jUf5C#`XY#G4yî$^[+NM:P~(1|g%r5j0Oj'͇?7dBy#`0 sɣIMN+IwHmvLC;3U R1Kɠs #`8;p qŐ7wp6xb?qq3̯o"t% F?6}RH*Җ?<͗ʥ`J勹⳽/ߤϵl<#Fks|/x9_le{_hI/Ϟzvѱ11nr!)s}|oN_7309v>&PKGD]m]ۖ?s|Ej~g%3ٯ c,zW[S=߿>v|Ecsڲٿ?>u|ՖTmCPΒHCIW#JlʡQT,R%jTnIK|y|'|G9E-H]2Sd?y>c,z_mOuER9_$+_ecsj~k,j'O^(s>W[S]cTdΗǧ8>W}DXܿڲ%s<>IW#ʜ?ƢՖTX$.)NϟUQ}1=짺"vɜ/Oq}䕯2e?5IK|y|'|G9E-T'4Jנr>{L,]e}1M]c$Wsndz'H+9[2smo}LSX$[-6I>k,zέ\o$s5IrE=~Kf{mIS$ҏv+.E)Oj}|ٞ빿l𢡊ӟ=+ߤ|ٞ빿l𢡊ӟ:񖏟I+Kǿ?xϤv%s]~]@ m'dlc39?vd=}4INQI̡(cG8#Jxʟ3KrP>%:1Ht?|dR|TXKWһ'/GױA+b'(%#vUp8 t$8MіܟRj{t֞6__|ޗoZ{|}񹿾z_ii?6N>qHjP2AށaюMv qm2x?볇Tj_|='?z_>{Η}}Iez_}?xxs\O//tiǓۗϞz_|}|ٿ}O;<޾|}/}ţ#?Q̧h@WIJ*>dom  #d@Xd#'+ƈM}'[ms:?/z|ĸ؟v9j#bcik+}>?9>os<}ٞsd\o/'z_||sy7_Olxg{ͷ?Ǔs=Tߤ­K/.k֬]n0FEC;vvmƷeyǾrkS.ţNglo_/\oK}K;^*@[zUyݵW֍0F#p KC/i&\nl}9 QQ*Tj=Jij|mA'(ٶńy\rR>0 Xxˍ&#`8#`" Na'N] T]zN'wD$gHJq qPҵ?m(7\me§pHg#`0gZye˖MO-e]'x9cٞsrc[ԻčC!~H.~ww4䯹{6?ei0F0q:Lx}4?_ug$oh!h5IPzHDvb)fDXl®|s.׍0F#p"}~p{{>G璲!OI*`I&_;G$[80F#`%p8ge9V$Q_lY3cPmɆPmԥ.$E;KkٿK/#`0g+p{/O[_waÝ=0OSWz2x68IfF)`1H$9CQ>I6׻w;X9^6'd&b0F8܇=pGp#8Uū2_]m2޼ %&d"}vbTo׀{ƕGis1F#`R@b]#. ?/#Ǣ=ۥ4iؙ=}֯͘]_ۍ0FqϾ\?TźxU`Q'rJ_IjP"գl‡|$Į{VqP4F#`و܇7_ȵx$~IbzD9uc'rhcѹֽ.F#`X*{HË4GBgIv4IG7bh+rJ9v G nxT0F#`FīBGHlb%sr7p[b%U;Iu#`0F,etu3xzW7CRz X9 'O>ؤ#kgӎTy`T4F#`RBn"&I8fFfpTRe#^9>*n!l]0F#`" :2[އ|%oDIӖ[1B=d˗(+V4㴎}!辌0F8x22 lC>8ґ6S١ 9a05jGd4.urS8眳]duYO'/C0F#pV# nNS"8gTOLdvJ2C-hf!l=oGj\#`X:2BF |!_1o3 L_>#,[n_:c8VIau;eeݺʇ__9B}#`0K 2r-l])K9ohPE='eA?ɦP꾗^}`ty'w]6#`0F`!x$`H\Mm5r@%M &o jw3F#`ـś'fȚd_юNij^i"b =mpF#`iA%^$@>+>@5('emT2ndۨ<#`0F`) ž+INmHDڰ{M c]d{P1]R<{:k@۫5.#`XD$="iO `N5I%*6mGR~F#`Xī$ՆlMܤ76iK6|U#cS[(I]}e_1#`0FG@|C"{FDJ?Wq<;IȨ؆;PRIŴq|f0F qOIHȹ.;AWNdԱ̸,2vB=:%w(b[?'9WBfԙ!tǺrF#`Bm$W$b u$,۸m9hS.ۍ0F#IQAJ,K#})`%kX(ogl7F#`َ(r$TDq0)O*m+]2n0F&F="q$1=L5(HR6rvI)k=}O.xeyݏIzی0F#0 q+|)Ԇǒ|KyeAцΐd]cǎ_.ǏrcXsʺӘE?F#`C@ ș/䣺lٿ/ى Pɐ)`1qo[߇*v)++ɋԸ-[^V>lܰ[!Y#`0F`ڸ2]y!|QǯyD} ʃz׀cG{_(˖_zJV\YVY]VNyLF#`C@M%%>GۥK*Vb@(I{%cMƜmu&'7]sN%˾K u`0FI $Iq*q:dN:2n $|o+}|A[_ua+Wf0F#`:!r)?Qeo~C3֨s:v MmIzY}{U>5K2<8+ d0F`#/F ѣ8 @~ȸmx| IDAT}ξr_׽~}[<}#`0F q/lJE.hWQbz (|5\m]RʥBJ_/-iWt1#`0K q!Iq)jFڠ+C hWjk\lݺ0F#`\qœl?K& w $qr=h#`0K8E2qq3IBF:Tљ 6l2qs#`0g X]%jUȶ8Hz XFI= "KCBȨ3Il*zJW0F#` ]wpaoɎޕ,t1VdWۍ0F#T9cő6!'$TP4*} R9;6K#`0F,ĭWq&!œ$'CuG>BP,9a3dd#`0Kq+0;SQ"[oc|74ؖ0QGц6?u#`0g+m;>E|\_$`N[ܲ0F#`:Z N%ۄUM9DM1QbFI;PgH6JlC}ni0F+ԦG?pXI\7#`0Kq/0.BvIDڄ|UЛ@h@$5өtI #`0F#wGC7d} sIn0F'ɢ.$rȞe#K78xHZmn3F#`ٌ@[$F .!^%IrD?؆Qd_<`Mq|f0F qOIH6|$l+= DtCR4HIŽje4F#`ي'ΔI]\K/W'T2:ĆMR~[f3nn#`0FLB@LGo_īmg} f0Iyt+lG-l.V\7F#`Bȑ#esm+V+weH#[WK~F#`8[9c"GjiS$qCFE1~)['mU Ff0F#` ַ}9R3(btq#04KX׍0F#Yc#GB eq#nh-aL$ =0m~u#`0F,582~&$sHcT4F#`RB r$ڨ;-sȿe[r($2Q%ci0F9RN%,(%y&T$mUbA.]6#`0F,eĭ rg|8`}v @Juy1t0F#`"F`.8˱!<(HRj!]ki0Fx2ș} p6C mIbzn0F#Ѝ@PQhQ1"H Q 2Mۢ.d,0F#ȜzD>QOl.t8KrFRbD[cH>F#`0ĵ3(ٲu7&ĢcdܰG-0F#APQWr׈kӨw -K#`0F,UħFx1HK#C AIeU.(]0F#gA"6mWƀINlٷo_y饗ʱcs9_lڴ\|.+7nJB$˗hST4ұ50w} K*/vH]qn7F#`@۷￿r76Dpʡ9/ș$Xң̺bc>bTUpJ$I66Kۭ#`0F Çe].nPr@Yz&PMYOM8VīM#D#( c#`0"g>3/OcX}-T?IwN%,(CoAQlK6#mfƅo PmL-/)}W#`ff\;߅>kIH}z>{!ORy$kBwL Q'X eR6H#]2Ɲ]ѿ7ʣO1+F3 ܸ|]x^B͛ ϫ<Mxza׎rEg(1K`Q̱D@﹯W͹ƹ0F`?q 3~1a)`qO0F ""Z~w^ otژ dIg1X|q(ѵqB|$_$-~!s Dd$ $Ձ%sn׍0F#0 oyƛ> 3{u]>:0_"΄[c=q Pm>%G-vہ_*l=/-^}U+t󪉇ϔ͛+\tak֌+ɧv'ks;/z~c瘍㮺E^\mmWU;v*gU9'O]< [|un-orކ >?7ҿ-;xOI H{JPKU)ZZ[RKkiU;ڵUՒF,HbIDIH~'99~s93<3{_}2g;vpﴃ;{$a˻{,:tccUy]ޝ^G[}v耒p_u}f?}o>`+??ݜsc&n5օrIg̜Uȇ4.n\7" " %0y1bDR'+D!J_/ =,c'J7$@‚{6 v@ 1e}`ϑϹ?ֽzӊyfϙN?"7os?B#~Gzڛ2(Tz1ˮv^qM@S( P+o>wig~=ϻ*w 3q%?w w7gY^nO)7LpO6}I>0$" "мpNo ܽ꫙U:A`^V/{VYg`Og=JؤNAM0DbP uJNKIi;O#wĉ L>]x_Ѳ0IgˮWBQ࣏gWRpM ?/x3} VI_yyw82L^{VzD[v==rTF" " -ӫ^;6~kKf'L<3v:mCimXJW<00!Æ"`XԵ-7mx? Ƚ5ϻ?ߞuZ!K~ڴM7rot ws#KǞzںp9n?=p?+'#W/R6k<#Ck7h?:I:zLr~gT[3%8x{?oZ|&Gxm 0 ֦vyx5o˯M<6i& /諾~J=[S)" "$0/ `:Dq$E42^oJI1A[%%~65uA>uH}K퀽tGBvv~\KMr+ k]y-zT~} I|H˯@sN;a{lnנHҮdm}+m>k`J_W^k6hf˯O8տ~lѻEaIyn8bʿ?9Et$)CYKBY@7" " B%!Dp{2+s/#lhd>-eB<V#uH;mu*OnZ3V2 0xymR+cE^niX10]r !f:vۙTnD@D@29t4sR& /% u|o1zw)} 0[oZ׸RĦo~c͇c`fT rt|I@iڵkܮGqg'9~s$PznuF4m5V_ô- że.;l  ^9?umZ>6\d[Ooqϟ_u?aG#âR }idbpFxy쇵4>}EeVgPNJv8-_:`0*%aT0IA0 V^P{&gӣJMz?n{b$g^(UނֆKG@DM[a3;=hdbm`%^n޽0$svʱ@} tޡm6|=#nԩ%ݢ/;TǾQ> RaEs$,_%氅 R]Ss+PcC@|{a?&Y*-[^gz 6z>c<.5I͜m>ڵm~s.k!g͢Qk+]D@D`|# 80 F뮲?8/0LV8q >*R`xpDȟ+0=Ki ALllV^ ;$G05)<氃^7!}74E SN%ll+`3QA N?mn=~En~IٳgŎȷ>}dEI5}aR1h<0C]JI^:xoml,ˬrO֏25&~KQ>~;^~0M|䔊03R٘_bd&gCR{Y.NU„-n%>QQv8狼h^MI|ͷFG'{fn[XID@Deի;TO1//ö0&NXUalD s~A/o&Dq XhXcu$6f~ M\?=#V6@ D08zGe@*i&N~/acmwZR{u7.y39q8ж=N" " #0xp|Xx*C^{~3/e' r orJ,swBvg\pdzNF})wImo&M{agqqBκ&^Mx9Ψ +XW-۳r1 yNMY9%؟G&vi4rؓݬOflr~=Q0h+c8ݟ NnTP+b mޙ4م:i#)" "XO6r.g}6:ZX6F;; ֱh b:7Jt~1-=c*KһryR|`ϷwM={>HVV±exIkO~vTw@E%ѳXfd~fY~볪m)O9fS?I%ԱrڞME#Gzf}Sh^.|K6-c0gp_% >lChͯr)-}QOFQ(QXkwq IDATS9.^U^znM1rJNJ6*b(7đNN#`@x|؏H ʚs2l >8n*_]~Y.C񔣏+\Q&=pڑڰE@D@,Xs5YEoV2Myf00C^;AZviu> pՁv)Cۖ|>{a~pDY^H/BX̡uvd$,,=F1w* VſUql72+ ]f5}g)Gle_{W oOfK d9h^nefޡsFE?J" " -fmVl%@~w}wB͑ P>e%u{=/K*KnLܰ .@,'k՗refE17]7w?﬷m߯~S=b{^ƽTjǠ\E[`33vq/xJ=V ,܇sTy̆C_&Mƽ9|?/aA`'iI+Nz}0e|@]i]+W02 _HɍA'~,7{$ƜRӏ@c vx ȄMwe?㾑i̘;z5b"\a] 0҄zmGR6y,s5&? xP>,ZB~Yran'RK胲da9QmO:,d>%}v( iGزAP2?l2,}9}ö)KRD@D |<Go0;6 > 0 V`e)>m}I@p^/.}Rq%!Uxad iuc"UD@D@D@D 㧌$Y>*R`l'v7%E@D@D@D5@W%P_* y`%AZ6.uJH@k&؈,^)օS"[z)B۬J(_D@D@D@ tJccZRX'c˱&z buPV+`nVsguSu6" " " " 岰un'#6#OgF ۘ`K:Fx^z~Z=^*倝:)i#)" " " c#Jz#$s16J;j:l6SD@D@D@$ QƞeHe_"jjꪎ| pp Ya^RcF6խM9z^ʩ/8YZ'#6#OgF [U@tnmw(긯(DzSn"W,?" " " "d8sKvA"8à#cX^`i*%1,i b2/V*ʨS~˯oLURD@D@D@Z|ٞc0nm P(M:Vx^ %:`Z; ,%c+J< _ DnXE@D@D@D@=JnrzSFVH2Xpz#'YFe1e3z̗D@D@D@D@F;q\2hz (A+lO" " " " `Cā8PW>&@CH<&:0l@>uJgQ@,(d^˚FAZƩSFRD@D@D@Dy $# A/7H%nrRr|FD@D@D@T QૢE hT>D@D@D@D@ pp 5*+ϊ2DUt5)G@k (1WQHAZ=%|[PvOD@D@D@Z*մ TD@D@D@D@ ,~@ ˙D|]_KnmĻ=<@1%[]9Whׂ ܗd{8צM׶mdRU." " "P/ і/ts?>3_T/ Zܹk߾}gTD@D@D@8xFz9O]FVHUNF͛f̘M>ʠ>u(`9mFD@D@D@B|Hrk`h|__.uh\.ݧmk` qB'}lw> #:tp:u_|%̕D@D@D@Dj y V@!k6nmsoVU]FLqAb3?C՝VEZ>xۡCǚ>;44:," " "*pp˅,`Y}kLҶ:m۵K`ٟ1dUD@D@D` $ 9Qj]wّW-\^{w>{~ؐzn^˹M.O2ÍxKWNj&O>W`%@M =J<ˁU#,KcΜ\9N1=nuxJ7{hnr`sCV{" " " "В4Xi)#hGV_zph.l.jGD@D@D@Z.E$#XG/+.K[ND@D@D@\~Kԑ:”+X(\~Kԑb  S>[ KԽDlID@D@D@H`* #;`ݑʡl}pAƨ[sc\}~~5~@rGz־d^jm۶qڥc6E9 "J[=066Vja}cǎ)?;vp$5A݈@rG+ěm阸mQ%A" " " @:Y (Z+GpRKkR4XE@D@D@DA8D٠fj2D@D@D@Dypme\Z"Nօzsu^툀1vDK歞ߝ-er*X06D5pI-" " " "P#?p6׫w" " " ^b4sR85dG)KuN" " " " i (QjuֈD 1F(dFNYQ_(_M4BTJ7 AZ@RZ 8mGҐ." " " 'z㻥D@D@D@D@@`VN`lԎy44:" " " "U'؋kj?wyuY<[4@`cL{]`A:Cw" " " " UU -+u;;ȊVG(" " " "P PN|em^p( nrGcgԦkpmT[D@D@D`I%2,cuJa$Y0VκVͳ:%E@D@D@D@K`A.%ӑ|J>$ I7^;?4AZ=mUauk'O. !ۈVӱ~/͛\;v̫2@\W]v\۶m W6cuR@Qk-0՟ꋀ@k#،orxRj89J7dȐRͪ\D@D@D@R^|<9ai**ߔBZ%Ml'^EY=ɬgsZ=2RV^D@D@D@Z+#Y[ylhG [uQVA{6iu[j󤋀@k!`c$7sOapiFvHE@D@D@D@MC=$X<4'3vvL@1Uzqtm)QZ*഻N)C[ܳ2f<h8Piz2)gGKD@D@D@D =`A3rؠnnh+Y:." " " "Pr+kc,BZUbuRŇꊀHqeXF ]\27Hͳ:%E@D@D@D@ldUw66d&ճ`]HY" " " " i6fzڪ;zj 3!^~tz%>auk#~4`VζO~D@D@D@D`I"8 YP*^`}@Rꬔ%mQu,?`lF +ksSEw NK6iX9$E@D@D@D@GhV-TڠaՉ:*DKV/Ѭn'Fil \>Rgh{h'AZ=GaC,,e@_݋@k%`c$x˲ hK[օ"Р{6iZ|UYa^V0?$FV^D@D@D@D1l fr[uˋYF'3vvL@1Uzqtm)QZ AZ=ݬD@D@D@D@%2H[?>46P^Ab)B*hldr C={ ~rdEH6,&PNdm啁խ}*X% uJg y6*<fr'Ov|1c={ϓ*۷w]tq]vu+ի[ve5[c(X,cuJCVe?ĊzN\D@D@D@J@l1n8o?0|޼y״i{ < 08( l=_1MQ%91!J:-!rIIܿdqKn7wj5nRLVgcyy2fz0DB9, e|#_$ѣ.G} 4( ۵KFeHVg\Vo`̆ԭSSV.!BZT=@H>sÇwSN jG@WÆ sK-T*q`c$g(|0>SYiu6j:X&)" " " Y=C &KZRthkx܍Ç;rA:ʐby KSD@D@D@#x]6l)OVc3؅zE YkyɓCyv*kY{{mȓNOu1ا uS0~)1o%ƺeYƭ@AܩSI֟?Xcǿxsw'Vj{} ו߂̙3׽|͙4p@gmߧ=V,ٗXD@r`G} ^v=SE*Mh mn喕V#֢,f:@6T6^} ;Br mm5~S}˷Kk~_z\/ ;6K<ҫRqo6ھ\kĿM]~Y>ѾǧIg镔_}cIM7r~ءC1cǻO=͜I^|psup.`ףGeͫ&D}], i,˨nXv@Xc %*Q/Ps޳oSNs}D W~zR>> ߙtOqwG?ִ#N:!8 {sE^p'7IcNeQ׸;/E@D;rFv}wucm:CrR ۀzkp6V˪*X%Ŝ61yl'$[r8-~/64ϸo^i `N9=xtWW^/Kn94 /:Jk^4=m61MW\{U7tӍmtl\?r<bJG6͢;1^B[̋2R1@irQrFCw;ϷG;`=S>=3 o{zs!*;"Kh g=ȢuG؟osuSooˤ@^]एm֭Y&!I6znm깋@Q! 錺-[t/8݉nwe0~`osCܤw{?c\Wph_j)S?r"_ Xo(U^퉓8\aOn]Mh{S|wc~uZ"͔1c,7Syݦ-'2o+5v[ -c] ѽ{.Z0 9 viu? m[9g IDATiB;eʔ]92 0N;￿@}Yg3D[J\*#J8:[jkE]1'9Bp:xeJ%A3r+1QkoLOiwvw7[y]ޝ^5}N6^JOx>4Jb+3N<ƭ֠Xq!A>8  nˡ}L~OLjEW]ܢ?6|d'L3cщMm۶- [\hzk.ק~)?z ?>ýh*u2FvEZL<#FHd(DX`9@AX13!y `߆BcPҎ2f_*u)K7|̙)St/4Տ lʴSEУEIEi\谚4+a0;q~CʦajՏZI ?E0w=cN;˿V4;':=cE0'n_ Ͷ:M'Gd(cO=;T W} 'Qz7rJ=i)eݦ5#6nj0"mӚY4ƌN|" "P [ik`wjfUF$K裒{IVgu3Ѓ4r*ȩ>*q|qw„4n0;رCQ>VeGZb[Sc}>h [>cuM-uW%+`O?\W[֌"9wE#X\r?>bϪ md;}Az.j}V]%q3l̚jP7" ӫ~N;6cŶm+Gz N{HV1=gmẹMs쳗ſƻavq?M氱WpKѤv˯&^a/ \M#&գOl[E@DRTjF:G:Q7 fy"*/;2YQGE~@kK5Ȏ@Z۬hTN5J Y߭1 ̗iw??GQ„M6Xvz0Ϗz& xtov[k O}Sn˯6^h Aqo1:?G}f}3Lx @8㾿=Ddn` _w.B?C ym«Nlj?Wn tKIBnM'.Э/Nz8`:Xѷl?/K-UlaH&$E@DXXKB?zg`xW6Uk_rG KO6Bụ;k~QZ3`ZI(c>dwv.묕 B#~t #VHxUn2}_`#|Hx?w\wEݺQm1rN ^= Ls(?T|{Ww#ULz#)|> jbwv}aݍ]暽Zvq0p @}f@YX~Nh?2%hI9t43TF3Vʊl9<[2J%iJ6bdP+m( 'Tm«J0ی$YK|ypov[kM8vfȺa50۔`n6㳸%s [nsptڐuNV lRRm]s o"Ŷ Zc)濝_eDz1[-X߮B,zhq X {d/?,)ЗF&FVgs^gQ*EujȈ4VDKG^bďv4uȱ>dgc+&Y{cÄ90[U^l4zy}V*38Ӧ䱶*pHvsU4׏?[L9ԏV|$eWu=YWjt"m6l#o=;c]K=mǃU>^Iݽ[d}ǝ}jhg1_|Y3/$5N6XϨ$Gclb*" _:8& KZt/GiNKfsYf{ 61{˓@2lPn;1-5_pvYO?3PM{~zҿ=_02}#(ಫ6$B+6-ҁmO8yStC~nVŊX9l؉~*Mx}̑n FFg|eE@DZ={t7Q8O>B?:A_cQڱ˙{+ˉR@letN[XYLJ [}_ݖe5]_yqcΎ:;d^~=7+<0ru}q^buk7vۅx`Mqr .v+&VFqLSž ƿnQv7ia%PKvhQzh#8&{gdUXhԍHW^{ 8qbEK 0ƢD= PFY_IR rʰއ (g f'q.쁇/XlWWnVpPXnHUya3lؘ{ĿFm=td^!qfo~uR 4MQo6#?< FE? VZt/ w0jgOc nAk8q: N*ZW%7֣G:thnǑJ?9GIVb̘q0/Ve@6@cH\Hm',{*ϖ£긡3 rܹnsCw޳pQG|ӏ\~ͅwW_$b KhQpH o~cˢ9rDqʄ` |8SӖ)`oTZfsR&!Vڄ3>ٽ`-h&3D0 ma4ݘհAdnG+mˆ Nm:G unaa.},G>am?6l³#Â@Cj .I+V<8K٦EIz߿s9}ha >l[D}ht1ճڵ6V٬rȯM4X@G%2,{[ /aĒn\ d5`Oo3r-&e"=cƑLnq昁1U4:ՏL@K.X B,8SR^}ZkUV8wW{n: #FR Dn~wݡ~?0!^*(`d1O}hȽ|{/ipå8j$N19^-W^\5~䕛DMkÎN&塎`KO62t/" "0yd7|xtnfGۘ:㏓9`Ҋ+&{)bM/>'Fd~:~UYz' ϘF9΍;. \=Y!7ecYU} I@u?fLy]vI^61c$9-S@!.-&gG#!HA)yKRg`##цranOS65֧L.ʘ >`W'槜O5}o ̀m[VmϬf)r po{~=RVJNJu@= Pys=W>FrM7M;ǿa%lGV,0aum6=[N*WiW֚`V[YmU,?`aȾTŒuBYY/?at/" 6}۷5j6/$lf5ۂrʿbn}> L̀ytڔ x5ְդבW&` oTTKKq^0T2eJEnp>^I|ļs~0w7u0P*0Ω[c9%m(x]V4Mw" " $V{?L;v`AF tgϞxg,}<,w9MTQDb:OvV'Jk_m-^Ljߒ٨o" "8 õhN.,%yy)%SXm@ȠCZ%lS"OID@D@D@Z+Q([ƘuYJ؄+`[OC$" " " +\aȆfaSʞu!vD" " " "Z 1Bd )SiL (u0f/lhcXx vC9R2L\HM?X^*l^" " " "(?*! AFပC91|[6a?~|{h5+AZ`  㽕SИ``S)>}PZ?E@D@D@D@`i/>llrA"S#pD?) .6HK!CXRD@D@D@Z_|𜌋 c iS0DB]Z604r)$P2" " " " Ka lHIz4_&|pD|I0b|g23$)úFq%TXv< Г@22SQ2V-dV[F| 03ژ|<ڔm!儝:mm(i#)" " " -F6v"gr؋!q! lqOYr%|(Ag0H1oaY*`8+Xa2ܳsVythmkAZx 6̣ eB{R:,UFߔ^6 (M8,< IDATt(5ʰPFy(Ni@k#81/20a9(Jm^O%hA.pՙWI|oJpB`C[7ЯVa{{ mN1Ƣ̲O1%Ch,GM1Dh4vَI@D|g^CS]I@TbF耍Җ (QFKF1 wQ=R%Z6eXh+c(i+)" " " "(c`FYy# ۼRm\D@D@D@sx :/<-c|f`c}JaJ Cú$" " " 5kLsMðgϞnn*I #$O66ay^Wߎ~mѐ~>."D#l|nsr>>,N:\KKn;]~lE2y#BZknF D4r|0ѣG%ͫ&D}], i)]y#v(Rƌl封=`^t-7)SM$y-E_RR'͟_0[jIA 7~;s=Mx;e>\sϜ9sq<۽zg{߸ <-'9zIdaA@FI}r-W0bm٦@^{[Yh )PFr:}2`W4H'Y4Vn H^(g>m:)[r,~/64DNK/GyfuoLF3{Kn94!/?*}۾/[t_jD@o ݋^y<bJG6͢wvKQNLg|CmT40T!mPwNRZ3dS܆GѬO>qόzmPfYvO|pez_uj/7ᝉ7_-ѓ>Ϝ&~ڼI _jI>Fv[7rH7v,h>-${}2 Vyh:F풨| Ntc'/ ֯ ߝ&ë6{ nm?ᔩWBOًk-#x=qykW/6,XXޭk^բ)Msx_`Q.[צWE9cF=b#tDtָ^SjksN8HQnض[N  @3پSL)Uw[}գuPN;￿@}Ygۘ |(g^}&}z3BaAҖI|AJҢ/?wo/sS>Y)_$N;BN9T9oʝ^|]q~WIjv-]s'`{K iYTLjb?pp;}PϑŶ)yX@O;=_sW]x4p,|2{ΡG)x3bz: VKe90Rk'c۴ƀcd֎$o2{(3zTnD@D9J^#/Xgu:AS~r_/kD& qϬ=oJ̠D~6=Z!IHS}Nv(l-i3ۏ(,~7/2;{l?եڄ@Ƒn D_`Pd9m< zVYf+z̊aQY[GJ|k!&R6/>M6Xvz0o{& 1tov[k O}Sn˯6^ea6E Q1:?G}f}3Wx zu^cq}{Uwg_a _wS]x~‘ۄW 5=')HO3|/% ݻ6ힸ+"@l; XZcq>GA$gY8?y." IkI?zuW^ye~b1RL>?<؄l'ЈeXva갳([Rxn;=묕 N'F@/iwX=1‡suW$:,߭#w~T!`gs6F|{olDUL{Iw5=oFOxnaF xمn9eg8xs׵ Cx,?OS8qm;l]*\4]#Yp_m1}1>@ yVkݒxZ߯'m``?" 6%&n*|GI<Ǩ"90Hےӆvm`ڵmU[_)Yv~D~M,m|Cq?}5̰">ϿB=;{{9E~թ!#Ҝ[S/h2!1G[;2r,}|XNJI;Ǖav0akk]ܖmF'!oJefv~4wS<r s aU \?a~1[ɄJ@g82os|:8pHsM,Ѓ/a0_" " t/O8p`9F뮲?8/ ldpkm @ИyO2u[bhgӏ|]q<1찺o=&܃u\pANYR1]Cd_3B+6-ҁ[l6`]'c/z|U!?f7_XK3g~RQb#3;4OE 92m󥋀@K гgO7~|ӎ |ӧO9?.gNЗL ^nl:ȳ :SY }IM}>lv[|0vY|pcΎ:;mmd^xll՝=6{ձ oϗb4{)R)\XŽ3ߋΣOʺ {XλE[A\T@S,ahH[&]D@7^zU - 'V仚l|eu Ay6>5F(alu[:2YÖAi}ϪS' |TapcXsEv8^ RslWWnVp4D܆ct`~^ < ,eÂsth *9~ |T_%}k? %t|QB]gP¦@0à'>n<]b7u^3qn\~?W?;S>Lagӗ\sCr>+K 鑣W¬9h6Llۂ966Mwȱ'' _p^3w^qMrY;,<90+YmGx^04ޙp"MGc0s /1cǹw'հm:F26aD'ui#m&;ҫ#6x6c#F,nO6r.>lt-l">42{ m1bḶ%: N#/-yX&¸zmFdryl7̄3yp1iL_vt5}b2*:v10o룥?9`tb"pK}8~l3۟ paFc{I}[;5= 3A<pD<Ί wT 6aw<&yWH~w] EB1oo.5lQ>s*Ya0pޙKQ\o (*#DEcDѨ%QqMwk\-qſ4EEFLTvPeD\Pކw8]=3w S3̜[]K%tQ !l>%G#(pde-]DPVRFN6q[׼٪s} o:<ğ/k7y٧S=[p1sPߡra mCt%ssԡ;!#ʲN;& ϑWmW͌-βV|e9âs _|@fzA 064.cK.X1eʔh4<f5CR>c'W6F:C A= Q9 Xmup]F׮EE7}@7잡cir{ 'L1oGQdxW8ltrrAP{Cܞ?l%C_8j_wӋuo.~m8.{cDGwض_–ZǼ7]yitqXk 9W͛<ܝp/>OH`wm);iDoذaeh mF~(z-(g֬Ys+;e6Uقŋ5FERb^x#,5ao!Aphu)ZMIp߄\e>^K>aklsPQ/椵kud׭ˊë|O~VٖuP_l ]`f6h2.#iđISGLu…A0mF^Xh's>? +&.\MAXr[?)ģ8x @𲉰)mtSf}J[I:>`_*m[(} P2?Ok18 IDAT>(lX ISJۢ ,>_ǺLD@*M%?oV=أb"K ]]i4`fLr`m6V6k@G^Դ~6V72iՍ+" E^[~lduIfmPn}$٣|AXC[:eK׵C@+YL+TE@D~_2Iu¼h#0lP[#)" " " "@yVi, )Y+ aĆ(/)" " " " pWx,,uͼG,q QC_&i[?m$E@D@D@D`\U(~)>Ŝ%piu`p#VO" " " "P(qek#y6>oN!uA"3H6|&2?" " " " XR׶AQU`$I?^I'" " "  5L6b gyiУE 4Fu@=~ Y/om P!bZht]p 3/meHL@,l|G6`H=IE MIg zZgQ$" " "  $HgB{ZmmXmtR,eE@D@D@DH'ٗ:mVAzFжmpμr1oٳcLiVʄeX}îGH tƨ< t-" " "  b($cQN Z{ڲ?]@C"J?M6/g4ȋ$`-D@D@D@D2kA2PlԨQdm)Q'&kP :GlT&" " " k"[$a T^N#QNk7A,)zR0/S(KjֱU֓." " "  7J0@Di(30J׬mSAr:zB_%" " " " Z6 A1B>uJ#G +R(2lC[v&ЧE@D@D@D`M'PGީ.,§>5i _D@D@D@D@\ZT,+Vr}(Ѐ;dDiu{E4`3Q2, BZ3Ѓ;#,tA{%W4$6b : m3I>P=v0yL̃ ȩөJ@'XOJtԣ RlAXvl$:E@D@D@D!`Fɸab$6IJ;_~T%E@D@D@DAx7si- o!ൕ-JH6mv~uYlk)GD@D@D@L6xZYVȼG6| ڱÓ@`cq$" " "  Ҭ c+ʤz z4Ʋ4hmPR^9u(OD@D@D@lWӆzl0 )8N,E^U." " " kHVp]n1}1>E H5 XI(OD@D@D@"#AYE m)Q'5ʴBe:d!铺F]%hllŘ1Ƣ/i"8)thˠE@D@D@Db&M(C6fm%^l0tAې嶞thQ%JG UϡJ?Zb,Oy6ֲTqSZa=G#,dEJ 7c_}N 71½Q]X `yI/tglD@D@D@D`M%`c0v=#ڄy.V`; Bg#QZy^Qe#" " "  @1*`4ƎAY l A tA:gXgU_NacR<6Z̃ ̧-}ZRD@D@D@D`NCQ1CUVi@d t4D6B L`ceY֎ .|YG!ʕD@D@D@D`8 1tN=-,>lqVD9ʙ2Fy" " " "Pq$^Y/+}#Rgkt<%h(3!AZgE ?m !e9,N7z" " " "P 0Ʋ}ud+ ~hC= ؉PŽ6pH갳(SX1^Y*ʰX‹$,6c]HvHgרQ4U`F{H$1VB2 b$}RׅP46bd#QBmXƼMtȤ _ID@D@D@D 1v茷e6z1&9NҖA:0ORD@D@D@*T`%1 c.bE ̤1 +HqIl E=aSI[4H4 .MDB$E@D@D@DK,qgvsq-rK.u˗/\4iĵhµjʵoulٲUM;1nDGC"UXBGV3lG2ZID@D@D@!Xcڴin„ nܹ.Kׂ "{k#/8JuTCVgrEP 3H$4<\S u{ [%(Yk#^Ǐw;찃رc9nj\Rqu:d) i9 #I/,'" " "а |Q7qĊg}' 7.86V6{1vB9tЙi0yFbWQ; JI:ؘ !D@D@D@D8/5͟?q(xnu)vu[1*Ik'|t6`=J y̧Dd!oĈU >Kj+!.Nسm,76(ن"Ǿj'fm%TH+1βTZ t8;:b>%ʭ>u#Ig_mCp}{ʍ uQ0h<)k┩z66͚eaM0yfuO}]b[ЗEO7q47BNӦKmVFm$2#c_lǸMK/XԄKZ}{c)H`Cr%52f]H"fRfq@[HkoQJ _mO>=ӱN9hۢf|7 ަor!嫓ꆡugzh'r7u_z5۰+/uݻvN ||Y}ɕywEyo뮼t^_z=OJMAaoOG剀.`׶mb4 mvҥ꫃O|M[2I/pM;țzWGʼ F^aSG]LlvuwQ/#Y̨^.'^>4,1m-X; ܤca}̝z%yqo3/},{~ӝ[sj_~U s˯lD@D݄, #~c:X1hР8,}(׆m@Z=?UI/ ;gȣSVgglo y5bV6 1FY5/z6[w}"%ϻ==t %B>Q8dwgGטmfНrb~ QB^ًJ` /n ߍQr ;cK>Խ2 o{y̸X^p!7Gs >#co2O/"?=sEۄ'$"  fv>FwuW׳g4R@ /CYnAZh i&Q Jct:Vg|0M~t &ֵ{{ߘ#ܬ>r>(b׶Mh~W] E>g/%oP󽙳4\[ذ`zVx{Sٰkfè_0A-e`ߌvG:[Od>ã;d1n; [{o|B9_|`.o;?]z <(oקWu:5 AgΛ7/3&L 0{Ç4>/:;VY%رQg "z0,;@Z=W|0)L۴VFQpuWNJ8vF1A& 㰟fxvDͧL+-n>a5 i9d9b JRۻ:mY\[{!@JJw8~D zGttcW< \]mqJ=cщMk,eC@ |mj];w59_L-n;/h:\{4zJZB>F_*Pdmp ;q֊6eHZ5:Lz3iv-^̛>2L/lzÎ;%Z$B?+qXM0^&c]7\5]NQ|s~=ؓ .u>0R4߻M{t9#6̍;m7޼y3׵SX>%4[jc`wovjU<FX(H +ӗG5(ag%MKZb;ƙkJvs^hg]|E޼{zУ=8f7rw?h,_ɷ'LrWK9=N]gzV?}oArȁt bF{qGr)q nmE .e6-1O2ؽ&\ֶ'|t%;e<ؔل㘆Z3x䊛Ҥۯ0xnS{'T'|RK<Fqu0NȲ0&})&;AZ=W P$[43c:/es #v6.<~Ahz{uݺCyP=Xrè Fy!]=C>p&7ytVq_y͝UvhNV)9?y<a {oO}ѣlyσ?<=h^ݺ(usx =ww[8gKw;^$NG#uԸ[o7wb~˦$}bs$[KJ`i{)1bĪ fSƟЗj~10Lzm!J-G"r3%)_RIm 0 ̗i_??SNem '2x_d/(`!O  m|-X|3?F&2e`:CyQǂ?='~}_tgxl3q0Wgr#l}u7|.11x }E kX9@&R;Y3y6Q%Vc~^є%.Z4F[㍺ϼ>[m٦n+)%oWJh'{0o>BU&" eQxVnBiF%ZVtQa> OK(ЀJI:ؘ Vg{ejUO>~,m|cO?fԱ fX/z![|g:y)C #9ݯN_\Cr,+<*#ZInc{̩ wo7pTs -b 9ɑ$6I*" i&G-n񰾮E@DZ%|gɑ^zcGI}I)(c)Z(ZSڳ#`6:E206>!×qSUyfX-կ|̚8 N=hե{E0aLs7഑!:=!eęgeBvZ]vm͖~C;/mG=0]z|aEnRZӼl4o61Gm>a5}PoN3OVT[WT@vv|ܹs9?2G'K5O!B:eR?PDi}ٗ40t(tjOݖ05Y>ksvGEߋyfxgFy)wٹgVǾv|B)ipo<0^89/Cx-Sހ?PciV,Ήe STcuG?֬Y|s/۴y{ H76J ௔>jP~oO|J3LzY%($IG^mo O~VCeMcǹOfsfϙl̔mj5&eS=e;Ѩdb́LL=TݺFp_zXxb|BdLX nG\11&C,O" "P ݻwwǏk)W_F 1bgFci 17Q|Sȣx*Gic0֯QpI(umBծF 8bGad&3po~t Fk>h.W*Ve PgmXzvq?NW+V? B?[:MeZٲ8=YLK*9= ?4A>T31n$۶y pͺ֞y(-%GPX2emQyA=g&uSM5o\$;mIrOp-9$1s߰iC!W:p͒Y:ЃǐNem`qRCʫ˫f}zGgRoaѹӉA/> "A]@M74SK.X1eʔh 6y./C\o~(mDPZ[>Z?HtJl~(o՗ѵQэw34:b,!Yyr„<ԊEy^{FGYM&q?jyHt܄}mGFh_wӋuo6q$]mT;l/ raKs-Zcޛ4:8,5P@+dyGN8y9jeu:f%E@.޵ @oذaeh mVo<> e=ߙ5kcP2vGW-0NէY|/<Ĉyuq !As ?b'Z`7%`xF^ BFf6u)~;lkeW1[Di3>1Leaw]Ghڣ|ISGLu…A0mF^Xh'sGs:J' -r'OsN۫gBQ>9O4}u{Vbs`u䯔,?9-ߓLy'SfܤI"/Dx zSC=N )wfϞV CAƫ>3x?06̧=%Ca92C/T'Oʭgۖ." &ǣK.nر)'l~#6}͔Iy˙k$[eU#` ϻlw+z+NopMךPLA\ׄOAD O81!3 ӧO_;Xyl~x]Ft$GHrhQ&ݳN[օ:C QXJ8AŤ NX=ӵ4DS*k<rE" 8ز37eu뗶6O4(X:~hmc[!46kQ:m%E@D@D@D@,iurIG+YFi˨4 N 97d$E@D@D@D!`, t3AgVN4z9(`xcO|h'1nY=Xzm`6X Ha'ڶl/" " " k*JV"Tb(Sq]0 l)S?Ny_6,YJؔ6ju:yVO*g@:Y5leu6Q[,C;]?٘f}XI26)Qnu3}t{)]D@D@D@ M(B@{QZG,G^UGѰxVOcgc.[h`ĨSօzZ}ׯPD@D@D@D`#ob(0b܅21WxQH':@lH(/)" " " "'ɆyIuPV#`nVsgu3̗XAPVֱ[b 5Vn$y̧ }ZD@D@D@:X)kaV 8MX i$[剀@C$@ sV Y ⬄=mº7a$[剀@C$X1b&Iͳz)bubRZPt-" " "  ɬN6:C @[aE^NX" " " " O6&:ZVgyD%8fel,t|J[~ nX{/]D@D@D@t#QK80PY!Ha%Ugleu˺E "tꡝE@D@D@D@VOmm^>z 2u9ʚOYND@D@D@ ]VO$%AYl )QD[nu6N_I@C%2HO[v<֋LlvI:OS" " " "P 0Cةxև?$歸*q#hV9fIBZ=6K|6F@NFD@D@D@2fx!,' DF,* AZ=.}CZ=^" " " "  il F+&UՓlIHXV Qm6D#Hvi&f|hhle46z}R~,NT1K g+|6:-m guCƶIr<[)MG#z=K_ȏD@D@D@.%Kٳg9sEK˗G@4iZhZjڷo:tZlYo` v%XQP abY=CZ~X" " " "P*ӦMs&LpsM_:,Xð]vo߾Gu\`c&g`zN_aaaQ}xM[ʰ\" " " "Ykem05~x;;&XǸzx#(= t-" " " _~'NHgu}ƍ_h`7nbb] ) , 7j(7U2!#uY'sJY}3D='1Փ*"v괷>rIB߈#}hmf1իه(Dkv\D@D@D@c_qm@[hɬkcB%-Is5?K]@p/5zې+\޽r< uQ0h<)k┩z66͚eaM0yfuO}]b[З6͜Gөmn=?t22`GǾq6m^z%"&6XjՊA59Oa^R&<|j֧%ʬnmkCGSp>tS;7ߟo}ͷFl嫓ꆡugzh'r7u_z5۰+/uݻvN ||Y}ɕywEyo뮼tz'ݟ{oU/'w; &W%)"P? ˺_۶mA Ѽr@٥Kz:89b>$!I/p#_{N}յazgF^ne׽ K  ?q'}4uzϖSϿ$/ pg^(XD{z~Uo^7d蝑[e" "P)~H\}1C,4hPAڮwrlgHz FkTMf}+tOuhjU+Qٺ \/^;:Wp["h-3k~w1~-_E[e>w_QO=n\RD@jJSr"acFw#g͆Kh&Gk;`ϾCi3>Ǎ4$׆H#}͛V?f̘h0-H{^H ԧnHc=b7 Pn+Ibzնݘ8Svk4 w\wu+xvmwQ_ҠIQqO@JLԿ{SǤF+._nYrqW8}0Øk;?B]ŏ IDAT_}1E%IgܬORq.A= %%Ի ?x} FԆ #Dla+^{gF|%&^s@+qYi?wsט|=F_2΂z{b\TyY6/vsVIiA#lzˮcӗ/:+qSOʕY1ѾP¤{~̍n2?id^N S2Pla5)/:5[w]3g;9</a>kmS6i+WaQ^zk87+\^+tQhgӥ`kpm}䩱jo0g/L{te>0R͖+Imݣm?耜F~Ԕ\W0/&+u֗." ipNo  4m8AK~Sߟ|&ҷoߴ3zC>XNut`AC`;+M>ڷ˰ ~Q_ ~sNϫS@P?pO-H9pb?pB\ zϟ C2%+_^xً|5 X` ~w%7_ \x~;u~zgm٪(M\窤`؝~$̄ ?o\1/U10',DrӞ=K YA;>{1a N8cK>^`QئukצE8_e۩"NJ4'A~VL#mO]-uw'\qٮKdhk($!c^,ԩS+>[˙YӾO1o+7~C,,f_]Ópxz͢`_c+{ƏNa K0G!m<|͑6`F]b:c7s㟱~~c`QitQǂ?}pV2'+cx&yn?ȍ"k2 eȚMi>?F<>P')?*~S"pT\$E@D@j6.RS̮.!b@HcJ v?O&`!}.~/vC2;N 2s}0e9+W,#~y(C 2\͇,Ao=N*0aN%^i@ M1P+ec\Im}{́~jpjGpg~IyMˢ9/_gA|ab+@% 4# m\-JB?3n\EeKʢlQ9'5b!$C Ϊl,_]GsoDtO_~e.';f8,gR>o#剧9< 9`n(ޥ3 eC}a[s.]rڸnlJN`> 9ɑ$6I*" nެYh#p>,/r" "P.V Y|qW^{G3pRn_R;P @oҠ3X+?Q.mH'}CS;auߞ{/L[6:z~p#qYСFvwpn1'c/e?xZ +rşes、E~OE 92mC݀Ouli~UID@*M]vn%E#:wZVg62He|E hdMv[n>e)q5o׽7#<0rȓO=f::\? Mý{)?};zao(ÞY`FZU|m˕%(aLE;̛yy~q,NTPz9d~i~71XZosb"{(E@$"  н{h#,_}R|ض4P2-VO͚ފ01kv h^M, o#'!8یr]^ST5!ֻbe g,̞=ۍjL!'xTk`+g %p&1!W:p͒9ЃNem`qRCʫ˫f}zGgRoaѹӉA/> 8Xm&Ye'" e@pi]cʔ)h`M?Y/ʷ1N?Km>~_t0"M aޓMXU78^l?y kCcp]0œ/p$I~k"-a< [AO)N_JDgml bLfHf̿e$z-bym|{{ְ?ϡ-3Z~|m _ҝt_W̧f͢6ޛ~7ܐZ#?o.5m+N"M[4ozN gDG2J03!g@l&#\b ONy#}C>!&_qGY s+1"aN6 vS&0GkNjRlO*!P[`^Ik׶?ݺtjb6M-XZ86h29BaŤ#`h hh/E ~rg+&.\MeXkLA I%϶URm~xd}ʰAdWNReXmgi)֧eVg]J[)r]@`ύUUU* ?Qz!G}M~Q6WB~x <ڌ'4{+m[9i>{c쳔k@nfcC?>e>W,/ zY_YMI, kܸqrT|dG~HWޒD şyiuw>gg)i*` ո5Mx06U 4?`aȾŒuBY_|ҵTa.]c:lR^~:]mH3>%ՍͺwI}S^TbFS5㠛c.yRe޼y%'|`+:WR:0yȼ9f[Gi(CX`%ՔiܛD@D@%=zD/ܹs"KXЇQD-,h׮êxB[ߧ, ]jմj/5eRR@!&o %`>(,'LGz-t}oug" "P(!%Y@}DYUD@D@D@Dj4X5bX !" " " $e^쬤@ p:%" " " "(l`onWD@D@D@|H8)Qo@u h|]D@D@D@-QD@D@D@DV@#޽%T@ 4 ^.ɻ@5 \(C=*? ,kFE@D@D@D@2(8чD@D@D@D@V# W7K]JPX !" " " eT82\Uw$o" " " "c\q.u;Wk5dG)uN" " " " q (QjuUI`M#Nv]ׯ_rϔ+" " " k(7|Nﬤ%zn:5." " " "d$#XsT5\?H9t'" " " "(pÐV~<" " " " #PpFȳ"Px`Ҩ u4@E@D@D@D@V`E̮&%;KD@D@D@D@*IVJv\D@D@D@D@ 'V@[ցtdZVH[Zhᵤ4i$YRF5 Xt@" " " " #`c4kA.%n݊<d!،u T6" " " " Xfl EtƩۈ,Vid-" " " kYVOJk0Qu|{ԕv6FzF%=fi, ZOv" " " " #,斁%^E@D@D@D@@r4eY}e@@|V_5gm3zhkhldB1eE;JYڲ9bl\D@D@D@ #Y_$ZoUl fU5[z@Pn*R&[)WD@D@D@D{Q"K]UaÔaE@D@D@D@+ɥVJv\D@D@D@D`M$2HgW4Z/JVG K|em֢ n nTyIMtHM|@&d7{l7gh"tR|J&M\-\V\]\˖-0UIb%lTX^c`:a]q<4|HE@D@D@DӦMs&LpsM5/^ ,aخ];׷o_ףGkX`c&a|U{u/ 8ɀyI1pS2,r̚5˽kh_905~x;;*uldrK{drU=: &NXx\Ϻ>}D`ƱШ"ms6$HqyK.YX+J@m/ܨQ+,J<"=ӱ&O9h(Jz IDAT"V̨/j|_Bo7~冀Y]tU7 շǮ;WCۏ4,1m-X; ܤsX}̝z%ym(_;Gb{buC ORD@IC˒0: *;C.҇rmճc,i)p| [{ިͫ/z}[!FuhjU+nuAڗ/,^;JWp["h-3kC|P3Nx_ckoT˫Xhsyo<bRG6͢ldj٨7 ^ɷ4$#_x1vnzG={f؟+_yKcmvP9Kh ^'J({ LD@Jw'}%뮮gϞi&!I l fnm걓@BGIQ(` '3-[t/8ベ~b2`߳[ג&н,7룏,? \ڶinm':Y.Λ{/ԟث{7ף[QBfrSr"acƺ*>Q}O_³>ZD@BgΛ7/1cD#iAFsO7|F.f\E (V/YtD Vu}M|7|U^9lVFQpuW8vF1A& 㰟fDͧICu7WZ;f}s ~'Qi˯xâaNu[n'8 pp>#jC]?60FY^rٽ-?_ɻg,:i _[\hVڹ1?zi{>ɧ?}Ǹ]G={vm=:A`ї 9P)K+.$|߉.jEYmhb7g|aGP6oXov)"X6\qjҴI=0އsr!ar֏#`Ǟt^p[M?s;S< gDb[Fۦ|̉0JK/8/Q'ore_QJ mҾÜ0-H)$6^toˮ8?nOXE@DT8Ԅ~Ԫx PV./R'AZ=z6҇f|+4<}MJ}0xW}0ͷ>fG?MIj?Vӭ>{GS+ p:FZ*塎r=rz(Z{CFsnĵ4/EHwQ@,b,1Fݠh=%bMX @ t&bwsͽ}vr=s>~w+ZҫDhc IZd ^yi21  AɗgݺüC^P#z2sD8]\H_d!:W C4J[&UIhSKl$Nzz?psOԮl;Y? kS5 {FHÖqMzu3Ũs־++;}\{fy:ܾb&~ghؿ!2<ُ>P;BͷhHSύuG"`x{ġ?7۶1+(^usyisMmJ{u(!ǛF{7‰yz q#}v+\!ӯ+kb.*oGuca/+WqVgxc]䗂!yNeN>z+'"TVCPXoU08ҭ{4 fIdїb}ߑCQ:2jH;T'9 ()SQ'lg Pp FEb]v6ݞp=-Ϻ'{Ɏ gx?3_ aĹ9uyS{ϝ4~rŜv$L℣~Zk`,x慗Xtבnn0`oˍvEgKN?q#N3,^)tG7jdnRAe.N?2s 3|ϳꈰ$?x-a("P`q`!r-[ " ;tI#ȟB> a #C!j&e,fwsd͔ͩhG0b:'ƑZb}?6lH!?t c ~#ϯ7@i刓?V;Gz)/Lx\xgj7W{is2# vv >jʔU+8/_ג<9`QEns9o>IG .ֳn1;UEjլaU#_օ qW eWCƟJh5)"(P+aGaH.)Ò#I,Wr gCm/BT{BK[AB/KI gJ|\&]6VAzP̰">oO]av Gn@8$E4gY2%qb:[eŅ?<csHM'}ѬvuAn%V- 1ak?^}vbm}L[l < ߔ]ƾ&%W3-@";-"~2å3qj0V?FE@( I;'0`@"C_|,_<)+C_}'9: }=HBPDvFqy˥7 ۍf8𪍣-Ba`/j^v_lQe%VD5j93/2G֭5^hn^7#`d\_>4[7R+ͷia"z 2Ev^? 210M{.g~/Hz(?yVEcKkժUl8FҒ?$A_*SȟhYZtRW`6F[y{/%Aԩ(eEiӦf޼1ÑoVcKe y5"mo>_Q75ʥd~yUoma۲dlԵK]yqc0&cwm7+<)© \vto63L$A70&89^c/;\XcQFžsy/r7n!%$~Py41(@UEEyw s[pa^җqkQ{[r3P{̆r5 #~yUoCHpnޱǿ׮Uۭ&Ю;b {a9+yӭ^ԍ#(ߐ8e|~QgpV7D+k^\ۣ>_898Dnc)c7;b9fLK]b4#Rw) @"yzٕ*"TUpZ&MRܯ_D׾e!CEy~V$C_dr%`d\#sR⫊?'xU O9fX˨wYKJͲ#3PZ [إsẈiI" EЉ,MUﳗ;C΁̭Գ'OH0G+q1L}K*< R%sO)P{O'mG9q8<G=+{η47P>eZd! zU QYvK9M1 /6;"(eEk׮ ^&I>sdBn%GX_e$|ha?-.r ܽ6=v+{܎>86 '=SBOznSc`?4+a)]:Aw0 8m @ `3g_Nж{ִ#1“'j g$Sxo}4- 䅋48D 5i~L#2v(zuL&g"P 6V{eb& FœFlij<%q}wus@)8TzG.n+yENkF 3eFō` m~ p5E@(vڙӧZr%"v5kE ^4[`&ؽ3N:֝;,eٽȭyPoE@("XѹsT- `ٳݫcl66+z`e5Y-m6$f1vuϹ10{'1lE|Gٜ 9cN7e'o ~O>dB%-mGr_h";_Vb`eҌ$x#,l}&q؞L`Y;E= ³LM[W[s`b=BFf-77m[^yro,lKկ\ i,t|}u}nڸyY9gb 0mvn/E,ugqwn]6w՚5fƬfƜ;☏gy_͜qak ;4a+/kW(@>uq=YLx`3gx.,`Oxs?q{QB`\@I$8|&&X3~_>_{ŠIuByd[7>Y5SgP S^RP||lگӴ2S˲46sB3u(@`d„ f]Y ߠANw@<WV~rX _d$hS[w,Q.m?"q}cXWHoؤ2cCÇUɅ>{6m/NoemOSQ<7=^AH>W,B}gy/]HSmE@PADiСfڴiOXݻ#`}PYFi$P7qpRe_GBXNM?5UMзOl\ȁܡ<8c^k:_IڊKWyȷeSe?L֓vy]ܲE@C#dufԩ?z|}w-4C"s0>20@_(a/+NJ6ANʥeeC O6UJ(LMq-T-E@PʊKq^3RoͶ_`.]>iY\X1i?q#h?@!9r1:M4p P?{P(? )E@|}ܾ}{wa_|a.]krU֯_`GӦMMsвwKBZe}F؏d!UM!>C?DzPh[I267E@P*:\ ~Ow mr,_M:TCZvF?T("(@uF܉| X…eq>AD`A1p1kNE@PE@P67Š>iגoFj֯ 2Y-m2 Y41~WE@PEৌX3KY.Y.NI1H g=Պ"("(a$664 5 LRXb,jE@PE@P3/I$CEx-AL@M?5Sï("("yu(e' n@J.k9NiƪVE@PEৎ9uyYFi_K۸@&U/N84.?"("TSȻM8'XIt-&  1~8_ϥ"("T7ȱCO7 AQ6KE@PE@NGQɓq6s-H] IDAT1WlOx`(,gnjE@PE@P3/I\NA"\25*ij.Պ"("Tw$G"g0FڌLr8\ d% Fa'mP("(@uGSM1Ҏ+'YoȑI $d穓ri"("(\)Wy "Æf0) q~(Qj͛("(@D܊ 'I|,~d?*IAÌf4.E@PE@P"+?Q#Ͽ1~9}АP|dDZ4euٳ'U+"("P-x2I^i|('f<}aq@d5hVE@PE@F@rv\1B"("(@2Y vIi5biSç("(@uE< 6/`"ȹ1r_#Ɨe|;<!"("(ɏ`pa|\dC2 g]hi{E@PE@P+#3I \#mHNFRHy`j$Fih>iÇχE@PE@P3NK6vȇro!>C &Xټ+"("!?*Z?3 C>#3>e]xE@PE@P+J&I>Đ{S!>Ga0\ e}栖yVE@PE@(A\ Z^(ŽϿ1~9}АP|d0K˘RO2h\l>Պ"("Tg$?"0& N_ЬK'n~9B,S[PE@PE _ }PDԈ6:H'A3>5c2/5-뫭("("r5r*2BQH"GJf26'E,cP8hz("(@uC<ϟ?K1_c  n ~o鿬,X6:z("(@uD$H$mcL.]IHZqIYhi3^CՊ"("TW%w"&'rȋqAGe6ŠM-}F\EPE@PE ,j;$Y%FLw/=;'muVE@PE!@-m-=ȷx#@P))ʥ s17W[PE@PIu1"AQH2&Q6W[PE@Py58/`eо~9]%e~26L!"("( n:xbdf~zw߹k67li֬iѢiРA!͕k]5Ѕ#mg+\ ux!PQE@PE [̝;|fҥ[kʕ.M65]v5۷$E, O㗣f0_Ijye,;,s("(@Z-ZdѾud#ӧ}vAW%&jt1P7чr,1_"&@6и FQE@PE{Gf̘Q@Ҫx]K/.]8"XVd"ZJ>"ǂ, 1ס@$e%i|(">i#VEPE@PBgƏo/_^H`]J"K qC:tزC1q("(@;(}Dh"%_K& e%Adח98S("(@x틑?- 6+Kȓ?I[wYF`1ieb֡ejo^gYKt`vD &/KOfv׌sL6:w4:u0]UnݜXg|:$ς_vp?6G6Maf^f 3h>9:*"@=Ҿ.x[I&,Wkw<{%"FB{{M]Q/򹙎 ($!Ծ +cgz_#`F*"͟?`gK1 s" ӫgQm?sʂl⛓oF _mڵi r|c_Y\2z"y3fׯw/s-"ijϛ^t[=)" pi|5i5"Ѽ@ٺuJ]'|wG2ZI@.1FڌENͼeWqL\>ѩŵ;yk|}^2F˳ȉ/=$V3/̜3/ 1yEdؓc.u,%h^Pb#)ĥr!uce&qh;]?icȉQmBIiG6"ke#(E6^>mhi3mVU}K¬2]m&aPb<㫯e֭%iF]9=Fd|-׫g u$F]xN$?,HFP9?, #0^ D6.:M;!NEӦFnز %d ʒ.ƩV3^y- ~7r<.+Է;{ˬjy}ʴ=;u73´ڡoG1u[Ƞ,ᦎG&#.ۛؗA]f͠_"|I48#N08p@3e3gΜ}(&$1ܪFrt64DqP|Q}4mvesmN=vg E_~i}6i4ٮNUپeWBً۵5۶J#l"3 \aBQmf-[|nsS5޶ix[ׯduk֮3S~/YhzﺳNd>܈gPZ@նA0}Ӓ90m[tǍ8`.'^2 ؟i͒e#mWs!?ϔ(@E"}-[I;u!XeC 1cƌk$}@_*`=jO_᭓uQ@TO + cY_e~22L;mj.15-io#xv=_2e@ڵ8WE~A\jL}:#1!~y`M)kY?67vYHjw̯~ o7ntxؾLn]BH=b@BB^qs?'`Ds菔yj̿O#0ڵٯV3cщvm߽tsl? \(efmZ&e[O@BƮVQEXxqMO8Չ#( u0RLH-m?m"NڹQL4RBsJgڵncվ,#H YrU?4Ǟ~[$w߻lW&դqIg_Xz?e.ݵvCa;Aζs| s<9͆o 6s.6ϽrČU(>!)N;3F^9#DgWΔm)Ίhެ=_:oq90RJi]JmȬ}H[KUE@,pNo w}QlU L"~wkqqX 2$ b&5rGMM栗[2xU0VH_`Ηy'|ŏ-5|әv*y$1GS8_5:V3y%;ݹC{s#,8`ަ B+:=W$DGf&Y"RE96n4ȥ+\BmPȕ2rpG"Q/>ϖ2'D10N>G>rϟ ^]("P`q`!r-[X% ;*/m!yP/ğ1>OJ(m 3jC .bhCXݜ?Y}?Ysn,9F xUo2]`ûY>.6GlmÆ4_C@>vٱ7"zC)P8ca8Ȍs„̅g|Vxs51zW /3Rbm7 oLY#n\u-ɣ'wy6w F>Ռ?Gs'uk3? S(@U@C璵wϗP[,}8ύ&2&Y Bn6TU%Vc~/M}e_8Znh y#EW]gfnN$оf/Lm ;aE|ߞܳ<܀pfI~g)h4dJu #~y"2搚DOYСJbs*qa9gw?4xo? } VJlh1nt75y 1 \U_6P[]7vZBw]#{9إ0[#if= "("PsR~$?;@їW{,hi3_2h 1#m֓/FTŠС aиPF8joz5ϳ|LqGfZӟk d`/jN8|WUQ0jYY,Qß%QEh׺ 3sXcl]|77YԍM7f74 =y0۫g"(= ] WE,lO#;v OrVFqn1=#S^e= $>_nh_BJH\)$rhH,ґ k[rUU>4tTE@(/Zhw*K"o…y.K_6__Ie|1,B~j䌌Be^jvV;4tN―Y߱ǿ׮Uۭ&bcuȁlks 1SV0?`u 9sO|sJa =o DF0gml"|3n|.DZ }Q;y:H +]yNS;};*`AZ./m"( ך4i<~%?KЇb„Z) d=?m8@y1 +a\i:Ķ*SG긡 'a =,sa3],;2s2-wv+qXiҲN-7UM^Y⾇3'FPڏbObf>̇mGv0o3zKd៲t]RntsG9&G=+ 4x%wrl cչĢ/#(޵" ]vM >%ȗOڏ+#IFx5lɟM }f5ȊeA@Bsկr>%[EXwަ%'=hs[nGKc?[di|{pcD ^ Kҩ ~AUm[0gS>9 ?RwHm+ܷA, ?V3O8#3 |c,XB ip"̣k8-ў{vo^vo:iƑU2WYlmLunk9Lgy6J~v.FA)8TzG.[,r.G\w۹t4̙7`"HKNr1F("P ڵkgOkɕn#vR0vH3uȥQ'dӇܰeh"{_8 **/ /_\7WMRuEVp{s/Nv\N8[uCf09FgPsi=/Da7ZR&NL 3.<~ۧnWYᔏ[}#au^Rģ~eN 7E3cm{v45$Xh^Rw9ajG2#d.~^SLF\|E <|稬fz 5IDAT#8&/DK)8q1Q,}'(@Xx?tLR;xU+`+'}DV=v+{bkPX~ 3N:֝;,esInr/CǑ@h9]{dk,],N#Q:o +wq:;YoN;\p毳w|'Nr8<]t=eoOo)Dc?^Jyd}jL;u \pƖ}ݢbqĞ|=Ae18gWۦ0<s֩'ڟAM3z\{mĖѲkzCVZonMWE M׫V=H4R`! p} 1 y W -9sl@"&IMdFQp"|c#Z!%}ҎN1hqgE 2M$9r'$~Wꄤe2wyx\#,=9 Ј8eyX,I.MA  6' bN暵[r!\vI m4+9!8b/:7p{#q16s<)p]j#LmKr91"~ݸ;7oY֬13f53ukn8aᏙOecY,DLR",&ILyqvRI"(^7άߓl|Wlg̙.=~a I A}oT ?ޏA=7/H{ HaCU.9*@ӁGQW @eYZfjF}?ز\m~Y5SgP S^RP||lگӴ2S2i.,~+"P,@&L`8zV`oРAE'7 `h ȟ$>w.i{/O~?a> uܼklPAf C%&1'>kW%*۽c^>w~6sŧ)Wzy@dceoް qiGZPD#eC5ӦMʏ޽{4ߕ.:ti^m1a B/lu!+Ge9ʪ9)ظ|Cy۳v5nׯ CmŵQظϧͲ)L:'Ky3VE<+Rlܺuk3uT[$^Si >w( +C;_O|W@%)~2>+N:ɔj#q|TRLREcKeyK+|c֬Y.5.Qż?h$|QǍ€ JS󑄾>aPL+ڢ"(?M}ܾ}{wa_|a.];v`d~ <6mjwK pPZK~n9% 02uh+_ZjB1)~UE(@e#B( Yfe݂z26* ,f'C+>c?QP@ 't҇>8@2EjRYBahC("("d#@-ȰkOJ-$6*Z("("='8TG`pO:$jTe9}м )mY_mE@PE@P#> Bq+Y>@r劀"(" 'Ƴ?QKC}eY#*y мx E@PE@P9UCr0O@S$2!cKZPE@PVq2"p Ż ڬ/8E@PE@P Q>C9}qYD%:~A3GMjE@PE@P$%}!%cEƇp GJ' %Ϗ=ʤz0("("P |:GȵY'5"}~lTH S2E@PE@nQ#YF&}GǣNŋgbMr lB=6E@PE@PJ WyɘZӨQ6-\Ԙ4iRƑ6LP66eZPE@P9R6T!|~FF`_uS3|'+^^L@Ryԧ("(@uBJjC3fSsѢE#͛g6nh6lh4h;N">V=]w}vڮJFXU"("(UV'YUp>{p*ܓ[{4a?oFmLb?q-N IENDB`pnp4nagios-0.6.16/share/pnp/documents/_media/pnp-preview-05-08-2009.png0000664000000000000000000044214011662503006023531 0ustar rootrootPNG  IHDRHiCCPICC ProfilexXy8U]_S!"J2ӑyd:s!Cy2R$%Q!Iʘ!* DDwzz{u^}oXƜ|P_@m[n6@ q'%@0T ԡRT_ob&2 " oaM*vTu<qĒd 3!frwy wPq0ɝj,]\)$8LB!B dC.Rڲ4A,B/ #M?225&#_ 6t0hC_66EܲXUVzfR9xS.oC%xE/We° pq(#P7#D~M[JJKeYvblB⚲orZ+:jq6B y31j34fFo.nafaUe=dCg+wƎr,>!ڑDf~ƣs{o_@ `]a{eOFD;#zj.C«O4$^IHKqJ5HSLߕɒEpv4#\y w2~:A~AApesE %fseW VWwZuD &ͯ÷Zn߻S]_v7!މF&4P>\m~RȱMP;τ}ԕmԃy[/?d%˗_[|32X4$8n8g]h(e>~vaޤ~m:/y3ܹsE_&|]w<|B9*~X^_u؀spفT<6(!\"m$]&v_Τ'ytxU2 T/ڈ5J"s)1YuLJʍ* jG5.x%5xL8nppaQq5Z#߭\GvU?z)9RZȽgWwOzq~2 MY  y&uj1± q7$N?d›:֜^euV%[ 䌞…ss/=w++D\.,:^lYVlG),\_aMZ[:ẕ\0}1)閮ֻ <>Q`3]݌s=}/_V yzMCXS]y_w8xs6#Sv?/|y:5k==k7p}Z,\L_Jњ&L@UaT<JӇKWfcJbadakd_:#;'_1u#gB=}";D+rvE;IwKHJ3t0BdN)+ (*)UUQ:+5Nk:jIk-i9kFT?\>`nk4mj93C~V \7[iţNS;nx؉i9d2z̝}1/רw/o_䟔;A"ABdBFBτɆ}:AFD^:M=S'TbMi3go&e'Xʥ1IOɸi˪;->9/T]*._j ɗ_(+ tyqqri)tUrlۊʴk^U/xQ]Sq3/:w%45|7x)~fZ-d++?Qy*ڹsXTwE~?+ ~çɥH*[ H@GLL v(3CNLP@x>o`a@xID1B@ R!ϑ  %RG9bQO0b0*8 ? M6MkMvhqp)m;Uo[5-]3FOCD!aQt9y%e5 Űc#ۣ9G,YaGKOU4>A[CHPMpD(ZHDq''pgۋIZӵB:y_~sY=9= "80U1|(!*93O(>#؜l)-.cw9r\/n,}tEU獶ۜ: <l&L+gaޫAaw&L>;>p{nuiMjzv#n!1 R!9 "k@ґREQhȽr_zƢt?QB?f˂5f`qxem}AtBtQtC (/FMȻ0S.3;s K6+7k12dā or9v^)=ߐE*RFIXHH1]Xͻ %߻!=L3arQ) *o4>RREsMIGBH8Фaw F]&t2G,mmoqK_stMqpaY;p,@ B| H9G{$ADٔ4\LlrG L/՗xq_*O$V\nY{ FѦͤVן,<]~N-kbq4}8̈́/"Q_c8WFWkص M/Ȇ}/ y'^CBME(4 :݅c*0?hth|*c8\ |Oo[s@H?0TlʼrՉ=l>(g%n^I|b|S J8a“;9Dew%*'sU}dr.%ڭΧY [uџ:dkP(15g2?=j m;S듏i$%7.8. K9Yv9A\i|iDiNYZϗzk s"K|ljW*nXԊZQAX3oK룀ǢSuI]{M27coӇUFG (2瞙54 0&`L 0&` `L 0&`L@!`ā5L 0&`L 0жm[8::O 1NG[.\]]aiiig0&`L 0&7HKK˗oHΝ;aff& /`L 0&`LTTTN:"؉iu-[`'2&`L 0&pvvÇFHb͑QN`L 0&@@=ۤA iz ({:*iLb~#0u`L 0&tRYQ6X?S˥H|phE.#v&=.sqq `tv/Gpa'1o檫_:|GZ:.Z<0>07FA-j~m93Fa1?\oUCz8! K6_:I _bTF/I%lDĂÏbFhYHڱ}x[{сだXӃȱĵd7(%xJU8`L 0&=&`@>4\ZDP/O蝋0yys{mնo;fw 4yJeԮ>n&G1uE|zh,5 A̓*#ypYҀ*w*YހI%|QHc^9 ,NdǬ9?" xT5Y|GQ 5A wj}^NDԗ~!Z"9WΝ ظ6[nJruk%2Xb];"=*3*^%%< S`L 0&LQg:p1'q9t㗖3f~#GAKhf} '~ˍɀg |k~W@^{ mg֡K[^rahh4i[2W ~p%CB"\t8U_ҢhLl&u>9/ޅ_8*+㥇3qVbO}; wQz#CSBOvW\p[}Bg+x@{רo2>jpX2gЄ Ԅ8 :¨jc^r[ku?:ء`WJ. &NMvx };+姊'bh Jtʊ{ 3.@ <վ;wZ)|yq޷?&Tn3l b FW(`ЌV`ǫ=E'\ŧ8e!"d[hb9a"ӘiL`1B?놼4V~vUIU666I3FhC׶"_Cޥe-~+Ay{0H/֘~+{+Ÿq`L 0&WH ZN Xw{ -#d4^t!\:" .#_IG}'g"z.tc$.WY7>׊y-z66"2b:2j7tq:㘻|:k\0bj ٣m2/gdee~[%,ۡY}Kl2?xZb=7K+Cb.|{s*FPqMIۃ7N'C^yDED @1vz$!W\dlMd4AWG?ꉹ :م  V[z]+ws4NoGhħB:gp( , ~|ܐv-QވWU֙G1S,IDhߪJJ٩8 A^x i7< n‰\<.Sj!ֻ*I5H#7z"*VO':pA Ym{L$J@vN"U60]z6];K8U `ޠk׈|xlpq.b녷=abZu2;# "o%Ax=izn]աh* s 0&`L60j zbo.D&g!=&ۋχ;8-o8]Y|8~3F^.{;Xh!i9R4|: 1ß%hɣV2~nA\FEFeM?{@cL]="=SdlIR!QD /"^)[P)1?;CwEG_-mAy2N& ʔGl 9xc'q*ģmBE4l9"F`Mzhjȸ+vKd ~|J}W9]Ũip\v!j5b0`qt;fdwVj8K_Z|Ͼ_Iư Zv{EszJumjâe\S'vJ;nl =;w2p.P8*dM)S'dn/|,#Lm \#45c]K5N۶2FO5DS@m4nmHb-!] }v|`L 0&tR]`Kb(< vÙ$F-[dÇ|;ԭܱusF Oצ;6wi!Hv6O(r,Ez iqQpԠ Ç% RNJ)X>]dn&.> e9y6bw_`y3!a~V $> <sc _\ڒlǥa( W@^udiniH tg~3KhbkKF 8uqi" ^~CѣC7IX#,ubQZ\R{vN&ei6Ehc8qx?"n0xJ"eHafv:m#rpvC&hT+Fl'XZH Iq$9;\Ǻiva|`Fъ+4G.İɵ=jroLpla7 20 qF\ltP\D5)qT;ǩrגڂh;,LKQ1ԌrY*m\^s:Ũ(&`L 0J@g | 9vc͊Xy|RXE9zo4GwHd,+ЩnmJ`ը8au&FzQpD5C+kt?ޘ͜ E;1WڏE?Q_4DA;uXcs;r;n4&n&h"ΥzoQ|Gh8!Kx.dT KCzb"^xn'|J9GJj#So3VY&ovoi ̇)W4ҤtF8Dandj4:~*s86mؼsMZMi^{k4{'byp5n'`P|8rR>DXFi o/<9dk43 o7DcnhLSgG ?zʐH#Pvqwk>:^MM6l wkHa߉4;QF-cC㖺+D!2J8g>ۺu_#4Oy-]sq!\4ñx]Cl ݹ(unrN1E3&`L 5F F=Go1=j=zE! CR?x[ 1rJ_giu8Wb|+1牅Ǻ%!lxh%Ƈʪy#h8 7rh]K)ƀa ֜2:nj`L 0&pWԠ1իѼys \3S1J)ics a;ʤ"=]LC2OK ˶WhXF!rs%ִakN*ݙBBu3QrɽN< \Jh.es ,lI&Q*Shҥ& [Q/$.Ś n\CUD[iX k*0;i$ǙSh\h)$GUP?_#%u&zO 0&`L8z( d-i'2&`L 0&$Ǐ7j ͜xݿZ>8] W_bc|qg`hÅO7{c2ǧbnxJP11pw%$`WL{ uy|`L $S֍ 0&`U HUp&> L7b7am4 7{6`%X#]'G'Q'~XUԗ8ꈯ}N@pr©ٔOþu w0mmohP$Ize@2a`L 0&PiŻՀW1ɾX+m¸yNIYöb3sur^|o~q"9"gȥDuH}SN݁("R$ V@mg*2y%7+0S!`L 0jP=H6C87OI7j!&3KN*,, F|My ߢcT:6k,`iAl@U|5MSP˲TR`tdž5cL 0&@ʔ3~!xyEt | OaKn8o% em6S pCKɪ1wo_4d\ WD[ńR)a :80S&)`L 0[ }ST:K ; cu'ĄaNv%cȥXn#|,D 3g4o=)S eGst3#EWa" ”+t`Y\Io&`sUcL 0& u R/"r@dgvvb;eMP^'$ZښhqGgF>XY]rs eSnure]~g6L>EdQHYspo:]|V#0Ul Ȱ^L 0&sk9Z@y.*hݒ4i<-T"ܚ )|oU2 by\>Й^V: )6{RЦ*:7o_iy?vxB:-4zjK"s=T$73z?s^*K%0ufEg^=Q"5/zo|e%"Ը月B!$_ <9|nzn>X8 L/ I_45U\9KKNw2Fѵ:AwFEroSE nj^B9ɤ!=1T{-:x݌1,df3)~0P2*nYn8 0&J(PH{Ks&'p2ߐ LLwdBV4Rؑޖ,M֎"h={7CƑw$bNJF M&Vd$` nތ 5]:b`EnK1| ī lG^ӱP<~'`gQ E9U1HDN%Eg %S5 !`2\KWaW|ʝV܎ Rh G<ԴVI s`t /Pp~~37".WN~h1?x_ՙ'8Oxu` :MLS`精eLՊIщq=}G0pL/~5팇0CeUEg]իWQtTJ"8J +:6D)^| ~G|~;F}JI@tԩ v^{+iEqhwwԩ/=Pu;z C1i λݨxcΔTSR)`L QI9&G{+7M~~RQy姥Z+G^mMƑ[ f#A>FHmYLŽdu$Ge&#r{4iy"l9q]d Ȥ}Eѭ(@so;5$LHZ_z*s !˕`L 0&ޕSk757Zk= 3> Y8I 䵐o-¡U[vFMB@L Ic&.Dޒ܊8\uŽO#s1EL\4JKX8U;AxJQ+rVbxb̾G\;"8[$$.=noFSV%>Ir`w@k 0)bQUQRpyFٹ$cx VGxx8VσYVx9z~ȼUga}F66phDWSEsJH8gTSڌZk }1Iq0%Ŕ93.W=.bҼy%$ nQMVRЮ!yd7k Qs!,NfmTYF=GZ{2L1|1q0e^^-oNoBwU]L`{g0 ] '{M!ѐ :;hp xK~Pi%mݧGUZ{Pne8;5~ɒ)qad͔q:1"Y "LeM=Q择tuG3c΢ZTkO _`L 0&LQئ:#&!su)i!"o;wF]Ѷ$1zELsyʔ,J4O$g}M,J܌IA%qnnl}/,Ux,۬RԦn*xZҚ,F\ErO.eM=z`B:aΟ7$HiVp@ Cl>R^$ C[.k<Z"eN~LڎSY8mٲiuk#A'*';e'h:FxK,۸R';2UH\QRji ^/\d5POV:.IYD."?avMYtHG pL¹ ejD!<jسS2/in8JòG7Ίn'koFx0 _#0m?|O).U JsQQ{uݮ*h]_{-B*é ꣑1kH~6tj`+O6+an"J>[*G&`L >w9;h/咆*OxG<ӂqqm)% \u0Z_A]F"(AyDexIF=n $"h qnޞIZޯ*ފ،9M!6ve>3~x nսR^ESuGH\%[Pqm/2q#BsC`L 0&!₃SֳrssqIX[[A,hHzXsꪋ3&`L|~N8p`s.x5} F $!ؘuVF>`L 0&% 6}o7!~U f*(,`L 0&PZ72ȸv#s338ڠvH Aw4k.M0MFUHUe`L 0*xz"~!b S|$.f$Ü1Caamk!@2nl0]l;Å"32@Zi q! \RSI/WZ3"5bOR DV%TZ\ 0&4___YG0^Fjv K_TKѻ6a_!c_c4\JD!X"/995 R/]&Cvv[bx;MԺ*ř=!gVg 7`L$ 64L 먾ac߾}"4ectlQ#1kl[#y*\}qDaK-\;kfW(E4x7%ZIIwbL\4VD‚4{κ3&`{Nȅ"8#ıK.c<ߓIIbj+)oێlÅj?oP:r6h(_'Բg|`mUvѰY# s Z n;2E;5j^]k/>WRO2&`5dD໋c-Q bN=3Y5Ѳk >cL 0&[ڵ. #ݙርl۶BբGD "5OqH3~I5зK_>>ػw7,ijXd&1問zjXg}HqTҙ#;;/_%#vY^ZDi9d0VW=#PiI脠.uh4k<~;9 ^oo!%h65v1^s`L 0'вeK;u1u~~B?T#, +駋j,Wh9 gy~'-F c)04+Fjq&yjHjHȒ 'y|;}xHpxg db?zGĖSеև B]1M.km`kt m,{ e =1H^ Ǻ%A ftlCa~Ts9ov]~|+bc#eߨ=S0;u'1?]ς& DNF`WBddՠwf䌦7F< Gszow K{t2&p k ?iÏ+^hvK?!0,86L)P +;m=RaH*qDDKd9y?P"9u*4^_tE h%" Q˥ƥ݌8Q|Y^zFS P\4;NJ%v*z.8Y{~}ј⣞nT>&3KۦMv4Gx>5 IDAT( 0&iHLL)ҡCG oʕ+eQݽEe*R7$_~=NCჀkh["2jx{xa+iP^Fۮi)P+WԨhn-jqvqa ]ٓ&`b` )'.K6=2{(x;[W`8u;z<.j_S֣+=ЍJ%eo-9?qT#p ))i~IiQ]"Ig Y5FT~JL'pj:2}7~\ Ht4>C+3ZQ#lZY|ڠQz1|?.FNsCZ*w3C-J=O[IXbj>s0%7d(B"`L ~w+3I䧞zJ6P$劉U<խn*ޢm 3s3ںsغui;s4jNt~+lxTpU]?-Dݮa\GW#L r $}5-18qn/Q{Y@iHFPzB!jكCBllF8yt;O 'n'fqhz.}€2,Usfi%ߌBǹZS9:Ţ0]i@W(}oKR>uJB<%bOQ?ʑ*HKFo# vu::B|"(Ko! 0&6gϞP7gu\ԤI$''c=AGb$ʷJ#ѯR-6ь}O5۳_{hG v2 _QkWgL6AOD4WƠAJi%*0&_ 8PH&Օ[`Wb$?QqD,bXw'$ aW 4S0;ZbDt,r`@\ɓ#`L 0&P Rj&$P/6Eh~y4\z= S~=N0蝅xy< TM3_ގqK>:'i2 l}xH;=>٩>X&.,ffI<AcH4I e5LRcV 0&`L ]&* '"X5~,iT$v{1A98XvuFƋ Mi ۸Ֆeӳ\)(̬Lm6}/D$yޘ6=[ȺL@ҠALM_և 0&`ի4ՃTxi“ |k:aZBQ'"j} s+]\AY giȉ߼ԧк@USsN888탇G&>~qs&H@GzBHHBCCaoooƪw#??Ƅ 0n8̝;{* \~{+`HKKCǎagg'itrԪUKcbV||Wx߄M|Ը88]vmcu۴/IjnjE=$QG oX;@@Lzw+wAN%h#xGh"kHOf(WT_?__ھH6a\?ݼytOO۹q{=_^&f݈˖-G\xc1o_J/ʈz:?QnGLK,̏;zᣏ>°at͗7>BDH?q#?D^^ZnǣE8яA9q0 AYn:x{{K.XsaccSBF1x. d0@Ƌ/"!!AI-Z(Q*''Oѿ~.EVPQϋ(RX8@B$_s98w[WuoU)SLd X{KݬUVt+[čzs!KM\|E|8i$L/"##q<eDG5iy'|9t<,9Q-6YZ`` Ǝ]n\}Z2틲6m^]QpBi^tIrؽ{wǷ"W_}'N71_}Uո8r`i"lݺU[ZY˗߽ׯC<|{vKx\"KNN_O!7ȑ#$! v×sΑ(*S\u4-SsץpfS7XIJ v^ԍX' umѬj4AsRwE kX;DիvˋVb#lT!iӦIcEIAܠ{zzS7kػw~v\xg01CxGC?49[y8p@?Zʴ/={9;;]jX[;,X>D~Ƿ"^OwӥqժUq <M߷D^*kE2ɛ/XD7 /%嶌[5qTթlG1Vz[<<# cDUT"4K YZ\B|`MGk+3ژ򱁌,agc vX N>-nVV.w .gMxZfTu€0qDE~ɬnrDR0RAξ%Uc#AE~ @/Դ+ӾߠA4cnE c|[~?\҈1cL~# 6iSƍ& 52n-4-ex?b\ł<\] ` a & &`qA"UPZ(. ./`]**,.TqC *ZA $@o^&yyK%303wΜ{ygν@^lޞNŽ7Bۑ[JC@69tRdsuk|헍l!{]bԩ 奃Ũy'&I!V T"v CjBT)¤ȗmŖj'=tM6ˀu*oXd={: F>b0k7p[8$br??"|s=[289Nq xmIJ3<|'|37q\2)rb-bHJD^$_HCؽy)(Td8] wj+tܷ_֮%u{pF~!=ϳ?!C#_tpMƽ3T(Jy~ub3DIr<7Ϲ!?e&U|9:F,F2g\xᅨVs0_bH&| -X&$: iE% e9U7]'Κj"+ӒPU^@;aY't }+qסoc j  0"I/39 ?|yU o&F=|e?R|2T C6Q 3:#7 ^PWrqxW9\cOy o݉aD[˾'־<|L`PH2/>3Ene7_>93SՐW}'/ñO!א=wX=؛ly Ú%^qX)cRY+-.vPk>B^&;ChBW`۽8ew?ˮrw\qxtoG{%^rwr=#~8Xl+nGrTο%"͇/MdNTA~gj5$^r4M*@86ؘ^]/w︚g+X!T!G  ǟuYP?`4M$yFMwD69h~FqcC!c<8ѣy2tf\yLw>bĈb;6헿%RSSM;燊&1q)8oYwʳOF( |$h'}WO}yqɫZ*I7^{@ef&q52E ߍ/n}//K Kbφڽ fc I3dSF{d#&:u-C85ka$Q:HnuYIѪ~v뭨RTQKR$[X(rI G]/`qPG΋eY:L~3Ž!#By{,26$YHU+29)E插V{<)vKIp,/DBBlZ)͓Z8HXL:&8Ė@bfY/t8ݫ5tX8Aۡ*ٵU>W鷽wySP /p> W+kS_{c?7tymIJնȺa4G|Dc@eefPc65FrYW %IRڑIs9hj%$J$gjV)$VUIg A*7-%J =!Lae:Hg,.ˀe2` X-CЎW󐛕emތiQ[>9%K34e}ND8B%R={䞭2n :R(?of'B6ܱ#fɂNlTfݪ JđW93`Ge2` X,tiq8HJ駣DnS$OlkMs8]eKo%+5ʙ\g8N_}ZͲaÆ2̎Cyn؛w\{9n.4L9RN' a˯*I-D[7|s8_ĭeȑNnY&n--ˀe2`  '<'G9*t zs5YVZ9qY .ey?nҮIXbERCqVޕhSdyq#nsAy$H+sܸ9sEy=c;bHR)+Җ'ȩYq=Y%%Q$qF$МM"H62qG$W^/;+T :B X,ˀe2U:J15  ps:E=Aw |vEGnN_|+Z>z kGS:Fk~d|ۓ[4H\dpNfڻ.Ž~&C* ;:t"9. ר ڈC(\Dx($ʿAbS-₀LuE6z:.<:Y)mM X,ˀeؾ};Ҝ e:tF6o!:eQNJ`kn)I\sU`䇋=ي.m%o guN,{mtJ Z4ΒIrhYH΂E,)Ĺ=.NMMq8"jD4_ QxBNQ#TqFIR;!Jb$I4q=:T~|qFɓ';WT0qDh+PGe(_D=ˀe2` Xxu0tjE 2DRtᵻ˙4sL̞=\\6AN\hnGU l, ڵk8Ly':=~T?9g8J{XAw{oݺѼe+m Q+p< ؟9H ]U4Nuҫ-鮊g}o3S+y/ n<2` X,p#n2Ry9HLMGO>Yvݺu௕ vv*=O83($TMYݺaեӜ*k ^O-Su-%r-zi8O^cćQ%9G44)B-Y6 2)C곲eNRIf /dZq[*=Dq^FF03R-x^wauN8{ˀe2` XA~9~봞CXWY 7T?«t۫xN_22Q0\ڱc'6J {IS:ANy^þkqd F>s)yL\Uq$񎖮➊g 8U]$ʚGDZ)J"j$WNƾ%'Ln#CK8SlR'-RtPt}5x,~oF|'8tԩh޼wGĘ|2\x̺&Uvo X,1EIl5}#sx8ǫ /}R{ž}}r)/ķ;$P MSnMqUYv<#+jmd9NhEc12rę9}=C(,to8܎Q9yUL /#nO,k:r&H)t ˼ȏxn0=ڴi\ބuaXYdb_޽M:7+%2Gd*GM T7Ae瞋ɒnu;qh\guwR8Kߟ'ձ;{8B[Uk!Jdf dIuTD܅| Ž> tOqeUQЭhK+[%b0h67NZY-Ơ8V_Pũ3ix ¶N-ZZ9b4OA6ѩSS+g?ZYRٓ4m 6#IL}I'y6r":t,Yg$oN`3Oݍa|tV\zt#:cO\)SP"['j-SHF;(Cb$ tFL|q~)H@&9XΑײU=$UKuGC$ۅ(H.ljH-R>W9I2娪$jH*)5QAE6'HYbG)Pr? W=Hޯũ}qj1iO݈~-W}\8MGS+hʙ<ҤӤ8rs=Ϗ99.CwD(9I :t`pٖ{<%F-ZKbYҹsg-Y8$o۶ ̝;h9XLԠuHNCtĈ'6?9~g̍!c`?e_V7 w 2muLhi;ve9[C90R_UND_UF?H{$WMD9YZŖ1 BqLz,^uNr)h#qB7\$c{IX,ˀe2pd3,d~FT舴o8}2P D]^u=^׼\y9dnȑP;N-,t(7;nV/U)98:_03{f͚NGi#1z6GUvFÛov; eq3F2>ҹ"Xjphg>Er3@"јw:ny=';# EAˑyXG~.U6"!'YFIdϔhS3$Ԭ޸=| C/̇ҥKy{^ :1A:1A 1 jѣEzcjxV6hX6z>&:ib[+G~ =Z>8r&b4OA6ѩSS+g?Z&:3&:|jujLG:+Rå^l<6ITP{LtpXѠy"駟?v91*.Lg}w0EmLnhDbЦF-:;F\teӏӧ#E#r%Bk2> AV׮ F}4yAZjҊi;zv^kVf`ؗ$Qv CA8CI(z-\CQ;)2{̷"=nE_#s~ȸNexYhnHD, 1c- ًCTF-4=HlCGK2r@GI 94T|bDZ|HE9`*= J #K~7m'[cqX{KOd=s: =~ = X,r&kq񼙴oAG\O8r&}.}\8MGS+hʙOY% IzqH.G֒l/=7kӦ z3?hĈ,UW]mcTC%2W^%9sWq׉ǑmF:C1ArX)9mZ)$kmw[m_m/,NmU?V[`OUq[Uvg$vP|M(?\qLhG1:IV7cZ}&MtĶVV1(ƩT{|jqjLڣh38mS˧VVΤMtgMtjʙOyݤ Y!v_&#I27)3L0#C?H&:>NVApo~:``E;8Αud>!r&smM9F9MAgb;,%xl0)_|:HtI+Brxr\4A>|8b]\RorM+[ޛ1LlmcPS/hʙGDguG{[[MQVo5EĶNqj1ő8jO-NI{MtgMtjʙx ¶N-ZZ9bC-_}6˂nRCc X*:H7|3.BY.5znQpMQV;hVm~4b #qj-ZZ9h1' lթ3-FmZ>:r&HZ͛ٿ}Ll XJg ⫃|ru]N^}ֿ{hxiȗVVfLĶNqj1ő8jO-NI{MtgMtjʙx ¶N-ZZ9bC-\09G#JL{CUyH5m6JX, 3φIAԩM0vXh)4IZ9ϷhDX9:ZZ9gѮhkLx4-N7 ڣ}.M'8MGS+g?I| {oZ~LS$ \]v^b>[9SrJ|6tX*+?&$ otoq0tѡCL^6:IxIyE+G=ZYyEĶNqj1ő8jO-NI{MtgMtjʙx ¶N-ZZ9)є%ҥKuVpQX[,*V#Jૃt$t;#Ϊʏ>ƍq7iSyMv&:ib[+G~ =Z>8r&b4OA6ѩSS+g?Z&:3&:|jujLG:m X,d p+O[lU:lЪU+gh 4իWw~fxiLd5LȚo&ZAq7NڣSS+g-FmZ>:r&h38mS˧VVΤˀe2@w*Lq 7aÆΐgyƁk.4j5GLdM;]@q7^\+1;O='MRiqeHZZ9޵8xL7 ڣ}.M'8MGS+ωO-NIhKGk_+Nʱ=Z>8r&SscwaN@X, AbYbE땁38FB=(ñpBxΞYgmۆnݺa$OZle2` X8#,`ˀ/ :)yK |T¬.,L%!v?s~c„ n'Nt(uieNSLlmcPS/hʙGDgqhorվ3mo&ZAq7NڣSS+g-FmZ>:r&h38mS˧VVΤ"PV}^ˀe ~ ůr^^iھ}c]!]Vί]|&0-N3P$:g#hyԮO|ZZ pjT{|jqjLڣ}.M'8xLڣSS+g?9'Nʑw-ZZ9)\zw}˖-lN #E[ڛ-12c JEITކZ5k֔:uZ٬yb+UgbD8MlkeoZ}AG˧VΤ=Z&:3&:|jujLGDgC$?\Q;ˀe2` ğ yAbY?eAJ ʕ+Qf MT 3! he9+Z}&MtĶVV1(ƩT{|jqjLڣh38mS˧VVΤMtgMtjʙ#uVp}ZZ\+%%:tpX^{9{ҥ`|ۭea 11M6ũs)X%k#:Gwy'XzA:"͂ X,A A +>cgDG墋.*)#&jҤ 4hReXb| '/IsϷGs+I×_~鴝FYbrob鉬盱XxVD{V.+i?ZZ9SSGw IDAT+MS\=ZZ pjT{|jqjLڣ}.M'8xLڣSS+g?e=~&is$]9Ʒ2ncgd噱-F 2ɵ8|pKXG.vw㩧r/{/jߌi67NZY-Ơ8V_Pũ3ix ¶N-ZZ9b4OA6ѩSS+g?ZY:Cw(у>}v%J<;g!GY꽸?co][1;zȍ1h;+{ cL 1l[yþ~&ioaEО]";;^ܖ;\c$!K4Eя|uoq}Y=>8'G&v9~G=0$ gqȠ^zo~ 6IƋ_hef_>&:ib[+G~ =Z>8r&b4OA6ѩSS+g?Z&:3&:|jujL:r&H)r D;Ekz/ ,E;ll& r\!qe~v5|  yEizaG"R+G`=a rᘫ\t4:on[k/ǷVcT'*'r/[UhU5g(_}lkMr4j^^“㍏y5F"-c1;7C^a_|rb?]Æ Cݝ?ܛ7^.,ߌiVm~4b #qj-ZZ9h1' lթ3-FmZ>:r&H)^I*bCso"fUH[ ;?W+v>v\n؟9nqpЩx #DG+ P9uX\Լrqp H<G\jyo+ N?|cKL^; KqlUoȹm}rv'^}s{z"Ilq?0knݺ7n\)<\<2m۶?DӦMz-ޮ]ШQ#aÆyt)D8W;w"OW9/xkxȱx鉬>)WVhqjoAoѽ3]Ӥ8rl8h4x4-N}mah9߱~@Qu:";súST ػf*1txHe}( zbć*џN+¤kI7o//y2u &ObGЩFƟ]![ع a#\hcgvQ#'l`B`K,1mo;}plSw'ihݺ5.gQBB ԨlѢyw1ĉ' :щbiH4x Jˀe2` X*=~%i64$ ۷w[&~;%k uoy 73!ܴw |N o;8TL ?2 Ll? Z~DzNYF~jq:to7v4ON څK~Hj_vҊZ惢w1.;LC'ӷ7 !Wgkk-C|.3g?܄ ?{~;++w0&I| O13E\{طU=Rܔ>&L$8q"zQJauieQSLlmcPS/hʙGDg{SfCe ;_zSfzV*wk/%qгqɨ:F{=0qCǥ2/l]d m[Ȁ$F8;˗/ŋ+Uiݺu馛lu:r&HVI@rsv#ɩiI=ΑsI#?$~ɰp1FӟTڇ1Ao4m߾1ŅX\'=~f'y"ω\/3hW'ZZ9޵8xL7 ڣ}.M'8MGS+υO-NIhK9}{Bz-H+g?e=[larvg3`u#U>zxyyE+G=ZYyEĶNqj1ő8jO-NI{MtgMtjʙx ¶N-ZZ9)6ĮM6ˀe T1ITٲEpuȇ!+7Z,ˀe2WWqaaA: orĨ-͘^>&:ib[+G~ =Z>8r&b4OA6ѩSS+g?Z&:3&:|jujLG:+R8>-- Õ,J5gq?N֖ehcQEa&$ґރe2` X MEqꩧ:SK⢋.*:uJ'@1&C츪nhƌܕ*^u- qs{źKd Ip+yeRn}^+$a(~yTrZ}lVD{M'8MGS+G"|jqjLG\=ZZ pV~KO??&ϛs7N-?&)s.$k8oz+$ћО={Ygʔ)!nwW{5:W-2^ : G29&^u#uo#HGjYܖˀe2`(̀_ 0+Cڷoƍ2t)-y)2p2]gëΥ'44"oN\[G^ڦ2,VkVm~4b #qj-ZZ9h1' lթ3-FmZ>:r&H)t;<\zh"c&ikMoʙjR|35i8MlkeoZ}AG˧VΤ=Z&:3&:|jujLGDgql־V΄w-Nʱ=~ =ҤӤ8rsr| {oZ~LSsӱe?ˀea8xՕ.2S HːLR<(KܑxSnƍ 6l7m^*wϷ.,ߌiVm~4b #qj-ZZ9h1' lթ3-FmZ>:r&H):w_]~ַoc{Oax=xs_y\ ={~6{6=y/~> WYd6GOg5>>~Նcb~z[n?tٌ*U^ Bn݊w}㥕=͘Vm~4b #qj-ZZ9h1' lթ3-FmZ>:r&H)UDI&xqxd#HNIFBrɖ pY/Baa!D߂Ok/GNĝތӛ݈ixyXEwwB.x|@{P~W7@aеJ,k3tr1nxh{4ou JEtgr/ Q>X}L<еhcOĔK jG Hi{١B~{X}+P}x ص͸TN_Wo|$mR|#; =1y"ݵ8o*AbH*=:vk.4j0;GLdM;e+εr3Y}$V_Pg[F~۽3]3ͤ=~ =ҤӤ8rhʙd{rA4-NۣSS+g?e=;v8XA*n}ysk˻c@s߀~1wg@[ML`RN폋cxu-EjGa{AML~g&e }Yob}^ 4Fqڣ]3H߼c_ /| 31o3o |ylܐ."ǡOa9:/sX8v]4o0jWp9tOÐ.1j>*^5Iɫ$I;QU$ UVo~ElڠAdqtH42` X,#Jʐ!7774;WZV Ьufo>+*{Uh eggNi+mVM E iƚЪɿ ݝڶaUh:_Y%RYq 6`^6#>);'4W9-rOA"νy:xFeSضfUhsVIe6!l;ѫ,u+#BWi}-Y^|%E*Xr`?ghVt9qN\EY6$% K)|U\ߑ]`S/jߧ;ȐQJ=Z pIPҰnk.2<'ĺ"@Lz[[ɒNAFFN*cw1PNfs#yͣ{ 7p~ivi:ui kecLlmcPS/hʙGDg{˖-1w\H.||'hѢV7cZ}&MtĶVV1(ƩT{|jqjLڣh38mS˧VVΤMtg>z IDATMtjʙ#uV!*/"14L}ktH1 LҎh}Uˆi!syo)\C\lY0 ψCUu(/X;'wJ6̝!N#$ȿixeȐEl;8_'3ZN b V ^4)y9=i.4Q)]u4$͞pY-܈AbhP\FI} DӺ(4_KD"%u[ ;1w["Kj~Ebx t^,2K@C3{d%9+no߾iWfѮkp7xxhor&Ѯog8r&}.Mx4-Nyũ3韲K.G.?d?JdhpW9| w.]q݃3qӳѯe"w7^z|pΖu}؈}Htf&z˺Bݯ{ ,7D7 ~{PdwYJl{.uzKxW'“Kۯa}=*Iq"''vl#9E^^¼1w#Uy r4q"QFK"<0wHiW{+0J<{'Nƾ|S!p{)H<^LK/.Җ1{a雑6f:uD^d7 }6<41y[m@NFIkJUw92ڵ+%{:r&h38mS˧VVΤ( b8p`)^ܛyչ\4&KG#7)(Q'|$OLIqw(9HOƢ6y89DSO:vu5JߖǵFsJJ[hJ"oOVSI^Kɵ+_;/MQVo4EĶNqj1ő8jO-NI{MtgMtjʙx ¶N-ZZ9bΊȹGi=HD~_?+]~#=6DDfsyչ׎VheoƴLlmcPS/hAwJh*_l0@+go.Mlo&ZAq7NڣSS+g-FHq9 Ӥ8rQ˧g,ΣRũ}.?ϟVS/hʙG\O:r&h38mS˧VVΤ"v"Gn5jg?YETv[߾=gc̛b0x^:=Sc1Ep?+uG|laGjm٘&;tN:xLr Hfqv:ږq#ȽۢEn>' v]!"c~/[T|tPQ1Z9jVk67NZY-Ơ8V_Pũ3ix ¶N-ZZ9b4OA6ѩSS+g?ZY{Mx*8J|=&ȻUPE'}I7!u4$5z4^ {})(}O?xSl .96S ;J*cރ16r->k$z=M{o{b")v)<D܆3jt,/9jߌi67NZY-Ơ8V_Pũ3ix ¶N-ZZ9b4OA6ѩSS+g?ZY:CܻY ФNEz.v9r%w?\=j\xv$4߂O A޽qӐXd^U4L{l\#cZniOaM!xu~zNIx]\P~WMx>@,kc!=e[6ّ䖭{?'#?Ss>X4U2EťC3йF/k%!!Z'nEжs*zIt3J٣J€"ym+IN}}|}9ߌyճZ}OS+G~ =} Z&ũc{=u6Cz޵%Dz933y8M'3hK'Nm?-ZZ9\J[B@Hk˻c@s߀1wg@[ML`RN폋cxumSUl8´0:O%e }Yob}^ 4ar@S4oso^1/Ą)rr31o3X9tp2d]+9+]ѣt|h'/̔{oN}V}{dihƌܕ*^u- qHQ? Ir?re5*СCKqf͚RNr_+5o^,sLlmcPS/h|#!\⍸y~VΞnb^NN- lmIhm ¶Nqʖѯ27ص3eʔ˫νWd p|hաVzwB}74k{ff ^B"trM^oBEmBn [ئMhkB&ZF6JsB6 -]G~+jVh9mBt$j3ⓢrB{ 32m.,*Rܛjwi"mkV6gTl¶eۄz?Α6IԥoCX'mz%m_, 2056 ԁ9_x#V}lxչ@} Ezxnz(:ǯ*t {(ƍqEaÆ~ӦMj|{)Z9͘h67NZY-Ơ8V_PŹ|'c֕W:oZ}AG˧VΤ=Z&:3&:|jujLG:+R!u"+"&''iݦ9؜o۱yvlZ.KwDn%1)YNI4pl]/)8(撽 #턳{QM%< )OΛ G|$sgmA]!Ӝ!oy{T%iBy@E%22*;sc@vevTy& åQ-JnX:~~_qG} rd#$yJҕ{x嗱yf < p 6q~Ggo\;fZ+G@ZYj>&:ib[+G~ =Z>8;W򇎘*ZZթ3ѩm~4b4mZA67NZY-FOE xm׽Wudn@zl܈[/[{%$ǹ0mX*CZIA֒qasϗ2ӷk1xTAb>FKlXtưk߷f>۞LryE3"L/O'C7AӶ(<ڣ{?G/9O\Dt8/Wv H(H|u"կ_I=f̘ ~饗$c'y_>-b$iРAN=~ZV7cZ}&MtĶVV1(ƩT{|jq2-ZZAq7NڣSS+g-FmZ>:r&H)q/~ᨩ ѣCiOJ.3JԷI4 3 ;`XgMK;WInQ!3$ ls6K]b˂ixFzEN:f>O)方0~2$ }.R"ϖ!CYr}\dtObsܑXazׁ]8kyE8em%vmwӰ,} .I&-G*:H2x$:+VUWt}nCRRvڅF!55fR)SP(_E|yεr3Y}$V_Pg[F~۽3]3ͤ=e;fkԻquxg\$=}.5cũէiQoA}~ܽ־V΄O-9wy4iw)̗~@~Q8%KH<S=u5NǤ^gw;~-K gΖ}؈}QtBŢ+m$,M/$B]I])mٺcBʣ:h|5^ n{۸uoQd'vl.9Rjat't,IRaK(,t0i=#1^<䯌Ҏ`@NFZI֫sk.޸+d~~uO Ѹqcl۶ ݺu=EhU耸^F=uᨯLXG{ €$&)֭sip WIjh߾})}2p꯹r\i^u>?W&hȵ|f<գI(;7SRE7||;HAc$c ߘ~L1D݃xV R3+I5j#%&OU00sArV=s=x:r݄ ~L8=zD 2-A|)Z9-h67NZY-Ơ8V_Pq@'hL gFhi_v#)hu#۪QONI{Mt6?NWONIh1m:}29sбcGAKxWB┤t-,R7҉q/ٰ6'uJ8TsD#V$KsD2r9Hwq/.^i޽xǜyG͚5üy#{W;fZ+GZYj>&:ib[+G~ =|ڊ.ڹEZ9׶=c4sNtF>#V:ib[+G~gP<m:rgPu,2p9HZje˖;w.O>A-=}㥕a͘VmZ|éqib[+btshujLxwqFcm^88F\bT1韻x(A*|zq9꣰VV+G~4b #qj=>CYLtjVV1{l  sRE%C5\ɛEVί]|&jFEΐ[w7w Wq|UOZ;I2mKkSh\ZgOq"_$hWj\4nAϕW=GW$xrũ~cq>yY{}\,\qE˷ݑzLL)\sǑv)_[<7$?C1~EQ쉓%^+wg}M\?{_EuM `dqK#qAHDYA]9,, HvQ.D9Tk*ALD9" $@wUOMj:3=0!ULuWzշi+e{/ \U\邭'',r]~J:s)Xo!V^i7;tRO)G˵ȗϹ;JO;N4ێ?7-ۃSDy.'=}=F(X4p^[`_x [\ٚ4 9RڮpUhsM?IOh)* 139lS68ndrG3޲1/%_+Rtf^,Sw*{lUf~22\+{%x̝@7c,;MSiesftVN/MDVaf2OL%ktO{|8"܎yכ-KxH&ȲgWf漫f=e"뷪_;}.<Ѫ>tK~eϲ8+wf17}c0!Te2A$GGv2}BHN3v2ht<8ƒL';24", $/:K=Du+yJ8Ҫ>I:ĦɃiec 7f,/{l4Nea=:,$sǫaΜwoy<*G,e nej{u 8Χ82W=y0˺)%_q'UOJ*>ǩQғivw4ZulŎNM#:?9qx<l6JTGIr:̯~X4"ZF-);԰>6{.jVG-FJN8ri !فXp!ƌw}]x9cp:1j W?/Z6,Zu* Ch%[27HQeRq7d]1S [ cEAj}ѩRg٘4Lg185X)Z5weC)ai$puX See|dwߒƑYgeZs\ w2fZᜎF2jK=ͼkIҩiVn-9ygzWpiS0xs=RS IDATΟl񔺘e`lY?^}:ijҵݨ4̆'9X|PCϱb(b=bT#rH7O~G%Z 2o|N-S>GɪY4 fhxǷ#kxom:H-?/dJ+=.bz4:5,5sdK-<5q98e^vw|$H,%) ^kbиلjuB6iW0?Je\ۤ>lW\D/S$Ù?J2^ ^4_ޝ^ zųVc>3?[K>2r1:xyqϮg~&^W<|ν^.Ɨ,{Urԧ #G՗}+qvN d>2?~p=g%I'I'7`:A|dy{3U9<|z]R/KwsWe<[(+p1)[{Q3_)_K=>2^y $ tR.۽_D1vbGR3_y/KzU~2fT:'"aE/G͏þK={2җf:n*^G/MxZ:6$*|Ƨl==k"E߳uӑz9QsF|ǜ:"it9MFM8n.|B ̴< &W 3'/Eqĥ|We8V][S0(57Ə:X3}0sr`_ݮª[2\!(2 #>8JNǣ A_IqMj1TV59a5^uD (#H1gImSzI]{-RW{y6߳{~K.R^Vh$dzk"X M.q-뵔%\vr0(}EYbt\7{5c~/nIqEG3)OL"==r\T/&Gp+C~6)Phvr=ћnwDi5r]G+}QD+ l {b9?f\YM $7#N/%tыBG{zR.#9_ݦFbxN?mƇȌzl`ڤA7+0b~o;M?6'DгLo|}KUOg]I e4^5oӟ|,W71<қ]@;_w?~W{ҩǐLϽE!^o"+O~3Fʞ ){̭\Nq2\|•| ί,?۷/QzƫD8 = mߗqdP˭ 'AYg}aNt_a?`x $gcRtᙻbotR?32&B6e?'>DЮQ/-i&^DDuĴDסm0uB?;qs1}8̕d:B[ƻӓyj#WxcRDIb5wqr'r<hf]TSx qtDm׎Ʋ*YGIcs7U ˹%Nf[-?̣ȏLViV685"ynSsF:|gys~%u+)p0xF!j902?qٿ.[RFe,he߫FX\\Y&00r[I!1 yP%|(I<{,.8̭ʑ2YKY<ҨjmVA)ҎͲ%sueqeܲL#f:sR:8hB͠ЪwCg]7ؘr$2wlj5|;_$G>'*Z}T^tguy9S4n]oӋ,גF }a)ˊezdINs^v6<F>s^iy" IǍ3(4Rdpoh,DE<'Kj#؜I~dPb=ʛƝAIi*C ߋz"&ZRa#Ӫt|^ +Ni)ꡛU>d ;\{6;)Ӫ9nQZ+jK,QO[y̽=o^ŔUgHc{GoL/ù0 ߊVSʔI s7<,bNǼq27?3o^jwbڋ sÓwHnWᒝJa^fGQU~|mWdYKEvie%kCՀ`v⿌m YD /%ƭYiHHH“M[a\c> PGIKnoG$"g nj:Fwsca2Z_+TNp+EqG H6` tRɗ42i=,V}s/{M8OEک[HJk}S5X2O{F@K!xpH4#$jLoH[QGqo6~H$=;p`suPP(O6,O#Iud+!&֡l-[bR0xbl_ش}\_ې4QaP{QR&:v5HqDVkiӦ56ޤO駟D#@.%{^!_<Ҹ7/D>Mq9:^.U6*}?Oy/JQ!1#?^Ջ=2N9c\>fdp,RoI'7+S*U=%Vzx{~8ˏ̗QåDOwo3u>ziz|(cZ.YOξ^SrKOUS@wziƑe=a!oYf{J94{O+:~K=т-mͯ|ֻ{.?F7=ܜg9e S:I_/{[WFO:hwboPZZ ^cܨQ0cMrV5d~2o O&]FFmd؅SчM1Z&F3ݏEakC"G+tC`uw%NZg:4Dė%I$sbg.8;0r<%sp|BgJ?}=;KbT$Z*v1uO }IC0}dtj;Clpiw!p ~m<^y \z-Z_WGvv6V\ů&<Nu geYO<R>Nu|gPE~YN+2<!dTchGBвjzpGLF8[Ï 8"UV]zsKÆ EHT5IƍCǎNp唎e:P)@d3z")S+ `_E)NtJH~Գ"d)Ny: |Գ"d)Ny: |'_ v@ p&8sNȡNUW>L H5Oiי3ga֡ԋ|Ω/tSZ=cN";3NiXQ[O**?NtS@T@xV!;Nt)] T@xV!;Nt)] TGS>3;{O&5.P uA3[}aDo[cݺu{xe:}!1<>+ϴm |t޽u??CcԢ1X_tNUT~gEUTh/%N; wzVD} $?ֳ"^R>g TOt>8RH8)'zVD~,1cw7~W5Jf.v;s ji5˓VW#p3F .0jQܠA=z8r^:>i瞓M&L߿?ZϽ݅S:NO@h}y1 ~gq}LWM~a֬Y]t()uJ[_ l=֩QtʯOz: $?Nu geYO<R>Nu geYO<R>Nu>CyWW:u$ΥgiTupA#3x5^c<,Ke<T=nl`}\k:eM7݄[նm"yW;F@#h4F!i 3x`VŴE&F]Pq"ޣFofq]zŊhݺ5.2q;> _.~\Z'RGU2-o tlA q Tҷ.ܒ`Ye(`a`Wv2ON`,>vz,s.vekn.@S82Fb0 7@F (< vvx&M)Ssh#!C<őm:aÆo߾\? É=,=Y7|9tꂡO=fϞô=-+bU\2OƠUMO|6veb]L.r{{*믿47n(ʹ2;ظr/q[a\ufف;q5j 3o,=:2%KټǁfZ.M 22ZchҤ+yݺugSE^;?< W_D|7|禰 w0|W>gR_=/Ԋ, lR! ǽb). IDATN8!9@7vȊ*ӧO㩧UW]%~ÇǙ3g|hhDٕg˝v??[ᧆV{fNg;@ wiYWk+{]u˯VgG#Gl{\:ܾ=93 ~6q@ D13qPtU~뮻#++K0?zGRR;vM6ѣ_`^KVse^z ´iӐZjU|Y6w"d9rٳU<*ќs&0c ԪUKފ竪=gM6ŏ?($=zGAf1q-`ӦM^rÆϰaDo̳>+{%\K/O>0VޠAD>W^y/>[vAKgoذ!j׮X,_?_O>~G.7Bcbb H3h }'C\d槥 #N:X|تjyʮ8rx.'N~9۲e .\P˅Gg@ѕ/\@g}bWƱ:aJs.׬ɓ)O2+WҮ/<_xʙt:uG!(G4ݸqڽ{w_(j׮k Ee_F~~"ɽdZDҟLNN 1f,(>soĘ1cD;a̍6 +?vei䛓?6ɓ0`x+Q˅W@;v,z-$p/(<t_굙ly:qExp bUW1U%UJ'w`̤q:"ÙN6ϣ6<}877QvE NvV$<=W"7N|>5@7y"^C`gs_:}E/{^5!I> /ƍ׿U_>Um6OրtuWl ^N1[F/rϲi'SٱFk7'kxى㴬 vr+4+?_0gyF<#}9@36x]U+߽{7n*}\yJ+wwz{7)>===`VY%LΫwޢ*_7Ukpܱl o_XF J;<ҹ+|A<ص3FgSL+ƑCGQ*k?VY, Ta 17^s,-6$^9ظqctMܨ5x؏ Ëwy7oƼyD7oiTCbΊ?OG1#n|7t8_xv[_1_?) 'i裏PU˓; wI:0vʌZ=gjK9{:9X.\xj۶mz)i 0.iwܛ_>r"$pgUU\8/'yEs6T\͝qQG'GuxZ?Z_8|ɎN}jݒz)~z64Ŷ %ع jS\遏Х1f>A+0K7n:b^# n -8xZ5j_~9X("=uT`po'Ѝ=لyFfozNQ(w #GL/ f͚%FwxN9[_ 7y&Έ%gIZIfH:R^>o#D\.6ұA$w-sdxZ<2:^+.0*gvV˅Gilرͻ# Nג9gk6"X_ʓUW- Z{ҪלGynUG8kny3xrrϼeôv:s#p&\YS;4G;8~)o-$%pe&<8) %WjJ C룉OSP )Nz#7e L2OJuc]o]p4QxJ?*믍CW?7縗V@E&v#iU<Y}͕˥j.Y.5A+n_NDYd8L?'mߍs?AĝC0!Կ1ֽ;T} -2mvz= 4SGix?+<"뗽k<7zxvY6_ A\nm8|lUh_?pWdq7/Y'5S.Y\fh#Y+#W-m_?S7`{00/e 6\>Mta%()WaCv Pwp |]7#z6~ 2va.#EkT v,퍄oZ*"F"P67*ժpcÆ 9EDFJ#h4gԭ4@n#r$m@<~v@iCϺ#a'ȅxZ+ J z2TnrڮIhƪCC ^CkG_8b.Cmj%!Ns~،k: :AL56ƶI_D M @'Mh4F@#pFMLCt~QEwľ+:֯Zxx![*!gi6 4AC AzAi4F@#h4m Uk4F@#h4AC@ 3g&H3h4F@#(ݥF@#P55"##B#h4@ E[N#HZΝ;g=T5Jkh4@ BG-nwiT lsիN:!33YYY(--k-4F@#xZq{]+>zhVAY.F~n4lpҥԣXAl+ [ᇵ}h4F@#pNga] zTp7$$Lބk+Z.07hm8I_H9c$$t썇g`tl mdZm"g8  dh4F@#PA ?%G.G U)^·N2 D!hL="BkYIfi6z+; ZEj#sjh4F@#%L@3[mpDe&⊫ps&)<~GoPn\}CB eqyܟѫCysW{p%#Jf |k[Ut#f9&+GNQm&_}tN]w@eN~)sgp*\{Mnm8HldoGvkP+\i΂F@#h4GBuB +ƚi ዱ˿7}{#Cz;^'$-5NsPL$ڸ4 Ϳ;> x ٱ - 'XWwEet7i%^+L;(s=zl$VM?OJޣrR|6t'm|_Q+==Ů[#h4SR1m"u -3y71DoYCOݿ0&_ u,p:|=fr嫱vu:Zq鵭FD ĩ"'916e~Y6b`ldcꕘ T5tY/)Mv _FVΓ#dl_;it^=L ;2+)ZCqdyu#HյF@#h#ā=#:6lc\懯.LB( '_;pv&d-yp1 Z\g}sKZS$?g@'~ lF~BL i1}C16PQchc;:4i)Gq x0E^^e#7! >KIk-]?ܳƉYU:7F@#h# ϏqSnЄҺoW'߇܉˧ CaCd$mii:r%ݩ̛4848uH]ȪZ䲫RL=,O!m;2 3Fufv>Y)R\x/u%Sѧ.L'"۽/' h&΃F@#h4>8q#BHytVaTALp47i*":eG5;62OVz6B؂|%LЖզCfq+e|J~ poom~:;{xj9AJ9mC>F5)o~ЦKe,Cꈀ6ci5F@#@P. aKw9 1C5u؆QQH:`n>O0??ӒaEV!?6BpY3 K->1-Xg@xb:]1C9kنԤ)8;m[s'L~.(J ފۗK6a@$ٖ ʘV*%'/mؔEkQhFΌF@#h4 ն~VFAB$bc$Xd텰|<yw>XB ]'e!%m z Cf]aTɽq4čH\]: 2tFDZ?X *y]19mO!(e0C~Vib|;iѽ z'LԊ kh4mC2w鎾=fΫ\"oyzk4F@#qjYYJ) yj\ݻ."*к0NSQ(4to`C1 9Mَ $J67mCa!My >DTS Y!{Y/%Ŕ0¤LWKCH0/|qճa&.i}F@#h4 6h; dž3 Ch ܡdpx`9pё.#yM~H1DY^Z 3K:! jTXZUF@#h4(ZT]@@H5u.4F@#T !Q-VRopAμF@#h4F@#" $ }h4FF"@ &e`׬\ b棰j+YYFHg Nh4F#Pih-ZEtzN\:@4i4X1q)oh=`fv;+uЅ_aL\C,qB:"mX{D [asSU1> 4'M^C c[M3{RD䜓G:~ b˚4w^mu;#1[lC zോ_ +eV"M#X5}mxH*xzt=Jҹ#hhX>,\|m(J_>ʤCދst ><ҽ"lJh-VboqnEƲ$ܬtyLoQ"dz5 oCtC?E@Z|qԉhEoH_.9g X>][VW-EK sem>Z:MoA~򱝎 y/Sw/h4"i jQ 8n22P b\ɱCB:].f>Qj7pmw%~[ӿ GMBX<7#֥ {FnWB|LGx:H1Vl+3MYp:)$R)UeL|]9+FAz뭷3#=53/q3QۢLPm7: ڽًٝE-9{ўC_,v/XiPp<wө_PuJ'?ߍ/r ]*ص|Ly=uvmܸu)qڕ{H0 IDATudVwf7Uՠۚu!׮Dk(9ںc] bRtȵEC.jM~`kꂏm*7*cRҕ]f.pe<Aγܭ?{Ek };/Yph+s!d|ent!0lu!&r""ލIfďs+W`*?#{=8m[*t$W@RO(LGeWTڿ}2ehV+g*L~]iQ8a\8`.$&`7eo*7VMgJZJNeQa} ŎIysgقޔ52#]R7nc?b֋BdwHr7EB/WGEٟ?HEb"vPj`]Ҽ%R!V㋍+1D(Dyı b#峴S+fEq+9"}rwQ?gX'l#'ԫ#ja@,OOGڵXz%&7ES t,*kh/NH{~H3p;<&K~^L=r-ՁF@#,ֻDZhҔj>;83{F#{_ 1vGLwČ\# {`;#K VbL4)ː/ćsܥx ٳ ,C s' x6yKЅxtٷ(х7JsH2ݳQGo/e|??G5h6ރSMq&8Ғ@'*C X-MOԛh&5ERQ|{) }FFfnx;cMCH6g٫e.Tdc[LlO@ih.ðb4L v9YgcZ.4h欙Iq&Μa] =0m@Ka-̜B?񚗚~&& P5$u&:4 G#l|ẻ=fPhz,E+C/Peo3t)FQhm?6C!ijAYEBџb(n_Bؾ}eLy_=7aMDE";xo,0ev"7<$athR<=gЦs( bP`?j*j_g?$kN>6FpnlR f!AGʼn'=j#'mIsG|#{w´.7{3*>#㨘3ZDkfܹX-L]"eYrԓ /|xt8ǰbڵ,[#mӞy+q=\R2hc]am-薱v= ٴm(]M鶐(pF1nx'4iCbt8 3q*X42@ ?$Ws3-ec /ESMɣg)ifD:Dv񽢬8cX(j>P`4թ A]ٯLC'F--E%NF=h6)w;ؿN3wx=EOѩJ!eD[jEadS^`@EH@D4m)mFk@Bm`!㍙d^R OKa%BWZu6IK2c wYF既 1L= F1CѤraxDbRЋNiD"范e[F&22%85->:eiLW}$< ){D?Sr71U/>448F%SŰ1cI}Eʑpܕ4 _]OW?LZZ}"傧u"iJCkpD/񦈥ú |8bo W >-4#}xRms#n%^%y~co t|!8ڿ>]lNrz|2o]^ zŐ)8_SRkF@#4.Ȧ͔F>RWmoKuQcY &J3]b[ܤ~dO5Z71횗k8tK-SneBʥ+Ӳ)VYDQ%۸)=kWlѴ .;,׈F+vkD1$ڳ IRVbP2Ppx3ޭ“=0湿/| 2I }Xz<+/>_|wp ݔ-斊HıH]T?T+<ߘ f{:Ldwv`WX8BnB"BӾL÷rp46CXY[ѐĄ$Juw k>7ۉZ{2F] Ll\ixg2X$hN ,;'{ƛr`Kvn9F@ͺPB ##fӜ"?qb&+Ƒli+l;]LڐR?KK%fD%i.f=4yCz\IqXlhﶤ/% f/7qI;M蓘ŧم7mm[z~ʔA~e!<~F~ʣF|ס`af7^8Ev`=m(rVNCw6/(q᯼wo.ewNS[Q_i4@08U{CҰH.>~ht,<&Y{u F$zpĆ[k޲+ZO>g k@q2k3Ɉ{7 f96|ݥ#("d6ƊAp mۂԉcx,MI٥-¯D,=vzR(sOsG,1R-堣P$0\ۂֽmYزib?e+1dh)6lhYӱfY ض5F.ܟEG7эn3SV 'g`Wmم6:@(5jM,ʕi/ю_>H]UmUk81ݞlWkHkqFY ] ɰ0 oKi[GcmNga"Dtww칩 heEX\;pM`ʕDyl*Dܡ4m񌆣F?R xOXZ*xzS~>w֨nL-"}E*x6Fpm3B:O}=Cui$_CSm!+K!ϡ0?aQ2{L)3fNǸ@/A5<.WږF߻Ո'jiΚo2Y|m'ĉ$R|a '+/xޅgY5C5F hY^:c(R7"I%Zй#/8գcr9G\/u3TeIN:}I]ez\%1t1}<:KJ`y3ztn7_cO#~[u|xMǬR0ǶeunHh||3WĨ@s\-S1%s0ԃԍ}G1;ʏ/5ƨg̫GY蜄 WkBg $ ?y?緞TX#\PX  Wcc Q,)r <'EtvSWg%.~:#zN4#,ۧ2b ((!bXcYRd?$Kr]a>S⭞ 0'$dޗ7 kRted.W}.ǿE&8N&iihS:i»y6'S3QK')󚍸!ЯMY|& 1:}5x. Zh\X(@-S'Ee5bqm .I"mh'. HĩbFWcI[/Q@؁/LLos!ҳ/_!~ ArϠm#E-:l-_ jumhv{?\%k%>J[N0pZ#.QT FNLx|iGU.K]='N_o!6ţQە½S5-/=r͊{F@#hDDКl+!ajV[Zѻ[daڬDE4^7dfܝX!4G av*0q΅xv(<<\ёxp r|hS.bK?\rZ\ȻϑaaYJQXHSjlhViQ(ٽT|+ƾF/RZ(N-y+Ł](:DvkDx7GY8|d<[Eý[߹ar\CF뎔ǨzW>㈯m=!TZLO[S`֗F@#_380b- ]"gglXɼvƁ3ac&L=gE2GX; ItK4Fπu =o kr;?\M򏰶IG~Զ?Bk7й=`F@#5~V׉*)v*V3h4F@#h4Um U2i4F@#1tbyQ/-D\c]p3Z㴕u9.:E$%K+*zg/8P7kJ_ql՚S R) F@#h4"@kV=Ϲb2n ĥYtPDhjas6QT}Zc)e--i+oc=1Hǀhs^XҺ'^uYh{Nh#Q퓰)W%H9,K(g7uɫ4IhtIJGQNLw-򑴐pLlܷr{NLsctVY`Ŷ|kU4THU`ZF@#hӮygޟ=[:3/):zӰd}&Bk4:yXGxc? jxcޕTUmOADMrLǔSs!/^jLK~}T)ECT>$H") (Zs\/u9gڃ]pN21hl UKi, f%U2bfϞ3ԥE'geiUܰqJ=9Oӑo^ !!l$&F`9uk翟iBͣhNDD j[btĬaIrVVPSMv[ySʉxaIS 0eE*+v.Z a@a@0@r3wi`jOTK6h8B$ݨ* QB1X`6]xAoX4<`r67|r?pf] *L @p٘:&O߬/0ZZ/L;"^?Oðcic2F=8u:r?+S2;{jMf7rQiZ6 b U, b Z@ €0 €0 :+ĀPz.X{yEc9im0tCzI|kfm,(BaCj3Ӈ 0Q'=f$D``+䍤9[>zX^ 2합K CM_Od.Ay)#QƷիZ现Ŏ7ȯ9  Ĭb .M)k|n&߰8q]?c1X5)?ـuQLWZ*Q`#Sd.28$>Yldا 9C 2d|VByy/Rabn sķA IDATO;DAP]$2ĮHh€0 €0 Z aG07I9drLFyӴajmRjFl9ҬMuCs;5+C-E0 =Sa}ǟVbd`oUnxK+Ӹ9i7Lc(1 0dW >L'g@q!a_'`v'o֯V5LEH4dnI}m |֓Sr11 ƔMxDé3]Ԧf`Q)ٵ@]B$̞ /Qo('̸adhe^(d Na##)g ~T€0 €0 fC u;Ƹ1!4ʔ<ƎU3hŔMGv-03* h1׸q򻷵V1pFݫt$;Le8 tL20 ^fUߊ&1',E>,9b3i8ML9bI~5 ㈔9e3A8,< ~i=1[|ϩ.T`lªUHOsNryg09Y%geVb 8zЃJ'7ӣ>B(kUZ+Ia@W2@!WYOi±zd}/ڜl:) )i٢A6*OYqX5Ok%^mYx 75_n oc3O#q?'bȹju" M6, 2 e&bgt%Ͻ*guG%5ʠcEnm) ii؊hKe]eh\re x6mH)Hhr3ҐoT._m;އS7-feaQc"h&5.p!o_p7BafR|/A*}#Ȅa@a@p ЭW/2hO&Չ-Ò/h1cK{>9C'MuH\ڙCñfl5^ԩ/s!pDѪzkٛ~v&bxo t ݣUkcv &ŒSшY"Pi&#d|-l$IJǓzaؐ~AQK|f&vb3>{8v"v1sxh[ 85hhaHF-7Q8e$P՘E"Ґ-Don9LU㔛аIb6TdCh hT©|e-ŽA7Y-&z1/FXDP}G<݅3rb'o:"#ėaa22,[c*%+UL€0 €0 RhYn@5B[ CQ0q& )] 11㡏HѶPD Q=O<//}o 8r촽FV N6RȤhCux5ܴ\T2ǹjcrL80~,m@nǯj 4 Wʐ) @dNa˄!ქ#i2wDU*yL0 g/1&%` &Ǩ` !l8iMU| v1[@p۪Fa@a@΀8HŽ0 €0 €0 6AmT!a@a@O tբ3 &a$9NOOG||rne,#EVa@aVZі8vXo{W MoHr sZji? 6bAda@a@ 0o/^=ou$vٍS!n(29:x e$9t8rޖqjF0 €0 €,~:8.P ȺhSNS8i"Qj#7-[ZҤa€0 €0 U94Nҭ:Z!:̀C: €0 €0P-^|e QY*H[a@a@a@$€0 meEVEa,'' }>5>9:u<2RJֵʻ~ ϥZ?TÔH @b@bFa@(= <Zc~c/h#݇w k9cS kwoƽ#}]|jRDZ5 oo/\͹ly~?w-o:wLa@p Nׯa@@֭㣁xzUjisŃ>={Xʜ]4 Dg"7UAq0<*x i o,8IΟ8jUZwVgyjZ׮f#[MaJ€0pp پFck9J+<€0 €0P hӦjkV(]s#N|ҥ ~'<矕6mշ~&C|e:m5ӡp&,Nġmv8GDۻ@nNbţ<=Y*mmUҟNzT r<=<_rNrU&?:w*P_2ax2 e S|jՊzx՗0f(O]fowYj Na@J,AAAcdQbE)Rr6kCϺל)^8^ZZ\}> n (3<κx7r@x-yl`u$NC\;})C I0 €0 {7onreBjg]jyδnfq^A+z|;KlTt+d&V]a]RKD=fup._BQrD4ȋ"HW59\-n[r/ ad0{1X1X|=]}?Gҥ,TBۆވ] 'jEaxЮl26`ӏq4{?viFrҰpl; 4@>XTlZt"lD8cu? pN\BFcHH;uk~аV=f5vd¿֏b]P]KޅI {v(1K~}Qi>O|u%ㇵؾ7>cr/9ǺksZZ V}8խ q8c<R0 €0Vxy]vC(9r޽{k6l( ֜lЗ6;G,;Z[dL=Y ιEaߙ}(SN[۴ݡ p1=aIx爐QG1"\θ ;*#uk4oɋ۱EҁcOC շ%€0P|PwxJJyWsL?unOHMBNiGquFoX 5b߇_:́ 63?ŏ'п]n0,۽82l;~\D\qea`o)uGn87AAZ*+u[͟bN;br6A֘վ#6=0-i>ib^)jRw1<kiXRHND}Q0~'xRmf޺Hm;*Z|€0 ņ:I<6~z-ihѲ%68O;ɶ~aFv?|74]͛݃G(đ$p#KIƦgEr% Ř-/ǯWQϜEoKO?(SQUN詫4a ~|r0l ilž,Ex|[a?^hd^9GuLG#h?aocg0xNsh֤w8Ɔe<7TV~65ͩX6v6 M)hM,=dgM Cۚ@g/@o /G?͎a2 .Gkr-;^MQ.4 s0GC W?%/1uI>oS{M^Y)$ €0 tϺCd}yl;¦HWhHR^a˾wU!mC(Y)=^רj#t N]BvqԬ8K+DNjZ;~?Fn<{2wBUV>y$K+pG:!b]يƈv,# 0>::vhn[):*5M8hŦk4 [aD@UT{./ѹNԭuh0v)这t? ^*hSo  _[߷ҳ9^S{o˕0 €0V/Mjukl !e嗶NB]a}ZuX1f_B\+tEBv{$&ZIھpwU Z )lI99c:^~%B&Q&Ia@( ^FzzᇵKGLvtqV3ʼ<ЭY7MlZ(jѰjCmؚk vC;w.9WVIV}%Z`G߳qezޱ:UkX\qY- C( TERvFSzp9ZEK==WmCD1} {>$NTɞ;-ڃA30ځfUpvl. v˘;aϞi_m_s`Rlד<$)1c>%'i ~Jse VRUm uӝ~h>{"c*^4w(B2_MWBj`b 1EcAshN^͚-S>a@b֭[5dz86ld\R۶w^gw&5#=MРTȘmH=7wغgʨ֪/9hԱ،kB33\\o%rRZEY g0я(믿SO=5n8_^7Ȥ]}}iMjM bSFKײ3}Te9F6oM͍w|"[TMvSZghYeAX.r'ה߰Y+spGͻ4-̸Y邸1cj^O:֫ Ya@(Y ~=5'ww \g{Xmf+lzWz<f;ەfVeǜD,-DUptLo7FĿ|',k#̀S47\& €0 kgH֝ۃh)!'')ެ BOYiiATϻ?LgʢPaI€0 €0pn 1ySK3b}S9hEesgi1ݴ5V3MuL=.jUO~.RyV{NӚÞwoK4}G]@ջR!yTV֟lYJMTËh2T+T{_pCѳ j7lD6o:hQ.€  "€0 €0 T4QW&nwL4u`黳y4o9jzIeAq[Qtd^g'֞M)cf Gx&K@`ơ1nn889&L ◃h@U9  dˈ €0 €0PB(urmGK:ZGЪ; umA#$p %A綁|ב&_LwyZ) %N?u=V!o*|*\]SడւMO ҪXK<NhC>Z9bb L1Ȼtw{!#/]u|:lӊ~}=ڦH Gb@R՝a@a@( 8 c 1?< EtTYEtr*azA{)Hc'ZDt٤IB:{8>}CHs9Ji FX+_ 5ycK0_4GX}u_T NXW?Ϸᛏަ ]&ZV1v& 9bFa@a@(a X 7;Eڵ}K.kvM5LrzYh23K{Hr">Ue>G2vȎ>/pp]+{Ġ&\|?G|MMޘ<ʟ]Dz^Jޘ^܆/#pl,޾eEKY䘁򎋤Da@aD3p ݴt#.":|߰cWM0}fB߱-?g/yWG]ο_ـLB%`sL|XkB֡+H:pލ;7^>5ޫCxM>m2kƙ?,xyJlĄ|:cرcJ0 €0 @1brjw9$+oEa||M<#hsރd+u~#¯d.?䙟.<ʛTccǜ5$][A\au 5+WFUDu/Կ3PI~x`6ێ&? m;\™G6يM<2o#g pftSOwΗ)7€0 €0 E€g1<ݰgƍ"| X'o^W} xT2!p6 jWH3pƧXYMC(Xog l awHAfѣv}G/$GJ58a@a@n3z1] T(}%E4+J^ôX(&ۤBmYi˲̀SlS#a@a@p+weB\9\Ps/m TzT# €0 @)bh)+Emod?Na@a@n#"Hi[sFxbJa@.]Id"U1$T:\+ €0 c#qbǿXT0A%$ura@ad3 +;bF2FwA*i0 €0 €0 c@|tȍ0 €0 €0 eA*˽/ma@a@| |Fa@2͛2УG) ŗ ߾d€a*Wl]s긲7mڄ:uh\]]/̾pƛ ʼnvxG4X,€1$d/5v=rv܆Lw?|ܹmh z 5\{nmh+W~xxxҥK,^Y|I<ʈ0P(^ζX3pI̜9?#.\{/n`LF|kv$go{owСCq+ߏRK4% ?~\߈>4h ׯݮTr@垌@߉r(Js-8jg)M{{qFX.bˀ +]#n'ڵÞ={o`GkQ{bܸqr( dgg7%Ui0P6x"ڷoM;_W4iҤ6\r>%蕮H __Ml/(w@b@M Ъ_~>,Uooo<#d w/_ρs=Y烓~;ӄ?鴮j]n}m-W_M6ڃ?v:{z5jj׮?ik׮EPPw,]YZW}޼yЬY3]TXBsW-Z?gYtpĠwZ1>d͹~gI@Ib 55۷o/`} k,yyy%&,gi}pDn*"aC$-ɉHHLFfqFk:QHLEZR,"IOTt34A[f@[Pn݊~jCj +.ԯ'=O7z.^M &3#<<gΜA1fK^3k>Imo&8cS[~=xӧOcxW;o}Qϲ;wĖ-[CW/ZK, p99ygO3~ 7d9III8{,{|/9ׯ,I(I ExXuAr$"jP̊ @p %NY$,rvryժS\`; 9^HƐ~kf¢># atukםmFpMzFN#\YKaffzsC"TRnn.~W >ܰS̚5KsVIN޸qc-o9=@\1+Zj/oɦue,^zZ*`▮ A/^d gn[>οXiիW[ÓkaT04w.`MrF.KĘUk1sXוvNhBb6 ĐD.b!؆.ۑ, F"<) ^U rc))O/b#1 㶢G)#'!).T$Ir ISi?Hq~}?@nضWNSLW̓9jC˘5j\oxⳞڶj֬kN;J*]w*ffz~rE80|k֬"GI֭ѨQ#DDD+@ eiصk1:GHia611-2,#K.UȴXK# x4Ap`:&a3 :62AGwƢ@pU?TUrRyX6‘*I&* tڵ@D¶^zPbEM LN!aԷL |zZE`#rYE>К$`5) rtjЬF)Ɣ_5lbWFac~L bBg`=V  Hnx oxmַo_q^8SNZd|BTj}p*Uln}[_yΜ9<vfXNOur^޲趕vo]n7Mϑ͛B ەn}GS}vy;0Փj8qt. g }i:~r37TP)>lSaty^/\ 'ծo?;d˖-+Oϰ^.NaYlw?*{9a/#fW>v9x}?eZ( ԩSS@r^iIส܂dKu8]y0f]<}h+B'9XB/hN&ݦkϡecVNG| Ot2ȧ0`q%€0 €0 aUV8pgz&I΢+5ϵCYRX7+| ALxSiF7 cV`|#xuGRiޛ_fуH\=\ȕ+a).qtSNHMMQKG9mLQct _aUے'€0 €0PpaݻWkby5Α [Wb dv4L/D ֮g6C*QI kQ@"XņuA؎Oб'b^Ā#>h?ZV $ ,( Z-B-:%ÎcO JXڒc}8Gcax/<YOws;Z뇎ϧNիWΧO֊[q ;=5Ia@@5бcGt];cuvvF+iݑۓsb:Efl\4z-AYј9rX- GxX:r̉}yAs87h[qgBO}KA~|h(]Zu('oO 专$a.q=k6M<:C >曚|,9xvkγeS㊪WG:]-xTqfr¶ĩ%Grm#:݉H{Tqѩ**H6ӝ8GrTSIZC{}$ a ҏ%,ưAmSz@F1nS A%j߸Vd>jT=т tm`"Cǎ_÷vwq$` AwK'I0ƀK3^ܹsi=;m۶9ʿYW^U*TeUpZRj9FS6TUSXt'NU.=8TUShTmNFڣӈNUYU9UFGնi=8TUS" m!ٖ[ߟ7xy k '/X3v$V6hf]=hɧZ)X=7?GѮ!pnpv(m6&=A-0=t>m4k! (1Pj#HZ%mnݺ='Gz]q=-ƀ;:{5zr,О^O/Wj9#8U|u#GTǢݝ#q'N#HվHE{܉H{TqOQ/}h<]z@{ S;*OX2fuӸ ד%ZcMhgDD[ =ZIk͛˦!b Lk!%=C"\HSik0 j1IyRTژ32ǀ߆<2Az衇 e[#ޫK.uʱ2U تtGm#TXt'NU.=8TUShTmNFڣӈNUYU9UFGնi=8TUS" 9:ssj}wFmLqiT9LXNzW[*L^qQ$9G,YcW'a?ٟHvv kIOV9bF! )q9bV$eF8rd8tI<3M6Xb֭0VK+' €0 <ϭ"߼y]=zȗo9ݮR>r# QEQ^zҮT-5*TZU1Ν mDmU9ӈNUYU9UEĩʥyH#;?ſϹT3Z8ʩ<G܎0U\:Ď=͛J*=ErT7-Kyr:v3\*l.{yz={ety9 e{ {y:G.bem9P9p%U SIrKUީ&Uc|8UmNUYU9UEaۈNwTۣӈNUYU9UFGնi=8TUShTmNFڣӈNUYU9U?$  KvWBc?9uiHE+ VsfTp)S`,m<nXWU9*UNW1>UY*ƢmD;qrQiD*F#jۈNw4UFtʪʩb4?t'N#QiD*FҖ<. D[E :a(faFHL䆩a5o(7 3;4sKboT4xqk$a).u&LwyrS&m UbʱzUY#oTuZۣSնTub, Ft*UFtʪʩb4?t'N#QiD*F#jۈNw4UFtʪʩb)Yۙ12tNҰ3F *Xs5+zeaWJDiqƲ~2qc8&W6 nT+; AqڦBE-~U9p׮]=~Qj9SE~Xz*NU9#q'N#Qũ}}U9陋)Tퟢ]{Y7#q'N#Hվ, 4Xa=\ 0%oeatD 26EFr"i]r6l؀ȨXCMMEVd y+ێr2~Śmt=G`<@mMƙܴI"pq(5) I.uL ϒ@(;FA*JvE0 €0pp>Hy_Nk$vyE׌#H$gİk!,ܱ L> W#ѡh4*&.3|0m`1!sb L;1"7j.ڍ\gLZy~M Cӭl='QAHX >폸]=CB N7U*7瑽UY*ƢmD;qrQiD*F#jۈNw4UFtʪʩb4?t'N#QiD*F{n={yDFEmѝ"G&sZF.4s2U O l јZYH LW#Dl|оP e%BFr``XfJz9;ӛ9 :12X5'6T'jЕ( e'9st2.uG~aժU .ȑ#̱:ZU T52ZU=8UmHU*ƢmD;qrQiD*F#jۈNw4UFtʪʩb4?t'N#QiD*F{@8q9Kw.f3gޙyU<~;Z+eF\N( ea_!O}j_9{J%~ƻ4ϟ׎7SZn>TZU;7/})<裨^v>}-7c*IUu;դrOm֩**(lN\r{Tqѩ**H6ӝ8Grm#:݉H{Tqѩ**&3f ƶ1LCZ(2 sif 8q%F^F#<9YN"6@K5hst;tG!dѹZz[~ai=q4n:G, h A* 񯡡HII9s0zh ɓѩS'9sF;曷qЪr FUjUTm#U¶ĩ%Grm#:݉H{Tqѩ**H6ӝ8GrJCJg}}5j쏋BL\" uz-GFQZg2|P`NJcѰi H:JsF[ ,S-1~.Gv]T۱ڳ eeٷ%T sv.W(Wʗ/@ 4iis*+>;v,ڶm{KTb1UY#oTuZۣSնTub, Ft*UFtʪʩb4?t'N#QiD*F#jۈNw4UFtʪʩb)IVo݌O${icNn/3hC}Y|ҥK;)M+{tE/_ii'W_9-ʱ<9;1g L/Wj9S.W}"VkKYUm;qi*Nvs?WS^韢h;qi*N) UE}3w4?8|T Wb pgbgYlOd${;۷o ^EO"SǬYХKDWSLμ ϡi`/xI0 €0 22hWۘYe/Od^./ga,3`a/O#H[rGxRbw9V [IK%ʱ.UY~3TuZT:UeUT1m#:݉SKn*N#:UeUT1UFt4SUVUNQmD;qi*N#:UeUT1rJڼyT€0& tcԽUxkri̙лyM6Xb-R*`TeVj9n*NUF8Rթ(lN\r{Tqѩ**H6ӝ8Grm#:݉H{Tqѩ**4%^dwRn<}`w:PaJiyFj*r*߯=)>n9dh˳s|IRxw넄_7DEE"3ںu< 6շXrEUț1UTm#U¶ĩ%Grm#:݉H{Tqѩ**H6ӝ8GrTGlպS GGA"@t6%Q(A'1sV;LD bvEsȳ,XѮȅ03RIWZZ9998y$~wǎsxXʹ"ʱN᮴SUۣSFToUx4?Ew4US~/f=iTqWS^韢h;qi*N) ÇlR=`{ܒ"}j}412tNҰ3F VF7v;a/7"6lJo!%ECq UgMJ^NbccP>^{5iR[UZU*N#:UeUT1r{TuNFڣӈNUYU9UFGնi=8TUShTmNFڣӈNUYU9kELC ѰO:pyr'~ޗѸtNpyG\\/\l ZlU` $!կU0BDN0El3R+:yZ :ʑ{bĆM{uXog XvA8 (U D7XPKzh)aNɋ=p8 $駟J4l;eѣ>{&xxxxxxx 'Ǻ{PKɋGFP;c ~Eo߾X)NerJsyGns,QavDbaH9'/aθgnSSh8P9è3_U]^DzUb~R} DBdU(sI*^ D.6iM/tE+1hsQ9Apl 8_; { F,KÐԣ:^o]UC#nXXOh:|c=RS!\:2cL.rp #h?"]x;M"59-Gz&,Tt #2@F㐚@6 B Ofm牸"Qs)B/ uŸQ ZQt9GcO&4LpPmh4dnJEzvuh@җYo+cʼn;2buVsez#{\:2cL.r)n~ԱSG&q9RUR&ٹ}뭍K5# ii\:W?ǽ/u'S.OnDrz3Ç˹H11=%dKi9HkfM?{b@N%38!O<qsqfhb˻H5\ZȠFӟ)?gjŢő.Z27.Onrq\Э#O\_=\:2X.Q|udS.O\,S>\:2cL.rT*PY$l۶ wFbblXFU:[nXNiQqyWt/Pq< S8*իWcȐ!8~8gϞJG4~x,] jٵkZꫯq;T3H2*H\Kk8U-S1tAPKJYTyA8Wnj֭[: IDATt&nGܹXjLqď˓dr\c4t'חdL.r)n~ԱSG&q9WL?y#|i8<30 g_3I0o n*#<|2.ʋkMvyg%,ryrqkaZY9J?K&Bc71"|VCΞ{=Xr%֤J {ܺjI`qm$㯲rT#5= '5+rKi}msN7|zVp锑ҹ8«Hrp:<8˓kw4Vzu'S.OޗѸt#?y'|w}S>ѰO:pyG\\/o.C[i:z^gaNXSb_w<Ɗo$iӦᙹo`u6p7SE !7iPYXI9J2'fS\Q:s!X-_ *`?$9bĿxM *ė"_lJOQԟ|0WN_St8.2rG֯/-+k&\, :2%#uʇ[G481GeɷFZN__~;iA-?dї?!~ |H됿ED||0 ?3}*1DwW#["$oR3Z l"wI.Uew)N&鲶]iUte8R7pez#~\\$[G<${ܐf͚M)U(o(c8tNTQFa}Ƀg`Hxa|kc1H$+\3Tf^OaΑ0CRINƋ=KBf2L܅ӱ47nz$V=*;usme47O:-h]ݗ^/@.+< @ӁKj`pM%h^\\ݱVŌbUSqC5LѴvCf"K-C.Ø  .4.&xd$d>4rHÆ dڛNq*}QHn ysqLn.xqyb8.G+ӑ'O{4zZbE?~\AxRz]}7;0%^.\Q:u0~xSViӦG)\Db׮]ӧh_HŬbi<`<`<`<`\:2cL.r)I/PY&@y=H""U )=xw܉޽{###pK.Qi<`<`<`<`'Oz~v@tőxr{#j'HѰO:pyG\\sS|< Rl")CjJ 4u%v`<hXd#z^*TysqJ +k&\, :2%#uʇ[G})N 0h<`ѰO:pyr'~ޗѸtNpyG\\/i<ƢN:%z8vn݊'N>34mqqq%Vϱo>in~7(ABB5klM)U^=\Y Qn.*cٿ?ڵkWɓe I ꜎zQ*G;#\jLqd'W2[G<${\:2cL.rT>DIOifp9l?udr\WsURrxTU#7;A ;z>*sΐE&dk?rwHwgկvt~qė˓kw4Opyrq:S.O sK=~ԱS>%~krAph%O9-hT%-@SE +B?'|c':OoOY=zO?4;<ߚT9CBy _ *[82e~8kq&\, :2%#uʇ[Gܠ*EH\9%ũaF>YarT!u/@(-p'Q*[sFtU/"[Qqeƫ:t(z%i3Taڽ{^/v/<*qfXE—<֭ܶÆ-Szoc8m韁#n߾۶xx?N6#ƌ[^\TA ۶|u6Ͼr㳏7ȴ϶/ʓ[Kٲr,i9r6G޽tX~H4/u9E/oӦ > [D=IӦM 2-Zzu NXq?'pe괌qez#{i°1oJd ѻ8%c |oIq-bƘ䮘%Sxw3K95 NW zK=`E ޝQ[O~)n`8q饗"-- kז;RҎ;qiphTy^Z$[RͩN[z" *8ũp, ~/Zo^tE5==][4j(biˋrx -XG~f,k((&h_;V⹯ƔWWDLY.E2=! IDAT]'t뽆d|~\|G0|1e(4zpx! /Ӑ/^Ƣa\Q,m5ۣ_͂3'/l,pD9# >|8̙ &vf1{l$'BXUY}1nÓdr\ԱO\_2'D\2/򥬄<(<Nν7d+DͲrteҲeKPV{)q!DzBӡ~^-Pxm.#%#<UO-PJQ |W G.+Gӿ.xyDP(^HlVz?T"Ӳr$3ĜfLE5p(G߃>O{ ۤ^7=;K-*K7tS{bݻ7f̘Zt/L?8h9+Sgl5W82˓dr\c4t'חdL.r)n~ԱSG&q9WL?ycˤ#Jڒ$?Ud0v]?6G/oG~ճQY g6w=թ(>/qdZX].D/v)qTHҟwglyuG pq7}jR/"-/ի!y<Dd7l:dDA6Y/[I3<uEjj*&W^r%~ Xԃ \:-c\^f.Onrq\Э#O\_=\:2X.Q|udS.OnX5H L-#[G<9o+O^&uvt]/ĈocxxPT(ԮQDeIt'cg_$Ob~qJwJKщz_>=%/cz`L4 ~2vH[H~n P q1z21*]$h~AQ;[cd'Tl KAuxkjH(Z}\\a2rCpyrq:S.O} sK=I/{=Mpx.OȪ_˹)}ɹߚ\QV^$zd5]+~`ǩ1e)J˥kN}IKW={({+{2rTT9j?ǢQ]-DxwXvhTGyeQ|yc[ouoeHՂbEүCW %//LJKc8 Ri vOC/s-=U5p聨Iq0G{@])iuo]b_sp/ɻtN(PU^<[yJ@w \^'W7b8.h֑'O/.O\,S>\:2ųW T=FqNXJ{oNTP2u8onNJ '+_*.(ɍ ;GqS%_X$*pJK8JS>Wx:O +2kt?_4֚ѫE9DF{ ZG~3P!%H m;.Ψ*Y2=U+Da"QO*C ni? I\kEM]y@Uz^?ncΘ}.d3q+G+kꎆ=\Э#O:#uʇ[Gf4y:78aϹsH*S|\eҳsɰ8Vhlzm4cqVxa NG+??9.Z)Uy\Nyz'@=KE bRX{T$6.NSGz=BniAr*\D bZ=VvyMnАp2@jLqď˓dr\c4t'חdL.r)n^Ջ5qSq/ Tplm-~ qezzʂRmA=JN31[+0T9H,O%zT5Nɰg_[yӬNxxr{W?b@-/x@ M]Ч`mέ<41Lqd'W7b8.h֑'O/.O\,S>\:2K'=ˬ1e%Y=輻J˔WVr(V =O_VN8ku/ Jfpߩ˰pیI~OF/jt,؍R];Zxszo 5opy~CNvYI~!(y3 9wx*9'«R~W1)uTg-go?"hX^'=Q?ZW~*.XLŽtOE\A:10(HQ11.þ}JDeEժca=)PQXH(ho5ߨXы֝Br <и3r'u%3M gf7gi;Qu!H(}4g)jE=E y:Ǟsm塞'J7dGm 8*GʪtеªHGi)NNB@ZmB͉@ΐkZ01# {W^.,H?t Hi|Տ]RRÜA(5;|Z.Pzq˓dr\c4t'חdL.rbB^ ꚾ!=RN_7 3z^aQ&?V*vŹnzFY_|͔y(Y=SC*zN 4,u/'kӳTŅz'|SI.<\i%9$Z޺,$rиx(*5+w d=H?4a8p9wVmiL?lC*EGG=\yg-K)Y N2U:L4@~Խ@s#cbUui?ou_E&x 6|A 4-xW矷'Ukv2Sd=8#q+GTdǭtxb8?}S>~ܖhӶw -^)ŽE؏E1!(CRHXzfdE/I'i*NUUC߬(B8'_-\ \h,⊝)!9H;;r %I/zbvkԵfRdOS:}#GG%[\3%r_2\:>J3X3e: [sW8-˜#L.h֑'O/.O\,!CS ~ʿ< QKڵ7P$3[ݻ*QR+'pq$Z9Z+k&\, :2%#eD{ΔI-}x#~\\$[G<${"!\(~M l\ܑKz]b5\`q~_0=!)w€^]X^[sqWQȚ;}nOt,XE`."/BSl r5jXf VQFxG%h~å^Q&.6W k*DW8M2X.1udɓKSG&q9WL?y#uʇ[G\:2cL.sHZaTQ(zjUWuTmllJ]+`S枢xU`S*VM;Ar'iӷbLd)gUAҫL]fvz!;+kVĚM&98IYMlܴ/PfA@NlX#dl؀?RUr mJVѮI'=HSL=/voF߾}Iezݻ7f̘/*U,08V0C2 .Onrq\Э#O\_=\:2X.Q|udS.O\,S>\:2cL.sxh$A B'^$${'GEoQ^ r *18zBc&s昖xsU(4t,z(j(t\(*JaH9GĴ5/ .i0`eL])Ҿ]0`d%w 75iY#Q-k%R +s<۹M +0Ws|8b.ʕJL7E FںaeYW"f@V`+@ԝ8xrTxnQ9JH 9[1'!~:błsQ Ke`F42Epx))+-[puׅ8!==]~B"+W/*œ/W2/V2ΦK۔yy,^9rjGUsлY șHb]`,#*A:wG`k n,_= ^脺rP,)Nl BzzN]ƻI޴w0\00:Ewq:M[He%U!\.7}]J<u$^D0#kS/NӾCYN@zxsh\D&}FYʴh-¾}X 9(<[L7[g|ѣG~/ neNVeN+2Wi/ŋ㪫¹+spVndU4?MW^)[o(->0Xn=V!$ס5-Ѵys4OS6oQ#*Leթ k,ͷ9:NvW5 Esy ɘl-[2(V>-]U1bR'\Hu4A8&[(> Ԩ&?#:Z`^GaQJ̟2O*H;w+Jo4T>ǏĉAi&=_hUs/[n7[gj\{-Qԋԓo- aС%&8 neNVeNӧq0,->,V>=lp::ZtXHIPWC,Z_T)#g"+mLy}9 M!-~'*e-7E`{E0llFx ±R zp) U *^"kXLtoo"+U*(ʟ2˓< hЇtԩ<"\Gtr!|'8 M7$[~i bU IJJBڵCɸpŘ6Uޮ;Sp4{+t8|89τPYK.c=&+ C˫(s7/LZ*' 5e浒Y yIgqիWh)BWb %YΪ#O9<{qIjX<߀CNBkŋJL.m"Wش!)P9HCh h|\!53 5m69 Tq i+7yFbŻue&/,,,E,1i qz+hXjCxVA*:e5ogŊ啈 0@>#[C)6 ;wCdd? okժU[Siذa\<@_zZرQ&_pF-K4\Zj8z|uS h,|ZZq-Z`ǎrSg?z%.]Y9sЮ];#I/O[0e(sňzzN}HIICw-2w^e~5ڻF ;VY`3OW[8w9)NiNqU~Q-n9͑ˀS/QQpG^.rD#jCrr8ċO5Udn)l< %!MONqJ/BgGT1J }(j*lC# LLR-@/66m-jAVvO3+\L4m4iyEكM?E6C:rX_nv>E|h@Tl 6PF``bh $gO\w/V=uLG)9lڌ3/jJ/{8wh.8#lfg!:/W6ll^Z@'~^-4(7N|K<ԻhZ7;Fv"\t+lly ~wC"._FFp zU"f}qxxxxxxxxx@ WrDp=Gx!Q ťE^ٹf237DEa`N_.]' Ws5F0Յ B1$K1VÄ^] y ?\/` F/́uzT ">YX1 YxZh&ތ&OT.aQjH{6c\q%ҩaWiI"!QTQIYSF>~X4VOD] 6m:rT\QFaΝغu+7olԩRK]pv<)w.[e>ɓ`YEG'Ց>(ɱ,a.ݻe%ǁ~ԯ_?}s^2"T.l1zߎ?29r$e,~#UBRmr@` '!f"i ŞUL`/vآ͹^\@*f-G]0@0u6XTwMK4`-Z#dŅˆ`WZn9C4w%~"V-*=Ыc=ybO#De6݆ʗM0up,2 jҳ [O!WE&=E\I .qo:z,7p_n ?>4$m޽ҥݸ꫱aÆ\PgС%F&+1$77ߌ3<g}6 $+R}6m /R0`Px/rEW_[nEjժD4?l>z4ͺuЦMB.c$VYؒGe~2+Oʛ}Yf{T6ߎnAY-pr+3\(fܸq^7F, RzW8 ,_\V6l(T.j 4:Z8Ss8aٻN='N2т)r gէsGQ'gMs9PJ#*sQ{<ҵ (ww^SIa?{NO [ĸ"0pXI((_)]u=CN+,H+Kz 1Bܫ)صkW.ÇgϞ5ǐ!Cy#%~@C^LCΜ,PKWpa3g\P4iX &+e 4`( ɘ1cdŵk׮GIMRԲeƗ^zIV\ <ΖC$5jճD'RyN>]+Wl%^07nx@`u g[QHX`, w\ ѣtҐ$F /*k܎;kNܨQ#}˵+e\GէsuSi4e]UPi{DznϧGܹ3ك[oX/ΡC_EjFxG^;5hhqJ]YΗW H5NP3)kC@T˫3Qٵ< _L=Jk%H4,}q1/~hTɶZmeazbߡB -<׷ aMb~M:g6U"y{% {kSCGT 0琾GPJBEUf0&>>ٴ|Z.}@MtY_8CǺ&Vw51lNCrxh7L^݇ ^k˕%N ܔju~V<&]!ôT' Mx@\ҋ… Ae۠p­hQ/A ZICA<"G-\4>˲5#@6SZm&yWO>7k׮>kUzi<^+1HIC)Б*^zy@sp޽{7`pby3&\E*">>^J9rrV۷c˖-xWR ?;v,_~a$̚5kXrCXsգG iW4@o}%3FpRHp:#-N 8e_bwuaΜ9=gڵ=Z9J{jg (N[On3S936N┞RA:iEK,3jᦹԻ`Bx Y:TL-\fr)bXJTaj<`<`<`y2b<~gŰsFqd*ՑP;H74Nq%<M $g Ry.=xxxxxxx z*DR %GKLhN݃L)I^h*&nI= RAN8]/Hllz?5C; Y,3K]Ը972Tұ83u@ުRx L) xxxxxxxz@ WrD%JRVzwT?+i ]ZW-rl&[1퀝+Ѥ]poI<~j./3BU<&\ ņ7ѤX=*G8;e]*ӹ# rDogH_lW4?!+'P( >Y6s`YV.bł޷EUmTČBL,?ni"3hy1+O{Ia^E )Ͱ$|Fc1Lk2ϙ3 @SC[ۏsُ3K`dzh"Y3$rD13G4u|݈[5oa؂t m%63=k(}{\->sLZP7ټCe14t9BQeoġjB084"H=z#0#0@sA@ ` LjHdF'cz^2TBz|.6cbJ"2 1*'w EZJ6FNsEj\(^a IDATYAn cٯ "1r\L[%ϊ Az ػLjHLk=UZ0`Pǘ8>KR's;!u18pUPF`F`ngtJ/|d nS4X}D"& M\p ~dm0qST;4o.O%F .# 1M]_Gϓlu׿i٨D.RID|,W"elK%'1nJF rq*0*T5g0#0#4kVWJZG1IrZrWsw-1~k۩Զߴᩴdwa7MLѳ`X fRݩwkr|#f*ȃؙa:'aa*LPCT<I|dT=k0#0#p">w$ %jt*o?9<!&91ׄ3xM#0#0텀?ҾݒO#$F˗/Ņ6$aF`FZ-1jNDsFqqgŜ0#0#p-10+BI.]%y/ւ`F`nH",,솏),Y`ʥkf.{^ o猀:N eݷoJKKaWʹ#0#0 " H#1I=(0= erxFi>ox@_3ap`JGۂ, 7s,CUP0yE|OFj~ ;!d$P`I/F\w: YnWi\hq_֐30#0#+hѢE555uEr+ "=9 .e{=5qKщspM0,݊0T< ]/y zto uapY.z.Vgv^^9Mzf̛ݟ@ 9TY\AAt 5eF`FpD@*$(ȑ(W|B4 ;Ln1rRi &4tFgNK*H\҃?k"<ԂSC8߶+hb[ ڍ=`</B?\L6ʼnE,w+7P&cSOKJ9T@{g &D=K9voV2on]4ͧ a\pi^! Ro3ٵ?qԬf!+0#0#p(nudI#AH}9Yɑzfl^zFsMcxLrJ؉y%\\ +  ٍȘ 6۬mj9jbȊ坈m6<v41X%5? "E",üᒬ_C~O)Jk8+g&F(W]R~uEBi&k0#0#pPȑ3yUgOPQtQjV ʍګ\m*6u+M2FkbGNi_Q`$\/AII  X!UKXm%)/.\B2 Yk{T&Q]=a65B2#T ݌ ]KgJD~QVXʅ;ػ$u!ft3XF`F`n4HqӯkP'(/Ɣ0A 1)cuݔk?j^ڭ!2V"BaJY;v ʮn!85*qΪ쎧dxͮk~MK`'dKFZQ1N Ȥ gcD+ Ʃy#y֎`F`늀*!R'X(8IKsF ]tRKήxr"9晴M).kq:­ (/ߑ]LxΤk胮h:v'ঌr'p95}XF`F`:$g+ˋ6`hz-ĵABZ})bs/$ T.HGe:;!y.:'.]mt&C~9I{z7 f m.$b$ g@ HZ;jU(ZUWv+B%X˙DUNLnŪ2#0#p( ¤Dft2%cH)LJa3&d!"BUI;Ņ"-%#"5~.,b{ߙ,tқ.Vڠt=:8iС;N#.nSrĤQ،/2`>|wNu'x^rs @נAT :]Fu!X{4dBs9݅>gRLn2#0#p3!*&>IDl2Iv;G$br$ 9_'E,L$ M Gz gE`lZ.4*i !371M&^ISߔyc$*2i y'>QIÒPLMTś6 5`E gǑ88u !~)\P ʐ%nֵXvkjuf@ CywO6SY-F`F`~44?S+SkKm$Dpwwkfbb!mkx6o8blFNCu픳;uLd Fנ\#;5!PSGiGF`F`f@c)и ΥqWlD W 1usrد=9uwL5\ST:&H& #0#4'EnN7y_X+F`F`~3xA7Z6XF`F`F`lAj`F`F"p,A @G7g馊rTi=u-~Ǻ1A|:#0#h(h2l\ ӳPG~l!"ͨ ct)2S̈́An˫,'jw,( JxiG%9 l YQj- ֚6кaD rOEt&/_Ge1aƍ8jrG(Ȋx/8,7 <|̴G :T>1cZ#XNa㪍 K耨X|ychy&CM$VaBY| az*-@ކ(3:㉘GY€ ?C׮3B@r0bBOBStg aD߃U=.o}쨱g~M83=IưF!8ް\ XWxU@HOjWԠ~Ur&#0@P f Z$T%fΣOfaǚI]5Fm:emS+,(w޽3:ꊟچZ:9c ia82~BӯMGs-sA|Ez뿃@;4 AeƤN_,8w'9YϮ76a.7R#^{"п¸D;gTQ[Qڵkš~:fj5UCNkjٺ8^a;53[EWv\ffMDys .ޱ nѵ#굛Ny;kԻ5{*@6>" ;NʙQO#jT&Axf|pĩLQWJqYl6(0"=zonl:;cib!< 2ts "7=r)KqB:s?'咄%ck.`?*W>MWf'6ƿKg>`te!a5K%]/eaGJCAJ9({x{GJɬix}GUȵ*@r>ckz(mJF^v_>0v@W7k*0#p]# :YuVOum[x2udIfofP"_ad,YPa?^<bIsbh4 ҦҼ鑞_LeFΡDr+H?DZCeۮrOy$!~IԾ$?zZ_`,O_XL[R10<%tޟhҲR m@Kg#1>Fc*w|r@87ʓ-dl7xDN[ ,Z2"CB_ƗFȈ tn: ͧY4/֌ɽMa$!]X0m4Bhc3gڂ}d<% ~^xbPᳯe0er|7xfH€DG5^FFE_a>daVKPQFaLa8,7I)H_h|5DDn^x$Xj6.J8'bT0?Z@=ܘ<AA}@&% I)4z<0YRk_k'WwhFV*pyE5z?UV*Un|gF.8#U*:3 ύ\unЉxT_4:Xn~ _ck `tT= A#iu_K3 -\LJÁ2wP Wy;?Q^Em;YcsQ;#S6s#; $Z&t}PuwRD pZh;x*;#ޕ,A]m:"FZ_mIZ{-8_?Fdx)ԮQU^-l_M\J]7|bC<=*o*k#2#zT b4;+&ñ H>$ސ]M̥t]+ZMy2MNŨSXJn=z -':kuFJ_m?e%ShLƸFӮȉjX4]34k.Q,BFdK0(Enj5NZdgrw"KXsȌ/bZ#dWj,|i@2.Gu|sτ_F"t(8,k`U5d3 >͎3BdxU'M.O(YŢvw 8KolގHqlt=O1?,i}SشR&8*H2WKZ6mڐ xߩ~^C%Wp ="!{e/Z{PDE._-ԯHM֡ RXKO꧘ɟY׊m$|1WJ29 N'U(?~HCZK_ez/;s޵lM0lI3GGc.7h['P8'RDFCQYVF׫gD _Oj':=_)_H^Hp=gdL܃7Ôj`Tn @ IDATdr f8S_44 #%Ů 䖬A7% srR8-7%"vpNZHYAv'](6ۭ,Oo]$~ai!%$!=hFߝlm8oL0˓u'uR(ÃbjusZw(劈|d2)~9m%TK4yD2 p 5Hix9oң%9&;~l&o~G̎ـވ6qGAdz#קƤ2a0&K!h Ǎ̴r &{GqKSW4S?*')|K$z&i8~DUL +8+d]¸ l>>?R sVQ:5:z[tE Yh_C?puΛ{6-l(hPqd+z<GN|DϫͰ)8]~ J@;i~gF)g0#\ Mu/QI3&ɑv5`#MsNb EGfo_mTc#\&qRmIU6? k CaAю\ҧ"2|*4#rr|#fRdVV4 +'Qr;wj타,^*FMe~ƺCi;7'HR$\wπ 5/8COثGַWFI_ۏGojܿDLQ Y7( kL=5Ğ=ޔtTk/Y]9U%6Uk֚#XݻPm佁3jꌚ 3>êv"i1{*ΌGVUY^` _iϛ%TufC7zN'8S-oj͌ l{<5گUGe߭5&}5M2ꚏgb4j25R7K#P{NjjI4>y^wR3M^Y#Np6?W+S@dD@i<,o"PV\$[-aktL 6q[ke3W>/>? EXR%nmDC@^W'VGCk-;C.9MMΦy-OBΊRM^{RsHHnILk'J5<OWEB+n=:t:KS]Hh1ay($mѩx,o N/ew,x`;d f y"r|̶Y(ri 0QZIr2EiBJM?zP$eZ^#t7;KWbxkh#O̊BZ6T,|)f1h̪ziӺ=BdAP $ZZpzχ KϤp3$JS <{(_3#DdUNWؓӭ@ }]"VͶ$tʀcۢ];!;՚+4tn !Tw>VVUӺ#3mfWdQz't mrMF r;ƍ94(7hA&w~x$-wMvsPp?zɾٻ4F`n8_wC-Oi3'"4^&Aj. _*;C9+Rzv>Βj&ÙLAbłJATKEM$GRw^&JxUݳunsF~#ugvPyc8}tsͳwg#0#\곏 E0#0#4/A-1S JW'Uk\/ ]/$Y#0#0u$+F `,:tG~l;D |x:u1aphJh=d2,G)2盨2wuK ВdF`Fnh.HA(TҥLM@mxߺգ{#hA5my YZl/yv|F`F`nSԬBbK IK̜GofaǚI?U0Dk d@龓@M0=⧯p=>g|pN ;O:6&on.?)ح;ڳvhjHQ|*kK@D"]wsո󮞸/ՙ^Rqhʱo  dF`FPɒ G($cҶ)s揳]^h* @BN1=cZ]tG>0b{kH/DࡘyJtœq8yd[`*d^"o'2wB%۪5Či},"5'g{|r'zz?,zTUNZ vknwaF`F##gT=AEAEݟNVO CU:ahi7F<[ F/ٌ02Ayî Jy@;6F9")m* -$C_LeFΉ $-1G*zrD-DZ]LIƎ{Kԫ8.Ds5` ҭyXkF`F` Gr*6~P'j.DFW41L+:ˮp}Q$ _ckQ<.Ce]%Jb@#Inx"ߗ>ZI.EoBtA(qM[ıQ#L{֫m79i\"fzcX-F`F`nHb<#v1DZm(΃lk܄ M~:"G ޱHHHCmω rԉ`ͼCV:D-܊Lxko9abI59נ7i&V`F`:$g+ˋ6`hz-pC6U' 3KQ@' il%N ORIR\E|3I.<4iĆ2Zo*r-M 5_ԟ/k0#0#p ( ¤Dft2%cH)LJa3&dђBędEV{w+-֕`F`>ID(2)CUs. CFXdS&d= F]Z[x!@ҟ1%rH S,O@Zgd?`E!371Å)G@?f2O1da,);4o.JȲt{d'IcEȜB. UUN[ Z'TguF`F}hh~V:5 =IrQ݆.\-5StWBEE~mON,fR#+a1xi[a D0m룔ޮF( PSs$)50#0#pK"iʠ4D[ Rq=5舴5Hzr"WIF8}X;F`F`n:7ۭCw[&H}cF`FaA˂ox[&#0#0#pshЂTYY} MQ{aF`FvF@CAѧOxx(n܈=`6ry P My[  G񑾸...ҸXWF`F`5/_O?$ͷn Ij(h2l\ ӳDo9㑟7zTxT‘Y Qpňd}8Yeq*-|jLIA>6yl^Tnu; ˑx!DoF`Fhhi 1s,1 izhѢN_j0|&b(ap)ۃȑޣS 9Fœa+2hj,ݺai󯺰 G4Li:\jWz4v ox$#0#\?:t'NUH+ȑ(ٚV|Ž5hSU5FaqNv_"/`F(&52 qcyL 0,ѢkjTAz5(9p>}ntGI3r^=xhs' ROQC[PDYx QԈ,xL8v^8C@{g ȓ܈oJ8s+2:1}(`anm:€@L-N Xs$l(_.k0#0텀oȵފ[#YHH}9Yɑ=Gr)ن`w GrAKV^Ma䮏Fj+LɈ=[yL5;![:qӉ+U_hBR"wS 0ƫyA4'pCq#zMX?C_ ]Q ԫ6-/6bր#Z(Ze9೛@Qė3 3? 3}n)Y:{Ч?h"G?V0jόfgbU:.>yрc9]gߡHNipJ$WYe'&7I(aIDr$ː|Q9s(4CBTXh]D03Cko0/7 3E:ؕ-YQ"s ПWCH2(Yo9wtP/; }q~;gF`FݻoaHWW[p (?{\A+zܪeKѹsuE+ٌb9RTRﹶ J/&-$]4o0&)ؾsk_TK+QTwAh ,>y7LD݈Md Z:*?] 8]3CGn? ZjH|FlҴȞ7٫#"Mx0Mzc20>[CJ?2O&Թp9Dܹ 7w:e>6i-ln[LJjg*|#x (/Pf|0#0'@ݻwKbۡq"-e\B "6.Xco.)@YyE$-\]\} DV#Wv?r[dc:$g{E04=L\^xyIS*5@ȽϣK`RdGQUS_f#wYiBUxhdMO!DևK/ O&N }3\st_Po(BŽ%'|N^ӛE߲X$ GZs}˧"-/]GG#i*ʩ#`j/jٜ0#0*}%!2P?w+;w:GǷVTFBw0XV.s&}Y5yc'сQm;ڣ5y\<]QM4ZK(Oɷ!ޔ2%X}g0k"yRu !l،)Y,ÉRD ?;?Ғ w%_ϱb5RXBp@\)JNݣЧU􉈰^N29%,xUm$Ou@u4htΗn*YUGgr+ebmauk^#ޅTXNc#ڶ3"%R&=UZ0`h "W?EiEasBɍo:苟KǂݐM/_T$HoxoH"ҊFTU3F`Fhj_OI#a=ICCCcرcG"{ID!)_|(uĹ}vLWCG+ApC8MDi~hܱ,{tZҴmoNߏ49Ҵ@i7"-ZBs'|w :صNuJ'Oge nS>"EUprZӘs毃0*d_*-7"&FDHґ85V+L-$9fM@܂EGckeel &'_@zFPE[ڬLBa%D œpvRoE71F*z&,y[uMDH.E"({%RV$ѿ cOx#+'VD"pEQ M\ x4Oj.œyۮ|9Kq+{z;7Cn#0#ܲtJu)*,,l9٫<qT$\$A2q+DZZzha !#s v-ֵj)V"B?t_ =9EcQQurkY"IZqVCjВhByf"UOuh[].= >c$P 9 XlOtDq-8-3BD[zM)2 ig7x c`2IR=nG*:M,OdB1RF$Bh 9[A C)k՚*¦.1 04M&H/>r'X:} +&;ԕxGYXѾ0#0@C{)v~ٗ罬}*X|W z|oWʱiZև]®u{̤qOt.YC'`l/*ۅ }*ھs_D<^^8\w?21Pxۡ+a֟ /^Rbvj:ba% ]ONWNyز :x B{Зwذ=O#m >ntjSi 2%'F`F7E@޶mBBB9r QQQRƍU8ۧG!R vs@CfK4~}hk!Eӹ=ҟJt #D^وptyrKWhݒ,t$IDATAA:p;xZ{{Y߿t1 _v+=85/NDhJ5/yNxl`lX9ɷ@~ŝ`,܀~YIl߇Iwpc+"`C V}v #݅$SI{6|#<;Жe>l0cԣ,w O/x^85W z_x0 w|7Png>+kcZqX&y9a\ֵP0V?^G"'%lǠ;N^ΎMHzM;gĆ4Ξpv.bs:)?F`ffdGs(\ |Hz`ii#*CFb:#εc._ tm1*$RMWN+P UNmG׳{tu?v}o,{dX"@uz&e$AHx. ό rheQ`_/̄wHȁ1^ReV?c٤yE)$YEew(Rb 'Ա|@Io Wbi>D}z"cQqoВV:llGzɑPeEgfW@}8;Xm,}-$d u-*<$EڷI!|߲]8.<')'{bh\i1'DpwZ5"Tq+$^!H=_?0AB=_KF~96_L|p 0# 4x`)DIdO KYC+j.U[YZY8&m{g;)]+vؐ [~ȕ]RHvď~ۏ1O*n][{/[}bJ]V04dEV/rH};NTo.5TI) yHl@rp J]Ocy8t+n6I*R;*>h .R,=; a}1<;LS'' _bب`݉ewӨTLqR^mq-2[P MGpW=_32,e[GrS~px=Y_bҊtt>I\@gc6t8S_Nd^DF9]j)#e\, "~t4 `g)J<{ %~{:?G XE@TFoHZzf#0@3E`͒fP3:[n8uV\)ٳ$oð X}#֏{7>UȮ79%*G#OŘENS˧!fR@BKQ[⊅^Uwߞ]t,4vH.1!GjݸKŭΑ, r$RC$rǑ(=y'1Y杈m(ɛjS5pLYYĜDj?3a"+98'yvᴉoS|srtuчB蚿9aZql("Q(/݋C,Rg- %rYu4R% qO]@iw҄@}]u 0E gB{i`*Cd]EDh0/=EVD[Qp<3rv<Y+- v<0F`Fiؓ!\!M7MS$:"I&սɑnה>/K|9"G#$&H?#dF`憀B^}Am \C­HOʴ돷l5>:P2K1!O)'۟C|ta> fln x0h8Hd_H,p|Fg;#-;A@~NdF`F:FBA+dWSɁ't4NZw頱H[- Dt3aH0}?I5{#(dzZz\$-ߢm`ҊI>vĥn[+wLh$M+OKVPoY =͈-] 9=Z܈C+yzqSSIq"鶽<0F`F`jP50:bϧkWo]}< nq$aѴxFsAhu Nߵ#YX7AzGgV ,s!B<@vr/S|S"ˑɍ0 =o:苟Kǂݐ Gs{Ѷ)itǹJ  A-'cIDun'>$v؞t#.[8̡VAͱLҼA@ %ƒ}xhu̝٭P;CF:[uje&ȶ6R.~[ܽp7(nynUQS 2d|.kXw     t:FgAkQ0 c=ے6'?7Ά⇾HS]c=mh}H@);˒H'̈́ݓDyٵ%Ni$=76/+a/Ky&   ?ap(&4(̳< 9z I 8wڢxDR& 4i{ݞw#D{y D@ [$@$@$@$@$@&j!UIENDB`pnp4nagios-0.6.16/share/pnp/documents/_media/srv_info.png0000664000000000000000000007457611662503006022061 0ustar rootrootPNG  IHDRJrt:sRGBgAMA a cHRMz&u0`:pQ<tEXtSoftwarePaint.NET v3.10r%xIDATx^ Uŕq@ (DE(Ph+"4$LX"*"A#ʨ&JII/ǯn֫s޻z{N]{W=u见Dрh@4R~Dрh@4 H@Qh@4  DDрh !Kh@4  ,рh@4 (NY?yZ4  , KEрh8 Y?yZ4  , KEрh8 Y?yZ4  , KEрh8 Y?yZ4  ,k S't:ꨣݻI&>"z<7kTX=z2 J"s) d/E;n#8BTz(2 $ԏJh]ǪI$4%KhC6qDwWPiӦb\׮]k, Sȸ`u%[6.bիWXdY Y֌KYg $?F*DO"/e]&# Q|ɺ{~UW]|%^xAw#h.]H>Jѿ4yZMj,Ι3G:`̲9/2_:xbEÎÇP':<-_\_ӧWRA sV]xy&5 dY/wyG{y\fT=~0<ϻ駟>}¦Mb8^˻wy楒СC~޳4VOYmDn;Ns̽R/ YcFzg&K#ᇺ."2?׏׿a\0h8S$>gu?r4 dYY- Feƌo߾zY^Rbr' 3xDO  #Ϲk_*ϱ2'U4??O~se_MR/ sPyFNa `ֱY ᯑwͮc4ޅ9'^+$wGY1+jVB5Zg_ȋ572d,%W}U~lٲ~H4'Vf_]z %{~*Eڈ%Ťf")pVue) Isye>JՀe꿨֙>_ڠh~>;<ÉW<_8p^s3C mܸ1MQW2'eBg"<KL<;ℑ<'y=JY,Q\) iKg!ˢ\<,dY1C/Æ S!bĀ?'^*4Dx:tP&9jʕ%"g, EN=" J;wnX:Lćl$Z&cǎ8\~7,*E=.]83׹_dY1H_,do* !J2qnڴi~,m+ZjsʰgϞyle?c9*e Yf,s Cv^z;Ն+9ëx㍼>,iuQ.$qy<^,DiɖZ IOSl8ͥXh@ȲBB DՀe厍H& D! C4  *WB;6"h@4  T,+d D рh@4 \ YV؈dрh@4P!1Dрhr5#??S+: a <39#Knȯ@0  ;dkWt  B 3$  Y$I" BtRN.Q Tmc#}T1 xuң DhBvBBu` YA]\> Y Y Ymqя~㎼9s:Sry2+0W[i1?4]g OСCթnS+Vȁe)>P7xj޼N:L Buǖ2XR&Yvuu ԑS'7P3{~ly1OIy=֭[K>ǖ,Y;cUƍUNԫkgѢE/ɭ?xuM7ݻwʑ?]揯>w|1ǔ\!?~۵C;_|1UƟD?"ؓ]E%Dپ}{OO?T}_יN\:tPG^jӦMGy Q^ݺŐen@ubu=Q%LnNj(;Ig}ꩧ#s䮻Rݻw/,yu,sɓ5{?>H >L,6eԨQjܹ%5oR2d6mZ[n]r./hM٤֓k_k I'ϟwϔ!btOoϞ=y"\:xE֭ؾ}{bI7,^X}:Rgb=2AX"!S>]R.=|2> ׮ny7(MyFG7SLQgq l;|x޽{dh׃71D3s<>/$ .@mذ!,۝IF;>3/ͳsZ|y=AR|d>]aw{Fis7P{[P-(GG-[TI|ǎ;]bu?e/bcr?>cƌQ֐=8p:ϳ$%R4o#f>+WT͔KdDNlxaB˪sFU<_ #$lѢw!uEm޼Y;7nT^zi1|gߟ'hؘ>|OhBQӠAĉsΥo==TyU:;M{Dr&Mؓ9s樶mۦq ^l N 6Q!} KQRPZ[!se[kO"?p H)[xdyC_YڟtI6gy뇞=}KC8Y :%KسF!l;v!T]wt#2#KR IfYmM4I;Y)e g/lYsws PTɒAYf?_paޠ2i?$Rc? +}Saa"3qՅ^Hfvr۶mjڵN.^z=#FрЭdoREPiYFpOm3؇7b"K}Or6wNöYx$0}zUWU9C9w^!IQH!tۤ^N29 ˄_{K.;rܞ9-[dV,W {ת疡}s99sWu{7njҤx*rBN%r`_>u,[L%(<ӧf>8Dpg8A#Cr'([ YRϲc/s{i߳^k}ߤ~駫|u]9 L"Lp_H{/769cJ ߣ$b)֔_8̜2gγ[ـ$[#}(I22~}N6m8q [ސ'isO:?AYYKrQ"+Yt9q 9Y7Vqz+΄,+ /zk4F,gY. 4!YɪG>W xd!K!K! |lL$z. Y YI $툱  Y Y Y @B2IdeX"?W YmDQfKVPT9S+: ^d%L!K!:CD%@K4 ǚ2Y|!K!L@.c2+kZ^i_H5X{!d!˙3gYo)`9]yǮu .ʋJo&K^.NqRgիWGe: FY_yqǩ[V\ӓd$vT]1a\Cn$LR}{:/РA:sDnyСCs ybi5b[й,e>|6/^XgW_G^~x')m^tE>^ho9@V);M)ucו6g̘AWvС=zNޣGA -3P]312ZR*?~~3^Fg ]~UHgy}Weo>*u RɑiNKHvo|:u6,>4km۶E' ϢBǪPfy.KB.s0$țot}\H]i,wߍvl݀oy]ݥ}7oرDl;>,+;Y⥐A5º^ Q'ek'Lzݻku_y{؞/}O\#O:'z\)Sh&ziI"W-˺D xKe1zr^JQuMm#K2+O%g cQ2dbNݾg"T)WGIYҁ;VcۀQy%k5_y͚5kI67F43|6#z){Whɮ]yi QV'k׮b5l';w+ ғvک;wzX%a8fs! iӦD6لCrJ 0L3F{\CHg̵ɓ'.]hL]\hmD EX 9cs.TOYL;ksPd.Y2.x8:$qǎ-[38NJ+JF6Y}tdK܅#`HeCCMDb>}ܙ8ϑC.~jK\w?eIDOIT+"Kl K6@V"uCۏ<ٳg4YZJ` K.>tU|{Y&,M$ Hў|IDiDv%3 "7^9iݔSn !̐N+~YKo}+o2 60sr!Xm5h$H" $Kݮ1¸?ZqLґi˝eAIP-[]=ZYx a?fؒBwsRGEBfHN_ћ~ҥK3KX7AmVp_HOiW-di 9|py%KFdbg g@55k4Q3YsI}5dI` m/VOșŃRgYj(\ 6Lp ^CvdiѢEjd xfe6᤾9FhIBL#{ChiӦU"y5f0 .2!'ٌ[R(C]/!(V ̗^z)o?3$ /O82D6(B#4cS%BK+8X,-ڑ]&+`jpCC`ԋ׊ذaC2!Nk="grdq`iҤIUx=(c0hyY="3^l`{F!0%d_C۱E{zςX[![Ⓔ9m8`,g$u~fO[ř1fK)tV*=e!ːY믿^/޽[1BGlo۶Mg„C*^ `婇%Nm\1.m-_\A,YN8Q{{&FdiM1m'B䴟O($K'\cˇ%eO9d|s=WmC&wI c3Lឆ5a_8ph/M^E6/8,N='yiěE>_ f2Ndig2Y8`:)>k_l6&xI,M>= nycfݞ9If+1>&B^Mjv]CИDn_&: igb+|];4..09  .0D5sR#Cp b9c{('Z<䬅 WHG!L0oVWq!R-1(nݺ{O? i~jKBz 7CG.72CҮ+niXҘ"Kʛk@ӈ+izkwWv,Flx3FMs,kJNiWA1Z1uȳͻ3 >d蕊XWj?D.ciDjځ2O6 !KyzPc/F%Q="b텐``.uSy!K1|ł_PyUZ0k/$r3 0EF!@y0k/,,,uB,!W!K1|ł.铐` bDBu\c/F%Q="b텐``.uSy!K1|7ʚ|:+^c1 d)d)dy5Vf@YogM;)r@a@RR!ˬɷ#32&sL,,,\0O,^y.d)d)dY YJ, I,,,, $H;`<,{cՕX_yU!K!K!K+bEtdi|?xu7>(uqǩ[UGm#8BK/UӦMS?Olz=1uKٺo1xga{k/"K'aÆژ}ݪYfk_DF&zzԱ#]7Z5N2Eq裏lZh^׿/^yռys`C oG32X{QYY~/2m~aէOHٳG_?>| իWҎV H&Ot6oެvƍzY%̤}Q~5w\MdG֟Yضm<` ?\/{ի1c 9[߾} NO^,G{,{rs„ /'N L"LI&EוFv 7"ٳRcp z:k%R幐.Ȓ`3ao߾}~d`նmڵk ':\'^,k{E Ntk/2iҀb&Fnݺ{OeNIr&!^gWmg١WJ>}zދg<'|^"t~i.|Di{,b8< e'Po1"=c+c%cUj ڋȲK}2 JX]G0,}B"ZWi U,>'c&cV* !K!K!K@@ SIYR _5|X qbDBu\c/T `b ^Y Y Y  /Ŏzk ɀ+: 08zm'DBL5]^0a&@~E@؍,KR2P|&$ ` +Qbۄ,,YVa o&{,!xw!:):,zԛrrAdI"C*qp^@~m+VT$Cɐ x <)*H%ǎV^]hǓ޳g߿"j Ș1c1Ur^8cيvpEG}Tˇ a8sQm۶ {9$9rd,q1`(iӦy <IU-Zxݒ",Ȓ33YnٲEo7$ mʕ9ÑY_J'!i΄}dշ[dTM$I6]sYȒ!t?j~s^z- KGydݷo_5eʔ3dl?-|,[Sy-18MƒD"fh<}1-_\KR쭷ުXIɪ7"1HZ¡N}˪I$ י/p6uTȥa} D90eub ,vڕ YY$]c/=;A 'pB^M3#@Wf _LmmˇMJ̞eYfy_uV%.]9ܼy:f}POQއ;*lk$ !K!J/dywDc=d@Xb g$:>R2!{キ od/F$(,̠Ȓ\Z^$cǎg"Nf8?d]͂CH_\9}B}0aޓ;Kvj[}IôgVO\6Doz&ݻw듯f҆%zd…y=@`.D8idI90`,91/%-m۶M]VG6Pۧ =#~.F${͞>ewf H.)zsO8o536QD7 ӭ[7{<޴Ǎ4iOj#l{,r`s|}ٙg9O}[vՂ}N>=oꗯG;!L (yyРAj%`q `2K KpUz%С$,M6lPRdLX•ŏ.^gbWgBHIKm29wrE߂eLP`0 d)dYH5eۘ߮ȠA4̘1#/)6ƾjs+nI.?[oUKݤ/~?^N^LꌗԿUNҧPR_m%6, 3!"(۷o|I,$%eX_6v[%_Kϓ:M6:myU;aN?ɞ6B)^ӕ6ǏWZɊ #׼SRݻwϑIH}2 ?}3gj7Ρ _>}t qiGi.a]R~.Yǒ"/^SbHz 2 MVudIڰ͛a= 7&]5GncDv13!ɍid&_I]5:0jȁ}nKKH~ƍ+RD椑sH y#wY2|CD:tȑ%< K8;P}dDyK>?SGyMӧe ۀRldD0QBpv@ ʕ+O3 CLq y$&!nSVx*$o.۷o_Ԗ\Dz޼yD}Qѣu_5ضm\i}y.Yv l0&8 qBɈș feak7pvsNX0EIS>$>c`;$B7ijuNӧ[_ 儤}(YڍoaaN].D$5`R-Xe<~=@Lc@" ݲe. 0#K#;}ܹdCOn~D+o=\'"ɓYY۷O/=#EhभZ*W>$>߻wo$mݺU1bWP}9ixCzv |ӭ/~~q2BI( Yf>!֬Y7Y%͛ %]21\oBL-ZMdud.֗>Cy81F'.CX/7zw23Tor_@6쵱jG>'L6%{L?xΒ &>%{(ɐ%dϐCYm־d}{p,=Kn)d>vH7IM;ԺX*~fH}YګdrܸqI&49Xϖ WeЎ}ZDv{Fs duux%1e pǘal R^hlM}6/:6d,i8%`upe,%Z68EA:RvH X#W.XD°ꮚ:0B  "bg`@0P0 d) .96PbRc@RRR0  KQH} ,ţR0  $ސx2`x Hd)x`@0 exeC`@0P1 xQ DoX_0  ,ţR0  j*tߛY*Ϧ\J>xNt(: * E:t"/e|Ŋ?J,|h+Bg2|2$e9+^zog1sY͊R- 븱&K KՓO>SdϤr'v&zzCdG@J׼yTǎU֭[,x]A7VY"* ڍJ "Ox&!CiӦU֭%0RԚ?~9}rJ9\5/Tcǎ+}0tv.c@{is7˼>c6lnĸYܖ-[ P!,iC=WDc"6a|GrӫW/5KԅUq}M-=m!G}T߿_=3u9@>}v$߿?~߾},$Mt'G!D|>$矟{Yɽg s$-IuGI䓬 j*ug<)c89 uv͛78\>MRq'cP ,I"k" 0,R%#<2gqSH"g>dsۡ-[rpH4#5kzHL}WT{R>D4fV\'Nה)Src޺qw !Ka%b9HLiw`N @4Yڵ+`\ѨQ#]oȀY6m^|Ly. ezΝ[ŐY@F#kR? ytpp >ˍ뵃c<JN.deH%KS(x(Db0Mwyzǫʕ+saQw^/e,,X8$aY+Kl߾]2{Y!,E&)S |&85Q %K7q -!)m90Mw'_g͚X^ z6Y5JL?auYb_O,'Ov=,}yCN^y啪C{5{>5,^z饙[ܷo*q\=,ZHz !W^yE;,f%K9 +>J{4Y""gN>d]?{5uCv;˖-K$&Ww2˗/2Is':!|jЙCX}KsUwg}Vy晪aÆ/VKDo]NeMrf/Kg̘ݴ{;IAM>e jR>iz4YB۷׹HE_]rY.[pϗkBL4)׆,.iz_g'D.|57RǵiF/}}'ufzę3gv}${FYCZ_H~?~jժW6W^RtMBD[1P*MC щ+udI͛t^=!eft-71vX{Nf&ڵksfϞ+gyFnZ #Ƀz r&n';oaÆ~ ,DTFdof͍(BieB`PϮI W\^|<\PK}φʓԐ%dIfR'/aÆLdØB#_vΝ;?9o:ŋ\?Z.8$dz$oGrDhlٲgE(㣏> 19UG'x޳g9^~!rV>y7$,͛7/U,>e0v0bѶ&;k̘1~G_ߖ,Y?\e$])5mT.i,emL҈շJz*cUoF7]".]͛7kqFTf.CBџr|FUB!Zہ'`7h 5qD9,cS_H~d2j79Nʕ+unRй],Gƙ"IfeRF3,a"*Kc<~'#I!P1p9Be4,d7F7"YF?7gE$7I;uTq#b%Kӧ$Bzs @ҮoӦMyu.;w;o[0{&Thw:I9}ݺuX}0_V~NBLsX`_HlwO=Di}cψ~kEGb=K%*!ok\Ij^}7IᱯgigG*-KسaL}1MCG`$!/&L{wtC>]ce7֭arcCLlYVaɔ%KT9a,+e YVY\rKS2D11 T6,+,eTD o Y Yr`@0  0 d)D&`@0  YY: c@"K(ţ ,(+ ,ţR0  $ސx2`x ^B[Wly[b-G=J%_c!oDC@U D1EB>@DyՙBm[Wlyd#Y /Ҽ~ŊYabVJSy8ɮy76>Cu뗢SY3fKdnuE/\Ǖl7t"]&$}3 lo8G/V'm/6oܸꫯdgb+5֤dD%W]uY>J%x5i&գGo$yBm#Yl߾z'u321IjnPNEN7EsQIp(2~xW&VcLJݻTH}A6fΜ+} '7sߪEm]ݐ` &K q۶mS&)y+$/Q+4׈]Pٳ':'4;Ǝ#+5ة(gSRS}I9 M1!yvRoi._L[^ MVE_֭e!ϢW";9B0!_֓ɕN k׮ڹsg6m@DsH}JC,MXo !KKқ=Sڡ2BH{nD{%¾K `wx$ sK.:!ɳhggḾcƌy^]N߾}NKrQF&;$ͽÇ/͛'K,g)òRzƋf/0TqVZ+?tݻNNnݪ?1+S>ֿEzv |߭/~~q2BI(,xذa%]bO?7B!">Us/Di&bȲضl]@vdK[mѢjڴiL9S(Rbݍ?^E+WE|2e+f80޼ys&.qj,pӧ%{!Y"K{ q?RbEyn!Cq|du_BQ~ǎXTvZ]CT 9a$dIFdԨQP9` D~YB`m۶M1{L.]L1z,/q<ݔ,/-D:yid&ȑ#s{[` }re=pu֬YqH -n…ѻ-cZc:eug!(ܫ0٧;%C#ڮ];sD~u 64ɔ1Df B\$dITlɺc/t߇4}Z$>'5+.[R^6d"`H~ cXrۧMvi y,nj,Y=,b,%e>}t=›ղe{m\,2nF8ӎ{]8GY]vU_~e4YL߾}ժUr݇(z[#F1T_辋>aӰ?z-@I~5(,c*e&ɕj\Bۑ!jk֬dR'7om\ K.N,ny&20KnÆ a \'`z0 dYR&KLѳY0P1 d)d)`@0  H> ,c/ J,ţR0  $,W!ޙQ0  _ Hd)x`@0 e  DQG) YU̜93?Lr:ZpnT\թki~ڀ2)'_)`&St|8HD\ґR赾Q^}]ug7Xd钲"ElYpRpj^Ky>m^$ΪO)W?ɮq&K ZBe2W]u,۲e)L9[haI&UI4o<ձcGu\=G)Qfou v*0^VC'3ޅˍ3<:{j9xbwo^MC)_)Gm۪WI>3e)l &i|ek/R;V" ƨ)>m$oB{r҄:)7*X)HŵzH+409fMYK%,.)YJHLlM:Ux)6,s9Qiժ&JNICrsCHBO[;3EZ&/$ԩSpsH􍃔/V089,dY8uu qN\BBgs 뺊[W9e!_]`F5kC͚5SZLdi" 7ܐ[ZAr sF׆!P!}F2DtY5ar|gkׯWzy.,8p,kNDBG&uݮ, (˫v,L0Am&Mxwz4]vUE,ulذ"ːBF#M~!˰ ͯZ/{ot%.ai0i6,CIL,+ =K5{n9^]:*YbL+={v}_~YEb:}Mm۶M]6o"Ș&@רL8Q]r%p UeI5=ѣGȖ=Y_!KuƇ/&a߾}4#ۢEA.v)4!d!JƩG4,; ZR^Pm&K{Y߀~ٲeS,M>=9swϩ%K7N5iD-JӦ{ Ų}"u7͛뗪pje 54!]Cz {}ټ@w]1~1Đq]3ֵS'5Pvh~YT5/oذ t*v:9j^;$9 sz@8;nYƝ ˻o+4ɒ-dWBC4Eci&գGj:'zu]:٣>uV6 )Cuo!N@5>:Շ7~:{J>}>SU2i8M[e*F_7uc0NrUmWVDN6-/zȑyJ;N7ÇDIټyv`b&{VɲݶF ٔkx~Y;c(,[hub㏯r ڧP6mW^ESLQ]tQפy$\cI|3xٙ|)ߡ~081őaH%!K"SjjЎ<2A>S]ڑGW=b^~NWMDӳgOeGWc#2s͖reٌkߟ(+DjojG"K<[t\CVk?t߭G !]vb nʌ-d(,y"̣MG}ſJ,rő%+4fE9aQD}.>BC!J_ĭ[-[h:K.KҼ 9..1$mL3YK=Tʕ(oIr͚5마B6iBF߾_HFtEtӥK5jGnOT-zpnJ4e믿:uꤗ`>q")`|+i+,y¯08/",3EJOHE|]$}%("KmVK/i?4/1-3O!$ =wB'GKBR R*6 c)5I$9\|eUy~&Y"Fvۧr^"}Gy%:1uS>t?|;P”}Ӟ*J<&,Oy=Cnڳ$va}{ ٳ~W;c~fظ6.}ey%LkHYY;dkЛ})[- Yh<̓˗Ѐ,M믿^OyjĈ:2r=9f>3M^xajdɳ=jܸ&4R4.t,eBԓ'Oεjd1h͞= 9{'>`^C%{СCdI^WR%Ko1dN~WNNZ-iث*@gq1 7qF}6gig ۶mbyVH) ny6Bd+|ߡ~pꫯѐ#h-͙3G/qr*4i hOz3ݲmC␥%cm,Wu{/HON#1#/ i6q&؏w4l2N>=yf…;4,{vɽO"ui;cҖ-7P' ʏ,WgC߱l|ƽ}z駫|ur{`ɸXK+`Du3}}HƍSM4ѧͩ7K|/Q杩AB7_|NU%$s)eK{GuB!,R<V%̼]5PGx(1j+Eסt]JUH噚314$&Z$\Æ ՞={#mI4;vXN ~L&Yf:sgIӿ\j( KS|1m7߬Ӈϐ_&%?'I(|J?;Vth"1[x"0xw9tF;ve1F%%K[YIO4$#R2:C-iƳaFtݾzcDaŴ,!N;-U?K pP/"78 ,iZ Y&_VL1uPYf,[ Yf#)#Z0P#d!t?%L2D.{F$,Q'rd@D$G,Uime!Ko뗷gIdҫ r%=\E^[nEݻz饗rJMi:+),y''SjrYj!ڀ#믿^>wޭF:u3,p z"eξF`F҇zX)˽^x{ȑ=Kn],eJ4>\9J"KBiXo߾~&N.M,{B4iR w9o<}mԩE(!!m۶hN76>F._zJd-Flio>z/˷rV~m0"ca8&K{^23׍?|rYYrzb,dANt4V\ϐ'G1^neyrOԧz9ַbr;߳p c)XD&&˚))07{[nv>Ǎ4iOVi: ՗3,{;,my}uҠȒu{?Ƈk܋is<ћP De s@ adԉ%sP0P8,ݰGoz8|o]gg >yy~g̘|mf1r-R_~"]n;$zKK׍oؿbdɒ\rƍAj,w+C8=A{> IFo6$zm/T_1vL^2`>MYHPᲀ"LgCrS6Ԯ܏',:~ڴi|M_:G}j:rŊFv:Ëoc1AoQ}' &]\s;$>{Os7ژ9sv | WH'NtLۡǒ);tu>SGI5!&Gb,s'L,igI8w'KAnZ.t~֩0V?|. I<Pr9lRN/PI4/W\I}p[Cc@*+Z.ND n /+R˝wީS<$kNܹdd a lL9$~rd YܮnCmTD뤅zGi/,߯.5V^"9QbܒҐO1T]D8M)c_$0IuqǤTSL/<_>m:}lh"Kƣ$0@4B3 +WE,,) iٳG rf9K>СCIAMh=(rXo[0>&5NF<`6IW uȐ!:qyV3m݇|q ly$S>I_7MnBAbxY{I-HlDEO!/΍$pr6mL̘e*uszoy;$>زctxΧP}3nBcjYIOL?_Y2#@]q gpf{/ !L%v!ңȱbV0kv>a(XB4{Oπrx@vdz.>"KeB\ C߰j,ӧ=PI7}qǥŲu]6C ^ GcG;vE©XʹsHY 2lHG!;Ʊd/K}izˊ)׶WW%KvSۑ%2|rdK?dc?j/_8am۶kN'qUW}Kgs= `,|A{쿘{D++' gszz2#Sd XsOÂQ]Y~5˰^{dK럋s`}оi;_}1%KHOHG!=T_r,E}iz a*ɶ2#\=gJؗfdBeҤI9|qꫯ67,9l/[L*_CD;oT,BqƩ&Mh|'$z)<03|… u4iNòO9R}B}peeXݺu{E%|JGYmʙܣ%V'C_[>r`}6;$㹐i+Ȁ3JhG m$P\s [.PB=t4O?t#1 _i:b3\L}n{!L%v}Ǎ j&7jik/(^KWQ@ / ```````1 _V2 k}ڷ1$gG(4`0`0~4[^srY3=g6O     :1_fA:K2]jqo69#3t7:r;74T<@gomMMgKGYYڱ]vl&yҭ{wӯLW#_~6樃AcvL7!Y.KZ/o ߐ@MoM55!B,H9j|}t01{eXׯG;ư<ԓɴw{%}7s>Hn*nj!Mt2T~uA!7z{cY|6Tsο2 ޔ?CR%! 4H΀ɧfBo5A`sc`ٲb_‹ eQ7TTT45a$9‹$!!H(*,oQuXh33ܬژ/OUVm+@ $(+>> &"X]^-R_.2C|O'Tp48C7qDszIm YZy2Pvhh>r $,<r?O8ёC;U[oʻ~Gj>R 4nܨf[cBEԛ$?83&.]H6_'>Dt6H:˻+.g..~A5IpLFoB )0,6XA.%YaO\r r}%$h˃a#F-!O?`O3#)Iz#y<[Sធ]$|O/p`ycJߧ8ev7})k?Nh!1{'0+K/>(080cnٽs:^6 k˖ⅿeW]#\2i؟Te[ o,7V9̳ҋZhfɋo -^{v?oK+hv*yyRYY&|.!YY=<;cSc듽CPT[']~81X >\( Xԅr 瞑Pck ngZ\&Iίȡ}$81D{@/55^RVX#e%R _c/Ʊ[THPB˧ d5mwb`cմYeeqđBFIHn4}oZAzYg-BmG Yd:?W^S΄H5b!0mx{ a-r^OIv*oJ"xeHnS>)GPi)rM7̄PtXU CMEr ۥOb^a E"%RS">6 HQo[RZٞS)Tȯ[Ke")]+`C$nxŅA"! (W vDC{@5pYz SO<tb5zsv~aOD1V_@]P=ґu\qEJ-D&v{qݑv˻ᆱ~┣G{:udCþyw}c޷^Q$00P>t TŁ|XiSYY!zlݺU!xy?os|a;Lr 2eٳGC`vv:ӧpIRFЃ[Ͽ}$,0@kcPX NP}acl}H>H TG9 %5{޽{'C7n!z ^aAlRϔ{g%12}t,:ZR?W6Ȗ-$""R $ rvĝw;> )[#+ Vvum%rs&,Rbwa'yiRZ }c|cAZ )*Ĭ sƄHAYL\\,1\Y.a$>A6UڭeD2|526=4@I,QR}J١& a2 RH gǒeKHnnu7H% 0cxkxd?v[ }튐pߐ]ÍRVU#%`bu5! 5_iԶTP#?|;Boen(->ۏ(adKz>ˋ/}mѦ梏OSW-V-^Юg_'w듻p@H tAҭvc3s7oհ!ГwWI3u&L|xTc'BB4R!;XY^VVV*F؁vNλB{2!ޓ)wٹ=Y'r9ֿWf[ͳdeugKl+&=#\ P~HVo.MJaa12Ԭ !2?lE{ kqP6nc c{h7yH6 a!B|N6|\l}z)3dڡݠ^6䂲sb i7He[C&~\ip V]vJN=_oE20 {ǟ|Jr !I!Р7|WaG7|c, ,P({oOۺy'[FzKy4nTL m&οm0a8rTdn 3 {'pS^Gi4ɤKmiNO>X |0ر1HK>LmXwx* N>po+$lؙWa֥">mT7n@_).|.iYI5^y(z>-[\ P>z%ވ-OQZJ/Q66<^7Hӏ#ojj駟FIЏwC yA{eGٌ< ƮAw0 UR:;%cϙ3GM~A84Cxu?.L:(5͛'|%^hx]p5?jjYrE9p|咚Y-ϖiX>I:[Ze"y\/#WH >PxV\~,ٞ#A|P)@8=e_MfMK| XodB**n~Pw@=A-K۞Ơ%f n’2l6+-h9ipcH{\_vM#^ޣ½4^?bGSͽФSE5p=̑eK=h0i'7yy{:6r ꩊQB2JNseOh%e)ߞpf ;:[w0tQ=V`>P[%հrVaw ThTʀ` /G}yrW_?F|9dW'͜9Sg@B9sW3>!#4aذa/9J}JĿ O;{`: ?֬'a%0oe!B2Zn|6]$HȠ$ g1WМ7@(ശJJSB"XZ";RR兿$`/1l#LN{N( B<3NW IyܵDŐBXa8e#wuu4~gMAs7 .za4H(CayQe5Tvpx]ZG:.9uʝ؀Re9`BNeW1WGsPDG'2G#|0d4_Y2}y=}*2kdxӧZwء]CwˑGW`}Yy4#J$8zpPČVjUB ̜iP(z}rYfۯ*;mLsJ?re倉$٨TԥMSx nBāK4ZN',Ec x&YGMyF~0bxJIK@ [%kС7T}0D(/BK"!/1{)RBlڍ2b|59 a: 4%Cu^:k-ʰC۩[*O7x_ ,$&^|pp8;Uln\c{O[`6O55 Ξ-aڡ\*!080 ;C1` ?NYj#N0adMC=lq #G+FWa4Vx\өy޻Y&?P1oH^ 7j@zIIO("+(I'#Ԟ @5 l t]t=M'^·)K!(Ƅ)ktʕDZs뎶JO \u2,AALA>&N[|['.wans[;Cs]'JW'%b|#;C,m7Z37\KAIoiYw \}%4 BJ}: 2u\pb18@a= 2cT~ݒ%h)G]NXuoMZԃp!d. 19<0iun5Vyfa98m)vsZT:5ՎOŵ 1 g<[2 "qzA$+mbm(l  (g~O .\-TN6M.y vzԣgOY] ,]2+-o3 k~]vLⅿʉ3vQ4sF~44Anݓz+BQS8n8IVkT&a.4~W%hTJ7̬z|ӟ0p>=iR dP)zA^H1jkh~ jjdSmŚ}K)͛U~:QG98d*n` զd+hgeH&Ծ"ONw^"m9i3]Cٰ>dOkpJmpZiP_]D5Pf)6*I^WV`wZͼ)Ot !~8DO=v)}cxZ3 3 9C1rLts50!dy2^.QoW]uU R-&咙 yMI$AQPdq0!S ቧF ,Ď[1 ͅ 8_d C03@{Q-((zQw;*-īHfO9YH+=I OLvV?.빮%^۷I{p(ϫw3!HT IDAT'#P2Lҳ"fmدFnb=> ^9<-P cHsU֭շuW Ǯqw24%@D_x{U9z8lYB>9NF,u*N 5_BXH<*c2A+b`Wӥs c.jm%=;UF[2͸S³;R6yvc@! xb}陫̞ڂHoSwHB@ݘSvq6a3 >E_ [6Yjqg p 4pgQPTgmr ;CrІ=N9#N Z"R윶l(/>`7zXNtyY\Wݙ oQ&o|#wXdPR\vrLY.J}@3>[@hXp)A +y0n<<11AY>+IhTYb1CD8jbGM6\)yijwJpcNY<ԓ17뱑FhL3080зw/yQ9tHz>\ }-r}iKaа}qC_2h9h2PpkMIو1Ĉ:nfd'-C5CDkMJyPLqG?wps~pB⋣$+h/8id/Ժ=Jv8zo .y!YRb_\{FRO͋kؤҝf(;n%W|W ]ؑhcȴ`GwGi|{TZIY൤մ;oi= &H ˅^(".Tm\'yMK>"LB7쨔f_MIA8{ق 'H^(]!}jdNR;oujmsS@2\D-Z2LlaJ?m 0uϽ)IOC<"gy69oNχC_5l*tGY_?yq vuAsRS5Q7!Z ܣ/X{0ف^S|6~u~[w; ݾ=~ dx98R5D}J=|cx@M^{]Mo.r*l: ;بhy ۸qUԷo?5S0Sv$[*m 3%:>A⋪B~8nN9m0;*JGn2瑑rU9CͱcdNv$f͒P?0F9 !RUJ80/σ?7V6m,}Qv-.]6ǞrojIsm;fe+g )? FHNrړ`g!O??53 mk=``@:F &.v I+*n3I&!x>UbؑfNKCu..]%vvYg`LKL"ie^m=H9_˞:ZX?:7=wv5֮גUk]}&kU~s`H!>dVM&L(hbSp&U;"Lȶt持K "GJv ^Yw2tN]2h/ۑ ђNxd|Q8.\>C" Z"yagO?Pfs-Ud{~ssa։ sZ)#n7shgr㷻XE=X~3➝08w{樮N&pv2HȶmD (O$kN&dP:\2 W pݧ&(s%PMZC:E|AA&,ǃZ\#@L]a!AQ!H=QKYS|L:}_]yDFvΧyע6rpsw}sF#}N(JH;څIS0{8f=N`N}\EXIcOYN6ot=d_3I1_}?Ǒ{\Nrs '/;%M:EGz|EP@4EY<܌qc M9Qq#@5탹F -+Lμ鱚g P={Oqmrw~^x-\G B&` 8Bu9cɁCzR7ӵ1M%ܔQmJ6V  :~[0Mt>tcSa׸@LTRcPcƲ!52`0`0`0`0`0bI/u`ߝtX߀ތ6\F}A_;lv{w@cʘ4Ίv7ce0`0`0`0`0`0`0A0 `!Tk0`0`0`0`0`0`0Y1`fL       :+W젪M+qߴ1]gfbga0`0`0`0`0`0`0`0e0;uҸ.3X3P1@3       Lx      < `] F޸@ǀv)``0`0`0`0`0`00`$]퍛      ty  `] v!       tm  `~f]F $;?W2r%#'[JJL!JHPI|tEFILD/t0-   4Ā qYRWuv*%pUu$gJFnNgy@|Tg eՒKaOwO^Igb$D@7cJJ*$-T2d[*++UݺCvkTd0`0`01T0e^8f tsľ^w{>QWdR S@@7H+=c$&4񞫪kJW U9j>鼣g ^&!a PKYewVl߹]o$)ce~    zWTfaq9=@M-t;' `^qjdd(O2pubLz[dr+$ ; P/Q#H.Po޴AvآrA%2yw6-   t~ Cvw* ~&* 9^gSreޒRZZ"!2q+1^ĆZ;؟?^tW%y@IYE իKIICQF%U@0Ѐvoa9J9&|"i8}K7}v}{ M;2dyJmOq&ФIR]Ez t> 9o"&"4DBPg{I``@'@zx =,=46uA7>ifՀn;3kY85X1tٳy Q^Y#[ .~Ę8dR SvaA#ee#`Ĝ$~͜!&@+=EzR-6z5Prtttt1v1nL;:v*Q#¸TVLJ8zؿ0@H|%8" LK^HY[€+=YGaVzHÎt3nR[G7:c%nab)(ȕD1b IG+U"uM8ˁSmC L-x),,P<=zBe?<}w!;=4 흶sf(f>^iܵY9|;Q|N`\9C ;%0,LllSa#ށ}` Ԍ```0;@kK[GAz~߸J1#FEȨPYZ,%yRVHK<`o_$A-qdP[v+wwlٯjK솠VZcb6d[ :[R^kOT}kI?ti>_we1DV4Ut\()tO$0,Vaxlo{nvOZ~ O!e螠RW^\ OďYhlwŀz*k;|罒BM8N8ۏk:% "6u9coqwo5 |WZY7lj5{6Nk@ +zXHzn|ݭns# ts&I& \xAw-$7SJHZ/g&;\ZS)F ݧsa{F5g;a '{U~+vOx|cdxJKiiTɲ$2Ղ(/GY鬨L4|NP`(ͺ:zlWEE`)@#C17|Ƹww(zlC|7'~rvCh t^ I#ĜHau6*RPS]-;JAubsyG2u O%1}w &}1w9yz7}k#!`h"]jqORa),$$XBCC%L; U` %3+KCHF)88Hbcb$*2/+Ij)FL8)BewF2EŒTm1`:ɔ2n$͡cاr083YpEv $]GG[i"Ɓs'//_m ^s2_6CJZNIAN*[Az3UXB#+[@79w:n4{o0@wcĞ > I[TʋrCJቜ8tY͵KŦ&19qNTTUĻB]$?J"c`q7?/:a9bHa7t$=fU6UʹQt`!5+CN?T|&s]joիd,S,' $Q"UH\-hS2_"|d`H-yJ+d4[Ϙu=pߦ~ͼU7ێ!ms@CЪ֚@5 =ѾТyֆ]$=mN<\;nўc,_}S-7SZw *7U k0G3 J?qO=5PBU?G_)IRj BhZ8rn1, 9T40}cy+__,Qj0u#SʐCϖ(!祲\}Qq]"lsx)#eD< 2TR /t48Q'ovȲ SCA_\C_]˸.:^RY2v LByttݞƮ}yuӻUCs FUz6Vk!2;j5r`l}PS|]0$X tǚ(@.9 *PD6\֩}B[. 1{_ḹUMɶflMuP _5Z~A%PU%\([CTUA0Q6 -Fе_aQ a߅B]cC5=hOF/344܏}Rw~E{H.NaU xHΉt kAО'f6Z-uRb 001,TaNٿO Μ&oZɰhP6tb*g㶈^HT>ߓzGwƒ#Seǃk=(*>myMX-%,j=7=~@+J0.smZuU*j &Ci0@8*t]43&)rtqC09(4m5Y=@6gf/Y˕7!2XvIRsl%Y4zjeܰ2nHY;Oa%?7'}my%"gD)C{F(ȱqʐ/EkgLp+cŷm7']baA6QGJa:c 5Áp =azVJN,7=*&]hHb,*BXISbpoW27??taQQ:&C ,P~~;̫wtR;24'#jg`9NEoqz>˺ĕmٿ0aRD]apa\ޢdQG& DZrO CD2 J-ˮKdz|dV]Z/Y}S.msSXYiSdzKʹoE7vlwp ܂bI=V,x"HrrsU8R 7 )NN"قYJrJH!TLgM%Q"x/0BU&N aS+gu Lh}Φp.YJf<:*R1t2V zB .z'%DI4_n{*UqGDDN*;qC5<XV~t=k'3&&,l>=T za; ת ! ^Q:Y qi,BE,G41D=^4`#QYumpc9TG}\QYú z˵Ctx4mIҷM^ه0MV!^ŃWY'u#zxAn+n\/JZճThANJ U.?>玝axH-fSOxD2s xf]mݹ992s7̓: p!Y 1ptn~k|E! ?9OP&"LDiۥ[B=`3]bd$рLJ=րePF/G:nz&ekn4q Sryd!.e2ozhۤDcd쾊y2m|*y?E'O+NӦ]9~ol_osӊ-_Hc>9wS͸Q!~(G%柿|ȟ@Gu.HLI/Z9P+qu္hzȻSю^-z#FhIH42eReLDd%Faw+!7?$i(e N)hGA( Zjޒ Rr_ZKr8ںz- لt$lw ` LOP ƎwsW?lj_|dn-)9>T կ +\ǕW$sW&&GP A2G,~kyTԜheehU+ M[R2չy2uTo.K]+>}P֯$J2ZmHͣk!En ڳ)__ZgR?ECLp~zF;uW1O?)W?I^3,z1520Z-c>6UcUȀZ}B-sBϑеJɀR $A'SH*<{7bj҂Jz W-YGF!īGrIA0S qf;so-\ICT {!J&J!}Cy&¦-G=E"6(|Se)ɄyQ{yo18xh/i3,`'H9E?ju荿_ _ 2O\}ƴuU9#״z~5hl?Hk^ϛ4bC9 g/RhWO C2dEy0S2~q0}ɕl٢1G*A&E!(0@JHYaU2981$MsnWnFs@s,zXV#=P#-uv{玞Kqmw `^ ̊h%v$2O®oh%Wr9/׎s"̖e;PmI'^eBKq7xR6JJ0i/?~2y E9!RZYh#dT*'= 4L V[.ziD;;=zƳ$6"T1}]G9`8'#mGUrC}<`Щ Pu^trY|yR'`J{%D`M#}zMO>m";PrS6pVzH85 ?I&@՗fCCe\0~0r'RA\ @WbCIKؖ,$ÔZ*o/·%\v,OAVlI{.4,*W^f>ڗ;N}%#MgY~[,$Eۑhn z'Fq}}sd %3WXw]($NJb੕rKeѽU" g#,K_8@8i\q=5k~%$t09qP'AV݊]aȢ )reDziO엵TUϫdXȳa:6\u#z˖TQHsi{ZiK^&EzFZ$2e TtCf:(j,םuS24GJ~X9+U^rGJϸz>pRyyoz3¦ >D HTmI)cvΑrqX~;}Ũi%O')_4"cY[] 0|MAS%=Z`_꯮\wrQarN"6@c Eբ/{IEJy!C0ATHlUesz)J'7`JuI50|0|\gj$ʏ*/:։[=C:zzy~ă…s7;T~|W%2zyK!n1{>npwY <Qw}߉# _/قH)Np|GvӞl%%XwO'Oq';x_Rk|Նݒl?k mcL˶@~~^qY8:P8\rE1 cU~Z S:۬\+@;f`8vKyr}Å`7w }hH—+d0C +c{mk9p]HCτ̟nO1]/G\z/t.^z2!lOԜDhK;XZ,@oys"lT``sHu5Y#hF:v2GcA+0)}} E #vEwO[a|uuwDiּEG%>T&T ȵ=Nۣ&zNlVMX/Ѩ=?9}iɫi#!n}3sWDG իnjzkjɎt8`|"D_Qo3OlJۮDpNHî|ybrّY/?{!i0F|3W4E.:fNP=0{ uTnn߀, BsؕVTCE:~rه˹xѶ!H˗$sr[N:LIJԽB)M#Nh2aQa 8cT6SM.ajk46j{C+#b1` Y jsw+@6ΔATL!?z|XGmq'ahu<i4L^M 4B/RVn%㸿vo"Ρ!2Q֔U}m) Px#$/eKS@dֱxyJm6ʼn_oe2de8ůJ}0W_j. HK"ǃj 7g-jt;\?c ~S|go!1ߣ{Ɣ!r Ξ3q?^60,L{Sa1ikӌXGm4: |{ !`@a>>pEl:&7$zZ]-\l$;^IR~aV|4Ȟ %)_/]`MH׿l` qN]ȓޜ+5_+IQ;޸tk޿"Z }]CI jLj6YLP! qO?||Z{۽U֖Ri.6 hGT]B7>U6nm1 hvفvơC pwGs2~ 2 ӏ#<֎27ȟwkR\͸|"3h{]Һ^)|XMf,C;Hsyiw8cRz?OBL8 Kd rd m nUng{l s|9I㎙9 RN8\^w5ZǣomXWu[y4R|.=c)c"IxY6cK[v-yJ'rRgOŰ /|o5ʖR-H E{Nύq\XN"N޶=w SʭrsߩM"MAtӹIO<9W;$=Ȕm9a+.gh&r`O}޴'W=k;b~s(QqsW6M~Zֺo)F{2 [u)/6΁S}#zG(uI6& _?9Há}4]5X^$wjݸ54;c\xbVl~6}v`ר8=9l0@u2^n-0b@5 OJ/~jW SHlC\~WJld&GcHH<`9aHyMiEZ;\ci =$k)|[aaI5d͝J2, tz!瓯l猹e^gfo`w0YzC 1Iv8Mp\Ibx $ |A)p5~FvT k`1;-ڳWO@ڃ7E=ɜ˱S=3O |MY!5YK":4N_(2sg]a;NlC1,b(,0frMʘ IDATĂ1׼jmF rJNHNP\ ~΋ ?dQ5}ٗeJlѝ~C(Ǿ0:2 $awS)؞]9#ևήy˱,Պ`lmtY^ t' O*E` e;%ž@,zl)o>$W7mK9&g$5@`ӧ 6`a-^Τfz+z Wc甏^48^G~֚bxssfVizÌ^vdی[6GK8oQ)ȃ 灗W<1<5L V:ɣnΗδf-Ku* `un*Jx6޶DݙU[5w^lO|^xHL!jXh7M¹GP!+eO 25@7گHp|`3co/[>лd*`5VL:˙Gq~#NxRI-`B%*"G,jBPY1MIȔQ-Nǘ%~;=x_ 88}{r{ 㴓-38;x¶.l;8).7_U$8o#0Nէݲܿ" }=o'>ٜ#DuĂ9R@aA=cOvTR&Aۓ/A5 l;|>7cuހ.~ڂL˛^uA]7lPk -]Kaӗ.Tx6Ɖ3k^ѥ+3O+ ΚΕWۊ/ m3,~3yWm2߷]a;X:B,Ppe/pxobݪ ^mΝ0 qL;>uQ`>~?sJܡ a />[aپ,lA|f:1`"B<3bm8W_Sf؞v[)pc_ٕ7SM#v-"h\qs؏3&u$[!V؏3X⾿WT3~:G-LE bj7v[>>&r0&6e]\/3/~p&cق8{K6,m]=y\;['pWOX/x%ls8\u)[/>kYx]O č۽}A>P0GJ\)"%}3Q?~;?D߸^u{Ry{X?}Wg_)Mͳ-n ?;vkng)h"W\pDHgV6ڂjmkꗞ~Wmvkݓw7nx!]I {l?kuͥ`pVnox { 7;x]?8$&[b=>.^Xד+/@m*,$2RCj[ 6uea%q~eju{񸔌Jxe̮uD_M3< gf=2^bk{udv08?qЖ?m@RF9o1M0(̛??l޸!Nmb7? EyI |O~-\k mk׫Qp~^{ګXqOZrB|ǹ!%n/K K"Pa6gWҬ%]{94{‡?qSl ?/k}vӐVip?; w._>k M~2KTj!VA䬅m-"K~x 8,?tM{H ?/Xl3b`i۶%dmNH޶?tEA bxmAfcQ+j$h{w?|kgi[ɈhՎ!' Wۃmm ܵ<:76{W1!,.0ɓat7w# m3ӶwS+~oVۉ[ɪϴo gxs|fY| g,n= ;vl-e$3hړlϬ]W lwo^~"e^gaR+?kQhڳPcJ{>slR8t`O^~}?SÃUvr{ sxVl w?*\fP/^UX㔸w[p59RPyҽ\ Z(ַ1?pЇog[A% ܦs ̣֖+,;7#ٮn,|i=4t9q$Ǎ|bŽv?{m7>m~ۣKT?!\mgO@|%f6zf1T0e[ s|8,CpؗTxo?U5tדg7[~Z+/o ~ytmWJh3W͏㇏s|Q=MCxPk~Nf\fX/1Զy>d7~K05Goo</,,q|vî׿ҳm;'ox{"ST?lG vu-G9.|I[I^ߛ0mƾٓq?[yI,R[@eK?k7ܷT<7,T ?~SkvCET޶{_[x_=m/*Io_뛿ߺ4; yvgaN` |;y\O1`,f/o?}15)vY-X\E{i P}Pཱི(qﳷd3Ϊ]d7qw}q: U 'Tc;cZT>mc F1EK__ߗEZaEcm7Vܛb\r{ȳD8.wgn{4^F ]8-\*n==nz<}v;ϘŬ6x:^ET-Nv\# w^}㴶y<og _qmK1y܎'C 3o-D0Շ Ƃ$?tKm? >Ǝ砛H7ۿRsd=y3[Tw܆xEޒ?bL/}nyt7bhZ0)S @Ǟn. }ǿxLj,Xx|JԲu",xWvt-9'0GlKR,LC>+?g$ xUq*'Rǃ+7 O[ \\^ҵHqZ/m`,#9npG"wznGKw?n˭WtqѠd~m~{o-lvB/gK7۫;wk$>v?Cߑ[K3" O_4;@7ڽ?:O{r46c%vFu֬:طӿ6޲5Ͼ9SoQtLA bao_Yl۽,szX|a`Ͽ:0Lw/?ӾN_D'8;7{Z u2!j<5v};O-<4g$H7'pN5/0xV)?3׆/|a)ذ͘9+O.et292ntFQ ;?[*;zڟ`Ķ2ٙ{ĥT3{1m-l鑗4}l{՛7^{m _vpYjK[lseCiܸ?eى'F-6M;<`[9\w[yjXF_Ydssss18h}S ?g[/ׇ[|{^6 jfǪ9sGx]wm4T9dhM:nayO6 ȮvK߸#x{~YJԌGk Ya߸eq0 ̍st!, mMקٽ,K}?uݫi9x,s6~K":R^{n{`997H7ǿwdMg OG ޙMdse&K9v29M)9klG9+̵&o4 3f W^uU䢋l۶,'CfqxK/_F97G{8Sۮ[̘vO{xiKN \0e {.6zsm/4\}k¼sl m>e2zXinO.^vArR_< `=^<ގ{mq}+#Dzj"x<\jgI=douhp fO pݤm;g}6Y6lߺ-Sx:xg=m8Wc{| r䏛}?'_ R|9s|՛N[zN܈IvyOU=]WeRF?wa={흦J^t~$c@@s,c*qQ;npʤ ?ۭ|K9mvXzi]2ͶBXhBb!oSSmp6=٥棻m.{ؠ\z~Jvko2xCx6NJ)((830t<Ŏwy<0p<:p< CG6ƾ +y͈7~G ҽ65uk9nďo]wkf{E- @jVr9>{́RJJJ Sxl9ul-SFioمywmwpeW[f\8.k|q8/ Bp| 860 yמ}SsN O>]m׺WM?ږ>֭).튫K8^ܽ5T~쏠DX2P2P20:(X2}G)' 6 [nڹ3N,7r:juaˎ{~gN~W% fYe˗cC,1  t<.ã򡌂x66DnMNm]-ӷVz<| amz8gI؋ L୻67z%gb)Ob[2P2p2ԒdoՕ;-!}}}m!A)ʗo^s+i=QW~N%gzR}zr0J^ʥeS?F]5`:K16ʦ9~ɍk(?)^ʧmW)^glʕj+bܔjxӶګ^z36JO1OnJWi[U|W=rʧ'7+^W>ūMRmSR|V{+U{Ʀ\)FMW>mO=cST[T{+^ʧxÞ)W|Q~rSOjzSaؔ QҎ2/%t`'<1duQʧю2/u>űX(O|(sxK^*mQWSیʧю2/u>űX(O|(sxK^*mQWSیʧю2/u>űX(O|(sxK^*mQWSیʧю2/u>űX(O|(sxK^*mQWSیʧю2/u> )>Տ4vSe r͟WzW^ϵ_՟~՟+^jxիUk+5ի?SH?m7Q{W^W{ū>V~kWʧWn_ǣʯxիUW}TO#ͯ mgсBXXd^ 봥L zرꌅ2eX:e u-eۨv:cL3pN:B~}]iK63ʔ=c)^c,՞){ozرꌅ2eX:e u-eۨv:cL3pN:B~}]iK63ʔ=c)^c,՞){ozرꌅ2eX:e u-eۨv8_OӁWu$ ?xrzYGS<)|^}6Egxգ ue^5Nūm`X^ƓkW=?וS{'8zaQ+{ONq*^hâ_WO5^TE՟k<9Ʃxգ c]٫?xrz#DhSm|T}OszuیxrA4'%9"SQM#>Vה\𓪳OPCm3g>*9=xIc,4'%8Su?}CkRg,!$JS~rQ# >GeN4>zcUME ?:ԟ <Ĩm6cIkO.Jpc쐩Ӄ}>,OS~rQ3Ugޗ_rzMP^s4^kO^9񷟁ڹ|WW>sN\Ӧ-$Χ^pi/5sz+?@|(&uiw,mr8i 9>/G9Rvm_n\>Xtmϧn]3Rz\P>ߜ>\}pKM<톯qxbiM<-o>w4Jq)ӄxpF ڬCƫToNJOWk[U|cx=ǣ4~ի^7Gc}<OWk[U|cx=ǣ4~ի^7Gc}<=PB:Q,y7xCd'eq9nJyafeO2xQ6?1A:Sx x3.229g1X28^%xY_>n:8)sqQ!:k;})r8(*F(տS|Uܩ9Rzë㠤TNUq?H_zb$Rk;Wŝ#W99J8J_wj|C^8(*F(տS|Uܩ9Rzë㠤TNUq?H_zb$Rk;Wŝ#W99J8J_wj|C^8(*F(տS|Uܩ9Rzë㠤/cC :T{<>b)UױN|ޖuv'I,e uS:^rB:zGtG,:)5>XxOfl)Kzu^ǣKNXgTh3NT=^:ƧOS=ڌ->b)UױNxx ̗mƖiGX8bciW>GtG,:){/9cRڣR:#Rh{G tsW٫^՟UP*>Ǘӫ?mUMU{P6^i;gzWWB_NW7WBٔOS{휽^)^j< s|9v^j4^? eS>O՟sW{|<H :P(Հ8JuzR*Jxñ:^*_Tk{٧OTʧ\[5s>WʧzW>jcuS>7+>V{O՟)^OkoÇ|'cL٫=,ծƧT>>(SjmϯKn릭?ÇO}26ʔhk<[ik|OS2e6VnS=|'cL٫=,ծƧT>>(SjmϯKn릭?ÇO}26ʔhk<[ik|OS2e߶h;E10ttq3xJW'eS|~ MO>ŇqS}4ū8ٯLϟC%=oO됩ӫƣ_orܔjTs|9~էWU8nJo:xW')2=RSU6x\+S9՞1yx}u]c>Wڃ}UE;-ʧv)~Q^jnU+W(ڥ=Fsxի=WU|C_ݢ|jUF_UQ}u]c>Wڃ}UE;-ʧv)~Q^jnU+W(ڥ=Fsxի=WU|C_ݢ|jUF_UQ}JPJsHg9<#PW%N36ĢEW{=cWlO2ObCC_?Ҷ~OXM9',ξ* _urQ$u-}'ګbSm|gl9<|[2͗|%eĪoA}'<1duUI"0C2'kQ~;^C؉mF*ANOR/աȉ~!QtwoW~~4?ի?G|O )YLc'W3զʧʏveڬCëޙƪ_7+?c}dL%iB=ui|9/g^)SjKPוqQ^۩G/mB ._WnRN߄?e>zi3Jprsܔv*&){KPוTS7O٫^ڌ\7굝 ^}f,u)UTMS꣗6c+7MzmoŸW %|]9nJk;hn0gkH9RLW|NW՟s휿+>zm?99~W|N)^Vϵsrj^S국Tk^9Ƨxk[>szO׶S}W{Um\;/ǯ5>ū^Ov__k|W՟s휿+>? I6u("Hm{l(s|9=x*@RǞ )E9Rg,b{e//Α:75g9d7(s|9}/`87 CXc1SvCuzu:ꗶg>OJK\SֱWE?y~Pz]^ǟb-YR:<u/m:e7|<^Xc~i~)T?:e{K[N 'ץuy.)ث_ڢunm굝ʯ_N|V{k;7_9^vn<ʗ+?mgҪ(/J778(/!(9NLHburRI6U#W=y)u<)~xW=m SEuіh9|ǔRʯz2Ե(U6 WW_yŶΗ:󉶜@u9|ܔ^G^rz2oКT~r˔mrSzyɉ6_>!kUj%;D:mֻŗS)5rB HGU[zRʗ tCVN:WW}}ey|GX*tj?_>/:EjﱬS(ک?ū^GTiUNmr՟UG_ )`~u&1C&꣑GVUS8VNTTʧ\[5s>WʧzW>jcuS>7+>V{O՟)^OkCI,%VZu* C ckjodžګ^+)_j4>x|+)_j4>x|+)_j4>x|+)_j4>x|+>tJzUG_Uia:HPW^jONvSxuUT?l7ӮJWړSO*XPW^jONvSxuUT?l7ӮJWړSO*XPW^jONvSXDi_JrD(Rا|j1бTOd5OQ|O8bc~)jHb=p@:$JS=R#'?E>S{uHz$G$O"}ʧ(MKIHV㟜EO#:!Q闒?9)/)G tC4/%9"YrS)_S> )aJDQ^bP5W{rѿ飮d,u_Jk;_~/o߇IϵYPjϝRNׄ__> 5;)M;JrzsSz]RR=[;qߦ%9=ץ/!/ڣ}emQc|qQz]RR= IDAT[;qߦ%9=ץ/!/ڣ}ep8P>9|N9in>'镯N|v?7e.>Bs|í)s>OUn=MOxt|jp9n\|ţS{[qSS}.ګ>7z2s^9sܔTGǧ ŧ\<:>W}o7e.>s|sCbC:|T?:eS{mPz]^ǟb@:|T?:eS{'OT*?)S|cG|jӓJ})>쉣T>S%վ ~~XrQ*䩒j_cg?e},9{(OszTI±_2Ň>=qʧ9=yWدOCKΞ8JS'OT*?)S|c׷zj2qTM^z*4ik9Xr)>x4smmƟOh'ƣkh5\|ϵG{<5?g\[GS|=ůh9{/?x?sO߿ r^Wp+hǧ5>Gj7W~S{ū~OSƣz+U?ʧm?OQM_s^n~ӶԿƧ^sʯ9jx7i[v|_xT@ЁBPE_UQ|\9ء468OS>'c#G"q?5_8wmRs:rz=e~3.H4O (l1GI&U2󉹤,mO4_: dЮJ 0Gbb鋒e?%)x釒~(9i"9.JئwxmS:PflI}Nxۦx u79[(a>KߝMC nr*NQ&U};m/Tl6cMB>ʧ1:x (УuJy)O9= :x (УuJy)O9= :x (УuJy)O9= :x (УuJy)O9= :x (УuJy)O9= :x (УuJy)O9= :x (УuJy)O9= :x (УuJy)O9= :x (7(з0I$xM{k<ʧzWj_S^^ǣmW}}xGTѶګ>ԾWƣ|h[Ukj+^Q>x5(uKؚJ ~~TQz_ʗOUܔU8kLO|)^Y%MYc~TQz_ʗOUܔU8kLO|)^Y%MYc~TQz_ʗOUܔU8kLO|)^Y%MYc~TQz_ʗOUQCC܀rzynCxp6SxAҖP/ƨ|9=8<2UaӉ?~hKu܊TQ|j_?g߫>W}.ξW}\|9}x\R׉@q":OdszpVqCX(}깢(^jjxW=0J|ʎ)Aj|#_±RUvORc1MU8_cuijxW=pzSGLS{+}Uc׫؟G>b+^U?*+%p^e? 5>^ʯzA_UX)*;Q񱏘W~ J Wٱ?:H}4W~KC 9{n`Mr1{oʗ~,ԇ)_w3fo3Mrޏp7snm)_tSn|9|N͘p7sz?nߔ/n|9]:W)u7m\US_ T|CMO^}voO~f<@CJG9_FϤ|5yRnCOG_R_74|}~~E+>>@srzԕ)>2!jG&(#b^s|9ڽjrz˵{^ʗk׫Ɨ/W{/Ǘ+_+__/W\W^5_N|v|k|9:z ߗS[mj7b2@N~p6(Aq&2Ѡ.W^7Ǘë^굝W}S9]=#{_W>mϿ|c:7Rmb!QtW9^U\QGzڢ/U<JO{H^9rW?Wꇛ_G;>iOW>mюOk|>ojjWp+hǧ5>Gjë=\(^BBIur@ I (:%bI}$yŏO"KJJJJJJF3X菿< ) 1gA}(*}>_E~")`Q;/pOZ#\=lٹ7ݟ/JJJJJJJF!'sgL4+hV8c0o0~u<#˭rzPrE~_G>   @ =J az@@@@@@)u.=0iℸD&L}B:uUFSBu) gЇ6vnsU!5sF7wN9sz:e%puuKJJJJJJF+X8p0v6oK]%aڔIq>: ?hsVC}hK=:UZ,+tIU0HH~\ܰ+[EOX.>)L:EJddddddd`LfOx~՚næ߼^wv8ux6/z7& 7:a_'X.%GV wI:er8;]@@@@@@O{ɬ|%3/c!~Pnb5!#^g9=8ZQd?@K?H|fcoY%WLb%%%%%%dp" kmp 'ٰ{7&BaipmupWiI6zt "0_GyvKpYgJxh ?%%%%%%%h:{⩰uێ0oά_fL, w_Ou&q4)$T_c ocU\M˾ge߲ӏKJJJJJ `m5:8on[ ȵSz8k9߀o{'PR;I0 90Hzyg#噧jfCѕ {k~,}jQ!&MOahd0ں}{u3 BRhNZ,׻{ nk⥔ 35h>º%ԹuL`өgI:c0su яvD9fv!{X#̟5upK\OA:5$+J`y*(AB*aK'䡄 +튺3ʽ1埒"\X3v'Mu>ŢM* :%@;U$\3,YzOd{^+(((((x!fkg6쌷0k' 5됩9..Sj?H`[wplXJ@@@@@@};FZ&,؇.]S$xgW'~ܻu#t+dddddddxB\r5K6Qv} ďQL (U_%%%%%%%sFR֙Qe=v?\A:*i{  11HخCOXX4.((((((xAgk&{]{z\}80Y 9Z*PrK_(c!|~e %%%%Gxb eԹ1kJdSxyi`}D<NkG1 +{q%nd #ɝ_Ko9-3Ə~^#c.((((83 >!qfSCT[Pl JOu@H6Gxv6eʔ0}ڴ0iZ ?Zi|'NGпgO|*{ a)90y2s50[e![gL@@@XK8v>.tEt 진ю @:NBcJ=Nm#UOlEl71s̉ ƍ[m 6mjP<8r0Bw_c 3'OIqdddddе 8_5tKeFH|u+uw`0gڄ00>' }Mgp08kĻwlyر3lڼ9͜4qbB~9Vlo@@@@@.\/y }c|=ap\ B@!@:Cʢѩ#5mR_彃>{v}?ޅ̴~5J[N6)^m?[_u^k. />wWxmq4/GJWOu]{`r ƃ¯?lݺg9s}6 R2P2P2P2P2p43c&$~p\(){?X{,9\j+m2)#r@=ڛD%=k)#m[7[Omm'R*ԇrO+G8mlcg2/8uaį- _g5fJ)((((8Hx\XX-|L"@_Ua гNI0ƃ%㢧pٿ@|`d=,eb'L ~)vD{xA/mTwްoqC7LǤIaL<+xXe`caE_?|cĢ^s'_ч/!6~Õ# >D!s }mL%<8cz=c*& w }0ǃ-`AR)(((( 8+\c/`KJߗm\61*u}Kmĉ}l۶a-6eG|\Xaq1m0k0kL[pL\ rm-H"n{=pՌ3ln\D Tmmqv(. N33b S)^c04-LlxBV|Xΰ̙mcۤa{wؾ}Gض}{og #[$cfϞfL#/;,`7l\`~G98,(((( pMՉk'JؠN[֩pm1!10`YcOpKN,k--vofOԬSyfN|n}xnf[ N }?on\b.iۍ7g{cLJӗ, 5ŅN[ b[fErۿovS\v-N9i-Ƈ[Ў;C 8\rqœ7mg93O>!lܲbd]p,T=b%G3|l9¢n疞4/,^0'lݹ;ݸ5lԊgAaE[ƼFlz0`a,= 6u5k{ :K 78ˋ6op_vKÂ9틍=cυĿBqs<7a]'<NX@n߾-W_~~8Ĺm#+ׄ;Ý<.%];8xa-W7₰hb IDATxsmgʝ v[|bI6/SsfL .6ޱkOx&nm.2?[+.:눠[9|{×|$K] ӧΘW_.:k {탪"KJJJJ\PD4`(S!e:%:32/ӂ\evw~K9Y=Mç[|`冀˰83x9kpiGGx[MO3ݯ|ə7u'Z~dNO;3=*Gc%4JJJJJ*2c%Jc-:%(XD}?S<@Az $uʤ%F\nݵ{WϿư`>,]0#^ {m1r9^wyᝯ8nQC?#Cv̗vI[ؽs7o|pw2Fx-_=x^9- ބض۴mwޓk5[~(.C 09lї p:MڋgwX}c eᒳb]wG7oBXpnxCܱ{oFXj0'̰'0>A:?>|Χ{<$k. KO=h熻F߯'e693qֲU wx/%x5T[NN wY.,lmc TE=Ъyް~[k{̙=fag=l v޿ܱ<|{Ukֆkօ;hmKNh hl>~ӽu[go[ކ\hgzy#pfKW{(dkXg[cc7٢?3ahk#k;䥔 L*UU360 ׫o0=}R=f,w= ڙicvS፯8pβᙍ"%c_ٖ/(hB?#a,.mw ,ƻzp'̊gȇάiٶg H>r'oXq+ .熷_=lٞv[¾yx{ںc9\uz7뱶#hS:Lqi G"Ymj7ԋÆx3Ȇ-;ژaf6e/m?\6![H,^vg̴ 8w9#aT&Qv%Smۗ| cdK~P[־29j>7~_lg|?ﱧ㯿l4B>KJJJJRpڈz.^pPN=m @*(=ZrR9ל=vGl_cO3!>}Ñ{;87Ԫ:lΔ뱜39jA[v"x &~æ̪onXf{KYf6;,򢳗'쌿 &x} x`AM}%%%%%c9\A'wd*n>.DiJ~rٽ=4;k^rI;>D1:rŅmY{Zacvys 3o_03$~zbSb{p~^l^oq{I3Sa7%do_kok{~ٹSS;qRWd@@@@XZvv=>ѝΡD]AM_>~o/c|K@NΛծJX X" 6mM2` q c؄oL4$B<3;y:sTywjoIon[{}VSs[D' {G3aEObEm?/8puxE/Kv"{&;=/l>l:/?ذiܸ?x_-dxfGpB'eH)/ c4 # 0y)"'?*y"tv7~RC.x|߾û*>_n{~`qGZ{>sC8!DR8}' 7 R%[>~}+Lwbro8Vmיҳt3P&WNΉ`D;~׵?ς@dr"5y`'~rъI>B[mM#8#p2 n&V,9'Hhm^䠕ܟd|^/#?Eyin퇭Y8h}ݝv'?6i#,1y]AyGƜ?Z;0{3Cәyi2:pGXn[%GK*g'j$xB}mx%5hY##8#Md7_8_|=NܯX!K(Y#8#8URqʧnj4*t<pGp+i$Mi9*M"I)Rye26<8#8#0@gRڼ0$'R$xRKP):#8#ܽ a#ߒ#NV9-9#8#Qq,bHǕ&u`5KJ-N<8#8#@)TZ5',\qItGpGX^PFI$8HWlDuGpG8%//\ hE QpGpGiqzrh9b 4檞VS<8#8#*fZSPdM 69#8#p*" }78 ,vH6h=GpGpV++ŃNhj8#8#P|OsGpGXjz5.MǗnpGpG`Ը$mo16GpGX)G$ppv8#8$qRs(eu<8#8#,*+EpGpG F`ņtvxpGpSm+EHRGpGpX1Zy_Q#8#p +O(^#8#8ˏ{v#P(RpGX!u^#8#8+kʊ{qDÕDvGE`MnS;#8q=J;<:#8#p! 'I|xGpGG )xGpGB@øɲ.Q$m9#8#P$Sx#85qT7F6jGpGp#ДPMx\pGpG`hҍGpGp*GexV]SʢF%]pGpG4+2q<ƒ@UNㆈiwqpG`%9E8 GpG89X? jzӼvJkjt+u{GpGpNFĽ$ه8Jjz[1X+YKGpGpe%K8#8# 8|ʚ0.cwGpGh FUǫըV8/b;#8#p#PŸ(-k&.&L!,eo4_z.GpGp)y" Re%8Ӕ.4]t#8#81^̫90.qGpGpG@^98jM8۫ R xpGpG`g2W!hq\8|ʊE iJJ UԧLkPZZ5[8#8#q3Ij%Tٕ)1cȞ*e2Od\qJ!J!:#,6׀$|GpGp)A,iQ| V7"=8#8#:1i,Ɯ,C2N8, Vkl}USH?6\tܿ֕KX"zc!=;^lR.DٵwV {N۴!,L|lho7*>;|{@@3eWݵҤ4!ं%W98^MG`e=|+[-ڶt{퟿R8m}2 4O*ۡw˷?71}S yo}_\S A م]Vu AH}/}qá{w]'٣_S-z፯/io}?Ц5CCF̄qů~ݾSaX- {;T:<8j[^wK2?{k0O}:< $ +X2O46XN^l@\^cK|GX>ߵgo2&Hž߳gؿ|ii\ec{[`=!offb?@o[z齌ߧ?wcȡ`>G=8ɈeI!'2-l"48MI2/Ǻiq5D2MG` s{^ k벇84 .Dx Cnz\ܞ_,?*۔䏞m/x_1)8LߴqC-@[8!jI;w)ü$?v翘T=Fe/, }z>9!IGd?xSœT6I=}:q<5?쫮 [P_$Y#&W sdPtH${s'!0|!R[pAˍ7j`Ԃ)/6)~s_ P٪WB-8^=i:Jc~xςNE ָtU,i#|JlV鳪/d>[orcJZ?}K yǘ=N]MJ(sAΫCOO7@w %6eN O$pja횡@5F$Ɓ}s[Al \z17=0M4*JkZ)t=XHô3RdZ@TP4JK6̋e?#2#g5o0f;m~ՖJ?ϭR^g/ @ b3 ëg{T|%uOʂHÁ+U ՇRu;zxRFL4yB.ӧl~8q_d]p/L_R(}THN_x?8i ;p53T'lzΑR#p2 $eWkIL+BA?J}QIj9@|rŧu<\۳8]$/g6l5d?O7Ħ*1㾂|E{#z؞մV6\!7ֳ߰<"hEC 7f;͹utZ'lE{^ʗơ.֫ l_oV8Ua=j@@܉>d~i'LVQ5&O{Gh}dFZ?\_}'2i)tvvbu)W⾂l'D\g~W[SŖU&qUӨC_z[K:NO7SgZFƘm7.b_R%\QcxR YSl'SE|#eWCkQ')M6?/IT%.tr @޽{m׮]br2r7 o {og? J?1~?Px7S82\ z++_:~W)!O~A?|]E,rϖ@?t'w$V3Ke8l%$-WTsGJ^?aq~+^ w ΧǓ+9y\-'ڳF6|1adh^x=þ*{Cˏ{NsH iy#ǟbN~$4O}N#Y!Ƹh)ӮX'K7Nc܃#p"[-'c tZF3" Pn޷ Ug= #qd\2Kn7|t}^\#1J?WIx7+Wd8N_eT>W֭wX pv"~7L.eeyw.x<cQr4 "gm?Þ̫+Nƃ#p2#j^~#}ǩ=rU!$+j~# tGpUo1שVa 3~ε}یÓHgξ g>JdH>/h响{ OUE{>kN:;/ƆqΡ߳`=C/\%Fcň'{_n6fܣoמ}8>&Wے=[ƛnW]XM]:n*MGz1 {⨊d{و?7HC 7Hqg2 =?v `ǛAU {@c㖱304я}vö mҏo-۫='ur>ﲗ,F&thrq\v%6q֒I[dznX/zɲq+=mNN3~nRGԍqY;+@LL$<_@]Wv,%+LlR&X6Η-uF.FC; fqMY'=ծVʤzI}}l(/.8MzIوҫ/I]YI;*&XVӫk6_ fl${G`*Vg%Ǔeh :YI܀BuDL{GYT^tU亦Sa`l?e/Yovu"vdC[~l=وVJi^u-m+}m8DNYb-%/}Q?/=I$C'TQ@R l!I~4昶 ^X bEb.|t5[4[.A5 bݤP9^2Nf+Q4٨^Zzi]*/=Si)Sڤ^5jk_^lmz; w2o4~NϋS9IU 3 C8tNW$y\/ )_yB>'RbPiK6[*m\~6b~nXnbTmwb=?4'Fɠ ԯM2d Ke{pZEtXTԍEE=}VbwMa49U|#8 %ltxZ|zJc>Cb1٢㥪7Xy.Vb4@n/>`eGp3q"NOJ,ʘWxkPFdSq1RIQσ#*96^"d&Bن{r#8'~(JN->5Ph@0=iPy$ÍqgHsK@EM9#8KRw-zJc/S_TAIe#y U^e%N@+ GZucB7Vw$N`  68#z)58:d###611`࠭_޶lb۶m5k֬ΈQ]lti~XVi*_s)W3̗QJ<,C`@b{1> Ū8#&1UƓȆu͛7Ν;sm\U $43c1)L<(ŨhSJ)餐:VSZs "Eșa+O8#rݻ׮zmK.۷dg5oY9"T bcҕJK&# b]0.b _ڽ#8r#/~(U@~K_ . A/gϒdXVij{ҞtxE/UAT%㱾V{Z: 8c=8@sViYjx`mr#8ˇ}=zt+%<1֋e+sIޘ3qVtv┼I5LSq1iґ,i_Gp8 Ca3GpV $疄$u-WϒjZMɋe!6xZd)),iґKGUr( a?Нx!t!1GpV~AC¬s$9ZJJC6ԧ@Y8@ZdIوJs% 7^NpGG=.W\q]}-/`]sșU1byғLӏG JJA%/ I).|@ff{:b`6X>9#,-\/ܸڵkCսu/uoR'۔*&+QLdD2!'Ӓu# s1 p,mC͠麎#.@ .x#ٲ'ubK+!xRXRmbY")ӂa4F$A2iA8- wgg ub.`&qypG8y&ύ{Ѓ~ޞ'u Kċ(./8.]q130^-0bUh2Wk;" ` A?~ {׬]wGXyxGjA?JfPH#3ŒťǥC^Ƹu٪< XJiH!0NKՠ4{lˆKG|wFXA_;JA|4:a5=pAg:-٪~Xx65m8~,&txZ|zJc>C2Q?ʿ2KKer.VX@ =8#۷V_nf9.ivaH+mوDf=ϒ90s4ƙ'2P8ؠ򔦊IzI}wߵ)۱x;dըCpՁ@3?_..H$7Ed[vܩE (-My^ Wcx2 iWxܠ2Mރ#Tz@@𿎀#|h$6 <4҉fWR?`17SI}WVH)i@^d9'K(=8"PU<$}y5U作#8KDˆ p0t[ O ۲1k,lʐ8m0~|>&ڵxqp O4[G[~y:ܐG"+uGF'H9̻gϞf4\Ua.DR>bNFà߽z ƓF"+ ҍqZPK=d9I]uUC۶o~эǹǓO'{3_e6@:g e1W o#8B9t'{JoqߩB*`ZJ2.ۏ˯8Iÿ&3L9X`k= P+yj\.w3K cE,E"xL6 :|`ďW?.(E@γGX[%،Gؖ 1oRZ{;ι43]iOQ2P?%CqfS!INN ĤZP ZNG,_( 6'N6vlXkVmv|jDb1z =Xe}yXwyS#8wltWqؗ+%lD+mi5 {cń/+?)iZ6c, PtU^JYqC"]|1%`i3khg1u3'|.\@r*{ὦ0${W͛ qGymtzs- wh&ҖF kIwIҎ(b0x=}W,Ij2MSg$ΨjԍS׻3_aG'Fl`le(ǭ^u66e6NXf67yj\rW?8k=U쮜N,CRu-ovp,*bli\dxTpUАvi ??yjm ͛7r2NaGIue08OqX5^l0qg0pl˕Y/llxX]#^€!޽;ʹ-*a^5:#nrV԰l Kģ${2 0@ijl{ x3Cuyn?,C mkmO =Y F%˔r42$}鰌N2.tOΜ"V4j'jdxَ#mQlycs\[ʎrZߒoe^Z(ŷ(@.ePd=qyِc>T 7Ig9UYXc,b!C[7<9/rWk5DG"EJ ]t/ FFɋ -|b3xVyx-pBۃ#8I@oo=q|+ y[=~u-gW/IQ'4jdP U))m&O+IJa巡?Ř Dk\8 iq\"h6U xjjʦpFW_uce8ls'0W1HQN39cnK@s9zX[q:!\[")zUKGp 1{ck_l@a_ʰҿ IqF+~ǩY2ƤU"I$ÄPn׈G}09pE.4)ˇqHdK@,VeXsʡ}9W r+ {!܈yv݉mx2#ׯ63iri$Nx F,XX "$Ո%3 *~:Ksc"-f_V"t9zp=f|X!3h/f\gu:#q'=`zx7y>)Gj'şbVG3FકnXK[ׁ9tp?z2a,:.ds!V"~vrrX~ho?^Y9NJiN<^Y̯ġsj}'pGF| *ua 2pA_H[fͪ8$E~ 8$4+.ҕāz <2+*G)]g$RtGsqgeޜ0!x0 Uyn83ǺI 0؂lshKkKUg  < 1I̋è< % yxJ=g eNJj s' C?`A=Gp>.3/5aciW,g i4͠Ғg^,OXPZ?$ \<19a]kzЏtYެ1m±M bȓجorS4u`u q\3ky8eƾ{,.bpns @j4:97q*{1sQÿ9x9x9Jέ\7OsG8xd>7Ny(c ȘRKJU,_{Vc,[<66 FXDyz<H`SpàvCC\8$\I$0tb*VcΥ[ pW|6@)Ϥem@1xl #8+@̭ʿksolbdi 3T,)%MLHϗ\ؘ8oËg d9a6`9a$\i~9xl-_ Me36c;@վ<~ ~ĀDСCދY,@̹p=nx+؆ %i $ {DiV2 oJS1m@˘2ñN m`ZGpV"ji[,7M2ò̓ ƛVAISȉuU>,x>vβMYlsi.[um=/ ^f'Xx z$VӟXem<,!p8zBWf'f1<< =W]uU,m۷?a۾}{q' PWD13 ji4hB7<=hϨ?gs} {wyx}lw^pGT@@)7[ -f&M?27*_̴V=`CiGlG@DP&X <M шAP2ieI Z50dgewOݘl,F948O9]TT:j`*-6'9o<}Stvc.$9+ȓ)|JH<8#[Ơ5jJ7J#n&I)uҡYf"U'xFyx`S4O\'$VۦGY5֏S@y\ `Ad\8 N> p$d|]#6xV?Vr2'4aa܀p8f͆u6fӖÉ$&YX ?˺>I ӖKgsᰜb$^IOm><`u64xq_+ V9*`Ċəձz tG8oӔ.=Q26?K dzjdV3Qa, =9 ~*;hǃͶT{&AJ`xJA 00!b#m6#C a 6xJysn1a¤נ^z訪E{IHIE$:EC“/)/hzfv-~LO>x:f0$~xrܾ :َmy݁T0r6W$[R;wZA]=\8p1_8#4xeV:o[m`/qZM-u9)xf&lle^OL*"O_/%ۚ;s@BR:m22&ǭZXLqQ̵o`F)D+ϴ8Pd>IyR0HRKFe389bdžY!*ə7z;#vCm_| 6=c{B}\1>0ԅb1 {MOsp!8#ZHrVSTXKy4KOWiYxsv`p#_۱GJsԺ8 Dyzڷ7նm ^i01"9 d~2x6yx*|qFh/:HWd V+$W»)OkYe <\y|ļ5j(/x:X7|_4~l<>j#ڷ~ +A]s%4nqwxfo!84wGp{Kԥ4ɸ P?TW UңwUN[% ~cF`7d°$V3n36!SxCeybu! ^#B zc卟wM#f-Þa@lKv艣FxHX/=w9xKB͒TBI5-c0 x3LN2,[~z\MbIbGl;z: +]xH'2S6jeX6kJUL{U\Gp Pu-nǦ-+`۹aqr$c V?۱cn]ԧbe+ ㈶vH:1XA10 IDAT, `3@m`@ 0TKvFFFǫÝx0 ţmm@'.~?5HZ560`އvtEeHL7hmqp0W1O%y!+x:o_z@v#ۡ<<'WIc`h/^x,A3 cwġ0#8#T$9T$_c~;I=LE؀$*$$/Nv4?O`s'qJ 7hgj-:aԩ сC"0bP.fa;Ǣi Kw`8Gödh 0҆9fRrYNjKl7IX*'2 f_ e0)p"D0/G6>bpqqVoC@j?zM&Bqivӡl7kHs`%u^S {al`gVgN_Z\,dA$qX εGLuڗ9ex9n[t'0f0 dĭAǾniCx8q; Y>ꑜ*R_B>rЛ!u ɓXBb?x {xl_X+LodPT%KpGh[w0hN2|+22'@f4qXqIO2ji9j6 *Xl2|Ap݅gX ^aqVخ`СCgxw bmfuemiDU@>8lHw 3y6^rEeA)M|`h9ˡJέkiԨM)x 0cGmcv5W`lKaD-7D-mhq'%̺ c/s  0rhfd nAg1n;\wO\0ߋU˘8l}8#,J qѺĭ$yʘxd=,*'=mt6`^ ,:3vW;v{Lz Aam4"]ch-53PzACm+ҿh+~X9zE,)$0 #Xcr  0ǐixа$CHK$i <kw4T`։KHO%aeo>Y{'t =>0߼!J +x:uqgz&1LdgDG U݄P@BGpG`o_bV/^-}Q2Pb*L+^q8N{4R]*;zmT r\bF{wd#VbHJNŹ^P0#O/Vsˡtx!ru:{%)l+¥w "1M.n56jvx0YHlA 8ɢss 3#v|h2X \qx‘bhƶ}ϲ F.<>`M a^{{pGXJđbNw)ɷhKiKX40qGk8 lLǟa/TaO>$z.[nlW$ȣwM`|=J6IJ$\,`zrO;`D@hUK s\؜;y =<\qmêd+| ϻC&G|'|ldHѮ" v1>= ۸5cin%Ëϊ!G=<%]8# 1"godC{IWi i b}ï67CcsN=6 !M:E+¶/Sgkɡ?q1u@xl΅=8Y&[iĊǡJ b2t`g`86D}vwۍ÷H~kl$&[l/kدʧL[.cc pExE!#;Q~" O[huEyQǽY?ԍB/+>6Aj|/Hgqu50N#8#G'QjmKWf^Xze8'UpHrЧͬ؄qI3cW?魒=J_g7+xGb[yrauHfH"H,xϠs$&aE,${쵱a*Lބv'7 < ?)@zx/C#:utpa)DRD̢p  +9wo0Hz S'VxӮyH%۾2"p(q)!wϛ׃0]0n &x767Q<6k{s> 2gSti?XovslbOF{lzϴ}ך(b3~ċt pQ1 '(|u5̭r`|"Жve]βkm#8*A ɡI\Jz-骋5WR)ӮQNx8 "f/ LH ^2Hy@i "E˒R:,#bAg$g!كP2z (\!s **޸((x zqCf۱ <u0^Y,ȡQ O1hAd3 8۵D5FTb,݅{&q25=:@`@*%#8 s$wbs$x_/:q>NJ$U3@v7=G=a= ~cfs0ϮYHMHxP ysyf[p+}\)10mǼk~ ̂;ق!?$v:5a: sV7q.qr ;-B; =XBgaH>FR}&>L ih aD+9ae:ӈX;ۯ 3{!晨,\XPIR8 pVP=8tTYls@{P~+ʗq% ("ss5ИKQ#xpGpV$R6laW!"Ie.\Ĉ 9@B#wH# 9\_/+]/ƙ- K;qzpGp#q)J^ '9T|>'CV%q#0YXU+t%[C%ny' ҏ8{H>?{([Vy^4Mj& Hd"! ʌ`MPE|c"&4 мNu~[U~_wծs*ݺݵ]k=@,D@L̈́R@a~Dϋ=="8HŠdʴ)fkʅu?~ة 慴CIL8l cGnO*~Y4c.?c_?ov:A>\w 5;,a.֠ɔbOx{kG@ Z s gBz-ڽo'{M9*(~M Jz '|6_ENԆ1e+lE24?p?!F}]kͷG8$~!*iNEpÚrѱ֫Rb'9X1Qta}b/kl[Ne="[ @ 6q*I"|s1ȱMQRƃ&T@ڢ;ş9V ±H{Nu% +tHًe{yS@2??d(xp*~]1ą&~7(S˞eQ5b+~oc8ه @ Ϸ^͗cwozJ x%U}dCY2U"SsQk)oI#zkdȄH̤~`"92yH+}FtvIeֈ,vt93?/avπ ;;jY|;~|-m|Awۆ@ |IİC(SDg@M@à22 _sH}9Cͨ-%R lmrL!34JXY79~|NWՎ00+ˢxM?!|ce/;ڰ$I*da~ vGnro!yKUQ bFJ75J @ Axn5*_N[8(e9AtXږ(qJ3D8䍄x`㉃?o| ExL+Sj|jCcIʶa߾ ?ƪ]>9t$1څ-u_i.I(F~~td},<5@ V%_m8NmSijGb֚ʡw!璾] .;#IRy IDATrȀ$1a'27Pt3M|![ihRjdNe1ዸ9/k^" >&x54c^l__>ba-w ?ELx;K j|SurLPSv*:F7sQ5j@ 덀?/'J{/x_cmȪ l<0CXJ2Gh? %*+ ڬ9Cto}QU ́ ȧRMu^Uũx[6JH*ѮXlF~dž1E]Ɯkni.KڍqFR~@ l<Cy.*1Mu@$J0[vN~*'sɰ+cH8kE#ABr,!iMݢ"._/2t_(ꟌS&NS5ұg^*Jy_hdІzC|GoǬK83e<|\3֕ sh҇ȟ{=UGǵ=U@ @`k$ŋ$s,ےX6Ⱥφ0la򃬪!tbѦ~Ti^f8S$G?釰h<͇01>Ss jS\:1"?_fl_eаNUd[Ӧ w<2]q)n? {8dCv^٫?d @ ~xn%IҏQ!?7N!Uti2v)_TƨN`X,buN:)yu"U~ ʘPMRJVGY -ZϠih<P.)+NM:Ϡ黀2—¯KF @ 65$Ujvv*L(G}>cjb9ՁI2IN[Yy{+x 6UdX6 s3j<})糦\|eU~iQ_ռN '۫/륖Je'J|3v-3?Q :eE @ q.Ifwm^m s9;ˑ0~2toncN!)~^.U?FR@bL+"" ڸOuK]ťrNa؏W>YŒ_M5~`~>O6'8Q@  D9:ER8.F/jsNB]ƒSP=c͡6 'yߎ=JdE"[֕cVqH?_>/ǔm[i>pžί)Þ6jʨ3pO!9͘%@ ,ŗ|c8l$է1؍*8 qNu?F^Df$RkwlDDV 2Ho1OWRuRE,idݼd56d @ ϩ & 󻁗e,GށX@m@ @ Fs-'I,ģ$p>4Fm"#IKʩI& ]~0@ @  XU C/.%]cJU-?L #JV HW&_@ @ L§1gHiP{BGc#;(cr_j@ @ ]vY^8d-}۞78#.ې@ @ lwRׅKRlT>pJj"(I}vvW{8f9@ Lq)$Id:H`\=ޡJUM@dY+Dc @ ?ڼ.nݐ^¸]r.)l=&a&>hk]k@|@ 0OҼ1_&~UwR2gEheQߨƗ}q@ vD@D uaۼqc]z]6W-d @ @=\^ͪ.NtM^7F+-p4%ͤ3vd2J @ ' PU8M.Ym$i+/4-]{$,aO:7Q@ @ 8QCy%$9:$?9䯇jɸ&K?}d-]sxK@ @ xua|Pt<& 3$胖}@ @ x幕K{߆^sPN${RW:eT|SV90 @ @`!9Qe1 :e=U>5Vu3;r?fg\Sg_C@ @ p"!9G]u?@QW8a/*_m"w$oo#Ec @ l)P^[>/8s MZu H\(?0j&ddoZ-쐿d A,@ @`#9']p^2dQ&6^C?_5F}]I Q@ @DBs&Fϯ^7L3ⲫM\5H}ڗ>/\ggf쬅7gjsڭF @ @`;!IׅW^W)QWڵyJW;rZ @ O.<d^56e}x]!@ @ xQq@?u|^u,}V#;@ @ 6'#y}-]ջTۨAd/%Q 1{80 @ &E'9GIVTƍb ?yjմ)0J_ef?ب%@ q1[e1\2m"nH{A쳅-.:0fvs`xl+56r$o`4@ @ h^ oIbAcG3eAPT.FH@ @A[$u2`-KXM37o\ˏ |@ :" b&Y5'^m,' ks;~v̰ *e>?xCzb|̙@[@j@`bv GS2w+rb0Kܜ7%5M;+Wޒɠ>Qi׮9 B.wcܷe{,g>˝m̐FկO_W{wڕ~I^]3(@`Ux7L5{}UppNdlWsąjJKG,1'G3lzpCI߼89QNܮ_.HoN?J;y?~mGdʫ=;N=ed"h$Wm9Ky O F\) rpj:3y=[]x.Ć|a}+ jzҿsw?c׻B -S3CmjI#Vt[Ҁ6ʄ,ܗk=ٽcIߟ7/G<{+5ܳnӼi~{FR7%{޽ ~~O6RaS ;Z__N?MFsH>Y?{ߥ?}˛XޥOdz;ؓ7^a_7MٴcW|,_ܟ◻SBzǓ(ɟewoNU}@` I"zU":jh 6 enS^IBQ@~}/xq{/iXitug ;Wxo|_c!72wO|r\cl^7wƯSO鿇_jǯ~oz+%t+"_G;V. 2=7a΃} ͖\ 8X J*dbκ.n{(Pk\]vӬF$@ϥQWL&N) ^SEǬ9{T|VlCDY?82%0q 6bz}ULNOx׏Jog>V3ADA$W??hz>=Ĉa޳nT _JߥE.joP|FkOm#|Y&:Ӟ_ӱ+fSACK_t-dy1?!vMٕoL] xIv-?IOVGg'H6P<;BKu +^ƞBxvcxYŽh۬3~jbWRk-z!@`1~͕L{v28D C5FSӾL?{>^U62}'ކ]V$E {h{\u7fywd_JO;e˧Oڗ|W!> ^=Y:6vY:p=ys_gД.ׅfȗϺ@8x7Lyåx/' @ P~HV٨ :Nˀ8s dvV Q-=Vsfy&Xkt9gMp7c3 ٙg/,\Ǘ<%/Mo9oo{v%GUނ_KG;\{fw-!_:_uvo˶G2r*ſ8K-Iӗ?I˾8y IDATn? k3Kל o~#b'|i/60ИzK!@sM;sN_lߺi5@&)lXMцoq,˹glzɓ ǪjGr]!n*{|20o}W{uȝ{#SN>O/3}" $@`] ຬ2&\"Ṇa .9/~y~ ٸe/@Y;vjkreϷWZ(loYȊUeBKQy{/X~~yw\!daCj[XƑG'vdS/}aΞ_˯dz AIvZ.WnI/`@ZdCty@7Ey&Ar;)NäFcܛ"b nxg=v C ˛;miX|ZsOy!Mx5bGIͳ}/޿OO}|s@ p!.wM-5b#H@`L,wҢեV pFPߪh2$?쾮;gI!<;o'&s;}E~-~'_ԭ}?g<=n;o7ᅈ@~o_gWfVnoGy@ L7/K,Ԑir0KNM߫M 'E<לa/M'jW^I}y<,{Z(փ]W.k>K}ܓGvCӹCvQo׷9ﱻEHNf{XNq=,㩾}ROœCMCpm~ͫ}ᙄ$ްXXBA_1W h}wiΕ9Ώ`ɊeUW'.S28#4gil#}ztnˍOt@WYl[4'{/S^q5:/Wȝ9dU}\e/2W "~"u+ ?yo"˧a|C#}Ƿ߷7@xTП?ODR?\)%^doU5x`?A{?OA=9@ 8\@T/lMPc#`7 8gm'pclG?$,/}s/Y{`r#<E>xC 1j='=j]C?/ӕ=w_WݪV}~Wz+fçГo3?e3_,׽'vb{wzcc=@HO?_鐿dK8FB6Ͱ4|q~]j~[zw<88fw$^VtG="#=S떇7'w W鄁lwtr%?{-KGnfvYw)/3U4*g?5/.//w}Fk`^_ͤ3W_}5jٴ{80S*<2uwgGmfZXcWut#M gMgidpxB в{J|ᦴ|t9-=߭ܝL ͼXW:W_k_qK< ǰv)yHyX>$z;j1-<ȗsbm͏[}x?7 |\ʼ{$ʅ[^'GRovyی+I[`[ڕ6e?cJGMyK=wƏ@ y1,y~Q7'(.jp97<`+"w[d?ja/NPQgT܌*>NwŲqЯq1:_rG|NkV,U~x㺘=>NO؆T$~4V:;nDuMfФsL:&hп=l_tNeM}d+rE}7-J 06|/T߫=l]L+iY5@ lFyj~j$D Z=/12CVy{@ l $Yn8*I:߆$[2@O-)FЁ@ SD`lt W ?$:JCۘ{WhS @ ༥ĆqeJb |r@ -$!{}%EW8$֑V.YUifQQRj[J}Ǟ+@ lL\sMҁҡC[۷/vi鬳J{n:7$2XPMEx}Lm^.`;'La5뫟(6ڵk9ƬoVLʑ^]65(&8fOƂ@ 8a}$m dLs0#}VLʉ^MJ2&li"}U&J A˾\~qK̹Y`^5>?F DJxE?:d"Z8c| =F]g<o`.ܨDYemZ1+'r3Q_6 G 9bߥV- Á @ 6uq{\/rJ'˜̽E2GEdqHGq0j0uUF25 z^vQ &Dݣfvܙ'e򧥰1yę@iK>׫li~ LSϋdjfv̦ٝaӞHNհ7X@ !ϣЇ>4gU&İe~mسPko$vٖ߬Ngzܻ_Y C0?Mo?~Tn6uPcvϙ>{$1cuJ6rTo:GO;[@%,ٻD(G@69,`_sI Tݾ^VNO|"gH2y{ƺnu}w Tб'K2^Yd?@h W~ XD '\s+Ї> &q7L N%!^/F>> # k}[,ȴ ?)O6-F!0NO1r@z.b5H.C/ҡdQ墋.ԥAHM4UP|N5(&jS_%&D@'><@ 8p` <( $ \M,/b@9  8&^NqهҎ6BϥivK{J 0*5j]Jcߝ\Tᨾ.@`M8t~r9WM#H,[hx/9Kc?2s%t]C+BR n@  %}eޫ֋.t:V0ex]ݱh^: .;A77r5ڳ3E5E*qp/]@ lYx8V<_z]y}}&82Hʁ&_UnMS[vҦF F6`|Ɔ/@ ,,,jZ=x;idXYm,{q] 9 ?&@My]J9/Y-Xyd[mh;_@ @`߾}O p!7pyVPfP%ƨj^k&aDmud]o @j\GW  pꩧNUB߻iLm?+RV@}H˶ʡd$}_2hCA7oi\x0Ǟy]|:JʦGBTب kk e"`_;ŧu?ʈ<}Sq?.;1luզc/%ۥ׳ Dr.v/y;t-N33',:g̶:zI9lzkiqI(2؈%(@_O|k)@ tO~򓫾$%_vn BL< IkIf7jahQ $mVΜd$jצekZ GO; cvA =`W{[q}s  s9'=)OI_~yҗT Asٯgxu1ϰP·90{)H-K'A~&1,69lx$n1|w|QE@ @>r׻5Wv^s58p >l]$6tݻ7vi GO^9ŷٰOҽ d'U:m_i_ KJ)5Ah_JE9U+i=GGDZG\w[mq`Eۊh @ p)zEmH9H| [y|>ߪ"'J'9u39G` ^`b 4Oix @ 3 y]Bf2?+r0߆.'HWUFѸgu4ڽ4`!\\\@>267La@ 05++ª=aFӱ/1T¯J叽>٘K<l_^i_ 7@K}|c@ 뀀W_ _mHJ}c`D$z҇ UʃJҎM#Xru뺺SWk~3ss `ͣv>m8\c#k.s}=@ @`/BVU&׫ҹ ;OoQFtJcejȼuo' 0lo šW ]lh#@ mZuK6^1Dz]y 2zU(24h y*om`S-=7.=gcɋj$9oɥ}h;]TB4@ ! &ï8ϒmĴ;rҦP غ?NTN9?fY6s30u C^H6\?E*Lˡq@ 5D7?yN}ɿԆT<@m8PpIGz3"[גlƱgl8E;io{gm'p&B`醣$sдp=i^Խu+#-.svXfvr[' @ ϙ.wd3L"08>_vJ{]ɳjϫa J{g7~ F]nL 4#Saۄe3vWg6K|얀dbsSXqYRVee2@  ģē]DOr=ce`^Vc+ue{~p-tץ0Ո_+64TD%uĖtѴ]r92iw~#rF-? q݂q"9g,H0ؼXjK=;گÕ73k=ѝn#gG'@ Mx0BXƪ/:FQ9@H>%.Y#)!ϓ.y=yL uإێu-1VLKIK< Uew`lu@M"<1:B6Zʠ8@`[! @.6 IDAT$]y]$~6x儥2E}tkZX5< v cMgϐ;1)%yc{&x=~)n]g!5mz:i>}-kYөK{.UF{̎yS6Y~8 @ $&OjǗxXU?}=Fr.YsZ$%i)U螬I} %O"lhqLmrdkVݳ/NK*##wǰ^q0OuTě;;y$@ XQ"ItU}\ U))K~8gKR&#ݨ/.>Oߕ4kضmAzM7ravdf[mi6ynf {cLo[knE,@ Ϗ 4چZ{.s$OAz {ySm))VN(8a+7yu[Hcd i5f$k:_xh=|k*@ @`#36xǣ/-'}=e,Y5@m޹}j6蕥n¨4R1{u9#@od\_GӬ풝k[^JVZd9gvYeЖRbjZF iTy!3Ldžܙټ4cpEw4@ kAKdbxoa6)4Ҁ>iN0D҉{8{BWW1`Ok'DXsM 9feRb? -%1tF<7βF#i!µ%K$mbx7-CF인:j?uY.4y$̲ efhKș.`lr-6A9۾ݵ%@ o_Uq0H{ޙleñA]=M5>ҭN?nQc0@c]qyAV(OvwvۗZoO4ۂK+,|)gřuK9g?i˟:C@ x$ ORc4^mU+/gթrvI9C'u?VG8s_G,iɎ<7Y17в<2e+>|sif}GbYfBϵ $`[輑Mbrf5}Vw$r_c9,5{Xa @ 0 Ĺ$soP[9c|31pHM^P&BǮkjm}YYF͏v1"dc{h$l^Ӧ˱bw^8*?[sNq },{gY2{]5ZxD@ l&tϧdG~l|),]ҷy_[r%ܤ^;bU\=ztx1Wn1hxdJ,R)ubdf% gN-j 25K,[=˦sv'D>晁'_jV򏂬^:L,my}Z.,U&44쓍e' si;a-H;#RAfͿddKv Whc-RGeپэoMsnvY@ " B*6jq>ҞM 9CoWէ$WpyvbΔdk _%--b4n{v[4~VN- 49~3w㱴%ʹxxj;~-} vYooU\y|os.MÒh 5v,+?U2fqc-ٰZtsnH5ܚ=@ @`#9moIx{#VHVPd$\Bvdߖ=3KG+iM! H2,'LR.^{ a/&Λ?c9,tDds?lESo׾715ĎWU&kA)mXkīb: .AY @ 6( l-CR|e$)K~ mY%aySA^ 1S*{lkve]|]hS v0!tb2HdiJ1@udͻܞe=vŭu'lej^5 ͙>痩 rI8D{!gƒ;O[Ik8_/gY2ڼx=e1gNA]ˋ@ lDԐU8eu\v}%r&3$W;j|T357_uf ݒwbvgRuX=\hAvL `ڛcMT|VZYkLܓ]+?r*%jc#r;?Z&? ыv# !jDZ_$:P,?>NAԴp >vJԭ@ &@KMVş|6%͗*zՄIGz[\ 7tF1vv庽|A,c42N7M3h9|KjI3^:K׼3J$"F\G(# Yyjiv$Ʌv7RYbˮAn:c;p'&<$|7ɣ/.p2cK'YKOg rºxlLoEL;c΀v պ2A$.@i?=و19~y0_8_1}y{g0_8U p>#sF!~'.慕q @ +!}%2K۰)Ն+=PDN4lBCR:яilkY͗C$j'\,+i /mY^+uי'ٜ n{Ȕz3^q4w!6dXU B2j38}rGU?cAVU{MM2vM8kk-\:۲^7cڮW{d6M~qh7}s dDֽ ^6~.4`ig`k0NZltÑ9w2{FZdi.|4KsߙNu̽aC,q@ ISLQKy.oQ#5G$Qд9)幚 mȅ[F|N߸wbm-ddG9nXmG벑6iٴ;^]!*S=xC+v6m9}7'*Hܓg3K.Y7+emFWUU2讛;<A[;qa^eh0=Ƥ7B g_1k~.k%^bdNk[=2gY|$Jźk@ kZu|KԦ8/ԇ_Oʈu W3Aҿ@tٕq0; Ghϟ%_?FWYposərfifw\ZX&S_iv|2GFg S}\ =nǯsӿnivn.MiL9{[)2i}\s <`#.d*#eWob[=/oH1FZPKӌm9{woڱ`ұ+nwvsS.v[7eĽ~T:/_ɨ%#OuMF8gao⍋i/Lێt g`o;]SG({U?sW:vifA,igpKVX}/f-7hX15KMw4@ Qb|sN^mؖ~v6؎V2_RHI& JҞƫfy2VeڂsAyp̃6q ,ƅ|y1-ġ˼;cs;-;/bdr4.-zB&L![KZ'qwelm#v\X{ OB2-f#[#e#|dI5z :_fβF7l 9ocضD @ 6,IɎD/o~X?6`ߗo(]}aE6HUƨ]ț t4-38:4b|C܇vc7ˡ|YwR@F 9f]i-w߭u/˛@)ҡ|3w3e/ 3w5r /K¼F[vߠ2H .бd=j_l.7x|F67<)$erW^ve箱״NYL׽3qh$jHj~GFlsp%F~͊w2lHRew5yaF\V_ڛNHkhFLy/ٴ[x)V;6 +'e<{Xm@ Z!(KI2JWcXUP6 ;69dw-TAd:edRjgr :o$g ;4NF[v4gȸ2dGM̴1@~Y}9;i(ȮnA۵ *6L[7`t3T  X+ZHSRJFHO#9Ӵ,t؈ D2mXtupLv&^l17qnıLFp]<w -yǴ]*L,ʹYXH(4+q/x^` s2J @ 1ܪ9ER%U3ujc'Uz۬?&- [ȐeZKقE^F;eUǞq3fO1nc*Wyj-d*3]y1Kyv[P[NWm\bD/\_B&2RXGt {-IZb >Oإ{{-߰-{xӂeri=0_)%%GF}Fv7s>uC@ ϩ$|nA?:T)RC ;Ӥ}[6+tApIfJA2A._lTX)N#:#BGY&A~,)|d4y jFlSHm(Leiȼ.8]|xT 1Sz!!qR½nn2ò~F\ 2ixhƀڨB쬫/|;WMr9@ l^Ļ$ū$8ʾg08t8OJb_սNjs<6y4 DDd{ ;wBq L@ i! gޞJ{$*ҁd9$IuN !aE&0_cKT7Oi;XUgqW1w]\T׷V~@ @` P<8*{>But胨6rC@ @  zYVm ;Ђ>%`M$)gHJm5(@ @ lWđ$T'߆Mɿh~%rw^NO(F#Íb@ 'H^jKɗڄrJdt拶@ @ ZH,dsFcp7>edox۔q=\+do  ě$=MUԇxUw .9d+@ @ xngoBWU'[CucCe,)#ajl6,ԏ @ @ h# $>EFs.ً,xw3@zT}^G @ @ XAs)>VűeϞ &&H~!U>ȧz @  Cy0 ۲ia@ @ Nd<7*yKɷa}c8. }@9)9VrX RU>@ @ M/y~a Ȉc͗A O@ @ lG<oR[sՏ c7MPaK IDAT1RA!U} =@ @ϩתbI2> =@ @)aUN6`(ʖ*M ė*jvH+;QF C)%@ $'!g $~ށer*1^O@ vCO|6^ yn  h߁'jMM e2@ 튀'i^q+r|c7%` ā2tW /@ @ n X1}.`7r@D9:vV//q @ q$/Y8ǓKm3:UjX@ @ #+iV@јQp$cc`Fe>(ˑFʧtXRC@ @ -:=gm^*6a6#)OUp~M"g@ @ ]t̨Kq;Vs@ @`J9J$Ece[*Y I9ĮޡI2N:G @ @`# xRu8y˾c`A\WN_m,8XxySv @ {x: bw x\ q~BM x{_>OL @ lp& #%RPщ.R~X'9>@ N0^@ Qkʗd>$]Hy['s%XKD-K|KD8@`_b^M`6oA\͉Qc^'@Oc#@ GL6;;&U:$e+m%AAKR?uF״ ] b@ @!๕8oid(vXlF })q ^Dpy@ FAs+&ƉS{߇V'j29eB{]6Q$2@ 툀8$'!^6pH>}auG{ @ @/CIh46d =x@ 0ϵJ8ڼM~l|';љT IVU z@`=ܰԕ?a3+@ E`~;b:G=!m ґ!|+l@oh浘=|@ x%:}ҽcԮ<~0&MUjd>@1ڑ^ (@ @ zJ^o7= @-XsC?|ژ {uTg#ꒋ\^p`  ƸPLK'1-&1`Ah )@ !/$τP6$ӌ)ݒeY}?yyܻm۴ksgΜ9yۣsg@#ZC4C9(x@ B@AHfyEc @VhHN5 e߶s2^ @ 4C@K[$姪NmH|a#"*|iA#{ٳB#@]<9;I]vKoĩT/>H yF#$k.dsh fH`-o=c @ 0| kǟxlw(8#3t9u\P@ @ `G@n @ @'gP^."H^X,FN 9u>Ӧz f1{sB}ןntw亵k!N>]XU|>66F*_##'.=v 뤌c6Ye2DK${$Y]}vڛ.^ܟCהr r8O>c| 8Ϥ/]6W_zu:_N<#7A]>.tQGYyϯOu?O> =oyCC{?/]^?y{:1`h'ΤXz^z巿0\,t@ x%$I*>U>GuX}8AKʩCrPr8{O sNƝA{+xZۛ>O;53KH5鎻716w9J]أLOҹ/yyڵ{bwݮyif;w+oݿ%ucI}TZ]7;Ot`^}1GXqMi3Ɓ@ 0%ιl:gҟLUNgh[3 󋓰OO_^үn7󽅾?O '֦^S{[3a1B*\ӝF޿5Vg׾*Y۲1~z O>W;*7=>1o^֭]S ?7z{z0lҗl{o_9ɾ:@ X^:^z"; U/zI (#.!F`Vs,B,/ϻgϕ>[:>Ox/g<4c+vJٯ?_f$;vʫ'5 ׮JˏQb\.~٫u=}F'}-ا-?32yH刺w׭뫖}?'ٺ}{z_|( 6wRyC$wU}^6^ЉV>@}f~z HţN?-vy]8g#Xf:7Ѕq|z!o/7ۿ̷=wGmn}H~;3˜>oyϟ-m >Az]W`I.;II| Xae;Jν_dv@csI>6>@o.v&nò>zKcӧ/y-tO6mݶnϋzM˺5kcuz:,;r6lù]V@ X;ɡq$]K*GU; s[9rOAoz 0G[4cϲrVۼ, e#/W&u?J,YSY~zzͯSyD[W߰i 7R?[]gOJQL~pp( d G?Y'ơ#6Y[?Q7S!@`#rI.̟|eG/ OTIʸ^W{@ /fU>: ׶tڶi{‚K_P{Rg^}_P/jfL",);v֫ou)G~T_yF$@ s}Kri\u^6s-N`_t1-@`.cp,Rh!JYˠF^& pM92f`tǦ;p+o=9/W1Ʀ_ܛbv7}ua|bv*Jn!TٶO@!2Xu}}VucǹW콤-7r ;IUԩ^VBf =\{ܶs[꟱r[߮}H/'=ԎF6,ը];h|l}j٢&? s!e[2*h[  9U)<# _0w1 =?]H+rPt}%T^տ XƒeRPu.@`> 0k|W>?JN'J_J_4QpU\ʄ&/f)OQ%rʪj\<]Rgl=_@?0~uckG=oWwv& ")|)(z=ŽbkӦI3Y?IO+ݻBQ:W0߰7mce2K^tݍ7כ8& fR)@ X;̗}ϾαS]{jWDN%e:#Ӯ?;@`.wbwP OؼruG+Vm)eU٨ Һ[lOiTnTX\rŊF}Rms,ͫ7n?Ǻxm؞Eg(5Cm~^iV<.QZ|f-8|gPg]܋6}N`;HV9()v,@` -?{O!~ӟqWn^wܒ<掵.+;]Q=DM~_&T:e_w]sFt@ x"<덮x]=6-@u "uPBodc|暽Pnx2ezCȸQ^t,X'|-csN_(te%xMz ǥO<>ߊs|e7uD8Կחl(;7nʫ@,Ҥ<O_`}a5﷾t,m&}7؞z'?{YyܫVtӭ5J ڊПZ<_zdG>h{> GXI4Y&ԿYvc_ẘzby׼%  >ɪ [I_}7nhr2::Бvcn[,[VNq-xNf98-}遡t;SoעG\eφz?:sż[n#r۝:xB5R _ PsouޟNۙ,`a+,֭YȮ=O=zK6!ۭ߭3:K:racN}tZbyvwmY[u[cYZ#WU\S>n| ?tm*czmGg?M@L೼xqu0i]-ピ#K/2~fZ e|p~u@N):>eSFuUjS~\辍sS:/P߲e[իO]y]BB@ % OwxB۹zr*Wes0R]e f_3~:ryUTT?|?T%fT~@ WBz]:]%{EuЧ$ʉ䴙9Pz>!P˶ʶS=~~*uW&r\oC6UmOU}.&\#Io=zIx󦷀1|_t.Yn@  YϱDl3ÿ3="gH{)rq^unk0yL| IDAT]u!@ @ # bzxu%6žuC BLjD@ 0uOy]z^W{,Y+;P$^׽@`ErqCF@ s IIGV;u@H3p@` c#@ Bs$רh^TueF7ttЋ@ {vܙ6mڔᄡm۶{ "cS+Wu֥C9$mذ!^z e>;U A[&r(cd;6_f@ @3/v[͛ڭ[[ovׯOzj::2Qe>XN^oE}5|I.d 0\@ tƍW_sRr\s5鱏}l:#fV(Q|*߇:\ l$5$vU:ul3Dw.@ YFGG3f1/O'|r&z8o Č".4U>㏢YAS@`!"k,x=s mٲe/B??θFE$씽IVuU[ B(|G 2@ F/~1jBS7Cz7U>ŝr*{V@`:z7}}M;~D[Œ9_cձSUUٗ<@ {{ۗ]gS^X9WE 6.TAue۪s^@ @ ڷ=i-^֬YeLƞ"nz=z#C'u"މ flهk&=@ Bn&nҥ .Osϝr&_s>HńbjG(xz ݓUq@ h6ynw+{N&aL^긞zx] ^W{U f6H&g ">-CCC M <4j$F>Z{VAk0yXmg_"Ow3@ fn `#Le]>bرc>}v0)%ҤO~3z by @ SA`ӦMw+-ҴD:]2Xar#bګdQpt±:K`U뾏}]\#ùF< @9d_W9眓N;4U$!W]uUKrꩧtI4IzU ^H~4^u ?sC@ ۶mkϰŠ2@HbR޼@7HZe'[};>fA`tO#mE/*`;ʥm@ ,wC2n3 $/CIN_9E$]fmd5%:A1ɠTAKi8 @ ###$ۼw}wC?`a_n-~rsO$+e p>[e9\ ~ÖCv$g9s@ C*}qf|#RC @hC)t0~k-^_ ISvcǑGE# VIq$u @L|sZc&%Ӱcxt >@  V\98 <9kw 6XML^*v:4o ad攝#3Gl86HϟV@3@ 0XvmںukAvk"r(I,^Jlxr~-{&T.2-d왻acj3Y@!mP!rD @ r!N۾nTb8YPǺ1H:Юқuoe:O'w!\=ނu2.Մ 5^-@` aÆCi5ma 7nTbhY6o$5,CI:x閙7x :n3[W0v14@aL@ 07Z*|m?|95֯_e>NL7Au*Uu@gy/'QHrޠ@}3qs|˜I#!(@ SN9۬|_n'`L׋"83JuN ۅjC_aaN_^l++@`@Kk֬iboWf }ӟhΟdlb9gs%z}6/ |? a+B2{-dz?T)imnQ-*@ 38yYn9,w6E|L3y}fzǡ@m@=9)X w|@㯼_otFG@  0N:餶ݹsg^q7l u:O1B_kMTu #lkznqF[ԫԟ_sv`%ziT@ #Ǧx mٲeTvAsdlbus`[uggvp)@![!up_y?ZmAdlQ&=Գ(~`}B@ Ql~7y5E$u X?HW ՑӳpYZ \A29sj&M~q@  ܅^yw1mu?z#RF.+kUpwCd#I|c`6-hoeS/@ 3<3s1o s˗վU>' -2j[C 1ekUЂ*cu~ׁ=qsgů֥t+oN,H7(4Ep%Fu  ~x mݖ=>}ƶsřmDX`Hu%gJj&wf5ɴqp*hQA7hp z"X{qMC@ 7mڔmR___a0KZ"+Vu%پիW 9Ys A$FRoW1#.h m3YXY 9^Kvy2K6+8 YLAԔvH{Q nՃR Bz#@ V.ǩ@_6:?MDGWZZ[π(+^/ D/́+;L]5JnTds]&ʦԲ`=ki|vDѴx7@  ){mߵ#Yr)$V2o1.4 9%+FZo$ӱ"+?gQudl6NIVf٘bE? =6.1dw @ S i\Ï}7@Yj,Civ<08 KdȮ2a0ZD*cUkӖRƷln͎' #D ~n'{I߅<crSK<כZkJڛ_C@ *:"RFzd' A~edk&.YuBa݆lmޝ=Fy.72Zǀsd1N=^cf"~Ul4d ͷf~#q*B(Ş.[śZ?5(Qg@9uGN{-"A'Ϊ'6BPOJK윕Jٯk}C@ 2@7I. Y66n̂-[ѽ=teBg HKicϭ|p.#lp݂/zB9| i4"Q7ݗlJVubgpG­?u*EɏQKȄk8V~1exĠxϷy @ L 0P'n_ 0ȁղ?L-UOPĥ<\3gv}So)#F.jgΰПD7mix=yrVn䎡Ѵb6^zA93kBg1C)9G(21whgCYsILOB!NϙfVė]?Q@ qe{ 5}:dn*X󳮹v' $#-Z2`2ur@ ZsSU#g?qo0~uvU6ss;zv0-}(uL7"_*۪z2g2V qR]Db,]K*|yI{+oz @ SXO5%r,A d~ ۇG} 3fǶna^ guM9gK@w\U{֐ 5_ЯZϨzN*\ΑQ;j kV'sxR2n2VXʞ>,QGQ#*1[ W6aU=:NVo"1{VaeGYOXqyY/}!O @ @`" &I^JM T6`%U,P(ÓG~ٜbBHuXu+\j2BQc|f~MZ|8%np䠦ČfmV̕?M~xLu4ZVy#J BUrnʟzsI)6FϸRrW88@ 3sJ֏y:piOmge؞%6}[m>c}#CO_m%lXZf+]i!8UrLUM7;>u?i} Y &/GPG'xVmQYj@d:l䲧IYly>˓@x ^@j!z0UFͻ(~`#ڙ艮PC_z @ 7d~ۤ\S؎͔P^ @WAxtŋM`Qk݂i3s,<>CT k$ m1KսfJV =jk" DMf?55;1ZOM˧_mr5U-Zkx&zm^ozO]+"@ 4ɪ:c"z:M %P7m6nQ:'u#h0sl9Id|B4㨲E&=2o9Ux 'ρfBau/D*gwԊzwLv|<Ơh4d̐c,Bl`1it8M!{GHAGړ@j{-eig{UB1cϡĶ@^\~Vƀ"|Xj/.dEWF_;a3m-@ ~\H FQclWRNCHjT ۇ˄udI y^k}Ymz&ivv 1+g!'I昍X-'C|c;S!surʹ=w2g;lu/>]LbW.ɤuuEz*ZMG&a&*k>`ρOsX ^*^PTV=c $;-\5Gۯ>j@ @`!#8I-๼~#'lP\un;~왫i1nɇ ʓ,LLBp :<1 {& 2F̔2;2S9= GAg.#:2~:W|R":!b|?wFL7®jcbK%đgbXP - NH8> D_;k̈́CTnz3Q@ @YA8I@ج:ΔXj_|E sY<GPڜ=2nמ۔ U/9ഢgqpecdd 3Ө8ؗ'KV3/2ߙd? g'L83:dȢs؍⮲@ @`6IVoHէ,e}`;|NuJdvrhwRHJWKQlVncVtzh Ndyv|;ͤC vgԆQî64 p *${s_s ^'`>#V,'ocbSAH uPKG -Q@  3 .@Z$ժoYY`:n~"ܮ>Ogf-#ըg=!l4[kYe:4ڕ6\Ɋ%rAKe DtD^ü#\X>湼 \,J2=\5ZM?ej22rKѷ׬js{o2VAS.9b?Z5{Vrz>eP O*e#NNxc6@ BF#(&Ʌ{}OCjfauRc[cie̓3I}!H Iԫ@g 9DL'.!HJ}?G!p; 9,ӅZ !D)')oˌ]vK{QZvY2mB,o#(@ B@8JõgseZ ۵W /Rpٺ˚6mv IDATCF&ȦQW.TbɈeϜmAQ5p!:, +{3tAXlZ#0>^L+WLH*ɋCEB6)öa+U?(h0YÊeVACun?{^C_ {-̨˘gIczܓ:zp[jAڣ@  =]C L^/6V @AJQqBPDL8 ;%g1GD!<`s !x[l"\7Zl/Ӱ= E{2Γŏ?_t`orAiϸJ4ɯ̸~rT/[v9 V_tkՈ#zm띻kÈ]H+m3~bF@ <_B|Y徴ut չGJ/iT_0@s jj]LVi3.Ď'(1sK]Ciҳp_hHrs2};dix [}_ʯzf“@%˙2*kuB)Qƙ.~l8 >4lvFD?3 xe,}dC_v9cBZ!Ż,__՗|{t֭[.2óKl' @ @<_ߥOԏ:A@P ^AAjZKnh"޹sӮLd._js܁ϐm*!7a{@V9 mc.b5q*R7e Lk@A'8~ggǖC6ecau>1%=~:q>:Qf dm1q[O 34ځ`u0d^6yp1.,I+d.2سޡcã@ @` .odHBvPP*CQmbLj%K3ݲ/ZlXn>@ IH;^S|4]"c8p QiGYv-_x'-Rn-X֍L$ F5jۂs%?bs2re ˗:a2R@ @` ;ȪzIM :J^jowk&/Us"?dǜܜ3L}v[fnw~-#DYms=+S9GVaYdͺ2hŒؼ%#ޓGYdrnMn{"3wС6 fNEV.#ۼ;gc 9,FlRӵ+-'3l4JjxtgѾoXat҈7zDmwo]yڵ+Q<9ۯCFx;ݖ,]bō~#K=BڀC y{"-]|߰>6b}Fr嫗ymi`F @ PU!MWiU79,RzvLW,1<(2 :Qcl#!d!J]?6lX2]+t0"Jj='Gǀ'̎xw[w]j얲GV[ã#-1һIJ,nc'<3ȵ@ Cę2<~Б+/ʾ0@ueg+I_uڽ m|/g2XÙ@sV^o-woYޕiɲ%i[jr=[Y.Fvh{P2XW7l+zʁkWG)d *裏"9h!qdĦwi&mCCk+ڶ0Q SGYf_z/eW0g-ΥG綟ޖ3[ۚ_X?1w?+-۲2kt'q冣1ۆŞ1dY!=i!?r[6֞ 8'󭟦Q+v~sl).Hf8`$knsߊU+3<`uF wqk!FY{e6yʣ\\+ss,g ۔#<?=y=`T* ۭi2\kӡbW@ @`>! Δ8SqJuU!;Il )P\!7BUE1,VwOelS`#vdyrвMܢ%5h2v|oodթd5;ەd"XT2LӐg<猬mwƥLve}ݗ1r; ď [InۗF\ )\2UsmsGmv-JX1XKÅkc}ɀ+K,۲{2u\ 7h6?-u6~>Ș$cq,YiYRncS G*,ЏLY*bqm9Khd}y.^Z`jl->Idշ]'순l Eҵu]ֶb[idW-fʵ=ɪuu*_.˷|8lIn nA :b dw 28`6~ĻnyZZ?\[x dŜJbauׯA@ ϯ;)j:)-`"u48FP]Amg1׋#ö>52:舃ro8cYzo&,{m=yqlpFXA&]46׍ ߑ3moڒı;HfmBh7t@04^MǜzL&nuQaGa ٿyv\g~a3팃 <BX5-^V%[[Zd Jq {;|ֈݢ9#,cI' DrBLM8~Ƶ[93g X^|˘Lk2D~n*5};#_g 3 y{\܆3X"yܳW=5@ xB^4VXRvP>`{l_>W vZeő73{hgdz,` d ,%$gן1N8*g@4ӖWB:UM du*3_kls|,Okď1EFrQ{bg:@ ̔uDMYyQkoəuʘ,CwZ |#r;tˏo$'CxbƉmr]ΜE2|`TZ 1@&fDn3j@ E@IH7B\mʹ9d+{AJ Dum+evO2wzA6 @ K]+Ǩ6q+T'F}i-uIM*:*ױi')`'s x.[)da\l6͈ s:Sm8ngXvM)2mC[jU׶&t68Ò)HoYbIׇ|2邜Az*qXD2۲l7HaȚukr۳DFqdΤ@ 荊$Ѧ6޾"v4 ^Kmo+e Gs yoodn XH3:猡LLxx-X[l9n8_inL௰G?zSm JX;vt}2e{- Y,Vݎu1׭$Ww8e}"cbF6Ϟnʁ䎭pw.2/@ڙ{lO 4-jm@  q,ɪk};-I ҫ꼳Ftq隓 Vmd߰6JlLsc?\=x٤%-[qKȸ ?}[v3R;.Y}d\ ̩(ƛOŽcŹ6@ D@J&{~FрGʖ>h0,?fuF|H Y8q*dLNDV6k%<{̏Dbp|2ۿR%"q@ wQ7q.$x(֦@r}}{W@ @ ! R'YuUIuU9,sIlKR%@ (IpOBr&vq.]>rɻi5z]2@ @`"oN^&Z#,N(Y6JއFD} @ 3pL<.[q73˅s*d,8F8Рe{_uz(@ @ /%sy]v]<f8nF*x@ @ x Ј?WA?XFΜMcW IDAT|z9 9oǞQ@ @ j4OSS?I*l1 TԦeˇ| @ @ Xp^_rꐔ*60eBWV+bmLmH ([߮:l(jU i[ #@ *Kš_XUnHC@ @ 4Fm=1d$H+ |G;թleYWI|Q$U2@ @q/I.&~E<^X,gH#duV@ @ oTq#q)'0QՎtdrP`r)z"o6z @ 5LH fui% xJX:5m@ @ gq2#y]s:q2 ^+c#;IlG"@ @ p5״}MGjæ.;Ilʥ-`ߡՀ޶ m D:|F 5>ׯ@@ ?:@s'钝3|a`ށ~%ګ/R:~@ @ _*K<.;x*U[23u#Id:v? @ RYu*%f[ةN>"TMjCrP$I @ @ D̟ıG6ٗeUB:Sױ@ @ 8$%ĽWνD/l#c9 DRmH~B@ @ (" $I+z:lCR Ou[@uX÷'@ @ |zɦBx| XeVvЪ] Sҷ@ @ PK,=I0jǰ%i9(A9H>d @ `39"{@ @ 7ĉ$~=(e#]v˘b?)('ecՆlUdѪO@ @ ?! 'ε{%{q.]Lh |rvڪک@ HRIz}ծS]j9+dAt2,!};L~GXvm:' IJhҨaՖ?Hg;ctt'K]_pwmܔ[Z25b *e\ݛQs_V\Q[H'b)b }HBGR*6߆9(w@r~@>@ h>Sgҗz}+;Y:u/KtD_e/cXpx:#,wyϯOuO> =oyCC{?/]^?y{:1`O=7=mHz/i.~3aѳNwޝ^WQ7z|+cW0'`Юi!-`AYTDoCvҫ @Z9#*Q$ѫ.(\"Pއyͷw-wgSvܙ_K_B#//:e偭5?y/53ObVv,8Q_ 6c6ן|F'2wv:я#r ]YmԕKvs2OǾ8'n?>K/fUԝϑd4ޞv>^1T hPou ,B}-R&.OD 1P644<.ϸ߲TTյt4_:^OE TRvXvPno׷yQ}|Y}o*%K)9!-]4Bܼe$H?V邧?5隫>]6߯ͻcF~nw_w:gz|+j#HoYLQ̷I_lYZbb[3gfѢ6u_PiO][뉡 6}$ve]G5$v걓Q@5|vX?@b/Kzzқ^,,и62ϟL{v]'zkӹO9S#sӾ$a,:3}@}ۃS/U~#(5}v' ]`OeC7*Ԁ,wȍ:_&@ hW~3s}e~k:Sstq>钗&qz?}=_׵{O:7=%/Ovջqu}>(ܮ;HЬ-lje0Ϊc-U!c$BL@cvFЇ.Umޒ֮Y>t1G6luy[fM:أvn]vc7ݒW[ #Yd֭Ot>HP}s|sJtPr07d T#߿'\̧eϠۏ/} |o6`ɇ^S{[CB ]vz%:M>i-+YqW?ه6Bnw9xܱYᄇ )眕jlMޖ~&Vc޷u7KM'/**V#mB` _gYW'<3r^s{N)k,CT.;vlQL7Xw:-Hʀy|?Io{Ӗ[F IW};y+Qi xm2oKם~7iA_ܛkސ^N_tae׼iq}k>7qz"yqHGz{Q'UeNɲ8C&c8^:t!\^Š~n>W$K*s/7nzn/,C|ꕥJS;='apH]r {$}˷IdF?|ѫ^gOL/h6>s,o9w1 OHK?=@`wk>FszuS[#>|xStá䕪ʅpRd(9b}Sӟ͹ zo>)鉏{la3z;a[&]h/6* }{?ԼwYO:'=6fm_2}0O7ܔ~ M\OvG!%/?^L5_>=q<+`cʵ]o}3˫ۙ":Gҟ'<6~͝n+_*]w2P'"\ yJ㧰 L+}`Hҷ#rYЁzs}VW4λGxϟX6/}eRc>jRB8;[@3[{:pz80{y'r FϩדU8{߯W?-]u7\_}M/}PVZM OPa_I_CyGZm>UWckG__Y(۲d;ȇ=ēX^?,,6%mē|[R>!)+r+BP%eTs ,z:WۇT;>k: ׶tڶ_(wU#|:2-z>|*gozȋM8/?_1so٪3ma{{gKwllSƘcvqg2|ozVFq|גejj:[|{c .#W//+zX-~!Ӽ Lp̾E[ȼe3tRԁNN/<*?8?.{=mzW^~iȯ}mY*lXOCQ}3V/-y&/mh\$4ƒkK#xg}Ѣ6@آ{ܡ17>o}/?PjEOVI xےUMLB=Gya*ؒsMt,- #$s&-ʛd_Jf,@VFhvԕAПve&"HK#-ױEz=|ˍ=t;Uels>,LǽV[U,~W~1ۯ1G߿0SG|l"as4rgGn?=}*[/Չ@$?luKκqڡ= hDgE} E@g쁛'XJ|qsGɱ9_k}y+ùg*=OmjLNY%֋u;}Z1sX;g6{??Ml1tu-YVX6B¾CPc{wj#Aݢ)0&nя68+u30q@e~Wjc(1\~bɳq{s _k );PcGFX٨\f# ZfT= O+Ku:β="⍯˒?B՝km4,%}JlkYG{# f躴oS~W)ϋm(KT؉N(v+:d?JW""И~_o;veȶYBRl*:цmHZo#-%!vRzI7п&$be,xm^9x}rgs0f~f-o{نIfcy~.=֫`Xx0H:8W ;.ol+wyjQ#i;|*+/.]#cG~a}ʞxzȾpߗh o}bt8/ eaG'A@AhЎ2g_ǾYOXD{} A^RڻQFl[ k;^*}07~sIa^tSHa{!#PۻŪX]cGv}P,ʟzL_:z47Rn=+ |Vt(6< P!Vit6?_ͪWcKuܿsbrMܧ~?R#59J9$_*s*n$ }R+vMi#0UD@;wg3+o$q9}[g֨O+1^<- _:|@ &z9.ukOe`=ճ+^{7}ǖc͟8wa]|ï3$c*8g  yVQ>"t¾lً?!I&O>b1_*;}|_|ϻØW\%ex5Uq?ԓt1 x~|󆱬do.[\p*V5 {Ox:?Osi?3aQ,JX5W_e߳W6}{Zl2 IDATu ~V2"| Qg;j-C:thΫÙAA?Xi6^>ۛ2{^ ՉZJVEEw){Xȁ~Yo+/ԞxUw>>lo$c,X{o ԓ7ec,(}5ߙ+.tXC~?!;==%LV/1#W~FN/]oD7`, /"ϰvY Ɲ >i;99e%xBn7{q +p:TIhx s5 z@/ M32zY{V=a/ `BWD|K.x8:hH`W'f{^RIiOi;iej>ڤm&7AdX8mSF{ummc[?}zhldK"*L'|Cz/$}xa^K3L=rl|ٗ. =t0B>EGsq>kO9E+c.-EvEoU6W$a2۲6,k˫<7qQj F ̓ ^}'= 4.rШ~ " #J{;U|}طd_-'ڰW9~`Wq۴59_TAfl9FIXKLsIY7(Sd_ȼ;ّ$ŀ }QƾE@w UK>P֖ڮ11hxUDZ9oѹ0Nhfgۿ]uUg' as*JbW+K: /> $NR֛>M\D@D`u>lw f nK/tE~Vۉ?ȝB\YcY NTŽ6t:(CYf6H f?6 u]%\Q9V̽KŊ왻7V#eځ)aGuіvWqE@D@D@OYvĉJۭ8d[U r.ʴsd-O9Ks g:hD]wݕ%ilWڎ1k 2&ișCF=S̱0NPF=hٓ@"E~ORD@D@D@e_\]~Us=JLΘ?1PQO6@h$S L`E~XRD@D@D@b}^:{߸Qb qDiڳ_D@2H^'2E?wˋ:+^ /սk]bnX̓ TFIY CB$##" " " M@.Qu&^WeC`1K_"6\ɘy/6Qm\E hD"V2/lr-٬_m53׫0_J%⣎:#mJ/0Cp J\RD@D@D@>BS>Y*)jhf E>cMAY1D@D:ff?K^X]'q9I>";b,KF1BpXǁI yPGy82B]G*jjXe3H$V \X $s-mhGI;JIq{ىbD?pL|zT$FAE@D@.4a&HVb,;̫ kZ?ź<1B{L"Evz<fffҪ2OQW6%E9`?xQglݨ`F%l1zѸϨG,, ;Ae@W'c @ggN{\ve~aHڱ4vX1Ћc~=}/m7(8J`ԣ]I@B/~+K :^X:LP&lc=% 4`Qbbҿ!mYc2?KɓMhfJ`,kU1bɶXqYvR@v{mdцB[Zտ" " " "PN`޽9Ufp+& /*O1_b׉mǨ>R(8hD=:d]qG{" " " "G`߾}yեuö0H>\'m\XRU+1_dҖ_l-|yuG>4#JSF=C A/6X/ijmfw<[o?m 7={Ʋ̓ c>hs@ mM-s8ȨG" " " "P__,߲OtO͌G1zhu#Cdb= Sٞ:y>WRD@D@D@"bU/~1w3ǚAcX-,괋uQg;/Jd2tc֡]ED@D@D@@q7W2Ǔ?0wС篙g;̅b}+udJċuڱ/dٞM*Q8T:2Xqזm;uTF6}s=\SWhg#h+*"(i'C;Rg(ԟE@D@D@Dnɞ~i;qD#SCXeve9e^̘_Q>#_Ć"d S;Zp-ʷv]weo- C|·9V޹7 D=O}¶nHj@y8/:Fzzz;0έU2ڈ\ Ag)֡=-l}*a_`t:1mx%Ǵ+OIXk5a@bW>׾zeߎ Wh^Ex!_jgua ԙW>60uAX(|8k?" " " "$hv]yv0.bz,zi~zs%DGe:$c嵩N֋>EZqD@D5.{_mz(wHx6y>Yף :~XG跋u7u  mE@D@D@D'տY"844dccc633Â[ڎ; f .ȱTԞuyG[*`C9xeAp61UD`sQWD@ZCrڿkC^ y0LU:mcUut+t<[Չ?Ŝ,}D'NQT di}Pglv1B| :R%.Bqc(}t," " " "s1_dҖ_lmʎh:K vm"_F5}ךT%OߪG@b-KƐUN2괣_JK,9Tԋٰ.1dٙdԫd_I=Fbد3u&rQzJت,`ENUf5fё)W2􉅾.]D@D@D@63q˧X>Ge `3&ń. A=ѱlṾ(80b[G?Cߺ'qX(98.]D@D@D@63QUXЖ} RhR*h1}CRϳSlvȩQ s.<@ؑ2AYO(Q?ձ}׊T%"7Aj::$JUTn:z?& $\CUd3u0^sGu `#cD=Vu" " " " K;"ϕn4E-*k0Jf&P4׈I̯^6u!Nlld`?JsE`= sKD@DB*̧R ߬ˋKyFeudMD@D@D@D:&sQEyn0:1;Sg)u^#ױ']ϸ%" " $󥢼Q7mQfi u+pA=cŤZqf!AiGAFʠS6",}%&{"l*~UZ(WOE@D@D@DB#I Ȩg pQchSs0ejh@Ѣ=- y:7JD=D@D@D@D@ %hjQWq{`'Z?/!j詯J 01(zYye+0X"؁`W+[oQI@E@D\""A%ٷ95 LX;L ΈL!vȖ&1Hc@" " " "  %l˭kbR#KI]0:%E@D@D@D@ wZ 9\SAE=4T+" " " "Zq-+W:''ݢNFytp^f 7_" " " " B\ :Ȩ3CRgX :JBԫRU|F%ad/" "VtFQ*f[5X$I ȨOS3>"#V|@9lE@D@UU,u*K"?LMeh!]D@D@֏' ([%|FM%OH̬놼c/ot/b%Ak+0F%ٹyS>7=3gO)kƅlE@D@D" `z{z7'2 ص'ٳ7+ >k|2sm۶Y> 3[|*K9\!ɽ@UoxMzQYqi>=cz[j3oƱgl]*olZK`n~ގglٮ1;mmFڀ&" " 8s*L͘OM[']ֶ0o S6Vp͝q' Gm;{:l.x:o3v,[Z@UYZGb}iB}u^" " 6<ШuwY=vݦ:qJ?OZҌi۾sM8c}6nңiy_l}}%KHfOڠϲ\V;f:/kYOqKQ音Z?S1ybfp\6<l1S33LMˬgQ 6:5?՗fg|g<19idtd&l؈Mx7i]>Yt-}Sv|VڬϬNۂm~~lu#1p3mVCOE@D@D`0޴Gc6m޺O۳fO?m57k̷Ui޾`vM7}?Լ;o!O~N{o^_r>٢]~~i)O&|8bW+պ|ąXѓcvlg&73]*sT+MD@D@.L'>C361c> hwYWߨ,ة)i f6螷lzz޶ڼϘMM"_Bn'}&/twc}{u/wa*ǧ;1-He_{G6!/G"L607yz|gPf]~Vec&^6>=amWY ۶cf|߿56Z<#ӷimSٱ`hvۃ]nӧ!_}a5o}@Ҷlxt"'>t=[{oxiݷ+X')Ӟ\?q{jd̺vێov?S6>˦oC_3U#h$ka~/n`msfCED@D@6s&xѨ:DG>n!$o˙}txlȰ1ҿ>72:e'OMᠯ4^8 3=YP$;|VnKlߋy.Eאp~~#csQäԸuMڈ#>( gEOO87?T? (m3bI?xmk-~;Gfl.܉ψD9N`oE:g~3Y1 j?sll'&쑹x}}V!1;[|<yu/LصWgNu" IDATб=7c_6eٷ.x:mw?Wٶj`៱/~y2z}je.Gzb3?ؔyu*gמF_:u=|@1|Иގ%VTl<̀_m/sFx>izX(:q4(2k5 e:[_17a=S697mONMOM9+1#嘑;3fy>3l}Qs6e ,LEX3x;d >37a~ǟ66Ş810~:aLO\f}C[q#)b`C>ƪ133cg6fevYiD|\g >({"KLJpTTW0{g޲HwCG*sGĨuuOeK{25|0s1HfgBll6B4S*8ϳv"39B;̪]6 k<:ٽiڜؕUOx?0WLjIo;mڶÎb&m_1@"" "y :t*-/ae/58gff|g&joW,ȯ\v 5zѼ|nkkk[}"Sܼk2fgP=v_O=_ȶ7xϜ'xs8ljSpK7kǺAƺ=yP\܋m)a[/kTX{9/[X mhA@IE9Zi}Du@X;!ĺ('܌Q/Z7ب!N㱤@k 4 \QhP#;f%|h­*ZV Ъ5E@D@D@D`E6gd T@#lO%.:@F" " " " )E9lF[>)_tH^!BI[ǒ"9)" "̍H*ڳuQ/6Lb2>%zLcrOMD@D@D@D@ucu-3b;ɘ4r 2?jBdy1BlXGq#ّ:(@[Ht >P%U֝>\E@D@*QZlu@R($+:֏lՋ"K1W+Q31X!Mԋ:HdԋXĜ,Ewߝ9GtsA;'O}SvԅĵIENDB`pnp4nagios-0.6.16/share/pnp/documents/_media/bulk-npcd.png0000664000000000000000000024037011662503006022076 0ustar rootrootPNG  IHDRV-w` pHYs   IDATx}`ŵmYŒ-F 0@jRH^ )𒘄@ 4Mơl;l;gwՕt%]d3ݙ333gvaCf C0 C,TTTDc!`@CEmţJKKo>*//'1 C0 rrr (###eʡm۶ѦMhΝ%ܹ<~Ш!`@B@G&0:ݻ=G)vJzf:%GYYYCݺup~:K0 C0@uu(۷o'ү_?BBSMhժUe***޽{SǎZ3 C0 6:֭[GvbQ@R&+Yd())h C0 C`A`ǎ逑Sfff $>P:лs7!`@z #˗/yCmhGt,X@& 0&S!`1TUUъ+dcĈI|4j} thO)1ۍ!`!V`0˖-d#m⁉؏ٲX.!`@"<0[1I+X2+P:lNG2ZC0 C#7ʶ =qҊ4,Nff C0 CPedz=R<#)b3!`!`#зo_R[RIJ6ؑ6J 3 C0N:tL&lj0 C0  z`m]eɤu,(6Ў+d20bC`?C4+!`_8FJJS^^N=M2-Zʤ--C] Iƍ+O?76"{vxsg=Jp|5zLunÆ e]&u׿5uE.#!C QC 9Q18"L[ϝ;WNKU/ի]{ i]:xJFX W0a}~?ϧ~S>jʇV8A}>8|}N;M>q}K(k׮1c$̢^ *!C=_!>|ZE&}ǀpS(X8(k榄cF!u h>ۿov:iɮ G?oQw3#u+Ux>BHw0r {=[o/Eٵkra=`RS?O/2 U(R n􂀆crsMP⡘K݊?6=CW\q{ft5ШQk_E-U9޹ pø^SüZgлn8>08?=zzr)kN/g𪫮MEuWЂh%O?4}Ѽ Y!3wFQ+*4~FX~%/E1 ʊ'FR<܇_j~?8c饗fOCa;UTz @j;x[EJu(| {nOq;XWvǵԻߏ8#f=Yۛ<,OY+)Xr :"Z^փ֬ ,\K> ,arrrN }>܃0MĈq=8YZpc=:wvͣ]+ʆ„`x]Ѭセ ӋH;Ï AL"׿'u-zJ^v7k<9I7,_˒Q sp qP!.~iɒE2|A8Fһ 7  M Db"gCbDl<c!Tl~Ga:7`FOEjevuʝDOEt촒{M~LK9D}l1M\t5Rb 71Ñ3fIlXv{Rvv'=RF ?(!=d8H߽c E4glz晧+ч+3wޑ1O;/_gxo5LӦPo4b1'33FSdK'D!:L~(+{Q(P7ȣKrS,,7U4a:3E~(8RK]( ҩqXBL"+81H>\Ox$>CS7zioJ}KM=keʏ0h? C< 3z G#&fn+3.̶ $[*o'<ѱOc$jɞ6mtMO:餤 D_6C~/^Ay`{?XA9JJsOǽM|* 6GKoVקO_={vOyh.{ϟNe˖N:;ȑ\,\_jeu%k"!OW<ǐchP~7ˆ"5FCD ۉhp0Wt#(=ᗗ߉xrx D)" ۹y39ND5\7ƤI?~./ DzrkAW9sU~YQ`VZljoQ#GI<_"V‘+Oi}i f3˳#HEW< ?ha2yGC6dfn?.[7+**eӬK/ `3iQZZp\ 9%u@>Y |cFv}1HI&:7љhT=TXR!\9*gF7n k@!z,G6jUCC|i=EF{<$_/!(IijJ9.}@82Vpǽl@Q8~~D.CsшDx~MQA;DnA#ϫa ~U#]OnF֕}#{$z'֐C7z}ï|7w-3}iQ@.̓Cyg} Gwzw+޸}(K!ٺu c >Q X^ v2dHSCB}*<Q4g1!Uq=ޣA%e,yo/uKiKh|nܸ'鄔#+i!ԍnݺS|NA^႞?2y xhl," ~ĕٖ3ϕ=On+u@w3hܸSyߖ Z[AGAKIpOԲ O>/Kh0CO?祸-?~!7ϯ >0d^#pUXkx[Ý/lɧHeW?txk^w͛7IBvÆ Y|ƹ֭UC92d3^zHlioBK%.^O.]+;'3L} νx"\&q7!CũMO l sOKY1C9]%3Ugoz%!6HpB꧶k?6z;xphx=P<)-`di)^}:pי(>Hץ?- ?ꨣhĉ䏉H7^yiԥKYmǍcnbLԘ1w>$Jzp9]a}B!q>]L<"$}xT|B>uTWukɀ[yc*~Wa^R?t(,JGc-#qE8nv_!==y.ĉWȇBjJj"뚑5X5OkAS倆:1z|5^nYY~hx0lRXؕ7zJ?eoܸKgJzEAy(rFKR\_xQ:D\|%=<С򪛞/zHx+!Gfc2b/r45zna(72?K=ڗ,{xYjZ\1O˘7McۯAoGc :;u]^B=p_2a AgG!h$??"223%jFi,MGPZDx{{tpW $z7El2B# FPs'o߾t'i%(x*,PT,C:;;2LdٲeԻFw {: ++()oe7꜃YQ~?I\i?]xZ.P_,4?\3ߔO߫+L(Bk^w 7S>n*jөGKNֲiӞi5^! O"m,+yK짞z;Vj=9em-ِf%}qnr!F| ?%?A:d<0aqХK`0/:ٳ'9l?<޴iwZ:b_L8lj` L CI0|sɕSS/???DY6(p\bqBbDmۺU2x*y̡Wxn2g<(%9.b~Ϋ{񾓛hʔ'i /}[s3.^*/Uگ@Fo)HLVĊ 26W|ץ<43fL.pb\")Q2pzǝ@f 8ZͿcǎzCwq\ K`*+y}ygt,` ?5BP.\KW2_w7reD K_(D叉k@={ZSSP0 v n Jë[!rB/8)S/`O>IԁXI807,P_H#|ߐ;>Q bB[;@#*?hnJn[\A3z/ G{ SX%J*bŃk:!p~(}#yGdE&h ,X ^Xe}:/_.o*=e; ^IHPz?A#4mT,An~^F_/~*?b!,O<»scs=VD)1jX; IDATL}Q_Ġ>}ʼn[H ï\xF#`1/9GĊ? |e>LЅeN;C~51b"> L߾nKiNl6r%j" ʽ#$$_,wʛ=| ҥLsCK&"}r|?Sd>e%K,UP~#vJ7ޫ.[/Y/|!(c&A{+ )([uX",Ǥ,WY"sE;9Lg6_׆262m,US4fF9U"? aG}HGq7U[|'xLF7-1 Nl0CdOY"uٔ S8!.SE?kqCbF)# {W!%=z =D^Kt@_|͘ZPNLb߫O(n}i&C__cEb-QpbPjNy _='<^dZ+N s_% [% EAć+3Τ~H#q8cc9d#no~:!tf8TG~AZs-S }C'WR fvbn+,~lu" 2Y+АsymnAF8{gtBɰ=:20E@0~';h8>wޑl%aNSBԹJ۩q-$WG6ҁ0sqjA|7!еzs g_yF {yЏE _êɖ_E4Urơ&Jɟ|$MO;̥4}[VIۧ{s`" s*O&g!z,_pP$?v68S`iCą!4e[f)HR-|1 cvÿhp1oO? S 3Kz;x" O}b<= ?3NL{{ ]⁆7\i]zMs?GЎ4RDc$< je.&᜘N;Xd_]c91c0{JH+VIչR|drF*V8j5 J{uC ?`Ex8 ý\B"JE92Xq2<*.PNe]<,)),+NP&-s6?m~@uG'U)IHfjY3*4C½_. v=4aw},afڵhȑh+hD 8/vc%0^{ #Fj1q[Q7H {6ɪg+=Ls몫b+W.I (*V\*puUEDl2"L#7҅ >;n%ZCz[*8$/?',Tp7'" W~,%Ox|xw=]#<:,9u:/\8l tK{9lhiah~}wҥ^s{Th"|%TsCPh\'<$O"1zï]cz' /N/|DwTe 2"~1;F7g=4?xռkc2W*j⡺*HTv@EJh^6#.!{OsOC.%4`T_gqB!Cx_qHZ6zOO[Fcc<lt䳢cUs:3RC A5in|a ]ALN\ v?kNk̙C<o&,3!@I`׿F\s bhuL>-w^W(N<-ӏhT~b #<%CإN0?۷SYYYq-H'233el[9)rRA+)] 9Xk3|xhP!XH~p4vFq3z;pZZ`nC Mݻ|+2*^C)M{~bG/tN0zQ4 ?j]C`w˗Υ;Y騢,v=f 1av' ^$ MI8~ƫˎ_ǏxuS.;>~}]t?^eǏNkuѩϭɓ͛7ŋiёDx8BCAN8-Ea3zw?`NKQQw^>ەGVZo^!?!ХKg>4֯_OnxM+(tϨz^݈jC@P[1ýSvԵ[?}?fM6Z&bx%9QT>gax~mTYU!GV<\W1X&Lv'N&6cv'G(2oɢsPK\X2 x1 #-vE<τ?OB |7| - I\щ`.9VMOj#0z/Z'ms-evͣ,N]:m}ac}q 3z@}f*~:="#U9''Kb7 9%mLM[61dp@ ]O- r(^q``hqoޮP<:Rf|z82ݻӸq/ `96 QEȑ*((lQא5 &̐ i6/}?K/ĉRŭ"P5kV9Ѵi+|gt?{#-+# !0 midnK?P0YA񨬬|:Zn-p t!#aG~paar#n|zW*ۨ/ ̣>Giٲ4y]|ڠAoak4/yV*@L`p")D/*To e"Qs2May"ĝhF6tq'С?w~kf!Q6+R!zWP7b3F@~h}K3_<\P J-2CurG#FF*zIW^y/wӅ^ȽQ^?YwZsx~V8WF}? p`zg` 'Jn;AO<3>xWw(!q"\\k-СCExdj2%Wƴ.3 d7su%5׈{)4ag3^z}Nɥlƛ~N:^ʻn:z)4j&>[{aH{"U8:cE` laP'o%k/Yg#]C_<.P00<3PEE 2;oɊ݊Jz? 9syK!#_VV6z{w9w\+yqkG8?Bѣ$씥@`&_0%y(~wDƮ@@s<ގxBnA|n%/OQB1c*0t:~má]R~?%P^4| 9'$R0f &lnfbVYp!mڼ<<Ɂ8eX/_ϿS> mnܸ4TI< #:q-*/y {{y^N Xb9j-Jҫy>}:tɗ/%vMK<?PTa@ R)=z7?]rP+6sӠ.+O})QoҥLdebqC!v=?w0=z, b憯}{wofebe<֑,z@%%Нw{>⥼=\h܏C?רP {QJ? .)\z%nܸ{?4;ߥb.;tEA#›d8<~m*1g7i@ h09t8?W? \P0~+ fOfV >=hCeEv?k ݋oKoQ# $:4Tvxb吃G׿M;x"x\HPԭH&^l'}BT 4('V2\.O**,>fXI t~≴Ν;$T_d_ CZP@yfIs~\:2lyJΒ] F b1Aȝ7qQ:dcOO߾xK&Qh{-JJ97ҽH-˿R[j%=7Y)vNJEb >izǹgr iv}8M<577JKKE@:^.i:z)u ]zQGs&YCڶ}^y%]1$G ׅ6a1+ !A兿\E^F)6_r3 yJ^pX*zGD_=7D+ mM۷V\ٷ;&Rg Q"?H 9իVyK` 8o+a1@ I/I…^ k8(b4X(L΋N4ڋv_ a$ĉOL\>~͠eWec&OQ\JZU=i+S=emAWnL=Lyyā.أr@DCZν_ii%W̚5S_zh~Yj,u۟ .s6{~3,Fcz >BŸ~o2{?8sᇋ^ usw#4@@nkdYpqqjyw3ݵkmڸ2O&u :0v`vn6Vfnyt뭷I'9+ߓә8yCxx.7y3m:)4h0]K8EI/|17!K. Mx9=9\Ce,ʉ2KP8ԟ㍋NJw)Vzx^;;~^t|?ĐP8ByH\k,}G풾D>#vU@;ak#/&7z)/@g"+kW>=߽KsŞEbY)+ۭP'u)Wɓe&1C heiyߕL:l*EQ ylʩK]5B% IDAT Yt'S4$)O%QQffb)Xl6U-'rH]4|gyyْ^A9øg]~UR)''{X! _ <򬍟 z/Ԍ!Dx=U@G% SZOJq!Ax8~h,`2yGCfDzs<O>dsOA'O:Cmذt/9"F&^9@.dCl 햸>pOW.Ώ#IL #F9ÿWCKl 9&/W(+| gB=9%uK'xT/6T~] A zbmϻ> &WW'Z0K{  lTњ5KyAB-={v ޶Voqߩ4 kg]$CN;`:m9 (MW$4I_VVF=W}s@a#`q8~&C'HJrfdC=Id_b8"U<Uʯp1r F5t{寺ryˉs2oQzy]XP#E#t(ʟ.߶u+q Կ)ڇ%C 0p$5kHXblD{a āщm`I{Op˿mS#K2Vހ] @Za})@tCiL@$X+Jv f S̿;Lv=B.v,NV m_jPj]]Յ>_;ڼy##0o8QL0A6 k9؝BO,?TV4{o+^[?#s=XYS2R!"V<\ɥy8n~Mz,[y'A:$笩ɢuks< iEQkE+@`5gЈˆq/st~[ r ?⒗`CX`ë~n=;{=^T ˶Ca OH?7lM}Ի<i?SΑ`ixWk.dXL,c}AA GKzx~$ !I~j(9H_k$]kTK֮PW!~hp_IϊekiJ;igԳNqiӆLNE|yyub_KVBDp8"6LҖo9%H8Tt@ 78>l d Ovsû7z@ex tYv=:ZFx 1]P^+Ա2>Gc<(*~nt57u8JxS83*uU!g ÄnOpUKh˜*6ZajqfKOvĄCՆHuv`2~)e|Xu~ ưґì|TWPٮ2D󩢜7i C=00A#C*|>q<ȑ?L;`S]bqj.~2&# a'?#2vʈ !hK n;xpnа GϿF2V̉ Ogu~uIzQnzܖn{ V\­;-`N_*Q!w/] H@Mg#Wr*O2H| t5$- β!\aa7ƀC%qx+}WФ3=z$U -)773"13@i==;fmQ%" p F/~xoqhႅ4hI;RFZ8 ៾nbiϕ ̋Ȼm~K|FǏO%x0N;ølҡFal.2Zb;! z=T.˴4 Q%DkSzWRp{hzr>*4H E\Oq\%(↍Fo1#Rfo!pGYgE3gNg}1tq,rB{2F ?ӻhh+1 -AS護^+Fi@**  W% {.()0Foqc"_ڨx"\E"&NH/$_ARG4<9qUƄф 鱔 Vq ?g]GK.sgӱG?O5ن ^H֡ 4Xx nѨn܋1zO_x6/?P ХKz[nӧS%4p+DU%w}=>jxa6@pxqDl**)+3Zx&>=+IYC bé4͗}+qnLD },_X*=v\|9/]N Y;zF%%%4`~N;X@uuF]񶆫OV?N"tjOmS;ȭ~j+aDnS['rJv?[V:꧶ҩOV?N"tjOmS;ȭ~j+ڱw'mheSanMյC0vy V ,u'ݩ7ـ8I6mٲM\S>œfHR?/Lbm 17#~(na8~"#0?)F.񡆅#^^_ְp|KQl^Nz#^[]ݩSo匎<$C14ҹsƒ'ۅnRrrro߾ gz"70հBڋqKGIOYUwM˖-IݩEGЊ~"M#=32)#3{2SG:P>ʲE1jc*5_mNp{qh&pytI %@Y0D1O{8|4fh(`i:N,`jGӵ_"W<jK;4ÿ(b$ GA2S:%r/_㪝v{ VxID8*g6cj-rqH< 4i:v(_赗>A) <CL\x]1hURS,\X5/szw׻wo7m @ܠ$z,P V x QDk^ޗg#W$ ?Czi@cUqOfgɓ}rxbHKT@w` ~8?`x.Q +G;tXx&i%%%rJ(zx=h 9U!0.gv H@(l4b'5!<N> 0yM@ R/ x*!ـa&+t1^._O*h*ߌ!ВDxxS&XEyJw_gҸ~䟖v!߻~G@Dd"z8[CUT 0z/G*]  0{7f F ɥڃ!vVmX|H$8n_ OǎYTUUÿ*ǛmP̴ h˖-,|0a)l,5tޝZ>6CG,DP:ب?DaHx7 M¢ԫ'ivauVWΝ;i祴~FBXND%k׮4uꓴnݦ6 <~mo}3;oݻg{Øo}\ 'c6>KW\q9]}m5# lkQ 5K*h D?4n\zYߢy#\*Bu^gW+#){0! ?叐=|@{wu(MqŔgd9ԭ":єPגVbm۶_GW]CtұJy9D3^e/.V)Rω95[V}87!, D?^HGKgejkyV5LiZRYHOP}j׻!ʈ놄Q0u~ߩ lǼц'77S^6Dxo/oKTe.MCyev'zΝt7o3i ,!ڷ6nخQT(h@W,И_3*iO$?z̬<ĒnV4R gD9ն?HH7)-ſK`>Q#0m4:Si̙ f]^^.q;6"j{i Ex2bFюbр8?|z腉B}'ïAӷ+O }]x'8߻?&ALw)tV`H_W9?:&MD?~| Ht @0Pe-l?w[~k_#'/}$%\8ќ.=y,Yb = Ql痑{QQAAnd[wi,$  ̬YLtˣ]!Нy~qPL4 adOFf/}͖IOLD+x%y|!37ncGKjDG׮]"CaCAݹTwcKU ua#.mأab&#L.È.@4>pedҒ%xk,-h*iÆ t饗Xm}قP'4z>JKKcr'ҭJ%%%1vcD*V n/DPén)pҁ ?~@xVUU<J C9Y<;h+Ld-[Ѳeo)OL-LjS hn-j3B!nsJG> ?-}5?UU=|[o099M}|х$~SYћ08`HZm9;z:|`W, R(t ,{aj,Z772'3Akm%?;JN^=uki ?kN zZfO#< ǫʧFt4H˗};xsDʪu_W[U6%ՖU] IDAT>~=_yeżŰD7|ʀo9@aH{< u E`xP*p|i\Njga/ï~Yf=3vI]'7YH$Yi];8 ̖MeےJdfVC:|B*bm|2܃s/ܷx nn݉96(g+þ5X!J/etG 'e_8fMCˡ; ؍q3x~ٻ/^C6lvmADWҁ;Kϣʊg+;j4Wk!c̘1)[XEqN>)IwCt Dzcj>[ DѼ/3?FݻYcq&*K46y=W=xkU]C}闝?>2!speEϺ \?hH=(  nt~ =ۿ& *B0tDýo%sh6+^7 ݙ-x][7 4z hg{wwڴ'`&}hӼy˸Ky $֢ Ih0aBTz Ѽ{ .aE΍퀁sn^[Y5їY+O >qA"7t5_?s~{'?'ٮJAոgeH˾iS44##_t??Jt.71ʯe>7 VGs-y9 XaEg۾D* yN yi&NLjvLP!ʕ CFx>,Lo5N>B'plĵ֬>[y;3&-ĿNoDA-j ގ2Dr =p@Yy'ùfDaxk[#]OH2φ9(S^x !#qg&Dx8eCM8E"P@lÓu藬{hxBaM?[xuGDg9 i׽{F͛Xpȼ8y qKˬZRv B+/0+S&zYqO]vtA訣5Y{ 9nHF-L}nCԛ{!SȜ}N,-j6;rDֹ3bpvٓ}3(`%ϖ-g/9C R@dtv X%Ï SC30S㡀V\z//;j^}~GyR0pV-ūb&Њ.^Kv™ WO"k Ľϱ&v "@CTx^dҽQvv8Y3G]yAU g"0=ɘd 8txx<. Vh,x`((eT Iaw00aOэ Kw6oʂ| !TYkV:nYԩR>m3 ^X1TU9Vzٴ6Ƌ k4"ݵ +e\ÇsU0PH0Lg"7<;/%SzA7!Ov.j w»;J񏥗f_ fV;FK|ɿ'ݯ\D`'v 8T^b}s.ѷot`ub(+lh DŽջ!DSg0+/#z@OW(x;$adt2= +N9{l:1\f KhdC{$ΛV\Lφ}<W ,& r^L>o<:蠃x@1Zf 7xP,cONe.p)6a,I1R;Y曶eza7Loqd &bD0)sN,%*MKnnlܡGZ@c"ޠ81/d`xQܣeb̘ǂ =X郉{@I M}6:{RDmV G-AQg;,X'+J;Dう ܟpm4h\ f_{)PEC#G5\<|``"d]{;t^D8=5:QH~P~?{U$=$B"T MQD <ES(XS }*6Jh*IHݽw7&$rͽwʙ33gfk ko_/kض1ia+[GSk#)!TaRDa<9 0 ؄1I1Ș^ռ(?MjnA@h p [\'͵ZN% q`.-àe=a|}|J~5?b0|a-xaa:TsfҤt}8x(=(Nb b Du"MTˑ_/Bs#إ%<{8x&ZL,T#`@~U|LeEA5U03_k+FK nS@44:tZvU wk%8b(dT#Υ<Z|9 sb*`rA}@>AE C08% 5KyFk7Q s{RPK|H/L otͥG71OyZc.H SGq ʪJP, b27ҩidql0_3mQҕs)/yS^AK3R% 8x^G1-7=`SAe9Ua`8#r״w#e-% :Co&9gPddBTa~S!LFZp>7:JyBkmOmu-ߏqhp x0N!UWVGD~a#8%P>5ajӜsGsNR^k5ρC}7tA@XF<&L=zbǎQM &D4T?VLǤG\)? {/9s&v|G ӈ/^zi _H!T4XcvSUYBL8'kŃ>?7\ Scխ[7_+VG}y8 ̕1cIov"PW!t W(WIowي߇@zwB 厈p'DA@ v'sr!*** Φ'A2"((XA@NxwwH%S-N!\!O?v}=: 94뗀.;=?so3 b!-H2:t{Sᡇb/k4GZN! 51D,glkX+16mcڵg,K JF<~~peV+,u @hh n3??OT_tASB{:v0U,' 8NfpK`܂ f8xݬ 9i(9J X!Y-Q/UUkr t~,r}r;Itp hH I\@u vB^N;Z- :?]6jkģ<>GApHԕzA@xxx|J@iI8Nt^'QeS\eE{"s~2G@\W,y6HA@A)>/IK(,%ѹxE|etzt'܏ȹ3[K$ 4!Kr{%aLJ["8S;’QAx0~?ϕG+"TU鐙 QfZןDЎa$RH֊[ۏAs+x,k,RI{2k?[186|oH:ߏQ,F!y#lBx??e''@4[%D5|Y?bQπ  nI'N4<}gxL|&L< O/M?]飒 .ӮNem=D1mL,*Hl.,1tE6&AA B<< \}uX'OrcE5g!Gjqw:J#eKł y` IDATO<..um SNMQexxTw i`;+:ڤr/mNi-}[tLu݀ydUn#[(t("ފaðv험6m &^T7V`٠i3kWy<;3YXg#)t [:Z w$^@JJ /#fz]A\roł1v$]ɝbxEۇBMWg^ۧБ4A@VȭbƢ|F>(D``x9???[0xmSzy-0A@@"//8yOP-T@V\S[y U CEyY>Ѯ];bs%mZzZ).CKi<O 6_oXp*iۧdb:LmEz_z[I{A9LtpGG}k |ђtz擆Vlk>CS###u}=Z!(((ɓPw?>\|- K[[n-*ģ@Ey21tr#U/ƧXԉFD֏^f7IHMM%.As#pkM5A } : YW"L5NRœ9sC.J=O?!>a>r9O5b"'2ӗQvdj~rrrp)t^8F:qL$ -Ѻ(:|?ݻwo mH[ P${^[~mäCHHhpNgw ghm;ŋ/Z*A;8x < p:R+mrk;; m!Ǜ슚'>]91 38Kމz\k>wzx8rU0AI@dknDXۼBycӔ;vpO8vq}B/A.]uu[0FG + 6D@cmr)d[}fvv_ F?ѣyzf;7zDA B^ƙA3і\@IqC#zVL *+`?8ܹsV1c8D@,Am6]!4e%an5y'y< Wϡ@ʕ[l8tSxxLWg@-`" G9ǐtB"f7%GQY) gx#""$E 9 nF4@u?dk[}|NSZ8*ԄJ5\&H"lϷPX% #Fpي Ʌ 4 !MM y>>dP[k?U 93xFC[B4ZGO`svr4o֭[WIc ւMxc7^*ExBSև Ce󴲢 312d֟!99-Ƒ#T[~$*,1{3*jhK:-fwD@;"ExX/XW>>v扶&89a|ֲTO2 Ine!}],"˳3z#GKJ4bߋGlؾ?! CocԤHʉ" F@h<}o<9p=^lBYZ$f'ю#tR &6lƍ$bpu[X4Ged=Y/ulߤSd!^jv2!}޵YURͮg 㗙fX^1*̬@?jOe)a8Qb??[{ m9{i Oc㢃J-=BE1`L:}CiWն jk! tuK.@ &8rY>٭=*D$>de> Z.ņT(/CY~ο3zoǞՆ}{ ?mTVߵamp?{`ح!S{?'w.BrҷRʏXI`L481?r .j1uCt %yG(:"}[bVVD6.:;DEa(Wr65&-B]sX~1=D9UJ"lt̍}ڞ_>a"8%kmrU[I2U}roWN7V2 u~vE $4a'":vnR}9yN]v4[;Z2;;wL 8Sykza=Nathς˨߇+~@%a1Ұa` IeY5~!bÖ 2o?(\:XN@$ł(V,9ӰH"A|!8KCG& lYd㙻l""ӱA5&Lh8p{:)"_&3!r3;)V{ɒ{ύD;#MlYzk=b.οN1v2N!!!/dqq' uk{Gf~q R5k i'r[p@ NRăa&j=[<$!HK.W#c{~*_U0W,%+nd@!}uDb 4tJD 0Ĵa.0S0$\ydxx6pנ/gM`/sH?U5N=f+V[sЎH0p\ cPS&\e8M5 d9";"yVT KspPKLL ;Cv(ւ/&q7{%-,Wm N߄vvKS!;|(|#.ʽK߈rg4<1Ve OKtXo!Df(+?yhNVhh"\YvDH*ir_jNC8_'6=yPΡ~:_8R&VP;hDoѹjس>y7N)Bh\ ['|"']]$R"6ZM9ĕ8_#._Kre{nA@A׷#EdZH[DC0 4[\] 'G  CĝDZJ5;1!iw^a>k8(7mz.@qrTx9(C"XZ[Nd`=?^I'[^8P!=FF cY4 I3fvDu$p"5j4shq%!F.ɮ*K !~IX1T=5Bؑg{Wg 0lPhl6$O[]{޽'Z%"Uh$ć8:w!Y8r c' 23Guu2ҡ3[JO:m;niV#[)ٵlӊ|f8gn> R.ãU ]/zO-0??c-bCxVd3g8 &dᩪ6`ۻ'L`:cF)Wd([4]Gk5_d$g1T\Q`?͋+z_?c4TE>4͋a. c^m5h$>4h6* g4969~w0O߽:X$ ǃu Z] S[ utS0*q$|v^e^#H7k?G}2ʈ!z%?ބE+ C4c#$Y6.C(L6rɑ Qb?|t.L~ $ C.vײYIw ]t:!êRp[DԚTe7Sd(Āgі%up ``RjūB2 Z||xh}ZV~m9Ijzt .g!?!~*s^vK~CvVS_ FbpoD"W}8P;sӕsm.=zfaC%R8Y9QPh!jJ1bj ^&- 6`,=TO #iΰqdBnC-*˦]]PUE8b ؘ6]],FFMEdf"<;"?ћ.^0kfIۊ͹jznXW3Yf9];n[<|,2^ PeW \8oЪ- =09~.tň70*+#4k6ÞMΛA/k@h;kh:qDv@i@SDŎ6zRdYA~x\Mnmܒmr*thތ A귛1sOex4DmQn=5ŔN#2cZ_D8*]p%cV ʫK-3zNaXEomicRzMh<;N-C-qҼJdbߚʐ UF<عTKX*|'miN35{+mn˯^ %B7`g4[o0#7:hD @yyvl?s9hez4"+ExgkPTQGF>xA^Inyfeuu%Y:AXėMƩ0< d ^CZoS4fw^$%%Na#eF`:C?ˡ5Y*UVV6t:?eMvZUclg8Bq*DؼZDshh3"4r1mKwgpQQNF89xpG(?>7!GGݾb#*C%G!.M(3X"l{ z9%g/H IDATqYXdg߆Ccd`붥 Ale%`a\S7#,'4QE2*бC't wN#9pICRAY-u{v=](r* ޗIM1a54M6f|mY[ͤc: yPO-i( x$?qnn)ƖQG~~H+SyJaTT{P^V8: N#|d1wT=*8N^aݱ;tQ= ֳNPXy$BACzx &@vBB7çqDA<=4 d%dxFIǁDD%#R=] ڡ ayY;QtTؽ{3l 7"]c]qq29^?b}!8=I' r`d_wô!-4?F.*j=POku@ ;m%̘tZ2)XO8jꟺl_RƐO@y]s*)ă[Tj{ՙ'u6Qkkfff71 q:hM:)J5,՜{' .0Y' rNk_"Et ^u~!7ù<LրL=$I:g{'`U!{]'jx B<_؁V^x¤ǀ%7f}~ W >U<>/7<5;c'N^|DC)CSb`x{0MQV`Fzb4e}x#T7^OXAg5 xpQm9nx66.ֱ4EO<7LR@4N)x4"u"BY TVn]Y48?Zȩ9{Ƨf-ɗ?&_Gn9k}^ UȇjBE`|mQ=]ͩgQZ%j}khr83%t*0,NL4* qgq<~Q\"K u⅗@b;ܶ_xMJJ0O`r6w+ǚQ(A/HlbغN'_>RtdfJqx\}lrAu j_n`>,)­O܏$ˮ{Zt~µaozhܠv0j M+ i~LA oᾷVе7v.߮NaF3봢VKPV:f(lcohHΒWM7(%؂L%"0DGÃWҧ6{@3[~j!)C <·@ tLS3*eZte++[U3|WA'v_ۤMe31Ǝʊ[:T'V/?G_Xp1n~bAa!eM9FL o54fPZ\o=vq8 f]<-ӕg$g?w' xQѶc弾>pê} Cz68S6<{uS5'woʕʻ),l:`_RϿfQx 5pFi&)4[,Y\'+A@BW_Fxd8ñ%#ȡ m(;L@z.;=90O'RZx|G{d+3sA[GgUo a}j,QEO[2C;y.~6tK9M6f)t  Z.{:8_O!WEkW.xckݗjs6` H{rKiq%͵Z񋇑<2^UNǓXvUPS">zkY_^F :NqFDꗟSyԢk`PKmwd0+^ ^TDE}(a202`V/ΰ}v W!k4C?Ztcʀ8 kŭ,wdbS+qb1 $.Y݇TrOMZocxZۧQ9yYFTopL@(%aWaKzP $n7r3`v엯O.#bF}c꽕Xw8A޼ur\ HѪԤb* EWva}6A1,/!v]Sי'ٕg:=-s 2N5gZ/Y}/͟_ R0,]^v;Q.Mr=܆?]gNW̚K(u8xG 2,|HYH1'`Vosݘ1 WZAӞRJ*NM\̹\~0ˌ Q8ubs""&&9!ge[#cp:" FiܼފhZ% Blu lA<.6]EuLkhW[#>(;7zI7CsA"[t-?4 qhR?㫎EgM6~ c&R0GO{:nK7CLfA/cE_S"=f,]X"L| 5of2 hQfxfEvu߼aXp-x&~* WƭdJi8t]O\7U]GV^uL&^klяß݃qUY'E7a8˾uhO58<~D|sxkc}יNd {>Z8%L)z9||i * Bν5i=oĐ,%3PˇbD3yXA,A<ɡziW<f=iD\28f*B<ѰHTL4N>HiNz!kd香=6m/#QQ^鯢C+& ".L,;7=$_gfbxY [w`v>{\r<5pvwxM|-H\Ne3*?V2Ə) +5.ۃy.NUHU9|{5XN)zTcFaf})YV6^j0Kմ(K[.o|52-΍$ 'cy7 Ն|5oߞTZKpFO(eGU;v/?άؤ)3uH"7vHU,u5k0/ qӶC{av Oj>ȶhTF/`4~7EkL[0}ܞLu8tvٽ7>iq|<7؇|i@αt|]Fӏ‚0d{f]+;):4ԿmbTűCڽQ8q~.9sMi3;^;x00.xy;<Kc۟F) |CweO5A9,4Lm.+އ75yk7=}ƪ-mu)Ϩ{ |b#.¨!4Xee.|zXu?݅Wkk's/x"vB|gXtx8U,wӋa.wiړ_Y:gpi_y'D.{F9/==E78FRgi5oa/_b"&|/xJ&3^# -Ĭq9 t;5~&ޛw*Zg-IS(BVc'p5&W d ȬzQ]qllr m<}g >~c45юFw뇋1qLNTVo[ o=LFe`tЅXia6]gс r'p:\˳9wB',JذNiLyV7!1g*i8Fm†ed1+XkԖ3姴Y#50.}sݹ#ÐM#S̤'?ŷ4ѐ{_DR=eF9/#.LD Bdb) g/ݙkZpɅ#{LjcpUSh@=o1iø6~tIuwo8R9z`"ӳ)5VJmţ7?URaYqݱL(+7;KVC6L(;~H!@jD4)OCkCаy6C.K;T-IHKMUbMR(&.Md_&1uN\Sixо/ՒtQ*"2.dtUe`o\57 +3c|u0 .1.}n6e-0[ϔY a%[.A@Fl.;?F_,8Kú=vaT.+X{p LYUN)o6ssE#+F*˲䬫2倊ujK]%{e^H6!jblUZ2aШ&ECl;~hXeX<{,]\SH3=^I, A@܃x{ġ0tP ʟh 4=utOij7fSXLQW|RYHEa!-ʤ K'?]g6ޑ^$6un]P5iK!9{ % 7P(YRAQ=KR4d2[إV|Q ҬTI7 cgC1⩖a=5UipVy%m:'-猪1uJB:}jZ<5T ]3W:Xt _yvCY:}VOaaӪr`;h(Q&d:{ZeKA@kYiG5AfуU QpgTNuTcƓ)`a[m3̪\3X&'|Փhاo4EaXزB}B+ +81K3' G2CGYa dm*'.2۷Ha.l?ͩ:%%6'6Y ^z/OwLԤ'SCkRsM؟k AEp 4')efݻ³W֔xV&p:}ɧu/P oNf%,Ho&S/[>z)fKNt :!Lpw0cy4Iq=]*2{M1Q}}.6nMtミ3Ȣ4~Z$L54ҾYi)OXMY!&ެ', f)"hYKM9-nKMy,NlE"O[13ӢRZiW,ؿu¬ O!B3b66R&Qv*,邀 4jNSHCƠ IDAT>}h:]QVSKvh(ډ;CځY#/CN̾T!;b*Fv1hH;agH_L3^ٚZʪ"8G|zvܳZ 8F-[TQ[ FPi|s{"))&wt ɾfs?ټCzRYЭ?}õBiV*̺PdrApPga$  @3! ģ1  0B<Hr @3! ģ1  0B<Hr @3! ģ1  0B<Hr @3! ģ1  0B<Hr @3! ģ1  0B<Hr @3! ģ1  0B<Hr @3! ģ1  0B<Hr @3! ģ1  0B<Hr @3! ģ1  0B<Hr Qر=՛9omA0r] pR -yft&Q s>ڂ`` O>MA@ &cƌQ@dd$9Ν;+|%mÆ 9riu޽{d;ţep &#FPt`U魕t0 K 8zzJ$6AC^SsjmXYQnJ EǶNӮ"dj" (DXFx" Qu6%5E)#gFe˖:ZCD0Rp}oC]Eitſ6F`-:Mka_V= >f;㢂0eZZYwѯ`r^gyq˚I^JA@h!콱ۋo!5Z=,Żuc<@9++-:ןI5OBq#BҦw.|P^:23ZqOwlT$(R} .hJ*>G'まg< Wr?zLg#LEIyA@p)a%%-}QvoL5IsfR.uW_\0b EEe6j&0@~"B=i҉C!d,<}D:IT /xDA..&-㢡2TeXKV3c2c]EXx!嘢p}O,dfl}҃ =f,Z 25*t-ۄps[sW]E)e[h`C}Tū`TEI#.1NaʌgV j}X63|Z,[oAʰi|̧vaX}lJ?pmX=%BFϵ6悑m\Z"5#p>)-Eee%~^29Y222ˏ@\+brE8J1k"8}X2|&´r-Ga5O?Œhxc&>=W|9 fJ`nT"qR"'Gt FU:\y8] <44 nS2G$EvD*E$ Pm݄+!_ԸlڇQIt5.yjٓ'cSOa?_n[MX>Lx/YK+ 9إ!7)AʡTMb]WTgZp=Gmx* IEYeouAAcLCcbR kBh(a1?L.F|tK,w>&N%Z wJJ(ٔT1!`Qw}f?0#˙y?9sVaynV<҄BBoIR B_Y285 1O$Kh]G|NYD#EZZO?6]9[ϯ}EiXEju( J-?$`\qk} p{/8Hh@C ˗ㅇѷAwOVŔNBiڑBW]0,Q$d״ .r&Dpvh^&~Nñco0̚3gDzz:ط٧0rlܸq ׹;aİb`g0^Wbt@[7DҜXl i1Hr5{PCV40dnɚ܅̝%>$[ju( gxM#L@\l&^gί~(`u1n4IP 1ce(qLRP#!HC:Xε2 :ID@D5-o;-ap<()a6]7ZL~k֬ uǻ ]A>qq\|~A{ds:y ` g+>mf+a-R{O >-?;jsjC^X4̻7hȺ#j)-)B/7Hk_D'g?yCdZsI QGD8;$Z#"lxqHHƪ DqHWMFIH:7ᩇ*K$HNGIQ  X=u~Biͦ&V/|{i:lذk׮uG6A(0fܖ5X/}Qs)9+fmqܹsunwk;p|'Q[rYvAmg#+m1 1/&GS|tDI:n ۣ ` &V(э5ΤFؑWcv߂Ҹo}(o5b.Yvf+!OhߡA=m{G4kLvؽ{7rCam0qBP`I) 3H`̡+'!]@c ,p#uFܳhmFD9S/F;N^;`\:p'O}2wä.Kr_o?SNjEcT?^I吝ZJ& @PX4[!be~1bEc^9'!~W!vw a/Ͽ!L 819h~Ny @X=ĀIs!sS@D@D@D!0+v{Y c4DHdbXpC/ 퉠 ) @g  /ًXzfa0T ~n-ERcuG٭ MUrtS @84Syc{ :uU╈HCx;hҚHOnFB_FDdbb)j4 cmԷ^2^_*F(Bַ;ʭ|CLXmZPbf^'gsǩV9ۛ(m9ƭ9}9j .8kݗXa7Da f.˩zC(Jv!FE?--eshn̾ <֕^FοG¯0ސ59N5mT)ja#/pYN Œan8cUF 9 {s!g?aXӌo$<ț6l45|5RT=~.9k;X<,s`0=GɃ9jB|CKqy{43 v(" " "pps8]ʅeq#*0wkp{OB˵`S߆73,E֪bM~0PӻdhxH M@[zr EXkaoisB^A%% wlsgxCQrK/[0au|@H9`]:*gM@,0{w  ?bj}?"""Kr}ĩO?l"9u~> oҩ|L0T@^_@jFkefatVu3YLRxY(k/G"ݳ<(մҒ*1hk]e  j_{Yj۝uHkD-iz Me/"Zw4Re&^bf '+ϥ> + NFFeEjTףd\3eF6s6&^0ʯP^ڴ <}#B}<_22 =N԰i 4Pe(u2Z9F3h$aIE'O",C3B)?)u Nuǃ/ *D/)iUE]%h)ȾF!:`u%Lu:Ϸs7|k4Gŵ?U/}?4yq>7.nl z? |=|_,kAJ0L C3!骁F}ԍOA\^ߜkCj2~2 mHgSh-ޜ#%NsW|z( odNذtlo/Ak(FpM`gZ,1@/]dehx i6(kQ*V@JMvzc^IVG1Vx'oΠo}W (2|h-7 wuMw}=&ÞpmP\چڏbU8)@.^ T@S]VD| 'rJLӠ 7{vBummfM\}e?lE4tlqi${m CcV%Ds,~Da'pf]bekydk<SICBd嘁 >X&p9"< WpXG8,OF37!ߓ86j_i:|+|ҋkZhuiVΡu -,LRy{15c&^vk'Ngkqmdޚႊ౏|p+7׺x=|.ÖLzdR*lj| -+vuxmZĆFNXmBdno{2M?O&LO "xTC_PK;ۿ/BP rsS- ^p#)z$(++i u2eêhKɜZ+Ո VZp YIcL,](]ƌt I0)fe,u-5]PU~V(G"8j񧌞Ɓpw,܅' *NYf{V؍sGgi I.CM$\oAԅelNLWR? N~t+ WϒcƎwcc#N1i7$_פEAXH@9sG0NX),բ1sjsxޣ|ѩ%PQG$>QSN09Oa|!6scӷOrd\z<5@>NX9W8H4aS]3qF[Arą "' >]`/q*[Co܇E]d r2id z~&nj[1ffϷ[1/.;qesJ9…էrr.xXe aag3O=q);y9Kkb#)j67;P_h5#u^Xbׁ[E`"m(>2q‚Nm)tBH0FL)/NKtix~\3j2#z-f(Yu8h0CDN:EF0*+GB܁+"*z\](^6o4?ˬ >ǚ iRgy2+IӨC@J^Y*3ʁONg?$9MfEAch{ _l͞BJ?a]? _Oa&s©1|Xf{Gnz{,hͯƗ%#1$;Μ9CG[0w\ yY2c6M06^A"8LߍoV~SCј{uk;( ď@ʝZ:h;a BNwS@er@d >怮kqq??-qH~Bf6s{GϿ}?z|2XKt>h5\w:V8mm[f;wW`Xn~|:i=CxTL ɟ?\>d`-~ffnhX]Rm:t<޽{1c -NةG碩4eu~iYiR_bɚ"m#O.۟o8N.Nf.o&;޽NS+N AX&Iz; ,ĎFݹR+J[}YuljEmB>X?km@|\\3s ڲ@}+^<'~m_XٽW̓9 &.@"6Ub ْ^|#y`i:vrS8h pdP%גB4@g4Vz9qaqx΢a'{Y9"䳁zh4i} T6DeE?*v%+lq'pֹQ#@hl\:@Frls yʏ\6)[AQhOD*s噦yN:'cH2K@g|o"{DvWhTD@D@D~+-v:m3B/ܬ$[T@mƻ-ݟYV?|P IƂ{VD?٦Aa EC]J : G)p]-VDkuS1hjے5j)ImGͪEF|co 9QK~e#Z)r'vr=(_Ev HAMY6Z)KC;2)}Fy|[M c%mP9iցE]]dIZ- Ž䵯Am(O$[]MU&K$sbzx!LBuK h+bSq:jK曋6$ŵal[FmZAȊe:SB*g6VGJ8ܖ[{c?'d7Qg/} RoQ9,)PVP6Wȓ?|5 rNNu+e?Ch<,K;롩*Hlt_44_1@v2Rn;)jp`X} 8G;hCx%VI}LoI1_XM>|=U@6 ƪ됝L>iq[9Eo߽hCPKJ!rvQ=6#"dʡamKY0 >) xrt+*QPf47؁_0dC_ %\86Aɪ ;OGx{OV9nXƬCV-.%2j*KF-;Tt%ZjI +Eޞ <'w?̌Pk/] >q4X訝N:X+=yZixs7.)V@F ˟L|loeُ#llXWb"0W]< ]hފp"ӂ8 WMOh[}sx~W7MB=Hv`)^&8z O*ExCt,?WIݡ(NE!:R܌`L!ţeef"xts}߄d(._U3L!z3ѩ0D/Okn̵$7x3rq-^؏?P@oj#2 v4ee8t RzWZ slM<eMAo^0 ؄TQ5*?n W04oVm!ITx}SNEƴcV?o7]mۈS)yـHLB/,lRUjxm)1kv]OCJIRʝn kS]H__ej 7Ҹ=M~Cjm!v?}9L.UX <ź0%Җe.z䮈cwͅ-.sޤXb'rZTTOH!>>`ўy-((hHV'Lt}JL,رc1u*tdD_ NHXׂ£rF/<)QOvΘkX==l/S 3$D \`SopN,Ѵ;-$Evsꃎ8F (T-6|jRZSʠ)U-WҰdh~Mɐ<&+UfW8W0F\DV{>q8P_8rFi.5-PLI~ ew%}鸤~Ҧ?ŨhA<iL #d x9(@?$̑0ȓ\EABk*+H67b mZgVKtJFn~pBKIxC\߱>Ĭ 5ɓ$Wxi f/_*5W2:zMM3Ni+6ϋL YO~n${܇[$߂)d+ǾC+OvpX~t)HF7>ZwZz5@Kof'Onm~(n;4a4lbǴ'"BC':^㝼I>8|!M%AC;oҼY.뎦 'oKxGG4k^RcD#{kڨ};}MyAObʯEEs7$F['---Xh?1 zan4-hjj~׸qэ!u-Gnɏg~»{3;>#ƕ1v>Aybb>F9zƅJ5Q䣅yz D /Ww:avۑXi:?-%t0>͛sT}uDϊcߞBǸS9N#]pyQJŎ\ȱ: Ǽs|Yԑw$ 2F7:~aL `9#]ة fHl:9W?+b~G[/\}d|0pdetV=^^7Bit|;5<7iӦ]^WQ&b3"wNr(3>q5 `.;/lN2ѓ$?V: <?3Z傇_b si_y0tiEM 02JOo#zb{Q'@e^~%8uqAGPѱ ؑYWWbf+rq2Hwl ÉɕqY# w ]fd.s`1D9raSBݐ҂T}*ԴQB2QΝkgLkzt-:kZInj_~>y?Is 3m07F ,ⅈ@@1{Nlka4$`[~ɛ9ɟ>}%I8od7U>@Mtu@@$2PٴY]M8*ۅɘVJƴ'5y2Hӹfߗx/"p8|0v6/{t,KGq)HGSznoiitM?p w~Sc4c=@9cN!N?Sx޷.G.h@)`+gQ@X:}Ϸ_n% K bab.ݨ+BM!~ jG})R롩BrN==lIQffFA7dND.\kq}_Kl\w5oABr_/~յTL-\̫i=˽bh:֗ yNN<τ$G"8]\=˲ٚ3D7+մBQJJli7-а><_;$f^K9Q0Td6soK@__KW]3 Wm`Lć/ɲ&ǡI ]vzϞISif/XN#G8!(wQo;rM8Zyj- YRшzmǪ tV$P'bu3 O6uEdfPn6a!v"I]ZG֯@\N0/C᭓ѲQ`7*֣Shb=E'ͽ1^,Kqm,mA 5ʞ|νWO Ohy:SZ&vIdd4Q }s9`w)< =$e[=h+ I;2s$ȮPx9^BNᦀw{pG7s ~P5L3P(^Jz4HQH$k ay_i*1"Z)m}Ag5x }Kh4iLa]Co~&DpŚ>yU|8 ITaxZ0oR ;@@l$|O!h]]LPS&8h'aIE'O(s6=Jd /Ifbf 8,F5.tdk VϒAhꍏq$t B%_$jӰBK^0hߢv7jjGR~ZoOEG#y"2 ސR C:DZIJǓݕE>QK/! 6$ |t<şA\,?%j=(.V vb]%3žzXdVK 6}mع!.(6 a $k)i[?w?+lEk[ѵ&t׀7^ޔ5;d_ 蓼ফ]}8| iJRxӔ˞WCJ3y;]6g̑ߣ*t*3pti'=PEGdP &Y"#_soy:X VTeb,S#O7JNfc=@aP! 0̫ţS.LnP2toWYV>r%(,WGn?xg3a7Z$=L;#8p^+oׇo F/b4`y[aXgJTdyJT7G~ɘNg8-9 DQػ3oh\I$g]c f?B񈟑a=/m^, _?k/b$Pҟ8p:eH>$M H/JAҿ'#*$Q32 % Oџ5|oN)d+&z+P9Jt{8#>H"=7y* laffAFdk _A&}c8eӵ}71-$Т |Y6hv5ji6Gd2v6麴8hƴPUz4N0Pi=];G҄|PA]gH[042x`px#ttX }e “Hⵈ@OU\:ޏӹ#3vXihxX-炕O`vуćq9H SU"vs KL@SJ @| u1ΐDBB,?٠12 &o7}OFXis]r>?##{o"Nt~̥Em412.՛0.j^D] $OAhT:h`/Յmh`uFZK=݌"4v~-C<.Aڿ0Y|!':H521U<"\#+R {IT'p:Sw% ra@%c4 @v#!QD"8&u\'q#"Nq1ҟH@`m"z/gz=?XrdPW+͌H](0u=jPEՉ{,SccSPw4RL؉h6ykC߶GEJ֘Pmό'O4elר*,4R)tczcct+t>KglvZFmg/d۩5epO]UyOKY!I^55tоʻe FCݖ%XV%0hUF9g( =0f=j*JN- /zgx(hVŅ&z*8=8 ˌgq JΣܨ9il,TpeFp5Q5r>SeUs50R cy^ba.:~b=G".".xs Lv`2;MJhZUn"#I]8 T \Z}-FkB0){T=[c;$0aT^@mZ B}޷Ҫ?4y|*,$f + BoZY^M;풗~UBj>3Lx2 tXTFcbN! JJcsY \nl1ݳ6۲ cU%d30 M³RC ay&WGa\M6QŅ3Nyۍ|eLB욶:BX@f4 ܇=eΈXXs۠5Ӥ+W~D2BqZD\~^kLE!F㛏`b? fN?uP2,y6$ l{uȞ L1Z?Yp)RCIH6X# gxM#Gm- r, }?)l8vFlDiŸp,OXpQdJ>0Nn?j_EӰ"Gw([k_cOP[%ai8 Rw_*@IK3Tע'Մ4:f5 L`ֺ"QtS?owEVlo9 q=Y[E7=Cϊ; :m`p'pRM%9֞jkΥiufb]m'aD#ko:n{]Yb!nYN-1"""OEE8Z)DS\Zo<& +_L?[z$0l#7#z YĉGh%E0%tYG/[ɝ$!L=0%zIg݇C-Ӝג`b%/d=7~L"ZE :DΈ5Rpc/`t>iJ5"Ҩ\Dv-xf A[k$3y["~m& ?+!W܍[8c,ZXr]VM#̕jwtn Sґ jV">iQ`k! KzICL'*CZ_89j4'8z<,Ph.jV [HIjvcPMEVekXT?"\[FFqީLEھbt| 'C5Е |x![UhYV62օ;üIК8<|\ $6d̥-+7/͔j]:MBUm}H:yuy-JY`Ӏo 5#T\[7¬h, ? p}aB>>D)V>b.ȧjӷaY711ńe NRGڵw@'uT{?G5~7sDDDF,c/>AcϵjR7ZEbsY^6hJ|U>T\ս￶@! 6 %Yܛ?u0&Ċ(5E y(.(-)-]rr{\4º?28Ś1&y9wY?ڠJ{**Ko&gh)'A?ׄaRgszvoupSn[jw`wgqKnxFoc00)v6+|xENER ;`wB o @㴇Pn/ò@7yВPi=v'jo^p)!R ; ۴}V+cMfSnX}X+Ƞ~},Ȗuɓn֚r(GՍT/ M{:~=v ҇^8!a+v,߃CV;Cx0(LMbL |D,2.vxFiHoC0ƥF q ǎ{Q1r z{ Br{V*ʍ%^D y#{@!⚅ƈCQfxRGv{Jxm͊esS_cQlU#Qɂ0|Lbj *V(hƥvoKD[xUoJl g[UOy4~#`8Ծ>7:1iF=8cV}uߑ44UkcgD3^r{*ob"q'FA > K 2&& t'N`0fU{\ 0&Lx̂gw 0&xT`L 'Gx.`L ٲPdIaAN*K_߅0p,Ը-d:B348R5Mlu%  dێU:{:m'd0={!z}~NR4WgL 0Y$0{3!D=kv:D{Ǖxf"QYn2Gngd`cSv۸ { ,;dvbՎ)T>HًaqU߁a0W%L.22~Pc>aL 0+,xPIO kѠm.GA3*4MT|a. ,P`H} JiȌc&AL_Ռo27\t?^DQE(_WtBwm(4b;!oit 8uzpwM{-8 0&>;?qfҁ|3e@650,HVO)уQZvHJ1E'QF{rORw(]0Ol> ɒ6ϰ RjM㝸?7׷_HN'-v4P'EHi 2Y̛̅g5=} ՉL},\`{!kڇb,;hM[CnbY?pY5z&a>lmz(\Tɺd  0:؍="YQsD'-%)2pe,W6Ů(^ ?gЮ2@zpoLout֠Pl]OMA"1iD'=5*i9oBGݛ(NO;{2&TOE¤P.zQHygxǙ݋f_иI`)m#W5KTmC ,YN[]#;"%XZy/7ka;,*Lq8pBܘ/pU1K6=D=ߡ(\T^ ΩjZ5{qqumFdsIk{_[4?"œp1o,Q^ɸ=t`,GA$MAmRQw ]ϢWѫhr=M0%SBkw>6HE7$lFk&`$Hnr-xGeXDm4I`S$0+F_H N~ÏkV{KPkz>c2hk Ke-8).AhڤGi/0!?KKr'QX0 IMZ csnG"2/(|θ>`l"'B̋+3ԍyȞTa˞'d gzjy}]Aw],4FA“g4QpO 0&&C #g2⭛kuaR1ԗOr u Dah9{i*|פ[RһxYۨ.9Pr)V%ޥYj$ѷߠЋ{饓#xs_P Ulc1WEJ#qR"4N-Ç՜B5Q$IX}g!1G_we BS(y V~.VvΞd/ (b*4 x[U߽&#+utAYY>Z>臷b(`8|`$0 ^-IzI3u9:x0Dy0mˤo7Z&p7[٦lF@?:-{rʿ_+U,߃z,Nqm鑙Y[Q_Զ=Eπ]u.[*.]p=2ܻhеA2bbځ8}]GQcS<Ry$lAM}=ŧP6%ҲPϊ<ʎmڊUvtTBN 0.E׿oYZ_vdAg?qV]JxhRĺ&_![ T>}E-HH/3&@ (ill{/^ .~Ks^U6SuEkӾ zlWA}^CQ6So8_%;>VTٵtN}>kkҬHPck*hwMc?P"JeYuU! oqUvO'vwy3x{:.[o(&fqߌbUt +|fr5v~SGϣ~ZBg!¥kD&S.]D^6Z ssakN1sԅ#/j-N(ʅ39EAKm2'̧YЊ h quU 2!YuaiGG]C8;A.ÈTڐL"MoR C)}ԓFh._)"Zkb#/2.b3Pz\b_S|99%"%{@W= 73&fN8AΎ*33 ڪ`\[u5&`L`Rb)ä~*))30_Y}eL 0&pE+Y;^L 0&B{Ń.X .i@.4NM Y9&%q=$TOZrYZ"/$'S:(2&g,x~/L{)@[dB=oM/;jzfOG =l}iߧ|vUHNew N(,PpH8R&ǽMؓ =zuWi'r /;3帕w&ꋾioTsx!fu '?czj2UG@8:4q`,(lk…~,tcxqbc?NG߶mE~{/HA!ߦbb:K9NHxOg}ro3@k*Ua7-#s}Bػ<8v %ZJ\MC'qRѺHQS{\"4]>t mUhl1q}.dVI ߻П9 0&f,(QFF΢Utvݳ(x٦~ ~J1Wh2OzI]v~نZ+TGۊg!+$F`3`Fe{I+*|JhXBQBr'IFڷ^h3CV^k?VDBk(@^.mB'X3? ?h e${϶Mw8Qo櫟Ʉhq%&yxk2([9z<;(Y2%5. 9.ޢd{BEZ7_H¹f@]0#wY >Gdj-dPi% 7ΓC{DKzU7u ;,f4;Hy(:QmvfN\aZzOHui)G{"2گ)zaWE{3QMm>bX*v`` PoG7y%)3m~q~5@:cy.ĞeZnc)0!e\wQ܎fRP-ؕk`L`V̚~mRhS~FeFX5AZRl2J> }A\vHIXK"6 vdgm#; h4!s9MZ`($˺n) CKЈ, RV, 'v~%A{ׯG@3@!.źjTW?b֧m_$|̓ XnQAP'~h-VlC&6=Gg,M$Ku؜e@yʌZEPymj9 ۚ\krJ${Ql̡eҁY [F-1n#OCyE/wYrmܵGBK`L 0"pR$.]fêU0gT?v#&i;4Hq`EFqO֟aFq;qC2M!M+P>!4t5& řq 90u5n|nB4y`L \spuE}\Ǘe/JB&`L$?Qt\{Q!q/^ !T( `L 0&7pK!.ZH9s&cL 0&BbBԩS(ѼY44q+b˗MԆ('&`L& l?!v)]lY\0V<$|CSa@‰ 0&: C VXqP:QӆV΅qi=!`L 0`3bt7MSR_G`L&}{sL 0&>_?`d IENDB`pnp4nagios-0.6.16/share/pnp/documents/_media/bulk-npcdmod.png0000664000000000000000000025203311662503006022575 0ustar rootrootPNG  IHDRH] pHYs   IDATx]`UE>R K(RD v]ײ]tU_׶򻿮k]{bPz 5Rwfνț3s|̙s`C8C!v!p8C! 81C!p8!Рv9C!XFR^^FV.C!p8@JJ 6Mxl߾6m$۶m kC!hiiitܹo߾qFQ4Ůh]T #GEIE=:C!P :3P/߼y3UUUQff&uޝrsskInV<֭[G+VJ֭hGur8CU"ed֭qFڰa &Ӈ0`S* , L@ϧiLC!p8MFAV^Mlҥ 4oQ\\L .g24Us8C!Z(++B)!3V<,^vJ{elk}\C!H6cҥAA{^2 sj3*ׯa\S[a]C!p8vډP (C!p88djgco.oàQ:g˘xC!СC;tiǖ-[(;;IEW^yEN>k]b@1cc;0LV8$k4qVs Dc djk>r?c=v,Z*4k,6l( )!W&NH{7wqFBc*1RbʠnGoPԆfU׆gGeoACu c9Fֈ|4H>`R| .>R1;n"3QGnfSb珀qo;y`b~'2ҁ4\~i@0JҨ! P78U?{ǎd(<ہ3<[;=R)R3ϔE؏< v>0_k*0P.{Ÿʯ*V|wAx r,3ENtY]vم."jiI7hWؘW_}Əߟ'"0M"b80 kiw5 9;;R^(K߿A\M'Glſ]%[17Щ:bܪ4M a ƍLsҦM3&w4EYevҥIYoS-gCu6Πu6҆ 2z5*d6/8;hD#^PcT x\wB6?CDkeB]̂/ SKbJ;PLJMC/;wNԫx!2)ZG"Am5 ?QLDp@W#`]GZelj46m8O Ng!F"Aqf@@`FA[f_u>*QB4TWB :"&=D:Y|$/`+3J'3f|L?]z7^O>Aƍ)S~Ze;zN"mkM?Z`p.'LП=M0g@~&A.][ )I !773FBHslwo{ۇ<aHın)SEȿ%!:olqmڈGzkB"܋A?G3_ H,M)*)+MiW}7%(u0H+e1\&V0q75DMFwy'O &е^+gTGHX]ێGQ$ճ7w,fChJǽ&M }ڸq#_niNt _j&I?o<-\f}3KN=h$i/[T;顇Mxʠ^E8r~@))hZT0"ŊQbE+7&b?vgw̧ᶧKSo*/YDqF%t+;25ԷO?c*#ꏴQFdb%Dǁ ١)h>KF!?9sk drsykAI {£dԧAPԜ"c!)ϞAKYiLƷ;z 0R /hji@9̷mp{U@.@;yVYQʇL@Hz`-6n\/aE$^T472#Iˏэtd/2ۿq'MV!C⁴= Ɇ?+4ʊph⤽yc1D(,,z.tG<y3 2%͑=SO=]:_KN9k; Z Gcp $h AoR4]1r"Ķ1ؒpH!pϙ#>kP9sfv|SW(z?Ҕ"QG2q?)F[0]V~+`ٲeԏWvk+MLhnAz- y#qs)ٳ7vkG9;zA mVE۷٫IH{~?yu›kލAn&h  AjdS;譑Z0D$vwz~)A7$t])h1)Ƭ CYdQoO@$zȾ[zw??mBS+ i:?̣K yX´kzB!_2yKP&;w9sDRq9&QF!gA_Aԭ MYНH%T6tym&B++/ҹgâr{H1f:ēG~E8(hNa'N8Q+z饗hرt 'Z,oVxG{BT5ś}6]~x {i9˭~jk*jcOmS;˭~j+AXnS[rJvﺒMnEwY)}D DZHiW7m1KcH`Su98,:m(Pt4C>? GD@Gnc9e6l@]˸qxn 0a"M! >xz!ÇuAA_O4w^)˯BVRNDb#ʏ*/鍛G$xG 0A 8a/ G6{K8gѢB*(x~:9r؉.J8i|Իw2;<9x$9G.~ѐöYo;B{<pt4~mz(VsWZ~`ewh52#tj`"Z,G2>a(-C m#qx5!k +g[:u()+8gps?=%h94 cD{~A@?ezӗwof-|)D 4?i=hӊ,m* _d<`(ЁbS#XqH _~֞Nz;O3<+"J0! ?X({^~%Qp<?|/S@z&4p p8NorQ~U@GvzF1tP&iOQʟ`Qe[^rqZeZMPT/Z2_ﱞm#ѡHo;}4 ^!8 gQ b oƋK֭;JYYp ƏA?_uD9W M@'3GY,L1?y}{+n9 m6\„!rlQk""N[V>0sR(HŧN>]` =z͕lpVGypZO5̟3p-5kSFoZ_ԷYWZC~;W:ho_?N8pB Go˭F!yhL[eȰaydBp-7FxJ׿U.zz]> ׽wŬ\~+HS(ђ >c!Q3*IЉͲPl!J+?~Yۼҧ˩fI~Ӷ#4CWxC[_1`4 6cƎwx9CA~Gω@B;R ,p_|b!C[Ggu̩zD5z.[N>R8gpO9Nyv0-p-s4ڒ3}Ay.HTVUZq,߰V\]yBexNۏ;) X"4 ~w q䓏骫r+J`Ԅly3[Hofd'V*ye!ؾoiTe3^GE@?[#;8#|8 Qmvj ۰h 4S;zK W-#BBToy1&lu8@LdU?|1ej_㥣S$8HE ZW= ǻ_Oa0`.Fj0%5ؙq`G SeKW3QLVjAضs ;T5)L2ͻ#h! IDATPd$.q@vYU)~Ѱ-m&v1JG?q_O@|)fxp5?v DӥO; a F~׻9RsDI%P, bO5;޲<*=xy󦴴 S8d…ՓO99hHH^{->tL'ACzg3qu_8tG&L? 'b/IKx FaDn*RҪ*#ɳlm`ETq? _M !*\5>O")M%mKAG#S<}kѬ5xq1?0{;8[-x\R:KI.xhIVöqJ9GQ vR:DC GoQe(~b;-8X O`? 1:gTޮ]{>: z䑇8`zƅNqxt,bXFq8bFj B{naގ~&SJĉ|LYF#wIx;Lp;"9#mIn Çz?Raa,݃ S%EQZ~;3xi/*G u*.LOHKL;d-f,,NxA#~,3xq{tc+GP,p 1a\nŇ4ѻT˪U'(G},i8s"tp(vŗrIлWwyӢxdrE`%\zd j|5rԵy"O/Bg5:8H^ؑ(,|@lTn>, <1䡥v7Z~PPoF;g.=S0_~?xp 8[p17â[  [JǣҬ$ ]s*q|:l{ۄxpլ@%_ڲQ`R6W]y`gQ#D+4@qsN˖/\ "0zaaBf6oބ'5glI'R\SY8KWXIxz~9>#E#"8wÈtӺ5?X<$Ju ڶZ3~#wI׏Qy啗'Qtn,5rFE)f4ڃ"#;c2 f-?h?-eS?E=DbF*a2 B~m! }:]@|EB]\M{`A#9z׶]RVZΣ ӴxHH76N Dwf(?I8~I 㮻>{'lWm@\FA\[:rӸCOʰE!haNS/8dƍi˖-19O@!qyjj}nGoDP}0 u𮪪6/L~t*rBrxx;dMvjk-W1|BwPJ0j6`T￧!tΣiԮ];~ᩦxR55Z 5#f8vA,wy 3<\XA~Q!5jTMxaoeOf\+XauGolҥKi|lzW!h!*> /^,S.!vx*DF@Q9̇Q."l?cos|=ҪiP

Cю1,24 1Wbn` vډ.r{hڴ驧nP:G`;~e ? ~'AAD[0f .; UFcp駟?? ]!UU 7޿qᗝ%k=| :۶2SS[d҃Z$WOQ{ZCP ⨍GoÏYX$>(;rYLzAx2:.A¨'T9zH߆[P}yRegBSLCm%Lx {JFpVL2CΛ70އWa쁨0qTNGKBY|foF}T@m9T;+-FU^i-hxq^eAbd }9KJKx nl/q0sԍ>({)o}5a!?̣ڋ;R`F}Wjok@Ihijip|`S1|B㧴|*mYٝhҤi# 5)??S\6t[;vdJJ65TJ@R O*`?Ng-?[Jhʔ"DM4i+y1 !օgS:}'\qS*]re|4y)+lQFiuʿozO'4 #͟jRz\a'HF/yߩ[~]r4nAԽ{6 "LCذ}y+?ҮJ#՗:3]AAKr췩c\~G^UUm+I['S>yTX6ml?E_@dX?ɶXa+z'it!RVXIK-85Jv Q`[DQmm+Ïдk^S}qLU KܐkYg;h-(~E@/RT$q_o/H(ܑ6DޟN:yzo~?SWBՃA]{xhߌr $Ptw2gjZbDն S/:gkLK 4d(bɿ?Χ~90zeN\wSO"(I>O+lY遀$a12/v/a_3=C F<3^T ǃ^_2ҿ6U^H3͋@zz=ٴޥI&\uͥݻQ~NջY2<?m-.6J[v!_T"X0=@D=qǟ GxPFͻbsΧ={'ۏ2pBб}7[:묳 #H`ϷEhLhgn.~yK۷ްM&I4~q9J Tw͚Ӵ/#QM7@#dȦN'T372K9@+`Ds(hQ?Fh|^\NLtpZm9txǻ4q5_*_>hPAJ F"_1y!lOTvX2r].|B?AF?ym:ch^@ :6yVyI}oU2Up ,2 *`,Yo= pQ~R(K/ѣw@' 2"d+==]$e%Mm҂buE'A6vgc?o0a&XsУ8"Q`VF ȓv [?83[6DZ[f{ I <7dX0^)5m%w`/\b il\5m߶㓷g=ztyN xH^oӗ=8y_ ғO=# ybFyA9έ|(;;[c4",ڴi(Qad 4ARVu3 ESn(!(H6lNoz'Xhn800@?~MAoQLtmXh 8xxnG'}W }K ڷҕK^;ȹ~9C4gk<3|s wRi25&<¼ |etP:˗=!/Jt'W6`@oM)=#t#[ m7nxI Nm&m~ PAo IV6.tpr:$m6z9}UCA hh>|`qL:hh# Gd5=C  (E(O0n,"<Ӿx!0*vpdwvf̂U,QF! DL!Z$v+ iWMF2e +yu%voS +#JhBG}ҀWS.q#2Z~Q"ٳ.)YѳCڭ+uj1ݡc„wtc䛵9Kyj$ 077?;YIy IcTDGM̿IR6Hǒ%{ԧw_:txyf(chذ/Pqq Lb#}H5x@&E7#4Qql ѣL|:9 m5hْ'0Ke^»A 5420ψdT_72-H)9M-oK!22ܸԟKċĈKPugVsIt;-U &Ĝ|Y. #%؇GP3>`xui<|2 Hq?;Ap!^'t*=tm7I8`N8~78}O~""N%QY&[[m9Qf{˯q#!ؠ(fU IDATI\WXˢp ;>w(SwtEQH" l r'lUBLs+o0Vw}/]+HHG; c a!ͭ[6- W$1qM2w:O)CCo떭TRGPޥǟCu9F}O܆Cs2p6e˖,ST`V_HL_q#7W 8@ 1/^-Mo05JVQ' 7vp| {097'<J%~Z aiV>|syE x|'#6X{kl43 KQ;(o1@i:M&`0kgnIi' 7i*Xuůg\@hmP"a[xU[zĈ4Z;woZ^ ۰qag*+#T'wѐ܄9ycS]_v@Mj %_0 2Q?^ U[IGX\qD#TdCN2ze-@9<3E \Cs$]0~Mr"mHVz}[aV+}]x߿2mOY E%ci2 LM:UzbA+w<  4*-^qpv P×sS̿޾nOWUZq,XG:#[JDrI9!'nS;7/V}j86QU9T)n[(zf!uNߝU P;.ZV*Yp9u谐:X˱} f4Za=.Ke)VS*1"/ Eqݙ~IMp*Ʊ93qE <Ńueli螌kL8 Yd?]IE8/wRvKs+$97ilVΊRxl3w8E75?:Ng"Wz%_f $ ?)?Y]G7~1 "|u/ i&D F2ыT`!#9m]/̿[1|6zG?^|T40B\n0&[SB|"`+ˌ&<6fWK׿o8q+DFsaP0OxL0J ɗL z 3c_Uo9fel0E$#yIlS ^x@m+d^ 07IJbM@f`tmxVO BßM2KO"JeAh=w҅233h-u颷CRAzL VH[+Jtz#U\`Ҕ.^D#FLv5OEE-Xˆ ~eSl\3 PTU_@[u?O铏?`yQ.` "=u4Leg=>^ k<R>5Vޏq()]CCBn-؇dWL2 k\/Bz/?wkIPb /96W y5Nlz@YWy WɊA '8MP¨v8ˡ| <.@.?jqDz/̹E@ [[֜[AAwUȑ{Fבqs'?DHBz};"4rI܉F Pa1;)z 9cɕFw[X q&4zQ }:XB6IrG7D:0T6ͱKXx 7+>NQNN9a%$}"CQuW|$ }Vv;^{B|ɡYV/N7oe4~xۨkW +jx1(f4r0hoRH:z١#;S &oN>(=sP=F`ʔ)Խ{wZ~-[~̢ 7ƍWozG<x,=!@E`npĕdNyL"25pn1 m);qi]6mD%%%m -R֗^zV\Ikip0Թsgm N& *VD`pzz?h8lG<5dz;;|Z _#F6oLŴ}vYak;uh^nڨ"` ̦Ѩqb#!C־"XU|M@A;QTo(jy.nn0+Fڸq#-^,QmT^^;x}G{/F_ھKjxx#P:@G%FN6zPŞFi!l%"9իWJ7KXШϜ:R^G`wu1?-3(3N O`%B`|EP0ٜ%hpp|I<Ёx=F:SE[SjF:=Mw vEYڄcJSֽ%;1rssy}BOS-Ӛ GlݲeK#JH0(VޢTa(#ƋLZe_MgE_z.ì`-'>݇ѐ5_iW}*9/ӭFhŧcm9N7{Porzަ>cvL5R:_ײ0`z'=e_轳藷B7C:n1oZ[::Z ?re/~d =uMq9T|OHBn6N_Bܙ=G;f-t0(̜xީ2t%IkWESΩ5Osk$JHMM L( NKkNY/WG \!"E\j{{иSRP?@ '0}UgMJ's?mԷCAqQ*ħzDDYF`ԑ4۞F?7PFTezsw@'_J,I8"&BD;afsW\_](CF位 DG2͋+x:)TᯥQH0btXў݈Gc^*m)6ƤRޕ*9b8C-&ހ<AWہ@JNNt=UR#9b;3q>Ŏw̼>g,g#LĎe%h*S5ר'14(`l2 J\s<7m;XX-BWf`4*JvG6H_$yKXߏlC} /?U /uey{5^(qJ]<\O6(E|}x%>IU&3:[ \Kl\Bn. r!D <Ńsǚ #͗y˷B;Xq8g L?j<a:BFF7byk5,XB=wFX`$ ?x?ZNGy^V,OLE}ԭyF5_2&?:3|筠bݐ$_v }чrxp(!ƫѮ~NHZsCjeÎ~ckf/F6l%Hħ/niLdrvM]u rz ;,~Ʋӫ}xg Nq_Ur-t˙Q6SeO1N8G/!ÎN'`8 5nF=ɶޣ4jԨCh*6x/Ì!ߜՖ`Ħٶa&yR=l[0x ODWWĚ!O?q9< +zψN$= u`T (h@Ppk*9睊t}[!k\aAl/w@]A2G|Ҳ˪M,r+6\3S:rmS(7G#xďڈ '\޿ªŨ揸VHFz O3ZtGw|3^maCqG)>q 4 ̨G4Cmd' p__G|zdFw4;=;CcfA3%يjM2&McFvF ^Oİ%.Kb[uC5D#\#z/ʨGn퀿30O@mR0vDH*'OdW24L] @FsVU!#:j!U<4ܠ]$[$aQZ%!̈́F7 $uxv!)?*swN]!p7!@Mt6w].^t.bm;?+q Q(퀱VX1eD8lD3S4CP 0't*u忌N4tXfSZ||v=| vEEKik NeS H"W_^}:_IVr:gN;N*ɄEx+XG5U0Fn?O&9:W߂<tGJ3:CӿQFO24*-GgQhYo|ԎjYV@lw[oۿ]tv>92ZpMM|%â[Ӊ'FGJ= :i3jũx@}cv- @>K Z}}ᔗG=2>[B("Y-8[(;{8}ǶӤɥtчSqqq%hBScecޯ8 :Ͼ5H33 %p"#xS@Bevk@GUvxw#:δ > Vƌڧ[<W '9 ʊKEmt=wz*++htI'Qǎ=h0ţA Ȅ k`s;DMP[gaA@t xʇUu;c/qmöK͹'Lvԡ qxpjw^EtDw%4…?V 1cF5?ѺPDdZW\i-@fRw+ݪ׳DH"%]bJkׇHFh@-L[9-T@xl..q\ˋK_ |=w|rf1M4ACzJ9RٍxxNԪ-}0`@/(g@h@ӅǧhQ ?xJ$6΄ ǟNؽby5PNݨtOs&=#K 3#)3싽6efz}#u! mCJf |(LZqg3l5pYO3mO[6;A=gDo觗=#bv%zw:QCBkrڜIhNDp4Po?=Q|ٟG-Ѵ *Bn?y<8n_(At>gzSN#ec9CGHnbϨ5_j/Ma$Ip_"_yy-֮ёMFThA!/;xxz8Z@Z ,F"uO-ѣG7Gt ֯#JmO#C&M6GG;}۫z/#ѤDY9HCP1~w'ǵ#deOr_7̟ٙ3:0No4+>'3蓏M'oLY1곂J`DcD:yL%e!|y3Ua*# =~%h=j BS<"E#n˜86Ϛ(*ꗬhʷ ϊ[|woX\8 BUk uA!!0uFO+*Xi#h" qgۯĚkydzV(n&:?bLrzH*w̿]/N'3[LhsJAոgeH˾vQ44_g}MtwCt;1jʯef˩?' ͙\~Ջ^}+ 0mOga*3+cF6L &P_OfwϘK)=}6udiSu*Z})}hހI"ю2}Dp #]r>$3̝40tg @؛z',\3h, ml"I|2G_ _' ًkiG<:zm7$-!])$sZ;(B@z$-? w)>&մd42OÇӑqFrZ.C눏#)?WH sz_xgV?0]ԇk^qۭmeWS2Ž~UKFX-.kmC`>Nj/Մ^?ig },qR؍x0cн< |ÄC>k=e-P%)j,S H:煠ϦX<*~;L_gE8:"!<+~?}4(@NMb(-B첥pgo$0}(}X"6FL!(qbcRILf׺`ȩ FMٟ,"9v%;ɺ\xnixm["{S,aWUEAR$_sƸXX*S[+sK#` k鬍ޛ􎖤$%2\+gY*;JdDIwڃėĎD?nK/>TgvoD&qȕ8ڍK_qia0ۭ G 0u (FCg/(nl= <w5r8ʁ22}y]VQ%$l.(o:X ȸ4؜JLNy*59ߔ=JJV3MX"ӊ'N"{"e,඼\f׮r ,Y0LHXMܶ]M;q֚ڋ8En6S KȅT{zSRo>""#{Rz/Z:3/WO'!%g饼#G\nZ5>A+8;IEoEy%JJJ,]v?[)7 ,*$ ?yQCۇ $2&<;TQW(,U4~ ;KiU$Y`5%2Z _&SdI۝=W^0mkK\x$Il6T "^_'}ЯC8!PYY)׾O_Z׏W%>UU%V{ƹr^tфf ;Bx:0`\mSr\ÿ)ˌ9 CnC׸,Pt?Ǖ_5@@F~ă\2$k>TSZ6d"kb?Ll Ϗ'@@ ؜xjɤBK(L=*tKI }JA^"32Dz=!;KMUȅWK:(\/k1{ІuXd@@ p]ln\@իWc̙HI]#&55 Ւ65K3%9lJ%R5,Jf-3;e%6HOhaIP'?K;;>?!8uŋBd$q.@@ pF<;bƍOWh nh@e)Æ SO=/e3 #`Wm,=rssQ[[`D@ ((<]8@@ ؝xFQQJJJh[jtpPQQBӺ7d$`n]T8@S(/L2||Td( [@]yZM#ڵaRz@Z6Ď;pqF"8$ *5z amoxnKxԑ vY`etZZ 8Fq+Z(8|}PU]mT>}#7T 8v!322!$|Q Fg0ᨯ`޽h۶V]&j'X]Ǒ#GHg틐0tY,D-U7@ ^O~J ++p@ 8pM8@iJ6Qx4 :[ pBlNL1iR`ype|,A:Zf"0thsMA6 ;Y4I ؜x0 *h:@EG 0!}g$R 'A.cq=ЪU4[TC :κ)NEMlNNG~3z$4++@Qd@ZSx4 YDDg3_rRT49@ x2)8y2zNHS}=𤶗F5JiPZ?qt'K@JxO^ѿsdgw=7>^x Fʮ cl`TiiaB@}Y\"gWrJ+  NO<:ucO\!P F͹˯i.HcӳY)!񮝼TwѧA cOR{ :騧/HRkXqئ@5 JubS"^:_ &VEOI~I}xT޴oq,(.DhhxtUiiiR0I1i$tIg@@Y<+b~+^cͱxᥫMo t۩hx'764w4,}Wjj*fƠL$km9p)&Ɯ&f4mԹ$xf8dIkF9XδRKF/ԕӵ[ƎsFFt% *@N¼!V JK^-tT6œd+<#GsiZblݺUTѲ% .H@MR/y?Cq!in!:sH8B@QDC|Ꮅ)q NI)ִt2 KI"6'eKPkж^TU©hVթއ 3]G%qªt"@@ #q6w_&H?"V*'3F6 e%t̡Eb0M}ͦH&;@@  JAvPV18qR@ScB}]0MCID|kCRe1:@@ 228\\( K$$:4V`U&)H@`qI6WTێIUҒ ΅@v9 ۞+og zD!TZC! Niй6P4E8yS#66Eūq3@@ x{{cAmrδC~ѣGtA<@"D`XdzfECapwYc (/8/7tbb[Vy{ɱ5˧. &82v*];-<???||M{EM{DyŖذ5B;cٲ,GtAݬCEsB /ĺucʔk0J<UOGԦR.,,|Ɩ5>z,^_( @rr2 ,Gl]oڵ<+yu 0`PsxxX A ** /t%771qRׯ_, <<vU 88v@6'05YTQ p0uuu(--EEE9-RWK; ;e|೧QTT$=P/2Vdڿx7I( pddDAA ƛRW_"衩mCU@\\Zj1ċTw|EAiHhW^Wo*⫖s\g Gu@ 2رbTWWKǐiD'#P__'N8hdx”VwEሚI%G$4,'&*m`5vCzڕH] pUx tAD†V GA4%`u$9y$=#݇ w=vQ @8{6 WAZ!0 (t@-:˭ٳgѡC38 ՟5!PXXV}NT1T%+! oƲ^6z3Хk ]8/LQD> aE@=55ZAEjhu0o?!&aȐD𹪪ұh:Oq.68֩ :'$ɢ`Crt\"#Gv۱uQ`Jq*4|x=?'vad].h@@ pxibO~E"-᫖Z9yT?,;|F+K=_y\ܽx{5 Zjڞy1&e ";<:ؙ3gPMQzɠmnmi1⛞^74ѧ%,uX3`&3􂨃C(/ GII*Jhk.򗗷w5Rc;3Ya/PQ^\D2"й['{; @EюE<9ى E`ПH_Lj`6hhqIDxiDD!(]A ;;n[6oE0x:@ٳ'IJEA E/aoU1tP#à;6nк봟91~v :eMD~C$6 (~#/&x aÇ_낸@ ~201HٔB 1^ I>>%OIv TW2B?&؂W\;v`C P~hAhEV/֊_C`:R툘YU .,Cr:4+`C"IHM!F i ]s7"<}|aǣR |f34ۆv5#H"0}C{A<38Qooop rM5= p7@> 2޽۪x&F8?H@C}i^do'9(8L*[)`Mke%"y#wa̘1ؼysyUU3|% '4 o狀Y' 烞H2Z,ַPzi PC*Dz;,&2^և[Fs炥\rUEL@ÙzCfTW?/͛^ZOVK LfyS4O"A)IEdn.^XNbi4Ѵij "789.J$2/e`i-]h? 7^4Μe9س*KjrkixO;tDW_F#$!<@$a02H³sT?ڢ1=@ $ Gk-$-$T1IeI7-$@#(HA#)trKЪͿ8MM@tK$jNjQY ׷qjۑ[&!;o.Ixg%]\"H9Z}3>+Jq-5M?N">lDlÌm#Pҋ,җU%2IS+;s8K,r9oMʃ}!|ԓ'HjSck'u"I ޣcr$4pv%IJ.~aQ^C}Tް~R&VM#uWkI9m6Nd'ѝ8,TL'""'k8D**_% lG؆1gXbfWlN<:r>L]' XB v ΞyY!(x ԾGŜK#D$4emi&T~SyZO0)D\KбCp}M~_6}᳓T"dXZQA*p\vgrL{3[HaRꯒel w52rHsH% 9Sၙ Qq::"Ml}B$9W?][cj*d OM[uHR I>!l{k୒ 5ϕq-\7ÁgZ8g@":8w{**>BMDFh~!ܺ݊?ǽsm~cEJi6˩TKbۋH i6@#u x^R#$K_e[,J6 ǶHj>#bU;;YvIa7:>׷YK(lGy )]+bp"TUdCC?IREm^pj/865쿦5qlq 4B(- ݻw'c:yN>WGaW8| m+$R<ԔCqG4h"z@|+y^VRX㾽x^ җuxVQU5bfc JQfi 7ueղ*f{EK+5;XbBaQ@,Mh`qo2Y̽4Sğ'\-vXLt$7lann'v:{UijUaǒ!Qi0DvLi^rҩ/o [r@޽-r=h#Ee˯EuHӍ 酪7DQ"[K P\\Ifv i$-|M=x#i!8穨i%ǪK6Lm0׉*q ~qʢ_c^WDqLؠՒk~Ҙs<ĒvFxA1$q6tZKsװLqm{ev %KOgm\^ R IDATb„+m{߿K]TʦꦖJcpgEăA}',Fm~%%jȖg:66˷w~aUjWyֿV؝xIIAA(`fb6|N@yy9rHZDziXUڿ(i\i}u+={pd:NHj~0 Z ZElv i1+u(t邎;JS4[@@ p,v#,ؾdfǀmIH1WMx8); uԠ,_mGuu.!ȇ@@ p>؍xq!4nE>"@ҲT0!!NZ*=EٽQ@@@ E.^^ݏ ;C<~+ DdQ;v ..N|X"87v!GE֡HJ!qu87lv C+EVAddds)X"l]ӧѽGK!-!h>ǎăz9$Dު\ވm;^4L `CxwevosSe+++zaEjHdjcGq oO3 Ϋ֧1F(!ൃlNը+`gOȭ9r;INϱ;R#:cI!CzYaЋ#Gĵ]ŁL xإ^ai3_MPL BE`C{q_ }ݟ0:r z_vFSշ@aFYHGl3RW)q MuZbi͉!}, u#x7hL 5?DţC6J>T^2N"iˤ_#P!8$E:bA`֣||'*Fu0U o"ѪLl;| ϙ'Z"M4YQP-d6êmG!T-eQ#0Ơ nڌf݊UFh?2aE:3>^*a&,/$ w'Ѷ܃^`q/ ];7=!{&~R[(&'IB|,M{ ծE>iJYn5N( ԡ3l^X0E$;!E<=!0L>>_,y@_#O"n@kr c"\Uy' &Xi%uYiPccj wk6Ս%q0ooo fΜ N `8Y":)*"xba\M]~~q M5&NoP^ʊ5Po9j-HHɤCdF}Zu~L2xcg=ŸEb:@ixyɳÚsbsMM xPvwGX])!ua>)8#JKK)c q_fQ":E=?z\GcpYYN‡ -ă_j^Ol2&r<#$ /9l' >-] Dϸ`i%3o}hS3 YؓCvsBXg$CöT7![0D'/dE QtXI-dA/hݫ7VmY-dQ @A<i{Ӱ>xE#TQQ{˯nuY;H|~l I4"iCo1fq|kR☏b#hFcΊ ނFR;WP:TWc4Ri0_F<z½BQq'#q?~@D5Ch&c kgۻ@Z#b!)Ah;937I=c7t1R羋;zhV-!ig1Q(?GhE{gi ʹ;QœL'G$KnReق֋V!, uBrrWСCH @X?MwBwsM#Np ?dTh0MeJ_kz/sR9OJ7P;m'̘tмY>rQM<}IA-'۶mK6-9&zz(qUH<ݜo:DLJCal-MZc#K[FLT"wD<ˈ(N W$j$>zNϞrKN:5Zٜxpy1SgFff\nvߑ5ETp6;hnΞNxy)J,Vg9E?o>0{`׋$k̏7- ?~mKg7y#md,S9D0$E@{JpZ oH8tNyj(O׶V1'+"6Z~:'MiRߔD[K†sţ/-=ƀ5ܾ>N!yK~Vhxfhq%زL_́3qUʭt>+|) cӷ9FQ[2_~xp˾r0LK Z:WMDz#AWf JҸ/$Af#[W> 4GgiOxǚXA0EϐL}KH[?.@ y|skS{* Pkj;)XDX/I^HKux&eQ4Vh $póˀ7^ &ґLZaPZ2VUc9k]WGNܖx+LT~,m;7.{n FJxRPkh+]}yIF3-OQ}iݵ~4P5Ŧeh+e>=Ѐ̔e ۧY6Ӥ~(R[ U}[%Sjqja2OǓFh%1jK6{5yջu8F?Bx~lfz%˦O{ݮ~E_|#WC@AfIe1b8KDM\]#FL` oH0T㭻`/򾴴n${:qOEi p]ٱ2/g'L7D˾%iH UL㪊g,>wu%.D岡.:s} IW)$:[!+կ_+LKKW/I;[K g+5g0.}t"OJҊ4*TCMI_!8R܂}ua{:(}s?vy4gЏ&Yq}8T2~(¯ÊT}X1>uv$Yjv߀t/^m8} rl\C" 4|d;HBhU=X2ofŜ4#K 󱮔6ho,7W]E8w{qWo4eR(6֕2fvضa:R9%0%@{6(.VbgB4|ă.3Eꡔ]>s1E@2~$̼V\҃V12ڀ>[Ce#``'_ 2voWc3։9n _2^k̕߆o?&ӫJ)ZN/mxܲ*Or-R5?z9 u0Ծ偽Pyf?v>u_JE֭- HLAՒSחq!(=o?wK)b1iP{%ҳ}?{ۇc?m?ts¬^VպYw7G` -lI&^0zex0E*6!NO}Bg͞'WRҟ%_䇆=ZwdH҂RV!vΜ~vw[]YHDT\$hJ(dgv' mj[*#6>m-`G;ltiyYCQGX1iŶmmY@Q- g-ڂ{K.Sc Vm[l+%iD<>5R_&YIy]C/CgmiUJg6]$CUv/_?UHӦY^Lxn>oN46+_A^gTkWb)LO6_=z3fm^9_m߀zX~?g-'3?A:U6>=d\ׁ`M>~&t?_럞lۺ"bbau&l1b&|Sb|ϝKwf~H+= t$l/_ GSRhЛR@UL*X];nB~tI6:?-Փ7\MЫcV8'jP:#azJm#RWlD&k t`!h1-*2ku-OyMYV:/]n.Wh>-y`"3 &?v"g.1wp:}Li.5OTd1[UDڏxiW-&'2PΗ[^kDX9ܐh\*Oh:S~?lk/|K_K2zIj-py,O7[S#ʈL"zIbɵ+bqsoXyR/z5dNO5nyː&J-f }q6 ]uTǠtj {H&R 9#%irQB_җ b=<8᪄JCG[.EJ>Q~iF{u⯔~(=]")|.0ďydu!qp`@̧:(BF)k_)3iMk%ܗ6px4ZNGTh=LjZO+OGnCdxI[#Cj5\V^β5U@ӋY^mmr>.ƵYicxo@! ݑ$/;>>ġ4o0 JǨKpݯb&ypkaP>t.2QFymȘzM};sLfbsTtڶ,] Se+wY&r*+c(mO~aզ7fBiArr2,cƒ N͢qbđH!Cj4877>]cu^aڃ6VǷ6_GģWsG6 H?YϢDb{&@Z\xNBLlIIR‹<6OgkEWdh:'lB~nk t8>.Ie2 YOK )4ylY_[͗AX\Jd@y;P~+*՗_f 016c~^b\a=00'%ҷ?Ut 8ջ:DbP_F/ (ᱏ_ 0h;n[3Hc?~.{vJC߯BrC^ ^|ZaHꊭy`0Me5b0 O֋$WK@6Gu/:6Cc8.]_ e mzmU Iԏq!ȵ5IG9[LgzbѶXqt-ʥ3?o<*<+9Ho$ )0g&3 |fx5 1H*ݘLˬ5Z-dM=mu(铡R&֬(GA(fɶ)fP%ںWdU  $v:E}:9KƹdM- " {{e0GMG#h_І?ޣDRRN1Nllia?(Gm|Ì؋|/4)0a~rdVdkea߁C>(X. ۡ 뎨 K饒kPRyi1u\%J..zlr5ȋvju>?g1ᙑXD)φqbҔP´m8FbqV@Q(/ >N N%4R‰Rٶ{1n:>1(-8Ewaە鐃;  7m>q+clQM]4m+v/^Y(:݅yGэyRHhQ2mxRշWǍkN|h4Mt~عs-,YviS2⣚ cnXf Gc޼yDHl%eL ٲ`. H<1zo#Ybe2ܾ Hi}$ N{K1{0X/пa~bo~|2Sf54n[imu߻O^>\w/;Q8geD"@z^T=J%g1ȫ7Z^ OA '$eJWfp~yG 4Qkwm r&c];v ZJ,LDz9}I*3eEkpziY IDATU8ʭ3їEy,BL󛚕^iBFQmϳHL?xnMf{F5K"uNd yxҥQAK)0oѢN xQOI1O8)?4ARDIG&n홶cQrWjj)5UAIXjDJ]_.Z%Q^: $OĆRb/Nldn cye>}m}24L=c2(p_ a"rGZfͨ5~VGAKB:ѓaCEB.hM`25M]2g`\=OWwMX`:(e22t ".C.ƥvA5ԗwi4 bh=h4zehw0hhQ <'aL?k"U}4:Sō* ++% o_<(3ҹqyMگ_Zc%Vcz5:(csEFZjt@LRw*ñB*ĉh,͜W3ZܫMyIΕuG \X8GX>bb"̐J 53 W?C*&-ԓڽ֌~+t/~Qi׍0@@Cpf6ڋ]wa.>/rZW@vp>:Uۡsk`V+2yY{|'u7|Qy_I#knxHtַG]=qŭMdَLJ6.JBHh񤖱3m9 *>O,Q7ir~5hu0HdtٮXmAhSŁAuݐFԖ)c\H@!i& X4IwtDܼ2 $Z nYl0F_wvc9u3L%n0 &@sE3Ty۳W ǥ\FRmBiVJqx(+xrvjo Ҩ:43}c[M[4K1gn,O^EG8,L6e &`FM+Ǝgf>3/TFg&O#%]dÏu)pz%v,nKu2ʢ#:WSx$6 ƍ W(ohÄ< NE-8V?Ga0q[ѣqܕK1ܺ \&y[@p]A$7wefWߨ\ΩdlmF,$g J~Uhco[l uEo j~KE]]bF㫕ԇxv5v۴d *m78=ݩᙔiXAeqޏ୻(|GDpZH tTth0Dž&{p0˻N2xX8t>{%Nn2R'{ҝiEG4"? yA)흸0LHK  \x|$+:78zd!RfƢ_qH6ͧ,|WL?24 i%Md3V|`Oo6R#/8D.[߉֝4p@XYۮ 2v('??ۛ=܀ ] al~?H$|ޙ%J8A6W.^F7mF9ZM+>^0]qh2uZc\:2D FZ9K\l_ [ejC98{$ذa믿>$19Fpa[AQ  m-bJ/4E;3j96%`?=fh D8̓wpU Uހ#p8F #G#@pcl*G#pF.xs8G`! 9G#i1op8 <&r8G`H>>G#p&܁yٺ&(kcӛ|_q:6<_24WP3 NʬL*ED=#KN>gVr# :\tHærV:u )M;V.ZTjt+&'hF^}@r$1q8FZAؾυa n}Wś4X%u]<φ+~\ĕb ExpI/;Ҋ%_8q7 2C,xgX97Qh<%u6_a'wa(-r짣~$Hyʩ ݑLsQ,R'I<~:vFBG=hW5N]Y߅Z<#0p_έ'nrcxh[@]Wa@e3muKKG {vYD cө_r"4 ծ蒣Q̘Pېaw i2[Í< /ނ ·j%Rjr+(9,P;HdoS|X-hkpW4 s֨ya"-+oc"DAOwXri o+#>Ì󰘎&HR I2 0z׍iXMFhߧ0mp/"EѮ>3ݴ'+/ÜXi@H/S4`~cImg/IJ0R?K8C5s[ 4&V <qSc@549Fݸq^{mBڀpD`\7W\&ȼ9G#m71rPrcoz8FpFj`jbG8+61!* /IY"+N 3A=LxO Oŋ#~c01yd̞=D8 W_}g_p`hp{msF9?Fرc{ Ξ$b-3grcc#[o㎫X4i^}~aTyȑfolY _\{7'3݅ؼyp<Ǜop,?ߞ d]G*h3#l HMP?pI<#^L<⳸`Kn7*2A ilݺ%6.Vn\zG;O ƭ!FbIF>_`~_wA/5Q߲2D?x:O!y>C=NZU~qJ|$':﶐ D-r<pF 0|a _8Ǔ7oc+[?!.̅{Kx塏k8ZҊ$r}9 F}coZmL\vm-'p`L 4/s)h_-_#ŚXT웳Yxe5ƿ#QにZe>G#h7buA5!̥8y S.[Xch>kr+!ZMp,]/YCԭK_/qSwձ`e W\(*py:gA@ "#$>}鑄AOu'MU.Sc ;b+a]XzeR Σzp"GO:}@ .x 2;G#0"4vaAYUnl&D)xJAWL9,_}`F'M-3̦vJ;HSVD}Y$$ABx G#0=ލmtk ub7Bp=-9>y(_p+\ ɢqUg1b3IPfOâ\^L"̢fYN€zǤv߅ IΜ^ή_>H,SBHG:%"?6GE/Ws' G 4k4L3_{?RZ`-Af]56~>ۧ6WPsέf ^o3e!u}׌mPE.-ß7"4R@zvPw#!y,%s%HW̥ egz,֡7x8 x4/cgŷ?_*|=f4i+[ ;| ‚=j[ FY:'536ڽqm( *X8-4(,Q˨ gt(+H!+UznNBIŭX::'ݑ&shP, 뮀+s+PQd<1M%H;S7 L]N؁`!f,a+raɰa*vFP3 < ƃ4-ر};^&5B?p@3c/[oC\Uҗ-P eA܀H"2`X IDAT =>e7!&{ ϹОH.#s\8|d,?x7m_Z>/%ukK ~A؅^AA(xrn7G@rTֽpCIPZut:jyR$~V&XЧ^*D"AP/A# P쮅w0 KndߧO^iT )Bz Nvs@pus<ڷ#1y7vlyv((HR99(oPz3A|.UHV솲v/+-X&ҏ1xpAF|.4K 42 VP8'@U҈Rm*Ţh Х_3Wb^38ˮіF,Kf2Zi0jjqǢxC*| )PZs`E؇S!F-&vj*?dڈjdH ΑVXso@ ԕ]`}Eg gg U~B|3(w!!h*h#6p/m18 G=q_J3SӸk4n6l8-;_a+g7AD:KC`F' ,N._sy.Ð Id2+@c6'&!V\ -ELH@wvlٌkAئ-Zvю ::ʱhoD T~- ~;G k^@<&[9HRN‚{`4PF:vңnK2a8SfV&ţYEWEOf%~%ZNB*[ĝdĭ yZDj5Ϳ :/G#pD aKN)g'Piku9`@@ȚL,djpAwo&IzkgB7_`aݸJzyӬ&ŧY90 'IZ(e5XHl&A)Rpn30Gw#DX6N98F_č1 Z#p8ǬE6}`FȾ!!3M|8$,ͻ!Ν|6!ϲ1{~iLNx'nZ!=NݸʖB1>JnyO6V|^#p8}}o{"Q YRTV">Wh#{+hR\223@iٛ_sLʰCoH{15D-G#p Ok }G:Z%H9_Tطy_p ZZAcU7Zpx<(Ew˰?sHeG#cE8\StҵUiP|TFbN ǔF βµ4Hːz]/VC0 C XӾ}[=3 ߅<6 =6dGZ޾WWƽrM 4x2m-ԥ] km#"n߆EɨS`v?b9YƲnNFtecVQn? S-ƶY'+&";--GZ,Yx ۂ*;۰#VH]EX~ـՏlϕ<Fp8G&Q Qpz{{܌˗OX1Yp.vE\B>Kŕa@r9w̲Vԫbٸ"xmuQ@J7??w%R\5oĠAewp8c /xwwIG~T1ϑ*&cNR5P>. Tވ#pF4^C5^*J}~lĈWEߍ:#pF.x+%8G#0aCq9 }{ :2H>)EĆ}*xlݘwUT}z fARMCg2K@:h0R ߠ9ti".'v>}$d?{[~76y2K$ܠ~{Ma'5bpp?18ߙ0D$ڣ&RӦN+MXh2G|l,VK!` uNw QJF}VXzY[!(4WG#VuغBLϼISS:x9(/sӍWsMֽ]+mrݫClu1c\sG1fB`tkc&^:s!to~gӦ'Ϗ\!B{Tf wǢn D%vf4w W#khMF(^"֕VBο6F^ܓ9I;ۨ$ HQkC} ENR,C{DE4.\xɆ7^/T6\OP!ț1{/y )\ o{O< wGmO$-żsb<7hoݏ_|/MZl?7mġw)/{o% ``/bA6|'sW_}HhP~8"PWy KVS!%HSCH H} Uav%Hu(创 ~lGM"ҔR9Ek Qcc\}qbFF A?=x^Ė`Lz0 9`F:*Ϯ쟶C9< anَ[HpD,ןDD jt;#:VӳLE<^X^>nXuŒu7ҫFYw:Fdg[K2aW Ã2%lLG=p;9ߚQ0؊b6?|9NM0IeU!G d4v)|Qd.kU"YD+[ 1hh 6lPV7%CꞞJ@?J$lICEЗYW ްɛ,SČbjN-͡>orJUnU#?"Y{E T(d-coY2wn%Fִ+DیA4fbF?1klW!Gr>f^Q.Ir$lqDVkKv5os.b6_ ;ҡл\u xe")=xOK0}oe2z{»:CϝSO>KzE5\__?A}΀vݯE_&0;^hDHw[׋ػ>=!t:{*J& p!ʌ||r,%Ktt"! ͳʪa' !eB=hEpUp2 F94T 5P4(FٓoWi/M Jpgdܑy34&BzQ˄۶m>P'oC@"fLs@` &\RA!xW!FaLwzzzL… &0D?]ƪ&ӏ8]:SqTjnSՑ4 T~JcESg>e&Ak*djk&%gBjۆA*K25uWk*e2ۏVYIC}iT=Y6;=*3=YJsAk.KvrSSݦ4ZCUu4HKh"Ud0u44S3շǺ,{ZTgMj[}CW0ўgMhԨ1<$1LcvV V4 <0>x:੮JߗhLo怶DCVmGcX^b'%^WkJR; ڈ;q Cx)0u֟ghe JRMJwejk'N0ݟriY.愫y2,[l"!tԩ˚~I;&OlZ´{n_|qY8e&30فidDkhTҗ/Zoxx2ﰒ= ȣc'P9u5=tw+^>mZ8{GG Пnv? Scm@rҀCBD%C|2m‘Գ"ۜqbr,U"?'GBeMPUtɺwgbˠ͖p̎ϜUwtYc."WG0NÞi[e {cE_RICg9ʱ_ EqM)VK|!b-9 DrpnP+BP?0Zի#OP@)Ŭ"}.[vy} gϞW}(jb1|(NDM#2n6v,EeM[ku}qą"`Eб-;/vif-2up=\ :懄@/B%%@O$ZXJɚZ"VZ&_bbLNobFԄ${P}wyot:"$%und+`e(jhf,΁X;s2w*΂$f$DFlɛI|e?^QCy4.xuIϡ׀/rx)S) ~(x)S.+ }1/^$y݈~PNL ~)&M~8WP:*'珠o܊8TWzygN1: DZ2u(ZOt \2LZ6 El\N7N?DxkG( ,VW9B}XMZQGB=y?_iaF{gempҝs c.s?}{H "9)mtֽvs nO/^aa WЎ)_`Wd|hc 5}0gB-^svp: '; 'cX_0,2L %מaYk*qΞGWL9٦b`'Jrڶҗ{.ґMJ{: W- gJ w% aQ21jgBoWlKdHeG#c [d|NyZ5h+t*EN'TQCs.A6SP TCR~F EO+V.l8acjp^R҅W*^kٌHeI~CsSRWqK.Vr ]lqRahO"URNn(cqeqrZUJ-z): hS >Ffᇵ*nX hc+.0co(pHĮ~ ].k4M5R ) kFdF-W sPAfm>Ʈ0CB?~VY%t_M%¨0 rfu'~KRQCB\l#rtˑ'I(JGoo!Ǿú=Z\ 3WmvXNd&'tH#-B"5J8]P/"x(- Xߩ*<02_oĹ#V.˪@eNP6fA} g?ܟ %j5nx5t}ءC; _8>hbu엝"Ӎ8{,H֭ԩtzCb85ӑI\:~nPϦ #:7}CpAЧ8˘ĬN]+L˗S(?WUF#k#6/^8ttUAs_#v >P.Dr#'n*[:58}*.pR2UK_ٍ9/#hHiC say)Y{kq'}BxX]q9r7a5{1uHOC:_Vaɒ%N}?c|tFLW*:0܍U+VcѢEc& RØ<3V|vDqka'BͷĤ^̸W٘e_c^U  Xp:wBߞXcx#x8i9G`4"K:1~'ޟ>ОZ;l/ éե^nɌY'q)xv8G 0>R}[2Yb؂|[L# d@<+tÁ%uXy9J>NK\Ko:@X @/x3lAJǧLvTw/(\aCɏqqB9;CxNP q7Fш9 IDAThnJzr56i\bӇO=y^3мt{d9ud˯cmΎNä (x:=܏9Ndk^GD9@aWZSb%4蛑*Nx|?k.PL>шS^凂Ԗg6#t7Me LsQ|6s=];稅cWtOd1m||,bK~Bv׶j0Dy:T0l6|2Ε FAS:=]6eS1a;`. Lh?oo\204:]W /xhcQyXZn.>ߗ]}`x*uŰP쌂5mFKFL6\:v7dK0w^}GjFOVΦP:=wQ̖4,nH bQ@"n%$귈ϫ!_ixIz&q3ޑ,m–a:\YW|ZNCH5hgx H)RcFXy!`ꏧZLyT8yXCg=,I(,kC&зpuvU>kb \Zwb{]8s)d\wiՏa{%$mh^>oHSH6HFڊדí@r2]&o[SS%u{rЁg3fL7j@hۋ{P=vd(Cmٞ Osn￿;c{Ŀ巐kH[jT֧Ȥ̡1Cys9{iy[G oMRD)aaK1AY}W-.{QfFKO3尽-YUO_©TFBLVGCyy#O |W"o-TJ1XQED󡶨ZUH?we"-B{ֻs -d͟c^dmk@xw mk t]KK}%$VC(Vl{m}{-Oߍ}jᾳiވz7AA(G[qSvϊ{w0_z@~{w'S g<kO\FᷪAvi#7MЀD{"2OX*Ͱs |H<չf/xOz=FPuDVV$h^!S&)1U 3NptveĦw}DaMa~MVS7볻ۤmk4e@qY&ut5HL1%ՙ*RY\SBg*SR*+lVʄ|ijIIeIRYV`2hAVhdJyUiB}sb0ٸ0K;\f)U4ڮ>6-`-6UdYSM] )A?YT^W]&Ξ˚y#~pԨumSIfSGԦј4f1 5_ĂERV$[aOMw[)Kn>5TVj6XxN2U(LUi>6d:SͤhHt[h,*Tj[DZ=51d%&u&3or<can6[j]oM =Y礀ԔVH6Y9L4WRowsKuyޕxw *uLL=s,Gdw9uqJeQcnC^ljV4ue[XLnS(\IUmv?ZSU+75oLZBk0i,ihoVw'T lGHejSuϭk2 *U@EtXԙy Zihys. f$xWq,~CL-6ӵ"4wf1j+[ԇTetK$(-ww,7ޭJ.,sB ja#.ѻ`s_=pqn1̂T6 C)Wf~t#غ1=zwߌo;;rx#x  ؠBDZ`lԧ[5ܷ^#BoD[yxv5S8"͢3MI!ޱVt4WG0co}?Wgk>_s[@ejȚPD҈R .N&k~NtjNơTx.EdH[DQr;^=J9nlچ߶r3{DsSOSV~͹ r9ߋ./x[:"!m4.\N-0H%'?`=ȩ#h> 5,# ͮ7R8`nؼ$ܟGS6EP#G`x둓JT6:ѢVCo7n;a ;Cy"T[keĜd w#oC-n)QtV:}l+ 60(Ф! t$Yhd֢] eQ3af񤺡C*SM d+I{pGGmK+Z֘lʓ#qm("3/J$D I%oe%r}T 3E67U݀lGsiw|,i_[=hi@MŲ\Y#BzͻZ} MP[)Y9o&Z S2vGBz7 6uaCET5v-d`S@8Ix$#Wĕ*~ kkWC*r .#Zs=oؐN4>GN1p8npiYJCf\m6N K_EՀјĉݲT-I&G:i24uXOX# FlHSƜNTh9 C0؏4vچ]YeV'Rq9 `",Uh2.[@'Plx୹?\f6`a焉Y :V@sw@p,0VOXHSMlgTS;6i;qvB/1S\*ZrLvlQb\1?sp@ ٍ zCG`"!0U-z|çΑE?̝5H#BGYQ6\Ak Vz2"Os\GggW|$8[R. HF}G#0^?.i*eCkE][ +xbtV* ik0\74?ER0c- _v~;P!*NL0d⟹ bJQo⽁0k'P#=p8c JSF[@Tu::P+ }nc&B_~K2k*Xv|3幨V*u ځE0Rƌ!AlB<݁qA9p81-'^BrR,I)eҫF@>iqFG(BLsb rJ]ܷE|g>$$\ Dr*0ѩQdMD.PR)q|\[s dKi#{$'+ńo"pv;rMT%!CBPbe t_j>Lfb͌_F>(Y#E!19*V$#'#pF#"xt6Jb$5o ^`ZQ6e`@:;"} = "17 ٕ*BUIkv!6WhvoEbd@BAZ0vC3GU,FB\%$D-b@LoUTUCe߂f>3mwNO"UGa9VCTPٜ RT(A9hVdHH/GVY5 /EB\ L'SJG>%TtsKd3v;bbNע41 ٥H",* sWU~bEhM =! ϵMB9hެcz͌_Q6$PryV,DMeI7KҾ[l &:ߚůG#0 x) &+ot; 9:t EE٨g.-IN3~@\$*[#,[: L ,/ /@eEZ fUW>_g:Dg3Oc"=*cW)$XT"Y6[ shYC,n*R/1oFlۅv7)LKMCIpz$hzWŸNNȷ,!l-BVD=w6CAe)ېg%n`_o) ȫ') {T׆?T?ƮlU 9^&C r"OOhRS, ;`{!Wp8nEWCN3@K`~dܨBUY!R˹v(b"nF-mw9MqzQEXtuuc{x:XM "y ]Ѿp].λG vՁF(ʐ&D⥴8uPd\Ar$^fZC}7h!Gmn%j7?8im*q W.^!v%w'=n"V̮v* '#C6|T@!D z3Md[!6%,_MR=<侬!bkjp8# mѳ6fٶa5\h/6`ѷ"tB$PBH(y}:GNϲܝD1[Mj}'s=26[w>Ŷ )(&ݴ"ĿBܖdZ_@w2X',$֔X|'96Ls`M('"Ԛu)G k Kd;ՌsB B' C?^Af"fYnug.œ>{َE / PsߡV8Ad߶NQT/Hjql ''"dU-UۑUfQgK!VʷEAa +-éAHa2\(ou؎I-6F233d\lko||CIMt]XI51`L$5N̲6Y/+O-ϥCX4)hܠkXQ!Ufh38Pcä0c?0{s~{Vذ}9|e F+>[ص^Zl`_"A|@̮97+FwnO;6#'KO^lՐ MQUN ٤\ڄ~'}G'TҳK^;#ok=ҫp_ϥo &E!mȵAaE_*<@RkGJNg?jA׳CUIGr養sE'Bv@&!{+mnnBN[r7dJj_]ځtՋ6%¸o'!)PnŃHԂ![R`3gmCKo?\^:IGQcteH"`T텳߆ʭ뎕HPvmEߠgca=.=CySx_2&g ͝GQ^"'rp:X IDAT0R:6+Ewo3rP-whF-AɞCbtҩYuK* j<EKcfGF41b y:zL6$~a-_\ Kj%Id\o a7}O² }Hj>jg[ĪFꒌ0i5ƝciDG7MLKl0:N*%%Ci d($1jfc`L &8|0 QS#x'/^̐Qʬ#a= '9KCFHMz$O6>jgyĪ'C<hG~ jDiWxy\/v_0&.=yx䘦q:p59dݴlcK t12E E rD>k/56 0&pi`<)jV^U"G7Et=,v:h C5X(FӾG+X.zXwAG(x YG=kɛ3lo.Ҟ̯@3:c[ըxل5cmW^}9w턺"FZCA5BH3-1^^XvY%1$`L@#pf3VL}G]@ƿ#I/Ry ; [SUdlhٹƂRԒy s\fE AZ[iɴ`A)WZuk7~V(@Y"x!m-Zmh%yіhIN>cg:>ntEk"Ay6'q`L"'0ʥcGI(_Bl$ !!d%3VV ɋ%l-2NxE>P$*^rWokX$š}pFvnh/v%n vcHxs1wj W#Qm\jWdz?@:Y\$nAS操eYhGM'wyϡ򏨤>q gjzt PlDo؎z@7oP.k LE|{'sAeLmoٽOn S+ЄY{-&y I7HKii)߇%Q"(WӳegS3hCj`&:3 VƬ4A7 ZMIRJـ&^(uS{aV&&W9~O?q/Ğ' yuHcSN|Mɓ'g[_\[/)6M%v(6<|a;C~ C#{l(yOthWɿO^rez,?tP'`7wtJ6J-Fч~|o,.7wG~#L\k͵2]C/c$4=a^o*їrТ]p1r|_Ck80|_ʤ '2ߨ_omp]fɠܛJjU`l[䖅`{Y{7jmFcԟ|?=144+l>6Ԗi T\kת\r3 Zo}51[V+qU[2=NSyB d}^GBO>7(bG\ AB+\ I$0YXSUP'qeSk€U\ Clc/[#bQ6L!큍6 4FHVI!XhhVFQ'wᢺ˸_9t"sȉZ6!<Lj_b0z*8rAhR>0:7J^_Nøi|IjUAҋ v+6LHqW|!HhGBQ Jr1b)hj.|Nu m̲#|#ߑ^iBVgy3GV5 tNUB#r||gwztI u4*z|HV4OiYk^Y viDOK’Zy!oC3%?h>f:Sݝ'NKE\kƗgmlt}e dS>U-B\+zbh$UuȣeVTƑÇ#ӕK$[n*--v?~LVX uwSj|8fL \*Ngmw;WYoes/Mt bC=Ԡ&Ste̹~m?߆Z<҂_ji7b[Mp :aCwV?K@z28*K~.h3~fIPQb  qszko+qgY9!N9]践<4uIJ/L+~ʱ*ۛ>r.l-Sȴ!/utr8g 4N6T0o6 ziDt`Q{J2񰭖fH={ׇXb[R)*߆b~()KÕ4'*QząZ^Gn8x_%0oPO9S#NI9y`#ʩ-XwTOSu`:R,4*'6F]j(ʌ6+ʓZ} ?:^G@C4w(JdAc9(15Pq * $hʥNm8cQ6R8S,TV([Փ<*':biP6p5t`oՔ>g0`(JÁ '' zd2EH!vҽudKޓ?A\J8ǃĔ)(m b!2"V$RdPc Fyt!_+i_$n{b^ J -ݞ!rL 00 1e&x5`L \4(Rs6diV%8ϹztbcA)Bf+ Z3f|/Φ]OQTф |uJZ&$yy ߷գ3lpDLʆ 8R% J6q5q"z9G}u=`L \\:p WЁ| XCkȫkKdY8f3cKb 83O䣌lrשJg6ݽ >Yr#X׆Vp-LWi wd }װс>DŽòa&eCLJ]*M3ՊJ>EpLvEΰTs:`L Lo8g?W\c(/U3F?ؽk6}&))VlCE<7oS=OwoeC̃JY>)%l@eMn vcHf{tja$Dl6m.KZ1iﺓDV0ğt16?kUypK`7(;$Lד1 +ыTkNx'3K!Tv\Pae6E>\ 7Y>Q=# 0&Δ@3%r8&!ri?nywx̛,qqW7E64FW܁~jis1bAf ӳd:FsYTWy=/Ep8 ;\+79]W}JxдEDeZu ,ƶj:<L'bta]kL HS d#Z#*i?6,1,ׯ!ƔfnBk-,ؑế.'c\*jVvu54F:dw~rͼnkYkh *)k&.Y<{b&uqD`n:FCt&)GlMT@eX9ȃ2ա "X]].kzP ßXށjdzHRũq$⇏:\B&BGu5*%=;UlQ& OYZť rj:y./ֆ7z6mzGʮ$Ʌ|os.igNaï⌟Qh 0&O |6~i8-S:i~F[`kfXDcs"Z3bp}RoU_w7Wㄸ,붢r7>N{u}_c: Z^SxH55kNI/\:p?(HF^١?o>n }!. u4*z=*VO}b|LŔPZ|+DG鹈fL֦n! FIT\۾  IQ`L`f]PZ[0M44'Pr0>qZH=5 5:xJ: Scc|‡PZI)سAQo*)^tȥ-e;Ff4,Xnf[RX, 85z>;l58TEXu2\C;!ax\2aoTe}nYG쩶*l#"DCQBLLݦe/" .PD+l$N\5gcL 0bڙnuSO%"!|oH|GѐYQϛ]rX5{fX}6 8B??nJrXU:sIyU9 &!B;e8v퓪Sh&J n3юsΙ [P!${ښ_J9Ya;sř(b*$ 6uz|Gʯ] 59 s(-h  <%`L Y>բ7J=YO'߻;Le 0$ܣi}2ڼ&-ݰam }䷪P]wք4ܬGf}26J焳oH-K_dlN”l)tvIw@V z,s6z5A;ΫqM)D󯨩GԐʆDY18.f,RG'.'[*WudGHK[Gl-֗m`wzn٥]{/Tmbb(U s~yMV2??#`qN'OɠY87iOS?vǐچߜOF3I1P^}[L!mt/~o7{S{-at_k2(qUQʠ]K!GVEʕ ѪlLl/J:dZyU qUN_+Wu3mԎHuO,_quV׈'66jwj(d2 +\& t+WbumzBDy08)b$ar}Fҩrb,}&"]8l+i t \hG Ʉl| #ԅXǍR?/ .O#d12.ދ8/>F)d"}\^IUIDATg=91J|ɧ4kS4_3tHT 7 m6ϗ;%ˠ.P]|Q 0&pntSv8ǹsX2\\ `L 0&0-ô*X2RΦ 0&E<Csg`L |\҂)]9{yL 0&pa6 `L 0&pn \t+^0Nt:}14J/N[EXx3\5*׃teb%P jiaMVD[-̧uW)  u.;S[帕WN}ѧדw?^>Et 3CWN$l܋qth`g, >ikDS#945)[vSt:n4s. : R(ށkIJADX~r ^)Ʈ"r{_J=")Ṵ[ pH@OF.o<|H-%qzz5=8Ws)WM#.ԬujW%+6qWj~췶2\_+UH޻Пs,`L C,x$跴 ~FG*f nr1߫nL~=( @ސfEE׿fXLZ,eRd/snxZ'U@PyKxWo\AQhGm/ {p~N>W\cކz/Ea5'EDDY{);sV"Kw6,ĭig7RmȊttWRURhXBYBpsS nHV<})\kߧVAwS%V$*MnNE:YVA#|Hԟ->Lc7lGyK 3 E31&u#|XnKlxXw Wv)yt03]ο[xmCaݔ|eB[S6D1W{ەAkarT\uۍ̍f_VT]݉҂,lk1B2R+Q$d^lϜs}CYx')$p#WT$=7濹"v4b2VAR@Ƨ~+u%3o$J)#C"#g'=MbO2 xkL"0JH)ׯAEjBjvfgm{`y<zc:p:q(HCw]kn:Ͽz~ HT7.=/TRd*c?X0n20:цDq+F_~ 7oGs#h'3GMPE86&T?6rr V$TP _q7H&Od-{)'}"=wmfY0`]jҽIȇ6?K#7w3yQ(DhhLMu*D7z/%bO2cjQ(-{y\> =>$d]4&8wBOVEe)HZ3k-*7FLN`]|.ct__:حX1|M"Fq=NBaID7= ~tII2ҍ FM6ՌtrͦM"1X+BA7@7RˋD A*J_0 @!VTJjS a Ty(TEkGQ0>B"˺܍#GTɫO:'iYچ~VF;)(YmniT>>::{&*NG 0&>- 5auAB˓T.J2#WRn1CJs:U%o F4tKm 46=)4췡H?l4'*M}Sn˼dkibܱJOAqt,DU>yPUs*Ub,M[JawЀ[SqnHÚι튞cZ߃o/# "k#mv,vvuGs %^*Zn@AQ)> mM~v `L"s<'A9rڡK[ʍQ#Z!P;|͍Uץ/:IbOoz^ -DYZ5&Ľ56bTW=ex 'qåeWǝE9ȭ"Z ,FZV.FǼ-7 sGczSV0Ԃ˂J>W7JzKoJkx?T >eAbn0727=2i*Np]2ŇB^_Y"9Ja;2\RL`1r&;-[$Æz h€WW52n!NCNdK@SMp =fd&a)3}{]A[,$]s_@Iɖ+=]=tR(^T'M!)bgPnŃBH\dڻp9y =]x%ț֟׬{N-oDH?L 0&prd3~zeEh0)`96Ue&@ )KE풾u&DMؖA'+ Oh0hCf-6`"˺_ݲR .K#ڟ- Vdnm;xb@+@GS"~5V:>]jeOB$cv b- <}q2m6d"kc=|t8D, ,%^t~?{+eB5 SM?NϰYr!DykiF{-(j3KI^wjq1dW"αH;wXKHzL 0&p. \ӧOp`ʕ3G0弴Ƽ^W[ IYH~OBfKkr4>0"mj ~bBgIIW}ݓNLah_<t !)%KS]ð-},$S nqRʹ;ws2&>pa:dh);|7xL 0&:xz\!`L 0&b`#fL 0&><>S 0&A`8 0&8X8LF&`L rʁ 0&`1(^𞖖#=!V<^͉'&`L 07!+ҔIAL*xbO?NdL 0&><ϟ/HL)x|__^"1&[,bC S)s+BdJCI%xbe…8z([3 %L 0&>_MOO@܂qtxX1gdL 0&piBLbŊi nZ8!m{9rj33&`7?QB&te?"("\>31`L 0 P$:b+:ĈHPO8B/|A*Le]+L 0&C@vze::!*ҏX& )HK=)(s|`L 0 &w-t#^ ZB/_~9RSS!A>_Xh7`L 0 P G󺘷talj5C'$?R!m5:`L$ H  g{ pjT4cL 0&/!\t %̊og8`L 0&piK 0&8X8ׄ~&`L @ `L 0&5<5a 0&ڍ۶aIENDB`pnp4nagios-0.6.16/share/pnp/documents/_media/nagiospowered-72x72.png0000664000000000000000000000756211662503006023660 0ustar rootrootPNG  IHDR22?9IDAThY{TTUa q|RThKC3)u-4SfI)iJMLs.|CDA@P<܏ǠI\^묹0͔tT*a8;;#)) ಲ_b1b8{t:O>p3gϟϓ "0 3?y$V\ gZBbʕ6mK"==ǎR0bh|75Ha:u x71zlٲBcƌؾ};8"q@hW2gcNkx{iJ={}%h4( j+Un ܾ} Ɣ֛"KDs f̘'e^،˳{}.[QQ|}}{6ޔƺFFssbFKKnuDeMj8`@~~>|||LQTʏi `^^222 ;;>( ގM6!11EEE<$ASSOiغu+Ν^bF"** G}g,((mqZ-RRR`aaÇٳd>|8Ioooa0:&b$#  !T*?b:,˂8T*|򂋋e˖A4 jYYY(**P(Dkk+"##/uuuXv-;;;\~*||| ! AD8}4'''#55@ڵ 077ȑ# R ZSv\ںu+1 Ca"""%''ÇIP=yxxдi(,,ĉd0hٲe$H*7ؐ@ UV_E/2I$JKK#VK4d4h :R)r*,,B "|}}ŋte:t(5j؈ @PqL&3D"mۆJ&L˗jɓ'c…(--ŠA`ii X ^eqM,\سg"ݻcƌAMM D"WWWP]]ݴ4 amm5k`ɒ%V"PYY+WD"{aaa +_a !0 ͡hhqamm ƍXlOӧOcjCcc#|n~ZFpaԨQX~}meY>>DP(?"a@.c8z(t: $$0e\z3a0yf>|jHOO#n'effH$`=Z#lllooo0 Dcc#N4 * prrž={Cb޼y033AJ@(>6ٵHHHap(Jdggѣ())ASS\_&ÕĠ 99Duu5!˱n:̚5^Gff&Oo=Oocۮѷnb 6X_^-))qX HHHgD'^D~Re$k00mG믿H$Bdd$ܹptt앭$S#cm*g@ii){ ]'i*'Oamm8!R{{;fΜd^8^1eF}ƺ7o8xxxcScoommŒ%K䄹sB,LJ ɼKrrrww>w}u||駰EZZ(}e}-ceeE&LI} ˲Fnn.?aصk4 cܻwyyyOqww!ڊUV!77sŜ9spI )) Ν+ŋ ppp]P^^ZKR)233QRR${_b6}=b߾};v,ܰ|r9sΝChh(>#XYY!""~~~(--Exx84 eY <B9r$kСCؼy3R)R),--!)))šCLjĤiHKKVEGGj鉻wNv-:u /FCC+Y8pn߾f455tعs'._ /// TUUPYYǏƍ @ '$c }͚5T__O/L...sN7nRI&04sLLl>EEE0Gt***ݻw;_T*Й3gΟ?O.\Hruu"RՔKnݢ۷rv/:z{{{B}6z=$ Cy]A"mmm8ްE[[/5***e!eRPUUNOOO8::nqbLI͍͛G~&b70*))!///}ѡCWqPQQZ7B$[zlllٳ4|)??uMK5{{{#$$III(..PTzHRQee%KIJsOgwwwN'qSu={6ТE⹓:}OiȐ!4s̿[e_~;www:v1N8Tbaa@,_cǎԾ C3IENDB`pnp4nagios-0.6.16/share/pnp/documents/_media/mobile-graphs.png0000664000000000000000000104621511662503006022753 0ustar rootrootPNG  IHDR IDATx]`]E>qwm.T-ŝhqwY`q]((5JҸ77r{4i;Ӿ{玞;3̱jcN>}`??鼁}m MEqׯַU39YS{n]y60000008@ P JL^~9ZjMm w|\  a:+9žɼ30000008 P^^.>>B >kC!`@;4̽ACt@@@@@@@goGWҵٲxmߞ/[wIaiS aA2W !GDˤ1</RH#0-++];$yv˗nIIҧ_?ѳW#UnN|> ". /R)ړ#Ee2O1gg֛ojڎ5w_՗_jXQ~j,I着daҝq<&OQ;N{1ya ?CnF>xw|gO}92~$۱}e6\ii*MHhL1]ƒ$jXo y\ awA݀Bj `Y^LJKIVlܓ-=qx|n_ =̋kV}S'܍oo>vJ7Ɨd{3t~,crʻO!Eƙ` p@njvu{Nul(8z}RYW䊫 /r'}(Oc>6m轹j~e*.5%En5i.q+ʩn"R'1zKx0 \r))0l$GȨ$'VvTʚ e[,^$k%h 0pCdp73ݤ~eB$g.{%wvmog_rG칲Hw!YY¶y ƴoR/ ?'J~TF(:%sD?-/۷mU9pSLoYArNݻw q#{_}"H(8P @Ȏe[oEm&`ϛ ܯ@"##l*nM&{ `$n16G;)!APK_> ŵnutdW{'=>6Vw}#+Ҵa2<,[X`׽{N7{Ϟ= c dz裏>8+H^#3g&5ر[iUeFٺuDDDʀd2vAvc۸~2Za_h2``7\ov^"W?Kj"%vx7&ށ~V)%{ o\z|(ၘUVTHQER?[YcCV\&-. p  ]W-eD) livwJ1v:O?-sWT `~~3rQ 0_/]FqZґ磌HU0vơGI^z%)--UmsTln : !Xͻ륬FJ@J̋ 1_~!yXHw *(^RXxࢿ曪gn g>X K4A@@*0{ȱ j0Z#-;&Rkﳸ642ܭvh5y{X Z^tҷLgI$>XJ4rh'T܃%Ѝ=99h܃'h#?|S:x[ZDG`ATI3$D|xSxu3助ht*$=\!rkx7)b'r ar yyQ_z:1FbGvY>F߱do?w?^yctWP)(t̕˖E}/du׶{) '$%PfRss8*T]v~S>` ?C moҽ# H(.%GA>So3tztCRSST|6B(Ä!@zBB9Haz)U <---S' ?a<׋ 8%f?TqڄXo=//ԩ&J}ԳN:UW@񎅢^\ m\"yyz%W{1(*X bbJ?TzO[,_{.Ťx.18Pu/=}s{XL*岯7~GȍJ𗢝28W^<#LzDz) ~HVo)ͻJa2W,GO +KhP\5-XN뇅iGvf10чvgΊRkkLN{ァtsM8쏎و|V {Br I"O-ɺҰ#䫯rJpB%Gm[6;)6jʢq3$4 ֌w}Ä,GA@`??78EecWDtq8t|j]YFZ|'j3|{y Bd铋 [9g 0o6\tO 7dumT "}HjTWҵd-[z6}vۣz[@<=AWUzҹݶH*~Hx2ydJ 8RoC xÁ{Gތ< ĮA`aUڰ\:;%cdϛ7O ~1/p\ryjpϟ?_}] PTTkjj嵋m9rHo?yprٛY_,ZW*O͖i _>I:$\ ļ)LX$sɕr912ux`BƆʇE%s dɎ9 +gJAQ=G5m7y: nOcAwTrRXRwmXu]t71epc!I}\^gnc{sn->.|Q)y0!@,"Z PG-Œ:C.;%UN ΃ĪF&E4*9zf*Yu $3N*}zǫv`J:vXE# .BCq&,Z^S~~E[+5Me Vma’F>3[uWqs"%hcASUBʌ/HZJwFL{w(}?ZPx'ɋ/Jٳ[~]C(ȴ 2<ض \g:=:\9~.N]}1$U!]q0,f|pgIП(C__~Y%!'bJ/Pi50rV<]pD)q[~q">X"B%d`BG.a| ^Zj*_ewF\T8%DePĈcVj4\Tm~ ǜ=l܍&]W91{5:.55U?N!ht 2!}@`ĉ;@|w. *\i T_|"cSL˗+]Ԕ=*-)%7׺Af}| sp'(:$L>d "c?J =bnnϯ/$b3Keo^ɩtV!mk?0-lVRR VmN@\E{C\cfj6۵Oϩ@p  W^yE)2m@+sY$B_s zqٳy8$tXC?^O?lkx҈Æ x/PSKXBAQuO֬]Cm";9шVS6]#$zVx.w?emJ )Q!}=/_|aU ŶVIijTR%9u<{Svk:.C.OX:J 'wgs@=i0p\SLeOײKK`Qŝl}&w`J[nSO=*$U"+=3;GuPDC'GdT ,F1 '8*k$xӧ[j~ܼ\ u[HP?)>&?IhU c8r bu{tUN~kǟGѬ*%'R vʮ]Y9`q0ְ`Rm 0QAW%ִEgWoosVfŠjspa'\ӡ' =[PlF+ b!pA$@ֳn&oi\;O3%-+D$F}؋I}luPh8PwJ脹[_P%Hq#h().rhf\4eZ4t(A oG*KȀ *B/>Î)\Bnލ2b|59M8x HS=~_:̹B*A8UAm4Q n\c{N[n]<KT\2̅?2 w+Z"Km~uER uryύ$_j1$h!裏*7Z/b9Z7¬Q=KcoExס(yx7O ^{Mq$/gw@/"ȓaPVI-U{(`FNJI[s>aq|pW7G&N]3{U ^7%W*EP@%(ɺۤV,_*D=}Xd4[ܖN\ɫձ+w\KCøe֙Ӓ7>~Jj%h@\rarery{q5K|á#Ѡ>R;DT$u563Fq[ݼ9VY -@**uGsuq;E BNg>S2Q$]ƌ#+mbm(tM08 P_>'{-ZH1Z(1cwy<&{ۯ zd\sJ*E(( ŋ~O>hIzs8#=BJO ѽ[RJ_N0AR3Q:JKu{~fyEPQ*g!Յ 5+^=_Ф+(@HCUfNWx=!t!@$mfI6ޖٷmٲE^[cCFtt&I*ZlJf|$2!1|*v{Wt+QGHihoʆgz+Tj0)\(Ps"v#H|XGAbڅL5'bY4~oE@ "4*K{h0dl ]0 3.ZPP,ywT\WУmTUEGGm7\NMr}bůnjh]uu^u-UOر] 1=|KC=m^Du|ACIzv) 1 ^Cl`q*3o0}<ɞzVJ]mՂ빆9u] H*2E_x{ r`eqrٲps||c%)YTXA v~Jg!,$HN1rәr e1̅uuI6uM5}BҟXcs@>"AI/>ȩ \bɉ9; /+Vvn!!Y)H۵[o!b{O?adnN(PDžb-]Nh ďGWNzN[7oҭ`7rv_N{3]޺$F(AղcwۯkOsdX ,-FK!+eb#LL8x!OK+,LCSXeV92}Z" J HxqG't u薉gƼc!ÆCy6_A4uAs!hxu_rzz?,{Io8CU'yFzZs"'LNU\*?h ;/Er3)rͩqrqaOdpdI~K{ Dma2sװI`u :-zi:[r˗Vy]ؑcH`GBw#4<ܽo*BNyVKZLsvOZ(Pu҈ܼ̙3G~m\(nKӷ>, B7&Wʳ柳_MJAw{*}eҧFiuiKkLM)@W1 N(飡qNnƢT<y~ nr1쁺7z݋giͽ+ f EQ&a[U\$@`.< :owV,W)Վyå_.f6 Rټy2紙-1S45a=k@6 Bcj]lv gfW⏢wޙ+ЋuWV M~ZۆB矗>H~7eM=4N&d{3N| }@hP륱ȟg;uʛN=a:>sGG*<do4F)w`{}rBP#A^S|I6R!Y(|`o$8_~{NI$p:b;k} Z`NYyR5P^VSۺ˽= i)FEs4@$]O߾@OŀLb)LIϔsϩ9qݜ,sUavT6;]G{]}}ke##ԇ7r+&R] EɼNuګ@SaD@GMqG1OcbMz .|r̵:58~7q=0_?_/`0P-?棵nK׈0Ew8Sz"il7tOmzB)>&NYW iG?%9w0t{wmsG!(r1؅Τh>s@0EW J|ed䂘` ༖6ihAcWn"_dYƈ1n u(b{SFTTty =+L"龚g09yukݵkъ528BD`"NL`HÙk-$M܄MЙ` ` `  ФpWhiÁttRSz&<&ZM{`΃oj60000000྇@@@@@@@S!`N@@@@@@@`CFN+;r} ߕ+ oAnj3000000\        )i2΄):~S>c       : LgS>c       :_o ` ` ` ` ` ` !`8:Άv0c>@@@@@@@!`g7o ` ` ` ` ` ` ` /!`8ڦ...X]S#EE+y-%eR\Z&UU]|^|}|%$(P$>:F"$&"JCC/nzd ` ?@îWuv)!pUudIFnNa⣢e=>Q|}|B.;|`Q5ueevzIM')Q(aPx{y9қCʠ5RQY-IVnᗓ#ٙRQQ {opęC`{F>L#l0öC%8ff o{Iux3kN' eɺղ7u$%^={KI8߷_h7TTIZ~eȮ;%5uTVV%Cvd ` ` p0B@õ{=pqnf77NW-e݆R S@@7H+=b$&4񝫪kJ+v5)w! z~^d 8!O=5\vgʎ;dR^^.^:N& 'o@! >l>t;.GiÅNxsGBˏIFF"  >'ƄE/Br#%mBA"CvQ$CleFINު$9|D ';զfp|X|uîMB7AD[`jn_@JKK$88DF OlUCK/YQC,$( CB!9HvA4zr)))`yeD˸040h.0 >ltF.ބ:o' \ݹxgƩ޷'6_ aI:a3A#T2Ax^HsI7Gbw"Q RTT(pٳ#%Y:aZd ` `  wvOզ&8&'լÛ>O6+=z# 5-rG_9DX )+/%愸bpŇ{Fpk  9{IY@Y  =M_N›>3No|__ִ@@ GC3ofMrcfY'M'w,M-_,(#FDIRd%Rg.F= 70%Dbc㥰@}L\wqO<΄;|HΐBn~: IxE7o(q&O +Gv -M&66V{#ށ36酁@+!`a+wflK[Gٰi"F">RKQ+BeieJY"*/q~o@J`xGƉ_Bm- 5e1/z[jAX q`/%u4X^Oy+޶CkIjskuw郻hqNpXHEjZM>,̕B08Lâ >l;'e'xCXa׻W? k'\؊R%oa{ U_yq"=~Bc)8±pW~\2y =(M쨗Ӥ]&֏ipE.lO}>/e|:=wZ*֖&AMס`/˹]{^+\uAH{PmҖ}نeW1 0 `o?âEpnu]=7wob̜0eJj*Z!JՊ;$8=}<߾}ߒbJr3%k:5Brvmؾ%8*5Řw0-0G]!%3B/H&LG߾IA?.H 5ՒN ҬS:{/^gx zJo[nqڷ4"F/l,ҥ-u\ư"BB%44TAԑӡ RAadfeAw"I(IlLDEFEE8<U-H C"<јQh$XT\,Y*M5欧`DI(Fx1Šm*SPP? V$7I@etdu7;yyj6]\\Wk9>\/;]lճ&>fa8F8VortidnV!'=|<#{Օaۣ>/5YJa8tY͵K&!1qLTTSȻLI?rH"a&Sx Rߋϫ @|^a-DM7#V2Y)8Vx*NGZY*uB|7e4=uo6QzM2uo4|J@"%^(C}ۍ֫:* n B8RRw Fτn]~]Sǟ׬~dνٲ=%Sj"T|W-[a|Ml2K{VB8 ]{X5N^oZw)֙#EdjSAg,#'OR'KoAYS;7CW/m?.sfjWp‡ WV9u8Ňγ6y͹9?ph?D{sK׭YV]LkIY6lr߄W++gAE$>[H˶րC Ee`58Qp,cM oP= $hÄ3GW-QbutWdHP\|!'KRa궨tz.K#?I6RVl)=_q"1; G/yr Ș=efgZ,۶Pq)m~;5ݳί:x{reIL d"{^F髎髎oWV:`j|Hd64}Yj->WjCW#C wb` W(6&; o; wFn?D=b9;Âub߰ Jy/pܪ&d]3&Ӻ&ŀ- ܉"Z.z\QU驔M}t-@+,*?'((XYvp88&868F\VG@-&J~/}T""b`O}>Q` 0}= -r*1u)"ց㔢ҒR9s\ğNےk{?eb{ DyNM ]/Wcs9*]?RQ/R'3֫dU۱~`LK?guYTal?ȼr|ZeY׵==lPW:Z鹀j% *Gppx+8aup^n1ǝ7۝,()V_+"l;'`CSXU|;^/c"+;]8F"CڧSp)g㢩O\qN>l,Y[R$'Bnar _cXh'2˜O k@:ǖ B5>_^_l4dž;yJTZ*A͓S̃ 䬬N@;7-8\,G[ğ34X,UTs@="iqk\S?u eqYJ^QlصW'%vŗ #ŮDxV̈́=d:Tg:RuT²*ycu뵷9&Hri>BI*WV7 20)Bξ5O;|<=o詖 z˄!e< xJߜoz=D={ )Af N&sU}._$WZnz9Dܴp&H|kw!!&ny'Mˋ^I uGEEHLL"tt1T@JpVtp8Hšde?YiX.ˢW:e@DJ=ems%([ k\i)Z|= מZ ((W[S,޿3S"C[#jN|oO%ӣ.L{d$q IDAT|KԳ› ;o`b w䮓t%W{,'O"^,[GwW6Yts4_cWT8UF$vɵPsP* t8*u`Z"(F!-_E7 Ifd?lPN :5W  ͇yk_o~S]BCLz^dȂ߷C!a9ׅމъy<:\{arуs7 sٞ5WɊ0HA 2~$ņI~5H(/ Z SW#Gƭ.j#M&~ەܮ5M%n')p-(tlc)RN(׎*,77_顎#pz [$[?##Kq8ɹ:pHtY%X k*p!į 4aʠ699-e`x:vlޙ,E$ƣ"K##jEgˢzτ(镘 c``f+_؋vPQ*?||Ɛ+| ft {ELJjѻ@6-0Nv``0aPE@6>jNcy,fgT >y{D*15˱B]\Qw_e%V,O5Qst\0v:o;0:^ $r mIҷM^نM!^ك#u#zQyNn+n\/ڊ[ųhAJ@U.' sN7:ZkRPVPxz1h|KH}p-]/<]t˅hʵ$|jVH3c @1=JP4v|qgc#woHv lCRA<ɵ_yEdkPap$GK` 7V_/Eԟ(+ uq`HE1d+ @Kʴع,"ϵ X7?gqLP] Ζ$gEm% W=0 7W1, Q"5D 9?Yc.>q|dQ<Ǎ(k~ݔ;PIޔ !UHQ\հ=yYRHѓ~8TZEfuNN vH9WIč!=co Kp]odars2VXAr;Η~! ghYyk>ECZ\n꒒͓z=usZ8ICeX$^p*Ii"5&WqL=@|K5yJ@.*bC >,oSw#tӏnz=m9‡?S~)U23lAPE`T[L#"rDxӌ |X W yc0F&/zeG# 4`Nb tҙuc 0&2ҍWj$&%%I}Ge~_= e۠͌ЄhG͆[f6S""H ұYŒ$%=cw/@7]b7q>R94 o6ۑkDD MȜ_^^2*W"%r249hm] skȥSUwLpRT $GGC7pp<m4V!k5 Z~DŽ#-/A#rYO*D! ,~I J+1 *\!d= ^'L1@O-ș&p睛Gxkf1GtRNРl :9_?H_7K6=m o 4>rIµ9Ǯ;E.zřᜧn#덅C{AL@l,~g8eDOy&\^<*/ OG}g4(y mIvmWS[wٞsD3I(fl+>䘳0Z)iu!qH(FX R!/1/x[Z-LG.nv2=sٮ !,q쇺Άא]d+~pt #[2FKn59oi%7JQiă?yhX?=bdꂰ?r€EP;ekj^1 pQ n8oW{2B>iWoϐ5;$Le 3ɶ_y4y@S<8Q厳.Po7KI5mV5}T?m zj.@j|OyX!QKsGA篙ğ.D==$ |ot\ ƓP^cULIE5dj(*W}k CGr5S7QJWC>Xr>DzDoTw1r-pF-?,Q83NXKYO>]F r0ũGy1o=KNTd$]m<|HfrP7ODo:o;},k(rb{3G߭kn[tz+w.G]c:?۝Ui5: P\~Bb{# @ćy"Cgȹ3'Erة$D_ 9n#ɯRdh;">@(;!d uw{s Iql"XTZn,c6$"Ly igbU4w&8:q%{h20RM#N.Q-ܼq;7/mo”Z9EJϓ?H*$_W\Q=lPXٙeywa6|WȦTS 4.;fKvMڼgH&O#\EYKߎmc\2kWϭ=Nշ(=|*Y9y6_+q$#WpXxٺ2t07\DWI"m^DmVxqȌ'B{µl2R'~Ur_w0 z(ahq9WxG\nl)ǸG~'sr>'0l3;\jMN$3i-Ffm>vQeiW vLmUUGo*4EwzP߭ lKSe3N.*,X8iPAh܀2kPU- @TĔ2HH860<||jlI/^_).)! ϐDѵ$V9Y);2jj.׎wmm׾O8(Xן=͡;ոD,Yт[\C&I%EMUIz;8x^ nꩽG\FI1mG?Cvlŕ$%XwO'Oh'uF6C'Ǯ< V;W7Q9rk'0Lx^ggxٜC!Ɲ2Krfه(8pRgW(Z\~49:V@Kطps ]fU@ra<\[<5u!9-_Ih4} ,{ERF:ʄ=P"#\c 4@(omVztSCw$^Q+XKgjLt v2 dL =@E^~Yus{=YpCum/p gjj}$LhpC,$/=JYiVl܅_BΡ!2QJהU]Á}m )sx=8Ϻ%jKS C䢣402!n=u^nʐ ?O'{Gȕ}閳胱iD\x98Umw٪6IgMk9z`YWoIw~f=O"םls6N[ח+FCtK-TeXLZ5}Q[aMB*Q0D q__CA6eyj}dݡZ.[SҝjC$F?0?N܅'Bqr + 6CYi&.nå|c+,l7>[o8~XKvݨzc0ǼuNIwqxFbP9>ߺ!ӎ[ZD5^~qST3XqZh>lf3-wS< Nj/UewfDq+Z~xQm}ەN`.泟-{(M?nƄ6C{B"g,q  &/WNKMmjʱrׯ6QZ ʠ i$Tz$QƹME/Uxj˲m&"ٖr)<$zmH>.pY߯U|卯a@e(2s MrsTHp+eO6r7 g;=p r8zHOmrlV\NM- @aJt yOzoPh\sxG.?uus)J{2 ,[u)h/whYة6!#' :$pqGNsP8EG×r7#ZoEB M+kN.sۊW<4i۞U:L@q2^:nmǀ7j6^Y A:..~~ L9r+K7F2im|G[!^K H{9+Qs"kTʴa=٩}H}b&Lg-=5t@f %c :{:w %4P <D`1wr\5 bdGN&=1{ lR~B AK\rtD${MvHMꒀmi: ӹvWn` fh0yp.%[(◖Etr!B7]MW=m;!2&5ZQBv@"Si4dWӠ?aCa욾55ZӖC8e$|ٖ^Ho\*Mc}wZz[:(:y)Vt k`q7k8V.pM|#BNϊՁ:Y?z&#u|Lm oyX mJؔ֔leVyYNF+7lu 8IOaaDQO97[<ǯWgimOՏR$O u-<ɗ5U%CgY>ѓԑ}@:v鼼KX@@vJ=xǻYYS|pZ8LE5Og/doNZ֙76кd%Q1DM[阗T&WZ)zK.? HYt Be4ŕ#QF8 cW|M=ӭOn16XԤG#LŽNt py S>?% Ȍ Yu 0z+p:B\ Ey=s,6 %+!@v]!-:Е ]NP0q{҅@l-hITZӕCXIeR'<8ٽ3k|y!''T.7k7#E<8z-UU9Wu0Dm'[%_YBZVXcPPΠr 9vxIuXϖfv(K%\:މVܳ- #&t p"A`NXFE-HI&$ 7p [T'USU.<9Xss+k8~ظA--' IDATrث_8~f?QLh,a?!^q2hs:n`/9V&A. ۶!<8FLX<!CcSLtt+Y??#6;=麩@!'RX=0Vzߔȹ\pޜВ~k.@$g1),*<ť F"#4Zj%*n-t>f\qty,8ˎIZue?I/?;c=z؆n[(y&\vLm9"I+V= [=x%̲nOƦbs T7U$$Q~{oN=>z, LY:tNżY[)J&SGit{2T'ӛy c:`,sk & A `[BGv? $xSù< tm\b MÝO)#N{8F׌@}MQG:sn|`xu8ԡz kKqU,$xaA>@jIgHJQ@{Sb{], H/@z7M7~Yw3{5pff>g3{;j9ښTbwdI4;}MQOCf<yྯ_tSzsW~!3=ZE?8GpAS)CB2KYN6DKA7{>y %?dɶE5^oEJK*,: lٖI-N$7k{Sq_B.?|ҷa:",* TWH.{w ⒗\=epo2ʁ_x>+&{B])ng\| Q\Px/;}Wwis{&<,9JxwFp&CS^B|DdrC@LAs[ vd5Kdb$w<=ݻ;@6ϭY$!͕GɊ ǁd]y]<ݽ;Kp#Xrwpaw'r v9@uYfd%%|=#D;׻\>ܶzpK,i X1~N/ο}éL jٴ,T__~Yrc =WJ/_XЁǧwWKN=Rfp&We3֓#fCSd%nO# s\xY+i Qr ݏƔx8R4 爕6pVr[; _I"EZ{%# 2vl) o.q: U 6͓3R*+/(?rZ;>⓴E}O[l0El),.#Oi->[#Lz=I͙3&08 ۮG*,k S\BxMŧ&oؽ༺?'G4sxl)7m?"2m\"8 ^sG &H.8`jr굼n*C~6Xs1WOf?_7l:1d-8)TAb/P* օ?@wf'g?B>b6^ty;\;L4ʜgɦM ֏8a'}r,pR#`Abڱ@~nlj{n>h_?B) #%A `lps& h^1]* /˭Wg/w>l1\m,] I1KkK- {jbIrHCZ'1y{Dnrxy<{W|#'y^h[/+hAao=\ fxבy;lJ]e61y 4d0#iL&)wTnPvo)/ eQcJy,7K Tjq=fo%O~~n$Ͷ]sϘ 'B^n&5J-)oZg1a۞wsɥC<ޱv*6ǁFyL抟??v/ޓm}|.}߫2S8[`l_.u~|Ϻr+5ֿI2Z'?=nh "%(S|lA-JI;/$~=wj=l%ً}N5alpl";fWxN>'.8-Uү6~Ha= ' y+噟 =l`-ޓM3nՁX/bg}ljcowG[qUy,"_޾2V{+C{cl,hZX_ w6@~?D{ј=K4"!zIr=|a zx\Tus r];[޸͖WHߞW2i3_sΒk.&\Z UD3t6׼~z_dұhsVͶo*ϧ5[[ոBM!tYͲù Zs}V (87pX1:#dmXjo5{N;};ăB1 }-0f#^WYzi[WNV R!lserN'CFnAuK`2o K!K*yz$z{;}q7kFysǞ{V3f& Y XD 84jn^a 6]+~lG즇^GkΩuT@x=\!3:#bC9Γec'z[dedYŮjRf#μj" ϟ-ϱ[Qz_nxynI{C31&y)O:~fIZW u+f`VwaG \23qC#Y5Tu;sl4n=^oeAჇʛRZ]ˎ #eU~rC xƍgEēOvrl=-MdE,|G|nv;KppOUˮZ-Imrx^._޳,&d{^ol6|aSN> 2X`it.JXr|ѬUݙGo]z@KLy+7 l=m=B׻)Tђ~Pqr=LxMVyCl;7Һj..a"ZۿsɊ#kw~to ~䝢dKZ]]}sJ?>|Pn#&mΛ/Y֬nteU)^M#ƌv?'}aϠ.mJ"pֹ󧉋m}zIb$Ê!` }=sWGw9# .Yحilwe7\F&anYcy[ֹJnv$v{4v7oD~.iS`9kBlم ސg.7;M7g:y4 C`#z]aP䮛vݬiػgwy #rrF^3,}e+)$A#mn)1fr}dng-X:[nc5nCMgQ&pb0 Έ@^6^(zؽzاz]]7^e=VZ䮛ZCyzͯ].v3{lx"{aӍnan];*B`BYmOwgfŲϔC0:3V\wfHl,^1/n)ͮ5n^[C =fyE$HZٹ1ecccs!`γa'>1r\v]림 8}y)#ݫK;,BC0ꃀ]sG]>k;,m@pZwÏKs e7 jŚnUS=q|ex]c[b4 @ nR1uMm^ n7=ݺvwCeY"X8W7t kq̭.cE'*wlY%!`tC7z6orݔ`ۺz_7 $@,CgI(PvLQ&mq۾yj<'/p2P3>Me3ep+!`qzhG`u[}}En\d,d1A^}"سG/H7Iv*5_0:&/-a۞687țWd ez[wGOڪ% x%!`AiP2;uˇwvdY]F [ù lq-q:-Zqx'l;Z6 7IhvS†lUDU ӍOV"3Qֺ dCUhmFU*[Gsٴ{7J /ͺk䖭nnjo Cu.fÌ-|-g#i3HR0 ΃]wcݑ;x_k_\?WB{Vg;Z;Iv=aGchG1 C0 CtNj!`!`tlk!`!`4$ C0 C0:6ؙ0 C0 A0 C0 Nvn5 C0 Cf0 C0 C!`3p C0 Cx2C0 C0 C!`3`P C0 C].\Xt'@%K.BMS~VyCXZ>kZ/fէ]Rm$b%ڎHOۨk:Ȕ*1}׶?FU?f|F]@Tk16Ҭ16ھ2JL_-폱fՏQu<)Ubmi4~>L|mKclYcmԵ}dJk[c#ͪ>mx S5_iV}ium_R%ږHO29ʰl%lR= 7(uʱ;fO;1{+FrI/B9֓mIiƟIugI}}~B}rSTu5_K:i1k{iX[OZNc1}}kIO~L>^vϣ]d! Qp#&eQ< E]gcTQ4&j1Pu}ZmB~RmOG=ҘBC]Եi9 )I=HcKYuQ٧f,'t|#.e#~L>E]gcTQ4&j1Pu}ZmB~RmOG=ҘBC]Եi9 )I=HcKYuQ٧f,'t|#.e#~L>E]g_(םN:b0QTj?8ߎysڬ&}gOL^U_篖Ѷ]`ee IDAT9YMv'<7xN:hw5?PU38nRO>*i3R 6MIG%mB [a]I5_b?I_XHa+k7vRY'k )lum&|N?$}6c!msܤIg}Tf,ֵmTu;),Jڌºqjn'ş~QIVX׶9nRO>*J!pIzEk_ڟ11Z_:>-i~|ڟ11Z_:>-i~|ڟ11Z_:>-i~|ڟ11Z_:>-i~|ڟ11Z_:>ȷ-6y(i}e*ڤ/Ҙv(&K}-i^os$t\LO_"ًH7幘F@)E> ;vHciX'Mc.Y'-^hvHC^R=i_ꢟuri4% mNF_.Y'-^hvHC^R=i_ꢟuri4% mNF_.Y'-^hvHC^R=i_ꢟuri4% mNF_.Y'-^hvHC^R=i_ꢟuri4% mNF_.Y'-^hvHC^R=i_uBQ{hk${cST1>Z&CKLrڞ֏iد4Xb#~O;Ũ/&~Iӧc|)F~19k'M>>H=N1ɱ_g?i=)GivQ_L?I졏%O9RmOSjbrOd},1}ʑj{Z?ƧbTc~${cST1>Z&CKLrUp=S y'eu1cŧcz'G_oy,>-k{֮x| ,(Y X51Z_k~k{;>_ǧ|Ϫk?5=h֏g~̟_mڞnkOx4_kZ?Okyͯ}mOzǧt 6:_yr8P>PQ˦i)mR'*O?Ch2Y(E ݤzڧRYC_)lӦMflI}].OU>:6mj4mF zڥRYC_)lӦMflI}].OU>:6mj4mF zڥRYC_)lӦMflI}].OU>:6mj4mF zڥRYC_)lӦMflI}].OU>:6mj4mF ] `1&e0cAO1kZ($MJ]P-;KS>}0giyFkEǫ5IcڟnOVR[2z|Z^4&v9m%}-ǧ5IcڟnOVR[2z|Z^4&v9m%}-ǧ5IcڟnOVR[2z|Z^4&v9m%}-ǧ5IcڟnOVR[2z|Z^4&v9m%}-Lc0a!֩>GbvI\~O1i!Wُi4&#>B=<"r11>c|G[\B[Z.f?Ƨ]Ҙ|h 4+VhTKmFr mjvIc1>-CX-R-.iL>G|zy+Ebc|%PO#bH\~O1i!WKE Z0m;Ѡdv+կ=m_+Rjǣڕ_}ݮ_ՎGۋ+R}_i]JkW:juRW;m/֮4Ju|նv*կF<]Uڠn#cКԦ,(JL1{4/(ӯ|̞u;cՖ|n~L1{XZ^ۏW[>fOu_k1ji_ckym?_m=v,~--:~ݎů~c4_ǯ۱ӯ|%zhz,J_0.Rx) J|꒗V6Q&-&~C.i؇:eӎ'<|*,xڿʀGa%}C uK+O(mc~Rء h4CiǓU>JEZJ<_e]Ұuʂ>!䥕b &tZL9?`mv4ynګ۱Y[^b-vl|1~V{t;6?zk_^?ݎ/jڟngWoyOcګ|@kmRm㗶~,?f?ƯJ:Z۷F _z[kbc+_jmgY@5@-ux_m6)vnk<^5~m/k{5?k^V}?f/t[k~^k{Y_mYk1{1Z_Ưecb|mOg_K@#l9;=QG 6^=uJmޔP K𪍧Wmݞ~_*'ނUI:KJt=jg/Dvt{_p:]m_}<2P1: ހjg߾ >xh&Pj㫏_ՎO}ՎO}ՎO}ՎO}ՎO}?ڙn'(Wb1~4~_1Qi|1TlU_L?ƯK4~_*z*/c|T_L?/[=xӏ1R>*/㗊JiXV`:G~'|qK/xk:U/*_q'xʗW'|Q*_n\:G~Ҍ ,8lT?f=*Rz5WWS=*Rz5WWS=*Rz5WWS=*Rz5WWS=*RrJp?}%P&SQ@:NX'? W1b~BN0N~u:զa aP&S>9uCN~iCX/' c:aP'_m֋ e:Ø:NX'? W1b~BN0N~u:զa aP&S>9uCN~iCX/' c:aP'_m֋ e:Ø:NX'? W1b~BN0N~u:զ3PCNֶ9su;s?w^[nV C0 C'[-[\K׼n+k\êF~NNwd=J%;)s3~HƍF #3AC0 C0+܂EK|bok:2HC%+6[r>~X7f(mQӑX C0 CHB`mnnނEÆϽP7|@$e۸HcD7o|ƭ^z{w{d C0 C(uܴ7g 6/E(: `݊]>}ܾp=z(pS4 C0 C# i&7Ynnzwbuw^zZV0 C0&0]y:B)0i} ח3g8u=s|]C0 C0r8MsG_Nܯ@Q|iU0ga?Li ai^+}.V C0 C@\rY|`0e YHLrqZ?-:j#f6 04Kcd C0 C`Bβ+}Բ]7.4xzg=umq,&~$\ohomyގl͛7MTڹ0k'|z#bz !`@Cr@I(0 I@GR:;mZ?l#zMC [vet [M0čnݻ%ɩ--YcO$ag~%2[F4+zɮ6lI_٧gϞ~IBn!`D9ϼ|tL)sRuʑf @i%-ihqWɱ0ִ٭׭Ȟ:hDc%z46nV5r+ߍ9\A֯oWի}2Q#eLwӄj2!`! *ymr]O!@Azo'|1]/V(LJi:퐆oRv1@]ۼέXRQ7tIح[W7p@? t])k9ޖ-[%<ٗymd( dszcSSO" d3#+!`!`$! r!$̓Hֵ HcZ"0M_K$kM`duc%Y˩ud ~j}V>YSٟ6ݾ k>%|U C0 ChsBo=dv|Qi>=CHI٧mM%^L\]Y]V^-$ On'\Il1lf26&$&³ۊċ~vQH[C;ԫ,텶G ^LqPި!`!bsZsB>_ "!@66oͮ]?;H5kָ]wBh׉Ɓ[e,`A2(qrIr8R+x/&쵭X \hca bCs1 t9.C0 ChC\z.zX55Oc@퀁2hʱtEY86ˊ۵c5=˳AR47QV) 22--jc,<(c%XX9zDx0$X=X)dbKp@brNVV(Kr,gELÜIW=l0ퟭ>hbHz8zK|}ryܽ30 CG0`.uzRd$%D\ Y-~u;9-vLB:0㇤iZ}YaLn?cr f=$d1 V:2!Je:FE'1zI4BQfLe8,9:le2LjDr~ڑp$[v,|ic@P0#<YIq p ?!`!GW$ryFP!%&Đ:^Y=`?6~Rͧ#R=cAERF56}ޞ{mGo⟿ te0f|x[M [nzP jIfٿp˜anFF5Kܲe͒`ނ2CH'_[FWk%(} gQGdfeܻ$e=l587oƬ$4$OVZX˨ayՍ"\!%u$:j?zm,\ht^,v4xߣ(j!`)`E +ؗdj%M*ڡ$fI2(~;Yq;܋/\v `1[cycZa:US,)V?fǚ$yl\lK;];oIߟZ眸 ̤ ܑϫ_}鷏۬@W{7r0#/txu_r/w= ?vMi^v;䃼ƵF< fb?{{ܤ 杴Vjr>mbq[1 C0 6xm$LP?O|"T A8ic4AyBdm=lMI5Ă^?|@^`f~-mEt8̖YHm$Vvtw?Guu7TyuI(&g=1.ɆsuNF~J~]CfV#w4O=}')!DdwA{/N? $Bk2 C0:^zR_Z )?P:gڬ{#`۾4ʳf_\^=K37r{%$fY{:-+{΁yĿ?/efۯ\W1KN 2$W⫤[yG$^={7aW`kgesO-'3'!ꆀ!`!"5BFa4hyd IDAT1@C(N?f֯ ~܁{r1ɋcoOLoMr+C;VhOö+"폟v̰"qxof ܢ=ܾrK}ۏv?;?kS0Z $ cf[ˡMM8?N:t$5.;HRhk}ЭB]G rq!n1C(?pw3y9V1 C0 0"MieO1I ,C^L|윬mY>};&nkhڀe>!3 R*J *"Ce!_Xf-jp?eyk(/X[ϋbK-_3 Ï)F56SDw^J n ߆g̗u&+~'6G^`CdrٟlkWnase87j!`t6pmD^DZK jLH5Ҡ1۵Q9ܿ9ꟓ%<@ۮy+ؿy{lMbteJnbQkPWWхIx&%,+ݔ9eoawK%  iK[l|؅m5mqy_T{^|c{~\YEyx *% 璕Mq#+eLJZW xEݿ@¹7/9A^r@w{3TEźW7sL~s~@,lɽ$!tkuC0 CHfIs[SQ< n 4&{'Cceˋ2t)t=lPU;h<#(7-iԎ_ώȡ \b#[+VOG6Ж2P*$>)M>v>nwS]_y'J2%<]Yn%27VrIZ0 C0x /ǘGPW$[LH6䐺e4 g/SY-I} KkGI)Uc'zFEջBniszy/镟=h{Wm|i5dùܫZ6}mN(}sRc,+n~+q1vqǯ߻5%z C0 NГk}`u I&ig 7"X[۫܂^rcl-5Mk[& ܰcڅſ+3zizm1p{IϫFq>flj^½6}<߷[v?#avݯ%l!`;I1tZI007#MQFK2:eO]5?&\xF*D X^޶v*mrgK}NN/NY*eЁn,:oWo'fې\5ɶ7o(.{ nqk&yƮnm f ޸E)?A v iLSCslT`oxB^wu7|Cw|MčY]tyT0wYBĀdq52h|cti漥n]soM[m |u# fyƅ+ g3e_:g)>Mm3Wv3j!`@\Vle @ةj1>þJ~FLwzLzN%mX= ft)e zA Y>uGp,VޱF[M_5m~ރ}ztbZ.7NYBm\7}I[@Թݾ+8ww?"l}>_ny,;o*!`!Os֋PR&I^5-#RՊlNbbu`OyY b<)7p=')ek6$z= n0sLkmrdrf`uOpwNXmܼ]ݧ.8"Gb^(<힚0qhX]{>q }sq?7_Ne_A.$ra㔘QrKN$ R'$LBkn|}[!`!`"FrP&S> k .߆ W!(LحmJtݺ1u}pE{4F 򷄗jvdձ1]sonnn>RF9ֹ̥ k-0!`;2s.3gsbWE ^?CZBS6mtAڰ5cb#63:a!`W?%\ԥ|@f|/Tma@%Te!`@@ _>@,DGiRQ_Jx!`!`lTJ'x \4I޿ C*jГ ӾGs C0 C`E'/ YZvI![ji}ڑ$vBa!`@'A ̭OiX>F-4$Cg۶7Cފ!`!`; a2< %+gHibH&$d0 C0 ΄,R=ǰWEB=ӫ )$9`_}zCcY1 C0 C ˧b80/#I" Rari)uI+֯!`!# &g%b\a=A) yt)t؇:Ӟև֭ pb!`07*/ @&o3ԵA퐆}Zچ!`!`tF'/GByI=K.QR"e?)Ef|-^ Ċ!`!` %O0K# L@B:!LXOұ>C0 C0 6;$s5H|RiHt>I?1^1 C0 C3#\e4/MYK/xPIc )LӶm!`@gG ̵IRڀdG;Z3&QQ:.{ 'j0 C0 Nc=4i̝S%mNW QT MǠa=I}֋[!`!` r) Ji<[D vR>-v !`!`NDf̔%NX قE Z h] iؗ$o}!`!`t6K ob_9X0"MQrI 1j (ɿ!`!##\c zlȯ34D 42xаՎ!`!`sN|.ZFzP: tg!`@gF ̙z9\X8 e: N:F C0 C0 s^(UrLAd C0 C0BId#+Ed C0 C0j@89L :I*$jmAg!`@'B ))d_1*JeMcN-[ŋzFo(M6|zrηb!`@) (aF~4߹{R1}CuW]uUTy'ݍ7YsW_}u!`!P6%e{(rF1lczhqwy?*1 C0 C88cnZs{4cصk&N[n|uCw޽{go0 C0:9I3t4 SUn8cٺkƽ ᙺW^y}tݱ[ dg? _y{_Luo~͜9}k_uz׻ xls{9gM|;JcnbZ0 C0vp83Gu=o|nΜ9Dz™uT;l'K֮]K1O?:'x]gJ10䣾nݺf-bmC0 C0 `F fX/.(\n[D4A:1Hc=PA۽Pބ  ۨ|#qs?}ݷoH@o|QF=~ӟ.7oE$[1 C0 C-63%L@zhTXt4~Q2yԧgnҤI?a 9 XYr8p\Z$eXrgӼxƏc~܂ |$?i;Dx V|1CC0 CRXO а[4!) N^ZyOu $nv)C qrO03GXo}xx#ݻwu!lB}2ϝ;7o:>0#x?,lm$'Y!`!`0O Ũº%O^Lr>@HPReEܘA @Ȁ!vo'OvO=.m۹$qK.-9蠃$M8@.րC0 C\0w`\yF#|1]'4LaR Rʦa <7xP!q-ȭijrW~KEWcQ/qh:w bx!;ztgJ7ʗf\C0 Ch0O"E|a]KiL^]M :a#%1PҘ|;.@o V&/,ÆbN'|_+ uپׇbV7 C0 Cc:AՑ_M tLʠh7 (R@%S-tܸq=ʐ+pwϓgwm7hoa sayDR# _ڒU>]3 C0 ,RTOK3BkA2)FC i<*X\{Zʒ%KVgxnE|aO?ݯ e1cFnI}ݗLJrswi0 C0 T9TXr4a+b<а^|l6."6= _vb#o'Ȃ>ڋ-!a:uj>ٳg=Czl񂙾GM=~򓟴K4C{V7 C0 C 0_ :a΂:dH)_r PhNb|R- ;.}u?Ο??"?3ް<{:$\QL9? O161bM Z0 C0 V\ə'OcZvHC9AC 4F|m6QHٟ"‚|+> ub0ž|G_m[Uv12e/aYxo"vѰc0_~!ꆀ!`!`dF o1 ^3Y)qX'Qb$lx_;bulx#>33lP1cƸ/3Lxf Q`+wko?C0 Cر@4adPy{-V@$:2a_X/( M`@'d d!"g qzao dKkF܌=Gټ S- +ǝ#Z1 C0 ΉsRN~JWr0&B@bԇgؗD)?ЏBZJ't?gC=cۨ!`!`0!ň:[ʄ< 1ȓ:a@jr4蔣T?euC0 C< HOUR+ `YtPL>Ɇ!`!"JLXCt>hHc>ڥ'[!`!` JIcyLC2࡞0(J%c!`@'E9T3Ji[y IDATIZ[ZAP fҨVdBN%T0vf͚v}_^Xf[tӧu]27|޽c=NΝp;wm7ףG<͊a5k?g̘yz' Vy|ˮu577ﯵk׺>! %Kü4)Kt ìSrl!`tl&N֭[ Dj*wW_WOv_ӨU,sꩧ7%Kﶊ f0p嗻W^y-^M6M4@;+HD`ڼy??qu9C;Z2#<{ŏ 緾I˯B8X| ` 1 %,^y 3w fgPo=]7.bꦭcqСjynJ.\萄8a qႊ xcǎ?fmQ߿/|FgϞa_~nѢE~uȑ!f١909YT#e)1 >Ë>8͂ 0&Lp8NVv^pW?qw#>E N,𻗼RY d1)FCdؙ~@$M$X60{W>+_kll/i~_{'!QKݙgclfۀw/<ꨣ|=?O>xV?A>9_\;f#p(zaM<"};,=fy =W|Xc.3q$92$c|c?ؐYgluR@2vHRNICE$G }AV ΀.\H1>6n"z+Aێ_|Ew7>O u ^xd"Ys_j7<Ç<Č9F! '>cC#1\o{yJP֨! ـRzavI.(}]pˤn&>~)!­GܒF2/5|` g>H!C~[H$ 袋< N}H|>[j>V b6HxQ0=:&\>pCaafvs$|>I n #, 3elV9VS#O;4/0YJX$vi?b\t`3,!F|GRI|CjX?߈\5fyLs38  Vzc&_n}@|Yg.60EcDJm}I~+%ph( cة3x"<OfIup[pA՟I!LE"|7fD? /Kg\L""A Ƌ>.׿gV1Dܐ\O1qItp.zalXn/:B x1;@B|{9ߍ >na;,xΏX1#D|YLf0KDa~#$8a=`<|phY<\P .[X1Fr&8q$F/="mS V<,C15CWGfqۙ BH\1fF H(Y)Ǐ$!$cJSp -aaK`۶x{a|ěE;8Ax`?6|`z&6ٱ@ ,yK|'Mmg!$d*- (E0(x:,}Ia DSO5*<_ uvT_2H H ^..H>0ٽ_H~7@3ao $ {h͎޷#It^ G "zTp:ԡpAAQr|  BW\T$$ IHȫ;~w}W֪vvw=]֪Ys֪U^vyQ21v"WY #hlICQ4*`F]D4v!/ 81Ky> |'F dHς44 xFC9Өkj4 >ڿeCD6i$3J\zçfFh8hEqpi 9“,F'Y?t Q +"2iGyAvt.ҘF<X 0-Ҙa)sl~bc,'i РEntF;Oi xUyp:v_ u]JY|ƫ]ސe(U⊬@r0WOOJs$0@ <2 bSA7@2'ڟt:^uN)}: §n)|9z)7M 06x&>r{y@ $0/CdTdklT|?X3?@F|&8rtOi嗛:6a9O+nyp=@ $prK'#] 0r|'[c57>5%@K>3!n1%]'~i[LpKV@U~K_gpo H` J9HєsgW]x\Rb{WquOשaH` H` _,`Omzso$޴tg60j,VyH` H` SUˉOi(^u7w{% + orTJU\S#]܁H` H5\=1@]{Gm,y{.1@ $0@'8C|g?djo]$?k_zA_ \81b ۯ>L[ahd$??G8Jl 5H` 8y$0Gۆi.6-%RWM-_oyK] o ::j$&B1w Lf-4j]Ǧ^#my1zdHzgϞb^Y{O.i?b92D6^^Y%:G=CxFxkd!`ssdHmكgf.C/T ; 7tS\ߛo9AK76SoLpS'6`KIiVoN&.c.E۶ڡdc ROՉfw1OAº@7y0SpgF}GFX1$izd(92hJ"a=';.-{ϫ$.=G͘CEdCxR}؊WI֋ ^P^"G^{!yiS.=M/>"gOsRvmaժUll6nH7+߸?ׯk06#a=`|0Vz;w?8bfazf}&~œ) (ܽϞcTC21]Tݻ76$5gԋǘڵ+^+.` L FQ63I'`T>?M-`{]%?Sr$>rL1M2~+naT\0SL%b$m1nƴKJ~)F#GҊMMr|RRT|0Ǩ<_ cZƔ{ cWKh+f CI);Xƺ:{.`cޑHypGK2!L]+i1-c(؃VTޜ?qMFIt>m6kZaǞ0{nCaD^SyL˸BY"GxKoTF^=q$r;2eL`D>YlYXn]XfM|d'0'=GN=(g?;\veqt/qcl>ka7gW_4kI>{uaQ\I7œ=rӈʵB~&uNjH%Ieԍɋ00Ya7ׇ4ݴcc [s9s=uϊ /0gSxS~L?yi| oþJ`p/8= \8IF-a st G\zBݔz:J/uSFҸzރEaYFCJG6]nF\CWYMu.qכ:Wt Kh=M]W.OPzƺ[F?1z|0Zh+=D^].GG*:iɫGX':U: }CXQi!#HVUrz լLzlB>iv0Ef )m[x0"\( N=;mF~5ሻ=z(y^3yݯtr`KwAzH|yzO}*<ψ{*Mzx5_r ԹHpG~oo7uMnY;w;S~<JJ.DL&EK`Wq5̵k׆agzmdH]V2AрN;-֊s$-V `l͊&&RIH IDAT;Rf]r͜E^'`e;m4 F`+Rmu!xՁt\ps021q V(9~} =7NV?\vڰkUJ7+^z/Rq} W]uU+n0p+g o=ȉ^g +XD`U/)5v*y ;z"72$>=DF C.y">a#]/F;gh0zx1zeyR֙m"dx2 #uuTƘ/됡מXN.Qrc`FlXW 햡C-g yRUNjN@FF#MozSxk_焷\[['ZCi/Pi\juswO"ci~_GHυ_ z1zg).g 2#=,bȐ|xe8gDv2lm4 k/Uxpۯ<')زTmM# 3\H~5ڦ]P bmyir`s]asb.fI1ǀ ^ _8_+ cǬ'7d]6_j=kl3?6k6-A'\YbIn̆w[/lċQ11`hq3ɛhNV4^1kQ:6on K[QyheHl!܈gl% T {ʌMʘrea-?+ mnB0^=%F7h+=DӒc"ZLMNcF;O2hk+UzctXum cEUӉWP~%=Dz0S1̚ty^qE}ȳ[xӟc@Cs(m6xш!!5WySE]`__g;L٪s\x[>Mn{7sB޶m mDqPj"^0dꈞ+2?b li njk`J1>a!/kӁq[XAh]qcX x`kl 6tcJkНux 37ZͰ^AT")y0z[ E9 WCR53lC{1z0αNS:;JuWI׋ѣ[ h+W5uͩ4kD^=̞GRsy.7 cox΂BݲvX]XUC;͞y6ј5\Gn۬8eQ'+KmO/^k&<\u HV;MO%QE b+Y#8 6a s1ꅍ#Nqym!Oraa x`LiF:aKP6#]`\f->]F _8b8m?/F(ـ!WYMBI'ʱOzH^=#9.F/FD9{F_8ꜥ(-Ϟzqv &{va,gʰT/zm%\G-{+7en=$]G=[C9J2KoLR FJZ,m`g !K%Cԟ0U"r@7ɭ+) r?__y~#dzz^ OxB_p͟˫^0@qmcJ4iEKhXyL%"L .Nh(ȋ|4=FJj I F cdHm#]F/> 7(gPO.Q!#|'x$սD *|s}~^>U=|~}NScޞ}+0D(-(v1j]/'Oi> 覞0!>q#ǥHS^SC摣WI׋ѫF"y!z1z~Gd8dMuWGrv0~F.9#\y7>yg C~M{D8R<]bCnL"uoiL|RB_s7 .?pE_DPm5K29\)]J9)iF M!4n#xMלXQyV:z)*r~=0M4<I 2k6a$mzi<‹c*?ʟ|4D`\/Fxz h+=$]dQyNu cc?^U"i;<:oTl%C0G<~Z`m}H)XXlΫ¨=-T1ZbE@֐ c3asFy Xg.G6Qcw*p4\U/_%^6}Fsd&7Ǜzޔ_pSuNn lq1 R/dYf'Y㉸:h(.|_Q=XCS8a6Ahϛ0!Ũ<1>N\!=p3ňUaTmN1ʧ k 2aLq*9eL2fwF\0WEؕGnQ8+-o|Pt8ͯȫK"G@I 0Tf1F1*Eq0 !WarS[QrQ:\)FنV F6/Ř!邅cK~0I+=b1{uW02w>(Y{4 )м0Xct;C0RSϓ!r2үVTƸL oʸ!ԯ4{_sC#W{> J)C%{Uq lgat5 i=׏||k4/(G*;Y`i$<GOhdk" sa'Wz0bT gVT&,Xi)^eҴJY$6oެhWSL"cuKa7ё##uO^=$/^^=RgIKѣȆ ڳ-fc{cD%Q3RszH"-Fλ*!yV'=) 5[l}_oO^mR1Vs&#sfauo{|O7tcdŴRھ{uL ?n Xn?_spWȩD葔h9+ !iؕ0!Ћ9}C`%Mjr}8y5l#a~b!=z?#ǥCݞmwRCڞ:ǫ맭7Ft_uWɇX/*|eȜw&g"#]lS,waFɩ=qumTSp<|0 [vNP~ܪ_ΐ<ӽԟK_@,ьM !kF{<|4S5C`#9F4Ofm4zȋ#CkT|r`$ a='^=W;GW#OPsCy1z~P1R79갉zҤN.V33sv!"CO3Cyyd"p~0  ܴ(< P ?w0T/dP>VaHk/az^**/5M-#=A !©Bg-FބLUO.2A6)6aL^$ބLuzWɏRFr6|Hx1\ҌriH^)a˘kɢ cZK>zv0wurI0.TIUeLc*wQecihB 6 ۊOnC6bҨs0{Nyn`N(n;b4P[AM%?\HcT׻uBS{tyo0ʖ^mQeϝ9Me#ͩÔG)/zKZRCa"md딯t W%U!4$i4S4ۆɭgț\=ݗs7niMg px91T8*(-rgl @ڍK]鹮+(=rr᚟!Q0<+ȍ_#FWqMrss9S \)FpL?\\,aQN.-+X=>o1-cE'_ ȴ coѣEr$O9#ܸ/z8e1z Ga:nFL~Xe+ Ꜵ 2jmB۳b|60S+0Pkͭ04mgÖ́)5g䚖VJzHK,؀:G23,\𨢯R𫤴sVl>7x<` |H`JX1l@v~<@.%Q%ulѕO|bqA&bbĠXY1" be#`&ÐyC v /t-`2.ɰ5FӉ㷨]L^Ȑ҄9 W%CFR{&/%F"/FDJ[dlRszrvsA氕3r[4ثLv+{'F 7>7n]~3zH^! JsC仴p?vhCߴE4A1(i ܪ= (7m^}TǾˋU*\ҴxLyAzQGdgҌ {1bdޣXj@kV<7UĂGm1`)uτ GF¤[^rFѣ#9.F/FF9^=G#uαzT{|^ [Va %v{@l:y]C.8Snz/='L9e3,\Gs)ь= Cݤ]"CcP;蚇2l#C cdHB9/ 0..F.Z93SF2b`nԋ3}!yY{L;Uɐ`yᶃwE* S21Ͷmw^W״'W<F~3(0+޸4B mk*LxMvXdg8RX&c 3^ ȻT?cuȧ>x3JҶz1k0zŤb_srFtM9{0F[)!y=r#W^=W#O0"g.]! `!yA=uW9_lt8ވӲe~[]CDysjX.;jɯU8gqUĔʭb?w0?Wx s ;wƉ '3Rt\n?aG=qϥ~8:ww@4Bkl37dLeN+" F?CXa0r8)kM9n # & #s<& K12J`z5F/)w0<`Rirt0*\vFŁ061RP|USDqqH̋o?Mn+K T&{PR:YqoU+*3\4W7_C#ceeYشfEx޶{iTv%=$rO.GK8I'9vNa> xMhLBg$7 'L~ gsK[@ƤrSwwqyK_ژ~kŸ9 ,[i6J6&!r0VzCd#RdϼׄJyFX::$4XmK.3ԯp_DHsgq`4N9T~߆׿Q:jS.<~'(f): XL!/-W:']Ha lSFȞU =Whki% FzޭZatay">a!z1zGKѣƋ+ӱ!z1F{.!#u)l>v1y #m$na?ٌ,_a˛Xuyeҡ0M,xeD-NHyyEE1}o_W2E/#{uAA/-oyKx_я~25r$K4|*k"!4v6l 0YHW#B^)K!A~J4iיҖE`9!Za,0d!/FAXE9z1z=z9 VȋW9K.q i"'m_S?+]1S"yĩO&~2_ C|`;D]i̙O~a_mar{N~{pvo>ikpc6є,5S/})VG͵-]9 ,oƟt,SaMygʌ6g=^OKݛJgd0g"Fc5b!:^,`p>flwn ˌZ;k1*SND.F`fq#iXZ E6(L*kIga\c(IFdg=o F/7/ז1r0[lJZƔ1Ch G0 #2$I|#* C𓏈zIIXQ~%=MЋ&=Dg~!znaÈST1zvU:XW-Pt>a*=D-젩>'F]7Շ26yUɱNq56z|ғ _ vd{zz>!&nb_h+ !MΏQ[Y}.0fK_bԧ>qՆJ]q=_ݖx6I x<2 6yO]s6'po1|gְ{[>ը'‡>p 7|'1#ސ}RE>li |6ao-9Gѹm~pǵ qPUk!ϿcfG, ^LTcZ Fʰ#:}nlxaBM`r>:t Uֈqc츭ϲ2L6z|F[k7Ӆ9v d^=<cM}CF)MC?cqN6cz",yo ߍG]5yM PVy~~-\uUo~sOFq8O{Z,߬5؏D4R ?:.#=7Fk8Ϡ|.#݈\l*P*dG>rlUN9z0zx1z0b`ȐtrJɋ%`!iy1.= [_uG9c[ym%=̅o~۶=/:mEŧOz1F{vax>Ć-5xF _šE.[@O)GDžڴW%[Ki)1F7!N?C> _ve=}/BdL}mO]аc\,QZKjxhz]+=HEO%bCO̼4J~ IH׋1x#G/Fˋѣ6=T2$/^^=}5{B1h8l!4 y(+)5_z3,Ѹ ;[`6l hTšcF%Hϐ4"D,1.W c|Xm!/F/>ҌrF/>bRC1bRa!yb0&$.zً=zH:3C=#^3b,s|r|pd ~W=$urJ9l&Ieit<+JM,_iKUIĽD ?Tz#>|/=QM3R(GXF )U`4M bT|F`(* ^5N50*¨#5ڑO$OaD~zyU9 4-#UL1L0Wd//#%‘1xyF>> I y}yVEOUatO2!\+ eH๯{0_ϛiն,ͬ©! OD,wt6e> ^wuqFM2O˃c|Mc g=./~bK~M΋+γSg7Fop^|Q~wQx5h2pUo *{v~== X…Wf",fB1Le#&2阰`d3#'`1o(~`}v?aFbd8`Q5yks8f-ȼJ~T\W2aS{fUaluU#<"V-/ܓS=I8hVz/lGF(M'HDۊף3eKK!-cջ[#2wa{l9K-FI7Ǹ =lyaϲln k"f`sp ePuyH#-# 9cڄQd/Zj+„K ~Y/" ;C6T_D ׹)`=O3!^f+_pg~LOiZ; C3yC6zU"XMa=ai{Yk.Nt&+Gop^n~IOXOr{8ݩܻVy7sdrclU.kouљcv ȁ;F2klZ,6:`7VH!&gu#U|B<<| ( _ F´qjGOϾlm؜a)rK@3v1y'b,(KFz`=D>O2Wl!CFx1z#ǥG>2<^|8(gUM^;ȣr ct`^ov'fp(l\9 6ٺʫ^=D>TaH?eu@nI Sy#<}!HP8V'N^|qdpۿiSڏ1߀ %U c轒v4c'{0j'](, Gl C* xHJaGXM|'^=GLjGKѫŋѫ筷"$.z홴=#p{0lūrN.V/ [+Ͻ29z1a [2)eءW[[׽ԯXzUU4q!~1_ωԆgMڧbXU祗^C9E. CÙ澅2[re@7L7‹#S+(z8 FN`o #|؄Wă#X)?WTxr8_YQS9aӤ#eKYy8X:0"Cq{~V2#aúaAM׫uSlQ-ycQ*O@.Fo*cQx( u0L0zm%% ^Mv'œ¸ꜩ[!VaT^e)6#:D~hadxY`/=oCFJx1l LS(}0O~!ľw^6X~:!L-`U{,>5(=I]Bz)o?S&:f8NSJQ$ zk(KOvFXaK䐻`DxA/'ewq͊d^0᧒cn X9N17v[M顥ǔ T< .~ FNM"yWOF0!bOF&Ȟ딧Hb7aRC^`FґSi#G)8(5?}"<2>YM"*ʧ]1/cFt+Mx^˿lezF^:[!K;DZg&sR%Cp #Sn+:Cl -VdeG2& ˁTn=¸ =\Fg~ZMa#adn&8>v{I%GlS=p#{s{V ?l5aLX3we  "{>զ͑6ϧ=6dߝЗPu[R\iꫳ6G#\9tuyV9ǰuV"P0ʈ^QQQ(1\ʽD`t65lm^Lm=q0z%?0'UsO[Z!xΫ?S1d+ѫ^n[i!G/FoLj={zED^IOC`ޡwGZao!CF[I/uTUy1z\nJAVed IDATFk+ŋѫ^ Hcm1l(Q>x,FF\75WX%!|huJUa]i65{}>rCy[A>m43h$Ozғ" wS/j[}SMy4LJW4 ~ݗ?W\/<~=K19y)!׾#Ha`x`(_F~7~#8(,V>WLkF8Nw%hlذ<F\n$U!Rx֐.GO\Wt*D1=&f=93cVgY3 yvč؄ AFoq%b5 ӵ6b`U_h=/(n'S8g΍ISb\.9elrVؽ@6 ۨqΦtV܋~`8_=emч.Fqzhأ lSQon`#z8+L/CI#gF}n%ya#s,/MOyaVyk]ԻV[A]}(=^g󿆰-ݺ۶u˼Ns=`\IaLVzؑr[ZMsȟ:gesaöMTX79V._q"[A=ߵyNmš 62'lюGS;Xg⻯0C0ٔi;niUԻ R;'^Α?O6TO4z8?LT1ԯԯ uGOOyu &>++qȘ kY$bX6pEbAf6px♶x4Y鋢\H'hDtVMߟMksO?c+hO_[:LiDqM1~?bI`]elhX&l2"i͞ S#|_y&ΌaA6%P.k\ `C~ F8,E&(oG^a5;g#ekR yuH#<)9NYJMcf6cLx߷~;p zha]ava*=4]WMxҜ k!z(VbLk+V(Nyr2NP;a+lהq0sF+!0RX_؉hϲsX2V#2m\eԋ;ua;#|;wm2Ob+[)Fi':߈#Wq/zHv:90"{m;xڮ&CvRc=ԇm1vlՇw=SAIm[:+~ݲe˼>!_@KP_qJn'*`%N _kp@0|yk=4r%ggŰ?Qx$\o~g`Ӝӵ@³l ^҈n,`m0ͰXD|t a', {XKhz7nY d.#F>~&\yo`d-JD#_~exY+ˋ= 볷_vasN'a`!i{hؼz8мݣ#]MΖln20b٩赕ȓ:/ hbR祴gk$kc$C͘=+9^=\ƃs} _=F e>cM;]a<4">.kltChg@ůsSuq/*Fܪj//:>Myi538†_Xm|g_qk1extF{dWVbЌ5Ƭ7Yq{APPhyj"ÃM 1cIȑ-5P)?h|Qf}:S빳s>R]®?|0LMqkȋѫTpTӐ.p;|3@j6T:l^җ4ȉ<+FluS< C֮]{4=#H^|$1G1^|E8 ҪFy1&P+15a:{<4e'GX}SuØOzxޡǖ m<թCR9z1k/^=$]/FӃN=7!i`+]R6[h"ƒzkJ9Va$_4SXfȲrNYCK]clOi[B@r0RRԟn O}*n sE s^~q>W+O 4'1E]YbsѠM$‹;+=\VN1JO`7_airS)6*a3<#Uan#7HUNJl/cZƩI+1eׄp<*ca$:V>>n-}qe0>3֎N>?IU*W\&ν6sb2chL Cوl&Ŗa%=LZmEzP[QvE0%VTƸOa妶2)Pue *[Q9/lr2VZاYXr'/Y]acS]#)FvQGY}zp=j6:HMuZ+1 iGl=L1*z({VYVTƩJ <)g?ATs7mc<|+c^*rүF0ث^)Zb;(=^E)n&I))ңCEƭ[1!ŘbS=C*\FhRK*/`' ¦UrUQ|0KQr˜bV> 0Kp+ 9 *WG8lm+"dغymc{ʾ2>\ga\2F(IؙsCa2x*h+=Dn4~.Gʯ zV>)#saA(U.X?"QpTxWE^T=>]wuK/ W^ye4 ϶l _1wDo"a)wR6e\ˆRc%bBu2c"KDMr|`t:\{׾pK6mEF_/l;˷6zxeY AzoHrsW=zOygєcJ&rO {aƤɮzmzѫ'w wwW~Ŷ/F Gt$ o)]r%ӗt\ѸNw !|[{|6}<2c21 \1Q!]#jqE|*.5р1Zi"/Fvjlu&R#uʖdt7'^4Pa1Z #gfO4a +8# km%7=v[NaŎTzxxfctL=쑣#<^=$=/FDٍS=2sVJ^ў sHazHhtDCĴ %ɒ<ʧ %~.ȅ0t^iC#asK<^U.g(rp?ŸtOf4C|^9<',x̶_Ub ,~+ʟ0*rD~K1WF_RzʱI#bN*4aD)#e a$*ĝ4l}V]3~Fzvבcv+pZnPx'TaFGޱ3a\5iLa+gyx2NmF‘UaQVzP+&)o0C2{ÆNek#l%/cՇmP\l.;22Nb?]dӌ6lMaF^Rpד5I=C(f8súp1/Y;dl\3|PJ_b$(;w\qqIR)2P\r=ɷ# —$ # s%VRUˆ|!/>~aĭ¨i.F+&)4~_cxoz|(\Xe{- ?osr6yYn6=L;D]]Θ)32¥{·c؀.xT÷'lձ,,[aV+m\VVH_#l^s*/2+nc+%=7=(=\p Y+ɫG+\%Pu=Dx1"Cs0J.# ?=Wxܟ޶&zc*a U'~ 0+lI3u1n9hְ~C6p}}f8opF\a[06{p%9eo Fsf8sw0XMzx뭷;3lQ]~w_xsms mn#yxOU$ND?}wx,ak ["*;~UƥWK#=xŋ GoD9 $C7F>m-dٱ&;fdsU->GkBQ[w -aQ~o΄} <}cw>+smҶm5;g&l\rF޳mgf^=0z˙5/&bWOMzɋqS^=DN^9"CQ/VagG:GV%N9sp7|(MV0溵wb&Nۮ~ps^QMJ2Zԧ>5vhWOUK :1y% (ڱZGqWIyp8zhkS89O%bOͨ>e53A~J4a#^%hwyIv9!<٧%WњISf oyg=>)5'f݇'ޱwPn\ѻMo E4fNO^h_9q$l(Lv+\z^{ <y0)g/F=b.6a.'/h|ʱ F>aDyMCx0K\"'b #} =zt02m&8:6>byewz[)M /SjE i['TEzveP,Ldq!Z店x(aY!FT a&Bv6m 3>iDgp|邇"#RF}{%2Y.9Ɗ )h1CqrHNZY#eυus/Bl~>l@#웜K3OZƈg#;L'm8ڗ}8F@[{'H=$W^['y0zyR8tqi+6uΖ-[\bs C2C[o{h{Qp6-8#!uJ.z0F[)!iy>(F!v.d8a_Q[n^Fh 2]6pW<_G*z =8P/yԟ_#>s03diul5ZagҋBg",P}wm=u4Q9>̝cq C1Mbr/[?nB2J9A1`LOx]aR!sL#yp`a0à oq 0oXk6χ 6_U1ׄ-_|F0fe~6l0nXwZ[ S0Wdۿ]ቧk{w w&+laqf;|@t{tn`8w"m;n9[}pܡx(8"Pv[7n5~.I1Up߼pxxe.zCq1ʃ7G$lˉs#R۸@G{lšFn8'GlJ6⸇Lߪ6zHc\v1"6O:wT/H887^6\l2؀[O#JI)cɑi#[2ܱ}wȞqhXjc+k a>t)HgyLJc5saBHpS]x!3k'Ĥ"mz@{5=IyS邑ߗ~Wܶ.,:~< P^B|BsQLʂF% PR0'`ZDzQK #ل|NF&:O[N~ߒ#;{t6]=՗5K  w̭aʚj9cǨ5 !rs톌 tɦp9yᮽG”O;mXgV͆~`4|zǡmÏ|IO ~4vk?6~5 Oo4÷=Fc=>kMqgֆͥ5lʚT%UR=D*]p=$y0*%[ZbT9.:l: Y"T?{g`WQ;v";蠈訟Π322: )."0ʮ@}Okz߻{[n 8:R[T9N: T$ oy5dsE~~r1[Fr[y~t<A!=a qx0%6ZSo  1?~qق (3Vv,{sfx 5ٹm%csM4mO? ?-}i# z}.=ȬOʃש*^{k\H)/Zcq;C6„+R%֮e])1WZ }de~=1k=Sٝ`t_>6V_)F&՞t0 u%UF1uiD=A׾Cs"} j;nj {~ ,&B <AUVw6Z0)W}6w&6ۉ'?-Հ `+Cd~l=Bm經% &[E0a{Asu Kk8}$`I; T8-|Ž-o1,0 %} z 4i^ivA />swz_+`Lj=_՜JKlKkgr|L0z_{kewM߆ݱ%Y]-X4> ^{aآX kWA E#mw%} Fw/Ц?YuI.lI: `vYO3"L|QUuɃ^ǶJ^Z|;V/?e(Η_Igbo {3lQkz뭷ڲeL6 _|sO!ã>j5_񊫬@tcCD&I]e}& L$ <]}z&՞LJ7S c> F4RRqx6mYR\z#>^@UYRKHQf_Dqd;^9eljL5N&`75.0$Ż{?_@ƒ*v#-!BnO0Pc8"ZQ[]:>JJ/c h|&=ۊ#HmʣG&o6wm作ؤJ:eoʔԇ9,[LPs8jCK&TmW=Yk?Da?>̀S0Κ|ӑGtω 3vd/fH0CҘKEׯ&yޥ m`p刺y{ VٱIR*mҕӳ5k2z*KڙL*)9XgJc> FV >dU&~X.<zc-ؾnFE6EaސJ/EK: Epn0mmFC6rDo|.e>߇c=žVbĬ%OGI.o')yg4Yօ{xפ1q5eaPЊS*]JׇÝrնwbC+|=P{յwD §k0ߨN#.%CSUkxhZFl?]ҡC_z1٧ࣘ`n\丬UaxigpmapA-x?qK r:<0כ<]]ϴ?3vJe ,+ҩ%0>CvW'y Gqu>ǸҀ8{-$*Rj52 0I+I`2%f*[|l[gVa` > 00O9(،w2mvNΎ>{yUbX-U=Í QTFMwZ;1.4ZKk";bo;}WXb{5jon~\똧J{ٹ{_< f )ũ Ge{eOwؑo=і${gmOqm0\hΓ|LC xISTc^p1,qaa K+NHP[k;,؍D:(" ;V(\ZD^ p7g=7} !8#< ^t02jw'y}otg( i MBr/}-s } :FDr(sun/y|`Nc0`5=bmʁs}lOl˶53X?m~DC`ZVJFH;vZS]#PlZ+b3gǸ5"UzYZaϭ/ܽގjwierѹvZf:3lΥٻ'ZɌ{{o^mOr}ΗV>ebt|f_m%DMnل}6svc8n.=¦/_b25Y=pkS! ωq6n1CB) c2㴂6>맟)[^cE%6~1PPdsj7[.޴(GYg~Է9*&…y~x0xooG쵪?0>C+`ՋV7knq0Nh:|Rk1Y=Wm}~9Jrm 2#$D坽{sa2U:X:Q^ >ӵp!JsO_AjA/ Xo qֽ+sdݶrJkqBo~ &{0gM]r]fb%>lBM.-,hE@MLξ}L+ͥz ݙSi[h57N.u~|M4dc'Gu;Z:lYyz"Cv.ih Gҽ@Oi!NTl.n}6zz;Wl)۱g/5ƍ{KϲGw2f%z__1>qx^l[v9{S2ax{ VrYxCo݋ơF(6\-Dɞp>}ohEc?*y~(< (C*a澁W*OD%:-f/]aU0CWs?j_4NE:0m~[ 0sJN@ZT`שQ=WIv<<=x{ScxzÑĢֿ 7-99wCjx=]P%/^n&;-ѧXIx@#:@{U"y® Oȅ;ۦxs"LUǞE#acWM(#mtI$GT4zxGV'k3gNd뢘Q:g1S-@H*t_Zc,9$}aaT|(VF.fnEZ;[Z4kyIXs(E YcJQmBuvh6g~&~q_dW gyȻh aN,N h 孾hZ>w8Gϕ&kt`}-G~֖_v=_.vS7LHyaK맹_ e*Ű"q|s= ^+̏T Lr>T>'߯vj߂Z.B9-Џ}cO}P @F8:6%+78d[-5Oﱯ;cD0LcCB'}.̉)SXO\UP"42"3%106'KI{ư8aag,u( Ϩ"w36K9 8 L-:'-O%:Yv NO\BeG%˵U*\lSRUSbe0h\[~r;cݷv@+eܥNP)IRpC砛tZ,N:|uEW~勻/ ˎ?lg=J%X'Ru?ai)z@Jgᖌܩz%ee~#a ibVgyMe#^ ;b-XP^ E\gŔI&lZ~:5 9O[&{gN0s\rJ1a3ƈlP;r ӇŽQusZVo=Reqts TD@B2]9')wtZʞdۿѳ”ZoC_>\$K$V@'K/'JHD4xr[Y V V( @UF:c2mEpaUB *GAkAXLL.7-Z;fRPLpk!k\eM JҖ48ʵTՃ}yիxgdJAXt0Vab5^JQ&d0'0;:Aq( FMZh1¨756T:w:8p[G @Q?J]Y1cs"yihMĶ`]=bMw1d\zb7d)_42ozum_SܾoX6eBqFU?mUȿi|+'ڂO2ǻk:ڲ D4(nr-_4 i;PC+g;'t"·5g-5vcؗ?v;v++>%x1kSǻܗMCk  h%hR >r }S==6W <䣉G҃ y ML-}l7kAHW((N|. ի?"4?BH5! ^UY AU`Ԫ~/ǐ\?)(a;EGyEF+$Ɋ׎x.[0[g6U᝱YȶQb kzms`y-&yIO;tqٻǶn] ~4Kmږ]829k<N9`V%۪;&`E: X IDAT+kgΏ `N!v=t.oٲ+#Rccv!ˤY80j&ʶm!o@d-#m/-k3W(xYF c8Kط?:q=efؔ6[<|=Ѽ$ϮW+u=vTnUrr+1n>o:<4ICᗧ$4rx J2<ܢg(\⡧DϩhEE#g墱}_hne!c .GC9}ݎvڮfs |(gdi($<Dm`82Y~K=1Uَ]m'6ᠵyj^n[XOJs}Qhn{ lV: g0;S[i-6=ζcl6XbmGû2WvJk_{>)B6KW~O6ƞ ꛍ )10ҒbR[o/V3gآEGζ>Niug[ d^tCe ;eݶr=lϺ-vk훷>cw?D"s3 }iM\0θk߼`#i8N q6~ıÒ'`; [³\öEl഑]lUkKP+%哭 :Xvs=Ɇjݢ޺PZx%]Q۰f(9:bV+Egsʓ ֱqM6etMo0ʮ[l\Mx%@I4QJZQ7~M&t),:eӋ1e;<=kg~}[}&4}Q 3o꩕vߟos{٥lB6,ċO-.Z49-'q]IAOw E6^i+xNN$M <x_D.L$aG=9lUr{Xam(=e'q*YX;GȽW6nMӎ|Go۱Sk1#+CTioܸ֣/Fk&ށaey6ZmM6yt[,,u5(.[8Kc! ӳx+ },; 82U~b7ލaޑlc {MM06q`e_{[mǜ8ϟUnO5lu:%Bf7߿6[d]wLz?Ʋ [ɪVIw>qqVTo7ni,/æW}%ފ]pQ5iI~k!M'jr"SR}Ҽ ӥ00JHqx1Ik;}=X^g]HH?qb]4-7l6X;`ӊy>7ت& 0U7Ar1|, vYͼivƥgXAնB4[X_.Ǫ4Fb5ycʧK~Oe9v6n*5~ǝSn73O}(.irXoqMo};r!F$ C4|',|z',x55mBb7D$8w4s"pͲ-ot[m6 0!4M8YL3.9s;NѓlCmvjh0knbqōү aш|M Ϟg,龑p9wJ%IK 7aA3Lɏ/{˾ostNK=8Gؼ f |﮽^[?"X$)ŧ,FbVSÎW`j‰H]6ki{ᡅ&~ l535{XN{ǩVRyb<:1A G> :x/U];Z*ao_ns]VSu&1"x3azfHL ۽<$}w[l->Cvbu]•{A2Vܹ+d[8j(wo[ZoknϲɌ_ {7Y]i$[-9lZʨ&\. Ly=Oel0(~/Zb rBh=p:GoA A}?DLqiKL|/~;$W؜ pc#$Qb:(\ϗuTTR:s_SqR ݧC 'SZ6FS\8f;ϧܘZP]n'8-\Vuh{1_|n`/ˈ=dQXZ> PZv2>dg%%Eqq_z^dƺa +ligG*O=cT2Vgby9!ZGdIiiWgA 1˜̞Ym_ ӰYhq&WڂM !p1,Hd됭iYlؗҊ(<∴ۂ*#COCC.^Iή`Ҫ暎fF,T$vc?M Ata?T# ]т#ԣV3+~Hc\jǙCG~mCbID-(P `Ѳ v)DtekOe+O62^n}:T5^ͧJ=_zʶP6G{Uw1 a?W?3j'@ibXMTS_]kܱ&.ȣW'(=u[ͨ.+RQdOoܻ#/Msgas0؏sCJ X$@_P|Ws_~'-s`wri M5VLg;Xi؈FOQNaRQjrqrFnq搏pغ=]0 1lr.|fg -dU\Cȷbw#-ٶB4/^bL mi=vCkmSlPM>(Պa#T[9Lbl d7'fMD2BQytu۬Ǫ&TIF%&cn#ڮmF / iLˁEFu".DЯ$Nε4yjΦb[y_:`22pfuwUGm"cџWN$(@H$t@a)bڎ-xni֊]L/Ђk8F㊣W-?{JpG/dω,0ӂZ먜ƘcdQboCxÓ>x-*Mqx ڌrпs޳v>?}Cq0s|[6rmCIo!ă<\g-f]Pߗ3H*יN[C:y&X˩C8]L!0tI3}N t_ݲ1곷.Qx69'^ :v.Z?bol Gi{d_ dT6-|`lvZ>,:r&`ӊpQ5 kJ5RiKA#XZ`GluEl5 dω@{9@rq^uGe҇KOdݍm.6g68ělqcaIŦC$8V)FҞU/ҊhW?Is)E?=%ݭnΆ194j4nεjmR/ciQZUc5-h;]?ci{E5]afX(wťK9J3gc#"hp9]k5\'A𺩭"ˆ>EW@_VG7 X_`Sʱp4+Kѱ^0&>B:`tN15Įzb-?p*_>`YA3QHwQڣCŢIPq w+%Ks|c|׾dIe}=׾|duc2NlJ&ϰ tJ`:.s`V{mt$lgr5tL,}L؋Ȼˢ+w”*s"W:P@7ST;c(f#uM;m(O_mJg ¬o-xt.6 >7g|x?~^GL]m#6:9>H'^L׼k7q$7ho%.ʫN01m{h= ËNMvPhs'WHwU>Y%U[j\oP_1-,Fs{Vt M7~ruޫeU̮F' e)E}%EhnBo׊ʲ'[7&B 5&W?ʞ_NL{M;~]_v[mNe[^\6Åށr7 "[Ckp 1JGWHXe !MMV}K1*'8!=)z 0B5PJhx< ~t rYΓ؍ &_ZmͶ#͎\?1wѣIPBEfD6hBWpąGщENO!FHGNɶǶwػaFM)t&uMxQuS{'iooɶg͘f_ {bWռlqV@(Q@rC,5I6ՎQ|?&/\hӈhf Xx'~]`G[>ޙEepL۲ |+cAӁӏ9 DY?LJx(PE}m;QV۲O)ъhZN]Dݝ\?`g3߶[ ^?P{\m6Z'Y~iEl󭟶ҝvꍿ'QM{`>a3nٍ14K9AG MW#KH'E+~.Ϙ6~yYC-NF ?S@:턎~U7h8Cl e[dY=ų8Ϛ"8g}|Q9rn`$!$d\-^ ?t<ʉ% LCsՙI~:p[ $~-'2Xu֛iO>o9zZb,`rW6No|jڒ2%ɨ!{bB$yg2u/5:0j!%y#&䄃%kٜuM-ۘh*FgO}mh!rMfʎbbg;[!N[y/YWZcy0a{#GKTt-ӛwX<\mvoW!y*&~d<w@/6&{@vwy62d=ыq;Ln> d|ζmc Aޕ6vd3TS<!x,rU{q>x{xˑ &XO2S:z'[[_G5i{5mr|jlI68~q||B cpX62m>N0?G?HlgpNҹn5^6Yvo鸈 xZ9kjXx(kJf]pb\p{`dk[Xdpll]{Z/(T~16oP~٩Øb IDAT6g< ^2P9{ {6j[Ytw "f`fd¢Exߧn‚y0/\{F|6j} Z4/ᄳ}Xk["*#q0s})agͲ?k<Mbwsw@A#RuPҸo{܉9c^":$S{>O1Y}Z9UkUj~yO>8a^Nc8aiguSgU0j ^>;m)yTʩ_eTEEsIypCZ6bɕKC(b&C׿lv4G#Nnh|{h6C GMf,ۊVNUF8܉&| ,3[|8l eًgjNM ^+ѾHԁ w%Z[osRe" 2^rœ4>FC1$VrT0ڐ`uw׉ncٯ)Y+w]bifu־je&+Iss3a8L`RsBG[MѣVvRhj=uN4^7Hx~l#Iv_be =d=-Qa|$<'sRc)i P!$c8zU-z,䦦u8.FOPاoq^vHDhEr{z1y ̎%rVUĬFz ֎ȵ|Zhf_qmMc;7/vΊv0=98B#⦲#\?Ņp[OԊɌ1UŒL9FP/J%wi ¢H|ĥmB0|>f-Eϓݘ\>{NsO!p4u69ȣ|i%XE2+GՓג|/gӦr%Oyo *Xa"/g/_oTcƲy/mR41=N8㉜&dKi2ȸ\Tb8e3xh>&J0 chӂl%Tg/a0=ݎȵbΘwAoʟ6ͺ1km9{eSldCD'/aOCBs .r%N[맰m6T4>D(w^izvV#~`뿨AgشlIa{-l Տ ai#lXLs9(gvAmQ81?ѺԯѱV{[e~cw199;XL VEA`D;؀7gcg`PYI][UfwAaZt0ie<Z|?6le6S'{ E-UfACxƜ^{ϱM40Hr}u ¶43X_O,,3f,iSm+.k> e\0\#xѠy 7ݸ20P w|v 1ϛ?}!Y`k٪r2e[E0n;8iE80Jj l828xŊ,&)DU4'& :MaWkc+qȉ@4 H 踜#p1pWnxvzrƒRm[6Ŝ }b"G((8RI[6yf!~LA#f0##0Op¸ƕ8AbƘtdy׌gcWĎ[8\xp6x~|'fEgQBp;5gWZ&Y>K_k4DcWc<38y.hSBeF1Zs!\/-KC+ޠPl2c@?a&+l+z@-32{O1#*&([b2UeBΠ]&~K UulV-ZOc"\c-[ŷFcG;¾XZ|okKaDS1ExoIPv0b1iNZfهP.}:G0C1D]jGVW`A׏QO<— uUw00t0rz.<0N{<W!yl׽iL1G@.<,Y@Cux7ZAKΞXοD+珇#JVmгʱa3:o3j78J ؖBΛiS'W޵6nc+k{mɲ=lGaPPB^NR~hQ4 ZD-y\=2*kXQ9Ak$CAR ښZ|/Wޛ ҏVկIU SGߍs2ZA<CC+x" .#(OUzok\vyǃ` x6=<(ֲk jGHǷ},K#;'5vV ua"wcCJEȔ}smL]wtZӡpQ`zYI: J^@ ӵ+%O| e#*JV.WAlݽh[R>s} mC=sε3<3-,\r˓@7Qs+'<@oQ`:~P *1cH,ĸ%&%6Wfi:WL*uCA {lu91:Bmˏ-0MUUASx19Eu6!E c$ v0w}@^<#DFX5Fa#`6둴"%~so#܀?o2˷z a Q(c02`TY߇劰+&h a;q Hj { z'Oȳyh8e {Ir$P|3iْN@CvZӱMG M\AIÂN}(9aCEb8njC1mق hQqߋ?~ dWc(Bjz(=Q•{/چ赻51s`{}gEgO1"ăsi7Y@|;t8¸?΢bBk9ը/$.a|6ْ~d'7!ݏٌ$ jx{f+~Q`'X?[_QYA^ǩQE?T`k-Շ// _tucoO֯ʙ303{w${YG3D,RB|AmW\)dKwuً>S?m۶>'mFWym)͙3|A{{c\pAo@%c,+pP^PxkcKj{fKM)n*i1q 6B!%(5Q'Ue{?p0ʳ-]L_Mh@uh\*_C'8Oe Ѿ*7Ie]rZzP|34p:J TAdٟuʅΦUvZ`= >S˜ L\aI#͝V yaA^=S2QujȶA{H OG#pp2*X.[5yE5}8/vre_LazPzY*XW2y-Y/$Vxe/?/i7|{6U׿={l͚5vb^{qI@x-(`N tNweMދfzzk{eD^_h OAYMTq[$4^V& fxoeWԸrv8eomZvn!(mEtO)+;F&n9X`p7l?h{[`dqI,’O@'1Ч½8[b p1$`t1FR> 0ҖnF\$,pl4yW$'Vy`/K.\e0b ~Ϸ*3aPGDzh% s?@,<+[xN>QƮhܶrbǓO1~>$v̪ \B]kO- ~4 |f Xi/~>Ν;S6Sƻrc[d=㮼JCH0w/~W{S:;qsPwwusW`YWoDcŘ=;3j|U7JN{#xWPa%?Rӏ- cQSk4ylu y1q^)N*! #m;6k"6ZwmP}`V6`͊+Q)8E s0N:.VZ!1Y ޏ`d@>sGTV#v7Zm礁q=$%ԗSz)arӿxj $8uy})}`,40C8>a2ZɈX?;?ZcIP`/PaA1ѯOQѩ<,&:8Z=;_ `Ƣ0066Y)5#$&<Fq $ÃCѹGCDR~HcFY4~>Dm"CaFNr/,>M006?ta7/9̐/:vJiwRZѼŇrzPЊh<77u?~ =?~f &΢]m۔e8MCqqJt\e,eDο6 8b<ٓu_pvaڔBrUVLrbs$__Z~O۸wcsLf(b>h馛l#NħTĝ)umjeGr(Ș.Y|8t%QLroOC<:8>Lڴ% 4iB#OS{4?D;Tkn+;ᤌ}aa Ӈ/'aN$&EPLseJL©vvlᇇC-DT.Ös0V?U aPa˅C'l?vraa jKo)8)1Ö P7.]ʮM> jKU`$ʹ.Ӧ0v>#P\>T9l'>aC.^y2/\%/4=҂q0= n|W׉%>w޽<  A@W:o\o=FohN\,t20əLϓ՗_;J>^yHc=~9SO=OfVs=yˣ8UZrwyC;Wpҗ?O;駣+ ?;7O<἞VCRp0~_} `wiٖ-[yЇ\{*䣂gz@bK*d#67+ZP|S>{O@0رgn>;h^s2.~+_{ E'KٺSmݺ5m8I|twWz=PQ.=ַՍ_`Sڇ㓟d|{XG?:t;e|6Q>齋ݑ~v<{v:{idkE#W_}iFC=Q#Yӡr( pW64(.g$sdz5]?M|'񁋰8:OLuxBCCCz˦9O:uCPaʏD)X&x\e%bR]+cn砥oKkykKBهZ)tq֬Y@4T^y啎G>G5Ij*8 k&h2S +zLc9s\j0`R*<\gqx㍮ :6U=NŝxpC #a$g?С99 g>B$U4řPS18ZTx(%ֿ+VKɒY6wM|v|_ &ޫJ|*e|8i;Xʃarar/- X7MlG͛ٸqwGDuS}p7oH73`s/{wF (WFnkğ g",a"rF2'^DD"eeekKևxeG%9]`k[Lx&^',|73>d}-h }b7FF)//w8Ap駟/0x$׻U5ί{B$"&Bw;2c> `>T hAPK/B}q=C`lllto>?xNFMSKև' 6bh#ykЮZ!. M_Q݇}<|b O "O.IIH{/{ssnIn5p3g֬>HƖO|Ȇz1\!Y>`.\EW`Hq}xTc-'m瘍8ҟ9~tȑ1ɬ[|B?c9fY++\[z7ڇ6Ж0SG9*[<".laHrFxio፶wGARG~ g P3+,XػC?RG~#G4ە#/~ ֬9y-<}3rY/޶l1/z"#ýcuJs }JCg,l]a:LXq/33u!}L_攷Q?Pn`3RC3)h]>s7+SE\^<,۝+Z*-S.uum0109=}fbӛlcJ~`X t./, [V#+vtp fH9䣎 h_*]VG3!غ!I)l"ư N cb#" ,\>]RĝAT\aكAˁx!#gQԕxRT?>}zuN<ԑH639`]R}uב o:7|1>Cd'l_9\C3Xܝ2TIؗQGZ}"x*|)skwaHy#j0m3h7 sxWƻg3u37<BL/RfW9p# :J@O8-pV@䧺Hw~ǀ_ѬS1Ob*E ?t~D|B::2>ц0a: :8&@@ƨ#%,6gEY @PyYrDR2g9`\+/3B2y7t]!8P?` q^Z^7]3/ }k>yT.>VHf Ll0#/zu>b>#URp2Ӻ+}/*}:E3 >ʆJ+)+Y !_>w'X#"eu >/| ++}cWa}hS8j^3L f.&ğ?я" Ȏ~:ハ_̜Ymg}]a^nW^|6'DYk95%o72l7Ta}Ϸ95xt6;k=a[ :-n m1Ҳ^q Abּ*r֡yW6q<Ε1RsԸth-ŬUu4AB2"늠}E=)G=gyfe>`괋.ξʷeU!sیz0yZ{a$7w%ܛIbDUuUv0vC avH\>UIrmV<Sdz`Rj>=̛7d>%7[!,|BswaHyrRG(1ɬᱎEK/g7bNaH6J>iE[N?|>ȼ1+-M+r̫3BFY#[Y4H⊞CD暒f[c)4kYV<#yasgC ,>9qQGO1oϧ}f>f=o|c̜Wőo:28kZ7H3sF5߮(oQ\Ù{e]籧ys Iϴ>3>L"}r;Na{u[)3 +c T<%CEXpd_ cJV!L;?4_X|ya@9,|##GN#<,˜--ϐYZGbX:P"ֱ*GaF=ŒD;[?+ב2"qk1V\!ϡA2Dwqkg7p NY!O"^guy10tWólug܏f\93^9yiO=م6=u}wd[Sa|\YzjHk*@35;QkGpGG;2G20>.gb%[kťibU!;#8#!Pœ 8'qn#/7ǎU'7F vr*wgdzh9>o{t)e fWX=.9bsD+P{FGΡ]\P8/vL{o "fgޕ:H MXCHKmS|q"`-S\O7?`7?g} cLq9## g;[ek$,SHpkkO͛oaeU<$SC -V%^c:zM4ΊN]{xyrr|lND 3&X8xrտۿ;!]uU^׾6|,plVʋr)/m <`s3وDΚd|y3]xa:G5RΎ|pv!5}p'l>^کX9 =|Ľo1ɱ XKH~7k@Jğr&(HV~QH;0DLL-Fׯ\֯ZQ%,[6Na U킗g!Aح:vtRBkRł| \z%L/H#vm'/i|RW^R\.dqq {";eʔ>X9G<.,:3zaP/Ucb@PFͼ`i#]0&ұ6L4jwz;+ZðN{֙7Zߎoل{#:xNy.uV/ל aəh8Vrj?Ne0y}P6e13ʳԏgy6G{_T1Mgl3I;1Z8vm;_p|T~SiG&зº^p"sw̓#ܻ\봿omm}g2s/3.(1d5D W^yeB QeoSO vt]Nzy(= ҰwutX>g?`ƣ^W΃[`ƴ뮻.|ӟ ցi?OE Cvtp|5a1ggj; 5Щ9(_Ώh <` yoF9vqweX}E2-pz~8]~|tIu( ?c_=c?LډfMs|p3}_}$iwF!_|qΕ XɹmCnN: L _V:@dա*\m~FP/d8X6A@xF'M5\~q"V6a:t@N>|1 E5q8N |BK뗾o;A(2Gb{#/- |2dvCP#jk;$x1Ǵ"+nQ^"'nCw7}[EHH<{HH]H$!O`ȎsK4 zK:lGp+"C9$Uy_xyAȁ9̥щⰾ0,4t f6_D$]Ń=S:q7x)n{|.6a _XF˓a3=%\rI[Ur#~k#|x~Vc-RM ?LqZQ`;s%ƚ{gH!]58R>B7Zxp=c|ḿMʁ8@J8o? ~YXFk*} XCMC=I&U/~ Xmᑃ7Xɺtq+o$=oV%kw,JuLKgsѾZC3|!,/@0FGuY1!3 G˓09LttP#MMɓ'GC2|L!K~ի^yYh9utXϰ@ *!΢.,5ɜ^:0ɊJ,{C^|:vgeKWu /lʁ5 >DB/w0jlATL?szS4H؊lDF?4\"ĉ{ؿ*;U _0dâi͜zCxI'CW 8l`QW(x0%LDl/XyPiً(ea5#%P>ua( )N՝ E1gˇ 84txC>u8eAyCx!`ŋRuF};8L!4~a/[Vr_r  =`2 } 2e) 4xa>m͙ffy64,RY  /q^ d/Rp~RRuALX02ך"4m [|D1i<<7|A<K9Gp 1D6!oH"yfa~ԍP>{PU{(d~b[8Ay^`:ĕ:9ϡoYɳ 7}(.DCj?jΐ:ϳ7ғXO-Lݸ0_Äge9O{hիѫtF˭%^vZ] >UǎJR^Wh`A5]㄰ty/a9@C‡ bbK9@@`ꅠswXWLH [:aR0_l!;G`)V+-V뙵Z9F.dH Ӻƕgn 1pz>LkϿO^CG#tKES4ܑFϳMFWcGpG6:wĽS4ܑ*%Q03V\>}?m%׶pQdaud3WNRRwCJesc%x.Gp@ 6: SgׇI`onoë;9Όt8`g'c%[ѭ^Xa L&˱ wֱr۫V(ʓՊZY=tOV/=ƊWVr6.˾ljLVw75֎U<{։a8vywlrlKJf)3v{~ն2ս`&gVIõsAL =kV#Ö.`z:8G` 5|72d6n)2}XSz aߋ?1C_dj8OaSrl=3K-.49^(y/HWqɩ ۫c/G0pjı H K|.}2X˱/Zpi%L< '8iQ&ە@R ~lqjz>|}Q*ٸ_j܆s [qd=9ɖ-lg:a{(wޒl~EiiH8i8k,ʤTIgjHgtM["-?gH,T|3^h Z'{q*{K.^{*Zwʀ˾V:KPG )w_l6},c2oDZ`aEǾ]tUoͱu1*x6@?Xp:t@DdG[И}va%`a ҉V ˘soM_{!q=x9 Ilsİ.{ g\`aw$ l UȤ^P\% 䯼TV /HZ34 ,F©S6*rX^912SyV/~lM~h@s `xi JT33žԏ{Xk;L~>.YgC0R˙9nVN1!X-;H_A;G;W|dpQxpGQ K_YzYzJ:$͐T b9݃h!|'^D́C ~ Ak$__0 cY$SRfxzP_\y!1\3C%|9CpeɑntмP tz r$Q/>jlBͰY4^=G5AL! y7q݃;etptZAՈc!wXR~?˦אI_la 9䣚>1 OG9[ ~Tp4Z"}}SeE+*Dy嫒Uc / c4-} qUڡR5<YѢV,Μbg'@G-#V9`ŜZŁ'C;>qwR f/k؉7'cnXQ'jX H\7DKqֲ8!z8:Vp|3dˍa0H_8^|ʲ%6 '91,IEgĐ,p|=IRk/>$8ӹ9q4ª} e祎|s NgH"?/49pe=<Y.YԙE8E21q;BЏՆ)<'&:+& q:Sfǁs`$/Sidu#671~7HSP|FAb3-хIR:Z><TZzy.KpC,Xo+ |Xsq#K6HT#~Nu`TJҴ|9N#zb,:/aVU繖uA #Ȧ#?h/oa5R?5CDa̗._XxP!Xu,RxP1O6ꨳ)0hĥk.KAzde,H#җ$C@ԅn:0Ct?aQ(CZ~R@Cxq<>b3W3Šcc.$ |Cz:9/c^:>a,dlz{@!qXõ< ǧnΜ9QYH 0V巾q'XO}.s@=|oU,5|T hCē{jO"G?IxNOzw{ʊ[ \ӝq< <`珹<9=gt~<<[` X~#=E^d\Z!  ̘>͸|%-h&55T+%RC4XX1N@x{4,Vt `mM{f`ʗFd\\"XV@g+W1C͂p衇u*ъ + ,m#<J%߬;G9ܧV|7ϐPJHN~|YzYtj1`h;ƽV|4˗W+BH(aeHN>zŠ\GpGYOi8Eiso!8MDW9OүW#8#) 4. +=ų#|: I)שBp Sa~*s9]$a9qQ EB*B*4ɓwaQq;'NC8GpGpG/p\HyеǞ{Ľp-[Ny-4GpGn=&RΣtMɴl9?OO^3f"JǥbDO|S6>m԰f +}&W`V_:#8#`þX 2&U֐\_|3g y,A园p/#sf K,E;6L{$y~8#8@OD7wqcؗͭkr~|,?uހ2=ܴi*F `>}N,+GpG پpN`gñЃjx,]z7+H_F zɏ%K¼y|N`_;#8@E.oĈUdN/xΟK7U e*8rH3 ׯWV *\_;#8#f1!NTT2C5+_TfN*#\Vtt5 N*O#ee.eeeto6DWv?ҷ<~_a鿧=]]`&?YL9: )V(\(OQYEq-t+20\YEyS G> lʒ_T4TVᢲ/t+20\YEyS G> lʒ_T4TVᢲ/t+20\YEyS G> lʒ_T4TVᢲ/t+20\YEyS G> lʒ_T4TVᢲ/t+20\YEyS G> @)\jyz%,G'?/]E>i8ow'Oz=j<^^Y:Iܩ.IOù|~'OGz=<^^Y:Iܩ.IOù|~'OGz=<^^Y:Iܩ.IOù|~'OGz=<^^Y:Iܩ.IOù|~'OGz=<^^Y:Iܩ.IOù|~'OGz=<^^Y:Iܩ.IOù|~'OGz=<^^Y:Iܩ.IOù|~'OGz=<^^Y:Iܩ.IOù|~'OGz=<^^Y:Ia\\2yz[րf57L,]Y}eey{j+/Ko|WoV_|YzޞfZқmo.W&_߬2fۛwfɗi7L,]Y}WY Bp ӋI&ۈMz59ôKgeօugvGpE`@>aa~>2:jpcBr{rF,+,SF-Z&tׇJzpGp;1IaA5:U'䌳^11UZaFңP|bq]Sem)9<>, em8 ˯9#8#5hzm.Zxɲ6u# g8QlEUYs297{MykmH7O NC&N53*fu#8#8[MvۂSsEbHgS 6X|UQ.)L\ޠ>6ԻK*]pGp*;)úuˆaC0zp.W)BU\Y# <+ڍ.^v4(t>X8#8>z͚0fԈp 2T\4' cZQ?ҝMOD7`@'u$GpGؾ` [p ]p8oqiT4t%5u\QCӸ4شb<)۷<GpG؞qylj.膛a;),>(VS0*dV/8VbۻsGpG`GC4ʟRNQҰ< WB&Ya K|'> [luX|e4?Jmoר~sGpm\gEpЅ6.Ke5߈Mi? *XD? K>Ց~}3bp]DžަȑoqF_G&[+oor6GzzӲ~ڸ1l`Gk,}|ڕaGpG>yp@0iq4@7K8, KN>2i( G}xH;cJ>z۴ !$HqԑS@ Dm7żT&F>їꬪ`@֬]k>r6qпIV> Zm[>^a7SN8GpG`E3{ȁ 3R\G#LB:Vp5Qp;*%?8:@֯`ǫV26&!Fy(?dlժaŊ-$+#Q(waa!a]"L ua%a~`CLǸqcLB"G5kڎҥb 葎#8#",c]:L=][# J߈|\a~8)W\.[t?>gq:x6FK$M.]-Y̺qc,e6b|ǎ.OY sn2i󦰩uH1v F ? CJjX>|-Y-fI"68ogJm~ulq.MYIh! 9#8;>Bem⽉cbTdRq[ղ置h+cwR|rnXfs7\@c\ק-RiWZN02^+/ n*YkC٬6fz ,V0f5e +YYNf8,PnF!d-DYDb.8Uđ:P#nԅt08 ֎V?f[KGp}Bq0}+ʠZyxOZNee3O?%+ք_15^҆y{=:ɑ0 輓~S*QOHQmk =H$2lV0-\. ;siREqia%X2,+Wj!q>,zh5cƇW0 lRUǐ7 ;v,یɜIV(/[<.ıtQQrטvqy Æbܦ܃aÆFǢXٽltيIp,|^XaYͪaXu㢜L#8#Dw/N>ᶷ>W|p&ޡKBũtvqs ͚%G_u[%j ]G ?h=Ǐ #DM"quJ3  ځ aN2I @kkEPVC<#KkK÷4-ebEi2Ba}^cYφsۊUFloA52.mLz+dF[[VRC)W0qȮZѶht,wk@Vzn܈U= ٪Cv?:<<۶1k rKj#{=sa]m!YbX\! XpGpv2dw.lTIWaɂ*5jC$$X;efV@&>*tk_zQ;)-WaEs"ҷ^ps]U@.~}8nmG5ر/+ hJ{>{}焋=9bV M0.7" |cTЛLj9RHk`?] N=乼_;#8;  qpL,g@ X'V;XkC}bC[M KET#|O-Y-l؆̻ =1k^X`Cˠ d? ((Ŋr3ROypsfasE7$qɒaĠ~|zV9~7lFڲ길؎V6SNqFZ?/:|J 8alt|I CMpa}9 ޗ"8#8-lsވ;ϧ=9V C `"f56P|Ξ#+2 ,_> hCc Rt|ƈ>FNX]<0u涇n2ZB{9ZR{ lL] ?p@[`ц/kK WH'qX>pIqAy2nGtUO; b[46jҎjk۰tY _{pfw#8#b]1_+2CPZt-Xl1_{Ur\,\&%StR5Fw :W>?-8}YQ۲E r\{mlu9?ó#|QEð]lH&T=_ 7,ocT*! ^Ẳ#lkxW BeC˿{kXcd_qx{6r1u~r8#8E.x Z:O82 ǜ3_rhxᡓ;WwXg]'i`Nc섑am*ׇ#Ve[no-8n.m[`1% /k[==xЀӎ ?F(maVr̲y6xU$~Q` WR2`Yh ]$zש1MGpG`gA;X]('p ?qEx ̃cېŜ l$>6'u|X&|aY[lͿƏc㌘g$<<ڸy׺26Iêg0E,/=|HR?ˣaz.uQn}`V8fEk#[s YXÜ# 5[ֺ<5d}?36aAaЀjRW>23ŋ9sض2l[9}kRGpq/4- wu `Gˣʯ%+2¶!mǒ-Csg:]_1%Ygd-|H!̮0H众OUj䭯<:ύVHQY}U5YmI|0md~G̝H [ۤnѲUv0ۿ/wݷ=0=sFFԺUM1'X~rhpY!|hAMP [e+׆Cٶ{pcllis0F=#GF{vv^fZ';#8;+[ܾ9ۨՏa}L+.8j[׶Aɟ/mSb ۂy-_}}+9Mی,cKoOo Cᔣ ک/cG~zxVĒ j#8v+M>2i(OY\< JxCEk֬/ oyձUb,޸bBk(܆Gej2g+J!#_Xknm Ƀ={\$zŚ f-l#^i!Y23mxl!C HZl-=dv[lm<+"1ʎdò^} /C6o\g$4Ox_ S+Z #SC=G/',y߾7[ wGp SYz""k (.WƵOptd/&`C֬sm_"U O&F)8bȐ]̲4)̳K#V~NHT1.kU ^_T%}|[gmԍ5,`<6{Q:tb$Q<Ɉo{:skaDžUCڙǽڊIZW;#8MQ(LW\(GGn,s&Ŭ vaS KeAFK`;1cڼxQ΅u$Jk#ֵFéhYi &{qF~N |Ry>C~{hFGD.XYc'oY [oDB;I+88.saUjLxbx4+N1+ݗնJ}9#8;76R$YT8 F0 o!vW= ?J+ꯏ؊ª܅+l3衕<9f~gϦ= y>q~YZ 6/{wq9_ESh2򒻨wK4YI,>[WBMx{}me c͊wן 7}ř[ं|7~6Pxp`bcSMm;g|zQ5y)lTjcwxe3S&sGpvRx|`J\W@%/@\-WVjvs#*#8vmiNiSSy.r"W@'OQ8K%l1kY?[1{uyll j3/Dx݉jÎo3 ZN#9 '?`@n]\xʙ*YVlGYns?7ls=O+Ֆo>E_m|ቕx`[N1#ՏE#v+;/[GtllM:1gQ$q#85R~CIKé,Tg5ymU <T~џ(^i(]qOU Sl &Rl#OiszIsƾm'GæeRK^־U%юSӅۯHv5K?/?37kpo/1?'il@"ݖ;mrjF[Ζec?3nн.=-m?7XrGpkx7N9T& ƥ6],C׌3,o !i% _iʧy;|KW)kaaW;w\|ڈռ+Tueiݫaa! !O[{S#@^!g m@;h:06NldŚ/F2#8@OE`欧bծ.gW )X~|Yּ)y΂okem g+kwU<\cGM}eٶtU\#8#5R^6Cɐ0>.OW\L W~Qť%ƥa+/\V#8#,'/jw|pηHSt&BDSޮzx>GpGpSYzNAWYQLi(tH5.So'f"rGpG`;D@\I>M( !+CNqN}u"2*VR]vGpGhOrLrJb|FpWHU>i\NӷGpGpZ'ؔ;᤼ri8ȼ\AY +}GpGpj_JpT^a9@ tuyrkGpGp ^\WO4,eq蒎<#8#HgɧmJ[9j6= }UssE$5z6<7Fs9GpGرH9 IDATĥ䓧(8Ɨkj2/R4GpGp#ITGf55y\?3o~#b.8#8N,y;ǔ G"EHihR"Y嗜|$Cµ}GpGpvRn]U-I+E W_ w+8GpGpvjReL^7W-)S@*QBR^t男LQ>sGpG`GD VQ*9ӹIZBDr<=K8W\*(#8#8;<~{"jSE h %u+=iz=#8#8; p#4ڤaL3|J_ \^)W8וpGp 5JrFҫ,._N"[e{?w/~Qۍԩᢋ.#]vY(p]w뮻.& <8|-8GpG_ԤFT?/$f B<ͯ|dҰ>:s\ngώ2dH|OlpGpG@@8;OJ"8LzUyr]wUoU=BuN(ڼ~_*<#i.o'#8#]"|7(*+}y:+(VIRH$SԎ4O?t?~… ,dx{"U GpGh&(( qi!9<~$ʔ&qX7}\K#6lY3êUÞ{vmH$ Y ,K, ÇGOjK]n]3gN,{Bn[["dyhs[DtGp2WƿrxpYO|"̜9~Ԓz긕v2r_ڑ?Wʕ+%裏O%;lG*99L r!O>jժ\įGpG`F R"rys/4Pr]Zn0? K8U8~\# +*p?*7tSM4J^[.7|s?!wJ2eJzW ?>wWs=‹!7Fa$pGpvK)U\+VJӰd? +#>hd>N=ʜ8 |_\#NJtEaÆ?,{guV# ~G9~jSOU!_'B/U_n eAv8#8;)GJE!ՑS}qX!N’L.ʓǩls]G: , nv)#G /}K#2#?+q!doc`;C7+̇o|7k֬NX G@:rX_ׅUEY|BpGp p|µBG#LF3`Go^&P/uƂ@dHKV;Ձn:6ޒDEZF +1:я~4^ Z8ul5k֤bvGpG GT tBz" s$C;#J\k'NX%ΐpldjB ϶9|{W\ rl.Y^nu+ɔsGF݊p5ꚕoT9#86G@L~QRH:+o$jp# +ZZkɼyrs\?OUѬ!p)X-˓O>Y7IQ$ƃ#8#4!~n^S[B^׷B_W _E?!I c"{BX2cƌ`*~Wm+_J<Ƀ<LypGpmnb}k.fCPcsΙ3"XwT̥՛+|Cw_jE O #fccA8#8#,+l\z饑lA٣/%_%<ϯ,`ۖ<9;9-gcX8uN;]G8#8#5}&v]uыB&DCXi-3K ի֖wBȿHfqM?!pXOȇ=P&9:0?qK~H?x;wnн-2V`:G(Gtn|w#8# pƤ#[u:P6*)ZIJĪ6y萳ÁvGɉM!&i]k*"ɔ,wk]2EF ?pqDZŢ^+rWE<pGpfV('ʥXB `D#YdCgLA,2#nS+AqMK(_zS1S?y+zZLe=8#8@G ɕ( rٮ YB^P}PH [ۅ\<Piz3zOt#8#8q0PX }eV|ZVP䚍G/N~3ӑ|i͟#8#8)aIKélQX٪UJz#8#8;32,F*u.[vU]#8#8;*2F+X@%e 9#8#3"rZOep-4T*LCӸf#FhFeGpG,]P򋄔&4\,d`QaɦqiX;#8#T#r4,4. +=SV TµXS`Q(N+Y;#8## oOEqEHIN>2Us_JE Ya4L.K-#8#8@ʑpGIuT_@DR_(\5sGpG`FIue|ML>%ae +P^K;#8#ГXn]2x8ۑvwG> K7#2y: .W64UV~ֶpvO{JP$:˗g}6 4(eY$}ʔ)QO߾}>%:U2k֬˃3kЯ_bX/ '|2 0 ^(؅]w5P|0,^8'Z*_+W ~zZI~W$/]E=Se aIŵ# 0yvچdɒO}*/ \pA:+xI'N8!P߭wO<1~f1u{֬Y1?ssᇇGy4ʞ ^pꩧe6骉GGAʗҰqiX҅_\Vf+WZ-yOprP\u,\0,X "4~7cƌ kȑ#-D?J>u[z0{p֕DxU/Kvb'Nbm4 5jTޫXm 2(~#Wŧs΍qƥI `rc"q O6->{xfkMEaŕ _5\@//K+׎3<pw¼>} g}v|ˑ68Z90gΜYy衇?կ~u$i|O Ӊ25ɟڿ~z/ST87sT1op76gѢEEs / 3g ~;vlԵ.ġ=-֖*iaX}Ѱхa6;P#X>(xaJ$YNJ=ܳCp ' sлnUh/%,ִ E{L80tJt>:蠊 Ҥa1nXpXҨ(P{,̟??モY?#$~"ݴiS$x"|%N=zt;K8yn~#5hԩS=ᓣ>zly,|XL4)p0Ç9(b#$4MaȧacShTAEJkoF##!pƗ /2H"pE0/ /O|c|?Xt_FH $?A|A6wF%$a.,0z//F q̩&|_)9gqF-o//c$K_RpO F_~yNR1>DB@gGcCpzkk# SWM#$,GX!:箻/;oq-/~GW1W_]yaX#8|ܝG>ec!c=ĕ4+3 _B%/<ڲ*^tU}#$&tEd"@AH3DCIPi D$&VRU7<>gsf-̪sn֚Ys͵ܫ'p9Vk~zyaiO{Z~G~/_.7=7īE P q>!^>i4.9e;~ 2Pvo}+}#I/s8aЇCx±krO&΢Ͻmo˫ݘGo߄-d#?:G|e/pP=1x;rK.$ׅ7}ss8 8[8&=D=!e7 /C&DJ=wS Jyओ.C׻|EW\qE5I\pRD-!1~?z@RS;/ yC*o/OXbS4-1q^pԩuNc^?яaoAie 4N k=Pwx }{)sŁci_SϩUOđQ@%,.^躮Iƈ4piހns1|wW<91wX]2I}_,8] =2$MO=tpDz"k^צ??M0DJQ|aq?p|~w7 s#Gq!y /DO{:9^VFreçC(zf!q$际XLL 3ΟC/&I/n)|Sa$'CqVZ)ٜ!'GS_D>UumP^806է?hZe< y/Q=*Io8;|<}΋!Gkp;8zŧf|%dI!5^@pʨG`.uHk\#䔤2)_2dN7p_6PUoUZ>^ydsEyI;~?)?L<E禎uǺ_rFő?N BA&聡9[G+^6祿'L8_Ǻ?2A6z~yA[7 ?H# 4p521zS0XO:/^'yI)u^ ^KєWAC,(# _40H# `?Dzך'>/GZT3̏H/=?虗O4{)uL*|vQ1H2@yt>H# 45ǵH kFo9%| F-%Le-"r'?Mc Xq*+x @ 06# 40H# Dk9#iǩjWxky_).t)Ja9$^[=i`Fi`־XA|:sߑL&iՅc(NY(^&u]#!K*|UѵFi`Fi`-k9%1}~չ0(>x{@X (u͇kaF# 40H# 40). |7GxT焇=Kp}  x L<#hv?Vm=F4H# 40HkOl*`6fO@HM9mu׫)8 hFĪ_q~o>B#i`Fi`No&l}D}e?r>(Ϫǐ;UqM|]W6;p}K۝;0zG4H# 40HkOA|cǎ+6|~I%?XqSRXŇwK^ 2jr |>۾ p}6^dqFi`~j4?o4x$k*7߱R`Pgzs~OE4E<}P?t}+yԈFi`Fi`h?߆o![y0枮)-^8a3Jī"I8'0u$[*~Ӌ?tk^~#I,xSڻwohfQAū㎼s{UZ^cR0(ےT|QҾ}ƜHmqq1$lYA VXOPM_}uխQu((S"lԭ(BoKb6/G2[6{ӖG{Ul|mffkVk6]uU~W-_kdwSŹ%?ΟraY\KE u HHq]fī53w[`o/ Y'jOUF'o05CIZ ME.ɨi )A`H"۞2[DbNEb=l8t2v*c6mڔ/ :o"^dO0Xa5#\^MH[&đ륜wpjx[҂Kݻs^]v垍[o5W[,{Cxc P1x>L9'ލ7$lpA_ȟ0*YݰI({ȕ|31<OqĨ29'.e2z6_Ʋ@"su?o{$q!q5]1(,rOJ |Xz/=:@*.A25%d(6K'R^,T)/RV.Qv[)+# «YFeZS` .G dXI>/O~2|d`? H/s.hq'{ O@ybE;2cGof-Vc +G@1(%l.w!*=wD.=cQDzY7X,qz|LGг>t:A>O|ۅ뼼.]:Wr{{*l(tJyP;+⥬^{ݯ7:Y0ݷJ.ӲH<[K`vC0)nKTuHKTʸySYeneZnñaN:ܫSW8dAU'Os*SV7oa}:K-JgO2냞Wai| _HyC^ލ:tWx@XgGĠoF9 %3]x}HYZs\L=8oJ膷[ޒm۶96gqFtE#㬳og2>+} >rX!WyaKVfM-Z)  290#+Jl`cU#O ^;pg`$=aDO7GpF† %8 J:Gz/+Vcj #quăM1 U 9D'_v+_[AzoaB7A8ҼEԛ8Lzx"۸497(?r =LQ9fo" D=7QSب6VL;z8 9E`5ϮiZ<Ŷ`2VSқ^S%NpuKx?-:{6}cKzիj'>W:/{Ow]қgUþxVi*XPB$6WA _TOl$5]V[BQaب [4e:YROܪ{:a[1(S_Z7)S ' d06'@%SQk}gB׺)V`o1g1\3O{q{\k|Vgkz YwqΊAnYzV|t$קg/Ϭ升ˊ9:fxɮxUd8wؔ6Fiz#&[lv`)aqpoȭ;pq ]VaST-~16DW0.I'OQƕI\aJdle]zPZCF#N .v,;cKwQHGe)a*YWz(;[[__m?\OwPؤ>8䶭ו6V3߶ a쫇SƹIn`D{=E/z;̫۲lwgZW{7|zцy)TblՃmʞ'`+0*m^a'`M4f-bnYOm6=wO}>ca)8 iL{+^\=ɓgaekmO9{d}Is8&֨pڶ,ˎ Qfmk9qQ9<̱r\O:9=k(h-R4[;o|l%-OT6F 6v266dNŬ/[#lchy8*&ۚtU,$݌kˆ΁6kse17ϥJ4+3AC7xНgkq֟/c0R&仅&T3U 1SV*czss)cH9P!9l eכe8J;\2m}9)z( 0vCx6TQWó-[a*~0=r;;vmigmR4C􆍔vH{A]jGe2[~ۚ e[iz`r[Ӡ=e\c̻yڶa# mME{H{Da7;ae~^aV5a7;s=,pvӌ, 6lvQǾ4m/r揻:)QIP׺ UNE ~R7lۿ-+F`R6Go òh61v;۰yߴ5 氞sg;6?P(5l?6[tcXZ9^waE`#?5MhAstyMt Ƿqwڂ2VKb#۰mcaͶmTm&[?,˶w6)L[niRN^/ӝk||a Y1:,e^6?Ê0l&@ws}Lkk͢~_˔=s6 Vz{T8ESk݆Kuޱl{k:`'?Nccǎı =-fʂ]zWGVoVao*ÇQpI`HD"?vYƭ<7ڋK-1y}V)ᘂ6εF6nF[6`#QC:Fv6MQ^ݍO9#/QF3pZZ-Zβ-da-dٵ. +[07'x|C8 r">L< `a(+L/~#7Ccu=~;]e:0k#L +T[{;p+x{ ٗ)"4vE鍯Fx-j4l̥"EPFYQCGL`1((lFޘK:E"|6:̩"S"w``yx"mtZd#խ7ۉ|Pk~MǬn8:Go,dqV>px=}$ө;XRH(4x}=dx☆G77q~yS]o,wjdXιc2.uirc̋%L .toP`^T%6 SɫèG7i Z?0~izlr3ʳM\i}tW9Va*yF ҬFzVW`q+@>ʸ R/_T:x bU{SU5z OKiו1׉G}wRKeXb #lq0Iϱ;s W r}:JO<ؐޠ9GW=/`#IKs2(=.^Uƥ2dIrFOJ /cp c/;*ȡa+!\%ȯ>Z7qXRCuuȥMܧM pIpo̳\ eLY2T֕2FK*mx60bHl0lA۬Oʐ E ՛ےE Boae%?qOS0-zٸ86L<zH[^Ebh(Q6 - +YYüLyȡ9m썯DQްHEoԯ(Ffz[(͌ hEa#aK8#O35R4 mY5,zh>86 yN[=x>c ɛ1LDs .Y^vl߇V/O COz<Ea=2&כ?WxϽ*?qm%mf//2V{)l^^YUuE(*&ae ԔdqxXO027Qre-0@m#~*h$ad 9Jec!8ᒃ\stIό|g{vLŅQ2ś`&QŅQ\cM\q|s]򄥎a\8h7p#=6΅ͧ^Xu_yVLL}\u 1|0 (raFo1RTZ&%}aeI!q<6Jy6xUI]ڡ $V?ؼk'cS,ZgYb–1.FxUқ'eC*I>Jc,P|?MiiKKߥ]eszԭ<ًQ|Q֤*>S[Is+.әQWhI_xaHqDbFƗ# w+=`cEĜ1΋Z< bVFacsBevMQ {ܸE ȋZÂ(F`!~K0n/MD艍Z^R_ GK3GW= O~renKd^/q 0 J4@adC F"+"tk0-2 [Eذ RQ[r" YQV&VÓWf\"mUlHlC~̗zxB&mxd(lے} d~q9-zpza㥐4}}ŢN|0Z:, p\ft}8 h~pRVc/3`ogQDy[n`}+d`j-ZLE^6zNlȌhl3 .F`~Eu*Q6'ʈr`Xv0,zspp 6zz׻ mLg*q7 ' ]ŇydXڙzڢ(rYI6޽xkƐWP~q X!Hl)|DQ0&xr$QB4f>h=GD " ]z6E-L \=TQeJ6V+2m||ub^6HG<֚3񲗽u,ϧ{yy/4,̥@oy 0CƂ #6}89t3W C# m^Ѳ]{vlʞZT RyY,1&ؘ+c[F沀QyU/ oL΅0clGZ!aVa$/'9 ]!5g=?,c 6IO*Ӓw+cc#emej&L'Z刍 \QF8=2*^=vm @'[Gnv> OГLeXMe|aD<|qOzl',[<[N6]mpvF/cC = ҆{L^^]+cF1-;뇽l=+z\C'RJwJ]:`6ɫUG6tkvUSƷ~{v1ytClC6G86C-vH|#GeM}=s~꒰W==l}?9zk3y%mBI3甮j2OvX*_7g?V*0]x0颋._2HuϹNq*$G㺸KNչJz䘳 q]ay~ylTa*$ ⒫s">OSaMXKt]z iTđ4<_gh"^q1:ĦpT^eUnF)mKl:W|ϑ_eo~u4J: exa)5y&H2u.a+(.6#>bc>0pJlp/F [Ncl+ir_axO?qS|וV-*qSJ:_͇% \cr|<W4.0-|fTX| ߈/0k?ϑ[jGzKV/㴏{]I);l#a+.3Щ)??O ~V ַқ/H/yK* ڻwA#h^bFFo|I/@YAxm])-zqe5o)hu!ؘS?zN>F/~[g"a=p6}6VO`g(brXbąrs7Ubt`h2XG?xhQggfXM{^ -y&Пpuz>L:b6/})|I޺ndW$ $9X qh<}CxE~hu7tS~jEN+rBv(A) 1kULHlQxp-(NŔap-1oQvF^طv81[Clm}CzDu>Jom} E>gmٞ_ g4S{;!{zxvӎ 8,G?%(C:~/}l׾~z`=fu{]zы^.O2< /̈;Ee6H|ޢQ}֣+W@6=lmlQzGoA8ߚs!l9yzlP!k!h(r(Be EYoAذ l$BfuzEy~ 7D2h+i3#L _ 𡰙sk(^V!`7zl=4FXp!=īW嚜E?Vxdd.%_Ǻ_&8k|\wuy?=aeȒɢ 9oϋ<jDC>g @bfd]3nZ|'nv_FzH+&w_;o16e5dNcijkI'GcqYâU9Ƥ0..plhJF0 x_o~3] :`+*Fsonj&|㶍gvJ,&;AZآ7$LKFdy5gҟ3#3|l2^):^2G`/Y?mpGo9m+K_m5eL9P sQ~`F9s#e\cmlVae.sZ!8m7ߜ֡b^kpld0ʸ;j 7֙U!Qi>pR9;na*c)Pu_;jj6ݰ=(;p 7}0vis!a/;bϝ %5 Cq0aeU]j{f{nYװ=f@}\OW^yeԧ>uC3c.:QR~īx9wy؀04&q#>0v;pDŽ奍m@ ֎췇meP ۛ 'l`4-ؐ>s.=IWWD#ȓMcqlxc8?Ac?ջ_镯|e |[ޒw 14y-1~ȗ pZT*\ 6 ;m-j.{w"0X9FA Q #vÆDPrkG[.(m= Qؐ(B>a`y=8X8s*\IvSW{;_BvT 1)6"az`i#Ȣ- iW Eԇb3uYqliu{pmj!gMg_)v: x.KE]6uU6} ;i\Cq^^w5c{umUwWg>619tK'E?i)p, 2׾Y8C)9G߄t _z<tEZ&!/#V.F.oQdz-w1"zwzِgQ(lB( za{d|XDH&>AQ=ݛQD`6:Kz'0؎?{hW${Qϰm^ uHOF*qbqn "9.ŅV%ShC,H1xFG?꣜8 |6FE;4zuCՉ&GsC>r\X0K6ƃnp~JPcB4%F ʃ0*'J*84"8FC4=t崐6ΫI({r#pI_C%FpsO4aT{Lp.=a}xY+1M'=9*caC^h^a/һC읗U!qI}xLK2.퐴YUڡX!{V>N\F.ۆl#UH!ecoPQySuEvC_;d6i{ #ye+*~:Oot~ɛlKl6!m%بQ{OYeJsúPe\glPM^vgòsis3{ƥum3v6ޜo_@&ag>]s %˧珑1懀}AP%c%GH {{r!Ħ̧:Y(  _fPx^r1,6pMP|%A0ҳ<,6uΛ<0PMWw6Ix8xPKONob!Æa&x 1_@[6ǶbC/ # 2ðx w+c26\i)KݔWa$lja-flQG>olʃ/c/pM/+j}5(#(Ot7,69}b;4Y8/oor6$l_^NDo~rk=]H._/W(eP `UTZZa~7^Oe>@OH1B~A PHY*R^\2Ȝ#!RVΌ&iYFeY*0pxn) Lo^\ɮ8\k:Ow8ğ$D\Žp(8t\w0 O|m^zYx[}{SB56.(ҐA2-չ>*6pAگ~GPo3Ol÷߄{x`n)CY}|V|!=6n4vo IDAT_!Y[L(7KadKM`'Lgla*ca,izXzDoԶÆK;\場v7*cGaCؒ\GTFJK;gو&Wv(0!6ٍSQy>] 쾩_ؐ!KavWbT׈OS >#1zb49S_jeXd c;9XsdS8xQeÃibYs-rC?Vu鮈BF  0$7} OOz Loƫ @>Ez+e6) -1!Q6ި#HoA2#9ȋHl|oG.Dz"d!^gza"^/}Q QqxDQyvmiy3ip`s=U?+ 'N*Z/*1 qXK+|Gg] Felww۝͊`X} &l˅(b I 6F9ll; ۄU)𛓑J-es-6n"m_!E{m}ƖO(bɨ:o(hyT6=1!' > S^Ե6yȏ|(EGW cosQ7Ĺc܇pqK(^WC oH_OoWOe^%6\я6ӰB`NP7(G&w2 $pe7I ȞSzz' YQ@Sl"zz'S殆uʨSHivLH1s<гwWR;06qϹ!p)BH^?.Ó $Os{#H__}YA1 9^KE˶q.j0=^؄F~Uغl^FBcе_sz=&UmS %g[\q/¦Η0*l7*]WE6鑁ǃbD ΐ+(eaYs/~TlJccSXʀ^ a*y? Wz#oU؄Cʘ{lMΛ`D$rUF6ozdsYy s'Rܫ,%^nlLO/lR%/y|w9Uily)/3<+)8/H`X@a{'=Ibu kX*+ڰc@)!q"Ĭ!j}1"ip]:)6o胷eq݇AOO-7X5jx{*eN`{4밁呎C?}z ca聑HYI_U\wQy{lu}L(Sa6ZeElVMlྌ2F*cXb#mow%nHtT~ (V!v2>|uUʫIC΅[{6qԛ?66mCVeS#qеlyc[t'=f;l#JUUa#)G=J`|U`:)}M6UYH&1Fٌʣ* W!MBIc,ƹp.ətj}Fg†(2=FՁW)s+뱥~X:fX^}.} G&vLԯ8({k.^u_ ӱ XUV皾G]mǎOɷYl i~ 1PC&#m"ƛ^Pt`jz#ћ)+2(esH A YX:rWoUcWīIB/.!R~xGz׻ޕ?ǘ;rd.OXIU۳f@8>v6u Jz#4NJUrz+i z̋oQ(MF27wDxD 7oQD2#(†7g(6(=\DKRtza)-$y~殿>BTA[B z[@oKi~" Mx[vCMO 71﫳;}s,Nd޹N 8^<.(!Xazݗ:^Ư Ww7J O}K_냐//NЇO~Sjt><27hQ&V "EQz +4i|q(OA~o`8ݮEb7{hsu2[Qh%z}&c1<.|ȣ3mTxK2־Y |^(Rx~i9m?bn^5<(ziO{ZN`3Jk0{=@@)aO8M~ץT.,oMO}SYz8G>~h; F?.b`$ UƳaV~u[EYfqIu*\ ؘ7ENJP,ؼ([T$/w<(lA^!+t-2%;FsWQ:ի&6_7h+m6LD?k lsfijol>m>gM L zd|dzWT{U?W$E \DHDOZS-$k8o{?_+۶ߤjW$)+JG=QIs JdK~e0{ 2 <<1,d [5`6mMg5\䓎ҳs&l%0%K2,sYv  V`<ս~|]y,-A>򙱵pF#%Cz3YgWlҳWy6 u𵏹Vb,=Zg,]Sg7Br2.0c3M4&aPD:u}ovuIe2&gZܬO_W#^vHl2n N#ffl`#A1ZhKe窛e=!u~lFׇR*ka(CQZ6BփA{zكPV^֡Gv6ExHK [ϓVc<_xδ ;VƦ4gNͦc,ivdq;<z,\֭-1#ibn6M=X676]:fłmϋ/LN~eD#~bR򝸡k@@ 9uoPG$,JjxFb@ӟt_<`^P|򓟬'|K_J X)7@6?kѺ0.{Ppq#e |}^+#.Ղ gyEӣB7<4x40~QyhaA6[-cT&+md띜d_6&Lgl`0Z؜/"yHĘW1EeGa4݁3tX({?؎pCZzLalB[Ѱ-Y.떮;_ncCS-2T`tLǬ׃iۖHY;l2zuv(k9fu!NۺFlyκCfrfm+ \:1:W,6z(e+6x;lIF(Z>'mN3#*ʸlUyjW֜``NVl2}?65yH*5%/_.0eF5h߸FдUZp҄ߦɒ5 lz#Q KK֘[Xly"^Lwo͘66z(%nPʽ .6dKLz<#ff߾{㱅t6mAs9!s =bQ_btV M۟s G 鼍g#\a[ga7/`7wagN_l$+uzA=]uW*ԏv[ 'N${0us.$[KƷ9)M%)lý|+Y71L߷g>>H 4il>=.y_ln ǣgӌFQx9rM1dH7^(=D/Dp#9SL !zG%]zu#۠XAԩ&)l&Ι~m`O9νpEֳfl-p2筽տ w<9wH~{>ў.cߍo~;<<_%SOq"k cqȃ,V:gZj 97'73?ټO}j_E* OF0}2֓իHl']EO^"Ș! mz*~_Fb;zCf!F CaQذHm y1PA.7vgv=a*>m*IVA=6 #M :_Q7џϋLj\\џlқ䱚Bu^!\e|ذIy<&ﱑXǪXJS$lK+`S^/0pIeuP"CHOJ\9_uaQe1zOv|#PmMF1\v?f nۻ/TUǩSWb#ttXy~DzTJ;>}uývRe3o;6fʾnY=>XԕvXEUeݷ?KgLg⨵{Gbe>*#_g]>\F=sr0-ΧsUoٟCed" i[L7 wΰ ~?}|EXVY^au{u9F>{S"_Mi?ks^t]ǗpzÆ_/.9^>t#2fC[{㍒^M*l„|$2VzP2{+8FqF)Mau|z'6f/gQ¨ O[֛,X܊-)O&+kx7.'m|`VNؼN;P=t]}:TzrF\Oڐy)Ua/l!n/X:UXlWe\byhrAT .) UؤR?^o*lp92z/A\սMiqlC-N*l>XJlUnM ܌67˟w>LvO=ޖ b#G>A,c`uz0ύww,6Ye/>ZJ%6a`bH;l5'3[HsهUUMitègl@Qüa]H{a, }t*]9*!"W}#Bґ9s+L] S)PZSp*Up׻5=}]a{@?t͉Y2ۆDP$6p7Y)ظXǫUypݰgr:c5Hְ^Wmɜ~a[l}ƴix"ݰuQq'F9xcjL9 yӛ5yaf݀ ZCCi:{@)>8pn}A#mC2u&Ivñ{`{:7* 7VBG SVyޖڌAϿ]:"oHOMsRީtzsYbV֩WOwB؝XGoYĵucH/"w}HTJ/2~9?æIޒ-CjCn{*tؐx>:6JmC>Y~3|#wU"nņugՍ?xC:7z*@7aA^Ȏy,/,*}fa[L+&ݶoL[m+#7A=6}d296mÿIےՃ91OCmRz@22n@셁S?z˟γS%O4i/i/}`؄C<2OrֆYFRgH6Z09Na?mGV/qOהְ$DP`#.YI_Q "h-"ߴ7 [m60d CsK㻤Mt})k@ -غn16YyqPl{p0|} GYNsΛ9tv6)Km6{ﱭ-ņ\m;pA$6Y6m[N oƼn̪(m|6E6o} E~FZ3XB;":f͡O@&Uh3@7̋3%y}*\%N\\=2|H"r>X*eiSӔ=웨IQ`=lL $tİ"#3ŏFC-|\C6oh[![Ew%;l!^4fCl/M[7e?OaLWWfszQؐAh}jߜÏ%>5uԾ6@~#hlJۢY+ΥYr )QEzAOZo1[Gv&36":^s IDAT{v)Lo Hѫd?L 61L҆aDgY+)vȶY6G0vB9KVfs62!;K~|9z# cݧ>r i" #cݯ A1soD5 +h1d&6'+h`zm=ȉCxm;{}8!9C.If-:kmiU$!,+DŽ"U3 aĨ<+ ң{Ybe?/1*¨!lI#'=rd 'sr0 cYƤ҆{L{oەSq9GfM-(9}ײ}NQztƐ:?ѣt:V^b[OΦo=޾y\J`bۡQ1+^IY̤lVoo٣0뾸L-Cpptwm͇MƷo^a>lo?^KsaSvƭ(c]mG ]V>5Cʀ,c0y;eLX0{$:67Ʊ9d#k rdmoG3qU &ұ)nSpI7s Ǻ֔+.X /0sٲ%fJCl};9;9T^~ {X<7`q}5W_:FҺ (UҕO6/4Pe\8WxmҊA1I3?9eV8|WɤRO7, /lp!t,>fCS/z˗MûѴ;mI<{K:s^R}Ʌ_k+ק*8mU]yJ/V|B4V S颳#^||/9aшS*}ai(/ 8mR<͇h6=f~|\k=c4Uiyx^2cwlݔ=ewlۜ;˒V ֍ԇ<4Q|Յe-ʫM ݞs[l0 0z}( ^BqkJK<Z[V5!H9zrur+-tyʺtg3\2<Gty3I]A\?5-'Fbp01ضlޔ.K[L4{iIFNՆ c9tFqǣe%?=[I>6?.9̴.2W]QO:ltly: 62mг iØ4ZK{l-gu[3)dq?zU:c|(xti.of_+bQzGY͋|ټMOqJ!lU:R(=@Aj"_xW6,M1gnټ Z!)cC#Xaw&0WGXipPyL 4=ZV}6ljE-3}9`s[/ZY{;mJ+mGUvlڼF`]2g!("h:!-G셠=tDja:Br$ ɪ~#$ۖړ-L)Of B잳C~Dy۾tز&" y _Qg 7y6hr"SYybZB xzrѰyl:|o-M8yT55uXZ& #|P1F+`6s5_s"hM'Xk-(?k [k2#`\?}"w98\ Ze| ÑA3) Qè9s=v Uu0H[BGd:!>f?z$é`|sCbF_vhߒE]#x/xA=5"R/+ܿz/\~4[x蠯跸(8c{Py#ɿZmh>]Hm>`on6ZNG+\vV$ng%;U^Պ`%n//Yr?w2 |{Z7}a\Xu^sZ$hH 0#jTG(3>堥T Ipg}رc$b0*ҥK-)hNg 3n3]􌃯-L:[mum'y̶6جwhYb$rV4v l=ԆT2TBKj'CX^oinpz:&"0t;HÍ܈Dd,DZKM1OQj?β lgo1incaI * ؘɀXI O0...vżIml4Fzuic@F/n~_Qs{Qi-@Tv f$YBw(1 ~#QԸƦ1h,g m_s%T[{4 udB-~kƨ^\ l|hC08ԇ5Nv<|5XQe ;dVlSҝކ^j~lOx<7^ɭuV9`c0SPAN8 O bE%y2q|IJqqk\$\2.}nG0 q k˭qڑ7a[E=eݭ6*(o1}PkgF`+]EuC7/"ڇx(iN5MpiT..+q\.Zj]?FMv(U#aGKmlzrwy k9)nzx5Bw9h/s֏^1 ZwEm7H=W -j-exv<<=*r&_#VO.n!SB}h?O{K8=tspFY_Wa6 5b,Еeq|4z(8hx׺[iM#َpPpP0Sl$-6bK8 /:Ý18p+\8-pXEK62Y /g}[ֳvFz~w>|9ɑ}&[zǍ%6oS^n13칼z{Tg2= 8b)w~PYO4b$j1M׊mUf-I#[҃gsj4nL}l{t}tV/[{;7;mgy#2mr ̆M}l%FڒIn՞GzZ^:86#pmwWj?w|"lGYcnlPDNqHBnoj YFbMH2vY͘%`půQ WK[lk);DFL}~$[죳`O4pb8<Oxw I1e>6l?kcn~X;klylQJ1mE<1V?e_W пCZ+Dȼ|GdO&wFq[M,Gj?'[k*_-sik݁a$X(=Vf-~Ai*7\Rv7OLky n}<5¯ofպ+D)ANJI6%AYQW^#я%^UHF8]t;w]x/~X>wm"r#S('phHvWa  Zwjp`v)'9U@] s!(: ehEl`^ AP!N*VK}+ۍYZ9'j^m NFۖz!|lr /XsS]\%L8-j!(Xsւ'GuZ^0?:2[HB]9:^OQw+hu}UQQX-2zwK.q!fI.Kx}8+:iMe%HW/XWE6TRc]kR?X\dL p~ ]EqڢӬ+5we+H7X+r(D4#P*^x.PGR Hä?_tKMMf*Ze1G0Ѳ ͽ"YHE͕v^ Io¡%89>Y#-DOX&ܹbNGq:Ri{{-9k'ƌT:3ՕZ^pѾ |}m_uH3nZ: >|=Rm^ /Եoذc퓟&[#>Ц蜌hEudP;R*aAYy{xxꀪFH;*lq 6zkʰ;WOa A|@Uъv$hQuuXW*ڜ)uR }mP|Ϯ: $uuZK-ޅlkp̽j7TP9bE8Q Rkb[3gZ9;A4Ou]IԵp.ؚu ʈm􅖦/ŤJ°u CVW}S$ݑpјu𺕛hEH{E0C$5}&J; w?z'@72ЛՁ+Oq1g!W)^7p3ZC:wT^zGBWxZ{Rgxd?+~İkOio=,͈>1ob4ST #:HɁџ/H;oZc]_^$r+Xڵ>3#W*}Sv ISaxnlM>V']ͫ}~[CDE8m/圑Z9"q+tkv*7܅CPuke /2__u>37ƪ[^'x֮]nwqe$2a'>b~Ǯx/.1HDڨ(GgC|iP-^*l7#d+6)ImTR#kQ)BHZ`$c$I"蒎4"QjNt%xFo&n]G8$:\9qbYE!n2:q^ªS$|ӞIbh\ᰉ/2q ]X^9kM9P=uN% 1½kǒ^$XmEɥ٧Uq=`?b fL-.uP'EIw$K8F ˳9 )R ֥wL&IQ%:,J3q#%^DbL\F7 =/ͩKc "Ι!cSOUI-LMmt찃ŝ筞B7ZrX+'! }8ʹ$ItI_ѝwB4{9|F] _u~20~x-:bľ*OȨ2Pe& S.>9<ǂE|Ih:toni_Дs [fˁzZ1Ċ_zmۻ׽Wܴ=~СCc isbd^f]L<#Wgh  Y#YIDI$s IDAT\K;} 0珛9'~4MY 2w)1I7:<~<ںwꀡw)}aw{>Z^gՕc~Rc Yv6)m!pLXWH/E!8': QmPÈ :9GtY¹V[YmsY4cM+8.9eȳj,֒5d>fڦ^>|I'8.R r[Jv&eyV{ZFͯ˭za#Ÿ{gZdY Vk6伥t䘵⹷uuf˛V}2Pz޵[r0imfIUz[/^Rb|atg8'.֤lVP{ 869 a $}׸)߶ ^nݴ~3 rvi.6]mNaL(`xJԁ5bgYJ]h!5h˖-oޏ,E:znu) ňh:u;w>ogѽBfZ}?G_Y/8`!/~ H?Fuz;PAH( NO$]i׃ljwQ."Jc6B(yDismq /+2F1!;57kȻv2Kz9ecM.\hblxbWϩKwsf}l8<4*pme U%Ȉ.K$x{>:# VV}|8oJs *o<އ(GʇPgwX}SmȲ뜗okaGݩ]u"$R'Xle(~/]8;{ -;qIn0 >B'C]ԀRy?@{qIUVSjOfPǞ$4S#gj 7ΠML^;P;ͿVi'^c[ PG$^Z6.ѲMy5 $D}^Z jV}\M$LKV_Ô+9L[0xqH­D~q %cm={mع 3Gh#Vi?U+eo!^X\`'4tyOjyϵWöqFqpa e>F?R O$ԫe6?9ԋl_G(_RUh6h@ T4jh,A]6? qB˽Dv8UW#9w[G.b{L6[C}\ѹ%IdRfer2icZh\99>8|^dz;&K7M+#تV7s^;kGPSH?~|u𙫽vC}wܧ>Ǥcz);mb&(CkTN P_TX"⁹uܵ\LTy;+ViTҗ{v!;ЦaJmluI]<؎^n(uԺM04fښ/.|qMƹHE%:&le -Iz:Cl"Ö.*Y]@ e]+?mxv{b+i*0NhW$jB^/RUJ4O{ WBW}]{)uQ햢B2[_efw8cwܵf,eV/=k \W]JuCc(6ÌI! (#0 =9yʦ}ݨ ~ڳ]$MH~,=v)0o:sķ}{pAbu8Q~{r){[!" ^0Дl-(c8 c+,T< GLǪb'i Ch?ÙY"6Q}8^o  dW.ޖϥե^{TtHfR ϛvTmeuVrO^.b77q?Ñ MuVS,&"pE zjE+,ޑt}bÌ]ΙƦ˗~F eVt6{dG{kCj6#>YQ|Hއ'oВ[kW Y:%{ȶQЗ"d؁ \ ;FLQL̉4_؍g÷zS댋<󦯂/='!%(~a@]_,X` *$#fx{/%ba9~࢐\,byok!Ew{=QjyxBM0;t82;!6n_:R2'ia\0!bqn"X$j/ȸ^0%NF.. 8O!bܨ g4H:UM۬3ȹR۾'#ځWۖY={<-S9Qwup$W{J9cH 8wUU{>ArX;;^}zoiHŠlGުQ oz1P뒜;[ºrϤSVܡQqXt ػ{`d$սv q)Z"-pZ ]¸dK mpo v7ۓ{oIe8‡s!KGF]HDo/nù¶3PxIv_:Jvz-)lE? nɝ# e꼩6&s h8bC+W[\nG |/} -wc}mLDRl3$}ց:uDN&.Yuh|炯Gݵ~$U-~ݿMZoB(pe!i̟yl[F+Ay¶ UôS¾XV1vYvϻ6aiq1H]7I&cu7k1`HVR$}$d{ڶ;y2n;I* r/}1nqIR3'm'WWn{ɇ6\FQL+FEmAڮEŖ}t?g Z*:%ϘVêWv(IaUGaODX•`UDϷdNMjg/#ݼkq4qҞ@E#$Zb*?e<~7SgZ"iZka~s&-.#T{^=d+T+Q[Z]2 |TW1fzaHَQ/%wdIϘ`%PJ;We+Npm)+.~#CIٹ:pb+'h<O><C6& ~_?SS]eq~?xMj`aǩZX[>t=w(D(\΃-h[-sO3-!Ѻ,֪ڜ؏=i9+eHgNZ6s|WI.^*bwG27.Om\rX>ں.jC|J0iϨ(aZ%8_?F ο׬]pJ: ۞ =z$Ҭl҉cWݻq-V+¡ bqƏ#%iRRH ڜ>SSS!X6G*F¬Ο,wXqݳ"f0ja 1ZKIIZGO#X]Ya̞rlVuʬަg qצ٭32 [sih'P$n&lEYAFl ]v# #uO;C4Ad1Z/xk}|p-۳mM8R-M,&-XK'ϺJ\۠%u5ۍz!6@(&G9^r虍MR%zG. &+y ~ɓl"5T G\wܿ66fQ&{l|RYH(MhTQDb濰" h'miW-V_cI+aUZ✹0jMSKwSG]RKJI#E6hG./{l#g'q-[AšDx:Bc0&Og"%v=7!8^x\JW;]ZIw`E\vB[H v-8v[@)#fNjJܙs&H˙S?ڏUݑV⌽7mXlҘ`j7I&|-=b *N1  v1E_Xk!셧wt$+fDu@I}U?1,/.iRVơ>g;xoZ928f'amb͞1n[1ƥ:P  _1RRlB۝!~x)lx9Al'IKOvؤs쑥S!W{j_ԶrQJ Cv F hk'ڼ6=v@g٬MkmXONI3ۿ<=xj2\ysQ5W/Dy$پ ߅]u_:j[;Vܹzu }ٖ@TSKk~=Au7TK6LUɭK2s.SQQvH ahm3;[YV|ϡ|[}:˵֍6aGnf{[#]52mO5[ 'vͳ+c;(X?mF"a ҄m\۰!7m8d&b*l1MCvGYm6y {o[lt |&Mt6/uXH$?0 Q\:aRqgd$8A3H"2l?i%dtħ]Eo,f?z%^ J̺e=)/egpΥ:[40rzCnpA4-6ٙ ft.J8!X>U^ΡlwCo՛Wڴqyxۭ?v[,$E8("IÐSz99iu)U[c5!J>zAwߪ[M*<n]d, IDAThZ}90S M73ybCr!آr:G 8cJ'.gn\lΖKKmLTTcf!;?3{N k&̟>ZS 6w,~ΑsXU ╩[Ч!KV~on<7LT$1qgpG4$r$ {*XU^|۵/>Uh,}RÓ7~f)2.f,p{cSǞ-wj-d3>s̋Қ74E|g~h/hx+:ekOGlٳǫmǿlw1>_)+|j^oc/4aS[jIDxe poSIgC۾+Pw * eBd!kY0l9|V[N)]k[IA(fֺ.} M60q* 2p6 3}lS'ᐞoy\|.l6KT08/W|}s̉CCWXD!u"cuPhZc!3ĥ+G"oQTWz2H]6{FL&!^}SoϽuʊBu" B]`JVYgW3 3nѲNE_*Qja$$(»؟b_QGmuj9VSB}08Ro6g#P_4m_Мxm o+Aʪ; qPWDRW~V(γx)!QTi;hr P0NG˭ֆ9iw!HQc8L{NJ՟.ó3 3 ~5B qWj…(j;x$$ztVEEp)xT]Aa[p&LR9(+[]y-dEGCF8߷`?uMCoc}N  .kfuCgOa&3;<kw)'_=ێYN*ęR~GSbݠڑSF>r'>g Z{SN.ftP}l;q! ~y0To6)(bdou"Geʄdn|~̻ϼͅ}} C] T6j 0eH:q;6mVf5?)8%ox(tS8 uATTA7w%è3]3'8gJZ >;8^Κx#zM l;v,ju kEHT%{z޶n~߽6. i)?W❚Y9uf&a"8ߞz2lLG8k_Ǭv3P9+ r\g}N [uR\+cuSSמs]^3.`+z嚞4{4;;7`T 1 : *۟~zݱnMLu|z1*"g(Ũ+7Z,9oASHp xer{g0mwgNxE{j[.s\neH_ZQ"\D>KA#ͳJw8h5&ykMkK^;14H6a$n5|;u%= c֒ex܉ȭ Ou^?Vfc]܀#V,b]?b3yB-% oc:څWp7`c Mx ?oN#CQ@rJlj׼Y3uv+=!w̵rZ=uR4ٸf bع#X9}ۚ\/-8xT5APJ<l*-I/`3R\AV ℣xYsfޅٙ_ xX/a_`Oٛ:bnC'ٜ cPz?Ʌ_Yo^Ls PB%ky; Z}CK'fQڑ}O첟=l٠:TS2nBBVPA.yn}q\яEObxaF08l Q ~k-/Ϩ?kZӀC3@J^Z*=bkOQsvsؙp'cs c[_6 Mc,W*%PQ:7"Bb/ꯜA"2w\E5-Mٖ†DgD\%1UԿ{(NW''>=`_kE6(١I2DƉ4Ԁk_xGnT_.똒m /CT*#qq1޵HЖݾ̒$a>^~'AiE4}x{=_bjY_ G;~!1.EY7jR_ԧgB[?| hEBg|;@ٝKVϡ{K… 1㛨zmXAr WHGBڼ^?NmZ;Ϟ;^be5$IQ_8SrFB}9BqËT@xiAǠ2XOQEltqY#ORJ6c $\룷;C~u ]LX16k?ܽI{}AYʵqmw;a},&^IEr؄csdPWC!99|ƏAl X!?_D@y}_@}6ߺ@VSPnagN?7.ӄ^*#J<ܔCaRk:i.ن6@WQpP` $ 1esꋟzΜd=,m$ o=1<-- ;e)l%8߬6ȫ\9i'ON~e'zZm. yS0}pሺ\!XSF;Kik矷Ib|%tsl"{wY.:T!|dl5Rf G:ؾ# ɳl hЙ(H;yXiJ|ou%ϋZ  A;{߹lއAFՂUtr!{ϬfOoϲSe IDATo{nBY(n\!.58(b#8oxCڎv+*GS/ Ac=9bb̍邸Pm$$}5Ծm*_;`P sT HԌonOќ; ԫ̶ت :b߽i1A#(붲ΗX ;[tьBKMAWYPSjM{^\B/6AdB@x%.)[#BlC!0#H_ّeM#l9[Ŧ.Nfe&N2&8t`q0?5^yq08e6[X> b|xv5ͳ8BLZSͳ[q##D~Ck7p1S>NV!Ҿ[#yxh+hmdM0{[ێؙ荷 #ηGwb!{!=ZKRGJ 9q$iaLRLjFP{J''Y6Jײ& yY"~Yo_rDLZ2fAo%c!E;ŷ9x6qXd!(1knx.cU ȇo}{}#WY)zr"mŞJpտKoR YeS+vwQV݄B!RIoSkw5(jqDؿΛ"{dhj溥j*Ě3eQ~Zp8Fum%8WkZsk,8Qk]P>uD GQ a` o|NA~筅u.6--~'GydNCa Ⱥ1#Ŗfw:f%Xc n|p;eNAdOYt{h8ZڊZD8v{$M˰`c#58]}ζlQKF>C45~$|/fQv7A'Ġa@M܁Y7tʯ*4;1{h`n:Uهon/K`wUU;sqd-D݇MjA GK"YkZ~>Y.\ߏ)ʬhO}0v'IbSnl.cXN,H2 /W?Fھf퍁6Fô""pqD8tV: @=dZbCIޝwjńJj#R3Lw`Y K,ذ[FCG6~K%"|%DSh?bw'6:ܺ`"MoP4-NnHM'{¤1]e%=ֶa6VvlU:h6Y/0ѫ#tC6XD<CK#b6(bܵJ"x16)gn uv37mTċ}޶gg[lC-),I?*4M*>H!O1⤡11N@?;m%Quah\BYțQּ<{lF0f$^Y&6תw@ y<- RG5C$b5> 9n~#|܉;z4Π b&% })TQ& L1E AV)"Xk 꽓 3>-"iGǯ1k1^ĕyUTC I K(*O"PbCPTiHHm7ϼ=ov_LvN9sΝ9 $|~^nm:nͻTL-"KaLxk F!jEZq⺐vUx|]u2-nhN_(Y"sM| BxE㹦xvşh.MyȻ¹L4TWFmEwK>xWj}N1{;6ʩ+E8Q:zwf [tMoˤ]j;<ދ2W%tMEh?n:w_RGI $(g1 "?F0囿Aݿ.KlO_u,x/Hi/[g'w#} &; >4-[`jX`#([W}c=.#С|vr;]cbuZtVr'˲E},_";Ծft%4roEbj{427wuR^9]vPʴi~pP뛳'<2:['w| oacJF~c*o;,镲)utxH}- d /xn=4^$)"HِVkIR?&Ύ#7 "fvR/}+n+!oh0\ԫda[AG~^@/yLЁ`huRϔi#q=睽W7ffLQz\l' |dB܎&3$ d-3 ˥,zXm˞XDvwj1g2ӖF볍m47V1K00NRLhI }hZ4A)nq?;d^oa| hkݯ rT-᡿a=0Gi:h4Yyzݥ_?/N>&CC7JQMk BO<0P^""W|򓟼:Ψ*aM/i.`o*'{ݬY'N Cn)^Jr?0n{]I \7ˁo),qE*iʵ+ALNR^6yr|U_fO-Ͻ*x5B"0Brr.ke*>[ zDBkuP7:E:Weaf}ZS:\H ðTp 7$@XĜVsLcKEy*oM>EXZY{Qa7,Tmhp a*I+ZǶ8 alsW@굈 4..mhb:cᑫhltr1h1Ůk}Jie )lv*}:pZtqx֟ )6"JB6ϰ=LZw%{@ʵQNLڪM7gqYXVV-e%uC3)25 }L}`PpÔ&ms1]Ft>)Oa&tI'q3+n~ܨđr4G5*rGet,OǛ n,I t5=I87#R3pCcotq׻_|ѝx?i{}L]27aw/؝s9)O^+g:'"v+QR-p6x1~1Y$M[I#?rZ_RuKTZ -vSmwAi0sh<ᗒ^ZT7_!o ҹ:^<&K(r(ߴlNy˖^H<^"ҝ8^{!K#n#;RZ`Y+on凞VXL(kp kq~|` ~L@Տӵ"I㷿~89.fk ˖-?OCo/ vX[P& 1!/BzLײ NwWER믐JY:۶A4/ Ai>ϽQxc ڢByYn.ܑfd*1[ 60Zyk1bV$m#kq(5g*mD4Yqz҇7Zx+|vM k(s+5fL{]h6FX+.ȿF˙,n͢9m,O8G;/GƶR2?2fu71,kq9{H߫& -߯?۴\N5N߱J<P'4c4F/.ฐOrqq8=FWz_ԧ>/^u6vp|of|?'~17< 2W&ݟ|%lˮa[,WF)_!; hH 1(1X]*`k\Q#]cU{qP.b)FHe7Zl#J*8p$rH, ǕADesn4 9×4ʣz/pORG=aPy!vvH}%I/\#$#G&xy:IcqۄgprY,Ɏ<#a EQSb?c (_ioHۦ^xżˤzi+eWy8$ ߍIY$+YyLxe}UU)ܢw%eGsCi' `1.1̳?ھǬ3W=.d1|o-CK;mJ=n:z /R(-}M h}nkʥ[.ϸl)/Y yF?̅c\v;bkmFbU;M"W]U]1lg E`7x&3젯a<(ʳSU0h;L i[}vMF? 1yI]IX_dƯ\ƕJyz{D6/ UV',{khyd@FO!{ ` Zh 8O6͍fMtvCĈe#2D񂄼*Iꗋ ^rDSe0N:%|!u9iK~-42}}IaQڹ~ =O6Y.7VR ܸGz7|{QxȮ:9fi1WGS^dɓ]c e`XSэ;ΟyS`RqqPlű"҂']*/I~g }RC2uGS(%e _3Zd_Y◣nwi ,c^hkY[h1vlK JV!zsh}I?W0bf=J7ɺΐ7>0نG_42[sx>~w3ϘyLn+} }?Y;j7~-}FN5m <_vͭZL 8 s$}ŋ~OiM՘GvZd-c/[L#l/G}uBHR;,5+WmArZώ{_LMd\gؐ"]J2rW\?F-e9b;%] OT)\9:׌UL=z90thp%MfK&LN)hAƮA4( &q|/K&LV2ZSZ(o1޼r{R&L+!oiM8.Tn+U9逃J.AW`whi.Y_ %]w@SՑ@_*޼Px˶|є)3pwx{(V|ȯ`|YTH} htͧ||W\c9_r_W@)yP`+G{)%|[yAfR0SRJ(7f ug?o1R:2q*7h6HC3- a%R}ͫ41|{5Sgu*66v 6}ӟ`[y{OM8M$7sL7B֥zVcMkJJ<^)iɼG }=0C>0KW IDAT왶RThORKWJZ!& (O8e$,q|_C1$<ٮɺ1!ap{_v03g!`{#COfIXG$tT8Or']"q&MO +װq}v-S2`߾e.K XO7vm~Qx%LnUc=ΐ,s_WO.իw86/w}:}{ a4tBwws=׽Mor?R"Ls!o`Whwroy[)O~N>dט'ϱbLS͇uhx7yO⮻r^xaN%\>x>V9#=S?4 Le{Ke-߮ F| P>餓@}wQ9>#8~LL!bx#' ~o*Χ+%m`}\#O~ccykI@2h&Â!g3CHDZ#'cZ;:~ڗ;!ifSK<1]c.l?ϞSY1Gdq-h¾$=7 )mxh^G8 swXĚBk10;fM]%ӟ|=UcyGyac!ep aA Ih s|(񼻬B~M D$|El4C0akbs b5O|*{ᇲY;+e0.HEZ iʊɯvAb@CӪt\^8Q`*G5 It@  phᘊFS>R ek<`ēn@}wwi]yy@CPCx,K7y ArG:Dჺ~xGxdm"'uX¥G`CdIyg>_ '|tdKMayct0 C0V Ic+$Hqy4q'~0%-0 C0 .@U'O (ԣ4e醀!`!`2R 󐮲ϗ$ 3si| L-ɷ!`!&Ha\{\騟D $Ȩְi>s4C0 C0uB+?5.ZVWR@]L@i|J'ϖ C0 CW$y8uʓ/CHDHЩ ~ap.I c[FXdAsU1usb]WJ~yiY]WQ6 C`G ȧ@H*c~RM ď!ƑWq7g єY׸nLL]qP6v:grLcE(2Kl/}KOϟyi f[ G~sh|vfq|U?N8OcN8![֢K^]ARA5k~LCF*rd߾1XB[d֧79sΑVY]A+d` t8aЕ\,Y֯_h?eR;u]^{ӛޔv统皵w8N6zPePlADȠ&q_-r$tq+Ÿ vZ:mo p~3* |;S6Ǫ}_GL#Sl^z%w7gy ӗ^z?lǙeEl2Ty|T!L`B@\Se;n!pZ.Phw`F|xZj 3(,["~z:z#f?p?CBQ5yʒ/2p ?~eNOJ'-'xxSB P B |Yl!t|CAe u=c͞{#G!t &LFsoxf_ _Bm`;8XMC4-Տq@;_%㽡_y/?hj${uᢏld^ôl< xn'e[xly'NIx{ן Mַ/ϜNC[B{{8^>_rADq}" o mGG[Ք. !YӯorC#{0[Y}e&[|LSҟ|In"g!|vgq?  >+zT:':|=M `я~k)0X!)tnӥ7|lz ]}ΠwӟS9qlڶ 9 < l=w;g}v$qO .t_BK:wP^x~@4ICh]'CsG9g~oy{D!ΙhŴAE8 XO> zwq0Ͻ] 4U0FxhZ /!K?hiDnpgdO(BٴibǴ k0wYg5Xp hqԧt+~skΕz7nY/SOy00AA6 r`B2)^=XߎCЦ#x(*SL1!?5h3СÄg=m"GO |DP7텏%(Z)uhdyf]!x*:AZ>>x85-!wDmH>{θE6ODGG`,;F៏\K |;=q_ۼ_>0 ~~Ft57?f뮺*/g>.r3ey KWX>&@4c :*:9u G#84BhШ0'?Yv5פl.Ahd0bePLOG'C 4hA f?lqhTEh<,2Ϯ+0۳>Bȧ!F(>^nh|r`D'[d'0Ge-b4Փ&MXSNie A@m}yM4/υw*֊wmB x#z?{-.}a>iQyg9|ATӟravyGiayկ @>цZ>= &/>}.}S¡&|ƌoޙ9yDC#Y8%;ך?S Ӽ`NVvL]Wϗjkעvt aʔ=]ƣhAi:+̚5O?1g`[Ď{0[Vh$Kipo_W4_QGuJ\3p.|{5g.7Qֈ1F^,GU n !(Mnɱ=MT0t`M<4e,`mOZr0fm%J7m;裏~Hפ!xX]k>ĸߣ>ړD>G&}\?r?h9i""hs'?u!!oҗ +Vp,ߍS#:SN.W_󅾦ӲaX)e4sHXPqךס}R)+w=dmT+k2 xFK:֬C0;s|̚7,S t&:f:kwtKH?Oc)3^S50R]G=~ .#_@'krMF0G.^ܹ/QöE~L<1 }{2'x" )1n9-ڟhhIC#8#0 <_u9) )y_GK8XA ""1F6:4,ǔ:ޣ_^Ҹ$<9ҷ.L_}~gifK,Gj>XRmfy:x^{M vw{-)-lZZR2q`IcM!xܵ 0BfKy@FvG[S_NӴ˯/ӫ!DV(W4nq}d}R{\o\f _m-iajA5387h\ęã8_|-3ءc cGE +JQ#P|C0\NTAcE X0s9rOL{nM68 x#ii[BB htzEsa2YFю2y;ޑy6 ¬ԁH ? cnb&-A ᩳ88h>v!xC0)iJB4p.G{f0>#'̙ }>M?(iL>)ܠG$8C>13*?j+_ulIW̌'qMY x0MS7 "rVygeI5!]mTOr_&/K +|ILqay"1f6};IĿ,S'^nu]^}ܕ5ֶty/a?N6g{7dn}l,h ߕtHR>R9C4%JERƄ _ C`D+Sh`3g]\ ^\:.0PʨӰćag~@ekpl\.,u}v]P%3iV?k"y&-TS#_3([K*/3ծ C0 CNnY| 5_(aMOP3! t\hso}Z9-\FE7?厒\X40$HJ'N$P71;qcaEn+縪}7aO>78xaZ<[Mīm:!89tFvq+gbmZ248hH'\`_lqnr!k-D0(_cpL fS>z8|ZJGȆv0Uldv'9%(`e,D B7ԑˁ m+x-FѨa oXC[^WG}g IDAT84̨G =4Dʏq!j3 ;.6.i`fhj9S3Wj?s4윆> pѶ K۷%hㄵp !櫰aeT}pwO#d` t,ECxbpd@\T#cW^yez@bgJrF0Ao:?Htf@Axc! %_p:aeDbAcq4usxF8Fk YPDAi0t:;+G[BkȀ 0ƵG?72c$kWicJ|qtSQ Ops`i@h>Iq-Dq\rT!wwhF@Ǘ( _ZD֫ΚO B9P084h`afVtM_Ab*P#p ሣpEl8qGy#Zc0LJ mo>qBBG6%CB>8dz h>n0'I3d䣖a-s8>b3l>9Ŝ!r;푟r \{PxIT&He˯է|kAC 0CĔ<`Q|Avի 4iI_>sΉiI:,:#dNJO@3GBG>?X4Cp`W>:':9" h ,s ~U a{#]y&c Nʣy! iD#6ֆ%ړ@莟WL_S3am+hD94]G{JVIFL71E[HR#Ģf) Z~Q,O9LFltiG0Dv^Y~ksD@B+ ;(qIeI"ȨT@ kT-u4~wW_c)- Pt$Ab,:0]*'繪3d4%& Gy.XOih O]gW5*'Z!,<gp>p:ZI*`T-GSA3Iۢm|}xD[;;4ҹϊ /"l8痁i{>D[xFk p~4;lw2Y,okw mU>ܙnB;N,8Q'e i#9cI }hC2l%m~}n7kTtDA[6gtP!\~ ? + maXc<>N"(unĕUeq0STm_ \hS l%Bkzʔc.F腃$S@€N{0(,947u㫖h2!n!ccƉfZ*V SaHVBa}xue e.O``ÏN岮 k 00T 5Z@#ġe#Чt|/_<$Gx<>̺B5K1uhx1G]t.`SyF ǚG6f {d) !E>,?#>*Yfa>IGޜ!YvqaX 0I~ti9BʒEO}L S.pw}L= @ZTe+4h[d­wIktB +B )|i#J^D4\3 T 4ec>ǪBa >+h#?/< -KW~1p}#7q@Cdp#6IyD`k0ȱy901K9g<- ZZ+i9\upGpEfS\mQ 9`ž~i{%hkͲamYQ7B툴XCRFh8Ś)s:YPAm1sh?ޏ 2O$3OxRMx&;0wȋvCe{_wV!+PAO} å;ΈR`4 C0 C0v9! Ѱ!`!`]a;])s!`!`MiMM0 C0 4P礱d0 C0 }}T*U[I5ؘ:-!`!`]}T*>Tp)j  a<_Ś+XǺ{nEcC !`! :㖊\nzԹae C0 Cj죲P̿*p#^pִBkMh;_1†!`!#SY(U'= 5U ͯ"~[$Ugq!`!`U yH2R.Uv+T>#_Qk eD q\>ܭ^ڭ\M4Yo!`^2H]>yI/WI3᤼߿+//w֯w7Z`he C0 Ck ̃ T e0ܑ*u&40yC&°~04Uh뮱1.b׆!`!`tyqup&7`aPP2PB"_ee4h7N#C!`!"ldnW 3K0q~0\qa=©q f\ Z!`!`t! `A,40¸0GS]D +#|ߴs0qRZ|el[ 47 C0 .kiT8ikPlU|sW!? +]-XY#v+lB 4_Y5V*ac\Ϟ=1 C0 C`OGUV ʴ/?^X>eoV0_qq8<;E  8 ~MRy3 C0 C`w!>E.||_?NŖϗ?_z\|qK돯qz|q8=._[>_|qu\>N/b˟/=?||]l|q8=8-/:.uϗ_qz\>.||_?NŖϗJͤ:MOr@HO Gqz'էA3/'|RS }TΤIy4Ni/j~R}c:'8~LzJ=޷I)oЏL*G㔶1B)z'էA?/3|RS }TΤIy4Ni/j~R}c:'8~LzJ=޷I)oЏL*G㔶1B)z'էA?/3|RS }O}2@T|Cq|/u|?1|/򥾶O$KiK}mߞiKiK}OL?'Ο/򥾎'w^\{5.~ 1` ˯4c:ٮLl^W毬v Wո\mvm O7 C0 ]@nn1\~LSHW2aՏ峸<4i>D|\\Gϗ8?Uu[ݽ-s^YgkC0 C0(N !`!!VY떭X兾C; 2??bI`!f(&{KnSmѣ;`$Wa׆!`!`t W/r۶mssyanpny5#OeN2Ba\ iXq hm;7P8m?VE7 C0 C+"^[lqCt_ztף2sBqSy\2'i^0JC[腿=daC0 Cp--d]<*TaXc?5_G8YL0qCgEސܼE+|(hY!`!`]dd9xCl\~lJJ4/~{~WZ^p-]!`!!CQ9(Va0ø0O6@- q\kXӉ]vբ#F zqkI1X-O)z_kXfWW^7 C0 dumeԷȸ8㳆ñ;brQ?^Σ $WUFϕ4N9ň>zzMb_I~ngNnnna GpzItZ\8ȑxlD{~`Ahz@_)xz^[ 0 Cdy,]yv{שxt<#2)qWjY]5BraWS& s/ǻ1`>DKrA(a͖-[olzǎ> >_޽ѽիu0 q˽o;vW^Qzٜ^{OAS |l*(F#?fvz FO)P1n0cum`^w«sݻue]3 C04y-_%2jwSg|擯ByJ._yeh p:Ob ̟V6m=89Oޝ2#mv555N|]鵁_^weӷOd\Ü;;ppw\OW)BznW___mn"EEhƍUZ6=SS7mqĊy^"P 28M{OVlF+vLF **mbOi C0 Ay٧Z[[F +IIM$r',@DA#c`&O5,fHlM^s)c Icq# ՛UܢݲUn1C_J;օnv7׉p(]J۷ wkl/Ҏ_^Vo!֦*\ƦSg?]}pˇACVy6Agil ՜}C0 Cx}@wD%զrq~>26hAck2qʐײ W$cG: +oŒcVɋNvz~p˄׏}w{aJJa5O1}eL my}OOy-*q`}z_F]z.e'#/]w0xMtќ!`!"5Ʀe+b\쫬#?+)F!I:_)47CŴouuor#e ad|GܝfZ~TF@I0Vx-S?W\i.j|Q^۷}Fp).ҡmO?ܯ%ܱ}.Ҡm&+6Jل#)_tKвҁ~eLMAB6 C0v%>8tRqp8>ÏSqsBͬ2-> IM MZd]N?rwߢ={tsznv{îXԃ"֐&بBY[ dHqJM2u*S86_0Oa4lkrKVWt򀾽ܰNYBQI.[|R^1g4Mi#4hXc?0Ο+}ێ]ͣAa ߔ1ܗ>6J=Kֺ65Unpnоnlݹ'斯vw?o./fS;dD06w; ~wqϞ#gj]uӨf iyS`įGJf/^!RvnZo*MžP^)C1IS2v$-b:pdv$pڍFf sxڎMǷyPI qˏzg4<"+vBßN?!`n@@KT%/ŽeM Q O||ZVBk"\~n~& IDATyCp8`7l`~aV0?7ove,-ܷlH';K%h!tv?MTPf ِP#/6.]LEh0_v}E+YeBt; &p/PF̾tG Lǁ us^`)1"DSsu`jkWw  99@6d 8i2dK|3pxdϓ1<޽{Au43 C0:#Wd8kYȧqk9˘&"+`H\+uatXe6Ep:栱na}԰ Ba]dXW}g';܍ֺ^̵`D[D{^ =0 װe7n Sl-[S喬֬k%$岩DB)셼-RZyXUi"M!k~#Fp[l{ B`"͚]BH ʥ9C0 C`! R2/!^0 7סZ3'?m57m%lr|Gfd9w2?v3ey'd>ni/8!R7LM7"hvont4Bؼū-|=9gt?#OLa^ ɚVD`R_[U@6InhCA-"4­RfWؙ=zH_w/rMz켥=/Y+E"umljv䍟M:.%d 63gwCe#c!`nC@08 3nqi#ZV}-*f gKWf1CusR 7JfL܍uw3 Eg݃It/.\x :6J5mNhnj{RMcEg>dwkXGƳ`z{>SGrW9nqq&AO#ӑ@}Fsd T0e`hpZԩnY"xw'pfsLoABg;TvEk5υt޴]| Nn#jA39ȝ8cssUy[lAq:Qqv{-F1}p69#뫪mږ2Jم!`!{%* ??%UĉS?,-lYK6Z37/]o 86#<3oE@7IIE 0C|tˎ۔=d{~GV/AgϘ^k}xh lcڀrBH ȮX_VnHre yY7ww7lP?M+%cAK7>sN*؉FsF4aeƚ,px='}ӑ,y ~ql&.mg C0 C`"Pa8[a0UG6h!% gKOb Ba~E^I 2øƶSien0Ǡ~2)#Ё}]k55wJwĔnrz'>9kLNزeۏw}T:ɣ75Yvzgssw?5k&ui!Ye-[ɍ6z`Ⅳic3+ovjSǻ))W׺Fw~C4l^yuEL7w6vіohf.uԴƤo>}6;J4g赋u #&4?^gʞavQ. C0 ]@,?UV_ʷJ#qi. uװaBb.v_t ɷ:S=+֝5VVm/_\⮸X9ruGeAT@I7 z|?Mo|B{#^~apҒP*|A, ;X_^6C&Nu[sX!&sIi|шs~o roeGl0gsY!2wXWyb(Zstw>^ sǽ)ѹqw2T@4W}tj뷹h 8]!`P 姸\i! ʑWN\>@ͬUb|_jMn|0e.2>il$XY>t};J cLt]pu)Շ'Ywr^[|J)Gnp9|ˬ%I:r ؜%9o #dz8<dCYn洔];XNl2d .6yt]?1 *R d?/UN>|{|j/Hv)3&DP3̘";\uCSNƍ؅!`!I<~*;e1Mx0 8R0.$̽n`~*y8v(ӕl 5)ۂEa5vƒ܍12[1S)BC3jB1eknk')xMzZ;uyfY4n*RG-SDTD@ccR76A)޺]" sk7ָ1A&њvB7PM/ g&o}^ 6 O"Q4 C0v'U|L'kX}p,ԥh%n*S%䠫‰ŧ<8Gx oELMݺ涻sf4 o&EgؠvkkHYYut2۫{웎[,BCa+EټխX_z<5o Aqi\>+1ӧge鰋km;Z'vg5bh+00 C~!i^)c+I@8L 6~N꣨AN =n4eNyqԋz>\#gaCKBmR8lt(ơtsn dcB$sh8,jAڭn-fL6NL4MbK3f6ri:,njL[qh/KRBNRWќ=n.uk6ֺ7F ͚NݿF zJ(~㨶ЍЇOk rtSdM" wđmLgO Dx<1̓mjϘg1ےKA#V eG_r{UAs`9C0 F@3uqxW gK/~2R +Q00< 8[wp(_#ݍ=5}2C80n'Ma&F9z˸0KaxE]%S7Xn^PEc+qbV9-dr $_۝M dFKC$bY!rcZ_4p:bWoYYPGjg.Auw>{Un9Yq;ur2ZlRaw9k^lvN?9K9cMz~a=>m԰3g=ۥNqIݟhC0 CPYI}I 'ő44ϐ4ABsB*˳+ÉR.fY!mKeiLceCŇ/ȴUGG&_E%Z֔OapT:Ѩc81( ,]l@į,_M! LՋ V@R[(x. ‹VUcN G#K0 ;{ zl0;3ePwcװc(͟SANޮLCWʹWQu[QEr?+R"ylͦL˃e䴐_?r4X(N淳-Ah&ϣ&", x-aU2>?sSƺxѹ<sicI /zg_wj&ɋNv_=~  C0 D@e%% 7u/BMS$ &r 6]kEf ~͇wzInUnҵbnd;dlhHoxhdNj wQ݉'!LR'(8 A%7eliT7rHгחwNԷ¡{j*1habp2ҭowMʦGjlr0SS'SFj/v3xp;/ȉ(hkqÔOqg N>b;n*9EEx]$2!`cUb\[ 0/7܇ϝ)H9~gyG}.rO& h . .ߤS'|^Cxs^z|Z#3F< }V½"gN4H뵂a0 ٤RfrL^n&bGu2:Uwѩs~'.>2z9*nlFd}.-~WΞx>}↿ү 0 C*0̘5iH ;csmp߹)w1C 7EYvWŃBvʚWVw!e-9@^_33 QU~-de>8okaͱLWt8sOh k"eBtfnj?{5qjKb<:t )~ !`] .;]!`!/" w9DŽ oa8_9K7 C0 C=2+;"qjY0\m,!`!`C@e3ҡ]cJ!`!`(Ú+5Ttk8KDk0 C0 }0R y-C@P|-0 C0 C '5 gNi\k!eN}r&8!`!`B@e3|\V@p.&4eD0†!`!`G!/̤~!2Zz %af$i+]Io0\s!`!`'2 0+k!/$Ba?Z᤼g!`@(#lXy2aI4HXG ht|d!!`!/ rs14s$X¤.)[!`!!~ °2y jSAJLa01*L!`!`$*7IᤸBrSC@%/T(T-!`!`:*;a% Úa wHW q\kX}Nj$s.P*.n[n:n6a1&÷' P( /sqx)7yoJ+1A'Ӌ=Mʌ'%_/^RՎ;!0njѢEo^mOҲe˪뮻.޽y}$:vA P( }Ed[5^lGC  /K_җgf#m=jw/~T_ia&S"f8ꨣ?pyOϾ=H?yM /\G&: @A Pok~)q~,=32ĉݱ)*ߏ%VKmbt-^ٺN:Vr.]xի^ꕯ|euaU0>OT?Ozu1w?G[N1 IDAT~_'UW]Ux۫g>=&/K9iO{Z\.]Z=n˂@A P(1dWLp\d)Cҫwk3gNg,Y^u2_S?{GWZzg=4:ơ{}f͚5/^)@A P(x;+E> c{lX&{*ax {7~-y=˽+^bfo=O=5qk/{˪Gw`=/5W5>x-K+V"#B@A P(?`` p(@9 ~+1dO|bwݞ{Y}C^+~{f3{yseyS"O {_߽я~zb~IҒu@A P(%ɭ>w~SzB  ), qN!nu)[ne<&RA$.駟cor8<2{&?d0^% 铇]8-j'3}s/| =aS=;pů P( uR9=o?x @|$$ R0yR/2A aY;Kf~VsNu}%E-\'ǀ&{nE.6@A P(L/d7uvl%qxO92H@ YJ+7VOpdON0g?eMU[l 7dz[R{PF{?=:|[:;03!_ r P( 醀~_~)eg%Wp=QDXC%P~)tO2yx*ounӍqr1_ KB8=tM|"G#V/}K. @A Ѓvz ENDH`Hb$GƯ I 6q'W~x.8cK1̐oW`ƴ;Vo{۪׾={ 3r8 |I'U~c_yk^S=IOrx @A PxɻF.2Txݒa"VI0p+ĭu}8⑏M9fDхmoaEsl&dɒm/}ϯXX# 3WkL_"㐉O8!o"]#_zՍ7X=A /i&(%{ q  /T( 솘d7AYSp2x+,9R:+8gX D8sϝ7>'Dp /pAZ'* ENƙb) &,q3AUُk %#Ҥ"TW( 6$Mpq}7!p%.?]{ KNpraxf:Ń{ބ?1x\t+‘ 'CX_ﮜqr]( ڏl'oȯI_/BH-w+ NͰ pIxQK[qiV_'J_a(@A P(m%! ^O$P*+ JNMK?G6|. @A`A@6x*)Gw2- q`e;?j*NN/ @A "S`5b܈ߨ Rqݩů P( @A`0]`rTT${w*lO*Q @A P(x˻G= %~L^-آr P( ZwY"qzw}\|3Zý;Wn_( @A`}ET-<4n݇xO0v@A P( k;Y\yɻĚ$xD[ / @A PELjtWpaCwIqSw_A P( ud`=n@^rQ( @A`,[2f0뮪6zi>}BI?a^U PX_R;@:ᄏZpaV}_ҙ={vu>ISxx vۭ3gn>,=E>yW{s 'Гra*+!?;YfU/=S=)O F`{ޑ'Nu!,N %xK6Ew]#UzUx:QzT5/GW|+0_"0660?#}gj{!yHu O|b>66l:H@Yݍ4N. ۪[oAĬo~W_}ulЖ[nYNaK.M%袋ۯ2K,jn7Ӏ\/~fg}E@{_ӏ~;-wðM[mUU_٦in-ޣbp~_dMz`Lo=b7n0v[c١B&+Vu uv@eEZrU=7tS]A{~xiÍ%׿aVl} cArO  Nn:QKO_|kI%IX{ ^dN?|o7Q}{ g׾kնndmFaxEŌ--'1?c=wxkų FXa"lQ'Ňv8-sR[!S0nN>0-e b뿪7 g 1FADG F<m!ʃW}ROGl㔑/ {Obv}xpYg? þ-tcV~pO<'>u] :xŌ {;vC_C̦Y(t7sjM7 ز`pa4I7fэ14t` lsu-ap1~SN: c|_ >&qD0d?Ez[O '>6F7 +" \'B=OyoYf`1r*"su:J5]$bQm ք{_U)E෿mx H0;!#!w3t,_mۧ]} K>2¬@/~񒗼$Zbw 'TlF#<2<{<,(`i7{j>φ ;ߩ> ֤g<]#/~q|yc`d}>HB`xavWo~A@gy# Y[ w 5g?Yuꩧ#C]1l`/|!`g?;:<쳫?뮻Ї>z T|ӟ~_C _IOzRЉ:f[VC=4-X ̺fy}nHc `#_RƸ~[e\lB.03|b6H']R_{}r)a #rH!O[C-7a?f@);<0|cxybƒ:ŀiy3HPQhpkv|%,{c B,Mc_(s(;0kN}0=lt,s{/;u Dـ~{|}zs:~q &??XGb%ifԘ`6?q7VMX"0n4#W2, A fY X ^,u2ҙ +13&Dc!3KB&0Skg?!ĸoKr#_`SG`;X>C ku2Ͽ뿆(~S7 ֫L15{ό1u=`'ɿ7oH1__i2QE< rn#t1D&CMZ~ i؃ǃ)ӌ5Ox`? Odd(JXZGAL"aчOi3#"ٶÒ T]}ˑ䉲#:G\. <̬2$0.P|<'Ù XgFS,w2;Y<7d狉'˰HB,1(s!R~rbRzW,3v yWHoM( "^Q )g߻cy+~ɭ81O9f#xwpݵ{§t/taB[`fس a~xկc7|Xa Ø^zi)6uZ./] {0r r?{ #8165h)^GfAq@No˔L'լsύx420D]b})B3eT[`yY]#>Yl,uE8ZK G=ޓ/if97aƲ9u]TcjV6#[>=о?!N կý{zfEC"!uLrljy):E_X+XC K4q]G,߈e?di%AD[e=h1q*W`/,Ecw<`LjWĒ>?q8!9S:Vji h{i2 FnDQ{M8?Xb2f0g}tP`()Sfiƨx`C9o6\nfbbi%wN:3;r7Ɖ7pC9 #p>þG 0ʗeSf te"a,ec%jCcܦ fYvA!/Õ a-Cl[N]X&9U/^71zL',d00B0avwf#?#0.0lF|{!ႡvyP23<3T$:=l,qB0<1+i0E?N3"Cm#'fxxcG&o@>aa!F3˂:aH3F͐lr:ʖ& :dDK̒+3Fa> GҀ  0DŽS~i liI2p JSˋ8:蠃B]1/=tNL_ xNR,E7Յ $(a&1a9mc ">I6A n h3"; \c 4-7}P״}ݻ<]gvo/~U~\"=ͰdNڥPMb7:J/@A `i@]Z =l??3 PƎbuL)?Hig:$@tM&K@A PXs>Df//=ҰRRpDU`q"yw,D@A Pq::7݌Xrv"mê_d ~EN'w2tO<[d%\~0 -a @A P{ K;e_;!8œmUgo /9ⲳSg"y{@y9r|5X,@A P( k`E>l;!N;Gؾ",gP{ 4N q8^( @A`mF=1\gCaul?{c{*WID@IFמ8R^?/ @A P(vaO89Xw]$ -NxN|pOEn{_{GVvhCPA P( ^y&y3tXUׇA&JCrGa;S^7$X\BO\JsdAnWB|\w^v{P@A P('|pCqkVpVUp#cr nETX%s)w+2qK> wrv?gØ ,T( C|55b×y dW'ݺ+Oǯ=2Δ0<w'wO' ouͱ uޗ\=>DmA P(⇾3w9M^0k`aNM)[qxh^AyAhU/;jw IDATriq6OnOAx+-$hm.V|s&7.\,4 a|Ⱦ:gXXaGaa}[]=siW: >`ǤFm^^|MJ6_.4uI[I +"9ןNe>WzH#`im8'Mӗ[a{_qf4t]ݐ'#N7nGtQS8k#npDS21uS :A;G!Ff1&E j:>^c{LX~,(~7{aDL|VX_MNqM"5m$Zj'm?Dw쇓ىb$ͨ-rXl/%f؇CC{#,-Ql+:AhK\,I{fY^0Ay7~6+2PnC{b;s Y]fr}n-1rF+۹}G# OxB<%iMoNҏ;ےp~6M Hp?xD-ܢz}>aw.~loH݀'+[Gt2Q0iuzyzKEN@Iz)P]-m39Ӽʝ⣨Wm@֋{LktL7EXMsS-q.:tMfJYF3Ϭ<.@-gO.)cA$KE>?c=M~)>nH\tʹ)ˮV|Ly}$:]Nd?$0|6 3`oqF328:3Om֎;YN-1UN;&cQVlneo;,Kc# '~d Ctt:HBXW "=0D7 ґ?d>21OZ;˶/j#!t6Ȳ@*7#$q)gtD&et~̅<2:R^*7=~4?tpsӁYe+]ё!u0b&PTWʟl' yP=DXGqU] Hwat͒cfZz(}g{va): GC:>'_]=DoQ)c8O eC:t el<uT=$]җ1S&Gp_=T_Rb~1.)g~NC5 G_}Yզz/QePel#0h_菎䯫kW?GЍ¬,1US ,{q]T=L:Jxʴo=*c/QOC5;iN̘ҿհc62D6%Mhlib/!]6wy?OqSჀ 3b (q8âS[YXA%IbNM,t):S¦Ҳ0:;Wupp>!xqCcZȰoO(N[!ṽ24;OE^rel#a$ej֥ɦ@βˢ(y7WOeۤ}Y0]#<g?@0K|VXt,gR{N~鵹avfuAU|;5yMI"ULs0zeĖCKm䖻Qd*Mb9ČI@N8}9{rHo nխY#iXX76fqob֫t ~5:buw_unJNDž+.~*uݙ򺀧~:.<|+'UO1[:ayiQ2q[ I3Mt7ی:.l[[8/Zn8G,, n!5+cglkOyO_4SLۈHJ1B:]l-=i=~]nJQmG8utYzؓ/ .&lcor =knR²S,tʧd:RxMi#.ޠ2;Kp}D:>@ïtaޮG騭goΊj愥mv8mydW_hC\a'Nl}_fxg>կ~umX%z~ l%Vɖ[*8˭S-0؂`i<[jF'#B / <|hy~<']9ȳtHtBzf,OL:1,ό܂aL ƀ 6pR:d@Еձ{W7d%l X^0Bhf<йN؆ ~ng5 [~4iE8Ƈ-HG3tH#]K?`eg6\K[eCGʄ|[S:9vGW8RG(+1tonPƦ#g8z ~ty{d6ǀȮ- 8,*c~,6egẻխl8StP7lpؤ&ʘvtTV:v!Ė}z*m*k_MaWN=dWh#fP=ʵSY6lZx-9R}=m?܀6a>'γm?q= 8Fg[#a?dpuP8lC1<Ҏ}ݧ?o0USp+aʎvC Stt6zë?j[6jYXB>vľa[vnݏ9a P A/>[VŲ.R_zӛT? >_?K>{7٩\;ՆQtbv6. mmd6b3O5ef/-ͬް3$m c}gmL´epc>i_pKTl=Y'/2OrjCT4YAW|? y*A k+[#v:? >DO:^#SȋmSY秒 FG;f0؜fy4a5:й ^_9ސ+ur<7hPR+OWRlkm)93Lsv#m9H'tnCh;FGF2-.[[[oB0)^dlgm='ȠYZ}@k/eˆK9d;4 ^5l)Rr8kP|x"|0n(q"ʭ>nHܻxL'i,~k_^CdPEzիzԿ_{`]zW5| ^>ʙjf,}ʡ63.8٧:FwOC;u[be\e6ae%}ȡ f7Lr:s:%7Y!)-O_m$aYk9'I;Aj$m%Q&9DtYɒZ8ҦnJa&XCu:;dOo=NWnk< Mz`p/Z+^ S('drͶp3c$KAgHkKXZ {GfmĜl.tROs3QQ`Ñٞ,h}o#J[i#sFNER?sFXΘUmӡ00008>9f%7UOm꠭pؓáؒ_e`{,xc|/[wNIƅ8(;)寋H⦢f=o`_cw<8r#_41 b>f#6\Ґz/W\K=^3CK8-X7]+ba5p]K)=b=2O\ixuO]<53uJopTq"8w~  @[c+}a~aR?0R(cIGtTH'P6$ «cCAxN#|!Yj#{>,:J7q҈uh>GבWHOzHG aR:jVcΆٶ21zx?ב ґX8:>zH/a O1:qbf22lrMٴJG?:u ?T=LƧbS:J3yc̽*#_KKu#}O_= ut$GcwAA.Ͱ2ͥM?1yBzN)Q):Prh6Bڹe:&O ף(\,%(H[/rۈ562942^LجnNEMtmEsVآYI]('uq엽D8yw}=[W|K RH?)'ag}%bIΛ ~7:,ЀչGFF̹Oh4-쑯N@XazQRK7: YM\:RtT8qK8'sF8? 71M 7L[Z^} IDAT)J_:2+YJsS gy =-?c\\f,efIJq9~H dpitcGy#ﱎ26lh=8v1eԗt)O^GOt꘨OJ3: mĶi)eN*S.Y…2n+#ѧC`).A{lKz1q( !Ľ?s"I8^7mXǔn-h鯰=g|Dy|0?눛SqNG_OM:HWq>$/@:=^7LUƤ#=/i/:zt@W]|xGx^aU8JeA=>T=L46"1>^'j#|㚯(ݔ!Cv"?qd!8.G[뾮JG!ߖbk#!tS>tTz†k}p'^GQý|jV~c}xFr x\6¢)~>tT|}/%G%K&q@ΤDOl$Z{%Ȑq։q{HAi Sd;/"#gc|{3JqÖy 9rZfzF93L9`ԖffB&{6twg jXΏLFjUb?2IO:xwO0!92pVXeD\G(DYC8m`9DOo3o'3H=r(`Q7ף(,iXt82*<{XϡGF2:+8wn36ҖOs?'o]Ӻ26X5fwww'GarɁ{w<ƻ^vaf+ ~I'&%W?/„π8x㍡LbW۾5D'}Vz #MF-[eK;:Ȑ̔7SJGqŗ<'H،+OtT.Gtӵt C'#g8zqي'Ͽ/ct:}')/㦮ȒSr7uJXGפ^GKn1qKpeL)(8KCG1F;O:Ctщz(]W<~uz ʄk/ۗ]\:qmk_:u,=0u0#eukVT Ku._eu Y`{WXT)Q)Sp@'pzhH )sA]=TY /qdQyu1[B:!2|_CsMUsHW^u,Y?~"Fo>Ȥ,sΩ,XPqZ q,"3p~?c=A{T$Y) ˮ=]0⋫燯0b ~T,0u?jHN^=,96c\zIAщ:><{o"/])?!@fuԵѵu]8H68 Wx8~ex'._anɃ, ^G3OG:(~]8˒O;p1g[a'cu&S^!X::x% .]b>$21hǗ⒧k~jҳ_Xi^8L1QS9P:H Nݑӊu5"|}> Oȟk".t-Mt r^KJo I'8}&yuJk__8v9w!nRrjA?wovY^w}k7=aBM6̦`]z饍g% Du4auOşG>R}3(gQ _ac^W$æN3P d|j6Ͳ%ǜBAyؼ0JVi\,WȔ\m~ê1\9_WI`]¥]TmL{@!Fi?mQ9Kdmvکmo`5Yj EH0K@^y"*: mieʌ{ sN/A=f4_fYord -0>HMs=.z[US/޿w=Y_գ$>7,(fKHeǻc>a]1>OV_җWաkBcg`(2Zx?%)<1%0{*  c缎0k߾%'F1Htr`B|o2%lQXґrttrPƝzʘ!c0H8,}c;Xa=얱zuLצ<3=oʁplP)PnV|=F֨2Iv0i+OlbMa(c6KҰvLlA(05VrҴMm/eZhv_b׹Vۙg{l( I&Yφ}hzj7tgW7+fؽo{؋׾V~髃c[cXr!}h0xȍV鷱^s, GyXδ1In{77AK>3m_  x YHRg[gδȐ:i'[Ξe@㔼8݂\3fY_^FPN:o8ϖD -Xޢ#a38]?e x=73,74,)'1jǗݳ:O ܶo@Κg[.4Cp?ξn BVSFpXXLeU]m.ui[nfWx;Svw¡zSt¼u^W{ê;.#~L;`[fvo `:g#LGSC`LnY:.*fZ࡟A,c6F'm3gYhCkLM\,CLeϬv:A탲E MF1 3e~ϰn#>.oq mI si?^F]m:`gx`ثϑGYcN%W@%~R\H[ O^ׄ2K: Ͻl޿%a^"vpTmĬc[r+۲̸ E9[h9) ,WZ\@s{_p4ՍseaE%Nd9v6oK\,I{f4g'/r6ru8gL(z:-txPYhrd:`2om,:F!LC2_1]T>N6AǶWn2neml$3v& ³2IyZ` 8}{P`PfVo~3f.{]uQČ>v!p3 c06HJ!F uR'3f39l9 1AŒ%O=3o.^"V(fr&n2}9Dnе\kK<9FG5fKb94Q)m4>7lr+~2Cr\/p7mFk80'򑣎J:2-нc43A!i4NdzIW:bu/yt~'x|過<,*a:*)ұ?u֑ε^Gu(Cz+'%/?H>||u<2FtTz nCeL9K_+v{K<TƃtT:N&$WUU2^d:SAǺz1e>KJG_U*cV/CzAm$#bai=?Peڴ ~i T=T9}=TmFVĀǵé!^Myx^\S$2:ƺy.3M #j#]v-:@Mu80?4IgXF 38ډXy  #h#tMPx`1/§8#P_0BT8{ ٖ-'. t e|YǺ]LX;_nFlBݤgNA Pe[W\qGo{n]}q>y  ~T~@xǦs!_׸@)`w^)Zۻzֳmú@7ITI7[Rl,\C*94 =iŴ vҒC^FMdQ0 cL,FCvF_F9|.N%{m)8 cR~̓?+wQ ; v]b?~g/JeTƨ:cI>)iKZFlxmFo9嘶2`>-bDݖ˳Kp0CC99( $ԍDߖ%i, Z[n_߰O67C fΡYu`0 y_[b[K9DK[Ea>#(?u}xw&k|p%`2Z~9q ##M/P%`_(-Gޠn`kĻEuCr#E%]Ã~t$NG2qatCɓ?8ve%ޫ4L}I'E> iD'?at^v 3 ڗ҄7^ɁC^~% mDK* O[:꾮qsJWmD{C )uȞYԮ%{G}tS,?t:UrQR<%`#dKm ﷀe@!w+n3?w}*|4}k;Q)#v;1&Tß6\syW}|f]c,68?k]aoK::#0di:6/L}#O/y|t {:2˄ѝ4N'<>D`r|!=䓾눛 8p ~Qi GYy ?IGKk[Ceu YN0YZ-R\: wԗSm=LN|g"d )u2mEC=Xm IDATʿ_=B?V/?_ '.-jZZۛ;m]!uLz3e GL)[TKGR9q1֪?\amj۶4ny" 灺@;Z:o=KKlU3ʚ|y]JG%ƵtLC5&MŖ yuTzHܸ?(]u#p^]=ecKwwOvL6@pת@ 裏@o~s6Eؗ@jccbC2!d`ȍO{m+Ftx9En|tAfDߓNIύK6B)ymgf2 q7i^!sthZ̜Il:-_/\\}|3i>fQ~M ˾ VmdS1cҨ4ozSxSW4Oo(k1-#x Ϝ=99DCK 0iKeC F[1K'<3y9F»23ȬPYͨ`LX9weZ%?k"&_mdZ6CˑѦsY<' :_d";w'm'UU{~Le^sկ~5L^I hGHr=6[#7k K6W + ,sfzf^6H.}!]gJܽ`U^Nu"KbsbD;ͩz|mdޕC-LI;A~'6<6Rq&:ĊoW(l{U,{MyCm*&@g7mu:wTI̻k+׳Q'\wBܻ>{M86lַ:>r '4ֆa߀ʙ;+*Fp9̂@9&%f7la.ioSܙ3f#x'bΗ@(G.)ܯNsf3 WfX (ʔ>ZzEY3[kž3f̴~{q st.9DyCn#>]>/{%.NI+.Xgss3x]+?]hh#6֤LS:"ǺyL,?WWnePx:z}i} 1_^&M:5Dl>գ앞|4WM> fy=  !w{2Q^`?wؓw9٪SIqIFNdbrbJ`F=gg8N̂ouo)sx^Ht|M~-v?pJOqi=#iQ\<?gC:}VM#f2KqL'^GaKXF!Ce/cҌuc6p =S`dRã_=uD'Ҧ,ikCzOXўڊE|a8ts xaN˼ʻS_#)cd8zCUy!+IF8ayuI7F~zx\D;73~O** _Px,TQyjRc>oMT˔@(u_y_Qw  6k}=?ӿ+;)͐۫[o^y ɗkMzͻ}p X [}@ܺ4|_w?ü?'N>`,1ocy tꩧV|p)`*y͡l@i\:2Ϩ7xu3mv"rABaaN83Ԗx80SrHEKMulDpmdՇ6Bd-4[#xИ- Lr3dz[;wkL3p=GrH3Xn'8vΛsG(~>#o'yЃ  u}ކZ]|L+"/%D r+7ȏf~t>ȼ&)c=Fu:/ԧ>y{[F uq?Ιl;}sړ+FfhG޻6q3fb^\՝k*[:ño.^!,->eChX,+\z1K< G$ 6Nھ7ЖrH8͜3WBFf:$2:sz鶴3;{lcXjF z6E]3RPW0R'=-KGX@ ;xÊ`ZNÊvZR6]~7.ҹ{X& o[Ze;]aMVs(wMwپbfaSYi|۰̙El>>ܞ9V7tm'2E--_hKh#﨤^8(S=ʡޕFJSF\F8<1c({m!gZP7YAy nvSt9wgu]coUYdS;#?:#+&8pVϻu?Ώ8?S\ܻVBޭ1 IU{rתih@AAG=?{qC"3"*"BM@ 4 FK{UV.7nys}o{yfev&FԨ%'Nq9Ӏ/=3wa@o{$Kq1g>c'V܆x9sf ?'99EsB7z҅XAX'iF(3.G~CGΖBNl0[l3ޑƿ<%`FY"b) ׉8WP.ʅzbF0.hyدl!Vg}vW^2Y^YEMǑ(zTH_6 ocC;]=B[{_'C.|mc}?xZt9 C3+!-1) :1H?`&`v{]=h##GW) |>i|ES ©JEvσq^Q}V>^.aYl0о75d\ .Ҧm6_-6.>sc?,D }i8Qi:_ծ%eSVcBE-хӲFߧc!?Cy0g(Os=0 0(Lwis߆<+3B0HzBu6|aY,(Y8MC=B&U<4SGH27_#dLIxPW1G?bK(y""ȋw<8|FatZp)^1N1y*"Cۄ4gb&^v.πGO ۨ860R^(IOCGy;<}6 i| M8Ξ?BEa6X޹/DN/08xD۸H,aɣCE7L"8@Q|)<ø9: 0iʌ¸ .J^Ӧb!:CDޜ&DNkr!YC^ B?3һȄ౧?~+_*`Z M׫o}k{g5iXv,?$\(޿{^cY ;nn]ZS.f.k h qO_k_7zaM U밧Bb!z Tⓥ%~'OlTWbgkmS`O* xdTXcqVTvHTIS2l-hS&3 xdJyl a ]t&e6"Tiu9t}҄}s2k^'Ȍi$zp/G&ğq׋^{҄>cc??G+ uײc̯&`H`#Oe?w>;=~~*dY hHI`ֳ s5}ƻVC(ؼfŴb=tA0YzCZpP@4lr*-;G^ 1m:Y4Dn!h^4ZOO#Ɍ}}̞Z.呠i]'hS Zq2OM\;<迓ft y&~OEq)Ư<26eae{zb+jWV5-3XF̅Y E1SF<}f/r Ed xs4>S }E>={&^{@O4zF}~M5yFp- 2e {z \6~h??ᯗ0?z^!z[qh1ɇsՇc:VEײz sN._f^MQg %tGçiGF7,$;V5}zzOW*;>Q>k WBg** 0]>x\/`[mjxXM ]. x 9] $ h_͐~1 Kg؎+u)lQ*z\v@gg͔,$fYw%i ~2yEvy]h)su:I0j<ӢI=y sb%<ؿ؟ce6h UwO#|=3`X .baa *#Qa Znu]e ]Mۦt紖+TB)c~%et%EL!{#LъB bgSQ(w`P^xɟ4 .WL`9 xϞ=? /V!=>Nz '8Ϗyupda#Sџ'wL1e)bv#"?ABNÑnh7eGrIZn3˱At/+Izy'׾'96]uzXM=4dX|"_.'vȠ7GI~&q[B? K] ef֠Q$-Gٴ6/X2!jxm~̈Mѐ_6}1<'4hߖ b:cNX˅w'UG}ٹ> 0MT;PWO㱌&]}nU~{UB8.\ \ߍUk^b~Yr\#Jg3~?X(O*{^Vtʨy(ߐ7wBҡ|O4:ZʙMπv2i#:FT| tLB卍0-˳r0aё:̶NX|)q a#ipf)Ji' 1z{#c0:l̺W:a6v\bxR6)Oމ]<ԅz_YL) 0=ٓI6kkCۥn7gcj<#ff lNkبҸL(4 ?{Nk3,?{Gz9m xtuۇO`ê_Ɔ9 JۈqX0# ȳ\cw_:l- #t>bo}g\ui'|.{Tz_GR,ir\861%'-M#);J<d剉7k_^]v\˹A8?샟_%tJL޳ J +:Eb\0B/ #f^1g$}kI.C=5=kG~7 ZK]$akF;&eщ>w\m0>#;v:#3j$Q묵`x6:yH|ڴ)yW8RozL`mLw.} X&Q1G'xP2w[vh&):?74ôpM,9״-K秭_Poh~#dVPW{u߹LytOnp~$fמ +Ki(3@}N_p6Iw'x~,RNʫ"+iU9`:jL,GDc<|0W6ȤW3-#3`}!k1z c%E7vSsE6UӔ(a#F`bIBv<]f#kxɏMjc^1p0 ?#1q"u0plk ҧH!Rwo'`rC龪֒ )^5ZUxBuP@dy% (+|x.cTEMI P6Mj_9ꜣ(:kJxjSԠŕ*_C֗ cG[=D) T*ߤT=seV5+=xSZg"ᬢ*+6#a1Q*l v kHM"m}E"UKH6fD!MOBGd>.u\B3hJZ \)}`]#.a;\ǤڬCJBmcGV$!ۏFiaX`0+\FwJZj|9vZbOպ_з|ߋGRx5 _`-I+,u7 _תsc$xBR4oIKsEKSEHo:]TwVq:hu$Oѣ#?Nwc=P.OTֹ,TNPPG"O. =p]ԯ<18?=OY > }!0(oS^x{ϫҵ` =!_.P]2Ò`E9:Sc {Y`N~ q`R2B 7(O/6co2i{g+mHvS7sEzVyLHC; f]P;mEe&U6^mOp:$iqR|JRQݝD qԠ]2 KEÌ-:P@_"zֶ*&y4-f>\Gp6Ku,`ü27 KZіJ`T*p>oh>'!9kD$ᦔm`,#7`~oꢉNG3OR2ҕ1fLE:oU(ptgk/zoſϋ%ɡĕaVK)ayqz ^}xKEôx=hR1_mEZ.XOeµ1̹s3o /Y[)y9{p5thZ}iPf-ND5K>ᴶ9m ,_1%[Lȩ΃%ĸW Ҁ=Wh2\ixX^BÕ=m-G7<3:n3;CfC8K߳/bJE y^0 IH#/SSxIOmWbZ`zYܧr%H*NUV-8kBܴ`FƱ\ߟҀ,lPZ¢<,{9Qv<'O -yG&%װeJx&%;rZ\rjheHKC&^s8ڀoi-QDaT~'D80]P:ړ>o-V3OF^T۴Ʋ]? -Ej2B#AgN;GcL[^mG[HLXBK8PNrA[+e3{H4@;=N/Xr u]HԝI F%q'v/N#XǫKVd A-b@cjN =tO kΌ|AB>[Zgs&ϘXٳ'e()|B%r/ZJ/*y 3qG~ "f>[md ̨1P]Mڈ8*R4ZG[lbNy2۴i*R.d˖-/zvͭXJx!Q}.[hWaޱCi hԩh|XKЭlc p7uۼyI`vMBh<`u6R}.H4.a(v)+4Ao7- akZ/0ؑȥ"᳋AD+CT >22 |ާ4JvDeG0 ܎Ted˿h9Вɦǣ]CSb>ѥҩ~վ_Y#\Ë)`,,E+pᤈx2^(feID`(QÇ-7={޽{ٳ>/&r88zۿ)Toxbȏp텇e@,2?f֏S@O Ve/Œ9d=˘- 1d;` Qo1@ƎΣ){t=%K!o49 -x-mf{M[#ɾIuw>gg:aԠ(q^i᳻_eS:оhZ/煋o|.d'G >KJ'ʐaCp vk\Aie|/[9+ VfHMYQOs6 9 ն .5+Xg}bSv|p.vvj<^;:ugVLXM|Ȏ 'ln4է|V?9`%!K[?GC/NL[Hec2 8T/^P̌)o4ro]B>>{.gNz9@rAGikI|:GrSYkld2 #t?C=8彪ph~7&5vg`VN+b5`﷌^31Hm!2ܣ@00P$:?c +ڸ $ޔqXAОzdBN4rZn+P%~ 'A9d#qUxi`Tǎ\yKB4ݪ{L4q+*75$S _CY'rR:mDzWI94MQNtH[ЏR}O;:8'\l0vj|B_6i}{ۂ`>_4824NJp$Vu58_z|tm ka1o& jۘb kH۸gں[c{tvuv6!YgU硈m2=ѧ Mdžud>}V}.q)JC_X~7tSCĔMR#. /8͗Ϣi4\<4jCL: unce, vcaߦٔ4hF\QZl[b,`#"Q5m 3t{~#,?A{u5$%{lyex̏=VݕWrS (ˉF46-Kq uT=V55 M6 ۠6Z$Y( oF^5oMW7mIڮyìmLemY;-{:øbmhwԎn6ط5obmUF/>iS0F`ܪ6/'Fnؤ:YBF i{@'YiFKbmKƝG]2N7ӲYb_ռц;t{ [wm - %-̗YEF`n&DHÅXyu)29H{WߴNhjގ ۱Mӥ-o+!GRUA&5~ޫFZi*֛nĸնvcօG1Fag砕43UM(z/fXt ET^%Wȱ'rBeDB@}gɆe|K[ X6I4-85u-۳L'/ 6,IFjˎW.scV%ݰT%u$Uu8}IS򯖃K%?>={Gg@fV!&oR^Vj=gR3c;S 3ha/.!6*?hD[lJN7IR|Jc]'JqzXErTWH DDAQ o-vQvm7ҾQk+JhbEU"K:MXOnf6`vm}czd'Ok9XThzD ߙm6^Ti[kpT}âIKI^w\7m IDATQm) 4{vjҩ1ڄYtT:C mݺYxHy)ZZ+ dR+:mzSbKGʩl2l yԢF "cJo4 џl E-s= k>ſi߸yn4v A,㘿m:S ,A#ԂF% r{/as6-r֠L<5YO%?by33xqئaW);]ru?wIS,)'S^_ꒃcoj[ -'^8a0c?:t0e:n,`E{COn{>i!{lz%`!x+S NYÐ]( A1OwO u2XZ6CC ^:r? .sJfU&ℴSzRQEzXZ{0)zP,< "`}}kB˨ٶwiU3Vr^ipM’1U:~ZsaE -rRt*ːpʒfBN'g$-CKX+@} ` fOH;-g&OƞsRYSmE C'/xX<{RM<75P,Cci e7ܼ-%ayw\߃ū:Pڮj {`˄jC&E `f=U>{pH|#shцO40pD:+,6ԟŃ'ccj+.UEZZ?%mj_?~5b&{Y)wai\uvzyˆ?xnLJPCŽĈUjDxyhj2fͽEY K"31Hj26oӪe@In5!(ةSgӿ9-iO_D:6fTt=.ށʠ``*VG׶Z`ʱN)[loԾkyH#C"m dPԏ^' K"Ot_ Ѳp0Qo ;!YlKU>^:#>/0XDxJnFu0ӕc{)~ƴUl_m^:gDzBB!i)6;,tރCu:wӥ@,K FBE~.k.0G ;xL#/9czm"2x1EQL}-GsP]yONWf1@ erV6}jGL^<9z>hw/xoIؖg:1YfuI+ri;-Q=@/ ఃݮFL8@%|Mp~?/[,Aޘ}7W,`v ?&xO | ƥ]{:c )&Ҵۨ>KWG=<=`F.u d RH q$ >lВ{z>]eףlM-ᷠИI \ɖ KLSz-YrǤW~]vc-4?RB~A~O\{9!x= ~_o=U_G?Q{[b_ׂ}>e ;O'qIO6' aFؕ CGAe ӪCJ``M_wJ1vtt0-0Unfa^퐖惁"4z:z.a0PΪT"UPI+HG\` qm.l x~p:oa~@JHiB'/-՝gl3>s`P.!8:C`2c=Rgi46 {Q xW1GBYa&{ܕI|OvC, ԁ,)lF K;Ϡő65-|1+@ ߮^g$0TˎJ%We4~&hRcV%ѳR 'Mc\!%\7,ˮ"eg$ FB99="ٖ8q5 I0B,tE.fqo2KBᨁm&B]a'y޴;Ax9u\)K]mb4hF~EgJvJMxGFrYZ ST,mNP@l"&Bz16B{7uS>/{xXq3q6gK9ԿP@ x^Fd!7 Y3WW* *15q_4 ߫>)ۂ(`kkA]c۷o_ܿ*L&q=ݳx0{sFbW tx(0&Q2l;Lcȥ|F 5.] ^0/`36_ >iSwo~`j=|Pu9c6z%|ɤ>#.й]Y}"NmAۃOJ`q< Sp6Hø> T =?u`p^jl 0 oA ƔG@ܸ@kr9XI?҆sZvM&x BR~5rHO@ ڦGqÿޢxklMap9,  8g) /J@H:u*׆^s8 vId? b*ocm7?1+C:k׷mB:ީMc,Oɮz^#~~KBwAA]2Av_km&"&~O~,>)>X]@B@ ,.Om4} 0AwIi{I27Op8xLзcj&7AŇ:HȖH.k׉PJ ov/:i:=͉-D/f*ʃ/3Llx˘q;^<4~?HY_אQm\sEυc?4u 6yPp.? 푋 O4kO}1iS "/͔kk ?]~ /oߵm˂ p{ fى<,M}[>yR]\.Sg},CmϊjO3OH9nOK3%fpP'kYWfg[݀<|?oטG9G؂l2mO+ ЌY6C6f rܦOg׸mk?}v-%Om! 1S)\ŵc:zǟC~~6MŞyV5&lw!g)}ՀvZ.*^{M'yyZ=psJ7/;}.|~y+lIk8wJltqv/3%Y.ri8<źp<4~Zɸ }s*R NT#-%Ϋ:NٍѬzF0I |O:k~Xkɧ,%okNٴKgB[:,/,]&1ס_5cMޫL2zjlQ91*]%mXlL޶׶'d''CH%hP5 'D +Nm{>lOiS򞽺[S[t^rN8km|ΝV-{tԘ)xI8m:F0) '6oן;x#!:丸quǭTZﯺx2ڈxVk=o)t8z_2E״=ik=WTw{Ep%N1ho<|Ȏ֎ǂҦ9KNy[״  zN{QNKX*1tc m s6S3O[J,yL/T3'\^-~.sZ}:l9յ҉ /I?{JiƓ:p/Qt]g3B O?%y;L/$uǞJytI+W[_#-X6jݲ'ijcJW};w.I^ۥ78$p Kw, _?cpd nozӛkAuvJ=j2i!۫=$p=ʥ4lߴ0n@*ydRc٧ilvFQV"6Y?_god#vl]%5F͍v`{6`V 6ZYg}oxqݗ.2,ys]z:YSL1G 0a[xNaC 6ط%njۥTקd|ɾgnje5V+Qp7(JpNgmZlm٦،=YfWs^ RճAބU!&cϕ5ُxߪne_\ǏYpy羝vK4n xG6;Xbq]$;ڷ43?,*;U`eG -uR;k.VK뮿nܹbك Iv&{}[e(ZFZz&{pDKR򄛕wjLx譑y$uWm y-NifyCh}R]> /xs5'5:͛n{ѳmV;X, ꫮc:Qk6Xu*{gj‰eyTޡ^i?}lJpT믲SZ~b}zݽIÂԁ=e4▛G)ֆtDی6Y둌նmCq|lZ2 zB1ڼ9,lnXc^O^۵x,ݰo]iӲl8 5hRKOt\-jٹ%--Qj;Kjm]N`=,׋zG=Ih\o+su֧~+ڪ[T~6*\URxdcN-URYo겓G~ꕲ'Q?g뛬~櫬MEJ%pMG!%j˓UPB2 lޭO>Jw^r~{VO+ƚ*;p`뾲odF'y%6%紎K73>9+R?Tz?Mo߷]s?xiCpݱ[t=cdVk+^rv4WU=/vc^7_,J7UlvЌM?lh1ĹAkxs"(>g-[P^&gc \dO;PzGⱋhڴ5=5&GdwEVXTqtj IDATɁ Oi K6i="xR9}^N/N-5GN36.k{%%=`*oQ 8K,#XGfMߪ?WͶ}Y~nQR& Z.hp:%rO{p!3oK3 V=%ff o_6DcGo}wٙ/+mmߢ0"KOiKg.iB}p;{>MݮY÷No<Zd\cj@nJϾ[|7w`gL}ĥok$Pp9,etuHK-y\ψVh06'?>iZ@&EvU7عωn%XpڡBav1ܶAHZ +IxvdjOUkYmO3Ք`>@\`老Ԍrz|O/~٘k\@^l+G){9Ó_nP%yo%;po׿!=!ܠw燓)yNI+Dg9%N_UrO!Hf$08V'A^Q3yA\A P]U|Ӊ I1h{:H~l3OC`s"0s).Ŭ8$SB[#e!FpOB(27oX"`O33FSOBw|SV) Yfokn֒D#=.ڭncw yU:+ ^ 'M&cvG }z5/W)t}vApkuN{aς+/b(.[0#Ok9:acSW4G`-:hl: Wz38 ,hҴ-`e4hkR4zg2 U}#v|Ƈ힏}>? GZþvZix$ҖwgoF`p OgǕ׵ĮKxe2;9;-Xbφbǩkmmanz g GuQ_%aIo.#vǚv>o=6:Ϫgw8e/]ͻҟÏ}w?* DEeVPwz@{ӶqV۲[j1)`C{ 8+ OɁl< |D={!{ r 7$|9*Ϩ1i DIP~󩴝v+I78M<)Yhci-goܿ~NZecFt;`|6DROi;_lR|I[Y_{6j;^r Nk[&i.D\1|Zp#,ANy(olpwڝuu c7z?lX6r{烠Mp|L2GR&4# ảVirsSAV[B޻]#vۇml.xnv̴ʛWyw.;v%H]\.fKodT4uL yʏ"3Q&ڳZZjitٌp&Zj'&jрmS2 f|pD(~\@# 2ZM/(h}47?|x:ƽ_{O/FdRT 9d4"(^i3`gǥn┉6 -lf7a苚Xӳ Ol ]n۳O3ܬJylA.esR{Ϩl 4+e*p4)>gx:B', Zh5k_/Unyq妝 vEwH߱OJXa֌=Cqt:H}Xm8:贇ol>`ͅS=;k=gnd6 !BPowРMd{N$q~_]b]f/5t َ8;#CZ<7i=3uN:=h G68IʣH˜^,lOi2k.w A1hf21 <}Kdžz*]xVddϧ5檴Җ+!uΙ٪0@s}YZJRl?\=6VѩZP{ '+%d_SB vN`9i6-fl;zƴ]FtT"kF6'O[V-^%|57黨ml_1{ GZlweZ [љ懶?;LFk侀W_MlWO~&Zќݭ 4F+-AJ+s/_QV!AF|QY ؁jS~6q^RBEqp|75mW[7ij7qF{^jCGAk?5`[B k$TMBP[gmѵ L mB2+K?$J]֫XR@~sV5MJ0b_E-"iwn֩#6Uͅg5ٓmݪMoܢdF鲟y2IBʨ|^{Iyk_wDĉ;_/K7G:-C:k_ֲ6VedplL ~DmX^Q*z9fdpj{g=cm=c8] W*BޏIHzھ)؅kـ6'ﳟLk4c쑉L :u"Ru2/v/{Z&dض%8Uw'%WUS}-{HRI*ӕAc.ȳ^DljgWhɺIKAkX~ľt; (%.*e滴[襥L^գ:<g}\ ƫ%VUX֣O\Ӯ(dD`赆|y+_~rYrǫIl \ϽObǐ'}Ζ3[):]`*6ftr|rҊ%x^Ҭ@p*Ulc:gJ\r鈤 ٨dFf1MWWY;'VUSkqj.5xUǞ=oǴU)k߰yUZi݄&jjiF疪4=O9=`_i) Вgcfܮ,;3Ulumb'JC!W[vn϶YEMSu=2ܣ:$Vھ:k/[ 6Qǻ_3㌜4mYQBzĂXez^E' ;uĆYkg/(=i8sTf`q!/pTR\ylk{Ow?횢̂PdpTK |ߪ %e~Q^[,,Fm٘Ԅ<ܒeV:'9&g 3: -]+4N`Țt~i$ΖWƩQe;c_؝[m`3rJ 2 LܔmҠQogGlڙl<+6HmN{c#V]mX43:%C#}ٝ{4=]LG:MwWxny}e`F:C֬:mXIٲ'v9k;™!kܨAWˋs:nRXfJ'k8lry3 kM7m&]̌m,OW i>vMvp{jۆ߿Wp6c&>"T9TK>*Cv )c썷aS6#[Ж 4Zv,Rk/bm dIM˜OG:c:=DICO] %38w5ȿ]rIZy A}DcM\]l7Km6&maғv^(Q 5Dg7o6T@JDgb瓶GxݱͶ.?jfgu $ۖz ʹcÔPP"cV!/r;8?VJseY,YeR#.!`Z L:16IBH&i4t0GXlٖ%[V:vW0?m^jw>yJFfJ~+ {͞#0o?> 2 \Ÿ5qkz,3i|xx;&/ى#VE[FСV<k[X *7^N #3979EÛGl禃V]re%MJ Dp1 3B/06b M=]g; šbn5t8ؖUX:IJ8x=MǎsS|tVO~ꔽ0` &S-2P [Y:aeעunlen쳂1ӂ8ԁnua}18U1gUtlmeZŸb1f͎O [ i6Xڏ#;OXdɴ,`UuY(B& .0oJL/?~=sj}4sP-MJ?҉ Dl6 K۱n;Mzǽq9 vȅg=|w]ջf(L^gGz~׹=;Mh!?k47aic1">%%h_^X0"8OKYeR?Њ"n0X6ŇW7fGl,t$bIi6W)vry]RҩوWaIKmsN*I7kaSi@*0 +G4,Xdaبa&gѬ9 !yeɏ`} L4#87 &bj@hGЭÙ嵝EI\H>ZtF1ʐĔH=q :)@hZ ,C:܇|Ц0 /ylljDMSBIU3՘CZ#ՂɲubLbK]F_IS|1Ft#Y!-)!ܗED2v~,(̰SpR8 sL0Lsab_ڼ7f05(e fQ29y4eT¶+G|]=6نWYK8+gЃX,avCh:w:i#Rε!.6d3M1(#!3V-C8]2lg*->_NAO:ְMxSVlj;"k,5J?|Du,`9"j 6܏CKLDjPw0^MXhڬ FWRS? PWm0@?y;XeKqĔvF kؼ wjEy~kDؾ|JbZ6MOiFq `1glaA>somMWڵ,^Ktw&r,ߝԫXˋp) s ΢R#8(v}g36KMC:Bhad5H6K-ĉ+jn9F;|Ò諣9s wQQ-N;c`il9s0LsJ}~A}e\EJL& l#] ՜}!6ݵcϷPoc.!*X#6rJb]%EYօ0s%&ȟh/ ۞{iQ B֝M~!NJao5F(c iVK,Á*ԇ-v6!rz7w+ } Polp&u/B=f;}\tilZ=okn OBfM'1,4sG!/sZ ݎs0kZ̺yգoy OζLtsoƒ3(t*f;ƒEK7ak^dm"E^Z4lXE4=vY<L/qE:,3?,"I&]̍#q ڡ-vCjoY ##AJ-o WJaYV9߅8 ދv4oxN>{aă:p7Rc~~g}?9~߈ !4F=h `#zb(`$F3ȬC!WÄacgsr]חIOZ0CZ!&xak&TV:@!xәEw3ytZ R؁bb'}Ĭ(ҙ)fFb@C0:4Tى`͵}!S$f-U2sfND@is{s@:K wҪhW!`ƴIlPv8}8 FDʗO?w=VjL,ZHF b%nV<s1$ m=V 3ЄL۲ }hlr7_5c!3&,Hs*Ħ!8ys y>͘z(w?$*Ml}.lV1&h7;=0!ɰu {YR{=9uyuvS?;\NrKgvMEZQg1v+9i8-D^,:ԁ\jAFܾA4 '; 16yg=ɸkElaV;*آBzގ<Zղy?'jp6s.}U3gz`$-k'vxv1/TSi*O ѦL|x=+ϝp dBڙϳui9Vʤ#vMzh3 6y%lB rW-?k/>BgNaL aeGXcH`G8nŜ}}7O?gRL8e`((u0)lmU=2('0q.˰ü,O{u K(qZm*"+ZP8dޥ VVѾ Pl{j{ IDATէ6N҅￙.A?ٿ 5@S8Ay̦)u Cm;x8XK&j(cƙ=(O/!leWS_"7h!߲SôK,B,SG>d x:߹܎~am0a?q:ۻqR襅Q`(2u]@(1 $OZ QO}(ls͢ `D r \^ 4[7Wqx#23Q4zchr`hTK01cC8),(y1.,@e,(g`O((=gS8 do I(X"kPg:gp'X?r}{ m]Et[BheŨ6y%j>#7 DZ`pDx UX:[-W[cV[tcXն皭Ų}-0Ն;t/yW Siq(0h!`3JVttsa!Ux;40Mh0_{C?.u7\@t44lW>NVK-L_Z!@im%"}f1ӫyX䎽;~{%'T$+ D[.SkIgIڌtjc~Ph.ߕknt# z$X%c(h\[|6_H:<bxo,JW_gSTV>ҚРfǦaO3q<6Dq3y~0 wZ1BW<>hSLx"uʼߩylPz*:KrȠN/f:>T#by/]Ɲ~P*1E=xz:X֫g~Wbou_ܶm=SN[f˴a.ξ>ygo׀:{ 4ėC&]le5nNlrYdjN\Օp *&>X]snI^$jG&hӸg=G' v76S8wC)@@tC5q iFЎ%pd;v|Q.~mfa֣!~e T!\q̾1uNZ fSSf]s=&ATCCP62Z 74wcn ;VưZny1XdIQiׄɯ0T,.wGL-vؿ9`ea,}VK~'qh`RQ籐c DŽ [G 1vqQ~۟0%M7`d\T#uikfbسxjE/;Y: +1X^!1>ppgrm)I8:B W07~ڒ#dŽ.$fyR`UϢiYyda-_RnU<m-@-,lǑtt7db>:!n_=K S*ZŤacY^ãO1ύ@5P)'_շx]10ˣ I9</YԂGKFɱ?M`'@m.be誯,@cCZLs:lLN II%1T$@@;`tnfc ='dYAě'̥70>@3 mO?Q۬ VK4qt<# f#:S1?[Ea_XF ;6 K6 Gou/A0̦d4 '2qĒ鷊۔v]Ê: \Y*o~$4ԡR*vZϢ͢ܭe>I|.7U'Km/^NKݳiiƗoR [t#<ܾؠRDzfL>-CVR=կaPN; kgLJnӝ k:RS;@= S`y|Ui0Dk8nV?7330eK*Cd'$Kbh{fGz#f SepswڶM" :4جV^IJ`U㈤ޫg*pC{U~QyyWV_~ ]+٦IENDB`pnp4nagios-0.6.16/share/pnp/documents/_media/mobile-home.png0000664000000000000000000043065411662503006022422 0ustar rootrootPNG  IHDR IDATx]`\I'f1aah4ih4ajvĘ8fٲ̬޽;I-0ا}3\w}SRrp)ҷ_q8r0C@@|9P|xCCMȕfq2v!}fw%-͖@ Gd8C$0(PDFklhZ: hj&ٳ{!Lܗep` -kj qڃ<֬O>P~q~!7|kKIZ{7嗟t Ay땗eʕ%idrgI9ոj&MKWsWt1-qkP&N&[aјN!9aIjkk=äS /ԴfqP^V*_}(3ny_YD}s,Z&QxozIhLĄIHTG8$($H8ڒ* 囟WɨQrۅe}y믾,ouU -j\&Li'`rnzp}}dddCGv>D>zQ4hJ<;Vnfٲe@ֿ_#{'vbQfڴisNYAۭwߖ}'(`lT|+R3DJESt$1 cocKuw0%|^:~U":0:5v -5q5\.^$;. 2aҡ} ^YilfJ9;p#HLB̚5 Ugj=`ՊizټyAe2VAv6|x׮UFl V&"sJ'I#Ih :*~ I2{pĄoPﬡVʫm 2(1L)MjyyQlp]]DHh\EKњ,U 7#ڣ.ŋ}o(JhX|}ZOSo#t/<.ԩ&J}ճN6:S׀0 Lc`F`2L,K.}_ ߙCv_ֿ܉N9DÚg0\5hOLR+$k׺N=]+u}A>Uـ[oMkI\]Cw׆:) 2$!ϟ-=\fIT%wTAbCCepp=(B)c@W0zZ4döb!a,cfv'ωä^M0ͱp]#o䢟#?A@C0lo$BKG/#v=Pmٴȫ,7BO&:O`x_t0 57=)*g,Y(342s94c ո{IC\ b=87 v r!aBzai[o(.22'΢t@T6KyS ~]3/5@t-ҥ?+ccՂo>>@ MtR7.Q:z~ZE+\M7$'OVy6H7^{E~E{9Wܢb\}.D_`ՠ+npq) F}E}N_=v'Ǐ/:Ju9somA7z'5)w-rh`y|5W_,XS%U ۲k%+I jY;\H%R2)&J޿4V.To+ xN%:{mYFQ̓U4|-RVYWnY#~]ML>ӝw0^wfd_=wݩܽqC}.{!o w -uPG-%5@.8wRJX\\?Qc?(]|vzlpKF%'BWoڌ \o 9uTOУ;Aܹ*qkN u0 eYEZ{v6וHQ}6Cp!N|nFugt[M 3h]=P#3@Rmըo?xmJߏ=F< Ww̐0a:C55.۶lT)Nn+7:|w|GzXRuz +J}0?=L9|i8sdOT6W[/JBI ^γ'"sp9Urз,Wm% laFI4qDAG.a$۽&l 45H\ԗHFn\x4%R1PMF1JmvjRTm`?~G]ϩ=s 77M Fcvtz.33S?v?!h~FXdN9Q1 $czC{" (.|G8_C?u@H&6*GjSLתa!.I{+MV{-p=`a#4H:l `x xz] T*0u O0^L(Ji:|*~' ɽtYg)\H i7C?{_O?\hq^t}/2Ҽs/X}OJQ?!O=&RxG `'pǀAXmޚ.jKz#O>y4+J ]eGɫ"cXRBP !J@JE⏣q7^tF} d-޺ꚰgaK5:Oݡk]y`܎TBÙg-jU;LCƎ+7008(P_Ͼ{-X@ Z;c YEP=eO/)` TqrPv_g;H&pтSNmF2jҲ\!`ȏpNO ѽ[^}Ԯqp„ W*.+ 48-).R=#ʤ$jV>_[nBp6*dPW)@faMvHS&p26hE{o+uK)ڦM3(t]!F6?d*nOGgtMɴWYg])y1|*V}zWq+QGHo;ӊюʆ3]O|CKNAPD6.‡`Ij2o0}<ɞzQ.d5yh}a!t~o Ie[B(D7bUVׯH^*kÛedٕNUXՃht#ѱp('>' _"XW7oS޾I=ݷ^ mT8o =_DKlN7Aߩ;$!v~aF[EqCY=7_(vq\3P0U#$n<,1WBB 2zTZatﺻfͺ-Jc(%wutBr+=d/q2=KU+U> S8Ar@ER*aXY5UehTDV:@,_j=B2YPUJDzJhm6٫8#4g5CEtO?xOνRBH?#X.gJ;q]|1tBd.͞ 22JbEiSMڮ5_D_]=JE#<)Hb-]Nh GAzN7ngҭ`7G7p}z|_~y,V#Sd[FO+O eSF%,EOJij RiU 2_h c? Хʯ,LC 6L,˗U˗{O>C oJnL<#oS IDAT1̛uXȭ!GCz  [ڞ\cQp|j/jn#u!H4N3fL+2xk/Øw,\U?d ?¹۔ "f F] dU8!uï:6tsthggeB?nvyݪN{<0wuwaÆLJOz>L 7Zfd*_ɳJH놕ւr]rrђ+yúPrH8)Dظau 8phKxLM7Y૎R6BXp{_些nXH+O7%\G< 2mҧw{`|_p$-ο@3`eqF8xkLy$p&LӧKZ hϼspBQ` 2e|٧pM;|A*~,h*O p B{"KqdT{{%ǘ8 8ͯaJ0N-=4G'._: ;"cֲɴ`EPy#4=|ŷVY]+~%M}VO-n`:iDn^.By7­P4H oӟ=B\NH:yl *TGN_@]P<^"C6ʖ>ͤ.{ɻ?Ro.:_4a! 0}4=G_[ )'Z}{U-B=7_(ߔO \LIhI`}WT-< :ow˗sW;$#+M.w>tZ ƟYg 0w6F%)dO1[(WھJ\d wGE8|պ}MF+2WĞzitM#1+:f5[2 .nbr3u6_Nӣ͙l )Yp2䢞jN")dYS'Swu4TGy493z)o~8Η)TG<OcdoUsiX55^+EQW?{d7aQB<8 5p(:tRL&'a1(_C4ׯ+vB!UK^y+:wv+w X)%'3h0l,W=W=05P?.}ŬRpWN$z`B HSU6_vl]w6^nSQDvb昧|?~bMz._r):5$~s{Dؑoa/>/,]iQCbfھ+& nb&Ha͕F&뷦o Oγ2eVx"P1'n2űȀH܉(ܜ{wBCE Ղc>ZpƼk 4իs?u^PkJILpû$r =yڑ?|EpF!v(JЁm~8t&M1?;4S U$Il޽%ErRcIS@ 1큦\9y~t],@e--PC5[3;̅] `TQ/Aj(`(*DE?hbPPPPPP(+`u75       t> 475       t) إ7       t> 475       t).K0        t.j%PPPPPPPk)Ȏ׵        :A{ZPPPPPPPP+)>eBWo60000000d  `'Tg(`(`(`(`(`(`(0n`       :F7       t5߀PPPPPPP)`$LpS@WSFo(`(`(`(`(`(`(`(Й0ΤPPPPPPP`$CCCCCCCC΢vM=>" ((RPR$yE[X URQU- N#!a.) /%A 1U      &dWnnfn(@9Yyզ'!FH4qyu@c/o(`(`(`(`()5TVoY+ dIHH8I0)$8H%0 t<FQj ؒj/*b O1`B{>2rpȵ;pm Ib(`(`(`(`(Б.kVHVUMpptKz#=R%5ی!f#A{]Y[/%U+;Wvdl Sw[1Fb"ګ=*'Zd="d(`(`(`(`(ol%ʚuˤ RPOz&FKbT&) !yooL.2u 孁 PGA(AnilAydɶd֍RSS#֎6^& / 0 `WPi(`(`(`(`( WȼK%77S1}AJX0~!Fd*j?J 6!2D#H((ٴqoV~JJw9|Dt3:vM=6 dUȜsR"""e ;-E&ET/)^Yy5[FsP_bTƄA*hYl XTVVHxx:٩ qoMe9廅sv` ,D'L"zJZlLm6V)%O#nEHlTDŧJyy϶] Nkl^_hFnSN oQ@Ϟ >FG5J:چLdC ፖ@ouesv1fKΑ Woe(`(`(`(p0S|-bF+#{+毴N6d dݳp!@+a  2:    v KRdQʏʪ%`'A~tٜ[*#% %Ⱦ@༼lGN2ín]M%bR#GSV'- GW:qPGؔo(v XKAbw^ZʣéWC۝<󞔣wi/JYas ADQ7p w}o*8OK \kyp ΥuKHx$HD\Nqqƻy)>1rxYGWuQP96.wJN8]9rՃ9 @M",L^50m 'uz]itՍ'7O^'^l{^_6` G{W 繣*:V>ܧwZqW_V)%ۤ+VjDvxWaO}o7E:}w~}Va9iC   t 8ÓuM5jp_& '`+1;S2PJeR(%4$"QSgKVW[&  PT0M-☆f@/0#,'Vnā3ɆezbrS `<2:,fwڭ.jZ P8·@pi|Rsrv|au/q/o;E~ԎsmTeR]V$E$OvUJan:#YٻTٚ[wFT5e tiURR Yđ v+,22BSGfPC=Ҳ2/Jl5|ᒔ(qq8n*= #qihhPss󤬬\1Obb+fLGyETUN2%Ey}\BSMmIYy,#.6V1;l]DTaS\\!x z ݺA!A_f Јo }loESWn·U84aL2,>gZ܊&`9b_;8lڼNw&Oꐆ;000 X]Y%Rd֔JL@DQH&h%dHk Z9A%AF^)"%qÁN $ITAcDq,Z]4/(ӘhIx0a,j%q!sL i1dJ9UG(R̩dL;!ȾWpφ08 `# dФ$]Fz 0S-QR[~k`[z970JH?MC}iLOrt3UB2Js[zXAPs$  b_Cʜ񹶶EMVK p Lۖ43;CK bK{Ҕg(R@>}dޞ/81xm* XgL%pYm}.Q4PBUl ges e[+|V#מ1C^jQ_ FƺuTz*ϖ[5sם czQnIځ2=u,!"w6Kk崾)Rd 崔iZ9awftw\yD~Vez}_ }@:h;s2 \ћ`=Hm&0Nw0,gZng~+Ti=,Jyczv4x*q:8ʱpA <(Ȳ䀹@ IDAT sKۛ+}gj)Y^#lF`(oPl èUTR5 UQ? &I%[sB o|YR+[:+5NJwZRr+<9Ћ|pڶSݖnJpk+OYi>Vɜ%o]JF'2iH&R1nPr>\7rISSqG<[C糥G[l޲9df8#[/QF9Bm7L? rK_AWMv. g)$d&J[/B1t&N$q\ݹnœxK-+J]RzƝ6{s|&႓'u3-4; F]L4a?J-5#%!(dhőGF\YcRFw=QJ$xCzXhSR ^t˅2_{Jua_0j?aW)PP~>X/|9c,NpL7F f X}JΝ=|ISDR@n#WA[—q܎:`,(2uro^n\biVDIeDk"**/oY< 7M?U!m7' 2>4p+QqĎq&,4XN1ZfO.?l/Sz5NhXkpEҿT{9@35AoaV=9U*L gQQLGxU?5k0޿ُ%`GלybTxJ|\s2m@/T)%GT[ AuՕpRdE39j?[2.ekqn TRHjD9GݼK=#RysFP8I2%F}""$?r̢!+dHȚjH`IPP0""R1ld+++TM+Q7iE`VUy߯.YYzn3&/ԇZ=! 'b=,NFIL ط*Ps `´ߎȨpvb1*4ft-ìJ;X3]qIƶ"A x.|H:(7$^e<_2rqEpJ|KƷ$F>RJ!U։#*]5 Yӈgċ'v)Q`u.xCA%$sA&79]b $l,_6*w^$~f) l׉FH7]OwȢuR^U+)`r'.ѐ"R@Hu5a'9%9X{xDqGMHW`wdMزDynZ'[5WVnd[V-i2JqK6UMd4ʼ~¨7xks%%ɽScǍܺ^G~rP1&ԓS:-C2JZŁz慴rzɕw? 55i Uu @7|=0%pPpY7xƦ:Hi\U$Fy3a$1&UkieܺK|sم-QgAAH;~#"c-@^j,ۜ)w^x5@g߯$?02grrRSZQ%,X)?fY'cXY/#2u[Ϛ-aAh9NO_dc NKY量+}\ٳ+{Ve(`(/$Z%fOAkVa9t[,OW *eQDo8na\ Ò{۹zKDnq^%;MI5Ar֤bT2v^ ܼf0+G-޶2i;oT9{?*L,Wy$3$R \>[&2}Ma0Ҹؑҿ{+n݀$ti`ra:,Ee;m)3#ddTWU3k@+l)>~٘]7:"Ug-<֕,$8flβ #\nU1ּoqjG4d4y-/uaQjI&U*w7 ]brCf8@C{O^{:v b Ŝ>r|rǫ˷簥˭`°~9wt3٭FJ1쁷tq34p2n`/b۟9R.;vb5bvuKTGޔrrn'δ\ 7n8wwgn~v5yVÖKġb&+rk$9c&/XY55`eKiA$^{kpaElUj{ٔpqeNCz?[F~H1n|JN*/ߐ!Y9ci'jR\@7~1,, /3qR}BW9{CLJ`;P30BgpWa=^y0?)`J4pBm/m3j g.u p %2o.TCzq,O>\;%Kpj :eV(%=^cΑ[Q޴۲fFذ^Lr;pҧ[]f\qUh4#˱UkؑW*2ŷH:lj%ŷ~yQ+8ʧ|3hҙZhp!).J^˅ɯv/8o+k̨Hx0p)Cw庰~=;5pek&ww>%kmt h] x0x3EܶU-N`>-GNQΘ_.5U>Bz g?Yv%G zܬϙ>PΙ9BG1Ȃ?E?= ޞ NӆX7ӖbbY0:1 Ph5IYk;=Ze<.S ckvQX[-wo|wrUjP74VYͶ} /}lؚa uQV؁vdb$TR';ۻvBEѐv8v<-@Z7.@ܾ03ԋc3 H.᫐R0N<3RA!8nQ2uHuO) R[N^tUzGą,`Rc_3}4%:^-_B&RI-ƭݼ:6#^vr_q묟U|Q Gy`]T=9}WQ[ Ob*̩ o]/CCWJ7qHN }2r3Zz, #~XԧKmx g-GQy*m[z|W wʉ"p,@)F=xǘgCC.V `5tM)-Vo!S\)wuVS|8\{wΐyK7tP ėhq/3`]&+QI5I |;j׿["Ŋ{6]5S_^,vOMfRr =nll~@F[mۙS(IIIJS3FN63K)r5 %uÊ.X,r1DaJ̄QMiG"O%7dc6NT"{ڦ1}yKu;i@= GO'W2V9d4Hv)f_}¬S'ӆH+?~RϨo>g{׻@=M0 90ޱ%֫cUCŁ`X z|l24*a! 'dC֞CC JْS S(HU&'v2RݯQ(B%EK0C8x|k+׫vv]㼯,@Qo>E?b+OS/b%tN v:bI`mMɌo7W0`sc[}jN1aeLf*$>%@[94g})vZZDAJB fV v|5ܻX~(wO`=~!2uT_0]4}(` `._{á#Y[\3 X%\ y>5|Y?X?>!T{lHH73IS0x돧x1 )#Xm`Th'|2TGpH Bw X+l 1?xIToSbeSNwv|ǛPCCp|0#3\o:/, ){R'{n2YTV?qo/B!eJˇO1/ʄIΔ = J*G:QtT y[z[ HGm'V ܴ `8 '(1#S̅_՛35 T({N6YHX&|{}tLC BΌVx}V6O]FCp5PncxGP <( C8M00nO =7L+`;;SՁc; ܗߎP) e~\)- 7IIHvw,eߚ+yeJdky%KDU N6RYVBZ٤=7峝(fCWg[p6{[0@u\_O ^GW(FQ$~dDVAljrp g r°:: mԉ+$$&KtMẊR,2"+w tq+WZyt׳*]NW%BiTY>2̧U= RaWAGDbtɔö-HV8w劁ebVzKu'@sKhXRUqt-{i" 6pK _b{ch300 p"mp+]O*vaNY1gut@71,uȻ Ֆsuv6bwmIzZ2Ɇd #5+'?}fUJ>$0}@ۣ2jPt=d1v3AhlS dܡr6c~ƻQ${'GgL٘k0Nyk:Pk `hHW @_JZb㒠AbW+LIu[h9 m>z #wМDҽ8NRTض5cP&a!.WJ&cݎ7͞ pGz1o ńʆЗ@?87wO;g(`( x0N}YJLL>dbFP/P]Yfd$ ƗimU`h rv$bv _397g#nfM&?)l>)q8Qg=q£:(A2'L ,bc=ʸdƝS 7=oJprr>|'BZF2W5W{$mvX'H)!']|>=BHJ8zL^+Q7!?I0?_Wa> ^xa*F;X7GYxUC:??q́#;6gi*͌Qi ֶ3gJ6d0m.]AADHc8x WGôăp%'ʙwwZP@8Z|Z2T_ mľۋ` t$81s+%?8HQo׶*Ro`d87%h2—6AһyV^4+ۣv=Hֽ9^8LeسD0n !L5&\a4)δ9d Ld^[6+]0Mcc?og{2'-5~ fU1(S&vU6%|᫔?5~I /qR\>ۣ,۳s'VJ6l8Hu +sra ׍igu8p .mlGi?U 72Cӄ?9C.8PXJף_j*=˱H 8"{U-zU @C.vUnӦQQwHo!BC' _,݂NtȞ_)$/7Xgh`@>dh !P poPa}WRZ+;8p.NXQžqўbQѸ0b0+-uK=ϣ_}dRQEQY2t\+)pq8 pdw{1u;oVV,4Н3(MY Y\]v:=A%$WP1 "#WZfKۊ!s5̀Ze2ߦY-,ZMsUK]6qcBC%5dBG9,Zlb13oLdiJ$׮-2Rcѿ"5]%p$'ץأwJVm rpc3Fiz|Q)PPPZN/8-1: IijNS^8Yn.?+I*EkjFF nB*k@Kuyd<`Sfy'ikLWs`n箷ȶpPj39 |$'ǎncNkw̙a[ E0n8yCCƈiy st=UYH?O ܧWN{b>C}} w=7}>Jg ه;1 _aŪ{bclp+և3yfw֭]y{]!]z6yJ &7\1< 1cYg` 2x-~4o^2> z٪5axqثG~擾35g=- _qc6c3?8 x{g{v+ª83󀈤3ai{̰MtFqcxp`?kV<~_ ܪ::΀3 ( wx xFhٽ}x=ܾx]熨p'CO<&ܞ ?C=]$C@( E ;I''rjxܱגnw/͞ -{a)D_/87Ńr  `IGwg@x w7ě)ev}f9:L[XnmwM[qᩧoșYZ|`}yaY_oVǻg3O<&q#L;v8Wy 8΀3 l#zeѶC9r>n pCac+WyKի 1W)91mܱXCvc|8΀3 8@;15~aN`pо|+O\~_g6OM=&~ _:3 8΀30 ?zK+ :h5>h881X!\s!~ <{}|neLjfشec۴X0ϱ+?zOpg ܿiK+7_l S's UkLJ^|a[OG'/#;΀3 8c%cO |Z<@~bx]c~ ;3 8΀3üÑ'O>[lg|M}0k/_xLؘO `9 ΀3 8@gܐySȏ?w1&{=>űc@"pgp0-aޒSqz5?~\ 3N^Vɻ>N}Rgn1cc2Td{gpg .ćE_tEǍӧNA5%U떇_6a>6~Cqoơk@(?|gpw ̚Ryk~VFc;)N 'M w.{pXzCwͺUWohwJl<}wС eugpg`׸3c"u~yӍ᾵ w7 Ley]v q-<{z3|ٴyc@acxN8p(uK^`/?R?hqpg&gAHܻp0)#fN~Gֽcs/wMl#_݂?F3 8΀30 !#@s9uRuN)^3L+׬ KW^ ?gFTʝN8!~WLJ{OfMo-oZ?w%%6~.i 8΀3 7&acq]&q߯Ԏ2#]V^_4 Hz7gpga0eä sq;@l85|q7!ѻM>=~.>Uۜgpg`+oz Aڰu5g![?n΀3 8΀3 8uه3 8΀3 8aw 8΀3 8@7~ 8΀3 8΀30p]gpgp]@? gpgK n^gpg @? gpgc 1vgpgx=΂3 8΀3 8b7۷ 8΀3 8a…L)L$׵ GS\IT5^O4^sMO犯v_)^.^\^woj|:W|k_׮MrOSQ*? Κ?ʷځm(Ss7֧Ԏ>(Ss7֧Ԏ>(Ss7֧Ԏ>(Ss7֧Ԏ>(Ss7֧Ԏ>(Ss7֧Ԏ>(Ss7֧Ԏ>(SDy hfnsC=}Sj||eur]NC%{J=~xS{ >QL]cr#xͧv_?W{ kes2LJJz}`X/@5!)sW#/F]2hz ծgP1_\+HO66石31묅>V^ֿnuJ[=\?U]巾SRk73/%rZ^#?kS9vZ.ʕZ )du{ MmAĪjX`-0[]ܷj= x͗#`-[]u]냽>kx͗#`-[]u]냽>kx͗#`-[]u]냽>kx͗#`-[]u]냽>kx͗#`-[]u]냽>kx͗#`-[]u]냽>kx͗#`-[]u]냽>kx͗#`-[]u]냽>kx͗#c`P6P.^?g[_/石~ƯWƯu?umum캟sUsvOyur9{uuP DÇAza4?c*Tm KꟳksE <+֧v(5^svtκ(guԮ!ƫήY%Zu?Ģx5_9_SX9k:g]k}jR?g|M笋xVW|ObQj욯uQꊯ]C,JW]5.JY]>~EꟳksE <+֧v(5^svWe^ h4vxM㹯|MW7i6֟k=v}m|?7zԿ4_Zni\Q|mk֣mק1yH*ΚnHcsx5Λ+_k슧sWG9i\ծQƫήx:ox:W|~Ԯꟳ+Λ+_k슧sWG9i\ծQƫήx:ox:W|~Ԯꟳ+Λ+_k슧sw]P ~r.pp/~~r.pp/~~r짫Uh {(lMo?{앣iM{67=Ѵj [{hZ^ iMbr4i|چִ8!1^ %X8Eiumi1VmikzYcuۚN:6괷-m V/c}N[i1VXeyok:6޶5X,:mVXvcuۖ>VncN{`<5[vcumio[^XfncN:mK[Xlumi1VmikzYcuۚN:6괷-QCg.PP0!yIoos߿ǍBZv6V}Kgs_vV}Kgs_vV}Kgs_vV}Kgs_vV}Kgs_vV}Kgs_vV}Kgs_vV}Kgs_vV}Kgs_vV=%G|pgpg.JvV;Wݳ롌^ogիPFݳGUnlz(wG*{z=mlѴ#?8-pgpy~leeMm7eŴ:*կa·5Xz氺 vn1^g}^tzS\[LӮX]ښV.|[۪Gql`exeMm7eŴ:*կa·5Xz氺 vn1^g}^_eVa}gpg؎Nr0{b,Չe׬NPK[[Ű:ijik`V']:C-m VlijkV}ꃭbXxv5X}uX ϮYau5>`a1N:,Չg׬NPK[[Ű:ijikuc uC tc㯮y]楬x:˼]k\A9{._~S{=i|=W_Ξ4>Ԟ/gooj՗77ssMsMr\9\}9{.~S{=i| ?d;D :裶*sBb4Ӝ\O犟GssW\O犟GssW\O犟GssW\O犟GssW\O犟GssW\O犟GssW\O犟GssW\O犟GssW\O犟GssWguJPή|uW?7oO5_n͛xW~ūs4^խ_kܼi>|uW?7oO5_n͛xW~ūs4^խ_kـ IDATܼJpcJBd.^튡6ʺ9|؉ ]x+cmusk=5rjW,(a'6tzkծXQ֍Nl芯ū]4kÇ_OWbi>FY7>;+^#v|n|vbCW|>F.^튥Xe>ĆZ|z\K6ʺ9|؉ ]x+cm9t`JOW51lJORj<)!5-[lꔌ!{峱+|\T*0:Xf#e7)ac[lZcĵ2㌒:%)H_H0:%c^l,$})5)J=68ŦN0?z{>0<0(JIWͯjGQK_Rs6qZ(NxZ(s/sX9 ]sM8g-\T~Ԯꟳ`P]0G _OEQ;JBQ;J2WSu?PFJkKz kX)˃*OLJPVclJ2cתX)ЉCYO18֖ҫX)k ġvNJkKUY,uPVS ;'*,uʺZq()Rz|:ex8UΉCim)J>En@*xaġ^%ŢNY7^k e<ŰsPZ[JbQ5 b9q(-WgS֍SBjTZ 1RĮ"6.G>GR5>gգ*x x:ax)_sv͟WcmRGR5>gգ*x x:ax)_sv͟WcmRGR5>gգ*x x:ax)_sv͟WcmRGR5>gգ*x x:ax)_sv͟WcmRGR5>gգ*x x 8e(r ^w7Gsn^w?usծjo&\[׿N-U|էW=W/_?_튯\}ꟛk~]\~+snrusծjէW=W/_?@sv xO*uHέ,͏\}j7˧x7e:$VG>BxW<?}Es+E#WMhi+MYş>ɹŢO&Ps4^O`QbէvZ|}SVCrneh~S -\>W)X!9X4?r݄j.ƫqߔU,ꐜ[Y,nB 5O_o*uHέ,͏\}j7˧x7e ~立_׿~տԝ;_]uW_wuu?uWů;wuW ~Wش* 5svՆ^7_]1+^y|u\|ήxMur95W_t^7_]/+^y|u\|ήxMur95W_t^7_]/+^88/Stb?ʤauk>sX:%갥:}|g\1V:׬ztiuRX|g\1V:׬ztiuRX|g\1V:׬ztiuRX|g\1V:׬ztiuRX|g\1V:׬ztiuRX|g\1V:׬ztiuRX|g\1V:׬ztiuRX|g\1V:׬ztiuRX|g\1V:׬ztiuR>]g "-"4TkMyw}7cO~8,myL7~߿ ?V]%ÀmmMVŰ:9i1^gsX_mՏs[iV='-l뺍qnk:ŴzYa2]1VW?mMVbXV/9^6ǹ[ Ӟeq6uX]85YvausbZ,z&n1N{NZLV/ucudu-iIi8enc~ۚNŰ:9i1^gsX_mՏs[iV=%zEPCkAu5u7ݯƷ.^]u7ݯƷ.^]u7ݯƷ.^]u7ݯƷ.^]u7/QpljqQ/pǿ<=o j?0VVnluڛJ[՛2bZ{z.d9?i\vV5Y).-iIgmMVVnluڛJ[՛2bZ{z.d9?i\vV5Y).-iIgmMVVnluڛJ[՛2ȥ3 8΀3 8a&SvJmljѣgv`ljѣgv`ljѣgv`ljѣgv`ljѣvgWمIOϲpzYνRr{ߏ{,7:Jn;( 8΀3 8@QKt{>@6q %"fUǾ잩M}qEݏ]XDr-7W8% sԇ ,\s1u$cN]oxSm^vm fOubڮm:{o7=Չi޶e0m6`T'zi39%'fv,c !5dw3yYA);7aZ ]繍 5b/:Gm/go/g̙_f-Á_>53Z+}8jn3gn9{ ָq:'c?{ڹn%]gsso JtAm6^Um^c3~/C6Ha@mIڜ\cZ  Z&\??lΡ31VBɃw\KM[UHZ#iZ*HZ#iZ*HZ#iZ*HZCW>VB !%@JfavY2xİEP{%M'$^Ǐ/|^\>wgpg q;Mߖ-[:lC9ֆyYK1Jq\~a+@&s(sjGbQ :k֬)@֔)Sɓĉf|.gpg سlڴ)lذWV^0@2a„p} >`o]N ?Qnu[qXyA4@ҹ@Ub@$cxެY;Dٜ;΀3 8΀30@?bŊtN#{˗  {0q:E>\+2?k=&5[ RG f]v V*6fΜ!b 8΀3 8Hd=Ŝ>u԰qSN4z;SQ6m`ǽ)<'M!|:0'> ~ Ü#_;zpgp>;wnq6 a>lx)%AڸzYE;q(S=d e kabJAJ4SgpgpFC-@™k'ס=TX%&8:@i}!NJA~˳{gO"Ƈ3 8΀3 848aC +:lF?JQL|l3/M6~tPsqpgp@8up+nleވ$eӗU^:&`*İXE{_W0?gpg`{c@=9ыQZk\LG k 4eOY,nG}}8΀3 8΀32^A8 aþ =`c)S]0 ֈQ`/hæy +O*9΀3 8΀30@F_ξiW|X>X ֨'g'e<7 ۡpgpg`{f=ϢE:_o˦'ƴbEiQ*hԙ!-8bR/;}nܰ3 8΀3 8y`Q0,=$b kYY<։I&,"rX,vRpgpg`L0z"#g 2Emel& pO팱1$7H ?pgp€}a'L!UU l0*6VAGCk3 8΀3 8 =#H MV?WQ"\@$K%3$^l>QҎ97΀3 8΀30`^ m쓪a{8hV>ԋѐq:Ӯ1\:6`n7Epgpg`DY Rj `#&&:2괫$GKgpgp2=9Q;ֹ`V 67` D\:$q x>wgpg`{g@&KŃŀ~)AvH`_Übc_iw 8΀3 8΀30Ѓ^Ls/c,խoq pNgjg,խ_Yqpgp€F0~Vמ 6810t((:,.\:΀3 8΀30V`dϵ~Bqs+ak0Yk\W1pgpgh{~ ]7ұJ׭w3 8΀3 8c6m쟚p@ J`Y3X 8΀3 8΀30 hf9uFWk>΀3 8΀3 81VLaon`0gpg D9{5k… Ò%KªUڵkÖ-[Mw'MMf͚w0eʔU;ۉ2 v£opgpZd!uuqosOAd <|0gΜbGfϞ\\l8=Z $Pg={pgp늳}vҥn!xY26eѸ^dG [}45;΀3 8a[Z)_q#'pB?~|d ;[lgRV?k΀3 8΀3 Ta@7+2{Uk\lY8ĉks c`˥Lm| 5gpgp]r%}i ॗ^6l9 h{-mdygpBW ƍiCv)qǰc|U7o<5~|ée;X2}Kw;z{P0.Ne 8΀3 f7qc02uYٹM">՛rLi?4 Ͷvʓ{z/Wc;o~㬧?%^ۙ|-ߛ?uaΥWXSڅ e8q„p8Uw%3 8΀3;kx 4qwep57T>8 O>b D''k26~| F `*)cTP+~xM2OUXn}kPBU| 6q19۶C? z>';<3 8@ n[o$3ghq6urx.NN LrЗzm6H3 eʟq#]I̍6=&} \~pu5w_κ'pg`hXp&s9'C̄֩ip9ܴŶ̯0~)Fg LY\cQ?/+csxN+M` &!6ڇ*O 8d=\N:)k3!֐{ܹâw懮/D`Gfֿ t$%)Nu}9?qr}Êxgpg7tSQ6x& J`PD 6WYc26zV?0[RitS)ݮ<K\J$;iwtY{0,ηC>cF]>Ջº;V9*6ϋMO9. 8΀30 ,ZrVW_}uSˆH^7h?_|op?{"J~'S_U;|05!SqP7~ۤI>:ʼۋV]dނEpW6KyoNVZ>-m|}#_{cbC<ſ{Wgaeuۦqy|[' |>?P΀3 8âx㍥8g{5 `strv7093:ZI/;l^5xg'S|)O<1|˺lSe4mUfʍ}ݛo\ ;~}Twng_/|뷉3~Gq㊏4h;.W'>΀3 8Cʕ+ +kxM u&4e^웸U)CW?{ʿ5@EA^H?A?V"׬]) KyVy)W'd3r6>}޹gC:0,g~|,nǗpO ӧn.g,Aܻ'mw@][cco(y1GmPs>iOhpMf}@sufx_q%k">~f'ߩgpe`]œp&;cR.E3xX9s>\\ۿ]\*i{*D-XcM闪ڠwlH 0x 1,v #e\! ̮'{lQ g혷pQuN%ktܜm>@cO=ﵯ|YזP^|-uCcjv䵯M*|fLxgdIpFxs.?.?iOr`Ogpd Ds>?.s~*ڒlOeu8>V]%j@@ :ӏPpoǮO<]ߋ{Jt| 8΀3w7΍*l\> ~J`3M5E\L &L ׂvI]DŽ `M~gi;qw8g?3k^@#v|!5p|Z\Cǁkp+ӦVeo:裏 >Vs~׿ xa/yQ1ᱏ>xMgpae4w7jװ#BṊav̹i1 CQ40*-lh9ׇZ^kR;р&[\35\xxʨ*>Ur O׿׆wlx^W\TkcD77xa ~ţeK_ GqX8x1>>=x}eGn΀3 8-X|y^@wil{B1PӁzUF6EdXn,(՟X\Tp:gMcmJ;>Dj#}e]%NXi[zs?.wN9{Q&s͊a֮S_Y{AsQ^ >^s vD<"n=kV̇>7c^hG{ګv9΀300k֬VC`@j?aᓺSO=5a4exe{ K}?$`vrc9#nqH/p)1ke1ñ |/~pj|VHmp9wx=_tԅWx͙{W7śp~?N_h+?߾8-d+ȇr Mxcݾ7v6g#[G ΀3 8C#=CouA;-u_6g/=Wk/%]kmQҮAg iuFc|K?m\Pkٱ,~>я˅ہkx5ciNŝ6\A>9qu{l3{ٕ]vģbN8.*^x_7| _.>r9zhqpc`ʔ)a̙3u^;'șx } >/,r!L>kه3 81GY#_. La 5X~ y 2F_U q]gS( -p-v?ϺJkӴr<k6oRgܿu~ム 'L fGzHWe9_7,E>gp>8p ʳ~_g qr:~Te%OY[51Կw@nIpHoYگbp5]E1/hX HW&|5ΈL}^ ]sxџGK<3{}c̿S&GM4N;{_o,؇‘zuߺN9pxfC;\qgN8pUWm_x ~gm%Y|e|/luH3!zU{ !z5'?'G7{5rcۧE86h|7cf_g*Zy[!GT}uҾ~Æd~7G'}pg`g}aV^o/>W*g[+^">y~8㩧<g3~+E4$%/Xg-αeWUyj˟X|<1>gpa3q{g^ ?׿ϟizW0lȅomiK")S5"Wz8Jֽ]wadtC~qf:$wyI~M8{ $ڬ>)*>6o8Kx+o w_P|ȝk8rp| XC ^&qx )9cFq~2,֎ck}êxǦMkgor/{qǏf ӧMpg`xc|.쥗^V%7[Bs ~3&LPZ7cP> A}[4U+&9x4?4xGJ}!q\:eAˇ?,Ʊ6TOKZ>ĠĚ5&XbS~ 8΀30 DlYTUɌxxFߛ?[o^ouۧqvu5tS nz[~ȍXe\yTg8u_k Vr㰬F}pg`h^z;3ï~NV5D \jZ]gCN@R\SԜ@Z=;\kks9;VR`q/}8pY'_wgh>O x`/#a|{LJ}ݷ{̜vA|H{n}8#)l\8΀3 8΀3*7 Q=~v;wn[yK2 |`&΀3 8΀3 8oG%;΀3 8΀3ЄS ^pgpg? Usxw %^IRLJ5gpgp [=}) `f* 5gpgp: D`X_A@܆jYH 8΀3 8hgKV/VcEX)n(a>X;0|8΀3 8΀3 V#ߏi=H9CJOY2;QV$}]:΀3 8΀332_(cuWϢn},.k]H` :}s\wgpg`,2^8i>ʔ?ֺ @:ATG}N6nȮ 8΀3 8XdLV'蓓Gxن%CZ6 F 8΀3 8f@%5~cW `Skj}pgpg7(AgHڊXP-@mvƸ 8΀3 8XcɃ[}9m hT@뗲8J3 8΀3 8c6i?)чu=e֟kQ;΀3 8΀30`E/p6H]\,GGb_Mh{٬0}8΀3 8΀30V`zXkڟ)lk}DH%:֗pgpg`2)%Ik kv{~ &V͇3 8΀3 8cHV;lF,8IJ6i iT_sgpg`,2`{$V/hbuT,Hi΀3 8΀3 FWQ@%|ɭkҀ1Lj׬NKgpgpnlduz5ӮPo;H,bN#ucAN [J)-΀3 8΀3 8 W*러qs+i@ !BJS:lvV 8΀3 8΀3`{$fuUZ[kN!9Rzj$ ܥ3 8΀3 8V;Q5Qw}CV~7q)-΀3 8΀3 EkAZ\o:'W&3t1!}(S.gpg ǢLq>Vט*[M @pJJP":pgpz,E~̮G6 j13 8΀3 8a/x\luOл>C2OH"pgpg`2)%AIk~ kv>fcF z*!ci 8΀3 8XgrU$@dn QZםgpgp`qut3pn%{3JI@:`1s-@ 1ԭ 8΀3 8΀eOgk֬ . K, V k׮ [l) wi0iҤ0mڴ0k֬)StU8ؗljO>[?=A9@[t J3 8΀3 8e hsa;7|s{J{x aaΜ9EJ4Gyd={vab-E6%)kA}cTu5jd1, X>`TK<3 8΀3 8U@O}]w]qJ,]4u 7O<8+>mWE1 ^ӗŴ:p@ىi}pgp: c]4~rKR_|\|W#8"p aWlJ[20l?ga:8wd %R5:$_O*לgpg G;lܸ1\y{Kk e駟&N`_|o08)m2MuUZ>gpgH14\rI_?Gx饗 6t򲗡Oےd>+i:}iW 3)`PZPs sxqM煞 IDATa>WShҰ(ItaiaGᱏ>&LeX }y8vwxZjl޼9<Yø;qpg`?p>^>YƳ:8 sC=rEWl`[lQ@h#dELZn+v귾6nTZڌK^3Q4~J {y^ީ9;ҿ.mƜK ?>p/52ů0wi /*mI3 8@)^{ml1.wxk)n1J*:ÓO>G-[\Cr\Cv sC;0`'l]d6(s 14Veˮ 17m +WglŊ(^=P=s=?Njc-=H F2g< /tǕmi3N{r8c3;@ n[o"3ghq6urxon]?q)S;Q1VWfq H g&L$Dt,y&g oC^wI'w}`-w&+rϝ;xXt?=%6$^ YUpnLi1f%ZЂCG0?/8S|Oʘ];g>B/  W-}uWNKgpg<7tSWCĆG>ZB~E<1N5Br /YCj6^E F kڄV5|eW+WuxAWg2pE biSw{ϚY np > F] ;wj_a+{cha݋Ù3fчZ8x  b%rɻM ȹ>{/?`3 8m0oz7 "vp?l!¥. g.`N'R5԰: ޷!̈7֌qӦ}+[>{us.\D =#΍ΉMn7 .,ǎ/|x`|o |`o~^֭_YQ|޹ g<3 8CE*ߓ)kaxLC߁/7_CZ]c \\녍kaڬ_TPwmR~9> P:xQGIo<o%O oo{߿M#ԁfHPS&u뜹%K{;5kjLO~m03<./4\r~ECkۨh8|&u7닦MHXgw5gy/ ?;|>6a鉳|}#߇O~gP%xa6m^Oo >%qhqfo^27_wg {z|ʆ7~sLS-|3xDL`dBZfqs+Uk]k:ή!v\sUSbl~--+m4{W|?|!|1xz'z6x˛vyxƬ3>cvؐz | {S#,}or#ql}+_̩6iR|vն@_@AIi>erq^\}p~1rAC]G@^rlRKOF6Vg8CHӞ5[-67b׆R҉LJ^veWJuu~x#;4<&~<ף>2{C n$9I'<`?/&yչg鮺']uzŋ_{ 7Gxq vu)B{qC<k傺pqqyT?߹ʰr:o_zyx鋞g' 駜\`Vq /\+Ywޏ|R*?Όځzq]E^pybǗpO ӧn.g,>tϽk~xOlJ~]xki*`>l> :3/)*k">PUgpum8qcH3̹6^eHuY=UgMΤVZ=UpU//[%?}h?1駝'ms[n i2)́<>6R~;oЦx׏~Qptmo\뺞t 88UI/xn8| C=<4g=z~ch`mxJlTpl\|U.$>bL7g|;aCfa=ԓXw\P7U9;vO$}k1c}T ߍ x0ǥQ}AUX(kԨkԨkHbl!`C14J.ߝo~|s|wfgggwn]pPސlp?8%^B>c̓m͉Z>~?5(b|p\b%W;*:L`E7kycsW@48yE0=wu751)0EXSוV"Ik׮sǎ`zucRɗ:8_eôw.=Lsi'DzHb,&mpsMN|SO?f UP\e}8E"U<XCG{60ʇ#W˫!_t 6};Pc`nۆMg/h7 Ne(@%! |J#i~aH.B[ʋ\W=J+>Li7{DHďO>jb 8Fy}~In/LA@o˿d(;S\4;l4TObC-MrnU a}OgַKFavYM͹f֜1Y̓9+!ǖEБŗ݄I:irLuHCxе!&Z7~=Hoݶ `g+)"P4˖-sU7ki{5KOT-/>W>e]\ʴ:)3*q k&3O3O9iw[v#)Muw}.*'}LZ[.<=7F.nኋ&\>p F/OGj%E@P*&{AƐo?,@ >4M??:N8$(ei#ehC=_ɵXEM޼qcݕzWF(veU8 #$zL1眪Ĕ%1cս9l}g3NYBR9o8gNĺ”O\U/Mx-u/n}*iEB HxOxm݁;.\?{t#niey?C_?jU7n6w󌟯iE@Pw/o1 `ڵKA¸#2 Q8I"f@H$zϗc]dTvM3v=#piyt6vOw99(X7F ]v[بmYxk{ČO$t0r!Z]fѦDĴ,mF.˄CYGfYvh;3c?L~gksOl~G\]cg:ϨܔDE@pjD4ȑ# ,KrR~І'۩= ngk7B4y{PL䘾\\G( !aƫ.q^eE@P*֭[Ν/w#e[VY} p]d>(82}IuWmInd٧Pd[!+r1CpHvWnL۶N FVp?ntpĨ0CҘ}wpAp! GvyNX6wwӸﲻwM,&5c Xfun𻄫:k ^o\vQG\#=!ϑ+h1>f!a4_`{"(s`$E-N6̝;7 /OPd26}= ۋ#!_̚5ǰDg,(+fA79T<v7bH{@]t H%AGSj8yο0C- BlJ83ug}1N~f zC~XȞ yUR^]C_ cp'3niiz ?ڡn2wB[b}~a`mڛfM*)"P{ u<#FsVm§O>̦['i\* ,` ۊmdo/fΜ}i2piݒQ\@SsJ3M?ԓ<9,GN=_6ԓy2_!?Xܷr?iC=m}li 4~hN{P}>ϲ!r }CS2!;ҡ!;)"P_,+˃ T.@AӉO=y[t& N}Nl@'u&d[:=Wr峝16LK<(r?~B|2M?ҷ~XO6PY˧β둾 C.?i}%44V(@E# Q!CGTڅIL" Qy~/Rf;B:I;ȏt@Crߡ Y>飪hoY|-.W~ץʖB[._{F)Wb)"(FU24i~L_)aLӴiMSSfAH:|(~!8LF_ӊ"(" R9w_ԩS3z]y81.!gݬsD%,DcꐦЖaCz劀"("A1DR;vtYh_h\zL6j`n#7"@&t+&G=RF^m> +!eaȨ@rGASPYPE@P @DH#ӵkW$518Xz_I> _ӊ"("&dlMA^6҇_i`1H'1ekm E@Pl IDATE@XXc-rYv 2@0Ҕ]6x'SE@PE6 c/N7dQ.PO!?d D*|~RG[p}{M+"("d" c(ʌPBʾ}G1FAyrE@PE@Pj#2B Fr?>˹7Ju ?lGF"("(5B2Up2֢'}HþLkr8 lE@PE@`,IL;$ɠzQtYX!e9KkrE@PE@,)~79J1v`R4;r: )˧+"("P-:)CG=9e|%e6y]4$CG= B T"("(5I(39Q9T4 .e.吭E@PE@P,)1I`Rf,C9P2NL;CW("(@mFb$B%yX; B]őNL[2+"("P1 Eu4 ҩCSE@PE@ȍTrRIi#lsa@.E@PE@PbRN1dC] \ UK* ~TVE@PE@e G| ÉT"("(@n8FDn f(!ec@PRE@PE@WLVZ"("(UˣGԧ"("(b'r>2#(E@PE@Pj  /)g^kK9MEq62SE@PE@ȍ@^ 7p)fE!AcZj("(@M@@KR.f0#ίyiKYffVE@PE"8 \I>vt F@eϲRNE@PE@mII8H2&ZRy6 QrC"("(@)?Il|A! `@:I! SYPE@PE ][NɁTI! "^"("(@a0b|g2$ 3_}VE@PE!8GDθzTHSl$.v`B2vԇʨNPE@Pڄ44}g,E2!:n (3:I~TVE@PE6" c/MթS'6|ASIe}-;ôrE@PE@PR; " 9 l @yyrE@PE@Pj2B|GBqF>Y> wJ}!29d ("("C,fly=8r6r|: U@xX1yFu"("dlH>iiB8Ϙ8?G9+WE@PE6 .B؊~|I i`!e>%E@PE@Pj"$G?NK2?CyƐd: .e6DvJE@PE@0bR߈@~b F:Ҙ2}Gi҇ӖW;E@PE@Pj228Kd %e`\̗e(glA 9X簣2$5ȷGZIPE@PڂKرGXȂ0;yrVE@PE" c$)#l#f,4er YA! eaP1R6*+"("$#̏d%e?>v L1RȩW("("CI9 u2s0Rf>7p)dY劀"("(eIV.d&eY.PfPG)K9Ku"("vBP#A4R("("P|jACit[BƩ("("f,|kBM :(}Y:PՇ"("T=8҅!V@1e@j*3|W_+VիWu^zaÆiӦĴi4n8tq5Bx%հ?dE@PE@F9sOŋч䧟~2k׮5˖-33fpn;ӱcXpI3V4#GR]:TE@P{n.Z4iݻL#$b^E@PE#i]~SN- .5jڵի[n4")TTŜ6p&wQE@P8dݺuW_5K,I(QҥKoׯ_J( \ .JFTE@Pj0 f+#F0k֬1 e$0#^(G]u mPv@:c6޸^*}},-[¬ȏ}e}1"j*`xRwz(Ou"(@`JbsL c~..`V̆xdrU?_ m1'G}C1ߟ5 4H P)3.,;hGkܨ]]SB&?=)͚Zژ=K2(" 7nU8Ӹl3f,H ߩіbmN;I,L*ΒN!ԅ|brH9T_WaLЯwLtd_1П\V"(5H\ˆAd̦nj qI~:aǺTj$Pۖ,L5NfsqolIulpL d^M7l?}7< rCݳfrEWle 3ϗV͔}c`r9ȕφVUެIcnv㨉/MRM!NJ:_j|1/h6}ʉ氡1b_9G_5=Yi/Mgs ԮKI >6w?9;>J{>x~+dy劀"TW㍷zI `)mc 1"G8A|i҇Y GVyX9|U&ڽݺkyA Vo_&) |ͩ^ Pƾo?<`{kɟ}ʹSO?42-^W?7߼q+%gjθ/.#S~};淗>#C>^ g8B3P0Ca=>x9|.:1C~/3z{)"P#=Fp7yr Lc$0[Ců7)-M)W>dvBRNr  9'ge+ӷ&}єwbu޻gإQ摧*N*CNBR]w^#Lr o1$ʚ`a:1Kz{q$M: qL^{]Yx;2}{,W.{Lh-h `*^zaRdld̩||PE"|y㤾'=iӆ,mf"BD.c+:)'F> [ c!2QO^/uࡇӕ=޳O|moO1o5?\̦AMIGiE5lcfݺfnrpm;iiL>Y1@qkٽGpKG>Vv䷶k5 #?.n͟بy1)a'cADp_PXƛŴ5XCx~ƚ͹6ȟ n?|}-i=ƍ걟PnӮV%-];åA[g.\IJTPE#-,0`l ֭[ GâCCdvΖy!˘ -бMijlҩ?i2%7ެF3j3{X-prUҍW]j۰KBa{_]6;E#gz%b7 G|oGA>`}d2GR_f5{T%aJϦF&NF>#{![d|H~1 i?$ʇܮ{; v^ '{}2}vΝ/y40ioE LA3{)Kaywt*("PS:@wѶm _NaPϸ ȣ.}lCB"TBp pL vQ}w\^ng7x>8X6 pZ#:Йdf]hǬoG0 #o.:8 Mq&nS;*^n9_Ei_,iXGֻEł?w@|] 6 tM)i0ULn&\nڌ@sN۴7ؤ>lˣх[4mKkBP@X$[C}sbWO0  L%uvIvߧA?FcWi?kҼ"gB#CPwߩaMܗoGG 5l`V]T+J1†@_j9cFuv픸$00^,, ;dwb6-(ѣM';Rz4lv\!xnF n+JG!_t };mdwueE@ ԫW/*f?DM#m)/#NC8{ !|yѣ y L]AT5Fqqq$v_g`:44%*료)Tz9~g,H>tHljx;E z?rFHx*ھ]wh>n[oS٦hY>#v[i@{-[pkM'5BF7ɹבu2ŝ0  ~uiՖE@4˖_X< !{ウoɒ%9]-i\.崮6r|"!5̂t B Nܳ_,q0S쨚 <0ꆑBEh6XacŴ@5mơ\Lju);qHth*:[{mۡiMYb+-lvFvUnp ;&Ż1D`!hɆ/$B;0:o=,5qցNc]x4o悳N3nX)mTVE&"Į7ᬿv%‘?4+~:"P\/pcw30# +Re|Cv5wڑL5 4 k$M]mMcxfv^b^F3uzQ p@qfbҎv#"jaȹ(~߹W\[?}W;em.n7pvgy&VܮSg^X) maےp84 ygxmc*bQ[ytp7tJ2S"(5w/:ĸ\ 3aId[nY~30P'9_n0Џs6{DzR6UI Ǝ$\ M15lsw/bYSF6Ů`+#C6og%a*+/GgOv _>c3?t/.wiE@PjZbPT`_? W)Lm)Obxa292Lg%iH6 tDƁ'eNSWe /X{+H& L97VlhVH✸ uޭ{즌GgU؂vmT {&Fi} s%BLIc3O>.f ߳ď؄uCo1MmprN*ڵi-Nzw Fgizu9tSxsp,~=VE ղeh߅%(Ǿ}f 0~xQ?LSWl|e݌\Oﮂ4tFJ Cʄݽ)Jt1X+W>.a]cQ~f94zp3OzďT]ҾkwJncL/Z;1λYWw? ʐDǟvCvk#?#}8Ol*Ǝwݲ!Bd%E@Pj '{:bl4rȌl mb^18&rE:G IDATN;rڑ;`CeܷaYp):9U#@gw[8dQtGw ގ\{9Ngp߿kq!hܨ6vڅ?&MQV%ޣV᧞؝B_8K_̻qnEboH (;c}z*a]qW](; %XpM.M2eWD!A2\PZ@^k54 nnv$ CI9-!P/HRNHp)Ӯ,[*e{7upp!C*N8ڜ#Ч ꛭuk,mWUWcDͧ93] ~#{?1]d=GzB݀]5'mC2;ڍ2^r ꁍ%JYa!:E@nt~0ߍ~$_io:ӧ͟?v36/DAMH9m>[p/b6V B .eU'B0>_}|W[ȝ7٫ג;nrb{Ա6$5w߱[0e~e.a=#pxuky1"Vo8[Rl>yy;~ Ֆ%ׅgjyRާ_Cw>~~5o'uDN1mt~O"(5 |1H\-.aܹsyI#PϼbsԁCmD}i˲I[_(Y@"sF4 c1$A]Q+*C-u!/TvǍmn! IeI?iK_̝FldQ(|!phױxIȊG m[gذm= ;QG]bXji9_g=e榤es=ܠP6R(@Dw#̊+WO:'pt'hӦMs9~kq,N 6G^;%8\ /p)~jc_ه4eledF/I!yRf|md>vχ÷uCڲ|{;ڇGOfܦA F6>pO;Q!b9LCcSGhclh{}IDIvWE! =d믛KKg Tl<7eew,=u,> $1X1ԅʲaRҗWvI0i'mgC}bm}PORٴv:t3dVUu^a;uǻ̐Aځ/#olI']By7$os.I@Gp*< Ϙ;rS=D~ޕye~^ iQE@P~di~ۛS˜ٳiӦg+[DR.V9ƷA'RqiBPE@`Ap=! :ujQ/Zq3c=~}\~ ɧp)=Oa|,ۇYP) <ݿس XE8~s2-.r0W9WE@(. hֱcG EQv760Ȯh_IIAHiNW̶^ <:N4짟~r^N`.`SmP֬5@^t{f3!2p)"(@ϝ4U# k$ Ⱙ㰡CܓQ}IvWE@P3VWO۞\3*_)"4.DXv4 ?5PPE!؋Uc$ I;)RɆTT4~hĵ>E@PB`ER哶䰯SA:rh"("(@fR[JvDY :E@PE@0^*t 2ƢLFԓSON=9+)"("F [O2ԱuE@PE@0n2ȦM.^N`H Þ2unUE@PEv#x (P&uԓ'1kCP>-lE@PE@P`D2@y\́_@:!M߾,mUVE@PE" c-ďG1ecWx 5ByqS("(@mG mUNMx,v44\lPSG<)K[E@PE@ >b`C}6>ŦL!+|?w(!Q$ [4("(@mF@s@RN‡mCm2\.^PE@PE (-JG AoM ,H;@: )/e5kE劀"(":dlĸIrOϐG6e<r=Hگ_E@PE@Pj/&rD}(WE@PE"h"gҤIwnT0<b'K9m=d ?nI9m> _J"("L":ujY].5jڵի[n4x(%8>1_g'a˲ad%4 2͊ɩK{E@PE@0^@yݺuW_5K,fEP.]~EY?B߉A>rsJ +&Gc}5("(@=;+~#F0k֬:)6G@'드yRI>Ml ȥSC28ꘖ:Y>;̾)u~QlqTZl o"? ӡ}( ?h3۪e5QG{:}d=;݁JXkh/Ta-[05*2D[ UāiookySe<t0aRuਇuG@VdRf>tوvI.C_ m1'ڂyWiؠA@ُ|fθXVw4z e|:nԋQF Z^pWQ۫jdNV3ѧ6;s|̸'~tz{/3{9VM]9tMF{qܸqnz6Mq q7d3fY$M9i@3߿S-_p~: -Җv2Ғ $:#6 ldF͚61츃*,,`Gf]6cOPo@}aY;ѾQΛ~ : գ{{,uV̾(]=i\< {ikcMn >kϗYqiY JkIVᘙ[rig?V1*Y"M(vN6-U l#h|K}s"{l}Pb7 @_CHlǾ{ юq4v6 ;D#Lœ:ux!a?MԌ|sLԸnuHY-^b88ƔrU H\ˆAd6||M75 9 u~:~3҆iəG.()`VCv,HBgˣ_p>(K=l_4`uPۖ,ڍ"|]v27xcȮ#ձ'|2: *ϕQ'[yU­"Ȯa(zim,'AU>geu8+ #\#KQ25k;,Z~uAIW1_WEz(W5tL02*O&MLiߏ,6mDJ!74@z_;+ce&zjSw5Nڛןs~ΪK *gL #8 Dڢ<}BOmm!I.e!cx ](䐺 T2DkM01իk{:ݭK$εxf//昦lkZmYB;na&vѧ￷;>!l`$* u퓖kfނ/:Ab6p8#_Sfe NhOYWAM7#m__.Z\diycb-A_wk 6M̳fmmټicl(8ouvbfny[f ȵ[zefμn7+WhS-̶viB&SR /x͘=Ǭwniߣ[t/[vMBo 侌4;u BK/d͛I0mXrl2|[ 2He'Gv@Z@ˑ˼ʒv6?caH=P&#M"'N*3'Sb baG6Jf:8uXg^|eLwtǜ;3Ȑks1i>t99=oI 9x?2[4kes\œn+.k4őT(sɵ7F0{;Qx#a/o2S[7{_熻ȡ$`O _Bc+}z#jvܾ+6yum^Q>C;t^H8ziNwģOl{Ϛ37g砽c?$tj?>"[fe~}%7kySxo]W]jl̲m g#u m y/78ɸcq̃09`sࠁx7.M+ ܼ[HRLLHlCx7 `_/I@~{YVڰ_04̼$|鳲9}X3p F|n<=;)S9܋|b?ǟyEw5ɟ}ʹSZ%}赦~ʴx9Bi_,>wsUejκJ3HQjPGjQ,+_-2(C_2?._ n5>LOq9׼+ (~?5g_z V]Y9F'?ԁQ?z{:?cZZ1=WsƅX_pD¹s>-#w[lK>g%kc6m:}? ^F4vpQ?3r IDAT^{ӧiEpOoâM\z‡ $L!m-K o/FrP*k*I^0#rX; -{]R˯y?Ǧ G[J=w%zܔ@_>!4$?pĨ ˛.;y|u^b~v w Bam6E9'Dҷ~gVR(#@ fP+c:t4o{ঠ,F1;\k$&Wx{ƨƍeTݚ~WLFU϶AuR޸徇bUoFj#|yIkh5mڴ*+/K[:N`\,.B)3?03PY2+]ZN?%ݿwO0rv٧W̭oO ~~2`J񤣏4;kt[fnrmm;ii?дmK`{\6ṙ\H?l0b8Cq#+(oI{Oqmgn˯%65{nXgXbf'Sd3#W$}­0{c:n ik^P$p_X% S[Qx J74aimޯ!2F*s!n¦n֩5 komY5ę|$mݦi'dk;Eva\>w>(ht;eie<`{ɿ&_u캡б>riͷ:;kpjCO<4q({Ng*`d0֗G[3T־樨eg #Ɛn98f̘vB~fd^U6rIʡ6@r/<2S5u8;3)"ܢ icOEhaT,{_Tuh GK,7q q4~ A# +Ì=Hsql0 ͚=9si7ZH*ҧq :tm+ vo2 6p6ȧ$}av΍T]:up8yY 0*PW ճ#`?IlEK5+ ?0`{n5QRڝ޴χc@ً># k>=eGK7`$@UoaV!PP{Is`1כ-́5p9Vv)ꖇ8kH84Q4o,_оe7> 1]Ȏ$/qL#@\` Dh_ JmmJ<O$\,C:tp^|tڦ=Xadp'~"d*B.;A.;no336]!#i'0cw#g" rG?{0߽n'6"uC׌ӏϕ<*-`63Wt4i$-I \6TzȎSjؠkw? I`E#K:>TB6[mġgHŔub _FpۺfaCmb)|o( OcNP;l~>awJU9>d 8l@%mY.Jr7u}xmx2C7,Ӵ" ܿZ~QFH6AO9rdea#eG]yʨ_~Sw r Krp)3yLW% DF$lӎ?6Kk缂`G}pmcGm1ŷ~ È֨cb׍=H{Hܠ[|йcwաo ^qSsz9g5Q#fpp8FH yOOÛةڑ̴;|42y`[{v]m8l9*h4ei$S_ǘ;}`ω N9!bM֣"Pz2NJ1Ȍ' c}Fp B7zeo m!O{Ew!=sK]Yys tj(W]bkӼCw ?,BYؽX1_`[NkC|7O:2!P *EK7WZR1&@֭M3r+?1}t᜿n|{RG2mKjߦPmF`P@gAr˞e _U0?54Z~\qo#wd^KMwnB :{k|\H;v ̯N,ѮS9Y8f gL}*WEC'kѢE䂿̧-8|1i߹sF1 8F uNyYwh'tl/9ݴiJ{Y+xIA9OqG-d5ktRF-I%*$lC, qlR9!p}ZNvh $Ik'}~~~ROkK;ZJ7)?܉ۦVh[(,/(Bfm!c#>Iȶ62/If{hWv6bnKYҲN~$iUu\mw3c0 b}_k0ꇩvG~g"ہԡ=%6 qKܳ5XlgCB>d}l;ەڅqTOⲝ]lj#@i|olrE}[4b®7.+/|J8.Y:6rv MM@'fAtSN}4 =_ 2[o>) 0MRYir!hONvL.NriVep!yӶd}IN4҆C>aK=9 .$\u<9M!_@65m'gx줭|_)R_rG}#ޯyEN?Җ:Y\Qv,Oβ@`]f믛(v֠A=Ce@G|;C36”PʾCQ'e!2 HG%VL2 }}( ['lZPI:dҞ6Ѕ OߟuJ:eڗY4riC9oòo6[MoJ]|ߏ_i߆>-l&yȗo+m<]6rGmd^ZVVHf$1%f|Rf!{*_WPˡ,OOu|c ~eK3 Mk_K^ue+_9\,_i& Fim+i0`=زϋiE -|d3۷7~1۳gOӦM:e@I]1e .ԁ쿯Cϧ$} AÐr@l8LH;QE@PEC@ K׳r!`-]F7|g'z3BGiۏr~0 X Wl,rI.mUVE@PEG W|;G,\,Zȍ ^L6j`jzd~dKx:P;`GL[?6`} uWQ'!  A(Y gTTEy(}Q#xOD0$&2 ! uYwާξ}kUjWsG&҂XyP!MH r9@NZLD18vc__=W MÚxmy"ۄ hX Dh@N ' r`Z˫?"I 3Τ%t&y5r9@N '8&ʳeCt xsPZkA8M r9@N '1bzC9x@P"6D.8:' r98=GQ>x.S>X- j$Hhl ayr9@N '8&Up` Ζ5F\X׾ Dsr9@N '8P'n=_yz#~Z@sA&҂Gzzc r9@N 'W'sbЇ5bC .97}BᣟMr48' r92`s<1}EŌL1CAXMRULj(f0xN ' r9=5wݛm0F|?oGeHZ`+Qږr9@N '؋3bU}ws,nȡe><k`KXŌ\r9Y IDAT@N '3bY}b5  f2i#>2K Zj r9@N 'i<+D UĴ5&n,H N^9@N '  \[a.䌙_~ 5S9K r9@N '0ҁNĴb5} PVay?mN ' r9jyL_z r +*F.9XXi=79@N '  EG'C.}̧4OĖ>$.*?' r94htĴ]&$3^CqĆn8' r98={D߾}Üqc@/ZM8B3@N ' r9xvm9QX $O7@,vK r9@N 'WtRfLK7D.ZϹX#_䏜@N ' r9 y*M9"i'K4O}ZK-is9@N ' (pNқr \{g,=`-5$oqOFr>}is9@N ' (Cي1@+$7phKRAs9@N ' z+`A⦏a3(1b6J^N ' r9<x^^opzx#oaصj(@N ' r{yz8 saV1CM ")B>`mB1b49@N '  gyIg'*#gDZrA{ԁUy r9@N 'pN@H0?bn%\qpHDWAQ19CKڜ@N ' r9 ]U37hr X%nr9@N ' N@P27<%}`MoV1Rb -is9@N ' 6&g(c98w HI0|F r9@N 'pM@k;N45 hr9@N ' ÚWCb]C?=ajQc &/' r9@NmzHTܦrKo)TF2XCK r93c晁 .>яv_~ywUWu7pC?>mn~QGs1a91uYO)}ԆU\r9@N ' @N?K.,AB"-cWN ' r9"xxGh*/SO={?*XmgHaq?j{pɹ r9@N 'Ӻ8qkiO?N:Xk)FHi!xL<Rrr9@N ' PG>Owox}ckʏcCYnq2h.0x š5E_Rmoc`;~Y9瞷į|TSyfދ3Ozut_o{}vEm_IuzC@biUW_wȭnս6ι]ҝ{^|.r9LaȿoS qoy[vo}[7S GnY3A/i5LXKfiS\´(.l}+Nyӛ7-=[υ S _bC{͹ͺi6^w$l!v(B% r9n3=Hܘ =OxCέڜx≛fMQZ~~X+G[OzcmȦj{iX疷Ew{߫(C]xXد?={re7-3;t-n\}ͥy r{u83CǾ!yHwn8 ,OCs9{(|Wp31R#DQv7/FS?=|(guNz{̉_[WN ' LN[:S:>j k M |[\j-~~=sey$)@|,Nf7~󶴅we}=7O\=)OڒGawޅpGwG.};y裎|/=WN ' Xoz7\<7Ъ',~pGu{ѵd{ם|矿yCW\qEwvIo; oE>QhmO0X$-q{^JOw>njh m{.7_ݛq`pjr9@N^8zw[`|Cp 9.hQeGUC1saWNT1Z-H ܝW_sm_ _Du%WxE/יnx ?}d<缠ko~_[?={-CG^/^ioSk#zݯ+yĚNs9@N`7p7~/`<GĔFJe kТ#kȷ.  |ڔJN_pG0MR[𧂯=Q#¯n9)d[۽yޒ9.=狀k1ig|{Zf>^rr9@N`g'peAH _ =B9g.GxGhR!>^nq3\oţK~iAC1k>޵ާ}swGwcݩ?>Y)ݩ;1Oo_?5/zAG)q5u?^GJw|{/C6}xTO^~/_9>$~s6s~r>2nTӿrk't8|M_mۭGOB H$ҖXt6sON+z;Yb.p౏zdw[{:u]ctZ.9嵧a)ovkw_?ߖHŻ>w:' \S.4/Qtp-N~(}8XZhQGOj.|j/ bc.-JAJ m>/Ad.6heo8C|/٫/.G&'=_ y5F }S?Ɣ{K 6;/SږRwһAy}⠺=w^bfS?@I'@N '{>:|:z繊o-=DZX-YhK#b}57635O}x<=ZG/|5޹+O:qܱ?A_Տ?"?)|}/ߢţ ~ ̦@^7 720[Ɣ@N '''puxi ?w]~`EpÛF u #&q9V5տ .q@ o 5h5ar;m)SIŁ|CwgƔ-M.7t~u{x?{NO~?SGz[ʡ~|xUi59@N@k.~J9s_>K`oMĨ ؂L$bXk~)>|_8nG~>Xtk{C?8[ؽh'o?O]W.^ oi?3Z/ >vE[E~|v_c^_r.@N 'Xnx * YwC/^7p͵vxO.} >O]|D7|Px6`NwlW5>kb~׿ &?DV xUu9c5^xɯ?й1OycoO7[u/~s7m0_9|t)7|Xw^thޟً4{wG]s>ܽ{3vxnU΋-6>7y:J)xC >.oѼF.pkoXN ' L|ͳCI 5C?|, |gj(VM`2ڰfis҂?DmBRXCMnw c{ɯ/OG~ 6'<{胾xycůa_<5#'> PӋo8Z}ϻ/]쮓xW>{~x7fq~;M&oEGןBNGN ' <;;rټ|&BX-zC:x#=<uao U6Lc]ZȀG䌉/B˜ I@IM>qŧ׏>g!̧oioyjQw-Żb[^B#pxS^Oop3|t>nE3|^x|u!_xQ^xZ#6W{v9޴:e!Kx#o^HƼei=o1;_gt]|/2g*Y".x!>1@N '؞ N=MQŷmuxN/<ߘwj0Cs^雿yk7I L/|p2 7iZ@e<9y_#xn]z囿Wrp}cQ}ڷt,V~O>][Qw~7tק|??J r9&p 'to|75oy&A7<^̅-]G흸xU\ġ9_ ɰ, yh2wN~>oѷ1n8s=Kxs^c#|Mxm /^s>M^W{jd',>;65ߋ~Yopf+{a< =Kovqq|='(K'0oybNU8I9@N 'rtK-U+?Ї 3 &qiO'1z G8.,׿9cA '{t'_>տJWEk| ͯOop.j|#_鿓/tw?g?}/Kw&})V|w|w5qu/sXey<\W{ ;ǜe)i)?zob]zg [G%_ZO~Z~@N 'ONGx;n8|//; ZB-T}mQiK}GL.s_Oo(%xC#Qx')=⳯=},9,Sggwczjml:Ԅ(c>Y|&;␆ךSJZ9y9T֗~k:N;4>o|aW\yewh\]x3^/.m|NI,q#=ns=l,^wϽᰦc-j₅ig|~bH'?y)[-?v> f-%s=16'  o63zO9/ P}OxI3$/>o`׮g<zAQ̃rd55wp!xĞ7ZJE Xrihk\i"9&~ IDATCu1G[RuiWZ*/qN ' Lxӛ4Džc@|8G` ~gq˿=Ko0-⊝`+o(_yۅ%K9񘮵V-)z\ckElPRRc֘~  o2Ϳx|wsI<[{ \۩K;f?rF\;˙"o@J Պ*VnwjctpΘ=CgXޘ[8^SZr r 2xa{Xwquo6)a<=;cgYS;B9/*^WM H Z^s9@N ' L< _<38cGDyg|z=>b81s_ZK r9@N 'vA=>#Hw ^uU:Ӻ.uQwxװ%w7U]PAwrHY;' r9{`x p҃$13 gـ3^@@N ' rx*1X%.|mbX1V1۷o恏3!=mN ' r9=?}x†bF}wGDqِ O81l뻛yr9@N 'هJ\҇Έi5^WJ7=PH QbX,8OIO r9@N`OgxN¦y_R1zKoD"VAJqdy毽Z9qN ' r9==}xsTi<[0x)@1"~2W57Ww7xK:' r9<8ԧ>F@0/?o y9~7@޼Т0-7Cʞ?r9@N ' 7o=ֽu^l!)VMR'/|s8' r9^I8ꪫ7⍰8.=Sb)O\@ nd88 x\`06GqDte]~.@N ' r{b8rHw%t-<,>ZsOY iA\)v:~wc(|1d)7}9@N '  .<E<_qo;G?~(}r r9@N '&88s?ƳUs,nУ?H[$6?},8bx@w衇.(!/' r9n8lΙgtÙFsz>Z/jX$QKXJqmq1! Cu]]pGݿ'㣎:-oY*@N ' r~x/p7\bXM8A}߿PDwWt!'䏜@N ' rhxv~ 'xx K- *૏csXkyraޑ?r9@N ' Lg/~8X̃.Z=Mx^"&?60́< M~60/|$8 DM>r9@N '؉ ̃ ӿ|%Y7upaOB 1 #N`"-⊝ 0N?raq 㠈aa:!k/rz/ڟsǬ]s"}w~zzn=xOwh=߿KCv7f _xcn=o(zzryƳ ,{89: yOjrqOQ* aqÀ`qs<"܀5Z r9@N 'xCss nX,5Yz!%! A aq㡍MA<-4q~!?7!t6r(P9y֮zQ(?ȣ&f 3frĵ <po&7>:AL},5Q~^Jxj~IS}S(GQ\{)%MMՏRSKꛪGq47U?ʏK O/io~ŵ_TT(?k/%|Bo<т ~a?x&eN -Cb}px1<`9X.Q\J94vu?ݴR/ij&_~Zi^Z/Mw^K_|i尿ziO+5 o䨟>lC>ŵ8jC>}\/ B$(U:ʁkz#~̥=揩1'gjSO㜜O͟soc?5Lsr?5νў1=ə96q܂ut GV1x:^)Xz bC0F9j>)94x8{r:+u_kV8^kx7a'-{5ﯼeΐ^K=U.-=Ⱥs9rc+ato}jgĉaŽb?jgĉsa/\c/jyG8ya/\c/jyGx?kNtpZp֬Gu@mQ_ K 1m-w/uĴ{i^ik9{ɯ{%KEJL[K~+1^gm/WbZ^^i>k{ѽr=ZKqiI.Eҗ r9@N '''=kMr9@N 'O`ȇa"5TP0wDž$Rs(%ۨ~{=?ZG֏r7}dY1'}.mT?ҋ_֥mw=_G.mT?ҋ?֥mw=_G.mT?ҋ?֥mw=_G.mT?ҋ?֥mw=_G.mT?ҋ?֥mw=_G.mT?ҋ?֥mw=_G.mS^u5ţzS#(՟OGEHjG}>({Ž]ouO"~wQ?QQ^GDq/Gqכ{Ž]ouO"~wQ?QQ^GDq/Gqכ{Ž],OXGA\纵Ӫ?urZνњ{?cz^'Ӫ?urZνњ{?cz^'UsP6G^L~8_B=~q$gũE8z9̡Nď7mďqWũE8z9̡Nď7mďqWũE8z9̡Nď7mďqWũE8z9̡Nď7mďqWũE8z9̡N?'PTu(5םQo?^k`[|;QZ +]?֋=/6K7|Һ>v{u{m͏6{? ]Q]7Hqj{ܵ{m͏6{? ]Q]7Hqj{ܵ{m͏6{? ]Q]7Hqj{ܵ{m͏6{? ]Q]7Hqj{ܵ{-HK693!K.-%>cmXҧuh#=juh+a}#.UZH͓i+a~OyĥjR+}HmtRn ~F N Ou }#.UZy?CjrK3ZpJX}OS1M"m$b$Su={y\JqsǑ<Ϗ w={\JqsǑ<Ϗ w={\JqsǑ<Ϗ w={\JqsǑ<Ϗ w={\JqsǑеt$̣'k1F Ƈ2bhMK?G8̣e59^>q;iu=y䲆Z׏ s셖~ZGK.ku^>q^hu=y䲆Z׏ s셖~ZGK.ku^>q^hu=y䲆Z׏ s셖~ZGK.ku^>q^hu=y䲆Z׏ s셖~ZGK.ku^>"p)*L 5U?Gk}|: ާ&-{q:y//x}kbRwʏqIa<K 7xš#{\R{#҂(} -6X~):Mq_o/{)kB -Ů}zץ[K^cʚBKksߴuRטf/R7}]E5 -6Mq_o/{)kB -Ů}zץ[K^cʚBKksߴuRטf/R7}]E5 -6Mq_o/{u0GM4NPďYZ#~"~w1MG:߈Y?޿"~g]ڈũb_Z_?.-K2@;+mTԩY2bX\xԪ=;}Fy<i<|GzsߴQy#uǹoڨ?G<޺7mԟǣ~|Hoq6Q??x8Mߟ{<[wxԏ=c7ma"m~C;F5tMZzELۚ=Pvk:+1T5{=5uh5Vc1mk@1zkjS-b|:c\CԡX ZĴuh蹆CSOi[Ўs ]SVc%F!kq#u}Ϗ^?Zcor~zĴQF!kq#u}Ϗ^?Zcor~zĴQ9"ZmQF<}ӎ-bXNqIaTz7>9"ZmQF<}ӎ-bXNqIaTz7>9"ZmQF<}ӎ-bXT1 IDATNqIaTz7>9"ZmQF<}ӎ-bXNqIaTz7ւ@zz:z|Ozz:z|Ozz:z|Ozz:z|Ozz:zciSz#pEyČ֛>Y=e 7ԣښX9j*VMŮ}#f 7ԠSO9ﶵj*v]]~Q,nA;rk ŭTSj*v}S1czQL}TSrGZ`qC 1Xk(nUS#F 5hSbm]kׇ>r2jЎZCqk=T]1G,nA;rSmk=T\>1XPvL=([멦bTG^XIdX-)Z|?}ᣟqTXRbrzÖ̫YQL׃>G}ҥ6 [3f5G1^~bJrڬ0lϼ{=S~+]QL.k8%>jVsO1Qj*Ft)G1zÖ̫YQL׃>G}ҥ6 [3f5G1^~bJrڬ0lϼ{=S~+]QL.k8%>jVsO1Qj*Ft)G1zÖ̫YQL׃>G}Ύ>\jjȇ X4֏G[?_E[?_E[?_E[?_E9|  .XŽsV1Kij*i 5Tڃb#kyZCq?կ=)ȪZP\OkO=(f<5Sړbjj*i 5Tڃb#kyZCq?կ=)ȪZP\OkO=(f<5Sړbjj*i 5TڃbKvIKiW ŌUbڃZSW ŌUbڃZSW ŌUbڃZSW ŌUbڃZSW ŌUbڃZSW ŌUbڃZSW ŌUbڃZSW ŌUbڃZSW ŌUbڃZSW ŌUbڃD!6K⥜yܯ1 {^@JǍ*Ṽ%)3uϊrZbړ!j*јYr`IMUMºgC9-1IqW5hLX9Sx檦b aݳ⡜Ecr4{V)X{RmB1SxꐯI1ԧV=*n!_53YݓbO1V{TܪCj(f<'Sb[U|PxduO>ŌZQq3O}oڣVUC1=)f3jGŭ:䫆b#{R<)fj[uW ŌGVySxꐯI1ԧV=*nY:Fڴbi[{V<6N޺xU}PL=ݳqeGū꫆b.=*^U_5SOxluYQzgcjWW =+'o]V{Tj(Y8yڣUUC1tϊ[{V<6N޺X)*8 ŵ(ݯ=*vصj({P\Wڣb]ŵ|(ݯ=*vصj({P\Wڣb]ŵ|(ݯ=*vصj({P\Wڣb]ŵ|(ݯ=*vصj({P\Wڣb]ŵ|(ݯ=*vصj({P\Wڣb@)*8 ŵ(';Z9w{Vui8uiEk2]5N]Z׃_{[hmk}ߏSk/|SẒu}kS^g-ZE=Uo:mN ' r90o9[ r9@N ''=+ r9@N 'X@瑫@N ' r{~Kҋ&n};ݟzQ<{Q(zxv|>]Q~<>Қ\X\~%MEQ\qv=Ϗ(?Gz=~w=_GQ<@.]7\hyH?GOԿGΏ^/nh~(E{?Qޏ;?Z{Hԟv'|Gko7s~}oպaz|[|?y?ߚ|{|ky}G|;w=_{{ޏ=?滾G<_ow^~<5=?]^ޟq~ xA|h#] j9}rGM~XQs/_xߩ?So1F kzF| }򿝖z/Qv 6_@>ӎGs[̥X"էcV>sik.-%>ӏK;&_0ui/a~4\1_K ~ O5|Ҏ"L]ZKX}9m3vLa҂_S1hn+cSVjGs[̥ETsL?g.|/ԥq.` -0ɰiт]*f׃>rjZ䒣6,nR"V13dU5"aq:G৏!(&G} xԡ?ȅU<?} Yd %G19fmX-E.by=#gȪ&kE.9Q0k-uh.ra3O9CV5YC-rQLY7hC ~t y^~jKbrڰGKZ\XzGΐUMP\r>`ֆ rjZ䒣6,nR"V13dU5"⦯c3)aP E1|.:/ҏԥ~ yI׬K1H?S%L_cȩ]KH?S%L_c'].ƀ#(N]Zh0}#v."(N]Z0}tͺ8uiYEz?ź΋8ui_Ez?{5j 8ҏԥf y>rj:/ҏԥ~ yI׬K1>ıg}c4{u빾֛~\/ZOjn=zSݏEO֭Zojqh=ߺ\SM_w??5[zjg郠.X^k4a3`phK|T=xl=j(F C[odNӚkxbp 8%FVT=VGj(F C[odNӚkxbp 8%FVT=VGj(F C[odNӚkxbp 8%FVT=VGj(F C[odNӚkxbp 8%FVT=VGj(F C[odw|rDōnw?]/vrvx xG܎yx}zû $?pEi̥u>1G|U\Zy·>r2X9CX{VZs>1XڃҞf᧏*VU56?}e Vr絴'`|#G-c3mU==k r"Q jxnUbͭ}jonUͼ[Xys7>W7on}cU;ws믺oG]z *SȪ(oո=)&_53YT'䫆b#Uڣ⚞|PxdUSqj\{T\Ӟj*VkkzړbUC1UMQުqQqMO{RLj(f<8[5=*iOW ŌGV5GyƵG5=I1Ȫ(oո=)&_53YT#06GlG;Y#q?$L977?#&&pk<(*w_ַYqgŵuϊk=+{V\vYqoݳuϊk}ݯ{V\[~ݳZߺg5n=+w_ַYq?ƿ]cvS};v^iQWvSuWS˽?z_خN^i?)r9@N '8'@a(ݳ1+>0vb9r}{p GݳPV? •v߿}Ǹtd Vq;;:1hsYjkAq~Q=D[mw h9/qBKX}sja-XGmJ썖\T'zĴC5s}Jy\Կo1BV5QR FK.{* =bڡ>}U|__u7|rCLs}p[M_{%=Ʌ1P \R*>/vL>!Umb>8r}ԦTђ˞JBvbO_)oW]M;&\Ӫ6\u>jWheO|rGL;T1קK.KFhAVT\r&-{5F\FbM>`rY>Z\bZ=5h]iSܪ|>HZX9QW֎[ZamZru(Ǒ61MU5) 3 H$"MsWZ띧.1{wSDCg%f~7}{zhs?wOqCo uGS|)y ywW>=A4Թq~;O]bw٧x🂳ss8Xx# 487Ё]|PcW`Ɗ<+Uǃ/X'~]|PcW`ƊUH+|ă2 CvAC^+W`GvAC^+W!9b@ _ʈx 5FzUf8^̳_u<qb 5FzUf8^䈽'|A<(#M?t`/4Uq8x1ϊ V|ĉ>`/4Uq8x# 487Ё]|PcW`Ɗ<+Uǃ/X'~FU͐޳jgʀ_|ݿwy=sg|7Vt6םջ{3+gj }: # W,y~p+;XCoGg;P[p򣙻;]тC;~yVԼ3{=t_#뿺kvo]ޝhwwu{d1vR_*O v7:𬞽œׅX9hύwԁ1Sj]ϝ~~{`xV^`ϻ{ vЁg?B# +Nl_~/}:udٌ@+N|闼4X:znk[g^+gtz\靺#+ξ/+Z'us=OoU,X:znG7r| \K7{<`5^W=xu]_w+@:./|͇W}f^u]ët/кο v._U|E_كh];}*/ n{??UP,g_*~}>lد;l>wyם]g;[h x.Po}ʼnI$W<5ɳw^Cޣ뙱'OMqyK[CH0yjӋ/{$SSo8'&\a$Q_H=8-mq+N M"IN/ˣb3<{$OMq[?ޅ{ ɹePOa|z&ޘ=[7;gM g,98#V>=WnP;dճbK*N,yňO=F5s}XƒiK^1`3yF3QM\_=+V8꟱xگĒW8XL^CoT1Wϊg,98#V>=WnP;dճbK*N,yňO=F5s}XƒiK^1`3yF3QM\_=+V8꟱xگĒW8XL^CoT1Wϊg,98#V>=WnP;dճbw 0 ;3\=~;zޫiy^N;5W{.hjwvکzޫvvyG{WN,ب09Zj.zޫ߫ڏ9«﮽zޫ.zޫ߫ڏ9«﮽zޫ.zw~Owxǯ.ɯx?>'>~uuWw ^}߾s;crٸgx& Wg#Lwg9CվsY}H>͝Gxΐ|o|V=ws}s|;3$_;'g3!j9>{$ Wg#Lw3$_5gI>͚$ WfMY}jws}&>5g9CվY|V3!j߬I>OMxΐ|o$է&Lw_FeR?i6_?Z 7>={e~EϮ+3^_O/W ^/X=Xr$sjϝ?39KNޘqNMrsrg1{&7cS:ΩIN>wNN,ff,9ycj[95ɟߌ%'oLMr8&999=㛱䍩In$';''gr|315ɭ㜚sbLoƒ7&uS|Y̞Xr$sjϝ?39KNޘW;גlʯ6yo7g~SuQ&e :v~ga]}l>3]ϝgvsr|;y̰wݮ>wNow6Ov3u99<}fnW;'Ƿ; ;sv~ga]}o!Aj 9{E\sv^|gϞ~gY?wwv^|gϞ~gY?wwv^|gϞ~gY?wwv^|gϞ~gY?wwv^A7˗OYѣ~;:̻7'cz]wgy׹4<]} :gs/w}g~~[s/WnŐ~G9s_Oߑwuq眹ۯ˧Ȼsw~]w9g;n.;3JGJ/NbtU~U>cygzWb`?hWz~Z_zl>*^18]x֯h}+wvyxxwn>Y>گぃygzW [ ʄ т+ڋZpGG ;p+~.=XW<\ꊣWy8^?zf,y+Q.uт+<K3<(hyg_?Q=e)qNDK}oW~׏9@=߮|ww~8vw}]O|y>~ޗ]?]O|ysO?_>!7 GXzy\?]+wwb zy\?]+wwb zy\?]+wwb zy\?]+wwb zy\?]+wwb zy\?]+wwb zy\?]+wwb zy\?]+wwb zy\?]+wwb 0y@)/x@lw]?E;ӿ:ȿbyM οD;?sE)]CS&z욜~o?绳=Oճkrbw?Yή~+\y{N͊O>s+s>NԹCg_9څZGswܝD V  6sw=>oyv=>>oyv=>>oyv=>>oyv=>>oد@/ w\3C%'f/9C%'f/9C%'f/9C%'f/9C%'f/9C%'f/9C%'f/9C%'f/9C%'f/9~X3 \n._m== G}GC-]._m== G}GC-]._m== G}GC-]._m== G}GC-]._m== G}GC-]._m== G}GC-]._m== G}GC-]._m== G}GC-]._m== G}GC-]._m== G}ᯁ <` |4QZp,}nyz?(8fze IDAT?(8f7<}Ai3~]=}Ai3ݿl?v?6O_GGA?_WO_GGA?/b#m@(m0 ck揶pTc4(V,wҢ<5bh]Ar{g?׻?s{~wMy~Cs< kw? t_uh*/g7Oͫ#aoн\^\]oCS9xa=yj^a7{z~w<>wzW W͇?At u.;Wu.}vWu.Wu.}vWu.Wu.}vWu.Wu.}vWu.W*Z<5GSLNޘѥGrW}rԧgrH.=H3&>=7Grt鑜.GU19陜1=Kw1=ɩO]z$'|'gLN}z&'oL#9]L>9cr39ycz$Gbz$_S#9HN~#OΘLNޘѥGrW}rԧgrH.=7(VM˘pjbg6]юG;[(wu~gG;ŮwlѮxYGrW;w~Q~g:]o_5hwcW ns{~>=ϳ_wowj=;<w?=ww~k_ӟ [Asv~wgc;{믞X|wΞs=w<_=]j_<28ݽGn4wwn+e#J_Hs|w{Wv<=G [\y\9v ys)oWOaUIZo [w9gN5W˝[w9gN5W˝[w9gN5W˝[w9gN5W˝[w9gN5W˝[w9gN5W˝[w9gN5W˝[w9gN5W˝[w9gN5W˝Lw" Ë ;Nϝ{>]p~O]ً]A. >!軿>]|WdWϻ]={ծ09s}o˝;'{_w9wߛr;ɿ;''1wN~ph,]Yw+y=swavoK]??w燿 >;< < < < ||k_{ʝߍ?n;'9fs{ʝߍ?n;'9fs{ʝƇ?fQr 2|Y|V3=-L>;=XrfMY]js]ƒ0kR|ϝg2|Y|V3}|w<{$G;̚䳺$s3#9%'a$ե&L;'e,9&.5g9LxH.cw5guI>gzdzGrtKNìI>KM>wN>;=XrfMY]js:} < < < cw5ɩXr$nɩXrfMr215ɭ[=Gr3|Y%'oLMrV鑜%'a$.cSܺsz$>cw5ɩXr$nɩXrfMr215ɭ[=Gr3|Y%'oLMrV鑜%'a$.cS ֯ L/Jw;??sߏw~}| w@- o`@wgeS~~puX<:0=с鑜yD=8?KνXr$G䍩In?swop&Hon,+j^#~ߨQlw9W~>_gWuo7Ϯjw~λwWvy9W~u~XF?/Ȭw>JlMz]<λWy{?wg<~;z_yw>Y}>[籿y|j?cgl~z]?AFZ֯wv{˳7wg;Uw^X+:}ރ~7m<{~7y}c?XA/pv y![|wvtݼ|wvzvMNg?w591׻~wg{g\~~7o9ߝ]y]sݼ|wvzvMNg?w591׻~wg{g\~~7o9ߝ]y]sݼ|wvoʄgdPn`o9 ջ_oG?l5>)-ޮ{'zxs?G]s{wΞ9{28wyJ9{>sz|l5>)-ޮ{'zxs?G]s{wΞ9{28;l 5rG w_ȯbAwٜO=??Ƚ}|ߜptyxG~Uޠyw~#]Ϯfs?qp#}s~䇦rS$ݐ8;[ٳ++Ntλzf8K\qwz]pS7Ñ_j=o抻;z<݇󮞺Ry3Wy>wpZϛλOἫn#zw}wx]=u3f;}8꩛/7s]w=yWO G~+Ntλz?+fMUKX_Ͼ@+~9K)ߗWlXezk:_y=v._9(=?s'/y͐zF)k;}WY$Z?}@xQVu>z:QmAth*/g7O_§bԋ\_:4ֳ/lSd1E~/ e?"f?חM 2[YzKrzvx-|,FCS9xa=yx>uG^ҡ<}A<^f #Q/bs}T^Xn /O]Ũ1th*/g7O_§bԋ\_6y!jK[XڬXEf.yy?{w?ݿ;+g?he={w?ם,}X?ȟA׻ߝ,}X?ȟA׻ߝ,}X?ȟA׻ߝ,}X?ȟA׻ߝ,}X?ȟA׻ߝ,}X?ȟA׻ߝ,}X?ȟA׻?:o=5{N/gzt.^;}/VOVw*|y>p~2˧WN#]>w._̭g}Uw}`dn?;}O❾˗G+'s+Y|z]s2y[>h/~ws=??w$}\ 2?:ɿDԵ^?/q>2缇>~w sy|A[o+ίp4`VN=ܭ<+~3>`[z8[ >#`[z8[ >#`[z8[ `_ן,vt,g̗2C~w~K]g3_➟ .?wghw,g̗'>C|g]?g=?]~;Y?%3Y|/qO|w}~֏|- wwy\|K#W~믞X|wΞs=w<_=]jߝ=W~W{yz>`5^$>u\o}VCz~hAGE󮷾{]o}g>λ.o?g;}w]~>w8z뻼|>[o?qwy|~>yl|y[zl罏󮷾nϻ~]}v]_gW>__w]}Ww:ϮW_iR?aS<5GS&sY<5;HM9us$x|V39srfI>w!.5gzsY|CY]jɭ&Ls䳺$ϙ[7;gM򙾋guI>;3'nvΚ3}R|wKM9us$x<^?VIa6IN>kϚ;L䳺$W3'/{$'5wguI>gN_HN>k0=R]}Μ쑜|$'az&ե&99~#9INL>KMw9srGrY||Vse&93.5gMrgY]jϙ=Ϛ;L䳺$W3'/{$'5wgug¯a98/W9;_w cK>_?_pKm4eXaar;+wNNw99{;'g99s;''crw̝Wsrʝ1wN^sr;+wNN~C$ rE,_Wx;'k&wNR{&wN~G̝կ͝wus˝gsɻwsws39]}sw|s]ݻ9ߩs4!1wN^sr;+wNNw99{;'g99s;''crw̝Wsrʝ1wN^sr_[݀u!Ϯ`;xw|ޅpǏv`W?˱&_9wme9Jwɿn+;Wj&wNv[!wNR4ssɝn~xvѯM;]gϻpn >y~;|fFvImar2gcΐ9#9~KN1gH%'٘3$wH_ƒl;Gz$/c6 ߝ#=㗱?sΑXr9CwHe,9Ɯ!sGr2gcΐ9#9~KN1g{+X?߻vg|*򵐿ɟ|׽d~0/5g.gus򙾋g䳺$xz$g.=R||V;'xL>KM򙾋GY]|3.5g.gus򙾋g䳺$xz$g.=R||V;'xL>KM򙾋GY]|3.5g.gus򙾋g䳺$xz$Ϻ7TQ,EW~+=hj3^=~+;\=~gv[zޫVv8zޫR{WpFsWmy[y/ ` TOarXrfMk0H;yK^11׌ߝsrfgW:bə?cŻ/s~寷OnKoƊw^?_݅?ȋgwֻq}w]y\ߝo}llnwg[;[~>ۿwֻq}w]y\ߝo}llnwg[;[~>ۿwֻq}w?`^˻_=_=_=_=_=_=_=_=_=__?Q=W4_ۊ|fwWu>+3_ٝnxݽϮWjv[n+^w2_ۊ;AQ5LwY|>R/ywxxLXzwy;}g.3 IDATzc❾v._3c}{?띧N]@뉃z竎Yw.|͔+w|:}gowy'z?띯:f-<^`5S>gyj]N 8w꘵xxLXzg?G.5$7B֏;vݿ;z۝~ߝsozgvnw~b 4Wg!v1<9zz~wǻ=Oiy{.nSw^ln}_yꝷ1<9zz~wǻ=Oiy{.nSw^ln}_yꝷ1<9zz~_-`e8XimX:b'kDт'ډޅvOo8H ^xZft?}VɚxzACkks7Dl3OA #xzAjR{/k!ZY'kʇ =@|A_.z뭳W=kt5tz竞5: zzgUlg]o|vg6{x~>yY|3FgYcA[o?]w^?ޠ뭷Ϯw~;_f~og;o?띯zfl?k7z띷W=kt5tz竞AD`א:ӗ/Zz$VGz4 <ɉxAy>N_hhNݟu$QvEKDw-Ĭ, q~:ӗ/Zz$ڿgmq'fgf|ԁ|#>k?183 H勖Y[YǙY@<u`/_HO:;}G;}wbqf8h?G-=鳶3Ay>N_hhNݟXI e.=gyzyG3pSw>J_ݼw;Wgx( ƧN|_?t/ܩ: GW0>uzEn~ ,Ur0(PvG\gr`oyG̙YJnoy4=Μ,foyG̙YJnoy4=Μ,foyG̙YJnoy4=Μ,foyG̙YJnoy4=Μ,foyGcP/^ Gy]o}|;9ߝ~z}v?sׯw]Y|wu{>]wyg>ݹ.wgs;w:[=~w_z뻼y]o}|7X\grtDDJev~]|Ь?YVUC/Y;]\W;ί?ܑ;ŕzz sv~W=?>`F|_zzp܈K/8RV~Wݗڊw0s#/JR[q8_fnW\w_j+K|̍J+Km;~_^pp}8|/37+ Ի/?>`F|_zz_Q0͘9&h q}wW]ݿ;1[yY{ҧ|7+~V?1rgG vbwfy8G泾;;o?L~v~wW3Kin>뻳uw~泾;_翫;on>뻳uw~~˨73ѧnUs{+z4/ Ƨn>E~~ єs+z7GS^BΉ`|s>J_zMy 9'(}Ѯ뭷{+z4/ Ƨn>E~~ єs+z7GS^BΉ`|s>J_zMy 9'(}Ѯ뭷{+z4/ Ƨn>E~~ mvwkvwg|w]]oW}vwkvwg|w]]oW}vwkVCOcG=`ɭw9̉ ;k&yjK#:8J$߸/=ۗ+N M"J$wgLnK\a}Tp_jo헞'&\a}Tp_jg3yz&別N>/57KlCH>/5ɳG~<=ۿrR'WX\闚wgrrʼnI$WX\闚#nL_9b^?qa}1a$G~'bʧgʍ$G7JSpnYUXrXL^ѓhM/驛a$G~'y2V<=Wn&9Zzӯ4 Gzf5ѻ_ʼn%gO=I+M‘fMrWqbə'c3yFOj7JSpnYUXrXL^ѓhM/驛a$G~'y2V<=Wn&9Zzӯ4 Gzf5ѻ_ʼn%gO=I+M‘fMrWqbə'c3yFOj7JSpnYUXrXL^Sߏ]ɏL>3vv殣^ghό.?3cgg:uvˏf.z>3vv殣^g8jzȣ:rgwg\W_={~g믞~g=~lWc|vj?|_w>;z߇ )LF`ar鑜|/ 8S7ó~3j1CH^zGiGY|JGxz$\=h 4Hj_L>~#V<=WQpQ5|/{&ut++W( 8>=:_O䕫ma}T?˞gݯtĊGՃ>J?e䳎W:b#yA[XGUggYG+鑼r-Ҁ#~3XH^zGiG;~zɁK 2>g.?.7|k{~?C /~+Lխ$Jo9us3$Jo9us3$Jo9us3$Jo9us3$Jo9us3$Jo9us3$Jo9us3$Jo9us3$Jo9us3$?ҟ ? < < < |Wÿ؍?U&~U>gL<]rM]3&oz$1}#~w.gLnHu9cwGw7=ww]Θݾ]r `^x^x^x^W`7dz < < < |Wۿς++++`IK)gL]rM]3&oz$1}#~w.gLnHu9cwGw7=ww]Θݾ]r;}?!_FdX8࿣yu_;3?_?_+ `͌ wuY091gLnH;'_w}ЧGrɻw9c_;'w.wN|w5gzs֭#j}|V39crV|>wH>OM1uHZ;$է&LxΘܺsz$_S|w;3&nWs$[zNCY}jSW&y"&5g)һo:ΩINޘ;'sj7&us*}Δ|柚W;'sj7ɭ㜚䍩In;$J3%&Uzɭ㜚䍹Cr8&9ycj[7;ɯLgI~>sr8&9yc:ΩINޘιC9Sj_O:ΩINޘ;$si^?y}T>cqNMqf)z@jɡOfW3&uSSsVdmy7uH15ɭ㜚CΊޘ-nW3&uSS=gLMr8x7&k+էGrInrV!4l`~]ϳ{~g믞~g=~lWc|vj?|_w>;zw}>lد;l>{>ɟJӟY с#xSwzCxrd,ϟ.Wv<y@׹3C[g?띯zf+靯|7zk]owꙭxwj?ޠOw5gx>Fz竞يwz& q[c?띯zf+靯|7zk]owꙭxwj?ޠOw5gx>Fz竞يwz& q[c?띯zf+>8XE :0cgS\֦vĩ-gGHO|ΣKGό;yt{ ~u:GwHs_wOKOԁć8<:tCj+?cuy_QԸj}n=ާs緛wgkԽ-wϝn!ߍ:+2=ͻtwv7zX18H<1sPWּ_x2 8}G'_0 8}G'_0 8}G'_0 8}G'_0 8}G'_0 8}G'_0 8}G'_0 8}G'_0 8}G'_|>;#Qf[訟Y{.띯<#Ql??xxM ~|׽/cg_o{.y4ݏ*z=׹4hEf: eO/Ż1˨n.|}}^.,o9K>:|2wL/pJF٠˧vĻ~gZ98߳}6?{]98??wwcLma=OgK:ߝ~g?^^ {z>ß]}A|ݹow|vݙA= mzvs}w??wwgLma=O]N<u}wwؿwgWqb(Oma=#ό>s+Ayz=x:77H8x>9Ê?d≦xߡgFQ, ^we4;se~K8תzf\`iaYF3XZfGxߡgFQ, ^we4;se~K8תzf\`ia P7^@[?{>|ywzz띿~>g8N[ow\oWgy]wwj={>;n]s_o?sy6pC競b/ӻ;zvU<;Г?/ܝftQg̏{vz}G\|GY |gHN~߿OG}v :+~W.Ws &PG$̓zjzf[A|K7{<`5^W=xu]_w+@:./|͇W}f^u]ët/к! WCq=gzu|W_={~g믞~g=~lWc|vj?|+O5!Oƪ!V[-3Nӫלh*`Ɗ-$Gs"e:}gރ+1ΉfI|]>^zH =h HnħNEwm7}!wo;<w?=ww~;<w?=ww~^,z:ʣ{}z?fQV9^`z>̗Ǯ^`zs+~9ˊ>{W]?◳Ǯ^`zs+~9ˊ>{W]?◳Ǯ^`zs+~9ˊ>{W]?◳Ǯ^`zs+~9ˊ>{W]?◳G?p V+3inVrwwʎGh?m%w|wx{v[=+;inf_C& )LO_9cY)9HO_9cY)9HO_9cY)9HO_9cY)9HO_9cY)9HO_9cY)9HO_9cY)9HO_9cY)9HO_9cY)9HO_9c7 ^C pp^ϘWx|Cs ~vkq>n;YgX|9l9Lsܹss䳹s3WgsgϝΝ_=;'͝;'z;wN>x|6w|9l9LJE"+ V5ǯî]U+]{+W] < < < / ?&_yr@7w'vʝ1;'vʝ0N:lsZ;'_+wNZusչrZ;'_+wNZusչrZ;'_+wNZusչrZ;'_+wNZusչrZ;'_+wNZn Mᾚ'5_6+yo_͏]??WWîs `4mj_}˙{gIR4f-f,ƎSr8af͞ 7`ÂC#"SU*3U%FU]!ټd|sW>wx6/9_şܕ2KNWg:wsgU]!ټd|sW>wx6/9_şܕ2KNWg:wsgU]!ټ|_s 72Eh杹տsב#wgW]Gڻ<ޙ{];wi?xg}vun㝹z7Oxs;܁=d:7{2''|zxunduq%4ޕn}{؝|{^w[w=;߭vםy|w{]u=w.;oyn}ߝi*qoFt#̹?k[|ANh:|tf~gՏ;Փo~jbc=]~U]6~Skzze}AZX|׫ow|׫'/ 7z^x^=yYm(v93[h7?FͱW?*WO^Gt5owVqwz>ڠOQ~sgՏGS?,WF {eWycºF/U^Q' xzWqC?7gNbГH|fnn=;gLۭ7Csz_:{Csz_:{\.tʏbrK=FfU\hR#h> AymzȬ-W`G19+U5TWW7Cf {zʀww><~]z?ߍ3u}:[Y?]wngwʙº>Hov=p;\z>ޚG vz]}es zKscvǫ:\#~Gu{U.=CL;GHyGWd}pAfֵ^^W/+tpfU t6PN剙܊5O~I{<~5:cr~zry}zu.{}Yu/P,\|ú~n|w7(GrW/;FxU#FįU |W;Wy@]yx.??~T}y|K/0ʓC M3E/:u Nތo^ 뛿:^ɣ|^]Vwuɛ?{+~_V'zy?Ѩ31xASDzb_Fwuɛ?{>^q>Fy{ _yYgo33FQ?.ُg~4 G}$5b0y{o~gKW}v xY#gp lVՙ!j@>K٬33B#N}u.jYUg8GghG̏/]8fpԏ8U_pfU9 q43?tPͪ:sQ?:#Dg~\w¡6Uu怣~tF6xĩZ m[gή{_hFTpv<]WS5uTsO7w}_?Ͽ/~O.qqV/wů 4z~zF\8j{+?Ã+/ .k|@ 4~ ҡN"Vz]|h[xϘܳyg.ԙޣ ^q.@sx˘\c-pL|zB 4~ɕ=ւ̧H^q.@sx˘\c-pL|zB 4~ɕ=ւ̧H^q.@sx˘\c-pL|zB 4~K &y&YL/XmjK\Xފ_?t|f:Uϸw u?g?Q=^罥VȽ&9|H?ez"d߮l ;\ }zwf!utẟ^p/ y(pwzv\?[뿚n>wͷ~5s}oj~7]Nuos|wW;=οwzۿϝ_\;[뿚U@\u t<˯ _jk~`*[H[쥶Gch3y'ʡ fbkх/[57tT ]0s-F-CR[1CKN3W1}v5xĭ_:p.R#!{ј!GɃr肙>qt oW?co0k+~_a'wڳWg70kvz /``BwgtNh~wC~coy99zgy@G:`4{]}1s=?+1:`4ۯw z~::`4ۯ۟=WZgՃ ~kvz]z>]N[gzuu~w[o;n={~խ]o~|v^Ww}׿v=nwz]z>]q^Z|^߁߾##^}?ֿzo_;D9ڟ_ =oV|}ugw՟oxxB=yϟy_?g>Ϟ}}l?=~>{|gdl眑12馇g|sFqS?!nzxw>gdl眑12馇g|sFqS?!nzxw>gdl眑12馇g|sFqS?!nzxw>gdl眑12馇g|sFqS?x돀nR-"f罚޳y$~}Joy>>W"(' Y {"pM!q;=d:7{2''|zxundW]G^vfRnw]gzfUjyy93fxs]j==fo^jdl9wxnjY=52|q׷ZOzΝ3^x1oVOg.;gcƫF歞sW;^z̸S#w}jyy93f >٠Wג`~ZVWyg?|\w}}wI|~ ^H@zi]{w,Z1:sfo;gnwΜv靭3gvsvzg̙a]~1:sfo;gnwΜv靭3gvsvzg̙a]~1:sfo;gn}OqŻݭѽQݛݭŻݭѽQݛݭŻ}Dր GF\FGߑzZzi2g;C9w֟zYN}v52Wq|_yrWnE^QqwdL{{1vz wy~-!{6R??ygT\ƕCD3Wqw1yꇓ1Rq!lO͌w#_D+sy՟w{]wϷ?}?}~sG @\XW31sV#꙳֙_qY;:s@Ur\Ġ^Wg֙Z"ug~Wr\~w?sz1h߭3<34"wvҢIDATu֫|师Awn9Y9baPqJ\ f/WZ^뼢`i'Z* i8_=f\Y|^GU \;p+z.>1^jɫ.w|W]|b0sgyՒW1\pL:1`2z:%bߙu^cveuTK^p3 뼢8먖+~gyE'3q+Q-yW4O f.W>Z* i*aD!0s"\VwY v]=|'z?]got2wzVь{g?G|v1y+z9=~:]Z5bVF3Vs ztٵjĠfVь{5v^|/d~W?Wus 8gd m8u&.\CB3=C0kOI~V=@9k^`z'1gWZ=Y#G]j=;qֈA83z18gjWމF ™~cpGֈ?sWZ=NIՈ[R?zF HNՈg_sp/gq>B5b/Jͪ댷Q9u1h/.z3F59k}|빿x՜ ^gEj/_gj]sֈAsT}vs69tY#?3ʓ+ąuu7uKSuz~wg/~]^W<~ݿ_g<~yuuw~_uz~wg/~]^W<~ݿ_g<~yuuw~_uz~wW?v=ݺzwvT师Agn]zWS:19{߭[zwgOky3n}ޝo?ϮsYݺzwvT?fLg=wַS19{߭[zwgOky3n}ޝo?ϮsYݺzwvT?fLg=wַSo?<*Ϻ:îpv+zGC*qa]{+.|`peq߳O^~Y~]U{|S׿@pӳ=~@>l pim8u&C/:3f~怞W:i臋6:á]3t?s@+f4_yrENЋΌ9G<9 pCWg J#M@WpцSgb8⡫3cgy&}+O~hé31zՙ1C3aH>'G?\ԙx̘z^0{Iʓ.pL ^ nu~z۟hwv3ڠ>{]w駷]6Ϟw|_mo> nu~z۟hwv3ڠ>{]w駷]\~h+Sw:Z1?^z~2+zw:WҘ]g!5މ:;"wufi~цh7w+]41ptZKgK vut@/7k%Fd:sA?ʡY#=~]?sA?ʡY#=\Gr#nֈA?_\Gr#nֈA3:5b3:5b;g=(8fu=(8f:sA?ʡY#=߻_@< kh©:1zi|b:]cU=gox]y_snꞏ:]gU=gox]y_snꞏ:]gU=gox]y_snꞏ:]gU=gox]y_snꞏ:]gU=go^?u}DV HumĽZWwN;w:~WuĽZWwN;w:~WuĽZWwN;w:~WuĽZWwN;w:~WuĽZWopdr|w fncLt]z3]#=Qj}TO`c?3:`dz-]'>Vo1ssygW_g({~V|fWokz3U|s_+o?ٹ30寞wVllYyg寞wVllYyg寞wVllYyg寞wVllYyg寞wVl7_a0ꙟZ;hϞ=]=Y?3Ϟvޮw֏|v̷~矝gc==]=gogXg?;oW|;z>{yzߛ;.p^]%tygoYOcyߝyߝyߝyߝyߝyߝyߝyߝy_h29vB j喝-#;9|ޣڮ?zj>8=C N-#;9|ޣڮ?zj>8=C N-#ν;Wzo}yf j`]7m?'AL&9Χ͛'|zؼ9{2|/9Χ͛'|zؼ9{2|/9Χ͛'|zؼ9{2|/9Χ͛'|zؼ9{2|/9Χ͛'W~/}Ö2F熹CƳ=!dwx;92NN3sg!dwx;92NN3sg/_~7yuM6!!B E;@-(R\[Z<HHBBwduw{s|s3^7|K}l\<,ݧʑL^^^GrHoM  #7iK}Ӡ&q\@+w:yFv_|.YYuLo&Ҭ_xA^[߯ka8`8`8`8`8`8`86m ^Y>GosL2       'TVVP$hpp3n,K~Y}+SN{lڟ2U;h8lUYl 8蠩@[9``[9fV8EftDvhÁÆ64#ط7URSS_$:&a r23e׮ңG#I&ppppp`o;XaWjY>Wϓ; e).qjgX*CFQãe s7)vɂysU16ni/}s*^,wsY`#c;~58an     ,uq[6|C݆wv`EEI%)J$ݷHE5_~^|'8#Gc9K>~"C꽼'O|C7!Z"|Em`:\P%f?:9qB\0;a~iVv& `-q.k;s;ٿ];w@sR"Xdz'1[*y&)>dhaw︫(->w嗕+T˅\b?/_M֭]+钐 Y9_ZD008(9by+44Dn20aTuoDJhbScJ2 RUUT>o&5Y.rIHHl+J_:,4TF?~R(OCV,P~ /~#B5Z*J)/y仕dDP2zPD6w޲~:G~?_M<tSZȅ@qPx䝷RDDt&=9RnÝ\SS#?pdggȕrŗ4>&OQ8+ɿ_|A~scn PWߓoBRVI;Ͽb7aۦڹSo=3#C |7aQrW!- rssG8>O|T?IbnnO<(_}q[J^NBGBI>>R 4~VUKɲICתֶ!kzQI<%Ytl޴Q| zI| IjkwiE<.=?Sƒ$jh/ y\ ^ ,>Xj+ rټ7W.}p:.ApI i~F ' su؅GDJdTL4I~'RTqH{oJS`uXWtNoo)o/wyy$gv?>yMk]%]}Iѐ3vHxP8_V,kA.*flyU-D-C~s,t<믾B8>GRn*yװ]!ϛKbb\{~N qSPP$KjyTfF/ IC>kSs㓽B &_H T[v]U :?J &lڴQlQaS?n^vgTMOl}59'HxHK*"L!kB%0:XKeQ%DHYfY!K7(˦]Ϫk?N!>ۿv@8~bm*u]'8yj52rXjC߇mտ}}5^P_MzS>cyF__{r)W_}%=ٳGtb Mly;ILAz,H%((HRVVvN<Ւ˗K=#aaa xLUJ׬Y#t7AzzP cYi;V}]5o_uU~zyW{ĹϰB{ Jݭ%_T.72aMکb%ίUX'Ok>:Z'uWQa]Y?xQV? >\'v زy@uV6BpT `+y(n-۞%e>~3 ))W)ye~l /BF&Kh? |YUʫiUhG,Y"E $qÂ$. RIߴ-}d@k5L@]/~`.8!')sV~JuTWW$S'8I`gں] W^gEwu];{G}FLݒmʿIeΜOd8bp 3pęj;`~An?AM=#@G??#P0`4;JcB^ϛrǁE0Ƌc=V򊰨tsG޽{e o9/{N?]J)h-QJɿ%,0@Jc[SzJw cocs-`J\tʡEx ϛkUbrYlŪ;5u7&q?鞜Co?qW\T$;7ғO>YzC:du$/ n͙3QXt[Zm,۷oUQX%Mw<؅oƍJ׈mJ8-Dp8\u2=R)úIt0j)K/>1ۙ2c`UזּJJʭm~2 &P."E ymipuu%K@dItUw};R&ijCGy瞧V'Xy5YD&(v!4%L;??ÆPwJ1\kzgdt JTPQѷ6~ 1jPV._Ο͒]믎t7p!Q5uOR^^z,sdl~X8G]cͷ*5uR0 u]pyئ]hL;x)x@Fo`$U ERK )[oZ [AJ #1Y4̗:ݤ +@k1v[sz؊xZmENrP>:㍻p@H W-:Uj\*) swa׮Qbf7$Z^uu#7yĉR Z rHzF++ZU(E`t#D}+_z=!IgwN!ѷmw- h^I^38DJr|tKx-)t*$3RMuo$ >(K-vNXA9_$//D+^X%[>W"zwVp W BQ#kn++ *CU\yE\[${֑玨s9K_\bǷj ҋ/]FT[$6~ƙRTZU:,f%3?_P+XnaS:sc8p(s #=MQNI^2ΑqqJyOХẕҽ{IKۧshG>K7% nAqNiyy~pqIfw|ԟU~lbXn>/-U\0$Sս?].]eQW@ucF5x# p fK+/> ߛGq_宿܇Ni#E* Ψ762z>-Gt}=tG({%;.K>x̓llxD- j)ݹ2(W5+LzDz)\5nyV.[C2g,'O Q+KhPpt1 ŲeWU $r1 #1t _y'Vz ]\!W:ma e*(SOTW\.ʠCt|ȔN;͉7;6?sϝ,s]<_ I2&Mz_:l|7DzpBea;mur{kQo(ƭRi"˽S+2G!~O$.pJ0(wZ(=A\&t=M;f|<{>#ca)}ZL1)f,.9c<&qWq{:\uO[!͌-2-+e%RR_K ?:XR%P }{ͮ%ƥ2n\1H5^t."0XkE?zGD~z|6HCy0KY =|U&`UA^)QD=p_A'|:Spk`pܴl}-7BƻWsSWW)]/DȓIWJzv҃[\|/WveT7|@'1Bt11o)KoOqqLV%e cCeUr{ElW ʅRT(iOݙ 5Qפ>ggb ҽ 5Bp?=p%;bP#c[ntn.~F5WtǝwJqY\71nbcWn5y@:׽$ S^A_~S>hn~ -MPG-šBAJ;)%,(Wө.Ա|KcC%[4*9zGO;Fr`JL"_|z3U=1cXۻWA]"cOD^t5|UJ %&_r[J%k:}/ @H [y ,Ea,jsw0?}uOy<?)=pe:Cu]vsR Mz+Vm~N}1$U5!^w`~y{Wa颋.REm]b: P$/BI-^NӞk>9`z0yr`[Z\R*~2 Q|C0~>^R=ꪡ[/5%/7=!gLQ@a(#\W&wBX@ÄL4`N:6,rCHkϞ4WSsϿ")t%wIJ Fycv¢ѕt|.--Mn?!h䤦]MB2w3s5890ae6}]rUIB kzK()<ӔcʕJ/m^;3% n׺~*"q)?|u $0>!JKz>G\ߛ~BH])WBraV]X'<'^uX8n6pcrƞ{$)z~0ꇑkVՓgK]}v5Qsy/㎗W^yE)2n@ ˬˀO%o_35n'J< !M~Nb{\mOD}x+,Rۧer*PK!Qu2֮`,ND ~hHSn#?俜!г}߭Og}u20YB$( z^|ӼΩxE5R"UՊ4IIK~ZD0Jc9A?Oyᇕ'kLlu=j`K?37)A$!+g r?Ć'n,k2OZW`.4H(SqeQe5%vr7x]^C?&wcJ۷o>*$UW[g~8񤓕OU:}7+Ȩ@! 8e{ p`޽{y+%%E}_̃Ջ.BNwOs=>+a'pǀXmߙ"'KzM7>y4˦J }EeOɮ804cX0RԅuR(\+6rv68-lX6Xņ1-%zaB3Z55;adH=:Ypכ0mi);钑iґ64i mctY$]Һ6:a**FF6f_(ydؤ ~%*+-qRܖB O)iWP9, g}B7m2) S O;H ]~k*ʖgoE] U'fG,: `r 85Xڟy] =sIG?# 'ˮң;j,8 j\YZZ(?\cIK[29#wGTWW*Qq (v<.X2!ÁÁ).*,EZ%[Ny 7Fa|]|{xUO?Q~*^Sɫ!B}H/i=ݒ{]PN%-;WSQOtln/ maA T,B{;X fSשb~zv WP٩&!R$+H10X FZ$l?)E۶m.?X<2zǣ3IUۦmteI6}=y D/O(+QGHo;ӊ^+֟z߯,aM~{RVQ; W-s+I^WdϾQNyj\<:FDIe[RDuw6q4kWse*s{ %rש+Ay+ 9cdGd˱?@o3_mvv==p|A?׬^Ii* u-98?dLc.Q 8hII`q8\N߻@kl./O\%{v ^ns" NI؉**|6h`ә߆ ю<E翨2H汏rkb̃@FzTڴe I&ٰiZu Qڹ\~X\)J7"&KrLrjC=K13L OX*JeRCƲ⦠ӥ]r[P)!e WV/*c!Am:TQ@@_g m::08"L#~Q'Mq# e ҿca:SG8=+/Vq7{P BWE% n:v%hgQAR1C{ l00?/Wxd5H!XKq(7Ii-O( q>8eY7\uMU)keWjk+d[j,E&5gD#*RՁq2Oh6-ӎr9}-#^^|ÎdH_MK3FOP8OХʯ,C} 6L$ˑuW;= Gǩ;o6ƍ0>jh\uRnH](KZAdA 5y:Oj:묳${"X\戃of]b6;tDp1VSܴ{E?͇`$Ià<[( :vRZ;r˭?ݣ7"{Evnp N2)*5ejJ$P9O9lݲgJWt<&vX?7 ] 8mtby྿ͷߡN?qSJ8rc8pq`S>w JHXSX/RuZN?Q~֭ 8x՛Z<8Fsk &ԩS%1>Zg8 !S.QU$ NX_,>n@= 3<yN>hOdpH~t:DK:eίa24AgKWaQN+]x8]/`E?WB6Y h ww#4?=o)J둇`iw)D %j3L􆛗.Ly5pk{AT5{g)lfE`ߑY9R9Z0C%oT P$})cuc7upOKGj|Z. O? fg@5`at2L2^>u&ρ)@SwH«|[0}4=鷛n{gyc1쏄<އ?up]P~ykJ+ַCիVՎyo;IMnռ]/>XNz?1>c1L` 08PH )<0FipWخȐx N>:.jW n ,~_}sfu+VIM=ɜ9J阕FO!j71i:JphDp8dw=v[=6Gp(sOub q!NǠTl| QO>/عW^TS-A<:|݅Sorw cX)FE hx|(rӧO_SRY`:2%:>A)2 ]aEE~w:'S]'^1zԜ<6J>K_ٍ]/p-]TN>e[ 4"uA 1BYdA8<&5k9y)Ŏt_?ٖ4ͥ+oB; H[.YjujH=\y򩧤9(] M4 r9uJ0q)v(%#Q';PuTthEH0:8SǎsvjF&VZ6գqq=N嵍sWsz-[gan/_An+g $0@LPt`?"B%6-&?)A(a .R;ёcyD?T"RNXBa+JN5Rq0Lc vov̄hI '>S^if9+vĖimi 7F~ zhޓko5t%c% +Z'fxaĠX8ޗw#n&wwzfӶkn` nE02ټ3q^wE$J:1V/0_hAN ֺm!a͙:8ؒ6]qNTG.jM1юzuYyw>S}Yƹ#B:]ء(}0oá3i ڣNq]tN\ed h"x"'dw XAWXz,>h>F HC#I.6籤ECp@ZmNw/}{:c\jb{KFT\p\yO$ 'y m5WP)<4as&w痻Uk0Ár 0'&2p&ZӖkW8DFiM2asQFi'#M^?\m`\dx˱x:/ls"ǿS{4ppppph pp9@C(ͨe7hk8`8`8`8`phim 3000088`Lm       :;Bejk8`8`8`8`8`8`8agb2000000008t8:ppppppp1m;F렽C;In8`8`8`8`8`8`8`8p(qHej8`8`8`8`8`8`8 0n`:& ÁCFx(-SWÁNvMPz[#&,       % L]       :vB.& ÁCFxȼ*SQÁ>\     uuRTR"]/YyRVQ.RS[e嚌[怯Jp`GH\dDDIxhxr6ߖfboʾ eśZBsd;qCIDqzvo 2)]nl$GBo3m40008te1|eJ;׀vIt >Ac &_cX,6qh+lKz4::5S ׭-ڒܞ|t}ݥ=T[Xfalڲښ臍RO{T 8_ʊyYaq.o@I`XGƉ_.mOLDbϪM.cq)e5A9rm2O/5 rtZk+wi^g}y)5g8:jUѹm&,m\/sm/C0\u{k$>%n|=X~0oa5W~uIN(u58 EROE# [BcTքxo$'={v 'wY|eٛ  xXEE%~רISNzr?qQvP< OR^^. y2-I#zJ8_*"_( Th<G]PyJpkЎj (P%~V~̛yuuYF|_UUURZZS PPPo l?R 3 p7' %V^'K*})`L}*>p d$]U@+9_EAܚ=%W)@, PGp`XsrhLB 7$ T"~fVJ @#YIide8--m?NPB9T STT,%%Wl{dD;:l.C`?\8kttxNs0TÆ[(#@o-M(E[xIxB/=T:8>¾}&a7K*[Đ?J^i%> #p/`~xXҪrW\R hm RH C)7ȿ "QC$['n*oJ7BL2y*+Gԗ@HBU} By0-q(&Ny)n~(M~ VעId~qsmj8je~)%  x)ꙗ#YyŲ;=Wv˖wY 8Q1=)J޷܊ V:bXMV]_tK-jh80}ޛxa)i8(W]A@ZZ? /"GΚ2RKVC麮ݞZx` ~tm-XSq󁭘)]q ='K]⻩o5l!K[[)e$ nīoYkKqH'3PrBNg,5ô8>:L7aXo9wXx*yej4 Ϙ$/}LI)Szbu]lyswqY~IԣGȪMw*`G O6tAaodd{;#OVXuq*}s}uM^WV_u=ډɞVauyÛ}36.X-`Y݆վ`,ȨL=ZZ!ct}ھ1AqWtLQz eU[Or@@8.p9j3؏DIY1)jyH$Ы)mgKy" : 6ʕnԣgbr#P n(:ioEm#0mDe5Kp]JWHn/2UYe3Hxe;XN`8ĶSyl ˿#Cd{clz*@V?tPyYaddJ  t}߼ĸ ǟU" 5 Rgl :g}K:v,ۘ* O n9X1:A}?1&\n:oX4F,u5rGvFY7xKoG2\#VYKc (5%KqHBsHkJ?E/-ihI͗V4UUM.ieoLUԟ?e`k΋t^T3)rwWTf5-־[9'NSO~X6@8OQ[} Bbeq^ !po)աkA|(`֩7Si23<Z3?˼hDIDJ=yusͽC)~ݛd^J{AVȲG:*w5K7u**WDe{]<]"CS@A et, t>ͥe枻TénmIOK;K5cZyn8`8P_1Q?fɾ"vy%,+XGfeg+W= Mj= `bdfqPFYeڞÏaҰ .IaRXiGP9*b5"?Sz<4iO-*lKCڕܮ5 FH\%T2acF۪K1^JyQj_PǑRq2WdvQ3`JuV )?$ttY[Br-w $@<%)P/eu H(uݙ0.,QmvptT42U=.דgbJF?-zlܕzf;"2!UT[AǞ> tsf4?Np>Axe%iYtA3.P%ǎH imP۫!=Q0!^*-M充tŎ= *?ϑ++VCڟ< mqVN\/#WRd$6a 0888 D0g`rl\b`*""HϜ6T|GA=%lek}&SH)kII0Z)?ry K*]VVIR/Rz+N4F+*eMȾ%ɣd %zh#}UUc7% hWN.?c\{TGɖqO {|U忐}p6~!B䥻TF9Ll?-WFHpy%QYi#h ePo Y(cn+Ӂ9:ڪp̄)0КěkXq;|.;!FzCui!/,cŸ)KFG)/@2/T.,1,A L8r$-ԫcZklQ ̣l]}6kd?e)RTU/{H|tV}}ixCk;b;&Ávps8q(Aߏ[oy(&5`>d:hGgLmU!nq5rq $z3IOoa[/QFH0qqrrϿVt\ó2| $&y HIqo[99χj:aVoi**KlY{&~4*H$++ AWZ0h)$8TX T c A G #AaC`Nbte pA7q|O)UlRߑ}z!HYYzM DٗMw&iܙy  :42%N92$#3KI~XIʫS6핍)YǡrDz\d/(PR#Ug;33[Q_?6"Q }!JX&TJjQӟJ :BnN Ai|3zR:-Qۭ8 Rlr ),SyըxNf~x\bY-y(;[+Yq6| \U/Pg˲وC[ }G!Y&@gs ҦLU".;ni,#pNV~Z2鱺to!_ TQR"N|ݬyzX^YjB>$ |PEpWJ%R*~6kC2Hڑ'lR[9i9h9_TV䭙ǚzIk% K).@~zUuKv nr~t\ B7|=01VAuµ'(*_}[gɤ!}$&rrc-@R}"njg lW&z˝ΔqKYNx?BG+|Hʱ)N="w?CJĂ, |#U=;3y(?;FXʾʻ tG30  dH8 $Fʘ=~8>ئ@i\{pӦ` ']̜2IG|t|jl߮"Y9M1LMpu ?iw`BelYs G4?L=2p<0?:;Fگ[ʅ -VyΰmR?:vRMb 5k ǎ䫇o{J_>Wnl엃z& =uc{H {?]rf8͘$c'OQm9J4Y?]x\}dѕӧ[]VPE+gӃ "Vl$.WYZc[U~wa4>֤ QSrNԫr66*2kj7C6t'M祬K2Ͱ]C7r͗Ҳ! V)VG:w][[@o'O"ntAK@-q%5Po p`Opz-I-7ix䣠^6}`2$x~ʝiI%rwO]ęK)|\|GcQD z\=zW3DAw9Yy `d8p8 ]vQE+/)h:vη^p\׷ yʑ)2o>a˙SR@+-b4.WDBp" s+[^&Pg5A=+'1cC ܝՒb&`tܾ=YE55[EL[Iat Ӣ5-(fD7nhrmxh[zu>RXZ!48*/2juڼ)jr (RYá|ulo7^aC$VHs [KKE]u䖢9rۖVw}_Z< 7\9}#/8^kq'YA_}2c"W?XN&OomW ?Eq/x ?ޟ^Us,e܄@ ~>N[zU Hfa⠭~)Jrm8Q[vZ1 dڈdIZGF׋6~[immY74쑟)Q-V~pub ~EegP,i'野t/bM: [FBBvc\IqM )`,t}t`SZWK?E) )qT/C;:θ4;Bo xȜ[䦳Lw4bKkqERJWP kfԗSa]U&$pq'NhdvoHP8AGe—jamo64o:w\6(ox,U6n۶73Obcc&㐸LK%ȑ@A%O=*uq1Da֕ۯ! URAO4iSG?Nòe()͑NrЙtGEPNIG'[}+=O YPqY17dfj9zh_#e[9㫱p o@`^P2Ģ0 0ޱ %4h*{@B-jNqWR.3a!$˖vAY& 2 $$ݺʎ2pcpʓs0{d,X t s ]NǴVt{j;V.p ۧpxMGo9G=bN vS `>9oR:ö)}hvyNFl.Vnډd8ԁ{I Fť}iCS# ,q|`Y.PyRײT+%ڮC>I>G )#z:vߞ&<9GJ ie;%pR?=tMSU{}g$+֥2?{&yE >iR4\0l씚]~E tj,*\Eh.Iۨ`}wV=ӒkJaϑWmQ9(`gRga;:OhP S>?%dRߞ*oBoXXH$(GكpB%/OE:?8` e]͖ncx7<BKaGى-/GMH $ֻmɐjkf2`~;n]P$Vctqig:B螄䭡@ܱzod 9RL$X[d4ݒ$G8]hΟD1=l3p -PCC>)Een8@R}%jxw8.%#NY,a5c7Nl:'A^G:QrExXIݽcpw w˷V9%'ʬS9xWD5-RЊxK&~f/O+@ a_CLXr'C aJp ФD\RsJ/@gXhENIHTՑmpaF(MT9ᮗ$ 0TqѿaFU8&=('Om\2-ٗ::?ήpp8' 鎕3鲂2fi^Y5mqaT{4T'ӓιp,C%{8d}/ j1 %~~8xN vwHKM$p POw7Fp@Qb[$ "r=/o7/1B}zkk}q\ 2HD[X&pKBpeF ˚J;aPߒ  r)ǶicJ6&%%$PLs+N_J6d{AR+C{۳=4j ޗ&RۘZ$lOQld|KB8lF tS5׬w]νOݡ*XK(#na6U Fg-;gJ3I-aT/ԧZ]ӆ+(<)=eb ZyfdwTx*_gՎ+}=5I  0_J \9HqwJrl۹!Mݔpۄ$2X.WsV$vyى.+M~b%$|vsN+'L"r0ͽ!ݣxPg Ntַݙ6|I5Rm滠Nw8uu^r g?sH'^gKwY,ԅFlK8?5~ /礸|sS^=\{{wFW!<+gb2T-\)~ gQЃ uy:|},#$~cA?~,f:s'T>]UΙ2H1~`OYi;?X:izwj}ľd$Q@9-:Nc8ڲc\czW˔b(Rc?mΙ Wc]86dHp?۝sgI,]S2ȟKs}$jc%;–l >ȸa<:-0g^>2&b}%nC IDAT: Ůrn&2I/w\ . `5iy*S}߭4f1 w_0I"C9Ej)/]azMK%,sI)Μm aJ s  qD-0wx!a=Yv 0#'΋iTvT@z@Z︁/;ꈾw]D7f_F4m v`7[/oâ;Qr[ WWRGr-yIt)8ȸ1bi 1' 򂾊< [veC?ΩH`՗]tNt]ޔ)te7lJWI1R&Wvl0Lp/)ʷ_9,hwc8 8Rʸ7XG]Yn>{<>N@1w럂3ydoe9Ϻ௎J1&HZ߻^Y66tLi]X#K,uߘhlBgQTN 4 \(II*m}syvwdn\9w!Mܫ]ӧP {}} T;nz{.# \In|R9Eܸ;:?kVLGEZ\:3fnA2&sZ Ww~o6=h"59\zᶗXTYK,ע9BƑtgcmh^795ϧp>ѧs [ȍ2USUQ=ps43-£ًڮс #kǷaKx޽xH+x'\~fɏpwNnga¾TSZw 89@k3? GƏk⇳"=h5_c N_g~׋y 'kࡽhSvv\^s=7?z@;},΃r6> g8Q }2Eako>0GÅǛuW]x$)9O}=KS׼lݚ,a e<Mo|C/|1 :}Ҷe+k_Ou&ǤxS̩q͚xp4nթgp]reG.7Ḁ)f> 3˗ U˚z]#N|pKِ5 K/";;l;[l?q9M C@9ݷsgpQ#:'Q3Mm^y4pG3ՎV/oJ<VY +²+.4? =/%Kwnp,6ߎ7(m۵)- wNv[^SzRgpc~mx!9xOŃţ'Xz`sמ~փpgp:xD:q2{6\r(dgC|f#^|i_~mea@}eNUwwYugp0cw G ;n 5h÷WŇ$/!q J5µJf6 پ5>`ۜ/!N2΀3 8@d`]|X/1|1Vntnk0p@|{oWv]o'"u2c;΀3 8x-ފoi<@~d=bGtzo$;3 8΀3>yՋn_}Q'G#ݱahO`xfǡfvawgp00 ^.S~hz:>k|q GbU s8΀3 8`_ƍWlX1@9[л!aρ7;>\% w|=GwNj瀧m 8΀3 aw.O}iә',_"uo؁pȾ7ʾtÕ/)tǷT߭==oυ 8΀30hM_'<ⷿ?kNw[,ώ κyD<{@|@qjoъpϋo W#C @87U}W eugpg`ʾYo?3|GxĈnY0oqΝ]7D!L[.;^;<+{}X 3uṖ>?MSpg8XnX$>yn蓧NM;wy,!Z/6\~m|Xw.Ѱc$NM ЎKqg !#@sÕn>9cp@D|P<4e//Y0?yAlý/ kgْupμ۷jz1e)sgpgs 9>ɮ \d~_4?튧ϵ_Թ\+Cyʮ"H;΀3 8`7gOwל5Hut5cph>f3u7orgp004z23P'Btgpgp@zF?^3 8΀3 83Gkgpg #3@pgpg^`|:3 8΀3 83pE^3 8΀3 82Gќgpg y΀3 8΀3 ˀOGsgpg`3гk_ 8΀3 8΀3P~>.pgpY۷| 2gΜm!AbSve*^*^X^v}j|:V|k_֮UROSͧviNF1:Z|qk}OaӜ2/^ctl[&34ڑ֧9Ye^k=%Mfi>#Os6ʼxѱzKlX|jG[dmy=8hfnsC/K=s6RˮkU'yx~~Oojãl!]cʍXR55Y^ _yxkqݔ_v=e5_:9C%{JtS{}`a>kiԄLj|_ko<< ^k)k<15eJY_ڠk|_OLqYƵyxW6WSp\֟qdz Ƨծ<g\+g}^k)k<15eJY_ڠk|_OLqYƵyxW6WSp\֟qdz Ƨծ<g\+g}^k)k<15egeSh ЋhcR);(ny̵Կ*AEl-)X~Oy̵0߯VV^இa@$+);ɥ1nb->uJ[=_\?~;o}ʛ y)Rb->uJ[=_\?~;o}ʛ y)Rb->uJ[=_\?~;o}ʛ y)Rb->uJ[=_\?~;o}ʛ y)Rb->uJ[=_\?~;o}ʛ~@R"4>Ç/6J'VQʀk>a{;|R5_ʎ|ĂkcGZY+k]7B _Zڵ>VJ|); nvk}gRv#tX %VWk=j`oZ)5^G,躱Jح:zԮRjKّXuc-[]u]냽>kx͗#Z(aXQ{;|J/eG>bA׍Pnuױ֣vvR5_ʎ|Ăms=w)7 &3eR){Կnx)]Sv\7~Y^v_7~Yʮ);,^?e/^,^?e׍_/埲]׍_/埲zʎ/OˮW/#Z >lgFC 0L):f]k}jR?e|UǬxVW|ObQj욯uQꊯ]C,JW]U.JY]>zEꟲkcE <+֧v](5^SvWu̺(guԮ!ƫʮY%Zu=ĢxO5_1_SX):f]k}jR?e|E"𩻀xU㋮~u竊W5**Wj|uӯ|Us]EeU/n՝*^x;_UEMUūuu竊W5WwxU㱮M @Т2U@^4?q(|QCxOJE+^^4?q(^x){<+ġz9_T*EЯ,R|QCxOJE+^^4?q(^x){<+ġz9_T*EЯ,R|QCxOʬ^\ ydձi>%e0>W7֟k=_w}n|?5zԿ4_ZjiXQ|uk֣uקScGOՍZ]_O>W7֏qۛ@46@W]jXծQƫʮx:x:V|zԮꟲ++_k슧cWG)jXծQƫʮx:x:V|zԮꟲ++_k슧cWG)jXծQƫʮx:F|5U5tˮt/zOzORˮ*tˮt/zOzORˮ*tˮt/z`^$a;VSv9_5]mSaZXcU߮UjT]WoWTت_5~*.GƷm*lU?5v!)9?C N:6-m VoXfncN:uK[[>VncN{`Vyok:6^5XUcuۚN:6-m VoXfncN:uK[[>VncN{`Vyok:6^5XUcuۚN:6-m VoXfncN:uKP T< bHu?y}&?PLqV!iҮ\]iҮ\]iҮ\]iҮ\]iҮ\]iҮ\]iҮ\]iҮ\]iҮ\]iϓ`|pgpg.JvV+*W]ˡ^ofܮPf]gUnlr(ۮwE*kz9mlٴ"?8-pgph{Оgz y3iVVxiuUZ_]cӅokz](aubZz+6ի2bZvWt^W=csX]&;Vog}ʿaV]59>]UVWɎ-[Y/2G>΀3 8΀3 C t̚ iub9>`a1N<;guڧZ>:,ՉgNTK['[Ű:ijikdV':S-m VlijsV}ꓭbXxvO5X}uX YOau9>`a1N<;guڧZ7$.fOu>>}7]ȅB(RoCg?k>Co;jlc^+ۜV]_%$ ,x:N˼)TǼeOǩz2?l8U/RRZRW<e^ʼM5Aq=j| =U_ʞ_5>_՞/eO¯jO՗WOWKSƧSUSURT)T}){*~U{=j| =U_ʞ_5>ζmN:iBk8ȘتiNW{*_xͧcOգ*_xͧcOգ*_xͧcOգ*_xͧcOգ*_xͧcOգ*_xͧcOգ*_xͧ!{ IDATcOգ*_xͧcOգ*_xͧcOգ?#%(ewz'eR)uz'eR)uz'eR)uz'eR)uz'eR)uz'eR)uz'eR)uz'eR)uz'eR)即@شҀ:*fuڿεzNuڿεzNuڿεzNuڿεzNuڿεz)I9 W5߯@t?ӿ￙^S53R:V<]WWͧZOlOxW~+S4^_kԸj>|eW?5O5_lOxW~+S4^_kԸj>|eW?5O5_lOTAyvq+y2vXe>ĆZ|mx+cmeSk=iծXQONl芯ݖWbi>FY6>;+v[*^튥Xe>ĆZ|mx+cmeSk=iծXQONl芯ݖWbi>FY6>;+v[*^튥Xe>ĆZ|mx+cmys<=o ?6fZ/sRSVvM1"v|6q$})5)H=68ŦN0zܑV7)ac[lZcs$3Jbҟ󔜧dv#}![lꔌ/c峱k%K8O8E1a -6uJA)(uAYd Vxvij6+(>)5^OvS#)VXGMx:x+MƊ>OlJWӱƫ]_gm7V)5^OvS#)M )DJ8ʔ?pVF η%c!YsĦQK_RS6qZ(9OxZ(S/sX) ]sN8f-TzԮꟲwOu]ףvWxcOkS|k}j]?ek:H2@튇1|U]q:%nJ]_|sH?jgTIb'{~ߺqS%{OOyu?,}v8֖8bQ/wT<1)CYy8y>vH>El 8EÎCimyz|:ex8EÎCimyz|:ex8EÎCimyz|:ex8EÎCimyz|:ex8EÎCimyz|:ex8EÎCimyz|:ex8EÎCimyz|:ex8EÎCimyz|:ex8M 4`vN [>"x xʑWţNQ{<ֆXW<k[<ꔊ)O6` _뇿ţNQ{<ֆXW<k[<ꔊ)O6` _뇿ţNQ{<ֆXW<k[<ꔊ)O6` _뇿ţNQ{<ֆXW<k[<ꔊ)O6` _뇿ţNQ{<ֆXW3dFPtj/;ւSe֣?5.jW|'rTf|-_*ƧSX]՞OSc͗/ʯvW{>O5_ *_?5|)jW|SX]՞OSc͗/럗?; lcgHv OxO"uH&͏T}j7ʧx\7e:$VfG>LMxWɱ٤O&4SS4^,O`QlHէv|uSCrle6i~S T>W)X!924?R݄fj*ƫqݔE,[MnB35O_n"uH&͏T}j7ʧx\7e9`لZ@q/_v|ezʎ;,~YUN+__Sv|e]w:_YN+_ֿzտw:_Ye׫WZ`ÎS)ŪC/֘OlZ_*>eWk}]+Svū:.֗OlZ_*>eWk}]+Svū:.֗Oȸ NƇzP=ʟqauk>s<%m%6:d?ZIcuk>sAV-o>V/s3|C31VsAV-o>V/s3|C31VsAV-o>V/s3|C31VsAV-o>V/s3|C31VsAV-oO@LpnNiSؿ|@?;_m/;)iW °AZ]Zm[ۚNauSbZUaV:oc~ۚNŰ:)i1*z+1VW?mMVbXVogsXǶ&n1N{JZL9_mՏc[iV=%-[Vo6DZ[ Ӟlycudu-iOIiVq6[뼍qlk:괧Ŵz8uX]85YvauSbZUaV:oc~ۚNŰ:yGQ e1YT_㫎_j|_j|_j|_j|_", 8r ~'߿O-?w:N7?tVOlV/VOnluګJ[ի2bZkz*d)?iTvV5Y*.-iOIfmMV/VOnluګJ[ի2bZkz*d)?iTvV5Y*.-iOIfmMV/VOnluګJ[ի2ȥ3 8΀3 8a&SvJmlbѳˮeV`lbѳˮeV`lbѳˮeV`lbѳˮeV`lbѳˮve٫ĹܹVkZ)gVqCg %c>7\^ݴØIseS&5)럗s&͕]OYּZʮ^Ι4Wv=egZj)y9g\굲:>h)QRf׈9Yak?kJcO^Tlw>~moa~.]cfF @?,f-o1V2ٶm,KIPMxsԩSlod6΀3 8΀3 T«o{^XdAVbwww=%Ai9^KRG&F66~SOmǶ bnpƋ ׄ5E؁wwCDߜgpg$cWNx@رwOضs{ؼmk=9߸acxϫn /Yhzzz#lFM kƸ~ [^C9g֭[%+`l" >hN<Np}=^ڷ4zM+ k懾.[ 8΀3 8@G82t292{>9yw_uaܮ m0>J6CbS{6G^|#m2S l, dG#¯gHzM/ 7ax3<>r*^7OS?{fupgpz‚ޮ((qmܹsQA{0Eg>HtP4i PO4|A?a|ĩkfxnsa钾ڗ.YO.it2n=8x2 Х3 8΀3 8%='^mѰyמ_b8|HpÅCo-ϙ<~"c|~v =ϿpN}9$?<t˿ه#+o|%ӽ1&;?9΀3 8΀30XH< α?tv^r zya_Whqgp?/kQç?٬O-ܕQ@ cblXb쫴?Kفa7w1HCM@&,6sog5[6@7wdgpge A/ `C=}0f%tYv괫O3Ulct`rbq9k;`tgpg\acO=>o +5NGoB5ٍy]aF02V68y*7Ƈ97gpg AσS~7B~ :2ϲsV]%ar0G>);q /Bݾ~\Tqpgps<}zϝ׆3N`GQZ;y7чs*hԙ!-8b>S}y/(5o9΀3 8΀3p369ġBčX^o9ۃެU@a%ugpg8@̖g#}= wCAOycleGVoe JA#\V,[AW΀3 8΀3 y,6xK cdٟQ]}tl],6!mcA_|j bqn'q]:΀3 8΀3p.2ۓb&dތgG(3~y2>?: {rڥ3 8΀3 8<} Ģs̆ >.`4dN'괫D 笎9|X~tRcÈM Wߔ, *Ě>K9P6"Xw#q*bō"iʧ-x<יz\^u<8[c#/F|^3 8΀30 Χ?[Kj4n8]|>l* `|VԿgR^ F IDATqԩSahD8'9{eOOO?AXpQ;76fkahFF;Ԃ |Z|uhx8qb0֎y¢EccSԩ7o^XhIDL7]ĺ&gpj [7?pj@9h( xGCgӆP7uȼ YhAQnuGlߵ9V4f{ !:{|يn׷4[?flwhֈ\:Y.DOghx(?7߷7uu>ӳ2=f߿1"=cqxh8;2K"tO;:Gdq9y]g|sg87iMP?2u-/G:kA#d6v c GNө _ȿ/|/?.406M57-?kτO~qm w4}=-?Hx}#GY)eG>wdI_v9N_ 8΀3p0k]?=o K=4ȅ\sKNVˋi1rpJgsqZGŽţ~b-?{v /nPuhm qR[עrD,cy->7pAefh)J4t 7M7ܵɚ)5gp{`3˚+/Z=o ?D}6̈zR¿@Q+?f=k_\[-i~ׄ}K7כ;GNS'O8_z艧q47<J$clkӸWȍ#0w*]G;8{&blNߟqGœ՝Ӻ;΀3 tC,G~֯Zvɢu'":[r ։k)9ǿe:3'x#;SY$q S3a9gdpفW|EΧ7 =S\lKv\޺RPڑsf|pv~{s sǂpfY5w ec4T[wE.>r侀uܩ<O;v\shʚ>͛ ;׸+kѠ'"`n#杁Y0>}^=|CGA7̠jiNdsI\qg2vo CǏoc7q$͜.$PE'^wT>Vϛka?粉c` @d Du/ѿ~Y_ršwY#06;3ք^#]-`fVD]ÇǛM;pq'nKACGFVz<4oظ# m=spNlƆ X_߲|yc鲈=?2հg,^kECcǶ suYMhccsBECSxϢ4v\S/3 8@g8\SPbp$WW??xK<jd(jGao)Cl5=H<0;Gpscl̷o@>zNFD<*u4櫚>`۟!|k˱7]a7|0mѼagmhM1`_ػww K#Wo \u=S#g83MHfGxv;xWj.Y"r灁CÃƱw4Z4 q$0'D^1Qݻwq !u+kV W/ N]1۳o8x\oe3 8S;Qt|%y˵!8{k׿RGQ=3~U^fI@6rp&`,;2A~㊰l¦rg^o|x?=0O7: `S 9 <|*6|W8*:i;_'_vK/Fg¦;㾃ysx._Wv$ؾ=o]_y{̅ZÞCG'W_alee]!{ΚZ{w>ph߁āo6J׉m<-?~'|cB5w /gpgA>58kja{OTZ-oCKɾubЗ P$>IerLR У86U:ނӄ85ۯkJ{lh$<8|57]|veysbq">oq\ÇV2}&ldSCa۶H-gԫngp{Owhqq<w>o=76RhOkï ɕke ]_~_ή_$[$7fi<ď%CCR5oY+7|~_{h{vm"7gpexl;>~>~%~7zt0 F-7tdF[LT+uJn6Gv'H'PsvkgLq7%ķt-ʎ&>?a7GLJOƣv=Go|Y7ͮQ"_~m?/Ib7aMٗH#)Ö_rNSu'"/}v ܩ kH7Nh>stk- ] -|MQRFg_ys~ç{üxUK:\,֝/({7l?W7s LxbpvcHy=',O}/Q;w /lUxˮnj_}4pg ˲h2ۑ} #aّ{[藺1$icE 9תD=;fБ֗*9n)9?4^v,b~O~=.[2\l^vB'1Z {;^|݇gMۏ}kg<۔iyg^yS/{ݸ3@x'ÖφmG 7WƱ;z~tI߷uc;x_wwW[݄ ny6|&l޺){?`KuHeygGgp3׿UَO>x&&?v*WZK.I=aXb%@`$PA_Hr./~97C sFm.v@|lo<=;PhZ/ xCvׂkK4`)JٹzGFq_t gxԮ+ w\2[z7?{6[7ᛏoh7>eEZaq|$1Wٚ[_!>,x?[]٩{t#rpg dLáS}Wowʫ.;$H|2/]M7~I6oQh<ʅuw?|\O<=/r5a5a,Y6 j [zlS^̋<oZYVZVX6 8΀3P3]Sd74il_4O'SNm]ANav9i12C50m je qAIL?ox/j~<a4/ }xfْHaOGnp:V|>9w6U'r_|( w-M dmnw5o7\Q[<ǿ`G# 4pe;ހy2^> ߯m?~uxzd ~!,{+ʼ8k&Т9R_*^S9FhX.V- ϿhրW}pEstt9+_ye᏾d3Κf8\@<(q34}Y.[vk1pJ^uj3,=owxk>vg\c`^<3|peeGđ @-J?ȅV֒꿈 Mf"J H%V>vXgjp$xo|ݛnxB^-N-2k'&?88k?v[}Kn2qaU_}y,~ݯ ?`6N:p2|qWŷlw2;^~åsּWķ{^~36{88;΀3 +ϕ̎7o S[Gt.K9PFje{0d7p'2ٍV,^q8 וݿ}aFU~YV 'MloYpseqXlp)pR^qE?>?oΝ!<*^w.^G|PM K-qjwB8S###ww o1K"l kbKW/p4v!dj}2sgO(8wmko*wg2 N(9c9^y}$})t ]0lZ(C CX;I9?ݿ?:~͗ڲ늽4rτ\3..I|dk6 i 3sǶ=|JwmlZ$78oܰ2>(z{7n:o(N5n^45Y;ߵ= |"y`ⵌۮ997 "| 8΀30u dj[(x?K7 Vdύಹcd瘗dXQ{ۛ@b7Mhmе iu1jul8j;.|6l?r2x$8h;ݬ0tM1*ၭGÛo3ֻ;>r?qkVͧfoW]$w^dܱ5EQ' ac_ȩ{&BQ֞9ca Y>)絷\0~_XƵ}ony:EWg5Sx Nittr 8΀31]pY|XdaˉP>駒jf{+$lجƴїsE6e Z &6@ӏy(1?Up7wskߑSo;?kX;%֎mW8fx=O7QĻcQOf9\ᦁ5'Ê i?u[s1v'v_W^߿7ޡ{_68ޭNp|E/Z8xqq񪥋/GHV{Ka]sgKV_z<F'>aB}3x}6l׻pI@ Gm :{*J@76JRNXX"( iugd]XK(,w!a"tn4A-6}h@S׿>~!;r &E,rc5v)̱@';R& G6Ԑ?vYs;>8 GruӍcA7 k7ߍ{//*ƣ_ЌS[gG5wǛmGZsW][zW<nzMu~K>GO ш6;89/K?gp:_s ܗ̃7|*kr:@\ӾOo- 5L^h?eY+00Z7BgJY=sLf,35ۜlOH6iZ:)xt`v6+7].lX=8h#z㵁f5v>EA7,xFN~~|_ 0zcgڱ~΋úᏇL?G'bm߽!>lyaK'G9_l^C>y> 8΀3P7K]voȮ{Ͽae#7|䞊 >Ek/$>#bCZ]`}u-Mέ] :5$ک6_KDz"8f}qC5Ì`k⶗0n#4v<ʕ56o7s;|ŗ-XkvH3h}slx,| vUx5u;׌l>'{o5'㼚˿?g˖-0p`xV.{~1|k~,O3sYu†x4p]plh4l?4v CܟڕqQowذl~X7O뎆G#aUqqU6 IDAT=aIaw\ӆ5}ŠEs' ,cGŽCCN7M`>pgRVmU uo+\k^Wc'˚e7:C#\*ɦA!'/;he dzxf5l;G7#E6 FL܊bţ|GNe(3l46kEs6Gpg !xÝa#:8zpxǛiU,Kï&" , w 8΀3 8@x>0ksʽ?^g:$fzoދ .=Š7R$ 7f1V9gpgpR A[{Maɪ a3?|J|\~}X47j-jgci)M yK%+jo΀3 8΀3 b`5[^}.w.h&tEXshz lFG8mVA> 8΀3 8t3o3_3:xpo|u0rHoo†sc{  OwoDp㔜 L}Inwgp .Xz7\v~b{{9΀3 8΀3p00Gsf_8΀3 8,a9c >Ke:΀3 8΀30=Ջ.PϞ wP`ԭŦ%lV;΀3 8΀3 ^z#R¿2Lźpgpg`"<8if,GbsH18 8΀3 8< ^thf: :QH}v` 8΀3 8΀3π=Ʊу:3 F9Dydǥ3 8΀3 o [?m:+gQ>$0d:}S\wgpg|d'p9n+6}ykz #unØ6[:T@gcqYN3 8΀3 8l(;tbSkz43T/?(aNi]wgpg|c}%z$~t ucӏ2 M6_Mh٬ IJ3 8΀3 o QXsڟ)lKf"JAbKyح/apgpHyOv>anymOk g}a;+΀3 8΀3  Gx9bfG9ȓMZC9BZMgpg8=t4:s0vͮ,eڢL JILvXn~ p 8΀3 8bdcQc)bo{@]?8;΀3 8΀3p>2`{+M=tcmfuεm:d@8O@s(‚7gpgpeQb ފ -@NH*gpgp=fhs͛7?Tt:jccc'O|FGGH/t:΀3 8΀3p~1pر00wzzzBwwwA_A̱;!#)T&n tgpg ^%)s1cزFtc$iuw7ڡ΀3 8΀3 V~M‰CrOIJ0]:΀3 8΀3 3މ2կяHVǸUp0FlИmo^9JDPX;΀3 8΀3p>2^ }?Q/θV8= CW@;)pgpXyo5HtRp!Nx>vgpg|b="Jkc?fXUG)`Jh}kspgpgmؠ^:?k}0 04(SāϒgpgpS#IP?9h97fcF z^BNi}3 8΀3 8;Nl?U#lF yAm6!9΀3 8΀3P#G;vݻwpر0::AΝ;7,^8k׆ 6*jeDi'q2/1m,F?mA)@[T,;΀3 8?{nWQ!$FB - ) ]DlO *X"XQ@@EE Pi(UB @z%~sמ){yYkϬY3=~ϴ8A1sp]w9sTZlYX`ApaaҤIίJ'`#ބ$,(MX,OW yie<_Pꂬ/GpGBG _}a:uj2eJ0aB=^Kq $ի*x6ҭOc(F:ypGpGR~/ҰV[%"8xpݾ)3wbIZOyij.i}d_JeQY8[`~16/q#8#<3. ˓}dx C89I< e7S eI i #AJϥA8#8@3@ SKʠv2~'kcu8+=z%A:U8P\~׹0vu09aV\I4o0fa 7X?bmW*/P[-\R8gUa*j ѩKGp>Dv?k{;PexpQz^I&,kT AM#_LNO/]~?_ႸRnj7C7*+ҏ}GEVӷpJ=<]Z+g6xR|1tu#8@Sأa_wawYsUW(2wmVl3gKá\z>Vv6z+ 9lTU iu[q)rXE_0|{? D|=]gtf NK9{M*3L:$MCuSLawS,zk;e}5^# f|7."Ho^WH eN8W-,gzIyۗLsɤ dف Q>IKGZ8u~t/5]Mwh+=p*v}^#c5;yX̱{tQv;ҜoQwšHV2 Eph`mW:o|kϾj"׵P28#8]F`ڴiMMU=3\wu{2+MœěHWmD*IH鍤#(___0,\T\Q@l^˔C '|*<#ar?pӫh&oYl[^] 5;l;fa\<.RV]ؗV=O+zdV?nlxvV w,RckfXo2zay%".|Mzy[?fF\~׊2'm<1~j|GCn̘n-'K9"P6ި^nƷ8#n߹s6 rGofmV?\p-Rқ3ğȗE∓nlnes^wrRW@AZ]>*/%D*#'4epo.d{xRSO!ˮ:'aȐM}T oÒb벰-AV&xS8K_E64sӰWO93}̔vp]X+gZ8x}o<$Bדopuy=":O1qaM˞}6}1nG6>oz[88_'nAtHmo<85kn)|Ypί [_:>lI?]yᩧ[eH:|Aayvp"0k֬˻+S*H"$`қPCśl@QHb_&:$+I* t*q+m"b`Yni[4w󭷇uZ;鬈HY7}myR᜹w{_8L7B ;؜O1,y,Ӿv:"3r~wEϗ^~xL /-R($Ɠ[OÃl֭ެG G}mo7~'?$GM]? . ?oÍN qB=(Y >\8g,'Us_~*3wGW=!w,vQ-!lp0u/-œ*_O^Ή<4$6^y8߭Kɧ% z9_ _b;=fUO ɳNO yB(0 GאKyj{ǿ _?LuIӘ?&9jY?Uh?wG-,Z4ԥa2!."2zz"Vַ.ƵSmNႋ/+I 8qxcm&F 9`!ɞ:-}_p$kUWIw&^zǝq? 6Soek!zQ~Yw15 &{v |v|ο貰8GNj. GB>{\7>=xC$9@q0WÉ9=j\x_^na~ąlb/~Hw{ KCC+G•\>{]ù÷||JWQ@`NM7>‡ԫU7)zk{xpG{"?B䇏Lq~Oq~q k&Ņ$;}Q~ŞaNJw]wz%Yv_f )ˣ|q-/ y5WG%cڝ dnXMgqFݢ[([)bM>z_7a~! +8~ x%dR{yT:=mWBF\FòUTSu^;ͯ4tX-o@#h^5@gUƵ퇽!S[+rSOwH}#Y [pP  a.{ć>о!2VGXJ6H!_Wt~~86n[XӻEW .Zk gSO 憛-O(3-1<>훵aaI!BK0+lbCKx2 " <,m;0e3TZ )#a># I'Oj5[linNq]`SF<{"+^nj:=xf)ph^>\ỷDOo[ƩmzdNPUj'pp-/Y8bmV65#WG#`䣫b?BX4(P -[~stn̉' 5=N/R$<ߍ}!^UՠmT]#1q7ޜ<:Ii.Ʉ0ԙHljaWKF2[UҘ_6kčꚾ},C["g _JnoC*D4t/ 3\L;V[69tp>q "#m=wp@`D\Woszuu/0o^ ?uU]$㫕]diu8+?I{ ԋ9V̉Q?=~^F{Rڥe.eg8]GzUFFF;YeO.Cb}inZϹp[fMt˶v6fҬwPquOĉ{1Cj8ǦEL| [AGpJfꡞ7߼Ҝs=)򇓮֥mN3Zll' PuV$ie:q~Jg<;kUm>FVWcm 2Hiғ7(qsJ$W;u3\s3v>\ٻP!B0* {i9yM>|I=:=B\WaujQ? qO]׿W IDATUG&oԓ1;>|['M/ǿbMVvrw<#8}uLY?^Fգ>?V72ˊe$P$V|e ?z tH&SdNX5w*@l=Oͥġ|rPa)kwdzHMNgF^8oa ## 6ؠW- nwWJzN!U^8ի@X/2 :pi:<ٛ;y MXf2}ƽ@/NTh ۿWUykaԲyfUÀ_?{#](ga^  twsڿ׼Id!ifnV䲯R|#/fDؕPlCO2[p|oOR/Ґ-"#^6nܸ.%kQ| X!^89+8,@%JJ)C=i+JIOd=_HcR|.jq͋m2\.oc7]ᏇYfCſ:]6-۵=NlaqmX~7Xu]w NbPHX N7zygWᔓG6zl`>'|-Jhji_>|A4ߔYq0GWak3(I\:#xܹͭg^hvG/_&Vm;+_=9XNˌs*צ|Bc\S`(ϝz6dAYmc5/}_[^fۗ+w=/Ǽ0"^QǛ%.sx}0|w(_|AY$~Ǜ-PPj7n6 N-n,0_Wxg$6b&(% lE?-VA5n=l0~ܘR{7+9<"W VXXk`䔼G 6t0uԴ]KcH u4u %YVVR\}3$w"y:6 V$q};:O&g¶+ծ^}>0O^{E;*H$AW_VA&-\XPߠ=\cu*w>Ȭ9*ua )S{ _ vjwƃظc۳~رiϿ\qnUu:I񳫷>|7ҫ yǥ0$㒴G" XȔ-&ŞxypG/9=eʔpe5,-c zvDٖش_jI*]qK\bAD鹑αՕn zYZ{|㋟I=se& 0GpEՕ; OurUs uNخK1%.~vV2e+ZX$T !O—;>Z{qQzu.W(R2|:Bkt2W?w\;#NX[6U8"3fc6ynuΟ ^ri9egyfH!ՕeoLȫ ~ܲIygo<{휡A 6ewNX?o [N>՞vI ?)q+*ji=e8Tf\A^={Q=];'Egy{hD[9`t+cN ũu?-pzpGyØ1c$wyuQe+XC6V YeJcgy^2/~XNInstM? zXHV4;=xbbl?%[\*ra~߃ƹ [0E+lR//ʎsT6=$_y<q.ݨgbӸ ,U~HSG9>l/4ȍ6\W~c1[Z&l^m?Q6o|yٱ̹>;vl*sM6^+[8@_#w}V{nl׽. -yKUOsw'wOg X3g+v|lU-̙3k{nЌ9BZ{䡄ޟ AH*>T2O׹H*^R%/|GydxIlI6ȮQz]ySWU{[G*^뎀#zyĉnhjzbՂ6ia#`uYY 2 T>$CH]tGpGpCM >}zF< j>>Hdװ'Ά")Dd8Υ2U~Xq6uGpGp|dҤI`9s椅"O>dZ@92c3.b֡-z,"GYʷ>8ӉB 63:XN^i2|Z;#8# :zVs(xxTO][W兴RlCׅpGpF9o˽ğl6G<`ߩPNrcΕ$ԫl:ȣxt#8# d,)$%i։@PFKW:q쐍z~<pGp^N\7%pCGI- S*j+#gdW4鎀#8#!kqVWWVWz.iUpe*ґVWdpGp%mV&=U:'ґVWr #8#8@g,9_Y],m96 r+ݥ#8#8I+|r0W ŕ}9֩eH+ݥ#8#8ˑU\[uX2:z9#8#4FvY*z=>UexGpGpC@\ ilWD`d^2?6;yGpGpo F-@5IXs#8#8!N5rշ7pGpG=IT'qGpG poԺ݌7}:#8#.NZA[Fn+ٓlP^#8#8+ "z\՛Ζ!LArVYn8#8#ꍋYnجosGpG`e@%䵥!`9ԡ)YΥK8'fm*qpGpGOYes5siA^uUiu x#8#8U(,ii%iu!lzOu8#8#QVŷad9m@P8a/i2_8#8@GYef*ˣ8\:#8#<"fe%Xh2fQHzhƩ8#8#fxz%&V}w.'w#8##dɒ0k֬cŋ'|2 Gs]&q%pqVWz.nTBtũ":oc)a`>%eu`aq2OU/.iv_m#j6"9V(󩴕MBWK{1.{xm$ѻO٩vy#8AM^~kf'p'^Z lf /Y]u \qʇMm`9hN9qmmjΝ??CiF-(Թp8k1W>n`õ)\rUa~w_,D#8E`ڴiM_;o  {oYiDL.zY7Ru7\I!C9;jXV* %O<D֎Vr墓ٰzyó>br-|.dz//Qޱb&7 gx>xZȬKuFqcDŽIO,5 XOqo3o~x a&aÒu+EcsŒ=xm kwN6yGcܘ1ڶA}5GXݾsm wmfyH\RO u.}`,I.7 y LQ֙lU E9sus yxӡ:I/oejew( *k/9N{ _=p2kZ#|ۭ 7Xk.U ~0~Zdf7^v}e>'lPncZ8 q_<^{zE8lE[jn^رĆ;;p=鐥}=7/ۧMXxH4>7x?c>wwڹU.",/Ä׋=C㼔p©gf_ =+7T~#̊[ W^yeREI:L]zsIRFI\JvU ?(cV#d١ȲCNl$"s^ڰ D$}^[TO[J'?!먣,NWtr}]fơ|ݴ{fԾgyw1U\sQ\/ˆ7O|a˰/w~qǧ}l~_|'G:A8?˼d c>wBw_JLO/~V<9ɯ *yX-_6|_Vo8GpVdxOoa`wt`8X$yRGչ^ͦˮ4#^V0֋{t IDATۛک*!ݦ]3p~U*Ǧ_w ;HqwN/99y0ˉ#kWw5Ntpv$Iv$è_)s _va4̏Q8B\в|=2;C6ЏyJ:V_P>_?N8ʊEko4ׯݩKU߂/IZn%gtl!HBhȈ82V/xkGZ![]By^v_ܾ|.;5D;kSO˂aC{K<</?•flٳ':7| Iq ofأp u>c 81}S{_ ~dWO_sGr4A8(QV:qg0/v=my.d%y?"7̰5!|G~fCg]k0k&:d '|.7~\~"}ߍkAB\qG`Fɒ5^= Jmݶ4zE7ZB]l]#ų$ $]eU `8o8Qk ;b`.{lpCw!6̫p}*5O⮉sCrfʎ//@z!?Z4` [<{ nI  D8gjC5=\x_mtY@=Ǔw 7"4??2kq==27z{-eLW3X!ԗ_ 9d2o-niwǡ_.H m^qǎ|_q1=U;lWspw'@!w,pÎ)xgNzwɡ\_KSk9i+K'Ά2"9C6*,?i2cShKFR6%0%䄐ި]^y^3?K#O@L&;y^2½q1VO ܬvbAhldݏ!*~;VK~f3}|k)sƟyXl^yMG/>ɣ Wyo>{'\Ύ}g"~kOC{ȅO/}4} -8/[ /ݴ6;#2"V0vFUfY[ޔUOu? I.`e3 iґVڒnq5jt9?sn=~g,,dQx4F 6l2fգ@RHgaFV+,9SUl(}_,c"o;y˴x2OU1&ιCv<{Ö6Pc] l<98WFU? 8{aͪ<pLJx5sa?^ֈB?I]z+#YIYw5X&_2Yp.+S^lC[L ;/+ZʶIW> W3ٓdu)oɘzǝ5 $[nzwg$Ӳ {j/{ eܝq$P}S|MY`!zf+vߵ@v ,rJ]Y0aj=qef eNy7e+jٱ ĖVײAv9ʫ$;)ofRz/8u; ?bFfH%W\cSoNq6b #we֬T8Ы|2xH89Y}Umޜ摎#q5>]v٥.cط+:khHV'NIXGUp*eSKD^V*XG:0W;aӍ. v91h[*x߮ ^W*^t5ܟ;1?[kw)8v=Oҿ]e:bobsx?KCz}{?}g||~'l!A8gpȨ(ă#8ɓ'7} kԡ^UiMzvJ4IIN26HsFyVqI' A5ocHwux-ogqq_jxC ~uۏ~̓-ϽKgmnv ~LcZxG Wo/mc~N{]쥷ί Avfq BOd[7"eX@ʎ|;?i-Ͷ{{YS](*oIzq|y8%O~ȰŤMR8L|V[tΛsGpV6t0uԴ]KkkS!=v6eiЛAyIOBr&!]: 9At9GZ=9[>B@ģpRs nXncN!UL6;zy\"vV,X݅yS 7Hc׮܇GȖw`dI$o}?Q;!GU'>RK3llP4شe8`ŵߐ2xо{ԥ#8+=)S.ᵲe |vDD6uˡ^UnSYHW $eN C*{v]"-o8(^Me><+pӊsOF}؞_lB(/|cW*Hw(t1,,귢x]*o<6>^el$mՕn.Y;ٷ"mWYʿqAi6NcoP޷a;dVؖcEe ;]=AWxGpVf dp@{Rw}{)iӤNyWԓ3&MKڸ}S/ f+Yeפ46Jα~6kWVFUR:o6>gˠ\Kb{mSΰ{9'y v쟸 ley\~gGhxA=h=#;Skg$J=3@2(.w^v ^fT֭֫O~WVYZomg }) ۾l_G?\a؆}xMD{X޵iҫUz3'|4S8#2 )>O81p MmS~ZQV3l$>K32$ꙹ:>=mnz{$}ۨΛGx[ q~8#z}ӧOo! j>"]JkBZ^ctLf#x[ޘ޿_`Q`O}Cal6鎀#8E4iҤtwaΜ9iȓq7 P Y1~~\`כwmD$)͔V7cت N* //fVoEqVq{G4O/}&\;_'GFܓo}|kC;ltrjTOwGp@{I@4 7@}+DXƃHGUE$<pGXpۣ.iӦ{i)ypGp+Yرf9~[oue_=UD\4Hs ^xaohE#8#0\sMgp!h|, =I^Pqe>ICY\ns^?!02_q8Oli`_:zY#8#Pk8XoO'ۖg,8_Ɗ{IRE7l%y)otIԋDRhu,^GpG(G@41bD;vlZp+H9?> 1$J+uU^$u{RH<2/|!,Z(z.b zi#8#?yk裏c9&p nXX| if-#|A(DH*^R񒊗T$+BF^?6\wu}wE򼎎#8@ @yϳP?) i:[hu#V" ezYJWAZ2K|wGp<هxƌN9>\*>&IWgI6'dlt"S;OL^#8#'/AI\z)JBr$+#9!Q<Ȇx6N)K.I{QM6$-諺z GpG("ހp>_|q8F}p&ބR/N6 9P:B#I#N!v-O3?;ddGpG`   }K+]2SdY:iN\/-!3AΔ,2b/iuy[n7KcL]7ԼTGpG`D.'`M˧iV%C Urel08Jb+\~ڭ_xH9#8@"P8B;kdtI!.%~E:Rve6Nza#h9SA ]Y\n߮s{W$xGڮy9#8#~m=\*gmKy^#8#8'Xn$diYͦC*L$tGpG`"7 ̹x$(IlDmt,ȱ$6V Bұ:;maС,ɶ9@@ oi^ Gh+Onu.-R%HW^I^: * UϿl\:#S^{kP^S(_ĩC8@O#@{cHSd(F߅E dVUK*O>8==V z@g>h/ >< 2${')\lY sGnBF#>%ݶIVsx-, q .Օǥ#8AvHD'9^?mq1"?x≠ca$EcFz 91#S~)H$^mS>+e'iӤ<P%9W%cu'B_[~ȜZkU#|"~B`A>Ґ;@Ǐ~D92+|ꩧjm%kmBmB>I{H͓"(phIfuk#8]Az^{DE mޭ*O҉m;vش@a;2 IDATH!K.Mmھz=pm7#v鎎DUά;Wd#<;# \ x?H =3^Yɇ&li%1= ",$A8@E0_+rV!Y"{e{ G@ trNOٔ#tYgDH8cƌ4,h"'2\:@[PJqUs=${ڿsEF>yi"h_{ة! y n"ʿG722Ȣ^*=.ٿkv$V/>'e8Gp>aA2O=pU z ZK<{CD t^HH u6J!PpUGh7z[sZC@ RFþUA[dI{ |Hq@?zSʫ*tFY뭷^*s־vv6!PTG㦸6ϋqm ^96fF3g{Bػ )1䜀 xď%pXDvP *"`T.y<8#P8d8ґ] u KЮVT\_Sw?ʎ'r)ڈSWŋz4 4)9 H`ؙBIA!eFz ΝH)q#hov Y$ٗһܠ޹LőOHy#8#,t1@z1tm%D$.jh:mR*H$3MAyJN/࣏>Ő4CU$PR!Ghq&˟G~6̿$C'JCW(t !|pp* U@Hz< 2 5kV"k6`O9Hg~4K@CZR A3P5Gp I[O4[[t|^哴A( YvCPTIŻtGcX޲|NiΕ6`([ç}mcd BծZ;G`"6(NҫҭO_!`(H$N:2ei# Lh4KdC!Z/V zbH<4iRz-Ȱ0|@H6k# lh PId+ _R&HGr()C!>˗KGp@rMEst Sh 2p4䮬N\#Uou8ڕD,.[ e}e,Iteĉ J=ie:qŦi V/@ HEm~-H 0.#[VyҼEH,sl"ٶڹ8H60GFi=m&ij;[D &rxLiH*){#X<9Ko`YhA͹+qCO3̪_Xzf2ĕak#! $>F(],Ґ\W6ʟfȑeY}Un_\Wl\qeQvNd{tz1YV+C2~@P;A`^Pz6=6ёVWkmHS*{nȡ:A2玀# =gM'v-mƬ(3k)m{,=p$!|<GO!=~kN' { rjךg)ބ+ JCko2ٓO><*sGX9]!F jOD _Hzl^t| QQj%TRJZ{G`"?qzi0mh 6ކ {ů|`#ofۉBB_)߭Q?dWx.Z0U$OwAG={Os7z 9jNyN <y-- je8QF`_ ( ٨N@Cq)?&]mzy&Z➋hR!߻u%?of@6]O*K~vKq/ ozkԐ0m@;-C/QnT PtW/Yu_v|vYΡ6 [a#lY?njqcǤ'/iBrUFַ+>o onj^{ SΙ[c `ދ*U|Uʥ̀|Ԝ]%{.[i:p⪼￳D}g?I[1bĈD;ktʺn֌ylDđJq&[8UFytn%i70LW m+sͯjMY3!Ԩ_o< jKÿx_qˋ s@z*4r^8^ 鸗3|MyIumY֨]Rt)~6ٺtz W~3& ran\QGȎߤ~A8emq脺CM:>[@G*.y2^8hՊgǨ5:K; ƉٜǗ<*g}.N__/)eȋ!i60ij֏+i#ʲcyu:qoRbAƘѣkVNo{Xȳ(vC!ě}d,T~ K>=9+Ӣb3']I`j fX3?26.`LX'bC qiDob(~ܣ|5FL)_+kQY1rD{ic_|<Ұ0ɟ z)@*#^+aˮ o)7^0n̝p[5~ǍM|ͮ-'H|'JwWF3[6x-~|I”?VyGuD\tSǃk{<(5koqtLi~"Yf>@Y`ㄅ8.W$0Luhm)ӉSdUv^4|LJA''v3\eNK)]8D@鲆١fV0(HRV5PU:򙗆 qq"~`k57:s! *%Da/=',;{MQvV%q*,gL߂jטsNOUOG" WEuR[ .8X`EwLן#؜5^0rY8  ԟ~mDm˴ת#!H-s#!UXieI|=ۘJu^됟`5?+6[ o#V|62i\xxC=8=hs?U]͙3'L<9n۹Ȝ~\⨄pqeĮr2˕<ty$4ys]T[2E෽dCWgع`3 iCy460jR0y*+/=C;XWɒR; R雷ҫF 3ºsϴbo6ӻ7)#)+M]_|q9A{!Jѡ42=fᱧuȐj= ;KI].<ϛwպCdrH l|E߃#P@w'ΖEܞغj kM4R\SdGa\L8Tf鶐 ?򃔞vw; <=91@:5rPGrS?x3!5FI KuIQ4}[#K,8v2?̯1z>?t AC=uٵ0FV+rC{"!tRώ@oWh1?X 1Nj?l B(hVqu8?rwFz^r=ߔC:OM{{@;?aCQpi"4R7H4u!C,5dֆkej =zPjiYړXiZB$awCs=}Il',RGpe>"SljnwF`aε{WA^ ߺ6Źt@+C>fĠ'<ύfzUg $zY Pƒj8+*q*0?遣&3þ"[3,!ѰС$k{]-wi>zYCao[BԜ9!ͰŚl00^Eh }z=hF,m?qH?Lzqt0-@?h'Dy*X0LהUVYa9[^N r>zt.cI;DTtQ Vohߑ;pP=C"/ b=훂\.rr^v//]}";an#IaDHi30ڔZ${bӵҭkS>@wmYW~Usj" dz>٭HiXuF_$VϓzsčOFY%k㔗<ޞhsnL`6_%_GLX:J% o(=a']>fA=#uz_:bR?Ɵ'lXoaU6n̘h{*ϥ#=ؕ=Yz]-;7k_eP*q4"wxUC+{9_IτЈ&F<ȊGQPLn&mߎ l J3.E5%-vduYa_e×>$?e2AH y12Ruy=7P o u!c^3y2kW7Bv!f 0s]co~Gz䁺b ck p8tm\%WuGpOvB~x,ՉDFŕV2麑VoG#>'Ft')(4fv dyc܇|I2/HOϩRgcmˎ~n݃݉C6#@H`b F!QDA@ 0G@!% "NlCNb=σ߾;]pW鼪ZuٻSҴ'fFCB|SP H3߸Xu?G*y1'G2]VmݸxS:XtA՗ Ts{~utm#@KX\~{l^xS.}o|'MLf|A)P;k,bA#Fv8%K8a›V9:\F[;_ē! A|jiДg.GqaqԅՎlN>:l^r ; ?8_5d4ǗGq^_~F>vJ7\'kg(m旺Zl`{d5 4^h%N[Gώ~pwo3+͏ EN40syAv?ϰ LO@}玡K1{Evw|'c?܌!rX|ʹ(%!zyӆ7_{Ҕ?arD_s[N-Q耇=;Wu@:Uyܴᑭ tnyuѩ;g{w|ya.OoviM>ܨ_~uxye(|-5~7u)f;Qçe'NŇW5 Rc~Z>ưUSǁE8osg~hT YǮmޯՃs]ܸe_ȷ'R IDATGhyȹ)Or6gkخ}ZG'``+,V1"pmnU2el^1ic.o|ǧ?8E;_9ztھs}ow;Ga0SdW2/+z{Ṅv|;Z`㛇mw|8YSC5|(Y$_C䈏 ީ+Wz2w򹠷?AƝo!enK2<]x&pNH<27bn<E9͇ƪó8WfCmtZ]Wxwp~ML%i?x.=|6kȡ4I*Qk7NRPsYȔH>+6񂍕vy$ty^[Iaz U;S1/?fDXj^sاV>Yr*4Vm;Jiڇ0ca^xm\+QҘ.c`;g(x?ƵgyPTa וePP q@>ڑbkŠO{{;Ǖ=χCX7m4|o]:c?Sõ?lӇ.Aۖ s4_$tn,Za(FΦ>l?W).O[>ge^&%ɤ;CH_S,u=1lG:tq8 ݄?ckHXN?Gٰ:8mƜ]Os)n냛:3N;پT+s+~Ѵɾ)~^>χdFw cqԘc$mhFs(hz ;c1fXaYCm9z8bpx箭rZ#}_䉿{~k[6|ősxB7?bҾxnW\_|Ι*f@k?ئް-|;pg«n%3({:"gܙSY([ ڵQ:`Ny>8eh5v\{W:j_C<6N 8"ק'_dNLHdNAív>#YX-k{*z[>3݃ƣcx1 뷾1̽4&/7gS|)dxeE'/ !C}cg7tC\Rlj]3#7+Z:emzli3ymTcui߭<X{ךdE+fS5I =/cزئ_nl_P>:tD[c5!G=`=CMNk\snS:&X><|yMW^#=p.1g:>mY 4c>x#sSwlX+mOY9LvhS,Nb֘[Œw1gNNJx,7ܳs brs],U'|&~L{}x; ˹xζ}2^804{A(sr੹Nm2k-bH~cH'wNݤA*>Ax٦zc(D{ |ȑ; *ަ%wq8as@AP9lƾZi5H -Wi>\S6;},rB:Ō7 VlX{v @ ln~` YcYخ(nUb%]F {Ǐ%uL 7NM;9@˸x )kK)W6ƕU[߇#.nӓ}WD`n%1|QT>Sk?dܷ W"*Anaɢgm31.Na=b8e8M*{A1?k?$JKFa?o>6q8`PHoӨO}}o{׭-E%ZMm7G+G/`ƛ2 h0d3WOsuE_1\׀ĐN3Wn"{Ī%Tot?tP_NCW);PNB`qa'wZ9f̛;q)XݿP<҇GLI7QKHҟ Oڲ?q/c ƜGwMMfJwoM93Woۓ;yx$%6st3C辰"&Sqv@vm4&{.}XT` Wrd-3GG&>0m2@mMIdE~Kj~cNsWu^kI%VtS$ zn D@e2mO/v൏k]߲שd ?x\Wn̏= 6 A4~4R#7ӾM1CGZkٵ[CKvP>Q8pF)3r_n+30hCAcq5<y2* V@e2ӵ;X3*qp%w9,g Г{Ln0E]@e2mר@@e_C70N9СGƥ3*m>;]|(_DS#ũ1ljt|[[(Λz-q&L;$b8 2p=e@g(;5;t Ap he2p3wYH={:"V}Ƽv `oK@7? 䕁@e`iؿx} T*̀v_ҁ|4?(;f%<(.T@U*)o:]X\@e2pP-}K^+ @ ` )Ƨpv¨@e2p h?uH] Tf@^#~KT6.ؔ_sLJrrw*>5.]Rhe2P T*Y'~|dN:n `"$]9I]G6[@e2P T*cPS1Q^\]N[k7F41ԩJΩ;.@e2P T,I^K2ӑP)k70k\c]U*@e2PLPsRu^:1ɠ`#lC)`Hm19uKg1Y T* "T-%ljXNJYti gws(@e2P T\'6T-* QRaZ T*@erf@E>gLl@@e2P T*@f s T*@e2pn2!>WxOq@e2P T* .LV2E/S"k.@e2P T.J*ܠϝ.tkWz@e2P T*PSH@e2P T "ڃ)p.I`ziOdk`cgGlу9*@e2P T.\Tv}Ruu_Z?HO{0*Χ^+@e2P \ dg^,eQ O^_P>0}{{0{vm#-ܲW T*@eg@u¡=NVK4vddz̍5T2󮳄WKlK2P T*èXk>IUgA`#*%:/]@<~e2P T*˜ל}yɽr^rEuXI1ىJ0V*@e2P \ˀj%Ohgc\cPZK7ċ2m >r( ي2Y{s-@e2P ,i Kg,TijL#) *Q_ T*@e20^zUy(^<;ޢ$DɘָAQ T*@e2P.T_j0GFv 9QO&]W Pm+@e2P \oP%{j)a1kOdkH`Щ2PlOs|jC \ ;V7tq߻zǏy׻޵zwO>g< q@e2MThT^(c Dn2Z#^@eeW_/ `>c|X+?X3T*m3ൗ&xDž#JT!o/0$ NTd78M2p2믯|WV;K/W_]Ӌ/&}}ΗjT { F(+F񒷜 ~]ePA@ere7^9eW6ehe2Kc}[n$h PcKӱSU* _++#ev T*ʀKD[>\ys*"E_  Kr e `J+˗x`+#<O syn?UMapʕ+ @?7}1c7i_+lzE,*ˑ ֚:r)࣡k'` 15ׇ甉Ƥ'*khe2p3@[o]}Xp(hX_V_u_z[zc7c_Fzh{]}ɗ|Ɋiޏ~W&W}WCr?\:;W}{W5w}lm;>Vh_W_{__Mq@e` f}BD:?7z*ڲs3॔T)Cˊ T.WXo;ɉq~=y/|bU[o]}7|Ysz'WS_oQsVO켔g쟽Ї>t\pJ_?;@eK|)iG[j=csmҗ JCc`d(݁蹮(MVO(c)=Jշ|˷_6{}#SRQM5c1ωyԱ&t?P̱kw_kş젿w.{#FeW*7H4K{/&^!Co D2Kp/)@ebeiJ}7^Ǫ=ge_ew|8U3i|qۿS`[V_5_hl\G#\XaG~GV߿d״;\xS__<VW!5qŊ'1ju*/β^BFGC2M ! $SIp#Ss} T.nկ~m~T Eƿ~C?CTYbU_?g_?gSX_KG^OWO|ݕOX*fN*{M) ca1^2pZ ~D%3.[ܓcVPo 2 @8PӮLS+{*u}/x.i\V(CӲ: #x~ǂsq' W[[Tdq'w|w~կU "7PvmݻT,d~ϫ?fg]_ \ x伾Y1Tvŋ7"%Qj\T@w9EP#bz|X]w!=տ7fo>(_~j[ V,ZW&M¢֊9yC8>^|e2p2 ʇ蜙HJkٯ=:ڱ Tf:/y@egM-W(h߿z?OƊ$<+dZ+g߅r7cŏո&͇K S \ H%h;Ƅ1r>|0 }wkӼq`s}獏51ʛ!xI(踹ěǢbRr7ʢr3ĸ1G%,yN}ޞ}]D>򑏌zB;|/"O1b++|hQ7ucm1|H55ǫU*GTͭzYg&9(ދD]ϱ|Y= 2pVw_wVwP7N @N]rsG[ IDAT>DZ::cZSWwfc_XcA~;Vp(*1̣dUcŁ9rXk\rȼ?oΎ;Ū˅ğlV.KƗx>^Z>\;'<6/b_EM 9RWηtk2P گ];=|`Ň>(q8ߏ񶎿hNN7Fp偫o޳ uic_+kf;15S97f2p2s597yl|_Aƾ}?m.ߪo7ٺv!̧>KybʪZ*ƼלG&Q'?k+ߏZs%9T<qכNj \ ?ՐoCvm`ԾjWWPa83/Aiܻ\_lzq<+*2@qԯ7v<҄_ּN0y, J7ÿC(|{;S5wi~K/ߦ ȫ~/+UdUK.l 5A1Ne3o̙GdcӋ5Ao-Ux>q*x+T77t~ed5!kO;>!޵ǀ E\}ڥB]+ BU ϲk=ώ: P8=s`HbS~]EX|Y?gŕΒr[+Ǽ?4p&G 1?gz 4pǪT|ڡC(Ie#g_[}aƛ g\|Dzs{Q)_,5.s;ossste)>48V&Xt)ջ-rVŏf5[5Vs`/XZrTfMrzraemm;l8 UU^w=|_໿Sqy1.! G)m8Ovκ^|il~rT<ck wy-3g:yƟ{~vvk3~s/Goo}};ⴥ?G֊n ߶:7|e%bGgƵny68XA`ʆBGxafuUOVFU*<Zhe`Ӿ|w_}'b׏ȏ˾lکvZsfBO=[ka"&? O?A.Yax⩧׊6ɜaU@{{h*Pǜ719z8ˮ7SSů\|+dY8i,Ltx w ~J򢕁 MLKE ynO 8dEݷxdA:⧾ypPsHZc کuY/xBz3$喛W=p*o /zK||vWvp>4b ܜ?7Rv%'^I_̙/&w`]iuXUeslQ2pY2\?~6 /^ p,-SS7C%in<,_(;q]]R9p0* qѴ=>wf;ş+\?̭SoڲUV)yp4P g^3jݏwA2=O>ѝ~C*[%rP>3HS뗕"=^zc=TK{j)a1i'֞a"c#2PƩ!՛WqP|@V1$ _~yN |8ͩl<Mw+yPxƖM#O۞&ǟ|j/1vO `P>x[M2P T.~)9QܱolPPr(d)[Ej#qPeCۃ6X=?ǥX|rK_S|e2P \ L=7wӖ̍Wj[TrQ:|L:N C۸r"CE2V(~yGƛNm/|>nekN/s +m/`LvĭFA߰x1q ze;Kuqexiq2uXQ(F 7w2vQ,ye(T1~ӰN+mXevcl\7xorbct4nxn,Yۃ5\i|rE,U*πjmg=wn:̱m[YmG!K+*=QƗti;c0nŃMd[c@e29f#s.>[uhsD[;,C`\cV5vKOp7kN{lxG,eͫ{DZ2<+!}S Ɗ38T1_zVKNU*3;}ۊDZfi񇟇~nocExś;Ov@[ D% S[g5ulO #h );>wOU:^oQ7~NG18@=/Gܭ>N~I|헕yS/{"[=g3x}[,\l/AֶyB>5[ԩ~e2P ~sX;y|f<^CHod\G2=P;09GKbc{ǚQYIoq7)1dt̊rGW865oتKƍ"1xE𷥠FoJ^҈%oDFofߦ3>\P{8BX@e2P8LcԦƥOyݤ/١^'|M:A'*=Qn训2 ESGPMTgMygE c f$VrJ*œe[5XuiF|='O \3~!CQ{;˻Z@я7wvQ`f3Tp<0eknN\2⦖W˼#Xw)(mUS~hsyF&1>q(U*d3Czw^1[5`n_=KwD{SM! $(drA.uk10zrCh)NFoltsbLe j|խ";7p~ӯY%xjܤg7:RSMy%~S|7hۜ4~G"/cV*3]5sz_ưM{߿qg u~ 1lZM Ry;p^6YPₕ'94WQ8lM?޿w(xڍa\C`u 9 LM|Xmx(p Ӛ?:>7P=sQllK_LM({ebngdz¬@e2P2X 4_*M]:qm}80cx(mW3z`gLW!-!N V()¦ca,<] ׳=9\owF_17DEј |`W2P Tfe}U$,nr}{&ɼ8#s 5F7^(ecS 4>~qC=󧨿ix<zM~Csc+@e2PvYݛ:#5mL~_6NkˇhKSm( ]4yް @w+T/,w"d(DZMi|LX=} >z?);q,:ғ]R^fǗx̷e[c@e2X5}=/}:!/E긃x[>M .lEdλ&{7ۓ/g־tk֜wYbDwNsuwXs/@e2perKvjVrZt3 b|b0'>@$u[}u[c@e2P Tz`0|)tU!*̠WxH@c p.<*2P T*gNrJ@sNj=ך *\м|Cq$/9n,Ne2P T*VPw S PCLJ>wVqW9{-"u~N 2oK T*@e`?cEoZ45 !cXN$>wNUk]U*@e2Pi ^39?>_ūG}tFgW*@e2p`%ZᲷ+^:w{ _Ky.{e2P T*ˀj C k0wAݸD[Akl)ֶy{FSqھ*@e2P8|TP+Aq m[6 2iKcoG 2P T*"jbP u~l\ܧ_U_wߍ!)%2P T*jjl*DhlN\6Weu^}yɧ0s|#Y9® T*@e`~TFoMQ-4ɠηtSu74r4rϸƤsKsGe2P T*'H5!:HSM2Q4~I%-yV3F |[+?8B+@e2PP-гPZ^y1%O:Nk|=話88ON~=YZ,Z T*gZ4jj5GC5™xQ3qQ|H(B1>3nɤ/<]/eɑE[raC%j~^ziy;X?VЇEJiR*@e2P8 Phը}h*kC2QVW1a1De]*}xM^8ײ=ëoo#1.6j@e2P \ p?8o}h//y-ADS_/#kK6פG&es=wf\}7}g7 @,BU*@e2p3@)_Vw}ۿOu R󨮢[cvͼgt@@C[*য়~8ns1*N)TD1E[]Qa IDATgڨ|sh  I>*)XCŏo_[͙SWV??1VpL+畁@e2P e:{]}}]z=yXk>>O<ȸ* χTRiE>MZ2vZ `K4H^@S5u||P3q@h@e2P T*!,|QA9я~23/)ꭥr07P>(0yɧE*]?]w5&ӟHj2P T*EEjj&RBOuR$^:^&){lǥ6)qZrpi ?VYcg~gVo{|sw:5 T*@e2}}qagSP{">4T3jsG$Ch`6q,6L'E V<)2P T*@/@02y5:<*D~jr[Sc/S1Dc-@ɦR D'1dw{;ex.sR*9AW T*@ee<ޅN8K(A.^udVCO5r*5k,^ECA ɿ7[)V T*@e43@]CMZW^|ű"dŠ*^%U@tCG"ѥ>*@e2P Uy_X.uVQ'>:C*Y?\&^TƸC<@ D,ʸ3tHc*P$|x 8|mK:I3^/u/mzi=ys>)ӓ'^h_#r'J;+Ni?S'O'xzk϶G T]*aP'^Cwz CRđ (K*S8|e>s_ T*@e2MT[@TCu IA)ZFte˸des66׸<,TOS+~Ͼ'XZ-Lgߓ{,-~W߳=} vKվc{r^`G(4鎝O5U/<`Ot_pW"oY?:p}x$bC Oje#\y[:iXg~y[:iXg~y[:iXg~y[:iXg>>QϏt|\ckSm#cOGS.`J : Js0F{*d?j\TgM|nt:ƿ!6{w!uvWCmj?'C]~N5]9MMSB5iއߥ~8B#Q$ӿ#]d>ſxQh?)R>v/g~Ʒ}_RoW۵4߮ki6KW=Si*^2sj.>WS6i*^2sj.>WS6i*^2sj.>WS6i*^2sj.>WS6e\(r5ϣ{[ T*@e2PRYkR@e2P T3!iet~ uu}8+yɓ󩷯p=OSo۾c:?:O:>WI]W}8V'q܇m1sww+{t^|>?+|}œ8۶OṎSsQ,@e2P T*ˑUIn3B9/y=)c8?w ecKޣn|nJOy8߳;Sqp^v>=6~o19/y=)c8?w ecKޣn|nJOy8߳;Sqp^v>=6~o19/y=)c8?w ecKޣn|nJV䎙caV<|Yk;zl ]345N^<5СEҝkT}x5/zkgj>hg~Rm90׆1\P07,)6%3ӾŻْJcW翇׳xWt}ez.O_ў^>_ѥ^+g|+>ߋW~E{{x=O~E'^{ʯhgɯR~/^m_;{=w{w*דjUދ'վ_O}Wy/W^|=y=]z]{{=w{wos^!R:te?{}}~I^?SoWœ~> `N ԓӓg|=<ӓg|=<ӓg|=<ӓg|=<ӓg|=<ӓg|=<ӓg|=<ӓg|=<ӓg|=6Y?'},Cg)4Csns@<!}C{=fF6Ic{=D{=91yK}R?NO'׼E{=M}R?)V~O.,ў~ONLRe9Ol5oў~ODS_9O9vߓ Kߓw|/S.{r[ߓ+.׸h/Sb-]KF8=\K45.KcX{=D{=91yK}R?NK)4hˡd-x=sߋ?ƳTW=]T?>O_XntT?}>{xg+-9cj`_~E3>&^ϸT٧3t6}+)6ѥ=|†OMgJMt}?AgS٧<ҟb]jG.lxz)OD >3t6}+)6ѥ=|†OMgJMt}?AgS٧<ҟbmُ-^c-=h\oE7Ts=ܱŋJWIoʏ(z-+COc'%wlªm_ʣh/қʳ(z-+>iķ-^TX!u[3QtZ9Nniķ-^TXmio{rLc'zs=7>Z=@9/\Ѵ׸h~ʱclnKkN>Sxr/Z=}O'^{K}Om>剗)Ǟ-Ү:iw[Oy~ʱglnKkN>Sxr/Z=}O'^{K}Om>剗)Ǟ-Ү:iw[Oy~ʱglnKkN>Sxr @)aϡD{K7}I& 7KGTP55&*lQ&zCGvg껍|8]_cոhe|+]p=}OK=E/㓝hO\ʇ-|XꩯXD5.xD{JW>&~OmӿRO}"qd'W4{n 5z+Q&^';ў>ҕw[S_j\42>ى|8M§ET㢉Nti>k,W,MOv=}p+N_cwEN'w``L]{.mh/ڒ_O?f:RyӯvmC}Ж|z)7ӑ]}'^'>kom6MmAr3Y͵@mh9 T4KAIe/}P" CMy[/o٧]E,[My[/o٧]E,[My[/o٧]E,[My[/o٧]E,[My[/o٧]E,[My[/o٧]E,[My[/o٧]E,[My[/o٧]E,[My[/o٧EG>a'L:>~OX=<}nK{=yoN{{ěӯ,ݾz={r,eW@ D\8S\٠#JK8xiޢR 5)[yKy/_ڧo-ڋ/xr~i޾嚷h/}{xkޢRދ')[yKy/_ڧo-ڋ/xr~i޾嚷h/}{xkޢRދ')m# 9hO΄KRG8suYϱċ.#:/1/Q9KRA8suYϱċ.#:/1/Q9KRA8suYϱċ.#:/1/Q9KRA8suYϱċ.#:/1/Q9KRA8suYϱċ.oXs:O=Oh}Oދ'sx;xOOaM?O=}/iߓI<ņm'^3~'^4Ӿ'O<V3~Oh}Oދ'sx·?k'C_4O^|맿R'~{~zK{S)ŗ~/Oy⧼_鯇T?剟^|맿R'~{~zK{S)ŗ~/Oy⧼_鯇T?剟^|맿R0@tH_#Hyw}Ɨx}%qŗr3ٞOӼEK,P_/}'-:G_:`tzLG/S?4o9KO/Cw:Rn#x}%qŗr3ٞOӼE+KfK-_Y?K7o)R-_thK|o)RMC[T?糴hK/o=(|zMK6W]S>Sɠ|'yqu_1wL\OdP>u~ҥU?טtJ9\yRc:4z%.'ϸƤT2(|:λsLG1/>Ds煟t?t>qO|5&ACt?q}8ԟc:'>2xɠ|!:ǟ8/K9~318 syt>iLzcX PP>舶:Ey?5S9>O=݇;'uSo18?S}8/c8/yRq>S9>O=݇;'uSo18?S}8/c8/yRq>S9>O=݇;'uSo18?S}8/c8/yRq>S9>O=݇;'uSo18?S}8/c8/yRq>Sޤؒ$x9o\ͳ]?.t IDAT1 ޚK}|}km"7& uuvUXBmydD19cc:e>g]gcr~LuL]gsv~M&w]x]01wMM6KdK06:l\svuv=&wt[tu6>g7,yL/ؤoqyمmydD19c.;n/Ye2P T*53/59;=Ų9;f}>gGX>g/,ŚbYY\aRB\>eϼkn9=_k=\@*ʸһTs߷˺k^hmRU)`eB|ΧeyO9;Y9;zsv7sv>.keo|VSp~@;=}}O{Oݾ>g=F{|n_rSSqpg/)|)޸c8߳ۗ~o1Ksv~ ct~J7%9;?1:?w {v;=}}O{O @w|˰5A8/]s^ct~)y{|yɗR8w %Q1%_J=FH1G}Nǜ|)_#}p^99/;s^ct~)y{|yɗR8w %Q1%_J=FH1G}Nǜ|)_#}p^99/;s^ct~)y{|yɗR%8k`Ѓv^vs1rzo \E=Fw sv~\z;9;?W.}Qmy+޾|ϕKo_ct~[|p^x>gʥ/1:-c8/>])O}p~){q~J?=FSon1ksp~uqԛw wsct>>])O}p~){q~J?=F]o,uwM8?19V|:K|:KuO}{LOỎO󩧾8/yR󩧾8/yRq>>19?:K?q|ΧI}ΧI]ԛߗ8/9;z껎'98z껎'uSosp~_S|:K|꩏X·!=і9󩧾+(lJ&}pl,w 煗uO=]D=V'uñeT1^Rq>wx*`9;K:ΧsXu,ǖR}p^xI]Su}ۂز[ /8zc~Rq[[vKy%uSO}ׁ9xO:n cnc8/|:>UI]mrl-w 煗uO=]J?-X-𒺎󩧾xOvRye؈α?y1Uøyd4sHzaC`#:$t^Vw|# 働GyYe؈α?y1Uøyd4sHzaC`#:$t^Vw|# 働GyYeS'R?+6~ʱMwxr|O?xK|a};VOIO9 rl%E>ŧ}$^{O96_آi>u/Sbo/lѴO}ji:)^ShڧcOKc{)[ [4S߱Z|ڧN~ʱWl=c--X->S'R?+6jRոh @cNT2F},w[xʿRO}-qd'W4{n 5z+Q&^'޻&GJ&6<_=tߍ(DddupYI~ӗ/Zz$ڿgmq'fgf|ԁ|#>k?183 H勖Y[YǙY@<u`/_HO:;}G;}wbqf8h?G-=鳶3Ay>N_hhNݟu$QvEKDw-R7TP6i<#n  ~U< [<HhWnz>9w_z vxr?@w{ Z_;/hR~y|AUށ;܁|ywzz띿~>g8N[ow\oWgy]wwj={>|տmW.;?NGQuuKͫx}lx ?z^xvf5guxNGUN^}vv=#:ڝh` marܯмGbբI&c]XJ&*N ;LOz$V-h2Vޅt >` marܯмGbբI&c]XJ&*N ;LOz$V-h2Vޅt >` marܯмGbբI&c]XJ&*N ;LOz$V-h2Vޅt >` marܯмGbբI&c]XJ&*N ;LOz$V- a2qbլ8M]م/h]ĉu~_{<\ο \E_кο \Ny/,'~E_5u,'~EL_0s;./X#Nsjf}A:./X#Ns;噾`w]_lد;l>wyם]g;[~#V<=W.4Hjz/{&ut++WUpU5==:_O䕫 ma* 8˞gݯtĊGՅ~U_e䳎W:b#yB[XJggYG+鑼ru-_G_U׳~3XH^֯Ҁ#|O竌3yJbq}Ϟuw~g==?qg|K ]a~7~v^k 9Q?{쑽$+LwgL>˙O;L]|Θ|3%Gwɻ1/gJ>=0=wuG9c_Δ}z$'az&s3)9HNLg~9Sr鑜|陼;߇f3x U7ܜϘ+{;wN>x|6w|9l9L^)J&ʹ>77gU}|| >YWaWy?_zxs;܁ Yހ9{ϱovg]yY3KM3CY$J?+;$KM3CY$J?+;$KM3CY$J?+;$KM3CY$J?+;$KM3CY!9 E睱sב|wG3{];wyw~4㝱sב|wG3{];wyw~4㝱z@7b`{Ng_w݇C;+>?ϳPg_H0HA/LR[!]#j?r9CIn$'sU!]#j?r9CIn$'sU!]#j?r9CIn$'sU!]#j?r9CIn$'sU!]#j?r9C񬁟 `"5x@wޝv]?xvct'w|ջ_wwݯ;vםw~zGFQ G镳yf+n?띧N=A4Թq~;O]bw٧7:#zK]n>^Sp6qs.KBr^/ʈx 5FzUf8^̳_u\qb 5FzUf8^䈽 :˗j8Xqgſ+>˗j8Xq {|A<(#M?t`/4Uq8x1ϊq V|ĉ>`/4Uq8x# 4/xPFě~._>h1ҫp0cbs?|._>h1ҫp0c*$Gh^87Ё]|PcW`Ɗ<+UDž/X'~[%g ˣ!gͻ 퀝 IDAT~Ȁww>~t黼yyfl-ټg_w>;OWr.?Ogagp;ZjCm__z;>:CmίˏfbtG #~Gu{_d1ȂUs~ue~,_|܃]?tY={,|yy9~z_'67k_KN|}6#:+_x%/M^֯e}wuީ?{2|or?ӧ;_@O=ey:ys Z'Zo竖Y~/=:u tNLo߳᷀Gor&'?~1f98gWO O4=6spzz'kw~{5yf0sA4>z \xy {5h!{#m~7OG*k,`h}vDi3W_A 2{cwT^X;ˑzzoMx?띧7#lkzzkt5z vzH=5:g;|oyz|>ROo{YFg[w`w?^~;OoӻGmxo30 N=1_кο v._U|E_مh];}*/ |x_їnvZwy|Nk>K7<`5^W]xu]_w+.@:./|͇W}f^u]ët /кο v._U|E_مh_7ߟ*gwgDKW_={~g믞~g=~lWc|vj?|+K~@nP87:-Z;u[ׯݼwXׯݼwXׯݼwXׯݼwXׯݼwXׯݼwXׯݼwXׯݼwXׯ5^g: lqy?wy~{sqy?wy~{sq+(K5p+e,+pB'&\a$Ϟ{{4K8yjͽ/mq.+N M"IN/ˣb3<{$OMq[\WDrS^7Gf~#yHxӷŹ814 &9o,G<5oisY_qbh&OMrzXe#yjM精$+L<*6ɳGǛ-e}ʼnI$W<5EcyTl=g)7}K[CH0yjӋ/{$SSo8'&r[ $Ga$ռQ v~@&#Vgx( y/Ǜ)|h}_;쿓ݿwCZ=W{{|Mֽ.u;Xɻ^Ǯ0zxar20j>=SoɭxG3UX++7j2YQ%~'bʧgʍ.jg~zVp?c_ʼn%q陼rڙߨ&c+Xr{$ Wg#Lwg9CվsY}H>͝Gxΐ|o|V=ws}s|;3$_;'g3!j9>{$ A{բ,oO;???|=i_|5|?x~ןozY0yj0U3ɯ?;'?K}WcrWɝ>wNN1wN~\sR;''՘;'j9Ug}rg}ϝj̝_5W*>s߿툿vn1#='wzV]|x澓' wzY;܁5g9CվY|V3!j߬I>OMxΐ|o$է&Lw͚$ Wf |v2O5?sVv~Y '>={e~GϮ;3^ߑO/W ^7g,9ycj[95ɟߌ%'oLMr8&999=㛱䍩In$';''gr|315ɭ㜚sbLoƒ7&uS|Y̞Xr$sjϝ?39KNޘqNMrsrg1{&7cS:ΩIN>wNN,ff,9ycj[95ɟߌ%'oL Oໝkzcl6yyO(~nAX3h]O3u99<}fnW;'Ƿ; ;sv~ga]}l>3]ϝgvsr|;y̰wݮ>wNow6Ov3u99?|51XC!uo?Ξ=k~?Ξ=k~?Ξ=k~?Ξ=k~_EftF[8zgĻ._>ՓkEvY3h_{?w=Ļ.Guz]_pu]~׏3t?뼟λs=?]~y :?;:?\tO_yyV wn.;3wuy_wΙ|zۯ;~]>~Gǝsn.^#9hᯄppT@ºX+W?^G ]3]x֯h}+wvyxŸwn>Y>گゃygzWb\ppw?>`?hW z~Z_qzl>*^1.8]x֯h}?@LJZ0k-2u+~Yc3VRW-2:ѻp0c3_RW-2:ѻp0c3_RW-2:ѻp0c3_RW-2:ѻp0c3_RW-2:ѻp0c3_RW-2:ѻp0c3_RW-2:ѻp0c3_RW-2:ѻp0c3_RW-2̃`UƘ"Dgvxzwt=q'c/AϷ/g?}]O|yykycAϷ/'??~v@܀3 `m>ppwկ.>oyv=>>oyv=>>oyv=>>oyv=*B>y7pΥߨ>3{^h~r`ߨ3{^h~r`ߨ3{^h~r`ߨ3{^h~r`ߨ3{^h~r`ߨ3{^h~r`ߨ3{^h~r`ߨ3{^h~r`ߨ3{^h~r`ߨ3,Y0`w uHoQ8>Ԃ+ӣptY?H}3W#G~;>P fx׿˗Gz[Oehw#}\/>GC-]._m== G}هZ0sŻ]Ԃ+ӣptY?Πc֐GCQ O6O/Gvi3ݿli3~]=}A.8f7<}A.8fz?] ptny?] ptu4>H98g4>H98>% Aب-]Up2y/ݯh*/k7Oͫ?wî{޽vݟ@=]?|AUrºvԼS?y< kw? t_uh*/k7Oͫ?wޠ{޽vݟ@=]?|AUrºvԼS?y< kw? t_uh*/k7_529zu u.;Wu.}vWu.Wu.}vWu.Wu.}vWu.Wu.}vWu.W*|R-LwULNޘѥGrW}rԧgrH.=H3&>=7Grt鑜.GU19陜1=Kw1=ɩO]z$'|'gLN}z&'oL#9]L>9cr39ycz$Gbz$_S#9HN~#OΘLNޘѥGrW}rԧgrH.='(VM˘pj7(wu~gG;]wrW;w~(wu~gG;]wrW;w~(wu~gkǿ_?iGcW xwչ~wwaם}yqy?wy~{swgc;{믞X|wΞs=w<_=]jߝ=W~W{yz>y뷀Gbw/tVrwwʎ4wwVrwwʎ4wwVrwwʎ4wwVrwwʎ4wwVrwwWnҝ+nН{?SzVygy_o70O$_otɭ3'_Ϛɭ3'_Ϛɭ3'_Ϛɭ3'_Ϛɭ3'_Ϛɭ3'_Ϛɭ3'_ϚgZ IDATɭ3'_Ϛɭ3'_ϚSLOupܬs<\ Y~|{ޟ/|bWOG};,TdWy?ܳW1;'{_O9Oߛr:;''1wNf99s'Qtgu?%ήS >0{n~J]|~s'?aggzdzGrtKNìI>KM>wN>;=XrfMY]js]ƒ0kR|ϝg2|Y|V3}|w<{$G;̚䳺$s3#9%'a$ե&L;'e,9&.5g9LxH.cw5guI>S!\xs;܁cw5ɩXr$nɩXrfMr215ɭ[=Gr3|Y%'oLMrV鑜%'a$.cSܺsz$>cw5ɩXr$nɩXrfMr215ɭ[=Gr3|Y%'oLMrV鑜%'a$.cSܺsz$>cw5ɩXr?&%𧝟y߯~}>?|=3,ZAwg)z?xe,jWHN_D=n~ջWٿ;_ݿگn]^/x2띏!=[oӳ~y|j?cgl~z]<λWy{?wg<~;z_yw>Y}>[籿y|~k.zyz}7뻳w?l~ggw;z{?w>g;Mz|~;]}hљ=wF\w^3{4Yw9FgisysF{Ӥ7zzg|Ioz]5:N=뽟λ~W3ktf&{>{ rN5}y:[u.`{^%o/xgz]<{~7y}~;}go=?T=º|<=w1z&˳7w;T38d?/dήc򂃮w?Yήd6pTo9{>sz|lgAj{w~#.]Ϯfs?qp<F{Ϗ7G~h*/]]5߬wղ7zsw_ȯbAwٜO=??χ GW_I!q3t}wշbkW?!>#Wy3Wy>wpZϛλOἫn#zw}wx]=u3f;}8꩛/7s]w=yWO G~+Ntλzf8K\qwz]pS7Ñ_j=o抻;z<݇󮞺Ry3Wy>w%~+fMUKqY_.ޠwz)?/y?>_h ;}/zz.yy&x^"6Cj =OY<=̂&Ѽkݻ_t7Vu~wus}T^Xn /bԋ\_:4ֵ/l?"f?חMu 2[x,FCS9xa]yx^#Q/bs}T^Xn /bԋ\_:4ֵ/l?"f?חMu 2[x,FCS9xa]yx^#Q/bs}T^Xn /bԋ\_?6y!j.Y鱊V]X;]~λwfW~|z]~ۯ;3 X]~4;]~λwfɻzchw w,`w|t9ݙY'=7zs3O{GgowgfK<֏{ޠy>yWyΟA׻?:o;5{N/gzt.^;}/VWVw*|y>p2˧WN#]>w._̭g}Uw}`}en?;}O❾˗G++s+Y|z]@f-4Hno v9g$gN%z,x@r^5>h̭,z8[yWg|3/pp@|?jGNS~w=>=9xV3Gi*/n\G3JzfW!>;MVܭ<+~3>`[z8[ >#|J􂃻pyC|g]?g=?]~;Y?%3Y|/qO|w}~|{~3w~hAg]{v{_~?z>wgc;{믞X|wΞs=w<_=]j_j\ ЫIt\o}VCz~hAGE󮷾{]o}g>λ.o?g;}w]~>w8z뻼|>[o?qwy|~>yl|y[zl罏󮷾n}v__w]}z>Ww~]}v]_gWuWk'̺ u&WI;$y&LxΜܺ9k]KM9us$x|V39srfI>w!.5gzsY|CY]jɭ&Ls䳺$ϙ[7;gM򙾋guI>;3'nvΚ3}R|wXޔWxȝZɝޡɝѫRiC$'crw̝Wsrʝ1wN^sr;+wNNw99{;'g99s;''crow" ?=~X&_ 9Ome9JOn+;Wj&wNv[!wNR4ssڟɝn~xvяM;]gg̳;Բ+< ]|{|?~|-Oh>{g{?y빃ßdGFZ|旚3}O䳺9LųgY]j]<=r3}ϞguI>wH>˝]<{&ե&L#.wN>w|V3}O䳺9LųgY]j]<=r3}ϞguI>wH>˝]<{&ե&L#.wN>w|V3}O䳺9LųgY]j]<=goZ(+jg4W{ߙVjjhj3^=~+;\=~gv[zޫVv8zޫR{WpFsż09Kf,9x~Cy&iG1Wb+F9y;'nv|#3VyYxc߯_ɭY:bX‹g?|9_έ=|llnwg[;[~>ۿwֻq}w]y\ߝo}llnwg[;[~>ۿwֻq}w]y\ߝo}llnwg[_>g7B]:}n.:}n.:}n.:}n.:}n.:}n.:}n.:}n.:}n.:}XFu hh+ϻݭr_J|wm}vWfR;+w[{]wVge+5ݭr#j/LwYX<;_E\wyNk\qg<{3h=qY|1kN;}>sŽSO v.\AgUǬ;} ]f~;O >˳7;vݿ;z۝~ߝsozgvnw~b 4Wk!v1+G֔5zjyy6x&Fx'yD[X>Oo8H ZjZft?}VɚxzACț78tz竞5: zzgUlg]o|vg6{x~>yY|3FgYcA[o?]w^?ޠ뭷Ϯw~;_f~og;o?띯zfl?k7z띷W=kt5tz竞5: zzgUl b5勖Ã;=B@A<u`/_HO:;}G;}wbqf8h?G-=鳶3Ay>N_hhNݟu$QvEKDw-Ĭ, q~:ӗ/Zz$ڿgmq'fgf|ԁ|#>k?183 H勖Y[YǙY@<u`/_HO,uI e.]gyzyGTᅣ+/(}Q?_s3Wgx( Kw>J_t_s3Ugx( Kw>J_?aK :sy1Q=>W =t;z8sfۛA}Ϳ?w3gf+Ga IDATt;z8sfۛA}Ϳ?w3gf+t;z8sfۛA}Ϳ?w3gf+t;z8sfۛA}Ϳ?w3gf+t;z=wԍcԋ\r]ޞ;9ߝ~z}v?sׯw]Y|wu{>]wyg>ݹ.wgs;w:[=~w_z뻼y]o}|;9ߝ~'X\gruuDzvj;._>hV ,+*`F|_zzp_fnW\w_j+?>`F|_zzp_fnW\w_j+?>`F|_zzp_fnW\w_j+?>`F|_zzp_fnW\w_j+?>`F|_zz_ Q0͘9&h r}wW]ݿ;1[yY{ҧ|7+~V>rgG vbwfyλg|vξRZ~泾;_翫;on>뻳uw~泾;_翫pu&"zp^m?{>GS^BΉ`t9/scopE_xs>J_zMy 9'|hۏ=rN|㥛(}Ѯ뭷{+z4/ K7Q]?[o?Wh ^9n>E~~ єs+/|Gv\o\ѣ)/x!W0^z7GS^BΉ`t9/scopE nC{߮~w_뿫>w~z{߮~w_뿫>w~z{߮~w_*?2_uY'wֿ'3'+_Y<5S|_z&O֯KMr3}9ۿ$+_\闚#nL_9b+_\闚wgrrʼnI$WX/5ɳG~<=ۿrR'WX/57KlCH~Up_jg3yz&別N~Up_jo헞'&\aJ$wgLnCXf#Cą4H &9z8#V>=Wnt&9ZW#=u3̚ݯĒ3OƊgʍ$GKoxHO &9z8̓陼r+5қ~)^8S7ìI*N,9dxz&JMr_i0kwK<++7R-W#=u3̚ݯĒ3OƊgʍ$GKoxHO &9z8̓陼r+5қ~)^8S7ìI*N,9dxz&JMr_i0kwK<++7R-W#=u3̚ݯĒ3OƊgʍǿ~wS '?2.z>3vv殣^ghό.?3cgg:uvˏf.zoXp]lhȝws]g;[~#V<=W.4Hjz/{&ut++WUpU5==:_O䕫 ma* 8˞gݯtĊGՅ~U_e䳎W:b#yB[XJggYG+鑼ru-_G_U׳~3XH^֯Ҁ# xn=`xW?7]n/̿eW[$Jo9uGϹC_j_Oܺ!/5ɯ'wNns|旚W;'9wH>KMɝ[w;$&Uzɭ;zR*}r=g~I~>sr뎞s3$Jo9uGϹC_jӟ ?wxs;܁|;vc]WsGIGɏ]3&?7=.gL~oz$?ww]ΘhH~1Ѿu9c}#QrGG~wɏMGg'y7܁Yxs;܁|>dIrG'LGɏ]3&?7=.gL~oz$?ww]ΘhH~1Ѿu9c}#QrGG~wɏMG?XCFdX8@qgQ<Ÿ?@;~M|?_|?_?'73>&ȳharWcΘhH;'_w}ЧGrɻ1WɏɻY>=ɭ3&?Wr1HN9yWw43&*9y9yW7˧G9uWsG#_|~W3&O9t4|s䳚$[zNCY}jɭ[=G!>5gzs֭#j}|V39crV|>wH>OM1uHZ;$է&LxΘܺsz$_S|w;3&nWs$[zNCY}jSX+ R< "&5g)W7wHn$'o̝[95Sܺ9wH~>gJ>OMɝ[95sqNMr$nv_ϙS*}rqNMr!uS15ɭsWs3$Jo9uS1wHn$'oLMrf!U)?5ɯ'wNn$;$K -f `8%S$Xg ذ'y{gVd~,i3F3zq8P8psc 9'sEz@zw צw KtW^i6}]kx^s}war}gU9VE[W+ˤS`'ߵFq''uMqϺzI}OkON%?Ǜ⊟uhٟ|ٟK~Տ7?'?5?9o+~O f]kgrR/YW?WǟG(^~)YW?6wQIg]xS<bPMȉG9guqU^bzz*=Ԭy0@9 _wOK0Wuy0@9 ݕ>q/_}d&:c+w}uW1~Az^@d|5zθzOίΕ^wT_*?ϕ^ߟ?w(Ԅz/у/n=G]O'WJ[y{hP9bB,y6N}&p^ {h;lr+:xG185/ǣN.5܊^QC fx /񨿓K}&p^ {h;lr+:xG185/ǣN.5܊^QC fx /񨿓K}&p^ {+މ܏l}f]|?ϝ}ٟ~{Q!ȯyٟ~zL~u'_ų?T,O#ge3YYG~Sg򳮳8<9*駪O "I֙{AҁCO>z \U xͻBwbXWկvݟOoV_e}]q~?}ƝyǬ_/yWgf' |@Uw(杭fj`5/o.Ouh>j`5/?Lލ3B=yGs^zu杭o w{.D9^5Oz]?9ҫ꩗zufo0~zUgLϟ;wgLPOާ^u=z7sWջ? ^UO1֪| #( Zw2/P\<h;@q0rO /#È?ʹ>1֪| #( Zw2/P\<h__ՁPe _O~֯O<_zWng5/S/9~۟_gjsh9?g~W?YZ??_O'_ռO~֯O<_ɺ%%)^fO+=sKC}z~y4t|ff t_;AnQCCg9>̇^C |fozۙ7Ļ_NF>g<0WRUƻ w,pU1 }AWŞs? *F{5WxoO/]PQ9\]>JbtAG\sŏv+Şs? *F{5WxoO/]PQ9\]>JbtAG\sŏv+[%5X?/G|f=yʓs8@R<蹗^yEϽ}F,еw?+ze3|fy^s/+|3 t-]{Y.Yk)eW gt]KqW/^V>gZzٟ=wx8nVjw[e#?mvWv^~\vGϚîg]=wo`_~ ߹ =_|go?s7V?x'3qN#cwqN#GZiWxyǫ|gW?;{wxyǫ|gW?;{wxyǫ|gW?;{wxyǫ|gW?;{wxyǫ|gW 4;̽&{]w~fWuW_gܓ3=x|sWwx69_şܕ`'ߵFq''uMqϺzI}OkON%?Ǜ⊟uhٟ|ٟK~Տ7?'?5?9o+~O f]kgrR/YW?WǟG(^~)YW?6wQIg]xS<@3Z+ .U^QgW xڟ5OGz}os=Q<88Rj>?х㡚߭x>}gWz:{{}C9Gjw㡚߭!#yP?>Q9.Y`k6.@xÕ1x4C'7{&#optA&ZꋣUOk6 p4+=bhjOnL.G]J?\MGlrxiWz Rܨ\.~!]k/rW=F3Ө>Q3w]|+pC 6R_zR_ɍf Q?\G3TK}rgr?ﺪ3,qp1pt&d|9j#g=F=vA)<^b 0 qW/9GϺQzK~CgWݺQ~ ¡/S/YgWݺQ~ ¡/S/YgWݺQ~ ¡/S/YgWݺQ~ ¡/S/YgWݺQ~ ¡/S/YgWݺQ~ ¡/S/YgWݺQYoRp'k}bPR#H_Ѡ<6U]:pIdĠ} *?X9+ԓl==Z2W,z5avGg3~>1XU*슧:\?>̼j/ʥ?Vg>3so]❌JcŇ 2[g+.~^3~,ŏo^`6(L^83Ϲ?O?}bb垁y?cr}g>QΟOOڅ1W? YgoEʓ/Łg/?I_z_|`3T_ uU#+ =#~(wt?j<,@K sb$7{i_su9ߵ7HE'E5*~urk;~֥IkU?Gz{e>DCgb\q6O/IkT?Gz{?/+^':sR{ &_o` d{'\8cz#f/d=%g&WgG>rw1<ŹxFOY9U=h#׈zK,ՙ!G5x`>.jY33B#j}'/]8fTg8GghGOֳ_pfpԏ8gtPR9 qT&3?Y~¡6:sQ?:#D<L>g~҅Cm6Ku怣~tF6xQMÿӠWΞZ~s^z~zT#ΞZTs^>Wn9zF,=Gg}{%8d=K,ٗ_ӣpղr{ 4,r!HXg]?'_~ AǑڌ_ե^W>?cxܙK?z=q19ГZL|zs&77IԂGgb{wEO-0GuyLN:|8:3#=+z=hM?crҡ'љ]A LnQo=̧H8GZ`rӏꏿD?Ĝ38 FN\b{|;7uU[ջzf?`=Nxn y8;>H/"xߪc6 f;`ݝϏ}y_G7~~7,?]f=Kj肞S WH#R[1C|'Jr肞S wu._3|G\r~G5tA)+F{ј!G>G9tA)OG#j9?ҁR#H|VhPڭ0+U]z |oW~4\ă7 8`̅_+=x`Zկ{{{OrG:`L~VG1]+=x`z噹`ίX_W_ WgtJj~߫/ `AP.HUGgٟ<}p6:fWS/ٟJ^?]^UOz^r<_[>B=Bgh =yL=xcg=xcg=xcg=xcg=xcg=xcg=YW%i^1]=n6x-?]A~y!2$x!Zaop[_ ߟ߅XaWp}.r^H]g/϶~ 7~ 7o`/yo`o`^ o_^o`o`x ,| GA{<P)x<ߝwgxƿ;<^=w=x:{<;{xux]+:ݧ|\w.vyfROJtG3_)ݧ]G^tĮX=Uj]/L乆[=W{Ʌ/LGJ rgFcG|)f3/Qp<'/GѢ5=^~" ԕ9?~U缻WU ToUyoV@Vο#G tzGNgbS}#Ouϥ֙ի&_yx~+:sS^9b0g^0+C vKgX֙?ug~W^9b_g?s0WL߭3'~:{zf?y0K~Uc/0Ƀ_ήt<{Ouvqw ~`+(.^`sg]Ax\w]=<%? J㪿/YgWP:W]~W'~:j&< sފhj~*U5b0fy]U#sފhj~*U5b0fy]U#sފhj~*U5b0fy]U#sފhj~*U5b0fy]U#sފhj~*U5b0fԼ?X υ_I_zY}6+ɾJ4C?&AOtF]梑#׈A]~ex2̺^#󤋦jļgx2̺^#_G5bS/uۨ9`u1xv']4U#}e=uۨ9`u1_<8Ozٯ3F׈<颩1+ٯ3F׈Q}~6e.uF >O_3́ʓYb |RgH_Kٟ~\g=s^_U?v_gz>j?9;Eۿ>+YNg V-y`ޑ6}`+Oopц31zPՙ1g&}`+O~hљx̘a3yaH>0'G?\L ^̺GOInSguU=̺GOKnSguU=̺GOKnSguU=̺GOKnSguU=̺GOKnSguU=̺GOKnSguU=̺GOKnSguU=̺GOKnSguU=̺GOKnSguU][D=<b#իUmĽZWhNj^ů]GܫzvUuĽZWhNj^ů]GܫzvUuĽZ')wF=i 9 &`W^3ȵa#8?3:`g+=ҁZy@QQ-#>QQ-#>QQ-#>QQ-#>QQ-#>QQ-#>QQ-#>QQ-#>QQ-#{gyn+t+>ݧVfwW<|&OxLNw.3w[ݧ_>]g2{eowB$z\X$4㙌s<3=N=Uwxg̻g7;{3~<9?_}g}xϼ{8yx}7~ p3}gyox^q ECLT9ml94@H8&ö@*7,in4m O)aov]~ۤ`WOgXX8T /=1r)gs`{gg3Q.Xz3sPy"x ![8~~^m; ou~o)`q-[5=`cGp_Wft 8AaupBb@{n DQ 2\'A D8@]PA 9=3/ 6:I@A C~P( %@P@P-jzA-4 -BߡmAA x2BaG#DQhC!^!&k}$1ɁM^V`O5njé,q޸\7$qI9'zN4IA'"#6"&Gg&n'~CB&a%$#q%9MMREddxy| ~L! '5''M&-%m!}C OOJv,,lAF.OnID~|`PȦX$ԤtL,lܣb:NeGEU@DjZچ:zzFƑ&fK+HGGA[O;JNΉ.] = Rn 6 gze+7XԘ2>2cE͙˘30䰴̱ʰ:6~`ðٲ%e{ˎdafO`!aq#'1 +%E.Z.U@\}\ܼfq5x<<^sGڛٗٯT?{rA!ὣcSS3s z fVG@l 5(wG'޳ދ7w_f`~~~'K0B^"'D}{$)Hj^3V(3J;*ҪjaW55l}}}cmJfd.akil]akn~ê'ۮlnڄPo*>~cmBMC CN{GDF&Fe.>s?9øĒs%IE狒䤦MwWofpVXvP_e<+WᯣNWzI~s|NJ3Vtwimi]V}^{?jD:f[boc.ݎ=n,kg |{vmx+Qѕoj^ywۘ8C+&']?iMNS9sj Ӌ/} \2Zf]~|Mm5u ƍ/?W~uXX<9#QѶlhSR-Ҕi32U0/ p(qp[ #"E3H=vY]jFXVTNWC!xbRWy:6>9?c:C=zFƱ&f 9׬Jm*l+*+OV;qqi! &)Oi1 5 37tr?}2F)V,M&n+~%a>ӹRRէ_r1RXFpO!dYe<+tѫ-J'zЗ IQNu6u%UU5d5$u=Խ;64?֜גۚJ[Q{EGMg듞ѧK=sF^=}աՑW3#ޔM}X?MlNsjyzbf`it>mԢg/K'EWWvN}~Gjavܡ s@_Zᯀ 6"D$Y A[c<_$/<JTZ4hhw>?fatgf&fdibe b7$'WoF RPUHhua_EQ YFD =;yy,fKddeK\EwRU>!rbOEUC5sRxMQf]ވ\CO#Zc+"vX3Ms UV֌K6vV '$1Mn{{7ؼ.v| o;g7 EKO/cRX& L@/ 2A={f!5@P!tz.;B ለGT ^"6\H#BHQ*0T5j͆A砇0LKŦcp8W\ nȈh؄ f]IQddDg(v)cU5:9K ht TSFwX.r6ir`9J89?p6e]p\j}ZSXsqkGۻ.nޖ/_=zq\~}gg߃ E+O8~pUp A?D qApW\n@MpM" ^6 E (,8*?P`0a,[%`>>fcHxo+Red9LTTԓ4( :v:z 1Pg`f.aaYg-b3`falr[o$ (j?R$# (&/>!vXdTtLlmOޟJ&ᩙբUBOQa1i q$mۻL'/8:y9wEߟOK{>~؃3CaQ"}V/M J,K;"!u9="R~&gֽ܁<|ւ׊ M%e7+*5)t7ܹ2zkLӽg[/Hx O}NxLDا/<1_7mlObv?]APɁA;ƫAP8 A:\7F!")d?债ZGyLf-Ebĉd' ##&7!ߥCLEKGIG3DC'B7E_@`cbagϺV!ljz=K'ɯ-`"h-p[8B$^4Sx1I `B~9 p|@rʶz&V^aƛWZY#lN"]>=ؽg}}&L %D@܌m{pܙ&)m2Tr.]^[[r-?ך4ۘ28IS{}/iGF{;Ҹ‡ʼnOv<3[sS վD/,7t~mV=*Z:z͆FO57WtJolEuߎNN.]ݎݥ==ؽ{K]u~b߀ }5o(\uQGAm/9gx =m &,;.F`% MSm!cc1Qj0BƟ~uPS =8L04f͍pm 9w0x,4Ѓ#0+ j@pΰ& 0c?E&ة7a;/ G381`G q;]Wcqlīw Ň:BQJ(9C1$J^O`3pxп_{ؕHyKOX{]h塵׿ Rҟ5O<P'%"jZ@`dg \5Iw8*..EA pHYs   IDATx} \UWAATD1-\ H]([J_74 lSW+&VB/bu%iVBb@:( 220<߾vP)T'POO^e $Gczn3bDRƽ G d ]U㘒uǠBЗ&oďBF3| \` Ǣ}|̮O̾&kC!`0jP}K HW+;1or̳qpݫaFo6/^Z_5qhJH=to$ 49 OƣRN.ȴA#p9 *l{¤Cu;ؠ_xCc9Q(Mg}#>u:gTl'{{xs99F]>W=9ZAckb04~nl12;l:jΛd`hDҳg/7#lFestj!kzala C!p?#8ӧO7,%>gLL.ёXݼAPwFOfL0r|~yrZR3/O w!|(TȈy)78r9iDo6h6ݮCi};(KhpB`^|v7;dhV 5TpiMFWxፏCWHšן껝{LwKi8˺FՉB&a|x8هCVil*|aa]\Ȕ;V_Un'?:SY 𖾣]]h+8c c5~\R7NC!`0:3i&]q@}x  ,DΉ8- Уk٠r|k`Ě>ekP0(9(:Aq hpK\1xHL, B'V=ݹ!Yն.xy-{2sּR"F.5)z6Z QGiI݋,cCuc<3;%!c KEy8WgΫV%h5>a{->N׶@*W-tbCtuܯ`IyVr [K;N!+f0 CB)oAUi01CP )ϼq,NcNJȜR-Wćc6CXϪ GC}lT)0ovGMK7(KpE؈U_A+o *JBB!W8cnܾ}E-Tvr;O#y"pƆ |U߿Ew❙A9PTA/J!G[S RM 8ZMy{>#eJB?UKb..JCV8SϢF-R3dƛwq# 5*->1!4Y7ER%.d5dWiDj(Ky8vcb]s9qM~ 7e\8|>k:>ݿsJq0_my:\\2v3y\U5ƶ*s|rwK>C!`0:6\(Hx-|WQᑚH0*_5 ?]A X| M>%ҩ4v3쪋k *\Ї)܊ƶ|) O#4gg#<%海jlCvKRz㙄 }$e0ūXvU)~ V j$E)aoǧ&whnWSF5)&ؠ ~ C!ǚ1y9'5B Kcz })!'~rV 'jARŵ.B+U@i6IǂJoƭZp2m-Y:v|"+{cj NPoXHAT Хq Je_zظd'fN1g,<(L OQKc|H,WJ鉘:=4{ lQU$o;C崵q:y+? ,[yLL =^\VPd9$ y>5`S`h#B߯KƦ͘%6qo'`yQ"g!%r`3$aJE)]ǿJH;e8h+o.[GJ(64G ai[=*S+~ X.|g⿥o3`0 @{e\6r|KS.bU{$r! jI!s$r'Q{74tH$칍l\,٠ѬzNk`b9kn7=gƽ?BMq#"L ڐ G66#SߠؓdBf=v<.+#Vc:f7]/S_wn' ̵3_EBL,!2eWU^&4']p -S%<,_?   7{bqr_G br AMPFk=|T@P"ԋTbbdA"i3L,yt2^pws12Luv!=2)] o}9gYƕXv#ĵ1l\-3x6TvHĒr6r>B0MU3ҧ7C2>4yѺvv`Y!~I?t́Cj5yp YH<5c'Ȍ cKC^#2h9C<_>AŘ,:8 lR_!ycr L|rx,B,ĽC"iy؉1:4ı@`?R/X>Bb4n}}cT:l2c(Ά2X mm@l/0!3 @# AA>i>' FC#/m/")عiByI.1l>+} ֈc#O; Jc rh ghp[2uwaWr1lŶ\U;!BLFM8pBȳffa_g04B)xM %]]gʔysdr2,<1=>``a+ SX(ƴͩ60-9'ޏJqӂP dflHC%wdX,D˭pMD߾/hտq{ ⒣dhh1#B:-d*(@}&čC{c0 C!BnM Zu _eXpz2' d.2 sA,j:B"qQےRm;D'Ją ZBh;e瀖ݶopm ը)>CBnEI ghPN]dqښ^ַ} F \w\'kz ?VK ؑȈVKm9#%&Z+ b; *pF@Ks-/Ė٨/iC[0 C!`Wtq_̘e0 CLlG iw$׎=HYxޯtq!`0gΤLOvEaYtV-!`0 C!5`FV55ѱZmT[cǠ/!`0 {664MOkU(*(nFCьVyg-ь9U'ⰒE}IɹVV~аq1aaXSzVjUtIƌ '㨏(,v'2f~ݒ|aLJ z%#ZU!˿4jqDc6݄ZlbcO8gt uh?n"b`d4-@Hu, Pu,3M/ݎQ~~z7ΎCmYV/!<k#%7 }dzf[ 0^Q-WM3>9 {"p󥘻#Q}NÖ!5޵kTؾ4E@Ri _IUXp&ᓠ\$ Hww">a"h[I;) tHGb#]>?dq/=n2n%㋂tNb+0VĤdLK;& Ds^سqh+0 x!:Q]zm CW1˫%g`|s n{3/?)8(\[(/OyW!?aoHԏPj{L`,C!`0whq\@LJ^L R KBѠ`j*ğZy l@fyʂtnFG2?w?S]Qh;4l1ț(@hVРDqf>ycqZypavz16.Aw{z~=߯Pǝ=}C*IXF[̕&94^FYԕiNz7A}"k@OLh`hȘ,Y @\#[⚕|"3'/E 3OdW/\h?/ؑ)S9+Ph&y˛ ح(ڟ鎫2J2f"5iBt :qg; )_dF+ox R~4gRxWi5ދ5E@TcF0;ܐ1,Y98OŋX)ˣP_"r%_ĐĔdaXiSbvpU&-cǭ*brSPiXrc }D1=ަG*hҬJLƞ pZ-5HIͳ^CcD_?FfdkS‘{ªG`д Fb )bt b#iR|8, ‹a&]C?8{_)x j IDAT3K/I\1>yzh50efe? |R 4#18Nr+z 2781%W0^$(Sڇ;\2x_+B@[!=\e@pǯ6xC8P_JΣK,1 _;.|vSࡋᷴ+TA~.j|u^1rcpt6w]MGb6UHS V M|?fDqikLJXZ{H`k|IN>=$XF5^ۂ8}_zKg>fĐm1#́U=O j-k<rݐ#I 2ҟ?|DZPE7nOb׎8y(^B3פֹ{Bw;U~%SLS~i&>{+`ĪU?'?äY_!vHkѓac60+m-&m[vW e?DbeO`rB' b7>QGƫBo a%ZwS{~>=r(BUny0BZ"YLbg!)zFG@>g!`4mC>_.#}eXKjX үZؓУ>qox7M/Aw/'8 wz<MW݄ 4u*uvmu_ UO `4F8jѯ7tmҢJYA;yeī\vZ-Tg߽6ǍըaQ$C~ayyvWC}ڊZm"%AuzS꛸x^cl6ná[7x1e9&EN}{76'TdJqni|?O.p;tsBOW nV=ZBFH ]p:`1f4 ӏoq‘2ɉ7gSP# j{ox ovŬ?'GrD[Зe |[ IV"xX>7wzPF\ߋ_%jփ[dHOi3b}%G`SP$8!㣱mWp(} {4,<Lّ1ZRHozGEDSDIa)ġ7#nkH00;_ P:LH?`LYk~,3+T sbEǗ!FVts'7O/fusLjeu '#0;y::Z$x$fΖ`\DhBy|+J0&_̝DȜOĒ] b5fH9ҿ?chq;R ^P)`I,D"p5z6P{p2:=& :ĔV`0Y}`x`s/:D5:MM\&4ףE=BWT|_mYВgq.f'E6m>i\b>@j88p_:G!p؆E. 2߃kǐv*b6* TVCE_ Խ+W*h)6BSU vZFu_"ai#-s B e)iI@Se.Ѐ EF$V`Q؍c2lo峤Fv294)~hAo`}1ۿh9s'-J WS|Fap LKĶ*?smZs2#j^ .Î<ćsNqd24$<$ADžPX, +hFHx>yk=ܓpUh3,<̓  u^~ /}zD' k'bOC? !u:d C^A@/OWu Ol/Ǜ30BlmR6ޏs3\+*O_ja*s/|ip>ї*fT{/B  x>]=N\Fu0޻dVr QV])A?JxBZqFi"]]q( x  FŇ+QC-g/)z y*uA/q W.zy |3[Õk85s}Ә 4*<-Th907FX/6>ð/%@S";1J;]q3. xb:%!};֥):ܑpY5 !Ŗ%7R2- fA:CM_>I%c@)8:|/Rף %"- ?F\pekA?^H Ei 3fLM%'Cd/!DP] GƎ.cT,^E ͛M|f-K6z=,7Ogx+'ƚTH3qJ^PCs ȧўC9b&+)'dz%"KL?9LP3{,>`> j#hWM ddlZ@/CaI\Vj0q!^0a% PtBH{A& ߏؒba0. ETx߉]ivS- e^}g#-!(ؓ}\)J1&GWgm''AW8ys(7"vX$$)w#> W}lѯ?䊛pWz9-w_ ~}*p}rajtܞEL#Wm k4FV'_JUWPZVC:mx{{xtqچėUD dOHȹ T7t54nHB$)p}/GˆJ 2.΂ˍoTu SW5=K]2Ip=rðob"DH(vLiivJdHxrX'#s8h4d.=:me4r pl >&RdcL(bBZ:%ҋ.1Kط7nWQ4._i%$_hƁx0"7OR Dt&m*5"$6b/GzZR?^ 9_AǵݩfBc^f&؃;dܧKT/jk|J1b||xb`SH2@GcN.4l|jBZ@ | ϒy2%>6iXjVy  f@kn +ieqp4"~?,]%C!0ԟ;T8~BY"mAhP:)dlvnLS(j%oު Z.$ Z.=0W.uJzn7 "q ͅܖb'DM0ƍB1u$PC~h8825q ̂h&qLoV2u26R\ȑXO-c-K$x(+ϻ?:U_ӑ SSϏ}ZQ] c'Y`i4@)r>2ihZawVt VҤm~IٷV[`TĬx[ZnT\Jkil0k䶢8Ę6HeЍtZ*qWHh-uT\2b$Np5*xV5a;0ѡ.(@ۈKx;7{څ?~'Q85I$3!CAph*)z1d *NfiM(69δdx>eo0bl[1txclL%x ˲@$0@Z\g_§j΋LZLJ&zںW@S@Ů=.1KGSww5pƄ>䉢?Yj?w})wbMn]\҉0 C!x P)bG75( h:yQ?qȼFy =E PFYCx9΂T_cWjA%,7pK)$^ ŝ`՘nEψPb޷G]FJ[ Jϒu g*&r߼JstUN\42;&~Z7QzU0EfSmxQⲛNQe ջ8M-.nj 'e}h*qV' |]1۶##ړ1&esrV`0 @T%gYF6ol> M ~-TPA5j-ֈw-g_>zxvybv.vd=-Dctzċ4iSFBLO8y}l<7[m`ƝхpCWأBC[b.߃t}ƆVmD~F1Ḁ<(,505Xke4,kqt{}[rmiסYHwiq47sWK҂#*ЋgAQ1bS6ӵI#:Xek{Öyd% C!yL4DX :!ZJ:::mƝpX^Ւ{~;AOFz5à@3dVkcC@.Kt Գʳayc BÝ,R6b]XŶ2<\S<TuxבAUWfDx. Ҷ;pc0kci_u@0 @k   gFu.# 2|{ !60 U{o8D,bnA'|Ѫͣd'|]me12 x.ވ2`Ba~_2lC5Ɛ&ת9!`0<Q?`hWὸ_`} `QT| ˷&`0N6"W7>[F_ċtH`.w,[EtZ%wU됐Zuy{1@_%q^@ \_QC!c?|PB6'38^iOP/NoG׊pPKt_UGӡt==<$f`Z<)u+ƺbGg3僰4d<p ",,D^/>khڼQbO.Cǒ:=L.!xð?avv,cOPfХ%7S$EyؒR$͊ĥ|ISbZ5ܮ A(-~kCדر}~>G.0-3]3 C!`0l `ڨbKORKR6q(zy9k3Tp{S t@(ɥȋGl6|ۂ<2ڙô.Yՠ|YO U:ǁ[fT!ѭIx]5 bPX3^FA&l$ZrIƋ!pSP5-#a̙+)w Q:죓=-qa+1z(j?ApPlމqd(ⶡ,j 4g.J֌H* kS]|Jhj#M64(VXdCbnpmE_&!6Ŗ-#TbpY k_-AoijYv/`dF |٦lUWDjC۴V!`0 C!`MN̕!f^xT'!R_/r CbD C7@]XKWs˦x n,=> ~ \?^{@IƆ0sn//.P"s[?GF!`0>j22N-l:ҹxr+HpvyOQo{0~? v%h܈ujщtщ<$cp,1 C!9I/C{-zxnY=__]69!)w&uCa*>y@WpƆVa(Rri/;MP-9wHOǘph'#5 K0Ư]PYSA$kщ].|ذ(!f3 @+Hl_1UiXdgw]!x ӿ]vrB瘵:]:=%6t uehRJ^p;T,YObʼn3k FpȚdh˂v s2tBg aSp: r<=xs&;Yb;C!`Ak5fӚe=Pm/]r+Vʛ(D*y+xOBb)Fyw^K~!yB(+N9+v (@/vV(iؼb`1όq4I `Ip||d'56VIS#)1?ܪМ":|pJm놧㓁uǡnVFyDp+#_a9-Y'nZWdFzJ;o 'ł1,@W&yaÄ0J8a]Qy+({-~0T3FjPdЩzW!Df]Yؘ C^f<:X ]|@|>Y!`0FtDѳs8 jً]v ,g;:;$֎Jg!pƆРiHٚPXIn+1XL{q)j6E2Z3ᖺ{vf#XSӵlU 2bg>]ޜR~sJ0q5vDk"FyȈɓCqUH|GaFBVO#bj'^Yd_)rN).$c p=$8#8g0uۊ8j]q'tE#E1/u6O ulAM+JwsÁ jN;`mM|'P_^>{;b37F~vKt ' S$M30"ysʑ#fFG)<սPjL+C4j˓4h,4zHq WUbK T;C!`0t 3C"˓Cіw3]~E7d}| neO/ 75Zɿ{c3KJ'n#ǒE႞vg"$XٝŮc"^mIlC$OLx!jV+k8 ,$%'IAƽo>mSYH4f> C]wO;2Q ʚ -k-Z"O5ؕށyW0, Rw{J0&+놳'9%cBƸ1ti~7Ԯ6 'vywe-YYIå?M7Evy]—[/Q副>~H]q4\1d^W1+Qk4fq9Zx2XP54bI@l(!riؐJ cyƒM $^{#썿vwRz}9[PY1:*nS(uͩ;JhU Ȑ\^ Z޾1if GζkH&Q8i] ^D1Fٙj,?4bJCj뎯r]0#"Gc[No\DcȘD.XeDvǧV [-^ؿUӯbar/SҀ'J_NW7 qb|n}n|U2zͷ&2@D1ss& n3 ˤr}l2%_j8nCm`0N4W8dÐcXLUe:F<`m>u~ Vğ=l*t.wolkB&_S5|CsGtxPQ!~@.vVA¾LZeJzw}7HL}Ěqi]DP|"ޘES^b4m.l(>.W(?5P0aUPG6LW+#Uz_Tū}EQ-Yv1ԫQ  ۸AF>RO<-Gy$H̪fˑݳ 遄=Jzl y?gi,/XWzRχtdx?ߌ1 C!`ܧtM5Pu _eX~S-'HeAĆXIV,ŋBof vsA*HP,AY}P?=J-5~Q]%]cy{/5ҜRuuV)>t0Z:y)72hs '^<9HuqG9aE[% 6<Ѣ |G~V#9~foE fIpZ_k!|`!pT<$&.5v6w8n"|] yw>:% C^ R̔֬~XmV[n`m#%H˅ \ ¹g띍ԝEZD^ |#GYU8{m"ëcI |'v⥸N; x[blKJyn8jz^[hӾKa3(}EN;ع-|WڀnĴIB}}%uW% 1 X3{Sש4Q<&~g2~O ޣx( s4,c^`:" ]֖U׸xpb_tyy3{m 2KhrCz⊬vsXaɊI}ܰqu z{ GStS ~ŸGWnY!/&pVfP@3q̆;OkSoTN b c׃?i?۰2: >LWώGi) ]}+"`tK}OUG<רsC:iPya0-$l9kSp#vXݙ#Tb, Յ@P_¢{Q~h֭bVWڿb1pc/J#? b\og`sģxbr_iv ŃW}~'l޲!4-Ki쟈\<6m:1P'Swi4ꗳkbhGTD_IZMɯ}enՇ >1`L 0&@ aУtq1/R-aٵ3o.GWA;Y~_k.Hzp'OUQCGOuP/i5_aƴ4Yah'j  DvĮݴca'DEaEt _iׄd}:ߊei׸( 8J?tn\g8o9GٴTjN_Z2ȹ ժ>rwt9F3pUvuX_E8}3C!/L4&& 0&`L 4@sFT:FꇁÁohZ_s'Fv0P'1l8m#^P#}ի(@p.s-;ϷL_tz1h[TM~X_yf t($R4P & =:t.b=({v 6&^f8sbH!޿[?oƾ-)ইi$IH$>S 9A42K30qoݎ&߄lexnXQB)M ƻ( WQ,׺ ȥrw~:FN` ڛu 9h2x/_ON>T8E &`mI`„ m)`Jek .lxqM47Z}o1j\x /LøZC@4qzUWn+O 4t Px@㒮!KusGp9wD`P|XH k5N1&hcNYB*$bp2Ris\Ae57͓D;[݉-o{rT:JPMn!}UtUTEKNſ5zu(B \&,]]c5XN3E|Ԁ['Vd64To+ٱRIONWy+`f¦F%޾AlFtbb̌T Uh6/۲kO2-n‹TKK(jG2^RE Nu6tuu촨(5Fk@t*=V- c]xul Y+eL 0&`L.aPa8V'&'z}pt\_j >_{p=`L 0&pHOs6D*O0PC•>lSaL 0&.8C F5N՚tîC ?a@`5ʲ~,RmWQSV?`iۢ#Js݄@-| yݒ艝uƍ1|t;)LvҁE֬󠵴D=Я *M198Y9\6e `L I'9?';6ۋ{e]_WNuh_|CN8# o.^hPӡѠjU96 Nvuhn޶!b5W˱p5v4]-x嗯TNB[,AwDy&j@'T)!YudkJmMWZ| m!tQC'KCZ[֬-WQ-2?.:`3_[qn;|WR2qPҌ4fM?Os!+*v;WXͬ8#?O<Δ\l_ژ@ %N`L 0& Bd; qD w}/ M|%;߈ɛdCtO(]Li\j s5C;Hpn!1~?t$88{ ?Hv6jJ5dl]Gq](}#,$7Wc#>]#+,ѼWU1v\} Sagz"pQT)fN;m? 'FKuy 6?v4ldSᇿt%ҽw%v{e>23鮜0ZE"˨.x 0&'_s4(TسJ*4 )PJQ2}(Muy7"zBz/?'aPf%eȭ29F?#YePP W魼ԏG~>;_Ɏ^?3bTN&$ٙP|&7JJLܽo2;Kvvv &_/&U!sOʴŲ Of@TkrX)OQ9Zm'9b1pd)ȃ !~D%jhJw)j(F퍈p ;r>GT vt%KWC7t`L 0&f\:CxOF pvf3Ȧ ˚h4(18iA#T #kv ˼t?D^%p&ab.W.'t+{u+\hAΕ|(jkeĩ\(&'Dgw2HZyP%_hiWoK,S)9tL~'9BYZdw-|[.u/cUERr(p<ѧ]>U#rw4B1װH $fhNKs(jP N_rJPr k)DIgCl΅ 0pyS ~`+Du }OB(#o<ǡ+&eFE} Xn[WQYPG5]!R8 !Rdrƽ⋾gI(.nF8y5kYzEV.Y2m4 W/PbwjZ&ybYx`whC˽vo:2;"fNlUp):24>Ԑa]wS+. f9By]S&p)3|t_ wu`L$>}dIdfq SC0BJLErIֆIHT6`%LYyُXUAA䄄\ulN} T|=~?TkJ)Q~Cq"჻R02ʮd 4sSCFpBBR߮Gez:[,V<)]{jYS-{eT_KK\T ȋZ0ȉd'l]2',2ݱal)B\ +hK|H}6Lት֯M Zo^#2_+~(*OL/rȿғ:aU8Xk$=.oI)jr0w? 0zF>=%ȩtIm@d:~Bٝޖ%!獹xv'u$S0k@@=P ML?Pw.GLPPJDw4_L2q}}ʀ4ȍ|3NՓ,%W,#˼V tUL 0&`L謃:u#=EQvQXή:ޡB{`TwG8a#~ůj\;ɟ9a7A=eYVMssd$M220vٟUݤw9M7TW{ 9Dy 1>,A7FZ=v[(3BUzb*H_LyDdb ZbD\swǨinxu]>意b 4bg-` =6JϻTD _[kcܰh cB 5+qnj>WZd~)C}@ -=s@˽ək*EGdL 0&̓ml۞)Kl9&pSB0f-sǢ1 ƾYAَI?U07K*=τȈ%=Yg\mLo.K/Q;j/|KbD%PxW9W 58DS0֩1 y`R GpT{bw'c_nԩ{hR~A.fg(v#v^yg&l0[m/$9 kM‹9h:iiG]kG ~q J+5GCL$nѵT!zNh5 +bJ(Å3L 0&ZE 2RX\.f{!̖h`l7vc}3 CnxKqn$@8#z͊;aΪ*xaͧ^8[^>f4{٣ ].>=dKdĘJz+v)d,JH[VdJMDQOwrA XFí7Wx溜)wCV頡k4{V)ve77ь;7Ml(w]e݀Vr`L 0&pD@1;kg&P2϶xZ\j1Gj1e^|4 =θomb+BfgZr\+Ux/|Qv5Y jhVA:댾C(XPCX W[,ْEIn]h#so88y<{!'}m)A\F_J<'(+#5?l2I=5Mݡln5GdLG`V_MivIBޟ6aL 0+ _Sʌƕ֚@"[Huu"$cZsOK~S)*Q XKC팸&V电q"_$b`g4[!L[UQS!bŲeQFxh2?_ $E7˝f*f Hc ]7*ni]) %ƺU?LUdžDKi#\#7fS}c@y,#u-$kF:Ϭx?,N ^B#e\o1r0&> !YR"vXʕ֞] NF*uJyaŊ5NO٢ȷkE?5Np3;>B=ՁF{M3a](k ç8JOYQ+jWyE(KW}^+\bKYM&E@[wE3J40W*[k _Vht)^=p.+L 0&`LI-v6.WX7=/HE0&`  9ۗ|7fG.M8xb6>TS>h~+/X`L ȵpst%]R?sv+72+p8`L 0f<{p|v,ۑӌ+&{pێxvgW.+s-t6xb6߭BϞ]J=a$IŸdU/ר|'KBNGMt/vt|U|vktt,B|Əd獲ʮ=Pr&ZIiqn7"Ru='ԫn;}DzN 9&`mFRB 1'ig ,6[~Y_ q1n0&̼<ȣh1l1aS>sCDzWH1FJilϿubB=avU[KhL} _ S6[aɴ[+sC؀[_BdQ-mLl/r+\(%3;5_G{K{RN{iYW6p>8krjglC&`,mR*C j/R y]2',2ݱaȧj>)Uw  p 9B>1^52L;􈞣Ap2O眰vg vӎ`!/LzD?ޥXLr+uN@jswc0в9.FUc'R-"G Ko}'FMsÔue8c w)ev]*S/Q2Zg$QA =&Y8..3vfL!]ȱiOZ`LR"ka<,NA=aU/%Y&pha=>|'.^"U#r"&(l%n1M\P- Yb|aMQʺ! Z61 "U;ަ \/VKp=U&&O]G@PK8AAt[e:W!rQ5/ݥW5vUHBjHNρB:m޹j1| [UZj"w6{Ы{̄94]؁zE$3䨁5F!x󊸦H_-n$"p45nƒKy>ǒnHL1ANNǮRDz֡y qo`L 0?{}O^XvOO߅v?h:Th+듍V:tf'pt =:pF 2ݝmvSSZ[>  p{,)A"z{Noh29!3zUSfxuwjq}.X)Z1n/А&: >*5ʼnG,ZR9nNkU_!iiY!*p-kD! dFu}t#"BKŪ:P)u@rS\*<ؐH~,0kl΋i;5k t-M14# (^9s|ᾪ L 0&`9NF*iJyQ5Uohkv ɯrWkhT)=9i?Tw,ױ q?SHCӵU֡+KO!]%bFȹ3ekXx`0^DMk&_)"#8K0a>#K3+5`+46t\ pXх2`L&ari{̶홲Ėha!L 0&c3[qmk0Pkښ@ӑm#cL 0&`L qyL 0&`L'p;:j.ݥ 5z8ҟrL 0&` -(CҨm|2ز !? N^C|\6;ڎ_]DaT/Kr}~gIc,?0 M]Ϗ?qx DlN&TS\f!6\ؕZIhϭ9ܳb (-ظ6CtiO}4>xH9m0%NKǢ뉽 g}8P8;Sn G$`L (i..L \QZla*`HVO.6&V8?"G.iwᣙ?ѣe Cp/Ƨh<33b_0ࣗͶilԪ)lPLoz$z":m%2 ޽YFCtG 5&gbSbRq}0V.\8QJX<O -CzbplC-L' (e]5N*9m(mr?O3&DS<-t6n{HoNȀ;4tqAx7vE95 f A_qc0 P~C~h7>ºnxN *ޓ"$|Co|g|Izx=zyԆ~*q,Ydw@!Y}ܤ ?It*\etp}4oH έinCGn5~@?ϸC#|Sjma~s#O?pV_2mo.VBA[1H?-}8!V uc?'})`oiw}'?'TB9df ;)-ŷ[B-O9cwoCx_Gf) !}鞦 7=QT ߜ-5qnjD{Xc]tǏ? "ܢ;箱 j>bL 0&h@ UhW 9]e=sv+,A(>eh^Ұb7FxU`Ǿ h)N @FF/X6*nQ<>oJoo;m/,H  fnCз7½ m]:4ÇOe Кy5n*5e GÀ݈xyt/v[{?3{1~KG 1zоA~<]ᅗ qI==6KM%@5jr_#}Z.`ū}V{KpHh7Mo :ǵw"-_~#9^y x/qlW(1CaBf;{T$T@cc)xvqE ٧h\@d;rTz*|1Nۑf,5tF'<|L99R2 8gF}Qu[73&`L hYg{\&> Ѝ!d܃{*hΕJݕ jZSA>, ƴBWQ(©s؛㊉ޔvĬpiݟ_ۇ^;{;H|D924:Sl `$F #w`: FyD &/C/f BoAw؁ȴ6w^n(Ʊgp0-<^/ Xq0N"ΤFK,mTTV?Fߍf3yoP"FY'7ٴGHL@C1ƌu.Uc<ҭvAytՋJ=34 otZ+:ÕnE?Ot]{JqX1;Fҭ9tʍG{,p >.?IKN;ԥx/1 h)<7ȋO0&`L %<N"R  _] a~p:C؀.:m5dm>ۏptK4 };=SF}S$vEp2.U|:N'ᐋF>|I"5U1Tj1|VҀ,~#/n%/?[;HKTC~.2׎iA!keU2xw],Չ(xiy۟2$9tBX=}9rra GȂBN/ rtBwvDϋP?Bܓ؏QCu ֎9-ʬ -[9 ™=8Ezw^6}!b=hѻs!/;EOG۶{`<}~4# 0&`Lk+B1Nv ]0ttw=2|pMT~٤Uڣor)f뤎}F̟q0_*:zR%|=\2=q (_{V]i/DcԵc5Ǫd產tA:! ;Qqw ϡT R:[*< Lmrlz-QNKt!8 ~=QUE`e:ĀtEm9r$ t]Cɡ'T7؅g?' DwPqA\ caKsбk0xcIucttgt{āފ@ oVoC{toA8/o]1J%46xkd魔Y3H5*JGk~_1]0Ar&I@$7-0syQs#!X#)tl1d[an O_JO8KlJ?n&3bRlnnα.Pyo=diu3j]q|5ݢ1&`L 4MHfYYYPQyaŊ5^=k腳"dЦ~*7WډUњ)5;<ٟaPS uD3u7>؄(AlHۛۖ64PC:\M-s0nf|6$zlB'8pUӤSg?߈frȳ]&u1=O^6r?s7̉S7^2`L 0ˑey tkn^q_<&`L \-v6wdL 0&`A  UfL 0&`L%왍u\`L 0&`!lgCraL 0&`L 4@F|||seq;&`L 0&@o- 0&`L 0& Xܔ 0&`L 0`g%`L 0&`- F `qS&`L 0&OL 0&`L ;-M`L 0&h>v6ϊ[2&`L 0&l7eL 0&`Lh>+n`L 0&@ Xܔ 0&`L 0`g%`L 0&`- F `qS&`L 0&OL 0&`L ;-M`L 0&h>v6ϊ[2&`L 0&l7eL 0&`Lh>+n`L 0&@ Xܔ 0&`L 0P7)dL 0&ТD^ qˬV[Q P'~saL  [ 0&@ "el po` CCS֜9ɉ~ⰷd5ꜭ+1e<|ib܁pq)!VB `MjUM3+5[' ~gш{lv6Sifqqk[t;{IfmM{Dy6r_9/-5[ffn'o=pcɓu,7]PwpcdT7pkk-ںؼ{Pq +ʆ4; z&`25{PPMx+PcG)9/Gu H>T((.@Dj߻#8Stb:ۼC[|qA@ ؓMX:+7kc"dlZ1>MuKӑAcLO|2o+ejBYu,|cg!~\`LQ.P씘^Q!!` D!&6P b)e:^v2YO1Nqz J.'uQ.q?Rm"`YaYPC|XڦȧqPʝPw9ʘ,ӓ73g_kܓ80Πٹd4+'lBåܘH+,3'Qi#JS@}4oFbXf+9SEWۏQheJΆdr0.M٦LEL_,-:ۑ`>4-c~R4CKIzPoAұb;W,-MXmL?,? fr9[Ϥ3L1 6ttlZ<#ύٰ< [ kr6h&L2#ͲY=1K-3X[ы ư~ӫ_1saL 0&RBُ=ǁ]ߌ(FZRs4Jlj\0 )D=0-%SmRHE{GˎꈉH0 fRQԑ!1XKQN7d+%3<'FivCIop=FҨ/B2^p }\{'hf\}#b3{I1ؔWNͷ3`tW"7lڧ;$ǖz:idBxm!׶Y3oߚ|nu7L4 @>\-=c>ME{~?S%#uF7I=o3_p+`L 4N As4Ijt/{fk0pbF-&&e;J޴_ EƬDn_PR&1ql,}->""L3W֕iVϯ@Y ,MNC)m )-RNs3't159݇G܎Ijhwd؅RG.ĺt/7 v&b :_H/b7CgD [YR{-_8b_smM$$I6 ͠ڱ{;PwłؓĥA%Tҥ IDATXl>a|>>|L?|J;ŕJE^Ru\3}Ѯ&qq{ƚK(դS-}>3yQh?N(s`t=X bt>đRu/Dڄ|>7v6Q:&`MbnqX k2zdEM@w2:45 *t4-ڣcMpiCȺDaVoOѱONL<k!̡c>A,Nݽ#0bhDTgl{8Xh%Cb.\4t;NT< 6'~G>;&2'q=v萋3(DIbv>NzlZ!AchʯCm&LO3?{waXCY+-@9iq͈} bcԒ%yf'V] AN{89bm述7#hݿen.2B/O9G gwɖ~if-e5V*r[|f>R,y {t)9t_'޳ʿ\-M&M`>PY =Z+ 0&h@1ɜM~ }VPihD51 rF)[ ́t}?!eز\cLK\s֎l3)rok %ZfLYK+J},4V͏UH5L926YBSڅ0pth]ilPYVeOK3b4}R/1Lu|~@qs; _5Ec'raL 0&ZK@Ea|EvORXjW(کi||-g.ԑ% WTBn⃀(\'euzm-ҚkZ& ^ZR(HkI^<MZwppa Zb+権"0~QBc@?L|=vi8M kVƮhAz1yδ{1XJ.H'gfynoz,bC gg3&`L 0gS ٠cxTc_įfL 0&h9%%}66ߓg5'7hy_u8n#z Ƶ.Pe 02 kbԄb$&p1%lυ+KphOE~ }fr۪qЊ9c^;?FJJyMAQqA ɩuFãM{ǥ~9.ӇPgp>#>Oشa0} '}5(3n̉[a{G-)D+Ct0SNl$`g(Sb[r4:MvS_ 'wob\Wk5P߱j9r1N6zzD:}T׊y6vVy )u57Hu𱊕ձkU\ϢM9jW5qig?u=j ?$֘>]-ŕ*6Z7 5>Mc]_\5ԊR+VQRvs!jnC̆J]HF0 ?<80=W\yR;0-zSc;9ț]D3qyhL>5k7nyķFgܮp\P+8v+(bJ8EŹ3CŒN^s{Ґ<#"hqlO) *լ ڻ⾱a6Z"<}:KT3e7ʼO?xRZ5q`{̙|p78Ы 渠_*wс18 *~K;Y+cL:E#=`. @en./ ߎ45NS#УҾNGF5ED MCed0T! @<;x>{wrFC<,"dĄqYIİ#x!iyz }QҘ^M=R99c@FFOu U͔ؗT ]WH;xp "d a䡎COs8~ҵն1"bRoul7XDl,GDy: ͌1Dca.Vm!j'^p  1 X[IYgMs=uۿO7O4?zKyD6cbx?ri&SnQyd(vGy( rsq9<. K(?=0 |_s9Ǿ5'-)VVvu hh BuGhQ6CYæD^VKѻѾھ꾢*BqOdeۃWPq_jP Nn[:5A>=h!m7g 20u<{e|hÂ_]2s]%p!3BAɹ*U\ Wĩp7|) غ8#O0r] Q7jdEN9 SkVj[tݺ}W]H;:UzGX2Ʊ#̃4ޞG#6bh9xHP7׈ݚ hT#h>*~ԺR6<F mjN>Qm]I92$)USꐛr ՘GyuU$n"8!,Ķ'KHN-U A 77l?W $VOv\')P!^aD8֌6hqѪtBdj[ᬶUW#Y5L5 /Zہ2M\6>aT'"*HLD[_DUyFUvN]N\pS&=E\wha6 G>rZAWLx{t^^N@L $:U-#m^8/8]5(Nf֗j`jdeYb-#vM֜@0mu\i%T&uPo3;}vBՊ}ʾDZhb4*\E&XľbA}9L繳ņu])C@ ʪt5$:yTCk ݁+ qrUz[Áa/y  y {`Sp؟f#훳8vZE{'D l|┠4ذ;9lƕ(:wgTf9*Hn^pWZYJC/|5pWڲGq@rЉ@b8}+;=2Pڒ"/V ώc/ }e莬Xǹ})h.rK% )Am ˊ>v5$M6FM~ "snu92;y ;8ߺj1{VG`0f柩2psQ Cي\i7Y9Yu2h"$G]TnW/oilSn>E3)H9ek 5|J-&4aTnGwuzե~=Lh;r])${ڢ+!28c֎Y`UGfYݚb暘SJ&<yC2vskX7F̚cJ…q)<*]E:.Wtz~kUJg4Vrq5C(ʨ6O^@rJøд͘l%-yKʑuG$QPjNU{QQjb!1B-T6.\=oToa.tf.ICfh[? CK78vа*fz=Qԉ8[xptHZ A٣h;u%ŊIx^xiu\a y=jakG[|5<1gC}USJOnO]9i5':c57LquX"[0vTvFP\T:9\6c^d(]I_6ʶqsTS@P A]kx "HC9ҘY:̜Rӄ?S:d m)A/nJC-d0] +J5%<)CZ <ȿ*̢4TyGR }3\`1`年 𐺻`Ɣ_<:EAuQMXq#TV-7bҺm"jߘ?*>4T},i}O7x#>_eu &liY͈mS㹥5Ɋま%:د7 eڰX媵*as\jkb*4^&V0#%nnum*ynSoY Xwt[ UT|~R@5pEFaq{}({.4?җjy@mڒ#ps߻2-M+.ڪGkmڒ5sAHSn ^ h IDATM0F=S% j+LgWbר^]Y3 W}і6Vg@<<:@Q[2{?N<뤮,6P_އ81 6R61s~{a%|{ | Ra>4kt}[d[cHy̮rl*qCi}lo npW i]%~$3ǃ6 {.hgVf/? ]JJ*2}+XD3&^bX ?["CVksj~?bVE;ovz~yKص)ϭ;j~̭{HL1m4nqSm;ms Kg[͂631sC5Yڴ0,fe'H$-E {ﻈ9oBl>jt[iJ2iGQGbG (VhcHWݨ#M CnR<1"x=1К 1gK}Q;L^qrwftF3dl;S1EcN/3tlKWۥǶep<_Iljs%X`Lsz:2^`nHc6,ۂQr.6"c sb۳rg&S ;t:TԲ̽:z4tY!Z6(pK減Tu8[KѪ8mfI0{?@AOwt=sۊz5(0i=~ϖoAy`1ju(ay դ<ګA>M葶}7^XgvN6; Ǎ`U#6&S_Zq;/.s&{kseW,Oóaˁ_#[V`1)0\22p4} " k3` oh3ux&%xvm(_0O] EP ֮H?x3;^ƊͻЫ;<:e~{?ÃvcՏkH\SǛiaᇯ ԩAlom~O̤{ LJ. tdfdRe-J5v?7"]X.KJs`RӶވgztMXA9ʖk<|;j!#CҼCwꭩV?LgwU=0uJ( S9㯛bwzܻ0fd$@GD[/JPj^y^X8/3mD&(fP9m Vē|n9U]Ll@ޘ T#I6e2oôcČaf_o+wn[3M[Ջ7o:O{w@է9 bp";͈&`!x#X.s/͉Eu=N)M=##p; UHOđ 鉍Y/.ZjzSz4l^"1fh4"jqRo妒{8EBF"7×/kfb)#f(Y bvt;G=ķ5ȎOWM Evv(dO#1w;ޱȌfy;*8 k~C}\Zl9XIߊR\cSH1 "˂TWRFj]0w?>wqvjFFCۻfĶD@p/=lN{d)Z.:4]i_KRKs|d-x9|G==3ļ]E,xzxb faWT# EGY-- S)ol<d0rYV.5.Trj}\v: NƗBv~B~<Gt6st[{wG(0w$8ܔLGO?dh7'\1ŧ򺚙114 ٛ0#! M%S+tRMcw18v{[x79y{o$^;ON['TY1\U2*wK,=aLsO+ba݋+ʂH7WO{bARI/$M_kE2Cق\i"u2z'@@!f!B#P ː2w2TFs{0bpwoLR.<@]0;ږuH#q0sVS Cd#51ƿN0)G3ק]rW8i  uCREjm. f`=b +]PJ^Ņg;\ADpaГ%)՗U\w@Ww"^n'lA=!G:epX< VXaHWE~}򜚿-Ԯ<>q*R$`fǏ=wg.s/d)`ېȎE~QrTX#GN-.d_wKxt!3b=hm 66ٿ!39h7nxzB/Sѳ/a,,!?_~*y ΃sqjBF}}/ANTc Ǹ(IsF lrxk^&q9ʞTn j:E!mhƏ\(:^V?眎.D3_COpϵVR 5xi$l1 6C=rI6+3U#x;i(P}x%_Vg4l]n'7BsԚ5 G9My -@ 40e>*ip^^3CoƲX5a>Do*؂.ͱ'}.<ӫA!A.U[6 IەUX ݫI/a{] v[;xy-[[dO[c17a],v_p6=&fn@Z{Ydè-%)MYKo^=:fN.$vWǣ?s68P(g4E/GFNڿc_W+7*'`CR!n$PCʘ&vOČboUtC&MP)㡹kpjLZ&~GBc5޼$_<7OΚWaɆa˻x̘FXw8ufB(gP Fɹ|D9XJr[W[*iC$ZKh}*ul >=A;9j,1701P|sOO£#NtYSq41\>YIgiʲ 2{`82p QT8|.8O&chj1bcgq \ c 47!#_o'#x@㙕bl7%ӫ_LSK6?{OSqʅVyW40YEeD2e";3~Y<eu"4s(A[1X0:QG]3Xi|\ 8] <'(wߤA{ۇ-^g IDAT#q&.\֥9(^o|nO9!s_*qR0~S:_Uyŧ10->-In9 ߭>#rSoCt}w_D?bJ~v?֏.yIrrM@dlނc0졯(G/ Fdޔ)_/檮'u<(t |__pC2+\k.P>brb݊:jmkhoPc%ېa89… -}Q? 0`e .2\gShB{kg l#ڔ/8ŷЛK/h7S$$|?ĩQ ֧яRn'9_~7ی"Cwc‡X{LJ+c}f_سp4r3Ò_?"M,i L`F,2#ZHO9X7vB^fYgĨ)yކqˁq sfr1qli[99fl[i ر) O=@OF;K׎0ē±82K< *PàD$). q(*AhNc$D(]A<[}8|5ص%W0Ч?*ϯܺS8R_}֍yD-n7/ S1_4gUz?/qȷx'q h6,L:[qd?A ~~_''!"שBɌ8n =U铒=8QVix\&:8&W2q.4u2bʛNu@hvE(t1-~T-NFl>i*yP}Xvk18$'^/KwD+4 ei%k":#X2\}a^ʅsUoNJUWs$/e z:euAo11H$y0.WC[IzdZM3W≥MR83qt6r Iq$za$:h1X/5 <{r>%!>Sht18RkH;Q(><_?oVe7\O8{ۖVАhc7[dLFC̄)^Xkȧ 0k.EӘZo[+>49L¥qqk݆х?X!'*plLo|l]KwNns _OsZWtucEt@B]ԡZN~xjO8 ݹ!?ŃZ 2Č@R |H"{r >2qrEZZG >L[0jkq8Ȥ1Ja_-j- cgpfQ%<_o_4\ļe{4h.1wN"aEf<yQDRQ$^SnGL_!w{~e>*r=x;F鵢Uk(ܓPG׸qAM}){| faɐd([kJcALDK`O\JG7b8k_S1?CLI)lLJ<_ 5Kޘ3OC8K`|*lKl_& 5Vw_K_]}WiSAl5ij6k0%? 36+feZ0f#`hE=XxDRԦa=775;2+rDyAןLi`hvRC`,b <R+:~2hш'y@xDY8u7OQOPE/Œߐ1@rg i{ s/{/ M !oXc|: MJ_>#%^zaѦد9g.MAx0J)X:¯+ݹoC4D0ې"GŎ8<уK&_F E C-̍u58t!2Μgy͸PBoRdNЦzj'NT%Z\K4g:(QF ~0_545<#c0^^{\%#"БƁ=i<,% CNޓ̈>s)QV,D>$'#=9凱FpPNJ0gәT\mvFQX~_r 5z>k_O̊ۊw&EGw}M^Uӽ Ly ̠xL'8 kp2olMb8w%"g?ִݭd49UL1O `6v/=4+~: @dhѱEk`1U idL7_æ4ٰF(dVBC Oo1׮ѵ  2?2.]hvuϮ9lA״481omiVeGMI'!hIF[P?ѯ;\F :Ã؏s`+G6T/ģ~uȓ2̛g yyq.kIɢYv֫W6exu|8-B' M*W%b~ 0. B)|Z}mHVȃ'U/Q`7zGjZ>j)?Og2?=o_v3H'Ȥeiuތ\1xb4l/掅+. =$cTp"Cjj‹&㸒 `a3"k~+k_jcyx,e ]3yp-mEhBUU9gFumEj}IRE6;Q8__oT ZngB}YNEHwnο]ؽy9Dͯ7trk!)sZ@XFYP9U7jt@tƵFi"HoONJ<x)t%9[KVo7H&q/Ga=XQƟB?F?^ۉ|Lܡ7-I{"pc~+feH x]z ;m&j᚞=a6j|t%۽х 8w/=AwTFpfAԮMS!45f׺ⷆq5dHtԐ`z`ԒqܼA_}eR玕l4{~SPş oU 9!L fؒ%>8Maq2)?zn!}PG:x8jŦј˯Ȯ~~&B_2'!g4Ls|QOƇh7}!c/N{dVOhrm&ҍOzn*`(VsƋBzpqi+X7~CU}TctD7Qʯ7 EJᕉl.M&ӓ l"7)SmO+o!ٍ] cz7c. ajBζ4F6-؅It,L.tx@Oi6{)V#3e .73'u~=^~LV ?OgHgY{/N;oC@ ,4"FMa3毩9z,OC9FlO$תg!X7rK[3y c}H$`cMp 4glOH/~5_8?|L5f~.~)OIX6~"k p,<~>?n_G*ᶜB--wH|//|_Umz`$v,>ct]C:׾خΞDv ~&>c_ 1k /ќEsd#n[]yʮp/y[uMZ6}'4MZơ)oe3t! wUݞ=‹_D6$k/}&P#e ˃Vu2_~:} ie [~aGG;:WQNDZOՄYZX5TdXf1X<" qcw ĸ2_,㉩˯л`7 uI&| pۓGd`,/E;bU,zn:?MRGCD?{W|y 13no( .T?Z0 /ܘDusƒۚzAږo5V((7YʢZLnF2o(NM¿zڞs9x"Qդjr3'.`= ^.0o,%^rExH$8= "UV`Fm +&i+nkXw]=eLo`4I۳C 83{B# M¤C7f66ݺ|:/}8cs3_??Fuxk,VW||3v5#} v~w )kI| hONƦ*sy:=ơ*#3MK+6^'sh0@_H[@qȥk mCof=*/mj@RVv5MIwDž?^njX{~t `| ag׆cI&j9~;j ▹kϴ\ID_--4~VYQjdJEJ)*+r^s{^5393|gLo[hxgAGe"Ga幨х,zu<>0z 1bMX; GA_dε&yOX=5kvO_1R7~ #S\BPNއU`K[ݮ6dftP*=Gs֡yiu0.yR3MJFL{MΜDמKeYty'=,.v &;^= i&ݮ y^B-f':0u o!~VڎlwEuKcg p<$ 1.QU7G!;,F>sx1\1.}"w\bUͣeQwPRKEEf aB br 4 MhjkD IDATKz0%h[-7nh,-#w>.Aai`$V.gPkX TFi rØa'r? !r0UjQ`;iK{kC2닡-Q]Psju5o:\I79 &Tw oW^&ҊJ,܅ Fq) Hu&,v/[R4G)5rfZ1_`xC'`qBq2ީۖGX gf ԭ[ۃ 3vqSKymٻ?&Q84n*O@֏M}'v+l əPÿ‹sN0d3!AF8[iP;^'(D\4ėz役<䯐ZÉ0׈3Z,pA? G<>[ŤypGqZEwO,c})朲H9M17JR1kETx`3N3HNt;aiWϟ]ڊ rxmyi -w#|rimh"Z\;{{Յ13/,(DntUѲ#/{[΄99SgWQ@fSf9wf\bgX- cэa1MaeA)wP6}fA"Z o#.P-N+TO./ ۨ iP[h/)XmӬ=!Ӻ4YR;_J?+ ȯ$R<+ -+eCU4c|ќ4~gh&- owxi2߉qqH: ]e\ "*(/:ʤa]8:>xj&J+L K؛ۅѝMiVep,6G"g"`N;wLa+6 m&gަyE?NQolL TnέkF_1@jblٶÎ@+-Ty( VU(D)5"KڲGP0k1vyd;ܞےW{=$qH#X>nK_x|Y}éLj츰-k6\)"fM-ƒGL}wEOWs:|[TcƷ.vKݪFH;#;ۉhͷT yp*Ou;ϜnvHhI6LyT1"'t6qk?٧}}4j;(Q[^#Ϳr)߿4Lom?wOB9fߺڄ\YK3ee=jsٴЗ[vcomdg2F_3In )D";<ך*2>+?]I]d6436Hylr8iORWd *Tȅ;VU*s2A~IL֟wit'2{/OD] pڵ(c]0;P:%˲)qwI/YC@C@C@C@C6 P 3֡KE݄8#nuieu\qs6gQvF{eح^ڹu=꺔bBuSYPbZ*d)rq6s,h{RqMmɵ=$e9mݚ1^Ń'{Wh:վkךqkQ̸W]vU*^vW#!!!!!pn:+_MM4wKlɭ;٬5b7@!`y ſU4aV!yy?kYn*VqӦN> 岮=yߟ^gYˁ݀PKZ544444444B43r\i,ǹӲvhРUiݨo46fzuazsXj~Zl [ٸ(j44[8kU ^ihhhhhܣh{bb]? <?PѩVCw4\srװ-WLY(hF-ww39cYWwßnѶ*wr p!gFPPX$;TD-       ;&lqȵ ϟUנrH1e!b&q`FKN7£febmzr_9d}yjhhhhhh܍(t7U˳@):{RP`DqSѳreT{]43O{ np6wU& Ε*A$rxե'?5j ^oc˖yhhhhhhhܸm\6N0ܗd}7pLJpz v;=)w^aIRYod_,R`=EEHIH.o[aRAJ !>9!E "0b*RHM\K%LJl ,jI HtJR| SX2U ֥dV2RX31 qJhH̷ZA#Gb ć#qSiIK0Hv:IUI>j?#S {p$EL-vxUԔRotJDcf4+ud\F+C$!{'n- td۪&͛y~1sYJ0O%۸-Yjo8u62gf):v[ǵY[G K_.4,c˩$;*^Q+}O]Q3 vネqFLE±;8 N˘焋y@7֖N֦Ԭ䃺~BC>Xwhֺ5hsp:58=f뇯yH@ `G{m*ߋχ' GI͈ o(e] pD ' 5Ym׮LTq,h jC_mA$ $iȭo c1~9ފx ˀ)1/Bտx/m{o~ٳA]Rç`ز؝a&ᅯ/ؾl'w䟖89'% ŗ.䔫Ƕ.Dˈ6e8]DE,m) ~|G`ny^˖wf#6 4z &Ñ3l1vMF| d9!o§v|S{=6N˜}ZkAF!6*[ci\/t,ɕ[x)^6,;^L헁l~8z?Ru4+ϒHs*ih:9c{n$'~M NF6md<}B1y֓Ui\jDW S:*".;G}5Gqsx?㛳Va,f^C+Sxj:GN+8cH|mɹuv{M(5q7f2!*_H#y߰aeLGcF'$󽼓 fM>ׇ3_ 9\1wAQ/Q9f8偩̴ᬑYxHBLſ1R=9cNL2_=y۠z%xv w^.^[6Մ o_HJ_@ FVmLDȚ6~QkFNI&Q.\aZqqpY~:. Ϡ[ZpfÉBgә3ȢavY5Cg; h7hVeLEhLC̋o1x[ f-|BɤFcDH*5w{#vۡe6D|JoTss˶Ee|r?a}Q͚| FOLͪÂ?D/Tj_}*[Gup8b$>a\UqB%^ѣy3(U݆5a޵R f~"bh?g#BY{3Ki.I."i¦WA`ɑr$T5_1:[ZGe`Ьa[W7ky[e{3srW&LJ^n @6>f.Sp iק3bOECPJ+KU (Z8Ncs7PVegԔƈ&W͸P}/°oǑqL;Gu Jv39Åҝ_9- 8z1l܈>"oykF9Y =ʢ5^G"/{32Fg;_ gr`گ y6*@Zg >>N+NXȽ۳%o,ܣS|/!!΄9sEɕeFY9['3yk=gq™fwdO~3 29;#eUS?V C0wF_@EMEmܺ\ڷk:ݠoBid`+4Y>$\kք1"E/]*R# ׊Q 48 b+w_5:ޞF~k(Ϋ0hkފ\XFSsC'73hɋ粽wE5 v $DO{hF_jڭZ[ lkޥ,#MI}J}ӣLcEr섙e=;ke'tcсlGR̔Y׀d#Фx<A,[&xw`.c8*푈ELA>3^AqUl84Hx'a{dԆShi5$sm X:x*ݣcNv$mVn},Ma~WpODq]C5~`qx*m>dC$cy\.oOb_ãhfj&b/̳ق+zE+@<Q30jnH^ ÑrrVqn݄CU Is1|Ao|u(iNE $պ΂mb{;CAV/26fcFuXf>K:"5{ɖjĺ1b$ 06"8U |m#н1tP1#K¼=Jؾ,K.ik o9?Z6w;otJ~_7}r!v_S?w3BQ PSZOUOтJΉks?;.k~mvh ։el!ME_Bsk{t/WUnՖ b.h' }(İh۔x1)D@ .XmӬ9+ XJU W_;0Ks,iz‹}dp-{>n\J4˹z)1|38fmp0',Pp %$`cX8ZkD84jwt4ZP[bcPdDJ$Clj2d:} 2)h8R _ P]J0 ʿ @?I. 08 TLuz; 'kj8,o+.$"a9%HŠNm)3XF$ǿ= OAd51el~ |wl95ȫNCQmx! Ex| Ga{9a (94Mv! TSf́A>"gDalBM@J߷\%zvg@sdJ쯄-C!QgH_IǣqND|[9,:V`֓EQoJsyk< 8 aVYY)T|BQlhsL4 -;}3w1 bgCKZ"s*КjpSelϺYL~c۬G,ێf3y;eG pxRG21Ŝu{$P$G|]R>]_O3K g[NIE%LHI\hvgG lzIP+m'wv{_9F_:Ay IDAT mR8е ]Yڼ'NbRJV QBf36l:s 15á䧽PH7"m+,#x:g܎n Ѹö)[19>Yڨ#ɔ*鑱g!Y[*7Rq sv?Ę']T{݃WUNB*l\JQ̚ N2a9X"OooB@#j2|բ: ř~ƚ{c4B"ێX7\p5E.:&]6Ngy{tL@cl&0RH(`Go) l}2Du?ܲk:\p)V & y6‡=`(BdpVFÉ[B?Dm۠|xJ:vm6rV$`#?G]9;> }?='"{C8=}jSOGY%c߮}q7+5M(h`b $F2xVN8qp0__Qm߈eo G6#ڃӾ'oCϐeZZUi6hG#,<ﮕSh$}wY)ڄIVRs)a1񉖙; 'W(6s4#a @P'θ`_}<3҂BmI*L_(-nw/1Є-s#,^pEEOhEfT+5$B91СI&cۗ>i)E`ڨWšk;CYF-La)p I%YŢ)va[/kBnq ;G}u@Nm%ڜLEӟ;JP8m9Lg[࢕UCWSw%s=iFyp/w烔 ΜrBj9CHܦywaRJYGEDo㇨G<|FUίf:T>͔J>y_[vJ] XO!$>$ _!t M6X4Q06Ύe )y::7h@2)|Ԧ0f:9=tv#m[dRQ\n:ۙ<[7/BElek]/?iP7o\-RWtz|Xذs@/ -VCZqU]N j()X,K÷Q_U [oz υ ya^Zq7( s~* fFjߠ^{5xAɈz߆9Y&\cwвOdQ RЩEйjQJ> @_NbϞRPچ10o[,쏓1M*Y'SrT ,Э{…,%o۱WYnNF5/1+ؘf? Yv2)f& kH9cH6ߙ^hl{̠zLۺ"_cѤcfaz{ [쌧v@Cr;^d|Ή`mf֜-Nn"׼8`y&ф_!=))cAJ`oBa>,5!Bhoכ*c|vު;RRMQCzVɹh,[om\qĚ u=3>-}ڿcq hZ I=5lAĖc/דߨ|WPC gDt:cRS>:&}!;v|Ծ:s`<"B1wb5eɔ=8ZPi`:`JXB@жU '/B'ckhk:-1v,q %VLڏ[E mӲ7`2* Wqahp>*.!b/9M,0}ICO#3x8)T`Mтb&;IڛoEv F,. |&n ee*xtjtuUzE%JIN/,TAPӗm%/v($FcBv^6 z7ûpvjT$ @o>DN1&LY%oyt"G{_sT.jpw`<hz w4F3DFA$jY-Y J|k<xkJ:׏S!U仧ɬBU`f;w 3Voy@neYᘌ7N ljU%ѴJo!)0"er/֦27IءcOM'(alQM~n%ƀeնu?,lM{?bw}ҽ؁ #h~" -/Se,ZN#;Qe=AJgPذ]ʃ/sB rzih.u(8 gɝ5WȄ9f_"eв7_Z9,$cx'rݾTSaĿ؎0Ar,YT:7#jC[1X_[v+#ҕa7GMy(re4L\GhyHceLxACBD?ɺC3'd'h(I]{lѾM쮣QDN3wl--mZ=N?RPۦ4ڔgGe9u>]"6TpݩS74qyBA)Nx1y/E9     rwuBםl]Aܪ|;74{ΤtG7' shɗOjVk*.tA-HIKe^C&Ts4-qx OwX.z 5RgݎkNUľ:M85t0> dU1a-)eڀN/|k>I_0Dߛ[b'_O&fJ!K=]Pqn< }[R2-C<YI-0s-fzBebNLh3jf9T/)mkӬxl)Ff2+:ﱂ;qqΡOYpͽ#Y? Ϥ R8O+MEA霽D8+ LdaCS _ܹ mqMWKⱚ5En࣏…fO4yJ;r84'+IIKOG 5BH]CH̠A0>,DD ,"U##- @LVr2#rޭʗF! rRFO 8sݞUqT LkY4յ8/DLsE(_Obrb/a_+^c4:#'wxSjُ~x?jndOx}Dlp0R'l[/Uڡz8q<| m &AmIH&wCuG~4b ѳ-S1tˉCl47&Tk]i.+yuT*ib!j;(D:5A$/6 c}7ȅcΔMq0hjkJwɏfWT3 8z ]_,avY$yw"n ŝ.0ÔK$5ϱ&sܻv~‹^h8~:"rؾ~^=0L%8KSSI\q*, pBp9x"ڒ xlBWT.OPpӽd L2R/,^MW`,cZr6YSб{R[=Q ^\ x8ao-Q2MǐxlJ\!ncd^y0oF? Ux`$D,ES)h⛵XY|83k7f-pBǗziP5o1T}52`|h pXzGݍ>f.*4zsD@QN;S()+q~ cg* 9ae$먝N({uv~"<8 Bj/۰I]ULv6$8PnTD_Da.T|Jo?L Ҷ ^(p> )8=z{#̖QYfY'w꽤a)#@z?# 3),Mf+ Ը:J 0%&lv[bY& Jx j\S􄾤e,hG@Y4Ju/ǵ6AtYec%r>fU8uwj5Ք[vڅߤuRyB˩P7fꪠ*P_,ʂFB֍8V'sޜ芕qoᗃضqZYLCp n_Շ:y1%;jg|&y)@Uh", IDATךy^+=jb'qfnx EsFhؿ<Uq_h|8t />ky ߬ZFz$Eϡ&ۉLԨ뇟_ CEu0L:a?;S<'+sv7r#Ȼnά4=u.j}HuEKW.HK$kB)DFX& hdpKIAssQ@)Uд ;c+'5S W@65 W(Wj6 62\gТvwߡ6g<U A[ϽhE&*r=LhG@L>㌦0v2_qAw^SЌ0f"n.l>7SK'"!!AbYLaD{m۔pGU)ċ`I+a,*}z" mCIװU"m Siuرj'@ac?{ Yx{~/ߋ=f:20B!JAÓY h9E:RB6&سOAP@FHS"- )>]q:TıG%Lg[ ¥xu7h&*֪֏c4/~vW)c_b\ʇrEV˸4B4sV.7̔W>]Xtf }O?d=>J1S)l)dGXYDS.z/s-.]}aʕU?s Zbvo! mƋ9"h:u 8r']c`\MsNұшM LjG*P{<ոe,?dM0ۢ:ֲ_ XO5cä Љ; 9gB^E,x"4h'P̶L}5Xl~cƾF SK꽧m vF[9a9p߸XJ9x#_wx _FjR7u<h~rNF! rXЉGfH)Ts2n=CFuE`.s;[p!GePN q۷֭[w|Wu뚍☞hUJ9z⸬Mçm`"eLŕꭳSDw^$CzT(”E&W`#V8> Sb@, BH<BNLqGbH\۩fix|Ll?\O P \uej!ѳVZ˞.w9}oyMOr+c?'\:P((5#D9 qV/X&iԎ _f":3,&Mw2ܮ];EIF"i0^Y?|9, ֕3sjSFU\7۝&M]1Ø1cЄmŒ3+-S=н{wATB6l;vTèQwr{ Y\zuEx"h"B_Ts6ҿh}!Bh9~g4DکhT&z7tĭFQϾJvIYL8 t4*z7gGeqbj#Ý 9φ?y#1! abbncڙL[M:;,=%-'OdÏUeїH\?bk!EjLd=6ޔ0Qq8 D:Pp$.Qjʵ+hHOSδO/>'9E[x=M.sFWuhWfxEñ_Deb.ekC@g}Vy%Y!}?n,tECi͛7W4eAoI't MzrR4*3)v.̦Д4vpgbT H4{iM ]ΕLcUuTOJ23Kg&,K'^Gj+QXj3M*h eӰwwUJAU )׾Q&p'GC&(iӰa\U32gw%sp93.cΙڳ{<ϓȉ317ޙ(l<]Mk(z M|sFY^4h-[TX/ xB[\$aDK'"Btd 5mE@ۗ&!mFswxOMP6۪ ~5UC6Ք +푇ᑕʹFlhjUAi,w{O ]!) 2&U%h׃*hq-Z;ꚋh&ZiBک~i )fTLS*r_M@+}&lܧpqvѻ&>Ѵ ,!GΞ! _5#Yf/Y݁*JԜB@ڕO|"qA=AV(D447oguDJPUxGA{b fώ2*T+mOqe.u.j|eVˍmE@;r䈲IB(hF-f=X0 I A0rJz׮$L|p26VݐG-uާxJ!N685!!p#Q:V+YԲVFT@v3 l+\k'gș9nhp'N 9aΜ9P[HzDc ˝΃.p6/0&2yl|r LGH ?PHA͚lREi 04y:( cd3*4YV'Ykm "`IKeN" 'aGRn/+4y-ɊY^Ig唴&L5M,c>ۥI͝R?BX'󿈦=?5Ҏ0R~ ğPhRCG"fd^TW^lP#Տq:ⵈbY=Vpn[עBKuJ٥[K5G⋳ o0J\dr>cm]^C@C4QGC F||<"##oQv]9M8Y<\V-eg!ٱZ!f_x2Hr2p%ިsg"ۡKuՔSr9) \)E&?tdSafx5?i-XV-WU"Ȣd9GBTh^f8يSeH>'l"D) b3Sfje0Yd$+,l#+۾*ļL<)0d% ,dMӞ0&љ wv#‹W_}& Sp'-̑+2,60|dU&RP_{LE0tdʯ'aPBҳYg72i¨0_LGy82WoI[gMd:e_-=ø[?9OB.53zVoq"WHS, hǏ (Be%3wɃ5R'ݝ[;{~"Y%8N4 ƪ' M)#߫DaZ'i[yob|)*b+~ WOm'tsAMyTiKzOo'e?~%BBDM/Rڌ`:) qn3|:6+(Nڑr(I[8gK_V?SDBOQj"JI7b)mS OCuRê~ďenS| >M94!!p#PeJ!#2'"TS.2Tq1Zt):t0,2+L0j2+ p۶mVf9%X-=SdKjv/C{)Yb?t{^'&~~6暂k1mbcwݑc}`ӵЩ kl 4=G~ CFP?TD/ Qg>;ƿ$}%[ [`x[ û}vېp"o~gSNMȳhSOL0'GNW>HN$"[w<{*,фVu]r9~4z0P\|^{hpM:!괩W:S <`t>E-I:^K:inTi^VׇE-N=Z>u\sz^<簄Mс>%œw,#72y}`.C&p ^QWV2|m۬6fFX|C=WFYFhѢmLW%zufeI4v q\ uc0AAL%i-8Gpyf/30E^?$cfY2>eMrSD)er@N^ &>ULiCƢNC!jŴ>3o`&mF? cnb >M潤[v`n߈Gѫ2QGP5`) *; 7XAvrK@a_C߬eV?кC0Ғ/^A#Ԥ3ULӃVtR#@*`8)nR]V6J}d80pOD8U[y?M29_ct5 ugC M o- 2K hOK$#ږY`Ş@xSU}"->.8Sm9u7V[9]p(/\4bn D}h_d}gpѽQ'S^av`#M2"|CB'{;#MC}} V.Ull90+XhZ~n)ZG}{3ʉ~>CS3N]M;GI4)q(W`Cv&?4py{m$ʑ*:tF@E8ILk6 e`Ф`jv\4y 4T吶`ԇWe~%ՋKAhD>D>#z) ؏nMӏ)|>WC"fUзRĦ|RA_ u/ VmLPV|/g d  `ced;?Í/(4T*أ׍{0F׏6t; ˳s>η = 4#nmZ|(01:{5|R(_ Ƈ5%E< OYSE[:UCLu$4$ "{l&x%4hRXf_យ[fR8^K@@6ufu 8꼹m]/ &4ziQ)t J0Fl}Ɓ{EFU ϲ4꧑00aDZNR1ǩw]>4i8;xUWmw}44`iQI/ei2GȧAS7eiT`iTФDI-ӨJyKfK=OKD}Q7px&Hr&@KxS7>b?JiTДMl}|#,lF|?4*Sg`sshu޺fY De5B6i$~$`4FU!'z62*65QAS@\E`Te)*ANwcL lHt//`rYK=r,)A4*1jJK^Egr#DS0JLKsg;yF}ӌmYD~PaKk63!0(-A7C6"AS}.n b؏G{~$ޱoR:`CCHy~1() KBx.9횵&, \ u=܁I@éqgCqXt󆆗2x %P9L=o/i$Ј,I}^O^\gՋww `hxe])i:>ENë\AibC/e0ǻ.|`er IDATw 640VCroOrzy?0C0M3$^~|aZ.9훵pgg{/Dm*Huph=w`.|<`^x p`N~밄/HE2d' ِ{#`/`yo'5dM&"Dmx<{j>w2Xͺ?IP9('6LglKwE@D6| 4_yW)PeG~aڵk^z>r 6ưiʬHo/^~e㏷w])'뮻֬Yc~z:gI "iVg=(T?Ȅ&8dŔ`U`IN^8-}rZM3+EJ,ad5:#HrT8^t9t}8u^8DWsp)4"-z '#Z%QL8P$rbcW/MÆj6I[z`A 1fZ4N!M~)M KhGhW/eOW𦶔}qFc>&6"|hπ~Ѝ`L Mpn<Џ g]*$ԏFw/f( 4O&0%# MStwY*߷ NJ\%l!-a "1"llagl & e g7; C#NWF@}ΝDKQ,9tu=(c7*N^29%޼fҽ' xAVá G64L.5nZ^h&h7pCG6FNpXAF-{ A%4  '틜 ȇ{/;Rw H8 4]bI6QIw>y'uQ :&y #pACG(gU_ ~{JFr`.Gvٲe)`nQ}@0@6af( ~A-ܒ=lv衇o{-X:,ۨڊj_֝vJ)ɡc4ŽرMbBJ 0d+YK(pzupXK=9}TrpY*'S# %9ZrbN |Nn8;@VFqvo,f,!{hqR`Cz9.lL%GkM Ŧ`ٗ`K[n7 K[j?G%y QSP.#޷зcoڨ0)ybPn3"ا O|X;oO{@eM"^[#7D vba3f@SVY -5x-@Ä  /LɓNr9f|vpq.:׭N9t`iC@6QiIs]'`,(AmE4B.x\O[Q?  pCu:UNaC3[ |zU$S\_ ˆ JYҤA2|HaF$(;Gaظ({)ICJu[U-I!S5PSb Mm)oe!s 9 M[}1#tf(f$/ed:AWr2hڔ{4i.Qh۠4|~r6a2l0Efhn)I[q=)84@g`>9."R))5#pq0҂``C^irLIk pYDQ~H|ۺ>MhD<2hXG뻍=WlG"M`a+bW5 ^qG':AhD>DsjQM`~vrDuGb+gO 4y(fRAj^ь_ ;t+pt0 hǬE->ŝ!W .?Ng"Gy]>p'Di:Nϳ<ab}uZ+#tOVPr|(;/ҌoG`q%ޯN3ibE2e0 hhh{&^uYP$\ImAS/el+|^nG,^ǯӄ+b1  ]Rek~Ŀ T &.[ [`Y è1*?WE>h:ujJTR&0sJk#!0 x4@2Р>21'SZF轹4*_Jv{or1[5-P)^z=Sɡ9bt U#"TaiTCHUqr(+Qҽ* 4k[FF*nҨfT"`T_w#:BWԅF߲4;VavajWjhEW 61#;x2EFEP$ gMx)„B$o=F&1ё#׮]]wҤ+D&p9X - "l#l?o=]qMۃ Nj2dX (4?`E8(8E?L^At>Atuj Nf[&9L~ׄP)Ez"nM<.b?*$ͪZ#Mh;˵LvhЊEMZ|/8A=PXAu62ĤђN*o| z23ぜK@@6g lΞ=;scc\a-m*Fq@pvaTg#9rPcHghDG &4A]F:a#[9n!'x0=<9A}FLki5q&0]tC#`I=CD- 3P^=&o șJ$!#GvAGұaSOaw'.Mɸ|Md?8{ rg4F'n;b2abT;<1u8XIdmIDe\LcߴUp+=֮T*3#?EXr'2·̱+EX# t=c ڷ.hf/)G\c}P`ЧgoGK4B2Bߑ^%ykucO ^-ݮEȥ@bDfBM7lݑSVxG,GYng d l>Rg d ?sv%4sڴiӒ5 '9$r| x9a'w Z9$C!!Wtz\5f6^ft#>ХwXJ @gX;SmqÞFu,֏lAu-9mlO]&?:.'u {[-q9bON-V-/POA UǾ ڒe4`iB';8MU*} f1z :$*if{l@@̆af̦PWVZeK.MK@@6wfpx&$`k-NF,x{ wӝI<,9VFY.4%ם<<؈/LP"iF_1L:=xFU}>!(XskrQ\&>^6A:n;16EN^iz{ݨaγiV&7h9Xws lU*ِ<d9  Q;s)XB"Ml弽͝?=]vh NMh)EWiT*T=6;eq?X?ޡ ;)+x^gjtA`)dqdDvlI=ҖXzU§hKc(1ڞ%F@l9p+?S@uk Gv|U/:9lm]у<%Vհ9`A@8ie z|B%^uyLVQ{ƒe+- 4*H%UL]vm7F"n>iˬIaY,Y$ljYVi;蠃__믷{N9±`/}INΓ><g: EǍ;Z1DR%zxVOáÛ \8Ip@ kOS&5h|ҜdJ} ֺ N>f.dMu{bK4h]q@Ŷ4`<`ׂf `g Rƌ4X]fP?} l`W:4A{hޟnNXY?7 x\L-}^tOݰ;<<;Lk6*tVFKZ(NUOK 3u}n?n0h!K@@6g cTcx>`{6ǏOiMC5)W?_~~{d+cU'H)68IrFFqrU|ҪQxPp Щ1 /ONwatˋ$;45:V*#lwU*!C$)ΠpfCrpB8F;57vte4s Jг P} d/>,͔~$_Mzi}PFFі "x|M4qq潔xNAAD9p|ju'}$a'DW߇bD}Wԏ6X[*eM$"я?YVھ^}S`@]SFحTך"l~NW7Clw]V{zK,I2 >iˬI&-[ )8hCDMNX>88s f}g6 P>EaO/i#T\ /`Ng &t{+""Ǚn1ԟ&'lâ:͌hq6<2hUJei rbCt)vIDnXfn-!ؠ<xMdF)o)4b/B 4JM!{Dd&>z]ot|'Q% %Y۪2qOuY~zK7}ᅞ/TT[(k UJ`uΦ=;ÿMvr1 5-F[`w'q +},ԉN7K$^;p/ Y2Q'l:vT?A(gzFƠ;Vhi6mLolb2|ӟIeSԞݝN"? rDpA'*,wwPx=|GXj>/k'mQ =M#.Z0=V5It1{4|xX/Fz_ R|\ڛefKp3$[ [`X å%۠=f#ҨQL+Dg \!(tFc)0dM_y=gOf"&Wk:=mL? ziDZ<Ȥ9"'G~Hꫥ5@OAM:ؠQh -SMS^a)FM 6FUfcD̆X FxJN }(NeZKZ_aNp iOԾDCh>S'4돵pgZ^ gc6 x132m-Yuzio_APn|aL".W ӻ׻AUI}f7JOw/|3U iv{4F0jTv`"lll7g2t#[|GF6ɼzhHM(]g1DA пUT%ViT^Wuwxz=;`9yS~%ۅ/4r-1XW?sIuP&W^{d3=wUru.KgiUܤIzrF IDAT_)[J}_F(ulvYNPV+/=:c] :ڳgZehYhάY?h%l-кAʣϵ?Zx.Q~b.^%*sGxLJ/a3.ٴޛ/aMoL%9 a e[e%Zc]6,U1|LfIdd~玐--[P5+ӹ z_\I)Pa\$~a~ϻXxx!&*$,i,\VֱTըF#O:ˣ6<(җ l6\bf+h}줆M@:SZ.H~0#(°۹q5kdQ)jdmpҝANqs4Găr>j&F{BܠGY@1r3~۸нWF}ZF;zKjg蝗$'=_5_~jkO~b߱tS^z7{fJ&MݨƗ[9bTcUg 5=w Gα:}M k({UZp6xS:Zh֎qyV<ʮi?PAv(}j[:؈1'yEPpw\ƕW 4 O2+UObV^9X{Xqg9M=kWkW{DK[Ol4dKkYKO*&2&y;~v;Cy4]GGiv~Im贼86/4zE<;єN|bGnoU%qyv9}gb;~M0u }TqN};LSPڽ쩦ݺa#FhC^vD[[vkF*kh\Yի{RmZUV91'm K}(=IwSY vVc~ݬ!GÏ4 .ي}7#Fiu/y]]ie ξΟnxvvYVefGfζk ˗g6g.JŎ8k6smWs{صk#3nxi\{=Fcah]xB{P)9vu3$;￶܋nHz&Mv22ŦtkwE@g'3ϺjFjϷGm/ܳB{>5*v vYBיgm fvi~Oۗ;]i7+I#lvumlIpQ$܋nVvصgͶo3MsՆR~vs̹辎x ߎW!lll7QyzyYWwSQBuc.?f^`jNS^oAiitK?bfnOMll}#Ve|H7Kg﷾TdXF*jtF;3uKOi+\$vɶw^8X-mҌ}k1ټ+ywa{د|lJ|/ͳ/__ '79gݳxuٌn<î<.?y}ٝ9,i]ųϷW۟gyC7' x]qunO]{?ӿIvKWXϤev?/"snMzZ?i>?Rmi>yM>L{ۊ]U[x/`TorIGڵsػ3OܛN7[x7o-6irmΗj=g6!߼V 4½V*^@ehE8lz#>-A4^fOccƚM܇̵FBu"ڼ-%[2}ֻ=Rkh#hKhke?rX4CAb?(YjˤbMOF:~Om&X^۞zЍD3o"SQwK}̂*WM|w=Jí&7xھce)v6$4oH$K/|s}$P5Ѐ/x+4 OnhH҇wϿOf/k3TŠV/Sm 9CEcafcwٹsΰ& g\fYm[KG0Cr,ajk8I)kw&ψ,; uyOvuڽk;'m̙fΰ^hv-aB(/uƍW~'=͞^-lΕT[Ohyv{/?f~{AZTޮ|.* !pͺZ{ @3-^ ߽K$ر,<F('O8;ph\wztZwz]UW{oT{Q;?2>jpC釲e jvZ LhN_D݁>KM/L3 RY2^=(CD[ )zӔd6둾=}mpr u`(`ҡ F`|n޲*4I^/h?+źUWyN9=XRQѾz֯neJzhCV٭Wܢ"K},'d/fZSUt!Xy۠>xCx]0 zVzګ>Ow`I䊥KNf0z;uhvN}w׍v\c_U^l>VpS໑J.]֭]lq};dfUNٳ϶Uݶzy||z96hCg6 շTt IzyeYQR"Xa.Pd³>k;^=|Nv`gm/.hg]\h& cm ќ}}<4Mܯ {l}-mvG5ڣCmvwy6CS sO=&u>˰>}]wзFqY?6iM9?jw>.}v{/}3K$޳KA%8mSN9wn\;Yvϊ;mdc~E>m_N}˗=;j&(f|o0elEոU6;mk|yoW_7,@ŋkI?A;C/؀3f$bq6X#V~ <5~/wj}+51 ' "'Oۿ05Iqֳ]7O(4"O_e57[˄{hvafcsI>y\u5^6޵rvҨE&IjWWA|l>xA_lh=z OF9Xmo-,~Qq m>&F>{omt=o(weomNN|L"uVZ5Y| UfVhxF>(G2=GPŽxVb콓U~){V^"+/ZjV/-Y[vzlg'䬴70JMoղRDҢNY/}҅dO깷K[ߎ- W̓}ެ{h{"Z)k?}VYxK6XKH3R&i'r~jr'l^籧w}V)뮶Ygu2AOZeGv{YN &F,xQj&C_Z7zG9nibjS%؏ڬO(l]u*ZP|w=n]Ѷ5R=Sf%{K'kw^4>*Ӕ?z6vV^=ggKɣmwh1lWZӎylk[v͞t$eS9ßѿGrW6_t-9۫gvgJ؞3mg ?k;.?OeXiV/BY^,i3yն.VJۋ]dIv|> `/ء,ۮN mo{[ξ{=Sv[ʕV])Ҡ֣>oQz׍NIh9T{.FU̵kV*'ҨՆS.zUZ.:r8uM۪/Bc-z'o$OU'oШ4."$wn}kHY4m7һQ%g5Jhy `J*Y#֦mHm>XǬba/)+{NsW XzPR=J6AckV:_nտy^9:z:DLW{SIE`LT'^~4 t%Z#z̔T<6$>eU*7:̌|F]n ,NV٪#4k"OY'mjnT}"*! XxiFT1:5{d$]YįG3"ūnY3-?X1MnSS[dcՑiB 4tҹVVF(z[W,*^k5F9Q?j%<&ɞuݹQ}3NQNzEsQ"[MϮ[ktWJYV$vR`٥!jsܽV0 QzSg퓧e/,9 ~V{ev/K mv;~j˖wQswmX#Fl\MzT6^^;Mm\I]&X9t'رc`,FՖfڹgʟ=L"jqw^7Mvx)290Rm/؜9[ClmKkxk3jO>h; 垥'YP*|;aI 4?4(JlAi[qkDلObgjS=*51 +#|,ϬO_b%2v2t_קgf}a`d/MԇyO1nG?V[Qc=RgtHβgM?]{d] 8Z-&7RI ׿N)Mca_uf6q; poM9O>vm6NSNy vw۬?=Z7iV J;35ANR4עztz:n FCM_zk!'GF{gPx]DBb#)UiD; VJ慑kf޺_Y\JiUzNl{e9aHFRNC_hTzZFE^Ne֌Jթ[6fG[~[Yƣ5"u:Z<*4lkJc1h" Tr%>^ׇwիdK {XXЮ-`VLU Zíujv~H_yvjgB(INv`).U1JkHxk.6*;T5#h>mOA e:)મ;p=Q(S.yMqeEIs*ֵqIu[}ivZcqH}[i[^g6ϾuENCj;c3)W/jV;O}SUkW[ۨ  >D#( oȾq}C%\`g>NxNgAGv=ΊuuhOkGchtm"qx*zDZ J ޒnz|auttڠ&AE}l-ŷL8#+Zr1 -?" b^%IA-PT";pzn>hJ6mZ >V{;ޑnZ%+ũF*Qk#JEk*Z R`"NK0ԝ>V$·w:$!dl08ɜ֭Jz"R*gUiUnkSWi?SL}TFQyUs=I3YF8^_ߨ_'>Ѭ\IeI;w-AEeIs>Qhvі5ZD`B^^/6#KQ< IDATlV3f>J&vM|xg4&J0ߖ}h֡RV,t,}iEf$Sl3SQ/F -u?Qg=>[vVH3 lF}Cеi שm6Q<f_5oQFxz7=Ⱦ g3@fh[efTa0*3|^ ݲ:mgG݀mii5۵Jt 4x'{E_pYvWۜj4eDllllA,k5pX )*'xb.njBrRVc?f64z]Po Ā%08~b4.e<4cQs#{A $lԌƎYn`+ޤ35є9hʃqZV>hV%`N Wܡ36O z3iD9:2ٱeˆ~[fdgle0{7h͆Rb)6.`fOm3C-UFA0l ֫-mAl(X$7l^waeT}ER?zz4&XhّMy Vew^Y{vԭէna(x?ji-с}6fΨhGWg|^$S/MK9Wl oi@h/t<8#B NFppq[>蒶?`ЊE5ح5Ь93 g>>axaUiPu]x: [rviO^G|E=cs4ŇR ȿ VF32M=d3e0pM({ mMM'҄؏hs>O ZNt/e}&&5 |q " X~ouboBZh>c"s V o9{MyNn~"hlU$Ƕl5 l52lllX '6WH|x4]TA z?m &$[׏uK_p`e| zFOݡY2LD2C'8EX|"DC?ےg!oXu/ki~|jEAI~;ZZ)!A;^S*--*-h1#˾{` "Y?YPֈ9;>â,(v[k;@qF -h.ᾂ=D 8f 7(;22+Ɖׄ0+6M#XQ&I@GKDXهi{fp[@wsDS2&P,FTD't0py;8j?h[ ߋ3is\PIPZe[GGl7B$EZu:xjW\vX `cmxo2HC*  Nύ"^҉b*e &/09S&Vo1tb Z r:n b NlJ /2@CvJ=xhbpdSHP "Nu6Ktn)pCJ®<tآ8M 4O3`c%Ӌxbu Z[Y+C>a"im:HSTҮEFJbRZ]--C[ ;tg8 0ڹj*v؊+sSRtqַQn$FI 6ܩrΗ(pR^V}Ԅ72E88NK4ׯV9^Ixɡ^Kk6S)XQr:#k'uqяOўrȷÑ#4@ma@(gu͚-NoMiH"It'$%(6Z4)(Kx%0 lTU_!.Pi)<54hg+zȊ9/%0t -ڒ4`NwMImR>s FH?rD@tz^zGQ{ꯓNsF? CDSUN?` ##ܐ=&izߤ>c0pL꛾bG? gl" VUDъEaq656 dO|DweƶΌ%Cl9Q[>-ZGS9MD^%h #)eH0hʡeDfoPhZz^y&ON(<#'(8x r+ *8uzexДfKs 26V('< 6Sy'[K]{ŋum9pH0əhp~3w]ypG*XnQPMS:d/IG3'~Y*O NUKK7rQb噂U׶q%i؃ Wu@=<0c )/is2MNМ9p#8_,E, M) 99x7BN|q)yE04NJK#3(]{ۢ7 ]A}"x g &^`ن=Gz#^5-Z&%-ʎM ^ [pv/ƾ=%+gb}x}6! $ܨgdfe RF^wh/?|wY&Kd d ph;Npb?8ZYO~b_nCQ'gvJcznF{F{Raߪ8>#vuO?nӴ`+GWJR TN3yi_Noͳ;#|mohl.4pioalA{]J[dI[-֌̑Gt_uUKɛeSS%r$76C?.\IDoKlԩ)ȸ[q)]kRfn~ؗ~3ɡok'Nw]itj[)>ۂ^0\gr =%QmN:ɞxhMo_Z$ܘ) ,H8bYk;ݑ ڜYo=OA{~_4f<>tgp QwߝYf%`m7Y8f5 ѕ?a*Kc=6`oy[lܹ) `T[n%aƈv-eغv~2ll8Ϝ9~}{.9~sF 6H!}T1+Rn;o+9?Ft{,H9眓F2JH7WK icM[ p9S{>N3N'ښ@~?%O3@/`jGl 9JK|H:wB|3 <0CmhgdK-eغֵ---H=3'kNFkOngN$zh#lf5H59#Hrf̘./ppW)??J޶x2s#/ ;8&8 0pqJ PGǚr'pض4,A O rH  LD|}يz* 8& m ;w\ bςd!?Aٔ)Sw&g6~̖0lA -?ː-[X6T[)-ZTt͍SmxʇgGMn)`|q8ngO EnYK񁁋mЗksO -V ": R]hW 8su|=M>:#'"z{ iK{;c paC-eVO}SC# ݨʢf li Gq™LlV]`E6znpwkuA=)V^{Cxllll>-ZSҗ^`$8|!aԓx@ y"a@lj,q:#ҁ=bqFq_Hms;)8nS/V|v:>[ [ [`[@6ɲe A ~e7]1OG=P[eve'$p7#yN3u!r o>S"Tmea1REY@޻@yrekZse C>pNß˂2ݭXy#b"$}*r fWDq饝E4}ݷFN^;6u~<}Ѵ&ĤuQ)?+:Rй^DCw`eÇƳ7%[ [ [`{@>gc{h,ck#8A8?B;Θ֎tW׃JV8ls, J`"c3ֈX/v{(=Aq{SMwp32pX{'filNA,&bkNvr/ޓӏ md$bhOEgwD=P`- o 8ہG:z?ӹԡ}nÓ-]LwV">?L;ڇY$З3d#W9XO;xs* 6}z#}|W-Q\?x@]JY#ї9c68茾fen%= lqJ0w#rOu_  ۜwXF?Fflw# hsd&ȥo@@Ү\MoY>G|h2,E{slll?Cp< :#?'FĈ2/#Ռ$1*,N8>D8K:c=6A% k8 3xPؚ{a9@ed_[֔+3Da hy<޹~Ї|84bs+ǖvcxEw?|l@ Y8ȁ{Bfkh'd6N27͔~G☓"(Y}'`{#'B@B)t'}eKOf ѕ@W+۱o!tIxf-|x&!2 _o 4?3ldҨpdx:l`&>>dM"wYH2ΖǀD##8_<@gQadQpp"q q©=73$ЀN+Gydr`v3CF`-ҳpx1?^5qGg`'м9s$gsgpC=8 qTхY ڊ@ L8؅+zt4ɦ >\tmN|-Q -Fe}d!/Y8t9;v` :ȏȃ d)'O*ROOX[&[4u?3le1{E]iν-9<8H$88Sg(>:QxWFq q= I<=0 Nbӆ/q\>[@u' xw<#l ԡPipuQ^twЇ.ɳ.-U6BVu^E ٨mx?/gc>am C6.zG{` 4˳ۍi=:s6ǖ2g 92fvg WXㆣh4NtnxLj6 #88Xx % 0wtaz-Xb =럃C@04--0,@p?>A;J)`T0,V]wh""YRP(\Ig~ƀO 0zzE-X c8;He5vx `c-@WrɱgMJzw,TfOᅑX`l9 u@ lzM7xY^YfXءzllllllm9v&K-, ,4& 13;ev8Y Oy~t(֭JD? Fu*I2llllll!Y C2SFر,,iKN8`7*~vX؎؁`ӣA ٶݥ8]w|f+S!ƒxYX7B wf d d d d lm}}ʞx,l[xy]u[bYa1ILa0``RTW')RKŕWvl0v1ll03f4A !1>uﺻ>ꖺo}]g5|ZgOgq&>-AٶT$lɶPֹ|Elˈ (1]G9ǃm@2N)]Z1~@ F vhQf-a3$Eav=|g"LZt|tJ4\^~yLX4-ؐ=Ir (SI :/^qa] ~#[ lBqHEO@ @`#to?W,OխiKߒt֙g o)T,f|>,'(&&H'p&xG6)P٥ď=X3.QW_}uw:F ķj_\~vCƎ;>(~_:X)$+V)]؇N|;t33KH,8Ie3+|x"|D&>;u1-RE#@ D10ƃΟ}NX}B%|FR<[.uQ( $ ?.fy隊;SN8!{zd,_\ ]O=T:u*{ɒ%^^"sٚ/7gbgzOb !뮻tQ;I ~F^S^z%]Zk6NSNwkjR"xFcl̺|${־p衇j2Ə@ @Khu@ @oO?7<ȳ-o9}4JL[|F34(U=-nyOr+3;|p[z{XNqtsp!:X|M0RAqey}/jQl+X1h/ѓܠ{P)J @ mFhDʿBMPΛzFg[22?tCĨo멻{O?]wb*;RQ>o ŋud^>ثq`xCCʵI⋚l-| HN=ctZStꩧ6 `2}{2 ,#GFUsCsKBŏ@ @` #)01Ɓt<BZex{N/bk.h`' hfjoYwh" C"^{5kd gA=4p8 6o1*bIl_$ilKrt0FDd Y$& "9am +"D)0](@ }ַצQ D@~ݮd5@ &" _t?̊t-!hT͓dԏeW$@Lis79oD!> م+A3|gG'F%`4<.IHdDaIc)\tu*4L &BIY1͉[a`:S8ݜK<(l.!%Ƹ@ D1:Ft+94ܓ͟$IXn K<3D\Y~'nJ>F?9Âl}kQ xIDBϚ_Ɓݰ`Q7=鬳 ;֊[oX7z d$`#)_Wܮ@ cC~c܁@ 0`X9ƶ I8XL#P$@93-D]of}FprJ I`Bqv"! q`Eăć$7lYb~!)a!;2#v|؎Xm#/$dQ@ @`dcځEXZ6/-&hMܹsuW"-XL0%؝]z|F`X,=IJ~K zI|>䀩\0dHHY`t uQGBY.4F z @ PFU F val{o%po/# Ҍ"H|34e˖h[4$fŔ*{ls3L> (m,S: N&uvS>[Su 7hö$($=$G$ $Xȳ%ۂ@ ocC`oYoҪW@sv{6ww"C!iR${yƕg$Ǖ笽`9"lozgЇd [?aL2[1}@ |o'lNbdcs̈́9A6=Ҭj6,09Sl \۱ɂt}Ts|3F/L?# N=`֌`0oak HBxFA+@ dc|E@`Z#@,jo$n͂k7@iF 8oh0UL"(@?뮻NL\pL(`DcI'֖5r8u԰<BŴ,a#Sy"a%HfS\@ @`D1v̢F 0 ~_P'"^ys\__ytw:5,ŋu)K@Z݆䌀<#YO?$zhTLF.XABS|g I.Qa8  !Ia+ d {`~q8#mR#@ Ƅ@F5&9H(*I9S=`Y{vF(H=C@oIugҥȺ'iO~W_ٳӁ8b۴@  bd2@ L=nРS䡑S[l%\o9i?7~8~R> ?y30}&5k֨gL;T? ~kBO믿>曚Иv$Lz뭷.vawax%bU @ 0M gJԹ瞛{tkpĝwޙ.BOt-{5\ֲ~iB}>;uH?C7`-VH.;ť^ FuZ^ϽO^Lf\?1}D,F8{Xx#"ƈ@ ˗/O?5'`䀷ɌTtQгf^SoIJ;0xҗt . 1qG(￯#%%,mԪUҿxԀc=6}K_DH8JNgiT(@ 4o0f ,HS?t뭷&*6+B2+L~&{WZdIm4gT㪫mJL!y3 $D2o< jyO?4Pϔ7xcvj%HS9CMHy?[h |i9'DCbd*6vu#C( <]?v6&6T$SiR__{.=$Yۘ :FqH"};@!FixL:&P}ݧS#N<6{@@` 5x"_<'Ed[fX4ȴ5?h. ^ P N}hYXrۛ2?JoO3=}>Wgvd1JKG4]OhvtfA4~~``lߪɤ^ J&io+Vњxd7jv\ۘy 7dzߕGpR6-F}Sa{ه񧒩QW>FSSJMughw]9^2N9@ F4e8S(coFu_-Z ? /$Q}&o{d FܹW[P+o5h%oO{e/%qNO4 jL< Z60}*اG#$+*bRD:IR_E[e=O#:J~&6SON]'R #=MdLyrXpD C d*GClm/v2u ^LCҙg9ΒRdFpo'\IDHRg7ܼQM/#Ïx *SxM;4ERR3`wN#C j7g z7a8]vpTЍ|d, 33i|WȅvUlDd4iR=hϘ/bDō{TF_@{{| O[`{ժUiOG}n;@ԂV5 L#7IlBK%?4r2F.th&}k4/<|9{!gYFOfZo+9܏SSl{ /C=o ql## ͳ4~NrmE&oI,BO&QQv؂J]J2UoE/ue8ݨݰB៍FTDS, R7-8{`61[#!|uL`)DWLh.2'Cy 1Ҩ/"xQAo#H6mó@`\sMt-x }cL ̽>H F7˛Mဗd@ f_0'uKB|n]۟2E]؁L_=m-o\4{ 4> oe4J3FO1dKK4db Me~liCwɈ?Ս@[=2K6O;QzT&ɠ(RNCe2%%%~Lڽ K}.M@kgJD#a(QM_l t0!v[@ D1=-ƌF+Ԡ$Ʊ#X]M@CFa4 *-jETG2`. Y*ɴ^ct1U:(%\/4l*1\)mӅ\6Y{qo$ےi=1Y)smn}+Zh\H̪%o$YCCOPK4COx"D"=+4O'&Hve# _\@d3 :"@y9礓O>yڊ!Hٽ4YehEpFAOm~Vz4=~D2tΆdȬC_eud$?:YpCC/gЄdvdG!D dQ溑{NöLIPMf6:z?b@]ր&MdP/A/mS$hp)/v{u[vuW@ R"҆ 9s椇~XxF7l xf ӫDw?MNpS@'hԵr(˟Mo]:Й A2 ON UwbWׯMNMs6s6hOâԡߠɔ>eS?"×dda4Qѕ4/LEdMXFl,l#RRNۢ RG ߆A 0"b >ũ]dAק+Bs=WE__ '|sx 6 |fѮ/ xԎBEtz&&[Q`&1Y#i%/cYh94 ~T|.fg[[]~+,hrՔ\-Im`uYDbo{@ >"6 6y=5l1'[Nn̨믿hkշ$4sYP=$4h "ou-dE\ot!Qb\>Nnߊ'K]J#B?:7Xdy{3'5HhjWƧzm32GPPDD6Y Ӛ(L ᇺi,'AyAZm$ omPxz#PЧ+A#u6\ 5C&+(hFӋ~?Vf3_٤zj``㡺i3@SMR|8X)2i _L`E M;>p2XBpGhh^dVYuT4ͽo&B>M*,&2sCSآC2хMUѤldߗL rAe`x{k_?=@ F4d=*"ٰm==#vFnA[M%uo5Б^_-ɋ R'Z_ƧAZl^;vA9I G)A_{PW%|il}+6X)/"ӭ2DG/o+%XL 8Y 2 {ުW %Z(ӍL|#!!YjU2LՓ#dҷ?5 ӏݚt^O]״I[h=~Xa㾿C+4ZmS*AeuC@ nZKt] L0, K,8g'o/S! WoP4/_f:g̗ ;jPh{\oq|ɴԫEp#1`2UFG1?FI J4"?J2uKYى,kN4x>(/>c4iU"+&g߱jc|^f]Mij>yVJ4a&}̩JiCo]6`Se'ϩ\+f-p^؉L|73|"SkkkT<5f\)&ShP,fvM.O74R_T4df  ;E^=yfG1m=iv4Tـ2[[y1Dh<ԑ  ɕ6>akPg tlt[?@dgM'tn,]t >lk>t0AGP‡"v!Ax?!uJ&JlP!*l|zĹ4Z[`Lx%(=1w25ޘh4ty`gs4 v][j $St7C~] ltԏ, ?ГӬ/ck1Ȥ6Mt=YGȤЩِ9F#npvoQ@d4< Pyiڵi$ccE Í7ޘ^~lٲ|{o|iwV;tB HxUJѸ18A#EOhyH%tN^ڔѨҩ~IfN U1;nSZA ]}խ*%C&S}ATGӄ(g PZН#E!Ӄ+e˧*OI\;{ԥ2nw*Z{Gk|R[V/>@&@w#Fwox4./^֭[)o[xϧ;C$`M|9K^jЩk |Kmy ;ȫ^T[K]&$X&7EBGx=FS@Cf=N~, v/D3GWUzعX)կK*&l&f;Ŭv<*x_jKYXA [ڞ̒Lb@&ȍl)b?s74l5Y} ҡ}ogD![َ*`|QʖIC:A_o3@!>£@ h k֬I?k58t?~z&xq$`B}ݺ 9,Q#y) H$8iK N~_fČ\А9^=֛GO.D.~d;y(Ԧh%%ZvkgIfVn%ZIӆӠl<( | ;AQ@d8< tK/#>h?|k0_ A05KO>dz7M=WzAiӴǝ:SMXxy[K KdVB"hۺ{g{݈\dn9Vfx=*SsdoD2oFUZ%F\f]Tm,8o|K2놦πޭ,2FxBHHAfޖ2JAiE7ׯKC@Y-zr:!}__n|XJ.$S">B`SF%Fc4DR!O ׯ Q@o-q:`ܹvqc N;k?>E4,dd5:vV{i:~ <)K@ ,7 y:ȿ9{l1ObzSFSۙ ގNf΢Oe2=~MANic99%_/He gN"xt4X|]`4i7 T%/TGfhLeRN?S7?Y,|Wۭ#.McehˬrwNӑJ}fd#J t?lt"Ԧ+VZS |_םa  Ӧ($>t.9<*_UYTj6 =̒nb2&y?Mckeu6i"SHZA}~X Bz;+4$|*ۑ@ "v /Q ?w S8cNIjZ b4ДE:+yl\hRqLY+Gh4va 2N4|^StL9ߑ Z4уJZHOm101ߍ-VJ!wOCaϘ_/}<3%={d)4zdf:ƽ,xN˄f-LO.LL_ yAK_o@ "螶 OQ8ҝwޙstG4Q+@0WPP&?g ϟ!;v>Cv,&䝳`dh,?GAdeQ6(I4Xi '%o-4{YxMڂeZPߺCCf[JMvFYϋNͳ;H otΆgb :iy B2oҿF:g=^`D4 Q@h>£@ p\k[o >{[ط~;]r%Mկt/}B`_{舁V*<Њ "/|˸KM=%KNv(bt=K&M;a$ "SIfNKs^^3뤧E=Nzry:.Z%=%qm$]wdFj&$@!#]פP 0 >_ZscT1^#DKrK:cTrv9d Le᪮7oI>=i4HDM4F>(:nN~&C,*OeZetV~N1"W)fvbȶSwǢ,CЋpdH~k2lW<3H~ׇ>uYXldQOVtjkAP$`ZύvyVi{>o2]AxOa$$w4XU;[z֏U<ՏO`l5iL i7k3db֖Zm4xn侢ELyf4FBM5~#llwll/@ mjZ F1nV3#jKp? ub֥i@%A ۋrЙPBid`7iM>D ѐM6@g2ŦA&UviCECB|D/&}AO D&Z?U*h}0BS,*ԧ*nUifzhsYQrLT,Vy#IU2§xOSi]9 ӏM.,D}`)4AiOE>/*S)o|W;L_FX;7 vST04>vߪ0Y\񉑍UVnx{キ&'@hU>£@ ٖvٲew{=M,P,F| IDATtK(+J^y'ILMtӏ|T>WF`/~߬Џ8ˣM7E&}įDt%F>|G*l뮻K4xScSX3mn<#=F-D. … &-'@BV1І1RwnSQ׵GtYS9i\}$3=Ԗ^G{7 4x&hye\/6BA.T6?SЯ~g(rW7&|H!@ ]^Iu_M 8ysI$N۸nyÌ\Hƒ᠗{} -w+|,r#7|0buGfSDT"7FC6Ll *9M7ot'=obDה)L V_)4S4e3S(B3_}ݜV#v0JBn6*EefsV)6&x.WdADFt2ӦtiRyL$:2T$Ȕdԑԋݍ@$ݾ] D=t([llA|@m>qTf B|6h4B d6‹L&xzBc ^(+%놆|]!P0+ Lg\Kz纡>XD&Pi|n8gb @ץt eQ3J;XEQ>]>DS/4"t!ӊm4Tna7uEu}M۔nV،΋Q@d8< f@7HhNwjrIxPXDNp{>O#|➭ު h[m%k\ZH̡BC0d;e`b}L d6v\ h$E"_Ʉ7Ӊ{ngn462l m9З}(C(Rް$y?*G/r?Dk \a#;ɃZ4Q> r}!sxaFO?%VڿF:glZA1o]kN><3<3P-nu-8oNC֚ҠH5-wkǟMF\0)!44t#畨;ɛii|Ґ)82 rPTki|T,᧗lLj="Q?wb]A}l߹6Jh<i/~TuPP]4ZwG=>j6yEheozCC^sAyIRIH4x %H6@@m.}_Lǽ%,x,QBDfOzjit?|_NCdCfJ}l0TaEĞ{) Nc]{@ ЅvsR 4`O<_>կ~5N:a1Edw)Ylpz|l'2miMQ֚jbV4E2ԥ!gk^öw,"@fn|9ovG}_J4leRezF{Ph/aY[ٷ IgQmӠ;#a2{[=%>a2K}. N'Lj_R ك/JaR[!i%H6aí@#ұnVLbseȪU,/d}Dۦ2IAF@Zچgv?G}F`Ar-^h[mbiCzcC+JfLoӍLTH͎-ImiY5uV?7[q&Q1Z. )[#-3UwLdR?ף2?^'P(f7zORN|PIˤԥg9dyaEr}?DoNk^dvß:J=`4f };F:/FDcx?bzJJMR?5qZJ.S3-=V_tP㟧I;FJ}Y>%/Kw@ U0_Sj0WXS߯Ix%Ia lPH>lanc(Y+t1^$?t9yEʧ*VdBƜo #Mx'3RӴѾ>}N( mvLC)A X E.gmX14ɫ^'d]%~p:e45V+tڭ{Es;+qC_V?׍\ONS.X}߽|A-YǜW#h1<2< [q6[ ݦ^s6ʍs6ȁ,hvFI7Xh<YUu>' m=C>ܛ}h%9q[ 7,AL# @ lD?fp ^,eK %(lY*k3:Шl+%o:?`Ц[@eBv*i4{F@:=g!٪R4 imucSIi6+)8YiJLCߏ1d%%>,lz"MfnR4 %ڀL#?ѣ2^4؊mQ@`f#n>8soSN9%`CC I6TAb 9%Hvz1m7z]0i|&JUdlqjT^3ȫ1{~h\`Zou߫4dHi]M-OߊG+F2&W^Z/EEE|Bj*{6Z0E/F6* _t +l)'헾 3Aeu =uif'KV!X {_Vp;Ϩ2+2=r׭^}4oɒ;65]q @$3@``bժU^-u}t駧֮U:o=u$FyH,h*St 9Ѝ~-՟:zٮHʠ{s2!N/ؙ4$Xt /h GG}:Rw-]OU[PW}J&4 mA?}F]ߴ$dR5֏n~X?I^nz@;TCM+f[4|ϒLBnK??'?g: O@ D139 & f/LYzC}Gdq{ AdT eA Jmll+\͎dڳ{ dؠOu.DS#!eH|Ґxdz9KlH8 p:sNSS jآ (SYi[ÓZ}Qx|UF5 ՏLɧ/'h|4(4HSj>(/ѼLgIfev(~ob)Fw4.$awL[>}R} ~{o;ΛNd D r 0>r6 9σ%#táoC ѿdHYմ+7:"!1;foy+M͔i.HBo H`x%oLj0%A$Zw3]x7ȨO˨Ь CG`:ѰGAϠ2z bZR؃F)2=r׏Lylui=P}ZY~^F Hߜ%>~hkȃFcfhBͽn #7`'L($H7d=֗%q;ZkK HJ@݉tۚm n,(luo=+oߑe A\?vT]w}E!"*aB@K v]w^8wDkDϯ~OjI{(~?߿oc= =쳚@Q,#u2?DSW~`g?$ vP"&1et.I(MΎ<ߊ12bmW\qEZb&j&%<[`um,>|*Mx1$ mNўZ\v7:jI/}CBIHrq(2y5S;#|HM$hs>Lg[}$$)W);<= }l~FQ/n$ꫯV,6gN8A3È m=_M͑$QTi#Lf*w lyTzJF0}Mi$ U$\  -so1Ua#9['x"+oot0KV|1o/^X໽fJ<\9{MӒ,@$fF3H?5C-JsMJ 1-&A'p#$<_P~BPnnvo&‘ 0ݏ+mDr!;I-0FHF`T pdn@ Ө]F5]$"hm.]AA##Nμ?-/u PyKjNI4N:$O֬ s$NM jvt e<3W I`Ă@LNO\ˊfub{ oB᯵XcmvlR^'=rJg ol?XQ&qC=01c:,?颋.R}# _)  J,dfo# NȡTh~ԑ9Bu}>(+yP~O@>b@GBbvN{< قP;6bI~I禢Y~vx;dxQ{9_{9cI2̎@#Fqx C@iD6`L|a;Ord3gS) XO >ƽb.gt ~OGh%`M&ezm? ]Ia:GSҶQ[_cER[ӭϭ~\@ G߁ DO?\?~'=;O[HRAPżw3 <0sIAWaL \yF=?m? C?rY#U)lv7NzvsŲi# ;[;a)}D> СVM`C[?~#B7ݔ}zHz駛`{_rF6ƴ ~ H&[ @`##3Їj. zO'XJ L@zA;6 4"pc%$馛nX4nA3d ϗeG "U3b@`NJlɳ۔IsrƁeE$B,e5 iIP Le.+_e`ȎF$&`%0̱33X,i?|caoY  7ިI 7XM]MFnMM6JA/U.Ɠ$ .W%@@^(@ 03IPiG|>Cr$@cVHKo/rdqA4#?&fT0[oo waZ.YH\xNpbM  o|pP{ cIDAT4`wyz7?!XL& g|b+uW7uA'I7m]HDW#4=7(>2a$O~}kSt3IiWh v~9O$Jѝwީ%8O %@@$iŇ-y9{R +AF ?|}\k@:KF"H(,)''1 16HT?FoMB S9`:I`#$VAbݖD| P Y$e [hɤ:3ps6F6,Awo x#0E{3RC@O!Xmʂmd $w$ .$\$)Lbć7")?"lJBW SIm@ 0~:A"hcfV^Ͼ'%Q CAKA|1u3 . h U<#"<9ipr%`ӈKTP ?RcIkgӌސt xJY00a>+2~sk,?76(<#t$W3!C[2ƒ,D ѿ[Z&vn`ɁLw}f$6$KbAċixPVI?Q@s6Mã@HlWLe\Pr%($ SNxNp?Co L.rh=Cи792O /1/[zFev뚬fxgk%Fgʴv$E{P]X\hqs6ԁ]1- Ƅ@,\t_|!K,\vjn[\.CF4xNAJ]A:zd֋6h%ط %T02;(ɝ Zn_#O2yk횯0z}F3rlk_@ f2lg,^|,kҀAfȔ3ꓜ0"̵8=ߩr>YxKnO|X /PiU$OQ@ @`!k($lMA3`D `VvFޖc7*F@2nJ$ Ɣ*SY0'1Z__:ZyLL6$2Ȍ@ SF55% &IlٺP%;ObPx6,%q`$ϨϚ ܓd03 ]f;8}*Aedc:묳:.elq\>6=kٲed=u `@ Zַ` @`z"0ַdtw$p>uE0peZ|''ȇNϞCQ ?u/zzgBBVַӳ@.1Q KܜfW~q)ae3l.q(>>WpY*3=1u]٬XpOBiZ$$)Ȅt,E @ @$Sm²@` Q#+-k:(/.Q$$LwLBp*8uIzߙĔ(9ms0 `u#SOՑ 裏քn6O?t;wnuKBr)%K $$@ @`Lַc+@ovN%η:$LWv^gm2PQ=߭V~(+ȁ#,oWX"@ @𾥌@̗_yfY0gwavtvg65@ 6?ll6 IEY oN|<@ L$7g" YD .aU 0a,%F& =|駱b@$SU¦@` \ F @`!ߦH6Z=" 'ϐ@ @ qFt@ @ @ "٘XCh @ @ D} @ @ &H6&@ @ lD@ @ IA I5@ @ o>jJ_niIENDB`pnp4nagios-0.6.16/share/pnp/documents/_media/bulk.png0000664000000000000000000020234611662503006021155 0ustar rootrootPNG  IHDRT1 pHYs   IDATx]U6e&$3i@E!@`(FTUQ}S@wiRHm2dJYsνs{g޵{9kήl(QO@-JC0 C ɡ:3Rhhh *--*Έ0 C0 !MP:rss_~4ـbcڷo`4Ҙ:0 CHt$@^^^.4x`8p`@.eڶmٳ %3333;%S!`!`t 2PRR"##Gw(3mV60UqFի1BF2:c6 C0 nF}i!Г8C3 ]|Ų@'j@nn(͕>jjzgh挙^4 vH?4?a5lguK,իW 7@wuq+̴jf Cd9T\DOmr*Ojn`_kSNEa 0c}N@KgUJ./䧴׿ G}E)l…}c9=#sϥO 1իWGWil` eٲe4eʔNW\A:'?u %) ;_ML8Ґ;m,0O6_'E/vǢ c ݱhcyXq+p:{/]wu2JzGIÆ S+!`HiiZRa C3 +Vдi 1Q:+X.)2t 37LÑFz~_~i*:a6wMկ3ϢO>Y2fƹኜnč>Æ1~LQ /ZGe)gذtaܹ'?&3 wy'͞=YOID5v8+6 #xEP奅.4o8GIZڰa]tYgѼyRVf544xHQv~*Tӗ};MNI]'Gu7 : (j;,#V`Cq1zL=pZd9r:o63f t4tpÆu"tAs t~vl ԣd)8GF "+X: Bft9Ap4.H+4oyƂ#Dtz 8p)"q`1(F|#56_܁?{{ap8~,?N KIؚ = oj8mmCFۅ)zOОӣ1~/Gvu 0U4+G 5حT gi5$gJNX.bJ,)?cǎ%tC“al3I)754p./  1~|#'G=9/S6$H~i7PKI~$FX񗟟/v"oOs#v0Na-@;$ aҠAчΧx=Y?u][u Op_aHx.bN9TK5~d?.׿N#l1ho{=?pMr }jpJUhg k@D?(iZi{PEE)Z܍Xl AҮ]})w& (&GggҥE~FثUni0]rtigrWs'~}[_#cX6Ԝr*XtT~(#|Q͟>5Zm+?E-i-TPP@ ;kDo郟_ HsF+8(4/RO jK\ROI _fDTO}m.\>sTt<Z81"d +btmby8q3NF9foC %'x`o:yzGx3xi]ѦM g?RoɮYtrKp^pdt_+r9̙3Sg%.)*|t{w„^)M!Om-?*!xԟdm}  @Dq Eig8~%?Z/:F*)#;hiӨoǛ(H \^e4dص4vxc9OS#MܙW`tc޼y-F6Am ܸʩM?Sٽ{sN!mVU~喛 `:l:кuiu~6ożktK_9h`TtchӅq@#+|QiAwVW./ y7~Oe9BDƝ$7ʆ >=GmX~>.?mαFc؈+(6GYMF^N99+sPWSS(ZR:N{mW^xE޿M7/=ԓEaI~e}ȂbdQrKlj qW\y@> DsD)4 MN|eA?J|/}n!&&iHI WBz3R5Mi_)6:'K7{ˬ_[暟*Kڵu2`*=Kf7Fyg,j{GFF Z /mՔGk֒*s̑5&L`> `'[:]SSJQ6MtqY4mU.%ѕ0/Oz6L4Yݏpy5>ˋmI@򔕙-~HGbԄ/G<<AI=j *4BTy$~op(򖌟+P*Zes(*p--uRa{ΣQ82h5TƇ?IEָ&WiWyU= WWIQ|KQ[hmڊ5na/^Cқw ُ{&EA~JmT+%)P,ЇzKggEcx+)oLJ PŤ W~ i L=Ɏ~H.B`^f\|r ĤDJk֬b {ٲh+n!(oFeo9eX#Iv• T1H/(7ŪCX= 1By^UYP/|p4<]E`%}qBļo癋\ I7$%^ ˿;Sb_ im@~K;-ڌhseW Hrge˖ڏAa_( ly]nک*xeCj^21}Y׾&Я1$?*>Rŝ=_qu?\q q:y -^LF)&?į7)=~"LII!kP#@u] b6xsor<¡#^eoM57߻wWlh߲*"99e%cc,͝{ ֛ }gxD5FB y$XȯG54 ^Ji8cSĎp~t/APwAelwUH/+lW]G1w9wI3t~ݺ_7Kl,mp`TLJ/FN?G嬀뤒k2~eG h>m&YIedVQ5k~ |]@5 _0q ?eeb]}uPYF#p5]%\㌑'~)9¯2e~)BFk3VHo0x6{KsOvۗկ ?QBwu'w{ov>ln6oÑ⾓R [>Y(8-'"-@-8qx#B34qb0O#H>9PIy{ 73F3;-}^oxo;٦-Dr*jngq'ˢ{oa=) /,Ç <܍{ }E~ [&MDG Q v) ޠlFh{7+E93eAkI^z+WҭBW]C.[[~!SO &H>7xCNvt)p~[҂FO?@ *6~XW1pXWN?i =x]ёQ =|Q4S2m_(ui~P.аn@ Z5aм8^}%O]۟OUdQ@+C5̝;6n7;}w6h­h8hx}ێ~䑇e7 %\ƍQC[C&܏7b61F6 jŚ1` asJC100)/>oPt4?Λ>@W6^b9,ΌN5~E@gS"V~8idsev`{-bK-qp X4/?(ăLèx״9},H/E`T{ 4b:60uv&ogg”6^a~ЂZ:?<2H:nqhрAn.<<-Ғ8L%Dz42Uq휘F+Mp 4~uύŠ*ʧ~i$??6 W6P$\Q&ز( ?;룏ϻ1.~bD<>^k %+Zx *fJV~$.Cx J(JYàh?p~~7(?ZB&ޑxeWdˢ.5pm/`(ޚk7lX[!4ü`D@P^)?0xƽ&z2m@4|@@F IDATPw?a{''\py>CG" h:l(ll۶[jx%~#䎱h ~gOFۊ-,+W@9.Kg9l{!ڻ[-VѦ7ChQ&h3w0q<7?{7" zHFɫoO• gmV].m~Ńxǽ2\C5`p;멸x_{}-~q9Ε'S^qر ~ݣsExI{,^-_u_-S%08 {a^{xDZmبYe_.a!0 Lo&4mh Jn$,ƛd*!w0 ǫDr+&Yd˛n_4 m@UthWhʥnip=ԗU64\\#5Rk]px4^ːVUT0r0az~-a6^0J##8>y]Fx%u209C+B_򷄟Va@2OGVe_{1-)ѣ^iTi/xwŊ;9 F:|>}} h4eegycag8ws\u gi|[x^%i i3hڴ|/J QB \†t0eq:ɨ+VeƕM!?>V1Od%wq,7C$$^J*rF/ ~w|/TB*~T:l("~#/WN3}/`F(_s0` Bq (D?As{.5x'mg: Q&n(=Qe0?$@^:>t# n[wwn u^D^mgdX'dYڦnpX vm5Vq~si{ޭ9rlo GHO 騹J~sخ/́Og#)(6rE L~ȣLuVڂ|31RƋM()pyn:_jOYYLwz߄+ݫMux 2E8Oحq!7${ L9 MoJLd_kK4wa4 t7nZ/\h0€w#V s+|bc ?R,tϑ |KD`le 0B-@]{i؞b0sI&ܴ N3V߹$.*Wޓ7f?^HW]uM9t?NFG:Ġ@RClnCNëqOM=|P?!I (oX҅88 \{6~F:Wʤ >s9n6>>0ʔsJF=? zXG!~, "6#?u*士L•H)ֿ2oM3&]qQ• JF'շK[ &% 4%}Cp\9X~#Q_l>CܧI$F pJ~1T2򁧰[/YBѪJ|+k)᩹ 6-hfD$v5ͱth디e6 3M۷GyrsS*$9GG?+]<;>9GG?+]<;>9GG?+]<;>9GG?+]<;>9GG?+]<;>9GG?+]<[ o߰a;te|P6mڴoHFXǑ,peMNU“֑ *%mOpPHyѷ;wR>ī_~͎hE%m4(ZïݿV ( H4 7ĒOP!Z"̤N0C<1~bv3///aBKB!LI:|f`D̫{~pSN#;WYa_O2>^<,S(h>b|4ki.L#m0w4Qsa_*E1)v• 7D lx@T;?1i`QzORZ Q̬\{K wID=$X4,x4z22zS&\3)E(^*P:`]4;3gF OS>M]P6sxkl{'kz0i L{4w\⋩8h]3EiouP%^ِ~?j~xV*/n%$+F)VhZ0?Dca0MD #ʳlƍtߥ23gsιO7hxwfmz' _",##_)CWOGɬ+ W6)h,хحtaaLn'qGߩhHn۶.:tG?[,C 0_0Ggm|߭  1co>Zn-tMioQAԣd+@Б/7R@~]ي$9-|^uU4|0K/PUp~Nр[NP2p;%Ij? Pz~t'x#jvxN;?Pg•  F+Z$ӁRݾL_ɏ}f庎ZXvF-OqtM|giro㇒3z):Y2,fhP"g 3I[p1(w}77PDceEϯc40ٗ%|dC:GW}n/}Tp5 V?vQ~\Dxn~yr mAP)'-U,L3mkÝstXlx7z٤E䋴. a97}ausWe.FT0)x}-4m q6(Ø CLa&@e dW• I+|qpdIg"NcPhODuJ͢CӁµ5v!G3~I˷@0eCtZH#)Ap*8P@P@Ctk>[י?tPHGb,:m۶ԩӨt͏J. Uȍ>QiY55>0͟> 2Uw4)oU$(\X~J۠ʯgP8H* >lC~ !|?@_ ;)#ܸڱ}գSK6}@{(hbGN5k6}ֹԋ6ߵk^Z e*V)DA˝>S;/A~9?Y^\௯ 7T>lЀeaԗo?<#՚;Tqo7@ 9ʆo@ y|\W<|}yi >ArzmLi;IffHFg̞YЎ`@97/ٛ; vd1tQǀJ?B{<ߥ1}r!ռy̙39*>=Z*)+ gy6DXyw7$Bn7j |!K5 ٰ{]1&\ȏW-+;xTN;49]sB`Kn"17BT'O#5nѕRh|1W!wMJ@'w 1ԴW~2x_ciL]Y6*;# =KOC&"ܽ\E^D! -ifꪪJzwgmHkړ'w@((([}] ?~" u,.?Ӗ͛%w}O6m~)Xk=v!hPB=~uO+W;L CB{m޼Qq!HqCqnv9)MdS̯oW# E4%\<@'/ \ V@0YѸO꺗YKC]tK/_.,MNpKKN lɴ?oD'WO~aštn.r<8'f7iԨTNaݨr;%*+")0@DWCBZ0Df NV 0~ 9LgؐhQc>&EC~x(ΡP]]}Ӈ̷;L[|E;ϧ| Z߲~W^W_}Y88Iqcn)SE"C)%_SEy9xx^SLKt2) ;^Wq/#1P;B sxTʢשS ͋PKJJ' GAWomw8z%5H[4LOpOD@~@S YțЀD¼ 1(,9j S^01n۽nDn~SCɣsC̐`YIk)Eٔzύ)?ZrT^QN=,Σ04o!dxJшw`M޷,"'guaJe3~K۷y: -Q5.]J3fhSd_X[v?}.>ZNk>^C"3Ŀ{.ۗx LuUsMM:-UMZ³TFo}M2N)b+q1t YwĬ{TtɌQI]~ P*fzj;AЃ)fw) _ ʯTCUjq{axl ? KGYԟ$yּOH)+ ^$+QWw=ѯOr4{.{R%*v8EiS\qэy^\{;B+>*5VғO>&ԩ\LFFf:29|oڴ̨g:;x(>.#cad ?L~ uժ|hS z>R~iIij^b<1r(M>N#&pϘ1F&42(k ~}t9 F &cy,%5iT\،k``VfZݣ"a,?!5h^!b ܈{퓿 2(x=ߟp\|v"Q:̙C^{-x1K+^K! d#bE5{}>]Ll߶}rM1c? oa/'t$\XN~ڴ^<O8k4MF*t~Z#Py IDATpPŋߐ>}dj rʦc1Vx[*MyO]5qnSMT> 9PS6oN]?vߩ7Z2X"^iٲez իݹÞsC*Ih5i| Yd xrfga4nfS(؏At.tU3iy?hV=1L·n+qT̤oYYM8Q'Zv+~ZwMn;%`-UFiSVe_|ׅt0~}ދHjl` ^96 F8/(P4"#g^űq^` ґCcci7׌ kߑF߷_M>tX|LCh⮪p (*\R! ?m=kRmf+_Vs(qX\ǗV9 ű@<ǡv>ގTذamܸ1yl"2 \ytM5d /ܑzރs 6=JhҀAM񰈭Ӆ<ՈۗC7@\6pJ% {bl@pJu e |DZ4(!C~l;.ELoFU3xdb1cO6e؉e%%CAn p-o.\O_:[SyԯA%/vh66|[/Dxfrtw_H4NpmZSDX؜@ E>P2lg ηT#?{v+0%T/ .puu$=+o\@¡# $^mCO5ΪH;^g5‘u˫'l89C4-0O >o =ך*Uz"{[~O }vJ/GӦM;[cvt ǝ.i`^(#gsdho_G}Ĵ]&7%'j2GW#pe5jֿ_,w,?华3m,?OGׯ[T6V87WUy$SZ~KvxqkZTґJآ+/YvxO#ә?7/yŊTQ>O+\*tعvƪȯ֊Ve2M[#CGF9`C±s;.WS?w~InfB;-y犍ʍFS.݄.3OAUlg?!cJ~pmek,ti>|2B3Y[;v8NҎ*MJDe^O@- Rw\Cp M}Z>ҽ+mSͻo;C)~26s?6ͳ]@ ;K *\@"eՖANU{7XN:eKpzڵ{|pt )䯲*lj<8ʋJhմHnWR0GSʭNypPحi_U]Dz>LhbA4:1|oz&YU] O(8V]@• Q2-:؈OSC[l;vAs)?뼮uuU-]?]"oQ2{EroI>XРq?>쩠!C!q n `y.)!ϔ;.\Gt 3+ᒊn"%K乍? Hlw±c;_2Xg}TFm8D˟+He *҆4ATFhCSw*۽g(hsä͌j ƆѴk~GMbK&~3$(fꗆ"QtZn]R+jpVv.>7:.?h3L'L"N09S3Q>n2ð{G@_X^l(`w++TZr)_)3L3_zG4 GB;x]wzaaPD n'IP6\-Ce {BϞ"ė @aWd!PTTQԯ7z0MB˖|'}8/aG76 >9xp O˗}]]<=rүE2ND )ʆ/'ߤ^ th ; ?tWbp1hqۚr(D ߾}'?ZАK[7Qڶ-@͚U4o޼@R Q fy@= Hg|(g~ixh=0!pUW]ENAg`tB+I0}̀7HvkK̳[GG҈Ć᭨FjJ7?W$\ِ!Kn 0Rbh%fB R! k Gc'G펾 ,E[(svmd+t)RF&M&CpvHie5F寪C6/FຖM]@Ѩ7^|m##]>b{:uj˅0 peC Ot%p31~]`uU! #7LGZ8wQ}_&?IzPzJ0E(6i5ްGI~wH|8y HogSW7 QTsx]uҽiJ`]z2͖%y@• W u^J-? xGm7 !&?Rj h…t=C=L/TD=3gnȢiӦٳh?ܵ{NK_G/՚ѾT;5`:D?~|"3 xeypP8؃b[d_f82y4~|~nX FˏD ЫW/`08m:}sFf ͚5~ZݢDXzJȔe"& W60h!S%*)sg 3n a%(G!X#e ?Z*c!wo>0!?}#ݑu2cUUOd˙؝sXt?lx V` F @+gɜᗎ#t2+W{ny%[Y䰜1q'Et 4&< _O@(b LI+F+ij@952th]_#k`eh%%|;~qc|F +#ѕϢ|%|;$ ?|A7Ie.kPv]oAÇ>dh޸$d:o~~VDiժԻwo1bD:+Ȧ QHS(0!S'L#j(l/Eu82g%ސ2u2dp*((`O|T |2hLFn^n pv~s )vuc S*8˝( iG' /S+BrZF#RMN sN}P11uh%~eiI~9 0ksxh/9scݲ~o:+^^E, ٩B nA~W `d_rRKv ~40ЇӔ?#[ vN6+I4>?䱨hݻה n`l1 ( \ZPgC-@͡"P0|>7 i$?R)PW)(+ ۰I4v/d#ѩv,Œ9Ycwg!peRs 3 W:gHE~&?Wn(,j&9Qz9n'WTU VeĂs#z`$iƍ!ad#JV #$?*fMh11WvvvϸsDDab (P`T7lOP/wH~N&Ǖ~|YCpʆ֊ JDWZޜ;ܛ,.RR5u$^P!a* [y6!h4ou7mJlцPu # :r*F6 +fW6TFw h09Œ!Fͅ~ /TtuŔI)k6xRKg$tO)4 /=Z4 '6.݂`:b2k20G33傶62yH+ZThl|C 1"/4(VHTw0~)%?*fKGeC=/Nm.l` Ȋ@߄^pf ;K gF f#/~t =e݀9lJo3yeI݋L!?CauXbJ7 "1I"6vjΠM`dQ i@)n4Ca`n7XFE.Џ ~@ ǽq5 Cg#e1)UؠG? =Ch1:f낹 Ci$^@(Č>Mݓ S0Ta4~2d%姧5*_C0HB ; OGe8Ju.2a C$\/RgE:T  v:."u~p~A`D. C;G i?!`PlNPmOG?Xf7X X~zhb6 CG [_NOQ-T`Ot"ܗ4'Nie(oAtIO!`03.StC?T?7V-] ta!`@l@Q2<.ok( {>˲!`$\87e"?x6:gf?u~ a$x~C:ȏk@E F@|?l(DB 6ᗎj G`ҥtuQYYYi!t7c@• OE"Bi?-hO=ã3~~!$?MKg>@1c4qĘJ*-!pe1:ME=T+0@ tWyH^{-۷zQ:6n(ÆΌ!lPBD0l#ڄߝ8/OHS*6~hf~rO߫ن@8iΜ9gΌ!l`'nu- t{ac,j1@K-';^F |wc _↟ N!~aKw sB <jD#b-!peCP4WN%Flx6~Aa9 ?a\@r7z?zW6<%ȈE@p;KCF|<0V~`C IݰQ$b$\ـ d#\G5p3~/Gj]@(FsRI$\ qjNݱ4zQFObC l}[E)YD@4=DzWp$Evk R^S[ `*@CvcuddeR6?׏23q#/2;hڽgoɟl4mxZ#dS4c>@\zϡcE[# /@Oڂtz=(^nYᏂ4l'G/ƏC'ԯԻ G эԷߩ4v1>\J˨"v IDAT;%}V?3y4L{2 Ǹ-) _nU,`HxD?Uc~voU~ɣYZ<*$dIM'?ԿAw|A+>ZKovr$<kӜG$!NOl;ǖ 17$E2~Ap`\}[vj1eSXOǟ0 1ߥ e399h諨|!+%E˗p&fVA%%%TSs U@g"oTU{&+ ]74\l sKb૘,쯴YYY"G|JK''~3&QAA96+ڸ. Kx ʤȯo!`=lr 9Clͩ( :Ts~-Oaa>9Z 6Kxh0QѯAڷ 2Z#j9}F@!;k@O@ cL݄[QÿH5L#F~LAo򎓥&z-їXg(+x',f]KHÆ —xSԱtiŵbi@•0hrc ǚK7~/,G6R>0&Z^ѿPZ?aG*B(G c%GEyHo~9bX}D#GIgv&D~c$b^W\qatc޼ytػ@•b6́(| 7AT)$VZlWLm9oBXLJuY{BZ{2vLդ}*ۏ9(Ms>'(0ܔ^}0 uT_;,y W6?>HZ6J ´s5~/R.QE99Wi^ :HKtɬpL N.bfga&[Jn|yBjLP$]SQG}Ce{ۂ%o~.;Uo%Mwhÿy.E ޢN˔4hd\F _]ϯJ: k_[';'sZ> 6 %D|/=s:ً/^?w*--纺:ڽ{'-XrsS +p۷/;U:̙C^{-GC~^CP8O$4xR>)vHlHٽBbH8B"(ϭg"J+4Z/?8m5D'fz&ݬݚ2wJ9YgwєgPC}#=sjX ߇/P}M f#l=ʲ>z hgQ^lz|*-9H5ī OMKʨtC5 ؇F}/v.IaZSl$\p׬VD,}@qY6s;oͣܡgk8|* Eoim|?ot+ran%ʽ.z톍t/&ǜ7o̝o10Z^z>7r Zn[Sok a=N7P]04A)Xr0FݏPF:)\Pžc?gxW+)gL岢p_z4sp:K#i z͔ϊc˻ azsw-Knmh^N klnÔ0†_<[_t`|#,p4R8E8|D9ǹgM%sQ9?(Ia3 ޕFQd// 6 *WP!DXfEE\E?xn4 ^ *(HpCp$^Ld&D&䨂LUWW]uu׫W5k,:ֽmEPWOMW4W/'π҂ .oMufNmV* YU3RJVfRKcGm:¶V#ڒJw+|r䍠 أ6Tp`:5r5 )긵y*3Ru,08: E5;ˠnD^-,!GF~vA~l:Ш}f MK䞠F۰ .BZ 9Z`Y#ONE~F 1!m΢נ-xJȚ&%\ i* Z gA$*wC Aei)Rn839Fx6E=Tc$#6(((fE]mH+<#xAk?HPݺ%mKC$mle?Ç2PR\jH:6wǂF޽jujYPvqW`2 X9Sah3sU+ą5ʊ]n& f3;g9tYh2&A{=OL3^ ]SYPbWS8] _k]iRG S \|d2 { [tR\]ΐVLJ;OOS/jEZdZ(N(DvzD2Z;[`:ao\a+R9B tFwpo(* ľt/گԻM{ʣpsew:*2t KΧ+Gl #8/U܉,47†êӹ9i)Xkؔ mEUۺ$Nطp>5U=vlpEҷ/)^^ (W*jD* J&8/Sۆ۶AЛH/ڇ=AZ>"vWUES'Rxlۖs K')jCy'F ltȫ!TM9?OUtF2-[sX;9U NX+ĎWdz x#A;i^?.ƫMN+uL+yG9:7ߚ PZ|o~]u$ @>όsRSѣG(*DcӧO#** %ỨR8kih-I~sl̯R\3Ǐ?:uM>GP{йQkmWU9 oΟR$'=/h05~?Arrr^BZK_yjN/Ư% y̫lq[%*'O{F–̌ qyuj[{jJaJ\pKK"~lJ/}%49raaa8r5=f}34"V /y' OiTՆIH$_~ރGN_A(ȿj;D/pv>O"gJLMSN m.Z*_(72㎍krZZ26Utܹfa॑<`:ՓLasb؆D+Tgx.x&] t+\xD\֩#myG†+_L& JXFt*$p:;mg<PB⧶ WTJp>|+|Ѿ}k //W<|(E8s< XɻڟoG@ *?fՎ| fqU #-K~l?99el"Z?!PC^1zG@8Ñ8}EU8te/T\:UDO^׍qj G(ڤJ3H*CvS\}.lpjלu,B>Gx/kOUr\gS|} 1Hx4WZy9Pv]7Ζ 6܌)#68gpuK#.^%c~gW$/v6[Ya(XkA-?Qu ^(Rݾ\KZbQߟex;b|9puAH Mƕڜ]\7eڡ:?!q!wv%m=0,C֓R8 O( sel<JT Q=ń^+>xM8$IkF$i~iKЅO!k?7Rke"<}!K @Rοfw臻@@jZ-z5aRYi".^ߧiHe5B1΂ibx䪜K,$Z:$įwHOkSжyWLzl,GXJv $:HEHa]Ep Ÿs,.S~9} B^[Px}ӊtE}~K!4Aϵ mVcZ~wNAl|G8cl?: ZXH<8/SƁݟD]I|=5 1~TBPSC H=1+). @1»(/gwn Zª(y| s]{R6)+ e]*[F‚VPDɯ$SڋۍOk?e劺ӳͥaJN6whyLF{,9c:aa)VL:BA~J@:1 Ъ@V#BIFt&X8O[:Sʮ(i憼KJYC!z skY $zNggF'%~->I•VrY'M{$;&X/nBAtuk=& ~`͍EW <HĈ{I7P`/0f9@<9oLL[{zyP 0M݄ .3r1ENEj|jx!kh"%~6\sׯ0W;6"0h iejzh)v%۩_ͺ=5 :}@wy6tvLɳX߀xN!AπUY9$XryKg/aĈv1edf0U/c"Rq; a(0pZɯbL,O^^.NO/ HfeI_gv4/jV'ND-"Ӹo8 98W:FS l=BJBw:Ś<9oh$>y]î/}ڵk1||Wmm;NtY B!kfjs69dzձb\qS9O^퇄+:c 88 ѱcG]bO?{bz7<\dBzM/..24## 8|Qi1堢c#,΃Z'KE,G ErȦZkqy?_G+\K58^uƠlS'`AC]ՐUaw;zj$''aC" %hDܹsť%<<i{G?ė zmh)oHve=uU6:5\Om ~Zb@%IeęO詽=2)|:3:Q3Ot +S'ZhH%YE|ii)RSSiN]?v.]MWjV/j *挀 } v]pF$YN{t6زMB.03漤.]Rh.%l{ Ȼ<:98~fu8ihʉI(6p7dׁV4"uR}4by+{@DDUA4*EEE|j9(d(D@" ^rE]mh q)N_.hp^egQxU}b -fo;՞k,;veRmU GiV#-6(&Eh׮.7=! g{SĉLC_R8j 6w &dQ.2JȤ/ڂ^-?:aKffOG6 -ܿTD6SZcq^Wʲo։yJe}W+[֩{DSC:O} KU3x N$l(_~6@Ui%%|,řc)k8(2ќWī> +;Ǒ뤃7]SW$K(w/rKf9IŋO!":xk|8F!lv#r}Hr6M3AZw &06QQFSysHٓqCr{;>\k$į9x;J?(?zP{CC:LHOO'6~F)dh _/}\\Ojκ7<=QVRCoIeȣ̩@sé~OۧAH?x$wbV[Y䲫Gzӛ VBFPY}k:T{U0',$~Fڏi<=IZ0q&7Fq'Ъik̥l, /R|G333 w897/i;] DhqrضJ Hи.wkp_H/!l'k6N6)GrQw ʯԉuAAb[A0\,ܫ"oSެTEq|N75Z^ySQM؟+3-@VU΅% lL?O;grZj{x"'7.k$Zy/MҾ#^8BnykIhIkgEѬ2 Tpp/#IHVr!errf";pEv)@9ٮGNEv"KH*8URQ[ ҥXn LsP_L--)VխibX9AR3 HDֹB_X#B>E:8-+ QE9gljprρp"|a.YVI t ]ۓJ؉Fƃ5g$įe~=jȏBˆp ᚁm;pˀ~11ߍMT2u6 8|Wc.y,S6pv6B \FQ!~jsV}Kq_3KXY5%*i[->'㕫X5}g&fb|DvIU$lkԠR DMo){&vUUz=蝊_aշ'kZں]?1|@ah`sKa%; }Σ][l8Ѯ~2/Ӭ+_ۏ?Ra+ ge0oWJ/5֟:6𗱒vmHga k†VX22pUo=-NkOAJa)ɸYsՎ؝fk$N0"9C^lkdN RIյħYƫ|-%>56^k鬅-qx*%_Kg-lOƣWi-Z:kaK|j5mJkY [ShUZKb"{d1,l8T XB Tv<7q$Nh\5 jHPK5DC08;4ً;T\T}'-wmju6}]pı\VrkyTu:7v#Xod%TI sH%: yŘɤڝm%a+S jkd7"2#q) *lgCVHK"6`A֠IBT[hMrm)g UMQkA4:[C-Z U Oq5X+7jVTXN>RkTʕ脚hO+.̋n~m"fB94&S);T4n#v68 󫆷FѪL3[ª`a7Q~߈ f5IJCJ'H0v6XUcQ)9TCD=zU$NY-3&˯"\45ƩJ~;rf@D$&݅ jܬc!89ktFg-^"` 'k֟䷭# V%%݅ 6n(̅퇻8P2TEEExw4zF9wX:}<^ݜ "h5v0}T3Kcco%@Qgc,M݊Pw'6{|L WyBFup3>(ԄR5u]ݯwӟjj_7+oUJaCddX" hX[ZUxD&Qx4'olsZ<&ϳٰʭ,g;o'I(/ƪ v꽁K'[yL> YP{֒ _ߚG0cH;QiUKeR s/ ֩}OOC)@gKR9|*fRQ +!45L]xjCGh*l៿ @ߏi, J٥tf&+omo_bzW9}YSlI7שْo([UJnVH˧bP-O+5f$@Rc撟0UiW" h;ԁ_y^{f㥾A(--'do}_5ey{6<<`<< iq0L.ZȘ~ @rj9*TÁtq+ ״3x("B "j821:eCb5ͯAS_Y=jJkrd/4]*liDZ< p@ti><q7D*YA*8T_ -tG)wk)*<͛wT炲2ģt2$c:2rAhpl[ ÎvЯQCpc[̘0 4uS xW&@o D ﯈$f>%ӰaͿIR $g!&|8F< &)eߪ3n/q=ahռ10Tg}?G\nF ; ԓo>Eǿs'UT%#VUANhaDi"`Q|UPGY z/Cĕ ̈́# 9 ~SCWYx{|܆RRMܓ xjpwC~1?)ʡ4 2J"M ΔޏpσldəшEطoG)O•5[qcLaH[Xq%gASZf(_|MS6>_?W!">=שHP˯L [dD9}64-D%m6CӠۯ `vIC>a_uFGWe0lpVd_gtUG?tdg)NFiVMX!(-_ ϔ >6|ܪ O=04jx#,X}Gb5AC`$9P20xHl3>H$Mk6ĦDKNg3bgޘ҇Fv] ]yfH '#Ks/:YP7JZ_~9 .w>1:"XA1`h?}>c݂WLn>i^}<>9{νa!u#^4IiLF#x+(qjc?Bԁj%*iMAI~z&Em Yǡ/Icvh㎊*-&W[xk+4OϹ 故Š8{Jtۋ\>.gˢhܽpHh~ WJ`8]Gqw`uY6N ٽD4I~B@>̧JaükD!`waC#3k݋G"KI)> >p ]'?}G١sE YJ}Ł=KD=Am4Е7\7Yv1Äi(ORa4J2aio Ʃa7qjX[ 8( /%@ai88(S$Z[߄ɏC;j6(U2z*4%-7B`x8XmgRB2XB#-y3|¿1u&Uԧf"$^W" ~(C-/atnFa!':fjN )l \D@"`Ug 8_Z:E'mZ6ɶpO[: Biw m>)/:HĠ'lO`F]ڽ"4?7 bL\L@6i(\1ئ^|w O>Fɪ\᜝ ;2#P;dH$V)~3͂Gdbdƣ3bϿ`z*v"-Ixx(~ln#⧽noJ<(2zO Z# SfS Xģ͋7RU_I2r݈i"; ]}XQN}iw.q,~vcPq#m(՗0D>a  mÒpESC;V"_fcVqS}m-aOmҨ|M%-צVT-ʧ4[*[Qt{/K.X7Ng:oN<] l E`lz>y\3_i=A1Pc)W>XB5?Wl,5[τ傦 >f( 99S4|0hJߚ>Kqvzu`ݮi"c /_K/$'O{Bs:ӵd'qjOV:XSSSI{0##޾BQw8qE񢳳Z5[⋧1yBG26 ~&X_:ct لϥsǑq&GoV]:]M72UϿL3hp5D;?hw}g5$Hf*7U8u d iVLL"ШP5]ˣ Zm6>5]ˣ Zm6>5]ˣ Zm6>5]ˣ Zm6>5]ˣ Zm6>5]ßh:Ҩ]j5)qISfCo*rJHFcz"+]j5,c-qKcfC{kHa1?[6]j5c+qMcNfC4T1!&ht4'c2vը_S4T <-D@"P?;UQQ .uf_ [\\,TVVڣ؆< 'JCdnUfuѺKRK$ rkxů_َ+~/Ow9Nh1zu,qy?]Ǐo6kBq{EhժU)hN{7++KyD9# QaXr% #tv5sk!X 7 _yɩNeXn}Q8[z^7?:z9DΖ prz|zx7C #I X68@}pWG A{v>_Z7=DX["z?b_-X"^3q!qR86 ôޭ]6Ƅ`b:g5%W"`!WW7XZI X@O.*))Tev؁Aa]ѺW˘gǿg`;mR9vzEpӔP{ k)ә _4=^|jyyY-9 rQn^gk*GVV9j]T߼x+?8@Gom7XK1"p49KO>39N:* *oA\>]⯇; K1v?Ga?OagС/U%3מUhᅻ^G'`+āiBhtU0Up v'cJ/TUL)-s~nO(K?M)&An)ɵjN85\6#ӷ? V O,~B vFcqӓ91{'{W}Vs3MO` }~uWr5SiYXKҲfC}ލ׿/|N++{HtYjwJۚ,X+)Hp`pvi=&5m7?ǟӻPz.GޟؚkSb䖡F݅ n#e;X7"vqCKKѾN癔%[QR[\ ^Kp}h| VAƙo$d}(7O͌\mz=I3fFjX4J]߻g%(ՙ(/Q067?toCp'|Q֍2.Ext3Ph!s~P,~]ꓗYB"^d `WaC?O(^Aq =ꪪx܎RW}ˋQP yj Wxxשn&9&\ӻ]z5aI8?GYf(f7>zg&%-Woܬе†%Xl4A=eV6νotfி_JG&4Tح~cƉm߶;[b#/?FqeUQT?\]))PvUw6=L6 'Ls畘Iqo~qLw_9oW|쒁+ӗx>TP^y㧽C%2q Ὑ  ǒWb~}Y#J͏&$#Et="^:nX}݆CgbeE.k Vbv5%a{ڃ|Q9^1d֛ذa%G$♱}p')kթq8S7DGL$kWca'%—w5R4l$x\S~TW 0Kzn W.c=,t\2nK=:3O{+$Y>?>J&cdH"2#H|:]m OF [5B["Fͧz7HTJTNl>ݯDzTOٜ^[RqA]l6xD=kdQ.񎞊Sߖ%D,6\TM5 } 1ww"!duwKb'۔p`{^hq FčqE(RAS|d;915HRDA!}#P~ #"0dqd4d$61:Xő԰J)x\qENz0rٙ7 !_8Z?NNaD釲N"  41eLϗՄZ i)QǕW %C O:ǒc-w~Ch5,ʸ&] q[rj|5/: GZ܊2TQ\Q2W.n3 5]{-@`Ŋe(q.D eZ%LֹrA֭(_amPw+Vz6o`j7#V9ř{V^.݇Z.qAV"ZH[O'WbO?t]rj[wz}>Hi"V JZ4bR!Z/Ky8 V*J+E6 Ί~ ,5O"nmPEc?h.oxseԩC[G0 Kukz mS᫙*^J.5le^Dxa1Bk(Fi½cĔUS~t]&`Bb-FX pIZAqP, yaɘ%p eQ{E~kF@R1wH9Ec!vcs0_<1` nBlt$.ǘ42k#>O5`W 1pRQ~z݋%X0=K7a\BQtTCD )Y8D{P|!QxCh'FFm)]s)"[:Ih#to'p.`&)?4gEۛ|0bq<ʈA*vuٸQ\d2J/%%7T\a9)+g Va#G ,,*aKƈA'68Z`Mn0B! VSt Y(hUEj=ܼj~oRH7`Z,t6Vд lJÀV#M&-#mq'"H$h†m5*pJ%&etJƙȣ>}:"E5 3H$6Z3wG.Rhi]W" \KQݩ'QH{Z¨wqSojilUy.SOܽC-d! U ߦ.lo2xmPp С\N.u3m9= e'#K/RaSV{gwa$l_-ieX" 4% 6 ONGg_aSvkF*h %cǘ:0!-G ݎM[ӑk RVA(cM[kc9jĴEh۽VsD\?՜_D@"d4 Sq-FDz^ ]b%KН!N^1|v _ѦYؚ psU鈚sVv-cמX1O+΃H}J<z7JÉ>f6l^jgt4 nĶb|;t f/ي^-hr)5IpmQtbo N_\m.J(&eNŠ5#Iu%(03ǯ9ȰD@" hJ4QM4"茰 0-j8&r!jQX\bRK2Σ4BiݮpYM4J_i\' ZskL6HR? Q/KHkqbmYɫVrj>n7w MT-=o z7xGp9MA^^5KJ'v#r%L??NnDjaIBϝiBzo2̖sPsGݎg!*)vlӖ,c%m44Jq Q˟_(w2q(8%'ITI"mu!G7-$x"Ŧ˒Jـ}h/x{ӴƜU'c:O)xwjB5M}M]OΔm_\G1N?3nJ3bAiSc_ǖ掗1gBq23nDrz0}m#cbK|Is'aOS [HtAxCgl]Ôi.7]Xf)Fһs0G_wE7mY>jS4 nLO٘JJtF#o3KO(g`S]BI &.,^s>LR뽋uUt$Sq)$ ROi UϪW*aG6J{H$6oĒKAI\ QweCapCpeژc) G3g s;@מv1Sr3h^~tlBCLEHm' 5Anʴv|XfžC6]t֋Ke+F=V#}Eb,Y ;%b6m>!>Eeٌ>hF#:,mڷi>:y ]ѓ1i X3\{o~.E'*Md48;hn=Gעɴk&Y6i[~>R5c_#/ a1H(( +@ØH+vGhOS7DTT+7+1:9c"CeJ[Y0b{Qd jv*0ˠCM&۞Kyo\1B:3~{1 ބ%@[w=prDff",4_^e6azb`3H6-]|ŗZefvTVeW*ըWqrumY;ч\gp}oa .h`M߂NsG[A0P+^^4v4nL1zxtEXH^yKmɽ^DB%kb13I,Vl1F߈q!C1m u;R' BƉ8/~ۖEt Zlb<71P^hx|SY2~:Bm9~} l% .݊a{b^$#|y$lX5=dʷcýp/ tT0? 2."58D!uBUA苋G2Eㆳh5Do@WK1CXݲ HHL&*(Kŵ$MyNo-NHFǸƸ;FPEoDY qGveѸ|+FJ[Ai+f.iDV;x{w&aI+pa bPr׭,h(˨t8"ך>Ch=@o{kqif\O6JIf25m{폦s/'m܌}z\ג8lo9Giu۰J|si=kFD@O?ѯprrjqu#Ux3.1<ʋST}lk iQš$j7jȹzʥ7.:n` 73X5E/s)Bش9 [.鱥W6݁VIW/?<O>ZO,m RmK/̵3co@hwS M5s%8U.y{Z)t#)ilglFČ8Y q h[|91xB=ԕ (I!`>2w'm\L׋`cZU :39jH~΋4{Oߥ )h^P IDAT^A1Fy_0fߍ_j^u cv:" sT QՒF 'H|C,e&-Rq^L |ݺuǮ5j"kVi>>_o?̘1æz 4cH[;(-WEǰ2eJSN#I_ʥdž_-^WmS4fޑ[/<ԥ/ ==6Z u !@!.Vṯjko%9/O[Ax1'~ fcӻQB6 d{H< ӑ}n,ht*Mܜp/}ݼv gCQlǺ-)TJ&ZوK)cGU!ch&(2nE+Xz<"2ū -=)[ЪYJ zʛBFiZz]G ?OB1lTVb8]6֬-u]Z#/"4ԜO.>u)/-TiE0qQԁ&Q."\]bxrLʣpEakvxaܩaYD1х=Ci'Rꏕ1=b ѬfAƌF;5}gEymEKS&cLDzKS?ĈIbdbM#o7e+L#ڣ_/C1ah(Rv$ËgW@"Fuiʒ f=wRh)ATd̎@eV,iȭP6 cIgSȹA#0$X Ř~Fdc*MC AaOɭNƢ1dbti3eqF Tš@$g텹 D_8:jj ~jm e>"ux|9IK6a8p'  ..@otDDUAV&Q}ѶKhu5-QyGh{Hnfx;@aEd!|ev-ą|*w:?%7_kUZ:E^ !GLG{MxHVӋ PNyP̠2biEv L鹜Aޕ2҆y my0iE+>@ǜ olڬ,B-TTJmuBU},gf}P'> > !fMtTmY[h5 uΝ@ Zs$_ι9{\\W4Ӆ vP=zԺK+qz&9.-ܟ÷3i,.{A_/%3GQo(--nϤ_1tًӧOs8ܳ^fh6ҙ_ħ'Ao@,`J;|FMW7@ BBC0/rWhF@(S&J~WXm8ǹNy}5#E gZӎp|qd!2p `κ&b;oСC; g B- -=Ņȱ뮧S?*SyB٘ 5Q'քtݻǿx aјLo3IV6:qN=o̼hb e\L^EhKۅALTʹp1xC_:5daZc" 0 ޻seאOyA3EZG= LvN7twYÇA.ZƝ !Kir4w>|BF`71C;gq ?Y`=s3gW~]I<2\ !_C&J'OĻヒKb^K8SB/Cq_Gt)s g?F!\H~ک d?BJlvK##Zr7=du?I?>A %O=⑸*0g!ݻ:Yfy+2E>Z (Vӗl]{xlƈXV$~-c%'W&̍ż͘5RX R@>sœX f^%)/Ne,䳛ӧlM;;R7TQuvݢ퉁²ubs\*ɜ+AJ:)>GWF\tQd|1d[|CKg>QɉFr)=xFY5&h֏-U{[0=[ikŇXAҲ QI|Qd쥳z$}?t¼3&q yvab罟ϘG?]6evUh( Zv) kـB^{ϊUh+L_nwQHߎGZC1LxHq7B-"LnR>~͒>n.mܔt N++> g_6R6SqvK^K+s7 ޟC )|ܩ kH-ܧ-jTSLT_S& VfŎ!N? `XsƝ4""#}g["N> lC3^m,\rFt[Զ4tÓbdȗD0tVi˰E5(Әk1 )rWb/߀:}:z^mfԢ(+Pm IFwlvCJfi("&2E#MҎ |*٪GѽWHz^=UZUQ1̤ihXQjYc[|~ȃa#%V|H`i&ڬ[iP:)n%i.lصUAiks7$T,53Em{. "IJXYՃD&z#)0šQ~al; 4mMuY؏&ʒ{vL+3IQ~D#"Q.Bn6Dwf>*hd_,w|[R4Xѕ ENov-3*OܣjvqIgdH4 'LܺBR4Iu}bZn%SZ׌K<6aW1#1ɽGe|^&RRT'f”\ ߕ V7nI6HxbH3[P]<(\xΜpfF?PN3oڔ6bܞybHBJ `yx<@m23 peN4δ;/dϳd8y_ڤ1=mآS`݇)}"l{J%U!d\hP?Zz=H~&E۞*)s":aMR~ 2Q䢸xmjhfDZ$JS$07DWymܷPZߠ}jH4?C(ldXaJa|)ZrNX ^"m=&hFaK) wi9GK lN)3N߂\[_w77R'v2ԩi/rwl@YKBVjfX(˒Xk~":xН=kG.ī (#.Lߠ941?̈])%鯼 Sa_*d$W W1ׂ“p܈?+DYM9 4/"?UZ)SaM>t!-I<8y/-D£+uT`qтB|HkQ~cBɻP Y!E*ioP3<5O+Dv CI'KoC?Jp'P6Θd2hjRi7F-XkiG T-Ud.291-D 2dx*߱D W8"=!\cJ>08M#}Ԗ# O[æ5f-EP`ӌeL{u:ul2PjjZh}#9N1s rDp;C rYAPd zG `yl9F+" }6;93 +_Pl!ylLFL%ְ|ese413$,9!2Ͷ(GvKg@oc('7יЮG_aڕ]OoQMn̪D3"1mf]So w~Yˈ'?g t   B8 A@A@K2PT~tT C-;C L-ǁ RݭYLx(N>(ڭGka:mt`Z^u"yckWA@6a7UZoPwc.rOL(kCWwօqqy"lhSo O fd ## ) Ж6_5o%N{DEʆ?Xk1qr[,zD=dJ>VU.?6k& Ř.>E.:`'_,1~T2-Ag&weUWSOk QuHh29Zbx]t_<9 lbM}0ײ7N߬1_Oy6뱐ڍj|p.MQ@ ٙvx4g[]RA(O7ڪnУ:%;6^c r!"* aԶIN6_EEE x nfL:ëL}Wfߊ uWdz}^ĉ l&u"b3r[4zrUrsSZGqQREv-wJzug`fħnӀb[a!R>f$qyU5Y &mبp˲qǯKAlS  ءl) 3ϏثNݨ(Klw(G\Zw⽿EplB"JI~X{x[Bt`U'#$=ʾjhد֟D7 UxǷU,(N⸦ZbANa vm*軽 @yf5X`GLȤڏX 6h~Ż8A@MѫMoI_n_l9rlLAPա5 ч:y4Yh$@X<-8I$R=Fm<)_Yd!_nW] 96Q9kС nj5c{F4N|@S8 -.܎eiZ.sĭ+$EIȤNVQSwcEf V5#V=ը˰l+2ؽ)X|  4)V~^ʼnWe{-%P$]$Ixg4yH<Aa x߶RqMX4>2W4q0>mRHU_[n 0U|v{Ԡ}2]aL5uKo9)mlB}>?-jmdv} E.:n(-~8}" X!uZQ xAV$&iq/EvKɖ ;za l&0MFnm3')ǟoizܕ/M$C ߡMΜz (.^5,Y_HS@ IDAT iyX!85$6ša ߚLk?'?xMۄ^ki]٠Hb!Q"iѻ5q?=%/"I,<|ӫ襶.z} ZT2`?S4S\ IZK0ކ͈Dy8:_,V anCbwG+EA@-i7JS2;rZ+f2$&m`;G~=}1t4|F4Hs : MXyPBNh3lꤝ43B"w^$+͎-&:[9)Cdx*Ζ#Ln V کd]7"t"vzWߏZR%7cY$ʼnWicvդ"Ⱥqm]Ȋ#S eY){@ ^)WK\g3"/w*dVdF%d@;ŗi !=}r!fߎf)$S%k72BjNޅB/\92BOl*dơ,&ZձLJa~iNaZ(IiG8y6rjfNISXťHfAmeVkzN"11oCV)Hn1|R\A<{b8j #Udm.Lc~Ȩ}$~ieyS^T/~ɴ;'ɽ4hh< l$pgY\.ޱl2x:/%cH谢ҏ,JjPp\zsD#V 5/Zűt 5QعшB2|cez-8'-\/F-mc W8c62f_QB 9G  z71MD㳺 Z=ȇ-TE! I _(ǸUS=OYDf,4[A@fӴfc{uW7xݫ Ɗ  gH`l!x8n=D$A@A`6e5`U  |Mk/A@f jfA/(lިOItD{lܱ[{ó!6kohԄ ѢVMvR)(,jdgRvXȔ al03M((9F`Zg6j䪊PT4Qy[ɻ7"..o5޽@qԗ|_2N:1#lh(;Rr |loa*w2d@uVMqF9j< }09:מQ $^] \T5̹ Rma2C"bf+11c @ ,/mvշ3)%T:e8Q' G   iT6lo E¾[)1Dυ$d3"H=B{I_{=M Ue؄NfZd'zJG eʆ+e]7z5eLFS{!:7Ƿw\Y44 LA,͛;h-T T];r|٩<5jCA@4QZn` 3q3'Î"hVXU]z]N3 to9u[#NFT6 ^Bsg/n֫\TЛ%#l yLf wXgnW(g7h1VQk8ⶏiw7*)n4:ox5T ]M[a>AJ6ܯu=^?vhHf"D[2Uts[bL7at6gQ-~<CA@I>e~5־O.S!7Wft{ jS,l)z=jdj k3j!O&BW&*Ϋ0DRa׷BC|h%%_NY|zy7!!MYiш:f%![kHzi3 0]F<.ϔ-j.)j ܚJSnnF|*=7E#=ƚ9OrEanA\ rsה2љ<#H%A@LpDY?tUh u8R-}a>~՟T%:kɈ8ߣدVQLKk.hIBD`&ȉ~dAS ?*F"LPd& 3~QE [(4 _ULJbӸSog9&c (o=+n ~LGK;Fݚԫ,Z,ʒVRg^Z2ѬH|~ȃa q"ݢRйMpE{.O"KH`tUHZT~̤Dr$lj #0mʆ} Wbɺ\d$JF~_y*EU}xrU$ +2A:E)%Er1QY}}VL!^in('|QX&kOk5a=(i$ PFYrJy`-dg+)!_p2 pZ:gyiaR-ЂP>L[0qy!C݀mzˊp~4ڹ$ZB“!dtG ){nʚ Ȱ"vz.UĆ\2Gը2`,S(]t)*͊"OE*)S<#.^|  L)l-Kj”ͨQ$v )"ixQΟU_,2[sbThy6% +bk良39+Q 'CuJQru{E9 IVNrRFtdeCΏ0S?а t7GπqVm ~t? ᕗw!ls3qEA @ ,Qɪ>hy `h!M/YJu05(1U2UmFhU4UAvy۟؍ޭ- ʓWȱt-@oYw狼T92oi%L7PZ虂%7@.碸xf5~Mk#3%}jbͨkӛg@4rqblM>zv0Y뭰rMT ^ľPwJ ʆRbʞvB31RCq im86 B|  LS(3"-[Mڑ#5:a2V @ÙDol=YyW4GHmhDG[6vN6hb]H/j }Ȫ%!3bS=@:TfZ.+:ЪlB[Ci w54Nc ^򩇥)(Ҷc·9 lxp_bݩ2G:E.uE:թ~ja5a($=Jq>b²nyvlsyAeiws#:{1kmhkn]_KBZBsOLb'va6uN-Mt}7^E!hתnSU]:gDEA@8Qipp;O<:gG}l>{h6 g[SwZkugRESY_fZՖg:<&g%1\^ᬬ8IEk X*^)8jRvw#ɩg<35{Dz7Urwkp*9ΚaNF~/KS#=/w9gΡ\bQI2u)G]m>nleSSSoQg}rTNč0g4f8E^M 770_ݠb8:u lòe38XZ)`)"fks/_ SF.=L $Y`z{pLȱ;pގAE.`*fӹ(ejpAd_]ͼՂ%,"Σ\δ[+||B Ɵ#(ÊK?9!ϤjP0'#==pI\1xu=W'z$78pv * ӯlL !q^5iZj @ ƴ٘0xv+"=>A@A`pϰ#VCq1DA@ U6E^+وA@ ?-쥅a1 9lVs u+]>&8^ Z809uw/s G+9`JKM¬S{la+-|\cu,ET{ӂK?ZXVGAfȳqa_¢]q& 0L SEEuEZeQQs@{^.6ndknweoW킚i:ee@/6;1D^,{aR~}r: e,UUWXz霾)P-4T,P ٕx\؉+Y!y?$Z;(n+}^|Ӆ,T0Αʐ PWU\  L3iT6zN%G(Gvvݖ/0j +u0G<ɷݓ`I3< ۱}k*7#\.͕jK'-O-F#yyU4ҭ%.Yg_8UUԺPSܿ#Zn+ì]Rfjwg l![HϠOj*28b%ovޓB~;]6 -7A@!0mʆ<ڕ;^Ve  h$wG,y/{5loK @JW2׮`cvUzmw^g:v̀zp"xf[)} qʯu4*,t-tRf*tc2w^P^0F@-'+3o |+?@X\$O}ZEGժ רËj1:6M=mǂ _ iS6>LWРFQQu`UY3]7F^{ Jv "|3@aIв[?f'kW_EEma6TȤWEгt퉷14g_ G]{q)1~+-FjHC>+*he-R3xܗzC$ֲbD:?7.0;}B=ys DW5y 4!![4hDR 5"[Hz=kJp9O /Ay}< $%dj-;4lؒ}/'/uPuW`>MFL`AA`M85޴Ҭ4O>ُ-PCkh'joBIƿ^ e@Q\v%KFW+^CaٰJO&+vڎxlA(GUoT!7U zPӚ 6XZ2r)(}QIU1R䲳ߞCA@I`HbK`vn_O |K __ǭia"魶t f`k xgބ7qtCPF(}vdzctШi] JϟH%A~b"35#. 6ecS6W`3م/w*t: 5q1,-gNHIO֝u+ c?M+nCI4AC$7rʀUˈMdb3XW[4v ]BW) 7#=|D A@LƐk}㽷sE5*|o>55c[𨹻A4j5o}P>L8:eTN߸N[*GN=uOVi[f=j q;`z&3) +Ubi*;sPX] zuY^HM 4/ ։(JR1=_<-\d@$;n_#Pj,_pd~Y eA<8 _r?=ūw7kMVx4Zj oشG ,ԐT=zdyee(ke ߺKrm cR <@mh/MA QBҖ RPAN7~fvbGfUDiݾ\ZY!2MF8"3Z;ݩM etJل2ؖi}wO?c b{H% 0_w_hNM&+pYjxyEA̡!>g;kLڀIj6Uv|NZ`U5R^epzt9Lʛ4K-J^VYipɶ:_J oX?v2 HIA@:u !!!eOe#<=^YqOA@f1f/C0T6 .L[IA@_>snB袋|S`8qpFq  ' ::}OeK̆Xᗝ! ZlB/D*ai+}D2}A@A@EcѢE3g΄=lr8@!4H  0>ps"**܋ sD(}A@A`p|3I =W`,X=zqH  0; uOP`8/2̝;7f'bkA@A`v`;O>CaNJV0fmu%G\A@Ƭ,W\1iE4`eÍ+lBȑA@q|f6ak8d(z7ie S)VnJ^GU$  OBeAl晤)) Y懣He `QcYz˼$ 0a@=Cl2kzpG`ʔ)t҅^ح F1{?L˖-GhF;}Ν;."={%yTEذc \SS?g}g:ldg $ީ'uɮc9P8ʯŃtvvlZ0c;3&Nh_!C"/rڹs'yQ^{W\!݈5@H@0is˖Ђ O[o K,YfuHMـ֯_/_k3fBz 3chHV0h@P:7W(.FKS5kΝ5t]%裏RUUU ֬YC/}bQ0^lhO%Tڙ@0&I_t1$o|я~\T ;q P)K~[OO?t]CIɎI@04:"7^¶4hTʣa߰zӜ9s}@DS6"F40GC'_…hC^m FD4 <3*~/_Ns.7%IiFJdW8m@@?iW@~rrr]@e~8_ L3KGU_ o8 +'­d` C~p⡇J<ACKgLee#֝P+|o|g⌟;Y7P @.VNM>}:޲XyzED8 bLFaL)m`lCWLc`d*gƌ{9{E8~$:MWi^3OABAݩL0 C!KN #姸vF&AxQli5v{GHExґ?}8]hhh|rQ<KbfxNt0YZ;LKQ{'/cU&pرPh(|Oa@!#~ic_bOl;AW6;?FAD巍Hp4&΄ʯI ? tiC!?[LeNۆX=ޥhd)[]xQȃ;DZP/7 [o~{ :0o.^i\`liit;ym[r(;x>/%m+YXnQ+++yӯTRRI'=#GǙTZ2R/VgΠ=³z&*馟ұG'|ͯxs:_cz|~(o' ~}o}Q0*ȴm54| /!>(_7[_AaHz+]ߤԭ:Ku2mv$TXTLEEt`gCZ덓%,_EQx/;RݼVX{ j843e8;HEр9řgq&S!JCom:pƍ,>#=zLK$_?o8o. M@APq( a9Z*d*eS~/[>m۶(I]{JK6鮮Tj;vl!Qg- {'6]wutQGŔ4چ@Εۈp &MqUҰ̞}xueT^^.[g}233cs瓯;O~d-҄i'OT+XJm?f!1K/ֲQ1fuHKv:+q4z]4_p;&t)| E7Ǿ!`p+~Gd ekh14ɅDcP k fИ)~*?/6تG NyѸ (/̻> Zz5^JY][oE//5fΜI _&mHpB̚n:ɻd8* myeW\02 6?г-~N51e=``C$k<Kh˷~D :S*◈#`~P׶nHkY"smTZvX;}glx(7t[#jNCWxӾwonn&a ),b~97d|y`>s=Rꪫɮ$ڲe x&L'ogG9c0%| `Wo"LC?a ?[7\Doʆ)jj#xɮ0㊱֯_"ˏ[Yil{hxZT|-[Ϧo|_P6pVî]$t҅_!hCbV^ye>}2-b8CiDV6 t81p'4UpI9Б啺xrMKˏ6Uc,ݬY{H'Pt0BdClH?W!|S6:UK*'jr!tp\F8XLg\wO߶vFlr_GrW\Ok&PdMT@_ OԇPX8aC<; <{K,Jc ɓN'yIULЙ /ak{1-&O~)Jlf0nefd/^G/<+I`%au 3Q`SkhM84BZh_•? |C>lt/6*vp-](6\ F_@Bl P£ŋL{+w)9eϿx*j:5NH s3da+8ĸtJYO]?_=GH[~|'3(x/ ^9 )~"(7e#P~68W;kxJC%9s-}ʕQU56<4 ]&/c~-N.***dGQ6?V~Jab_7ITF?^v-G l/Y|\d%c?^j#X5,Wn=kbi\׬Y#e Gbp L*wWȒ-7wGJ,F#\E{9R=`wLjwhGIEt<+NXɂ4#-}8Q'"~(_n(\4T,AQl{_wZ|堂^xY87Kj4 py oiiyZ7n(J3_|-~7x '+„;v~v#2YL.P9G{?=JKat_CN2rPg $vÆ 1]AM^{o#tȞ'0MYh*-_1ryyt2et!׿; o>[jqd(x72(a_~ שSsoQ K*xC)>??ȏηxKg;eT 3%>_#5==?jJ˻a[,}ɿ_ qP636yud.m6Vc8ߥ^1;9AxW^ ohM>l'hK ޿76?e=K\W?>jb,]P&+JQG#V&|\n'xdSio ukR:k钀ISJ%dff|DJO (wFzu'KİOX^~Z~㞴&GɦK.>2>Ǐ{ hW~ϫP'vLM€d]eT-U w֚ P6B-GX+Qm ?gz%B`tΩtWSj3C9Iv1O[&$E<'Gwޖx‰rRcMzxRӟno};2hyaI 'DN0yxKwX1K0</* ?A<1YHn.g*NwDwBz{R5ux"H]A~Dgh%??UoGFWx;i+kw8Lޯ+1 5 [ "ǃ㫲:E1pDTzHJCaƝ2{ժ4/l'lɅ`xM }n6oBUU>`Yٳh`.4y#LlG8f޻lN햯|5Ñ3xai&Vxާ:Hf+`g@&3hܹ-8+.la~1]ǻ{2r`gO?DFk@?b֖JVBYΛy~xBg,QC58.P e,\3XSlZٷ+\ B ŷ(AHg2Yg: >qº;H_N0!5JҀr~KI'$a$/L{=ib ˏ`(n|!Évn9==&O-`Bh/8 )@ `3V~%;rO$^9<0T~@VzSZYoje|9ٰG*P40Isر|zb!s>L| ̦ʏkog%fϞIR>? PC= Ƨ>pvzëj/ܼW&36nڇNQey=JYinӪV~֏8vD`?Õx*(a|S6܊TroLmoHMMcc=#I k2_E˖}f_w-it1.?';8MnLqGփ&a-)|6E y< zݷyyJK ˗>3y_៞ }O ?C۷ p(HsfK-4isX>wcWy@V^fk9^ \+ sPg14*4Zc {Y6L*+~)??~9 ~h8uܘ -(0c|r EV.ryOLJGa ]|\v)|p%r 3Iqql:va'P,:EaqT IDATD[y ' <1s=O&Fe}F3}6 <:7sïνY߳QK/J26**JQݴ?mcze􊊊XY lA Vgk\ vai..*VD_01X|j9xđ|T6"tZ^q 0~Z0p^[f} +>కpU4B/^ȇٽ4-ZDȋ}~}}=!`I/kr^t:'Z~;pH^v at,(S~e@c*Gc>ߔ)7yOgslFF t466 uʲ0}B$^0,喛u6MWq(ڴo4jլdK__wm ?Et 7#02WnRB,a]8a.*ʆG^~о|]bFQ$@**ƳEoZy4zÈӖQ4ԬG@F0~az"k>>Sj< XL:G~jjjdkII *XajkkXQY(g)NNB?l~ӧ䥯3%Sp ,8;Ǻğ_;l->nD[oU*xVw55KfXI)z3ԇhS]4r ^~ \<^%Q~F"0@(_3! 7eÖ#hb ĕPaN92~tǽj?ϦIJp/~INMpt'Oxi]]^1c&?B wnD:x!I&vGO94w ϙs<r>z9_}lY8?0ru7ѳ=Ms^kqT4aEVCC~Eii]\Pyy,@BX:r,2\!* %ܩ+"p<+yTx!TOٰ&*8qr<9x45k}LZ8cW*OB;w/< #/"'dhqEZxfNah֬^ V:x"[%^"9vSLS-[.0Jȑ#ygܛ%X6ț$l,fD"be S~_u .ˠ/78?P!C#?Nj{{-[B"P$ZFX")M@l:@2 mmmj z( ]8/?:2R)cxA_f3p}]tܸ&&kԨqn'eZ~7_k@>ߛ}yCa8LPѥK}1B$* G'e.W~đfXߔ ;k9Mpo8 /,1X-<iSSLJ`kh^Ksǰ<O_42'/fDeP`mĜ]5ldŞ{4Ys1g7J+~'?X冹֢)c~|S6L6/82Vv_pf;pi BN=s)u U#_+22]PmOB9YMۭ#0|gŊ4w ҝoʆ'(?`z1]~) 'i$2u gx 7W~/ QQ S!}s};ߡ{|F6V (j![3 YPֺ0aZv%|M#)݊c+GxHhÅcܤIv M; ƅ+N&SN;5|w>0ǎT,%\R~X3dp!/p@Yp^kni}^-Nc@ܬ 7eCpXa^m ý /.ċ{CÕHHy+`{yŗ'sCNA nŭnD+@ڼ8E+~"?7M?w>}}~MČf;8 w'o $,,`)_ʏtC7{.2> a8a:DCYYl{u#Lcc<֏v NQP0N.\O>c!ʒf|JڸiX4hU]AMpB0g$K'6|w(v&#Ł{V~3pXWĉpx{|^}D$8Xuɠ; x!MCEw@pM K3ġW`XW/ǾovG;ú6ٙCN!@!CKX W_ mX| ,lB007(~:iʏuGm2I8Fh;SCG`T[[+{jhU^ !C+뿋A(}=zLjYO(}+~I~\54K.%;U"Dg#O}odK-|2 WX;y#/hrA_AoS60%{esl\ -$ ($A4HN?FɏTvw5܈"Jvu(v0~Ӷx!b*Koyeax>qjjjO>D,SNu늈 lp!P`X/l; h]*ofW~/a@]7V\I7mѣ+(3#N~t#E@rsrPwr_YY 2)FyIeQ08 pY6Ԉt,#6h_Oh uuu2t2lsT! I? R~W_ePvW6$ӪUh7eZ'p7:H06=xEēz!U'nʍd.b$65J\bWSm}v_)!(3­!Tp7@(~)?n?X6 )##ݩ |Aa {{\ἴƇƅ>F1x+8{+xx &44OKMsFPMMM|)t28P@QysL\X1N]jvX)77@ I9l ky|lrٳ(#P:uBn/,Ω)~q/?x P6#bff=֌)@\! }pRGk*=(+ZmD1`?#+ )? HtoUzD*=oX> &\JgYhT gg˫_ɏ\E"_.@IZP?ҁ.4ac0by172XGeh,k P.ap_O&#CIMMah(}@ #?$ʽ$7A>R@RP!ޔeʯ%G-0zFQec4BۘS6҈uBz8 c0h!ۡlRXS~l=+U?a&`[OQ6ߔ DP.b^Z3&)c< l$8(}D2Ο%bF 6^mF D)\ {kHt• >ĺLC)Gge'O݀ju^ +~,$?"E=~E@z65yYECm zJ◈6UOT#W=ͲE**(gij'BED7+Z5}ji ~)Y6X&2p, uoo-G3RZ^PႀoMÁ4+Lt.ږcW~A@K@qd_/" 3|T6ˆujXF03 r7?<+*qSE`"0 Z~kgd8ƤۨW~/g62mE@P|lXE;_FnPB5;gZ" /l| Yk{NXkx-+~ ,?ëm*""a a3bW:9:yU~BKlqkzE@FlH') @sXwӹ0 ?#!'է(pC7e# 4͛Ph8K_-U>=~@PJWO&OPᄀD<>Wϗ7[Puh_K4 VE@^l0@5 4~s#JnU~ϊD"ʏzUE` e(W%|ׄ{t$n{Y_KTjNPa ( ^gMfB7 y` WRh-E@NfPm:A&r/"\ -Z+~VTE~SyUE -tk܀g6\:WCſN|j-*'2eʍp+7:d͈zE@~gٰ9c$ y屢&@ N+"R(~C?WK0+"0LղѫӣX s#C/'XNP Jx6r5 Ht w6p<=NoS]~v3SE :Y6 N8-8(F^WQ(5S~0+A))"0\UH cK놣(◐3\ͷ"(@a2Xb;rNjp|:B8QF콥hWD~D6B= L۷o(5ZH rssiĈr؞*ʆSB9D JX 'CI e僇Up)QĔo]P(o蟏>DW DOPt:9tŗyGllxOlLdU;x@ʡF +3q)?lW'x.J#|J!^YFI>!@{s'on /K/nmЃѤI|˳oʆDP<}_]'t aBZ1K !2&164ɺ^B駍/Ei)!z(@2RHO/worSo^:ݤ w (xKWK|?W.z+?T1v4MXISʪ 5j$e 3` (e**@ ˢoODq*_-VapP;+TFWwP-?))T5~ SB)iVSJjJT߰V,D5;w'|0GC'hSHNIWIO^nvkcg#ot1JLagKr 2yܙ98ZZ!@>@kpSPBX%~ǗWަ Ʊ}H<6O0tNPx,ȑ%")R"g%.bAױKz\G (S6p|n ,E%yo\GLaa!A{7T鈏תPߔ X$B!~'Pf;2cj__'#3R։ i=N~Kt`(7܌p&,-m-o {= FC<@(((pJ Ő=nJF{Ƈq?vgB  Γ>c{U^4iE7eNʃ܉򐄥u@EʰaD?%S~OTNIcd,]'[8[ ?+2GWB+V,ȄPJ3tY뭟6qoR)̻ZOs萯4k a\$W۔`Q*CإaUa% ;ϕIss+ጏZ.sb'ӝ^Jqɟ7.__4vll{ƚ5khڵ![ewo*,-DSxP"#)iv. +\pWz/?M|xDd1T?\P4[BtTkT% Z[2M#]uM/ +"ѽ~ೡ%*GuERF1:+_IӘ'Qݦ¹3/o//Cި][sFZ?XriA%l4w״јiK IDAT8m3VElU$te3s|6Zotc)نi5T dҁ ;l3K{()m4Z\5uvtѳ?\F3 ,yut9^Q-|.I鹴(3?^jY%NG}w~6Z^-լiITqP>M?פq5 D҄+^Gg\e_ ko|NU϶m\y7oƵo{gN#7cKI뎢͛]~ͼЧ=P2^~ezW*})5xe-xp 8.inX&kc8wtJIJ:'SZ*Ju4R:GWP6s?9\[I;kof-mXJ:9q(/H#&d?^.K{߮-D.e|!fUFP c2hFі n弿M2Q޽}L;DҽEy;4j\y=}M뉥^z@﵁ 0C=FƏX7WPY@,,.QkK_My8@-<|̶|lpz `ʟSu-`հC#(gGkx*CgmId\QU@ K,/C`X#p4}4se4 DY:xG~&[ vONawH!'%rhDce (53Y ࣲ="X0lVgw#X^:po8o iW.ں>^ ri?Us-ZeMg!`΃˼n4Ri?XdW|8pᏹax1`u-4":&%{! s3DD+3%hC{]k)cvI0l5i9(pXYx۟Qިt3SuX!0E ޤ>߹:PaEu UOJP=c`~(&Pb85^Ln<d8zUt eY< u8K[AWW|"+Yx߮rm롼%SN(y5s;bu˜D=/qM+運U)w"pX]t FoUɰ\-K]aɓ\Jga:Q9a75)+]hc\K?ɷ(_O^V!џ=@k Dk+OYM q ;/ 6ܹss.\[I26Ֆܽ_hHG;:HL\: qD1Ryr_*)%QZI P펳u4-^>[ぜWPG?wzz 5쳁8LY :) _2_XW4VA@FH:|׮oGl鐽4P0j!qY<$ (e,:S=/|-` q5vnԀ8 +!/(Ix Xz]e򨟨~k =tbZbUVV K,YfuR c^+q@6NϮzz#iҔ$JINc fV''Scc-YÛ-{ZZך}r8ɔthv a>!S]!:6LRGOb$P йbpNxK{xG$sNa^?xhe)t#\`(]  xͼZahe {M7l4owu}f ϣ\?t6m^럗֍LJ-CrnV6vqK 5{CI`<&H"JMʠ]wm^D.,aڏ7ƸTfͤ^C?uooōl54Vɰ~( PFpo1ZRa6pʯYΝ(Ε9ȓMܞ?C]vj)M: T3#+8Λ;fSr JOCyM;C WҶeYXs&jc.(u1l?<2ӷ2E5N<~2NPM{)Z87e*oVӈK^qgi Up+~SJ-sz;Xsy_TZz+JFrK,ʯ=F~ַ,vwF^:j;l51qwWu5ƌ*HP>rrߐƆ#6L坁["iZEbोV0B`72,#L]L?C|ˏofմ}AivqWo̤g_҂d3.1oQ`?FhytHih]Wi4CdaDYyqʯ%tba}Kk܁$'7ӘoQ̲kͷp1<*Ϫqgu;(72c壄ެy06D|S6Dg0 `c*'VEoĔRC1,+h򃺡nX#LtrTTrxeIJjcIm+s /9XVA U}R4lp☊qr-i7UmQz6 {`F?M\ŏ!0fx 0 Sz3b88)~q/?fR }dfΥT*.= /oMPmɒwEJdi/ef͖zL_$4T.gʠ+fֶV0@;hplhXZ~8)~&?MR_Fz7%c>vN7p+]滙7 EG6^{TQfJM> 8}9Ʌu6c%YzQ#?/L&V@V*,8b](,,۵D\C ;6x8KNĒ;6c)##-Q_Akx SJ(?e Exg$:t!D#J 'dc*ko>m'0zi $-+aCZHi F`4mTn0G]@֎?xZj)j@sp߱|ثX8|6 7X)~x FV/SO=I#w,WCʬ<$a;kE$_p4,gML0b*Y,枾h8ɸqx}✙ϞI]|y /5|vT'~ B NJ3pf`ICŋCmten=w=Z>}/knJM[9ED}kx/!#GfKK[KYLC9!S62FS= +cʨn$,JN{kid(W ((UUUtC-[H G--i`9~sg0 6NDVh;rś:| oxӵ^KF9U{^!NB#xܟ*y1p_aE$KM G^$aO)RپwU|tλ^Դ'mhEwgRŗqc'Q^~RC{r6bo&ݩq ę0۫Ā7fKk39k-N3/Lxӊv9r |~y%z[ 6o30A>6N$ r6_%zx)FJL^;Ny Sp/ip /8DQl .G;, uD-zZ6m:C4i$pM@-ZVZ}"0Ld / E#KKNNo}[tӍ7H> ߸"2)rͣ">.q| 7y?bNIho/[ދp8M4atw69.O-`iM%d>N1믗yǫ|pUS.?k.>;R07Q(w/n#kll{wPZRv~.A<]>a-cwP:ny;׉6;hiTׂ%'As8+x6Ej dhkǎ9 'l1Jiͦ\AX1}t|r)iǎZuJ4٤$^Ab .\7,0+;{E`˟%%V+WSCCxTTTL/kr5WS *J+d^oʾ,K5Sw&̏҃>u 2M43rw %5P$&g\!2f+)79l>?QՕ$i'WSieaJ6k]Դ<@_f޼>vZ)Ggnvr a4 _#6AF{WбFő8i|N6Qԏ8^f1A [p!u7Ѩ1#(=g $o;m T>ʀzŸJo@x?,j΢hv1Nfe4~iSk*N/z c(֢NZt e/ɦ۟eq5s_uі-hT:[{{xc m4?v rc]8\b C=ѦQ2Oƍ2f.ίׯYYī8a^FSV6L5;%jo/Z))2?Sx2mߤE3)ϦFcJKMSqU%WaNIu6d[./Ʋe˩HH Σ uarpX#\xp+~W~yh>Ϥ_Fm[m rCߒ@;& K׫TLȩ8T4NjM7A˿^P4m+jMISP &NI]Mi lѨ BC'AEbU+~(?)c>j褼JOigQ۹˼d:L뢦%ugQPIiadE-]ȜvLN-O#JEwʬ&#FWQ-tfPRV;+Q&DM-#Y KRaKtL Ah0Ki: @/Y41:FYٔG, |tuCؔ x'Ϳ+Us;(ZaE\{@ټ W%%H ڨ"^s>SR~L >x2/iγ}pl بf23~˭"½  h+~"[A IqC@H%ŝl>L#࿎fx!Pqr3[m&<FY:bJ MTJG2!9;)5٩y)ɐI2/Wk "ؠ(5 GO(ZA^$GeDzy~ITx^/=$Q^?*'{Hz<^T&ODzyLH/ S ݳa|v4m#~ޡR _<.Sg>ͿxJFS|؇Ҥ\|q^b}AP@ /VF0P6Ry.V6Jy?ӡy+T<,.TX`䁧7N$N W840{/x8{ {^Ά{¼q^KcWp?Z7{i? z8G yy~/^Agýha8/辰+l-4z= U6 " 恥܅T_ٵSpՅG@q KɼiW#_/R X7z3Q IDATK!0Ac:Dy,~|=؇[&\SC^#(Џl,x("0$PFגƓfqA &`{JC/d ؇[8%՗D#Rj?&(R@Ra{!ʆfɤN4neK-Nna~R87)eak, EEGK$oGFS$dT(@XĈN J*8> mл+NB C=aW6 J( IfnEEByyn9ʯő`]lWvadl<y86^(_;WM>|ȋB^}*6ZV^'DR7 /~Hmi̓KO>z˴ysh9'>UƓ@/qzd3w^tļiޱ=?HG;3[Ns+8N=`I]A>>qT#ijڷ=GonB4-!ZtwÌSOite1JB5@no6J<@u\T7oYHn륻3NсO?N pفyV{z\~;؟N 潧m͑93f1߰zt=q{tid^yV`!۸xU?O9 eWWL9b,n"{FOy ~4./%2C#(ц/Ѓ L3)A!TRL1os.?kk_>=X>$ 0ʒ ~ī#,,];՘(AVO~(6Iwz$kB/zz '4k ?+8yGt %DV>#RLA>>ֈJ4^vs~K chX XC̸mfz1{il2]֗쿳M+23 A:<}aڴi/;LBӭ@4ސooZzFܦwZ3;^p8 T_ /a@W)MΖ\ͮ6賈xYE)I()uaKΗ"FSEQV2R_`w:Ϭ5`rN;V]yE/+򮋲lg$ge'PY٭ (c\i3c^h2LYEn~14A(2Sf0.)}_7GQ4XP?#WxO@C+ T,ٵ3~ZH}v4 ^4,y[G0`ò᳴l+:ޗP [<.2IpKotV=&/[b<euU`4֤}xJh#Xe}N~޿&=!+W KL⯯/FwKho؃~MNy8rM,?ۿj-Y/]OJx9D)Kg}ىd}92~YqWF.oOىâL{^xjHi7 3_uzol2yft"mbpX^YbwLG#hgrĿ|4>{u<<{/b[qxB.{rDKMS#VJzѻ/>~]Xs<9c?=?k OaM^oLAq7r $dTk$H"ߧJB[Fd;q 8I\R*kkUwz 2=eCs&N+.C|0AOpUQcW}< ~GY 96^>^=bg௯11/>+~G #3ZE`hwGai|2-+قeF$]!8E<`0$ om?UػݘX4G\ǘ-\ܪ+Fo+': #F#)6ֺJ4>2T貄PKkGWxIZM频\T"K!>n:6\_ڮA)aj?^0ҧ'Y|˙^00ѣ9a=p) *pAO 3FU(:'-)Jgq8vqo-M =:!lDu2Ӈ;ùg٨aoRDBb46)u?ڋ;`961gd*۩aZU fViL>u8m4M&i1jq{3Gy}CjؙiJ/*hF~>drimlgOv|ӜiwΪFؚjA 0rڽg/z ʓ>ks0GLk^+i6OG!`H lAs~{S Ȕ }勺6J̟/iBx;ߴXKOG'i+7hpkLOF8ѺsF2Y7p,swQ/t'yH.1KW^Gb8{;ϒj1FK6\w૦} ,mCȱ"t˦N}[uA ^_ڒ%Lj TȔ/+qXwǴx3ԫ}/k6퓐<0+)]UZwK#=Y]KW0z11~J&C鼖K8,S0ke#&HƖmg͛7Ԡ p8V[Fe?JQ#zN09wOClD!]?\=4$/51_K :~"7 Cz3w`1R4ӹ8J a.1axEb?Љpa׷uб$6!}z?@T@~p l6G?*ݥ31s<Ɏp+]AM?]G`atJԣu3ח_ =-i,^&+Lssrl!rJrٛk}_iՆD|2#8>[PJ`ڛi?~>,N!Iz??J[iR|LIg1x빍RZEq>y!S|*<\D9G9 S`Iy%]{M-`--j˛RjȠgƕܳhݰ=^,S~B83!}| G#fheI/S+[< VH3< O}Gx~cy&(^+њli6ObI_L5xy\IA>lx3C O?W_ŕ+Wꕇz~gL=][}n~$b㋏^ 0pſq!d_G/?^mchΖbwh= g9tǜ}erp)l}$ /62ȇ) ~H%akkLЩGhƇb|b6bhJ7fmqZg.0#mXVç܆̓Skmv,m0>?-v1k(qlm(1ǤYHT5e|j6gmʟq1wVJ};]c1_cСfY=V3&S[s59馆nVƅ_܅KCK`]=`PO:=2Y=ӤA_ȹ#k_~luT;cȔFlFu5K5pv2#8ٌΠ.-B_Pݣ'lN#,sbV2b ^pwm\'jz@A9Ro_ַI\)©3ed{ O:ߒGap%ݎ;l( `kF5z*ǷNfNu`Jă>(tڳgO팳gCxB޽{1}e qjCabq:y ۝`K(-*>Pc/ŮO hO555޽{{bAjƒpzBn~}ʆ%/[͖@\Fa&f*C Eeh '[+bn끕D9N1heCDFsmNZMm/l݈>s#?^0Gy;s*ʆm<6}0[Wk"%x2d y0E%t\:dus||9Nr<]lu'GܸqChteG'j3y\ngn}>F|*c?!` u0b޷mS\L۾V[F1* `.-GeO[uw`ktG<˗ =lGgxVZt >;ͺc(5nt%Nl/GYux' cHpJ.]Ĉ@<{QH/@}E*_9nVv损o4NA}b`30:ct<fD ĈY}:$Q! 9. p"$$bY1>iG^}̜d1Yѱ-\G}ps8vg4bZŲ~xUG#&|2FQ pW4d_`0q(Q>7efK'^cFFNsL[O7s 0DlW>G!Nl\s\Mwlh?X;vARRE40;;ױvZpl#A`[1pvfDeey˦Ze23(K':Za8a,\h ^t>*++_2Ⱦ wT>uj^ٙɜ:aΠ1vOm[ltrp8-KZ=۶BY4UZZZ/ vtdbNs2se*<#ûXjyPE7+1([Mk^/wrlt'p8[W6n1E Fyi4L.\ QRwDϵ9W@aed%ƶ:^0!@mLm҉]4^ -'[Ng[3~?ƣɣa;σ wW51<,+}^zbƪ?noycea㤯-275]"čCdl`NJ0&Ff]ke6jb&]*%dIjblOX E!;u&Z!ùss0rD!'y*&-FΎxG!p߇g -V j)F}VvFҺLy7n}p_ N-ȇ2sw v`o q2B?ʔ V)i ^-"KF%n7+U~q-FaFF6C6O.WkHQCEaLaG?gf 0IfB`N@TsGlV&~Q-Cz05\?u[~4KK7tau(Qڮ & vm91;A–<&;4Օ*g)`{^7m݊<^"rf0-\0m3dg'CAy3 uyXB2 amG[ڌ"ajTkJb0$X 3$ ^ٌmdRdL(Ό2%h">ʓ(4T'@gGU|J>#*.VajAӘSF>ָQEu1:m5x3`#},:P/a)δ oVaJ|{45"[KGHiʔ:xbUavxbIl-Z.@TYt|7,<, 4ikhZx;*to>~J@yVl*%,VI!I4Gr3o.R8"D6$L IO`޺2de )/m֍1)- ߮'- a$W*l'BlEonDDT`FR 8).qoh]dH+ka> Ir1W| E]=Ƕ`>s1rRz7W2w6@mJco~tm/M 54]b34%ѤbV#Ň܏5`Foo_)Î0lJW >_ v(HȩKjV[Q:dvzzPY {}Yk &Kޘ>f4}z(XIe꼩U]b ə!dv$@i+A'/1;Oa3zDY~jјzSuxK{lI{55z4hKc۝c.1+Ɨq``0Wiک0uQ#ـ6:UМkHֶF>vSS=~P*Qe33=mD{Ʌ$mAc4/-h*IIa^svڎ1nJRHѯ`Ԃp/D>T<2bWbr7LQYw)mG# "0ޞai݋ GgRt?哀 {}o%Ӎl҂kA@S\gqh ]/~*KeRPyЮR!. [ZJn \ tv}s>>bLLtމrFեroaXP Êt@8Y@ꑥ ?q8Dep)0UUUMaT/9Έ sE65WW}U ʍ(%S/o#cJM߳w^d88rG'G[ua^:q ̱T>ڟH*CGg}S{I2)u8>wB1 {r V  ֭CX{ dd *i|BXxDAH"#'"O&UO#g ;/L&Z1ɋA(Kh1*P~6_]qVR2X _"ὑ$\3Zv@V;%5+0$^{ @$U"#!Pש˕8FM̵;i+M,ѱwbŷg >\~'WK-M50њx"K;15#eh/ o۬=ȚĖ{b*N_1PgZB~&B{6'[ȥ=GYMpbLgE:3nnp3տ4Z͕Ws5zQYTURAC"\&P'^'rͺS2mw"LkJq#:>Pkog@1ij/o={CłW4w,m/<:u u61P,ũN;`MLJߠHp(_7d]f{eCm.g&dڹⲙIePҲI82rc0[,"@ϳ8G#<<_kxYRi%۰L$-s8@G+m~ZATE/*a4#5|"G#t:\' zr?#&][3G#p8vnP0_Fι(49颁AըPZR򦴢=)v]'w02j[Qn+{XS3HR{p3fB-u qdn'/-#4ɲQqapfacvQdSgC1#'Dpp8.a],}8D%Sš w*7c>/K4wDڒ*9BR]큵t%IǓ((/JÄZ {j5{pnACqAQH\,:kP G2͹~QKo%g  EPx ;j0Dr|Sk[/ddd }6)xik䪯BeƒCϜL_tVVb]WmY98cG6!ʆ!;P%b8KYY|{7, !:7J_=+R2{Z 4jq C@u$o8ӥmJS?ً'a_85k -7Td]7<&M"Z'Mq8N@+3+>^0MBwB_EبH $äORa/.)=-@LrfuQFE_9u.4kU8zyzkW+[4.㈯يqz㠞uV).3ah"{U2uc(\+`{#-qCtA(Gc"`L)*x=Qw$.;eAU&.7aVp@΢%F V$9ذz4IKSObwoQsjI5_:6,Bdp:2Oڅt ]x/N=>aE>|*+ˁbIЭ>"@}mAdoIEa0;ԅH+c&pr?ވģ("cmcfx FeX>at^Xсd$Ӈ%@lD7~H : tThʇ"AɀJLmMa4a^6e2 ؇F%BoPDM/b]աCtǕ_ իWc( vzԻQl1Z]ٰq v@>jEy_Cmq{OQZOVuaK\0?R2ReTHj5k #g,dx񀦀Bٓʅ".#Bo#o:"ar0]ow@B2f)b( Ia!*XA h=ɦf}Vҗ` #9tf}RwH#--3 k55N_<gbK[0|Pd$Rғ~bL 8_ׄ ,|D#{XD`r}pg0jz ɲ0F}*\; .4_6J\/R>nW&j#NWאuU?_}`&$E7DӚr/"29A} +IxJQcͶ!wg .f9NEj:돹6##E_2 ӟ\R((޽ SJ~Q:Ӟ\&v„CcAzE+q~%;\(at#&RNPEmH6hir'vrsp25YB2ueE"KBGNFNZ-Dp|1ZgґǂYh5eC˄XA3TTؠ* cBk] &[pnwւ@׮]1mTw$,75[G/K7`پ ,mn]܁JoW2$խ}68EWs")e=ŕ_Xhv` PMS.Rhad{#QM5^V F!fBA`44"){ٙ|\`gO)HL\~  j%KȺRKw-o>3HAa8mR"r̥`mcHʄycJj @Dz,y2KH[詣m r6]E`X2.Ow\Q _)Tn vނj(2{_BYul`f|zUcŊU08:j2 p%2X(XhrX>IS9Ž"/5^bO"3n#̅y:gz^=z냹*ƒR@=F6M H^;x0.qbBīO@{u9e%XFKA?h3ʢd`}) q2#.!=C8hr*#i&X<"0μ Ǧ5;.s uJG\}nȐ!xt87V!V[Y4[GV[ng bv!Ͻv[_ ~$ea8CoK.?Mo 4z"R^W4&$eQvvR܊jT3n޼`0NJ"??v=zڽѰG#hƆKehӘLy܆l ;`+”t \|tauU5}G[nCQ9oM6Ю>e#M؛/ǏL]J8t0]GbԩTV'hʆK󲗻dIWf?6}i4Z+1GNv1Q^Zaf̷= ;C͜jHdeNWmhUSʋgRٛJ4gu;u#XvPO_V2mu I Ɇm٣%q 4$y:TϑN"ȿ= ߁m]MYe.?I&M+k }*xL&5H SI v64\~;Y مwJ|BQN#GT?a/ꨊ=xkrR>1RFKZXji*oj#Chz# \p.wDG%CsG7zW Vπ^ lIqVx\|oY!(lr1_JLHHFz еEPֶ''ÑI{T|oݙ1thy\}sy6L$p‰gqMOPTl`dV6 GZ(j('ѢH$GΤ ǂY`޸h vL{h#5g_ce'l?1W 0e9Jw5mL5”.8`rU֞"MZu2е5hĩ3=;.yu9S4tl:'Uc[G\v0aRHG*R35ISՊ3xH(,̈CTN(5d'zXgBׁZP( ª?&ovXr%OUL:xZoˢ؝qޑ8[@Lr&ʩun,^"^Z \ׇP 7h:a3l: "R|p0,T}16m$eFMvf۩>6dP$VφΆ׆ Kq_E?߷3lF k>.ŮlZhѤAс$Rl*edx[4"#o8uN25(<t%F)DDxceJ&8^X Jq@{) m.g?Zu9CO_:6,Bdp:2%ܧ^ MP~Ϙ.Cه1D /}Mg\ DtRQcImO^,E)?7rl@b&Ms1 JEa0\42²RR$>)ׯ@tt0R/,b873Fd$&E+ _*]MP}*=oɑwF,6lL[7f1{t-:+F T Nʆ@Z*aHv "iS /mh, %0ܰ$?ȍqa ]} &t W!/ϔU 7 }%*^(5_JBz3o.R8"D6tD*Xƽgai;GNĸi$;J/AQY[ڵr ~Qi( IYE'ak!!} (bƄWՋ)9BAeX~?d+13:Z^Cu;16.KytF>Ygjh%f)p2!ѾX3䓃jp$M:Zb/kYN~f(\Q %s)]&V.w\ I’wTOZP5V}NlxKd&9nq,a$붾ڸc~t_ښ@.,3;L5B ش;=3i)"SN7o.T"+Y%SsYT! o1?p&B|" ]?)b9)u[`B3~˵DKv/ks2kVx !V@h{kSP[Ius*M@;T=[WǧR»tRjcS+B[QM1eZoPmll|$3ݒ1g8YeG704ua4J,.=0j(QVffˋq2-S_w6|b\.B~j 3\yAJ_&"pw,1ȪJp*A)XQ<w1Zrbߑ|Fcݫ܎E.prd1>I=,.nx&W=L@RZ1ehT¸i1t4(*F'nT娱fdQPz@@1tj'<^ۉǝgVRgƈac)N QʙސO;k Mhpu#2t)eBfAzd/i1b@5p/I}ʆ%~  u{Dc8-DvHreJňN#p}vzʆ+ǟ8]8G#=tpeNpؾr8Gr,d9=^#p8 g٠]U@*GU S}/of5E]^Ju;(d4℔VP;{ZThwFi9e9A&h7 mU]-4BL\Ob:,(eeth#?ďhjl \rj.;G#hvˆ`*9G E{WoA!/ xnTHynk"dfF$LizUlkyxoM({%D$cݻ4칞>xS#W 酵r Gs-`?.:XmD*/<eaќWp8VB6+D4qB%G{KPO:S, ѵ`o(GD=d? ct D/:фu{V %EDb+dS CزobPP0d$C) ZZ섣5ŢzuY _hI|eFr]e!Ңވߔ4ك4e":yu3`Rrfg ezIk~p8mU62㞅NG\^qj'}b]+MaBڅczmC}Yn!TC5X_XFݳS=W`=/ :j%/UAΠCfnؙ/Q1+(G`xH^DULaT#<#pE)RP,1Sk ڎbqy^6aQc„ ;Y)W/[\XYskY^&b%#E>I_]|qaD=(w2·3҇B ;g7V*+(;X&]pDP2e-Q}o11Ij?W+U 9~A~DczRWE2Vd'9cmF`ARׁOQFէ6EP5&?&p2EmQSՊg(`saFB0\l2t5Z@ G#h1nAY4l\lg6)6 rDS0k0֠@"CHBPP9Y6j1 Mv@a0;X(=|KsZ|&ć#9:A굿\|A[H@!(YJhZ3Fb~Q:| 5mG\*z6 3l]3HMrp:"}+3 7“RXI`o ~|JŢBS(N>)ܲIIcE(y+3djY~dWp8  ʆ[_H7>_dF%W)_ }NRWn($m#7K>bP ʱexډU{}V(b]q"#X6a+8A>؝W@M䝂DeI\hu pkߌAa00'MzT~ -D̖ l銷QZE~rwR,\5Ljj@SI/F-&7g*07 155/$]T9x;G#!P{GoB:@Td85W/[mt AVM;pp!~t[ӷa-T`bRkĥhEe\ 6 h-u ½X(Ci[#M Tvi &!~}lVnid=)2QI;v5=S$^j%m/&qw0 IF+Vr|O28$d*-aAI0uF"TJ߀Ǒ;g]5"@’ iKx x G#0@+[6ʑJGB8QXfFa1Y74~㣏Pm*T8n&"Uc|N'\7(B4Ed"PP{*9ڑ,/sh+'B^,,T#ȼ*қ\'?,XvfflJ8f{ASIMn߽LvR$Sg&95l2A 3\TjwSXš%Z*6)ROji~q8@#034u:bvRܯ6(7RHO 2}SH$)7VӶJ?z$`Aocl͚aY(,_!nWew݈xq=hnͤ"L< |܉'5d$R\7#` =K3hؒ#4Ǐp8E@2,aԬ(Ltr |DƄY!m {I2)u: X]#t$u [?rRȢL0jɻJIgkzyQYA9`șKE~ =ivw\#2NK>9`E#пxa&fX}oV"'Z S, #_ZJaiJ.㱔xPx ?= PDzR42|a+wv`G5v&-Ed* {x*/(Wc W~AB2IF,cPF!zL/7-G#<]̑Fnn.F ab@Rv:EE*ً0^GvA[^\˴؋ +&hQT\+z6 2Uy9j $,Ԡ+cr|q$tr;;c9&G#l0!??6zٞ./G#pn)HIr8G#ЦSU,yf3p8G@ѥKZԩlXYY5ݨ՞gp8G#0 ,iS`¡ј9ʔ p8GS# Jk-s8G"lt׮]^#p8΋);vײѳgO:sBG<#p8ΎLRQQge.իl899 S8xp8G#`hs^emuttĕ+W̵yG#p=0^eU۷/._xn=p8G=#PYY)(nnnuѠL"޽( CaNԅ+/ $aDW"ʌ߁H2:o贝4}\䐤'R-p@q +Ppil`wC   fcou/HPyrٍcGr''@^1LlEX>sPZ/N9 -p8p8k6rt:e2>[C@D: v5c®󃾿5>3 ^qi4v3C@v֣v.=JUJ^μlڂmAw"@Ȥwi~th#t+PVrs P{[5\jlH#0*+kl  MZdZٮ[ 2.-v) 6疋CK*v-Q}FQ_'  jo[^-ՅZf4S đ+~ /Ш: RE[e`#f :8d8 @=`#}Fj i 'JܚE/IDAT@-@ߏ# oQA@- Y3ӏIENDB`pnp4nagios-0.6.16/share/pnp/documents/en_US/0000775000000000000000000000000011662503006017276 5ustar rootrootpnp4nagios-0.6.16/share/pnp/documents/en_US/verify_pnp_config.html0000664000000000000000000001102211662503006023666 0ustar rootroot

verify_pnp_config

In case of problems there is a script called verify_pnp_config.pl located on http://verify.pnp4nagios.org. It enables you to check the configuration settings as well as performance data of hosts or services. It can be used prior and during runtime of PNP.

Download

wget http://verify.pnp4nagios.org/verify_pnp_config

Test

The verify script is located on http://verify.pnp4nagios.org an needs three start options

  • –mode One of the modes described on modeds
  • –config Path nagios.cfg or icinga.cfg
  • –pnpcfg Path to PNP´s etc directory
lenny:~# perl verify_pnp_config --mode npcdmod --config=/usr/local/nagios/etc/nagios.cfg --pnpcfg=/usr/local/pnp4nagios/etc
[INFO]  ========== Starting Environment Checks ============
[INFO]  My version is: verify_pnp_config-0.6.14-R.31
[INFO]  Reading /usr/local/nagios/etc/nagios.cfg
[OK  ]  Running product is 'nagios'
[OK  ]  object_cache_file is defined
[OK  ]  object_cache_file=/usr/local/nagios/var/objects.cache
[INFO]  Reading /usr/local/nagios/var/objects.cache
[OK  ]  resource_file is defined
[OK  ]  resource_file=/usr/local/nagios/etc/resource.cfg
[INFO]  Reading /usr/local/nagios/etc/resource.cfg
[INFO]  Reading /usr/local/pnp4nagios/etc/process_perfdata.cfg
[INFO]  Reading /usr/local/pnp4nagios/etc/pnp4nagios_release
[OK  ]  Found PNP4Nagios version "0.6.14"
[OK  ]  Effective User is 'nagios'
[OK  ]  User nagios exists with ID '1000'
[OK  ]  Effective group is 'nagios'
[OK  ]  Group nagios exists with ID '1000'
[INFO]  ========== Checking npcdmod Mode Config  ============
[OK  ]  process_performance_data is 1 compared with '/1/'
[OK  ]  event_broker_options is defined
[OK  ]  event_broker_options=-1
[OK  ]  event_broker_option bits 2 and 3 enabled (12)
[OK  ]  broker_module is defined
[OK  ]  broker_module=/usr/local/pnp4nagios/lib/npcdmod.o config_file=/usr/local/pnp4nagios/etc/npcd.cfg
[OK  ]  npcdmod.o config file is /usr/local/pnp4nagios/etc/npcd.cfg
[OK  ]  /usr/local/pnp4nagios/etc/npcd.cfg used by npcdmod.o is readable
[OK  ]  npcd daemon is running
[OK  ]  /usr/local/pnp4nagios/etc/npcd.cfg is used by npcd and readable
[OK  ]  npcd and npcdmod.o are using the same config file (/usr/local/pnp4nagios/etc/npcd.cfg)
[INFO]  Nagios config looks good so far
[INFO]  ========== Checking config values ============
[INFO]  Reading /usr/local/pnp4nagios/etc/npcd.cfg
[OK  ]  Script /usr/local/pnp4nagios/libexec/process_perfdata.pl is executable
[INFO]  ========== Starting global checks ============
[OK  ]  status_file is defined
[OK  ]  status_file=/dev/shm/status.dat
[INFO]  Reading /dev/shm/status.dat
[INFO]  ==== Starting rrdtool checks ====
[OK  ]  RRDTOOL is defined
[OK  ]  RRDTOOL=/usr/bin/rrdtool
[OK  ]  /usr/bin/rrdtool is executable
[OK  ]  RRDtool 1.3.1  Copyright 1997-2008 by Tobias Oetiker <tobi@oetiker.ch>
[OK  ]  USE_RRDs is defined
[OK  ]  USE_RRDs=1
[OK  ]  Perl RRDs modules are loadable
[INFO]  ==== Starting directory checks ====
[OK  ]  RRDPATH is defined
[OK  ]  RRDPATH=/usr/local/pnp4nagios/var/perfdata
[OK  ]  Perfdata directory '/usr/local/pnp4nagios/var/perfdata' exists
[WARN]  62 hosts/services are not providing performance data
[WARN]  'process_perf_data 1' is set for 43 hosts/services which are not providing performance data!
[WARN]  'process_perf_data 0' is set for 27 of your hosts/services
[OK  ]  'process_perf_data 1' is set for 243 of your hosts/services
[INFO]  ==== System sizing ====
[OK  ]  269 hosts/service objects defined
[INFO]  ==== Check statistics ====
[WARN]  Warning: 3, Critical: 0
[WARN]  Checks finished...
pnp4nagios-0.6.16/share/pnp/documents/en_US/tpl_helper.html0000664000000000000000000002507011662503006022326 0ustar rootroot

Template Helper Functions

Helper functions are meant to simplify the creation of templates and trap errors

rrd::def

string rrd::def ( $vname, $rrdfile, $ds, [ $cf='AVERAGE' ] )

$def = rrd::def('var1', $RRDFILE[0], $DS[0], 'MAX');

http://oss.oetiker.ch/rrdtool/doc/rrdgraph_data.en.html

rrd::cdef

string rrd::cdef ( $vname, $rpn, )

$def = rrd::cdef('var1_bits', 'var1,8,*' );

http://oss.oetiker.ch/rrdtool/doc/rrdgraph_data.en.html

rrd::vdef

string rrd::vdef ( $vname, $rpn, )

$def = rrd::vdef('var1_avg', 'var1,AVERAGE' );

http://oss.oetiker.ch/rrdtool/doc/rrdgraph_data.en.html

rrd::line[1-3]

string rrd::line[1-3] ( $vname, $color, [ $text ], [ $stack ] )

$def .= rrd::line1('var1', #ff00ff );

Draws a simple line one pixel wide without label

$def .= rrd::line3('var1', '#ff00ff', 'Load' );

Draws a line three pixels wide with label “Load”

http://oss.oetiker.ch/rrdtool/doc/rrdgraph_graph.en.html

rrd::area

string rrd::area ( $vname, $color, [ $text ], [ $stack ] )

$def .= rrd::area('var1', '#ff00ff', 'Load' );

Draws an area with label “Load”

http://oss.oetiker.ch/rrdtool/doc/rrdgraph_graph.en.html

rrd::gprint

string rrd::gprint ( $vname, $cf, [ $text ] )

$def .= rrd::gprint('var1', 'MAX', '%4.2lf %s Max' );
$def .= rrd::gprint('var1', array('MIN', 'MAX', 'AVERAGE'), '%4.2lf %s' );

If $cf is an array the legend will be formatted automatically

http://oss.oetiker.ch/rrdtool/doc/rrdgraph_graph.en.html

rrd::color

string rrd::color ( $num [, $num])

Returns a color from the HTML color table. The second (optional) argument allows to specify an alpha value used to set the transparency of the selected color.

rrd::gradient

string rrd::gradient ( $vname, [$start_color], [$end_color], [$label], [$steps], [$lower] )

Creates a color gradient from $start_color to $end_color

$def .= rrd::gradient('var1', '#ff0000', '#ffff00' );

Example

rrd::cut

string rrd::cut ( $text, $length )

$label = rrd::cut($LABEL[0], 18);

Cuts a text to a given length $length or fills it up to $length if needed.
This function is helpful if legend needs to be justified but length of label is unknown.

rrd::ticker

string rrd::ticker ( $vname, $warning, $critical, [$fraction], [$opacity], [$color_OK], [$color_WARN], [$color_CRIT] )

Creates a colorized bar at the top of the chart which shows different colors depending on states OK, WARNING & CRITICAL

$def .= rrd::ticker( "var1", $WARN[0], $CRIT[0] );

Example

rrd::alerter

string rrd::alerter ( $vname, $label, $warning, $critical, [$opacity], [$unit], [$color_OK], [$color_WARN], [$color_CRIT], [$line_col] )

Creates colorized areas, which show different colors depending on states OK, WARNING & CRITICAL

$def .= rrd::alerter( "var1", $LABEL[0], $WARN[0], $CRIT[0], "FF", $UNIT[0] );

Example

pnp4nagios-0.6.16/share/pnp/documents/en_US/wrapper.html0000664000000000000000000000125411662503006021646 0ustar rootroot

check_procs is an example for a plugin which doesn't deliver performance data:

./check_procs -a ndo2db -w 1: -c 0:
PROCS OK: 2 processes with args 'ndo2db'

This can be changed with the following wrapper script

check_procs.sh

#!/bin/bash
LINE=`/usr/local/nagios/libexec/check_procs $*`
RC=$?
COUNT=`echo $LINE | awk '{print $3}'`
echo $LINE \| procs=$COUNT
exit $RC

Now you'll get the number together with the required label

./check_procs.sh -a ndo2db -w 1: -c 0:
PROCS OK: 2 processes with args 'ndo2db'| procs=2
pnp4nagios-0.6.16/share/pnp/documents/en_US/perfdata_format.html0000664000000000000000000000522111662503006023322 0ustar rootroot

2.6. Performance data

Performance data is defined by Nagios as “everything after the | of the plugin output” - please refer to Nagios documentation for information on capturing this data to logfiles. However, it is the responsibility of the plugin writer to ensure the performance data is in a “Nagios plugins” format. This is the expected format:

'label'=value[UOM];[warn];[crit];[min];[max]

Notes:

  1. space separated list of label/value pairs
  2. label can contain any characters
  3. the single quotes for the label are optional. Required if spaces, = or ' are in the label
  4. label length is arbitrary, but ideally the first 19 characters are unique (due to a limitation in RRD). Be aware of a limitation in the amount of data that NRPE returns to Nagios
  5. to specify a quote character, use two single quotes
  6. warn, crit, min/ or max/ may be null (for example, if the threshold is not defined or min and max do not apply). Trailing unfilled semicolons can be dropped
  7. min and max are not required if UOM=%
  8. value, min and max in class [-0-9.]. Must all be the same UOM
  9. warn and crit are in the range format (see Section 2.5). Must be the same UOM
  10. UOM (unit of measurement) is one of:
    • no unit specified - assume a number (int or float) of things (eg, users, processes, load averages)
    • s - seconds (also us, ms)
    • % - percentage
    • B - bytes (also KB, MB, TB, GB?)
    • c - a continous counter (such as bytes transmitted on an interface)

It is up to third party programs to convert the Nagios plugins performance data into graphs.

Origin: http://nagiosplug.sourceforge.net/developer-guidelines.html#AEN201

pnp4nagios-0.6.16/share/pnp/documents/en_US/modes.html0000664000000000000000000001377411662503006021307 0ustar rootroot

The art of collecting data

PNP supports several modes to process performance data. The modes differ in complexity and the performance to be expected.

The following image shows the connections between Nagios, PNP and RRDtool

Nagios invokes a command for every host and every service whose performance data should be processed. Depending on the mode you choose the data will be passed to process_perfdata.pl or will be written to temporary files and processed at a later time. process_perfdata.pl writes the data to XML files and stores them in RRD files using RRDtool.

Before you choose a mode please read the documentation and decide which way will be the best for installation.

The modes in comparison

Synchronous Mode

The “synchronous mode” is the simplest and easiest to set up. Nagios will call the perl script process_perfdata.pl for every service and host, respectively, to process the data. The synchronous mode will work very good up to about 1.000 services in a 5 minute interval.

Bulk Mode

In bulk mode Nagios writes the necessary data to a temporary file. After expiration of a defined time the file will be processed in one piece and deleted afterwards.

The number of calls of process_perfdata.pl will be reduced to a fraction. Depending on time and the amount of collected data there will be much less system calls. Instead, process_perfdata.pl will run longer.

Note Using this mode you should keep an eye on the runtime of process_perfdata.pl. While it is running to process data nagios will not execute any checks.

snippet of var/perfdata.log:

2007-10-18 12:05:01 [21138] 71 Lines processed
2007-10-18 12:05:01 [21138] .../spool/service-perfdata-1192701894-PID-21138 deleted
2007-10-18 12:05:01 [21138] PNP exiting (runtime 0.060969s) ...

71 lines were processed in 0.06 seconds. This will be the data volume of about 2000 services und processing using a 10 second interval. It means we blocked nagios for exactly 0.06 seconds.

Bulk Mode with NPCD

Viewing from Nagios this is the best way of processing because Nagios will not be blocked.

Nagios again uses a temporary file to store the data and executes a command after expiration of a certain time. Instead of immediate processing by process_perfdata.pl the file is moved to a spool directory. As moving a file inside the same filesystem nearly takes no time nagios is able to execute crucial work immediately.

The NPCD daemon (Nagios Performance C Daemon) will monitor the directory for new files and will pass the names to process_perfdata.pl. Processing of performance data is decoupled completely from nagios. NPCD itself is able to start multiple thread for processing the data.

Bulk Mode with npcdmod

This scenario includes npcdmod.o, an NEB-module. This module reduces the configuration of the “Bulk Mode with NPCD” to a mere two lines in nagios.cfg

This mode is similar to “Bulk Mode with NPCD” and it is exactly the same functionality and the same performance.

Gearman Mode

Since version 0.6.12 PNP4Nagios can be driven as a gearman worker. This way large Nagios environments are possible using mod_gearman. Nagios and PNP4Nagios can be run on different machines.

You need a mod_gearman environment up and running like described by Sven Nierlein on http://labs.consol.de/lang/en/nagios/mod-gearman/.

The decision

Which mode you choose will depend on the size of your Nagios installation. You will find theses terms throughout the documentation.

back to contents | installation

pnp4nagios-0.6.16/share/pnp/documents/en_US/rrd_convert.html0000664000000000000000000000747211662503006022525 0ustar rootroot

RRD_STORAGE_TYPE = MULTIPLE

available starting with PNP 0.6.3

Since PNP version 0.6 it is possible to store performance data into multiple RRD databases instead of a single RRD database.

After creation of an RRD file you cannot alter the number of data sources. This may lead to problems if Nagios plugins change the number of data sources dynamically.

An example might be check_disk if you monitor all available file systems using one service. If a file system is added the RRD database cannot be updated anymore because the internal would be changed.

Per default PNP uses the option RRD_STORAGE_TYPE = SINGLE which is defined in process_perfdata.pl and might be changed using the config file process_perfdata.cfg. This setting should not be changed globally because PNP will start creating new RRD files immediately after changing to MULTIPLE. Old data will get lost!

Additionally it is not advisable to activate RRD_STORAGE_TYPE = MULTIPLE globally in regard to performance. The number of RRD databases and the disk I/O will increase significantly. That means that you should carefully select which Nagios check commands should be altered.

The section Custom Templates contains information about how the settings should be altered.

A converter

The script libexec/rrd_convert.pl will be used to switch RRD_STORAGE_TYPE to MULTIPLE and to migrate the RRD databases.

Significant as always with PNP is the Nagios check command.

rrd_convert.pl --check_command=<nagios_check_command> | --list_commands [ --dry-run ] [ --tmp_dir=<temp-directory ]
[ --no_structure_check ]

You have to specify at least one of ”–check_command” or ”–list_commands”, respectively. Using the open –check-command= you tell the script which check command should be searched for.

rrd_convert.pl will now browse all PNP XML files for this command and output some statistics.

After confirmation from the user the conversion of the appropriate RRD databases will start displaying the progress. Pressing <ENTER> as an answer will terminate the script so please enter a letter.

If you are unsure then use –list_commands to get a list of the check commands used in the XML files.

The option –dry-run will convert the RRD databases but they will be stored in /tmp/rrd_convert in separate folders per host instead. This way you'll get a feeling about the runtime and the amount of data.

If you want to change the temporary directory you can use –tmp_dir=<alternative temp dir>.

Sometimes the number of datasources in the RRD files doesn't match the number in the XML files. This might happen if a plugin suddenly returns more datasources than usual (like check_disk as mentioned above). Using the option –no_structure_check these RRD files will be converted as well.

back to contents | NPCD details

pnp4nagios-0.6.16/share/pnp/documents/en_US/npcd.html0000664000000000000000000002516011662503006021114 0ustar rootroot

NPCD

NPCD (Nagios-Perfdata-C-Daemon) was written to provide an asynchronous mode to handle performance data with nagios.

Introduction

In large nagios installations, your average check latency may increase to a non-acceptable high value. This means that Nagios should do a check at time x but actually does it y seconds later.

If you tell the Nagios core that you want to process the performance data after every single check this is doing well for a certain amount of checks but above this limit you will run into latency problems.

To reduce the number of actions for each check you can use the Bulk Mode which gathers performance data for some time and then lets the Nagios core execute the <host|service>_perfdata_file_processing_command or you can tell Nagios to just move the perfdata_files to a spool directory.

This move is a very fast action for the Nagios core and the core will be done with the processing of performance data and can continue to do what it should do: execute other checks, sending notifications, and so on.

How it works

As mentioned above the Nagios process has finished its work with moving the performance data file to a spool directory but this won't bring the data into the RRD files.

For this task you can start npcd to have a look at the defined spool directory and start an action for every file which is found.

After NPCD starts running it will build a list of filenames found in perfdata_spool_dir and starts new threads for every filename and executes the perfdata_file_run_cmd with the optional perfdata_file_run_cmd_arg as an additional argument.

Since the perfdata files in the spool dir are in the same format as for the 'normal' bulk mode NPCD should execute process_perfdata.pl in Bulk Mode.

Advantages / Disadvantages

Pro:

  • Performance improvements for Nagios
    • because the performance data processing is detached from the Nagios core it has more time for its own work.
  • no lost data
    • as long as Nagios writes perfdata files to the spool dir your data won't get lost if NPCD dies or you forgot to start it after a system reboot. NPCD will start with the first file found (they are sorted by the $TIME_T$ macro in chronological order) and update your RRD Files.

Con:

  • no real time processing of performance data
    • since there is a delay in writing the performance data files by Nagios (service_perfdata_file_processing_interval)
    • another delay exists within NPCD which waits for up to 10 seconds after each directory scanning

NPCD Config

You have to control NPCD with its own configuration file like the rolled out npcd.cfg-sample file.

Just rename it to npcd.cfg to start NPCD like this:

/usr/local/pnp4nagios/bin/npcd -f /usr/local/pnp4nagios/etc/npcd.cfg

or

/usr/local/pnp4nagios/bin/npcd -d -f /usr/local/pnp4nagios/etc/npcd.cfg

to run in Daemon Mode (background).

Hint: If you decide to not rename the config file, it might be overwritten by a future update of PNP.

npcd.cfg-sample

These are the essential configuration directives for NPCD:

# Privilege Options
user = nagios
group = nagios

# Logging Options
log_type = syslog
log_file = /usr/local/pnp4nagios/var/npcd.log
max_logfile_size = 10485760
log_level=0

# Processing Options
perfdata_spool_dir = /usr/local/pnp4nagios/var/spool/
perfdata_file_run_cmd = /usr/local/pnp4nagios/libexec/process_perfdata.pl
perfdata_file_run_cmd_args = -b

# Thread Options
npcd_max_threads=5

# greedy options
use_load_threshold = 0
load_threshold = 10.0

# Process Options
pid_file=/var/run/npcd.pid

The directives

  • Privilege Options
    • user <username>
      • NPCD tries to drop 'root' privileges to switch to this user.
      • default: nagios
    • group <groupname>
      • NPCD tries to drop 'root' privileges to switch to this group.
      • Default: nagios
  • Logging Options
    • log_type <syslog> or <file>
      • Log type that is uses by NPCD
      • Default: syslog
    • log_file </path/to/filename>
      • if log_type = file this will be the logfile used
      • Default: /usr/local/pnp4nagios/var/npcd.log
    • max_logfile_size <bytes>
      • NPCD will rotate the logfile if the filesize of the current log is above this limit
      • Default: 10485760 = 10 MByte
    • log_level <integer>
      • how much to log, possible values:
        • 0 = No Log - except errors
        • 1 = small Log - some more output
        • 2 = more Log (actual ALL log messages)
        • -1 = DEBUG Mode - ALL Logs and slower processing for debugging purposes
      • Default: 0
  • Processing Options
    • perfdata_spool_dir </path/to/spool/dir/>
      • The directory where the perfdata file should be found
      • Default: /usr/local/pnp4nagios/var/spool/
    • perfdata_file_run_cmd </path/to/bin/filename>
      • This is the script/binary that NPCD will execute
      • Default: /usr/local/pnp4nagios/libexec/process_perfdata.pl
    • perfdata_file_run_cmd_args <option>
      • The argument added to the perfdata_file_run_cmd
      • Default: ”-b”
      • :!: The command line will be created like this:
        <perfdata_file_run_cmd> <perfdata_file_run_cmd_args> <filename_from_perfdata_spool_dir>
  • Thread Options
    • npcd_max_threads <integer value>
      • Defines how many parallel threads should be started
      • Default: 5
  • Greedy Options
    • use_load_threshold <0 or 1>
      • defines if NPCD should _not_ start new threads if your system load is too high
        • 0 = disable
        • 1 = enable
      • Default: 0
    • load_threshold <float value>
      • if use_load_threshold is set to 1 this load limit must not be exceeded
      • Default: 10.0
  • Process Options
    • pid_file </path/to/pid.file>
      • the path to the PID File
      • Default: /var/run/npcd.pid

back to contents | wrapper script

pnp4nagios-0.6.16/share/pnp/documents/en_US/rrdcached.html0000664000000000000000000001147711662503006022115 0ustar rootroot

RRDtool Cache Daemon

In large installations sooner or later one will recognize that processing the performance data will result in a relatively high I/O load. RRDtool has to do very much disk updates but cannot use the disk cache in an optimal way.

One improvement is made by collecting and sorting the data. It is more effective to write many updates to an RRD database in one block. The disk cache can be used more effectively that way.

The current RRDtool ( SVN trunk 1550+ ) contains rrdcached which should improve exactly this situation.

At this point I'd like to thank Florian octo Forster, Kevin Brintnall and Tobi Oetiker. The development of this daemon has been coordinated exemplary on the rrd-developers mailing list.

Mode of operation

The rrdcached is working as a daemon in the background and opens a UNIX or TCP socket to wait for requests of rrdtool. Due to security reasons newer versions of rrdcached cannot use absolute paths for network access anymore so the only possible way are unix sockets.

rrdcached

rrdcached recognizes some important options which are passed during startup.

Option -l defines the socket the daemon will listen for update requests. The default TCP port will be 42217.

-l unix:/path/to/rrdcached.sock
-l /path/to/rrdcached.sock
-l 127.0.0.1
-l 127.0.0.1:8888

Option -P specifies which commands are usable with the RRD data bases

-P FLUSH,PENDING

Option -s allows to change the group ownership of the unix socket

-s nagios

Option -m sets the permissions of the unix socket in the usual octal format

-m 0660

Option -w specifies the interval (in seconds) the data will be written to disk.

-w 1800

Option -z defines a maximum delay which will be used to spread the write cycles over a certain range [0-delay] to avoid parallel write accesses. The value of option -z must not be larger than -w.

-z 1800

Option -p defines a PID file

-p /var/run/rrdcached.pid

Option -j defines the path to a journaling directory. All requests will be logged there so that they can be processed after a restart in case the daemon crashes.

-j /var/cache/rrdcached

These options may result in a call of rrdcached with the following parameters

 rrdcached -w 1800 -z 1800 -p /tmp/rrdcached.pid -j /tmp  -s nagios -m 0660 -l unix:/tmp/rrdcached.sock

rrdtool

RRDtool itself will be informed about the daemon using the option –daemon=<socket>.

 rrdtool --daemon=unix:/tmp/rrdcached.sock update ...

Of course this has to correspond with the options of rrdcached!

Integration into PNP

Because two components of PNP have to prepared for the use of rrdcached there are changes in two config files.

1. Adjustment of process_perfdata.cfg for the data collector process_perfdata.pl

# EXPERIMENTAL rrdcached Support
# Use only with rrdtool svn revision 1511+
#
RRD_DAEMON_OPTS = unix:/var/run/rrdcached.sock

2. Adjustment of config_local.php (or config.php) for the web interface

#
# EXPERIMENTAL rrdcached Support
# Use only with rrdtool svn revision 1511+
#
# $conf['RRD_DAEMON_OPTS'] = 'unix:/tmp/rrdcached.sock';
$conf['RRD_DAEMON_OPTS'] = 'unix:/var/run/rrdcached.sock';

The sample files contain the relevant options.

back to contents | migrating RRD files

pnp4nagios-0.6.16/share/pnp/documents/en_US/upgrade.html0000664000000000000000000001746111662503006021624 0ustar rootroot

Upgrade to version 0.6.x

The web-frontend has been completely rewritten and is now based on the PHP MVC framework Kohana. This leads to changed dependencies which must be checked prior to installation.

Note: At first an upgrade is like a new installation. Afterwards some changes should be made which are described further down.

Without specifying any options during ./configure PNP 0.4.x was installed below an existing Nagios-Installation at /usr/local/nagios.

Without specifying any options during ./configure PNP 0.6.x will be installed in a separate directory at /usr/local/pnp4nagios, i.e. it should be viewed as an independent application.

Note: It is sufficient to copy the *.rrd files from the old to the new location. They contain the data The *.xml files are recreated every time new performance data arrives as they contain meta information. The internal structure of the xml files has changed so you wouldn't be able to use them either way.

Comparison of the structure

Summary of a PNP 0.4.14 installation

./configure
...
*** Configuration summary for pnp 0.4.14 05-02-2009 ***

  General Options:
  -------------------------         -------------------
  Nagios user/group:                nagios nagios
  Install directory:                /usr/local/nagios
  HTML Dir:                         /usr/local/nagios/share/pnp
  Config Dir:                       /usr/local/nagios/etc/pnp
  Location of rrdtool binary:       /usr/bin/rrdtool Version 1.3.1
  RRDs Perl Modules:                FOUND (Version 1.3001)
  RRD Files stored in:              /usr/local/nagios/share/perfdata
  process_perfdata.pl Logfile:      /usr/local/nagios/var/perfdata.log
  Perfdata files (NPCD) stored in:  /usr/local/nagios/var/spool/perfdata/

Summary of a PNP 0.6.0 installation

./configure
...
*** Configuration summary for pnp4nagios-0.6.0 07-30-2009 ***

  General Options:
  -------------------------         -------------------
  Nagios user/group:                nagios nagios
  Install directory:                /usr/local/pnp4nagios
  HTML Dir:                         /usr/local/pnp4nagios/share
  Config Dir:                       /usr/local/pnp4nagios/etc
  Location of rrdtool binary:       /usr/bin/rrdtool Version 1.3.1
  RRDs Perl Modules:                FOUND (Version 1.3001)
  RRD Files stored in:              /usr/local/pnp4nagios/var/perfdata
  process_perfdata.pl Logfile:      /usr/local/pnp4nagios/var/perfdata.log
  Perfdata files (NPCD) stored in:  /usr/local/pnp4nagios/var/spool

  Web Interface Options:  -------------------------         -------------------
  HTML URL:                         http://localhost/pnp4nagios/
  Apache Config File:               /etc/apache2/conf.d/pnp4nagios.conf

Looking at these lines result in the parameters to be changed and the upgrade strategy.

Adjustments

The templates of the action_url definitions have changed. Instead of ”/nagios/pnp” the URL should be ”/pnp4nagios” and instead of “index.php” now “graph” will be used.

define host {
  name       host-pnp
  register   0
  action_url /pnp4nagios/graph?host=$HOSTNAME$
}

define service {
  name       srv-pnp
  register   0
  action_url /pnp4nagios/graph?host=$HOSTNAME$&srv=$SERVICEDESC$
}

The definitions for the preview popup function are similar

define host {
   name       host-pnp
   action_url /pnp4nagios/index.php/graph?host=$HOSTNAME$&srv=_HOST_' class='tips' rel='/pnp4nagios/index.php/popup?host=$HOSTNAME$&srv=_HOST_
   register   0
}

define service {
   name       srv-pnp
   action_url /pnp4nagios/graph?host=$HOSTNAME$&srv=$SERVICEDESC$' class='tips' rel='/pnp4nagios/popup?host=$HOSTNAME$&srv=$SERVICEDESC$
   register   0
}

Attention: It is not an error that the strings in front and after “class” contain only one quote.

Other than described in the 0.4.x documentation these templates can be used for Nagios 2.x and 3.x.

The variables in the files in the templates folder have to be initialised before first use. Example

$lower = ""

Earlier you were able to append to variables which weren't initialised before first use. Example:

foreach ($DS as $i) {
    $def[1] .= "DEF:var$i=$rrdfile:$DS[$i]:AVERAGE " ;

Now you have to change that to

$def[1] = "";
foreach ($DS as $i) {
    $def[1] .= "DEF:var$i=$rrdfile:$DS[$i]:AVERAGE " ;


Constants in template files don't work anymore, so that they have to be converted to variables.

define("_WARNRULE", '#FFFF00');

may be changed to

 $WARNRULE = '#FFFF00';

Please keep in mind that all occurrences have to be changed ;-).

Upgrade scenario using NPCD

  1. planning the new setup
  2. perform test installation and acquaint oneself with the new system
  3. create backup of the old installation
  4. install PNP 0.6.x at /usr/local/pnp4nagios
  5. make install-config
  6. make install-webconf
  7. reload Apache
  8. test Apache-config
    1. call of /pnp4nagios has to report an empty perfdata directory
  9. create /usr/local/pnp4nagios/etc/npcd.cfg from npcd.cfg-sample
    1. check paths and adapt changes from 0.4.x if necessary
  10. adjust all paths in nagios.cfg to the new PNP installation
  11. adjust all paths in the command definitions
  12. stop npcd using /etc/init.d/npcd stop
  13. make install-init installs the new init script for npcd
  14. /etc/init.d/nagios stop
  15. copy /usr/local/nagios/share/perfdata to /usr/local/pnp4nagios/var/perfdata. Attention: check the permissions
  16. /etc/init.d/npcd start
  17. /etc/init.d/nagios start
pnp4nagios-0.6.16/share/pnp/documents/en_US/install.html0000664000000000000000000001354411662503006021641 0ustar rootroot

Installation

The installation of PNP will be described in more detail. It is expected that nagios was compiled from source and is located in /usr/local/nagios.
Attention: The description applies to the developer version PNP 0.6.0.
Please note that PNP has to be configured after the installation.

Make and more

The installation of PNP is controlled by makefiles. The system is analyzed after invocation of ./configure and the detected values are tranferred to makefiles.

Please unpack PNP as user root:

tar -xvzf pnp4nagios-HEAD.tar.gz
cd pnp4nagios

./configure is to be called from the directory pnp4nagios.

./configure

Note: Without specifying any options user and group will be “nagios”. If you have different values then please use the parameters ”–with-nagios-user” and ”–with-nagios-group”, respectively. Using Icinga the call might be

./configure --with-nagios-user=icinga --with-nagios-group=icinga

Some lines run across the screen. The output at the end is important.

*** Configuration summary for pnp4nagios-0.6.2 23-12-2009 ***

  General Options:
  -------------------------         -------------------
  Nagios user/group:                nagios nagios
  Install directory:                /usr/local/pnp4nagios
  HTML Dir:                         /usr/local/pnp4nagios/share
  Config Dir:                       /usr/local/pnp4nagios/etc
  Location of rrdtool binary:       /usr/bin/rrdtool Version 1.2.12
  RRDs Perl Modules:                FOUND (Version 1.2012)
  RRD Files stored in:              /usr/local/pnp4nagios/var/perfdata
  process_perfdata.pl Logfile:      /usr/local/pnp4nagios/var/perfdata.log
  Perfdata files (NPCD) stored in:  /usr/local/pnp4nagios/var/spool

  Web Interface Options:  -------------------------         -------------------
  HTML URL:                         http://localhost/pnp4nagios/
  Apache Config File:               /etc/apache2/conf.d/pnp4nagios.conf


  Review the options above for accuracy.  If they look okay,
  type 'make all' to compile.

The paths shown should be checked. If the displayed values aren't correct you can change them calling ./configure with appropriate options.
Attention: “Location of rrdtool binary” means path including name of binary! If necessary it can be specified using the following syntax:

 ./configure --with-rrdtool=/usr/local/rrdtool-1.2.xx/bin/rrdtool
 ./configure --help 

shows the supported options.

Invoking

 make all

compiles the components like NPCD which are written in C

 make install

copies everything to the right places in the file system. The paths were already shows during ./configure.

After the installation of the program and HTML files you can copy a sample Apache configuration file to your web-server config directory

 make install-webconf

You can call

 make install-config

optionally. This way config files for process_perfdata.pl and npcd are copied to etc/pnp.

To install the NPCD Init script call

 make install-init

All these steps are combined in

 make fullinstall

Attention: After copying the configuration file for the web server you have to restart the web server (service httpd restart or /etc/init.d/apache2 restart, respectively).

Update

The update of a 0.6.x version works (nearly) the same way as an installation. Please note that you have to call ./configure with the same options you used during the first installation. Please check if you changed anything in the folder share/templates.dist. Own templates should be placed in share/templates to avoid being overwritten.
Attention: If you changed config.php then you should save this file before it is overwritten when you execute make install-config.

You can skip make install-webconf and make install-init because nothing changed between 0.6.x versions.

The components

After installation the components of PNP were copied to the appropriate places in the file system. These are

the PHP-Files for the web-frontend in

 /usr/local/pnp4nagios/share/pnp

the data collector process_perfdata.pl in

 /usr/local/pnp4nagios/libexec

sample config files with the suffix -sample in

 /usr/local/pnpnagios/etc

the config file config.php for the web frontend in

 /usr/local/pnp4nagios/etc

back to contents | configuration

pnp4nagios-0.6.16/share/pnp/documents/en_US/doc_complete.html0000664000000000000000000043312311662503006022627 0ustar rootroot

New in PNP 0.6.x

PNP 0.6.x Preview

The work on the new version 0.6.x is in full progress.

Starting with version 0.6.x we switch from subversion to GIT. The sourcecode is already available on sourceforge.

Functions implemented already

  • Webfrontend based on Kohana
  • Webfrontend based on jQuery Themes
  • Javascript-functions using jQuery plugins
  • process_perfdata.pl will be able to use one RRD database per datasource
  • improved installer. Specification of directory layouts using –with-layout
  • RRDtool errors are now displayed as images. no more missing images
  • PNP templates cannot overwrite internal variables anymore
  • PNP templates of version 0.4.x can still be used
  • PDF functions recoded
  • Template default.php optimized
  • Export from RRD databases into XML, CSV and JSON format using the RRDtool “xport” function
  • Page functions recoded
  • Error pages links to online FAQ
  • Mouseover Popup in Nagios frontend via jQuery.clueTip plugin
  • Full support of rrdcached

back to contents | system requirements

About PNP

System requirements

PNP mandatory requires valid performance data of nagios plugins.

So what is this performance data?

The output of a nagios plugin up to nagios 2.x is limited to one line. When the plugin produces performance data, it is divided into two parts. The pipe symbol (“|”) is used as a delimiter.

Example check_icmp :

 OK - 127.0.0.1: rta 2.687ms, lost 0% | rta=2.687ms;3000.000;5000.000;0; pl=0%;80;100;;

resulting in the text on the left side of the pipe symbol

 OK - 127.0.0.1: rta 2.687ms, lost 0%

and the performance data

  rta=2.687ms;3000.000;5000.000;0; pl=0%;80;100;;

Performance data is designed for automatic processing. The format is specified within the Developer Guidelines (you'll find an excerpt here) but should be exemplified here nonetheless:

  rta=2.687ms;3000.000;5000.000;0;
   |    |  |    |         |     | |
   |----|--|----|---------|-----|-|----- * label 
        |--|----|---------|-----|-|----- * current value
           |----|---------|-----|-|----- unit ( UOM = UNIT of Measurement ) 
                |---------|-----|-|----- warning threshold
                          |-----|-|----- critical threshold 
                                |-|----- minimum value 
                                  |----- maximum value
                                  

Value marked with * are mandatory. All other values are optional.

Several data series are separated by blanks. The actual data must not contains any blanks. If the label contains blanks, it has to be surrounded by single quotes.

Required Software

  • Perl >= 5.x without additional modules
  • RRDtool >= 1.x, better 1.2 but not compulsory
    Attention: installing RRDtool without a packet manager might lead to missing dejavu fonts. If you see graphs without text then this may be the cause.
  • PHP >= 5.1.6 for the Webfrontend based on Kohana
  • Nagios >= 2.x or Icinga
  • Kohana needs the module “mod_rewrite” to be enabled. For details please have a look at the documentation of your web-server specific to your distribution.

License

PNP is licensed under GPL 2

Download

Development of PNP is organized using Sourceforge.Net. PNP is registered under “PNP4nagios”.

The current stable version of 0.6.x can be found in the download area: Sourceforge Download

Starting with PNP 0.6.x the source code repository was switched from SVN to GIT.

The current development can be viewed anytime at http://pnp4nagios.git.sourceforge.net/. Clicking on PNP Devel version will download an archive containing the latest version.

Support

PRIOR to support questions please make sure that you have verified certain things described under verify your installation.

The developers and helpers are present on a separate board at http://www.nagios-portal.org and will be informed about new postings in the PNP-section. Postings in english will be answered as well.
After registering as a user please fill in the profile regarding operating system and PNP version used. Please mention if you used a package or compiled the sources. Please mark successfully solved threads by adding ”[solved]” to the title as it helps other users to find a solution for their problem.

The mailing lists on Sourceforge can be used to request support (and are limited to english):

pnp4nagios-users: users list for general questions regarding configuration. Please state your operating system and PNP version

pnp4nagios-devel: devel list for suggestions and error reports. Please state your operating system and PNP version

pnp4nagios-checkins: the checkin list automatically contains changes to the SVN repository

Storage

Performance data will be stored in Round Robin Databases using RRDtool. That means that after some time the oldest data will be dropped at the “end” and it will be replaced by new values “at the beginning”.

Various intervals provide for different resolutions. Using the defaults allows to store the data with a resolution of one minute for the last two days, five minutes resolution for ten days, 30 minutes resolution for 90 days and 6 hours resolution for four years. The increasing interval causes averaging of the data which leads to smaller max values. This not an error of PNP.

Using this storage format the size of the files will stay the same over time. Per datasource you will need approx. 400 KB.

Statistics and links to Sourceforge

The art of collecting data

PNP supports several modes to process performance data. The modes differ in complexity and the performance to be expected.

The following image shows the connections between Nagios, PNP and RRDtool

Nagios invokes a command for every host and every service whose performance data should be processed. Depending on the mode you choose the data will be passed to process_perfdata.pl or will be written to temporary files and processed at a later time. process_perfdata.pl writes the data to XML files and stores them in RRD files using RRDtool.

Before you choose a mode please read the documentation and decide which way will be the best for installation.

The modes in comparison

Synchronous Mode

The “synchronous mode” is the simplest and easiest to set up. Nagios will call the perl script process_perfdata.pl for every service and host, respectively, to process the data. The synchronous mode will work very good up to about 1.000 services in a 5 minute interval.

Bulk Mode

In bulk mode Nagios writes the necessary data to a temporary file. After expiration of a defined time the file will be processed in one piece and deleted afterwards.

The number of calls of process_perfdata.pl will be reduced to a fraction. Depending on time and the amount of collected data there will be much less system calls. Instead, process_perfdata.pl will run longer.

Note Using this mode you should keep an eye on the runtime of process_perfdata.pl. While it is running to process data nagios will not execute any checks.

snippet of var/perfdata.log:

2007-10-18 12:05:01 [21138] 71 Lines processed
2007-10-18 12:05:01 [21138] .../spool/service-perfdata-1192701894-PID-21138 deleted
2007-10-18 12:05:01 [21138] PNP exiting (runtime 0.060969s) ...

71 lines were processed in 0.06 seconds. This will be the data volume of about 2000 services und processing using a 10 second interval. It means we blocked nagios for exactly 0.06 seconds.

Bulk Mode with NPCD

Viewing from Nagios this is the best way of processing because Nagios will not be blocked.

Nagios again uses a temporary file to store the data and executes a command after expiration of a certain time. Instead of immediate processing by process_perfdata.pl the file is moved to a spool directory. As moving a file inside the same filesystem nearly takes no time nagios is able to execute crucial work immediately.

The NPCD daemon (Nagios Performance C Daemon) will monitor the directory for new files and will pass the names to process_perfdata.pl. Processing of performance data is decoupled completely from nagios. NPCD itself is able to start multiple thread for processing the data.

Bulk Mode with npcdmod

This scenario includes npcdmod.o, an NEB-module. This module reduces the configuration of the “Bulk Mode with NPCD” to a mere two lines in nagios.cfg

This mode is similar to “Bulk Mode with NPCD” and it is exactly the same functionality and the same performance.

Gearman Mode

Since version 0.6.12 PNP4Nagios can be driven as a gearman worker. This way large Nagios environments are possible using mod_gearman. Nagios and PNP4Nagios can be run on different machines.

You need a mod_gearman environment up and running like described by Sven Nierlein on http://labs.consol.de/lang/en/nagios/mod-gearman/.

The decision

Which mode you choose will depend on the size of your Nagios installation. You will find theses terms throughout the documentation.

back to contents | installation

PNP 0.6.x Downloads

Current stable PNP Version

Changes can be tracked on pnp4nagios.git.sourceforge.net

The current Version is pnp4nagios-0.6.15.tar.gz

Latest Devel Version

pnp4nagios-head.tar.gz

This is allways the latest GIT HEAD Version


Last Update: Mon Nov 21 10:05:01 CET 2011

ChangeLog

pnp-0.6.16 ??/??/2011

  • Bugfix: Fixed single quoted check_multi labels (Reported by Matthias Flacke)
  • Bugfix: Append missing slash to perfdata_spool_dir ( Reported by Juergen-Michael Radtke )
  • Bugfix: Fixed jQuery-ui multisite theme
  • Feature: PDF margins are now adjustable via config.php ( Thomas Witzenrath )
  • Featire: Support for PDF size 'letter' added ( Robert Becht )

pnp-0.6.15 09/15/2011

  • Bugfix: Fixed Overview link (reported by Stefan Triep)
  • Bugfix: Fixed zoom popup (reported by Rudolf Labuschagne)
  • Bugfix: Fixed double urlencode() (reported by Mathias Kettner)
  • Feature: “Clear basket” button added (suggested by Stefan Triep)
  • Feature: New helper function “rrd::alerter_gr()” ( committed by Stefan Trip )

pnp-0.6.14 08/05/2011

  • Feature: Webinterface for mobile devices based on jQuery Mobile
    ( http://jquerymobile.com/ )
  • Feature: Zoom based on jQuery plugin imgAreaSelect
    ( http://odyniec.net/projects/imgareaselect/ )
  • Feature: New template check_mssql_health.php
  • Bugfix: Fixed popups to work under nginx ( Joram Agten )
  • Bugfix: Helper rrd::vdef() fixed
  • Update: jQuery update to 1.6.2
  • Update: jQuery-ui update to 1.8.14

pnp-0.6.13 05/19/2011

  • Feature: New option –ignore-hosts added to check_pnp_rrds.pl ( by Jochen Bern )
  • Feature: New options zgraph_width and zgraph_height in config.php ( Mike Liebsch )
  • Bugfix: rrd_convert.pl: parse_xml_filename() regex fix
  • Info: Version used by OMD-0.48 OMD

pnp-0.6.12 04/22/2011

  • Feature: mod_gearman support added
  • Feature: rrd_convert.pl is now able to convert all RRDs from RRD_STORAGE_TYPE=SINGLE to RRD_STORAGE_TYPE=MULTIPLE
  • Feature: New template check_gearman.php
  • Feature: Install process_perfdata.cfg and npcd.cfg by default
  • Bugfix: rrd_convert.pl is now able to parse xml dumps created by rrdtool 1.4.x
  • Bugfix: process_perfdata.pl default timeout value set to 15 seconds

pnp-0.6.11 01/15/2011

  • Bugfix: urldecoding fixed
  • Bugfix: Zoom in/out is working again ( Reported by Thorben Soehl )
  • Featue: npcd.cfg - New option perfdata_file_processing_interval used by npcdmod
  • Info: Version used by OMD-0.46 OMD

pnp-0.6.10 12/15/2010

  • Feature: Add RRDTool Option –only-graph if graph height is below 32px to create thumbnails
  • Feature: RRDTool Option –width and –height is now allowed in templates
  • Feature: RRDTool DS Type for UOM of “c” changed from COUNTER to DERIVE
  • Feature: Pass query string from special controller to image controller ( Matthew Garrett )
  • Feature: Authorisation against mk_livestatus API added
  • Feature: Sample nginx webserver config added ( by evax@users.sourceforge.net )
  • Feature: Kohana backport to support PHP 5.1.6 ( Kudos to Andreas Ericsson )
  • Bugfix: Sort list of special templates
  • Bugfix: Urlencode hostname and service description ( Reported by Yannick )
  • Bugfix: corrected warning/critical thresholds in ticker/alerter functions

pnp-0.6.7 09/27/2010

  • Bugfix: Page config parser fix (Beau Gunderson)
  • Bugfix: Zoom window size fixed (Report by Rudolf Labuschagne)
  • Bugfix: Fixed undefined offset while using 'ds_name' in templates (Reported by Vladimir Bilik)
  • Bugfix: Npcdmod respects process_perf_data option used in hosts and services definitions ( Reported by Wolfgang Barth )
  • Template: New Template check_nagiostats.php used with check_nagiostats written by Jochen Bern

pnp-0.6.6 08/07/2010

  • Bugfix: Fixed max amount of graphs per template
  • Bugfix: Autodetect PNP base URL
  • Bugfix: Too short npcdmod perfdata_template to take perfdata + overhead, increased +1024byte
  • Bugfix: Ignore files in var/perfdata and check for empty directories
  • Bugfix: Reducing memory usage while parsing page config (Laurent Freval)

pnp-0.6.5 07/09/2010

  • Feature: Special Templates are back tpl_special
  • Feature: New rrdtool helper functions makes template design easier tpl_helper
  • Feature: config.php → 'recursive_template_search' is enabled by default
  • Feature: config.php → 'template_dirs' is now an array of directorys to search for PNP templates

pnp-0.6.4 06/03/2010

  • Update: jQuery Update to 1.4.2
  • Update: jQuery-ui Update to 1.8
  • Feature: New configure Option –with-base-url
  • Template: New template check_ntp_time.php (Mathias Kettner)
  • Feature: New i18n files for fr_FR (Yannig Parre)
  • Feature: New jQuery Theme 'multisite'

pnp-0.6.3 03/16/2010

  • Feature: New helper script libexec/rrd_convert.pl → rrd_convert
  • Bugfix: Ignore old XML files while building the service list
  • Template: New template check_hpasm.php
  • Bugfix: Installer now checks for json_decode()
  • Workaround: Allow “trailing unfilled semicolons”. Workaround for nsclient++
  • Template: Updates for check_openmanage.php, check_hp_bladecenter.php and check_dell_baldecenter.php ( Trond Hasle Amundsen )”

pnp-0.6.2 12/23/2009

  • Feature: XML_WRITE_DELAY option added to process_perfdata.cfg as suggested by Mathias Kettner
  • Feature: New template integer.php
  • Update: FPDI update to 1.3.1
  • Feature: PNP will now work with lighttpd and php-cgi
  • Template: check_mk-ps.perf.php added ( by Mathias Kettner )
  • Feature: PNP will now work without mod_rewrite → webfe
  • Bugfix: Wrong pdf link used on site 'pages' and 'basket'
  • Bugfix: Incorrect group permissions on spool directory

pnp-0.6.1 11/22/2009

  • Feature: RRD heartbeat per check_command → tpl_custom
  • Feature: New config.php option pdf_graph_opt
  • Feature: Recognize the 'background_pdf' option in page definitions → pages
  • Feature: Recognize the 'source' option in page definitions → pages
  • Feature: Array $TIMERANGE now available for templates → timeranges
  • Bugfix: ./configure –sysconfdir no longer ignored
  • Feature: Store internal runtime statistics on a per minute base
  • Feature: Added two widgets views/widget_menu.php and views/widget_graph.php

pnp-0.6.0 10/30/2009

  • Webfrontend based on Kohana
  • Webfrontend based on jQuery Themes
  • Javascript-functions using jQuery plugins
  • process_perfdata.pl will be able to use one RRD database per datasource
  • improved installer. Specification of directory layouts using –with-layout
  • RRDtool errors are now displayed as images. no more missing images
  • PNP templates cannot overwrite internal variables anymore
  • PNP templates of version 0.4.x can still be used
  • PDF functions recoded
  • Template default.php optimized
  • Export from RRD databases into XML, CSV and JSON format using the RRDtool “xport” function
  • Page functions recoded
  • Error pages links to online FAQ
  • Mouseover Popup in Nagios frontend via jQuery.clueTip plugin
  • Full support of rrdcached

Upgrade to version 0.6.x

The web-frontend has been completely rewritten and is now based on the PHP MVC framework Kohana. This leads to changed dependencies which must be checked prior to installation.

Note: At first an upgrade is like a new installation. Afterwards some changes should be made which are described further down.

Without specifying any options during ./configure PNP 0.4.x was installed below an existing Nagios-Installation at /usr/local/nagios.

Without specifying any options during ./configure PNP 0.6.x will be installed in a separate directory at /usr/local/pnp4nagios, i.e. it should be viewed as an independent application.

Note: It is sufficient to copy the *.rrd files from the old to the new location. They contain the data The *.xml files are recreated every time new performance data arrives as they contain meta information. The internal structure of the xml files has changed so you wouldn't be able to use them either way.

Comparison of the structure

Summary of a PNP 0.4.14 installation

./configure
...
*** Configuration summary for pnp 0.4.14 05-02-2009 ***

  General Options:
  -------------------------         -------------------
  Nagios user/group:                nagios nagios
  Install directory:                /usr/local/nagios
  HTML Dir:                         /usr/local/nagios/share/pnp
  Config Dir:                       /usr/local/nagios/etc/pnp
  Location of rrdtool binary:       /usr/bin/rrdtool Version 1.3.1
  RRDs Perl Modules:                FOUND (Version 1.3001)
  RRD Files stored in:              /usr/local/nagios/share/perfdata
  process_perfdata.pl Logfile:      /usr/local/nagios/var/perfdata.log
  Perfdata files (NPCD) stored in:  /usr/local/nagios/var/spool/perfdata/

Summary of a PNP 0.6.0 installation

./configure
...
*** Configuration summary for pnp4nagios-0.6.0 07-30-2009 ***

  General Options:
  -------------------------         -------------------
  Nagios user/group:                nagios nagios
  Install directory:                /usr/local/pnp4nagios
  HTML Dir:                         /usr/local/pnp4nagios/share
  Config Dir:                       /usr/local/pnp4nagios/etc
  Location of rrdtool binary:       /usr/bin/rrdtool Version 1.3.1
  RRDs Perl Modules:                FOUND (Version 1.3001)
  RRD Files stored in:              /usr/local/pnp4nagios/var/perfdata
  process_perfdata.pl Logfile:      /usr/local/pnp4nagios/var/perfdata.log
  Perfdata files (NPCD) stored in:  /usr/local/pnp4nagios/var/spool

  Web Interface Options:  -------------------------         -------------------
  HTML URL:                         http://localhost/pnp4nagios/
  Apache Config File:               /etc/apache2/conf.d/pnp4nagios.conf

Looking at these lines result in the parameters to be changed and the upgrade strategy.

Adjustments

The templates of the action_url definitions have changed. Instead of ”/nagios/pnp” the URL should be ”/pnp4nagios” and instead of “index.php” now “graph” will be used.

define host {
  name       host-pnp
  register   0
  action_url /pnp4nagios/graph?host=$HOSTNAME$
}

define service {
  name       srv-pnp
  register   0
  action_url /pnp4nagios/graph?host=$HOSTNAME$&srv=$SERVICEDESC$
}

The definitions for the preview popup function are similar

define host {
   name       host-pnp
   action_url /pnp4nagios/index.php/graph?host=$HOSTNAME$&srv=_HOST_' class='tips' rel='/pnp4nagios/index.php/popup?host=$HOSTNAME$&srv=_HOST_
   register   0
}

define service {
   name       srv-pnp
   action_url /pnp4nagios/graph?host=$HOSTNAME$&srv=$SERVICEDESC$' class='tips' rel='/pnp4nagios/popup?host=$HOSTNAME$&srv=$SERVICEDESC$
   register   0
}

Attention: It is not an error that the strings in front and after “class” contain only one quote.

Other than described in the 0.4.x documentation these templates can be used for Nagios 2.x and 3.x.

The variables in the files in the templates folder have to be initialised before first use. Example

$lower = ""

Earlier you were able to append to variables which weren't initialised before first use. Example:

foreach ($DS as $i) {
    $def[1] .= "DEF:var$i=$rrdfile:$DS[$i]:AVERAGE " ;

Now you have to change that to

$def[1] = "";
foreach ($DS as $i) {
    $def[1] .= "DEF:var$i=$rrdfile:$DS[$i]:AVERAGE " ;


Constants in template files don't work anymore, so that they have to be converted to variables.

define("_WARNRULE", '#FFFF00');

may be changed to

 $WARNRULE = '#FFFF00';

Please keep in mind that all occurrences have to be changed ;-).

Upgrade scenario using NPCD

  1. planning the new setup
  2. perform test installation and acquaint oneself with the new system
  3. create backup of the old installation
  4. install PNP 0.6.x at /usr/local/pnp4nagios
  5. make install-config
  6. make install-webconf
  7. reload Apache
  8. test Apache-config
    1. call of /pnp4nagios has to report an empty perfdata directory
  9. create /usr/local/pnp4nagios/etc/npcd.cfg from npcd.cfg-sample
    1. check paths and adapt changes from 0.4.x if necessary
  10. adjust all paths in nagios.cfg to the new PNP installation
  11. adjust all paths in the command definitions
  12. stop npcd using /etc/init.d/npcd stop
  13. make install-init installs the new init script for npcd
  14. /etc/init.d/nagios stop
  15. copy /usr/local/nagios/share/perfdata to /usr/local/pnp4nagios/var/perfdata. Attention: check the permissions
  16. /etc/init.d/npcd start
  17. /etc/init.d/nagios start

Installation

The installation of PNP will be described in more detail. It is expected that nagios was compiled from source and is located in /usr/local/nagios.
Attention: The description applies to the developer version PNP 0.6.0.
Please note that PNP has to be configured after the installation.

Make and more

The installation of PNP is controlled by makefiles. The system is analyzed after invocation of ./configure and the detected values are tranferred to makefiles.

Please unpack PNP as user root:

tar -xvzf pnp4nagios-HEAD.tar.gz
cd pnp4nagios

./configure is to be called from the directory pnp4nagios.

./configure

Note: Without specifying any options user and group will be “nagios”. If you have different values then please use the parameters ”–with-nagios-user” and ”–with-nagios-group”, respectively. Using Icinga the call might be

./configure --with-nagios-user=icinga --with-nagios-group=icinga

Some lines run across the screen. The output at the end is important.

*** Configuration summary for pnp4nagios-0.6.2 23-12-2009 ***

  General Options:
  -------------------------         -------------------
  Nagios user/group:                nagios nagios
  Install directory:                /usr/local/pnp4nagios
  HTML Dir:                         /usr/local/pnp4nagios/share
  Config Dir:                       /usr/local/pnp4nagios/etc
  Location of rrdtool binary:       /usr/bin/rrdtool Version 1.2.12
  RRDs Perl Modules:                FOUND (Version 1.2012)
  RRD Files stored in:              /usr/local/pnp4nagios/var/perfdata
  process_perfdata.pl Logfile:      /usr/local/pnp4nagios/var/perfdata.log
  Perfdata files (NPCD) stored in:  /usr/local/pnp4nagios/var/spool

  Web Interface Options:  -------------------------         -------------------
  HTML URL:                         http://localhost/pnp4nagios/
  Apache Config File:               /etc/apache2/conf.d/pnp4nagios.conf


  Review the options above for accuracy.  If they look okay,
  type 'make all' to compile.

The paths shown should be checked. If the displayed values aren't correct you can change them calling ./configure with appropriate options.
Attention: “Location of rrdtool binary” means path including name of binary! If necessary it can be specified using the following syntax:

 ./configure --with-rrdtool=/usr/local/rrdtool-1.2.xx/bin/rrdtool
 ./configure --help 

shows the supported options.

Invoking

 make all

compiles the components like NPCD which are written in C

 make install

copies everything to the right places in the file system. The paths were already shows during ./configure.

After the installation of the program and HTML files you can copy a sample Apache configuration file to your web-server config directory

 make install-webconf

You can call

 make install-config

optionally. This way config files for process_perfdata.pl and npcd are copied to etc/pnp.

To install the NPCD Init script call

 make install-init

All these steps are combined in

 make fullinstall

Attention: After copying the configuration file for the web server you have to restart the web server (service httpd restart or /etc/init.d/apache2 restart, respectively).

Update

The update of a 0.6.x version works (nearly) the same way as an installation. Please note that you have to call ./configure with the same options you used during the first installation. Please check if you changed anything in the folder share/templates.dist. Own templates should be placed in share/templates to avoid being overwritten.
Attention: If you changed config.php then you should save this file before it is overwritten when you execute make install-config.

You can skip make install-webconf and make install-init because nothing changed between 0.6.x versions.

The components

After installation the components of PNP were copied to the appropriate places in the file system. These are

the PHP-Files for the web-frontend in

 /usr/local/pnp4nagios/share/pnp

the data collector process_perfdata.pl in

 /usr/local/pnp4nagios/libexec

sample config files with the suffix -sample in

 /usr/local/pnpnagios/etc

the config file config.php for the web frontend in

 /usr/local/pnp4nagios/etc

back to contents | configuration

Configuration

The configuration of the already mentioned modes of performance data processing will be described in more detail.

Synchronous Mode

The synchronous mode is the simplest way to integrate the data collector process_perfdata.pl into nagios. Every event will trigger an execution of process-service-perfdata.

Initially you have to enable processing of performance data in nagios.cfg. Please note that this directive might already exist in the config file. Default is “0”.

 process_performance_data=1

Data processing has to be disabled in the definition of every host or service whose performance data should NOT be processed.

define service {
   ...
   process_perf_data 0
   ...
}

Since Nagios 3.x it is possible to deactivate the export of environment variables (as part of optimizing the system for maximum performance). Unfortunately this directive has to be enabled to use the synchronous mode. So either you use the default value (which means that the export is enabled) or you define the variable in nagios.cfg

enable_environment_macros=1

Additionally the command to process performance data is to be specified in nagios.cfg

 service_perfdata_command=process-service-perfdata

Starting with Nagios 3.0 it may be useful to enable processing of performance data for hosts as well. Due to changed host check logic Nagios 3 now performs regularly scheduled host checks.

 host_perfdata_command=process-host-perfdata

Nagios has to be notified about the referenced commands as well. If you used the quickstart installation guides for Nagios you can modify the definitions in commands.cfg. You can see that calling process_perfdata.pl doesn't require any arguments apart from specifing the option -d ( DATATYPE ) if you want to process performance data resulting from host checks.

define command {
       command_name    process-service-perfdata
       command_line    /usr/bin/perl /usr/local/pnp4nagios/libexec/process_perfdata.pl
}

define command {
       command_name    process-host-perfdata
       command_line    /usr/bin/perl /usr/local/pnp4nagios/libexec/process_perfdata.pl -d HOSTPERFDATA
}

Note process_perfdata.pl cannot be started under control of ePN ( embedded Perl Nagios ). Therefore the script is explicitly called using /usr/bin/perl ( or where you perl binary is located ). If you use Nagios 3.x or do not use ePN there is no need to specify /usr/bin/perl.

Bulk Mode

Bulk mode is a bit more complicated than the synchronous mode but reduces the load on the nagios server significantly because the data collector process_perfdata.pl is not invoked for every service/host check.

In bulk mode Nagios writes the data to a temporary file in a defined format. This file is processed by process_perfdata.pl at certain intervals. Nagios will take care for starting and running it periodically.

Processing of performance data has to be enabled in nagios.cfg

 process_performance_data=1

Additionally some new directives are required

#
# service performance data
#
service_perfdata_file=/usr/local/pnp4nagios/var/service-perfdata
service_perfdata_file_template=DATATYPE::SERVICEPERFDATA\tTIMET::$TIMET$\tHOSTNAME::$HOSTNAME$\tSERVICEDESC::$SERVICEDESC$\tSERVICEPERFDATA::$SERVICEPERFDATA$\tSERVICECHECKCOMMAND::$SERVICECHECKCOMMAND$\tHOSTSTATE::$HOSTSTATE$\tHOSTSTATETYPE::$HOSTSTATETYPE$\tSERVICESTATE::$SERVICESTATE$\tSERVICESTATETYPE::$SERVICESTATETYPE$
service_perfdata_file_mode=a
service_perfdata_file_processing_interval=15
service_perfdata_file_processing_command=process-service-perfdata-file

#
# host performance data starting with Nagios 3.0
# 
host_perfdata_file=/usr/local/pnp4nagios/var/host-perfdata
host_perfdata_file_template=DATATYPE::HOSTPERFDATA\tTIMET::$TIMET$\tHOSTNAME::$HOSTNAME$\tHOSTPERFDATA::$HOSTPERFDATA$\tHOSTCHECKCOMMAND::$HOSTCHECKCOMMAND$\tHOSTSTATE::$HOSTSTATE$\tHOSTSTATETYPE::$HOSTSTATETYPE$
host_perfdata_file_mode=a
host_perfdata_file_processing_interval=15
host_perfdata_file_processing_command=process-host-perfdata-file

Attention: Please note that these template definitions differ from the ones delivered in nagios.cfg!

The directives and their meaning:

  • service_perfdata_file path to the temporary file which should contain the performance data.
  • service_perfdata_file_template format of the temporary file. Data will be defined using Nagios macros.
  • service_perfdata_file_mode option “a” specifies that data is to be appended to the file.
  • service_perfdata_file_processing_interval the interval is 15 seconds
  • service_perfdata_file_processing_command the command to be called during the interval.

The used commands have to be announced to Nagios. If you used the quickstart installation guides for Nagios you can modify the definitions in commands.cfg.

define command{
       command_name    process-service-perfdata-file
       command_line    /usr/local/pnp4nagios/libexec/process_perfdata.pl --bulk=/usr/local/pnp4nagios/var/service-perfdata
}

define command{
       command_name    process-host-perfdata-file
       command_line    /usr/local/pnp4nagios/libexec/process_perfdata.pl --bulk=/usr/local/pnp4nagios/var/host-perfdata
}

NOTE:

Because there is more data to process than in synchronous mode process_perfdata.pl will take longer to do this so you should check the TIMEOUT value in etc/process_perfdata.cfg and adjust it appropriately.

Bulk Mode with NPCD

The configuration is identical to the Bulk Mode except for the used command. Processing of performance data has to be enabled in nagios.cfg

 process_performance_data=1

Additionally some new directives are required

#
# service performance data
#
service_perfdata_file=/usr/local/pnp4nagios/var/service-perfdata
service_perfdata_file_template=DATATYPE::SERVICEPERFDATA\tTIMET::$TIMET$\tHOSTNAME::$HOSTNAME$\tSERVICEDESC::$SERVICEDESC$\tSERVICEPERFDATA::$SERVICEPERFDATA$\tSERVICECHECKCOMMAND::$SERVICECHECKCOMMAND$\tHOSTSTATE::$HOSTSTATE$\tHOSTSTATETYPE::$HOSTSTATETYPE$\tSERVICESTATE::$SERVICESTATE$\tSERVICESTATETYPE::$SERVICESTATETYPE$
service_perfdata_file_mode=a
service_perfdata_file_processing_interval=15
service_perfdata_file_processing_command=process-service-perfdata-file

#
# host performance data starting with Nagios 3.0
# 
host_perfdata_file=/usr/local/pnp4nagios/var/host-perfdata
host_perfdata_file_template=DATATYPE::HOSTPERFDATA\tTIMET::$TIMET$\tHOSTNAME::$HOSTNAME$\tHOSTPERFDATA::$HOSTPERFDATA$\tHOSTCHECKCOMMAND::$HOSTCHECKCOMMAND$\tHOSTSTATE::$HOSTSTATE$\tHOSTSTATETYPE::$HOSTSTATETYPE$
host_perfdata_file_mode=a
host_perfdata_file_processing_interval=15
host_perfdata_file_processing_command=process-host-perfdata-file

Attention: Please note that these template definitions differ from the ones delivered in nagios.cfg!

The directives and their meaning:

  • service_perfdata_file path to the temporary file which should contain the performance data.
  • service_perfdata_file_template format of the temporary file. Data will be defined using Nagios macros.
  • service_perfdata_file_mode option “a” specifies that data is to be appended to the file.
  • service_perfdata_file_processing_interval the interval is 15 seconds
  • service_perfdata_file_processing_command the command to be called during the interval.

The used commands have to be announced to Nagios. If you used the quickstart installation guides for Nagios you can modify the definitions in commands.cfg.

define command{
       command_name    process-service-perfdata-file
       command_line    /bin/mv /usr/local/pnp4nagios/var/service-perfdata /usr/local/pnp4nagios/var/spool/service-perfdata.$TIMET$
}

define command{
       command_name    process-host-perfdata-file
       command_line    /bin/mv /usr/local/pnp4nagios/var/host-perfdata /usr/local/pnp4nagios/var/spool/host-perfdata.$TIMET$
}

Using these commands the file service-perfdata will be moved to var/spool/ after the interval specified in service_perfdata_file_processing_interval has passed. The Nagios macro $TIMET$ is appended to the filename to avoid overwriting of old files unintentionally. The macro $TIMET$ contains the current timestamp in time_t format (seconds since the UNIX epoch).

In the directory /usr/local/pnp4nagios/var/spool/ files are gathered to be processed by NPCD.

NPCD monitors the spool directory and passes the file names to process_perfdata.pl. This way processing of performance data is completely decoupled from nagios.

Before starting NPCD you have to check the paths to the spool directory and to process_perfdata.pl specified in the config file npcd.cfg. The only thing that remains is to start NPCD.

 /usr/local/pnp4nagios/bin/npcd -d -f /usr/local/pnp4nagios/etc/npcd.cfg

The option -d starts NPCD as a daemon in the background.

Bulk Mode with NPCD and npcdmod

This mode uses the event broker module npcdmod.o. The flow of data is identical to “bulk mode with NPCD”. The internal perfdata routines of Nagios activated by the “*_perf_data_*” directives in nagios.cfg are *NOT* used anymore. The module npcdmod.o takes over the task of processing the data required by PNP.

Pro:

  • The perfdata routines can now be used for other addons.
  • The configuration is easier.
  • It is the preferred mode of the PNP developers.

Adjustments in nagios.cfg:

process_performance_data=1
broker_module=/usr/local/pnp4nagios/lib/npcdmod.o config_file=/usr/local/pnp4nagios/etc/npcd.cfg

All other directives mentioned on this page must NOT be used.

Attention: If you have changed the value of event_broker_options from -1 to another value then please note that PNP needs the bits 2 and 3 set (0b01100). Make sure that the resultung value has these bits set because otherwise there will be no performance data to process.

After restarting Nagios information regarding the start of the module will be logged.

Excerpt from nagios.log

[1277545053] npcdmod: Copyright (c) 2008-2009 Hendrik Baecker (andurin@process-zero.de) - http://www.pnp4nagios.org
[1277545053] npcdmod: /usr/local/pnp4nagios/etc/npcd.cfg initialized
[1277545053] npcdmod: spool_dir = '/usr/local/pnp4nagios/var/spool/'.
[1277545053] npcdmod: perfdata file '/usr/local/pnp4nagios/var/perfdata.dump'.
[1277545053] npcdmod: Ready to run to have some fun!
[1277545053] Event broker module '/usr/local/pnp4nagios/lib/npcdmod.o' initialized successfully.

Gearman Mode

Since version 0.6.12 PNP4Nagios can be driven as a gearman worker. This way large Nagios environments are possible using mod_gearman. Nagios and PNP4Nagios can be run on different machines.

You need a mod_gearman environment up and running like described by Sven Nierlein on http://labs.consol.de/lang/en/nagios/mod-gearman/.

You'll find a section on gearman in etc/process_perfdata.cfg:

PREFORK = 0
GEARMAN_HOST = localhost:4730
REQUESTS_PER_CHILD = 10000
ENCRYPTION = 1
KEY = should_be_changed
#KEY_FILE = /usr/local/pnp4nagios/etc/secret.key

Using PREFORK = <n> you specify the number of additional(!) child processes. Specify “0” only a parent process is started.
GEARMAN_HOST = <host>:<port> specifies host and port of the server running the gearman daemon providing the data.
REQUEST_PER_CHILD = <n> enables you to define the number of requests processed per process.
ENCRYPTION = <n> specifies whether to use encryption (“1”) or not. Default is an activated encyrption which should be changed only in special cases. You can either use KEY = <key phrase> or 'KEYFILE =<key file> to specify the location of a file containing the key phrase. etc/init.d/pnp_gearman_worker start contains links to the perl script process_perfdata.pl and the config file process_perfdata.cfg. After starting the daemon process using /etc/init.d/pnp_gearmon_worker start the performance data will be processed which is provided by the gearmand daemon on the Nagios server.

back to contents | checking the functionality

Checking the installation

If everything went well until now you can try to call PNP using your web browser. When using the installation with default values PNP should be called using http://<server name>/pnp4nagios/. The first time you will see a page “PNP4Nagios Environment Tests” which includes different checks of necessary components. Obviously all checks have to be passed successfully before you can proceed. Please follow the instructions given on that page.

If all tests have passed *successfully* the file pnp4nagios/share/install.php can be deleted or renamed. Not till then the web interface is reachable.

Alternatively you can create a file called pnp4nagios/share/install.ignore which will prevent the call of the installer after further updates.

If you receive the message “PHP magic_quotes_gpc is deprecated” then please locate your php.ini and set the value to Off.

Called without any arguments PNP looks for RRD and XML files in pnp4nagios/var/perfdata and shows all graphs of the first host.

ATTENTION: Immediately after (re-)starting Nagios after you enabled the processing of performance data you will get error messages in your browser because performance data has to be collected and stored in RRD files. Depending on the check interval you are using you have to wait some time before you can view the first graphs.

Debug Logfile

Calling make install-config during installation will create a sample config file etc/process_perfdata.cfg-sample. The values in the sample file will correspond to the defaults used by process_perfdata.pl so normally you do not have a file called process_perfdata.cfg while running the procedure.
However you can influence the way process_perfdata.pl works by changing options which have to be specified in process_perfdata.cfg.

The most important options launching PNP are LOG_LEVEL and LOG_FILE. We recommend setting the LOG_LEVEL value to “2” so you can track what process_perfdata.pl will do. Most likely we will ask for excerpts from perfdata.log if you open a support request on the mailing lists as well as the output of the verify_pnp_config script so please provide them ;-).

During normal operation the debug level should be set to 0 to avoid performance issues due to unnecessary entries in the log file.

Something went wrong

Some basic settings should be checked

1. Have any RRD and XML files been created? process_perfdata.pl will create a new directory under pnp/perfdata for every host. In this directory an RRD database and an XML file will be created for every service. The host data will be stored in _HOST_.xml and _HOST_.rrd respectively.
If graphing stops out of a sudden then open the appropriate XML file. There are two tags called <RC> and <TXT>. <RC> shows the return code of the RRDtool update and <TXT> a textual description.
Sometimes you have to specify additional options so that performance data is produced. In some cases a wrapper script might help.
However not all checks provide performance data. That applies - among others - to “check_ping” in contrast to “check_icmp” which does provide data (starting with Nagios plugin version 1.4.12 check_ping does provide performance data).
Using the web interface the detail information of hosts/services shows a field “Performance Data”. If it is empty there is no data available so no files are written to the appropriate directory and that is why PNP does not provide you with graphs!
The following image shows the information of a “PING” service. The output of the plugin is surrounded by a blue border, the performance data by a red one.
status information

2. Has nagios called process_perfdata.pl? In the config file for process_perfdata.pl (etc/process_perfdata.cfg) you can increase the debug level. Data processing will be logged in var/perfdata.log.

3. Graphs are shown without text? Have a look at the requirements.

4. Using the npcdmod module the value of the nagios.cfg directive event_broker_options may have to be adapted if it was modified. You'll find some details here.

5. You can use the script verify_pnp_config.pl in the scripts directory of the installation folder or the libexec folder after installation to check your settings and if performance data is present and/or valid. The syntax is quite simple for that:

./verify_pnp_config.pl -m <mode>

whereas <mode> is one of “sync”, “bulk” or “npcd” (without quotes). Please note that using “default” will select “npcd” which is different from the behaviour in PNP 0.4.x.

back to contents | verify_pnp_config.pl

verify_pnp_config

In case of problems there is a script called verify_pnp_config.pl located on http://verify.pnp4nagios.org. It enables you to check the configuration settings as well as performance data of hosts or services. It can be used prior and during runtime of PNP.

Download

wget http://verify.pnp4nagios.org/verify_pnp_config

Test

The verify script is located on http://verify.pnp4nagios.org an needs three start options

  • –mode One of the modes described on modeds
  • –config Path nagios.cfg or icinga.cfg
  • –pnpcfg Path to PNP´s etc directory
lenny:~# perl verify_pnp_config --mode npcdmod --config=/usr/local/nagios/etc/nagios.cfg --pnpcfg=/usr/local/pnp4nagios/etc
[INFO]  ========== Starting Environment Checks ============
[INFO]  My version is: verify_pnp_config-0.6.14-R.31
[INFO]  Reading /usr/local/nagios/etc/nagios.cfg
[OK  ]  Running product is 'nagios'
[OK  ]  object_cache_file is defined
[OK  ]  object_cache_file=/usr/local/nagios/var/objects.cache
[INFO]  Reading /usr/local/nagios/var/objects.cache
[OK  ]  resource_file is defined
[OK  ]  resource_file=/usr/local/nagios/etc/resource.cfg
[INFO]  Reading /usr/local/nagios/etc/resource.cfg
[INFO]  Reading /usr/local/pnp4nagios/etc/process_perfdata.cfg
[INFO]  Reading /usr/local/pnp4nagios/etc/pnp4nagios_release
[OK  ]  Found PNP4Nagios version "0.6.14"
[OK  ]  Effective User is 'nagios'
[OK  ]  User nagios exists with ID '1000'
[OK  ]  Effective group is 'nagios'
[OK  ]  Group nagios exists with ID '1000'
[INFO]  ========== Checking npcdmod Mode Config  ============
[OK  ]  process_performance_data is 1 compared with '/1/'
[OK  ]  event_broker_options is defined
[OK  ]  event_broker_options=-1
[OK  ]  event_broker_option bits 2 and 3 enabled (12)
[OK  ]  broker_module is defined
[OK  ]  broker_module=/usr/local/pnp4nagios/lib/npcdmod.o config_file=/usr/local/pnp4nagios/etc/npcd.cfg
[OK  ]  npcdmod.o config file is /usr/local/pnp4nagios/etc/npcd.cfg
[OK  ]  /usr/local/pnp4nagios/etc/npcd.cfg used by npcdmod.o is readable
[OK  ]  npcd daemon is running
[OK  ]  /usr/local/pnp4nagios/etc/npcd.cfg is used by npcd and readable
[OK  ]  npcd and npcdmod.o are using the same config file (/usr/local/pnp4nagios/etc/npcd.cfg)
[INFO]  Nagios config looks good so far
[INFO]  ========== Checking config values ============
[INFO]  Reading /usr/local/pnp4nagios/etc/npcd.cfg
[OK  ]  Script /usr/local/pnp4nagios/libexec/process_perfdata.pl is executable
[INFO]  ========== Starting global checks ============
[OK  ]  status_file is defined
[OK  ]  status_file=/dev/shm/status.dat
[INFO]  Reading /dev/shm/status.dat
[INFO]  ==== Starting rrdtool checks ====
[OK  ]  RRDTOOL is defined
[OK  ]  RRDTOOL=/usr/bin/rrdtool
[OK  ]  /usr/bin/rrdtool is executable
[OK  ]  RRDtool 1.3.1  Copyright 1997-2008 by Tobias Oetiker <tobi@oetiker.ch>
[OK  ]  USE_RRDs is defined
[OK  ]  USE_RRDs=1
[OK  ]  Perl RRDs modules are loadable
[INFO]  ==== Starting directory checks ====
[OK  ]  RRDPATH is defined
[OK  ]  RRDPATH=/usr/local/pnp4nagios/var/perfdata
[OK  ]  Perfdata directory '/usr/local/pnp4nagios/var/perfdata' exists
[WARN]  62 hosts/services are not providing performance data
[WARN]  'process_perf_data 1' is set for 43 hosts/services which are not providing performance data!
[WARN]  'process_perf_data 0' is set for 27 of your hosts/services
[OK  ]  'process_perf_data 1' is set for 243 of your hosts/services
[INFO]  ==== System sizing ====
[OK  ]  269 hosts/service objects defined
[INFO]  ==== Check statistics ====
[WARN]  Warning: 3, Critical: 0
[WARN]  Checks finished...

Nagios web frontend

Of course PNP should be easily accessible. You do not want to search long for the right graph.

Nagios itself features external URLs using so called extended info configs. Due to changes between Nagios 2.x and Nagios 3.x both versions are described.

Nagios 2.x

With Nagios 2.x the integration of external URLs into the nagios web interface is made using Extended Info Objects for services. For PNP we use the directive action_url to call the PNP web frontend with the appropriate options.

define serviceextinfo {
   host_name             localhost
   service_description   load
   action_url            /pnp4nagios/index.php/graph?host=$HOSTNAME$&srv=$SERVICEDESC$
}

You have to specify an additional Extended Info Definition for every service.

Nagios 3.x

Since nagios 3.0 the action_url-directive has be moved to the host or service definition. This way the definition of URLs to the PNP-interface has been simplified. The serviceextinfo and hostextinfo definitions are deprecated.

First two nagios templates are defined. If you used the Nagios quickstart installation guides you can append these lines to templates.cfg:

define host {
   name       host-pnp
   action_url /pnp4nagios/index.php/graph?host=$HOSTNAME$&srv=_HOST_
   register   0
}

define service {
   name       srv-pnp
   action_url /pnp4nagios/index.php/graph?host=$HOSTNAME$&srv=$SERVICEDESC$
   register   0
}

These two templates can now be included via “use srv-pnp” or “use host-pnp” for services and hosts respectively. If you used the quickstart installation guide you might for example edit the file localhost.cfg and add the template to the host or service definition as follows:

define host{
        use                     linux-server,host-pnp    ; Name of host templates to use
                                                         ; This host definition will inherit all variables that are defined
                                                         ; in (or inherited by) the linux-server host template definition.
        host_name               localhost
        alias                   localhost
        address                 127.0.0.1
        }
define service{
        use                     local-service,srv-pnp   ; Name of service template to use
        host_name               localhost
        service_description     PING
        check_command           check_ping!100.0,20%!500.0,60%
        }

The links to the correct URLs are created automagically.

Tips: if you want to open the PNP window in your main frame (on the right of the menu) instead of a new page, just set action_url_target=main in your nagios cgi.cfg

Popups

You can integrate PNP into Nagios in a way that you have current graphs without clicking any icons. This can be accomplished using the CGI Includes which allow us to include JavaScript code in the status detail view ( status.cgi ).

Prerequisites:

  • PNP is installed and running
  • the file status-header.ssi from the contrib/ssi/ folder of the PNP package was copied to /usr/local/nagios/share/ssi/.
    Attention: This file must NOT be executable. Otherwise it will be treated as a CGI which will result in an error.
    *Note to Apache admins*: Apache ssi and Nagios ssi only have a similar name.
  • the appropriate service definition(s) has/have been modified. Please note that until Nagios 2.x you have to modify the serviceextinfo definition (which is deprecated starting with Nagios 3).

Definition:

define host {
   name       host-pnp
   action_url /pnp4nagios/index.php/graph?host=$HOSTNAME$&srv=_HOST_' class='tips' rel='/pnp4nagios/index.php/popup?host=$HOSTNAME$&srv=_HOST_
   register   0
}

define service {
   name       srv-pnp
   action_url /pnp4nagios/index.php/graph?host=$HOSTNAME$&srv=$SERVICEDESC$' class='tips' rel='/pnp4nagios/index.php/popup?host=$HOSTNAME$&srv=$SERVICEDESC$
   register   0
}

After a restart of Nagios (after modifying the definitions) the result might look like this:

back to contents | config options

PNP Web Frontend

The behaviour of the PNP Web-Frontend can be controlled through the config file etc/config.php. This file will be overwritten during updates of PNP as the paths and options are detected during ./configure.

Own adjustments should be made in etc/config_local.php. If this file does not exist the file config.php can be taken as a guideline.

etc/config.php

Following the most important parameters:

The path to the RRDtool binary. Will be detected by ./configure

 $conf['rrdtool'] = "/usr/bin/rrdtool";

Height and width of the RRD graphs

 $conf['graph_width'] = "500";
 $conf['graph_height'] = "100";

Screen sizes may vary, pages sizes won't. The following two directives enable you to specify different sizes for the creation of PDFs. If they aren't specified the values of the graph sizes are taken.

 $conf['pdf_width'] = "675";
 $conf['pdf_height'] = "100";

Additional options passed with every call of RRDTool, for example —-slope-mode to smooth the graphs

 $conf['graph_opt'] = "";

The path to the RRD and XML files created by process_perfdata.pl

 $conf['rrdbase'] = "/usr/local/pnp4nagios/var/perfdata/";

The path to the config file for the pages.

 $conf['page_dir'] = "/usr/local/pnp4nagios/etc/pages/";

PNP pages will be refreshed every n seconds

 $conf['refresh'] = "90";

Max. age of RRD files in seconds. After reaching this value links to the graphs will be marked as inactive

 $conf['max_age'] = 60*60*6;

Base URL to the Nagios CGIs

 $conf['nagios_base'] = "/nagios/cgi-bin";

List of users who are allowed to view links to the services of the current host

 $conf['allowed_for_service_links'] = "EVERYONE";

List of users who can view/access the host search field

 $conf['allowed_for_host_search'] = "EVERYONE";

If PNP is called with a host only ( index.php?host=<myserver> ), the defined user is shown an overview of all services related to this host

 $conf['allowed_for_host_overview'] = "EVERYONE";

The periods of time the RRD graphs will show are determined using the array $views[]. The title and number of graphs can be specified globally in this place

$views[] = array('title' => 'One Hour',  'start' => (60*60) );
$views[] = array('title' => '4 Hours',   'start' => (60*60*4) );
$views[] = array('title' => '25 Hours',  'start' => (60*60*25) );
$views[] = array('title' => 'One Week',  'start' => (60*60*25*7) );
$views[] = array('title' => 'One Month', 'start' => (60*60*24*32) );
$views[] = array('title' => 'One Year',  'start' => (60*60*24*380) );

You can add more views ($views[5], …) but please keep in mind that under normal circumstances ALL views you defined are shown.

back to contents | timeranges

Timeranges

In the overview PNP shows five timeranges which can be defined in config.php.

Additionally you can influence the timeranges via the URL. This can be useful to automatically create PDF documents. The ranges can be defined using the options “start” and “end”.

Example:

 pnp4nagios/graph?host=<hostname>&srv=<servicedesc>&start=-1week

The graph will start one week prior to the current date and time. It will end at the current timestamp.

start end view result
all views ending at current timestamp
x all views starting at defined date
x all views ending at defined date
x x one view between the two dates
x one view ending at current timestamp
x x one view starting at defined date
x x one view ending at defined date

Examples of different specifications

format description
2009W04 4. week of 2009
1.5.2009 May, 1st 2009
-1 day one day back
-3 weeks 3 weeks back
-1 year one year back
yesterday yesterday

back to contents | pages

Pages

“pages” provide the opportunity to collect graphs of different hosts/services on one page. That way - as an example - you can display the traffic rates of all tape libraries. Regular expressions are possible so you can accomplish a lot with only few definitions - provided that you have appropriate names. The directory specified using “$conf['page_dir']” contains one or more file with the extension ”.cfg”.

Comments start with a hash-sign (#) and are possible within lines as well. Each file contains a “page” definition which specifies the name of the page and it determines whether the following graph definition contains regular expressions or not.
The description behind page_name appears in the list of available pages and will be used as title of the browser window. Attention: “host_name” and “service_desc” refer to the name of the file in the perfdata directory, not to the definition in Nagios. Blanks are replaced by underscores (_).

define page {
       use_regex 1		# 0 = use no regular expressions, 1 = use regular expressions
       page_name test-page	# page description
}

One or more “graph” definitions follow:

define graph {
       host_name       host1,host2,host3
       service_desc    Current_Load
}

Attention: The list of host name will only work if you use regex 0!

define graph {
       host_name       host4
       service_desc    Current_Users
}

And now some definitions with regular expressions. At first all hosts whose names are starting with “Tape”:

define graph {
       host_name       ^Tape
       service_desc    Traffic
}

all hosts whose names are ending with “00”:

define graph {
       host_name       00$
       service_desc    Load
}

all services of localhost whose names contain “a” or “o”, respectively:

define graph {
       host_name       localhost
       service_desc    a|o
}

all services whose names contain an underscore followed by (at least) three digits on all hosts whose names start with “UX”:

define graph {
       host_name       ^UX
       service_desc    _\d{3}
}

In some cases you may want to limit the display to just one graph. To accomplish this you can use the optional directive “source” followed by a number specifying the position within the RRD file starting at 0

define graph {
       host_name       host1,host2,host3
       service_desc    PING
       source          1
}

back to contents | data export

Data export

PNP provides access to RRD data using the xport controller. The output format can be specified. At the moment the formats xml, json and csv are supported.

The controller can be called using the URL

/pnp4nagios/xport/<format>?host=<hostname>&srv=<servicedesc>

whereas <format> has to be replaced with the desired format.

You can also use wget to generate images and place them in periodic reports. One example may be:

wget -O image.png 'http://<user>:<pass>@<nagios-server>/pnp4nagios/image?host=<hostname>&srv=<service>&view=2&source=0'

view=<n> limits the graph to the timeperiod specified in config.php
source=<n> only shows one data source if you have more than one in your RRD file

Instead of view you can use start and/or end to specify the time period. For details please look at "time ranges".

back to contents | templates

What are templates?

PNP uses templates to influence the appearance of RRD graphs.

The selected check_command determines which template will be used to control the graph. Following will be described where templates are stored and how the decision for the “right” template is made.

What template will be used when?

Templates are stored at two places in the file system.

  • share/templates.dist - for templates included in the PNP package
  • share/templates - for custom made templates which are not changed during updates

If the graph for the service “http” on host “localhost” should be shown, PNP will look for the XML file perfdata/localhost/http.xml and read its contents. The XML files are created automatically and contain information about the particular host and service. The header contains information about the plugin and the performance data. The XML tag <TEMPLATE> identifies which PNP template will be used for this graph.

/localhost/http.xml

<NAGIOS>
  <DATASOURCE>
    <TEMPLATE>check_http</TEMPLATE>
    <DS>1</DS>
    <NAME>time</NAME>
    <UNIT>s</UNIT>
    <ACT>0.006721</ACT>
    <WARN>1.000000</WARN>
    <CRIT>2.000000</CRIT>
    <MIN>0.000000</MIN>
    <MAX></MAX>
  </DATASOURCE>
  <DATASOURCE>
    <TEMPLATE>check_http</TEMPLATE>
    <DS>2</DS>
    <NAME>size</NAME>
    <UNIT>B</UNIT>
    <ACT>263</ACT>
    <WARN></WARN>
    <CRIT></CRIT>
    <MIN>0</MIN>
    <MAX></MAX>
  </DATASOURCE>
...
</NAGIOS>

PNP will look for a template with the name check_http.php in the following sequence:

  1. templates/check_http.php
  2. templates.dist/check_http.php
  3. templates/default.php
  4. templates.dist/default.php

The template default.php takes an exceptional position as it is used every time no other applicable template is found.

Creating own templates

PNP templates are PHP files which are included during execution of PNP using the PHP function include(). This means that every PHP code in templates will be interpreted so manipulation of all values is possible.

PNP template must have the following characteristics:

  1. templates must contain valid PHP code.
  2. templates must not create any output.
  3. the two arrays $opt[] and $def[] have to be filled

These two arrays are used to call 'rrdtool graph' so every option is possible that RRDtool supports. All options of RRDtool are described very thoroughly on the RRDtool Homepage.

If both arrays contain more than one set of data graphs will be created for every set.

Inside the templates the data from the related XML files can be used.

Using the relatively simple template response.php we will describe the most important options.

<?php
#
$opt[1] = "--title \"Response Time For $hostname / $servicedesc\" ";
#
$def[1] =  "DEF:var1=$RRDFILE[1]:$DS[1]:AVERAGE " ;
$def[1] .= "AREA:var1#00FF00:\"Response Times \" " ;
$def[1] .= "LINE1:var1#000000 " ;
$def[1] .= "GPRINT:var1:LAST:\"%3.4lg %s$UNIT[1] LAST \" ";
$def[1] .= "GPRINT:var1:MAX:\"%3.4lg %s$UNIT[1] MAX \" ";
$def[1] .= "GPRINT:var1:AVERAGE:\"%3.4lg %s$UNIT[1] AVERAGE \" ";
?>

Note: as the number (1) and the letter “L” look alike in this listing: the format ”%3.4lg” contains a small letter.

$opt[1] = ”–title … sets RRDtool options for the first set of data, here the title as you can see. Embedded quotes are masked using a backslash (\). The variables $hostname and $servicedesc were determined through the call of PNP and are available for the template as well.

$def[1] = “DEF:var1=$RRDFILE[1]:$DS[1]:AVERAGE ”; defines which data is to be read from which RRD file. $RRDFILE[1] contains the path to the RRD file of this service. $DS[1] refers to the first data series from the RRD file.

$def[1] .= “AREA:var1#00FF00:\”Response Times \” ”; the operator ”.=” appends more data to the array $def[1]. An area will be drawn using data from the variable var1. The color is defined in HEX notation #00FF00 (red, green, blue). The label is “Response Times”.

$def[1] .= “LINE1:var1#000000 ”; As completion of the just drawn area a line (LINE1) will be drawn in black (#000000).

$def[1] .= “GPRINT:var1:LAST:\”%3.4lg %s$UNIT[1] LAST \” ”;
$def[1] .= “GPRINT:var1:MAX:\”%3.4lg %s$UNIT[1] MAX \” ”;
$def[1] .= “GPRINT:var1:AVERAGE:\”%3.4lg %s$UNIT[1] AVERAGE \” ”;

The three GPRINT lines build up the caption for the graph. The current values are formatted using the printf syntax.

Available variables

Using the data collector process_perfdata.pl PNP stores not only performance data but other values exported by Nagios. These values are stored in the XML file associated to the appropriate service.

In the first part of the XML file the performance data is stored in separate components.

<NAGIOS>
  <DATASOURCE>
    <TEMPLATE>check_http</TEMPLATE>
    <DS>1</DS>
    <NAME>time</NAME>
    <UNIT>s</UNIT>
    <ACT>0.006721</ACT>
    <WARN>1.000000</WARN>
    <CRIT>2.000000</CRIT>
    <MIN>0.000000</MIN>
    <MAX></MAX>
  </DATASOURCE>
....
</NAGIOS>

The field <DS> designates the data source and is used to identify the data series of the RRD files and is the key of the following arrays as well.

The array $UNIT[1] contains the unit of measurement of the first data series.

The XML file contains other information. When process_perfdata.pl is used in default mode all available macros are at hand with the current values. For the benefit of readability the following lines show only an extract.

<NAGIOS>
...
  <NAGIOS_SERVICENOTIFICATIONID>8418</NAGIOS_SERVICENOTIFICATIONID>
  <NAGIOS_SERVICENOTIFICATIONNUMBER>0</NAGIOS_SERVICENOTIFICATIONNUMBER>
  <NAGIOS_SERVICEOUTPUT>HTTP OK HTTP/1.1 200 OK - 10087 bytes in 0.125 seconds</NAGIOS_SERVICEOUTPUT>
  <NAGIOS_SERVICEPERCENTCHANGE>0.00</NAGIOS_SERVICEPERCENTCHANGE>
  <NAGIOS_SERVICEPERFDATA>time=0.124811s;;;0.000000 size=10087B;;;0</NAGIOS_SERVICEPERFDATA>
  <NAGIOS_SERVICEPERFDATAFILE></NAGIOS_SERVICEPERFDATAFILE>
  <NAGIOS_SERVICEPROBLEMID>0</NAGIOS_SERVICEPROBLEMID>
  <NAGIOS_SERVICESTATE>OK</NAGIOS_SERVICESTATE>
  <NAGIOS_SERVICESTATEID>0</NAGIOS_SERVICESTATEID>
  <NAGIOS_SERVICESTATETYPE>HARD</NAGIOS_SERVICESTATETYPE>
  <NAGIOS_SHORTDATETIME>27-12-2007 13:51:23</NAGIOS_SHORTDATETIME>
...
</NAGIOS>

The various XML fields can be used as variables in the PNP templates. Each field is available as a variable with the same name.

The value of the field <NAGIOS_SERVICEOUTPUT> is available as the variable $NAGIOS_SERVICEOUTPUT.

back to contents | custom templates

Custom Templates

As already described under ”What are templates ?” the appearance of graphs depends on the check command used.

There are situations where this behaviour must be overruled. This has to be done when universal commands have been defined.

CUSTOM_TEMPLATE

Example:

define command {
  command_name check_nrpe
  command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$ -a "$ARG2$"
}

This would lead to a call of the check_nrpe.php template even when the monitored host would use a completely different plugin which is called via NRPE.

PNP, especially process_perfdata.pl, will search for a config file (<check_command>.cfg) in the etc/check_commands directory and read its contents (if available).

As our example command is called check_nrpe it will be searched for etc/check_commands/check_nrpe.cfg.

During installation a sample config file with the extension .cfg-sample is copied to etc/check_commands.

Two options can be set in this config file:

# check_command check_nrpe!load!-w 4,4,4 -c 5,5,5
# ________0__________|       |       |
# ________1__________________|       |
# ________2__________________________|
#
CUSTOM_TEMPLATE = 1

CUSTOM_TEMPLATE = 1 assures that only the contents of $ARG1$ will be used as a template name. As $ARG1$ contains “load” in this example the template name would result in “load.php”.

CUSTOM_TEMPLATE = 0,1 results in → “check_nrpe_load.php”

CUSTOM_TEMPLATE = 1,0 results in → “load_check_nrpe.php”

DATATYPE

The option “DATATYPE” controls the datatype which is used during creation of the RRD database. Default is “GAUGE”. For consecutive values the type should be “COUNTER”. Plugin-developers should use the unit “c” for counters but this is not always the case.

To set all datasources to COUNTER

DATATYPE = COUNTER

Setting datasources to different types

DATATYPE = GAUGE,GAUGE,COUNTER,COUNTER

This option has effect only during creation of the RRD database.

More datatypes are explained in the RRDTool documentation found at rrdcreate.

MIN and MAX

In a few situations it might be necessary to limit the values which are valid for RRDTool.

RRD databases can be created with fixed minimum and maximum values. You will find further details at http://oss.oetiker.ch/rrdtool/doc/rrdcreate.en.html.

Account for the maximum value taken from the performance data

USE_MAX_ON_CREATE = 1

Account for the minimum value taken from the performance data

USE_MIN_ON_CREATE = 1

RRD_STORAGE_TYPE

RRD_STORAGE_TYPE = SINGLE

The option RRD_STORAGE_TYPE defines the kind of data storage.

Possible values are MULTIPLE and SINGLE, respectively.

SINGLE: A RRD database per service

MULTIPLE: One or more RRD databases per service. Each datasource will be stored in a separate RRD database.

ATTENTION: The data will not be migrated automatically! You will find a conversion script here.

RRD_HEARTBEAT

Starting with PNP 0.6.1

RRD_HEARTBEAT = 305

After <RRD_HEARTBEAT> seconds RRDtool expects new data.

More information at http://oss.oetiker.ch/rrdtool/doc/rrdcreate.en.html

back to contents | PNP in distributed environments

Distributed Systems

If Nagios is implemented as a distributed system you have to decide where PNP should be installed.

From a technical view this question is not important. PNP can be installed on the slave(s) as well as on the master server. Or only on the master?

If PNP is running on the master you have to make sure that data passed via send_nsca from the slave server(s) contains performance data. Often another check command is used on the master.

To help PNP on the master to recognize which check command was used on the slave to collect the information process_perfdata.pl responds to an additional field at the end of the performance data.

OK - 127.0.0.1: rta 2.687ms, lost 0% | rta=2.687ms;3000.000;5000.000;0; pl=0%;80;100;; [check_icmp]

If PNP finds a string enclosed in brackets at the end of performance data it will be recognized as check command and will be used as PNP template.

Nagios documentation related to this topic can be found here. The command used in the documentation can be adapted easily.

define command{
	command_name	submit_check_result
	command_line	/usr/local/nagios/libexec/eventhandlers/submit_check_result $HOSTNAME$ '$SERVICEDESC$' $SERVICESTATE$ '$SERVICEOUTPUT$'
	}

should be changed to

define command{
	command_name	submit_check_result
	command_line	/usr/local/nagios/libexec/eventhandlers/submit_check_result $HOSTNAME$ '$SERVICEDESC$' $SERVICESTATE$ '$SERVICEOUTPUT$ | $SERVICEPERFDATA$ [$SERVICECHECKCOMMAND$]'
	}

check_multi plugin

The plugin check_multi is one of the first plugins which uses new features of Nagios 3.x. Check_multi can execute multiple Nagios plugins but returns only results like a single service. The output of check_multi comprises of several lines to be able to display the amount of information.

This results in some difficulties for PNP which has to extract the information of several plugins from the performance data. Together with Matthias Flacke, developer of check_multi, we have found a solution to assign the data to the appropriate plugins.

back to contents | support of rrdcached

RRDtool Cache Daemon

In large installations sooner or later one will recognize that processing the performance data will result in a relatively high I/O load. RRDtool has to do very much disk updates but cannot use the disk cache in an optimal way.

One improvement is made by collecting and sorting the data. It is more effective to write many updates to an RRD database in one block. The disk cache can be used more effectively that way.

The current RRDtool ( SVN trunk 1550+ ) contains rrdcached which should improve exactly this situation.

At this point I'd like to thank Florian octo Forster, Kevin Brintnall and Tobi Oetiker. The development of this daemon has been coordinated exemplary on the rrd-developers mailing list.

Mode of operation

The rrdcached is working as a daemon in the background and opens a UNIX or TCP socket to wait for requests of rrdtool. Due to security reasons newer versions of rrdcached cannot use absolute paths for network access anymore so the only possible way are unix sockets.

rrdcached

rrdcached recognizes some important options which are passed during startup.

Option -l defines the socket the daemon will listen for update requests. The default TCP port will be 42217.

-l unix:/path/to/rrdcached.sock
-l /path/to/rrdcached.sock
-l 127.0.0.1
-l 127.0.0.1:8888

Option -P specifies which commands are usable with the RRD data bases

-P FLUSH,PENDING

Option -s allows to change the group ownership of the unix socket

-s nagios

Option -m sets the permissions of the unix socket in the usual octal format

-m 0660

Option -w specifies the interval (in seconds) the data will be written to disk.

-w 1800

Option -z defines a maximum delay which will be used to spread the write cycles over a certain range [0-delay] to avoid parallel write accesses. The value of option -z must not be larger than -w.

-z 1800

Option -p defines a PID file

-p /var/run/rrdcached.pid

Option -j defines the path to a journaling directory. All requests will be logged there so that they can be processed after a restart in case the daemon crashes.

-j /var/cache/rrdcached

These options may result in a call of rrdcached with the following parameters

 rrdcached -w 1800 -z 1800 -p /tmp/rrdcached.pid -j /tmp  -s nagios -m 0660 -l unix:/tmp/rrdcached.sock

rrdtool

RRDtool itself will be informed about the daemon using the option –daemon=<socket>.

 rrdtool --daemon=unix:/tmp/rrdcached.sock update ...

Of course this has to correspond with the options of rrdcached!

Integration into PNP

Because two components of PNP have to prepared for the use of rrdcached there are changes in two config files.

1. Adjustment of process_perfdata.cfg for the data collector process_perfdata.pl

# EXPERIMENTAL rrdcached Support
# Use only with rrdtool svn revision 1511+
#
RRD_DAEMON_OPTS = unix:/var/run/rrdcached.sock

2. Adjustment of config_local.php (or config.php) for the web interface

#
# EXPERIMENTAL rrdcached Support
# Use only with rrdtool svn revision 1511+
#
# $conf['RRD_DAEMON_OPTS'] = 'unix:/tmp/rrdcached.sock';
$conf['RRD_DAEMON_OPTS'] = 'unix:/var/run/rrdcached.sock';

The sample files contain the relevant options.

back to contents | migrating RRD files

NPCD

NPCD (Nagios-Perfdata-C-Daemon) was written to provide an asynchronous mode to handle performance data with nagios.

Introduction

In large nagios installations, your average check latency may increase to a non-acceptable high value. This means that Nagios should do a check at time x but actually does it y seconds later.

If you tell the Nagios core that you want to process the performance data after every single check this is doing well for a certain amount of checks but above this limit you will run into latency problems.

To reduce the number of actions for each check you can use the Bulk Mode which gathers performance data for some time and then lets the Nagios core execute the <host|service>_perfdata_file_processing_command or you can tell Nagios to just move the perfdata_files to a spool directory.

This move is a very fast action for the Nagios core and the core will be done with the processing of performance data and can continue to do what it should do: execute other checks, sending notifications, and so on.

How it works

As mentioned above the Nagios process has finished its work with moving the performance data file to a spool directory but this won't bring the data into the RRD files.

For this task you can start npcd to have a look at the defined spool directory and start an action for every file which is found.

After NPCD starts running it will build a list of filenames found in perfdata_spool_dir and starts new threads for every filename and executes the perfdata_file_run_cmd with the optional perfdata_file_run_cmd_arg as an additional argument.

Since the perfdata files in the spool dir are in the same format as for the 'normal' bulk mode NPCD should execute process_perfdata.pl in Bulk Mode.

Advantages / Disadvantages

Pro:

  • Performance improvements for Nagios
    • because the performance data processing is detached from the Nagios core it has more time for its own work.
  • no lost data
    • as long as Nagios writes perfdata files to the spool dir your data won't get lost if NPCD dies or you forgot to start it after a system reboot. NPCD will start with the first file found (they are sorted by the $TIME_T$ macro in chronological order) and update your RRD Files.

Con:

  • no real time processing of performance data
    • since there is a delay in writing the performance data files by Nagios (service_perfdata_file_processing_interval)
    • another delay exists within NPCD which waits for up to 10 seconds after each directory scanning

NPCD Config

You have to control NPCD with its own configuration file like the rolled out npcd.cfg-sample file.

Just rename it to npcd.cfg to start NPCD like this:

/usr/local/pnp4nagios/bin/npcd -f /usr/local/pnp4nagios/etc/npcd.cfg

or

/usr/local/pnp4nagios/bin/npcd -d -f /usr/local/pnp4nagios/etc/npcd.cfg

to run in Daemon Mode (background).

Hint: If you decide to not rename the config file, it might be overwritten by a future update of PNP.

npcd.cfg-sample

These are the essential configuration directives for NPCD:

# Privilege Options
user = nagios
group = nagios

# Logging Options
log_type = syslog
log_file = /usr/local/pnp4nagios/var/npcd.log
max_logfile_size = 10485760
log_level=0

# Processing Options
perfdata_spool_dir = /usr/local/pnp4nagios/var/spool/
perfdata_file_run_cmd = /usr/local/pnp4nagios/libexec/process_perfdata.pl
perfdata_file_run_cmd_args = -b

# Thread Options
npcd_max_threads=5

# greedy options
use_load_threshold = 0
load_threshold = 10.0

# Process Options
pid_file=/var/run/npcd.pid

The directives

  • Privilege Options
    • user <username>
      • NPCD tries to drop 'root' privileges to switch to this user.
      • default: nagios
    • group <groupname>
      • NPCD tries to drop 'root' privileges to switch to this group.
      • Default: nagios
  • Logging Options
    • log_type <syslog> or <file>
      • Log type that is uses by NPCD
      • Default: syslog
    • log_file </path/to/filename>
      • if log_type = file this will be the logfile used
      • Default: /usr/local/pnp4nagios/var/npcd.log
    • max_logfile_size <bytes>
      • NPCD will rotate the logfile if the filesize of the current log is above this limit
      • Default: 10485760 = 10 MByte
    • log_level <integer>
      • how much to log, possible values:
        • 0 = No Log - except errors
        • 1 = small Log - some more output
        • 2 = more Log (actual ALL log messages)
        • -1 = DEBUG Mode - ALL Logs and slower processing for debugging purposes
      • Default: 0
  • Processing Options
    • perfdata_spool_dir </path/to/spool/dir/>
      • The directory where the perfdata file should be found
      • Default: /usr/local/pnp4nagios/var/spool/
    • perfdata_file_run_cmd </path/to/bin/filename>
      • This is the script/binary that NPCD will execute
      • Default: /usr/local/pnp4nagios/libexec/process_perfdata.pl
    • perfdata_file_run_cmd_args <option>
      • The argument added to the perfdata_file_run_cmd
      • Default: ”-b”
      • :!: The command line will be created like this:
        <perfdata_file_run_cmd> <perfdata_file_run_cmd_args> <filename_from_perfdata_spool_dir>
  • Thread Options
    • npcd_max_threads <integer value>
      • Defines how many parallel threads should be started
      • Default: 5
  • Greedy Options
    • use_load_threshold <0 or 1>
      • defines if NPCD should _not_ start new threads if your system load is too high
        • 0 = disable
        • 1 = enable
      • Default: 0
    • load_threshold <float value>
      • if use_load_threshold is set to 1 this load limit must not be exceeded
      • Default: 10.0
  • Process Options
    • pid_file </path/to/pid.file>
      • the path to the PID File
      • Default: /var/run/npcd.pid

back to contents | wrapper script

check_procs is an example for a plugin which doesn't deliver performance data:

./check_procs -a ndo2db -w 1: -c 0:
PROCS OK: 2 processes with args 'ndo2db'

This can be changed with the following wrapper script

check_procs.sh

#!/bin/bash
LINE=`/usr/local/nagios/libexec/check_procs $*`
RC=$?
COUNT=`echo $LINE | awk '{print $3}'`
echo $LINE \| procs=$COUNT
exit $RC

Now you'll get the number together with the required label

./check_procs.sh -a ndo2db -w 1: -c 0:
PROCS OK: 2 processes with args 'ndo2db'| procs=2

2.6. Performance data

Performance data is defined by Nagios as “everything after the | of the plugin output” - please refer to Nagios documentation for information on capturing this data to logfiles. However, it is the responsibility of the plugin writer to ensure the performance data is in a “Nagios plugins” format. This is the expected format:

'label'=value[UOM];[warn];[crit];[min];[max]

Notes:

  1. space separated list of label/value pairs
  2. label can contain any characters
  3. the single quotes for the label are optional. Required if spaces, = or ' are in the label
  4. label length is arbitrary, but ideally the first 19 characters are unique (due to a limitation in RRD). Be aware of a limitation in the amount of data that NRPE returns to Nagios
  5. to specify a quote character, use two single quotes
  6. warn, crit, min/ or max/ may be null (for example, if the threshold is not defined or min and max do not apply). Trailing unfilled semicolons can be dropped
  7. min and max are not required if UOM=%
  8. value, min and max in class [-0-9.]. Must all be the same UOM
  9. warn and crit are in the range format (see Section 2.5). Must be the same UOM
  10. UOM (unit of measurement) is one of:
    • no unit specified - assume a number (int or float) of things (eg, users, processes, load averages)
    • s - seconds (also us, ms)
    • % - percentage
    • B - bytes (also KB, MB, TB, GB?)
    • c - a continous counter (such as bytes transmitted on an interface)

It is up to third party programs to convert the Nagios plugins performance data into graphs.

Origin: http://nagiosplug.sourceforge.net/developer-guidelines.html#AEN201

pnp4nagios-0.6.16/share/pnp/documents/en_US/start.html0000664000000000000000000002323611662503006021327 0ustar rootroot

Documentation

Theme "smoothness"

NagiosPowered PNP is an addon to Nagios which analyzes performance data provided by plugins and stores them automatically into RRD-databases (Round Robin Databases, see RRD Tool).

During development of PNP we set value on easy installation and little maintenance while running it. An administrator should do other things than configure graphing tools.

To achieve this task we focused on using standards. PNP only processes performance data built according to the Developer Guidelines for nagios plugins. With this limitation we want to honour the work of Nagios Plugin Developers who stick to the guidelines.

For all of those who are still curious the following documentation is made which should help to ease the access to PNP.

complete documentation on "one" page

Documentation

pnp4nagios-0.6.16/share/pnp/documents/en_US/new-features.html0000664000000000000000000000572111662503006022576 0ustar rootroot

New in PNP 0.6.x

PNP 0.6.x Preview

The work on the new version 0.6.x is in full progress.

Starting with version 0.6.x we switch from subversion to GIT. The sourcecode is already available on sourceforge.

Functions implemented already

  • Webfrontend based on Kohana
  • Webfrontend based on jQuery Themes
  • Javascript-functions using jQuery plugins
  • process_perfdata.pl will be able to use one RRD database per datasource
  • improved installer. Specification of directory layouts using –with-layout
  • RRDtool errors are now displayed as images. no more missing images
  • PNP templates cannot overwrite internal variables anymore
  • PNP templates of version 0.4.x can still be used
  • PDF functions recoded
  • Template default.php optimized
  • Export from RRD databases into XML, CSV and JSON format using the RRDtool “xport” function
  • Page functions recoded
  • Error pages links to online FAQ
  • Mouseover Popup in Nagios frontend via jQuery.clueTip plugin
  • Full support of rrdcached

back to contents | system requirements

pnp4nagios-0.6.16/share/pnp/documents/en_US/config.html0000664000000000000000000004201711662503006021435 0ustar rootroot

Configuration

The configuration of the already mentioned modes of performance data processing will be described in more detail.

Synchronous Mode

The synchronous mode is the simplest way to integrate the data collector process_perfdata.pl into nagios. Every event will trigger an execution of process-service-perfdata.

Initially you have to enable processing of performance data in nagios.cfg. Please note that this directive might already exist in the config file. Default is “0”.

 process_performance_data=1

Data processing has to be disabled in the definition of every host or service whose performance data should NOT be processed.

define service {
   ...
   process_perf_data 0
   ...
}

Since Nagios 3.x it is possible to deactivate the export of environment variables (as part of optimizing the system for maximum performance). Unfortunately this directive has to be enabled to use the synchronous mode. So either you use the default value (which means that the export is enabled) or you define the variable in nagios.cfg

enable_environment_macros=1

Additionally the command to process performance data is to be specified in nagios.cfg

 service_perfdata_command=process-service-perfdata

Starting with Nagios 3.0 it may be useful to enable processing of performance data for hosts as well. Due to changed host check logic Nagios 3 now performs regularly scheduled host checks.

 host_perfdata_command=process-host-perfdata

Nagios has to be notified about the referenced commands as well. If you used the quickstart installation guides for Nagios you can modify the definitions in commands.cfg. You can see that calling process_perfdata.pl doesn't require any arguments apart from specifing the option -d ( DATATYPE ) if you want to process performance data resulting from host checks.

define command {
       command_name    process-service-perfdata
       command_line    /usr/bin/perl /usr/local/pnp4nagios/libexec/process_perfdata.pl
}

define command {
       command_name    process-host-perfdata
       command_line    /usr/bin/perl /usr/local/pnp4nagios/libexec/process_perfdata.pl -d HOSTPERFDATA
}

Note process_perfdata.pl cannot be started under control of ePN ( embedded Perl Nagios ). Therefore the script is explicitly called using /usr/bin/perl ( or where you perl binary is located ). If you use Nagios 3.x or do not use ePN there is no need to specify /usr/bin/perl.

Bulk Mode

Bulk mode is a bit more complicated than the synchronous mode but reduces the load on the nagios server significantly because the data collector process_perfdata.pl is not invoked for every service/host check.

In bulk mode Nagios writes the data to a temporary file in a defined format. This file is processed by process_perfdata.pl at certain intervals. Nagios will take care for starting and running it periodically.

Processing of performance data has to be enabled in nagios.cfg

 process_performance_data=1

Additionally some new directives are required

#
# service performance data
#
service_perfdata_file=/usr/local/pnp4nagios/var/service-perfdata
service_perfdata_file_template=DATATYPE::SERVICEPERFDATA\tTIMET::$TIMET$\tHOSTNAME::$HOSTNAME$\tSERVICEDESC::$SERVICEDESC$\tSERVICEPERFDATA::$SERVICEPERFDATA$\tSERVICECHECKCOMMAND::$SERVICECHECKCOMMAND$\tHOSTSTATE::$HOSTSTATE$\tHOSTSTATETYPE::$HOSTSTATETYPE$\tSERVICESTATE::$SERVICESTATE$\tSERVICESTATETYPE::$SERVICESTATETYPE$
service_perfdata_file_mode=a
service_perfdata_file_processing_interval=15
service_perfdata_file_processing_command=process-service-perfdata-file

#
# host performance data starting with Nagios 3.0
# 
host_perfdata_file=/usr/local/pnp4nagios/var/host-perfdata
host_perfdata_file_template=DATATYPE::HOSTPERFDATA\tTIMET::$TIMET$\tHOSTNAME::$HOSTNAME$\tHOSTPERFDATA::$HOSTPERFDATA$\tHOSTCHECKCOMMAND::$HOSTCHECKCOMMAND$\tHOSTSTATE::$HOSTSTATE$\tHOSTSTATETYPE::$HOSTSTATETYPE$
host_perfdata_file_mode=a
host_perfdata_file_processing_interval=15
host_perfdata_file_processing_command=process-host-perfdata-file

Attention: Please note that these template definitions differ from the ones delivered in nagios.cfg!

The directives and their meaning:

  • service_perfdata_file path to the temporary file which should contain the performance data.
  • service_perfdata_file_template format of the temporary file. Data will be defined using Nagios macros.
  • service_perfdata_file_mode option “a” specifies that data is to be appended to the file.
  • service_perfdata_file_processing_interval the interval is 15 seconds
  • service_perfdata_file_processing_command the command to be called during the interval.

The used commands have to be announced to Nagios. If you used the quickstart installation guides for Nagios you can modify the definitions in commands.cfg.

define command{
       command_name    process-service-perfdata-file
       command_line    /usr/local/pnp4nagios/libexec/process_perfdata.pl --bulk=/usr/local/pnp4nagios/var/service-perfdata
}

define command{
       command_name    process-host-perfdata-file
       command_line    /usr/local/pnp4nagios/libexec/process_perfdata.pl --bulk=/usr/local/pnp4nagios/var/host-perfdata
}

NOTE:

Because there is more data to process than in synchronous mode process_perfdata.pl will take longer to do this so you should check the TIMEOUT value in etc/process_perfdata.cfg and adjust it appropriately.

Bulk Mode with NPCD

The configuration is identical to the Bulk Mode except for the used command. Processing of performance data has to be enabled in nagios.cfg

 process_performance_data=1

Additionally some new directives are required

#
# service performance data
#
service_perfdata_file=/usr/local/pnp4nagios/var/service-perfdata
service_perfdata_file_template=DATATYPE::SERVICEPERFDATA\tTIMET::$TIMET$\tHOSTNAME::$HOSTNAME$\tSERVICEDESC::$SERVICEDESC$\tSERVICEPERFDATA::$SERVICEPERFDATA$\tSERVICECHECKCOMMAND::$SERVICECHECKCOMMAND$\tHOSTSTATE::$HOSTSTATE$\tHOSTSTATETYPE::$HOSTSTATETYPE$\tSERVICESTATE::$SERVICESTATE$\tSERVICESTATETYPE::$SERVICESTATETYPE$
service_perfdata_file_mode=a
service_perfdata_file_processing_interval=15
service_perfdata_file_processing_command=process-service-perfdata-file

#
# host performance data starting with Nagios 3.0
# 
host_perfdata_file=/usr/local/pnp4nagios/var/host-perfdata
host_perfdata_file_template=DATATYPE::HOSTPERFDATA\tTIMET::$TIMET$\tHOSTNAME::$HOSTNAME$\tHOSTPERFDATA::$HOSTPERFDATA$\tHOSTCHECKCOMMAND::$HOSTCHECKCOMMAND$\tHOSTSTATE::$HOSTSTATE$\tHOSTSTATETYPE::$HOSTSTATETYPE$
host_perfdata_file_mode=a
host_perfdata_file_processing_interval=15
host_perfdata_file_processing_command=process-host-perfdata-file

Attention: Please note that these template definitions differ from the ones delivered in nagios.cfg!

The directives and their meaning:

  • service_perfdata_file path to the temporary file which should contain the performance data.
  • service_perfdata_file_template format of the temporary file. Data will be defined using Nagios macros.
  • service_perfdata_file_mode option “a” specifies that data is to be appended to the file.
  • service_perfdata_file_processing_interval the interval is 15 seconds
  • service_perfdata_file_processing_command the command to be called during the interval.

The used commands have to be announced to Nagios. If you used the quickstart installation guides for Nagios you can modify the definitions in commands.cfg.

define command{
       command_name    process-service-perfdata-file
       command_line    /bin/mv /usr/local/pnp4nagios/var/service-perfdata /usr/local/pnp4nagios/var/spool/service-perfdata.$TIMET$
}

define command{
       command_name    process-host-perfdata-file
       command_line    /bin/mv /usr/local/pnp4nagios/var/host-perfdata /usr/local/pnp4nagios/var/spool/host-perfdata.$TIMET$
}

Using these commands the file service-perfdata will be moved to var/spool/ after the interval specified in service_perfdata_file_processing_interval has passed. The Nagios macro $TIMET$ is appended to the filename to avoid overwriting of old files unintentionally. The macro $TIMET$ contains the current timestamp in time_t format (seconds since the UNIX epoch).

In the directory /usr/local/pnp4nagios/var/spool/ files are gathered to be processed by NPCD.

NPCD monitors the spool directory and passes the file names to process_perfdata.pl. This way processing of performance data is completely decoupled from nagios.

Before starting NPCD you have to check the paths to the spool directory and to process_perfdata.pl specified in the config file npcd.cfg. The only thing that remains is to start NPCD.

 /usr/local/pnp4nagios/bin/npcd -d -f /usr/local/pnp4nagios/etc/npcd.cfg

The option -d starts NPCD as a daemon in the background.

Bulk Mode with NPCD and npcdmod

This mode uses the event broker module npcdmod.o. The flow of data is identical to “bulk mode with NPCD”. The internal perfdata routines of Nagios activated by the “*_perf_data_*” directives in nagios.cfg are *NOT* used anymore. The module npcdmod.o takes over the task of processing the data required by PNP.

Pro:

  • The perfdata routines can now be used for other addons.
  • The configuration is easier.
  • It is the preferred mode of the PNP developers.

Adjustments in nagios.cfg:

process_performance_data=1
broker_module=/usr/local/pnp4nagios/lib/npcdmod.o config_file=/usr/local/pnp4nagios/etc/npcd.cfg

All other directives mentioned on this page must NOT be used.

Attention: If you have changed the value of event_broker_options from -1 to another value then please note that PNP needs the bits 2 and 3 set (0b01100). Make sure that the resultung value has these bits set because otherwise there will be no performance data to process.

After restarting Nagios information regarding the start of the module will be logged.

Excerpt from nagios.log

[1277545053] npcdmod: Copyright (c) 2008-2009 Hendrik Baecker (andurin@process-zero.de) - http://www.pnp4nagios.org
[1277545053] npcdmod: /usr/local/pnp4nagios/etc/npcd.cfg initialized
[1277545053] npcdmod: spool_dir = '/usr/local/pnp4nagios/var/spool/'.
[1277545053] npcdmod: perfdata file '/usr/local/pnp4nagios/var/perfdata.dump'.
[1277545053] npcdmod: Ready to run to have some fun!
[1277545053] Event broker module '/usr/local/pnp4nagios/lib/npcdmod.o' initialized successfully.

Gearman Mode

Since version 0.6.12 PNP4Nagios can be driven as a gearman worker. This way large Nagios environments are possible using mod_gearman. Nagios and PNP4Nagios can be run on different machines.

You need a mod_gearman environment up and running like described by Sven Nierlein on http://labs.consol.de/lang/en/nagios/mod-gearman/.

You'll find a section on gearman in etc/process_perfdata.cfg:

PREFORK = 0
GEARMAN_HOST = localhost:4730
REQUESTS_PER_CHILD = 10000
ENCRYPTION = 1
KEY = should_be_changed
#KEY_FILE = /usr/local/pnp4nagios/etc/secret.key

Using PREFORK = <n> you specify the number of additional(!) child processes. Specify “0” only a parent process is started.
GEARMAN_HOST = <host>:<port> specifies host and port of the server running the gearman daemon providing the data.
REQUEST_PER_CHILD = <n> enables you to define the number of requests processed per process.
ENCRYPTION = <n> specifies whether to use encryption (“1”) or not. Default is an activated encyrption which should be changed only in special cases. You can either use KEY = <key phrase> or 'KEYFILE =<key file> to specify the location of a file containing the key phrase. etc/init.d/pnp_gearman_worker start contains links to the perl script process_perfdata.pl and the config file process_perfdata.cfg. After starting the daemon process using /etc/init.d/pnp_gearmon_worker start the performance data will be processed which is provided by the gearmand daemon on the Nagios server.

back to contents | checking the functionality

pnp4nagios-0.6.16/share/pnp/documents/en_US/verify.html0000664000000000000000000001543511662503006021500 0ustar rootroot

Checking the installation

If everything went well until now you can try to call PNP using your web browser. When using the installation with default values PNP should be called using http://<server name>/pnp4nagios/. The first time you will see a page “PNP4Nagios Environment Tests” which includes different checks of necessary components. Obviously all checks have to be passed successfully before you can proceed. Please follow the instructions given on that page.

If all tests have passed *successfully* the file pnp4nagios/share/install.php can be deleted or renamed. Not till then the web interface is reachable.

Alternatively you can create a file called pnp4nagios/share/install.ignore which will prevent the call of the installer after further updates.

If you receive the message “PHP magic_quotes_gpc is deprecated” then please locate your php.ini and set the value to Off.

Called without any arguments PNP looks for RRD and XML files in pnp4nagios/var/perfdata and shows all graphs of the first host.

ATTENTION: Immediately after (re-)starting Nagios after you enabled the processing of performance data you will get error messages in your browser because performance data has to be collected and stored in RRD files. Depending on the check interval you are using you have to wait some time before you can view the first graphs.

Debug Logfile

Calling make install-config during installation will create a sample config file etc/process_perfdata.cfg-sample. The values in the sample file will correspond to the defaults used by process_perfdata.pl so normally you do not have a file called process_perfdata.cfg while running the procedure.
However you can influence the way process_perfdata.pl works by changing options which have to be specified in process_perfdata.cfg.

The most important options launching PNP are LOG_LEVEL and LOG_FILE. We recommend setting the LOG_LEVEL value to “2” so you can track what process_perfdata.pl will do. Most likely we will ask for excerpts from perfdata.log if you open a support request on the mailing lists as well as the output of the verify_pnp_config script so please provide them ;-).

During normal operation the debug level should be set to 0 to avoid performance issues due to unnecessary entries in the log file.

Something went wrong

Some basic settings should be checked

1. Have any RRD and XML files been created? process_perfdata.pl will create a new directory under pnp/perfdata for every host. In this directory an RRD database and an XML file will be created for every service. The host data will be stored in _HOST_.xml and _HOST_.rrd respectively.
If graphing stops out of a sudden then open the appropriate XML file. There are two tags called <RC> and <TXT>. <RC> shows the return code of the RRDtool update and <TXT> a textual description.
Sometimes you have to specify additional options so that performance data is produced. In some cases a wrapper script might help.
However not all checks provide performance data. That applies - among others - to “check_ping” in contrast to “check_icmp” which does provide data (starting with Nagios plugin version 1.4.12 check_ping does provide performance data).
Using the web interface the detail information of hosts/services shows a field “Performance Data”. If it is empty there is no data available so no files are written to the appropriate directory and that is why PNP does not provide you with graphs!
The following image shows the information of a “PING” service. The output of the plugin is surrounded by a blue border, the performance data by a red one.
status information

2. Has nagios called process_perfdata.pl? In the config file for process_perfdata.pl (etc/process_perfdata.cfg) you can increase the debug level. Data processing will be logged in var/perfdata.log.

3. Graphs are shown without text? Have a look at the requirements.

4. Using the npcdmod module the value of the nagios.cfg directive event_broker_options may have to be adapted if it was modified. You'll find some details here.

5. You can use the script verify_pnp_config.pl in the scripts directory of the installation folder or the libexec folder after installation to check your settings and if performance data is present and/or valid. The syntax is quite simple for that:

./verify_pnp_config.pl -m <mode>

whereas <mode> is one of “sync”, “bulk” or “npcd” (without quotes). Please note that using “default” will select “npcd” which is different from the behaviour in PNP 0.4.x.

back to contents | verify_pnp_config.pl

pnp4nagios-0.6.16/share/pnp/documents/en_US/webfe_cfg.html0000664000000000000000000001042511662503006022075 0ustar rootroot

PNP Web Frontend

The behaviour of the PNP Web-Frontend can be controlled through the config file etc/config.php. This file will be overwritten during updates of PNP as the paths and options are detected during ./configure.

Own adjustments should be made in etc/config_local.php. If this file does not exist the file config.php can be taken as a guideline.

etc/config.php

Following the most important parameters:

The path to the RRDtool binary. Will be detected by ./configure

 $conf['rrdtool'] = "/usr/bin/rrdtool";

Height and width of the RRD graphs

 $conf['graph_width'] = "500";
 $conf['graph_height'] = "100";

Screen sizes may vary, pages sizes won't. The following two directives enable you to specify different sizes for the creation of PDFs. If they aren't specified the values of the graph sizes are taken.

 $conf['pdf_width'] = "675";
 $conf['pdf_height'] = "100";

Additional options passed with every call of RRDTool, for example —-slope-mode to smooth the graphs

 $conf['graph_opt'] = "";

The path to the RRD and XML files created by process_perfdata.pl

 $conf['rrdbase'] = "/usr/local/pnp4nagios/var/perfdata/";

The path to the config file for the pages.

 $conf['page_dir'] = "/usr/local/pnp4nagios/etc/pages/";

PNP pages will be refreshed every n seconds

 $conf['refresh'] = "90";

Max. age of RRD files in seconds. After reaching this value links to the graphs will be marked as inactive

 $conf['max_age'] = 60*60*6;

Base URL to the Nagios CGIs

 $conf['nagios_base'] = "/nagios/cgi-bin";

List of users who are allowed to view links to the services of the current host

 $conf['allowed_for_service_links'] = "EVERYONE";

List of users who can view/access the host search field

 $conf['allowed_for_host_search'] = "EVERYONE";

If PNP is called with a host only ( index.php?host=<myserver> ), the defined user is shown an overview of all services related to this host

 $conf['allowed_for_host_overview'] = "EVERYONE";

The periods of time the RRD graphs will show are determined using the array $views[]. The title and number of graphs can be specified globally in this place

$views[] = array('title' => 'One Hour',  'start' => (60*60) );
$views[] = array('title' => '4 Hours',   'start' => (60*60*4) );
$views[] = array('title' => '25 Hours',  'start' => (60*60*25) );
$views[] = array('title' => 'One Week',  'start' => (60*60*25*7) );
$views[] = array('title' => 'One Month', 'start' => (60*60*24*32) );
$views[] = array('title' => 'One Year',  'start' => (60*60*24*380) );

You can add more views ($views[5], …) but please keep in mind that under normal circumstances ALL views you defined are shown.

back to contents | timeranges

pnp4nagios-0.6.16/share/pnp/documents/en_US/dwnld.html0000664000000000000000000003622411662503006021303 0ustar rootroot

PNP 0.6.x Downloads

Current stable PNP Version

Changes can be tracked on pnp4nagios.git.sourceforge.net

The current Version is pnp4nagios-0.6.15.tar.gz

Latest Devel Version

pnp4nagios-head.tar.gz

This is allways the latest GIT HEAD Version


Last Update: Mon Nov 21 18:11:11 CET 2011

ChangeLog

pnp-0.6.17 ??/??/2011

pnp-0.6.16 11/21/2011

  • Bugfix: Fixed single quoted check_multi labels (Reported by Matthias Flacke)
  • Bugfix: Append missing slash to perfdata_spool_dir ( Reported by Juergen-Michael Radtke )
  • Bugfix: Fixed jQuery-ui multisite theme
  • Feature: PDF margins are now adjustable via config.php ( Thomas Witzenrath )
  • Featire: Support for PDF size 'letter' added ( Robert Becht )

pnp-0.6.15 09/15/2011

  • Bugfix: Fixed Overview link (reported by Stefan Triep)
  • Bugfix: Fixed zoom popup (reported by Rudolf Labuschagne)
  • Bugfix: Fixed double urlencode() (reported by Mathias Kettner)
  • Feature: “Clear basket” button added (suggested by Stefan Triep)
  • Feature: New helper function “rrd::alerter_gr()” ( committed by Stefan Trip )

pnp-0.6.14 08/05/2011

  • Feature: Webinterface for mobile devices based on jQuery Mobile
    ( http://jquerymobile.com/ )
  • Feature: Zoom based on jQuery plugin imgAreaSelect
    ( http://odyniec.net/projects/imgareaselect/ )
  • Feature: New template check_mssql_health.php
  • Bugfix: Fixed popups to work under nginx ( Joram Agten )
  • Bugfix: Helper rrd::vdef() fixed
  • Update: jQuery update to 1.6.2
  • Update: jQuery-ui update to 1.8.14

pnp-0.6.13 05/19/2011

  • Feature: New option –ignore-hosts added to check_pnp_rrds.pl ( by Jochen Bern )
  • Feature: New options zgraph_width and zgraph_height in config.php ( Mike Liebsch )
  • Bugfix: rrd_convert.pl: parse_xml_filename() regex fix
  • Info: Version used by OMD-0.48 OMD

pnp-0.6.12 04/22/2011

  • Feature: mod_gearman support added
  • Feature: rrd_convert.pl is now able to convert all RRDs from RRD_STORAGE_TYPE=SINGLE to RRD_STORAGE_TYPE=MULTIPLE
  • Feature: New template check_gearman.php
  • Feature: Install process_perfdata.cfg and npcd.cfg by default
  • Bugfix: rrd_convert.pl is now able to parse xml dumps created by rrdtool 1.4.x
  • Bugfix: process_perfdata.pl default timeout value set to 15 seconds

pnp-0.6.11 01/15/2011

  • Bugfix: urldecoding fixed
  • Bugfix: Zoom in/out is working again ( Reported by Thorben Soehl )
  • Featue: npcd.cfg - New option perfdata_file_processing_interval used by npcdmod
  • Info: Version used by OMD-0.46 OMD

pnp-0.6.10 12/15/2010

  • Feature: Add RRDTool Option –only-graph if graph height is below 32px to create thumbnails
  • Feature: RRDTool Option –width and –height is now allowed in templates
  • Feature: RRDTool DS Type for UOM of “c” changed from COUNTER to DERIVE
  • Feature: Pass query string from special controller to image controller ( Matthew Garrett )
  • Feature: Authorisation against mk_livestatus API added
  • Feature: Sample nginx webserver config added ( by evax@users.sourceforge.net )
  • Feature: Kohana backport to support PHP 5.1.6 ( Kudos to Andreas Ericsson )
  • Bugfix: Sort list of special templates
  • Bugfix: Urlencode hostname and service description ( Reported by Yannick )
  • Bugfix: corrected warning/critical thresholds in ticker/alerter functions

pnp-0.6.7 09/27/2010

  • Bugfix: Page config parser fix (Beau Gunderson)
  • Bugfix: Zoom window size fixed (Report by Rudolf Labuschagne)
  • Bugfix: Fixed undefined offset while using 'ds_name' in templates (Reported by Vladimir Bilik)
  • Bugfix: Npcdmod respects process_perf_data option used in hosts and services definitions ( Reported by Wolfgang Barth )
  • Template: New Template check_nagiostats.php used with check_nagiostats written by Jochen Bern

pnp-0.6.6 08/07/2010

  • Bugfix: Fixed max amount of graphs per template
  • Bugfix: Autodetect PNP base URL
  • Bugfix: Too short npcdmod perfdata_template to take perfdata + overhead, increased +1024byte
  • Bugfix: Ignore files in var/perfdata and check for empty directories
  • Bugfix: Reducing memory usage while parsing page config (Laurent Freval)

pnp-0.6.5 07/09/2010

  • Feature: Special Templates are back tpl_special
  • Feature: New rrdtool helper functions makes template design easier tpl_helper
  • Feature: config.php → 'recursive_template_search' is enabled by default
  • Feature: config.php → 'template_dirs' is now an array of directorys to search for PNP templates

pnp-0.6.4 06/03/2010

  • Update: jQuery Update to 1.4.2
  • Update: jQuery-ui Update to 1.8
  • Feature: New configure Option –with-base-url
  • Template: New template check_ntp_time.php (Mathias Kettner)
  • Feature: New i18n files for fr_FR (Yannig Parre)
  • Feature: New jQuery Theme 'multisite'

pnp-0.6.3 03/16/2010

  • Feature: New helper script libexec/rrd_convert.pl → rrd_convert
  • Bugfix: Ignore old XML files while building the service list
  • Template: New template check_hpasm.php
  • Bugfix: Installer now checks for json_decode()
  • Workaround: Allow “trailing unfilled semicolons”. Workaround for nsclient++
  • Template: Updates for check_openmanage.php, check_hp_bladecenter.php and check_dell_baldecenter.php ( Trond Hasle Amundsen )”

pnp-0.6.2 12/23/2009

  • Feature: XML_WRITE_DELAY option added to process_perfdata.cfg as suggested by Mathias Kettner
  • Feature: New template integer.php
  • Update: FPDI update to 1.3.1
  • Feature: PNP will now work with lighttpd and php-cgi
  • Template: check_mk-ps.perf.php added ( by Mathias Kettner )
  • Feature: PNP will now work without mod_rewrite → webfe
  • Bugfix: Wrong pdf link used on site 'pages' and 'basket'
  • Bugfix: Incorrect group permissions on spool directory

pnp-0.6.1 11/22/2009

  • Feature: RRD heartbeat per check_command → tpl_custom
  • Feature: New config.php option pdf_graph_opt
  • Feature: Recognize the 'background_pdf' option in page definitions → pages
  • Feature: Recognize the 'source' option in page definitions → pages
  • Feature: Array $TIMERANGE now available for templates → timeranges
  • Bugfix: ./configure –sysconfdir no longer ignored
  • Feature: Store internal runtime statistics on a per minute base
  • Feature: Added two widgets views/widget_menu.php and views/widget_graph.php

pnp-0.6.0 10/30/2009

  • Webfrontend based on Kohana
  • Webfrontend based on jQuery Themes
  • Javascript-functions using jQuery plugins
  • process_perfdata.pl will be able to use one RRD database per datasource
  • improved installer. Specification of directory layouts using –with-layout
  • RRDtool errors are now displayed as images. no more missing images
  • PNP templates cannot overwrite internal variables anymore
  • PNP templates of version 0.4.x can still be used
  • PDF functions recoded
  • Template default.php optimized
  • Export from RRD databases into XML, CSV and JSON format using the RRDtool “xport” function
  • Page functions recoded
  • Error pages links to online FAQ
  • Mouseover Popup in Nagios frontend via jQuery.clueTip plugin
  • Full support of rrdcached
pnp4nagios-0.6.16/share/pnp/documents/en_US/tpl_helper_pnp.html0000664000000000000000000000671011662503006023203 0ustar rootroot

PNP Helper Functions

PNP Helper functions are meant to simplify the creation of templates. In contrast to the rrd helper functions they don't call existing RRDtool functions.

pnp::adjust_unit

(string,number,string,number) pnp::adjust_unit ( $value, $base=1000, $format='%.3lf' )

The purpose of this function is to “normalize” large numbers. Modern hard disks have reached sizes of several GB or TB and looking at numbers like 1521073648234 you begin to count the digits so it would be more convienient to translate the value. The same applies to network traffic.

The function takes up to three parameters and returns an array with four elements in any case.

  • The first parameter to be passed is the number (including an “UOM”, if applicable)
  • The second parameter is optional and defaults to “1000” (e.g. traffic), but might be “1024” (e.g. disk size) as well
  • The third parameter is optional, defaults to '%.3lf', and specifies the format of the value to be returned
$size = pnp::adjust_unit(1521073648234,1024,'%7.3lf');

Please note that “$size” is an array consisting of four fields:

 $size[0] := "  1.383 T"

contains the formatted value including the unit

 $size[1] := "1.383"

contains the formatted number

 $size[2] := "T"

contains the unit

 $size[3] := "1099511627776"

contains the divisor

Assuming check_disk returns “MB” as UOM you can append that as well

$disk = pnp::adjust_unit("1524MB",1024,'%7.3lf');

will result in $disk[0] := “1.448 GB


“old” check_disk template with %s directive


“new” check_disk template with pnp::adjust_unit

pnp4nagios-0.6.16/share/pnp/documents/en_US/timeranges.html0000664000000000000000000000640311662503006022325 0ustar rootroot

Timeranges

In the overview PNP shows five timeranges which can be defined in config.php.

Additionally you can influence the timeranges via the URL. This can be useful to automatically create PDF documents. The ranges can be defined using the options “start” and “end”.

Example:

 pnp4nagios/graph?host=<hostname>&srv=<servicedesc>&start=-1week

The graph will start one week prior to the current date and time. It will end at the current timestamp.

start end view result
all views ending at current timestamp
x all views starting at defined date
x all views ending at defined date
x x one view between the two dates
x one view ending at current timestamp
x x one view starting at defined date
x x one view ending at defined date

Examples of different specifications

format description
2009W04 4. week of 2009
1.5.2009 May, 1st 2009
-1 day one day back
-3 weeks 3 weeks back
-1 year one year back
yesterday yesterday

back to contents | pages

pnp4nagios-0.6.16/share/pnp/documents/en_US/tpl_special.html0000664000000000000000000003612011662503006022465 0ustar rootroot

Special templates

“special templates” (starting with PNP 0.6.5) are used to combine data from arbitrary hosts and services and thus are not connected directly to a host or service.

Often it is desired to show data from several services in one graph. Every time the "pages" will not be sufficient the special templates may come into play.

Basics

“Special templates” will be searched in pnp4nagios/share/templates.special and must have the extension .php.

They are called via the controller “special” using

http://<your-nagios-server>/pnp4nagios/special?tpl=<template>

<template> is to be replaced with the particular template without the extension .php.

An appropriate link will be shown in the PNP interface if at least one “special template” was found.

Example

The task is to show the response times of all web servers with hostnames websrv, websrv02, and websrv03 in one graph. The data is provided by the service “HTTP”.

Step 1: create a template “websrv_response_times.php” in the folder pnp4nagios/share/templates.special

“Special templates” always start with the definition of a title and a comment.

$this->MACRO['TITLE']   = "HTTP Response Times";
$this->MACRO['COMMENT'] = "HTTP Response Times for all Cluster Nodes";

Step 2: create a list of all hosts/services which come into question. PNP provides a function tplGetServices() to accomplish this task.

tplGetServices() expects two parameters.

Parameter 1 is a regular expression for the host(s), parameter 2 a regular expression for the service(s).

$services = $this->tplGetServices("websrv","HTTP");

$services now is an array with all services found.

To ease template development and to give an insight on the data structures you can force Kohana to stop processing using an exception.

To show the data of $services you just need the following line:

throw new Kohana_exception(print_r($services,TRUE));

Output of pnp4nagios/special?tpl=websrv_response_times

Array ( 
  [0] => Array ( 
     [host] => websrv01 
     [service] => HTTP 
  ) 
  [1] => Array ( 
     [host] => websrv02
     [service] => HTTP 
  ) 
  [2] => Array ( 
     [host] => websrv03
     [service] => HTTP 
  ) 
)

The variable $services contains an array with all services found, in this case three hosts with the service “HTTP”.

Step 3: Iterating the array $services and creating the graph definitions

foreach($services as $key=>$val){
    $data      = $this->tplGetData($val['host'],$val['service']);
    $hostname  = rrd::cut($data['MACRO']['HOSTNAME'], 15);
    $def[0]   .= rrd::def("var$key" , $data['DS'][0]['RRDFILE'], $data['DS'][0]['DS'] );
    $def[0]   .= rrd::line1("var$key", rrd::color($key), $hostname);
    $def[0]   .= rrd::gprint("var$key", array("MAX", "AVERAGE"));
}

Inside the loop the function tplGetData is used to read the particular XML file. The data is returned as an array called $data.

In this example some other little PNP helpers are used recognisable by the extension rrd::.

The function rrd::cut() cuts a string to a specific length or fills up to this length. This might be helpful to align the legend.

The function rrd::gprint() creates the legend below the graph.

The function rrd::color() returns a colour from a predefined list of colours.

You will find more information on the PNP helpers here.

<?php
#
# Special Template websrv_response_times.php
#
$this->MACRO['TITLE']   = "HTTP Response Times";
$this->MACRO['COMMENT'] = "HTTP Response Times for all Cluster Nodes";
#
# Get a List of Services by regex 
# Option 1 = 'Host Regex'
# Option 2 = 'Service Regex'
#
$services = $this->tplGetServices("websrv","HTTP");
#throw new Kohana_exception(print_r($services,TRUE));
#
# The Datasource Name for Graph 0
$ds_name[0] = "Response Times";
$opt[0]     = "--title \"Response Times\"";
$def[0]     = "";
#
# Iterate through the list of hosts
foreach($services as $key=>$val){
    #
    # get the data for a given Host/Service
    $data = $this->tplGetData($val['host'],$val['service']);
    #
    # Throw an exception to debug the content of $a
    # Just to get Infos about the Array Structure
    #
    #throw new Kohana_exception(print_r($a,TRUE));
    $hostname   = rrd::cut($data['MACRO']['HOSTNAME']);
    $def[0]    .= rrd::def("var$key" , $data['DS'][0]['RRDFILE'], $data['DS'][0]['DS'] );
    $def[0]    .= rrd::line1("var$key", rrd::color($key), $hostname);
    $def[0]    .= rrd::gprint("var$key", array("MAX", "AVERAGE"));
}
?>

back to contents

pnp4nagios-0.6.16/share/pnp/documents/en_US/mobile.html0000664000000000000000000001051111662503006021431 0ustar rootroot

Mobile UI

Starting with PNP4Nagios 0.6.14 a web interface for mobile devices is integrated into PNP4Nagios.

The design was realised using jQuery Mobile and hence is compatible to current mobile browsers. The list of the supported devices shows a graded browser support chart.

Landing Page

The web interface was designed to intercept the calls to the classical interface and to redirect them to the appropriate mobile page. This way links to PNP graphs inside Nagios mails don't have to be changed and point to the correct page depending on the device type..

Classic Mobile
/pnp4nagios/graph /pnp4nagios/mobile
/pnp4nagios/graph?host=localhost /pnp4nagios/mobile/host/localhost
/pnp4nagios/graph?host=localhost&srv=ping /pnp4nagios/mobile/graph/localhost/ping

Browser recognition

Browsers are recognised as mobile browsers by analysing the “user agent” string. The recognition can be influenced by changing pnp4nagios/etc/config_local.php.

$conf['mobile_devices'] = 'iPhone|iPod|iPad|android';

The option 'mobile_devices' contains a regular expression which is compared with the “user agent” string of the browser.

The “user agent” string of a browser is logged in the web server access log. An entry for an iOS device looks similar to the following.

"Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_1 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8B117 Safari/6531.22.7"

Screenshots

Screenshot taken with an iPhone and iOS 4.2

 Home Screen Homescreen  Loading... Loading …
 Hosts Liste List of all hosts  Liste aller services List of all services of a host
 Graphen Graph of a service
pnp4nagios-0.6.16/share/pnp/documents/en_US/about.html0000664000000000000000000002215611662503006021304 0ustar rootroot

About PNP

System requirements

PNP mandatory requires valid performance data of nagios plugins.

So what is this performance data?

The output of a nagios plugin up to nagios 2.x is limited to one line. When the plugin produces performance data, it is divided into two parts. The pipe symbol (“|”) is used as a delimiter.

Example check_icmp :

 OK - 127.0.0.1: rta 2.687ms, lost 0% | rta=2.687ms;3000.000;5000.000;0; pl=0%;80;100;;

resulting in the text on the left side of the pipe symbol

 OK - 127.0.0.1: rta 2.687ms, lost 0%

and the performance data

  rta=2.687ms;3000.000;5000.000;0; pl=0%;80;100;;

Performance data is designed for automatic processing. The format is specified within the Developer Guidelines (you'll find an excerpt here) but should be exemplified here nonetheless:

  rta=2.687ms;3000.000;5000.000;0;
   |    |  |    |         |     | |
   |----|--|----|---------|-----|-|----- * label 
        |--|----|---------|-----|-|----- * current value
           |----|---------|-----|-|----- unit ( UOM = UNIT of Measurement ) 
                |---------|-----|-|----- warning threshold
                          |-----|-|----- critical threshold 
                                |-|----- minimum value 
                                  |----- maximum value
                                  

Value marked with * are mandatory. All other values are optional.

Several data series are separated by blanks. The actual data must not contains any blanks. If the label contains blanks, it has to be surrounded by single quotes.

Required Software

  • Perl >= 5.x without additional modules
  • RRDtool >= 1.x, better 1.2 but not compulsory
    Attention: installing RRDtool without a packet manager might lead to missing dejavu fonts. If you see graphs without text then this may be the cause.
  • PHP >= 5.1.6 for the Webfrontend based on Kohana
  • Nagios >= 2.x or Icinga
  • Kohana needs the module “mod_rewrite” to be enabled. For details please have a look at the documentation of your web-server specific to your distribution.

License

PNP is licensed under GPL 2

Download

Development of PNP is organized using Sourceforge.Net. PNP is registered under “PNP4nagios”.

The current stable version of 0.6.x can be found in the download area: Sourceforge Download

Starting with PNP 0.6.x the source code repository was switched from SVN to GIT.

The current development can be viewed anytime at http://pnp4nagios.git.sourceforge.net/. Clicking on PNP Devel version will download an archive containing the latest version.

Support

PRIOR to support questions please make sure that you have verified certain things described under verify your installation.

The developers and helpers are present on a separate board at http://www.nagios-portal.org and will be informed about new postings in the PNP-section. Postings in english will be answered as well.
After registering as a user please fill in the profile regarding operating system and PNP version used. Please mention if you used a package or compiled the sources. Please mark successfully solved threads by adding ”[solved]” to the title as it helps other users to find a solution for their problem.

The mailing lists on Sourceforge can be used to request support (and are limited to english):

pnp4nagios-users: users list for general questions regarding configuration. Please state your operating system and PNP version

pnp4nagios-devel: devel list for suggestions and error reports. Please state your operating system and PNP version

pnp4nagios-checkins: the checkin list automatically contains changes to the SVN repository

Storage

Performance data will be stored in Round Robin Databases using RRDtool. That means that after some time the oldest data will be dropped at the “end” and it will be replaced by new values “at the beginning”.

Various intervals provide for different resolutions. Using the defaults allows to store the data with a resolution of one minute for the last two days, five minutes resolution for ten days, 30 minutes resolution for 90 days and 6 hours resolution for four years. The increasing interval causes averaging of the data which leads to smaller max values. This not an error of PNP.

Using this storage format the size of the files will stay the same over time. Per datasource you will need approx. 400 KB.

Statistics and links to Sourceforge

pnp4nagios-0.6.16/share/pnp/documents/en_US/xport.html0000664000000000000000000000302111662503006021334 0ustar rootroot

Data export

PNP provides access to RRD data using the xport controller. The output format can be specified. At the moment the formats xml, json and csv are supported.

The controller can be called using the URL

/pnp4nagios/xport/<format>?host=<hostname>&srv=<servicedesc>

whereas <format> has to be replaced with the desired format.

You can also use wget to generate images and place them in periodic reports. One example may be:

wget -O image.png 'http://<user>:<pass>@<nagios-server>/pnp4nagios/image?host=<hostname>&srv=<service>&view=2&source=0'

view=<n> limits the graph to the timeperiod specified in config.php
source=<n> only shows one data source if you have more than one in your RRD file

Instead of view you can use start and/or end to specify the time period. For details please look at "time ranges".

back to contents | templates

pnp4nagios-0.6.16/share/pnp/documents/en_US/pages.html0000664000000000000000000000571611662503006021274 0ustar rootroot

Pages

“pages” provide the opportunity to collect graphs of different hosts/services on one page. That way - as an example - you can display the traffic rates of all tape libraries. Regular expressions are possible so you can accomplish a lot with only few definitions - provided that you have appropriate names. The directory specified using “$conf['page_dir']” contains one or more file with the extension ”.cfg”.

Comments start with a hash-sign (#) and are possible within lines as well. Each file contains a “page” definition which specifies the name of the page and it determines whether the following graph definition contains regular expressions or not.
The description behind page_name appears in the list of available pages and will be used as title of the browser window. Attention: “host_name” and “service_desc” refer to the name of the file in the perfdata directory, not to the definition in Nagios. Blanks are replaced by underscores (_).

define page {
       use_regex 1		# 0 = use no regular expressions, 1 = use regular expressions
       page_name test-page	# page description
}

One or more “graph” definitions follow:

define graph {
       host_name       host1,host2,host3
       service_desc    Current_Load
}

Attention: The list of host name will only work if you use regex 0!

define graph {
       host_name       host4
       service_desc    Current_Users
}

And now some definitions with regular expressions. At first all hosts whose names are starting with “Tape”:

define graph {
       host_name       ^Tape
       service_desc    Traffic
}

all hosts whose names are ending with “00”:

define graph {
       host_name       00$
       service_desc    Load
}

all services of localhost whose names contain “a” or “o”, respectively:

define graph {
       host_name       localhost
       service_desc    a|o
}

all services whose names contain an underscore followed by (at least) three digits on all hosts whose names start with “UX”:

define graph {
       host_name       ^UX
       service_desc    _\d{3}
}

In some cases you may want to limit the display to just one graph. To accomplish this you can use the optional directive “source” followed by a number specifying the position within the RRD file starting at 0

define graph {
       host_name       host1,host2,host3
       service_desc    PING
       source          1
}

back to contents | data export

pnp4nagios-0.6.16/share/pnp/documents/en_US/webfe.html0000664000000000000000000001514411662503006021261 0ustar rootroot

Nagios web frontend

Of course PNP should be easily accessible. You do not want to search long for the right graph.

Nagios itself features external URLs using so called extended info configs. Due to changes between Nagios 2.x and Nagios 3.x both versions are described.

Nagios 2.x

With Nagios 2.x the integration of external URLs into the nagios web interface is made using Extended Info Objects for services. For PNP we use the directive action_url to call the PNP web frontend with the appropriate options.

define serviceextinfo {
   host_name             localhost
   service_description   load
   action_url            /pnp4nagios/index.php/graph?host=$HOSTNAME$&srv=$SERVICEDESC$
}

You have to specify an additional Extended Info Definition for every service.

Nagios 3.x

Since nagios 3.0 the action_url-directive has be moved to the host or service definition. This way the definition of URLs to the PNP-interface has been simplified. The serviceextinfo and hostextinfo definitions are deprecated.

First two nagios templates are defined. If you used the Nagios quickstart installation guides you can append these lines to templates.cfg:

define host {
   name       host-pnp
   action_url /pnp4nagios/index.php/graph?host=$HOSTNAME$&srv=_HOST_
   register   0
}

define service {
   name       srv-pnp
   action_url /pnp4nagios/index.php/graph?host=$HOSTNAME$&srv=$SERVICEDESC$
   register   0
}

These two templates can now be included via “use srv-pnp” or “use host-pnp” for services and hosts respectively. If you used the quickstart installation guide you might for example edit the file localhost.cfg and add the template to the host or service definition as follows:

define host{
        use                     linux-server,host-pnp    ; Name of host templates to use
                                                         ; This host definition will inherit all variables that are defined
                                                         ; in (or inherited by) the linux-server host template definition.
        host_name               localhost
        alias                   localhost
        address                 127.0.0.1
        }
define service{
        use                     local-service,srv-pnp   ; Name of service template to use
        host_name               localhost
        service_description     PING
        check_command           check_ping!100.0,20%!500.0,60%
        }

The links to the correct URLs are created automagically.

Tips: if you want to open the PNP window in your main frame (on the right of the menu) instead of a new page, just set action_url_target=main in your nagios cgi.cfg

Popups

You can integrate PNP into Nagios in a way that you have current graphs without clicking any icons. This can be accomplished using the CGI Includes which allow us to include JavaScript code in the status detail view ( status.cgi ).

Prerequisites:

  • PNP is installed and running
  • the file status-header.ssi from the contrib/ssi/ folder of the PNP package was copied to /usr/local/nagios/share/ssi/.
    Attention: This file must NOT be executable. Otherwise it will be treated as a CGI which will result in an error.
    *Note to Apache admins*: Apache ssi and Nagios ssi only have a similar name.
  • the appropriate service definition(s) has/have been modified. Please note that until Nagios 2.x you have to modify the serviceextinfo definition (which is deprecated starting with Nagios 3).

Definition:

define host {
   name       host-pnp
   action_url /pnp4nagios/index.php/graph?host=$HOSTNAME$&srv=_HOST_' class='tips' rel='/pnp4nagios/index.php/popup?host=$HOSTNAME$&srv=_HOST_
   register   0
}

define service {
   name       srv-pnp
   action_url /pnp4nagios/index.php/graph?host=$HOSTNAME$&srv=$SERVICEDESC$' class='tips' rel='/pnp4nagios/index.php/popup?host=$HOSTNAME$&srv=$SERVICEDESC$
   register   0
}

After a restart of Nagios (after modifying the definitions) the result might look like this:

back to contents | config options

pnp4nagios-0.6.16/share/pnp/documents/en_US/advanced.html0000664000000000000000000000662411662503006021741 0ustar rootroot

Distributed Systems

If Nagios is implemented as a distributed system you have to decide where PNP should be installed.

From a technical view this question is not important. PNP can be installed on the slave(s) as well as on the master server. Or only on the master?

If PNP is running on the master you have to make sure that data passed via send_nsca from the slave server(s) contains performance data. Often another check command is used on the master.

To help PNP on the master to recognize which check command was used on the slave to collect the information process_perfdata.pl responds to an additional field at the end of the performance data.

OK - 127.0.0.1: rta 2.687ms, lost 0% | rta=2.687ms;3000.000;5000.000;0; pl=0%;80;100;; [check_icmp]

If PNP finds a string enclosed in brackets at the end of performance data it will be recognized as check command and will be used as PNP template.

Nagios documentation related to this topic can be found here. The command used in the documentation can be adapted easily.

define command{
	command_name	submit_check_result
	command_line	/usr/local/nagios/libexec/eventhandlers/submit_check_result $HOSTNAME$ '$SERVICEDESC$' $SERVICESTATE$ '$SERVICEOUTPUT$'
	}

should be changed to

define command{
	command_name	submit_check_result
	command_line	/usr/local/nagios/libexec/eventhandlers/submit_check_result $HOSTNAME$ '$SERVICEDESC$' $SERVICESTATE$ '$SERVICEOUTPUT$ | $SERVICEPERFDATA$ [$SERVICECHECKCOMMAND$]'
	}

check_multi plugin

The plugin check_multi is one of the first plugins which uses new features of Nagios 3.x. Check_multi can execute multiple Nagios plugins but returns only results like a single service. The output of check_multi comprises of several lines to be able to display the amount of information.

This results in some difficulties for PNP which has to extract the information of several plugins from the performance data. Together with Matthias Flacke, developer of check_multi, we have found a solution to assign the data to the appropriate plugins.

back to contents | support of rrdcached

pnp4nagios-0.6.16/share/pnp/documents/en_US/tpl.html0000664000000000000000000004360311662503006020771 0ustar rootroot

What are templates?

PNP uses templates to influence the appearance of RRD graphs.

The selected check_command determines which template will be used to control the graph. Following will be described where templates are stored and how the decision for the “right” template is made.

What template will be used when?

Templates are stored at two places in the file system.

  • share/templates.dist - for templates included in the PNP package
  • share/templates - for custom made templates which are not changed during updates

If the graph for the service “http” on host “localhost” should be shown, PNP will look for the XML file perfdata/localhost/http.xml and read its contents. The XML files are created automatically and contain information about the particular host and service. The header contains information about the plugin and the performance data. The XML tag <TEMPLATE> identifies which PNP template will be used for this graph.

/localhost/http.xml

<NAGIOS>
  <DATASOURCE>
    <TEMPLATE>check_http</TEMPLATE>
    <DS>1</DS>
    <NAME>time</NAME>
    <UNIT>s</UNIT>
    <ACT>0.006721</ACT>
    <WARN>1.000000</WARN>
    <CRIT>2.000000</CRIT>
    <MIN>0.000000</MIN>
    <MAX></MAX>
  </DATASOURCE>
  <DATASOURCE>
    <TEMPLATE>check_http</TEMPLATE>
    <DS>2</DS>
    <NAME>size</NAME>
    <UNIT>B</UNIT>
    <ACT>263</ACT>
    <WARN></WARN>
    <CRIT></CRIT>
    <MIN>0</MIN>
    <MAX></MAX>
  </DATASOURCE>
...
</NAGIOS>

PNP will look for a template with the name check_http.php in the following sequence:

  1. templates/check_http.php
  2. templates.dist/check_http.php
  3. templates/default.php
  4. templates.dist/default.php

The template default.php takes an exceptional position as it is used every time no other applicable template is found.

Creating own templates

PNP templates are PHP files which are included during execution of PNP using the PHP function include(). This means that every PHP code in templates will be interpreted so manipulation of all values is possible.

PNP template must have the following characteristics:

  1. templates must contain valid PHP code.
  2. templates must not create any output.
  3. the two arrays $opt[] and $def[] have to be filled

These two arrays are used to call 'rrdtool graph' so every option is possible that RRDtool supports. All options of RRDtool are described very thoroughly on the RRDtool Homepage.

If both arrays contain more than one set of data graphs will be created for every set.

Inside the templates the data from the related XML files can be used.

Using the relatively simple template response.php we will describe the most important options.

<?php
#
$opt[1] = "--title \"Response Time For $hostname / $servicedesc\" ";
#
$def[1] =  "DEF:var1=$RRDFILE[1]:$DS[1]:AVERAGE " ;
$def[1] .= "AREA:var1#00FF00:\"Response Times \" " ;
$def[1] .= "LINE1:var1#000000 " ;
$def[1] .= "GPRINT:var1:LAST:\"%3.4lg %s$UNIT[1] LAST \" ";
$def[1] .= "GPRINT:var1:MAX:\"%3.4lg %s$UNIT[1] MAX \" ";
$def[1] .= "GPRINT:var1:AVERAGE:\"%3.4lg %s$UNIT[1] AVERAGE \" ";
?>

Note: as the number (1) and the letter “L” look alike in this listing: the format ”%3.4lg” contains a small letter.

$opt[1] = ”–title … sets RRDtool options for the first set of data, here the title as you can see. Embedded quotes are masked using a backslash (\). The variables $hostname and $servicedesc were determined through the call of PNP and are available for the template as well.

$def[1] = “DEF:var1=$RRDFILE[1]:$DS[1]:AVERAGE ”; defines which data is to be read from which RRD file. $RRDFILE[1] contains the path to the RRD file of this service. $DS[1] refers to the first data series from the RRD file.

$def[1] .= “AREA:var1#00FF00:\”Response Times \” ”; the operator ”.=” appends more data to the array $def[1]. An area will be drawn using data from the variable var1. The color is defined in HEX notation #00FF00 (red, green, blue). The label is “Response Times”.

$def[1] .= “LINE1:var1#000000 ”; As completion of the just drawn area a line (LINE1) will be drawn in black (#000000).

$def[1] .= “GPRINT:var1:LAST:\”%3.4lg %s$UNIT[1] LAST \” ”;
$def[1] .= “GPRINT:var1:MAX:\”%3.4lg %s$UNIT[1] MAX \” ”;
$def[1] .= “GPRINT:var1:AVERAGE:\”%3.4lg %s$UNIT[1] AVERAGE \” ”;

The three GPRINT lines build up the caption for the graph. The current values are formatted using the printf syntax.

Available variables

Using the data collector process_perfdata.pl PNP stores not only performance data but other values exported by Nagios. These values are stored in the XML file associated to the appropriate service.

In the first part of the XML file the performance data is stored in separate components.

<NAGIOS>
  <DATASOURCE>
    <TEMPLATE>check_http</TEMPLATE>
    <DS>1</DS>
    <NAME>time</NAME>
    <UNIT>s</UNIT>
    <ACT>0.006721</ACT>
    <WARN>1.000000</WARN>
    <CRIT>2.000000</CRIT>
    <MIN>0.000000</MIN>
    <MAX></MAX>
  </DATASOURCE>
....
</NAGIOS>

The field <DS> designates the data source and is used to identify the data series of the RRD files and is the key of the following arrays as well.

The array $UNIT[1] contains the unit of measurement of the first data series.

The XML file contains other information. When process_perfdata.pl is used in default mode all available macros are at hand with the current values. For the benefit of readability the following lines show only an extract.

<NAGIOS>
...
  <NAGIOS_SERVICENOTIFICATIONID>8418</NAGIOS_SERVICENOTIFICATIONID>
  <NAGIOS_SERVICENOTIFICATIONNUMBER>0</NAGIOS_SERVICENOTIFICATIONNUMBER>
  <NAGIOS_SERVICEOUTPUT>HTTP OK HTTP/1.1 200 OK - 10087 bytes in 0.125 seconds</NAGIOS_SERVICEOUTPUT>
  <NAGIOS_SERVICEPERCENTCHANGE>0.00</NAGIOS_SERVICEPERCENTCHANGE>
  <NAGIOS_SERVICEPERFDATA>time=0.124811s;;;0.000000 size=10087B;;;0</NAGIOS_SERVICEPERFDATA>
  <NAGIOS_SERVICEPERFDATAFILE></NAGIOS_SERVICEPERFDATAFILE>
  <NAGIOS_SERVICEPROBLEMID>0</NAGIOS_SERVICEPROBLEMID>
  <NAGIOS_SERVICESTATE>OK</NAGIOS_SERVICESTATE>
  <NAGIOS_SERVICESTATEID>0</NAGIOS_SERVICESTATEID>
  <NAGIOS_SERVICESTATETYPE>HARD</NAGIOS_SERVICESTATETYPE>
  <NAGIOS_SHORTDATETIME>27-12-2007 13:51:23</NAGIOS_SHORTDATETIME>
...
</NAGIOS>

The various XML fields can be used as variables in the PNP templates. Each field is available as a variable with the same name.

The value of the field <NAGIOS_SERVICEOUTPUT> is available as the variable $NAGIOS_SERVICEOUTPUT.

back to contents | custom templates

pnp4nagios-0.6.16/share/pnp/documents/en_US/tpl_custom.html0000664000000000000000000001215111662503006022355 0ustar rootroot

Custom Templates

As already described under ”What are templates ?” the appearance of graphs depends on the check command used.

There are situations where this behaviour must be overruled. This has to be done when universal commands have been defined.

CUSTOM_TEMPLATE

Example:

define command {
  command_name check_nrpe
  command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$ -a "$ARG2$"
}

This would lead to a call of the check_nrpe.php template even when the monitored host would use a completely different plugin which is called via NRPE.

PNP, especially process_perfdata.pl, will search for a config file (<check_command>.cfg) in the etc/check_commands directory and read its contents (if available).

As our example command is called check_nrpe it will be searched for etc/check_commands/check_nrpe.cfg.

During installation a sample config file with the extension .cfg-sample is copied to etc/check_commands.

Two options can be set in this config file:

# check_command check_nrpe!load!-w 4,4,4 -c 5,5,5
# ________0__________|       |       |
# ________1__________________|       |
# ________2__________________________|
#
CUSTOM_TEMPLATE = 1

CUSTOM_TEMPLATE = 1 assures that only the contents of $ARG1$ will be used as a template name. As $ARG1$ contains “load” in this example the template name would result in “load.php”.

CUSTOM_TEMPLATE = 0,1 results in → “check_nrpe_load.php”

CUSTOM_TEMPLATE = 1,0 results in → “load_check_nrpe.php”

DATATYPE

The option “DATATYPE” controls the datatype which is used during creation of the RRD database. Default is “GAUGE”. For consecutive values the type should be “COUNTER”. Plugin-developers should use the unit “c” for counters but this is not always the case.

To set all datasources to COUNTER

DATATYPE = COUNTER

Setting datasources to different types

DATATYPE = GAUGE,GAUGE,COUNTER,COUNTER

This option has effect only during creation of the RRD database.

More datatypes are explained in the RRDTool documentation found at rrdcreate.

MIN and MAX

In a few situations it might be necessary to limit the values which are valid for RRDTool.

RRD databases can be created with fixed minimum and maximum values. You will find further details at http://oss.oetiker.ch/rrdtool/doc/rrdcreate.en.html.

Account for the maximum value taken from the performance data

USE_MAX_ON_CREATE = 1

Account for the minimum value taken from the performance data

USE_MIN_ON_CREATE = 1

RRD_STORAGE_TYPE

RRD_STORAGE_TYPE = SINGLE

The option RRD_STORAGE_TYPE defines the kind of data storage.

Possible values are MULTIPLE and SINGLE, respectively.

SINGLE: A RRD database per service

MULTIPLE: One or more RRD databases per service. Each datasource will be stored in a separate RRD database.

ATTENTION: The data will not be migrated automatically! You will find a conversion script here.

RRD_HEARTBEAT

Starting with PNP 0.6.1

RRD_HEARTBEAT = 305

After <RRD_HEARTBEAT> seconds RRDtool expects new data.

More information at http://oss.oetiker.ch/rrdtool/doc/rrdcreate.en.html

back to contents | PNP in distributed environments

pnp4nagios-0.6.16/share/pnp/documents/images/0000775000000000000000000000000011662503006017532 5ustar rootrootpnp4nagios-0.6.16/share/pnp/documents/images/smileys/0000775000000000000000000000000011662503006021217 5ustar rootrootpnp4nagios-0.6.16/share/pnp/documents/images/smileys/icon_doubt.gif0000664000000000000000000000173611662503006024042 0ustar rootrootGIF89aPt8":0 d{.)FUwfK8 (߾/NV<} X{EEE}$z\yyzt p>o>b}}pL~H~{8rppEp {x@{p E NDry}} }}0@.X{ p@@H<zzٹ pȷ<;e<;Yoٹ agTS !\,`đaIj! Ie `c`@ia(fX5! , YVؠg! , F嬳Ԧ.!2 , P$-'! ,  "! , Fe+0ZE! , I!2T]U*B)@LMZXYr! , I%[8WA'&1^! , I!8K[BhPH(F;pnp4nagios-0.6.16/share/pnp/documents/images/smileys/icon_smile2.gif0000664000000000000000000000025611662503006024114 0ustar rootrootGIF89aEEE333!,[IjUpLA v𙃚bʺABkƒyZ@`WWb<x5Xj\ 1ò&;pnp4nagios-0.6.16/share/pnp/documents/images/smileys/icon_wink.gif0000664000000000000000000000025211662503006023665 0ustar rootrootGIF89a EEE! ,WIjՕpCLA'00%&p/*p`C%+fP4OpUł:`kLhբanfX$;pnp4nagios-0.6.16/share/pnp/documents/images/smileys/icon_twisted.gif0000664000000000000000000000035611662503006024405 0ustar rootrootGIF89aEEE*333m!,k DhɘВ$*>DE5@NG @ ꚱ- h> h)8T]°ij,c pّJ<G(F1|FZ(%Z#&(!;pnp4nagios-0.6.16/share/pnp/documents/images/smileys/icon_biggrin.gif0000664000000000000000000000025411662503006024340 0ustar rootrootGIF89a EEE! ,YI jե"pIL@gpj)wjʛ pJQl:`J PJ4ZNB oYbe6;pnp4nagios-0.6.16/share/pnp/documents/images/smileys/icon_cry.gif0000664000000000000000000000076211662503006023520 0ustar rootrootGIF89aEEE؁^^^! NETSCAPE2.0!,\ $AY(T.q 'CA+@An:AJaC" &8tp: 7tgUYj0x !N2Q)<&D#!!, $@HdҜM0lB! ,`@! , @&!! , @HdBI! , `dhB!! ,`@! , @&!! , @Hh "&i;pnp4nagios-0.6.16/share/pnp/documents/images/smileys/icon_cool.gif0000664000000000000000000000025411662503006023653 0ustar rootrootGIF89a EEE! ,YIjUpCLAgpj k+;vECp4xevE+mAPiN X:o(`e6;pnp4nagios-0.6.16/share/pnp/documents/images/smileys/icon_eek.gif0000664000000000000000000000025211662503006023461 0ustar rootrootGIF89a EEE! ,WI9jŔ"I"c0@6r +ﱫۮ00P6 F IEy,(i%`'pa6g1܀}g4$;pnp4nagios-0.6.16/share/pnp/documents/images/smileys/icon_confused.gif0000664000000000000000000000025311662503006024524 0ustar rootrootGIF89a EEE! ,XIjՕpCLA''vqj ?*pƂ!\ 'pd/N3(^0-U&kQ@7 3,Km;pnp4nagios-0.6.16/share/pnp/documents/images/smileys/icon_idea.gif0000664000000000000000000000026011662503006023616 0ustar rootrootGIF89a EEE! ,]I jUR"pL@g 0R;~C%q2d|>ORԌݶ(¢VhB 3 ̰,p;pnp4nagios-0.6.16/share/pnp/documents/images/smileys/icon_mrgreen.gif0000664000000000000000000000053511662503006024360 0ustar rootrootGIF89aܱگخ֬ҩΦʢȡƟĞ}|yroli~e|dx`!',zP(Sqi( G$@s40t6EcQlx }8 %`$P!F E" E#E%t$\J&EFD%#"! QIJIA;pnp4nagios-0.6.16/share/pnp/documents/images/smileys/fixme.gif0000664000000000000000000000263311662503006023022 0ustar rootrootGIF89aP     $(!0)0+0, <3@5H<HAPBTFXN`U`VhVh^p]t`tdtgxcxlqEEEov|{~ ˩Ϭϻӱ۾(8  ")./098:ZD< h)@T]ᰥ"ij,cIwdGk+:G(F()Z#&(!;pnp4nagios-0.6.16/share/pnp/documents/images/smileys/icon_lol.gif0000664000000000000000000000052011662503006023501 0ustar rootrootGIF89a EEE! NETSCAPE2.0! ,ZI jեR",AyhTr 1r)\aɎC%<DiJ-A v; Y-4jQ҅xn x1cd"! , I$[8ͫa4 D! ,PH9j! ,0H)j! ,PH9j! ,0H)j;pnp4nagios-0.6.16/share/pnp/documents/images/smileys/icon_fun.gif0000664000000000000000000000111611662503006023505 0ustar rootrootGIF89a[8P :8f߾" 0dX}w(VU tK)N.<Fb{EEE![,[X[&9VX (#FMJ)XX: P<1I6@+DZ "OZX Z4Z8ZZ 5,GS 0!= *>TWQ/C NUB %R$EZZ2.L ZY K Dpa*E , ȎH¸%;pnp4nagios-0.6.16/share/pnp/documents/images/smileys/icon_doubt2.gif0000664000000000000000000000174011662503006024117 0ustar rootrootGIF89aPt8":0 d{.)FUwfK8 (߾/NV<} X{EEE}$z\yyzt p>o>b}}pL~H~{8rppEp {x@{p E NDry}} }}0@.X{ p@@H<zzٹ pȷ<;e<;Yoٹ agTS !\,`đaIj! Ie PTADhJE!;pnp4nagios-0.6.16/share/pnp/documents/images/smileys/icon_question.gif0000664000000000000000000000037011662503006024565 0ustar rootrootGIF89aEEEuϾ/+_W߰of!,u&@YVNq' @k,TAIPgK@L`$[CJgMh%x \Szb Q[0$VF<2])<&G#!;pnp4nagios-0.6.16/share/pnp/documents/images/smileys/icon_surprised.gif0000664000000000000000000000025611662503006024741 0ustar rootrootGIF89a EEE! ,[IjU"pILA''𦫆qj *pƂ ":=+`,@VvaA6XT0ò&;pnp4nagios-0.6.16/share/pnp/documents/images/smileys/icon_smile.gif0000664000000000000000000000025611662503006024032 0ustar rootrootGIF89aEEE333!,[IjUpLA''vqj ?*pƂ!Ӣ X<+kYAb<v5Xj\ 0ò&;pnp4nagios-0.6.16/share/pnp/documents/images/smileys/delete.gif0000664000000000000000000000261511662503006023154 0ustar rootrootGIF89aP      $(!<3333PBTFXN`U`VdZhVh^p^haqEEE~ ˩(83  ")./08:JD C d}hŹRSjk h@3hh`¬Ě뮽: 0ꫬ5MD<Yݐꪬ&$+ nC}~+k) $IC,p;pnp4nagios-0.6.16/share/pnp/documents/images/smileys/icon_neutral.gif0000664000000000000000000000025311662503006024370 0ustar rootrootGIF89a EEE! ,XIjՕpCLA' vpj A88r9ʊ)\ԓbd`a -e&kQ@73,Km;pnp4nagios-0.6.16/share/pnp/documents/de_DE/0000775000000000000000000000000011662503006017225 5ustar rootrootpnp4nagios-0.6.16/share/pnp/documents/de_DE/verify_pnp_config.html0000664000000000000000000001321611662503006023624 0ustar rootroot

verify_pnp_config

Bei Problemen kann das Perl-Script verify_pnp_config von http://verify.pnp4nagios.org helfen die aktuelle Nagios/Icinga Konfiguration zu prüfen und entsprechend Hinweise zur Lösung liefern.

Bei Support Anfragen sollte immer die Ausgabe dieses Scripts mit angegeben werden, da die Entwickler sich so einen besseren Überblick über das verwendete System machen können.

Feedback, Verbesserungsvorschläge oder Patches bitte per Mail an support@pnp4nagios.org

Download

Das Verify Script ist unter http://verify.pnp4nagios.org verfügbar.

wget http://verify.pnp4nagios.org/verify_pnp_config

Test

Das Verify Script benötigt drei Optionen um die Funktion von PNP4Nagios zu prüfen

lenny:~# perl verify_pnp_config

verify_pnp_config -m|--mode=[sync|bulk|bulk+npcd|npcdmod]
                 -c|--config=[path to nagios.cfg]
                 -p|--pnpcfg=[path to PNP config dir]

Die wichtigste Infos ist der zu prüfende Modus, welcher mit der Option –mode angegeben wird.
Weitere Infos über die einzelnen Modi und deren Konfiguration unter "Welcher Modus ist für mich richtig ?" und "Konfiguration"

Weiterhin ist der Pfad zur Nagios Config Datei (nagios.cfg) über die Option –config zu übergeben. Auf einem Icinga System ist es entsprechend der Pfad zur icinga.cfg.

Über –pnpcfg wird der Pfad zum etc Verzeichnis der PNP4Nagios Installation übergeben.

lenny:~# perl verify_pnp_config --mode npcdmod --config=/usr/local/nagios/etc/nagios.cfg --pnpcfg=/usr/local/pnp4nagios/etc
[INFO]  ========== Starting Environment Checks ============
[INFO]  My version is: verify_pnp_config-0.6.14-R.31
[INFO]  Reading /usr/local/nagios/etc/nagios.cfg
[OK  ]  Running product is 'nagios'
[OK  ]  object_cache_file is defined
[OK  ]  object_cache_file=/usr/local/nagios/var/objects.cache
[INFO]  Reading /usr/local/nagios/var/objects.cache
[OK  ]  resource_file is defined
[OK  ]  resource_file=/usr/local/nagios/etc/resource.cfg
[INFO]  Reading /usr/local/nagios/etc/resource.cfg
[INFO]  Reading /usr/local/pnp4nagios/etc/process_perfdata.cfg
[INFO]  Reading /usr/local/pnp4nagios/etc/pnp4nagios_release
[OK  ]  Found PNP4Nagios version "0.6.14"
[OK  ]  Effective User is 'nagios'
[OK  ]  User nagios exists with ID '1000'
[OK  ]  Effective group is 'nagios'
[OK  ]  Group nagios exists with ID '1000'
[INFO]  ========== Checking npcdmod Mode Config  ============
[OK  ]  process_performance_data is 1 compared with '/1/'
[OK  ]  event_broker_options is defined
[OK  ]  event_broker_options=-1
[OK  ]  event_broker_option bits 2 and 3 enabled (12)
[OK  ]  broker_module is defined
[OK  ]  broker_module=/usr/local/pnp4nagios/lib/npcdmod.o config_file=/usr/local/pnp4nagios/etc/npcd.cfg
[OK  ]  npcdmod.o config file is /usr/local/pnp4nagios/etc/npcd.cfg
[OK  ]  /usr/local/pnp4nagios/etc/npcd.cfg used by npcdmod.o is readable
[OK  ]  npcd daemon is running
[OK  ]  /usr/local/pnp4nagios/etc/npcd.cfg is used by npcd and readable
[OK  ]  npcd and npcdmod.o are using the same config file (/usr/local/pnp4nagios/etc/npcd.cfg)
[INFO]  Nagios config looks good so far
[INFO]  ========== Checking config values ============
[INFO]  Reading /usr/local/pnp4nagios/etc/npcd.cfg
[OK  ]  Script /usr/local/pnp4nagios/libexec/process_perfdata.pl is executable
[INFO]  ========== Starting global checks ============
[OK  ]  status_file is defined
[OK  ]  status_file=/dev/shm/status.dat
[INFO]  Reading /dev/shm/status.dat
[INFO]  ==== Starting rrdtool checks ====
[OK  ]  RRDTOOL is defined
[OK  ]  RRDTOOL=/usr/bin/rrdtool
[OK  ]  /usr/bin/rrdtool is executable
[OK  ]  RRDtool 1.3.1  Copyright 1997-2008 by Tobias Oetiker <tobi@oetiker.ch>
[OK  ]  USE_RRDs is defined
[OK  ]  USE_RRDs=1
[OK  ]  Perl RRDs modules are loadable
[INFO]  ==== Starting directory checks ====
[OK  ]  RRDPATH is defined
[OK  ]  RRDPATH=/usr/local/pnp4nagios/var/perfdata
[OK  ]  Perfdata directory '/usr/local/pnp4nagios/var/perfdata' exists
[WARN]  62 hosts/services are not providing performance data
[WARN]  'process_perf_data 1' is set for 43 hosts/services which are not providing performance data!
[WARN]  'process_perf_data 0' is set for 27 of your hosts/services
[OK  ]  'process_perf_data 1' is set for 243 of your hosts/services
[INFO]  ==== System sizing ====
[OK  ]  269 hosts/service objects defined
[INFO]  ==== Check statistics ====
[WARN]  Warning: 3, Critical: 0
[WARN]  Checks finished...
pnp4nagios-0.6.16/share/pnp/documents/de_DE/tpl_helper.html0000664000000000000000000002521711662503006022260 0ustar rootroot

Template Helper Functions

Helper-Funktionen sind dazu gedacht, die Templates zu vereinfachen und Fehler abzufangen.

rrd::def

string rrd::def ( $vname, $rrdfile, $ds, [ $cf='AVERAGE' ] )

$def = rrd::def('var1', $RRDFILE[0], $DS[0], 'MAX');

http://oss.oetiker.ch/rrdtool/doc/rrdgraph_data.en.html

rrd::cdef

string rrd::cdef ( $vname, $rpn, )

$def = rrd::cdef('var1_bits', 'var1,8,*' );

http://oss.oetiker.ch/rrdtool/doc/rrdgraph_data.en.html

rrd::vdef

string rrd::vdef ( $vname, $rpn, )

$def = rrd::vdef('var1_avg', 'var1,AVERAGE' );

http://oss.oetiker.ch/rrdtool/doc/rrdgraph_data.en.html

rrd::line[1-3]

string rrd::line[1-3] ( $vname, $color, [ $text ], [ $stack ] )

$def .= rrd::line1('var1', #ff00ff );

Eine einfache Linie, ein Pixel breit, ohne Label-Text

$def .= rrd::line3('var1', '#ff00ff', 'Load' );

Eine Linie, drei Pixel breit, und dem Label “Load”

http://oss.oetiker.ch/rrdtool/doc/rrdgraph_graph.en.html

rrd::area

string rrd::area ( $vname, $color, [ $text ], [ $stack ] )

$def .= rrd::area('var1', '#ff00ff', 'Load' );

Eine Fläche mit dem Label “Load”

http://oss.oetiker.ch/rrdtool/doc/rrdgraph_graph.en.html

rrd::gprint

string rrd::gprint ( $vname, $cf, [ $text ] )

$def .= rrd::gprint('var1', 'MAX', '%4.2lf %s Max' );
$def .= rrd::gprint('var1', array('MIN', 'MAX', 'AVERAGE'), '%4.2lf %s' );

Ist $cf ein Array, so wird automatisch eine Legende formatiert ausgegeben.

http://oss.oetiker.ch/rrdtool/doc/rrdgraph_graph.en.html

rrd::color

string rrd::color ( $num [, $num ])

Liefert eine Farbe aus der HTML-Farbtabelle. Als zweites (optionales) Argument kann man einen Alpha-Wert angeben, der die Transparenz der Farbe festlegt.

rrd::gradient

string rrd::gradient ( $vname, [$start_color], [$end_color], [$label], [$steps], [$lower] )

Erzeugt einen Farbverlauf von $start_color nach $end_color

$def .= rrd::gradient('var1', '#ff0000', '#ffff00' );

Beispiel

rrd::cut

string rrd::cut ( $text, $length )

$label = rrd::cut($LABEL[0], 18);

Schneidet einen Text auf eine gegebene Länge $length ab oder füllt wenn nötig auf $length auf. Diese Funktion ist hilfreich, wenn die Legende ausgerichtet werden soll, aber die Länge des Labels nicht bekannt ist.

rrd::ticker

string rrd::ticker ( $vname, $warning, $critical, [$fraction], [$opacity], [$color_OK], [$color_WARN], [$color_CRIT] )

Erzeugt einen farbigen Balken am oberen Rand des Graphen, der je nach OK, WARNING & CRITICAL unterschiedliche Farben annimmt

$def .= rrd::ticker( "var1", $WARN[0], $CRIT[0] );

Beispiel

rrd::alerter

string rrd::alerter ( $vname, $label, $warning, $critical, [$opacity], [$unit], [$color_OK], [$color_WARN], [$color_CRIT], [$line_col] )

Erzeugt Areas, die entsprechend der Werte OK, WARNING & CRITICAL unterschiedliche Farben annehmen

$def .= rrd::alerter( "var1", $LABEL[0], $WARN[0], $CRIT[0], "FF", $UNIT[0] );

Beispiel

pnp4nagios-0.6.16/share/pnp/documents/de_DE/wrapper.html0000664000000000000000000000125511662503006021576 0ustar rootroot

check_procs ist ein Beispiel für ein Plugin, das keine Performance-Daten ausgibt:

./check_procs -a ndo2db -w 1: -c 0:
PROCS OK: 2 processes with args 'ndo2db'

Mit dem folgenden Wrapper-Script kann das geändert werden

check_procs.sh

#!/bin/bash
LINE=`/usr/local/nagios/libexec/check_procs $*`
RC=$?
COUNT=`echo $LINE | awk '{print $3}'`
echo $LINE \| procs=$COUNT
exit $RC

Nun wird die Zahl zusammen mit einer Bezeichnung ausgegeben.

./check_procs.sh -a ndo2db -w 1: -c 0:
PROCS OK: 2 processes with args 'ndo2db'| procs=2
pnp4nagios-0.6.16/share/pnp/documents/de_DE/perfdata_format.html0000664000000000000000000000565611662503006023265 0ustar rootroot
2.6. Performance-Daten

'Bezeichnung'=Wert[UOM];[warn];[crit];[min];[max]

Anmerkungen:

  1. Leerzeichen trennen Listen von Bezeichnung/Werte-Paaren
  2. Bezeichnungen können beliebige Zeichen enthalten
  3. die Bezeichnung muss in Apostrophe eingeschlossen sein, wenn diese Gleichheitszeichen (=), Apostroph (') oder Leerzeichen ( ) enthält, ansonsten sind die Apostrophe optional
  4. die Länge der Bezeichnung ist beliebig, aber idealerweise sind die ersten 19 Zeichen eindeutig (aufgrund einer Beschränkung in RRD). Bitte beachten Sie, dass es eine Längenbegrenzung bei der Menge von Daten gibt, die von NRPE an Nagios geliefert werden kann
  5. um ein Apostroph darzustellen, nutzen Sie zwei einzelne Apostrophe
  6. warn, crit, min und/oder max können leer sein (z.B. wenn der Schwellwert nicht definiert ist oder wenn min oder max nicht zutreffen). Nachfolgende, nicht gefüllte Semikola können entfallen
  7. min und max sind nicht erforderlich, wenn UOM = %
  8. Wert, min und max sind aus der Klasse [-0-9.] (Ziffern, Minuszeichen und Dezimalpunkt). Alle müssen das gleiche UOM benutzen
  9. warn und crit sind im “Range”-Format (siehe Abschnitt 2.5 der Original-Dokumentation). Alle müssen das gleiche UOM benutzen.
  10. UOM (unit of measurement, Maßeinheit) ist eins von:
    • keine Einheit angegeben - angenommen wird eine Zahl (int oder float) von Dingen (z.B. Benutzer, Prozesse, Load)
    • s - Sekunden (auch us, ms)
    • % - Prozent
    • B - Bytes (auch KB, MB, TB; GB?)
    • c - ein fortlaufender Zähler (z.B. Bytes, die über ein Interface übertragen werden)

Es bleibt Drittanbietern überlassen, aus den Performance-Daten Graphen zu erzeugen.|

Quelle: http://nagiosplug.sourceforge.net/developer-guidelines.html#AEN201

pnp4nagios-0.6.16/share/pnp/documents/de_DE/modes.html0000664000000000000000000001531411662503006021226 0ustar rootroot

Die Kunst Daten zu sammeln

PNP unterstützt mehrere Arten, die Performance-Daten zu verarbeiten. Die einzelnen Modi unterscheiden sich durch ihre Komplexität und die zu erwartende Performance.

Das folgende Bild zeigt die Verbindungen zwischen Nagios, PNP und RRDtool

Nagios führt für jeden Host- und jeden Service, dessen Performance-Daten gesammelt werden sollen, einen Befehl aus. Abhängig vom gewählten Modus werden die Daten entweder direkt an ein Perl-Script übergeben oder in temporäre Dateien geschrieben und später verarbeitet. process_perfdata.pl legt die Datei in XML-Dateien ab und speichert sie mit Hilfe von RRDtool in RRD-Dateien.

Bevor Ihr euch auf einen Modus festlegt, lest euch alles durch und entscheidet selbst, welcher Weg für eure Installation der Beste ist.

Die Modi im Vergleich

Synchronous Mode

Der “Sync Mode” ist der einfachste und am leichtesten einzurichten. Nagios ruft für jeden Service (bzw. Host) zusätzlich das Perl-Script process_perfdata.pl auf, um die Daten zu verarbeiten.

Der sync-Mode funktioniert sehr gut bis ca. 1000 Services in einem Intervall von 5 Minuten. Dieser Modus belastet aber auch Nagios am meisten, daher ist es auch in kleinen Installationen ratsam, die weiteren Modi zu beachten.

Bulk Mode

Im Bulk-Mode schreibt Nagios die benötigten Daten in eine temporäre Datei. Nach Ablauf einer definierten Zeit wird die Datei an einem Stück abgearbeitet und gelöscht.

Die Anzahl der Aufrufe von process_perfdata.pl reduziert sich um ein Vielfaches. Abhängig von der Zeit und den gesammelten Daten werden wesentlich weniger Systemaufrufe ausgeführt. Dafür läuft process_perfdata.pl länger.

Hinweis Bei diesem Modus sollte man die Laufzeit von process_perfdata.pl im Auge behalten. So lange, wie process_perfdata.pl zum Verarbeiten der Daten benötigt, so lange kann Nagios keine Checks ausführen.

Auszug aus var/perfdata.log:

2007-10-18 12:05:01 [21138] 71 Lines processed
2007-10-18 12:05:01 [21138] .../spool/service-perfdata-1192701894-PID-21138 deleted
2007-10-18 12:05:01 [21138] PNP exiting (runtime 0.060969s) ...

71 Zeilen wurden in 0,06 Sekunden verarbeitet. Das ist das Datenvolumen bei ca. 2000 Services und der Verarbeitung im 10-Sekunden-Intervall. Wir haben Nagios also genau für 0.06 Sekunden blockiert.

Bulk Mode mit NPCD

Dies ist aus Nagios-Sicht die sauberste Art der Verarbeitung. Nagios wird nicht blockiert.

Nagios benutzt wieder eine temporäre Datei, um die Daten zu speichern, und führt nach Ablauf der Zeit wieder ein Command aus. Jedoch wird die Datei nicht sofort von Process_perfdata.pl verarbeitet, sondern in ein spool-Verzeichnis verschoben. Da das Verschieben einer Datei im gleichen Filesystem so gut wie keine Zeit beansprucht, ist Nagios sofort wieder in der Lage, wichtige Arbeiten auszuführen.

Der NPCD ( Nagios Performance C Daemon ) überwacht nun das Verzeichnis auf neue Dateien und übergibt diese an process_perfdata.pl. Die Verarbeitung der Performancedaten ist also komplett von Nagios entkoppelt. NPCD wiederum ist in der Lage, zum Verarbeiten der Daten mehrere Threads zu starten.

Bulk Mode mit npcdmod

In diesem Szenario kommt npcdmod.o, ein NEB-Modul, zum Einsatz. Diese Modul reduziert die Konfiguration des “Bulk Mode mit NPCD” auf zwei Zeilen in der nagios.cfg.

Dieser Modus ist gleichzusetzen mit dem “Bulk Mode mit NPCD”. Es ist auch genau der gleiche Ablauf und die gleiche Performance.

Gearman Mode

PNP4Nagios kann seit Version 0.6.12 als Gearman Worker betrieben werden. So sind große verteilte Nagios Umgebungen auf Basis von mod_gearman realisierbar.

Benötigt wird eine fertig eingerichtete mod_gearman Installation wie von Sven Nierlein unter http://labs.consol.de/lang/en/nagios/mod-gearman/ beschrieben.

Die Entscheidung

Welchen der beschriebenen Wege ihr verwendet, hängt also stark von der Größe der Nagios-Installation ab.

Die verwendeten Begriffe werden euch aber in der Dokumentation immer wieder über den Weg laufen.

Zurück zur Übersicht | Installation

pnp4nagios-0.6.16/share/pnp/documents/de_DE/rrd_convert.html0000664000000000000000000000760011662503006022445 0ustar rootroot

RRD_STORAGE_TYPE = MULTIPLE

Verfügbar ab PNP 0.6.3

Mit PNP-Version 0.6 ist es möglich, die Performance-Daten nicht in einer einzelnen RRD-Datenbank (SINGLE), sondern in mehreren RRD Datenbanken (MULTIPLE) zu speichern.

Nach dem Anlegen eines RRD-Files ist es nicht mehr möglich, dieses um eine Datasource (DS) zu erweitern. Daraus ergeben sich Probleme für Nagios-Plugins, die im Laufe der Zeit die Anzahl der Datenreihen dynamisch ändern.

Ein Beispiel wäre check_disk, wenn man pauschal alle verfügbaren Filesysteme in einem Service überwacht. Kommt ein Filesystem hinzu, so kann die RRD-Datenbank nicht mehr aktualisiert werden. Die Struktur der neuen Daten passt einfach nicht mehr zur RRD-Struktur.

PNP arbeitet per Default mit der Option RRD_STORAGE_TYPE = SINGLE, welche in der process_perfdata.cfg definiert ist.

Diese Einstellung sollte nicht global verändert werden, da PNP nach der Umstellung auf MULTIPLE sofort beginnt, neue RRD-Files anzulegen. Alte Daten gehen damit sofort verloren!

Weiterhin ist es im Hinblick auf die Performance nicht sinnvoll, global mit RRD_STORAGE_TYPE = MULTIPLE zu arbeiten. Die Anzahl der RRD-Datenbanken und somit auch der Disk-I/O während der Updates vervielfacht sich. Entsprechend sollte man mit Bedacht wählen, welche Nagios-Check-Commands mit welcher Einstellung behandelt werden sollen.

Im Abschnitt Custom Templates ist beschrieben, wie die Einstellungen vorgenommen werden können.

Ein Konverter

Das Script libexec/rrd_convert.pl dient zum Umschalten des RRD_STORAGE_TYPE auf MULTIPLE und zum gleichzeitigen migrieren der RRD-Datenbanken.

Maßgeblich ist dabei wie immer bei PNP das Nagios-Check-Command.

rrd_convert.pl --check_command=<nagios_check_command> | --list_commands [ --dry-run ] [ --tmp_dir=<temp-dir> ]
[[ --no_structure_check ]]

Das Script erwartet über die Option –check-command= das Check-Command, nach dem gesucht werden soll.

rrd_convert.pl wird nun alle PNP-XML-Dateien nach diesem Command durchsuchen und eine Statistik ausgeben.

Nach Bestätigung durch den User beginnt das Konvertieren der einzelnen RRD-Datenbanken, wobei der aktuelle Ablauf angezeigt wird. Das Script endet, wenn Sie <ENTER> drücken, also geben Sie bitte einen Buchstaben ein.

Die Option –dry-run sorgt dafür, dass die RRD-Datenbanken zwar konvertiert, jedoch in /tmp/rrd_convert in separaten Verzeichnissen je Host gespeichert werden. So kann man sich einen Überblick über die zu erwartende Laufzeit und das Datenvolumen verschaffen.

Wenn Sie das temporäre Verzeichnis ändern möchten, dann können Sie das mit Hilfe der Option –tmp_dir=<alternatives TMP-Directory> tun. Ab und zu passt die Anzahl der Datasources in den RRD-Dateien nicht zu der Anzahl in den XML-Dateien. Das passiert z.B. dann, wenn Plugins plötzlich eine andere Zahl von Datenreihen liefern (siehe oben check_disk). Mit der Option –no_structure_check'' werden auch diese RRD-Dateien konvertiert.

back to contents | NPCD-Details

pnp4nagios-0.6.16/share/pnp/documents/de_DE/npcd.html0000664000000000000000000002667311662503006021055 0ustar rootroot

NPCD

NPCD (Nagios-Perfdata-C-Daemon) wurde geschrieben, um die asynchrone Bearbeitung von Nagios Performance-Daten zu ermöglichen.

Einleitung

In großen Nagios-Installationen kann es zu nicht akzeptierbaren Verspätungen seitens der Checks kommen. Das bedeutet, dass Nagios einen Check zum Zeitpunkt x ausführen soll, diesen aber erst y Sekunden später tatsächlich ausführt.

Wenn man dem Nagios-Daemon mitteilt, dass man nach jedem einzelnen Check auch die Performance-Daten verarbeiten möchte, so geht dies bis zu einem bestimmten Grad gut, ab einer gewissen Anzahl von Checks pro Sekunde allerdings kommt man relativ schnell zu den sog. Latency-Problemen.

Um die Anzahl der Aktionen pro Check zu verringern, kann man nun PNP im Bulk-Mode verwenden, wobei die Performance-Daten zunächst vom Nagios-Prozess gesammelt und anschließend ebenfalls vom Nagios-Prozess selbst verarbeitet werden.

Man kann aber auch dem Nagios-Prozess mitteilen, dass die Verarbeitung der Performance-Daten lediglich durch das Verschieben der Dateien in ein Spool-Verzeichnis geschehen soll, welches für den Nagios-Prozess selbst eine sehr schnelle Aktion ist und die Performance nicht nennenswert beeinflusst und somit dem Core mehr Zeit für seine eigentliche Arbeit lässt: weitere Checks ausführen, Alamierungen bereitstellen, etc.

Wie NPCD arbeitet

Wie bereits erwähnt, ist die Arbeit der Performance-Daten-Verarbeitung durch das schnelle Verschieben der Datei bereits erledigt, aber das bringt die Performance-Daten noch nicht in die RRD-Datenbank.

Um den Transport der Performance-Daten-Dateien kümmert sich nun der NPCD-Daemon, unabhängig vom Nagios-Prozess, indem er regelmäßig in das Spool-Verzeichnis guckt und für jede dort gefundene Datei eine Aktion ausführt.

Nachdem NPCD gestartet wurde, erstellt er sich eine Liste von Dateinamen des Spool-Verzeichnisses und startet für jede gefundene Datei einen Thread zur weiteren Verarbeitung mit Hilfe des perfdata_file_run_cmd und dem optionalen perfdata_file_run_cmd_arg als zusätzlichem Argument.

Da das Format der Performance-Daten-Dateien dem Format der 'normalen' PNP-Bulk-Modus-Dateien gleicht, kann NPCD nun für jede gefundene Datei also process_perfdata.pl im Bulk Modus aufrufen.

Vor- und Nachteile

Pro:

  • bessere Performance für Nagios
    • aufgrund der vom Nagios-Prozess getrennten Verarbeitung der Performance-Daten hat Nagios mehr Zeit für die wichtigen Dinge
  • kein Datenverlust
    • solange Nagios Performance-Daten-Dateien im Spool-Verzeichnis ablegt, gehen keine Daten verloren. Selbst wenn der NPCD mal nicht laufen sollte (Bsp. nach Neustart des Systems), werden die Dateien nach Wiederanlauf in chronologischer Reihenfolge bearbeitet ($TIMET$ Makro beim verschieben ins Spool-Verzeichnis)

Kontra:

  • Keine Echtzeitverarbeitung der Performance-Daten
    • aufgrund des Rhythmusses, wann Nagios die Performance-Daten-Dateien verschiebt (service_perfdata_file_processing_interval)
    • nach jedem Lauf durch alle Dateien des Spool-Verzeichnisses wartet NPCD 10 Sekunden lang auf neue Dateien

NPCD Config

NPCD muss zwangsläufig über eine Konfigurationsdatei gesteuert werden. Eine Beispielkonfiguration liegt der PNP-Installation als npcd.cfg-sample bei.

Nach Umbenennen der -sample Datei zu npcd.cfg kann NPCD nun wie folgt gestartet werden:

/usr/local/pnp4nagios/bin/npcd -f /usr/local/pnp4nagios/etc/npcd.cfg

oder

/usr/local/pnp4nagios/bin/npcd -d -f /usr/local/pnp4nagios/etc/npcd.cfg

um NPCD im Hintergrund als Daemon laufen zu lassen.

Hinweis: Die -sample Datei sollte in jedem Fall in npcd.cfg umbenannt werden, da sie sonst bei einem Update von PNP überschrieben werden könnte.

npcd.cfg-sample

Dies sind die essentiellen Konfigurationsdirektiven für NPCD:

# Privilege Options
user = nagios
group = nagios

# Logging Options
log_type = syslog
log_file = /usr/local/pnp4nagios/var/npcd.log
max_logfile_size = 10485760
log_level=0

# Processing Options
perfdata_spool_dir = /usr/local/pnp4nagios/var/spool/perfdata/
perfdata_file_run_cmd = /usr/local/pnp4nagios/libexec/process_perfdata.pl
perfdata_file_run_cmd_args = -b

# Thread Options
npcd_max_threads=5

# greedy options
use_load_threshold = 0
load_threshold = 10.0

# Process Options
pid_file=/var/run/npcd.pid

Die Direktiven

  • Privilege-Optionen
    • user <username>
      • NPCD versucht die Userberechtigung zu diesem User zu wechseln.
      • Default: nagios
    • group <groupname>
      • NPCD versucht die Gruppenberechtigung zu dieser Gruppe zu wechseln.
      • Default: nagios
  • Logging-Optionen
    • log_type <syslog> oder <file>
      • Log-Type, den NPCD zum Loggen verwenden wird
      • Default: syslog
    • log_file </pfad/zu/datei>
      • Falls log_type = file wird diese Logdatei verwendet
      • Default: /usr/local/pnp4nagios/var/npcd.log
    • max_logfile_size <bytes>
      • NPCD wird nach Erreichen der hier angegebenen Dateigröße eigenständig eine Logrotation durchführen
      • Default: 10485760 = 10 MByte
    • log_level <integer>
      • Wie viel soll aufgezeichnet werden, möglich ist:
        • 0 = Kein Log - außer Fehlern
        • 1 = wenig Log - etwas mehr Aufzeichnen
        • 2 = Mehr Log (aktuell ALLES)
        • -1 = DEBUG Mode - Es wird alles aufgezeichnet und die Bearbeitung wird verlangsamt
      • Default: 0
  • Bearbeitungs-Optionen
    • perfdata_spool_dir </path/to/spool/dir/>
      • Das Verzeichnis, in das Nagios die Dateien verschiebt
      • Default: /usr/local/pnp4nagios/var/spool/
    • perfdata_file_run_cmd </path/to/bin/filename>
      • Das Programm, welches Nagios für jede Datei aufrufen soll
      • Default: /usr/local/pnp4nagios/libexec/process_perfdata.pl
    • perfdata_file_run_cmd_args <option>
      • Das Argument, welches optional an perfdata_file_run_cmd angehängt wird
      • Default: ”-b”
      • :!: Die Kommandozeile wird nach folgendem Schema aufgebaut:
        <perfdata_file_run_cmd> <perfdata_file_run_cmd_args> <filename_from_perfdata_spool_dir>
  • Thread-Optionen
    • npcd_max_threads <integer value>
      • Anzahl der maximal zu startenden parallelen Threads
      • Default: 5
  • Greedy-Optionen
    • use_load_threshold <0 oder 1>
      • definiert, ob NPCD bei Erreichen des load_thresholds die Anzahl der Threads begrenzen soll
        • 0 = ausschalten (weitere Threads starten)
        • 1 = einschalten
      • Default: 0
    • load_threshold <float value>
      • wenn use_load_threshold auf 1 gesetzt ist, werden bei Erreichen dieses load limits keine neuen Threads gestartet
      • Default: 10.0
  • Process-Optionen
    • pid_file </path/to/pid.file>
      • Pfad zum PID File
      • Default: /var/run/npcd.pid

zurück zur Übersicht | Wrapper-Script

pnp4nagios-0.6.16/share/pnp/documents/de_DE/rrdcached.html0000664000000000000000000001275311662503006022042 0ustar rootroot

RRDtool Cache Daemon

In großen Installationen wird man über kurz oder lang feststellen, dass die Verarbeitung der Performance-Daten eine recht hohe I/O-Last zur Folge hat. RRDtool muss extrem viele Updates auf Disk schreiben, kann dabei jedoch den Disk-Cache nicht optimal ausnutzen.

Eine Optimierung stellt das Sammeln und Sortieren der Daten dar. Es ist für das System effektiver, viele Updates im Block in eine RRD-Datenbank zu schreiben. Der Disk-Cache kann dabei effektiver genutzt werden.

In der aktuellen RRDtool-Version ( SVN trunk 1550+ ) ist der rrdcached enthalten, der genau diese Situation verbessern soll.

An dieser Stelle möchte ich mich bei Florian octo Forster, Kevin Brintnall und Tobi Oetiker bedanken. Die Entwicklung dieses Daemons wurde vorbildlich auf der rrd-developers Mailingliste koordiniert.

Arbeitsweise

Der rrdcached arbeitet als Daemon im Hintergrund und öffnet einen UNIX- oder TCP-Socket, auf dem er auf Anfragen von rrdtool wartet. Aufgrund von Sicherheitsbedenken ist es in neueren Versionen von rrdcached aber nicht mehr möglich absolute Pfadangaben (wie bei pnp4nagios üblich) bei Netzwerkzugriffen zu verwenden, daher ist derzeit nur Nutzung von UNIX-Sockets möglich.

rrdcached

Der rrdcached kennt einige wichtige Optionen, die beim Start übergeben werden.

Option -l definiert den Socket, auf dem der rrdcached Requests annimmt. Der Default-UDP-Port ist 42217, der Default-UNIX-Socket /tmp/rrdcached.sock.

-l unix:/pfad/zum/rrdcached.sock
-l /pfad/zum/rrdcached.sock
-l 127.0.0.1
-l 127.0.0.1:8888

Option -P gibt die für die nachfolgenden Sockets (mit -l spezifiziert) erlaubten Befehle an, welche auf die RRD-Datenbanken angewendet werden können.

-P FLUSH,PENDING

Option -s erlaubt es die Gruppenzugehörigkeit der nachfolgenden UNIX-Sockets zu ändern.

-s nagios

Option -m setzt die Zugriffsrechte für die nachfolgenden UNIX-Sockets auf die (in oktal) angegebenen Werte.

-m 0660

Option -w bestimmt den Intervall in Sekunden, in dem die Daten auf Disk geschrieben werden sollen.

-w 1800

Option -z definiert einen Delay, der die über die Option -w definierten Schreibzyklen in einen zufälligen Bereich [0-delay] verteilt, um gleichzeitige Schreibzugriffe zu verhindern. Der Wert der Option -z darf nicht größer gewählt werden als -w.

-z 1800

Option -p definiert ein PID File

-p /var/run/rrdcached.pid

Option -j definiert den Pfad zu einem Journal-Verzeichnis. Dort werden alle Aufträge protokolliert und ggf. beim nächsten Start nachgefahren, falls der rrdcached-Daemon abstürzt.

-j /var/cache/rrdcached

Daraus ergibt sich beispielsweise ein Aufruf von rrdached mit folgenden Parametern

 rrdcached -w 1800 -z 1800 -p /tmp/rrdcached.pid -j /tmp -s nagios -m 0660 -l unix:/tmp/rrdcached.sock

rrdtool

RRDtool selbst wird die Existenz des Daemons über die Option –daemon=<socket> mitgeteilt.

 rrdtool --daemon=unix:/tmp/rrdcached.sock update ...

Dies muss natürlich mit den Startoptionen des rrdcached übereinstimmen!

Integration in PNP

Da zwei Bestandteile von PNP auf den rrdcached vorbereitet werden müssen, ergeben sich Änderungen in zwei Config-Files. Außerdem muß der User unter welchem der Webserver läuft zur Gruppe unter der Nagios läuft hinzugefügt werden.

1. Anpassen der process_perfdata.cfg für den Datensammler process_perfdata.pl

# EXPERIMENTAL rrdcached Support
# Use only with rrdtool svn revision 1511+
#
RRD_DAEMON_OPTS = unix:/var/run/rrdcached.sock

2. Anpassen der config_local.php (bzw. config.php) für das Webinterface

#
# EXPERIMENTAL rrdcached Support
# Use only with rrdtool svn revision 1511+
#
# $conf['RRD_DAEMON_OPTS'] = 'unix:/tmp/rrdcached.sock';
$conf['RRD_DAEMON_OPTS'] = 'unix:/var/run/rrdcached.sock';

Die passenden Optionen sind bereits in den Beispieldateien enthalten.

zurück zur Übersicht | migrieren von RRD-Dateien

pnp4nagios-0.6.16/share/pnp/documents/de_DE/upgrade.html0000664000000000000000000002013111662503006021537 0ustar rootroot

Upgrade auf Version 0.6.x

Das Web-Frontend ist komplett neu geschrieben worden und basiert nun auf dem PHP MVC Framework Kohana. Somit ergeben sich grundlegend andere Abhängigkeiten, die dringend vor der Installation geprüft werden müssen.

Anmerkung: Ein Upgrade läuft zuerst wie eine Neuinstallation. Anschließend sind einige Anpassungen durchzuführen, die weiter unten beschrieben sind.

PNP 0.4.x wurde ohne weitere Angabe von Optionen beim Aufruf von ./configure unterhalb einer Nagios-Installation unter /usr/local/nagios installiert.

PNP 0.6.x wird bei Angabe keiner weiteren Optionen unter /usr/local/pnp4nagios installiert, ist also wie Nagios als eigenständige Applikation zu sehen.

Anmerkung: Es reicht aus, die *.rrd-Dateien vom alten ins neue Verzeichnis zu kopieren. Sie enthalten die eigentlichen Daten. Die *.xml-Dateien werden jedes Mal neu angelegt, wenn Performance-Daten verarbeitet werden, denn sie enthalten lediglich Meta-Informationen. Außerdem hat sich die interne Struktur geändert, so dass sie sowieso nicht nutzbar sind.

Vergleich der Struktur

Summary einer Installation von PNP 0.4.14

./configure
...
*** Configuration summary for pnp 0.4.14 05-02-2009 ***

  General Options:
  -------------------------         -------------------
  Nagios user/group:                nagios nagios
  Install directory:                /usr/local/nagios
  HTML Dir:                         /usr/local/nagios/share/pnp
  Config Dir:                       /usr/local/nagios/etc/pnp
  Location of rrdtool binary:       /usr/bin/rrdtool Version 1.3.1
  RRDs Perl Modules:                FOUND (Version 1.3001)
  RRD Files stored in:              /usr/local/nagios/share/perfdata
  process_perfdata.pl Logfile:      /usr/local/nagios/var/perfdata.log
  Perfdata files (NPCD) stored in:  /usr/local/nagios/var/spool/perfdata/

Summary einer Installation von 0.6.0

./configure
...
*** Configuration summary for pnp4nagios-0.6.0 07-30-2009 ***

  General Options:
  -------------------------         -------------------
  Nagios user/group:                nagios nagios
  Install directory:                /usr/local/pnp4nagios
  HTML Dir:                         /usr/local/pnp4nagios/share
  Config Dir:                       /usr/local/pnp4nagios/etc
  Location of rrdtool binary:       /usr/bin/rrdtool Version 1.3.1
  RRDs Perl Modules:                FOUND (Version 1.3001)
  RRD Files stored in:              /usr/local/pnp4nagios/var/perfdata
  process_perfdata.pl Logfile:      /usr/local/pnp4nagios/var/perfdata.log
  Perfdata files (NPCD) stored in:  /usr/local/pnp4nagios/var/spool

  Web Interface Options:  -------------------------         -------------------
  HTML URL:                         http://localhost/pnp4nagios/
  Apache Config File:               /etc/apache2/conf.d/pnp4nagios.conf

Aus diesen Infos ergeben sich die zu ändernden Parameter und somit die Upgrade-Strategie.

Anpassungen

Die Vorlagen der action_url-Definitionen haben sich verändert. Statt ”/nagios/pnp” ist ”/pnp4nagios” einzutragen und statt “index.php” wird nun “graph” benutzt

define host {
   name       host-pnp
   action_url /pnp4nagios/graph?host=$HOSTNAME$
   register   0
}

define service {
   name       srv-pnp
   action_url /pnp4nagios/graph?host=$HOSTNAME$&srv=$SERVICEDESC$
   register   0
}

Ähnliches gilt für die Preview-Popup-Funktion

define host {
   name       host-pnp
   action_url /pnp4nagios/index.php/graph?host=$HOSTNAME$&srv=_HOST_' class='tips' rel='/pnp4nagios/index.php/popup?host=$HOSTNAME$&srv=_HOST_
   register   0
}

define service {
   name       srv-pnp
   action_url /pnp4nagios/graph?host=$HOSTNAME$&srv=$SERVICEDESC$' class='tips' rel='/pnp4nagios/popup?host=$HOSTNAME$&srv=$SERVICEDESC$
   register   0
}

Achtung: Es ist kein Fehler, dass die Zeichenketten vor und nach “class” jeweils nur ein Apostroph enthalten.

Anders als in der 0.4.x Dokumentation vermerkt gelten die Templates für Nagios 2.x und 3.x. Der einzige Unterschied besteht darin, dass die action_url-Direktive in Nagios 2.x nicht in der Service-Definition, sondern in eigenen serviceextinfo-Definitionen verfügbar ist.

Innerhalb der PHP-Dateien im templates-Verzeichnis müssen alle Variablen vor der ersten Benutzung initialisiert werden, z.B.

$lower = ""

Das gilt auch für Variablen, an die früher “angehängt” werden konnte, ohne sie vorher zu initialisieren. Daher wird aus

foreach ($DS as $i) {
    $def[1] .= "DEF:var$i=$rrdfile:$DS[$i]:AVERAGE " ;

nun

$def[1] = "";
foreach ($DS as $i) {
    $def[1] .= "DEF:var$i=$rrdfile:$DS[$i]:AVERAGE " ;


Konstanten in Template-Dateien funktionieren nicht mehr, so dass diese in Variablen umzuwandeln sind. Aus

define("_WARNRULE", '#FFFF00');

wird dann z.B.

 $WARNRULE = '#FFFF00';

Man sollte daran denken, alle Vorkommen in der Datei zu ändern ;-).

Upgrade Szenario mit NPCD

  1. Planen des neuen Aufbaus.
  2. Testinstallation durchführen und sich mit dem neuen System vertraut machen.
  3. Backup erstellen.
  4. PNP 0.6.x nach /usr/local/pnp4nagios installieren.
  5. make install-config
  6. make install-webconf
  7. Apache reload.
  8. Apache-Config testen.
    1. Aufruf /pnp4nagios muss ein leeres Perfdata-Verzeichnis melden.
  9. /usr/local/pnp4nagios/etc/npcd.cfg aus der npcd.cfg-sample erstellen.
    1. Pfade überprüfen und ggf. Änderungen der 0.4.x nachziehen.
  10. Alle Pfade zur neuen Installation in der nagios.cfg anpassen.
  11. Alle Pfade in den Command-Definitionen anpassen.
  12. npcd über /etc/init.d/npcd stop anhalten.
  13. make install-init installiert das neue Init Script für den npcd.
  14. Nagios anhalten.
  15. /usr/local/nagios/share/perfdata nach /usr/local/pnp4nagios/var/perfdata kopieren. Achtung: Auf Permissions achten.
  16. /etc/init.d/npcd start
  17. /etc/init.d/nagios start
pnp4nagios-0.6.16/share/pnp/documents/de_DE/install.html0000664000000000000000000001453111662503006021565 0ustar rootroot

Installation

Im Folgenden wird die Installation von PNP beschrieben. Dabei wird davon ausgegangen, dass Nagios aus den Sourcen übersetzt und im Verzeichnis /usr/local/nagios installiert wurde.
Achtung: Die Beschreibung bezieht sich auf die Developer-Version PNP 0.6.0.
Bitte vergessen Sie nicht, dass PNP nach der Installation noch konfiguriert werden muss.

Make und Co

Die Installation von PNP wird wie bei Nagios auch über Makefiles gesteuert. Dabei wird durch den Aufruf von ./configure das System analysiert und die ermittelten Werte in Makefiles übernommen.

Als User root wird PNP in /usr/local/src entpackt.

tar -xvzf pnp4nagios-HEAD.tar.gz
cd pnp4nagios

Im Verzeichnis pnp4nagios wird nun ./configure aufgerufen.

./configure

Hinweis: Ohne weitere Optionen werden als Benutzer und Gruppe “nagios” verwendet. Bei abweichenden Werten sind die Parameter ”–with-nagios-user” und ”–with-nagios-group” zu benutzen. Im Falle von Icinga könnte der Aufruf so aussehen

./configure --with-nagios-user=icinga --with-nagios-group=icinga

Es laufen einige Zeilen über den Bildschirm. Wichtig ist die Ausgabe zum Schluss.

*** Configuration summary for pnp4nagios-0.6.2 23-12-2009 ***

  General Options:
  -------------------------         -------------------
  Nagios user/group:                nagios nagios
  Install directory:                /usr/local/pnp4nagios
  HTML Dir:                         /usr/local/pnp4nagios/share
  Config Dir:                       /usr/local/pnp4nagios/etc
  Location of rrdtool binary:       /usr/bin/rrdtool Version 1.2.12
  RRDs Perl Modules:                FOUND (Version 1.2012)
  RRD Files stored in:              /usr/local/pnp4nagios/var/perfdata
  process_perfdata.pl Logfile:      /usr/local/pnp4nagios/var/perfdata.log
  Perfdata files (NPCD) stored in:  /usr/local/pnp4nagios/var/spool

  Web Interface Options:  -------------------------         -------------------
  HTML URL:                         http://localhost/pnp4nagios/
  Apache Config File:               /etc/apache2/conf.d/pnp4nagios.conf


  Review the options above for accuracy.  If they look okay,
  type 'make all' to compile.

Die angezeigten Pfade sollten nun geprüft werden. Falls die gezeigten Werte nicht passen, kann durch einen erneuten Aufruf von ./configure mit den passenden Optionen Abhilfe geschaffen werden.
ACHTUNG: Nachdem es immer wieder Schwierigkeiten gibt: “Location of rrdtool binary” bedeutet inkl. Namen des Binary! Bei Bedarf kann man das beim ./configure als Parameter angeben:

 ./configure --with-rrdtool=/usr/local/rrdtool-1.2.xx/bin/rrdtool
 ./configure --help 

zeigt, welche Optionen möglich sind.

Ein

make all

kompiliert nun die in C geschriebenen Komponenten wie NPCD

make install

kopiert alles an die richtige Stelle im Filesystem. Die Pfade wurden ja beim ./configure bereits gezeigt.

Nach der Installation der Programm- und HTML-Dateien wird mit

make install-webconf

eine Konfigurationsdatei in das Konfigurationsverzeichnis des Apache-Web-Servers kopiert.

Optional kann noch

make install-config

aufgerufen werden. Damit werden Config-Files für process_perfdata.pl und npcd nach etc/pnp kopiert.

Wird das INIT Script für den NPCD benötigt, so sorgt

make install-init

für die Installation nach /etc/init.d

Zusammenfassen lassen sich diese einzelnen Commands durch

make fullinstall

Achtung: Nach dem Kopieren der Konfigurationsdatei für den Web-Server ist ein Restart des Web-Servers notwendig (service httpd restart bzw. /etc/init.d/apache2 restart).

Update

Das Update einer 0.6.x-Version funktioniert (fast) genauso wie die Installation. Bitte beachten Sie, dass Sie beim ”./configure” die gleichen Optionen wie bei der Erstinstallation benutzen! Bitte prüfen Sie außerdem, ob Sie Änderungen im Verzeichnis share/templates.dist vorgenommen haben. Eigene Templates sollten im Ordner share/templates abgelegt werden.
Achtung: Wenn Sie in der Datei config.php Änderungen vorgenommen haben, sollten Sie diese Datei sichern, bevor sie bei einem “make install-config” überschrieben wird.

Sie können die Schritte make install-webconf und make install-init überspringen, denn zwischen den 0.6.x-Versionen gab es an dieser Stelle keine Änderungen.

Die Komponenten

Nach der Installation sind einige Komponenten von PNP an die passenden Stellen im Dateisystem kopiert worden.

Im Folgenden sind dies die PHP-Files für das Web-Frontend in

 /usr/local/pnp4nagios/share/pnp

Der Datensammler process_perfdata.pl in

 /usr/local/pnp4nagios/libexec

Beispiel-Config-Files mit der Dateierweiterung -sample in

 /usr/local/pnp4nagios/etc

Die Config-Datei config.php für das Web-Frontend in

 /usr/local/pnp4nagios/etc

Zurück zur Übersicht | Konfiguration

pnp4nagios-0.6.16/share/pnp/documents/de_DE/doc_complete.html0000664000000000000000000042301711662503006022557 0ustar rootroot

Neues in PNP 0.6.x

PNP 0.6.x Preview

Die Arbeit an der Version 0.6.x ist in vollem Gange.

Mit Version 0.6.x steigen wir von Subversion auf GIT um. Der Sourcecode ist bereits auf Sourceforge erhältlich.

http://pnp4nagios.git.sourceforge.net

Bisher umgesetzte Funktionen:

  • Webfrontend basiert auf Kohana
  • Webfrontend basiert auf jQuery Themes
  • Javascript-Funktionen über jQuery Plugins
  • process_perfdata.pl wird in der Lage sein, pro Datenreihe eine eigene RRD-Datenbank zu verwenden.
  • Installer weiter verbessert. Angabe von Directory-Layouts über –with-layout
  • RRDtool-Fehler werden als Bild dargestellt. Keine fehlenden Bilder mehr.
  • PNP-Templates können keine internen Variablen mehr überschreiben.
  • PNP-Templates der Version 0.4.x können weiter verwendet werden.
  • PDF-Funktionen neu umgesetzt.
  • Template default.php optimiert.
  • Export aus den RRD-Datenbanken im XML,CSV und JSON Format über die RRDtool “xport” Funktion.
  • Page-Funktionen neu umgesetzt.
  • Fehlerseiten verweisen auf online FAQ-Artikel.
  • Mouseover Popup im Nagios-Frontend über jQuery.clueTip Plugin
  • Volle Unterstützung des rrdcached.

zurück zur Übersicht | Anforderungen

Über PNP

Anforderungen an Plugins

PNP benötigt zwingend gültige Performancedaten von Nagios-Plugins.

Was sind also diese Performancedaten?

Die Ausgabe eines Nagios Plugins darf bis Nagios 2.x maximal eine Zeile betragen. Diese Ausgabe wird, wenn das Plugin Performancedaten liefert, in zwei Teile zerlegt. Als Trennzeichen dient dabei das Pipe “|” Symbol.

Beispiel check_icmp :

 OK - 127.0.0.1: rta 2.687ms, lost 0% | rta=2.687ms;3000.000;5000.000;0; pl=0%;80;100;;

daraus ergibt sich der Output auf der linken Seite des Pipe-Symbols

 OK - 127.0.0.1: rta 2.687ms, lost 0%

und die Performancedaten

  rta=2.687ms;3000.000;5000.000;0; pl=0%;80;100;;

Wie man unschwer erkennt, sind die Performancedaten auf die maschinelle Verarbeitung ausgelegt. Das Format ist in den Developer Guidelines festgelegt (einen Auszug davon gibt es an dieser Stelle), es soll aber hier noch einmal kurz erläutert werden.

  rta=2.687ms;3000.000;5000.000;0;
   |    |  |    |         |     | |
   |----|--|----|---------|-----|-|----- * Label 
        |--|----|---------|-----|-|----- * Aktueller Wert
           |----|---------|-----|-|----- Einheit ( UOM = UNIT of Measurement ) 
                |---------|-----|-|----- Warning Schwellwert
                          |-----|-|----- Critical Schwellwert 
                                |-|----- Minimum Wert 
                                  |----- Maximum Wert
                                  

Mit * gekennzeichnete Werte müssen vorhanden sein. Alle anderen Werte sind optional.

Mehrere Datenreihen werden durch Leerzeichen getrennt. Die eigentlichen Daten dürfen also keine Leerzeichen enthalten. Soll das Label Leerzeichen enthalten, so müssen diese in einfache Hochkomma eingeschlossen werden.

Benötigte Software

  • Perl >= 5.x ohne besondere Module
  • RRDtool ab 1.x; besser 1.2, aber nicht zwingend.
    Achtung: wird RRDtool ohne Paket-Manager installiert, fehlen anschließend möglicherweise die dejavu-Fonts. Das äußert sich z.B. durch fehlende Schriften in den Grafiken
  • PHP >= 5.1.6 für das Webfrontend basierend auf Kohana
  • Nagios >= 2.x oder Icinga
  • für Kohana muss außerdem das Modul “mod_rewrite” in der Web-Server-Konfiguration aktiviert sein. Einzelheiten sind in der Web-Server-Dokumentation der entsprechenden Distribution nachzulesen.

Lizenz

PNP ist unter der GPL 2 lizensiert.

Download

Die Entwicklung von PNP wird auf Sourceforge.Net organisiert. PNP ist dort unter dem Projektnamen “PNP4Nagios” registriert.

Die jeweils aktuelle (stabile) Version findet ihr im Downloadbereich.

Wer noch aktueller sein möchte, kann auch die jeweils letzte Entwickler-Version benutzen.

Mit der Version 0.6.x wurde von SVN auf GIT zum Verwalten des Sourcecodes gewechselt.

Die aktuelle Entwicklung ist jederzeit unter http://pnp4nagios.git.sourceforge.net/ einzusehen. Beim Klicken auf PNP Devel Version wird ein Archiv mit der letzten Version heruntergeladen.

Support

VOR dem Stellen von Support-Anfragen sollte sichergestellt werden, dass die unter http://docs.pnp4nagios.org/de/pnp-0.6/verify genannten Punkte geprüft wurden.

Die Entwickler und Helfer sind im Nagios-Portal unter http://www.nagios-portal.org vertreten. Dort gibt es einen eigenen Bereich zum Thema PNP.
Bei Support-Anfragen bitte das Betriebssystem und die PNP-Version angeben. Außerdem ist es wichtig, ob PNP aus den Sourcen erstellt oder ein vorgefertigtes Paket verwendet wurde.

Erfolgreich gelöste Probleme bitte mit einem [solved] in der Betreffzeile des ersten Beitrags kennzeichnen. Auf diese Weise erleichtern wir anderen Benutzern das Finden von Lösungen zu einem Problem.

Weiterhin können die Mailinglisten auf Sourceforge verwendet werden. Dort ist es jedoch üblich, Fragen auf Englisch zu stellen.

pnp4nagios-users: Die Users-Liste für allgemeine Fragen zur Konfiguration.

pnp4nagios-devel: Die Devel-Liste für Anregungen und Fehler Reports.

pnp4nagios-checkins: Auf der Checkins-Liste werden Änderungen im SVN-Repository automatisch veröffentlicht.

Datenhaltung

Die Performance-Daten werden mit Hilfe von RRDtool in sogenannten Round-Robin-Datenbanken gespeichert, die wie ein Ringpuffer funktionieren. Das bedeutet, dass nach einer gewissen Zeit die ältesten Daten “hinten” herausfallen und “vorne” durch neue ersetzt werden.

Verschiedene Zeitintervalle innerhalb der Datei sorgen für unterschiedliche Auflösungen. In der Standardeinstellung können die Daten für die letzten zwei Tage im Minutenabstand abgelegt werden, für zehn Tage im 5-Minutenabstand, für 90 Tage im 30-Minutenabstand und für 4 Jahre im 6-Stundenabstand. Die Vergrößerung des Intervalls bewirkt, dass auch die Daten über das jeweils größere Intervall hinweg gemittelt werden. Das führt automatisch dazu, dass Spitzen nicht mehr so deutlich zu sehen sind. Das ist kein Fehler von PNP, sondern eine Eigenheit von RRDtool. Dazu gibt es auch einen Artikel im Linux-Magazin.

Durch die Speicherung in diesem Format ändert sich die Dateigröße nach dem Anlegen nicht mehr. Pro Datenreihe werden ca. 400 KB benötigt.

Zurück zur Übersicht | PNP-Modi

Die Kunst Daten zu sammeln

PNP unterstützt mehrere Arten, die Performance-Daten zu verarbeiten. Die einzelnen Modi unterscheiden sich durch ihre Komplexität und die zu erwartende Performance.

Das folgende Bild zeigt die Verbindungen zwischen Nagios, PNP und RRDtool

Nagios führt für jeden Host- und jeden Service, dessen Performance-Daten gesammelt werden sollen, einen Befehl aus. Abhängig vom gewählten Modus werden die Daten entweder direkt an ein Perl-Script übergeben oder in temporäre Dateien geschrieben und später verarbeitet. process_perfdata.pl legt die Datei in XML-Dateien ab und speichert sie mit Hilfe von RRDtool in RRD-Dateien.

Bevor Ihr euch auf einen Modus festlegt, lest euch alles durch und entscheidet selbst, welcher Weg für eure Installation der Beste ist.

Die Modi im Vergleich

Synchronous Mode

Der “Sync Mode” ist der einfachste und am leichtesten einzurichten. Nagios ruft für jeden Service (bzw. Host) zusätzlich das Perl-Script process_perfdata.pl auf, um die Daten zu verarbeiten.

Der sync-Mode funktioniert sehr gut bis ca. 1000 Services in einem Intervall von 5 Minuten. Dieser Modus belastet aber auch Nagios am meisten, daher ist es auch in kleinen Installationen ratsam, die weiteren Modi zu beachten.

Bulk Mode

Im Bulk-Mode schreibt Nagios die benötigten Daten in eine temporäre Datei. Nach Ablauf einer definierten Zeit wird die Datei an einem Stück abgearbeitet und gelöscht.

Die Anzahl der Aufrufe von process_perfdata.pl reduziert sich um ein Vielfaches. Abhängig von der Zeit und den gesammelten Daten werden wesentlich weniger Systemaufrufe ausgeführt. Dafür läuft process_perfdata.pl länger.

Hinweis Bei diesem Modus sollte man die Laufzeit von process_perfdata.pl im Auge behalten. So lange, wie process_perfdata.pl zum Verarbeiten der Daten benötigt, so lange kann Nagios keine Checks ausführen.

Auszug aus var/perfdata.log:

2007-10-18 12:05:01 [21138] 71 Lines processed
2007-10-18 12:05:01 [21138] .../spool/service-perfdata-1192701894-PID-21138 deleted
2007-10-18 12:05:01 [21138] PNP exiting (runtime 0.060969s) ...

71 Zeilen wurden in 0,06 Sekunden verarbeitet. Das ist das Datenvolumen bei ca. 2000 Services und der Verarbeitung im 10-Sekunden-Intervall. Wir haben Nagios also genau für 0.06 Sekunden blockiert.

Bulk Mode mit NPCD

Dies ist aus Nagios-Sicht die sauberste Art der Verarbeitung. Nagios wird nicht blockiert.

Nagios benutzt wieder eine temporäre Datei, um die Daten zu speichern, und führt nach Ablauf der Zeit wieder ein Command aus. Jedoch wird die Datei nicht sofort von Process_perfdata.pl verarbeitet, sondern in ein spool-Verzeichnis verschoben. Da das Verschieben einer Datei im gleichen Filesystem so gut wie keine Zeit beansprucht, ist Nagios sofort wieder in der Lage, wichtige Arbeiten auszuführen.

Der NPCD ( Nagios Performance C Daemon ) überwacht nun das Verzeichnis auf neue Dateien und übergibt diese an process_perfdata.pl. Die Verarbeitung der Performancedaten ist also komplett von Nagios entkoppelt. NPCD wiederum ist in der Lage, zum Verarbeiten der Daten mehrere Threads zu starten.

Bulk Mode mit npcdmod

In diesem Szenario kommt npcdmod.o, ein NEB-Modul, zum Einsatz. Diese Modul reduziert die Konfiguration des “Bulk Mode mit NPCD” auf zwei Zeilen in der nagios.cfg.

Dieser Modus ist gleichzusetzen mit dem “Bulk Mode mit NPCD”. Es ist auch genau der gleiche Ablauf und die gleiche Performance.

Gearman Mode

PNP4Nagios kann seit Version 0.6.12 als Gearman Worker betrieben werden. So sind große verteilte Nagios Umgebungen auf Basis von mod_gearman realisierbar.

Benötigt wird eine fertig eingerichtete mod_gearman Installation wie von Sven Nierlein unter http://labs.consol.de/lang/en/nagios/mod-gearman/ beschrieben.

Die Entscheidung

Welchen der beschriebenen Wege ihr verwendet, hängt also stark von der Größe der Nagios-Installation ab.

Die verwendeten Begriffe werden euch aber in der Dokumentation immer wieder über den Weg laufen.

Zurück zur Übersicht | Installation

Upgrade auf Version 0.6.x

Das Web-Frontend ist komplett neu geschrieben worden und basiert nun auf dem PHP MVC Framework Kohana. Somit ergeben sich grundlegend andere Abhängigkeiten, die dringend vor der Installation geprüft werden müssen.

Anmerkung: Ein Upgrade läuft zuerst wie eine Neuinstallation. Anschließend sind einige Anpassungen durchzuführen, die weiter unten beschrieben sind.

PNP 0.4.x wurde ohne weitere Angabe von Optionen beim Aufruf von ./configure unterhalb einer Nagios-Installation unter /usr/local/nagios installiert.

PNP 0.6.x wird bei Angabe keiner weiteren Optionen unter /usr/local/pnp4nagios installiert, ist also wie Nagios als eigenständige Applikation zu sehen.

Anmerkung: Es reicht aus, die *.rrd-Dateien vom alten ins neue Verzeichnis zu kopieren. Sie enthalten die eigentlichen Daten. Die *.xml-Dateien werden jedes Mal neu angelegt, wenn Performance-Daten verarbeitet werden, denn sie enthalten lediglich Meta-Informationen. Außerdem hat sich die interne Struktur geändert, so dass sie sowieso nicht nutzbar sind.

Vergleich der Struktur

Summary einer Installation von PNP 0.4.14

./configure
...
*** Configuration summary for pnp 0.4.14 05-02-2009 ***

  General Options:
  -------------------------         -------------------
  Nagios user/group:                nagios nagios
  Install directory:                /usr/local/nagios
  HTML Dir:                         /usr/local/nagios/share/pnp
  Config Dir:                       /usr/local/nagios/etc/pnp
  Location of rrdtool binary:       /usr/bin/rrdtool Version 1.3.1
  RRDs Perl Modules:                FOUND (Version 1.3001)
  RRD Files stored in:              /usr/local/nagios/share/perfdata
  process_perfdata.pl Logfile:      /usr/local/nagios/var/perfdata.log
  Perfdata files (NPCD) stored in:  /usr/local/nagios/var/spool/perfdata/

Summary einer Installation von 0.6.0

./configure
...
*** Configuration summary for pnp4nagios-0.6.0 07-30-2009 ***

  General Options:
  -------------------------         -------------------
  Nagios user/group:                nagios nagios
  Install directory:                /usr/local/pnp4nagios
  HTML Dir:                         /usr/local/pnp4nagios/share
  Config Dir:                       /usr/local/pnp4nagios/etc
  Location of rrdtool binary:       /usr/bin/rrdtool Version 1.3.1
  RRDs Perl Modules:                FOUND (Version 1.3001)
  RRD Files stored in:              /usr/local/pnp4nagios/var/perfdata
  process_perfdata.pl Logfile:      /usr/local/pnp4nagios/var/perfdata.log
  Perfdata files (NPCD) stored in:  /usr/local/pnp4nagios/var/spool

  Web Interface Options:  -------------------------         -------------------
  HTML URL:                         http://localhost/pnp4nagios/
  Apache Config File:               /etc/apache2/conf.d/pnp4nagios.conf

Aus diesen Infos ergeben sich die zu ändernden Parameter und somit die Upgrade-Strategie.

Anpassungen

Die Vorlagen der action_url-Definitionen haben sich verändert. Statt ”/nagios/pnp” ist ”/pnp4nagios” einzutragen und statt “index.php” wird nun “graph” benutzt

define host {
   name       host-pnp
   action_url /pnp4nagios/graph?host=$HOSTNAME$
   register   0
}

define service {
   name       srv-pnp
   action_url /pnp4nagios/graph?host=$HOSTNAME$&srv=$SERVICEDESC$
   register   0
}

Ähnliches gilt für die Preview-Popup-Funktion

define host {
   name       host-pnp
   action_url /pnp4nagios/index.php/graph?host=$HOSTNAME$&srv=_HOST_' class='tips' rel='/pnp4nagios/index.php/popup?host=$HOSTNAME$&srv=_HOST_
   register   0
}

define service {
   name       srv-pnp
   action_url /pnp4nagios/graph?host=$HOSTNAME$&srv=$SERVICEDESC$' class='tips' rel='/pnp4nagios/popup?host=$HOSTNAME$&srv=$SERVICEDESC$
   register   0
}

Achtung: Es ist kein Fehler, dass die Zeichenketten vor und nach “class” jeweils nur ein Apostroph enthalten.

Anders als in der 0.4.x Dokumentation vermerkt gelten die Templates für Nagios 2.x und 3.x. Der einzige Unterschied besteht darin, dass die action_url-Direktive in Nagios 2.x nicht in der Service-Definition, sondern in eigenen serviceextinfo-Definitionen verfügbar ist.

Innerhalb der PHP-Dateien im templates-Verzeichnis müssen alle Variablen vor der ersten Benutzung initialisiert werden, z.B.

$lower = ""

Das gilt auch für Variablen, an die früher “angehängt” werden konnte, ohne sie vorher zu initialisieren. Daher wird aus

foreach ($DS as $i) {
    $def[1] .= "DEF:var$i=$rrdfile:$DS[$i]:AVERAGE " ;

nun

$def[1] = "";
foreach ($DS as $i) {
    $def[1] .= "DEF:var$i=$rrdfile:$DS[$i]:AVERAGE " ;


Konstanten in Template-Dateien funktionieren nicht mehr, so dass diese in Variablen umzuwandeln sind. Aus

define("_WARNRULE", '#FFFF00');

wird dann z.B.

 $WARNRULE = '#FFFF00';

Man sollte daran denken, alle Vorkommen in der Datei zu ändern ;-).

Upgrade Szenario mit NPCD

  1. Planen des neuen Aufbaus.
  2. Testinstallation durchführen und sich mit dem neuen System vertraut machen.
  3. Backup erstellen.
  4. PNP 0.6.x nach /usr/local/pnp4nagios installieren.
  5. make install-config
  6. make install-webconf
  7. Apache reload.
  8. Apache-Config testen.
    1. Aufruf /pnp4nagios muss ein leeres Perfdata-Verzeichnis melden.
  9. /usr/local/pnp4nagios/etc/npcd.cfg aus der npcd.cfg-sample erstellen.
    1. Pfade überprüfen und ggf. Änderungen der 0.4.x nachziehen.
  10. Alle Pfade zur neuen Installation in der nagios.cfg anpassen.
  11. Alle Pfade in den Command-Definitionen anpassen.
  12. npcd über /etc/init.d/npcd stop anhalten.
  13. make install-init installiert das neue Init Script für den npcd.
  14. Nagios anhalten.
  15. /usr/local/nagios/share/perfdata nach /usr/local/pnp4nagios/var/perfdata kopieren. Achtung: Auf Permissions achten.
  16. /etc/init.d/npcd start
  17. /etc/init.d/nagios start

Installation

Im Folgenden wird die Installation von PNP beschrieben. Dabei wird davon ausgegangen, dass Nagios aus den Sourcen übersetzt und im Verzeichnis /usr/local/nagios installiert wurde.
Achtung: Die Beschreibung bezieht sich auf die Developer-Version PNP 0.6.0.
Bitte vergessen Sie nicht, dass PNP nach der Installation noch konfiguriert werden muss.

Make und Co

Die Installation von PNP wird wie bei Nagios auch über Makefiles gesteuert. Dabei wird durch den Aufruf von ./configure das System analysiert und die ermittelten Werte in Makefiles übernommen.

Als User root wird PNP in /usr/local/src entpackt.

tar -xvzf pnp4nagios-HEAD.tar.gz
cd pnp4nagios

Im Verzeichnis pnp4nagios wird nun ./configure aufgerufen.

./configure

Hinweis: Ohne weitere Optionen werden als Benutzer und Gruppe “nagios” verwendet. Bei abweichenden Werten sind die Parameter ”–with-nagios-user” und ”–with-nagios-group” zu benutzen. Im Falle von Icinga könnte der Aufruf so aussehen

./configure --with-nagios-user=icinga --with-nagios-group=icinga

Es laufen einige Zeilen über den Bildschirm. Wichtig ist die Ausgabe zum Schluss.

*** Configuration summary for pnp4nagios-0.6.2 23-12-2009 ***

  General Options:
  -------------------------         -------------------
  Nagios user/group:                nagios nagios
  Install directory:                /usr/local/pnp4nagios
  HTML Dir:                         /usr/local/pnp4nagios/share
  Config Dir:                       /usr/local/pnp4nagios/etc
  Location of rrdtool binary:       /usr/bin/rrdtool Version 1.2.12
  RRDs Perl Modules:                FOUND (Version 1.2012)
  RRD Files stored in:              /usr/local/pnp4nagios/var/perfdata
  process_perfdata.pl Logfile:      /usr/local/pnp4nagios/var/perfdata.log
  Perfdata files (NPCD) stored in:  /usr/local/pnp4nagios/var/spool

  Web Interface Options:  -------------------------         -------------------
  HTML URL:                         http://localhost/pnp4nagios/
  Apache Config File:               /etc/apache2/conf.d/pnp4nagios.conf


  Review the options above for accuracy.  If they look okay,
  type 'make all' to compile.

Die angezeigten Pfade sollten nun geprüft werden. Falls die gezeigten Werte nicht passen, kann durch einen erneuten Aufruf von ./configure mit den passenden Optionen Abhilfe geschaffen werden.
ACHTUNG: Nachdem es immer wieder Schwierigkeiten gibt: “Location of rrdtool binary” bedeutet inkl. Namen des Binary! Bei Bedarf kann man das beim ./configure als Parameter angeben:

 ./configure --with-rrdtool=/usr/local/rrdtool-1.2.xx/bin/rrdtool
 ./configure --help 

zeigt, welche Optionen möglich sind.

Ein

make all

kompiliert nun die in C geschriebenen Komponenten wie NPCD

make install

kopiert alles an die richtige Stelle im Filesystem. Die Pfade wurden ja beim ./configure bereits gezeigt.

Nach der Installation der Programm- und HTML-Dateien wird mit

make install-webconf

eine Konfigurationsdatei in das Konfigurationsverzeichnis des Apache-Web-Servers kopiert.

Optional kann noch

make install-config

aufgerufen werden. Damit werden Config-Files für process_perfdata.pl und npcd nach etc/pnp kopiert.

Wird das INIT Script für den NPCD benötigt, so sorgt

make install-init

für die Installation nach /etc/init.d

Zusammenfassen lassen sich diese einzelnen Commands durch

make fullinstall

Achtung: Nach dem Kopieren der Konfigurationsdatei für den Web-Server ist ein Restart des Web-Servers notwendig (service httpd restart bzw. /etc/init.d/apache2 restart).

Update

Das Update einer 0.6.x-Version funktioniert (fast) genauso wie die Installation. Bitte beachten Sie, dass Sie beim ”./configure” die gleichen Optionen wie bei der Erstinstallation benutzen! Bitte prüfen Sie außerdem, ob Sie Änderungen im Verzeichnis share/templates.dist vorgenommen haben. Eigene Templates sollten im Ordner share/templates abgelegt werden.
Achtung: Wenn Sie in der Datei config.php Änderungen vorgenommen haben, sollten Sie diese Datei sichern, bevor sie bei einem “make install-config” überschrieben wird.

Sie können die Schritte make install-webconf und make install-init überspringen, denn zwischen den 0.6.x-Versionen gab es an dieser Stelle keine Änderungen.

Die Komponenten

Nach der Installation sind einige Komponenten von PNP an die passenden Stellen im Dateisystem kopiert worden.

Im Folgenden sind dies die PHP-Files für das Web-Frontend in

 /usr/local/pnp4nagios/share/pnp

Der Datensammler process_perfdata.pl in

 /usr/local/pnp4nagios/libexec

Beispiel-Config-Files mit der Dateierweiterung -sample in

 /usr/local/pnp4nagios/etc

Die Config-Datei config.php für das Web-Frontend in

 /usr/local/pnp4nagios/etc

Zurück zur Übersicht | Konfiguration

Konfiguration

Im Folgenden wird die Konfiguration der bereits erwähnten Arten der Performance-Daten Verarbeitung genauer erklärt.

Die bevorzugte Methode der PNP-Entwickler ist der “Bulk Mode mit NPCD und npcdmod”.

Synchronous Mode

Der Synchronous-Mode ist die einfachste Art, den Datensammler process_perfdata.pl in Nagios zu integrieren. Hierbei wird bei jedem Ereignis ein gesondertes Command process-service-perfdata (bzw. process-host-perfdata) ausgeführt.

Grundsätzlich ist in der nagios.cfg die Verarbeitung der Performance-Daten zu aktivieren. Bitte beachten Sie, dass diese Direktive wahrscheinlich bereits in der Konfigurationsdatei enthalten ist (Default ist “0”).

 process_performance_data=1

Für jeden Host und jeden Service, für den KEINE Performance-Daten verarbeitet werden sollen, ist die Verarbeitung der Performance-Daten explizit auszuschalten.

define service {
   ...
   process_perf_data 0
   ...
}

Weiterhin ist es ab Nagios 3.x möglich, in der nagios.cfg das Exportieren der Environment-Variablen zu deaktivieren. Diese sind jedoch für den Synchronous-Mode zwingend erforderlich. Daher muss

enable_environment_macros=1

ebenfalls in der nagios.cfg gesetzt sein.

Zusätzlich wird das Kommando zum Verarbeiten der Performance-Daten in der nagios.cfg angegeben.

 service_perfdata_command=process-service-perfdata

Ab Nagios 3.x ist es durchaus sinnvoll, auch die Verarbeitung der Performance-Daten für Hosts einzuschalten. Nagios 3 führt durch die geänderte Hostcheck-Logik nun auch die Prüfung der Hosts regelmäßig aus.

 host_perfdata_command=process-host-perfdata

Die referenzierten Commands müssen natürlich auch Nagios bekannt gegeben werden. Wie man sieht, sind für den Aufruf von process_perfdata.pl so gut wie keine Optionen nötig. Einzig bei Performance-Daten der Host-Checks ist die Option -d ( DATATYPE ) nötig. Wenn Sie die Schnellstart-Installationsanleitungen für Nagios benutzt haben, können Sie die Definitionen in der Datei commands.cfg anpassen.

define command {
       command_name    process-service-perfdata
       command_line    /usr/bin/perl /usr/local/pnp4nagios/libexec/process_perfdata.pl
}

define command {
       command_name    process-host-perfdata
       command_line    /usr/bin/perl /usr/local/pnp4nagios/libexec/process_perfdata.pl -d HOSTPERFDATA
}

HINWEIS: process_perfdata.pl kann nicht unter Kontrolle des ePN ( embedded Perl Nagios ) gestartet werden. Daher wird das Script explizit mit /usr/bin/perl aufgerufen. Wird ePN nicht verwendet oder wird Nagios 3.x verwendet, kann auf die Angabe von /usr/bin/perl verzichtet werden.

zurück zur Übersicht | Funktion prüfen

Bulk Mode

Der Bulk-Mode ist etwas komplizierter als der Synchronous-Mode, reduziert die Last auf dem Nagios Server jedoch merklich, da nun nicht mehr für jeden Service bzw. Host zusätzlich der Datensammler process_perfdata.pl gestartet werden muss.

Im Bulk-Mode schreibt Nagios die Daten in einem definierten Format in eine temporäre Datei. Diese Datei wiederum wird periodisch von process_perfdata.pl verarbeitet. Um den Start und den Intervall kümmert sich dabei Nagios selbst.

Auch hier muss die Verarbeitung der Performance-Daten in der nagios.cfg eingeschaltet werden.

 process_performance_data=1

Zusätzlich werden einige neue Parameter benötigt.

#
# Service Performance-Daten
#
service_perfdata_file=/usr/local/pnp4nagios/var/service-perfdata
service_perfdata_file_template=DATATYPE::SERVICEPERFDATA\tTIMET::$TIMET$\tHOSTNAME::$HOSTNAME$\tSERVICEDESC::$SERVICEDESC$\tSERVICEPERFDATA::$SERVICEPERFDATA$\tSERVICECHECKCOMMAND::$SERVICECHECKCOMMAND$\tHOSTSTATE::$HOSTSTATE$\tHOSTSTATETYPE::$HOSTSTATETYPE$\tSERVICESTATE::$SERVICESTATE$\tSERVICESTATETYPE::$SERVICESTATETYPE$
service_perfdata_file_mode=a
service_perfdata_file_processing_interval=15
service_perfdata_file_processing_command=process-service-perfdata-file

#
# Host Performance-Daten ab Nagios 3.x
# 
host_perfdata_file=/usr/local/pnp4nagios/var/host-perfdata
host_perfdata_file_template=DATATYPE::HOSTPERFDATA\tTIMET::$TIMET$\tHOSTNAME::$HOSTNAME$\tHOSTPERFDATA::$HOSTPERFDATA$\tHOSTCHECKCOMMAND::$HOSTCHECKCOMMAND$\tHOSTSTATE::$HOSTSTATE$\tHOSTSTATETYPE::$HOSTSTATETYPE$
host_perfdata_file_mode=a
host_perfdata_file_processing_interval=15
host_perfdata_file_processing_command=process-host-perfdata-file

Achtung: Die Template-Definitionen weichen von denen in der Original-nagios.cfg ab!

Die Parameter und deren Bedeutung im Einzelnen:

  • service_perfdata_file Der Pfad zur temporären Datei, in der die Daten gesammelt werden sollen.
  • service_perfdata_file_template Das Format der temporären Datei. Hier werden die Daten über Nagios-Macros definiert.
  • service_perfdata_file_mode Die Option “a” definiert, dass an die Datei angehangen werden soll.
  • service_perfdata_file_processing_interval Das Intervall beträgt 15 Sekunden
  • service_perfdata_file_processing_command das Command, das im definierten Intervall aufgerufen werden soll.

Die verwendeten Commands müssen Nagios wiederum bekannt gegeben werden. Wenn Sie die Schnellstart-Installationsanleitungen für Nagios benutzt haben, können Sie die Definitionen in der Datei commands.cfg anpassen.

define command{
       command_name    process-service-perfdata-file
       command_line    /usr/local/pnp4nagios/libexec/process_perfdata.pl --bulk=/usr/local/pnp4nagios/var/service-perfdata
}

define command{
       command_name    process-host-perfdata-file
       command_line    /usr/local/pnp4nagios/libexec/process_perfdata.pl --bulk=/usr/local/pnp4nagios/var/host-perfdata
}

HINWEIS:

Da process_perfdata.pl nun mehr Daten zu verarbeiten hat als im Default Mode, kommt es natürlich auch zu längeren Laufzeiten. Daher ist der TIMEOUT Wert in der etc/process_perfdata.cfg zu überprüfen und ggf. anzupassen.

zurück zur Übersicht | Funktion prüfen

Bulk Mode with NPCD

Die Konfiguration ist identisch mit dem “Bulk Mode”, einzig das verwendete Command ist leicht abgewandelt.

Auch hier muss die Verarbeitung der Performance-Daten in der nagios.cfg eingeschaltet werden.

 process_performance_data=1

Zusätzlich werden einige neue Parameter benötigt.

#
# Service Performance-Daten
#
service_perfdata_file=/usr/local/pnp4nagios/var/service-perfdata
service_perfdata_file_template=DATATYPE::SERVICEPERFDATA\tTIMET::$TIMET$\tHOSTNAME::$HOSTNAME$\tSERVICEDESC::$SERVICEDESC$\tSERVICEPERFDATA::$SERVICEPERFDATA$\tSERVICECHECKCOMMAND::$SERVICECHECKCOMMAND$\tHOSTSTATE::$HOSTSTATE$\tHOSTSTATETYPE::$HOSTSTATETYPE$\tSERVICESTATE::$SERVICESTATE$\tSERVICESTATETYPE::$SERVICESTATETYPE$
service_perfdata_file_mode=a
service_perfdata_file_processing_interval=15
service_perfdata_file_processing_command=process-service-perfdata-file

#
# Host Performance-Daten ab Nagios 3.x
# 
host_perfdata_file=/usr/local/pnp4nagios/var/host-perfdata
host_perfdata_file_template=DATATYPE::HOSTPERFDATA\tTIMET::$TIMET$\tHOSTNAME::$HOSTNAME$\tHOSTPERFDATA::$HOSTPERFDATA$\tHOSTCHECKCOMMAND::$HOSTCHECKCOMMAND$\tHOSTSTATE::$HOSTSTATE$\tHOSTSTATETYPE::$HOSTSTATETYPE$
host_perfdata_file_mode=a
host_perfdata_file_processing_interval=15
host_perfdata_file_processing_command=process-host-perfdata-file

Achtung: Die Template-Definitionen weichen von denen in der Original-nagios.cfg ab!

Die Parameter und deren Bedeutung im Einzelnen:

  • service_perfdata_file Der Pfad zur temporären Datei, in der die Daten gesammelt werden sollen.
  • service_perfdata_file_template Das Format der temporären Datei. Hier werden die Daten über Nagios-Macros definiert.
  • service_perfdata_file_mode Die Option “a” definiert, dass an die Datei angehangen werden soll.
  • service_perfdata_file_processing_interval Das Intervall beträgt 15 Sekunden
  • service_perfdata_file_processing_command das Command, das im definierten Intervall aufgerufen werden soll.

Die verwendeten Commands müssen Nagios wiederum bekannt gegeben werden. Wenn Sie die Schnellstart-Installationsanleitungen für Nagios benutzt haben, können Sie die Definitionen in der Datei commands.cfg anpassen.

define command{
       command_name    process-service-perfdata-file
       command_line    /bin/mv /usr/local/pnp4nagios/var/service-perfdata /usr/local/pnp4nagios/var/spool/service-perfdata.$TIMET$
}

define command{
       command_name    process-host-perfdata-file
       command_line    /bin/mv /usr/local/pnp4nagios/var/host-perfdata /usr/local/pnp4nagios/var/spool/host-perfdata.$TIMET$
}

Durch die Kommandos wird immer nach Ablauf des über service_perfdata_file_processing_interval eingestellten Intervalls die Datei service-perfdata nach var/spool/ verschoben. Dabei wird das Nagios-Macro $TIMET$ verwendet, an den Dateinamen angehängt, um zu verhindern, dass alte Dateien ungewollt überschrieben werden. Das Macro $TIMET$ enthält den aktuellen Zeitstempel in Unix-Time-Format ( Sekunden seit 1.1.1970 ).

Somit sammeln sich Dateien im Verzeichnis /usr/local/pnp4nagios/var/spool/, die nun mit Hilfe des NPCD verarbeitet werden.

NPCD überwacht das Spool-Verzeichnis und übergibt wiederum alle gefundenen Dateien an process_perfdata.pl. Damit ist die Verarbeitung der Performancedaten komplett von Nagios entkoppelt. Wir müssen nur noch den NPCD starten.

 /usr/local/pnp4nagios/bin/npcd -d -f /usr/local/pnp4nagios/etc/npcd.cfg

Die Option -d veranlasst NPCD im Hintergund als Daemon seinen Dienst zu verrichten.

Das Init Script für den NPCD wir während der Installation über “make install-init” installiert und kann somit auch für den Start verwendet werden.

 /etc/init.d/npcd start

In der Config-Datei des NPCD, der npcd.cfg, ist vor dem ersten Start zu prüfen, ob die Pfade zum Spool-Verzeichnis und zu process_perfdata.pl richtig gesetzt sind.

Weitere Informationen zu NPCD findet ihr hier.

Bulk Mode with NPCD und npcdmod

Bei diesem Modus kommt das Eventbroker-Modul npcdmod.o zu Einsatz. Der Datenfluss ist jedoch identisch zum “Bulk Mode mit NPCD”. Die internen Perfdata-Routinen von Nagios, die über die “*_perf_data_*” Optionen in der nagios.cfg konfiguriert werden, kommen NICHT mehr zu Einsatz. Das Modul npcdmod.o kümmert sich um die für PNP nötige Aufbereitung der Daten.

Vorteil:

  • Die Perfdata-Routinen innerhalb von Nagios stehen wieder für andere Addons zur Verfügung.
  • Die Konfiguration reduziert sich.
  • Die bevorzugte Methode der PNP-Entwickler.

Anpassung in der nagios.cfg:

process_performance_data=1
broker_module=/usr/local/pnp4nagios/lib/npcdmod.o config_file=/usr/local/pnp4nagios/etc/npcd.cfg

Alle anderen auf dieser Seite gezeigten Optionen dürfen für diesen Modus NICHT mehr verwendet werden.

Achtung: Wichtig sind in diesem Zusammenhang auch die event_broker_options bei einem von -1 abweichenden Wert. Für PNP müssen die Bits 2 und 3 gesetzt sein (0b01100; siehe auch http://www.nagios-wiki.de/nagios/ndo/eventbroker_optionen).

Nach dem Neustart von Nagios werden Informationen zum Ladevorgang des Moduls protokolliert.

Auszug aus den nagios.log

[1277545053] npcdmod: Copyright (c) 2008-2009 Hendrik Baecker (andurin@process-zero.de) - http://www.pnp4nagios.org
[1277545053] npcdmod: /usr/local/pnp4nagios/etc/npcd.cfg initialized
[1277545053] npcdmod: spool_dir = '/usr/local/pnp4nagios/var/spool/'.
[1277545053] npcdmod: perfdata file '/usr/local/pnp4nagios/var/perfdata.dump'.
[1277545053] npcdmod: Ready to run to have some fun!
[1277545053] Event broker module '/usr/local/pnp4nagios/lib/npcdmod.o' initialized successfully.

Gearman Mode

PNP4Nagios kann seit Version 0.6.12 als Gearman-Worker betrieben werden. So sind große verteilte Nagios-Umgebungen auf Basis von mod_gearman realisierbar. Außerdem kann man dadurch Nagios und PNP4Nagios auf unterschiedliche Rechner verteilen.

Benötigt wird eine fertig eingerichtete mod_gearman Installation wie von Sven Nierlein unter http://labs.consol.de/lang/en/nagios/mod-gearman/ beschrieben.

In etc/process_perfdata.cfg gibt es einen gearman-Abschnitt:

 PREFORK = 0
 GEARMAN_HOST = localhost:4730
 REQUESTS_PER_CHILD = 10000
 ENCRYPTION = 1
 KEY = should_be_changed
 #KEY_FILE = /usr/local/pnp4nagios/etc/secret.key

Dort ist mit PREFORK = <n> die Anzahl von zusätzlichen(!) Kindprozessen anzugeben. Bei “0” wird lediglich ein “Elternprozess” gestartet.
GEARMAN_HOST = <host>:<port> definiert Rechner und Port, auf dem der gearman-Daemon die Daten bereitstellt.
Über REQUESTS_PER_CHILD = <n> kann die maximal zu verarbeitende Anzahl von Anforderungen pro Prozess eingestellt werden.
ENCRYPTION = <1|0> stellt ein, ob Verschlüsselung benutzt werden soll. Die Standardeinstellung ist eine aktivierte Verschlüsselung (“1”) und das sollte nur in Ausnahmefällen verändert werden. Dabei kann entweder über KEY = <Schlüssel> der zu benutzende Schlüssel definiert oder per KEY_FILE = <Schlüsseldatei> der Standort einer Schlüsseldatei angegeben werden.

/etc/init.d/pnp_gearman_worker enthält Verweise auf die Perl-Prozedur process_perfdata.pl sowie die Konfigurationsdatei process_perfdata.cfg.

Nach dem Start des PNP-Daemons per

 /etc/init.d/pnp_gearman_worker start

werden die Performance-Daten verarbeitet, die über den gearmand-Daemon auf dem Nagios-Rechner zur Verfügung gestellt werden.

zurück zur Übersicht | Funktion prüfen

Prüfen der Installation

Wenn bis jetzt alles sauber funktioniert hat, kann PNP zum ersten Mal im Browser aufgerufen werden. Bei der Installation mit den Standardeinstellungen erfolgt der Aufruf über http://<Servername>/pnp4nagios/.

Beim ersten Aufruf sieht man die Seite “PNP4Nagios Environment Tests”, die verschiedene Tests von notwendigen Komponenten enthält. Offenkundig sollten alle Tests erfolgreich verlaufen, bevor es weitergehen kann. Bitte beachten Sie die Hinweise auf der Seite.

Sind alle Tests erfolgreich verlaufen, so kann die Datei pnp4nagios/share/install.php gelöscht oder umbenannt werden. Erst dann ist das Webinterface erreichbar.

Alternativ kann eine Datei pnp4nagios/share/install.ignore angelegt werden, um den Aufruf des Installers nach weiteren Updates zu ignorieren.

Ohne weitere Optionen sucht PNP nach RRD- und XML-Dateien in pnp4nagios/var/perfdata/ und zeigt alle Graphen des ersten Hosts in der Übersicht an.

ACHTUNG: Direkt nach dem (Neu-)Start von Nagios nach dem Aktivieren der Verarbeitung von Performance-Daten wird der Aufruf im Browser zu Fehlermeldungen führen, weil zunächst Performance-Daten gesammelt und in den RRD-Dateien abgelegt werden müssen. Abhängig vom Check-Intervall kann es einige Zeit dauern, bis die ersten Graphen angezeigt werden können.

Logfile

Während der Installation wurde durch den Aufruf von make install-config ein Beispiel-Config-File etc/process_perfdata.cfg-sample erzeugt. Die Werte in der sample-Datei entsprechen den Default-Werten, die auch in process_perfdata.pl fest hinterlegt sind, daher ist die process_perfdata.cfg für den Betrieb nicht zwingend notwendig.

Die Datei process_perfdata.cfg-sample kann somit als Vorlage für die process_perfdata.cfg dienen, die immer dann notwendig ist, wenn vom Standard abweichende Werte eingestellt werden sollen.

In der process_perfdata.cfg lässt sich das Verhalten von process_perfdata.pl vielfach beeinflussen.

Die wichtigsten Optionen für die Inbetriebnahme sind LOG_LEVEL und LOG_FILE. Im laufenden Betrieb sollte der Log-Level immer auf 0 gesetzt sein, um die Performance von process_perfdata.pl nicht durch unnötiges Schreiben von Logfiles zu beeinträchtigen.

Während der Inbetriebnahme sollte man jedoch den LOG_LEVEL auf “2” setzen, um zu sehen, was process_perfdata.pl bei der Verarbeitung der Performance-Daten so alles anstellt.

Spätestens bei Support Anfragen im Forum oder auf den Mailinglisten werden wir sowohl nach Auszügen aus dem perfdata.log als auch nach der Ausgabe des verify_pnp_config-Scripts fragen. Es empfiehlt sich also, diese Angaben gleich mitzuliefern ;-).

Was aber wenn nicht ?

Einige grundlegende Einstellungen sind zu prüfen.

1. Sind RRD- und XML-Files erzeugt worden ?

process_perfdata.pl legt für jeden Host unter var/perfdata ein neues Verzeichnis an. In diesem Verzeichnis wird wiederum für jeden Service eine RRD-Datenbank und ein XML-File erstellt. Für den Host-Check lautet der Dateinamen _HOST_.xml bzw. _HOST_.rrd.
Falls Graphen urplötzlich nicht mehr weitergeführt werden, dann hilft vielleicht ein Blick in die betroffene XML-Datei. Dort gibt es u.a. die Tags <RC> und <TXT>. <RC> zeigt den Return-Code des RRDtool-Updates der RRD-Datei, <TXT> eine textuelle Beschreibung.
Allerdings liefern nicht alle Checks Performance-Daten, das gilt u.a. für “check_ping”, die Alternative “check_icmp” dagegen erzeugt Daten (ab Nagios-Plugin-Version 1.4.12 liefert auch check_ping Performance-Daten).
Teilweise muss man zusätzliche Optionen aktivieren, damit Performance-Daten ausgegeben werden. Evtl. kann das auch durch ein Wrapper-Script geändert werden.
In den Detailinformationen zu jedem Host/Service gibt es das Feld “Performance-Data”. Wenn dort keine Daten stehen, dann werden im jeweiligen Verzeichnis keine Dateien erzeugt und PNP kann deshalb auch keine grafischen Auswertungen liefern!
Das folgende Bild zeigt die Informationen zu einem “PING”-Service. Das blaue Feld enthält den vom Plugin gelieferten Text, das rote die Performance-Daten, die Nagios erkannt hat.
Informationen zu "PING"

2. Hat Nagios process_perfdata.pl aufgerufen ?

In der Config-Datei für process_perfdata.pl, der etc/process_perfdata.cfg lässt sich der Debug-Level erhöhen. Die Verarbeitung der Daten wird nun in var/perfdata.log bzw. im Syslog protokolliert.

3. Grafiken werden ohne Text angezeigt ?

siehe Anforderungen

4. Bei aktiviertem npcdmod-Modul muss der Wert von event_broker_options in der nagios.cfg ggf. angepasst werden. Hinweise gibt es hier.

5. verify_pnp_config

Das Perl-Script verify_pnp_config.pl im scripts-Verzeichnis des Installationsordners bzw. im libexec-Verzeichnis ermöglicht die Prüfung von Konfigurationseinstellungen und zeigt, ob Performance-Daten vorhanden bzw. gültig sind. Die Syntax dafür ist ziemlich einfach:

./verify_pnp_config.pl -m <Modus>

wobei <Modus> durch “sync”, “bulk” oder “npcd” zu ersetzen ist (ohne Anführungszeichen). Bitte beachten Sie, dass “default” ab PNP v.0.6.0 den “npcd”-Modus prüft.

zurück zur Übersicht | verify_pnp_config.pl

verify_pnp_config

Bei Problemen kann das Perl-Script verify_pnp_config von http://verify.pnp4nagios.org helfen die aktuelle Nagios/Icinga Konfiguration zu prüfen und entsprechend Hinweise zur Lösung liefern.

Bei Support Anfragen sollte immer die Ausgabe dieses Scripts mit angegeben werden, da die Entwickler sich so einen besseren Überblick über das verwendete System machen können.

Feedback, Verbesserungsvorschläge oder Patches bitte per Mail an support@pnp4nagios.org

Download

Das Verify Script ist unter http://verify.pnp4nagios.org verfügbar.

wget http://verify.pnp4nagios.org/verify_pnp_config

Test

Das Verify Script benötigt drei Optionen um die Funktion von PNP4Nagios zu prüfen

lenny:~# perl verify_pnp_config

verify_pnp_config -m|--mode=[sync|bulk|bulk+npcd|npcdmod]
                 -c|--config=[path to nagios.cfg]
                 -p|--pnpcfg=[path to PNP config dir]

Die wichtigste Infos ist der zu prüfende Modus, welcher mit der Option –mode angegeben wird.
Weitere Infos über die einzelnen Modi und deren Konfiguration unter "Welcher Modus ist für mich richtig ?" und "Konfiguration"

Weiterhin ist der Pfad zur Nagios Config Datei (nagios.cfg) über die Option –config zu übergeben. Auf einem Icinga System ist es entsprechend der Pfad zur icinga.cfg.

Über –pnpcfg wird der Pfad zum etc Verzeichnis der PNP4Nagios Installation übergeben.

lenny:~# perl verify_pnp_config --mode npcdmod --config=/usr/local/nagios/etc/nagios.cfg --pnpcfg=/usr/local/pnp4nagios/etc
[INFO]  ========== Starting Environment Checks ============
[INFO]  My version is: verify_pnp_config-0.6.14-R.31
[INFO]  Reading /usr/local/nagios/etc/nagios.cfg
[OK  ]  Running product is 'nagios'
[OK  ]  object_cache_file is defined
[OK  ]  object_cache_file=/usr/local/nagios/var/objects.cache
[INFO]  Reading /usr/local/nagios/var/objects.cache
[OK  ]  resource_file is defined
[OK  ]  resource_file=/usr/local/nagios/etc/resource.cfg
[INFO]  Reading /usr/local/nagios/etc/resource.cfg
[INFO]  Reading /usr/local/pnp4nagios/etc/process_perfdata.cfg
[INFO]  Reading /usr/local/pnp4nagios/etc/pnp4nagios_release
[OK  ]  Found PNP4Nagios version "0.6.14"
[OK  ]  Effective User is 'nagios'
[OK  ]  User nagios exists with ID '1000'
[OK  ]  Effective group is 'nagios'
[OK  ]  Group nagios exists with ID '1000'
[INFO]  ========== Checking npcdmod Mode Config  ============
[OK  ]  process_performance_data is 1 compared with '/1/'
[OK  ]  event_broker_options is defined
[OK  ]  event_broker_options=-1
[OK  ]  event_broker_option bits 2 and 3 enabled (12)
[OK  ]  broker_module is defined
[OK  ]  broker_module=/usr/local/pnp4nagios/lib/npcdmod.o config_file=/usr/local/pnp4nagios/etc/npcd.cfg
[OK  ]  npcdmod.o config file is /usr/local/pnp4nagios/etc/npcd.cfg
[OK  ]  /usr/local/pnp4nagios/etc/npcd.cfg used by npcdmod.o is readable
[OK  ]  npcd daemon is running
[OK  ]  /usr/local/pnp4nagios/etc/npcd.cfg is used by npcd and readable
[OK  ]  npcd and npcdmod.o are using the same config file (/usr/local/pnp4nagios/etc/npcd.cfg)
[INFO]  Nagios config looks good so far
[INFO]  ========== Checking config values ============
[INFO]  Reading /usr/local/pnp4nagios/etc/npcd.cfg
[OK  ]  Script /usr/local/pnp4nagios/libexec/process_perfdata.pl is executable
[INFO]  ========== Starting global checks ============
[OK  ]  status_file is defined
[OK  ]  status_file=/dev/shm/status.dat
[INFO]  Reading /dev/shm/status.dat
[INFO]  ==== Starting rrdtool checks ====
[OK  ]  RRDTOOL is defined
[OK  ]  RRDTOOL=/usr/bin/rrdtool
[OK  ]  /usr/bin/rrdtool is executable
[OK  ]  RRDtool 1.3.1  Copyright 1997-2008 by Tobias Oetiker <tobi@oetiker.ch>
[OK  ]  USE_RRDs is defined
[OK  ]  USE_RRDs=1
[OK  ]  Perl RRDs modules are loadable
[INFO]  ==== Starting directory checks ====
[OK  ]  RRDPATH is defined
[OK  ]  RRDPATH=/usr/local/pnp4nagios/var/perfdata
[OK  ]  Perfdata directory '/usr/local/pnp4nagios/var/perfdata' exists
[WARN]  62 hosts/services are not providing performance data
[WARN]  'process_perf_data 1' is set for 43 hosts/services which are not providing performance data!
[WARN]  'process_perf_data 0' is set for 27 of your hosts/services
[OK  ]  'process_perf_data 1' is set for 243 of your hosts/services
[INFO]  ==== System sizing ====
[OK  ]  269 hosts/service objects defined
[INFO]  ==== Check statistics ====
[WARN]  Warning: 3, Critical: 0
[WARN]  Checks finished...

Das Nagios Web Frontend

PNP soll natürlich schnell erreichbar sein. Man möchte nicht lange nach den richtigen Graphen suchen.

Nagios selbst bietet die Möglichkeit, externe URLs über die sogenannte Extended Info Config einzubinden. Da es in diesem Bereich eine Änderung zwischen Nagios 2.x und der Version 3.0 gibt, wird anschließend auf beide Versionen getrennt eingegangen.

Nagios 2.x

Bis Nagios 2.x erfolgt die Einbindung externer URLs in das Nagios-Web-Interface über die Extended-Info-Objekte. Für PNP verwenden wir die Option action_url, um das PNP-Web-Frontend mit den passenden Optionen aufzurufen.

define serviceextinfo {
   name                  srv-pnp
   action_url            /pnp4nagios/index.php/graph?host=$HOSTNAME$&srv=$SERVICEDESC$
   register              0
}

Dieses Template kann nun über “use srv-pnp” in der serviceextinfo-Definition verwendet werden. Wenn Sie die Schnellstart-Installationsanleitungen benutzt haben, können Sie beispielsweise in der Datei localhost.cfg die Definitionen wie folgt erweitern:

define serviceextinfo {
   use                     srv-pnp   ; Name of service templates to use
   host_name               localhost
   service_description     load
}

Nagios 3.x

Seit Nagios 3.0 ist die Direktive action_url in die Host- bzw. Service-Definition verschoben worden. Die serviceextinfo- und hostextinfo-Definitionen sind entfallen. Damit wird die Definition der URLs zum PNP-Interface wesentlich vereinfacht.

Zuerst definieren wir zwei Nagios-Templates. Falls Sie die Schnellstart-Installationsanleitungen für Nagios benutzt haben, können Sie die folgenden Zeilen der Datei templates.cfg hinzufügen:

define host {
   name       host-pnp
   action_url /pnp4nagios/index.php/graph?host=$HOSTNAME$&srv=_HOST_
   register   0
}

define service {
   name       srv-pnp
   action_url /pnp4nagios/index.php/graph?host=$HOSTNAME$&srv=$SERVICEDESC$
   register   0
}

Diese beiden Templates können nun über “use srv-pnp” in der Service-Definition oder “use host-pnp” in der Host-Definition verwendet werden. Wenn Sie die Schnellstart-Installationsanleitungen benutzt haben, können Sie beispielsweise in der Datei localhost.cfg die Definitionen wie folgt erweitern:

define host{
        use                     linux-server,host-pnp    ; Name of host templates to use
                                                         ; This host definition will inherit all variables that are defined
                                                         ; in (or inherited by) the linux-server host template definition.
        host_name               localhost
        alias                   localhost
        address                 127.0.0.1
        }
define service{
        use                     local-service,srv-pnp   ; Name of service templates to use
        host_name               localhost
        service_description     PING
        check_command           check_ping!100.0,20%!500.0,60%
        }

Die Links auf die richtigen URLs werden automagisch erstellt.

Preview Popup

Außerdem gibt es die Möglichkeit, die Graphen bereits in der Statusübersicht beim Überfahren des “Action Url Icons” mit der Maus einzublenden.

Ermöglicht wird dies durch die CGI Includes, die es uns erlauben, Javascript-Code an geeigneter Stelle im Seitenkopf der Statusübersicht einzubinden ( status.cgi ).

In den PNP-Quellen ist die Datei contrib/ssi/status-header.ssi bereits enthalten, die verwendeten URLs müssen aber unter Umständen angepasst werden. Wir gehen hier davon aus, dass PNP über /pnpnagios/index.php erreichbar ist.

Die besagte Datei muss in das Verzeichnis /usr/local/nagios/share/ssi/ kopiert werden und darf NICHT ausführbar sein. Nagios würde die Datei sonst wirklich wie ein CGI behandeln und ausführen, was aber in diesem Fall zu Fehlern führen würde. Die Apache-Admins mögen bitte “Nagios SSI” nicht mit “Apache SSI” in Verbindung bringen. Beides hat nichts miteinander zu tun.

Die action_url ist entsprechend anzupassen:

define host {
   name       host-pnp
   register   0
   action_url /pnp4nagios/index.php/graph?host=$HOSTNAME$&srv=_HOST_' class='tips' rel='/pnp4nagios/index.php/popup?host=$HOSTNAME$&srv=_HOST_
}

define service {
   name       srv-pnp
   register   0
   action_url /pnp4nagios/index.php/graph?host=$HOSTNAME$&srv=$SERVICEDESC$' class='tips' rel='/pnp4nagios/index.php/popup?host=$HOSTNAME$&srv=$SERVICEDESC$
}

Nach einem Restart von Nagios (nach Anpassung der Definitionen) sieht das Ergebnis ungefähr so aus:

Zurück zur Übersicht | Konfiguration Web-Frontend

PNP Web Frontend

Das Verhalten des PNP-Web-Frontend lässt sich über die Config-Datei etc/config.php beeinflussen. Diese Datei wird bei Updates von PNP immer wieder überschrieben, da die meisten Pfade und Optionen bereits durch ./configure ermittelt werden.

Eigene Anpassungen sollten daher in der Datei etc/config_local.php erfolgen. Sollte die Datei noch nicht existieren, kann die config.php als Vorlage verwendet werden.

etc/pnp/config.php

Im folgenden die wichtigsten Parameter:

Der Pfad zum RRDtool-Binary. Wird von ./configure ermittelt.

 $conf['rrdtool'] = "/usr/bin/rrdtool";

Höhe und Breite der RRD-Graphen

 $conf['graph_width'] = "500";
 $conf['graph_height'] = "100";

Bildschirmdimensionen ändern sich, Blattgrößen nicht. Um unterschiedliche Einstellungen zu ermöglichen, können für die Generierung von PDF-Dateien eigene Werte definiert werden. Wenn diese Variablen nicht definiert sind, werden die Werte der Graphen benutzt. Höhe und Breite der RRD-Graphen bei PDFs

 $conf['pdf_width'] = "675";
 $conf['pdf_height'] = "100";

Zusätzliche Optionen, die bei jedem Aufruf von RRDTool mit übergeben werden. Beispielsweise —-slope-mode, um die Graphen etwas zu glätten.

 $conf['graph_opt'] = "";

Der Pfad zu den von process_perfdata.pl erstellten RRD- und XML-Dateien

 $conf['rrdbase'] = "/usr/local/pnp4nagios/var/perfdata/";

Pfad zu den Config-Files für die Pages.

 $conf['page_dir'] = "/usr/local/pnp4nagios/etc/pages/";

Wert in Sekunden, nachdem die PNP-Seiten neu geladen werden sollen.

 $conf['refresh'] = "90";

Maximales Alter der RRD-Files in Sekunden. Nach Erreichen dieses Wertes werden Links zu den Graphen als “inactive” gekennzeichnet.

 $conf['max_age'] = 60*60*6;

Basis-URL zu den Nagios CGIs.

 $conf['nagios_base'] = "/nagios/cgi-bin";

Liste von Usern, für die Links zu den Services des aktuellen Hosts angezeigt werden sollen.

 $conf['allowed_for_service_links'] = "EVERYONE";

Liste von Usern, für die das Host-Suchfeld angezeigt werden soll.

 $conf['allowed_for_host_search'] = "EVERYONE";

Wird PNP nur mit der Angabe eines Hosts ( index.php?host=<myserver> ) aufgerufen, so wird eine Übersicht aller Services angezeigt, wenn der User in dieser Liste enthalten ist.

 $conf['allowed_for_host_overview'] = "EVERYONE";

Das Array $views[] legt fest, welche Zeitspannen die RRD-Graphen dargestellen sollen. Der Titel und die Anzahl der Graphen kann somit hier zentral definiert werden.

$views[] = array('title' => 'One Hour',  'start' => (60*60) );
$views[] = array('title' => '4 Hours',   'start' => (60*60*4) );
$views[] = array('title' => '25 Hours',  'start' => (60*60*25) );
$views[] = array('title' => 'One Week',  'start' => (60*60*25*7) );
$views[] = array('title' => 'One Month', 'start' => (60*60*24*32) );
$views[] = array('title' => 'One Year',  'start' => (60*60*24*380) );

Sie können hier auch weitere Views definieren, sollten aber dabei berücksichtigen, dass im Normalfall ALLE definierten Views angezeigt werden.

zurück zur Übersicht | Timeranges

Timeranges

In der Übersicht zeigt PNP fünf Zeitbereiche, die frei in der config.php definiert werden können.

Es gibt aber auch die Möglichkeit, die Zeitbereiche über die URL zu beeinflussen. Dies ist hilfreich, wenn z.B. automatisch PDF-Dokumente erstellt werden sollen

Die Zeitbereiche werden über die Optionen start und end definiert.

Beispiel:

 pnp4nagios/graph?host=<hostname>&srv=<servicedesc>&start=-1week
 pnp4nagios/graph?host=<hostname>&srv=<servicedesc>&start=2011102322:50:00&end=2011102409:50:00

Der Startzeitpunkt der Graphen wird somit, ausgehend vom aktuellen Datum, um eine Woche nach hinten verschoben. Der Endzeitpunkt bleibt auf dem aktuellen Zeitstempel. Aber auch end lässt sich über diesen Weg beeinflussen, wobei beide Optionen auch einzeln manipuliert werden dürfen.

start end view Ergebnis
Alle Ansichten enden mit der aktuellen Zeit
x Alle Ansichten beginnen mit dem angegebenen Datum
x Alle Ansichten enden mit dem angegebenen Datum
x x Eine Ansicht zwischen den beiden Zeitangaben
x Eine Ansicht endet mit der aktuellen Zeit
x x Eine Ansicht beginnt mit dem angegebenen Datum
x x Eine Ansicht endet mit dem angegebenen Datum

Beispiele zur Datumsangabe:

Format Beschreibung
2009W04 4. KW 2009
1.5.2009 1. Mai 2009
-1 day Einen Tag zurück
-3 weeks 3 Wochen zurück
-1 year Ein Jahr zurück
yesterday Gestern
2011102322:50:00 23.10.2011 ab 22:50:00 Uhr

zurück zur Übersicht | Pages

Pages

„pages“ bieten die Möglichkeit, Grafiken von verschiedenen Hosts/Services auf einer Seite zusammenzufassen. Auf diese Weise können z.B. die Übertragungsraten der Netzwerk-Interfaces aller Tape-Libraries dargestellt werden. Innerhalb der Definitionen sind reguläre Ausdrücke möglich, so dass – entsprechende Namen vorausgesetzt - mit wenig Aufwand viel erreicht werden kann. Das Verzeichnis, das in config.php durch den Konfigurationseintrag „$conf['page_dir']“ angegeben wurde, enthält ein oder mehrere Dateien mit der Endung „.cfg“.

Kommentare beginnen mit einem '#' und sind auch innerhalb einer Zeile möglich. Jede Datei enthält eine „page“-Definition, die neben dem Namen der Seite festlegt, ob die nachfolgenden Grafikdefinitionen reguläre Ausdrücke enthalten.
Die Bezeichnung hinter page_name erscheint in der Liste der verfügbaren Seiten und wird als Titel im Browser angezeigt. Achtung: “host_name” und “service_desc” beziehen sich auf die Namen der Dateien im perfdata-Ordner, nicht auf die Nagios-Bezeichnungen. Leerzeichen werden durch Unterstriche (“_”) ersetzt.

define  page  {
        use_regex 1		# 0 = keine regulären Ausdrücke, 1 = reguläre Ausdrücke
        page_name Test-Seite	# Beschreibung der Seite
}

Danach folgen ein oder mehrere „graph“-Definitionen:

define graph {
        host_name       host1,host2,host3
        service_desc    Current_Load
}

Achtung: Damit die oben gezeigte Liste von Host-Namen funktioniert, muss use_regex 0 gesetzt sein!

define graph {
        host_name       host4
        service_desc    Current_Users
}

Und jetzt mit regulären Ausdrücken. Zuerst alle Hosts, deren Name mit „Tape“ beginnen:

define graph {
        host_name       ^Tape
        service_desc    Traffic
}

alle Hosts, deren Namen mit “00” enden

define graph {
        host_name       00$
        service_desc    Load
}

alle Services des localhost, deren Namen ein „a“ oder „o“ enthalten:

define graph {
        host_name       localhost
        service_desc    a|o
}

alle Services, die im Namen nach einem „_“ (mindestens) drei Ziffern haben auf allen Hosts, deren Namen mit „UX“ beginnen:

define graph {
        host_name       ^UX
        service_desc    _\d{3}
}

In einigen Fällen möchten Sie vielleicht die Anzeige auf einen Graphen beschränken. Um dies zu erreichen, können Sie die optionale Direktive “source” benutzen, gefolgt von einer Zahl, die die Position in der RRD-Datei angibt. Die Zählung beginnt ab 0

define graph {
       host_name       host1,host2,host3
       service_desc    PING
       source          1
}

zurück zur Übersicht | Datenexport

Datenexport

PNP bietet über den xport Controller Zugriff auf die RRD-Daten. Dabei kann das Ausgabeformat gewählt werden. Zur Zeit sind die Formate xml, json und csv realisiert.

Aufgerufen wird der Controller über die URL

/pnp4nagios/xport/<format>?host=<hostname>&srv=<servicedesc>

wobei <format> durch das jeweils gewünschte Format zu ersetzen ist.

Sie können außerdem wget benutzen, um Bilder zu erzeugen und diese in regelmäßigen Reports einzufügen. Ein Beispiel:

wget -O image.png 'http://<user>:<pass>@<nagios-server>/pnp4nagios/image?host=<hostname>&srv=<service>&view=2&source=0'

view=<n> begrenzt den Graphen auf die Zeitperiode, die in config.php definiert ist
source=<n> zeigt nur eine Data-Source, wenn mehrere in der RRD-Datei vorhanden sind

Anstatt view können Sie auch start und/oder end benutzen, um die Zeitspanne anzugeben. Details finden Sie in den "time ranges".

zurück zur Übersicht | Templates

Was sind Templates ?

PNP benutzt Templates, um das Aussehen der RRD-Graphen zu beeinflussen.

Dabei bestimmt das verwendete check_command, welches Template zur Darstellung herangezogen wird. Im Folgenden wird beschrieben, wo Templates gespeichert werden und wie die Entscheidung für das “richtige” Template getroffen wird.

Wann wird welches Template verwendet ?

Templates werden an zwei Stellen im Dateisystem gespeichert.

  • share/templates.dist - für Templates, die im PNP-Paket bereits enthalten sind.
  • share/templates - für selbst erstellte Templates. Diese werden bei Updates nicht verändert.

Weiterhin können seit Version 0.6.5 weitere Template Verzeichnisse in der Config Datei pnp4nagios/etc/config.php hinzugefügt werden.

Soll der Graph für den Service “http” auf Host “localhost” angezeigt werden, so sucht PNP zuerst nach der XML-Datei perfdata/localhost/http.xml und liest diese ein. Diese XML-Dateien werden automatisch erstellt und enthalten Informationen zum jeweiligen Host und Service. Weiterhin enthält der Kopf Informationen über das Plugin und die Performance-Daten. Im folgenden Beispiel erkennt man anhand des XML-Tags <TEMPLATE>, welches PNP-Template für diesen Graphen verwendet werden soll.

/localhost/http.xml

<NAGIOS>
  <DATASOURCE>
    <TEMPLATE>check_http</TEMPLATE>
    <DS>1</DS>
    <NAME>time</NAME>
    <UNIT>s</UNIT>
    <ACT>0.006721</ACT>
    <WARN>1.000000</WARN>
    <CRIT>2.000000</CRIT>
    <MIN>0.000000</MIN>
    <MAX></MAX>
  </DATASOURCE>
  <DATASOURCE>
    <TEMPLATE>check_http</TEMPLATE>
    <DS>2</DS>
    <NAME>size</NAME>
    <UNIT>B</UNIT>
    <ACT>263</ACT>
    <WARN></WARN>
    <CRIT></CRIT>
    <MIN>0</MIN>
    <MAX></MAX>
  </DATASOURCE>
...
</NAGIOS>

PNP sucht nun nach einem Template mit dem Namen check_http.php in folgender Reihenfolge:

  1. templates/check_http.php
  2. templates.dist/check_http.php
  3. templates/default.php
  4. templates.dist/default.php

Das Template default.php nimmt somit eine Sonderstellung ein und wird immer verwendet, wenn vorher kein anderes Template gefunden wird.

Eigene Templates erstellen

PNP-Templates sind PHP-Dateien, die zur Laufzeit von PNP über die PHP-Funktion include() eingebunden werden. Dies bedeutet, dass jeder PHP-Code in Templates interpretiert wird. Daher ist die Manipulation aller Werte über PHP möglich.

PNP-Templates müssen folgende Eigenschaften besitzen:

  1. Templates müssen gültigen PHP-Code enthalten.
  2. Templates dürfen keine Ausgabe erzeugen.
  3. innerhalb der Templates werden die zwei Arrays $opt[] und $def[] gefüllt.

Die beiden PHP-Arrays $opt[] und $def[] zusammen bilden den Aufruf von 'rrdtool graph'. Somit sind alle Optionen möglich, die RRDtool bietet. Die Optionen von RRDtool sind auf der RRDtool Homepage genauestens beschrieben.

Wenn beide Arrays mehrere Datensätze enthalten, so wird für jeden Datensatz ein Graph erstellt.

Weiterhin stehen innerhalb der Templates die Daten aus dem zugehörigen XML-File zur Verfügung, die zum Erstellen der Graphen wieder verwendet werden können.

Am Beispiel des recht einfachen Templates response.php lassen sich die wichtigsten Optionen recht gut beschreiben.

<?php
#
$opt[1] = "--title \"Response Time For $hostname / $servicedesc\" ";
#
$def[1] =  "DEF:var1=$RRDFILE[1]:$DS[1]:AVERAGE " ;
$def[1] .= "AREA:var1#00FF00:\"Response Times \" " ;
$def[1] .= "LINE1:var1#000000 " ;
$def[1] .= "GPRINT:var1:LAST:\"%3.4lg %s$UNIT[1] LAST \" ";
$def[1] .= "GPRINT:var1:MAX:\"%3.4lg %s$UNIT[1] MAX \" ";
$def[1] .= "GPRINT:var1:AVERAGE:\"%3.4lg %s$UNIT[1] AVERAGE \" ";
?>

$opt[1] = ”–title …” setzt RRDtool-Optionen für den ersten Datensatz im Array. Hier ist das der Titel des Graphen. Wie man sieht, werden eingebettete Anführungszeichen durch einen Backslash (\) maskiert. Die beiden Variablen $hostname und $servicedesc sind durch den Aufruf von PNP ermittelt worden und stehen nun auch im Template zur Verfügung.

$def[1] = “DEF:var1=$RRDFILE[1]:$DS[1]:AVERAGE ”; definiert, welche Daten aus welchem RRD-File gelesen werden sollen. $RRDFILE[1] enthält den Pfad zur RRD-Datei dieses Services. $DS[1] verweist auf die Datenreihe eins aus der RRD-Datei.

$def[1] .= “AREA:var1#00FF00:\”Response Times \” ”; durch den Operator ”.=” werden weitere Daten an das Array $def[1] angehängt. Gezeichnet wird eine Fläche (AREA) mit den Daten der Variable var1. Die Farbe wird im HEX-Code #00FF00 definiert. Als Beschriftung wird “Response Times” verwendet.

$def[1] .= “LINE1:var1#000000 ”; Als Abschluss der eben gezeichneten Fläche wird eine Linie (LINE1) in Schwarz (#000000) gezeichnet.

$def[1] .= “GPRINT:var1:LAST:\”%3.4lg %s$UNIT[1] LAST \” ”;
$def[1] .= “GPRINT:var1:MAX:\”%3.4lg %s$UNIT[1] MAX \” ”;
$def[1] .= “GPRINT:var1:AVERAGE:\”%3.4lg %s$UNIT[1] AVERAGE \” ”;

Die drei GPRINT Zeilen bilden die Legende des Graphen. Die aktuellen Werte werden dabei über die printf Syntax formatiert.

Verfügbare Variablen

PNP speichert über den Datensammler process_perfdata.pl zur Laufzeit nicht nur Performancedaten, sondern auch weitere von Nagios exportierte Werte. Diese Werte werden in der jeweils für den Service gültigen XML-Datei gespeichert.

Im ersten Teil der XML-Datei werden die Performancedaten in ihre Einzelteile zerlegt gespeichert.

<NAGIOS>
  <DATASOURCE>
    <TEMPLATE>check_http</TEMPLATE>
    <DS>1</DS>
    <NAME>time</NAME>
    <UNIT>s</UNIT>
    <ACT>0.006721</ACT>
    <WARN>1.000000</WARN>
    <CRIT>2.000000</CRIT>
    <MIN>0.000000</MIN>
    <MAX></MAX>
  </DATASOURCE>
...
</NAGIOS>

Das Feld <DS> bezeichnet die DataSource und dient der Identifizierung der Datenreihen innerhalb der RRD-Dateien, ist aber auch der Schlüssel der folgenden Arrays.

Im Array $UNIT[1] ist somit die Einheit der ersten Datenreihe gespeichert.

Die XML-Datei enthält jedoch noch weitere Informationen. Wird process_perdata.pl im sync-Mode verwendet, so sind alle verfügbaren Makros mit den aktuellen Werten verfügbar. Der folgende Ausschnitt ist jedoch zu Gunsten der Lesbarkeit gekürzt.

<NAGIOS>
...
  <NAGIOS_SERVICENOTIFICATIONID>8418</NAGIOS_SERVICENOTIFICATIONID>
  <NAGIOS_SERVICENOTIFICATIONNUMBER>0</NAGIOS_SERVICENOTIFICATIONNUMBER>
  <NAGIOS_SERVICEOUTPUT>HTTP OK HTTP/1.1 200 OK - 10087 bytes in 0.125 seconds</NAGIOS_SERVICEOUTPUT>
  <NAGIOS_SERVICEPERCENTCHANGE>0.00</NAGIOS_SERVICEPERCENTCHANGE>
  <NAGIOS_SERVICEPERFDATA>time=0.124811s;;;0.000000 size=10087B;;;0</NAGIOS_SERVICEPERFDATA>
  <NAGIOS_SERVICEPERFDATAFILE></NAGIOS_SERVICEPERFDATAFILE>
  <NAGIOS_SERVICEPROBLEMID>0</NAGIOS_SERVICEPROBLEMID>
  <NAGIOS_SERVICESTATE>OK</NAGIOS_SERVICESTATE>
  <NAGIOS_SERVICESTATEID>0</NAGIOS_SERVICESTATEID>
  <NAGIOS_SERVICESTATETYPE>HARD</NAGIOS_SERVICESTATETYPE>
  <NAGIOS_SHORTDATETIME>27-12-2007 13:51:23</NAGIOS_SHORTDATETIME>
...
</NAGIOS>

Die einzelnen XML-Felder sind als Variablen in den PNP-Templates verwendbar, wobei jedes Feld als Variable gleichen Namens verfügbar ist.

Aus <NAGIOS_SERVICEOUTPUT> wird die Variable $NAGIOS_SERVICEOUTPUT.

zurück zur Übersicht | Custom Templates

Custom Templates

Wie bereits unter ”Was sind Templates ?” beschrieben, ist die Darstellung der Graphen abhängig vom verwendeten Check-Command.

Es gibt jedoch Situationen, in denen dieses Verhalten übersteuert werden muss.

CUSTOM_TEMPLATE

Notwendig wird dies, wenn allgemeingültige Commands definiert wurden.

Beispiel:

define command {
  command_name check_nrpe
  command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$ -a "$ARG2$"
}

Die Folge wäre, dass immer das Template check_nrpe.php verwendet werden würde, auch wenn auf dem zu überwachenden Server via NRPE ein ganz anderes Plugin aufgerufen wurde.

PNP, speziell process_perfdata.pl, sucht zur Laufzeit für jedes check_command im Verzeichnis etc/check_commands nach einer Config-Datei ( <check_command>.cfg ) und liest diese, wenn vorhanden, ein.

Da unser Beispiel-Command check_nrpe lautet, wird nach etc/check_commands/check_nrpe.cfg gesucht.

Eine Beispiel-Config wird bereits während der Installation mit der Dateierweiterung .cfg-sample in etc/check_commands gespeichert.

In diesen Config-Files können zwei Optionen gesetzt werden.

# check_command check_nrpe!load!-w 4,4,4 -c 5,5,5
# ________0__________|       |       |
# ________1__________________|       |
# ________2__________________________|
#
CUSTOM_TEMPLATE = 1

CUSTOM_TEMPLATE = 1 sorgt dafür, dass nur der Inhalt von $ARG1$ als Template-Name verwendet wird. Da in diesem Beispiel $ARG1$ mit dem Wert “load” gefüllt ist, ergibt sich als Template-Name “load.php”

CUSTOM_TEMPLATE = 0,1 ergibt → “check_nrpe_load.php”

CUSTOM_TEMPLATE = 1,0 ergibt → “load_check_nrpe.php”

DATATYPE

Über die Option “DATATYPE” kann beeinflusst werden, mit welchem Datentyp die RRD-Datenbank angelegt werden soll. Default ist in diesem Fall “GAUGE”. Für fortlaufende Werte wird aber hier der Datentyp COUNTER benötigt. Normalerweise sollten Plugin-Entwickler für Daten von Typ Counter die Einheit “c” verwenden. Dies ist jedoch nicht immer der Fall.

Alle Datenreihen auf Typ COUNTER einstellen.

DATATYPE = COUNTER

Einzelnen Datenreihen spezielle Datentypen zuweisen

DATATYPE = GAUGE,GAUGE,COUNTER,COUNTER

Diese Option hat nur Einfluss, wenn die RRD Datenbank neu erstellt wird.

Weitere Datentypen sind in der RRDTool-Dokumentation unter rrdcreate erklärt.

MIN und MAX

In einigen wenigen Situationen ist es notwendig, die für RRDTool gültigen Daten zu begrenzen.

RRD-Datenbanken lassen sich mit definierten Minimum- und Maximum-Werten anlegen. Weitere Infos unter http://oss.oetiker.ch/rrdtool/doc/rrdcreate.en.html

Berücksichtigen des Maximum-Wertes aus den Performance-Daten

USE_MAX_ON_CREATE = 1

Berücksichtigen des Minimum-Wertes aus den Performance-Daten

USE_MIN_ON_CREATE = 1

RRD_STORAGE_TYPE

RRD_STORAGE_TYPE = SINGLE

Die Option RRD_STORAGE_TYPE definiert die Art der Datenhaltung.

Mögliche Werte sind MULTIPLE und SINGLE

SINGLE: Eine RRD-Datenbank pro Service

MULTIPLE: Ein oder mehrere RRD-Datenbanken pro Service. Für jede Datenreihe wird eine eigene RRD-Datenbank erstellt.

ACHTUNG: Daten werden nicht automatisch migriert!
Ein Konvertierungs-Script finden Sie hier.

RRD_HEARTBEAT

Gültig ab PNP 0.6.1

RRD_HEARTBEAT = 305

Nach <RRD_HEARTBEAT> Sekunden erwartet RRDtool neue Daten.

Mehr dazu unter http://oss.oetiker.ch/rrdtool/doc/rrdcreate.en.html

zurück zur Übersicht | PNP in verteilten Umgebungen

Advanced

Verteilte Systeme

Ist Nagios als verteiltes System implementiert, stellt sich die Frage, wo PNP installiert wird.

Rein technisch ist diese Frage nicht wichtig. PNP kann auf den Slaves sowie auf dem Master-Server installiert sein. Oder nur auf dem Master?

Wird PNP auf dem Master betrieben, ist jedoch bei der Übergabe der Daten via send_nsca von den Slave-Servern zum Master darauf zu achten, dass auch die Performance-Daten übergeben werden. Weiterhin kommt auf dem Master oft nicht das Original-Check-Command zum Einsatz.

Damit nun aber PNP auf dem Master noch erkennen kann, welches Check-Command auf den Slaves die Daten ermittelt hat, reagiert process_perfdata.pl auf ein zusätzliches Feld am Ende der Performance-Daten.

OK - 127.0.0.1: rta 2.687ms, lost 0% | rta=2.687ms;3000.000;5000.000;0; pl=0%;80;100;; [check_icmp]

Findet PNP am Ende der Performance Daten einen in eckigen Klammern eingeschlossenen Text, so wird dieser als Check-Command und somit als PNP-Template verwendet.

Die Nagios-Dokumentation zu diesem Thema ist hier zu finden. Das in der Doku verwendete Command ist leicht anzupassen.

Aus

define command{
	command_name	submit_check_result
	command_line	/usr/local/nagios/libexec/eventhandlers/submit_check_result $HOSTNAME$ '$SERVICEDESC$' $SERVICESTATE$ '$SERVICEOUTPUT$'
	}

wird

define command{
	command_name	submit_check_result
	command_line	/usr/local/nagios/libexec/eventhandlers/submit_check_result $HOSTNAME$ '$SERVICEDESC$' $SERVICESTATE$ '$SERVICEOUTPUT$ | $SERVICEPERFDATA$ [$SERVICECHECKCOMMAND$]'
	}

Das check_multi-Plugin

Das Plugin check_multi ist eines der ersten Plugins, das die Funktionen von Nagios 3.0 richtig ausschöpft. Check_Multi ist in der Lage, mehrere Nagios-Plugins auszuführen, aber für Nagios als einen Service darzustellen. Die Ausgabe von check_multi erfolgt über mehrere Zeilen, um die Masse an Informationen wieder darstellen zu können.

Daraus ergaben sich jedoch einige Schwierigkeiten für PNP. PNP muss aus den Performance-Daten wieder die Daten der einzelnen Plugins ermitteln können. Zusammen mit Matthias Flacke, dem Entwickler von check_multi, haben wir jedoch recht schnell eine Möglichkeit gefunden, die Daten wieder sauber den einzelnen Plugins zuzuordnen.

Zurück zur Übersicht | rrdcached-Unterstützung

RRDtool Cache Daemon

In großen Installationen wird man über kurz oder lang feststellen, dass die Verarbeitung der Performance-Daten eine recht hohe I/O-Last zur Folge hat. RRDtool muss extrem viele Updates auf Disk schreiben, kann dabei jedoch den Disk-Cache nicht optimal ausnutzen.

Eine Optimierung stellt das Sammeln und Sortieren der Daten dar. Es ist für das System effektiver, viele Updates im Block in eine RRD-Datenbank zu schreiben. Der Disk-Cache kann dabei effektiver genutzt werden.

In der aktuellen RRDtool-Version ( SVN trunk 1550+ ) ist der rrdcached enthalten, der genau diese Situation verbessern soll.

An dieser Stelle möchte ich mich bei Florian octo Forster, Kevin Brintnall und Tobi Oetiker bedanken. Die Entwicklung dieses Daemons wurde vorbildlich auf der rrd-developers Mailingliste koordiniert.

Arbeitsweise

Der rrdcached arbeitet als Daemon im Hintergrund und öffnet einen UNIX- oder TCP-Socket, auf dem er auf Anfragen von rrdtool wartet. Aufgrund von Sicherheitsbedenken ist es in neueren Versionen von rrdcached aber nicht mehr möglich absolute Pfadangaben (wie bei pnp4nagios üblich) bei Netzwerkzugriffen zu verwenden, daher ist derzeit nur Nutzung von UNIX-Sockets möglich.

rrdcached

Der rrdcached kennt einige wichtige Optionen, die beim Start übergeben werden.

Option -l definiert den Socket, auf dem der rrdcached Requests annimmt. Der Default-UDP-Port ist 42217, der Default-UNIX-Socket /tmp/rrdcached.sock.

-l unix:/pfad/zum/rrdcached.sock
-l /pfad/zum/rrdcached.sock
-l 127.0.0.1
-l 127.0.0.1:8888

Option -P gibt die für die nachfolgenden Sockets (mit -l spezifiziert) erlaubten Befehle an, welche auf die RRD-Datenbanken angewendet werden können.

-P FLUSH,PENDING

Option -s erlaubt es die Gruppenzugehörigkeit der nachfolgenden UNIX-Sockets zu ändern.

-s nagios

Option -m setzt die Zugriffsrechte für die nachfolgenden UNIX-Sockets auf die (in oktal) angegebenen Werte.

-m 0660

Option -w bestimmt den Intervall in Sekunden, in dem die Daten auf Disk geschrieben werden sollen.

-w 1800

Option -z definiert einen Delay, der die über die Option -w definierten Schreibzyklen in einen zufälligen Bereich [0-delay] verteilt, um gleichzeitige Schreibzugriffe zu verhindern. Der Wert der Option -z darf nicht größer gewählt werden als -w.

-z 1800

Option -p definiert ein PID File

-p /var/run/rrdcached.pid

Option -j definiert den Pfad zu einem Journal-Verzeichnis. Dort werden alle Aufträge protokolliert und ggf. beim nächsten Start nachgefahren, falls der rrdcached-Daemon abstürzt.

-j /var/cache/rrdcached

Daraus ergibt sich beispielsweise ein Aufruf von rrdached mit folgenden Parametern

 rrdcached -w 1800 -z 1800 -p /tmp/rrdcached.pid -j /tmp -s nagios -m 0660 -l unix:/tmp/rrdcached.sock

rrdtool

RRDtool selbst wird die Existenz des Daemons über die Option –daemon=<socket> mitgeteilt.

 rrdtool --daemon=unix:/tmp/rrdcached.sock update ...

Dies muss natürlich mit den Startoptionen des rrdcached übereinstimmen!

Integration in PNP

Da zwei Bestandteile von PNP auf den rrdcached vorbereitet werden müssen, ergeben sich Änderungen in zwei Config-Files. Außerdem muß der User unter welchem der Webserver läuft zur Gruppe unter der Nagios läuft hinzugefügt werden.

1. Anpassen der process_perfdata.cfg für den Datensammler process_perfdata.pl

# EXPERIMENTAL rrdcached Support
# Use only with rrdtool svn revision 1511+
#
RRD_DAEMON_OPTS = unix:/var/run/rrdcached.sock

2. Anpassen der config_local.php (bzw. config.php) für das Webinterface

#
# EXPERIMENTAL rrdcached Support
# Use only with rrdtool svn revision 1511+
#
# $conf['RRD_DAEMON_OPTS'] = 'unix:/tmp/rrdcached.sock';
$conf['RRD_DAEMON_OPTS'] = 'unix:/var/run/rrdcached.sock';

Die passenden Optionen sind bereits in den Beispieldateien enthalten.

zurück zur Übersicht | migrieren von RRD-Dateien

NPCD

NPCD (Nagios-Perfdata-C-Daemon) wurde geschrieben, um die asynchrone Bearbeitung von Nagios Performance-Daten zu ermöglichen.

Einleitung

In großen Nagios-Installationen kann es zu nicht akzeptierbaren Verspätungen seitens der Checks kommen. Das bedeutet, dass Nagios einen Check zum Zeitpunkt x ausführen soll, diesen aber erst y Sekunden später tatsächlich ausführt.

Wenn man dem Nagios-Daemon mitteilt, dass man nach jedem einzelnen Check auch die Performance-Daten verarbeiten möchte, so geht dies bis zu einem bestimmten Grad gut, ab einer gewissen Anzahl von Checks pro Sekunde allerdings kommt man relativ schnell zu den sog. Latency-Problemen.

Um die Anzahl der Aktionen pro Check zu verringern, kann man nun PNP im Bulk-Mode verwenden, wobei die Performance-Daten zunächst vom Nagios-Prozess gesammelt und anschließend ebenfalls vom Nagios-Prozess selbst verarbeitet werden.

Man kann aber auch dem Nagios-Prozess mitteilen, dass die Verarbeitung der Performance-Daten lediglich durch das Verschieben der Dateien in ein Spool-Verzeichnis geschehen soll, welches für den Nagios-Prozess selbst eine sehr schnelle Aktion ist und die Performance nicht nennenswert beeinflusst und somit dem Core mehr Zeit für seine eigentliche Arbeit lässt: weitere Checks ausführen, Alamierungen bereitstellen, etc.

Wie NPCD arbeitet

Wie bereits erwähnt, ist die Arbeit der Performance-Daten-Verarbeitung durch das schnelle Verschieben der Datei bereits erledigt, aber das bringt die Performance-Daten noch nicht in die RRD-Datenbank.

Um den Transport der Performance-Daten-Dateien kümmert sich nun der NPCD-Daemon, unabhängig vom Nagios-Prozess, indem er regelmäßig in das Spool-Verzeichnis guckt und für jede dort gefundene Datei eine Aktion ausführt.

Nachdem NPCD gestartet wurde, erstellt er sich eine Liste von Dateinamen des Spool-Verzeichnisses und startet für jede gefundene Datei einen Thread zur weiteren Verarbeitung mit Hilfe des perfdata_file_run_cmd und dem optionalen perfdata_file_run_cmd_arg als zusätzlichem Argument.

Da das Format der Performance-Daten-Dateien dem Format der 'normalen' PNP-Bulk-Modus-Dateien gleicht, kann NPCD nun für jede gefundene Datei also process_perfdata.pl im Bulk Modus aufrufen.

Vor- und Nachteile

Pro:

  • bessere Performance für Nagios
    • aufgrund der vom Nagios-Prozess getrennten Verarbeitung der Performance-Daten hat Nagios mehr Zeit für die wichtigen Dinge
  • kein Datenverlust
    • solange Nagios Performance-Daten-Dateien im Spool-Verzeichnis ablegt, gehen keine Daten verloren. Selbst wenn der NPCD mal nicht laufen sollte (Bsp. nach Neustart des Systems), werden die Dateien nach Wiederanlauf in chronologischer Reihenfolge bearbeitet ($TIMET$ Makro beim verschieben ins Spool-Verzeichnis)

Kontra:

  • Keine Echtzeitverarbeitung der Performance-Daten
    • aufgrund des Rhythmusses, wann Nagios die Performance-Daten-Dateien verschiebt (service_perfdata_file_processing_interval)
    • nach jedem Lauf durch alle Dateien des Spool-Verzeichnisses wartet NPCD 10 Sekunden lang auf neue Dateien

NPCD Config

NPCD muss zwangsläufig über eine Konfigurationsdatei gesteuert werden. Eine Beispielkonfiguration liegt der PNP-Installation als npcd.cfg-sample bei.

Nach Umbenennen der -sample Datei zu npcd.cfg kann NPCD nun wie folgt gestartet werden:

/usr/local/pnp4nagios/bin/npcd -f /usr/local/pnp4nagios/etc/npcd.cfg

oder

/usr/local/pnp4nagios/bin/npcd -d -f /usr/local/pnp4nagios/etc/npcd.cfg

um NPCD im Hintergrund als Daemon laufen zu lassen.

Hinweis: Die -sample Datei sollte in jedem Fall in npcd.cfg umbenannt werden, da sie sonst bei einem Update von PNP überschrieben werden könnte.

npcd.cfg-sample

Dies sind die essentiellen Konfigurationsdirektiven für NPCD:

# Privilege Options
user = nagios
group = nagios

# Logging Options
log_type = syslog
log_file = /usr/local/pnp4nagios/var/npcd.log
max_logfile_size = 10485760
log_level=0

# Processing Options
perfdata_spool_dir = /usr/local/pnp4nagios/var/spool/perfdata/
perfdata_file_run_cmd = /usr/local/pnp4nagios/libexec/process_perfdata.pl
perfdata_file_run_cmd_args = -b

# Thread Options
npcd_max_threads=5

# greedy options
use_load_threshold = 0
load_threshold = 10.0

# Process Options
pid_file=/var/run/npcd.pid

Die Direktiven

  • Privilege-Optionen
    • user <username>
      • NPCD versucht die Userberechtigung zu diesem User zu wechseln.
      • Default: nagios
    • group <groupname>
      • NPCD versucht die Gruppenberechtigung zu dieser Gruppe zu wechseln.
      • Default: nagios
  • Logging-Optionen
    • log_type <syslog> oder <file>
      • Log-Type, den NPCD zum Loggen verwenden wird
      • Default: syslog
    • log_file </pfad/zu/datei>
      • Falls log_type = file wird diese Logdatei verwendet
      • Default: /usr/local/pnp4nagios/var/npcd.log
    • max_logfile_size <bytes>
      • NPCD wird nach Erreichen der hier angegebenen Dateigröße eigenständig eine Logrotation durchführen
      • Default: 10485760 = 10 MByte
    • log_level <integer>
      • Wie viel soll aufgezeichnet werden, möglich ist:
        • 0 = Kein Log - außer Fehlern
        • 1 = wenig Log - etwas mehr Aufzeichnen
        • 2 = Mehr Log (aktuell ALLES)
        • -1 = DEBUG Mode - Es wird alles aufgezeichnet und die Bearbeitung wird verlangsamt
      • Default: 0
  • Bearbeitungs-Optionen
    • perfdata_spool_dir </path/to/spool/dir/>
      • Das Verzeichnis, in das Nagios die Dateien verschiebt
      • Default: /usr/local/pnp4nagios/var/spool/
    • perfdata_file_run_cmd </path/to/bin/filename>
      • Das Programm, welches Nagios für jede Datei aufrufen soll
      • Default: /usr/local/pnp4nagios/libexec/process_perfdata.pl
    • perfdata_file_run_cmd_args <option>
      • Das Argument, welches optional an perfdata_file_run_cmd angehängt wird
      • Default: ”-b”
      • :!: Die Kommandozeile wird nach folgendem Schema aufgebaut:
        <perfdata_file_run_cmd> <perfdata_file_run_cmd_args> <filename_from_perfdata_spool_dir>
  • Thread-Optionen
    • npcd_max_threads <integer value>
      • Anzahl der maximal zu startenden parallelen Threads
      • Default: 5
  • Greedy-Optionen
    • use_load_threshold <0 oder 1>
      • definiert, ob NPCD bei Erreichen des load_thresholds die Anzahl der Threads begrenzen soll
        • 0 = ausschalten (weitere Threads starten)
        • 1 = einschalten
      • Default: 0
    • load_threshold <float value>
      • wenn use_load_threshold auf 1 gesetzt ist, werden bei Erreichen dieses load limits keine neuen Threads gestartet
      • Default: 10.0
  • Process-Optionen
    • pid_file </path/to/pid.file>
      • Pfad zum PID File
      • Default: /var/run/npcd.pid

zurück zur Übersicht | Wrapper-Script

check_procs ist ein Beispiel für ein Plugin, das keine Performance-Daten ausgibt:

./check_procs -a ndo2db -w 1: -c 0:
PROCS OK: 2 processes with args 'ndo2db'

Mit dem folgenden Wrapper-Script kann das geändert werden

check_procs.sh

#!/bin/bash
LINE=`/usr/local/nagios/libexec/check_procs $*`
RC=$?
COUNT=`echo $LINE | awk '{print $3}'`
echo $LINE \| procs=$COUNT
exit $RC

Nun wird die Zahl zusammen mit einer Bezeichnung ausgegeben.

./check_procs.sh -a ndo2db -w 1: -c 0:
PROCS OK: 2 processes with args 'ndo2db'| procs=2
2.6. Performance-Daten

'Bezeichnung'=Wert[UOM];[warn];[crit];[min];[max]

Anmerkungen:

  1. Leerzeichen trennen Listen von Bezeichnung/Werte-Paaren
  2. Bezeichnungen können beliebige Zeichen enthalten
  3. die Bezeichnung muss in Apostrophe eingeschlossen sein, wenn diese Gleichheitszeichen (=), Apostroph (') oder Leerzeichen ( ) enthält, ansonsten sind die Apostrophe optional
  4. die Länge der Bezeichnung ist beliebig, aber idealerweise sind die ersten 19 Zeichen eindeutig (aufgrund einer Beschränkung in RRD). Bitte beachten Sie, dass es eine Längenbegrenzung bei der Menge von Daten gibt, die von NRPE an Nagios geliefert werden kann
  5. um ein Apostroph darzustellen, nutzen Sie zwei einzelne Apostrophe
  6. warn, crit, min und/oder max können leer sein (z.B. wenn der Schwellwert nicht definiert ist oder wenn min oder max nicht zutreffen). Nachfolgende, nicht gefüllte Semikola können entfallen
  7. min und max sind nicht erforderlich, wenn UOM = %
  8. Wert, min und max sind aus der Klasse [-0-9.] (Ziffern, Minuszeichen und Dezimalpunkt). Alle müssen das gleiche UOM benutzen
  9. warn und crit sind im “Range”-Format (siehe Abschnitt 2.5 der Original-Dokumentation). Alle müssen das gleiche UOM benutzen.
  10. UOM (unit of measurement, Maßeinheit) ist eins von:
    • keine Einheit angegeben - angenommen wird eine Zahl (int oder float) von Dingen (z.B. Benutzer, Prozesse, Load)
    • s - Sekunden (auch us, ms)
    • % - Prozent
    • B - Bytes (auch KB, MB, TB; GB?)
    • c - ein fortlaufender Zähler (z.B. Bytes, die über ein Interface übertragen werden)

Es bleibt Drittanbietern überlassen, aus den Performance-Daten Graphen zu erzeugen.|

Quelle: http://nagiosplug.sourceforge.net/developer-guidelines.html#AEN201

pnp4nagios-0.6.16/share/pnp/documents/de_DE/start.html0000664000000000000000000002437611662503006021264 0ustar rootroot

Dokumentation

Theme "smoothness"

PNP ist ein Addon für Nagios, das es ermöglicht, die von Nagios Plugins gelieferten Performancedaten zu analysieren und automatisch in RRD Datenbanken zu speichern.

Während der Entwicklung von PNP haben wir Wert auf eine einfache Installation und auf wenig Aufwand im laufenden Betrieb gelegt. Ein Administrator hat besseres zu tun als Graphing Tools zu konfigurieren.

Um diese Aufgabe zu erfüllen, setzen wir bewusst auf Standards. PNP verarbeitet nur Performancedaten, die sich strikt an die Developer Guidelines für Nagios Plugins halten. Mit dieser Einschränkung wollen wir bewusst die Arbeit der Nagios Plugin Developer honorieren, die sich für die Einhaltung der Richtlinien einsetzen.

Für alle, die nun noch neugierig sind, steht die folgende Dokumentation bereit, um den Einstieg in PNP zu erleichtern.

komplette Dokumentation auf "einer" Seite

Dokumentation

pnp4nagios-0.6.16/share/pnp/documents/de_DE/new-features.html0000664000000000000000000000621311662503006022522 0ustar rootroot

Neues in PNP 0.6.x

PNP 0.6.x Preview

Die Arbeit an der Version 0.6.x ist in vollem Gange.

Mit Version 0.6.x steigen wir von Subversion auf GIT um. Der Sourcecode ist bereits auf Sourceforge erhältlich.

http://pnp4nagios.git.sourceforge.net

Bisher umgesetzte Funktionen:

  • Webfrontend basiert auf Kohana
  • Webfrontend basiert auf jQuery Themes
  • Javascript-Funktionen über jQuery Plugins
  • process_perfdata.pl wird in der Lage sein, pro Datenreihe eine eigene RRD-Datenbank zu verwenden.
  • Installer weiter verbessert. Angabe von Directory-Layouts über –with-layout
  • RRDtool-Fehler werden als Bild dargestellt. Keine fehlenden Bilder mehr.
  • PNP-Templates können keine internen Variablen mehr überschreiben.
  • PNP-Templates der Version 0.4.x können weiter verwendet werden.
  • PDF-Funktionen neu umgesetzt.
  • Template default.php optimiert.
  • Export aus den RRD-Datenbanken im XML,CSV und JSON Format über die RRDtool “xport” Funktion.
  • Page-Funktionen neu umgesetzt.
  • Fehlerseiten verweisen auf online FAQ-Artikel.
  • Mouseover Popup im Nagios-Frontend über jQuery.clueTip Plugin
  • Volle Unterstützung des rrdcached.

zurück zur Übersicht | Anforderungen

pnp4nagios-0.6.16/share/pnp/documents/de_DE/config.html0000664000000000000000000004634111662503006021370 0ustar rootroot

Konfiguration

Im Folgenden wird die Konfiguration der bereits erwähnten Arten der Performance-Daten Verarbeitung genauer erklärt.

Die bevorzugte Methode der PNP-Entwickler ist der “Bulk Mode mit NPCD und npcdmod”.

Synchronous Mode

Der Synchronous-Mode ist die einfachste Art, den Datensammler process_perfdata.pl in Nagios zu integrieren. Hierbei wird bei jedem Ereignis ein gesondertes Command process-service-perfdata (bzw. process-host-perfdata) ausgeführt.

Grundsätzlich ist in der nagios.cfg die Verarbeitung der Performance-Daten zu aktivieren. Bitte beachten Sie, dass diese Direktive wahrscheinlich bereits in der Konfigurationsdatei enthalten ist (Default ist “0”).

 process_performance_data=1

Für jeden Host und jeden Service, für den KEINE Performance-Daten verarbeitet werden sollen, ist die Verarbeitung der Performance-Daten explizit auszuschalten.

define service {
   ...
   process_perf_data 0
   ...
}

Weiterhin ist es ab Nagios 3.x möglich, in der nagios.cfg das Exportieren der Environment-Variablen zu deaktivieren. Diese sind jedoch für den Synchronous-Mode zwingend erforderlich. Daher muss

enable_environment_macros=1

ebenfalls in der nagios.cfg gesetzt sein.

Zusätzlich wird das Kommando zum Verarbeiten der Performance-Daten in der nagios.cfg angegeben.

 service_perfdata_command=process-service-perfdata

Ab Nagios 3.x ist es durchaus sinnvoll, auch die Verarbeitung der Performance-Daten für Hosts einzuschalten. Nagios 3 führt durch die geänderte Hostcheck-Logik nun auch die Prüfung der Hosts regelmäßig aus.

 host_perfdata_command=process-host-perfdata

Die referenzierten Commands müssen natürlich auch Nagios bekannt gegeben werden. Wie man sieht, sind für den Aufruf von process_perfdata.pl so gut wie keine Optionen nötig. Einzig bei Performance-Daten der Host-Checks ist die Option -d ( DATATYPE ) nötig. Wenn Sie die Schnellstart-Installationsanleitungen für Nagios benutzt haben, können Sie die Definitionen in der Datei commands.cfg anpassen.

define command {
       command_name    process-service-perfdata
       command_line    /usr/bin/perl /usr/local/pnp4nagios/libexec/process_perfdata.pl
}

define command {
       command_name    process-host-perfdata
       command_line    /usr/bin/perl /usr/local/pnp4nagios/libexec/process_perfdata.pl -d HOSTPERFDATA
}

HINWEIS: process_perfdata.pl kann nicht unter Kontrolle des ePN ( embedded Perl Nagios ) gestartet werden. Daher wird das Script explizit mit /usr/bin/perl aufgerufen. Wird ePN nicht verwendet oder wird Nagios 3.x verwendet, kann auf die Angabe von /usr/bin/perl verzichtet werden.

zurück zur Übersicht | Funktion prüfen

Bulk Mode

Der Bulk-Mode ist etwas komplizierter als der Synchronous-Mode, reduziert die Last auf dem Nagios Server jedoch merklich, da nun nicht mehr für jeden Service bzw. Host zusätzlich der Datensammler process_perfdata.pl gestartet werden muss.

Im Bulk-Mode schreibt Nagios die Daten in einem definierten Format in eine temporäre Datei. Diese Datei wiederum wird periodisch von process_perfdata.pl verarbeitet. Um den Start und den Intervall kümmert sich dabei Nagios selbst.

Auch hier muss die Verarbeitung der Performance-Daten in der nagios.cfg eingeschaltet werden.

 process_performance_data=1

Zusätzlich werden einige neue Parameter benötigt.

#
# Service Performance-Daten
#
service_perfdata_file=/usr/local/pnp4nagios/var/service-perfdata
service_perfdata_file_template=DATATYPE::SERVICEPERFDATA\tTIMET::$TIMET$\tHOSTNAME::$HOSTNAME$\tSERVICEDESC::$SERVICEDESC$\tSERVICEPERFDATA::$SERVICEPERFDATA$\tSERVICECHECKCOMMAND::$SERVICECHECKCOMMAND$\tHOSTSTATE::$HOSTSTATE$\tHOSTSTATETYPE::$HOSTSTATETYPE$\tSERVICESTATE::$SERVICESTATE$\tSERVICESTATETYPE::$SERVICESTATETYPE$
service_perfdata_file_mode=a
service_perfdata_file_processing_interval=15
service_perfdata_file_processing_command=process-service-perfdata-file

#
# Host Performance-Daten ab Nagios 3.x
# 
host_perfdata_file=/usr/local/pnp4nagios/var/host-perfdata
host_perfdata_file_template=DATATYPE::HOSTPERFDATA\tTIMET::$TIMET$\tHOSTNAME::$HOSTNAME$\tHOSTPERFDATA::$HOSTPERFDATA$\tHOSTCHECKCOMMAND::$HOSTCHECKCOMMAND$\tHOSTSTATE::$HOSTSTATE$\tHOSTSTATETYPE::$HOSTSTATETYPE$
host_perfdata_file_mode=a
host_perfdata_file_processing_interval=15
host_perfdata_file_processing_command=process-host-perfdata-file

Achtung: Die Template-Definitionen weichen von denen in der Original-nagios.cfg ab!

Die Parameter und deren Bedeutung im Einzelnen:

  • service_perfdata_file Der Pfad zur temporären Datei, in der die Daten gesammelt werden sollen.
  • service_perfdata_file_template Das Format der temporären Datei. Hier werden die Daten über Nagios-Macros definiert.
  • service_perfdata_file_mode Die Option “a” definiert, dass an die Datei angehangen werden soll.
  • service_perfdata_file_processing_interval Das Intervall beträgt 15 Sekunden
  • service_perfdata_file_processing_command das Command, das im definierten Intervall aufgerufen werden soll.

Die verwendeten Commands müssen Nagios wiederum bekannt gegeben werden. Wenn Sie die Schnellstart-Installationsanleitungen für Nagios benutzt haben, können Sie die Definitionen in der Datei commands.cfg anpassen.

define command{
       command_name    process-service-perfdata-file
       command_line    /usr/local/pnp4nagios/libexec/process_perfdata.pl --bulk=/usr/local/pnp4nagios/var/service-perfdata
}

define command{
       command_name    process-host-perfdata-file
       command_line    /usr/local/pnp4nagios/libexec/process_perfdata.pl --bulk=/usr/local/pnp4nagios/var/host-perfdata
}

HINWEIS:

Da process_perfdata.pl nun mehr Daten zu verarbeiten hat als im Default Mode, kommt es natürlich auch zu längeren Laufzeiten. Daher ist der TIMEOUT Wert in der etc/process_perfdata.cfg zu überprüfen und ggf. anzupassen.

zurück zur Übersicht | Funktion prüfen

Bulk Mode with NPCD

Die Konfiguration ist identisch mit dem “Bulk Mode”, einzig das verwendete Command ist leicht abgewandelt.

Auch hier muss die Verarbeitung der Performance-Daten in der nagios.cfg eingeschaltet werden.

 process_performance_data=1

Zusätzlich werden einige neue Parameter benötigt.

#
# Service Performance-Daten
#
service_perfdata_file=/usr/local/pnp4nagios/var/service-perfdata
service_perfdata_file_template=DATATYPE::SERVICEPERFDATA\tTIMET::$TIMET$\tHOSTNAME::$HOSTNAME$\tSERVICEDESC::$SERVICEDESC$\tSERVICEPERFDATA::$SERVICEPERFDATA$\tSERVICECHECKCOMMAND::$SERVICECHECKCOMMAND$\tHOSTSTATE::$HOSTSTATE$\tHOSTSTATETYPE::$HOSTSTATETYPE$\tSERVICESTATE::$SERVICESTATE$\tSERVICESTATETYPE::$SERVICESTATETYPE$
service_perfdata_file_mode=a
service_perfdata_file_processing_interval=15
service_perfdata_file_processing_command=process-service-perfdata-file

#
# Host Performance-Daten ab Nagios 3.x
# 
host_perfdata_file=/usr/local/pnp4nagios/var/host-perfdata
host_perfdata_file_template=DATATYPE::HOSTPERFDATA\tTIMET::$TIMET$\tHOSTNAME::$HOSTNAME$\tHOSTPERFDATA::$HOSTPERFDATA$\tHOSTCHECKCOMMAND::$HOSTCHECKCOMMAND$\tHOSTSTATE::$HOSTSTATE$\tHOSTSTATETYPE::$HOSTSTATETYPE$
host_perfdata_file_mode=a
host_perfdata_file_processing_interval=15
host_perfdata_file_processing_command=process-host-perfdata-file

Achtung: Die Template-Definitionen weichen von denen in der Original-nagios.cfg ab!

Die Parameter und deren Bedeutung im Einzelnen:

  • service_perfdata_file Der Pfad zur temporären Datei, in der die Daten gesammelt werden sollen.
  • service_perfdata_file_template Das Format der temporären Datei. Hier werden die Daten über Nagios-Macros definiert.
  • service_perfdata_file_mode Die Option “a” definiert, dass an die Datei angehangen werden soll.
  • service_perfdata_file_processing_interval Das Intervall beträgt 15 Sekunden
  • service_perfdata_file_processing_command das Command, das im definierten Intervall aufgerufen werden soll.

Die verwendeten Commands müssen Nagios wiederum bekannt gegeben werden. Wenn Sie die Schnellstart-Installationsanleitungen für Nagios benutzt haben, können Sie die Definitionen in der Datei commands.cfg anpassen.

define command{
       command_name    process-service-perfdata-file
       command_line    /bin/mv /usr/local/pnp4nagios/var/service-perfdata /usr/local/pnp4nagios/var/spool/service-perfdata.$TIMET$
}

define command{
       command_name    process-host-perfdata-file
       command_line    /bin/mv /usr/local/pnp4nagios/var/host-perfdata /usr/local/pnp4nagios/var/spool/host-perfdata.$TIMET$
}

Durch die Kommandos wird immer nach Ablauf des über service_perfdata_file_processing_interval eingestellten Intervalls die Datei service-perfdata nach var/spool/ verschoben. Dabei wird das Nagios-Macro $TIMET$ verwendet, an den Dateinamen angehängt, um zu verhindern, dass alte Dateien ungewollt überschrieben werden. Das Macro $TIMET$ enthält den aktuellen Zeitstempel in Unix-Time-Format ( Sekunden seit 1.1.1970 ).

Somit sammeln sich Dateien im Verzeichnis /usr/local/pnp4nagios/var/spool/, die nun mit Hilfe des NPCD verarbeitet werden.

NPCD überwacht das Spool-Verzeichnis und übergibt wiederum alle gefundenen Dateien an process_perfdata.pl. Damit ist die Verarbeitung der Performancedaten komplett von Nagios entkoppelt. Wir müssen nur noch den NPCD starten.

 /usr/local/pnp4nagios/bin/npcd -d -f /usr/local/pnp4nagios/etc/npcd.cfg

Die Option -d veranlasst NPCD im Hintergund als Daemon seinen Dienst zu verrichten.

Das Init Script für den NPCD wir während der Installation über “make install-init” installiert und kann somit auch für den Start verwendet werden.

 /etc/init.d/npcd start

In der Config-Datei des NPCD, der npcd.cfg, ist vor dem ersten Start zu prüfen, ob die Pfade zum Spool-Verzeichnis und zu process_perfdata.pl richtig gesetzt sind.

Weitere Informationen zu NPCD findet ihr hier.

Bulk Mode with NPCD und npcdmod

Bei diesem Modus kommt das Eventbroker-Modul npcdmod.o zu Einsatz. Der Datenfluss ist jedoch identisch zum “Bulk Mode mit NPCD”. Die internen Perfdata-Routinen von Nagios, die über die “*_perf_data_*” Optionen in der nagios.cfg konfiguriert werden, kommen NICHT mehr zu Einsatz. Das Modul npcdmod.o kümmert sich um die für PNP nötige Aufbereitung der Daten.

Vorteil:

  • Die Perfdata-Routinen innerhalb von Nagios stehen wieder für andere Addons zur Verfügung.
  • Die Konfiguration reduziert sich.
  • Die bevorzugte Methode der PNP-Entwickler.

Anpassung in der nagios.cfg:

process_performance_data=1
broker_module=/usr/local/pnp4nagios/lib/npcdmod.o config_file=/usr/local/pnp4nagios/etc/npcd.cfg

Alle anderen auf dieser Seite gezeigten Optionen dürfen für diesen Modus NICHT mehr verwendet werden.

Achtung: Wichtig sind in diesem Zusammenhang auch die event_broker_options bei einem von -1 abweichenden Wert. Für PNP müssen die Bits 2 und 3 gesetzt sein (0b01100; siehe auch http://www.nagios-wiki.de/nagios/ndo/eventbroker_optionen).

Nach dem Neustart von Nagios werden Informationen zum Ladevorgang des Moduls protokolliert.

Auszug aus den nagios.log

[1277545053] npcdmod: Copyright (c) 2008-2009 Hendrik Baecker (andurin@process-zero.de) - http://www.pnp4nagios.org
[1277545053] npcdmod: /usr/local/pnp4nagios/etc/npcd.cfg initialized
[1277545053] npcdmod: spool_dir = '/usr/local/pnp4nagios/var/spool/'.
[1277545053] npcdmod: perfdata file '/usr/local/pnp4nagios/var/perfdata.dump'.
[1277545053] npcdmod: Ready to run to have some fun!
[1277545053] Event broker module '/usr/local/pnp4nagios/lib/npcdmod.o' initialized successfully.

Gearman Mode

PNP4Nagios kann seit Version 0.6.12 als Gearman-Worker betrieben werden. So sind große verteilte Nagios-Umgebungen auf Basis von mod_gearman realisierbar. Außerdem kann man dadurch Nagios und PNP4Nagios auf unterschiedliche Rechner verteilen.

Benötigt wird eine fertig eingerichtete mod_gearman Installation wie von Sven Nierlein unter http://labs.consol.de/lang/en/nagios/mod-gearman/ beschrieben.

In etc/process_perfdata.cfg gibt es einen gearman-Abschnitt:

 PREFORK = 0
 GEARMAN_HOST = localhost:4730
 REQUESTS_PER_CHILD = 10000
 ENCRYPTION = 1
 KEY = should_be_changed
 #KEY_FILE = /usr/local/pnp4nagios/etc/secret.key

Dort ist mit PREFORK = <n> die Anzahl von zusätzlichen(!) Kindprozessen anzugeben. Bei “0” wird lediglich ein “Elternprozess” gestartet.
GEARMAN_HOST = <host>:<port> definiert Rechner und Port, auf dem der gearman-Daemon die Daten bereitstellt.
Über REQUESTS_PER_CHILD = <n> kann die maximal zu verarbeitende Anzahl von Anforderungen pro Prozess eingestellt werden.
ENCRYPTION = <1|0> stellt ein, ob Verschlüsselung benutzt werden soll. Die Standardeinstellung ist eine aktivierte Verschlüsselung (“1”) und das sollte nur in Ausnahmefällen verändert werden. Dabei kann entweder über KEY = <Schlüssel> der zu benutzende Schlüssel definiert oder per KEY_FILE = <Schlüsseldatei> der Standort einer Schlüsseldatei angegeben werden.

/etc/init.d/pnp_gearman_worker enthält Verweise auf die Perl-Prozedur process_perfdata.pl sowie die Konfigurationsdatei process_perfdata.cfg.

Nach dem Start des PNP-Daemons per

 /etc/init.d/pnp_gearman_worker start

werden die Performance-Daten verarbeitet, die über den gearmand-Daemon auf dem Nagios-Rechner zur Verfügung gestellt werden.

zurück zur Übersicht | Funktion prüfen

pnp4nagios-0.6.16/share/pnp/documents/de_DE/verify.html0000664000000000000000000001672111662503006021426 0ustar rootroot

Prüfen der Installation

Wenn bis jetzt alles sauber funktioniert hat, kann PNP zum ersten Mal im Browser aufgerufen werden. Bei der Installation mit den Standardeinstellungen erfolgt der Aufruf über http://<Servername>/pnp4nagios/.

Beim ersten Aufruf sieht man die Seite “PNP4Nagios Environment Tests”, die verschiedene Tests von notwendigen Komponenten enthält. Offenkundig sollten alle Tests erfolgreich verlaufen, bevor es weitergehen kann. Bitte beachten Sie die Hinweise auf der Seite.

Sind alle Tests erfolgreich verlaufen, so kann die Datei pnp4nagios/share/install.php gelöscht oder umbenannt werden. Erst dann ist das Webinterface erreichbar.

Alternativ kann eine Datei pnp4nagios/share/install.ignore angelegt werden, um den Aufruf des Installers nach weiteren Updates zu ignorieren.

Ohne weitere Optionen sucht PNP nach RRD- und XML-Dateien in pnp4nagios/var/perfdata/ und zeigt alle Graphen des ersten Hosts in der Übersicht an.

ACHTUNG: Direkt nach dem (Neu-)Start von Nagios nach dem Aktivieren der Verarbeitung von Performance-Daten wird der Aufruf im Browser zu Fehlermeldungen führen, weil zunächst Performance-Daten gesammelt und in den RRD-Dateien abgelegt werden müssen. Abhängig vom Check-Intervall kann es einige Zeit dauern, bis die ersten Graphen angezeigt werden können.

Logfile

Während der Installation wurde durch den Aufruf von make install-config ein Beispiel-Config-File etc/process_perfdata.cfg-sample erzeugt. Die Werte in der sample-Datei entsprechen den Default-Werten, die auch in process_perfdata.pl fest hinterlegt sind, daher ist die process_perfdata.cfg für den Betrieb nicht zwingend notwendig.

Die Datei process_perfdata.cfg-sample kann somit als Vorlage für die process_perfdata.cfg dienen, die immer dann notwendig ist, wenn vom Standard abweichende Werte eingestellt werden sollen.

In der process_perfdata.cfg lässt sich das Verhalten von process_perfdata.pl vielfach beeinflussen.

Die wichtigsten Optionen für die Inbetriebnahme sind LOG_LEVEL und LOG_FILE. Im laufenden Betrieb sollte der Log-Level immer auf 0 gesetzt sein, um die Performance von process_perfdata.pl nicht durch unnötiges Schreiben von Logfiles zu beeinträchtigen.

Während der Inbetriebnahme sollte man jedoch den LOG_LEVEL auf “2” setzen, um zu sehen, was process_perfdata.pl bei der Verarbeitung der Performance-Daten so alles anstellt.

Spätestens bei Support Anfragen im Forum oder auf den Mailinglisten werden wir sowohl nach Auszügen aus dem perfdata.log als auch nach der Ausgabe des verify_pnp_config-Scripts fragen. Es empfiehlt sich also, diese Angaben gleich mitzuliefern ;-).

Was aber wenn nicht ?

Einige grundlegende Einstellungen sind zu prüfen.

1. Sind RRD- und XML-Files erzeugt worden ?

process_perfdata.pl legt für jeden Host unter var/perfdata ein neues Verzeichnis an. In diesem Verzeichnis wird wiederum für jeden Service eine RRD-Datenbank und ein XML-File erstellt. Für den Host-Check lautet der Dateinamen _HOST_.xml bzw. _HOST_.rrd.
Falls Graphen urplötzlich nicht mehr weitergeführt werden, dann hilft vielleicht ein Blick in die betroffene XML-Datei. Dort gibt es u.a. die Tags <RC> und <TXT>. <RC> zeigt den Return-Code des RRDtool-Updates der RRD-Datei, <TXT> eine textuelle Beschreibung.
Allerdings liefern nicht alle Checks Performance-Daten, das gilt u.a. für “check_ping”, die Alternative “check_icmp” dagegen erzeugt Daten (ab Nagios-Plugin-Version 1.4.12 liefert auch check_ping Performance-Daten).
Teilweise muss man zusätzliche Optionen aktivieren, damit Performance-Daten ausgegeben werden. Evtl. kann das auch durch ein Wrapper-Script geändert werden.
In den Detailinformationen zu jedem Host/Service gibt es das Feld “Performance-Data”. Wenn dort keine Daten stehen, dann werden im jeweiligen Verzeichnis keine Dateien erzeugt und PNP kann deshalb auch keine grafischen Auswertungen liefern!
Das folgende Bild zeigt die Informationen zu einem “PING”-Service. Das blaue Feld enthält den vom Plugin gelieferten Text, das rote die Performance-Daten, die Nagios erkannt hat.
Informationen zu "PING"

2. Hat Nagios process_perfdata.pl aufgerufen ?

In der Config-Datei für process_perfdata.pl, der etc/process_perfdata.cfg lässt sich der Debug-Level erhöhen. Die Verarbeitung der Daten wird nun in var/perfdata.log bzw. im Syslog protokolliert.

3. Grafiken werden ohne Text angezeigt ?

siehe Anforderungen

4. Bei aktiviertem npcdmod-Modul muss der Wert von event_broker_options in der nagios.cfg ggf. angepasst werden. Hinweise gibt es hier.

5. verify_pnp_config

Das Perl-Script verify_pnp_config.pl im scripts-Verzeichnis des Installationsordners bzw. im libexec-Verzeichnis ermöglicht die Prüfung von Konfigurationseinstellungen und zeigt, ob Performance-Daten vorhanden bzw. gültig sind. Die Syntax dafür ist ziemlich einfach:

./verify_pnp_config.pl -m <Modus>

wobei <Modus> durch “sync”, “bulk” oder “npcd” zu ersetzen ist (ohne Anführungszeichen). Bitte beachten Sie, dass “default” ab PNP v.0.6.0 den “npcd”-Modus prüft.

zurück zur Übersicht | verify_pnp_config.pl

pnp4nagios-0.6.16/share/pnp/documents/de_DE/webfe_cfg.html0000664000000000000000000001133711662503006022027 0ustar rootroot

PNP Web Frontend

Das Verhalten des PNP-Web-Frontend lässt sich über die Config-Datei etc/config.php beeinflussen. Diese Datei wird bei Updates von PNP immer wieder überschrieben, da die meisten Pfade und Optionen bereits durch ./configure ermittelt werden.

Eigene Anpassungen sollten daher in der Datei etc/config_local.php erfolgen. Sollte die Datei noch nicht existieren, kann die config.php als Vorlage verwendet werden.

etc/pnp/config.php

Im folgenden die wichtigsten Parameter:

Der Pfad zum RRDtool-Binary. Wird von ./configure ermittelt.

 $conf['rrdtool'] = "/usr/bin/rrdtool";

Höhe und Breite der RRD-Graphen

 $conf['graph_width'] = "500";
 $conf['graph_height'] = "100";

Bildschirmdimensionen ändern sich, Blattgrößen nicht. Um unterschiedliche Einstellungen zu ermöglichen, können für die Generierung von PDF-Dateien eigene Werte definiert werden. Wenn diese Variablen nicht definiert sind, werden die Werte der Graphen benutzt. Höhe und Breite der RRD-Graphen bei PDFs

 $conf['pdf_width'] = "675";
 $conf['pdf_height'] = "100";

Zusätzliche Optionen, die bei jedem Aufruf von RRDTool mit übergeben werden. Beispielsweise —-slope-mode, um die Graphen etwas zu glätten.

 $conf['graph_opt'] = "";

Der Pfad zu den von process_perfdata.pl erstellten RRD- und XML-Dateien

 $conf['rrdbase'] = "/usr/local/pnp4nagios/var/perfdata/";

Pfad zu den Config-Files für die Pages.

 $conf['page_dir'] = "/usr/local/pnp4nagios/etc/pages/";

Wert in Sekunden, nachdem die PNP-Seiten neu geladen werden sollen.

 $conf['refresh'] = "90";

Maximales Alter der RRD-Files in Sekunden. Nach Erreichen dieses Wertes werden Links zu den Graphen als “inactive” gekennzeichnet.

 $conf['max_age'] = 60*60*6;

Basis-URL zu den Nagios CGIs.

 $conf['nagios_base'] = "/nagios/cgi-bin";

Liste von Usern, für die Links zu den Services des aktuellen Hosts angezeigt werden sollen.

 $conf['allowed_for_service_links'] = "EVERYONE";

Liste von Usern, für die das Host-Suchfeld angezeigt werden soll.

 $conf['allowed_for_host_search'] = "EVERYONE";

Wird PNP nur mit der Angabe eines Hosts ( index.php?host=<myserver> ) aufgerufen, so wird eine Übersicht aller Services angezeigt, wenn der User in dieser Liste enthalten ist.

 $conf['allowed_for_host_overview'] = "EVERYONE";

Das Array $views[] legt fest, welche Zeitspannen die RRD-Graphen dargestellen sollen. Der Titel und die Anzahl der Graphen kann somit hier zentral definiert werden.

$views[] = array('title' => 'One Hour',  'start' => (60*60) );
$views[] = array('title' => '4 Hours',   'start' => (60*60*4) );
$views[] = array('title' => '25 Hours',  'start' => (60*60*25) );
$views[] = array('title' => 'One Week',  'start' => (60*60*25*7) );
$views[] = array('title' => 'One Month', 'start' => (60*60*24*32) );
$views[] = array('title' => 'One Year',  'start' => (60*60*24*380) );

Sie können hier auch weitere Views definieren, sollten aber dabei berücksichtigen, dass im Normalfall ALLE definierten Views angezeigt werden.

zurück zur Übersicht | Timeranges

pnp4nagios-0.6.16/share/pnp/documents/de_DE/dwnld.html0000777000000000000000000000000011662503554024450 2../en_US/dwnld.htmlustar rootrootpnp4nagios-0.6.16/share/pnp/documents/de_DE/tpl_helper_pnp.html0000664000000000000000000000725311662503006023135 0ustar rootroot

PNP Helper Functions

PNP-Helper-Funktionen sind dazu gedacht, die Erstellung von Templates zu vereinfachen. Im Gegensatz zu den rrd-Helper-Funktionen rufen sie keine existierenden RRDtool-Funktionen auf.

pnp::adjust_unit

(string,number,string,number) pnp::adjust_unit ( $value, $base=1000, $format='%.3lf' )

Der Zweck dieser Funktion ist die “Normalisierung” von großen Zahlen. Moderne Festplatten haben Größen von mehreren GB oder TB erreicht und wenn Sie auf Zahlen wie 1521073648234 schauen, dann fangen Sie an, die Ziffern zu zählen, also wäre es schön, diese Zahlen in ein “handliches” Format zu verwandeln. Das Gleiche gilt für Netzwerkverkehr.

An die Funktion werden bis zu drei Parameter übergeben und in jedem Fall ein Array mit vier Elementen zurückgeliefert.

  • Der erste übergebene Parameter ist der Wert (ggf. inklusive die “UOM”)
  • Der zweite Parameter ist optional (Default “1000”, z.B. für “Traffic”), bzw. “1024” (z.B. Festplattengrößen)
  • Der dritte Parameter ist optional (Default '%.3lf') und gibt das Format des zurückzugebenden Wertes an
$size = pnp::adjust_unit(1521073648234,1024,'%7.3lf');

Bitte beachten Sie, dass “$size” ein Array ist, das aus vier Feldern besteht:

 $size[0] := "  1.383 T"

enthält den formatierten Wert inkl. der Einheit

 $size[1] := "1.383"

enthält den formatierten Wert (ohne führende Leerzeichen)

 $size[2] := "T"

enthält die Einheit

 $size[3] := "1099511627776"

enthält den Divisor

Angenommen das Plugin “check_disk” liefert “MB” als UOM, dann können Sie diese Einheit ebenfalls übergeben

$disk = pnp::adjust_unit("1524MB",1024,'%7.3lf');

liefert als Ergebnis u.a. $disk[0] := “1.448 GB


“altes” check_disk-Template mit der %s Direktive


“neues” check_disk-Template mit pnp::adjust_unit

pnp4nagios-0.6.16/share/pnp/documents/de_DE/timeranges.html0000664000000000000000000000764611662503006022266 0ustar rootroot

Timeranges

In der Übersicht zeigt PNP fünf Zeitbereiche, die frei in der config.php definiert werden können.

Es gibt aber auch die Möglichkeit, die Zeitbereiche über die URL zu beeinflussen. Dies ist hilfreich, wenn z.B. automatisch PDF-Dokumente erstellt werden sollen

Die Zeitbereiche werden über die Optionen start und end definiert.

Beispiel:

 pnp4nagios/graph?host=<hostname>&srv=<servicedesc>&start=-1week
 pnp4nagios/graph?host=<hostname>&srv=<servicedesc>&start=2011102322:50:00&end=2011102409:50:00

Der Startzeitpunkt der Graphen wird somit, ausgehend vom aktuellen Datum, um eine Woche nach hinten verschoben. Der Endzeitpunkt bleibt auf dem aktuellen Zeitstempel. Aber auch end lässt sich über diesen Weg beeinflussen, wobei beide Optionen auch einzeln manipuliert werden dürfen.

start end view Ergebnis
Alle Ansichten enden mit der aktuellen Zeit
x Alle Ansichten beginnen mit dem angegebenen Datum
x Alle Ansichten enden mit dem angegebenen Datum
x x Eine Ansicht zwischen den beiden Zeitangaben
x Eine Ansicht endet mit der aktuellen Zeit
x x Eine Ansicht beginnt mit dem angegebenen Datum
x x Eine Ansicht endet mit dem angegebenen Datum

Beispiele zur Datumsangabe:

Format Beschreibung
2009W04 4. KW 2009
1.5.2009 1. Mai 2009
-1 day Einen Tag zurück
-3 weeks 3 Wochen zurück
-1 year Ein Jahr zurück
yesterday Gestern
2011102322:50:00 23.10.2011 ab 22:50:00 Uhr

zurück zur Übersicht | Pages

pnp4nagios-0.6.16/share/pnp/documents/de_DE/tpl_special.html0000664000000000000000000003670211662503006022422 0ustar rootroot

Special Templates

“Special Templates” dienen zum Zusammenfassen von Daten beliebiger Hosts und Services und sind somit nicht direkt mit einem Host oder Service verknüpft.

Oftmals ist es gewünscht Daten verschiedener Services in einem Graphen darzustellen. Immer wenn die "Pages" nicht genügen, können die Special Templates ins Spiel kommen.

Grundlagen

“Special Templates” werden in pnp4nagios/share/templates.special gesucht und müssen die Dateiendung .php besitzen.

Aufgerufen werden “Special Templates” über den Controller “special” unter

http://<your-nagios-server>/pnp4nagios/special?tpl=<template>

<template> ist entsprechend durch das jeweilige Template ohne die Dateiendung .php zu ersetzen.

Ein entsprechender Link erscheint im PNP-Interface, wenn mindestens ein “Special Template” gefunden wurde.

Beispiel

Aufgabe ist die Antwortzeiten aller Webserver mit dem Hostnamen websrv01, websrv02 und websrv03 in einem Graphen anzuzeigen. Die Daten sollen aus dem Service “HTTP” stammen.

Step 1: Anlegen eines Templates “websrv_response_times.php” unter pnp4nagios/share/templates.special

“Special Templates” beginnen immer mit der Definition des Titels und eines Kommentars.

$this->MACRO['TITLE']   = "HTTP Response Times";
$this->MACRO['COMMENT'] = "HTTP Response Times for all Cluster Nodes";

Step 2: Eine Liste aller in Frage kommenden Hosts/Services erstellen. PNP stellt hierfür die Funktion tplGetServices() bereit.

tplGetServices() erwartet zwei Parameter.

Parameter 1 ist ein regulärer Ausdruck auf den zu suchenden Host, Parameter 2 ist entsprechend ein regulärer Ausdruck für den Service.

$services = $this->tplGetServices("websrv","HTTP");

$services enthält nun ein Array aller gefundenen Services.

Um die Entwicklung der Templates zu erleichtern und Einblick in die Datenstrukturen zu erhalten, kann man Kohana durch Auslösen einer Exception zum Abbrechen der Verarbeitung zwingen.

Um Einblick in die Daten von $services zu erhalten, genügt die folgende Zeile.

throw new Kohana_exception(print_r($services,TRUE));

Ausgabe bei Aufruf von pnp4nagios/special?tpl=websrv_response_times

Array ( 
  [0] => Array ( 
     [host] => websrv01 
     [service] => HTTP 
  ) 
  [1] => Array ( 
     [host] => websrv02
     [service] => HTTP 
  ) 
  [2] => Array ( 
     [host] => websrv03
     [service] => HTTP 
  ) 
)

Die Variable $services enthält somit ein Array aller gefundenen Services, in diesem Fall also drei Hosts mit dem Service “HTTP

Step 3: Durchlaufen des Array $services und erstellen der Graph-Definitionen.

foreach($services as $key=>$val){
    $data      = $this->tplGetData($val['host'],$val['service']);
    $hostname  = rrd::cut($data['MACRO']['HOSTNAME'], 15);
    $def[0]   .= rrd::def("var$key" , $data['DS'][0]['RRDFILE'], $data['DS'][0]['DS'] );
    $def[0]   .= rrd::line1("var$key", rrd::color($key), $hostname);
    $def[0]   .= rrd::gprint("var$key", array("MAX", "AVERAGE"));
}

Die Funktion tplGetData() wird innerhalb der Schleife verwendet, um das jeweilige XML-File einzulesen. Die Daten werden als Array zurückgeliefert und stehen nun in $data zur Verfügung.

In diesem Beispiel kommen weitere kleine PNP-Helfer zum Einsatz, zu erkennen am Präfix rrd::.

Die Funktion rrd::cut() schneidet einen String auf eine bestimmte Länge oder füllt auf diese Länge auf. Dies ist hilfreich, um die Legende auszurichten.

Die Funktion rrd::gprint() erzeugt die Legende unter dem Graphen.

Die Funktion rrd::color() liefert eine Farbe aus einer fest definierten Farbliste zurück.

Mehr Informationen zu den PNP-Helper-Funktionen finden Sie hier.

<?php
#
# Special Template websrv_response_times.php
#
$this->MACRO['TITLE']   = "HTTP Response Times";
$this->MACRO['COMMENT'] = "HTTP Response Times for all Cluster Nodes";
#
# Get a List of Services by regex 
# Option 1 = 'Host Regex'
# Option 2 = 'Service Regex'
#
$services = $this->tplGetServices("websrv","HTTP");
#throw new Kohana_exception(print_r($services,TRUE));
#
# The Datasource Name for Graph 0
$ds_name[0] = "Response Times";
$opt[0]     = "--title \"Response Times\"";
$def[0]     = "";
#
# Iterate through the list of hosts
foreach($services as $key=>$val){
    #
    # get the data for a given Host/Service
    $data = $this->tplGetData($val['host'],$val['service']);
    #
    # Throw an exception to debug the content of $a
    # Just to get Infos about the Array Structure
    #
    #throw new Kohana_exception(print_r($a,TRUE));
    $hostname   = rrd::cut($data['MACRO']['HOSTNAME']);
    $def[0]    .= rrd::def("var$key" , $data['DS'][0]['RRDFILE'], $data['DS'][0]['DS'] );
    $def[0]    .= rrd::line1("var$key", rrd::color($key), $hostname);
    $def[0]    .= rrd::gprint("var$key", array("MAX", "AVERAGE"));
}
?>

Zurück zur Übersicht

pnp4nagios-0.6.16/share/pnp/documents/de_DE/mobile.html0000664000000000000000000001072211662503006021364 0ustar rootroot

Mobile UI

Mit PNP4Nagios 0.6.14 ist ein Webinterface für mobile Endgeräte in PNP4Nagios integriert worden.

Das Design wurde mit jQuery Mobile realisiert und ist somit mit den aktuellen mobilen Browsern kompatibel. Auf der Liste der unterstützten Geräte sind die einzelnen Browser aufgeführt und nach Grad der Unterstützung klassifiziert.

Landing Page

Das Webinterface wurde so gestaltet, dass die üblichen Links auf das klassische Interface abgefangen und auf die entsprechende mobile Seite umgeleitet werden. Somit können weiterhin innerhalb der Nagios-Mails Links zu PNP-Graphen eingebunden werden, die je nach Endgerät auf die passende Seite verweisen.

Classic Mobile
/pnp4nagios/graph /pnp4nagios/mobile
/pnp4nagios/graph?host=localhost /pnp4nagios/mobile/host/localhost
/pnp4nagios/graph?host=localhost&srv=ping /pnp4nagios/mobile/graph/localhost/ping

Browser-Erkennung

Browser werden anhand ihres “User-Agent”-Strings als mobile Browser erkannt. Die Erkennung kann in der Datei pnp4nagios/etc/config_local.php beeinflusst werden.

$conf['mobile_devices'] = 'iPhone|iPod|iPad|android';

Die Option 'mobile_devices' beinhaltet einen regulären Ausdruck, welcher mit dem “User Agent” des Browsers verglichen wird.

Der “User Agent” eines Browsers wird im Webserver-Access-Log protokolliert und sieht für ein iOS-Device in etwa wie folgt aus.

"Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_1 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8B117 Safari/6531.22.7"

Screenshots

Screenshot aufgenommen mit einem iPhone und iOS 4.2

 Home Screen Homescreen  Loading... Loading …
 Hosts Liste Liste aller Hosts  Liste aller services Liste aller Services eines Hosts
 Graphen Graphen eines Services
pnp4nagios-0.6.16/share/pnp/documents/de_DE/about.html0000664000000000000000000002203411662503006021226 0ustar rootroot

Über PNP

Anforderungen an Plugins

PNP benötigt zwingend gültige Performancedaten von Nagios-Plugins.

Was sind also diese Performancedaten?

Die Ausgabe eines Nagios Plugins darf bis Nagios 2.x maximal eine Zeile betragen. Diese Ausgabe wird, wenn das Plugin Performancedaten liefert, in zwei Teile zerlegt. Als Trennzeichen dient dabei das Pipe “|” Symbol.

Beispiel check_icmp :

 OK - 127.0.0.1: rta 2.687ms, lost 0% | rta=2.687ms;3000.000;5000.000;0; pl=0%;80;100;;

daraus ergibt sich der Output auf der linken Seite des Pipe-Symbols

 OK - 127.0.0.1: rta 2.687ms, lost 0%

und die Performancedaten

  rta=2.687ms;3000.000;5000.000;0; pl=0%;80;100;;

Wie man unschwer erkennt, sind die Performancedaten auf die maschinelle Verarbeitung ausgelegt. Das Format ist in den Developer Guidelines festgelegt (einen Auszug davon gibt es an dieser Stelle), es soll aber hier noch einmal kurz erläutert werden.

  rta=2.687ms;3000.000;5000.000;0;
   |    |  |    |         |     | |
   |----|--|----|---------|-----|-|----- * Label 
        |--|----|---------|-----|-|----- * Aktueller Wert
           |----|---------|-----|-|----- Einheit ( UOM = UNIT of Measurement ) 
                |---------|-----|-|----- Warning Schwellwert
                          |-----|-|----- Critical Schwellwert 
                                |-|----- Minimum Wert 
                                  |----- Maximum Wert
                                  

Mit * gekennzeichnete Werte müssen vorhanden sein. Alle anderen Werte sind optional.

Mehrere Datenreihen werden durch Leerzeichen getrennt. Die eigentlichen Daten dürfen also keine Leerzeichen enthalten. Soll das Label Leerzeichen enthalten, so müssen diese in einfache Hochkomma eingeschlossen werden.

Benötigte Software

  • Perl >= 5.x ohne besondere Module
  • RRDtool ab 1.x; besser 1.2, aber nicht zwingend.
    Achtung: wird RRDtool ohne Paket-Manager installiert, fehlen anschließend möglicherweise die dejavu-Fonts. Das äußert sich z.B. durch fehlende Schriften in den Grafiken
  • PHP >= 5.1.6 für das Webfrontend basierend auf Kohana
  • Nagios >= 2.x oder Icinga
  • für Kohana muss außerdem das Modul “mod_rewrite” in der Web-Server-Konfiguration aktiviert sein. Einzelheiten sind in der Web-Server-Dokumentation der entsprechenden Distribution nachzulesen.

Lizenz

PNP ist unter der GPL 2 lizensiert.

Download

Die Entwicklung von PNP wird auf Sourceforge.Net organisiert. PNP ist dort unter dem Projektnamen “PNP4Nagios” registriert.

Die jeweils aktuelle (stabile) Version findet ihr im Downloadbereich.

Wer noch aktueller sein möchte, kann auch die jeweils letzte Entwickler-Version benutzen.

Mit der Version 0.6.x wurde von SVN auf GIT zum Verwalten des Sourcecodes gewechselt.

Die aktuelle Entwicklung ist jederzeit unter http://pnp4nagios.git.sourceforge.net/ einzusehen. Beim Klicken auf PNP Devel Version wird ein Archiv mit der letzten Version heruntergeladen.

Support

VOR dem Stellen von Support-Anfragen sollte sichergestellt werden, dass die unter http://docs.pnp4nagios.org/de/pnp-0.6/verify genannten Punkte geprüft wurden.

Die Entwickler und Helfer sind im Nagios-Portal unter http://www.nagios-portal.org vertreten. Dort gibt es einen eigenen Bereich zum Thema PNP.
Bei Support-Anfragen bitte das Betriebssystem und die PNP-Version angeben. Außerdem ist es wichtig, ob PNP aus den Sourcen erstellt oder ein vorgefertigtes Paket verwendet wurde.

Erfolgreich gelöste Probleme bitte mit einem [solved] in der Betreffzeile des ersten Beitrags kennzeichnen. Auf diese Weise erleichtern wir anderen Benutzern das Finden von Lösungen zu einem Problem.

Weiterhin können die Mailinglisten auf Sourceforge verwendet werden. Dort ist es jedoch üblich, Fragen auf Englisch zu stellen.

pnp4nagios-users: Die Users-Liste für allgemeine Fragen zur Konfiguration.

pnp4nagios-devel: Die Devel-Liste für Anregungen und Fehler Reports.

pnp4nagios-checkins: Auf der Checkins-Liste werden Änderungen im SVN-Repository automatisch veröffentlicht.

Datenhaltung

Die Performance-Daten werden mit Hilfe von RRDtool in sogenannten Round-Robin-Datenbanken gespeichert, die wie ein Ringpuffer funktionieren. Das bedeutet, dass nach einer gewissen Zeit die ältesten Daten “hinten” herausfallen und “vorne” durch neue ersetzt werden.

Verschiedene Zeitintervalle innerhalb der Datei sorgen für unterschiedliche Auflösungen. In der Standardeinstellung können die Daten für die letzten zwei Tage im Minutenabstand abgelegt werden, für zehn Tage im 5-Minutenabstand, für 90 Tage im 30-Minutenabstand und für 4 Jahre im 6-Stundenabstand. Die Vergrößerung des Intervalls bewirkt, dass auch die Daten über das jeweils größere Intervall hinweg gemittelt werden. Das führt automatisch dazu, dass Spitzen nicht mehr so deutlich zu sehen sind. Das ist kein Fehler von PNP, sondern eine Eigenheit von RRDtool. Dazu gibt es auch einen Artikel im Linux-Magazin.

Durch die Speicherung in diesem Format ändert sich die Dateigröße nach dem Anlegen nicht mehr. Pro Datenreihe werden ca. 400 KB benötigt.

Zurück zur Übersicht | PNP-Modi

pnp4nagios-0.6.16/share/pnp/documents/de_DE/xport.html0000664000000000000000000000320311662503006021265 0ustar rootroot

Datenexport

PNP bietet über den xport Controller Zugriff auf die RRD-Daten. Dabei kann das Ausgabeformat gewählt werden. Zur Zeit sind die Formate xml, json und csv realisiert.

Aufgerufen wird der Controller über die URL

/pnp4nagios/xport/<format>?host=<hostname>&srv=<servicedesc>

wobei <format> durch das jeweils gewünschte Format zu ersetzen ist.

Sie können außerdem wget benutzen, um Bilder zu erzeugen und diese in regelmäßigen Reports einzufügen. Ein Beispiel:

wget -O image.png 'http://<user>:<pass>@<nagios-server>/pnp4nagios/image?host=<hostname>&srv=<service>&view=2&source=0'

view=<n> begrenzt den Graphen auf die Zeitperiode, die in config.php definiert ist
source=<n> zeigt nur eine Data-Source, wenn mehrere in der RRD-Datei vorhanden sind

Anstatt view können Sie auch start und/oder end benutzen, um die Zeitspanne anzugeben. Details finden Sie in den "time ranges".

zurück zur Übersicht | Templates

pnp4nagios-0.6.16/share/pnp/documents/de_DE/pages.html0000664000000000000000000000633711662503006021223 0ustar rootroot

Pages

„pages“ bieten die Möglichkeit, Grafiken von verschiedenen Hosts/Services auf einer Seite zusammenzufassen. Auf diese Weise können z.B. die Übertragungsraten der Netzwerk-Interfaces aller Tape-Libraries dargestellt werden. Innerhalb der Definitionen sind reguläre Ausdrücke möglich, so dass – entsprechende Namen vorausgesetzt - mit wenig Aufwand viel erreicht werden kann. Das Verzeichnis, das in config.php durch den Konfigurationseintrag „$conf['page_dir']“ angegeben wurde, enthält ein oder mehrere Dateien mit der Endung „.cfg“.

Kommentare beginnen mit einem '#' und sind auch innerhalb einer Zeile möglich. Jede Datei enthält eine „page“-Definition, die neben dem Namen der Seite festlegt, ob die nachfolgenden Grafikdefinitionen reguläre Ausdrücke enthalten.
Die Bezeichnung hinter page_name erscheint in der Liste der verfügbaren Seiten und wird als Titel im Browser angezeigt. Achtung: “host_name” und “service_desc” beziehen sich auf die Namen der Dateien im perfdata-Ordner, nicht auf die Nagios-Bezeichnungen. Leerzeichen werden durch Unterstriche (“_”) ersetzt.

define  page  {
        use_regex 1		# 0 = keine regulären Ausdrücke, 1 = reguläre Ausdrücke
        page_name Test-Seite	# Beschreibung der Seite
}

Danach folgen ein oder mehrere „graph“-Definitionen:

define graph {
        host_name       host1,host2,host3
        service_desc    Current_Load
}

Achtung: Damit die oben gezeigte Liste von Host-Namen funktioniert, muss use_regex 0 gesetzt sein!

define graph {
        host_name       host4
        service_desc    Current_Users
}

Und jetzt mit regulären Ausdrücken. Zuerst alle Hosts, deren Name mit „Tape“ beginnen:

define graph {
        host_name       ^Tape
        service_desc    Traffic
}

alle Hosts, deren Namen mit “00” enden

define graph {
        host_name       00$
        service_desc    Load
}

alle Services des localhost, deren Namen ein „a“ oder „o“ enthalten:

define graph {
        host_name       localhost
        service_desc    a|o
}

alle Services, die im Namen nach einem „_“ (mindestens) drei Ziffern haben auf allen Hosts, deren Namen mit „UX“ beginnen:

define graph {
        host_name       ^UX
        service_desc    _\d{3}
}

In einigen Fällen möchten Sie vielleicht die Anzeige auf einen Graphen beschränken. Um dies zu erreichen, können Sie die optionale Direktive “source” benutzen, gefolgt von einer Zahl, die die Position in der RRD-Datei angibt. Die Zählung beginnt ab 0

define graph {
       host_name       host1,host2,host3
       service_desc    PING
       source          1
}

zurück zur Übersicht | Datenexport

pnp4nagios-0.6.16/share/pnp/documents/de_DE/webfe.html0000664000000000000000000001620511662503006021207 0ustar rootroot

Das Nagios Web Frontend

PNP soll natürlich schnell erreichbar sein. Man möchte nicht lange nach den richtigen Graphen suchen.

Nagios selbst bietet die Möglichkeit, externe URLs über die sogenannte Extended Info Config einzubinden. Da es in diesem Bereich eine Änderung zwischen Nagios 2.x und der Version 3.0 gibt, wird anschließend auf beide Versionen getrennt eingegangen.

Nagios 2.x

Bis Nagios 2.x erfolgt die Einbindung externer URLs in das Nagios-Web-Interface über die Extended-Info-Objekte. Für PNP verwenden wir die Option action_url, um das PNP-Web-Frontend mit den passenden Optionen aufzurufen.

define serviceextinfo {
   name                  srv-pnp
   action_url            /pnp4nagios/index.php/graph?host=$HOSTNAME$&srv=$SERVICEDESC$
   register              0
}

Dieses Template kann nun über “use srv-pnp” in der serviceextinfo-Definition verwendet werden. Wenn Sie die Schnellstart-Installationsanleitungen benutzt haben, können Sie beispielsweise in der Datei localhost.cfg die Definitionen wie folgt erweitern:

define serviceextinfo {
   use                     srv-pnp   ; Name of service templates to use
   host_name               localhost
   service_description     load
}

Nagios 3.x

Seit Nagios 3.0 ist die Direktive action_url in die Host- bzw. Service-Definition verschoben worden. Die serviceextinfo- und hostextinfo-Definitionen sind entfallen. Damit wird die Definition der URLs zum PNP-Interface wesentlich vereinfacht.

Zuerst definieren wir zwei Nagios-Templates. Falls Sie die Schnellstart-Installationsanleitungen für Nagios benutzt haben, können Sie die folgenden Zeilen der Datei templates.cfg hinzufügen:

define host {
   name       host-pnp
   action_url /pnp4nagios/index.php/graph?host=$HOSTNAME$&srv=_HOST_
   register   0
}

define service {
   name       srv-pnp
   action_url /pnp4nagios/index.php/graph?host=$HOSTNAME$&srv=$SERVICEDESC$
   register   0
}

Diese beiden Templates können nun über “use srv-pnp” in der Service-Definition oder “use host-pnp” in der Host-Definition verwendet werden. Wenn Sie die Schnellstart-Installationsanleitungen benutzt haben, können Sie beispielsweise in der Datei localhost.cfg die Definitionen wie folgt erweitern:

define host{
        use                     linux-server,host-pnp    ; Name of host templates to use
                                                         ; This host definition will inherit all variables that are defined
                                                         ; in (or inherited by) the linux-server host template definition.
        host_name               localhost
        alias                   localhost
        address                 127.0.0.1
        }
define service{
        use                     local-service,srv-pnp   ; Name of service templates to use
        host_name               localhost
        service_description     PING
        check_command           check_ping!100.0,20%!500.0,60%
        }

Die Links auf die richtigen URLs werden automagisch erstellt.

Preview Popup

Außerdem gibt es die Möglichkeit, die Graphen bereits in der Statusübersicht beim Überfahren des “Action Url Icons” mit der Maus einzublenden.

Ermöglicht wird dies durch die CGI Includes, die es uns erlauben, Javascript-Code an geeigneter Stelle im Seitenkopf der Statusübersicht einzubinden ( status.cgi ).

In den PNP-Quellen ist die Datei contrib/ssi/status-header.ssi bereits enthalten, die verwendeten URLs müssen aber unter Umständen angepasst werden. Wir gehen hier davon aus, dass PNP über /pnpnagios/index.php erreichbar ist.

Die besagte Datei muss in das Verzeichnis /usr/local/nagios/share/ssi/ kopiert werden und darf NICHT ausführbar sein. Nagios würde die Datei sonst wirklich wie ein CGI behandeln und ausführen, was aber in diesem Fall zu Fehlern führen würde. Die Apache-Admins mögen bitte “Nagios SSI” nicht mit “Apache SSI” in Verbindung bringen. Beides hat nichts miteinander zu tun.

Die action_url ist entsprechend anzupassen:

define host {
   name       host-pnp
   register   0
   action_url /pnp4nagios/index.php/graph?host=$HOSTNAME$&srv=_HOST_' class='tips' rel='/pnp4nagios/index.php/popup?host=$HOSTNAME$&srv=_HOST_
}

define service {
   name       srv-pnp
   register   0
   action_url /pnp4nagios/index.php/graph?host=$HOSTNAME$&srv=$SERVICEDESC$' class='tips' rel='/pnp4nagios/index.php/popup?host=$HOSTNAME$&srv=$SERVICEDESC$
}

Nach einem Restart von Nagios (nach Anpassung der Definitionen) sieht das Ergebnis ungefähr so aus:

Zurück zur Übersicht | Konfiguration Web-Frontend

pnp4nagios-0.6.16/share/pnp/documents/de_DE/advanced.html0000664000000000000000000000737711662503006021676 0ustar rootroot

Advanced

Verteilte Systeme

Ist Nagios als verteiltes System implementiert, stellt sich die Frage, wo PNP installiert wird.

Rein technisch ist diese Frage nicht wichtig. PNP kann auf den Slaves sowie auf dem Master-Server installiert sein. Oder nur auf dem Master?

Wird PNP auf dem Master betrieben, ist jedoch bei der Übergabe der Daten via send_nsca von den Slave-Servern zum Master darauf zu achten, dass auch die Performance-Daten übergeben werden. Weiterhin kommt auf dem Master oft nicht das Original-Check-Command zum Einsatz.

Damit nun aber PNP auf dem Master noch erkennen kann, welches Check-Command auf den Slaves die Daten ermittelt hat, reagiert process_perfdata.pl auf ein zusätzliches Feld am Ende der Performance-Daten.

OK - 127.0.0.1: rta 2.687ms, lost 0% | rta=2.687ms;3000.000;5000.000;0; pl=0%;80;100;; [check_icmp]

Findet PNP am Ende der Performance Daten einen in eckigen Klammern eingeschlossenen Text, so wird dieser als Check-Command und somit als PNP-Template verwendet.

Die Nagios-Dokumentation zu diesem Thema ist hier zu finden. Das in der Doku verwendete Command ist leicht anzupassen.

Aus

define command{
	command_name	submit_check_result
	command_line	/usr/local/nagios/libexec/eventhandlers/submit_check_result $HOSTNAME$ '$SERVICEDESC$' $SERVICESTATE$ '$SERVICEOUTPUT$'
	}

wird

define command{
	command_name	submit_check_result
	command_line	/usr/local/nagios/libexec/eventhandlers/submit_check_result $HOSTNAME$ '$SERVICEDESC$' $SERVICESTATE$ '$SERVICEOUTPUT$ | $SERVICEPERFDATA$ [$SERVICECHECKCOMMAND$]'
	}

Das check_multi-Plugin

Das Plugin check_multi ist eines der ersten Plugins, das die Funktionen von Nagios 3.0 richtig ausschöpft. Check_Multi ist in der Lage, mehrere Nagios-Plugins auszuführen, aber für Nagios als einen Service darzustellen. Die Ausgabe von check_multi erfolgt über mehrere Zeilen, um die Masse an Informationen wieder darstellen zu können.

Daraus ergaben sich jedoch einige Schwierigkeiten für PNP. PNP muss aus den Performance-Daten wieder die Daten der einzelnen Plugins ermitteln können. Zusammen mit Matthias Flacke, dem Entwickler von check_multi, haben wir jedoch recht schnell eine Möglichkeit gefunden, die Daten wieder sauber den einzelnen Plugins zuzuordnen.

Zurück zur Übersicht | rrdcached-Unterstützung

pnp4nagios-0.6.16/share/pnp/documents/de_DE/tpl.html0000664000000000000000000004524611662503006020725 0ustar rootroot

Was sind Templates ?

PNP benutzt Templates, um das Aussehen der RRD-Graphen zu beeinflussen.

Dabei bestimmt das verwendete check_command, welches Template zur Darstellung herangezogen wird. Im Folgenden wird beschrieben, wo Templates gespeichert werden und wie die Entscheidung für das “richtige” Template getroffen wird.

Wann wird welches Template verwendet ?

Templates werden an zwei Stellen im Dateisystem gespeichert.

  • share/templates.dist - für Templates, die im PNP-Paket bereits enthalten sind.
  • share/templates - für selbst erstellte Templates. Diese werden bei Updates nicht verändert.

Weiterhin können seit Version 0.6.5 weitere Template Verzeichnisse in der Config Datei pnp4nagios/etc/config.php hinzugefügt werden.

Soll der Graph für den Service “http” auf Host “localhost” angezeigt werden, so sucht PNP zuerst nach der XML-Datei perfdata/localhost/http.xml und liest diese ein. Diese XML-Dateien werden automatisch erstellt und enthalten Informationen zum jeweiligen Host und Service. Weiterhin enthält der Kopf Informationen über das Plugin und die Performance-Daten. Im folgenden Beispiel erkennt man anhand des XML-Tags <TEMPLATE>, welches PNP-Template für diesen Graphen verwendet werden soll.

/localhost/http.xml

<NAGIOS>
  <DATASOURCE>
    <TEMPLATE>check_http</TEMPLATE>
    <DS>1</DS>
    <NAME>time</NAME>
    <UNIT>s</UNIT>
    <ACT>0.006721</ACT>
    <WARN>1.000000</WARN>
    <CRIT>2.000000</CRIT>
    <MIN>0.000000</MIN>
    <MAX></MAX>
  </DATASOURCE>
  <DATASOURCE>
    <TEMPLATE>check_http</TEMPLATE>
    <DS>2</DS>
    <NAME>size</NAME>
    <UNIT>B</UNIT>
    <ACT>263</ACT>
    <WARN></WARN>
    <CRIT></CRIT>
    <MIN>0</MIN>
    <MAX></MAX>
  </DATASOURCE>
...
</NAGIOS>

PNP sucht nun nach einem Template mit dem Namen check_http.php in folgender Reihenfolge:

  1. templates/check_http.php
  2. templates.dist/check_http.php
  3. templates/default.php
  4. templates.dist/default.php

Das Template default.php nimmt somit eine Sonderstellung ein und wird immer verwendet, wenn vorher kein anderes Template gefunden wird.

Eigene Templates erstellen

PNP-Templates sind PHP-Dateien, die zur Laufzeit von PNP über die PHP-Funktion include() eingebunden werden. Dies bedeutet, dass jeder PHP-Code in Templates interpretiert wird. Daher ist die Manipulation aller Werte über PHP möglich.

PNP-Templates müssen folgende Eigenschaften besitzen:

  1. Templates müssen gültigen PHP-Code enthalten.
  2. Templates dürfen keine Ausgabe erzeugen.
  3. innerhalb der Templates werden die zwei Arrays $opt[] und $def[] gefüllt.

Die beiden PHP-Arrays $opt[] und $def[] zusammen bilden den Aufruf von 'rrdtool graph'. Somit sind alle Optionen möglich, die RRDtool bietet. Die Optionen von RRDtool sind auf der RRDtool Homepage genauestens beschrieben.

Wenn beide Arrays mehrere Datensätze enthalten, so wird für jeden Datensatz ein Graph erstellt.

Weiterhin stehen innerhalb der Templates die Daten aus dem zugehörigen XML-File zur Verfügung, die zum Erstellen der Graphen wieder verwendet werden können.

Am Beispiel des recht einfachen Templates response.php lassen sich die wichtigsten Optionen recht gut beschreiben.

<?php
#
$opt[1] = "--title \"Response Time For $hostname / $servicedesc\" ";
#
$def[1] =  "DEF:var1=$RRDFILE[1]:$DS[1]:AVERAGE " ;
$def[1] .= "AREA:var1#00FF00:\"Response Times \" " ;
$def[1] .= "LINE1:var1#000000 " ;
$def[1] .= "GPRINT:var1:LAST:\"%3.4lg %s$UNIT[1] LAST \" ";
$def[1] .= "GPRINT:var1:MAX:\"%3.4lg %s$UNIT[1] MAX \" ";
$def[1] .= "GPRINT:var1:AVERAGE:\"%3.4lg %s$UNIT[1] AVERAGE \" ";
?>

$opt[1] = ”–title …” setzt RRDtool-Optionen für den ersten Datensatz im Array. Hier ist das der Titel des Graphen. Wie man sieht, werden eingebettete Anführungszeichen durch einen Backslash (\) maskiert. Die beiden Variablen $hostname und $servicedesc sind durch den Aufruf von PNP ermittelt worden und stehen nun auch im Template zur Verfügung.

$def[1] = “DEF:var1=$RRDFILE[1]:$DS[1]:AVERAGE ”; definiert, welche Daten aus welchem RRD-File gelesen werden sollen. $RRDFILE[1] enthält den Pfad zur RRD-Datei dieses Services. $DS[1] verweist auf die Datenreihe eins aus der RRD-Datei.

$def[1] .= “AREA:var1#00FF00:\”Response Times \” ”; durch den Operator ”.=” werden weitere Daten an das Array $def[1] angehängt. Gezeichnet wird eine Fläche (AREA) mit den Daten der Variable var1. Die Farbe wird im HEX-Code #00FF00 definiert. Als Beschriftung wird “Response Times” verwendet.

$def[1] .= “LINE1:var1#000000 ”; Als Abschluss der eben gezeichneten Fläche wird eine Linie (LINE1) in Schwarz (#000000) gezeichnet.

$def[1] .= “GPRINT:var1:LAST:\”%3.4lg %s$UNIT[1] LAST \” ”;
$def[1] .= “GPRINT:var1:MAX:\”%3.4lg %s$UNIT[1] MAX \” ”;
$def[1] .= “GPRINT:var1:AVERAGE:\”%3.4lg %s$UNIT[1] AVERAGE \” ”;

Die drei GPRINT Zeilen bilden die Legende des Graphen. Die aktuellen Werte werden dabei über die printf Syntax formatiert.

Verfügbare Variablen

PNP speichert über den Datensammler process_perfdata.pl zur Laufzeit nicht nur Performancedaten, sondern auch weitere von Nagios exportierte Werte. Diese Werte werden in der jeweils für den Service gültigen XML-Datei gespeichert.

Im ersten Teil der XML-Datei werden die Performancedaten in ihre Einzelteile zerlegt gespeichert.

<NAGIOS>
  <DATASOURCE>
    <TEMPLATE>check_http</TEMPLATE>
    <DS>1</DS>
    <NAME>time</NAME>
    <UNIT>s</UNIT>
    <ACT>0.006721</ACT>
    <WARN>1.000000</WARN>
    <CRIT>2.000000</CRIT>
    <MIN>0.000000</MIN>
    <MAX></MAX>
  </DATASOURCE>
...
</NAGIOS>

Das Feld <DS> bezeichnet die DataSource und dient der Identifizierung der Datenreihen innerhalb der RRD-Dateien, ist aber auch der Schlüssel der folgenden Arrays.

Im Array $UNIT[1] ist somit die Einheit der ersten Datenreihe gespeichert.

Die XML-Datei enthält jedoch noch weitere Informationen. Wird process_perdata.pl im sync-Mode verwendet, so sind alle verfügbaren Makros mit den aktuellen Werten verfügbar. Der folgende Ausschnitt ist jedoch zu Gunsten der Lesbarkeit gekürzt.

<NAGIOS>
...
  <NAGIOS_SERVICENOTIFICATIONID>8418</NAGIOS_SERVICENOTIFICATIONID>
  <NAGIOS_SERVICENOTIFICATIONNUMBER>0</NAGIOS_SERVICENOTIFICATIONNUMBER>
  <NAGIOS_SERVICEOUTPUT>HTTP OK HTTP/1.1 200 OK - 10087 bytes in 0.125 seconds</NAGIOS_SERVICEOUTPUT>
  <NAGIOS_SERVICEPERCENTCHANGE>0.00</NAGIOS_SERVICEPERCENTCHANGE>
  <NAGIOS_SERVICEPERFDATA>time=0.124811s;;;0.000000 size=10087B;;;0</NAGIOS_SERVICEPERFDATA>
  <NAGIOS_SERVICEPERFDATAFILE></NAGIOS_SERVICEPERFDATAFILE>
  <NAGIOS_SERVICEPROBLEMID>0</NAGIOS_SERVICEPROBLEMID>
  <NAGIOS_SERVICESTATE>OK</NAGIOS_SERVICESTATE>
  <NAGIOS_SERVICESTATEID>0</NAGIOS_SERVICESTATEID>
  <NAGIOS_SERVICESTATETYPE>HARD</NAGIOS_SERVICESTATETYPE>
  <NAGIOS_SHORTDATETIME>27-12-2007 13:51:23</NAGIOS_SHORTDATETIME>
...
</NAGIOS>

Die einzelnen XML-Felder sind als Variablen in den PNP-Templates verwendbar, wobei jedes Feld als Variable gleichen Namens verfügbar ist.

Aus <NAGIOS_SERVICEOUTPUT> wird die Variable $NAGIOS_SERVICEOUTPUT.

zurück zur Übersicht | Custom Templates

pnp4nagios-0.6.16/share/pnp/documents/de_DE/tpl_custom.html0000664000000000000000000001265611662503006022316 0ustar rootroot

Custom Templates

Wie bereits unter ”Was sind Templates ?” beschrieben, ist die Darstellung der Graphen abhängig vom verwendeten Check-Command.

Es gibt jedoch Situationen, in denen dieses Verhalten übersteuert werden muss.

CUSTOM_TEMPLATE

Notwendig wird dies, wenn allgemeingültige Commands definiert wurden.

Beispiel:

define command {
  command_name check_nrpe
  command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$ -a "$ARG2$"
}

Die Folge wäre, dass immer das Template check_nrpe.php verwendet werden würde, auch wenn auf dem zu überwachenden Server via NRPE ein ganz anderes Plugin aufgerufen wurde.

PNP, speziell process_perfdata.pl, sucht zur Laufzeit für jedes check_command im Verzeichnis etc/check_commands nach einer Config-Datei ( <check_command>.cfg ) und liest diese, wenn vorhanden, ein.

Da unser Beispiel-Command check_nrpe lautet, wird nach etc/check_commands/check_nrpe.cfg gesucht.

Eine Beispiel-Config wird bereits während der Installation mit der Dateierweiterung .cfg-sample in etc/check_commands gespeichert.

In diesen Config-Files können zwei Optionen gesetzt werden.

# check_command check_nrpe!load!-w 4,4,4 -c 5,5,5
# ________0__________|       |       |
# ________1__________________|       |
# ________2__________________________|
#
CUSTOM_TEMPLATE = 1

CUSTOM_TEMPLATE = 1 sorgt dafür, dass nur der Inhalt von $ARG1$ als Template-Name verwendet wird. Da in diesem Beispiel $ARG1$ mit dem Wert “load” gefüllt ist, ergibt sich als Template-Name “load.php”

CUSTOM_TEMPLATE = 0,1 ergibt → “check_nrpe_load.php”

CUSTOM_TEMPLATE = 1,0 ergibt → “load_check_nrpe.php”

DATATYPE

Über die Option “DATATYPE” kann beeinflusst werden, mit welchem Datentyp die RRD-Datenbank angelegt werden soll. Default ist in diesem Fall “GAUGE”. Für fortlaufende Werte wird aber hier der Datentyp COUNTER benötigt. Normalerweise sollten Plugin-Entwickler für Daten von Typ Counter die Einheit “c” verwenden. Dies ist jedoch nicht immer der Fall.

Alle Datenreihen auf Typ COUNTER einstellen.

DATATYPE = COUNTER

Einzelnen Datenreihen spezielle Datentypen zuweisen

DATATYPE = GAUGE,GAUGE,COUNTER,COUNTER

Diese Option hat nur Einfluss, wenn die RRD Datenbank neu erstellt wird.

Weitere Datentypen sind in der RRDTool-Dokumentation unter rrdcreate erklärt.

MIN und MAX

In einigen wenigen Situationen ist es notwendig, die für RRDTool gültigen Daten zu begrenzen.

RRD-Datenbanken lassen sich mit definierten Minimum- und Maximum-Werten anlegen. Weitere Infos unter http://oss.oetiker.ch/rrdtool/doc/rrdcreate.en.html

Berücksichtigen des Maximum-Wertes aus den Performance-Daten

USE_MAX_ON_CREATE = 1

Berücksichtigen des Minimum-Wertes aus den Performance-Daten

USE_MIN_ON_CREATE = 1

RRD_STORAGE_TYPE

RRD_STORAGE_TYPE = SINGLE

Die Option RRD_STORAGE_TYPE definiert die Art der Datenhaltung.

Mögliche Werte sind MULTIPLE und SINGLE

SINGLE: Eine RRD-Datenbank pro Service

MULTIPLE: Ein oder mehrere RRD-Datenbanken pro Service. Für jede Datenreihe wird eine eigene RRD-Datenbank erstellt.

ACHTUNG: Daten werden nicht automatisch migriert!
Ein Konvertierungs-Script finden Sie hier.

RRD_HEARTBEAT

Gültig ab PNP 0.6.1

RRD_HEARTBEAT = 305

Nach <RRD_HEARTBEAT> Sekunden erwartet RRDtool neue Daten.

Mehr dazu unter http://oss.oetiker.ch/rrdtool/doc/rrdcreate.en.html

zurück zur Übersicht | PNP in verteilten Umgebungen

pnp4nagios-0.6.16/share/pnp/templates.dist/0000775000000000000000000000000011662503006017224 5ustar rootrootpnp4nagios-0.6.16/share/pnp/templates.dist/check_messpc_temp.php0000664000000000000000000000137311662503006023415 0ustar rootroot # if ($WARN[1] == "") { $WARN[1] = 0; } if ($CRIT[1] == "") { $CRIT[1] = 0; } $opt[1] = "--vertical-label \"Temperature\" --title \"Temperature for $hostname / $servicedesc\" "; $def[1] = "DEF:var1=$RRDFILE[1]:$DS[1]:AVERAGE "; $def[1] .= "AREA:var1#00FF00:\"Temperature \" "; $def[1] .= "LINE1:var1#000000:\"\" "; $def[1] .= "GPRINT:var1:LAST:\"%3.4lg %s$UNIT[1] LAST \" "; $def[1] .= "GPRINT:var1:MAX:\"%3.4lg %s$UNIT[1] MAX \" "; $def[1] .= "GPRINT:var1:AVERAGE:\"%3.4lg %s$UNIT[1] AVERAGE \\n\" "; $def[1] .= "HRULE:$WARN[1]#FFFF00:\"Warning on $WARN[1]C\" "; $def[1] .= "HRULE:$CRIT[1]#FF0000:\"Critical on $CRIT[1]C\" "; ?> pnp4nagios-0.6.16/share/pnp/templates.dist/pnp-runtime.php0000664000000000000000000000246111662503006022216 0ustar rootrootSTRUCT['TIMERANGE']['end']; $ds_name[1] = "Runtime"; $def[1] = rrd::def("var1", $RRDFILE[1], $DS[1], "AVERAGE") ; $def[1] .= rrd::cdef("t_var1","var1,14400,TREND"); if ($WARN[1] != "") { $def[1] .= rrd::hrule($WARN[1], "#FFFF00"); } if ($CRIT[1] != "") { $def[1] .= rrd::hrule($CRIT[1], "#FF0000"); } $def[1] .= rrd::gradient("var1", "ffffff", "#33cccc", rrd::cut("Runtime",10)); $def[1] .= rrd::line1("var1","#339999"); $def[1] .= rrd::gprint("var1", array('LAST', 'MAX', 'AVERAGE'), "%6.2lf$UNIT[1]") ; $def[1] .= rrd::line1("t_var1", "#ff9999", rrd::cut("4h trend",10)); $def[1] .= rrd::gprint("t_var1", array('LAST', 'MAX', 'AVERAGE'), "%6.2lf$UNIT[1]") ; # # Lines processed and RRD errors # $opt[2] = "--vertical-label \"Counter\" --title \"Number of updates\" "; # # # $ds_name[2] = "Errors and updates"; $def[2] = ''; for($i=2; $i <= sizeof($DS); $i++) { $def[2] .= rrd::def("var$i", $RRDFILE[$i], $DS[$i] , "AVERAGE") ; $def[2] .= rrd::line1("var$i", rrd::color($i), rrd::cut(ucfirst($LABEL[$i]),12) ); $def[2] .= rrd::gprint("var$i", array('LAST', 'MAX', 'AVERAGE'), "%4.0lf$UNIT[$i]"); } ?> pnp4nagios-0.6.16/share/pnp/templates.dist/integer.php0000664000000000000000000000154611662503006021400 0ustar rootroot $VAL ){ $opt[1] .= "--alt-y-grid -l 0 --vertical-label \"$LABEL[$KEY]\" --title \"$LABEL[$KEY]\" "; $def[1] .= "DEF:var_float$KEY=$RRDFILE[$KEY]:$DS[$KEY]:MAX " ; $def[1] .= "CDEF:var$KEY=var_float$KEY,FLOOR " ; $def[1] .= "LINE1:var$KEY$colors[$KEY]:\"$LABEL[$KEY]\" " ; if ($WARN[$KEY] != "") { $def[1] .= "HRULE:$WARN[$KEY]#FFFF00 "; } if ($CRIT[$KEY] != "") { $def[1] .= "HRULE:$CRIT[$KEY]#FF0000 "; } $def[1] .= "GPRINT:var$KEY:LAST:\"%.0lf $UNIT[$KEY] LAST \" "; $def[1] .= "GPRINT:var$KEY:MAX:\"%.0lf $UNIT[$KEY] MAX \" "; $def[1] .= "GPRINT:var$KEY:AVERAGE:\"%.0lf $UNIT[$KEY] AVERAGE \\n\" "; } ?> pnp4nagios-0.6.16/share/pnp/templates.dist/check_oracle_health.php0000664000000000000000000000126411662503006023667 0ustar rootroot pnp4nagios-0.6.16/share/pnp/templates.dist/check_ntp_time.php0000664000000000000000000000157411662503006022720 0ustar rootroot pnp4nagios-0.6.16/share/pnp/templates.dist/check_oracle_health_switch-interval.php0000664000000000000000000000077511662503006027100 0ustar rootroot pnp4nagios-0.6.16/share/pnp/templates.dist/check_hpasm.php0000664000000000000000000000313711662503006022206 0ustar rootroot $VAL){ if(preg_match('/^fan_/',$NAME[$KEY])){ $ds_name[1] = "Fan Speed"; $opt[1] = "-X0 --slope-mode -u $max_rpm --vertical-label \"RPMs\" --title \"HPASM Fan Speed\" "; if(!isset($def[1])){ $def[1] = ""; } $def[1] .= "DEF:ovar$KEY=$RRDFILE[$KEY]:$DS[$KEY]:AVERAGE " ; $def[1] .= "CDEF:var$KEY=ovar$KEY,100,/,$max_rpm,* " ; $def[1] .= "LINE:var$KEY#".$colors[$col_f].":\"$NAME[$KEY]\" " ; $def[1] .= "GPRINT:var$KEY:LAST:\"%6.0lf RPM LAST \" "; $def[1] .= "GPRINT:var$KEY:MAX:\"%6.0lf RPM MAX \" "; $def[1] .= "GPRINT:var$KEY:AVERAGE:\"%6.2lf RPM AVERAGE \\n\" "; $col_f++; } if(preg_match('/^temp_/',$NAME[$KEY])){ $ds_name[2] = "Temperature"; $opt[2] = "--slope-mode --vertical-label \"Grad Celsius\" --title \"HPASM Temperature\" "; if(!isset($def[2])){ $def[2] = ""; } $def[2] .= "DEF:var$KEY=$RRDFILE[$KEY]:$DS[$KEY]:AVERAGE " ; $def[2] .= "LINE:var$KEY#".$colors[$col_t].":\"$NAME[$KEY]\\t\" " ; $def[2] .= "GPRINT:var$KEY:LAST:\"%6.0lf $UNIT[$KEY] LAST \" "; $def[2] .= "GPRINT:var$KEY:MAX:\"%6.0lf $UNIT[$KEY] MAX \" "; $def[2] .= "GPRINT:var$KEY:AVERAGE:\"%6.2lf $UNIT[$KEY] AVERAGE \\n\" "; $col_t++; } } ?> pnp4nagios-0.6.16/share/pnp/templates.dist/check_smtp.php0000777000000000000000000000000011662503554024427 2response.phpustar rootrootpnp4nagios-0.6.16/share/pnp/templates.dist/check_openmanage.php0000664000000000000000000004231711662503006023213 0ustar rootroot. # Array with different colors $colors = array("0022ff", "22ff22", "ff0000", "00aaaa", "ff00ff", "ffa500", "cc0000", "0000cc", "0080C0", "8080C0", "FF0080", "800080", "688e23", "408080", "808000", "000000", "00FF00", "0080FF", "FF8000", "800000", "FB31FB"); # Counters $f = 0; # fan probe counter $t = 0; # temp probe counter $a = 0; # amp probe counter $v = 0; # volt probe counter $e = 0; # enclosure counter # Flags $visited_amp = 0; # IDs $id_temp1 = 1; $id_temp2 = 2; $id_watt = 3; $id_amp = 4; $id_volt = 5; $id_fan = 6; $id_enc = 7; # Enclosure id $enclosure_id = ''; # Default title $def_title = 'Dell OpenManage'; # Temperature unit if (!defined('tempunit_defined')) { define('tempunit_defined', 1); function tempunit($arg) { $unit = 'unknown'; $vlabel = 'unknown'; switch ($arg) { default: $vlabel = "Celsius"; $unit = "°C"; break; case "F": $vlabel = "Fahrenheit"; $unit = "°F"; break; case "K": $vlabel = "Kelvin"; $unit = "K"; break; case "R": $vlabel = "Rankine"; $unit = "°R"; break; } return array($unit, $vlabel); } } # Determine if we're running in legacy mode $legacy = "no"; foreach ($this->DS as $KEY=>$VAL) { if (preg_match('/^(pwr_mon_|fan_|temp_|enclosure_|p\d+|f\d+|t\d+|e.+?t\d+)/', $VAL['LABEL'])) { $legacy = "yes"; break; } } #------------------------------------------------------ # MAIN LOOP #------------------------------------------------------ if ($legacy == "yes") { # --legacy-- $count = 0; # general counter $PWRcolor = "66FF00"; # Flags $visited_fan = 0; $visited_temp = 0; $visited_pwr = 0; # Loop through the performance data foreach ($this->DS as $KEY=>$VAL) { # AMPERAGE PROBE if(preg_match('/^pwr_mon_/', $VAL['NAME']) || preg_match('/^p\d+[aw]$/', $VAL['NAME'])) { # Watt if (preg_match('/system/', $VAL['NAME']) || preg_match('/^p\d+w$/', $VAL['NAME'])) { # Long label $VAL['NAME'] = preg_replace('/^pwr_mon_\d+_/', '', $VAL['NAME']); $VAL['NAME'] = preg_replace('/_/', ' ', $VAL['NAME']); # Short label $VAL['NAME'] = preg_replace('/^p(\d+)w$/', 'Power Probe $1', $VAL['NAME']); ++$count; $ds_name[$count] = "Power Consumption"; $vlabel = "Watt"; $title = $ds_name[$count]; $opt[$count] = "--slope-mode --vertical-label \"$vlabel\" --title \"$def_title: $title\" "; if(isset($def[$count])){ $def[$count] .= rrd::def("var".$KEY, $VAL['RRDFILE'], $VAL['DS'], "AVERAGE"); } else { $def[$count] = rrd::def("var".$KEY, $VAL['RRDFILE'], $VAL['DS'], "AVERAGE"); } $def[$count] .= rrd::area("var$KEY", "#".$PWRcolor, $VAL['NAME']); $def[$count] .= rrd::line1("var$KEY","#000000"); $def[$count] .= rrd::gprint("var$KEY",array("LAST", "MAX", "AVERAGE"), "%6.0lf W"); } # Ampere elseif (preg_match('/current/', $VAL['NAME']) || preg_match('/^p\d+a$/', $VAL['NAME'])) { # Long label $VAL['NAME'] = preg_replace('/^pwr_mon_\d+_/', '', $VAL['NAME']); $VAL['NAME'] = preg_replace('/_/', ' ', $VAL['NAME']); $VAL['NAME'] = preg_replace('/ current \d+$/', '', $VAL['NAME']); $VAL['NAME'] = preg_replace('/ps/', 'PowerSupply', $VAL['NAME']); # Short label $VAL['NAME'] = preg_replace('/^p(\d+)a$/', 'Amperage Probe $1', $VAL['NAME']); if ($visited_pwr == 0) { ++$count; $visited_pwr = 1; } $ds_name[$count] = "Amperage Probes"; $vlabel = "Ampere"; $title = $ds_name[$count]; $opt[$count] = "-X0 --lower-limit 0 --slope-mode --vertical-label \"$vlabel\" --title \"$def_title: $title\" "; if(isset($def[$count])){ $def[$count] .= rrd::def("var$KEY",$VAL['RRDFILE'],$VAL['DS'],"AVERAGE") ; } else { $def[$count] = rrd::def("var$KEY",$VAL['RRDFILE'],$VAL['DS'],"AVERAGE") ; } $def[$count] .= rrd::line1("var$KEY", "#".$colors[$a], $VAL['NAME']) ; $def[$count] .= rrd::area("var$KEY","#".$colors[$a++]."20") ; $def[$count] .= rrd::gprint("var$KEY", array("LAST", "MAX", "AVERAGE"),"%4.2lf A") ; } } # FANS (RPMs) if(preg_match('/^fan_/', $VAL['NAME']) || preg_match('/^f\d+$/', $VAL['NAME'])){ if ($visited_fan == 0) { ++$count; $visited_fan = 1; } # Long label $VAL['NAME'] = preg_replace('/^fan_\d+_/', '', $VAL['NAME']); $VAL['NAME'] = preg_replace('/_rpm$/', '', $VAL['NAME']); $VAL['NAME'] = preg_replace('/_/', ' ', $VAL['NAME']); # Short label $VAL['NAME'] = preg_replace('/^f(\d+)$/', 'Fan Probe $1', $VAL['NAME']); $ds_name[$count] = "Fan Speed"; $opt[$count] = "-X0 --slope-mode --vertical-label \"RPMs\" --title \"$def_title: Fan Speeds\" "; if(isset($def[$count])){ $def[$count] .= rrd::def("var$KEY", $VAL['RRDFILE'], $VAL['DS'], "AVERAGE") ; } else { $def[$count] = rrd::def("var$KEY",$VAL['RRDFILE'],$VAL['DS'],"AVERAGE"); } $def[$count] .= rrd::line1("var$KEY", "#".$colors[$f++],$VAL['NAME']); $def[$count] .= rrd::gprint("var$KEY", array("LAST", "MAX", "AVERAGE"),"%6.0lf RPM"); } # TEMPERATURES (Celsius) if(preg_match('/^temp_/', $VAL['NAME']) || preg_match('/^t\d+$/', $VAL['NAME'])){ if ($visited_temp == 0) { ++$count; $visited_temp = 1; } # Long label $VAL['NAME'] = preg_replace('/^temp_\d+_/', '', $VAL['NAME']); $VAL['NAME'] = preg_replace('/_/', ' ', $VAL['NAME']); # Short label $VAL['NAME'] = preg_replace('/^t(\d+)$/', 'Temperature Probe $1', $VAL['NAME']); $ds_name[$count] = "Chassis Temperatures"; $warnThresh = "INF"; $critThresh = "INF"; if ($VAL['WARN'] != "") { $warnThresh = $VAL['WARN']; } if ($VAL['CRIT'] != "") { $critThresh = $VAL['CRIT']; } $opt[$count] = "--slope-mode --vertical-label \"Celsius\" --title \"$def_title: Chassis Temperatures\" "; if(isset($def[$count])){ $def[$count] .= rrd::def("var$KEY",$VAL['RRDFILE'],$VAL['DS'],"AVERAGE") ; } else { $def[$count] = rrd::def("var$KEY", $VAL['RRDFILE'],$VAL['DS'],"AVERAGE") ; } $def[$count] .= rrd::line1("var$KEY", "#".$colors[$t++], $VAL['NAME']); $def[$count] .= rrd::gprint("var$KEY",array("LAST", "MAX", "AVERAGE"),"%6.0lf C"); } # ENCLOSURE TEMPERATURES (Celsius) if(preg_match('/^enclosure_(?P.+?)_temp_\d+$/', $VAL['NAME'], $matches) || preg_match('/^e(?P.+?)t\d+$/', $VAL['NAME'], $matches)) { $this_id = $matches['id']; if ($enclosure_id != $this_id) { $e = 0; ++$count; $enclosure_id = $this_id; } # Long label $VAL['NAME'] = preg_replace('/^enclosure_.+?_temp_(\d+)$/', 'Probe $1', $VAL['NAME']); # Short label $VAL['NAME'] = preg_replace('/^e.+?t(\d+)$/', 'Probe $1', $VAL['NAME']); $ds_name[$count] = "Enclosure $enclosure_id Temperatures"; $warnThresh = "INF"; $critThresh = "INF"; if ($VAL['WARN'] != "") { $warnThresh = $VAL['WARN']; } if ($VAL['CRIT'] != "") { $critThresh = $VAL['CRIT']; } $opt[$count] = "--slope-mode --vertical-label \"Celsius\" --title \"$def_title: Enclosure $enclosure_id Temperatures\" "; if(isset($def[$count])){ $def[$count] .= rrd::def("var$KEY", $VAL['RRDFILE'],$VAL['DS'],"AVERAGE") ; } else { $def[$count] = rrd::def("var$KEY",$VAL['RRDFILE'],$VAL['DS'],"AVERAGE") ; } $def[$count] .= rrd::line1("var$KEY","#".$colors[$e++],$VAL['NAME']) ; $def[$count] .= rrd::gprint("var$KEY", array("LAST", "MAX", "AVERAGE"),"%6.0lf C"); } } } else { # --new-- # Loop through the performance data foreach ($this->DS as $KEY=>$VAL) { $label = $VAL['LABEL']; # TEMPERATURES (AMBIENT) if (preg_match('/^T/', $label) && preg_match('/Ambient/', $label)) { # Temperature unit and vertical label list ($unit, $vlabel) = tempunit($VAL['UNIT']); # Long label $label = preg_replace('/^T(\d+)_(.+)/', '$2', $label); $label = preg_replace('/_/', ' ', $label); # Short label $label = preg_replace('/^T(\d+)$/', 'Probe $1', $label); $ds_name[$id_temp1] = "Temperatures"; $opt[$id_temp1] = "--slope-mode --vertical-label \"$vlabel\" --title \"$def_title: Ambient Temperature\" "; if(isset($def[$id_temp1])){ $def[$id_temp1] .= rrd::def("var$KEY",$VAL['RRDFILE'],$VAL['DS'],"AVERAGE") ; } else { $def[$id_temp1] = rrd::def("var$KEY", $VAL['RRDFILE'],$VAL['DS'],"AVERAGE") ; } # fancy graphing $def[$id_temp1] .= rrd::gradient("var$KEY","#114480", "#1144dc", $label, 10, "50%"); $def[$id_temp1] .= rrd::gprint("var$KEY",array("LAST", "MAX", "AVERAGE"),"%5.1lf $unit"); # insert extra vertical space if we have thresholds if ($VAL['WARN'] != "" || $VAL['CRIT'] != "") { $def[$id_temp1] .= "COMMENT:\\s "; } # warning threshold if ($VAL['WARN'] != "") { $warnThresh = $VAL['WARN']; $def[$id_temp1] .= rrd::cdef("warn$KEY", "var$KEY,$warnThresh,GT,var$KEY,UNKN,IF"); $def[$id_temp1] .= rrd::gradient("warn$KEY","#c4c400", "#ffff00","Above Upper Warning Threshold\: $warnThresh $unit\\l", 10, "50%"); } # critical threshold if ($VAL['CRIT'] != "") { $critThresh = $VAL['CRIT']; $def[$id_temp1] .= rrd::cdef("crit$KEY", "var$KEY,$critThresh,GT,var$KEY,UNKN,IF"); $def[$id_temp1] .= rrd::gradient("crit$KEY","#800000", "#dc0000","Above Upper Critical Threshold\: $critThresh $unit\\l", 10, "50%"); } } # TEMPERATURES if (preg_match('/^T/', $label) && !preg_match('/Ambient/', $label)) { # Temperature unit and vertical label list ($unit, $vlabel) = tempunit($VAL['UNIT']); # Long label $label = preg_replace('/^T(\d+)_(.+)/', '$2', $label); $label = preg_replace('/_/', ' ', $label); # Short label $label = preg_replace('/^T(\d+)$/', 'Probe $1', $label); $ds_name[$id_temp2] = "Temperatures"; $opt[$id_temp2] = "--slope-mode --vertical-label \"$vlabel\" --title \"$def_title: Chassis Temperatures\" "; if (isset($def[$id_temp2])) { $def[$id_temp2] .= rrd::def("var$KEY", $VAL['RRDFILE'],$VAL['DS'],"AVERAGE") ; } else { $def[$id_temp2] = rrd::def("var$KEY",$VAL['RRDFILE'],$VAL['DS'],"AVERAGE") ; } $def[$id_temp2] .= rrd::line1("var$KEY", "#".$colors[$t++], rrd::cut($label,20) ); $def[$id_temp2] .= rrd::gprint("var$KEY", array("LAST", "MAX", "AVERAGE"), "%4.1lf $unit"); } # WATTAGE PROBE if (preg_match('/^W/', $label)) { # Long label $label = preg_replace('/^W(\d+)_(.+)/', '$2', $label); $label = preg_replace('/_/', ' ', $label); # Short label $label = preg_replace('/^W(\d+)$/', 'Probe $1', $label); $ds_name[$id_watt] = "Power Consumption"; $vlabel = "Watt"; $title = $ds_name[$id_watt]; $opt[$id_watt] = "--slope-mode --vertical-label \"$vlabel\" --title \"$def_title: $title\" "; if(isset($def[$id_watt])){ $def[$id_watt] .= rrd::def("var$KEY",$VAL['RRDFILE'], $VAL['DS'], "AVERAGE") ; } else { $def[$id_watt] = rrd::def("var$KEY",$VAL['RRDFILE'],$VAL['DS'],"AVERAGE") ; } # calculate kWh and BTU $def[$id_watt] .= "VDEF:tot$KEY=var$KEY,TOTAL "; # rrd:vdef is broken in pnp4nagios 0.6.13 # $def[$id_watt] .= rrd::vdef("tot$KEY","var$KEY,TOTAL"); $def[$id_watt] .= rrd::cdef("kwh$KEY","var$KEY,POP,tot$KEY,1000,/,60,/,60,/"); $def[$id_watt] .= rrd::cdef("btu$KEY","kwh$KEY,3412.3,*"); # fancy graphing $def[$id_watt] .= rrd::gradient("var$KEY","#800000","#dc0000","$label", 10, "50%"); # print avg, max and min $def[$id_watt] .= rrd::gprint("var$KEY", array("LAST", "MAX", "AVERAGE"),"%6.0lf W"); # print kWh and BTU for time period $def[$id_watt] .= rrd::comment("\\s"); $def[$id_watt] .= rrd::comment(" Total power used in time period\:"); $def[$id_watt] .= rrd::gprint("kwh$KEY","AVERAGE","%10.2lf kWh\l"); $def[$id_watt] .= rrd::comment(" "); $def[$id_watt] .= rrd::gprint("btu$KEY","AVERAGE","%10.2lf BTU\l"); } # AMPERAGE PROBE if (preg_match('/^A/', $label)) { $first = 0; if ($visited_amp == 0) { $first = 1; $visited_amp = 1; } # Long label $label = preg_replace('/^A(\d+)_(.+)/', '$2', $label); $label = preg_replace('/_/', ' ', $label); # Short label $label = preg_replace('/^A(\d+)$/', 'Probe $1', $label); $ds_name[$id_amp] = "Amperage Probes"; $vlabel = "Ampere"; $title = $ds_name[$id_amp]; $opt[$id_amp] = "-X0 --lower-limit 0 --slope-mode --vertical-label \"$vlabel\" --title \"$def_title: $title\" "; if(isset($def[$id_amp])){ $def[$id_amp] .= rrd::def("var$KEY",$VAL['RRDFILE'], $VAL['DS'], "AVERAGE"); } else { $def[$id_amp] = rrd::def("var$KEY",$VAL['RRDFILE'], $VAL['DS'], "AVERAGE"); } $space = strlen($label) < 16 ? str_repeat(' ', 16 - strlen($label)) : ' '; $def[$id_amp] .= rrd::cdef("tier$KEY", "var$KEY,10,/"); $def[$id_amp] .= "AREA:tier$KEY#".$colors[$a]."b7::STACK "; $def[$id_amp] .= "AREA:tier$KEY#".$colors[$a]."bf::STACK "; $def[$id_amp] .= "AREA:tier$KEY#".$colors[$a]."c7::STACK "; $def[$id_amp] .= "AREA:tier$KEY#".$colors[$a]."cf::STACK "; $def[$id_amp] .= "AREA:tier$KEY#".$colors[$a]."d7::STACK "; $def[$id_amp] .= "AREA:tier$KEY#".$colors[$a]."df::STACK "; $def[$id_amp] .= "AREA:tier$KEY#".$colors[$a]."e7::STACK "; $def[$id_amp] .= "AREA:tier$KEY#".$colors[$a]."ef::STACK "; $def[$id_amp] .= "AREA:tier$KEY#".$colors[$a]."f7::STACK "; $def[$id_amp] .= "AREA:tier$KEY#".$colors[$a]."ff:\"$label$space\":STACK "; $a++; if ($first) { $def[$id_amp] .= rrd::cdef("sum$KEY", "var$KEY,0,+"); } else { $def[$id_amp] .= rrd::cdef("sum$KEY", "sum".($KEY-1).",var$KEY,+"); } $def[$id_amp] .= rrd::line1("sum$KEY", "#555555"); $def[$id_amp] .= rrd::gprint("var$KEY", array("LAST", "MAX", "AVERAGE"),"%6.1lf A last") ; } # VOLTAGE PROBE if (preg_match('/^V/', $label)) { # Long label $label = preg_replace('/^V(\d+)_(.+)/', '$2', $label); $label = preg_replace('/_/', ' ', $label); # Short label $label = preg_replace('/^V(\d+)$/', 'Probe $1', $label); $ds_name[$id_volt] = "Voltage Probes"; $vlabel = "Volts"; $title = $ds_name[$id_volt]; $opt[$id_volt] = "--slope-mode --vertical-label \"$vlabel\" --title \"$def_title: $title\" "; if(isset($def[$id_volt])){ $def[$id_volt] .= rrd::def("var$KEY", $VAL['RRDFILE'], $VAL['DS'],"AVERAGE"); } else { $def[$id_volt] = rrd::def("var$KEY",$VAL['RRDFILE'],$VAL['DS'],"AVERAGE"); } $def[$id_volt] .= rrd::line1("var$KEY", "#".$colors[$v++], rrd::cut($label,18) ) ; $def[$id_volt] .= rrd::gprint("var$KEY", array("LAST", "MAX", "AVERAGE"),"%8.2lf A"); } # FANS (RPMs) if (preg_match('/^F/', $label)) { # Long label $label = preg_replace('/^F(\d+)_(.+)/', '$2', $label); $label = preg_replace('/_/', ' ', $label); # Short label $label = preg_replace('/^F(\d+)$/', 'Probe $1', $label); $ds_name[$id_fan] = "Fan Probes"; $opt[$id_fan] = "-X0 --slope-mode --vertical-label \"RPMs\" --title \"$def_title: Fan Speeds\" "; if(isset($def[$id_fan])){ $def[$id_fan] .= rrd::def("var$KEY",$VAL['RRDFILE'],$VAL['DS'], "AVERAGE") ; } else { $def[$id_fan] = rrd::def("var$KEY",$VAL['RRDFILE'],$VAL['DS'], "AVERAGE") ; } $def[$id_fan] .= rrd::line1("var$KEY", "#".$colors[$f++], rrd::cut($label,18) ) ; $def[$id_fan] .= rrd::gprint("var$KEY", array("LAST", "MAX", "AVERAGE"), "%6.0lf RPM"); } # ENCLOSURE TEMPERATURES (Celsius) if (preg_match('/^E(?P.+?)_t(emp_)?(?P\d+)/', $label, $matches)) { $this_id = $matches['encl']; $probe_index = $matches['probe']; if ($enclosure_id != $this_id) { $e = 0; $id_enc++; $enclosure_id = $this_id; } # Label $label = "Probe $probe_index"; $ds_name[$id_enc] = "Enclosure $enclosure_id Temperatures"; $opt[$id_enc] = "--slope-mode --vertical-label \"Celsius\" --title \"$def_title: Enclosure $enclosure_id Temperatures\" "; if(isset($def[$id_enc])){ $def[$id_enc] .= rrd::def("var$KEY", $VAL['RRDFILE'],$VAL['DS'], "AVERAGE") ; } else { $def[$id_enc] = rrd::def("var$KEY", $VAL['RRDFILE'],$VAL['DS'], "AVERAGE") ; } $def[$id_enc] .= rrd::line1("var$KEY", "#".$colors[$e++], rrd::cut($label, 14) ); $def[$id_enc] .= rrd::gprint("var$KEY", array("LAST", "MAX", "AVERAGE"),"%6.1lf C"); } } } ?> pnp4nagios-0.6.16/share/pnp/templates.dist/check_nt_cpu.php0000664000000000000000000000123411662503006022362 0ustar rootroot pnp4nagios-0.6.16/share/pnp/templates.dist/check_local_load.php0000777000000000000000000000000011662503554025753 2check_load.phpustar rootrootpnp4nagios-0.6.16/share/pnp/templates.dist/check_apachestatus.php0000664000000000000000000001441711662503006023566 0ustar rootroot # pnp version >= 0.6.5 # # # from apache's scoreboard.h # #define SERVER_DEAD 0 # #define SERVER_STARTING 1 /* Server Starting up */ # #define SERVER_READY 2 /* Waiting for connection (or accept() lock) */ # #define SERVER_BUSY_READ 3 /* Reading a client request */ # #define SERVER_BUSY_WRITE 4 /* Processing a client request */ # #define SERVER_BUSY_KEEPALIVE 5 /* Waiting for more requests via keepalive */ # #define SERVER_BUSY_LOG 6 /* Logging the request */ # #define SERVER_BUSY_DNS 7 /* Looking up a hostname */ # #define SERVER_CLOSING 8 /* Closing the connection */ # #define SERVER_GRACEFUL 9 /* server is gracefully finishing request */ # #define SERVER_IDLE_KILL 10 /* Server is cleaning up idle children. */ # #define SERVER_NUM_STATUS 11 /* number of status settings */ # perfdata example: # Performance Data: 'Waiting for Connection'=90 'Starting Up'=0 'Reading Request'=10 'Sending Reply'=196 'Keepalive (read)'=360 'DNS Lookup'=0 'Closing Connection'=77 'Logging'=0 'Gracefully finishing'=0 'Idle cleanup'=0 'Open slot'=547 'Requests/sec'=119.0 'kB per sec'=8294.4KB 'kB per Request'=69.9KB # # first graph - workers that do smth, not just idling.. $ds_name[1]="Working slots"; $opt[1] = " --vertical-label \"Workers\" --title \"Apache Workers: working on $hostname / $servicedesc\" "; $opt[1] .= " --slope-mode "; $def[1] = rrd::def("var2",$RRDFILE[1],$DS[2],"AVERAGE"); #starting $def[1] .= rrd::cdef("negstarting","var2,-1,*"); #starting $def[1] .= rrd::def("var3",$RRDFILE[1],$DS[3],"AVERAGE"); #reading $def[1] .= rrd::cdef("negreading","var3,-1,*"); #reading $def[1] .= rrd::def("var4",$RRDFILE[1],$DS[4],"AVERAGE"); #reply $def[1] .= rrd::def("var6",$RRDFILE[1],$DS[6],"AVERAGE"); #DNS LOOKUP $def[1] .= rrd::cdef("negdns","var6,-1,*"); #DNS LOOKUP $def[1] .= rrd::def("var7",$RRDFILE[1],$DS[7],"AVERAGE"); #closing $def[1] .= rrd::cdef("negclosing","var7,-1,*"); #closing $def[1] .= rrd::def("var8",$RRDFILE[1],$DS[8],"AVERAGE"); #logging $def[1] .= rrd::cdef("neglogging","var8,-1,*"); #logging $def[1] .= rrd::area("negclosing","#b7ff9e","closing",true ); #closing $def[1] .= rrd::line1("negclosing","#2eae00"); $def[1] .= rrd::gprint("var7",array("LAST","MAX","AVERAGE"),"%7.0lf") ; $def[1] .= rrd::area("negstarting","#993300","starting"); #startung $def[1] .= rrd::gprint("var2",array("LAST","MAX","AVERAGE"),"%7.0lf"); $def[1] .= rrd::area("negreading","#001919","reading",true); #reading $def[1] .= rrd::gprint("var3",array("LAST","MAX","AVERAGE"),"%7.0lf") ; $def[1] .= rrd::area("negdns","#009900","DNS lookup",true); #dns lookup $def[1] .= rrd::gprint("var6",array("LAST","MAX","AVERAGE"),"%7.0lf") ; $def[1] .= rrd::area("neglogging","#ff0000","logging",true); #logging $def[1] .= rrd::gprint("var8",array("LAST","MAX","AVERAGE"),"%7.0lf") ; $def[1] .= rrd::area("var4","#6fb7ff","replying"); #replying $def[1] .= rrd::line1("var4","#0019ff",FALSE,FALSE); $def[1] .= rrd::gprint("var4",array("LAST","MAX","AVERAGE"),"%7.0lf") ; # second graph - idling workers #some idle actions like graceful shutdown, open slots & such $ds_name[2]="Idling slots"; $opt[2] = " --vertical-label \"Workers\" --title \"Apache Workers: idling on $hostname / $servicedesc\" "; $opt[2] .= " --slope-mode "; $def[2] = rrd::def("var2",$RRDFILE[1],$DS[5],"AVERAGE"); #keepalive (read) $def[2] .= rrd::def("var3",$RRDFILE[1],$DS[1],"AVERAGE"); #waiting $def[2] .= rrd::def("var4",$RRDFILE[1],$DS[10],"AVERAGE"); #idle cleanup $def[2] .= rrd::def("var5",$RRDFILE[1],$DS[9],"AVERAGE"); #gracefully finishing $def[2] .= rrd::area("var3","#ffe4c4","waiting for conn"); $def[2] .= rrd::line1("var3","#eb891d"); $def[2] .= rrd::gprint("var3",array("LAST","MAX","AVERAGE"),"%7.0lf") ;#TODO - add border lines like for finishing $def[2] .= rrd::area("var2","#503020","keepalive",true); #TODO - add border lines like for finishing $def[2] .= rrd::gprint("var2",array("LAST","MAX","AVERAGE"),"%7.0lf") ; $def[2] .= rrd::area("var4","#66cdaa","idle cleanup",true); $def[2] .= rrd::gprint("var4",array("LAST","MAX","AVERAGE"),"%7.0lf") ; $def[2] .= rrd::area("var5","#6fb7ff","gracefully finishing",true); $def[2] .= rrd::cdef("grline","var2,var3,var4,var5,+,+,+"); #line shouldn't be stacked over $def[2] .= rrd::line1("grline","#0019ff",FALSE,FALSE); $def[2] .= rrd::gprint("var5",array("LAST","MAX","AVERAGE"),"%7.0lf") ; #third graph - open slots count $ds_name[3]="Open slots"; $opt[3] = " --vertical-label \"Workers\" --title \"Apache open slots on $hostname / $servicedesc\" "; $opt[3] .= " --slope-mode "; $def[3] = rrd::def("var1",$RRDFILE[1],$DS[11],"AVERAGE"); $def[3] .= rrd::area("var1","#e0e0e0","open slots" ); $def[3] .= rrd::line1("var1","#858585"); $def[3] .= rrd::gprint("var1",array("LAST","MAX","AVERAGE"),"%7.0lf") ; #fourth graph - server's traffic total and per request $ds_name[4]="Apache Traffic"; $opt[4] = " --vertical-label \"Traffic\" -b 1024 --title \"Apache Traffic for $hostname / $servicedesc\" "; $opt[4] .= " --slope-mode "; $def[4] = rrd::def("var1",$RRDFILE[1],$DS[13],"AVERAGE"); $def[4] .= rrd::cdef("trbytes","var1,1024,*"); $def[4] .= rrd::def("var2",$RRDFILE[1],$DS[14],"AVERAGE"); $def[4] .= rrd::cdef("negperreq","var2,-1,*"); $def[4] .= "VDEF:totalbytes=trbytes,TOTAL "; $def[4] .= rrd::area("trbytes","#b0c0fb","throughput"); $def[4] .= rrd::line1("trbytes","#3c63ff"); $def[4] .= rrd::gprint("trbytes",array("LAST","MAX","AVERAGE"),"%7.2lf %sB/sec") ; $def[4] .= rrd::line2("negperreq","#00ff00","kB/request"); $def[4] .= rrd::gprint("var2",array("LAST","MAX","AVERAGE"),"%7.2lf %s$UNIT[14]") ; $def[4] .= "GPRINT:totalbytes:\"%3.0lf %sB total\\n\" "; #fifth graph - requests per sec ( rate is calculated by apache, time smoothed, very averaged, shouldn't be believed) $ds_name[5]="Apache requests"; $opt[5] = " --vertical-label \"Request/sec\" --title \"Apache request/sec for $hostname / $servicedesc\" "; $opt[5] .= " --slope-mode "; $def[5] = rrd::def("var1",$RRDFILE[1],$DS[12],"AVERAGE"); $def[5] .= rrd::area("var1","#b7ff9e","Requests / sec"); $def[5] .= rrd::line1("var1","#2eae00"); $def[5] .= rrd::gprint("var1",array("LAST","MAX","AVERAGE"),"%7.2lf %s") ; ?> pnp4nagios-0.6.16/share/pnp/templates.dist/check_mssql_health.php0000664000000000000000000005035111662503006023562 0ustar rootrootDS as $KEY=>$VAL) { $warning = ($VAL['WARN'] != "") ? $VAL['WARN'] : ""; $warnmin = ($VAL['WARN_MIN'] != "") ? $VAL['WARN_MIN'] : ""; $warnmax = ($VAL['WARN_MAX'] != "") ? $VAL['WARN_MAX'] : ""; $critical = ($VAL['CRIT'] != "") ? $VAL['CRIT'] : ""; $critmin = ($VAL['CRIT_MIN'] != "") ? $VAL['CRIT_MIN'] : ""; $critmax = ($VAL['CRIT_MAX'] != "") ? $VAL['CRIT_MAX'] : ""; $minimum = ($VAL['MIN'] != "") ? $VAL['MIN'] : ""; $maximum = ($VAL['MAX'] != "") ? $VAL['MAX'] : ""; if(preg_match('/^connection_time$/', $VAL['NAME'])) { $ds_name[$defcnt] = "Time to connect"; $opt[$defcnt] = "--vertical-label \"Seconds\" --title \"Time to establish a connection to $hostname\" "; $def[$defcnt] = ""; $def[$defcnt] .= rrd::def("connectiontime",$VAL['RRDFILE'],$VAL['DS'],"AVERAGE:reduce=LAST") ; $def[$defcnt] .= rrd::area("connectiontime","#111111"); $def[$defcnt] .= rrd::gprint("connectiontime",array("LAST", "MAX", "AVERAGE"),"%3.2lf Seconds") ; $defcnt++; } if(preg_match('/^cpu_busy$/', $VAL['NAME'])) { $ds_name[$defcnt] = "CPU Busy Time"; $opt[$defcnt] = "--vertical-label \"%\" --title \"CPU busy time on $hostname\" "; $def[$defcnt] = ""; $def[$defcnt] .= rrd::def("cpubusy",$VAL['RRDFILE'],$VAL['DS'],"AVERAGE:reduce=LAST") ; $def[$defcnt] .= rrd::cdef("ag","cpubusy,".$VAL['WARN'].",LE,cpubusy,0,GT,INF,UNKN,IF,UNKN,IF,ISINF,cpubusy,0,IF"); $def[$defcnt] .= rrd::cdef("ay","cpubusy,".$VAL['CRIT'].",LE,cpubusy,".$VAL['WARN'].",GT,INF,UNKN,IF,UNKN,IF,ISINF,cpubusy,0,IF"); $def[$defcnt] .= rrd::cdef("ar","cpubusy,100,LE,cpubusy,".$VAL['CRIT'].",GT,INF,UNKN,IF,UNKN,IF,ISINF,cpubusy,0,IF"); $def[$defcnt] .= rrd::area("ag","#$green"); $def[$defcnt] .= rrd::area("ay","#$yellow"); $def[$defcnt] .= rrd::area("ar","#$red"); $def[$defcnt] .= rrd::line1("cpubusy","#111111"); $def[$defcnt] .= rrd::gprint("cpubusy","LAST","CPU is busy for %3.2lf percent of the time\\n"); $defcnt++; } if(preg_match('/^io_busy$/', $VAL['NAME'])) { $ds_name[$defcnt] = "IO Busy Time"; $opt[$defcnt] = "--vertical-label \"%\" --title \"IO busy time on $hostname\" "; $def[$defcnt] = ""; $def[$defcnt] .= rrd::def("iobusy",$VAL['RRDFILE'],$VAL['DS'],"AVERAGE:reduce=LAST") ; $def[$defcnt] .= rrd::cdef("ag","iobusy,".$VAL['WARN'].",LE,iobusy,0,GT,INF,UNKN,IF,UNKN,IF,ISINF,iobusy,0,IF"); $def[$defcnt] .= rrd::cdef("ay","iobusy,".$VAL['CRIT'].",LE,iobusy,".$VAL['WARN'].",GT,INF,UNKN,IF,UNKN,IF,ISINF,iobusy,0,IF"); $def[$defcnt] .= rrd::cdef("ar","iobusy,100,LE,iobusy,".$VAL['CRIT'].",GT,INF,UNKN,IF,UNKN,IF,ISINF,iobusy,0,IF"); $def[$defcnt] .= rrd::area("ag","#$green"); $def[$defcnt] .= rrd::area("ay","#$yellow"); $def[$defcnt] .= rrd::area("ar","#$red"); $def[$defcnt] .= rrd::line1("iobusy","#111111"); $def[$defcnt] .= rrd::gprint("iobusy","LAST","IO is busy for %3.2lf percent of the time\\n"); $defcnt++; } if(preg_match('/^full_scans_per_sec$/', $VAL['NAME'])) { $ds_name[$defcnt] = "Full Table Scans / Sec"; $opt[$defcnt] = "--vertical-label \"scans / sec\" --title \"Full table scans / sec on $hostname\" "; $def[$defcnt] = ""; $def[$defcnt] .= rrd::def("fullscans",$VAL['RRDFILE'],$VAL['DS'],"AVERAGE:reduce=LAST"); $def[$defcnt] .= rrd::cdef("ag","fullscans,".$VAL['WARN'].",LE,fullscans,0,GT,INF,UNKN,IF,UNKN,IF,ISINF,fullscans,0,IF"); $def[$defcnt] .= rrd::cdef("ay","fullscans,".$VAL['CRIT'].",LE,fullscans,".$VAL['WARN'].",GT,INF,UNKN,IF,UNKN,IF,ISINF,fullscans,0,IF"); $def[$defcnt] .= rrd::cdef("ar","fullscans,INF,LE,fullscans,".$VAL['CRIT'].",GT,INF,UNKN,IF,UNKN,IF,ISINF,fullscans,0,IF"); $def[$defcnt] .= rrd::area("ag","#$green"); $def[$defcnt] .= rrd::area("ay","#$yellow"); $def[$defcnt] .= rrd::area("ar","#$red"); $def[$defcnt] .= rrd::line1("fullscans","#000000", "Full table sacns"); $def[$defcnt] .= rrd::gprint("fullscans",array("MAX", "AVERAGE", "LAST"),"%3.2lf"); $defcnt++; } if(preg_match('/^connected_users$/', $VAL['NAME'])) { $ds_name[$defcnt] = "Connected Users"; $opt[$defcnt] = "--vertical-label \"Users\" --title \"Users connected to $hostname\" "; $def[$defcnt] = ""; $def[$defcnt] .= rrd::def("users",$VAL['RRDFILE'],$VAL['DS'],"AVERAGE:reduce=LAST"); $def[$defcnt] .= rrd::cdef("ag","users,".$VAL['WARN'].",LE,users,0,GT,INF,UNKN,IF,UNKN,IF,ISINF,users,0,IF"); $def[$defcnt] .= rrd::cdef("ay","users,".$VAL['CRIT'].",LE,users,".$VAL['WARN'].",GT,INF,UNKN,IF,UNKN,IF,ISINF,users,0,IF"); $def[$defcnt] .= rrd::cdef("ar","users,INF,LE,users,".$VAL['CRIT'].",GT,INF,UNKN,IF,UNKN,IF,ISINF,users,0,IF"); $def[$defcnt] .= rrd::area("ag","#$green") ; $def[$defcnt] .= rrd::area("ay","#$yellow") ; $def[$defcnt] .= rrd::area("ar","#$red") ; $def[$defcnt] .= rrd::line1("users","#000000","connected users"); $def[$defcnt] .= rrd::gprint("users",array("LAST","MAX","AVERAGE"),"%.0lf"); $defcnt++; } if(preg_match('/^(.*)_transactions_per_sec/', $VAL['NAME'], $match)) { $dsname = $match[1]; if(empty($opt[1])){ $opt[1] = "--vertical-label \"Transactions/s\" -l0 --title \"Database transactions / sec\" "; } if(empty($def[1])){ $def[1] = ""; } $ds_name[1] = "Transactions Per Seconds "; $def[1] .= rrd::def ("var".$KEY, $VAL['RRDFILE'], $VAL['DS'], "AVERAGE") ; $def[1] .= rrd::line1 ("var".$KEY, rrd::color($KEY), rrd::cut($dsname, 12) ) ; $def[1] .= rrd::gprint ("var".$KEY, array("LAST","MAX","AVERAGE"), "%3.6lf %S" ); } if(preg_match('/^latch_waits_per_sec$/', $VAL['NAME'])) { $ds_name[$defcnt] = "Latch Waits / Sec"; $opt[$defcnt] = "--vertical-label \"waits / sec\" --title \"Latch waits / sec on $hostname\" "; $def[$defcnt] = ""; $def[$defcnt] .= rrd::def("waits",$VAL['RRDFILE'],$VAL['DS'],"AVERAGE:reduce=LAST"); $def[$defcnt] .= rrd::cdef("ag","waits,".$VAL['WARN'].",LE,waits,0,GT,INF,UNKN,IF,UNKN,IF,ISINF,waits,0,IF"); $def[$defcnt] .= rrd::cdef("ay","waits,".$VAL['CRIT'].",LE,waits,".$VAL['WARN'].",GT,INF,UNKN,IF,UNKN,IF,ISINF,waits,0,IF"); $def[$defcnt] .= rrd::cdef("ar","waits,INF,LE,waits,".$VAL['CRIT'].",GT,INF,UNKN,IF,UNKN,IF,ISINF,waits,0,IF"); $def[$defcnt] .= rrd::area("ag","#$green"); $def[$defcnt] .= rrd::area("ay","#$yellow"); $def[$defcnt] .= rrd::area("ar","#$red"); $def[$defcnt] .= rrd::line1("waits","#000000", "waits/s"); $def[$defcnt] .= rrd::gprint("waits",array("MAX","AVERAGE","LAST"),"%3.2lf"); $defcnt++; } if(preg_match('/^latch_avg_wait_time$/', $VAL['NAME'])) { $ds_name[$defcnt] = "Latch Wait Time"; $opt[$defcnt] = "--vertical-label \"msec\" --title \"Latch avg wait time on $hostname\" "; $def[$defcnt] = ""; $def[$defcnt] .= rrd::def("waittime",$VAL['RRDFILE'],$VAL['DS'],"AVERAGE:reduce=LAST"); $def[$defcnt] .= rrd::cdef("ag","waittime,".$VAL['WARN'].",LE,waittime,0,GT,INF,UNKN,IF,UNKN,IF,ISINF,waittime,0,IF"); $def[$defcnt] .= rrd::cdef("ay","waittime,".$VAL['CRIT'].",LE,waittime,".$VAL['WARN'].",GT,INF,UNKN,IF,UNKN,IF,ISINF,waittime,0,IF"); $def[$defcnt] .= rrd::cdef("ar","waittime,INF,LE,waittime,".$VAL['CRIT'].",GT,INF,UNKN,IF,UNKN,IF,ISINF,waittime,0,IF"); $def[$defcnt] .= rrd::area("ag","#$green") ; $def[$defcnt] .= rrd::area("ay","#$yellow") ; $def[$defcnt] .= rrd::area("ar","#$red") ; $def[$defcnt] .= rrd::line1("waittime","#000000"); $def[$defcnt] .= rrd::gprint("waittime",array("MAX", "AVERAGE", "LAST"),"%3.2lf"); $defcnt++; } if(preg_match('/^sql_initcompilations_per_sec$/', $VAL['NAME'])) { $ds_name[$defcnt] = "Initial Compilations"; $opt[$defcnt] = "--vertical-label \"initcomps/s\" --title \"Initial compilations / sec on $hostname\" "; $def[$defcnt] = ""; $def[$defcnt] .= rrd::def("comps",$VAL['RRDFILE'],$VAL['DS'],"AVERAGE:reduce=LAST"); $def[$defcnt] .= rrd::cdef("ag","comps,".$VAL['WARN'].",LE,comps,0,GT,INF,UNKN,IF,UNKN,IF,ISINF,comps,0,IF"); $def[$defcnt] .= rrd::cdef("ay","comps,".$VAL['CRIT'].",LE,comps,".$VAL['WARN'].",GT,INF,UNKN,IF,UNKN,IF,ISINF,comps,0,IF"); $def[$defcnt] .= rrd::cdef("ar","comps,INF,LE,comps,".$VAL['CRIT'].",GT,INF,UNKN,IF,UNKN,IF,ISINF,comps,0,IF"); $def[$defcnt] .= rrd::area("ag","#$green") ; $def[$defcnt] .= rrd::area("ay","#$yellow") ; $def[$defcnt] .= rrd::area("ar","#$red") ; $def[$defcnt] .= rrd::line1("comps","#000000","Compilations"); $def[$defcnt] .= rrd::gprint("comps",array("MAX", "AVERAGE", "LAST"),"%3.2lf/s"); $defcnt++; } if(preg_match('/^sql_recompilations_per_sec$/', $VAL['NAME'])) { $ds_name[$defcnt] = "Re-Compilations"; $opt[$defcnt] = "--vertical-label \"re-comps/s\" --title \"Re-Compilations / sec on $hostname\" "; $def[$defcnt] = ""; $def[$defcnt] .= rrd::def("comps",$VAL['RRDFILE'],$VAL['DS'],"AVERAGE:reduce=LAST"); $def[$defcnt] .= rrd::cdef("ag","comps,".$VAL['WARN'].",LE,comps,0,GT,INF,UNKN,IF,UNKN,IF,ISINF,comps,0,IF"); $def[$defcnt] .= rrd::cdef("ay","comps,".$VAL['CRIT'].",LE,comps,".$VAL['WARN'].",GT,INF,UNKN,IF,UNKN,IF,ISINF,comps,0,IF"); $def[$defcnt] .= rrd::cdef("ar","comps,INF,LE,comps,".$VAL['CRIT'].",GT,INF,UNKN,IF,UNKN,IF,ISINF,comps,0,IF"); $def[$defcnt] .= rrd::area("ag","#$green"); $def[$defcnt] .= rrd::area("ay","#$yellow"); $def[$defcnt] .= rrd::area("ar","#$red"); $def[$defcnt] .= rrd::line1("comps","#000000","Re-Compilations"); $def[$defcnt] .= rrd::gprint("comps",array("MAX", "AVERAGE", "LAST"),"%3.2lf/s"); $defcnt++; } if(preg_match('/^batch_requests_per_sec$/', $VAL['NAME'])) { $ds_name[$defcnt] = "Batch Requests"; $opt[$defcnt] = "--vertical-label \"batchreqs/s\" --title \"Batch requests / sec on $hostname\" "; $def[$defcnt] = ""; $def[$defcnt] .= rrd::def("breqs",$VAL['RRDFILE'],$VAL['DS'],"AVERAGE:reduce=LAST"); $def[$defcnt] .= rrd::cdef("ag","breqs,".$VAL['WARN'].",LE,breqs,0,GT,INF,UNKN,IF,UNKN,IF,ISINF,breqs,0,IF"); $def[$defcnt] .= rrd::cdef("ay","breqs,".$VAL['CRIT'].",LE,breqs,".$VAL['WARN'].",GT,INF,UNKN,IF,UNKN,IF,ISINF,breqs,0,IF"); $def[$defcnt] .= rrd::cdef("ar","breqs,INF,LE,breqs,".$VAL['CRIT'].",GT,INF,UNKN,IF,UNKN,IF,ISINF,breqs,0,IF"); $def[$defcnt] .= rrd::area("ag","#$green") ; $def[$defcnt] .= rrd::area("ay","#$yellow") ; $def[$defcnt] .= rrd::area("ar","#$red") ; $def[$defcnt] .= rrd::line1("breqs","#000000","Batch Requests"); $def[$defcnt] .= rrd::gprint("breqs",array("LAST","AVERAGE","MAX"),"%3.2lf"); $defcnt++; } if(preg_match('/^checkpoint_pages_per_sec$/', $VAL['NAME'])) { $ds_name[$defcnt] = "Checkpoint Pages"; $opt[$defcnt] = "--vertical-label \"pages/s\" --title \"Flushed pages / sec on $hostname\" "; $def[$defcnt] = ""; $def[$defcnt] .= rrd::def("pages",$VAL['RRDFILE'],$VAL['DS'],"AVERAGE:reduce=LAST"); $def[$defcnt] .= rrd::cdef("ag","pages,".$VAL['WARN'].",LE,pages,0,GT,INF,UNKN,IF,UNKN,IF,ISINF,pages,0,IF"); $def[$defcnt] .= rrd::cdef("ay","pages,".$VAL['CRIT'].",LE,pages,".$VAL['WARN'].",GT,INF,UNKN,IF,UNKN,IF,ISINF,pages,0,IF"); $def[$defcnt] .= rrd::cdef("ar","pages,INF,LE,pages,".$VAL['CRIT'].",GT,INF,UNKN,IF,UNKN,IF,ISINF,pages,0,IF"); $def[$defcnt] .= rrd::area("ag","#$green") ; $def[$defcnt] .= rrd::area("ay","#$yellow") ; $def[$defcnt] .= rrd::area("ar","#$red") ; $def[$defcnt] .= rrd::line1("pages","#000000", "pages flushed"); $def[$defcnt] .= rrd::gprint("pages",array("LAST","AVERAGE","MAX"),"%3.2lf"); $defcnt++; } if(preg_match('/^free_list_stalls_per_sec$/', $VAL['NAME'])) { $ds_name[$defcnt] = "Free List Stalls"; $opt[$defcnt] = "--vertical-label \"stalls/s\" --title \"Free list stalls / sec on $hostname\" "; $def[$defcnt] = ""; $def[$defcnt] .= rrd::def("stalls",$VAL['RRDFILE'],$VAL['DS'],"AVERAGE:reduce=LAST"); $def[$defcnt] .= rrd::cdef("ag","stalls,".$VAL['WARN'].",LE,stalls,0,GT,INF,UNKN,IF,UNKN,IF,ISINF,stalls,0,IF"); $def[$defcnt] .= rrd::cdef("ay","stalls,".$VAL['CRIT'].",LE,stalls,".$VAL['WARN'].",GT,INF,UNKN,IF,UNKN,IF,ISINF,stalls,0,IF"); $def[$defcnt] .= rrd::cdef("ar","stalls,INF,LE,stalls,".$VAL['CRIT'].",GT,INF,UNKN,IF,UNKN,IF,ISINF,stalls,0,IF"); $def[$defcnt] .= rrd::area("ag","#$green"); $def[$defcnt] .= rrd::area("ay","#$yellow"); $def[$defcnt] .= rrd::area("ar","#$red"); $def[$defcnt] .= rrd::line1("stalls","#000000", "free list stalls"); $def[$defcnt] .= rrd::gprint("stalls",array("LAST", "AVERAGE","MAX"),"%3.2lf"); $defcnt++; } if(preg_match('/^lazy_writes_per_sec$/', $VAL['NAME'])) { $ds_name[$defcnt] = "Lazy Writes"; $opt[$defcnt] = "--vertical-label \"lazyw/s\" --title \"Lazy writes / sec on $hostname\" "; $def[$defcnt] = ""; $def[$defcnt] .= rrd::def("lazyw",$VAL['RRDFILE'],$VAL['DS'],"AVERAGE:reduce=LAST"); $def[$defcnt] .= rrd::cdef("ag","lazyw,".$VAL['WARN'].",LE,lazyw,0,GT,INF,UNKN,IF,UNKN,IF,ISINF,lazyw,0,IF"); $def[$defcnt] .= rrd::cdef("ay","lazyw,".$VAL['CRIT'].",LE,lazyw,".$VAL['WARN'].",GT,INF,UNKN,IF,UNKN,IF,ISINF,lazyw,0,IF"); $def[$defcnt] .= rrd::cdef("ar","lazyw,INF,LE,lazyw,".$VAL['CRIT'].",GT,INF,UNKN,IF,UNKN,IF,ISINF,lazyw,0,IF"); $def[$defcnt] .= rrd::area("ag","#$green") ; $def[$defcnt] .= rrd::area("ay","#$yellow") ; $def[$defcnt] .= rrd::area("ar","#$red"); $def[$defcnt] .= rrd::line1("lazyw","#000000"); $def[$defcnt] .= rrd::gprint("lazyw",array("LAST", "AVERAGE","MAX"),"%3.4lf"); $defcnt++; } if(preg_match('/^page_life_expectancy$/', $VAL['NAME'])) { $ds_name[$defcnt] = "Page Life Expectancy"; $opt[$defcnt] = "--vertical-label \"s\" --title \"Page life expectancy on $hostname\" "; $def[$defcnt] = ""; $def[$defcnt] .= rrd::def("lifeexp",$VAL['RRDFILE'],$VAL['DS'],"AVERAGE:reduce=LAST") ; $def[$defcnt] .= rrd::cdef("ar","lifeexp,".$VAL['CRIT_MIN'].",LE,lifeexp,0,GT,INF,UNKN,IF,UNKN,IF,ISINF,lifeexp,0,IF"); $def[$defcnt] .= rrd::cdef("ay","lifeexp,".$VAL['WARN_MIN'].",LE,lifeexp,".$VAL['CRIT_MIN'].",GT,INF,UNKN,IF,UNKN,IF,ISINF,lifeexp,0,IF"); $def[$defcnt] .= rrd::cdef("ag","lifeexp,INF,LE,lifeexp,".$VAL['WARN_MIN'].",GT,INF,UNKN,IF,UNKN,IF,ISINF,lifeexp,0,IF"); $def[$defcnt] .= rrd::area("ag","#$green") ; $def[$defcnt] .= rrd::area("ay","#$yellow") ; $def[$defcnt] .= rrd::area("ar","#$red") ; $def[$defcnt] .= rrd::line1("lifeexp","#000000","Page Live"); $def[$defcnt] .= rrd::gprint("lifeexp",array("LAST", "AVERAGE", "MIN"),"%3.2lf") ; $defcnt++; } if(preg_match('/^total_server_memory$/', $VAL['NAME'])) { $ds_name[$defcnt] = "Total Server memory"; $opt[$defcnt] = "--vertical-label \"Bytes\" --title \"Total sql server memory on $hostname\" "; $def[$defcnt] = ""; $def[$defcnt] .= rrd::def("mem",$VAL['RRDFILE'],$VAL['DS'],"AVERAGE:reduce=LAST"); $def[$defcnt] .= rrd::area("mem","#c3c3c3", "Memory"); $def[$defcnt] .= rrd::line1("mem","#111111"); $def[$defcnt] .= rrd::gprint("mem",array("MAX","AVERAGE", "LAST"),"%.1lf %SB") ; $defcnt++; } if(preg_match('/^buffer_cache_hit_ratio$/', $VAL['NAME'])) { $ds_name[$defcnt] = "Buffer Cache Hit Ratio"; $opt[$defcnt] = "--vertical-label \"%\" --title \"Buffer cache hit ratio on $hostname\" "; $def[$defcnt] = ""; $def[$defcnt] .= rrd::def("bufcahitrat",$VAL['RRDFILE'],$VAL['DS'],"AVERAGE:reduce=LAST") ; $def[$defcnt] .= rrd::cdef("ar","bufcahitrat,".$VAL['CRIT_MIN'].",LE,bufcahitrat,0,GT,INF,UNKN,IF,UNKN,IF,ISINF,bufcahitrat,0,IF"); $def[$defcnt] .= rrd::cdef("ay","bufcahitrat,".$VAL['WARN_MIN'].",LE,bufcahitrat,".$VAL['CRIT_MIN'].",GT,INF,UNKN,IF,UNKN,IF,ISINF,bufcahitrat,0,IF"); $def[$defcnt] .= rrd::cdef("ag","bufcahitrat,100,LE,bufcahitrat,".$VAL['WARN_MIN'].",GT,INF,UNKN,IF,UNKN,IF,ISINF,bufcahitrat,0,IF"); $def[$defcnt] .= rrd::area("ag","#$green") ; $def[$defcnt] .= rrd::area("ay","#$yellow") ; $def[$defcnt] .= rrd::area("ar","#$red") ; $def[$defcnt] .= rrd::line1("bufcahitrat","#000000:"); $def[$defcnt] .= rrd::gprint("bufcahitrat","LAST","Hit ratio is %3.2lf percent\\n") ; $defcnt++; } if(preg_match('/^(.*)_lock_timeouts_per_sec/', $VAL['NAME'], $match)) { $dsname = $match[1]; if(empty($opt[1])){ $opt[1] = "--vertical-label \"Lock timeouts/s\" -l0 --title \"Locks timeouts / sec\" "; } if(empty($def[1])){ $def[1] = ""; } $ds_name[1] = "Lock Timeouts Per Second "; $def[1] .= rrd::def ("var".$KEY, $VAL['RRDFILE'], $VAL['DS'], "AVERAGE") ; $def[1] .= rrd::line1 ("var".$KEY, rrd::color($KEY), rrd::cut($dsname, 12) ) ; $def[1] .= rrd::gprint ("var".$KEY, array("LAST","MAX","AVERAGE"), "%3.6lf" ); } if(preg_match('/^(.*)_lock_waits_per_sec/', $VAL['NAME'], $match)) { $dsname = $match[1]; if(!defined($opt[1])){ $opt[1] = "--vertical-label \"Lockwaity/s\" -l0 --title \"Lockwaits / sec\" "; } if(empty($def[1])){ $def[1] = ""; } $ds_name[1] = "Lockwaits / sec "; $def[1] .= rrd::def ("var".$KEY, $VAL['RRDFILE'], $VAL['DS'], "AVERAGE") ; $def[1] .= rrd::line1 ("var".$KEY, rrd::color($KEY), rrd::cut($dsname, 12) ) ; $def[1] .= rrd::gprint ("var".$KEY, array("LAST","MAX","AVERAGE"), "%3.6lf" ); } if(preg_match('/^(.*)_deadlocks_per_sec/', $VAL['NAME'], $match)) { $dsname = $match[1]; if(!defined($opt[1])){ $opt[1] = "--vertical-label \"Deadlocks/s\" -l0 --title \"Deadlocks / sec\" "; } if(empty($def[1])){ $def[1] = ""; } $ds_name[1] = "Deadlocks / sec "; $def[1] .= rrd::def ("var".$KEY, $VAL['RRDFILE'], $VAL['DS'], "AVERAGE") ; $def[1] .= rrd::line1 ("var".$KEY, rrd::color($KEY), rrd::cut($dsname, 12) ) ; $def[1] .= rrd::gprint ("var".$KEY, array("LAST","MAX","AVERAGE"), "%3.6lf" ); } if(preg_match('/^db_(.*)_free_pct/', $VAL['NAME'], $match)) { $dsname = $match[1]; if(!defined($opt[1])){ $opt[1] = "--vertical-label \"%\" -l0 --title \"DB Freespace %\" "; } if(empty($def[1])){ $def[1] = ""; } $ds_name[1] = "DB Freespace %"; $def[1] .= rrd::def ("var".$KEY, $VAL['RRDFILE'], $VAL['DS'], "AVERAGE") ; $def[1] .= rrd::line1 ("var".$KEY, rrd::color($KEY), rrd::cut($dsname, 12) ) ; $def[1] .= rrd::gprint ("var".$KEY, array("LAST","MAX","AVERAGE"), "%3.2lf%%" ); } if(preg_match('/^db_(.*)_free$/', $VAL['NAME'], $match)) { $dsname = $match[1]; if(empty($opt[2])){ $opt[2] = "--vertical-label \"MB\" --title \"DB Freespace MB\" "; } if(empty($def[2])){ $def[2] = ""; } $ds_name[2] = "DB Freespace MB"; $def[2] .= rrd::def ("var".$KEY, $VAL['RRDFILE'], $VAL['DS'], "AVERAGE") ; $def[2] .= rrd::line1 ("var".$KEY, rrd::color($KEY), rrd::cut($dsname, 12) ) ; $def[2] .= rrd::gprint ("var".$KEY, array("LAST","MAX","AVERAGE"), "%3.2lf %SM" ); } } ?> pnp4nagios-0.6.16/share/pnp/templates.dist/check_iftraffic_counter.php0000664000000000000000000000135311662503006024570 0ustar rootroot pnp4nagios-0.6.16/share/pnp/templates.dist/check_fping.php0000664000000000000000000000420611662503006022177 0ustar rootroot pnp4nagios-0.6.16/share/pnp/templates.dist/check_disk.php0000664000000000000000000000372411662503006022032 0ustar rootrootDS as $KEY=>$VAL) { # set initial values $fmt = '%7.3lf'; $pct = ''; $upper = ""; $maximum = ""; $divis = 1; $return = '\n'; $unit = "B"; $label = $unit; if ($VAL['UNIT'] != "") { $unit = $VAL['UNIT']; $label = $unit; if ($VAL['UNIT'] == "%%") { $label = '%'; $fmt = '%5.1lf'; $pct = '%'; } } if ($VAL['MAX'] != "") { # adjust value and unit, details in .../helpers/pnp.php $max = pnp::adjust_unit( $VAL['MAX'].$unit,1024,$fmt ); $upper = "-u $max[1] "; $maximum = "of $max[1] $max[2]$pct used"; $label = $max[2]; $divis = $max[3]; $return = ''; } $ds_name[$KEY] = str_replace("_","/",$VAL['NAME']); # set graph labels $opt[$KEY] = "--vertical-label $label -l 0 $upper --title \"Filesystem $ds_name[$KEY]\" "; # Graph Definitions $def[$KEY] = rrd::def( "var1", $VAL['RRDFILE'], $VAL['DS'], "AVERAGE" ); # "normalize" graph values $def[$KEY] .= rrd::cdef( "v_n","var1,$divis,/"); $def[$KEY] .= rrd::area( "v_n", "#c6c6c6", $ds_name[$KEY] ); $def[$KEY] .= rrd::line1( "v_n", "#003300" ); # show values in legend $def[$KEY] .= rrd::gprint( "v_n", "LAST", "$fmt $label$pct $maximum "); $def[$KEY] .= rrd::gprint( "v_n", "AVERAGE", "$fmt $label$pct avg used $return"); # create max line and legend if ($VAL['MAX'] != "") { $def[$KEY] .= rrd::gprint( "v_n", "MAX", "$fmt $label$pct max used \\n" ); $def[$KEY] .= rrd::hrule( $max[1], "#003300", "Size of FS $max[0] \\n"); } # create warning line and legend if ($VAL['WARN'] != "") { $warn = pnp::adjust_unit( $VAL['WARN'].$unit,1024,$fmt ); $def[$KEY] .= rrd::hrule( $warn[1], "#ffff00", "Warning on $warn[0] \\n" ); } # create critical line and legend if ($VAL['CRIT'] != "") { $crit = pnp::adjust_unit( $VAL['CRIT'].$unit,1024,$fmt ); $def[$KEY] .= rrd::hrule( $crit[1], "#ff0000", "Critical on $crit[0]\\n" ); } } ?> pnp4nagios-0.6.16/share/pnp/templates.dist/check_local_disk.php0000777000000000000000000000000011662503554026001 2check_disk.phpustar rootrootpnp4nagios-0.6.16/share/pnp/templates.dist/check_oracle_health_tablespace-usage.php0000664000000000000000000000243011662503006027150 0ustar rootroot pnp4nagios-0.6.16/share/pnp/templates.dist/check_oracle_health_redo-io-traffic.php0000664000000000000000000000073411662503006026722 0ustar rootroot pnp4nagios-0.6.16/share/pnp/templates.dist/check_ping_tick.php0000664000000000000000000000316011662503006023041 0ustar rootroot pnp4nagios-0.6.16/share/pnp/templates.dist/check_swap.php0000664000000000000000000000153311662503006022046 0ustar rootroot pnp4nagios-0.6.16/share/pnp/templates.dist/check_dell_bladechassis.php0000664000000000000000000000755611662503006024534 0ustar rootroot pnp4nagios-0.6.16/share/pnp/templates.dist/check_nwstat_ofiles.php0000664000000000000000000000172611662503006023761 0ustar rootroot pnp4nagios-0.6.16/share/pnp/templates.dist/check_nwstat_LOAD1.php0000777000000000000000000000000011662503554027262 2check_nwstat_LOAD.phpustar rootrootpnp4nagios-0.6.16/share/pnp/templates.dist/response.php0000664000000000000000000000100611662503006021570 0ustar rootroot pnp4nagios-0.6.16/share/pnp/templates.dist/check_hp_bladechassis.php0000664000000000000000000000205611662503006024211 0ustar rootroot pnp4nagios-0.6.16/share/pnp/templates.dist/check_oracle_connection-time.php0000664000000000000000000000102711662503006025512 0ustar rootroot pnp4nagios-0.6.16/share/pnp/templates.dist/check_oracle_health_pga-in-memory-sort-ratio.php0000664000000000000000000000077311662503006030535 0ustar rootroot pnp4nagios-0.6.16/share/pnp/templates.dist/check_nwstat_LOAD15.php0000777000000000000000000000000011662503554027347 2check_nwstat_LOAD.phpustar rootrootpnp4nagios-0.6.16/share/pnp/templates.dist/check_dns.php0000664000000000000000000000123311662503006021655 0ustar rootroot pnp4nagios-0.6.16/share/pnp/templates.dist/check_nwstat_LOAD5.php0000777000000000000000000000000011662503554027266 2check_nwstat_LOAD.phpustar rootrootpnp4nagios-0.6.16/share/pnp/templates.dist/check_nt_disk.php0000664000000000000000000000144711662503006022533 0ustar rootroot pnp4nagios-0.6.16/share/pnp/templates.dist/check_multi.php0000664000000000000000000000157411662503006022233 0ustar rootroot pnp4nagios-0.6.16/share/pnp/templates.dist/check_esx3.php0000664000000000000000000000616211662503006021761 0ustar rootroot Contributor(s): Joerg Linge For direct contact with any of the op5 developers send a mail to dev@op5.com Discussions are directed to the mailing list op5-users@op5.com, see http://lists.op5.com/mailman/listinfo/op5-users This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation. 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 . Requires: pnp4nagios 0.4.14+ enable_recursive_template_search enabled in configfile check_esx3.pl from http://git.op5.org/git/?p=nagios/op5plugins.git;a=summary */ $color_list = array( 1 => "#ff77ee", // Purple 2 => "#fed409", // Yellow 3 => "#007dd0", // Blue 4 => "#ee0a04", // Red 5 => "#56a901", // Green 6 => "#ff6600", // Orange 7 => "#a4a4a4", // Grey 8 => "#336633" // darker green ); $opt[1] = ''; $def[1] = ''; $filled = 0; $base = "1024"; $cdef = ""; $vlabel = ""; // Specific settings based on first DataSource, if we want to customize it. switch ($NAME[1]) { case "cpu_usage": $vlabel = "Percent"; $opt[1] .= "--lower-limit=0 --upper-limit=105 "; break; case "mem_usage": $vlabel = "Percent"; $opt[1] .= "--lower-limit=0 --upper-limit=105 "; break; case "net_receive": $vlabel = "Kb/sec"; break; case "cpu_usagemhz": $vlabel = "CPU Usage"; $filled = 1; break; default: break; } $opt[1] .= " --imgformat=PNG --title=\" $hostname / $servicedesc\" --base=$base --vertical-label=\"$vlabel\" --slope-mode "; $opt[1] .= "--watermark=\"http://www.op5.com template: $TEMPLATE[1]\" "; $opt[1] .= "--units-exponent=0 "; for ($i = 1; $i <= count($DS); $i++) { $def[1] .= "DEF:ds$i=$rrdfile:$DS[$i]:AVERAGE " ; $def[1] .= "CDEF:var$i=ds$i "; if (isset($color)) { $color_list = $color; } /* If we have few datasources we fill the area below with a semitransparent version of basecolor This makes the graph look more "modern" */ if ($filled || count($DS) <= 3) { $def[1] .= "AREA:var$i". $color_list[$i] . "32 "; } $def[1] .= "LINE1:var$i" . $color_list[$i] . "FF:\"$NAME[$i]\t\" "; $def[1] .= "GPRINT:var$i:LAST:\"Cur\\:%8.2lf $UNIT[$i]\" "; $def[1] .= "GPRINT:var$i:AVERAGE:\"Avg\\:%8.2lf $UNIT[$i]\" "; $def[1] .= "GPRINT:var$i:MAX:\"Max\\:%8.2lf $UNIT[$i]\\n\" "; } for ($i = 1; $i <= count($DS); $i++) { if ($UNIT[$i] == "%%") { $UNIT[$i] = "%"; } if (isset($WARN[$i]) && $WARN[$i] != "") { $def[1] .= "HRULE:$WARN[$i]#FFFF00:\"Warning ($NAME[$i])\: " . $WARN[$i] . " " . $UNIT[$i] . " \\n\" " ; } if (isset($CRIT[$i]) && $CRIT[$i] != "") { $def[1] .= "HRULE:$CRIT[$i]#FF0000:\"Critical ($NAME[$i])\: " . $CRIT[$i] . " " . $UNIT[$i] . " \\n\" " ; } } ?> pnp4nagios-0.6.16/share/pnp/templates.dist/check_http.php0000664000000000000000000000211111662503006022044 0ustar rootroot pnp4nagios-0.6.16/share/pnp/templates.dist/check_nt_mem.php0000664000000000000000000000127011662503006022351 0ustar rootroot pnp4nagios-0.6.16/share/pnp/templates.dist/nagiostats.php0000664000000000000000000000437411662503006022121 0ustar rootrootDS as $KEY=>$VAL) { if(preg_match('/(.*)LAT$/', $VAL['NAME'], $matches)){ $i++; $label = ucfirst(strtolower($matches[1])); $def[0] .= rrd::def ("var$KEY", $VAL['RRDFILE'], $VAL['DS'], "AVERAGE"); $def[0] .= rrd::cdef ("var_sec$KEY", "var$KEY,1000,/"); $def[0] .= rrd::line1 ("var_sec$KEY", rrd::color($i), rrd::cut($label,10) ); $def[0] .= rrd::gprint ("var_sec$KEY", array("LAST","MAX","AVERAGE"), "%8.2lf"); } } $opt[1] = '--title "Service Stats"'; $ds_name[1] = "Service Stats"; $def[1] = ""; $i = 0; foreach ($this->DS as $KEY=>$VAL) { if(preg_match('/^NUMSVC(.*)$/', $VAL['NAME'], $matches)){ $i++; $label = ucfirst(strtolower($matches[1])); $def[1] .= rrd::def ("var$KEY", $VAL['RRDFILE'], $VAL['DS'], "AVERAGE"); $def[1] .= rrd::line1 ("var$KEY", rrd::color($i), rrd::cut($label,10) ); $def[1] .= rrd::gprint ("var$KEY", array("LAST","MAX","AVERAGE"), "%8.2lf"); } } $opt[2] = '--title "Host Stats"'; $ds_name[2] = "Host Stats"; $def[2] = ""; $i = 0; foreach ($this->DS as $KEY=>$VAL) { if(preg_match('/^NUMHST(.*)$/', $VAL['NAME'], $matches)){ $i++; $label = ucfirst(strtolower($matches[1])); $def[2] .= rrd::def ("var$KEY", $VAL['RRDFILE'], $VAL['DS'], "AVERAGE"); $def[2] .= rrd::line1 ("var$KEY", rrd::color($i), rrd::cut($label,10) ); $def[2] .= rrd::gprint ("var$KEY", array("LAST","MAX","AVERAGE"), "%8.2lf"); } } $opt[3] = '--title "Check Execution Time"'; $ds_name[3] = "Execution Time"; $def[3] = ""; $i = 0; foreach ($this->DS as $KEY=>$VAL) { if(preg_match('/(.*)EXT$/', $VAL['NAME'], $matches)){ $i++; $label = ucfirst(strtolower($matches[1])); $def[3] .= rrd::def ("var$KEY", $VAL['RRDFILE'], $VAL['DS'], "AVERAGE"); $def[3] .= rrd::cdef ("var_sec$KEY", "var$KEY,1000,/"); $def[3] .= rrd::line1 ("var_sec$KEY", rrd::color($i), rrd::cut($label,10) ); $def[3] .= rrd::gprint ("var_sec$KEY", array("LAST","MAX","AVERAGE"), "%8.2lf"); } } ?> pnp4nagios-0.6.16/share/pnp/templates.dist/check_nwstat_CONNS.php0000664000000000000000000000174011662503006023354 0ustar rootroot pnp4nagios-0.6.16/share/pnp/templates.dist/check_nwstat_LOAD.php0000664000000000000000000000171411662503006023214 0ustar rootroot pnp4nagios-0.6.16/share/pnp/templates.dist/check_multi_nagiostats.php0000664000000000000000000001045311662503006024463 0ustar rootroot pnp4nagios-0.6.16/share/pnp/templates.dist/check_tcp.php0000777000000000000000000000000011662503554024232 2response.phpustar rootrootpnp4nagios-0.6.16/share/pnp/templates.dist/check_oracle_health_connection-time.php0000664000000000000000000000074411662503006027044 0ustar rootroot pnp4nagios-0.6.16/share/pnp/templates.dist/check_icmp.php0000777000000000000000000000000011662503554024630 2check_ping.phpustar rootrootpnp4nagios-0.6.16/share/pnp/templates.dist/check_users.php0000664000000000000000000000120411662503006022230 0ustar rootroot pnp4nagios-0.6.16/share/pnp/templates.dist/check_snmp_int.php0000664000000000000000000000154611662503006022727 0ustar rootrootMACRO['TIMET'] != ""){ $def[1] .= "VRULE:".$this->MACRO['TIMET']."#000000:\"Last Service Check \\n\" "; } ?> pnp4nagios-0.6.16/share/pnp/templates.dist/check_load.php0000664000000000000000000000160611662503006022014 0ustar rootroot pnp4nagios-0.6.16/share/pnp/templates.dist/check-host-alive.php0000777000000000000000000000000011662503554025671 2check_ping.phpustar rootrootpnp4nagios-0.6.16/share/pnp/templates.dist/check_gearman.php0000664000000000000000000000222411662503006022504 0ustar rootrootDS as $KEY=>$VAL) { if(preg_match('/(.*)_([^_].*)$/',$VAL['LABEL'],$matches)){ $queue = $matches[1]; $state = $matches[2]; if($state == "waiting"){ $i++; $opt[$i]=''; $def[$i]=''; } $opt[$i] = "-l0 --title \"Gearman Queue '$queue'\" "; # $ds_name[$i] = "$queue"; $def[$i] .= rrd::def("var$KEY", $VAL['RRDFILE'], $VAL['DS'], "AVERAGE") ; $def[$i] .= rrd::line1("var$KEY", $color[$state], rrd::cut($state,16)); $def[$i] .= rrd::gprint("var$KEY", array('LAST', 'MAX', 'AVERAGE'), "%6.2lf".$VAL['UNIT']) ; }else{ $i++; $opt[$i] = "-l0 --title \"Gearman Statistics\" "; # $ds_name[$i] = $VAL['NAME']; $def[$i] = rrd::def("var$KEY", $VAL['RRDFILE'], $VAL['DS'], "AVERAGE") ; $def[$i] .= rrd::line1("var$KEY", '#00C600', rrd::cut($VAL['NAME'],16)); $def[$i] .= rrd::gprint("var$KEY", array('LAST', 'MAX', 'AVERAGE'), "%6.2lf") ; } } pnp4nagios-0.6.16/share/pnp/templates.dist/check_mysql_health.php0000664000000000000000000005444111662503006023574 0ustar rootroot60s) on $hostname\" "; $def[$defcnt] = ""; $def[$defcnt] .= "DEF:longrun=$RRDFILE[$i]:$DS[$i]:AVERAGE:reduce=LAST " ; $def[$defcnt] .= "AREA:longrun#111111 "; $def[$defcnt] .= "VDEF:vlongrun=longrun,LAST " ; $def[$defcnt] .= "GPRINT:vlongrun:\"%.0lf long running processes \" " ; $defcnt++; } if(preg_match('/^keycache_hitrate_now$/', $NAME[$i])) { $ds_name[$defcnt] = "MyISAM key cache hitrate"; $opt[$defcnt] = "--vertical-label \"Percent\" --title \"MyISAM key cache hitrate on $hostname\" --upper-limit 100 --lower-limit 0 "; $def[$defcnt] = ""; foreach ($DS as $ii) { if(preg_match('/^keycache_hitrate$/', $NAME[$ii])) { $def[$defcnt] .= "DEF:hitrate=$RRDFILE[$ii]:$DS[$ii]:AVERAGE:reduce=LAST " ; $def[$defcnt] .= "CDEF:ar=hitrate,$CRIT_MIN[$ii],LE,hitrate,0,GT,INF,UNKN,IF,UNKN,IF,ISINF,hitrate,0,IF "; $def[$defcnt] .= "CDEF:ay=hitrate,$WARN_MIN[$ii],LE,hitrate,$CRIT_MIN[$ii],GT,INF,UNKN,IF,UNKN,IF,ISINF,hitrate,0,IF "; $def[$defcnt] .= "CDEF:ag=hitrate,100,LE,hitrate,$WARN_MIN[$ii],GT,INF,UNKN,IF,UNKN,IF,ISINF,hitrate,0,IF "; $def[$defcnt] .= "AREA:ag#$green: " ; $def[$defcnt] .= "AREA:ay#$yellow: " ; $def[$defcnt] .= "AREA:ar#$red: " ; $def[$defcnt] .= "LINE1.5:hitrate#111111:\" \" "; $def[$defcnt] .= "VDEF:vhitrate=hitrate,LAST " ; $def[$defcnt] .= "GPRINT:vhitrate:\"Hitratio (since epoch) is %3.2lf percent \\n\" "; } if(preg_match('/^keycache_hitrate_now$/', $NAME[$ii])) { $def[$defcnt] .= "DEF:hitratenow=$RRDFILE[$ii]:$DS[$ii]:AVERAGE:reduce=LAST " ; $def[$defcnt] .= "LINE1.5:hitratenow#$now:\" \" "; $def[$defcnt] .= "VDEF:vhitratenow=hitratenow,LAST " ; $def[$defcnt] .= "GPRINT:vhitratenow:\"Hitratio (current) is %3.2lf percent \\n\" "; } } $defcnt++; } if(preg_match('/^qcache_hitrate_now$/', $NAME[$i])) { $ds_name[$defcnt] = "Query cache hitrate"; $opt[$defcnt] = "--vertical-label \"Percent\" --title \"Query cache hitrate on $hostname\" --upper-limit 100 --lower-limit 0 "; $def[$defcnt] = ""; foreach ($DS as $ii) { if(preg_match('/^qcache_hitrate$/', $NAME[$ii])) { $def[$defcnt] .= "DEF:hitrate=$RRDFILE[$ii]:$DS[$ii]:AVERAGE:reduce=LAST " ; $def[$defcnt] .= "CDEF:ar=hitrate,$CRIT_MIN[$ii],LE,hitrate,0,GT,INF,UNKN,IF,UNKN,IF,ISINF,hitrate,0,IF "; $def[$defcnt] .= "CDEF:ay=hitrate,$WARN_MIN[$ii],LE,hitrate,$CRIT_MIN[$ii],GT,INF,UNKN,IF,UNKN,IF,ISINF,hitrate,0,IF "; $def[$defcnt] .= "CDEF:ag=hitrate,100,LE,hitrate,$WARN_MIN[$ii],GT,INF,UNKN,IF,UNKN,IF,ISINF,hitrate,0,IF "; $def[$defcnt] .= "AREA:ag#$green: " ; $def[$defcnt] .= "AREA:ay#$yellow: " ; $def[$defcnt] .= "AREA:ar#$red: " ; $def[$defcnt] .= "LINE1.5:hitrate#111111:\" \" "; $def[$defcnt] .= "VDEF:vhitrate=hitrate,LAST " ; $def[$defcnt] .= "GPRINT:vhitrate:\"Hitratio (since epoch) is %3.2lf percent \\n\" "; } if(preg_match('/^qcache_hitrate_now$/', $NAME[$ii])) { $def[$defcnt] .= "DEF:hitratenow=$RRDFILE[$ii]:$DS[$ii]:AVERAGE:reduce=LAST " ; $def[$defcnt] .= "LINE1.5:hitratenow#$now:\" \" "; $def[$defcnt] .= "VDEF:vhitratenow=hitratenow,LAST " ; $def[$defcnt] .= "GPRINT:vhitratenow:\"Hitratio (current) is %3.2lf percent \\n\" "; } } $defcnt++; $ds_name[$defcnt] = "Selects per second"; $opt[$defcnt] = "--vertical-label \"Selects / sec\" --title \"Selects per second on $hostname\" "; $def[$defcnt] = ""; foreach ($DS as $ii) { if(preg_match('/^selects_per_sec$/', $NAME[$ii])) { $def[$defcnt] .= "DEF:sps=$RRDFILE[$ii]:$DS[$ii]:AVERAGE:reduce=LAST " ; $def[$defcnt] .= "AREA:sps#$now:\" \" "; $def[$defcnt] .= "VDEF:vsps=sps,LAST " ; $def[$defcnt] .= "GPRINT:vsps:\"%3.2lf Selects per second \\n\" "; } } $defcnt++; } if(preg_match('/^qcache_lowmem_prunes_rate$/', $NAME[$i])) { $ds_name[$defcnt] = "Query cache low memory prunes"; $opt[$defcnt] = "--vertical-label \"Prunes / sec\" --title \"Query cache low mem prunes on $hostname\" "; $def[$defcnt] = ""; $def[$defcnt] .= "DEF:prunes=$RRDFILE[$i]:$DS[$i]:AVERAGE:reduce=LAST " ; $def[$defcnt] .= "AREA:prunes#111111 "; $def[$defcnt] .= "VDEF:vprunes=prunes,LAST " ; $def[$defcnt] .= "GPRINT:vprunes:\"Rate is %3.2lf Prunes / Second \" " ; $defcnt++; } if(preg_match('/^slow_queries_rate$/', $NAME[$i])) { $ds_name[$defcnt] = "Slow query rate"; $opt[$defcnt] = "--vertical-label \"Slow queries / sec\" --title \"Slow queries on $hostname\" "; $def[$defcnt] = ""; $def[$defcnt] .= "DEF:prunes=$RRDFILE[$i]:$DS[$i]:AVERAGE:reduce=LAST " ; $def[$defcnt] .= "AREA:prunes#111111 "; $def[$defcnt] .= "VDEF:vprunes=prunes,LAST " ; $def[$defcnt] .= "GPRINT:vprunes:\"%3.2lf Slow queries / Second \" " ; $defcnt++; } if(preg_match('/^tablelock_contention_now$/', $NAME[$i])) { $ds_name[$defcnt] = "Table lock contention"; # set upper limit to 10, because 3 means an already dead database $opt[$defcnt] = "--vertical-label \"Percent\" --title \"Table lock contention on $hostname\" --upper-limit 10 --lower-limit 0 "; $def[$defcnt] = ""; foreach ($DS as $ii) { if(preg_match('/^tablelock_contention$/', $NAME[$ii])) { $def[$defcnt] .= "DEF:tbllckcont=$RRDFILE[$ii]:$DS[$ii]:AVERAGE:reduce=LAST " ; $def[$defcnt] .= "CDEF:ag=tbllckcont,$WARN[$ii],LE,tbllckcont,0,GT,INF,UNKN,IF,UNKN,IF,ISINF,tbllckcont,0,IF "; $def[$defcnt] .= "CDEF:ay=tbllckcont,$CRIT[$ii],LE,tbllckcont,$WARN[$ii],GT,INF,UNKN,IF,UNKN,IF,ISINF,tbllckcont,0,IF "; $def[$defcnt] .= "CDEF:ar=tbllckcont,100,LE,tbllckcont,$CRIT[$ii],GT,INF,UNKN,IF,UNKN,IF,ISINF,tbllckcont,0,IF "; $def[$defcnt] .= "AREA:ag#$green: " ; $def[$defcnt] .= "AREA:ay#$yellow: " ; $def[$defcnt] .= "AREA:ar#$red: " ; $def[$defcnt] .= "LINE:tbllckcont#111111:\" \" "; $def[$defcnt] .= "VDEF:vtbllckcont=tbllckcont,LAST " ; $def[$defcnt] .= "GPRINT:vtbllckcont:\"Lock contention (since epoch) is %3.2lf%%\\n\" " ; } if(preg_match('/^tablelock_contention_now$/', $NAME[$ii])) { $def[$defcnt] .= "DEF:tbllckcontnow=$RRDFILE[$ii]:$DS[$ii]:AVERAGE:reduce=LAST " ; $def[$defcnt] .= "LINE1.5:tbllckcontnow#$now:\" \" "; $def[$defcnt] .= "VDEF:vtbllckcontnow=tbllckcontnow,LAST " ; $def[$defcnt] .= "GPRINT:vtbllckcontnow:\"Lock contention (current) is %3.2lf%%\" "; } } $defcnt++; } if(preg_match('/^tablecache_fillrate$/', $NAME[$i])) { $ds_name[$defcnt] = "Table cache hitrate"; $opt[$defcnt] = "--vertical-label \"Percent\" --title \"Table cache hitrate on $hostname\" --upper-limit 100 --lower-limit 0 "; $def[$defcnt] = ""; foreach ($DS as $ii) { if(preg_match('/^tablecache_hitrate$/', $NAME[$ii])) { $def[$defcnt] .= "DEF:hitrate=$RRDFILE[$ii]:$DS[$ii]:AVERAGE:reduce=LAST " ; $def[$defcnt] .= "CDEF:ar=hitrate,$CRIT_MIN[$ii],LE,hitrate,0,GT,INF,UNKN,IF,UNKN,IF,ISINF,hitrate,0,IF "; $def[$defcnt] .= "CDEF:ay=hitrate,$WARN_MIN[$ii],LE,hitrate,$CRIT_MIN[$ii],GT,INF,UNKN,IF,UNKN,IF,ISINF,hitrate,0,IF "; $def[$defcnt] .= "CDEF:ag=hitrate,100,LE,hitrate,$WARN_MIN[$ii],GT,INF,UNKN,IF,UNKN,IF,ISINF,hitrate,0,IF "; $def[$defcnt] .= "AREA:ag#$green: " ; $def[$defcnt] .= "AREA:ay#$yellow: " ; $def[$defcnt] .= "AREA:ar#$red: " ; $def[$defcnt] .= "LINE:hitrate#111111:\" \" "; $def[$defcnt] .= "VDEF:vhitrate=hitrate,LAST " ; $def[$defcnt] .= "GPRINT:vhitrate:\"Hitratio is %3.2lf percent \\n\" "; } if(preg_match('/^tablecache_fillrate$/', $NAME[$ii])) { $def[$defcnt] .= "DEF:hitratenow=$RRDFILE[$ii]:$DS[$ii]:AVERAGE:reduce=LAST " ; $def[$defcnt] .= "LINE1.5:hitratenow#$now:\" \" "; $def[$defcnt] .= "VDEF:vhitratenow=hitratenow,LAST " ; $def[$defcnt] .= "GPRINT:vhitratenow:\"%3.2lf%% of the cache is filled \\n\" "; } } $defcnt++; } if(preg_match('/^pct_tmp_table_on_disk_now$/', $NAME[$i])) { $ds_name[$defcnt] = "Temporary tables created on disk "; $opt[$defcnt] = "--vertical-label \"Percent\" --title \"Temporary tables created on disk on $hostname\" --upper-limit 10 --lower-limit 0 "; $def[$defcnt] = ""; foreach ($DS as $ii) { if(preg_match('/^pct_tmp_table_on_disk$/', $NAME[$ii])) { $def[$defcnt] .= "DEF:tmptbldsk=$RRDFILE[$ii]:$DS[$ii]:AVERAGE:reduce=LAST " ; $def[$defcnt] .= "CDEF:ag=tmptbldsk,$WARN[$ii],LE,tmptbldsk,0,GT,INF,UNKN,IF,UNKN,IF,ISINF,tmptbldsk,0,IF "; $def[$defcnt] .= "CDEF:ay=tmptbldsk,$CRIT[$ii],LE,tmptbldsk,$WARN[$ii],GT,INF,UNKN,IF,UNKN,IF,ISINF,tmptbldsk,0,IF "; $def[$defcnt] .= "CDEF:ar=tmptbldsk,100,LE,tmptbldsk,$CRIT[$ii],GT,INF,UNKN,IF,UNKN,IF,ISINF,tmptbldsk,0,IF "; $def[$defcnt] .= "AREA:ag#$green: " ; $def[$defcnt] .= "AREA:ay#$yellow: " ; $def[$defcnt] .= "AREA:ar#$red: " ; $def[$defcnt] .= "LINE:tmptbldsk#111111:\" \" "; $def[$defcnt] .= "VDEF:vtmptbldsk=tmptbldsk,LAST " ; $def[$defcnt] .= "GPRINT:vtmptbldsk:\"%3.2lf percent of temp tables were created on disk (since epoch)\\n\" " ; } if(preg_match('/^pct_tmp_table_on_disk_now$/', $NAME[$ii])) { $def[$defcnt] .= "DEF:tmptbldsknow=$RRDFILE[$ii]:$DS[$ii]:AVERAGE:reduce=LAST " ; $def[$defcnt] .= "LINE1.5:tmptbldsknow#$now:\" \" "; $def[$defcnt] .= "VDEF:vtmptbldsknow=tmptbldsknow,LAST " ; $def[$defcnt] .= "GPRINT:vtmptbldsknow:\"%3.2lf percent of temp tables were created on disk (recently)\\n\" " ; } } $defcnt++; } if(preg_match('/^thread_cache_hitrate_now$/', $NAME[$i])) { $ds_name[$defcnt] = "Thread cache hitrate"; $opt[$defcnt] = "--vertical-label \"Percent\" --title \"Thread cache hitrate on $hostname\" --upper-limit 100 --lower-limit 0 "; $def[$defcnt] = ""; foreach ($DS as $ii) { if(preg_match('/^thread_cache_hitrate$/', $NAME[$ii])) { $def[$defcnt] .= "DEF:hitrate=$RRDFILE[$ii]:$DS[$ii]:AVERAGE:reduce=LAST " ; $def[$defcnt] .= "CDEF:ar=hitrate,$CRIT_MIN[$ii],LE,hitrate,0,GT,INF,UNKN,IF,UNKN,IF,ISINF,hitrate,0,IF "; $def[$defcnt] .= "CDEF:ay=hitrate,$WARN_MIN[$ii],LE,hitrate,$CRIT_MIN[$ii],GT,INF,UNKN,IF,UNKN,IF,ISINF,hitrate,0,IF "; $def[$defcnt] .= "CDEF:ag=hitrate,100,LE,hitrate,$WARN_MIN[$ii],GT,INF,UNKN,IF,UNKN,IF,ISINF,hitrate,0,IF "; $def[$defcnt] .= "AREA:ag#$green: " ; $def[$defcnt] .= "AREA:ay#$yellow: " ; $def[$defcnt] .= "AREA:ar#$red: " ; $def[$defcnt] .= "LINE:hitrate#111111:\" \" "; $def[$defcnt] .= "VDEF:vhitrate=hitrate,LAST " ; $def[$defcnt] .= "GPRINT:vhitrate:\"Hitratio (since epoch) is %3.2lf percent \\n\" "; } if(preg_match('/^thread_cache_hitrate_now$/', $NAME[$ii])) { $def[$defcnt] .= "DEF:hitratenow=$RRDFILE[$ii]:$DS[$ii]:AVERAGE:reduce=LAST " ; $def[$defcnt] .= "LINE1.5:hitratenow#$now:\" \" "; $def[$defcnt] .= "VDEF:vhitratenow=hitratenow,LAST " ; $def[$defcnt] .= "GPRINT:vhitratenow:\"Hitratio (current) is %3.2lf percent \\n\" "; } } $defcnt++; $ds_name[$defcnt] = "Connects per second"; $opt[$defcnt] = "--vertical-label \"Conects / sec\" --title \"Connects per second on $hostname\" "; $def[$defcnt] = ""; foreach ($DS as $ii) { if(preg_match('/^connections_per_sec$/', $NAME[$ii])) { $def[$defcnt] .= "DEF:sps=$RRDFILE[$ii]:$DS[$ii]:AVERAGE:reduce=LAST " ; $def[$defcnt] .= "AREA:sps#$now:\" \" "; $def[$defcnt] .= "VDEF:vsps=sps,LAST " ; $def[$defcnt] .= "GPRINT:vsps:\"%3.2lf Connects per second \\n\" "; } } $defcnt++; } if(preg_match('/^threads_connected$/', $NAME[$i])) { $ds_name[$defcnt] = "Connection threads"; $opt[$defcnt] = "--vertical-label \"Threads\" --title \"Connection threads on $hostname\" "; $def[$defcnt] = ""; $def[$defcnt] .= "DEF:threads=$RRDFILE[$i]:$DS[$i]:AVERAGE:reduce=LAST " ; $def[$defcnt] .= "AREA:threads#111111 "; $def[$defcnt] .= "VDEF:vthreads=threads,LAST " ; $def[$defcnt] .= "GPRINT:vthreads:\"%.0lf Connection threads \" " ; $defcnt++; } if(preg_match('/^threads_running$/', $NAME[$i])) { $ds_name[$defcnt] = "Running threads"; $opt[$defcnt] = "--vertical-label \"Threads\" --title \"Running threads on $hostname\" "; $def[$defcnt] = ""; $def[$defcnt] .= "DEF:threads=$RRDFILE[$i]:$DS[$i]:AVERAGE:reduce=LAST " ; $def[$defcnt] .= "AREA:threads#111111 "; $def[$defcnt] .= "VDEF:vthreads=threads,LAST " ; $def[$defcnt] .= "GPRINT:vthreads:\"%.0lf Running threads \" " ; $defcnt++; } if(preg_match('/^threads_cached$/', $NAME[$i])) { $ds_name[$defcnt] = "Cached threads"; $opt[$defcnt] = "--vertical-label \"Threads\" --title \"Cached threads on $hostname\" "; $def[$defcnt] = ""; $def[$defcnt] .= "DEF:threads=$RRDFILE[$i]:$DS[$i]:AVERAGE:reduce=LAST " ; $def[$defcnt] .= "AREA:threads#111111 "; $def[$defcnt] .= "VDEF:vthreads=threads,LAST " ; $def[$defcnt] .= "GPRINT:vthreads:\"%.0lf Cached threads \" " ; $defcnt++; } if(preg_match('/^pct_open_files$/', $NAME[$i])) { $ds_name[$defcnt] = "PCT Open Files"; $opt[$defcnt] = "--vertical-label \"OpenFiles\" --title \"PCT Open Files $hostname\" "; $def[$defcnt] = ""; $def[$defcnt] .= "DEF:threads=$RRDFILE[$i]:$DS[$i]:AVERAGE:reduce=LAST " ; $def[$defcnt] .= "AREA:threads#111111 "; $def[$defcnt] .= "VDEF:vthreads=threads,LAST " ; $def[$defcnt] .= "GPRINT:vthreads:\"%.0lf Open Files \" " ; $defcnt++; } if(preg_match('/^threads_created_per_sec$/', $NAME[$i])) { $ds_name[$defcnt] = "Created thread per second"; $opt[$defcnt] = "--vertical-label \"Created threads / sec\" --title \"Created threads per second on $hostname\" "; $def[$defcnt] = ""; $def[$defcnt] .= "DEF:sps=$RRDFILE[$i]:$DS[$i]:AVERAGE:reduce=LAST " ; $def[$defcnt] .= "AREA:sps#$now:\" \" "; $def[$defcnt] .= "VDEF:vsps=sps,LAST " ; $def[$defcnt] .= "GPRINT:vsps:\"%3.2lf Created threads per second \\n\" "; } if(preg_match('/^connects_aborted_per_sec$/', $NAME[$i])) { $ds_name[$defcnt] = "Aborted Connects per second"; $opt[$defcnt] = "--vertical-label \"Aborted connects / sec\" --title \"Aborted Connects per second on $hostname\" "; $def[$defcnt] = ""; $def[$defcnt] .= "DEF:sps=$RRDFILE[$i]:$DS[$i]:AVERAGE:reduce=LAST " ; $def[$defcnt] .= "AREA:sps#$now:\" \" "; $def[$defcnt] .= "VDEF:vsps=sps,LAST " ; $def[$defcnt] .= "GPRINT:vsps:\"%3.2lf Aborted Connects per second \\n\" "; } } ?> pnp4nagios-0.6.16/share/pnp/templates.dist/check_ping.php0000664000000000000000000000277111662503006022036 0ustar rootroot pnp4nagios-0.6.16/share/pnp/templates.dist/default.php0000664000000000000000000000465611662503006021374 0ustar rootrootDS as $KEY=>$VAL) { $maximum = ""; $minimum = ""; $critical = ""; $crit_min = ""; $crit_max = ""; $warning = ""; $warn_max = ""; $warn_min = ""; $vlabel = " "; $lower = ""; $upper = ""; if ($VAL['WARN'] != "") { $warning = $VAL['WARN']; } if ($VAL['WARN_MAX'] != "") { $warn_max = $VAL['WARN_MAX']; } if ($VAL['WARN_MIN'] != "") { $warn_min = $VAL['WARN_MIN']; } if ($VAL['CRIT'] != "") { $critical = $VAL['CRIT']; } if ($VAL['CRIT_MAX'] != "") { $crit_max = $VAL['CRIT_MAX']; } if ($VAL['CRIT_MIN'] != "") { $crit_min = $VAL['CRIT_MIN']; } if ($VAL['MIN'] != "") { $lower = " --lower=" . $VAL['MIN']; $minimum = $VAL['MIN']; } if ($VAL['MAX'] != "") { $maximum = $VAL['MAX']; } if ($VAL['UNIT'] == "%%") { $vlabel = "%"; $upper = " --upper=101 "; $lower = " --lower=0 "; } else { $vlabel = $VAL['UNIT']; } $opt[$KEY] = '--vertical-label "' . $vlabel . '" --title "' . $this->MACRO['DISP_HOSTNAME'] . ' / ' . $this->MACRO['DISP_SERVICEDESC'] . '"' . $upper . $lower; $ds_name[$KEY] = $VAL['LABEL']; $def[$KEY] = rrd::def ("var1", $VAL['RRDFILE'], $VAL['DS'], "AVERAGE"); $def[$KEY] .= rrd::gradient("var1", "3152A5", "BDC6DE", rrd::cut($VAL['NAME'],16), 20); $def[$KEY] .= rrd::line1 ("var1", $_LINE ); $def[$KEY] .= rrd::gprint ("var1", array("LAST","MAX","AVERAGE"), "%3.4lf %S".$VAL['UNIT']); if ($warning != "") { $def[$KEY] .= rrd::hrule($warning, $_WARNRULE, "Warning $warning \\n"); } if ($warn_min != "") { $def[$KEY] .= rrd::hrule($warn_min, $_WARNRULE, "Warning (min) $warn_min \\n"); } if ($warn_max != "") { $def[$KEY] .= rrd::hrule($warn_max, $_WARNRULE, "Warning (max) $warn_max \\n"); } if ($critical != "") { $def[$KEY] .= rrd::hrule($critical, $_CRITRULE, "Critical $critical \\n"); } if ($crit_min != "") { $def[$KEY] .= rrd::hrule($crit_min, $_CRITRULE, "Critical (min) $crit_min \\n"); } if ($crit_max != "") { $def[$KEY] .= rrd::hrule($crit_max, $_CRITRULE, "Critical (max) $crit_max \\n"); } $def[$KEY] .= rrd::comment("Default Template\\r"); $def[$KEY] .= rrd::comment("Command " . $VAL['TEMPLATE'] . "\\r"); } ?> pnp4nagios-0.6.16/share/pnp/templates.dist/check_iftraffic_pct.php0000664000000000000000000000127011662503006023675 0ustar rootroot pnp4nagios-0.6.16/share/pnp/templates.dist/check_snmp_int-bits.php0000664000000000000000000000176711662503006023673 0ustar rootrootMACRO['TIMET'] != ""){ $def[1] .= "VRULE:".$this->MACRO['TIMET']."#000000:\"Last Service Check \\n\" "; } ?> pnp4nagios-0.6.16/share/pnp/templates.dist/check_pnp_rrds.php0000664000000000000000000000211011662503006022713 0ustar rootroot pnp4nagios-0.6.16/share/pnp/index.php.in0000664000000000000000000001120311662503006016506 0ustar rootrootconfig = new Config_Model; $this->config->read_config(); if($this->config->conf['auth_enabled'] == 1){ $this->AUTH_ENABLED = TRUE; $this->socketPath = $this->config->conf['livestatus_socket']; } if(isset($_SERVER['REMOTE_USER'])){ $this->REMOTE_USER = $_SERVER['REMOTE_USER']; } if($this->AUTH_ENABLED === TRUE && $this->REMOTE_USER === NULL){ throw new Kohana_exception("error.remote_user_missing"); } } public function __destruct() { if($this->SOCKET !== NULL) { socket_close($this->SOCKET); $this->SOCKET = NULL; } } public function connect(){ $this->getSocketDetails($this->socketPath); $this->SOCKET = socket_create($this->socketDOMAIN, $this->socketTYPE, $this->socketPROTO); if($this->SOCKET === FALSE) { throw new Kohana_exception("error.livestatus_socket_error", socket_strerror(socket_last_error($this->SOCKET)), $this->socketPath); } if($this->socketDOMAIN === AF_UNIX){ $result = @socket_connect($this->SOCKET, $this->socketPATH); }else{ $result = @socket_connect($this->SOCKET, $this->socketHOST, $this->socketPORT); } if(!$result) { throw new Kohana_exception("error.livestatus_socket_error", socket_strerror(socket_last_error($this->SOCKET)), $this->socketPath); } } private function queryLivestatus($query) { if($this->SOCKET === NULL) { $this->connect(); } @socket_write($this->SOCKET, $query."\nOutputFormat: json\n\n"); // Read 16 bytes to get the status code and body size $read = @socket_read($this->SOCKET,2048); if(!$read) { throw new Kohana_exception("error.livestatus_socket_error", socket_strerror(socket_last_error($this->SOCKET))); } # print Kohana::debug("read ". $read); // Catch problem while reading if($read === false) { throw new Kohana_exception("error.livestatus_socket_error", socket_strerror(socket_last_error($this->SOCKET))); } // Decode the json response $obj = json_decode(utf8_encode($read)); socket_close($this->SOCKET); $this->SOCKET = NULL; return $obj; } public function is_authorized($host = FALSE, $service = NULL){ if($this->AUTH_ENABLED === FALSE){ return TRUE; } if($host == "pnp-internal"){ return TRUE; } if($service === NULL || $service == "_HOST_" || $service == "Host Perfdata"){ $users = explode(",", $this->config->conf['allowed_for_all_hosts']); if (in_array($this->REMOTE_USER, $users)) { return TRUE; } $query = "GET hosts\nColumns: name\nFilter: name = $host\nAuthUser: ".$this->REMOTE_USER; $result = $this->queryLivestatus($query); }else{ $users = explode(",", $this->config->conf['allowed_for_all_services']); if (in_array($this->REMOTE_USER, $users)) { return TRUE; } $query = "GET services\nColumns: host_name description\nFilter: host_name = $host\nFilter: description = $service\nAuthUser: ".$this->REMOTE_USER; $result = $this->queryLivestatus($query); } if(sizeof($result) > 0){ return TRUE; }else{ return FALSE; } } public function getSocketDetails($string=FALSE){ if(preg_match('/^unix:(.*)$/',$string,$match) ){ $this->socketDOMAIN = AF_UNIX; $this->socketTYPE = SOCK_STREAM; $this->socketPATH = $match[1]; $this->socketPROTO = 0; return; } if(preg_match('/^tcp:([a-zA-Z0-9-]+):([0-9]+)$/',$string,$match) ){ $this->socketDOMAIN = AF_TCP; $this->socketTYPE = SOCK_STREAM; $this->socketHOST = $match[1]; $this->socketPORT = $match[2]; $this->socketPROTO = SOL_TCP; return; } # Fallback if(preg_match('/^\/.*$/',$string,$match) ){ $this->socketDOMAIN = AF_UNIX; $this->socketTYPE = SOCK_STREAM; $this->socketPATH = $string; $this->socketPROTO = 0; return; } return FALSE; } } pnp4nagios-0.6.16/share/pnp/application/models/system.php0000664000000000000000000000032711662503006022111 0ustar rootrootconf = $conf; $this->views = $views; } } pnp4nagios-0.6.16/share/pnp/application/models/rrdtool.php0000664000000000000000000002044411662503006022254 0ustar rootrootconfig = new Config_Model(); $this->config->read_config(); #print Kohana::debug($this->config->views); } private function rrdtool_execute() { $descriptorspec = array ( 0 => array ("pipe","r"), // stdin is a pipe that the child will read from 1 => array ("pipe","w"), // stdout is a pipe that the child will write to 2 => array ("pipe","w") // stderr is a pipe that the child will write to ); if(!isset($this->config->conf['rrdtool']) ) return FALSE; if ( !is_executable($this->config->conf['rrdtool']) ) { $data = "ERROR: ".$this->config->conf['rrdtool']." is not executable by PHP\n\n"; return $data; } $rrdtool = $this->config->conf['rrdtool'] . " - "; $command = $this->RRD_CMD; $process = proc_open($rrdtool, $descriptorspec, $pipes); $debug = Array(); $data = ""; if (is_resource($process)) { fwrite($pipes[0], $command); fclose($pipes[0]); stream_set_timeout($pipes[1],1); $data = stream_get_contents($pipes[1]); stream_set_timeout($pipes[2],1); $stderr = stream_get_contents($pipes[2]); $stdout_meta = stream_get_meta_data($pipes[1]); if($stdout_meta['timed_out'] == 1){ $data = "ERROR: Timeout while reading rrdtool data.\n\n"; } fclose($pipes[1]); fclose($pipes[2]); proc_close($process); // Catch STDERR if($stderr && strlen($stderr) >= 0 ){ $data = "ERROR: STDERR => ".$stderr."\n\n"; return $data; } // Catch STDOUT < 50 Characters if($data && strlen($data) < 50 ){ $data = "ERROR: STDOUT => ".$data."\n\n"; return $data; } }else{ $data = "ERROR: proc_open(".$rrdtool." ... failed"; } return $data; } public function doImage($RRD_CMD, $out='STDOUT') { $conf = $this->config->conf; # construct $command to rrdtool if(isset($conf['RRD_DAEMON_OPTS']) && $conf['RRD_DAEMON_OPTS'] != '' ){ $command = " graph --daemon=" . $conf['RRD_DAEMON_OPTS'] . " - "; }else{ $command = " graph - "; } $width = 0; $height = 0; if ($out == 'PDF'){ if($conf['pdf_graph_opt']){ $command .= $conf['pdf_graph_opt']; } if (isset($conf['pdf_width']) && is_numeric($conf['pdf_width'])){ $width = abs($conf['pdf_width']); } if (isset($conf['pdf_height']) && is_numeric($conf['pdf_height'])){ $height = abs($conf['pdf_height']); } }else{ if($conf['graph_opt']){ $command .= $conf['graph_opt']; } if(is_numeric($conf['graph_width'])){ $width = abs($conf['graph_width']); } if(is_numeric($conf['graph_height'])){ $height = abs($conf['graph_height']); } } if ($width > 0){ $command .= " --width=$width"; } if ($height > 0){ $command .= " --height=$height"; } if ($height < 81 ){ $command .= " --only-graph "; } $command .= $RRD_CMD; # Force empty vertical label if( ! preg_match_all('/(-l|--vertical-label)/i',$command,$match)){ $command .= " --vertical-label=' ' "; } $this->RRD_CMD = $command; $data = $this->rrdtool_execute(); if($data){ return $data; }else{ return FALSE; } } /* * */ public function doXport($RRD_CMD){ $conf = $this->config->conf; if(isset($conf['RRD_DAEMON_OPTS']) && $conf['RRD_DAEMON_OPTS'] != '' ){ $command = " xport --daemon=" . $conf['RRD_DAEMON_OPTS']; }else{ $command = " xport "; } $command .= $RRD_CMD; $this->RRD_CMD = $command; $data = $this->rrdtool_execute(); $data = preg_replace('/OK.*/','',$data); if($data){ return $data; }else{ return FALSE; } } public function streamImage($data = FALSE){ if ( $data === FALSE ){ header("Content-type: image/png"); echo base64_decode('iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A /wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9kCCAoDKSKZ0rEAAAAZdEVYdENv bW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAADUlEQVQI12NgYGBgAAAABQABXvMqOgAAAABJ RU5ErkJggg=='); return; } if (preg_match('/^ERROR/', $data)) { if(preg_match('/NOT_AUTHORIZED/', $data)){ // TODO: i18n $data .= "\n\nYou are not authorized to view this Image"; // Set font size $font_size = 3; }else{ $data .= $this->format_rrd_debug( $this->config->conf['rrdtool'] . $this->RRD_CMD) ; // Set font size $font_size = 1.5; } $ts=explode("\n",$data); $width=0; foreach ($ts as $k=>$string) { $width=max($width,strlen($string)); } $width = imagefontwidth($font_size)*$width; if($width <= $this->config->conf['graph_width']+100){ $width = $this->config->conf['graph_width']+100; } $height = imagefontheight($font_size)*count($ts); if($height <= $this->config->conf['graph_height']+60){ $height = $this->config->conf['graph_height']+60; } $el=imagefontheight($font_size); $em=imagefontwidth($font_size); // Create the image pallette $img = imagecreatetruecolor($width,$height); // Dark red background $bg = imagecolorallocate($img, 0xAA, 0x00, 0x00); imagefilledrectangle($img, 0, 0,$width ,$height , $bg); // White font color $color = imagecolorallocate($img, 255, 255, 255); foreach ($ts as $k=>$string) { // Length of the string $len = strlen($string); // Y-coordinate of character, X changes, Y is static $ypos_offset = 5; $xpos_offset = 5; // Loop through the string for($i=0;$i<$len;$i++){ // Position of the character horizontally $xpos = $i * $em + $ypos_offset; $ypos = $k * $el + $xpos_offset; // Draw character imagechar($img, $font_size, $xpos, $ypos, $string, $color); // Remove character from string $string = substr($string, 1); } } header("Content-type: image/png"); imagepng($img); imagedestroy($img); }else{ header("Content-type: image/png"); echo $data; } } public function saveImage($data = FALSE){ $img = array(); $img['file'] = tempnam($this->config->conf['temp'],"PNP"); if(!$fh = fopen($img['file'],'w') ){ throw new Kohana_Exception('save-rrd-image', $img['file']); } fwrite($fh, $data); fclose($fh); if (function_exists('imagecreatefrompng')) { $image = imagecreatefrompng($img['file']); imagepng($image, $img['file']); list ($img['width'], $img['height'], $img['type'], $img['attr']) = getimagesize($img['file']); } return $img; } private function format_rrd_debug($data) { $data = preg_replace('/(HRULE|VDEF|DEF|CDEF|GPRINT|LINE|AREA|COMMENT)/',"\n\${1}", $data); return $data; } } pnp4nagios-0.6.16/share/pnp/application/models/data.php0000664000000000000000000011700711662503006021502 0ustar rootrootconfig = new Config_Model(); $this->config->read_config(); $this->auth = new Auth_Model(); } /* * Get All Special Templates * */ public function getSpecialTemplates(){ $conf = $this->config->conf; $templates = array(); if (is_dir($conf['special_template_dir'])){ if ($dh = opendir($conf['special_template_dir'])) { while (($file = readdir($dh)) !== false) { if ($file == "." || $file == "..") continue; if (!preg_match("/(.*)\.php$/", $file, $template)) continue; $templates[] = $template[1]; } } } if(sizeof($templates) > 0){ sort($templates); return $templates; }else{ return FALSE; } } public function getFirstSpecialTemplate(){ $templates = $this->getSpecialTemplates(); if($templates === FALSE){ return FALSE; }else{ return $templates[0]; } } /* * * */ public function getHosts() { $hosts = array(); $conf = $this->config->conf; $i = 0; if (is_dir($conf['rrdbase'])) { if ($dh = opendir($conf['rrdbase'])) { while (($file = readdir($dh)) !== false) { if ($file == "." || $file == ".." || $file == ".pnp-internal") continue; if (is_file($conf['rrdbase'] . "/" . $file) ) continue; if($this->auth->is_authorized($file) === FALSE) continue; $stat = stat($conf['rrdbase'] . "/" . $file); $age = (time() - $stat['mtime']); $hosts[$i]['name'] = $file; $hosts[$i]['sort'] = strtoupper($file); if ($age < $conf['max_age']) { $hosts[$i]['state'] = 'active'; } else { $hosts[$i]['state'] = 'inactive'; } $i++; } closedir($dh); } else { throw new Kohana_User_Exception('Perfdata Dir', "Can not open $path"); } } if(sizeof($hosts)>0){ # Obtain a list of columns foreach ($hosts as $key => $row) { $sort[$key] = $row['sort']; } # Sort the data with volume descending, edition ascending # Add $data as the last parameter, to sort by the common key array_multisort($sort, SORT_ASC, $hosts); }else{ throw new Kohana_Exception('error.perfdata-dir-empty', $conf['rrdbase'] ); } return $hosts; } /* * * */ function getRawServices($hostname) { $services = array (); $host = array(); $conf = $this->config->conf; $i = 0; $path = $conf['rrdbase'] . $hostname; if (is_dir($path)) { if ($dh = opendir($path)) { while ( ($file = readdir($dh) ) !== false) { if ($file == "." || $file == "..") continue; if (!preg_match("/(.*)\.xml$/", $file, $servicedesc)) continue; $fullpath = $path . "/" . $file; $stat = stat("$fullpath"); $age = (time() - $stat['mtime']); $state = "active"; if ($age > $conf['max_age']) { # 6Stunden $state = "inactive"; } $services[$i]['state'] = $state; $services[$i]['name'] = $servicedesc[1]; $i++; } } }else{ throw new Kohana_Exception('error.perfdata-dir-for-host', $path, $hostname ); } if( is_array($services) && sizeof($services) > 0){ # Obtain a list of columns foreach ($services as $key => $row) { $sort[$key] = $row['name']; } # Sort the data with volume descending, edition ascending # Add $data as the last parameter, to sort by the common key array_multisort($sort, SORT_STRING, $services); }else{ throw new Kohana_Exception('error.host-perfdata-dir-empty', $path, $hostname ); } return $services; } /* * * */ function getServices($hostname) { $services = array (); $host = array(); $i = 0; $service_list = $this->getRawServices($hostname); foreach( $service_list as $s ){ if(!$this->readXML($hostname, $s['name'], FALSE)){ continue; } if($s['name'] == "_HOST_"){ // Check authorization if($this->auth->is_authorized((string) $this->XML->NAGIOS_AUTH_HOSTNAME, "_HOST_") === FALSE) continue; $host[0]['name'] = "_HOST_"; $host[0]['hostname'] = (string) $this->XML->NAGIOS_HOSTNAME; $host[0]['state'] = $s['state']; $host[0]['servicedesc'] = "Host Perfdata"; $host[0]['is_multi'] = (string) $this->XML->DATASOURCE[0]->IS_MULTI[0]; }else{ // Check authorization if($this->auth->is_authorized((string) $this->XML->NAGIOS_AUTH_HOSTNAME, (string) $this->XML->NAGIOS_AUTH_SERVICEDESC) === FALSE ) continue; $services[$i]['name'] = $s['name']; // Sorting check_multi if( (string) $this->XML->NAGIOS_MULTI_PARENT == ""){ $services[$i]['sort'] = strtoupper($s['name']); }else{ $services[$i]['sort'] = strtoupper((string) $this->XML->NAGIOS_MULTI_PARENT); $services[$i]['sort'] .= (string) $this->XML->DATASOURCE[0]->IS_MULTI[0]; $services[$i]['sort'] .= strtoupper($s['name']); } $services[$i]['state'] = $s['state']; $services[$i]['hostname'] = (string) $this->XML->NAGIOS_DISP_HOSTNAME; $services[$i]['servicedesc'] = (string) $this->XML->NAGIOS_DISP_SERVICEDESC; $services[$i]['is_multi'] = (string) $this->XML->DATASOURCE[0]->IS_MULTI[0]; } $i++; } #print Kohana::debug($services); if( is_array($services) && sizeof($services) > 0){ # Obtain a list of columns foreach ($services as $key => $row) { $sort[$key] = $row['sort']; } # Sort the data with volume descending, edition ascending # Add $data as the last parameter, to sort by the common key array_multisort($sort, SORT_STRING, $services); } if(is_array($host) && sizeof($host) > 0 ){ array_unshift($services, $host[0]); } return $services; } /* * * */ public function getFirstService($hostname) { $conf = $this->config->conf; $services = $this->getServices($hostname); foreach ($services as $srv) { if ($srv['state'] == "active" ) { break; } } if(sizeof($srv) == 0){ throw new Kohana_Exception('error.get-first-service', $hostname ); } return $srv['name']; } /* * * */ public function getFirstHost() { $conf = $this->config->conf; $hosts = $this->getHosts(); foreach ($hosts as $host) { if ($host['state'] == "active" ) { break; } } if(sizeof($host) == 0){ throw new Kohana_Exception('error.get-first-host'); } return $host['name']; } /* * * */ public function readXML ($hostname, $servicedesc, $throw_exception=TRUE){ $conf = $this->config->conf; $xmlfile = $conf['rrdbase'].$hostname."/".$servicedesc.".xml"; $xml = array(); if (file_exists($xmlfile)) { libxml_use_internal_errors(TRUE); libxml_clear_errors(TRUE); if(! $xml = simplexml_load_file($xmlfile) ){; if( $throw_exception == TRUE ){ $errors = '
'; foreach(libxml_get_errors() as $error) { $errors .= $error->message."
"; } throw new Kohana_Exception('error.xml-generic_error',$xmlfile, $errors); }else{ return FALSE; } } $this->XML = array(); $this->MACRO = array(); $this->MACRO['AUTH_SERVICEDESC'] = ''; $this->MACRO['AUTH_HOSTNAME'] = ''; $this->DS = array(); // Throw excaption without a valid structure version if(!isset($xml->XML->VERSION) && $throw_exception == TRUE){ throw new Kohana_Exception('error.xml-structure-without-version-tag',$xmlfile); } if(!isset($xml->XML->VERSION) && $throw_exception == FALSE){ return FALSE; } foreach ( $xml as $key=>$val ){ if(preg_match('/^NAGIOS_(.*)$/', $key, $match)){ #print $match[1]." => ".$val."\n"; $key = $match[1]; $this->MACRO[$key] = (string) $val; } } $i=0; foreach ( $xml->DATASOURCE as $datasource ){ foreach ( $datasource as $key=>$val){ #print "$key => $val\n"; #$$key[$i] = (string) $val; $this->DS[$i][$key] = (string) $val; } $i++; } $this->XML = $xml; return TRUE; }else{ throw new Kohana_Exception('error.xml-not-found', $xmlfile); } } /* * * */ public function buildDataStruct ($host = FALSE, $service = FALSE, $view = NULL, $source = NULL){ if($host === FALSE && $service === FALSE){ return FALSE; } $conf = $this->config->conf; /* * Special templates without Host/Service */ if($host == '__special' ){ // $service contains the template name $this->includeTemplate($service,'special'); }else{ if( $this->readXML($host,$service) == FALSE ){ throw new Kohana_Exception('error.xml-not-found', "Undefined error"); return false; } $this->includeTemplate($this->DS[0]['TEMPLATE']); } if(isset($this->TIMERANGE['type']) && $this->TIMERANGE['type'] == "start-end"){ $view = intval($view); $i=0; foreach( $this->RRD['def'] as $key=>$val){ if( ! is_null($source) && $source != $key ){ continue; } $tmp_struct = array(); $tmp_struct['LEVEL'] = $i; $tmp_struct['VIEW'] = $view; $tmp_struct['TEMPLATE_FILE'] = $this->TEMPLATE_FILE;; $tmp_struct['SOURCE'] = $key; $tmp_struct['RRD_CALL'] = $this->TIMERANGE['cmd'] . " ". $this->RRD['opt'][$key] . " " . $this->RRD['def'][$key]; $tmp_struct['TIMERANGE'] = $this->TIMERANGE; $tmp_struct['GRAPH_WIDTH'] = $this->getGraphDimensions('width', $tmp_struct['RRD_CALL']); $tmp_struct['GRAPH_HEIGHT'] = $this->getGraphDimensions('height', $tmp_struct['RRD_CALL']); if(isset($this->RRD['ds_name'][$key]) ){ $tmp_struct['ds_name'] = $this->RRD['ds_name'][$key]; }elseif(array_key_exists($i, $this->DS)){ $tmp_struct['ds_name'] = $this->DS[$i]['NAME']; }else{ $tmp_struct['ds_name'] = "UNDEF"; } $tmp_struct['MACRO'] = $this->MACRO; if(isset($this->XML->XML->VERSION)){ $tmp_struct['VERSION'] = pnp::xml_version_check( (string) $this->XML->XML->VERSION); }else{ $tmp_struct['VERSION'] = pnp::xml_version_check("0"); } $this->addToDataStruct($tmp_struct); $i++; } return; } if( $view === ""){ $v = 0; foreach($this->config->views as $view_key=>$view_val){ $i=0; foreach( $this->RRD['def'] as $key=>$val){ if( ! is_null($source) && $source != $key ){ continue; } $tmp_struct = array(); $tmp_struct['LEVEL'] = $i; $tmp_struct['VIEW'] = $view_key; $tmp_struct['TEMPLATE_FILE'] = $this->TEMPLATE_FILE;; $tmp_struct['SOURCE'] = $key; $tmp_struct['RRD_CALL'] = $this->TIMERANGE[$v]['cmd'] . " " . $this->RRD['opt'][$key] . " " . $this->RRD['def'][$key]; $tmp_struct['GRAPH_WIDTH'] = $this->getGraphDimensions('width', $tmp_struct['RRD_CALL']); $tmp_struct['GRAPH_HEIGHT'] = $this->getGraphDimensions('height', $tmp_struct['RRD_CALL']); if(isset($this->RRD['ds_name'][$key]) ){ $tmp_struct['ds_name'] = $this->RRD['ds_name'][$key]; }elseif(array_key_exists($i, $this->DS)){ $tmp_struct['ds_name'] = $this->DS[$i]['NAME']; }else{ $tmp_struct['ds_name'] = "UNDEF"; } $tmp_struct['TIMERANGE'] = $this->TIMERANGE[$v]; $tmp_struct['MACRO'] = $this->MACRO; if(isset($this->XML->XML->VERSION)){ $tmp_struct['VERSION'] = pnp::xml_version_check( (string) $this->XML->XML->VERSION); }else{ $tmp_struct['VERSION'] = pnp::xml_version_check("0"); } $this->addToDataStruct($tmp_struct); $i++; } $v++; } }else{ $view = intval($view); $i=0; foreach( $this->RRD['def'] as $key=>$val){ if( ! is_null($source) && $source != $key ){ continue; } $tmp_struct = array(); $tmp_struct['LEVEL'] = $i; $tmp_struct['VIEW'] = $view; $tmp_struct['TEMPLATE_FILE'] = $this->TEMPLATE_FILE;; $tmp_struct['SOURCE'] = $key; $tmp_struct['RRD_CALL'] = $this->TIMERANGE[$view]['cmd'] . " ". $this->RRD['opt'][$key] . " " . $this->RRD['def'][$key]; $tmp_struct['TIMERANGE'] = $this->TIMERANGE[$view]; $tmp_struct['GRAPH_WIDTH'] = $this->getGraphDimensions('width', $tmp_struct['RRD_CALL']); $tmp_struct['GRAPH_HEIGHT'] = $this->getGraphDimensions('height', $tmp_struct['RRD_CALL']); if(isset($this->RRD['ds_name'][$key]) ){ $tmp_struct['ds_name'] = $this->RRD['ds_name'][$key]; }elseif(array_key_exists($i, $this->DS)){ $tmp_struct['ds_name'] = $this->DS[$i]['NAME']; }else{ $tmp_struct['ds_name'] = "UNDEF"; } $tmp_struct['MACRO'] = $this->MACRO; if(isset($this->XML->XML->VERSION)){ $tmp_struct['VERSION'] = pnp::xml_version_check( (string) $this->XML->XML->VERSION); }else{ $tmp_struct['VERSION'] = pnp::xml_version_check("0"); } $this->addToDataStruct($tmp_struct); $i++; } } } /* * * */ private function addToDataStruct ($data=FALSE) { if($data === FALSE) return FALSE; array_push($this->STRUCT, $data); } /* * * */ private function includeTemplate($template=FALSE,$type='normal'){ if($template===FALSE){ return FALSE; } $this->RRD = array(); /* * Normal PNP Templates */ if($type == 'normal'){ $template_file = $this->findTemplate( $template ); $this->TEMPLATE_FILE = $template_file; $hostname = $this->MACRO['HOSTNAME']; $servicedesc = $this->MACRO['SERVICEDESC']; $TIMERANGE = $this->TIMERANGE; }elseif($type == 'special'){ $template_file = $this->findTemplate( $template, $type ); $TIMERANGE = $this->TIMERANGE; } $def = FALSE; $opt = FALSE; $ds_name = FALSE; /* * 0.4.x Template compatibility */ foreach($this->DS as $key=>$val ){ $key++; foreach(array_keys($val) as $tag){ ${$tag}[$key] = $val[$tag]; } } foreach($this->MACRO as $key=>$val ){ ${"NAGIOS_".$key} = $val; } if(isset($RRDFILE[1])){ $rrdfile = $RRDFILE[1]; } // Include template if($template_file == FALSE){ throw new Kohana_Exception('error.no-templates-found'); }else{ ob_start(); include($template_file); ob_end_clean(); } // Compatibility for very old Templates if(!is_array($def) && $def != FALSE){ $tmp[1] = $def; $def = $tmp; } if(!is_array($opt) && $opt != FALSE){ $tmp[1] = $opt; $opt = $tmp; } if(!is_array($ds_name) && $ds_name != FALSE){ $tmp[1] = $ds_name; $ds_name = $tmp; } // if($def != FALSE){ $this->RRD['def'] = $this->array_reindex($def); }else{ throw new Kohana_Exception('error.template-without-def', $template_file); } if($opt != FALSE ){ $this->RRD['opt'] = $this->array_reindex($opt); }else{ throw new Kohana_Exception('error.template-without-opt', $template_file); } if( $ds_name != FALSE ){ $this->RRD['ds_name'] = $this->array_reindex($ds_name); } return TRUE; } # # # private function getGraphDimensions($search, $command){ if($search == 'width'){ if(preg_match_all('/(-w|--width|--width=)\s([0-9]+)\s/i',$command,$match)){ $value = array_pop($match[2]); return $value; }else{ return $this->config->conf['graph_width']; } } if($search == 'height'){ if(preg_match_all('/(-h|--height|--height=)\s([0-9]+)\s/i',$command,$match)){ $value = array_pop($match[2]); return $value; }else{ return $this->config->conf['graph_height']; } } return FALSE; } # # # private function array_reindex($data){ $i=0; foreach($data as $d){ $tmp[$i] = $d; $i++; } return $tmp; } /* * * */ public function findTemplate($template,$type='normal'){ $conf = $this->config->conf; /* * Normal templates */ if($type == 'normal'){ // Build a list of directories to search for templates $template_dirs = array(); if(array_key_exists('template_dirs', $this->config->conf)){ foreach($this->config->conf['template_dirs'] as $dir){ $template_dirs[] = $dir; } } foreach(Kohana::config('core.template_dirs') as $dir){ $template_dirs[] = $dir; } #throw new Kohana_Exception(print_r($template_dirs,TRUE)); foreach($template_dirs as $dir){ $match = $this->findRecursiveTemplate($template,$dir); if($match != FALSE){ return $match; } } /* * Fallback to default templates */ foreach($template_dirs as $dir){ $match = $this->findRecursiveTemplate('default',$dir); if($match != FALSE){ return $match; } } return FALSE; } /* * Special Templates */ if($type == 'special'){ if (is_readable($conf['special_template_dir'] . '/' . $template . '.php')) { $template_file = $conf['special_template_dir'].'/' . $template . '.php'; }else{ throw new Kohana_Exception("Special Template '$template' not found"); } return $template_file; } } /* * * */ function findRecursiveTemplate($template, $dir) { if(!is_readable($dir)){ return FALSE; } $template_file = ""; $r_template_file = ""; $r_template = ""; $recursive = explode("_", $template); if($this->config->conf['enable_recursive_template_search'] == 1){ $i = 0; foreach ($recursive as $value) { if ($i == 0) { $r_template = $value; } else { $r_template = $r_template . '_' . $value; } $file = $dir . '/' . $r_template . '.php'; if (is_readable($file)) { $r_template_file = $file; } $i++; } if($r_template_file != ""){ return $r_template_file; }else{ return FALSE; } }else{ $file = $dir . '/' . $template . '.php'; if (is_readable($file)) { return $file; }else{ return FALSE; } } } public function getTimeRange($start=FALSE ,$end=FALSE ,$view="") { if($end != FALSE){ // we are in a custom timerange if(!is_numeric($end)){ $timestamp = strtotime($end); if(!$timestamp){ throw new Kohana_User_Exception('Wrong Format', "$end"); }else{ $end = $timestamp; } } }else{ $end = time(); } if($start != FALSE ){ // we are in a custom timerange if(!is_numeric($start)){ $timestamp = strtotime($start); if(!$timestamp){ throw new Kohana_User_Exception('Wrong Format', "Start -> $start"); }else{ $start = $timestamp; } } } if($start && $end){ $timerange['title'] = Kohana::lang('common.timerange-selector-link'); $timerange['start'] = $start; $timerange['f_start'] = date($this->config->conf['date_fmt'],$start); $timerange['end'] = $end; $timerange['f_end'] = date($this->config->conf['date_fmt'],$end); $timerange['cmd'] = " --start $start --end $end "; $timerange['type'] = "start-end"; $this->TIMERANGE = $timerange; return; } $view=intval( pnp::clean($view) ); if($view >= sizeof($this->config->views)){ $view = 1; } if(!$end){ $end = time(); }elseif(!is_numeric($end)){ $timestamp = strtotime($end); if(!$timestamp){ throw new Kohana_User_Exception('Wrong Format', "$end"); }else{ $end = $timestamp; } }else{ $end = $end; } if(!$start){ $start = ( $end - $this->config->views[$view]['start']); }elseif(!is_numeric($start)){ $timestamp = strtotime($start); if(!$timestamp){ throw new Kohana_User_Exception('Wrong Format', "$start"); }else{ $start = $timestamp; } }else{ $start = pnp::clean($start); } if($start >= $end){ //Fixme i18n throw new Kohana_User_Exception('Wrong Timerange', "start >= end"); } $timerange['title'] = $this->config->views[$view]['title']; $timerange['start'] = $start; $timerange['f_start'] = date($this->config->conf['date_fmt'],$start); $timerange['end'] = $end; $timerange['f_end'] = date($this->config->conf['date_fmt'],$end); $timerange['cmd'] = " --start $start --end $end "; $timerange['type'] = "views"; for ($i = 0; $i < sizeof($this->config->views); $i++) { $timerange[$i]['title'] = $this->config->views[$i]['title']; $timerange[$i]['start'] = $end - $this->config->views[$i]['start']; $timerange[$i]['f_start'] = date($this->config->conf['date_fmt'],$end - $this->config->views[$i]['start']); $timerange[$i]['end'] = $end; $timerange[$i]['f_end'] = date($this->config->conf['date_fmt'],$end); $timerange[$i]['cmd'] = " --start " . ($end - $this->config->views[$i]['start']) . " --end $end" ; } $this->TIMERANGE = $timerange; } public function buildBasketStruct($basket,$view = NULL){ if(is_array($basket) && sizeof($basket) > 0){ if($view == ""){ $views = array_keys($this->config->views); }else{ $views = array($view); } foreach($views as $view){ foreach($basket as $item){ # explode host::service::source $slices = explode("::",$item); if(sizeof($slices) == 2) $this->buildDataStruct($slices[0], $slices[1], $view); if(sizeof($slices) == 3) $this->buildDataStruct($slices[0], $slices[1], $view, $slices[2]); } # break on custom time ranges if(isset($this->TIMERANGE['type']) && $this->TIMERANGE['type'] == "start-end"){ break; } } } } public function buildPageStruct($page,$view){ $servicelist = array(); $this->parse_page_cfg($page); $hosts = $this->getHostsByPage(); # No regex so we keep the order defined by config if($this->PAGE_DEF['use_regex'] == 0){ #Loop through graph definitions foreach($this->PAGE_GRAPH as $graph){ $hosts_to_search_for = explode(",", $graph['host_name']); foreach($hosts_to_search_for as $host){ if(in_array($host, $hosts)){ $services = $this->getServices($host); foreach($services as $service) { // search for definition $data = $this->filterServiceByPage($graph,$host,$service); if($data){ $servicelist[] = array( 'host' => $host, 'service' => $service['name'], 'source' => $data['source']); } } } } } }else{ foreach($hosts as $host){ $services = $this->getServices($host); foreach($services as $service) { // search for definition $data = $this->filterServiceByPage($this->PAGE_GRAPH,$host,$service); if($data){ $servicelist[] = array( 'host' => $host, 'service' => $service['name'], 'source' => $data['source']); } } } } #print Kohana::debug($servicelist); if(sizeof($servicelist) > 0 ){ foreach($servicelist as $s){ $this->buildDataStruct($s['host'],$s['service'],$view,$s['source']); } }else{ $this->ERROR = "ERROR: ". Kohana::lang('error.no-data-for-page', $page.".cfg" ); } } public function parse_page_cfg($page){ $page_cfg = $this->config->conf['page_dir'].$page.".cfg"; if(is_readable($page_cfg)){ $data = file($page_cfg); }else{ throw new Kohana_Exception('error.page-not-readable', $page.".cfg" ); } $l = 0; $line = ""; $tag = ""; $inside=0; $this->PAGE_DEF['page_name'] = 'UNDEF'; $this->PAGE_DEF['use_regex'] = 0; $this->PAGE_GRAPH = array(); $allowed_tags = array("page", "graph"); foreach($data as $line){ if(preg_match('/(^#|^;)/',$line)) { continue; } preg_match('/define\s+(\w+)\W+{/' ,$line, $tag); if(isset($tag[1]) && in_array($tag[1],$allowed_tags)){ $inside = 1; $t = $tag[1]; $l++; continue; } if(preg_match('/\s?(\w+)\s+([^#]+)(#.*)?$/',$line, $key) && $inside == 1){ $k=strtolower($key[1]); $v=$key[2]; if($t=='page'){ $this->PAGE_DEF[$k] = trim($v); }elseif($t=='graph'){ $this->PAGE_GRAPH[$l][$k] = trim($v); } } if(preg_match('/}/',$line)){ $inside=0; $t = ""; continue; } } } /* * */ public function getHostsByPage(){ $hosts = $this->getHosts(); $new_hosts = array(); foreach( $hosts as $host){ if($host['state'] == "inactive"){ continue; } if($tmp = $this->filterHostByPage($host['name'])){ $new_hosts[] = $tmp; } } return $new_hosts; } /* * */ private function filterHostByPage($host){ if(isset($this->PAGE_DEF['use_regex']) && $this->PAGE_DEF['use_regex'] == 1){ // Search Host by regex foreach( $this->PAGE_GRAPH as $g ){ if(isset($g['host_name']) && preg_match('/'.$g['host_name'].'/',$host)){ return $host; } } }else{ foreach( $this->PAGE_GRAPH as $g ){ $hosts_to_search_for = explode(",", $g['host_name']); if(isset($g['host_name']) && in_array($host ,$hosts_to_search_for) ){ return $host; } } } return FALSE; } private function filterServiceByPage($g,$host,$service){ $data = array(); if(isset($this->PAGE_DEF['use_regex']) && $this->PAGE_DEF['use_regex'] == 1){ // Search Host by regex foreach( $this->PAGE_GRAPH as $g ){ if(isset($g['host_name']) && preg_match('/'.$g['host_name'].'/',$host)){ if(isset($g['service_desc']) && preg_match('/'.$g['service_desc'].'/',$service['name'])){ $data['service_desc'] = $g['service_desc']; $data['host_name'] = $g['host_name']; $data['source'] = NULL; // if we only want a single image if(isset($g['source'])){ $this->readXML($host,$service['name']); $this->includeTemplate($this->DS[0]['TEMPLATE']); $source = intval($g['source']); if(array_key_exists($source,$this->RRD['def'])){ $data['source'] = $source; } } return $data; } } } }else{ $hosts_to_search_for = explode(",", $g['host_name']); $services_to_search_for = explode(",", $g['service_desc']); if(isset($g['host_name']) && in_array($host ,$hosts_to_search_for) ){ if(isset($g['service_desc']) && in_array($service['name'] ,$services_to_search_for) ){ $data['service_desc'] = $g['service_desc']; $data['host_name'] = $g['host_name']; $data['source'] = NULL; // if we only want a single image if(isset($g['source'])){ $this->readXML($host,$service['name']); $this->includeTemplate($this->DS[0]['TEMPLATE']); $source = intval($g['source']); if(array_key_exists($source,$this->RRD['def'])){ $data['source'] = $source; } } return $data; } } } return FALSE; } /* * */ public function getPages() { $pages = array(); if (is_dir($this->config->conf['page_dir'])) { if ($dh = opendir($this->config->conf['page_dir'])) { while (($file = readdir($dh)) !== false) { if(preg_match('/(.*)\.cfg$/',basename($file),$page)){ $pages[] = urlencode($page[1]); } } closedir($dh); } else { die("Cannot open directory: $path"); } } if(sizeof($pages)>0){ natsort($pages); }else{ return FALSE; } return $pages; } /* * */ public function getFirstPage(){ $pages = $this->getPages(); if(sizeof($pages) > 0 ){ return urldecode($pages[0]); }else{ return FALSE; } } /* * */ public function getPageDetails($page){ $this->parse_page_cfg($page); return $this->PAGE_DEF['page_name']; } /* * */ public function buildXport($host,$service){ // FIXME add max rows to config $this->XPORT = " -m 2000"; $this->XPORT .= " --start=".$this->TIMERANGE['start']; $this->XPORT .= " --end=".$this->TIMERANGE['end']; $this->readXML($host,$service); $count = 0; $RRAs = array('MIN','MAX','AVERAGE'); foreach($this->DS as $key=>$value){ foreach($RRAs as $RRA){ $this->XPORT .= sprintf(" DEF:%d%s=%s:%d:%s ",$count,$RRA,$value['RRDFILE'],$value['DS'],$RRA); $this->XPORT .= sprintf(" XPORT:%d%s:%s_%s " ,$count,$RRA,$value['NAME'],$RRA); } $count++; } } /* * */ public function xml2csv($string){ $xml = simplexml_load_string($string); $csv = "timestamp"; foreach($xml->meta->legend->entry as $key=>$value){ $csv .= ";" . $value ; } $csv .= "\n"; foreach($xml->data->row as $key=>$value){ $csv .= (string) $value->t ; foreach($value->v as $item){ $csv .= ";".floatval((string) $item); } $csv .= "\n"; } return $csv; } /* * * Used in Special Templates to gather data */ public function tplGetData ($hostname, $servicedesc, $throw_exception=TRUE){ $conf = $this->config->conf; $xmlfile = $conf['rrdbase'].$hostname."/".$servicedesc.".xml"; $data = array(); if (file_exists($xmlfile)) { $xml = simplexml_load_file($xmlfile); // Throw excaption without a valid structure version if(!isset($xml->XML->VERSION) && $throw_exception == TRUE){ throw new Kohana_Exception('error.xml-structure-without-version-tag',$xmlfile); } if(!isset($xml->XML->VERSION) && $throw_exception == FALSE){ return FALSE; } foreach ( $xml as $key=>$val ){ if(preg_match('/^NAGIOS_(.*)$/', $key, $match)){ $key = $match[1]; $data['MACRO'][$key] = (string) $val; } } $i=0; foreach ( $xml->DATASOURCE as $datasource ){ foreach ( $datasource as $key=>$val){ $data['DS'][$i][$key] = (string) $val; } $i++; } return $data; }else{ throw new Kohana_Exception('error.xml-not-found', $xmlfile); } } /* * * Used in Special Templates to gather data */ public function tplGetServices ($hostregex=FALSE, $serviceregex = ''){ if($hostregex === FALSE){ return FALSE; } $hostregex = sprintf("/%s/",$hostregex); $serviceregex = sprintf("/%s/",$serviceregex); $hosts = $this->getHosts(); $new_hosts = array(); foreach( $hosts as $host){ if(preg_match($hostregex,$host['name'])){ $new_hosts[] = $host['name']; } } if(sizeof($new_hosts) == 0){ throw new Kohana_Exception('error.tpl-no-hosts-found', $hostregex); } $i = 0; $new_services = array(); foreach($new_hosts as $host){ $services = $this->getRawServices($host); if(sizeof($services) == 0){ throw new Kohana_Exception('error.tpl-no-services-found', $serviceregex); } foreach($services as $service){ if(preg_match($serviceregex, $service['name'])){ $new_services[$i]['hostname'] = $host; $new_services[$i]['host'] = $host; $new_services[$i]['service_description'] = $service['name']; $new_services[$i]['service'] = $service['name']; $i++; } } } if(sizeof($new_services) == 0){ throw new Kohana_Exception('error.tpl-no-services-found', $serviceregex); } return $new_services; } } pnp4nagios-0.6.16/share/pnp/application/views/0000775000000000000000000000000011662503006017724 5ustar rootrootpnp4nagios-0.6.16/share/pnp/application/views/special_templates_box.php0000664000000000000000000000077611662503006025015 0ustar rootroottemplates) && $this->isAuthorizedFor('service_links') ) { ?>
templates as $template){ $path = pnp::addToUri( array('tpl' => $template) ); echo "". pnp::shorten($template). "
\n"; } ?>

pnp4nagios-0.6.16/share/pnp/application/views/page.php0000664000000000000000000000202011662503006021343 0ustar rootroot

pnp4nagios-0.6.16/share/pnp/application/views/docs.php0000664000000000000000000000140111662503006021361 0ustar rootroot
content)) { echo $this->content; } ?>
pnp4nagios-0.6.16/share/pnp/application/views/mobile_pages.php0000664000000000000000000000056611662503006023072 0ustar rootroot
    data->getPageDetails($page); printf("
  • %s
  • ", $page, $this->data->PAGE_DEF['page_name']); } ?>
pnp4nagios-0.6.16/share/pnp/application/views/timerange_box.php0000664000000000000000000000207011662503006023257 0ustar rootroot\n"; echo "
\n"; echo Kohana::lang('common.timerange-box-header')."\n"; echo "
\n"; echo "
\n"; $start = $this->session->get('start',''); $end = $this->session->get('end',''); $path = pnp::addToUri(array('start' => $start,'end' => $end)); if($start && $end){ echo "".Kohana::lang('common.timerange-selector-link')."
\n"; } if($start && !$end){ echo "".Kohana::lang('common.timerange-selector-link')."
\n"; } $path = pnp::addToUri(array('view' => '', 'start' => '', 'end' => '')); echo "".Kohana::lang('common.timerange-selector-overview')."
\n"; foreach($this->config->views as $key=>$view){ $path = pnp::addToUri(array('view' => $key, 'start' => '', 'end' => '')); echo "".$view['title']."
\n"; } echo "
\n"; echo "

\n"; ?> pnp4nagios-0.6.16/share/pnp/application/views/pages_box.php0000664000000000000000000000104311662503006022402 0ustar rootrootisAuthorizedFor('pages') ) { ?>

pnp4nagios-0.6.16/share/pnp/application/views/docs_box.php0000664000000000000000000000216611662503006022242 0ustar rootroot

\n"; echo "\n"; foreach ( $this->doc_language as $lang ){ echo " \n"; } ?>

toc ?>

pnp4nagios-0.6.16/share/pnp/application/views/mobile_search.php0000664000000000000000000000124211662503006023230 0ustar rootrootisAuthorizedFor('host_search') ){ ?>

    result as $host){ printf("
  • %s
  • ", $host, $host); } ?>
pnp4nagios-0.6.16/share/pnp/application/views/timerange_select.php0000664000000000000000000000404111662503006023746 0ustar rootrootconfig->conf['use_calendar']){ $start = $this->session->get('start',''); $end = $this->session->get('end',''); ?> pnp4nagios-0.6.16/share/pnp/application/views/logo_box.php0000664000000000000000000000051411662503006022245 0ustar rootroot
pnp4nagios-0.6.16/share/pnp/application/views/status_box.php0000664000000000000000000000115711662503006022634 0ustar rootroot
Host: ". html::anchor('graph'. "?host=".$lhost, html::specialchars(pnp::shorten($host))."
");?> Service: " . html::anchor('graph'. "?host=".$lhost. "&srv=".$lservice, html::specialchars(pnp::shorten($service))."
");?> Last Check: $timet
"?>

pnp4nagios-0.6.16/share/pnp/application/views/icon_box.php0000664000000000000000000000473711662503006022250 0ustar rootroot

$this->start,'end' => $this->end, 'view' => $this->view), False); if($this->config->conf['use_calendar']){ echo ""; } if($this->config->conf['use_fpdf'] == 1 && ( $position == "graph" || $position == "special") ){ echo "\n"; } if($this->config->conf['use_fpdf'] == 1 && $position == "basket"){ echo "\n"; } if($this->config->conf['use_fpdf'] == 1 && $position == "page"){ echo "page.$qsa."\">\n"; } if($this->config->conf['show_xml_icon'] == 1 && $position == "graph" && $xml_icon == TRUE){ $qsa = pnp::addToUri(array(), False); echo "\n"; } if($this->data->getFirstPage() && $this->isAuthorizedFor('pages') ){ echo "\n"; } echo "\n"; if($this->data->getFirstSpecialTemplate() ){ echo "\n"; } echo "\n"; ?>

pnp4nagios-0.6.16/share/pnp/application/views/popup.php0000664000000000000000000000045511662503006021604 0ustar rootroot\n"; } ?>
data->STRUCT as $KEY=>$VAL){ $source = $VAL['SOURCE']; echo "
\n"; echo "\n"; echo "
pnp4nagios-0.6.16/share/pnp/application/views/mobile_graph_special.php0000664000000000000000000000216511662503006024571 0ustar rootroot

data->MACRO['TITLE']) echo "".$this->data->MACRO['TITLE']."

\n"; if($this->data->MACRO['COMMENT']) echo $this->data->MACRO['COMMENT']."

\n"; $last_view = -1; foreach($this->data->STRUCT as $d){ if($d['VIEW'] > $last_view){ # a new header begins if($last_view != -1 ){ # close last div print "

\n"; } printf("
%s
\n", $d['TIMERANGE']['title'] ); printf("
%s\n", $d['ds_name']); printf("
\n", $this->tpl, $d['VIEW'], $d['SOURCE'] ); $last_view++; }else{ printf("
%s
\n", $d['ds_name']); printf("
\n", $this->tpl, $d['VIEW'], $d['SOURCE'] ); } } ?>
pnp4nagios-0.6.16/share/pnp/application/views/host_box.php0000664000000000000000000000032611662503006022263 0ustar rootroot
Status Box
$host['state']))."

"; } } ?>
pnp4nagios-0.6.16/share/pnp/application/views/mobile_host.php0000664000000000000000000000156511662503006022750 0ustar rootrootis_authorized == FALSE){ ?>
  • Alert: 
    $service){ if($key == 0) printf("
  • %s
  • \n", $service['hostname'] ); printf("
  • %s
  • ", urlencode($service['hostname']), urlencode($service['name']), urlencode($service['hostname']), urlencode($service['name']), $service['servicedesc']); } ?>
pnp4nagios-0.6.16/share/pnp/application/views/multisite_box.php0000664000000000000000000000112511662503006023323 0ustar rootroot
Host: ".html::specialchars(pnp::shorten($host))."
\n"; } if(isset($service) && $service != "Host Perfdata"){ echo "Service: ".html::specialchars(pnp::shorten($service))."\n"; } ?>

pnp4nagios-0.6.16/share/pnp/application/views/graph.php0000664000000000000000000000223211662503006021535 0ustar rootroot

pnp4nagios-0.6.16/share/pnp/application/views/widget_menu.sample.php0000664000000000000000000000032711662503006024226 0ustar rootroot
Title
Content

pnp4nagios-0.6.16/share/pnp/application/views/graph_content_special.php0000664000000000000000000000375311662503006025000 0ustar rootroot \n"; $count = 0; if($this->data->MACRO['TITLE']) echo "".$this->data->MACRO['TITLE']."

\n"; if($this->data->MACRO['COMMENT']) echo $this->data->MACRO['COMMENT']."

\n"; foreach($this->data->STRUCT as $key=>$value){ if($value['LEVEL'] == 0 ){ echo "".$value['TIMERANGE']['title']. " " .$value['TIMERANGE']['f_start']. " - " . $value['TIMERANGE']['f_end']. "\n"; $count = 0; } echo "

"; echo "\n"; echo "\n"; echo "\n"; echo "
"; echo Kohana::lang('common.datasource',$value['ds_name']).""; echo pnp::zoom_icon_special($this->tpl, $value['TIMERANGE']['start'], $value['TIMERANGE']['end'], $value['SOURCE'], $value['VIEW'], $value['GRAPH_WIDTH'], $value['GRAPH_HEIGHT'])."
\n"; echo "
\n"; echo "

\n"; } echo "\n"; ?> pnp4nagios-0.6.16/share/pnp/application/views/mobile_about.php0000664000000000000000000000012411662503006023073 0ustar rootroot

PNP4Nagios mobile interface based on jQuery Mobile
pnp4nagios-0.6.16/share/pnp/application/views/header.php0000664000000000000000000000014511662503006021665 0ustar rootroot
pnp4nagios-0.6.16/share/pnp/application/views/mobile.php0000664000000000000000000000240211662503006021702 0ustar rootroot

PNP4Nagios

Home
pnp4nagios-0.6.16/share/pnp/application/views/graph_content.php0000664000000000000000000001036411662503006023274 0ustar rootroot \n"; if($this->is_authorized == FALSE){ echo "
\n"; echo "

\n"; echo "Alert: ".Kohana::lang('error.not_authorized')."

\n"; echo "
\n"; return; } if($this->data->ERROR != NULL){ echo "
\n"; echo "

\n"; echo "Alert: ".$this->data->ERROR."

\n"; echo "
\n"; return; } $count = 0; foreach($this->data->STRUCT as $key=>$value){ if($value['LEVEL'] == 0){ echo "Host: ".$value['MACRO']['DISP_HOSTNAME']. " Service: ".$value['MACRO']['DISP_SERVICEDESC']."

\n"; echo "".$value['TIMERANGE']['title']. " " .$value['TIMERANGE']['f_start']. " - " . $value['TIMERANGE']['f_end']. "\n"; $count = 0; } if($value['VERSION'] != "valid" && $count == 0){ $count++; echo "

\n"; echo "
\n"; echo "

".$value['VERSION']."

\n"; echo "
\n"; echo "

\n"; } echo "
"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "
"; echo Kohana::lang('common.datasource',$value['ds_name']).""; echo nagios::SummaryLink($value['MACRO']['DISP_HOSTNAME'], $value['TIMERANGE']['start'], $value['TIMERANGE']['end']).""; echo nagios::AvailLink($value['MACRO']['DISP_HOSTNAME'], $value['MACRO']['DISP_SERVICEDESC'], $value['TIMERANGE']['start'], $value['TIMERANGE']['end']).""; echo pnp::add_to_basket_icon( $value['MACRO']['HOSTNAME'], $value['MACRO']['SERVICEDESC'], $value['SOURCE'] ); echo ""; echo pnp::zoom_icon($value['MACRO']['HOSTNAME'], $value['MACRO']['SERVICEDESC'], $value['TIMERANGE']['start'], $value['TIMERANGE']['end'], $value['SOURCE'], $value['VIEW'], $value['GRAPH_WIDTH'], $value['GRAPH_HEIGHT'])."
\n"; echo "
\n"; echo "

\n"; } echo "\n"; ?> pnp4nagios-0.6.16/share/pnp/application/views/mobile_home.php0000664000000000000000000000220511662503006022713 0ustar rootroot

pnp4nagios-0.6.16/share/pnp/application/views/zoom_header.php0000664000000000000000000000032611662503006022732 0ustar rootrootfunction Gzoom (url) { GzoomWindow = window.open(url, "PNP4Nagios", "width=,height=,location=no,status=no,resizable=yes,scrollbars=yes"); GzoomWindow.focus(); } pnp4nagios-0.6.16/share/pnp/application/views/mobile_overview.php0000664000000000000000000000077611662503006023644 0ustar rootroot
    %s\n", strtoupper(substr($host['name'], 0, 1)) ); } printf("
  • %s
  • ", $host['name'], $host['name']); $l = substr($host['name'], 0, 1); } ?>
pnp4nagios-0.6.16/share/pnp/application/views/zoom.php0000664000000000000000000001242011662503006021420 0ustar rootroot theme.'/jquery-ui.css') ?>

data->TIMERANGE['f_start']?> --- data->TIMERANGE['f_end']?>

url."\" >
"; if(!empty($tpl)){ echo ""; }else{ echo ""; } $start_down = $this->data->TIMERANGE['start'] - intval(($this->data->TIMERANGE['end'] - $this->data->TIMERANGE['start']) / 2); $path = pnp::addToUri( array('start' => $start_down)); printf("\n", $path, "Move Start to ".date($this->config->conf['date_fmt'],$start_down), url::base()."media/images/go-left.png", 10 ); $start_up = $this->data->TIMERANGE['start'] + intval(($this->data->TIMERANGE['end'] - $this->data->TIMERANGE['start']) / 2); $path = pnp::addToUri( array('start' => $start_up)); printf("\n", $path, "Move Start to ".date($this->config->conf['date_fmt'],$start_up), url::base()."media/images/go-right.png", 60 ); $path = pnp::addToUri( array('end' => time() )); printf("\n", $path, "Move End to ".date($this->config->conf['date_fmt'],time()), url::base()."media/images/go-now.png", 10 ); $end_up = $this->data->TIMERANGE['end'] + intval(($this->data->TIMERANGE['end'] - $this->data->TIMERANGE['start']) / 2); $path = pnp::addToUri( array('end' => $end_up)); printf("\n", $path, "Move End to ".date($this->config->conf['date_fmt'],$end_up), url::base()."media/images/go-right.png", 60 ); $end_down = $this->data->TIMERANGE['end'] - intval(($this->data->TIMERANGE['end'] - $this->data->TIMERANGE['start']) / 2); $path = pnp::addToUri( array('end' => $end_down)); printf("\n", $path, "Move End to ".date($this->config->conf['date_fmt'],$end_down), url::base()."media/images/go-left.png", 110 ); ?>
pnp4nagios-0.6.16/share/pnp/application/views/service_box.php0000664000000000000000000000127111662503006022746 0ustar rootrootisAuthorizedFor('service_links') ) { ?>
$host, 'srv' => $service['name']) ); echo pnp::add_to_basket_icon($host, $service['name']); echo ""; echo pnp::shorten($service['servicedesc']). "
\n"; } ?>

pnp4nagios-0.6.16/share/pnp/application/views/widget_graph.sample.php0000664000000000000000000000033111662503006024356 0ustar rootroot

Title
Content

pnp4nagios-0.6.16/share/pnp/application/views/debug.php0000664000000000000000000000315411662503006021526 0ustar rootrootis_authorized === FALSE){ print "

Your are not authorized to view this site

"; return; } ?>

$this->data->STRUCT

data->STRUCT);?>
	

$this->data->DS

data->DS);?>
	

$this->data->MACRO

data->MACRO);?>
	

$this->session->get()

session->get());?>
	
pnp4nagios-0.6.16/share/pnp/application/views/template.php0000664000000000000000000001116111662503006022250 0ustar rootroot <?php if (isset($this->title)) echo html::specialchars($this->title) ?> theme.'/jquery-ui.css') ?> pnp4nagios-0.6.16/share/pnp/application/views/basket_box.php0000664000000000000000000000251011662503006022554 0ustar rootrootsession->get('basket'); echo "
\n"; echo "
\n"; echo Kohana::lang('common.basket-box-header')."
\n"; echo "
\n"; echo "
\n"; if(is_array($basket) && sizeof($basket) > 0 ){ foreach($basket as $key=>$item){ echo "
  • ". pnp::shorten($item)."
  • \n"; } } if(is_array($basket) && sizeof($basket) > 0 ){ echo "
    \n"; echo "\n"; echo "\n"; echo "
    \n"; #echo "\n"; }else{ echo "
    ".Kohana::lang('common.basket-empty')."
    \n"; } echo "
    \n"; echo "
    \n"; echo "

    \n"; ?>
    pnp4nagios-0.6.16/share/pnp/application/views/mobile_graph.php0000664000000000000000000000251111662503006023064 0ustar rootrootis_authorized == FALSE){ ?>
    • Alert: 
    data->STRUCT as $d){ if($d['VIEW'] > $last_view){ # a new header begins if($last_view != -1 ){ # close last div print "
    \n"; } printf("
    %s
    \n", $d['TIMERANGE']['title'] ); printf("
    %s\n", $d['ds_name']); printf("
    \n", $d['MACRO']['HOSTNAME'], $d['MACRO']['SERVICEDESC'], $d['VIEW'], $d['SOURCE'] ); $last_view++; }else{ printf("
    %s
    \n", $d['ds_name']); printf("
    \n", $d['MACRO']['HOSTNAME'], $d['MACRO']['SERVICEDESC'], $d['VIEW'], $d['SOURCE'] ); } } ?>
    pnp4nagios-0.6.16/share/pnp/application/views/search_box.php0000664000000000000000000000122411662503006022551 0ustar rootrootisAuthorizedFor('host_search') ){ ?>

    pnp4nagios-0.6.16/share/pnp/application/views/mobile_special.php0000664000000000000000000000050611662503006023405 0ustar rootroot

      %s", $template, $template); } ?>
    pnp4nagios-0.6.16/share/pnp/application/views/kohana_error_page.php0000664000000000000000000000522711662503006024111 0ustar rootroot <?php echo $error ?>

    Please check the documentation for information about the following error.

    file [line]:

    \n"; echo "\n"; echo "\n"; ?>
    pnp4nagios-0.6.16/share/pnp/application/lib/0000775000000000000000000000000011662503006017335 5ustar rootrootpnp4nagios-0.6.16/share/pnp/application/lib/jsonwrapper.php0000664000000000000000000000022011662503006022412 0ustar rootroot pnp4nagios-0.6.16/share/pnp/application/lib/json.php0000664000000000000000000010233611662503006021024 0ustar rootroot * @author Matt Knapp * @author Brett Stimmerman * @copyright 2005 Michal Migurski * @version CVS: $Id: JSON.php,v 1.31 2006/06/28 05:54:17 migurski Exp $ * @license http://www.opensource.org/licenses/bsd-license.php * @link http://pear.php.net/pepr/pepr-proposal-show.php?id=198 */ /** * Marker constant for Services_JSON::decode(), used to flag stack state */ define('SERVICES_JSON_SLICE', 1); /** * Marker constant for Services_JSON::decode(), used to flag stack state */ define('SERVICES_JSON_IN_STR', 2); /** * Marker constant for Services_JSON::decode(), used to flag stack state */ define('SERVICES_JSON_IN_ARR', 3); /** * Marker constant for Services_JSON::decode(), used to flag stack state */ define('SERVICES_JSON_IN_OBJ', 4); /** * Marker constant for Services_JSON::decode(), used to flag stack state */ define('SERVICES_JSON_IN_CMT', 5); /** * Behavior switch for Services_JSON::decode() */ define('SERVICES_JSON_LOOSE_TYPE', 16); /** * Behavior switch for Services_JSON::decode() */ define('SERVICES_JSON_SUPPRESS_ERRORS', 32); /** * Converts to and from JSON format. * * Brief example of use: * * * // create a new instance of Services_JSON * $json = new Services_JSON(); * * // convert a complexe value to JSON notation, and send it to the browser * $value = array('foo', 'bar', array(1, 2, 'baz'), array(3, array(4))); * $output = $json->encode($value); * * print($output); * // prints: ["foo","bar",[1,2,"baz"],[3,[4]]] * * // accept incoming POST data, assumed to be in JSON notation * $input = file_get_contents('php://input', 1000000); * $value = $json->decode($input); * */ class Services_JSON { /** * constructs a new JSON instance * * @param int $use object behavior flags; combine with boolean-OR * * possible values: * - SERVICES_JSON_LOOSE_TYPE: loose typing. * "{...}" syntax creates associative arrays * instead of objects in decode(). * - SERVICES_JSON_SUPPRESS_ERRORS: error suppression. * Values which can't be encoded (e.g. resources) * appear as NULL instead of throwing errors. * By default, a deeply-nested resource will * bubble up with an error, so all return values * from encode() should be checked with isError() */ function Services_JSON($use = 0) { $this->use = $use; } /** * convert a string from one UTF-16 char to one UTF-8 char * * Normally should be handled by mb_convert_encoding, but * provides a slower PHP-only method for installations * that lack the multibye string extension. * * @param string $utf16 UTF-16 character * @return string UTF-8 character * @access private */ function utf162utf8($utf16) { // oh please oh please oh please oh please oh please if(function_exists('mb_convert_encoding')) { return mb_convert_encoding($utf16, 'UTF-8', 'UTF-16'); } $bytes = (ord($utf16{0}) << 8) | ord($utf16{1}); switch(true) { case ((0x7F & $bytes) == $bytes): // this case should never be reached, because we are in ASCII range // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 return chr(0x7F & $bytes); case (0x07FF & $bytes) == $bytes: // return a 2-byte UTF-8 character // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 return chr(0xC0 | (($bytes >> 6) & 0x1F)) . chr(0x80 | ($bytes & 0x3F)); case (0xFFFF & $bytes) == $bytes: // return a 3-byte UTF-8 character // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 return chr(0xE0 | (($bytes >> 12) & 0x0F)) . chr(0x80 | (($bytes >> 6) & 0x3F)) . chr(0x80 | ($bytes & 0x3F)); } // ignoring UTF-32 for now, sorry return ''; } /** * convert a string from one UTF-8 char to one UTF-16 char * * Normally should be handled by mb_convert_encoding, but * provides a slower PHP-only method for installations * that lack the multibye string extension. * * @param string $utf8 UTF-8 character * @return string UTF-16 character * @access private */ function utf82utf16($utf8) { // oh please oh please oh please oh please oh please if(function_exists('mb_convert_encoding')) { return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8'); } switch(strlen($utf8)) { case 1: // this case should never be reached, because we are in ASCII range // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 return $utf8; case 2: // return a UTF-16 character from a 2-byte UTF-8 char // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 return chr(0x07 & (ord($utf8{0}) >> 2)) . chr((0xC0 & (ord($utf8{0}) << 6)) | (0x3F & ord($utf8{1}))); case 3: // return a UTF-16 character from a 3-byte UTF-8 char // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 return chr((0xF0 & (ord($utf8{0}) << 4)) | (0x0F & (ord($utf8{1}) >> 2))) . chr((0xC0 & (ord($utf8{1}) << 6)) | (0x7F & ord($utf8{2}))); } // ignoring UTF-32 for now, sorry return ''; } /** * encodes an arbitrary variable into JSON format * * @param mixed $var any number, boolean, string, array, or object to be encoded. * see argument 1 to Services_JSON() above for array-parsing behavior. * if var is a strng, note that encode() always expects it * to be in ASCII or UTF-8 format! * * @return mixed JSON string representation of input var or an error if a problem occurs * @access public */ function encode($var) { switch (gettype($var)) { case 'boolean': return $var ? 'true' : 'false'; case 'NULL': return 'null'; case 'integer': return (int) $var; case 'double': case 'float': return (float) $var; case 'string': // STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT $ascii = ''; $strlen_var = strlen($var); /* * Iterate over every character in the string, * escaping with a slash or encoding to UTF-8 where necessary */ for ($c = 0; $c < $strlen_var; ++$c) { $ord_var_c = ord($var{$c}); switch (true) { case $ord_var_c == 0x08: $ascii .= '\b'; break; case $ord_var_c == 0x09: $ascii .= '\t'; break; case $ord_var_c == 0x0A: $ascii .= '\n'; break; case $ord_var_c == 0x0C: $ascii .= '\f'; break; case $ord_var_c == 0x0D: $ascii .= '\r'; break; case $ord_var_c == 0x22: case $ord_var_c == 0x2F: case $ord_var_c == 0x5C: // double quote, slash, slosh $ascii .= '\\'.$var{$c}; break; case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)): // characters U-00000000 - U-0000007F (same as ASCII) $ascii .= $var{$c}; break; case (($ord_var_c & 0xE0) == 0xC0): // characters U-00000080 - U-000007FF, mask 110XXXXX // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $char = pack('C*', $ord_var_c, ord($var{$c + 1})); $c += 1; $utf16 = $this->utf82utf16($char); $ascii .= sprintf('\u%04s', bin2hex($utf16)); break; case (($ord_var_c & 0xF0) == 0xE0): // characters U-00000800 - U-0000FFFF, mask 1110XXXX // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $char = pack('C*', $ord_var_c, ord($var{$c + 1}), ord($var{$c + 2})); $c += 2; $utf16 = $this->utf82utf16($char); $ascii .= sprintf('\u%04s', bin2hex($utf16)); break; case (($ord_var_c & 0xF8) == 0xF0): // characters U-00010000 - U-001FFFFF, mask 11110XXX // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $char = pack('C*', $ord_var_c, ord($var{$c + 1}), ord($var{$c + 2}), ord($var{$c + 3})); $c += 3; $utf16 = $this->utf82utf16($char); $ascii .= sprintf('\u%04s', bin2hex($utf16)); break; case (($ord_var_c & 0xFC) == 0xF8): // characters U-00200000 - U-03FFFFFF, mask 111110XX // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $char = pack('C*', $ord_var_c, ord($var{$c + 1}), ord($var{$c + 2}), ord($var{$c + 3}), ord($var{$c + 4})); $c += 4; $utf16 = $this->utf82utf16($char); $ascii .= sprintf('\u%04s', bin2hex($utf16)); break; case (($ord_var_c & 0xFE) == 0xFC): // characters U-04000000 - U-7FFFFFFF, mask 1111110X // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $char = pack('C*', $ord_var_c, ord($var{$c + 1}), ord($var{$c + 2}), ord($var{$c + 3}), ord($var{$c + 4}), ord($var{$c + 5})); $c += 5; $utf16 = $this->utf82utf16($char); $ascii .= sprintf('\u%04s', bin2hex($utf16)); break; } } return '"'.$ascii.'"'; case 'array': /* * As per JSON spec if any array key is not an integer * we must treat the the whole array as an object. We * also try to catch a sparsely populated associative * array with numeric keys here because some JS engines * will create an array with empty indexes up to * max_index which can cause memory issues and because * the keys, which may be relevant, will be remapped * otherwise. * * As per the ECMA and JSON specification an object may * have any string as a property. Unfortunately due to * a hole in the ECMA specification if the key is a * ECMA reserved word or starts with a digit the * parameter is only accessible using ECMAScript's * bracket notation. */ // treat as a JSON object if (is_array($var) && count($var) && (array_keys($var) !== range(0, sizeof($var) - 1))) { $properties = array_map(array($this, 'name_value'), array_keys($var), array_values($var)); foreach($properties as $property) { if(Services_JSON::isError($property)) { return $property; } } return '{' . join(',', $properties) . '}'; } // treat it like a regular array $elements = array_map(array($this, 'encode'), $var); foreach($elements as $element) { if(Services_JSON::isError($element)) { return $element; } } return '[' . join(',', $elements) . ']'; case 'object': $vars = get_object_vars($var); $properties = array_map(array($this, 'name_value'), array_keys($vars), array_values($vars)); foreach($properties as $property) { if(Services_JSON::isError($property)) { return $property; } } return '{' . join(',', $properties) . '}'; default: return ($this->use & SERVICES_JSON_SUPPRESS_ERRORS) ? 'null' : new Services_JSON_Error(gettype($var)." can not be encoded as JSON string"); } } /** * array-walking function for use in generating JSON-formatted name-value pairs * * @param string $name name of key to use * @param mixed $value reference to an array element to be encoded * * @return string JSON-formatted name-value pair, like '"name":value' * @access private */ function name_value($name, $value) { $encoded_value = $this->encode($value); if(Services_JSON::isError($encoded_value)) { return $encoded_value; } return $this->encode(strval($name)) . ':' . $encoded_value; } /** * reduce a string by removing leading and trailing comments and whitespace * * @param $str string string value to strip of comments and whitespace * * @return string string value stripped of comments and whitespace * @access private */ function reduce_string($str) { $str = preg_replace(array( // eliminate single line comments in '// ...' form '#^\s*//(.+)$#m', // eliminate multi-line comments in '/* ... */' form, at start of string '#^\s*/\*(.+)\*/#Us', // eliminate multi-line comments in '/* ... */' form, at end of string '#/\*(.+)\*/\s*$#Us' ), '', $str); // eliminate extraneous space return trim($str); } /** * decodes a JSON string into appropriate variable * * @param string $str JSON-formatted string * * @return mixed number, boolean, string, array, or object * corresponding to given JSON input string. * See argument 1 to Services_JSON() above for object-output behavior. * Note that decode() always returns strings * in ASCII or UTF-8 format! * @access public */ function decode($str) { $str = $this->reduce_string($str); switch (strtolower($str)) { case 'true': return true; case 'false': return false; case 'null': return null; default: $m = array(); if (is_numeric($str)) { // Lookie-loo, it's a number // This would work on its own, but I'm trying to be // good about returning integers where appropriate: // return (float)$str; // Return float or int, as appropriate return ((float)$str == (integer)$str) ? (integer)$str : (float)$str; } elseif (preg_match('/^("|\').*(\1)$/s', $str, $m) && $m[1] == $m[2]) { // STRINGS RETURNED IN UTF-8 FORMAT $delim = substr($str, 0, 1); $chrs = substr($str, 1, -1); $utf8 = ''; $strlen_chrs = strlen($chrs); for ($c = 0; $c < $strlen_chrs; ++$c) { $substr_chrs_c_2 = substr($chrs, $c, 2); $ord_chrs_c = ord($chrs{$c}); switch (true) { case $substr_chrs_c_2 == '\b': $utf8 .= chr(0x08); ++$c; break; case $substr_chrs_c_2 == '\t': $utf8 .= chr(0x09); ++$c; break; case $substr_chrs_c_2 == '\n': $utf8 .= chr(0x0A); ++$c; break; case $substr_chrs_c_2 == '\f': $utf8 .= chr(0x0C); ++$c; break; case $substr_chrs_c_2 == '\r': $utf8 .= chr(0x0D); ++$c; break; case $substr_chrs_c_2 == '\\"': case $substr_chrs_c_2 == '\\\'': case $substr_chrs_c_2 == '\\\\': case $substr_chrs_c_2 == '\\/': if (($delim == '"' && $substr_chrs_c_2 != '\\\'') || ($delim == "'" && $substr_chrs_c_2 != '\\"')) { $utf8 .= $chrs{++$c}; } break; case preg_match('/\\\u[0-9A-F]{4}/i', substr($chrs, $c, 6)): // single, escaped unicode character $utf16 = chr(hexdec(substr($chrs, ($c + 2), 2))) . chr(hexdec(substr($chrs, ($c + 4), 2))); $utf8 .= $this->utf162utf8($utf16); $c += 5; break; case ($ord_chrs_c >= 0x20) && ($ord_chrs_c <= 0x7F): $utf8 .= $chrs{$c}; break; case ($ord_chrs_c & 0xE0) == 0xC0: // characters U-00000080 - U-000007FF, mask 110XXXXX //see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $utf8 .= substr($chrs, $c, 2); ++$c; break; case ($ord_chrs_c & 0xF0) == 0xE0: // characters U-00000800 - U-0000FFFF, mask 1110XXXX // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $utf8 .= substr($chrs, $c, 3); $c += 2; break; case ($ord_chrs_c & 0xF8) == 0xF0: // characters U-00010000 - U-001FFFFF, mask 11110XXX // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $utf8 .= substr($chrs, $c, 4); $c += 3; break; case ($ord_chrs_c & 0xFC) == 0xF8: // characters U-00200000 - U-03FFFFFF, mask 111110XX // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $utf8 .= substr($chrs, $c, 5); $c += 4; break; case ($ord_chrs_c & 0xFE) == 0xFC: // characters U-04000000 - U-7FFFFFFF, mask 1111110X // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $utf8 .= substr($chrs, $c, 6); $c += 5; break; } } return $utf8; } elseif (preg_match('/^\[.*\]$/s', $str) || preg_match('/^\{.*\}$/s', $str)) { // array, or object notation if ($str{0} == '[') { $stk = array(SERVICES_JSON_IN_ARR); $arr = array(); } else { if ($this->use & SERVICES_JSON_LOOSE_TYPE) { $stk = array(SERVICES_JSON_IN_OBJ); $obj = array(); } else { $stk = array(SERVICES_JSON_IN_OBJ); $obj = new stdClass(); } } array_push($stk, array('what' => SERVICES_JSON_SLICE, 'where' => 0, 'delim' => false)); $chrs = substr($str, 1, -1); $chrs = $this->reduce_string($chrs); if ($chrs == '') { if (reset($stk) == SERVICES_JSON_IN_ARR) { return $arr; } else { return $obj; } } //print("\nparsing {$chrs}\n"); $strlen_chrs = strlen($chrs); for ($c = 0; $c <= $strlen_chrs; ++$c) { $top = end($stk); $substr_chrs_c_2 = substr($chrs, $c, 2); if (($c == $strlen_chrs) || (($chrs{$c} == ',') && ($top['what'] == SERVICES_JSON_SLICE))) { // found a comma that is not inside a string, array, etc., // OR we've reached the end of the character list $slice = substr($chrs, $top['where'], ($c - $top['where'])); array_push($stk, array('what' => SERVICES_JSON_SLICE, 'where' => ($c + 1), 'delim' => false)); //print("Found split at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); if (reset($stk) == SERVICES_JSON_IN_ARR) { // we are in an array, so just push an element onto the stack array_push($arr, $this->decode($slice)); } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) { // we are in an object, so figure // out the property name and set an // element in an associative array, // for now $parts = array(); if (preg_match('/^\s*(["\'].*[^\\\]["\'])\s*:\s*(\S.*),?$/Uis', $slice, $parts)) { // "name":value pair $key = $this->decode($parts[1]); $val = $this->decode($parts[2]); if ($this->use & SERVICES_JSON_LOOSE_TYPE) { $obj[$key] = $val; } else { $obj->$key = $val; } } elseif (preg_match('/^\s*(\w+)\s*:\s*(\S.*),?$/Uis', $slice, $parts)) { // name:value pair, where name is unquoted $key = $parts[1]; $val = $this->decode($parts[2]); if ($this->use & SERVICES_JSON_LOOSE_TYPE) { $obj[$key] = $val; } else { $obj->$key = $val; } } } } elseif ((($chrs{$c} == '"') || ($chrs{$c} == "'")) && ($top['what'] != SERVICES_JSON_IN_STR)) { // found a quote, and we are not inside a string array_push($stk, array('what' => SERVICES_JSON_IN_STR, 'where' => $c, 'delim' => $chrs{$c})); //print("Found start of string at {$c}\n"); } elseif (($chrs{$c} == $top['delim']) && ($top['what'] == SERVICES_JSON_IN_STR) && ((strlen(substr($chrs, 0, $c)) - strlen(rtrim(substr($chrs, 0, $c), '\\'))) % 2 != 1)) { // found a quote, we're in a string, and it's not escaped // we know that it's not escaped becase there is _not_ an // odd number of backslashes at the end of the string so far array_pop($stk); //print("Found end of string at {$c}: ".substr($chrs, $top['where'], (1 + 1 + $c - $top['where']))."\n"); } elseif (($chrs{$c} == '[') && in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { // found a left-bracket, and we are in an array, object, or slice array_push($stk, array('what' => SERVICES_JSON_IN_ARR, 'where' => $c, 'delim' => false)); //print("Found start of array at {$c}\n"); } elseif (($chrs{$c} == ']') && ($top['what'] == SERVICES_JSON_IN_ARR)) { // found a right-bracket, and we're in an array array_pop($stk); //print("Found end of array at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); } elseif (($chrs{$c} == '{') && in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { // found a left-brace, and we are in an array, object, or slice array_push($stk, array('what' => SERVICES_JSON_IN_OBJ, 'where' => $c, 'delim' => false)); //print("Found start of object at {$c}\n"); } elseif (($chrs{$c} == '}') && ($top['what'] == SERVICES_JSON_IN_OBJ)) { // found a right-brace, and we're in an object array_pop($stk); //print("Found end of object at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); } elseif (($substr_chrs_c_2 == '/*') && in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { // found a comment start, and we are in an array, object, or slice array_push($stk, array('what' => SERVICES_JSON_IN_CMT, 'where' => $c, 'delim' => false)); $c++; //print("Found start of comment at {$c}\n"); } elseif (($substr_chrs_c_2 == '*/') && ($top['what'] == SERVICES_JSON_IN_CMT)) { // found a comment end, and we're in one now array_pop($stk); $c++; for ($i = $top['where']; $i <= $c; ++$i) $chrs = substr_replace($chrs, ' ', $i, 1); //print("Found end of comment at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); } } if (reset($stk) == SERVICES_JSON_IN_ARR) { return $arr; } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) { return $obj; } } } } /** * @todo Ultimately, this should just call PEAR::isError() */ function isError($data, $code = null) { if (class_exists('pear')) { return PEAR::isError($data, $code); } elseif (is_object($data) && (get_class($data) == 'services_json_error' || is_subclass_of($data, 'services_json_error'))) { return true; } return false; } } if (class_exists('PEAR_Error')) { class Services_JSON_Error extends PEAR_Error { function Services_JSON_Error($message = 'unknown error', $code = null, $mode = null, $options = null, $userinfo = null) { parent::PEAR_Error($message, $code, $mode, $options, $userinfo); } } } else { /** * @todo Ultimately, this class shall be descended from PEAR_Error */ class Services_JSON_Error { function Services_JSON_Error($message = 'unknown error', $code = null, $mode = null, $options = null, $userinfo = null) { } } } ?> pnp4nagios-0.6.16/share/pnp/application/lib/jsonwrapper_inner.php0000664000000000000000000000056411662503006023620 0ustar rootrootencode($arg); } function json_decode($arg) { global $services_json; if (!isset($services_json)) { $services_json = new Services_JSON(); } return $services_json->decode($arg); } ?> pnp4nagios-0.6.16/share/pnp/application/controllers/0000775000000000000000000000000011662503006021135 5ustar rootrootpnp4nagios-0.6.16/share/pnp/application/controllers/page.php0000664000000000000000000000736311662503006022573 0ustar rootroottemplate = $this->add_view('template'); $this->template->page = $this->add_view('page'); $this->template->zoom_header = $this->add_view('zoom_header'); $this->template->zoom_header->graph_width = ($this->config->conf['graph_width'] + 140); $this->template->zoom_header->graph_height = ($this->config->conf['graph_height'] + 230); $this->template->page->graph_content = $this->add_view('graph_content'); $this->template->page->graph_content->graph_width = ($this->config->conf['graph_width'] + 85); $this->template->page->graph_content->timerange_select = $this->add_view('timerange_select'); $this->template->page->header = $this->add_view('header'); $this->template->page->search_box = $this->add_view('search_box'); $this->template->page->logo_box = $this->add_view('logo_box'); $this->is_authorized=TRUE; } public function index(){ if( !$this->isAuthorizedFor('pages') ){ throw new Kohana_Exception('error.auth-pages'); } $this->page = pnp::clean($this->input->get('page')); if($this->page == ""){ $this->page = $this->data->getFirstPage(); } if($this->page == ""){ throw new Kohana_Exception('error.page-config-dir', $this->config->conf['page_dir']); } if($this->view == ""){ $this->view = $this->config->conf['overview-range']; } $this->data->buildPageStruct($this->page,$this->view); $this->template->page->header->title = Kohana::lang('common.page',$this->data->PAGE_DEF['page_name']); $this->url = "?page&page=$this->page"; // Timerange Box Vars $this->template->page->timerange_box = $this->add_view('timerange_box'); $this->template->page->timerange_box->timeranges = $this->data->TIMERANGE; // Pages Box $this->pages = $this->data->getPages(); $this->template->page->pages_box = $this->add_view('pages_box'); $this->template->page->pages_box->pages = $this->pages; // Basket Box $this->template->page->basket_box = $this->add_view('basket_box'); // Icon Box $this->template->page->icon_box = $this->add_view('icon_box'); $this->template->page->icon_box->position = "page"; } public function basket(){ $basket = $this->session->get("basket"); if(is_array($basket) && sizeof($basket) > 0){ $this->data->buildBasketStruct($basket,$this->view); $this->template->page->basket_box = $this->add_view('basket_box'); $this->template->page->header->title = Kohana::lang('common.page-basket'); $this->url = "basket?"; // Timerange Box Vars $this->template->page->timerange_box = $this->add_view('timerange_box'); $this->template->page->timerange_box->timeranges = $this->data->TIMERANGE; // Pages Box $this->pages = $this->data->getPages(); $this->template->page->pages_box = $this->add_view('pages_box'); $this->template->page->pages_box->pages = $this->pages; // Icon Box $this->template->page->icon_box = $this->add_view('icon_box'); $this->template->page->icon_box->position = "basket"; }else{ url::redirect("start", 302); } } } pnp4nagios-0.6.16/share/pnp/application/controllers/docs.php0000664000000000000000000000605511662503006022604 0ustar rootroottemplate = $this->add_view('template'); $this->template->docs = $this->add_view('docs'); $this->template->docs->search_box = $this->add_view('search_box'); $this->template->docs->docs_box = $this->add_view('docs_box'); $this->template->docs->logo_box = $this->add_view('logo_box'); $this->doc_language = $this->config->conf['doc_language']; } public function index(){ url::redirect("docs/view/"); } public function view($lang=FALSE, $page=FALSE){ if($lang == FALSE){ if(!in_array($this->config->conf['lang'],$this->doc_language) ){ $this->lang = $this->doc_language[0]; }else{ $this->lang = $this->config->conf['lang'] ; } }else{ if(in_array($lang,$this->doc_language) ){ $this->lang = $lang; }else{ $this->lang = $this->doc_language[0]; url::redirect("docs/view/"); } } if($page == FALSE){ url::redirect("docs/view/".$this->lang."/start"); } $this->page = $page; $file = sprintf("documents/%s/%s.html", $this->lang, $this->page); $file_toc = sprintf("documents/%s/start.html", $this->lang); if(!file_exists($file)){ url::redirect("docs/view/start"); } $this->content = file_get_contents($file); $toc = file( $file_toc ); $this->toc = ""; $in = FALSE; foreach($toc as $t){ if(preg_match("/SECTION/", $t) ){ $in = ! $in; continue; } if($in == TRUE){ $this->toc .= $t; } } # # some string replacements # $this->toc = str_replace("/de/pnp-0.6/", "", $this->toc); $this->toc = str_replace("/pnp-0.6/", "", $this->toc); $this->toc = preg_replace("/

    .*<\/h2>/", "" , $this->toc); $this->content = str_replace("/templates/", "http://docs.pnp4nagios.org/templates/", $this->content); $this->content = str_replace("/de/pnp-0.6/", "", $this->content); $this->content = str_replace("/pnp-0.6/", "", $this->content); $this->content = str_replace("/_media", url::base()."documents/_media", $this->content); $this->content = str_replace("gallery", "", $this->content); $this->content = str_replace("/_detail", url::base()."documents/_media", $this->content); $this->content = str_replace("/lib/images", url::base()."documents/images", $this->content); $this->graph_width = ($this->config->conf['graph_width'] + 140); } } pnp4nagios-0.6.16/share/pnp/application/controllers/image.php0000664000000000000000000000526511662503006022740 0ustar rootrootauto_render = FALSE; $this->tpl = $this->input->get('tpl'); $this->start = $this->input->get('start'); $this->end = $this->input->get('end'); $this->view = $this->config->conf['overview-range']; //default value $this->source = NULL; if($this->input->get('view') != "" ) $this->view = $this->input->get('view') ; if($this->input->get('source') ) $this->source = intval($this->input->get('source')) ; if($this->input->get('w') != "" ) $this->rrdtool->config->conf['graph_width'] = intval($this->input->get('w')); if($this->input->get('graph_width') != "" ) $this->rrdtool->config->conf['graph_width'] = intval($this->input->get('graph_width')); if($this->input->get('h') != "" ) $this->rrdtool->config->conf['graph_height'] = intval($this->input->get('h')); if($this->input->get('graph_height') != "" ) $this->rrdtool->config->conf['graph_height'] = intval($this->input->get('graph_height')); $this->data->getTimeRange($this->start,$this->end,$this->view); if(isset($this->tpl)){ $this->tpl = pnp::clean($this->tpl); $this->data->buildDataStruct('__special',$this->tpl,$this->view,$this->source); #print Kohana::debug($this->data->STRUCT); $image = $this->rrdtool->doImage($this->data->STRUCT[0]['RRD_CALL']); $this->rrdtool->streamImage($image); }elseif(isset($this->host) && isset($this->service)){ $this->service = pnp::clean($this->service); $this->host = pnp::clean($this->host); $this->data->buildDataStruct($this->host,$this->service,$this->view,$this->source); if($this->auth->is_authorized($this->data->MACRO['AUTH_HOSTNAME'], $this->data->MACRO['AUTH_SERVICEDESC']) === FALSE) $this->rrdtool->streamImage("ERROR: NOT_AUTHORIZED"); #print Kohana::debug($this->data->STRUCT); if(sizeof($this->data->STRUCT) > 0){ $image = $this->rrdtool->doImage($this->data->STRUCT[0]['RRD_CALL']); }else{ $image = FALSE; } $this->rrdtool->streamImage($image); }else{ url::redirect("start", 302); } } } pnp4nagios-0.6.16/share/pnp/application/controllers/popup.php0000664000000000000000000000323011662503006023007 0ustar rootroottemplate = $this->add_view('popup'); } public function index() { $this->source = $this->input->get('source'); $this->view = ""; if(isset($_GET['view']) && $_GET['view'] != "" ){ $this->view = pnp::clean($_GET['view']); }else{ $this->view = $this->config->conf['overview-range']; } if(isset($this->config->conf['popup-width']) &&$this->config->conf['popup-width'] != ""){ $this->imgwidth = $this->config->conf['popup-width']; }else{ $this->imgwidth = FALSE; } $this->data->getTimeRange($this->start,$this->end,$this->view); if(isset($this->host) && isset($this->service)){ $this->service = pnp::clean($this->service); $this->host = pnp::clean($this->host); $this->data->buildDataStruct($this->host,$this->service,$this->view); $this->template->host = $this->host; $this->template->srv = $this->service; $this->template->view = $this->view; $this->template->source = $this->source; $this->template->end = $this->end; $this->template->start = $this->start; $this->template->imgwidth = $this->imgwidth; }else{ url::redirect("/graph"); } } } pnp4nagios-0.6.16/share/pnp/application/controllers/system.php0000664000000000000000000001705311662503006023200 0ustar rootrootdata = new Data_Model(); $this->config = new Config_Model(); $this->rrdtool = new Rrdtool_Model(); $this->auth = new Auth_Model(); #$this->system = new System_Model(); $this->config->read_config(); Kohana::config_set('locale.language',$this->config->conf['lang']); // Check for mod_rewrite $this->check_mod_rewrite(); $this->start = $this->input->get('start',FALSE); $this->end = $this->input->get('end',FALSE); $this->theme = $this->input->get('theme',FALSE); $this->view = ""; $this->host = $this->input->get('host',NULL); $this->service = $this->input->get('srv',NULL); $this->controller = Router::$controller; if(isset($_GET['view']) && $_GET['view'] != "" ) $this->view = pnp::clean($_GET['view']); $this->data->getTimeRange($this->start,$this->end,$this->view); if(Router::$controller != "image" && Router::$controller != "image_special"){ $this->session = Session::instance(); # Session withou theme info if($this->session->get("theme","new") == "new"){ if($this->theme){ # store $this->theme if available Kohana::config_set('core.theme',$this->theme); $this->session->set('theme', $this->theme ); }else{ # set $this->theme to default value $this->theme = $this->config->conf['ui-theme']; Kohana::config_set('core.theme',$this->theme); } # Sesion with theme info }else{ if($this->theme && $this->theme != 'default'){ # store $this->theme if available $this->session->set('theme', $this->theme ); Kohana::config_set('core.theme',$this->theme); }elseif($this->theme == 'default'){ # reset to default theme $this->theme = $this->config->conf['ui-theme']; $this->session->set('theme', $this->theme ); Kohana::config_set('core.theme',$this->theme); }else{ # set $this->theme with session infos $this->theme = $this->session->get('theme'); Kohana::config_set('core.theme',$this->theme); } } if($this->start && $this->end ){ if($this->session->get('timerange-reset',0) == 0){ $this->session->set("start", $this->start); $this->session->set("end", $this->end); }else{ $this->session->set('timerange-reset', 0); } } if($this->start && !$this->end){ if($this->session->get('timerange-reset',0) == 0){ $this->session->set("start", $this->start); $this->session->set("end", ""); }else{ $this->session->set('timerange-reset', 0); } } if($this->end && !$this->start){ if($this->session->get('timerange-reset',0) == 0){ $this->session->set("end", $this->end); $this->session->set("start", ""); }else{ $this->session->set('timerange-reset', 0); } } } } public function __call($method, $arguments) { // Disable auto-rendering $this->auto_render = FALSE; // By defining a __call method, all pages routed to this controller // that result in 404 errors will be handled by this method, instead of // being displayed as "Page Not Found" errors. echo $this->_("The requested page doesn't exist") . " ($method)"; } /** * Handle paths to current theme etc * */ public function add_view($view=false) { $view = trim($view); if (empty($view)) { return false; } if (!file_exists(APPPATH."/views/".$view.".php")) { return false; } #return new View($this->theme_path.$view); return new View($view); } public function check_mod_rewrite(){ if(!function_exists('apache_get_modules')){ // Add index.php to every URL while not running withn apache mod_php Kohana::config_set('core.index_page','index.php'); return TRUE; } if(!in_array('mod_rewrite', apache_get_modules())){ // Add index.php to every URL while mod_rewrite is not available Kohana::config_set('core.index_page','index.php'); } if ( $this->config->conf['use_url_rewriting'] == 0 ){ Kohana::config_set('core.index_page','index.php'); } } public function isAuthorizedFor($auth) { $conf = $this->config->conf; if ($auth == "service_links") { $users = explode(",", $conf['allowed_for_service_links']); if (in_array('EVERYONE', $users)) { return 1; } elseif (in_array('NONE', $users)) { return 0; } elseif (in_array($_SERVER["REMOTE_USER"], $users)) { return 1; } else { return 0; } } if ($auth == "host_search") { $users = explode(",", $conf['allowed_for_host_search']); if (in_array('EVERYONE', $users)) { return 1; } elseif (in_array('NONE', $users)) { return 0; } elseif (in_array($_SERVER["REMOTE_USER"], $users)) { return 1; } else { return 0; } } if ($auth == "host_overview") { $users = explode(",", $conf['allowed_for_host_overview']); if (in_array('EVERYONE', $users)) { return 1; } elseif (in_array('NONE', $users)) { return 0; } elseif (in_array($_SERVER["REMOTE_USER"], $users)) { return 1; } else { return 0; } } if ($auth == "pages") { $users = explode(",", $conf['allowed_for_pages']); if (in_array('EVERYONE', $users)) { return 1; } elseif (in_array('NONE', $users)) { return 0; } elseif (in_array($_SERVER["REMOTE_USER"], $users)) { return 1; } else { return 0; } } } public function isMobileDevice (){ if( $this->session->get('classic-ui',0) == 1){ return FALSE; } if ( preg_match('/'.$this->config->conf['mobile_devices'].'/', $_SERVER['HTTP_USER_AGENT'] ) ){ return TRUE; }else{ return FALSE; } } } pnp4nagios-0.6.16/share/pnp/application/controllers/start.php0000664000000000000000000000060011662503006022777 0ustar rootroottemplate = $this->add_view('template'); $this->template->graph = $this->add_view('graph'); $this->template->zoom_header = $this->add_view('zoom_header'); $this->template->zoom_header->graph_width = ($this->config->conf['zgraph_width'] + 140); $this->template->zoom_header->graph_height = ($this->config->conf['zgraph_height'] + 230); $this->template->graph->icon_box = $this->add_view('icon_box'); $this->template->graph->icon_box->position = "graph"; $this->template->graph->icon_box->xml_icon = TRUE; $this->template->graph->icon_box->pdf_icon = TRUE; } public function index() { $this->template->graph->graph_content = $this->add_view('graph_content'); $this->template->graph->graph_content->graph_width = ($this->config->conf['graph_width'] + 85); $this->template->graph->graph_content->timerange_select = $this->add_view('timerange_select'); $this->template->graph->header = $this->add_view('header'); $this->template->graph->search_box = $this->add_view('search_box'); $this->template->graph->service_box = $this->add_view('service_box'); $this->template->graph->basket_box = $this->add_view('basket_box'); $this->template->graph->widget_menu = $this->add_view('widget_menu'); $this->template->graph->graph_content->widget_graph = $this->add_view('widget_graph'); // Change the status box while multisite theme is in use if($this->theme == "multisite"){ $this->template->graph->status_box = $this->add_view('multisite_box'); $this->template->graph->status_box->base_url = $this->config->conf['multisite_base_url']; $this->template->graph->status_box->site = $this->config->conf['multisite_site']; }else{ $this->template->graph->status_box = $this->add_view('status_box'); } // Service Details if($this->host != "" && $this->service != ""){ $this->service = pnp::clean($this->service); $this->host = pnp::clean($this->host); $this->url = "?host=".$this->host."&srv=".$this->service; $services = $this->data->getServices($this->host); #Landingpage for mobile devices if($this->isMobileDevice()){ url::redirect( "mobile/host/".urlencode($this->host)."/".urlencode($this->service) ); } #print Kohana::debug($services); $this->data->buildDataStruct($this->host,$this->service,$this->view); $this->is_authorized = $this->auth->is_authorized($this->data->MACRO['AUTH_HOSTNAME'], $this->data->MACRO['AUTH_SERVICEDESC']); $this->title = Kohana::lang('common.service-details') . " ". $this->host ." -> " . $this->data->MACRO['DISP_SERVICEDESC']; $this->template->graph->graph_content->graph_width = ($this->data->STRUCT[0]['GRAPH_WIDTH'] + 85); // Status Box Vars $this->template->graph->status_box->host = $this->data->MACRO['DISP_HOSTNAME']; $this->template->graph->status_box->lhost = $this->data->MACRO['HOSTNAME']; $this->template->graph->status_box->service = $this->data->MACRO['DISP_SERVICEDESC']; $this->template->graph->status_box->lservice = $this->data->MACRO['SERVICEDESC']; $this->template->graph->status_box->timet = date($this->config->conf['date_fmt'],intval($this->data->MACRO['TIMET'])); // Service Box Vars $this->template->graph->service_box->services = $services; $this->template->graph->service_box->host = $this->host; // Timerange Box Vars $this->template->graph->timerange_box = $this->add_view('timerange_box'); $this->template->graph->timerange_box->timeranges = $this->data->TIMERANGE; // // Host Overview }elseif($this->host != ""){ $this->is_authorized = $this->auth->is_authorized($this->host); $this->host = pnp::clean($this->host); #Landingpage for mobile devices if($this->isMobileDevice()){ url::redirect( "mobile/host/".urlencode($this->host) ); } if($this->view == ""){ $this->view = $this->config->conf['overview-range']; } $this->url = "?host=".$this->host; $this->title = Kohana::lang('common.start'). " ". $this->host; $services = $this->data->getServices($this->host); // Status Box Vars $this->template->graph->status_box->host = $this->data->MACRO['DISP_HOSTNAME']; $this->template->graph->status_box->lhost = $this->data->MACRO['HOSTNAME']; $this->template->graph->status_box->shost = pnp::shorten($this->data->MACRO['DISP_HOSTNAME']); $this->template->graph->status_box->timet = date($this->config->conf['date_fmt'],intval($this->data->MACRO['TIMET'])); // Service Box Vars $this->template->graph->service_box->services = $services; $this->template->graph->service_box->host = $this->host; // Timerange Box Vars $this->template->graph->timerange_box = $this->add_view('timerange_box'); $this->template->graph->timerange_box->timeranges = $this->data->TIMERANGE; $this->template->graph->icon_box->xml_icon = FALSE; $this->title = Kohana::lang('common.service-overview', $this->host); foreach($services as $service){ if($service['state'] == 'active') $this->data->buildDataStruct($this->host,$service['name'],$this->view); } }else{ #Landingpage for mobile devices if($this->isMobileDevice()){ url::redirect("mobile"); return; } if($this->isAuthorizedFor('host_overview' ) ){ $this->host = $this->data->getFirstHost(); if(isset($this->host)){ url::redirect("graph?host=".$this->host); }else{ throw new Kohana_Exception('error.get-first-host'); } }else{ throw new Kohana_Exception('error.not_authorized_for_host_overview'); } } $this->template->graph->logo_box = $this->add_view('logo_box'); $this->template->graph->header->title = $this->title; } } pnp4nagios-0.6.16/share/pnp/application/controllers/mobile.php0000664000000000000000000000604311662503006023120 0ustar rootrootsession->set('classic-ui',0); $this->template = $this->add_view('mobile'); } public function index() { $this->template->home = $this->add_view('mobile_home'); } public function about() { $this->template->about = $this->add_view('mobile_about'); } public function overview() { $this->template->overview = $this->add_view('mobile_overview'); $this->template->overview->hosts = $this->data->getHosts(); } public function host($host=NULL) { $this->template->host = $this->add_view('mobile_host'); $this->is_authorized = $this->auth->is_authorized($host); $this->template->host->hostname = $host; $this->template->host->services = $this->data->getServices($host); } public function graph($host=NULL, $service=NULL) { $this->template->graph = $this->add_view('mobile_graph'); $this->data->buildDataStruct($host,$service,$this->view); $this->is_authorized = $this->auth->is_authorized($this->data->MACRO['AUTH_HOSTNAME'], $this->data->MACRO['AUTH_SERVICEDESC']); } public function search() { $this->template->query = $this->add_view('mobile_search'); $query = $this->input->post('term'); $result = array(); if(strlen($query)>=1) { $hosts = $this->data->getHosts(); foreach($hosts as $host){ if(preg_match("/$query/i",$host['name'])){ array_push($result,$host['name']); } } } $this->result = $result; } public function pages($page=NULL) { $this->is_authorized=TRUE; if($this->view == ""){ $this->view = $this->config->conf['overview-range']; } $this->page = $page; if(is_null($this->page) ){ $this->template->pages = $this->add_view('mobile_pages'); $this->template->pages->pages = $this->data->getPages(); return; } $this->data->buildPageStruct($this->page,$this->view); $this->template->pages = $this->add_view('mobile_graph'); } public function special($tpl=NULL) { $this->tpl = $tpl; if(is_null($this->tpl) ){ $this->template->special = $this->add_view('mobile_special'); $this->template->special->templates = $this->data->getSpecialTemplates(); return; } $this->data->buildDataStruct('__special',$this->tpl,$this->view); $this->template->special = $this->add_view('mobile_graph_special'); } public function go($goto=FALSE) { if($goto == 'classic'){ $this->session->set('classic-ui',1); url::redirect("graph"); } } } pnp4nagios-0.6.16/share/pnp/application/controllers/xml.php0000664000000000000000000000360511662503006022452 0ustar rootrootconfig->read_config(); } public function index() { $this->auto_render = FALSE; if(isset($this->host) && isset($this->service)){ $this->service = pnp::clean($this->service); $this->host = pnp::clean($this->host); }elseif(isset($this->host)){ $this->host = pnp::clean($this->host); $this->service = "_HOST_"; }else{ throw new Kohana_User_Exception('No Options', "RTFM my Friend, RTFM!"); } $this->data->readXML($this->host, $this->service); if($this->auth->is_authorized($this->data->MACRO['AUTH_HOSTNAME'], $this->data->MACRO['AUTH_SERVICEDESC']) === FALSE){ header('Content-Type: application/xml'); print "\n"; print "\n"; print "not authorized\n"; print "\n"; exit; }else{ $xmlfile = $this->config->conf['rrdbase'].$this->host."/".$this->service.".xml"; if(is_readable($xmlfile)){ $fh = fopen($xmlfile, 'r'); header('Content-Type: application/xml'); fpassthru($fh); fclose($fh); exit; }else{ header('Content-Type: application/xml'); print "\n"; print "\n"; print "file not found\n"; print "\n"; } } } } pnp4nagios-0.6.16/share/pnp/application/controllers/zoom.php0000664000000000000000000000542311662503006022636 0ustar rootroottemplate = $this->add_view('zoom'); $this->tpl = $this->input->get('tpl'); $this->graph_width = $this->config->conf['zgraph_width']; $this->graph_height = $this->config->conf['zgraph_height']; } public function index() { $this->source = $this->input->get('source'); $this->view = ""; if(isset($_GET['view']) && $_GET['view'] != "" ){ $this->view = pnp::clean($_GET['view']); }else{ $this->view = $this->config->conf['overview-range']; } # # Limit startto 2000/01/01 # $start_limit = strtotime("2000/01/01"); $this->start = abs((int)$this->start); if($this->start < $start_limit) $this->start = $start_limit; # # Limit end to now + one hour # $end_limit = time() + 3600; $this->end = abs((int)$this->end); if($this->end > $end_limit) $this->end = $end_limit; $this->data->getTimeRange($this->start,$this->end,$this->view); if(isset($this->tpl) && $this->tpl != 'undefined' ){ if($this->start && $this->end ){ $this->session->set("start", $this->start); $this->session->set("end", $this->end); } $this->template->tpl = $this->tpl; $this->template->view = $this->view; $this->template->source = $this->source; $this->template->end = $this->end; $this->template->start = $this->start; $this->url = "?tpl=".$this->tpl; $this->template->graph_height = $this->graph_height; $this->template->graph_width = $this->graph_width; }elseif(isset($this->host) && isset($this->service)){ if($this->start && $this->end ){ $this->session->set("start", $this->start); $this->session->set("end", $this->end); } $this->template->host = $this->host; $this->template->srv = $this->service; $this->template->view = $this->view; $this->template->source = $this->source; $this->template->end = $this->end; $this->template->start = $this->start; $this->url = "?host=".$this->host."&srv=".$this->service; $this->template->graph_height = $this->graph_height; $this->template->graph_width = $this->graph_width; }else{ url::redirect("/graph"); } } } pnp4nagios-0.6.16/share/pnp/application/controllers/debug.php0000664000000000000000000000534311662503006022741 0ustar rootroottemplate = $this->add_view('template'); $this->template->debug = $this->add_view('debug'); } public function index() { $this->view = ""; if(isset($_GET['view']) && $_GET['view'] != "" ) $this->view = pnp::clean($_GET['view']); $this->data->getTimeRange($this->start,$this->end,$this->view); if(isset($this->host) && isset($this->service)){ $this->service = pnp::clean($this->service); $this->host = pnp::clean($this->host); $this->url = "?host=".$this->host."&srv=".$this->service; if($this->start){ $this->url .= "&start=".$this->start; $this->session->set("start", $this->start); } if($this->end){ $this->url .= "&end=".$this->end; $this->session->set("end", $this->end); } $services = $this->data->getServices($this->host); $this->data->buildDataStruct($this->host,$this->service,$this->view); $this->is_authorized = $this->auth->is_authorized($this->data->MACRO['AUTH_HOSTNAME'], $this->data->MACRO['AUTH_SERVICEDESC']); $this->title = "Service Details ". $this->host ." -> " . $this->data->MACRO['DISP_SERVICEDESC']; }elseif(isset($this->host)){ $this->host = pnp::clean($this->host); $this->is_authorized = $this->auth->is_authorized($this->host); if($this->view == ""){ $this->view = $this->config->conf['overview-range']; } if($this->start){ $this->url .= "&start=".$this->start; $this->session->set("start", $this->start); } if($this->end){ $this->url .= "&end=".$this->end; $this->session->set("end", $this->end); } $this->title = "Start $this->host"; $services = $this->data->getServices($this->host); $this->title = "Service Overview for $this->host"; foreach($services as $service){ if($service['state'] == 'active') $this->data->buildDataStruct($this->host,$service['name'],$this->view); } }else{ if(isset($this->host)){ url::redirect("/graph"); }else{ throw new Kohana_Exception('error.get-first-host'); } } } } pnp4nagios-0.6.16/share/pnp/application/controllers/json.php0000664000000000000000000000625011662503006022622 0ustar rootrootauto_render = FALSE; // Service Details if($this->host != "" && $this->service != ""){ $this->service = pnp::clean($this->service); $this->host = pnp::clean($this->host); $services = $this->data->getServices($this->host); $this->data->buildDataStruct($this->host,$this->service,$this->view); if($this->auth->is_authorized($this->data->MACRO['AUTH_HOSTNAME'], $this->data->MACRO['AUTH_SERVICEDESC']) === FALSE){ print json_encode("not authorized"); exit; } $i = 0; $json = array(); foreach($this->data->STRUCT as $struct){ $json[$i]['image_url'] = "host=".$struct['MACRO']['HOSTNAME']."&srv=".$struct['MACRO']['SERVICEDESC']."&source=".$struct['SOURCE']."&view=".$struct['VIEW']; $json[$i]['ds_name'] = $struct['ds_name']; $json[$i]['start'] = $struct['TIMERANGE']['start']; $json[$i]['end'] = $struct['TIMERANGE']['end']; $json[$i]['title'] = $struct['TIMERANGE']['title']; $i++; } print json_encode($json); // Host Overview }elseif($this->host != ""){ if($this->auth->is_authorized($this->host) === FALSE){ print json_encode("not authorized"); exit; } $this->host = pnp::clean($this->host); $services = $this->data->getServices($this->host); foreach($services as $service){ if($service['state'] == 'active'){ $this->data->buildDataStruct($this->host,$service['name'],$this->view); } } $i = 0; $json = array(); foreach($this->data->STRUCT as $struct){ $json[$i]['image_url'] = "host=".$struct['MACRO']['HOSTNAME']."&srv=".$struct['MACRO']['SERVICEDESC']."&source=".$struct['SOURCE']."&view=".$struct['VIEW']; $json[$i]['servicedesc'] = $struct['MACRO']['SERVICEDESC']; $json[$i]['ds_name'] = $struct['ds_name']; $json[$i]['start'] = $struct['TIMERANGE']['start']; $json[$i]['end'] = $struct['TIMERANGE']['end']; $json[$i]['title'] = $struct['TIMERANGE']['title']; $i++; } print json_encode($json); }else{ $this->hosts = $this->data->getHosts(); $i = 0; $json = array(); foreach($this->hosts as $host){ if($host['state'] == "active"){ $json[$i]['hostname'] = $host['name']; $i++; } } print json_encode($json); } } } pnp4nagios-0.6.16/share/pnp/application/controllers/xport.php0000664000000000000000000000647511662503006023036 0ustar rootrootauto_render = FALSE; $this->view = 0; //fake value $this->source = ""; if($this->input->get('view') != "" ) $this->view = $this->input->get('view') ; if($this->input->get('source') ) $this->source = $this->input->get('source') ; $this->data->getTimeRange($this->start,$this->end,$this->view); } public function xml(){ if(isset($this->host) && isset($this->service)){ $this->service = pnp::clean($this->service); $this->host = pnp::clean($this->host); $this->data->buildXport($this->host,$this->service); if($this->auth->is_authorized($this->data->MACRO['AUTH_HOSTNAME'], $this->data->MACRO['AUTH_SERVICEDESC']) === FALSE){ header('Content-Type: application/xml'); print "\n"; print "\n"; print "not authorized\n"; print "\n"; exit; } $data = $this->rrdtool->doXport($this->data->XPORT); header('Content-Type: application/xml'); print $data; }else{ throw new Kohana_Exception('error.xport-host-service'); } } public function json(){ if(isset($this->host) && isset($this->service)){ $this->service = pnp::clean($this->service); $this->host = pnp::clean($this->host); $this->data->buildXport($this->host,$this->service); if($this->auth->is_authorized($this->data->MACRO['AUTH_HOSTNAME'], $this->data->MACRO['AUTH_SERVICEDESC']) === FALSE){ header('Content-type: application/json'); print json_encode("not authorized"); exit; } $data = $this->rrdtool->doXport($this->data->XPORT); $json = json_encode(simplexml_load_string($data)); header('Content-type: application/json'); print $json; }else{ throw new Kohana_Exception('error.xport-host-service'); } } public function csv(){ if(isset($this->host) && isset($this->service)){ $this->service = pnp::clean($this->service); $this->host = pnp::clean($this->host); $this->data->buildXport($this->host,$this->service); if($this->auth->is_authorized($this->data->MACRO['AUTH_HOSTNAME'], $this->data->MACRO['AUTH_SERVICEDESC']) === FALSE){ header("Content-Type: text/plain; charset=UTF-8"); print "not authorized"; exit; } $data = $this->rrdtool->doXport($this->data->XPORT); $csv = $this->data->xml2csv($data); header("Content-Type: text/plain; charset=UTF-8"); print $csv; }else{ throw new Kohana_Exception('error.xport-host-service'); } } } pnp4nagios-0.6.16/share/pnp/application/controllers/ajax.php0000664000000000000000000001202411662503006022570 0ustar rootrootauto_render = FALSE; } public function index(){ url::redirect("start", 302); } public function search() { $query = $this->input->get('term'); $result = array(); if(strlen($query)>=1) { $hosts = $this->data->getHosts(); foreach($hosts as $host){ if(preg_match("/$query/i",$host['name'])){ array_push($result,$host['name']); } } echo json_encode($result); } } public function remove($what){ if($what == 'timerange'){ $this->session->delete('start'); $this->session->delete('end'); $this->session->set('timerange-reset', 1); } } public function basket($action=FALSE){ // Disable auto-rendering $this->auto_render = FALSE; $host = false; $service = false; $basket = array(); if($action == "list"){ $basket = $this->session->get("basket"); if(is_array($basket) && sizeof($basket) > 0){ foreach($basket as $item){ printf("
  • %s
  • \n", "basket_action_remove", $item, $item, Kohana::lang('common.basket-remove', $item), url::base(), pnp::shorten($item) ); } } }elseif($action == "add"){ $item = $_POST['item']; $basket = $this->session->get("basket"); if(!is_array($basket)){ $basket[] = "$item"; }else{ if(!in_array($item,$basket)){ $basket[] = $item; } } $this->session->set("basket", $basket); foreach($basket as $item){ printf("
  • %s
  • \n", "basket_action_remove", $item, $item, Kohana::lang('common.basket-remove', $item), url::base(), pnp::shorten($item) ); } }elseif($action == "sort"){ $items = $_POST['items']; $basket = explode(',', $items); array_pop($basket); $this->session->set("basket", $basket); foreach($basket as $item){ printf("
  • %s
  • \n", "basket_action_remove", $item, $item, Kohana::lang('common.basket-remove', $item), url::base(), pnp::shorten($item) ); } }elseif($action == "remove"){ $basket = $this->session->get("basket"); $item_to_remove = $_POST['item']; $new_basket = array(); foreach($basket as $item){ if($item == $item_to_remove){ continue; } $new_basket[] = $item; } $basket = $new_basket; $this->session->set("basket", $basket); foreach($basket as $item){ printf("
  • %s
  • \n", "basket_action_remove", $item, $item, Kohana::lang('common.basket-remove', $item), url::base(), pnp::shorten($item) ); } }elseif($action == "clear"){ $this->session->delete("basket"); }else{ echo "Action $action not known"; } $basket = $this->session->get("basket"); if(is_array($basket) && sizeof($basket) == 0){ echo Kohana::lang('common.basket-empty'); }else{ echo "
    \n"; echo "\n"; echo "\n"; echo "
    \n"; } } } pnp4nagios-0.6.16/share/pnp/application/controllers/special.php0000664000000000000000000000513511662503006023272 0ustar rootroottemplate = $this->add_view('template'); $this->template->graph = $this->add_view('graph'); $this->tpl = $this->input->get('tpl'); $this->templates = $this->data->getSpecialTemplates(); $this->data->GRAPH_TYPE = 'special'; if($this->tpl == ''){ if($this->templates) $this->tpl = $this->templates[0]; url::redirect('special?tpl='.$this->tpl, 302); } } public function index(){ $this->url = "?tpl=".$this->tpl; $this->template->zoom_header = $this->add_view('zoom_header'); $this->template->zoom_header->graph_width = ($this->config->conf['graph_width'] + 140); $this->template->zoom_header->graph_height = ($this->config->conf['graph_height'] + 230); $this->template->graph->graph_content = $this->add_view('graph_content_special'); $this->template->graph->graph_content->graph_width = ($this->config->conf['graph_width'] + 85); $this->template->graph->graph_content->timerange_select = $this->add_view('timerange_select'); $this->template->graph->header = $this->add_view('header'); $this->template->graph->search_box = $this->add_view('search_box'); $this->template->graph->service_box = $this->add_view('special_templates_box'); #$this->template->graph->status_box = $this->add_view('status_box'); #$this->template->graph->basket_box = $this->add_view('basket_box'); $this->template->graph->widget_menu = $this->add_view('widget_menu'); $this->template->graph->graph_content->widget_graph = $this->add_view('widget_graph'); #print Kohana::debug($services); $this->data->buildDataStruct('__special',$this->tpl,$this->view); $this->template->graph->icon_box = $this->add_view('icon_box'); $this->template->graph->icon_box->position = "special"; $this->template->graph->logo_box = $this->add_view('logo_box'); // Timerange Box Vars $this->template->graph->timerange_box = $this->add_view('timerange_box'); $this->template->graph->timerange_box->timeranges = $this->data->TIMERANGE; $this->template->graph->header->title = $this->data->MACRO['TITLE']; //print Kohana::debug($this->data); } } pnp4nagios-0.6.16/share/pnp/application/controllers/pdf.php0000664000000000000000000002707411662503006022431 0ustar rootrootuse_bg = 0; $this->bg = $this->config->conf['background_pdf']; $this->pdf_page_size = $this->config->conf['pdf_page_size']; $this->pdf_margin_left = $this->config->conf['pdf_margin_left']; $this->pdf_margin_top = $this->config->conf['pdf_margin_top']; $this->pdf_margin_right = $this->config->conf['pdf_margin_right']; // Define PDF background per url option if(isset($this->bg) && $this->bg != ""){ if( is_readable( Kohana::config( 'core.pnp_etc_path')."/".$this->bg ) ){ $this->bg = Kohana::config('core.pnp_etc_path')."/".$this->bg; }else{ $this->bg = $this->config->conf['background_pdf']; } } // Use PDF background if readable if(is_readable($this->bg)){ $this->use_bg = 1; } } public function index(){ $this->tpl = $this->input->get('tpl'); $this->view = ""; $this->type = "normal"; if(isset($_GET['view']) && $_GET['view'] != "" ){ $this->view = pnp::clean($_GET['view']); } $this->data->getTimeRange($this->start,$this->end,$this->view); // Service Details if($this->host != "" && $this->service != ""){ $this->service = pnp::clean($this->service); $this->host = pnp::clean($this->host); $this->data->buildDataStruct($this->host,$this->service,$this->view); // Host Overview }elseif($this->host != ""){ $this->host = pnp::clean($this->host); if($this->view == ""){ $this->view = $this->config->conf['overview-range']; } $services = $this->data->getServices($this->host); foreach($services as $service){ if($service['state'] == 'active') $this->data->buildDataStruct($this->host,$service['name'],$this->view); } // Special Templates }elseif($this->tpl != ""){ $this->data->buildDataStruct('__special',$this->tpl,$this->view); $this->type = 'special'; }else{ $this->host = $this->data->getFirstHost(); if(isset($this->host)){ url::redirect("/graph?host=$this->host"); }else{ throw new Kohana_User_Exception('Hostname not set ;-)', "RTFM my Friend, RTFM!"); } } #throw new Kohana_Exception(print_r($this->data->STRUCT,TRUE)); /* * PDF Output */ $pdf = new PDF("P", "mm", $this->pdf_page_size); $pdf->AliasNbPages(); $pdf->SetAutoPageBreak('off'); $pdf->SetMargins($this->pdf_margin_left,$this->pdf_margin_top,$this->pdf_margin_right); $pdf->AddPage(); if($this->use_bg){ $pdf->setSourceFile($this->bg); $tplIdx = $pdf->importPage(1,'/MediaBox'); $pdf->useTemplate($tplIdx); } $pdf->SetCreator('Created with PNP'); $pdf->SetFont('Arial', '', 10); // Title $header = TRUE; foreach($this->data->STRUCT as $key=>$data){ if($key != 0){ $header = FALSE; } if ($pdf->GetY() > 200) { $pdf->AddPage(); if($this->use_bg){$pdf->useTemplate($tplIdx);} } if($this->type == 'normal'){ if($data['LEVEL'] == 0){ $pdf->SetFont('Arial', '', 12); $pdf->CELL(120, 10, $data['MACRO']['DISP_HOSTNAME']." -- ".$data['MACRO']['DISP_SERVICEDESC'], 0, 1); $pdf->SetFont('Arial', '', 10); $pdf->CELL(120, 5, $data['TIMERANGE']['title']." (".$data['TIMERANGE']['f_start']." - ".$data['TIMERANGE']['f_end'].")", 0, 1); $pdf->SetFont('Arial', '', 8); $pdf->CELL(120, 5, "Datasource ".$data["ds_name"], 0, 1); }else{ $pdf->SetFont('Arial', '', 8); $pdf->CELL(120, 5, "Datasource ".$data["ds_name"], 0, 1); } }elseif($this->type == 'special'){ if($header){ $pdf->SetFont('Arial', '', 12); $pdf->CELL(120, 10, $data['MACRO']['TITLE'], 0, 1); $pdf->SetFont('Arial', '', 10); $pdf->CELL(120, 5, $data['TIMERANGE']['title']." (".$data['TIMERANGE']['f_start']." - ".$data['TIMERANGE']['f_end'].")", 0, 1); $pdf->SetFont('Arial', '', 8); $pdf->CELL(120, 5, "Datasource ".$data["ds_name"], 0, 1); }else{ $pdf->SetFont('Arial', '', 10); $pdf->CELL(120, 5, $data['TIMERANGE']['title']." (".$data['TIMERANGE']['f_start']." - ".$data['TIMERANGE']['f_end'].")", 0, 1); $pdf->SetFont('Arial', '', 8); $pdf->CELL(120, 5, "Datasource ".$data["ds_name"], 0, 1); } } $image = $this->rrdtool->doImage($data['RRD_CALL'],$out='PDF'); $img = $this->rrdtool->saveImage($image); $Y = $pdf->GetY(); $cell_height = ($img['height'] * 0.23); $cell_width = ($img['width'] * 0.23); $pdf->Image($img['file'], $this->pdf_margin_left, $Y, $cell_width, $cell_height, 'PNG'); $pdf->CELL(120, $cell_height, '', 0, 1); unlink($img['file']); } $pdf->Output("pnp4nagios.pdf","I"); } public function page($page){ $this->start = $this->input->get('start'); $this->end = $this->input->get('end'); $this->view = ""; if(isset($_GET['view']) && $_GET['view'] != "" ){ $this->view = pnp::clean($_GET['view']); } $this->data->getTimeRange($this->start,$this->end,$this->view); $this->data->buildPageStruct($page,$this->view); // Define PDF background per url option if(isset($this->data->PAGE_DEF['background_pdf'])){ if( is_readable( Kohana::config( 'core.pnp_etc_path')."/".$this->data->PAGE_DEF['background_pdf'] ) ){ $this->bg = Kohana::config('core.pnp_etc_path')."/".$this->data->PAGE_DEF['background_pdf']; } } /* * PDF Output */ $pdf = new PDF("P", "mm", $this->pdf_page_size); $pdf->AliasNbPages(); $pdf->SetAutoPageBreak('off'); $pdf->SetMargins($this->pdf_margin_left,$this->pdf_margin_top,$this->pdf_margin_right); $pdf->AddPage(); if($this->use_bg){ $pdf->setSourceFile($this->bg); $tplIdx = $pdf->importPage(1,'/MediaBox'); $pdf->useTemplate($tplIdx); } $pdf->SetCreator('Created with PNP'); $pdf->SetFont('Arial', '', 10); // Title foreach($this->data->STRUCT as $data){ if ($pdf->GetY() > 200) { $pdf->AddPage(); if($this->use_bg){$pdf->useTemplate($tplIdx);} } if($data['LEVEL'] == 0){ $pdf->SetFont('Arial', '', 12); $pdf->CELL(120, 10, $data['MACRO']['DISP_HOSTNAME']." -- ".$data['MACRO']['DISP_SERVICEDESC'], 0, 1); $pdf->SetFont('Arial', '', 10); $pdf->CELL(120, 5, $data['TIMERANGE']['title']." (".$data['TIMERANGE']['f_start']." - ".$data['TIMERANGE']['f_end'].")", 0, 1); $pdf->SetFont('Arial', '', 8); $pdf->CELL(120, 5, "Datasource ".$data["ds_name"], 0, 1); }else{ $pdf->SetFont('Arial', '', 8); $pdf->CELL(120, 5, "Datasource ".$data["ds_name"], 0, 1); } $image = $this->rrdtool->doImage($data['RRD_CALL'],$out='PDF'); $img = $this->rrdtool->saveImage($image); $Y = $pdf->GetY(); $cell_height = ($img['height'] * 0.23); $cell_width = ($img['width'] * 0.23); $pdf->Image($img['file'], $this->pdf_margin_left, $Y, $cell_width, $cell_height, 'PNG'); $pdf->CELL(120, $cell_height, '', 0, 1); unlink($img['file']); } $pdf->Output("pnp4nagios.pdf","I"); } public function basket(){ $this->start = $this->input->get('start'); $this->end = $this->input->get('end'); $this->view = ""; if(isset($_GET['view']) && $_GET['view'] != "" ){ $this->view = pnp::clean($_GET['view']); } $this->data->getTimeRange($this->start,$this->end,$this->view); $basket = $this->session->get("basket"); if(is_array($basket) && sizeof($basket) > 0){ $this->data->buildBasketStruct($basket,$this->view); } //echo Kohana::debug($this->data->STRUCT); /* * PDF Output */ $pdf = new PDF("P", "mm", $this->pdf_page_size); $pdf->AliasNbPages(); $pdf->SetAutoPageBreak('off'); $pdf->SetMargins($this->pdf_margin_left,$this->pdf_margin_top,$this->pdf_margin_right); $pdf->AddPage(); if($this->use_bg){ $pdf->setSourceFile($this->config->conf['background_pdf']); $tplIdx = $pdf->importPage(1,'/MediaBox'); $pdf->useTemplate($tplIdx); } $pdf->SetCreator('Created with PNP'); $pdf->SetFont('Arial', '', 10); // Title foreach($this->data->STRUCT as $data){ if ($pdf->GetY() > 200) { $pdf->AddPage(); if($this->use_bg){$pdf->useTemplate($tplIdx);} } if($data['LEVEL'] == 0){ $pdf->SetFont('Arial', '', 12); $pdf->CELL(120, 10, $data['MACRO']['DISP_HOSTNAME']." -- ".$data['MACRO']['DISP_SERVICEDESC'], 0, 1); $pdf->SetFont('Arial', '', 10); $pdf->CELL(120, 5, $data['TIMERANGE']['title']." (".$data['TIMERANGE']['f_start']." - ".$data['TIMERANGE']['f_end'].")", 0, 1); $pdf->SetFont('Arial', '', 8); $pdf->CELL(120, 5, "Datasource ".$data["ds_name"], 0, 1); }else{ $pdf->SetFont('Arial', '', 8); $pdf->CELL(120, 5, "Datasource ".$data["ds_name"], 0, 1); } $image = $this->rrdtool->doImage($data['RRD_CALL'],$out='PDF'); $img = $this->rrdtool->saveImage($image); $Y = $pdf->GetY(); $cell_height = ($img['height'] * 0.23); $cell_width = ($img['width'] * 0.23); $pdf->Image($img['file'], $this->pdf_margin_left, $Y, $cell_width, $cell_height, 'PNG'); $pdf->CELL(120, $cell_height, '', 0, 1); unlink($img['file']); } $pdf->Output("pnp4nagios.pdf","I"); } } /* + * */ require Kohana::find_file('vendor/fpdf', 'fpdf'); require Kohana::find_file('vendor/fpdf', 'fpdi'); class PDF extends FPDI { //Page header function Header() { //Arial bold 10 $this->SetFont('Arial', 'B', 10); } //Page footer function Footer() { //Position at 1.5 cm from bottom $this->SetY(-20); //Arial italic 8 $this->SetFont('Arial', 'I', 8); //Page number $this->Cell(0, 10, $this->PageNo() . '/{nb}', 0, 0, 'C'); } } pnp4nagios-0.6.16/share/pnp/application/config/0000775000000000000000000000000011662503006020034 5ustar rootrootpnp4nagios-0.6.16/share/pnp/application/config/session.php0000664000000000000000000000232511662503006022232 0ustar rootrootfile =& $f; if (is_string($this->file)) $this->_mode = 1; $this->reset(); } // Optionally move the file // pointer to a new location // and reset the buffered data function reset($pos = null, $l = 100) { if ($this->_mode == 0) { if (!is_null ($pos)) { fseek ($this->file, $pos); } $this->buffer = $l > 0 ? fread($this->file, $l) : ''; $this->length = strlen($this->buffer); if ($this->length < $l) $this->increase_length($l - $this->length); } else { $this->buffer = $this->file; $this->length = strlen($this->buffer); } $this->offset = 0; $this->stack = array(); } // Make sure that there is at least one // character beyond the current offset in // the buffer to prevent the tokenizer // from attempting to access data that does // not exist function ensure_content() { if ($this->offset >= $this->length - 1) { return $this->increase_length(); } else { return true; } } // Forcefully read more data into the buffer function increase_length($l=100) { if ($this->_mode == 0 && feof($this->file)) { return false; } else if ($this->_mode == 0) { $totalLength = $this->length + $l; do { $this->buffer .= fread($this->file, $totalLength-$this->length); } while ((($this->length = strlen($this->buffer)) != $totalLength) && !feof($this->file)); return true; } else { return false; } } }pnp4nagios-0.6.16/share/pnp/application/vendor/fpdf/fpdi2tcpdf_bridge.php0000664000000000000000000001262011662503006025056 0ustar rootrootPDFVersion; case 'k': return $this->k; default: // Error handling $this->Error('Cannot access protected property '.get_class($this).':$'.$name.' / Undefined property: '.get_class($this).'::$'.$name); } } function __set($name, $value) { switch ($name) { case 'PDFVersion': $this->PDFVersion = $value; break; default: // Error handling $this->Error('Cannot access protected property '.get_class($this).':$'.$name.' / Undefined property: '.get_class($this).'::$'.$name); } } /** * Encryption of imported data by FPDI * * @param array $value */ function pdf_write_value(&$value) { switch ($value[0]) { case PDF_TYPE_STRING : if ($this->encrypted) { $value[1] = $this->_unescape($value[1]); $value[1] = $this->_RC4($this->_objectkey($this->_current_obj_id), $value[1]); $value[1] = $this->_escape($value[1]); } break; case PDF_TYPE_STREAM : if ($this->encrypted) { $value[2][1] = $this->_RC4($this->_objectkey($this->_current_obj_id), $value[2][1]); } break; case PDF_TYPE_HEX : if ($this->encrypted) { $value[1] = $this->hex2str($value[1]); $value[1] = $this->_RC4($this->_objectkey($this->_current_obj_id), $value[1]); // remake hexstring of encrypted string $value[1] = $this->str2hex($value[1]); } break; } } /** * Unescapes a PDF string * * @param string $s * @return string */ function _unescape($s) { $out = ''; for ($count = 0, $n = strlen($s); $count < $n; $count++) { if ($s[$count] != '\\' || $count == $n-1) { $out .= $s[$count]; } else { switch ($s[++$count]) { case ')': case '(': case '\\': $out .= $s[$count]; break; case 'f': $out .= chr(0x0C); break; case 'b': $out .= chr(0x08); break; case 't': $out .= chr(0x09); break; case 'r': $out .= chr(0x0D); break; case 'n': $out .= chr(0x0A); break; case "\r": if ($count != $n-1 && $s[$count+1] == "\n") $count++; break; case "\n": break; default: // Octal-Values if (ord($s[$count]) >= ord('0') && ord($s[$count]) <= ord('9')) { $oct = ''. $s[$count]; if (ord($s[$count+1]) >= ord('0') && ord($s[$count+1]) <= ord('9')) { $oct .= $s[++$count]; if (ord($s[$count+1]) >= ord('0') && ord($s[$count+1]) <= ord('9')) { $oct .= $s[++$count]; } } $out .= chr(octdec($oct)); } else { $out .= $s[$count]; } } } } return $out; } /** * Hexadecimal to string * * @param string $hex * @return string */ function hex2str($hex) { return pack('H*', str_replace(array("\r", "\n", ' '), '', $hex)); } /** * String to hexadecimal * * @param string $str * @return string */ function str2hex($str) { return current(unpack('H*', $str)); } }pnp4nagios-0.6.16/share/pnp/application/vendor/fpdf/fpdf_tpl.php0000664000000000000000000003243411662503006023320 0ustar rootrootpage <= 0) $this->error("You have to add a page to fpdf first!"); if ($x == null) $x = 0; if ($y == null) $y = 0; if ($w == null) $w = $this->w; if ($h == null) $h = $this->h; // Save settings $this->tpl++; $tpl =& $this->tpls[$this->tpl]; $tpl = array( 'o_x' => $this->x, 'o_y' => $this->y, 'o_AutoPageBreak' => $this->AutoPageBreak, 'o_bMargin' => $this->bMargin, 'o_tMargin' => $this->tMargin, 'o_lMargin' => $this->lMargin, 'o_rMargin' => $this->rMargin, 'o_h' => $this->h, 'o_w' => $this->w, 'buffer' => '', 'x' => $x, 'y' => $y, 'w' => $w, 'h' => $h ); $this->SetAutoPageBreak(false); // Define own high and width to calculate possitions correct $this->h = $h; $this->w = $w; $this->_intpl = true; $this->SetXY($x+$this->lMargin, $y+$this->tMargin); $this->SetRightMargin($this->w-$w+$this->rMargin); return $this->tpl; } /** * End Template * * This method ends a template and reset initiated variables on beginTemplate. * * @return mixed If a template is opened, the ID is returned. If not a false is returned. */ function endTemplate() { if ($this->_intpl) { $this->_intpl = false; $tpl =& $this->tpls[$this->tpl]; $this->SetXY($tpl['o_x'], $tpl['o_y']); $this->tMargin = $tpl['o_tMargin']; $this->lMargin = $tpl['o_lMargin']; $this->rMargin = $tpl['o_rMargin']; $this->h = $tpl['o_h']; $this->w = $tpl['o_w']; $this->SetAutoPageBreak($tpl['o_AutoPageBreak'], $tpl['o_bMargin']); return $this->tpl; } else { return false; } } /** * Use a Template in current Page or other Template * * You can use a template in a page or in another template. * You can give the used template a new size like you use the Image()-method. * All parameters are optional. The width or height is calculated automaticaly * if one is given. If no parameter is given the origin size as defined in * beginTemplate() is used. * The calculated or used width and height are returned as an array. * * @param int $tplidx A valid template-Id * @param int $_x The x-position * @param int $_y The y-position * @param int $_w The new width of the template * @param int $_h The new height of the template * @retrun array The height and width of the template */ function useTemplate($tplidx, $_x=null, $_y=null, $_w=0, $_h=0) { if ($this->page <= 0) $this->error("You have to add a page to fpdf first!"); if (!isset($this->tpls[$tplidx])) $this->error("Template does not exist!"); if ($this->_intpl) { $this->_res['tpl'][$this->tpl]['tpls'][$tplidx] =& $this->tpls[$tplidx]; } $tpl =& $this->tpls[$tplidx]; $w = $tpl['w']; $h = $tpl['h']; if ($_x == null) $_x = 0; if ($_y == null) $_y = 0; $_x += $tpl['x']; $_y += $tpl['y']; $wh = $this->getTemplateSize($tplidx, $_w, $_h); $_w = $wh['w']; $_h = $wh['h']; $tData = array( 'x' => $this->x, 'y' => $this->y, 'w' => $_w, 'h' => $_h, 'scaleX' => ($_w/$w), 'scaleY' => ($_h/$h), 'tx' => $_x, 'ty' => ($this->h-$_y-$_h), 'lty' => ($this->h-$_y-$_h) - ($this->h-$h) * ($_h/$h) ); $this->_out(sprintf("q %.4F 0 0 %.4F %.4F %.4F cm", $tData['scaleX'], $tData['scaleY'], $tData['tx']*$this->k, $tData['ty']*$this->k)); // Translate $this->_out(sprintf('%s%d Do Q', $this->tplprefix, $tplidx)); $this->lastUsedTemplateData = $tData; return array("w" => $_w, "h" => $_h); } /** * Get The calculated Size of a Template * * If one size is given, this method calculates the other one. * * @param int $tplidx A valid template-Id * @param int $_w The width of the template * @param int $_h The height of the template * @return array The height and width of the template */ function getTemplateSize($tplidx, $_w=0, $_h=0) { if (!$this->tpls[$tplidx]) return false; $tpl =& $this->tpls[$tplidx]; $w = $tpl['w']; $h = $tpl['h']; if ($_w == 0 and $_h == 0) { $_w = $w; $_h = $h; } if($_w==0) $_w = $_h*$w/$h; if($_h==0) $_h = $_w*$h/$w; return array("w" => $_w, "h" => $_h); } /** * See FPDF/TCPDF-Documentation ;-) */ function SetFont($family, $style='', $size=0, $fontfile='') { if (!is_subclass_of($this, 'TCPDF') && func_num_args() > 3) { $this->Error('More than 3 arguments for the SetFont method are only available in TCPDF.'); } /** * force the resetting of font changes in a template */ if ($this->_intpl) $this->FontFamily = ''; parent::SetFont($family, $style, $size, $fontfile); $fontkey = $this->FontFamily.$this->FontStyle; if ($this->_intpl) { $this->_res['tpl'][$this->tpl]['fonts'][$fontkey] =& $this->fonts[$fontkey]; } else { $this->_res['page'][$this->page]['fonts'][$fontkey] =& $this->fonts[$fontkey]; } } /** * See FPDF/TCPDF-Documentation ;-) */ function Image($file, $x, $y, $w=0, $h=0, $type='', $link='', $align='', $resize=false, $dpi=300, $palign='', $ismask=false, $imgmask=false, $border=0) { if (!is_subclass_of($this, 'TCPDF') && func_num_args() > 7) { $this->Error('More than 7 arguments for the Image method are only available in TCPDF.'); } parent::Image($file, $x, $y, $w, $h, $type, $link, $align, $resize, $dpi, $palign, $ismask, $imgmask, $border); if ($this->_intpl) { $this->_res['tpl'][$this->tpl]['images'][$file] =& $this->images[$file]; } else { $this->_res['page'][$this->page]['images'][$file] =& $this->images[$file]; } } /** * See FPDF-Documentation ;-) * * AddPage is not available when you're "in" a template. */ function AddPage($orientation='', $format='') { if ($this->_intpl) $this->Error('Adding pages in templates isn\'t possible!'); parent::AddPage($orientation, $format); } /** * Preserve adding Links in Templates ...won't work */ function Link($x, $y, $w, $h, $link, $spaces=0) { if (!is_subclass_of($this, 'TCPDF') && func_num_args() > 5) { $this->Error('More than 7 arguments for the Image method are only available in TCPDF.'); } if ($this->_intpl) $this->Error('Using links in templates aren\'t possible!'); parent::Link($x, $y, $w, $h, $link, $spaces); } function AddLink() { if ($this->_intpl) $this->Error('Adding links in templates aren\'t possible!'); return parent::AddLink(); } function SetLink($link, $y=0, $page=-1) { if ($this->_intpl) $this->Error('Setting links in templates aren\'t possible!'); parent::SetLink($link, $y, $page); } /** * Private Method that writes the form xobjects */ function _putformxobjects() { $filter=($this->compress) ? '/Filter /FlateDecode ' : ''; reset($this->tpls); foreach($this->tpls AS $tplidx => $tpl) { $p=($this->compress) ? gzcompress($tpl['buffer']) : $tpl['buffer']; $this->_newobj(); $this->tpls[$tplidx]['n'] = $this->n; $this->_out('<<'.$filter.'/Type /XObject'); $this->_out('/Subtype /Form'); $this->_out('/FormType 1'); $this->_out(sprintf('/BBox [%.2F %.2F %.2F %.2F]', // llx $tpl['x'], // lly -$tpl['y'], // urx ($tpl['w']+$tpl['x'])*$this->k, // ury ($tpl['h']-$tpl['y'])*$this->k )); if ($tpl['x'] != 0 || $tpl['y'] != 0) { $this->_out(sprintf('/Matrix [1 0 0 1 %.5F %.5F]', -$tpl['x']*$this->k*2, $tpl['y']*$this->k*2 )); } $this->_out('/Resources '); $this->_out('<_res['tpl'][$tplidx]['fonts']) && count($this->_res['tpl'][$tplidx]['fonts'])) { $this->_out('/Font <<'); foreach($this->_res['tpl'][$tplidx]['fonts'] as $font) $this->_out('/F'.$font['i'].' '.$font['n'].' 0 R'); $this->_out('>>'); } if(isset($this->_res['tpl'][$tplidx]['images']) && count($this->_res['tpl'][$tplidx]['images']) || isset($this->_res['tpl'][$tplidx]['tpls']) && count($this->_res['tpl'][$tplidx]['tpls'])) { $this->_out('/XObject <<'); if (isset($this->_res['tpl'][$tplidx]['images']) && count($this->_res['tpl'][$tplidx]['images'])) { foreach($this->_res['tpl'][$tplidx]['images'] as $image) $this->_out('/I'.$image['i'].' '.$image['n'].' 0 R'); } if (isset($this->_res['tpl'][$tplidx]['tpls']) && count($this->_res['tpl'][$tplidx]['tpls'])) { foreach($this->_res['tpl'][$tplidx]['tpls'] as $i => $tpl) $this->_out($this->tplprefix.$i.' '.$tpl['n'].' 0 R'); } $this->_out('>>'); } $this->_out('>>'); $this->_out('/Length '.strlen($p).' >>'); $this->_putstream($p); $this->_out('endobj'); } } /** * Overwritten to add _putformxobjects() after _putimages() * */ function _putimages() { parent::_putimages(); $this->_putformxobjects(); } function _putxobjectdict() { parent::_putxobjectdict(); if (count($this->tpls)) { foreach($this->tpls as $tplidx => $tpl) { $this->_out(sprintf('%s%d %d 0 R', $this->tplprefix, $tplidx, $tpl['n'])); } } } /** * Private Method */ function _out($s) { if ($this->state==2 && $this->_intpl) { $this->tpls[$this->tpl]['buffer'] .= $s."\n"; } else { parent::_out($s); } } } pnp4nagios-0.6.16/share/pnp/application/vendor/fpdf/filters/0000775000000000000000000000000011662503006022453 5ustar rootrootpnp4nagios-0.6.16/share/pnp/application/vendor/fpdf/filters/FilterASCII85.php0000664000000000000000000000552111662503006025342 0ustar rootroot ORD_u) { $this->error('Illegal character in ASCII85Decode.'); } $chn[$state++] = $ch - ORD_exclmark; if ($state == 5) { $state = 0; $r = 0; for ($j = 0; $j < 5; ++$j) $r = $r * 85 + $chn[$j]; $out .= chr($r >> 24); $out .= chr($r >> 16); $out .= chr($r >> 8); $out .= chr($r); } } $r = 0; if ($state == 1) $this->error('Illegal length in ASCII85Decode.'); if ($state == 2) { $r = $chn[0] * 85 * 85 * 85 * 85 + ($chn[1]+1) * 85 * 85 * 85; $out .= chr($r >> 24); } else if ($state == 3) { $r = $chn[0] * 85 * 85 * 85 * 85 + $chn[1] * 85 * 85 * 85 + ($chn[2]+1) * 85 * 85; $out .= chr($r >> 24); $out .= chr($r >> 16); } else if ($state == 4) { $r = $chn[0] * 85 * 85 * 85 * 85 + $chn[1] * 85 * 85 * 85 + $chn[2] * 85 * 85 + ($chn[3]+1) * 85 ; $out .= chr($r >> 24); $out .= chr($r >> 16); $out .= chr($r >> 8); } return $out; } function encode($in) { $this->error("ASCII85 encoding not implemented."); } }pnp4nagios-0.6.16/share/pnp/application/vendor/fpdf/filters/FilterLZW.php0000664000000000000000000000777211662503006025023 0ustar rootrooterror('LZW flavour not supported.'); } $this->initsTable(); $this->data = $data; $this->dataLength = strlen($data); // Initialize pointers $this->bytePointer = 0; $this->bitPointer = 0; $this->nextData = 0; $this->nextBits = 0; $oldCode = 0; $string = ''; $uncompData = ''; while (($code = $this->getNextCode()) != 257) { if ($code == 256) { $this->initsTable(); $code = $this->getNextCode(); if ($code == 257) { break; } $uncompData .= $this->sTable[$code]; $oldCode = $code; } else { if ($code < $this->tIdx) { $string = $this->sTable[$code]; $uncompData .= $string; $this->addStringToTable($this->sTable[$oldCode], $string[0]); $oldCode = $code; } else { $string = $this->sTable[$oldCode]; $string = $string.$string[0]; $uncompData .= $string; $this->addStringToTable($string); $oldCode = $code; } } } return $uncompData; } /** * Initialize the string table. */ function initsTable() { $this->sTable = array(); for ($i = 0; $i < 256; $i++) $this->sTable[$i] = chr($i); $this->tIdx = 258; $this->bitsToGet = 9; } /** * Add a new string to the string table. */ function addStringToTable ($oldString, $newString='') { $string = $oldString.$newString; // Add this new String to the table $this->sTable[$this->tIdx++] = $string; if ($this->tIdx == 511) { $this->bitsToGet = 10; } else if ($this->tIdx == 1023) { $this->bitsToGet = 11; } else if ($this->tIdx == 2047) { $this->bitsToGet = 12; } } // Returns the next 9, 10, 11 or 12 bits function getNextCode() { if ($this->bytePointer == $this->dataLength) { return 257; } $this->nextData = ($this->nextData << 8) | (ord($this->data[$this->bytePointer++]) & 0xff); $this->nextBits += 8; if ($this->nextBits < $this->bitsToGet) { $this->nextData = ($this->nextData << 8) | (ord($this->data[$this->bytePointer++]) & 0xff); $this->nextBits += 8; } $code = ($this->nextData >> ($this->nextBits - $this->bitsToGet)) & $this->andTable[$this->bitsToGet-9]; $this->nextBits -= $this->bitsToGet; return $code; } function encode($in) { $this->error("LZW encoding not implemented."); } }pnp4nagios-0.6.16/share/pnp/application/vendor/fpdf/filters/FilterLZW_FPDI.php0000664000000000000000000000157511662503006025620 0ustar rootrootfpdi =& $fpdi; } function error($msg) { $this->fpdi->error($msg); } }pnp4nagios-0.6.16/share/pnp/application/vendor/fpdf/filters/FilterASCII85_FPDI.php0000664000000000000000000000161511662503006026144 0ustar rootrootfpdi =& $fpdi; } function error($msg) { $this->fpdi->error($msg); } }pnp4nagios-0.6.16/share/pnp/application/vendor/fpdf/license.txt0000664000000000000000000000050611662503006023167 0ustar rootrootPermission is hereby granted, free of charge, to any person obtaining a copy of this software to use, copy, modify, distribute, sublicense, and/or sell copies of the software, and to permit persons to whom the software is furnished to do so. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED.pnp4nagios-0.6.16/share/pnp/application/vendor/fpdf/pdf_parser.php0000664000000000000000000004663111662503006023653 0ustar rootrootfilename = $filename; $this->f = @fopen($this->filename, 'rb'); if (!$this->f) $this->error(sprintf('Cannot open %s !', $filename)); $this->getPDFVersion(); $this->c = new pdf_context($this->f); // Read xref-Data $this->xref = array(); $this->pdf_read_xref($this->xref, $this->pdf_find_xref()); // Check for Encryption $this->getEncryption(); // Read root $this->pdf_read_root(); } /** * Close the opened file */ function closeFile() { if (isset($this->f) && is_resource($this->f)) { fclose($this->f); unset($this->f); } } /** * Print Error and die * * @param string $msg Error-Message */ function error($msg) { die('PDF-Parser Error: '.$msg); } /** * Check Trailer for Encryption */ function getEncryption() { if (isset($this->xref['trailer'][1]['/Encrypt'])) { $this->error('File is encrypted!'); } } /** * Find/Return /Root * * @return array */ function pdf_find_root() { if ($this->xref['trailer'][1]['/Root'][0] != PDF_TYPE_OBJREF) { $this->error('Wrong Type of Root-Element! Must be an indirect reference'); } return $this->xref['trailer'][1]['/Root']; } /** * Read the /Root */ function pdf_read_root() { // read root $this->root = $this->pdf_resolve_object($this->c, $this->pdf_find_root()); } /** * Get PDF-Version * * And reset the PDF Version used in FPDI if needed */ function getPDFVersion() { fseek($this->f, 0); preg_match('/\d\.\d/',fread($this->f,16),$m); if (isset($m[0])) $this->pdfVersion = $m[0]; return $this->pdfVersion; } /** * Find the xref-Table */ function pdf_find_xref() { $toRead = 1500; $stat = fseek ($this->f, -$toRead, SEEK_END); if ($stat === -1) { fseek ($this->f, 0); } $data = fread($this->f, $toRead); $pos = strlen($data) - strpos(strrev($data), strrev('startxref')); $data = substr($data, $pos); if (!preg_match('/\s*(\d+).*$/s', $data, $matches)) { $this->error('Unable to find pointer to xref table'); } return (int) $matches[1]; } /** * Read xref-table * * @param array $result Array of xref-table * @param integer $offset of xref-table */ function pdf_read_xref(&$result, $offset) { fseek($this->f, $o_pos = $offset-20); // set some bytes backwards to fetch errorious docs $data = fread($this->f, 100); $xrefPos = strrpos($data, 'xref'); if ($xrefPos === false) { fseek($this->f, $offset); $c = new pdf_context($this->f); $xrefStreamObjDec = $this->pdf_read_value($c); if (is_array($xrefStreamObjDec) && isset($xrefStreamObjDec[0]) && $xrefStreamObjDec[0] == PDF_TYPE_OBJDEC) { $this->error(sprintf('This document (%s) probably uses a compression technique which is not supported by the free parser shipped with FPDI.', $this->filename)); } else { $this->error('Unable to find xref table.'); } } if (!isset($result['xref_location'])) { $result['xref_location'] = $o_pos+$xrefPos; $result['max_object'] = 0; } $cylces = -1; $bytesPerCycle = 100; fseek($this->f, $o_pos = $o_pos+$xrefPos+4); // set the handle directly after the "xref"-keyword $data = fread($this->f, $bytesPerCycle); while (($trailerPos = strpos($data, 'trailer', max($bytesPerCycle*$cylces++, 0))) === false && !feof($this->f)) { $data .= fread($this->f, $bytesPerCycle); } if ($trailerPos === false) { $this->error('Trailer keyword not found after xref table'); } $data = substr($data, 0, $trailerPos); // get Line-Ending preg_match_all("/(\r\n|\n|\r)/", substr($data, 0, 100), $m); // check the first 100 bytes for linebreaks $differentLineEndings = count(array_unique($m[0])); if ($differentLineEndings > 1) { $lines = preg_split("/(\r\n|\n|\r)/", $data, -1, PREG_SPLIT_NO_EMPTY); } else { $lines = explode($m[0][1], $data); } $data = $differentLineEndings = $m = null; unset($data, $differentLineEndings, $m); $linesCount = count($lines); $start = 1; for ($i = 0; $i < $linesCount; $i++) { $line = trim($lines[$i]); if ($line) { $pieces = explode(' ', $line); $c = count($pieces); switch($c) { case 2: $start = (int)$pieces[0]; $end = $start+(int)$pieces[1]; if ($end > $result['max_object']) $result['max_object'] = $end; break; case 3: if (!isset($result['xref'][$start])) $result['xref'][$start] = array(); if (!array_key_exists($gen = (int) $pieces[1], $result['xref'][$start])) { $result['xref'][$start][$gen] = $pieces[2] == 'n' ? (int) $pieces[0] : null; } $start++; break; default: $this->error('Unexpected data in xref table'); } } } $lines = $pieces = $line = $start = $end = $gen = null; unset($lines, $pieces, $line, $start, $end, $gen); fseek($this->f, $o_pos+$trailerPos+7); $c = new pdf_context($this->f); $trailer = $this->pdf_read_value($c); $c = null; unset($c); if (!isset($result['trailer'])) { $result['trailer'] = $trailer; } if (isset($trailer[1]['/Prev'])) { $this->pdf_read_xref($result, $trailer[1]['/Prev'][1]); } $trailer = null; unset($trailer); return true; } /** * Reads an Value * * @param object $c pdf_context * @param string $token a Token * @return mixed */ function pdf_read_value(&$c, $token = null) { if (is_null($token)) { $token = $this->pdf_read_token($c); } if ($token === false) { return false; } switch ($token) { case '<': // This is a hex string. // Read the value, then the terminator $pos = $c->offset; while(1) { $match = strpos ($c->buffer, '>', $pos); // If you can't find it, try // reading more data from the stream if ($match === false) { if (!$c->increase_length()) { return false; } else { continue; } } $result = substr ($c->buffer, $c->offset, $match - $c->offset); $c->offset = $match + 1; return array (PDF_TYPE_HEX, $result); } break; case '<<': // This is a dictionary. $result = array(); // Recurse into this function until we reach // the end of the dictionary. while (($key = $this->pdf_read_token($c)) !== '>>') { if ($key === false) { return false; } if (($value = $this->pdf_read_value($c)) === false) { return false; } // Catch missing value if ($value[0] == PDF_TYPE_TOKEN && $value[1] == '>>') { $result[$key] = array(PDF_TYPE_NULL); break; } $result[$key] = $value; } return array (PDF_TYPE_DICTIONARY, $result); case '[': // This is an array. $result = array(); // Recurse into this function until we reach // the end of the array. while (($token = $this->pdf_read_token($c)) !== ']') { if ($token === false) { return false; } if (($value = $this->pdf_read_value($c, $token)) === false) { return false; } $result[] = $value; } return array (PDF_TYPE_ARRAY, $result); case '(' : // This is a string $pos = $c->offset; $openBrackets = 1; do { for (; $openBrackets != 0 && $pos < $c->length; $pos++) { switch (ord($c->buffer[$pos])) { case 0x28: // '(' $openBrackets++; break; case 0x29: // ')' $openBrackets--; break; case 0x5C: // backslash $pos++; } } } while($openBrackets != 0 && $c->increase_length()); $result = substr($c->buffer, $c->offset, $pos - $c->offset - 1); $c->offset = $pos; return array (PDF_TYPE_STRING, $result); case 'stream': $o_pos = ftell($c->file)-strlen($c->buffer); $o_offset = $c->offset; $c->reset($startpos = $o_pos + $o_offset); $e = 0; // ensure line breaks in front of the stream if ($c->buffer[0] == chr(10) || $c->buffer[0] == chr(13)) $e++; if ($c->buffer[1] == chr(10) && $c->buffer[0] != chr(10)) $e++; if ($this->actual_obj[1][1]['/Length'][0] == PDF_TYPE_OBJREF) { $tmp_c = new pdf_context($this->f); $tmp_length = $this->pdf_resolve_object($tmp_c,$this->actual_obj[1][1]['/Length']); $length = $tmp_length[1][1]; } else { $length = $this->actual_obj[1][1]['/Length'][1]; } if ($length > 0) { $c->reset($startpos+$e,$length); $v = $c->buffer; } else { $v = ''; } $c->reset($startpos+$e+$length+9); // 9 = strlen("endstream") return array(PDF_TYPE_STREAM, $v); default : if (is_numeric ($token)) { // A numeric token. Make sure that // it is not part of something else. if (($tok2 = $this->pdf_read_token ($c)) !== false) { if (is_numeric ($tok2)) { // Two numeric tokens in a row. // In this case, we're probably in // front of either an object reference // or an object specification. // Determine the case and return the data if (($tok3 = $this->pdf_read_token ($c)) !== false) { switch ($tok3) { case 'obj' : return array (PDF_TYPE_OBJDEC, (int) $token, (int) $tok2); case 'R' : return array (PDF_TYPE_OBJREF, (int) $token, (int) $tok2); } // If we get to this point, that numeric value up // there was just a numeric value. Push the extra // tokens back into the stack and return the value. array_push ($c->stack, $tok3); } } array_push ($c->stack, $tok2); } if ($token === (string)((int)$token)) return array (PDF_TYPE_NUMERIC, (int)$token); else return array (PDF_TYPE_REAL, (float)$token); } else if ($token == 'true' || $token == 'false') { return array (PDF_TYPE_BOOLEAN, $token == 'true'); } else if ($token == 'null') { return array (PDF_TYPE_NULL); } else { // Just a token. Return it. return array (PDF_TYPE_TOKEN, $token); } } } /** * Resolve an object * * @param object $c pdf_context * @param array $obj_spec The object-data * @param boolean $encapsulate Must set to true, cause the parsing and fpdi use this method only without this para */ function pdf_resolve_object(&$c, $obj_spec, $encapsulate = true) { // Exit if we get invalid data if (!is_array($obj_spec)) { $ret = false; return $ret; } if ($obj_spec[0] == PDF_TYPE_OBJREF) { // This is a reference, resolve it if (isset($this->xref['xref'][$obj_spec[1]][$obj_spec[2]])) { // Save current file position // This is needed if you want to resolve // references while you're reading another object // (e.g.: if you need to determine the length // of a stream) $old_pos = ftell($c->file); // Reposition the file pointer and // load the object header. $c->reset($this->xref['xref'][$obj_spec[1]][$obj_spec[2]]); $header = $this->pdf_read_value($c); if ($header[0] != PDF_TYPE_OBJDEC || $header[1] != $obj_spec[1] || $header[2] != $obj_spec[2]) { $this->error("Unable to find object ({$obj_spec[1]}, {$obj_spec[2]}) at expected location"); } // If we're being asked to store all the information // about the object, we add the object ID and generation // number for later use $result = array(); $this->actual_obj =& $result; if ($encapsulate) { $result = array ( PDF_TYPE_OBJECT, 'obj' => $obj_spec[1], 'gen' => $obj_spec[2] ); } // Now simply read the object data until // we encounter an end-of-object marker while(1) { $value = $this->pdf_read_value($c); if ($value === false || count($result) > 4) { // in this case the parser coudn't find an endobj so we break here break; } if ($value[0] == PDF_TYPE_TOKEN && $value[1] === 'endobj') { break; } $result[] = $value; } $c->reset($old_pos); if (isset($result[2][0]) && $result[2][0] == PDF_TYPE_STREAM) { $result[0] = PDF_TYPE_STREAM; } return $result; } } else { return $obj_spec; } } /** * Reads a token from the file * * @param object $c pdf_context * @return mixed */ function pdf_read_token(&$c) { // If there is a token available // on the stack, pop it out and // return it. if (count($c->stack)) { return array_pop($c->stack); } // Strip away any whitespace do { if (!$c->ensure_content()) { return false; } $c->offset += strspn($c->buffer, " \n\r\t", $c->offset); } while ($c->offset >= $c->length - 1); // Get the first character in the stream $char = $c->buffer[$c->offset++]; switch ($char) { case '[': case ']': case '(': case ')': // This is either an array or literal string // delimiter, Return it return $char; case '<': case '>': // This could either be a hex string or // dictionary delimiter. Determine the // appropriate case and return the token if ($c->buffer[$c->offset] == $char) { if (!$c->ensure_content()) { return false; } $c->offset++; return $char . $char; } else { return $char; } case '%': // This is a comment - jump over it! $pos = $c->offset; while(1) { $match = preg_match("/(\r\n|\r|\n)/", $c->buffer, $m, PREG_OFFSET_CAPTURE, $pos); if ($match === 0) { if (!$c->increase_length()) { return false; } else { continue; } } $c->offset = $m[0][1]+strlen($m[0][0]); return $this->pdf_read_token($c); } default: // This is "another" type of token (probably // a dictionary entry or a numeric value) // Find the end and return it. if (!$c->ensure_content()) { return false; } while(1) { // Determine the length of the token $pos = strcspn($c->buffer, " %[]<>()\r\n\t/", $c->offset); if ($c->offset + $pos <= $c->length - 1) { break; } else { // If the script reaches this point, // the token may span beyond the end // of the current buffer. Therefore, // we increase the size of the buffer // and try again--just to be safe. $c->increase_length(); } } $result = substr($c->buffer, $c->offset - 1, $pos + 1); $c->offset += $pos; return $result; } } } } pnp4nagios-0.6.16/share/pnp/application/vendor/fpdf/font/0000775000000000000000000000000011662503006021751 5ustar rootrootpnp4nagios-0.6.16/share/pnp/application/vendor/fpdf/font/helveticab.php0000664000000000000000000000611311662503006024571 0ustar rootroot278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278, chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>333,'"'=>474,'#'=>556,'$'=>556,'%'=>889,'&'=>722,'\''=>238,'('=>333,')'=>333,'*'=>389,'+'=>584, ','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>333,';'=>333,'<'=>584,'='=>584,'>'=>584,'?'=>611,'@'=>975,'A'=>722, 'B'=>722,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>556,'K'=>722,'L'=>611,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944, 'X'=>667,'Y'=>667,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>584,'_'=>556,'`'=>333,'a'=>556,'b'=>611,'c'=>556,'d'=>611,'e'=>556,'f'=>333,'g'=>611,'h'=>611,'i'=>278,'j'=>278,'k'=>556,'l'=>278,'m'=>889, 'n'=>611,'o'=>611,'p'=>611,'q'=>611,'r'=>389,'s'=>556,'t'=>333,'u'=>611,'v'=>556,'w'=>778,'x'=>556,'y'=>556,'z'=>500,'{'=>389,'|'=>280,'}'=>389,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>278,chr(131)=>556, chr(132)=>500,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>278,chr(146)=>278,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, chr(154)=>556,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>280,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333, chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>611,chr(182)=>556,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722, chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722, chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>556,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>611,chr(241)=>611, chr(242)=>611,chr(243)=>611,chr(244)=>611,chr(245)=>611,chr(246)=>611,chr(247)=>584,chr(248)=>611,chr(249)=>611,chr(250)=>611,chr(251)=>611,chr(252)=>611,chr(253)=>556,chr(254)=>611,chr(255)=>556); ?> pnp4nagios-0.6.16/share/pnp/application/vendor/fpdf/font/timesb.php0000664000000000000000000000611111662503006023744 0ustar rootroot250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250, chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>555,'#'=>500,'$'=>500,'%'=>1000,'&'=>833,'\''=>278,'('=>333,')'=>333,'*'=>500,'+'=>570, ','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>333,';'=>333,'<'=>570,'='=>570,'>'=>570,'?'=>500,'@'=>930,'A'=>722, 'B'=>667,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>778,'I'=>389,'J'=>500,'K'=>778,'L'=>667,'M'=>944,'N'=>722,'O'=>778,'P'=>611,'Q'=>778,'R'=>722,'S'=>556,'T'=>667,'U'=>722,'V'=>722,'W'=>1000, 'X'=>722,'Y'=>722,'Z'=>667,'['=>333,'\\'=>278,']'=>333,'^'=>581,'_'=>500,'`'=>333,'a'=>500,'b'=>556,'c'=>444,'d'=>556,'e'=>444,'f'=>333,'g'=>500,'h'=>556,'i'=>278,'j'=>333,'k'=>556,'l'=>278,'m'=>833, 'n'=>556,'o'=>500,'p'=>556,'q'=>556,'r'=>444,'s'=>389,'t'=>333,'u'=>556,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>444,'{'=>394,'|'=>220,'}'=>394,'~'=>520,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500, chr(132)=>500,chr(133)=>1000,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>556,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>667,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>500,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, chr(154)=>389,chr(155)=>333,chr(156)=>722,chr(157)=>350,chr(158)=>444,chr(159)=>722,chr(160)=>250,chr(161)=>333,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>220,chr(167)=>500,chr(168)=>333,chr(169)=>747,chr(170)=>300,chr(171)=>500,chr(172)=>570,chr(173)=>333,chr(174)=>747,chr(175)=>333, chr(176)=>400,chr(177)=>570,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>556,chr(182)=>540,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>330,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>500,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722, chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>389,chr(205)=>389,chr(206)=>389,chr(207)=>389,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>570,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722, chr(220)=>722,chr(221)=>722,chr(222)=>611,chr(223)=>556,chr(224)=>500,chr(225)=>500,chr(226)=>500,chr(227)=>500,chr(228)=>500,chr(229)=>500,chr(230)=>722,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>556, chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>570,chr(248)=>500,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>500,chr(254)=>556,chr(255)=>500); ?> pnp4nagios-0.6.16/share/pnp/application/vendor/fpdf/font/timesbi.php0000664000000000000000000000610611662503006024121 0ustar rootroot250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250, chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>389,'"'=>555,'#'=>500,'$'=>500,'%'=>833,'&'=>778,'\''=>278,'('=>333,')'=>333,'*'=>500,'+'=>570, ','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>333,';'=>333,'<'=>570,'='=>570,'>'=>570,'?'=>500,'@'=>832,'A'=>667, 'B'=>667,'C'=>667,'D'=>722,'E'=>667,'F'=>667,'G'=>722,'H'=>778,'I'=>389,'J'=>500,'K'=>667,'L'=>611,'M'=>889,'N'=>722,'O'=>722,'P'=>611,'Q'=>722,'R'=>667,'S'=>556,'T'=>611,'U'=>722,'V'=>667,'W'=>889, 'X'=>667,'Y'=>611,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>570,'_'=>500,'`'=>333,'a'=>500,'b'=>500,'c'=>444,'d'=>500,'e'=>444,'f'=>333,'g'=>500,'h'=>556,'i'=>278,'j'=>278,'k'=>500,'l'=>278,'m'=>778, 'n'=>556,'o'=>500,'p'=>500,'q'=>500,'r'=>389,'s'=>389,'t'=>278,'u'=>556,'v'=>444,'w'=>667,'x'=>500,'y'=>444,'z'=>389,'{'=>348,'|'=>220,'}'=>348,'~'=>570,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500, chr(132)=>500,chr(133)=>1000,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>556,chr(139)=>333,chr(140)=>944,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>500,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, chr(154)=>389,chr(155)=>333,chr(156)=>722,chr(157)=>350,chr(158)=>389,chr(159)=>611,chr(160)=>250,chr(161)=>389,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>220,chr(167)=>500,chr(168)=>333,chr(169)=>747,chr(170)=>266,chr(171)=>500,chr(172)=>606,chr(173)=>333,chr(174)=>747,chr(175)=>333, chr(176)=>400,chr(177)=>570,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>576,chr(182)=>500,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>300,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>500,chr(192)=>667,chr(193)=>667,chr(194)=>667,chr(195)=>667,chr(196)=>667,chr(197)=>667, chr(198)=>944,chr(199)=>667,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>389,chr(205)=>389,chr(206)=>389,chr(207)=>389,chr(208)=>722,chr(209)=>722,chr(210)=>722,chr(211)=>722,chr(212)=>722,chr(213)=>722,chr(214)=>722,chr(215)=>570,chr(216)=>722,chr(217)=>722,chr(218)=>722,chr(219)=>722, chr(220)=>722,chr(221)=>611,chr(222)=>611,chr(223)=>500,chr(224)=>500,chr(225)=>500,chr(226)=>500,chr(227)=>500,chr(228)=>500,chr(229)=>500,chr(230)=>722,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>556, chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>570,chr(248)=>500,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>444,chr(254)=>500,chr(255)=>444); ?> pnp4nagios-0.6.16/share/pnp/application/vendor/fpdf/font/zapfdingbats.php0000664000000000000000000000573411662503006025147 0ustar rootroot0,chr(1)=>0,chr(2)=>0,chr(3)=>0,chr(4)=>0,chr(5)=>0,chr(6)=>0,chr(7)=>0,chr(8)=>0,chr(9)=>0,chr(10)=>0,chr(11)=>0,chr(12)=>0,chr(13)=>0,chr(14)=>0,chr(15)=>0,chr(16)=>0,chr(17)=>0,chr(18)=>0,chr(19)=>0,chr(20)=>0,chr(21)=>0, chr(22)=>0,chr(23)=>0,chr(24)=>0,chr(25)=>0,chr(26)=>0,chr(27)=>0,chr(28)=>0,chr(29)=>0,chr(30)=>0,chr(31)=>0,' '=>278,'!'=>974,'"'=>961,'#'=>974,'$'=>980,'%'=>719,'&'=>789,'\''=>790,'('=>791,')'=>690,'*'=>960,'+'=>939, ','=>549,'-'=>855,'.'=>911,'/'=>933,'0'=>911,'1'=>945,'2'=>974,'3'=>755,'4'=>846,'5'=>762,'6'=>761,'7'=>571,'8'=>677,'9'=>763,':'=>760,';'=>759,'<'=>754,'='=>494,'>'=>552,'?'=>537,'@'=>577,'A'=>692, 'B'=>786,'C'=>788,'D'=>788,'E'=>790,'F'=>793,'G'=>794,'H'=>816,'I'=>823,'J'=>789,'K'=>841,'L'=>823,'M'=>833,'N'=>816,'O'=>831,'P'=>923,'Q'=>744,'R'=>723,'S'=>749,'T'=>790,'U'=>792,'V'=>695,'W'=>776, 'X'=>768,'Y'=>792,'Z'=>759,'['=>707,'\\'=>708,']'=>682,'^'=>701,'_'=>826,'`'=>815,'a'=>789,'b'=>789,'c'=>707,'d'=>687,'e'=>696,'f'=>689,'g'=>786,'h'=>787,'i'=>713,'j'=>791,'k'=>785,'l'=>791,'m'=>873, 'n'=>761,'o'=>762,'p'=>762,'q'=>759,'r'=>759,'s'=>892,'t'=>892,'u'=>788,'v'=>784,'w'=>438,'x'=>138,'y'=>277,'z'=>415,'{'=>392,'|'=>392,'}'=>668,'~'=>668,chr(127)=>0,chr(128)=>390,chr(129)=>390,chr(130)=>317,chr(131)=>317, chr(132)=>276,chr(133)=>276,chr(134)=>509,chr(135)=>509,chr(136)=>410,chr(137)=>410,chr(138)=>234,chr(139)=>234,chr(140)=>334,chr(141)=>334,chr(142)=>0,chr(143)=>0,chr(144)=>0,chr(145)=>0,chr(146)=>0,chr(147)=>0,chr(148)=>0,chr(149)=>0,chr(150)=>0,chr(151)=>0,chr(152)=>0,chr(153)=>0, chr(154)=>0,chr(155)=>0,chr(156)=>0,chr(157)=>0,chr(158)=>0,chr(159)=>0,chr(160)=>0,chr(161)=>732,chr(162)=>544,chr(163)=>544,chr(164)=>910,chr(165)=>667,chr(166)=>760,chr(167)=>760,chr(168)=>776,chr(169)=>595,chr(170)=>694,chr(171)=>626,chr(172)=>788,chr(173)=>788,chr(174)=>788,chr(175)=>788, chr(176)=>788,chr(177)=>788,chr(178)=>788,chr(179)=>788,chr(180)=>788,chr(181)=>788,chr(182)=>788,chr(183)=>788,chr(184)=>788,chr(185)=>788,chr(186)=>788,chr(187)=>788,chr(188)=>788,chr(189)=>788,chr(190)=>788,chr(191)=>788,chr(192)=>788,chr(193)=>788,chr(194)=>788,chr(195)=>788,chr(196)=>788,chr(197)=>788, chr(198)=>788,chr(199)=>788,chr(200)=>788,chr(201)=>788,chr(202)=>788,chr(203)=>788,chr(204)=>788,chr(205)=>788,chr(206)=>788,chr(207)=>788,chr(208)=>788,chr(209)=>788,chr(210)=>788,chr(211)=>788,chr(212)=>894,chr(213)=>838,chr(214)=>1016,chr(215)=>458,chr(216)=>748,chr(217)=>924,chr(218)=>748,chr(219)=>918, chr(220)=>927,chr(221)=>928,chr(222)=>928,chr(223)=>834,chr(224)=>873,chr(225)=>828,chr(226)=>924,chr(227)=>924,chr(228)=>917,chr(229)=>930,chr(230)=>931,chr(231)=>463,chr(232)=>883,chr(233)=>836,chr(234)=>836,chr(235)=>867,chr(236)=>867,chr(237)=>696,chr(238)=>696,chr(239)=>874,chr(240)=>0,chr(241)=>874, chr(242)=>760,chr(243)=>946,chr(244)=>771,chr(245)=>865,chr(246)=>771,chr(247)=>888,chr(248)=>967,chr(249)=>888,chr(250)=>831,chr(251)=>873,chr(252)=>927,chr(253)=>970,chr(254)=>918,chr(255)=>0); ?> pnp4nagios-0.6.16/share/pnp/application/vendor/fpdf/font/symbol.php0000664000000000000000000000577711662503006024007 0ustar rootroot250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250, chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>713,'#'=>500,'$'=>549,'%'=>833,'&'=>778,'\''=>439,'('=>333,')'=>333,'*'=>500,'+'=>549, ','=>250,'-'=>549,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>278,';'=>278,'<'=>549,'='=>549,'>'=>549,'?'=>444,'@'=>549,'A'=>722, 'B'=>667,'C'=>722,'D'=>612,'E'=>611,'F'=>763,'G'=>603,'H'=>722,'I'=>333,'J'=>631,'K'=>722,'L'=>686,'M'=>889,'N'=>722,'O'=>722,'P'=>768,'Q'=>741,'R'=>556,'S'=>592,'T'=>611,'U'=>690,'V'=>439,'W'=>768, 'X'=>645,'Y'=>795,'Z'=>611,'['=>333,'\\'=>863,']'=>333,'^'=>658,'_'=>500,'`'=>500,'a'=>631,'b'=>549,'c'=>549,'d'=>494,'e'=>439,'f'=>521,'g'=>411,'h'=>603,'i'=>329,'j'=>603,'k'=>549,'l'=>549,'m'=>576, 'n'=>521,'o'=>549,'p'=>549,'q'=>521,'r'=>549,'s'=>603,'t'=>439,'u'=>576,'v'=>713,'w'=>686,'x'=>493,'y'=>686,'z'=>494,'{'=>480,'|'=>200,'}'=>480,'~'=>549,chr(127)=>0,chr(128)=>0,chr(129)=>0,chr(130)=>0,chr(131)=>0, chr(132)=>0,chr(133)=>0,chr(134)=>0,chr(135)=>0,chr(136)=>0,chr(137)=>0,chr(138)=>0,chr(139)=>0,chr(140)=>0,chr(141)=>0,chr(142)=>0,chr(143)=>0,chr(144)=>0,chr(145)=>0,chr(146)=>0,chr(147)=>0,chr(148)=>0,chr(149)=>0,chr(150)=>0,chr(151)=>0,chr(152)=>0,chr(153)=>0, chr(154)=>0,chr(155)=>0,chr(156)=>0,chr(157)=>0,chr(158)=>0,chr(159)=>0,chr(160)=>750,chr(161)=>620,chr(162)=>247,chr(163)=>549,chr(164)=>167,chr(165)=>713,chr(166)=>500,chr(167)=>753,chr(168)=>753,chr(169)=>753,chr(170)=>753,chr(171)=>1042,chr(172)=>987,chr(173)=>603,chr(174)=>987,chr(175)=>603, chr(176)=>400,chr(177)=>549,chr(178)=>411,chr(179)=>549,chr(180)=>549,chr(181)=>713,chr(182)=>494,chr(183)=>460,chr(184)=>549,chr(185)=>549,chr(186)=>549,chr(187)=>549,chr(188)=>1000,chr(189)=>603,chr(190)=>1000,chr(191)=>658,chr(192)=>823,chr(193)=>686,chr(194)=>795,chr(195)=>987,chr(196)=>768,chr(197)=>768, chr(198)=>823,chr(199)=>768,chr(200)=>768,chr(201)=>713,chr(202)=>713,chr(203)=>713,chr(204)=>713,chr(205)=>713,chr(206)=>713,chr(207)=>713,chr(208)=>768,chr(209)=>713,chr(210)=>790,chr(211)=>790,chr(212)=>890,chr(213)=>823,chr(214)=>549,chr(215)=>250,chr(216)=>713,chr(217)=>603,chr(218)=>603,chr(219)=>1042, chr(220)=>987,chr(221)=>603,chr(222)=>987,chr(223)=>603,chr(224)=>494,chr(225)=>329,chr(226)=>790,chr(227)=>790,chr(228)=>786,chr(229)=>713,chr(230)=>384,chr(231)=>384,chr(232)=>384,chr(233)=>384,chr(234)=>384,chr(235)=>384,chr(236)=>494,chr(237)=>494,chr(238)=>494,chr(239)=>494,chr(240)=>0,chr(241)=>329, chr(242)=>274,chr(243)=>686,chr(244)=>686,chr(245)=>686,chr(246)=>384,chr(247)=>384,chr(248)=>384,chr(249)=>384,chr(250)=>384,chr(251)=>384,chr(252)=>494,chr(253)=>494,chr(254)=>494,chr(255)=>0); ?> pnp4nagios-0.6.16/share/pnp/application/vendor/fpdf/font/helveticai.php0000664000000000000000000000611411662503006024601 0ustar rootroot278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278, chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>278,'"'=>355,'#'=>556,'$'=>556,'%'=>889,'&'=>667,'\''=>191,'('=>333,')'=>333,'*'=>389,'+'=>584, ','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>278,';'=>278,'<'=>584,'='=>584,'>'=>584,'?'=>556,'@'=>1015,'A'=>667, 'B'=>667,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>500,'K'=>667,'L'=>556,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944, 'X'=>667,'Y'=>667,'Z'=>611,'['=>278,'\\'=>278,']'=>278,'^'=>469,'_'=>556,'`'=>333,'a'=>556,'b'=>556,'c'=>500,'d'=>556,'e'=>556,'f'=>278,'g'=>556,'h'=>556,'i'=>222,'j'=>222,'k'=>500,'l'=>222,'m'=>833, 'n'=>556,'o'=>556,'p'=>556,'q'=>556,'r'=>333,'s'=>500,'t'=>278,'u'=>556,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>500,'{'=>334,'|'=>260,'}'=>334,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>222,chr(131)=>556, chr(132)=>333,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>222,chr(146)=>222,chr(147)=>333,chr(148)=>333,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, chr(154)=>500,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>260,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333, chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>556,chr(182)=>537,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>667,chr(193)=>667,chr(194)=>667,chr(195)=>667,chr(196)=>667,chr(197)=>667, chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722, chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>500,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>556,chr(241)=>556, chr(242)=>556,chr(243)=>556,chr(244)=>556,chr(245)=>556,chr(246)=>556,chr(247)=>584,chr(248)=>611,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>500,chr(254)=>556,chr(255)=>500); ?> pnp4nagios-0.6.16/share/pnp/application/vendor/fpdf/font/helveticabi.php0000664000000000000000000000611411662503006024743 0ustar rootroot278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278, chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>333,'"'=>474,'#'=>556,'$'=>556,'%'=>889,'&'=>722,'\''=>238,'('=>333,')'=>333,'*'=>389,'+'=>584, ','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>333,';'=>333,'<'=>584,'='=>584,'>'=>584,'?'=>611,'@'=>975,'A'=>722, 'B'=>722,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>556,'K'=>722,'L'=>611,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944, 'X'=>667,'Y'=>667,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>584,'_'=>556,'`'=>333,'a'=>556,'b'=>611,'c'=>556,'d'=>611,'e'=>556,'f'=>333,'g'=>611,'h'=>611,'i'=>278,'j'=>278,'k'=>556,'l'=>278,'m'=>889, 'n'=>611,'o'=>611,'p'=>611,'q'=>611,'r'=>389,'s'=>556,'t'=>333,'u'=>611,'v'=>556,'w'=>778,'x'=>556,'y'=>556,'z'=>500,'{'=>389,'|'=>280,'}'=>389,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>278,chr(131)=>556, chr(132)=>500,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>278,chr(146)=>278,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, chr(154)=>556,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>280,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333, chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>611,chr(182)=>556,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722, chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722, chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>556,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>611,chr(241)=>611, chr(242)=>611,chr(243)=>611,chr(244)=>611,chr(245)=>611,chr(246)=>611,chr(247)=>584,chr(248)=>611,chr(249)=>611,chr(250)=>611,chr(251)=>611,chr(252)=>611,chr(253)=>556,chr(254)=>611,chr(255)=>556); ?> pnp4nagios-0.6.16/share/pnp/application/vendor/fpdf/font/times.php0000664000000000000000000000610311662503006023603 0ustar rootroot250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250, chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>408,'#'=>500,'$'=>500,'%'=>833,'&'=>778,'\''=>180,'('=>333,')'=>333,'*'=>500,'+'=>564, ','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>278,';'=>278,'<'=>564,'='=>564,'>'=>564,'?'=>444,'@'=>921,'A'=>722, 'B'=>667,'C'=>667,'D'=>722,'E'=>611,'F'=>556,'G'=>722,'H'=>722,'I'=>333,'J'=>389,'K'=>722,'L'=>611,'M'=>889,'N'=>722,'O'=>722,'P'=>556,'Q'=>722,'R'=>667,'S'=>556,'T'=>611,'U'=>722,'V'=>722,'W'=>944, 'X'=>722,'Y'=>722,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>469,'_'=>500,'`'=>333,'a'=>444,'b'=>500,'c'=>444,'d'=>500,'e'=>444,'f'=>333,'g'=>500,'h'=>500,'i'=>278,'j'=>278,'k'=>500,'l'=>278,'m'=>778, 'n'=>500,'o'=>500,'p'=>500,'q'=>500,'r'=>333,'s'=>389,'t'=>278,'u'=>500,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>444,'{'=>480,'|'=>200,'}'=>480,'~'=>541,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500, chr(132)=>444,chr(133)=>1000,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>556,chr(139)=>333,chr(140)=>889,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>444,chr(148)=>444,chr(149)=>350,chr(150)=>500,chr(151)=>1000,chr(152)=>333,chr(153)=>980, chr(154)=>389,chr(155)=>333,chr(156)=>722,chr(157)=>350,chr(158)=>444,chr(159)=>722,chr(160)=>250,chr(161)=>333,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>200,chr(167)=>500,chr(168)=>333,chr(169)=>760,chr(170)=>276,chr(171)=>500,chr(172)=>564,chr(173)=>333,chr(174)=>760,chr(175)=>333, chr(176)=>400,chr(177)=>564,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>500,chr(182)=>453,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>310,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>444,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722, chr(198)=>889,chr(199)=>667,chr(200)=>611,chr(201)=>611,chr(202)=>611,chr(203)=>611,chr(204)=>333,chr(205)=>333,chr(206)=>333,chr(207)=>333,chr(208)=>722,chr(209)=>722,chr(210)=>722,chr(211)=>722,chr(212)=>722,chr(213)=>722,chr(214)=>722,chr(215)=>564,chr(216)=>722,chr(217)=>722,chr(218)=>722,chr(219)=>722, chr(220)=>722,chr(221)=>722,chr(222)=>556,chr(223)=>500,chr(224)=>444,chr(225)=>444,chr(226)=>444,chr(227)=>444,chr(228)=>444,chr(229)=>444,chr(230)=>667,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>500, chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>564,chr(248)=>500,chr(249)=>500,chr(250)=>500,chr(251)=>500,chr(252)=>500,chr(253)=>500,chr(254)=>500,chr(255)=>500); ?> pnp4nagios-0.6.16/share/pnp/application/vendor/fpdf/font/helvetica.php0000664000000000000000000000611311662503006024427 0ustar rootroot278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278, chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>278,'"'=>355,'#'=>556,'$'=>556,'%'=>889,'&'=>667,'\''=>191,'('=>333,')'=>333,'*'=>389,'+'=>584, ','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>278,';'=>278,'<'=>584,'='=>584,'>'=>584,'?'=>556,'@'=>1015,'A'=>667, 'B'=>667,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>500,'K'=>667,'L'=>556,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944, 'X'=>667,'Y'=>667,'Z'=>611,'['=>278,'\\'=>278,']'=>278,'^'=>469,'_'=>556,'`'=>333,'a'=>556,'b'=>556,'c'=>500,'d'=>556,'e'=>556,'f'=>278,'g'=>556,'h'=>556,'i'=>222,'j'=>222,'k'=>500,'l'=>222,'m'=>833, 'n'=>556,'o'=>556,'p'=>556,'q'=>556,'r'=>333,'s'=>500,'t'=>278,'u'=>556,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>500,'{'=>334,'|'=>260,'}'=>334,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>222,chr(131)=>556, chr(132)=>333,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>222,chr(146)=>222,chr(147)=>333,chr(148)=>333,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, chr(154)=>500,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>260,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333, chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>556,chr(182)=>537,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>667,chr(193)=>667,chr(194)=>667,chr(195)=>667,chr(196)=>667,chr(197)=>667, chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722, chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>500,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>556,chr(241)=>556, chr(242)=>556,chr(243)=>556,chr(244)=>556,chr(245)=>556,chr(246)=>556,chr(247)=>584,chr(248)=>611,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>500,chr(254)=>556,chr(255)=>500); ?> pnp4nagios-0.6.16/share/pnp/application/vendor/fpdf/font/timesi.php0000664000000000000000000000610211662503006023753 0ustar rootroot250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250, chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>420,'#'=>500,'$'=>500,'%'=>833,'&'=>778,'\''=>214,'('=>333,')'=>333,'*'=>500,'+'=>675, ','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>333,';'=>333,'<'=>675,'='=>675,'>'=>675,'?'=>500,'@'=>920,'A'=>611, 'B'=>611,'C'=>667,'D'=>722,'E'=>611,'F'=>611,'G'=>722,'H'=>722,'I'=>333,'J'=>444,'K'=>667,'L'=>556,'M'=>833,'N'=>667,'O'=>722,'P'=>611,'Q'=>722,'R'=>611,'S'=>500,'T'=>556,'U'=>722,'V'=>611,'W'=>833, 'X'=>611,'Y'=>556,'Z'=>556,'['=>389,'\\'=>278,']'=>389,'^'=>422,'_'=>500,'`'=>333,'a'=>500,'b'=>500,'c'=>444,'d'=>500,'e'=>444,'f'=>278,'g'=>500,'h'=>500,'i'=>278,'j'=>278,'k'=>444,'l'=>278,'m'=>722, 'n'=>500,'o'=>500,'p'=>500,'q'=>500,'r'=>389,'s'=>389,'t'=>278,'u'=>500,'v'=>444,'w'=>667,'x'=>444,'y'=>444,'z'=>389,'{'=>400,'|'=>275,'}'=>400,'~'=>541,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500, chr(132)=>556,chr(133)=>889,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>500,chr(139)=>333,chr(140)=>944,chr(141)=>350,chr(142)=>556,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>556,chr(148)=>556,chr(149)=>350,chr(150)=>500,chr(151)=>889,chr(152)=>333,chr(153)=>980, chr(154)=>389,chr(155)=>333,chr(156)=>667,chr(157)=>350,chr(158)=>389,chr(159)=>556,chr(160)=>250,chr(161)=>389,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>275,chr(167)=>500,chr(168)=>333,chr(169)=>760,chr(170)=>276,chr(171)=>500,chr(172)=>675,chr(173)=>333,chr(174)=>760,chr(175)=>333, chr(176)=>400,chr(177)=>675,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>500,chr(182)=>523,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>310,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>500,chr(192)=>611,chr(193)=>611,chr(194)=>611,chr(195)=>611,chr(196)=>611,chr(197)=>611, chr(198)=>889,chr(199)=>667,chr(200)=>611,chr(201)=>611,chr(202)=>611,chr(203)=>611,chr(204)=>333,chr(205)=>333,chr(206)=>333,chr(207)=>333,chr(208)=>722,chr(209)=>667,chr(210)=>722,chr(211)=>722,chr(212)=>722,chr(213)=>722,chr(214)=>722,chr(215)=>675,chr(216)=>722,chr(217)=>722,chr(218)=>722,chr(219)=>722, chr(220)=>722,chr(221)=>556,chr(222)=>611,chr(223)=>500,chr(224)=>500,chr(225)=>500,chr(226)=>500,chr(227)=>500,chr(228)=>500,chr(229)=>500,chr(230)=>667,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>500, chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>675,chr(248)=>500,chr(249)=>500,chr(250)=>500,chr(251)=>500,chr(252)=>500,chr(253)=>444,chr(254)=>500,chr(255)=>444); ?> pnp4nagios-0.6.16/share/pnp/application/vendor/fpdf/font/courier.php0000664000000000000000000000037211662503006024134 0ustar rootroot pnp4nagios-0.6.16/share/pnp/application/vendor/fpdf/fpdi_pdf_parser.php0000664000000000000000000002500411662503006024644 0ustar rootrootfpdi =& $fpdi; parent::pdf_parser($filename); // resolve Pages-Dictonary $pages = $this->pdf_resolve_object($this->c, $this->root[1][1]['/Pages']); // Read pages $this->read_pages($this->c, $pages, $this->pages); // count pages; $this->page_count = count($this->pages); } /** * Overwrite parent::error() * * @param string $msg Error-Message */ function error($msg) { $this->fpdi->error($msg); } /** * Get pagecount from sourcefile * * @return int */ function getPageCount() { return $this->page_count; } /** * Set pageno * * @param int $pageno Pagenumber to use */ function setPageno($pageno) { $pageno = ((int) $pageno) - 1; if ($pageno < 0 || $pageno >= $this->getPageCount()) { $this->fpdi->error('Pagenumber is wrong!'); } $this->pageno = $pageno; } /** * Get page-resources from current page * * @return array */ function getPageResources() { return $this->_getPageResources($this->pages[$this->pageno]); } /** * Get page-resources from /Page * * @param array $obj Array of pdf-data */ function _getPageResources ($obj) { // $obj = /Page $obj = $this->pdf_resolve_object($this->c, $obj); // If the current object has a resources // dictionary associated with it, we use // it. Otherwise, we move back to its // parent object. if (isset ($obj[1][1]['/Resources'])) { $res = $this->pdf_resolve_object($this->c, $obj[1][1]['/Resources']); if ($res[0] == PDF_TYPE_OBJECT) return $res[1]; return $res; } else { if (!isset ($obj[1][1]['/Parent'])) { return false; } else { $res = $this->_getPageResources($obj[1][1]['/Parent']); if ($res[0] == PDF_TYPE_OBJECT) return $res[1]; return $res; } } } /** * Get content of current page * * If more /Contents is an array, the streams are concated * * @return string */ function getContent() { $buffer = ''; if (isset($this->pages[$this->pageno][1][1]['/Contents'])) { $contents = $this->_getPageContent($this->pages[$this->pageno][1][1]['/Contents']); foreach($contents AS $tmp_content) { $buffer .= $this->_rebuildContentStream($tmp_content).' '; } } return $buffer; } /** * Resolve all content-objects * * @param array $content_ref * @return array */ function _getPageContent($content_ref) { $contents = array(); if ($content_ref[0] == PDF_TYPE_OBJREF) { $content = $this->pdf_resolve_object($this->c, $content_ref); if ($content[1][0] == PDF_TYPE_ARRAY) { $contents = $this->_getPageContent($content[1]); } else { $contents[] = $content; } } else if ($content_ref[0] == PDF_TYPE_ARRAY) { foreach ($content_ref[1] AS $tmp_content_ref) { $contents = array_merge($contents,$this->_getPageContent($tmp_content_ref)); } } return $contents; } /** * Rebuild content-streams * * @param array $obj * @return string */ function _rebuildContentStream($obj) { $filters = array(); if (isset($obj[1][1]['/Filter'])) { $_filter = $obj[1][1]['/Filter']; if ($_filter[0] == PDF_TYPE_TOKEN) { $filters[] = $_filter; } else if ($_filter[0] == PDF_TYPE_ARRAY) { $filters = $_filter[1]; } } $stream = $obj[2][1]; foreach ($filters AS $_filter) { switch ($_filter[1]) { case '/FlateDecode': if (function_exists('gzuncompress')) { $stream = (strlen($stream) > 0) ? @gzuncompress($stream) : ''; } else { $this->error(sprintf('To handle %s filter, please compile php with zlib support.',$_filter[1])); } if ($stream === false) { $this->error('Error while decompressing stream.'); } break; case '/LZWDecode': include_once('filters/FilterLZW_FPDI.php'); $decoder = new FilterLZW_FPDI($this->fpdi); $stream = $decoder->decode($stream); break; case '/ASCII85Decode': include_once('filters/FilterASCII85_FPDI.php'); $decoder = new FilterASCII85_FPDI($this->fpdi); $stream = $decoder->decode($stream); break; case null: $stream = $stream; break; default: $this->error(sprintf('Unsupported Filter: %s',$_filter[1])); } } return $stream; } /** * Get a Box from a page * Arrayformat is same as used by fpdf_tpl * * @param array $page a /Page * @param string $box_index Type of Box @see $availableBoxes * @return array */ function getPageBox($page, $box_index) { $page = $this->pdf_resolve_object($this->c,$page); $box = null; if (isset($page[1][1][$box_index])) $box =& $page[1][1][$box_index]; if (!is_null($box) && $box[0] == PDF_TYPE_OBJREF) { $tmp_box = $this->pdf_resolve_object($this->c,$box); $box = $tmp_box[1]; } if (!is_null($box) && $box[0] == PDF_TYPE_ARRAY) { $b =& $box[1]; return array('x' => $b[0][1]/$this->fpdi->k, 'y' => $b[1][1]/$this->fpdi->k, 'w' => abs($b[0][1]-$b[2][1])/$this->fpdi->k, 'h' => abs($b[1][1]-$b[3][1])/$this->fpdi->k, 'llx' => min($b[0][1], $b[2][1])/$this->fpdi->k, 'lly' => min($b[1][1], $b[3][1])/$this->fpdi->k, 'urx' => max($b[0][1], $b[2][1])/$this->fpdi->k, 'ury' => max($b[1][1], $b[3][1])/$this->fpdi->k, ); } else if (!isset ($page[1][1]['/Parent'])) { return false; } else { return $this->getPageBox($this->pdf_resolve_object($this->c, $page[1][1]['/Parent']), $box_index); } } function getPageBoxes($pageno) { return $this->_getPageBoxes($this->pages[$pageno-1]); } /** * Get all Boxes from /Page * * @param array a /Page * @return array */ function _getPageBoxes($page) { $boxes = array(); foreach($this->availableBoxes AS $box) { if ($_box = $this->getPageBox($page,$box)) { $boxes[$box] = $_box; } } return $boxes; } /** * Get the page rotation by pageno * * @param integer $pageno * @return array */ function getPageRotation($pageno) { return $this->_getPageRotation($this->pages[$pageno-1]); } function _getPageRotation ($obj) { // $obj = /Page $obj = $this->pdf_resolve_object($this->c, $obj); if (isset ($obj[1][1]['/Rotate'])) { $res = $this->pdf_resolve_object($this->c, $obj[1][1]['/Rotate']); if ($res[0] == PDF_TYPE_OBJECT) return $res[1]; return $res; } else { if (!isset ($obj[1][1]['/Parent'])) { return false; } else { $res = $this->_getPageRotation($obj[1][1]['/Parent']); if ($res[0] == PDF_TYPE_OBJECT) return $res[1]; return $res; } } } /** * Read all /Page(es) * * @param object pdf_context * @param array /Pages * @param array the result-array */ function read_pages (&$c, &$pages, &$result) { // Get the kids dictionary $kids = $this->pdf_resolve_object ($c, $pages[1][1]['/Kids']); if (!is_array($kids)) $this->error('Cannot find /Kids in current /Page-Dictionary'); foreach ($kids[1] as $v) { $pg = $this->pdf_resolve_object ($c, $v); if ($pg[1][1]['/Type'][1] === '/Pages') { // If one of the kids is an embedded // /Pages array, resolve it as well. $this->read_pages ($c, $pg, $result); } else { $result[] = $pg; } } } /** * Get PDF-Version * * And reset the PDF Version used in FPDI if needed */ function getPDFVersion() { parent::getPDFVersion(); $this->fpdi->PDFVersion = max($this->fpdi->PDFVersion, $this->pdfVersion); } } pnp4nagios-0.6.16/share/pnp/application/vendor/fpdf/fpdf.php0000664000000000000000000012452311662503006022442 0ustar rootroot_dochecks(); //Initialization of properties $this->page=0; $this->n=2; $this->buffer=''; $this->pages=array(); $this->PageSizes=array(); $this->state=0; $this->fonts=array(); $this->FontFiles=array(); $this->diffs=array(); $this->images=array(); $this->links=array(); $this->InHeader=false; $this->InFooter=false; $this->lasth=0; $this->FontFamily=''; $this->FontStyle=''; $this->FontSizePt=12; $this->underline=false; $this->DrawColor='0 G'; $this->FillColor='0 g'; $this->TextColor='0 g'; $this->ColorFlag=false; $this->ws=0; //Standard fonts $this->CoreFonts=array('courier'=>'Courier', 'courierB'=>'Courier-Bold', 'courierI'=>'Courier-Oblique', 'courierBI'=>'Courier-BoldOblique', 'helvetica'=>'Helvetica', 'helveticaB'=>'Helvetica-Bold', 'helveticaI'=>'Helvetica-Oblique', 'helveticaBI'=>'Helvetica-BoldOblique', 'times'=>'Times-Roman', 'timesB'=>'Times-Bold', 'timesI'=>'Times-Italic', 'timesBI'=>'Times-BoldItalic', 'symbol'=>'Symbol', 'zapfdingbats'=>'ZapfDingbats'); //Scale factor if($unit=='pt') $this->k=1; elseif($unit=='mm') $this->k=72/25.4; elseif($unit=='cm') $this->k=72/2.54; elseif($unit=='in') $this->k=72; else $this->Error('Incorrect unit: '.$unit); //Page format $this->PageFormats=array('a3'=>array(841.89,1190.55), 'a4'=>array(595.28,841.89), 'a5'=>array(420.94,595.28), 'letter'=>array(612,792), 'legal'=>array(612,1008)); if(is_string($format)) $format=$this->_getpageformat($format); $this->DefPageFormat=$format; $this->CurPageFormat=$format; //Page orientation $orientation=strtolower($orientation); if($orientation=='p' || $orientation=='portrait') { $this->DefOrientation='P'; $this->w=$this->DefPageFormat[0]; $this->h=$this->DefPageFormat[1]; } elseif($orientation=='l' || $orientation=='landscape') { $this->DefOrientation='L'; $this->w=$this->DefPageFormat[1]; $this->h=$this->DefPageFormat[0]; } else $this->Error('Incorrect orientation: '.$orientation); $this->CurOrientation=$this->DefOrientation; $this->wPt=$this->w*$this->k; $this->hPt=$this->h*$this->k; //Page margins (1 cm) $margin=28.35/$this->k; $this->SetMargins($margin,$margin); //Interior cell margin (1 mm) $this->cMargin=$margin/10; //Line width (0.2 mm) $this->LineWidth=.567/$this->k; //Automatic page break $this->SetAutoPageBreak(true,2*$margin); //Full width display mode $this->SetDisplayMode('fullwidth'); //Enable compression $this->SetCompression(true); //Set default PDF version number $this->PDFVersion='1.3'; } function SetMargins($left, $top, $right=null) { //Set left, top and right margins $this->lMargin=$left; $this->tMargin=$top; if($right===null) $right=$left; $this->rMargin=$right; } function SetLeftMargin($margin) { //Set left margin $this->lMargin=$margin; if($this->page>0 && $this->x<$margin) $this->x=$margin; } function SetTopMargin($margin) { //Set top margin $this->tMargin=$margin; } function SetRightMargin($margin) { //Set right margin $this->rMargin=$margin; } function SetAutoPageBreak($auto, $margin=0) { //Set auto page break mode and triggering margin $this->AutoPageBreak=$auto; $this->bMargin=$margin; $this->PageBreakTrigger=$this->h-$margin; } function SetDisplayMode($zoom, $layout='continuous') { //Set display mode in viewer if($zoom=='fullpage' || $zoom=='fullwidth' || $zoom=='real' || $zoom=='default' || !is_string($zoom)) $this->ZoomMode=$zoom; else $this->Error('Incorrect zoom display mode: '.$zoom); if($layout=='single' || $layout=='continuous' || $layout=='two' || $layout=='default') $this->LayoutMode=$layout; else $this->Error('Incorrect layout display mode: '.$layout); } function SetCompression($compress) { //Set page compression if(function_exists('gzcompress')) $this->compress=$compress; else $this->compress=false; } function SetTitle($title, $isUTF8=false) { //Title of document if($isUTF8) $title=$this->_UTF8toUTF16($title); $this->title=$title; } function SetSubject($subject, $isUTF8=false) { //Subject of document if($isUTF8) $subject=$this->_UTF8toUTF16($subject); $this->subject=$subject; } function SetAuthor($author, $isUTF8=false) { //Author of document if($isUTF8) $author=$this->_UTF8toUTF16($author); $this->author=$author; } function SetKeywords($keywords, $isUTF8=false) { //Keywords of document if($isUTF8) $keywords=$this->_UTF8toUTF16($keywords); $this->keywords=$keywords; } function SetCreator($creator, $isUTF8=false) { //Creator of document if($isUTF8) $creator=$this->_UTF8toUTF16($creator); $this->creator=$creator; } function AliasNbPages($alias='{nb}') { //Define an alias for total number of pages $this->AliasNbPages=$alias; } function Error($msg) { //Fatal error die('FPDF error: '.$msg); } function Open() { //Begin document $this->state=1; } function Close() { //Terminate document if($this->state==3) return; if($this->page==0) $this->AddPage(); //Page footer $this->InFooter=true; $this->Footer(); $this->InFooter=false; //Close page $this->_endpage(); //Close document $this->_enddoc(); } function AddPage($orientation='', $format='') { //Start a new page if($this->state==0) $this->Open(); $family=$this->FontFamily; $style=$this->FontStyle.($this->underline ? 'U' : ''); $size=$this->FontSizePt; $lw=$this->LineWidth; $dc=$this->DrawColor; $fc=$this->FillColor; $tc=$this->TextColor; $cf=$this->ColorFlag; if($this->page>0) { //Page footer $this->InFooter=true; $this->Footer(); $this->InFooter=false; //Close page $this->_endpage(); } //Start new page $this->_beginpage($orientation,$format); //Set line cap style to square $this->_out('2 J'); //Set line width $this->LineWidth=$lw; $this->_out(sprintf('%.2F w',$lw*$this->k)); //Set font if($family) $this->SetFont($family,$style,$size); //Set colors $this->DrawColor=$dc; if($dc!='0 G') $this->_out($dc); $this->FillColor=$fc; if($fc!='0 g') $this->_out($fc); $this->TextColor=$tc; $this->ColorFlag=$cf; //Page header $this->InHeader=true; $this->Header(); $this->InHeader=false; //Restore line width if($this->LineWidth!=$lw) { $this->LineWidth=$lw; $this->_out(sprintf('%.2F w',$lw*$this->k)); } //Restore font if($family) $this->SetFont($family,$style,$size); //Restore colors if($this->DrawColor!=$dc) { $this->DrawColor=$dc; $this->_out($dc); } if($this->FillColor!=$fc) { $this->FillColor=$fc; $this->_out($fc); } $this->TextColor=$tc; $this->ColorFlag=$cf; } function Header() { //To be implemented in your own inherited class } function Footer() { //To be implemented in your own inherited class } function PageNo() { //Get current page number return $this->page; } function SetDrawColor($r, $g=null, $b=null) { //Set color for all stroking operations if(($r==0 && $g==0 && $b==0) || $g===null) $this->DrawColor=sprintf('%.3F G',$r/255); else $this->DrawColor=sprintf('%.3F %.3F %.3F RG',$r/255,$g/255,$b/255); if($this->page>0) $this->_out($this->DrawColor); } function SetFillColor($r, $g=null, $b=null) { //Set color for all filling operations if(($r==0 && $g==0 && $b==0) || $g===null) $this->FillColor=sprintf('%.3F g',$r/255); else $this->FillColor=sprintf('%.3F %.3F %.3F rg',$r/255,$g/255,$b/255); $this->ColorFlag=($this->FillColor!=$this->TextColor); if($this->page>0) $this->_out($this->FillColor); } function SetTextColor($r, $g=null, $b=null) { //Set color for text if(($r==0 && $g==0 && $b==0) || $g===null) $this->TextColor=sprintf('%.3F g',$r/255); else $this->TextColor=sprintf('%.3F %.3F %.3F rg',$r/255,$g/255,$b/255); $this->ColorFlag=($this->FillColor!=$this->TextColor); } function GetStringWidth($s) { //Get width of a string in the current font $s=(string)$s; $cw=&$this->CurrentFont['cw']; $w=0; $l=strlen($s); for($i=0;$i<$l;$i++) $w+=$cw[$s[$i]]; return $w*$this->FontSize/1000; } function SetLineWidth($width) { //Set line width $this->LineWidth=$width; if($this->page>0) $this->_out(sprintf('%.2F w',$width*$this->k)); } function Line($x1, $y1, $x2, $y2) { //Draw a line $this->_out(sprintf('%.2F %.2F m %.2F %.2F l S',$x1*$this->k,($this->h-$y1)*$this->k,$x2*$this->k,($this->h-$y2)*$this->k)); } function Rect($x, $y, $w, $h, $style='') { //Draw a rectangle if($style=='F') $op='f'; elseif($style=='FD' || $style=='DF') $op='B'; else $op='S'; $this->_out(sprintf('%.2F %.2F %.2F %.2F re %s',$x*$this->k,($this->h-$y)*$this->k,$w*$this->k,-$h*$this->k,$op)); } function AddFont($family, $style='', $file='') { //Add a TrueType or Type1 font $family=strtolower($family); if($file=='') $file=str_replace(' ','',$family).strtolower($style).'.php'; if($family=='arial') $family='helvetica'; $style=strtoupper($style); if($style=='IB') $style='BI'; $fontkey=$family.$style; if(isset($this->fonts[$fontkey])) return; include($this->_getfontpath().$file); if(!isset($name)) $this->Error('Could not include font definition file'); $i=count($this->fonts)+1; $this->fonts[$fontkey]=array('i'=>$i, 'type'=>$type, 'name'=>$name, 'desc'=>$desc, 'up'=>$up, 'ut'=>$ut, 'cw'=>$cw, 'enc'=>$enc, 'file'=>$file); if($diff) { //Search existing encodings $d=0; $nb=count($this->diffs); for($i=1;$i<=$nb;$i++) { if($this->diffs[$i]==$diff) { $d=$i; break; } } if($d==0) { $d=$nb+1; $this->diffs[$d]=$diff; } $this->fonts[$fontkey]['diff']=$d; } if($file) { if($type=='TrueType') $this->FontFiles[$file]=array('length1'=>$originalsize); else $this->FontFiles[$file]=array('length1'=>$size1, 'length2'=>$size2); } } function SetFont($family, $style='', $size=0) { //Select a font; size given in points global $fpdf_charwidths; $family=strtolower($family); if($family=='') $family=$this->FontFamily; if($family=='arial') $family='helvetica'; elseif($family=='symbol' || $family=='zapfdingbats') $style=''; $style=strtoupper($style); if(strpos($style,'U')!==false) { $this->underline=true; $style=str_replace('U','',$style); } else $this->underline=false; if($style=='IB') $style='BI'; if($size==0) $size=$this->FontSizePt; //Test if font is already selected if($this->FontFamily==$family && $this->FontStyle==$style && $this->FontSizePt==$size) return; //Test if used for the first time $fontkey=$family.$style; if(!isset($this->fonts[$fontkey])) { //Check if one of the standard fonts if(isset($this->CoreFonts[$fontkey])) { if(!isset($fpdf_charwidths[$fontkey])) { //Load metric file $file=$family; if($family=='times' || $family=='helvetica') $file.=strtolower($style); include($this->_getfontpath().$file.'.php'); if(!isset($fpdf_charwidths[$fontkey])) $this->Error('Could not include font metric file'); } $i=count($this->fonts)+1; $name=$this->CoreFonts[$fontkey]; $cw=$fpdf_charwidths[$fontkey]; $this->fonts[$fontkey]=array('i'=>$i, 'type'=>'core', 'name'=>$name, 'up'=>-100, 'ut'=>50, 'cw'=>$cw); } else $this->Error('Undefined font: '.$family.' '.$style); } //Select it $this->FontFamily=$family; $this->FontStyle=$style; $this->FontSizePt=$size; $this->FontSize=$size/$this->k; $this->CurrentFont=&$this->fonts[$fontkey]; if($this->page>0) $this->_out(sprintf('BT /F%d %.2F Tf ET',$this->CurrentFont['i'],$this->FontSizePt)); } function SetFontSize($size) { //Set font size in points if($this->FontSizePt==$size) return; $this->FontSizePt=$size; $this->FontSize=$size/$this->k; if($this->page>0) $this->_out(sprintf('BT /F%d %.2F Tf ET',$this->CurrentFont['i'],$this->FontSizePt)); } function AddLink() { //Create a new internal link $n=count($this->links)+1; $this->links[$n]=array(0, 0); return $n; } function SetLink($link, $y=0, $page=-1) { //Set destination of internal link if($y==-1) $y=$this->y; if($page==-1) $page=$this->page; $this->links[$link]=array($page, $y); } function Link($x, $y, $w, $h, $link) { //Put a link on the page $this->PageLinks[$this->page][]=array($x*$this->k, $this->hPt-$y*$this->k, $w*$this->k, $h*$this->k, $link); } function Text($x, $y, $txt) { //Output a string $s=sprintf('BT %.2F %.2F Td (%s) Tj ET',$x*$this->k,($this->h-$y)*$this->k,$this->_escape($txt)); if($this->underline && $txt!='') $s.=' '.$this->_dounderline($x,$y,$txt); if($this->ColorFlag) $s='q '.$this->TextColor.' '.$s.' Q'; $this->_out($s); } function AcceptPageBreak() { //Accept automatic page break or not return $this->AutoPageBreak; } function Cell($w, $h=0, $txt='', $border=0, $ln=0, $align='', $fill=false, $link='') { //Output a cell $k=$this->k; if($this->y+$h>$this->PageBreakTrigger && !$this->InHeader && !$this->InFooter && $this->AcceptPageBreak()) { //Automatic page break $x=$this->x; $ws=$this->ws; if($ws>0) { $this->ws=0; $this->_out('0 Tw'); } $this->AddPage($this->CurOrientation,$this->CurPageFormat); $this->x=$x; if($ws>0) { $this->ws=$ws; $this->_out(sprintf('%.3F Tw',$ws*$k)); } } if($w==0) $w=$this->w-$this->rMargin-$this->x; $s=''; if($fill || $border==1) { if($fill) $op=($border==1) ? 'B' : 'f'; else $op='S'; $s=sprintf('%.2F %.2F %.2F %.2F re %s ',$this->x*$k,($this->h-$this->y)*$k,$w*$k,-$h*$k,$op); } if(is_string($border)) { $x=$this->x; $y=$this->y; if(strpos($border,'L')!==false) $s.=sprintf('%.2F %.2F m %.2F %.2F l S ',$x*$k,($this->h-$y)*$k,$x*$k,($this->h-($y+$h))*$k); if(strpos($border,'T')!==false) $s.=sprintf('%.2F %.2F m %.2F %.2F l S ',$x*$k,($this->h-$y)*$k,($x+$w)*$k,($this->h-$y)*$k); if(strpos($border,'R')!==false) $s.=sprintf('%.2F %.2F m %.2F %.2F l S ',($x+$w)*$k,($this->h-$y)*$k,($x+$w)*$k,($this->h-($y+$h))*$k); if(strpos($border,'B')!==false) $s.=sprintf('%.2F %.2F m %.2F %.2F l S ',$x*$k,($this->h-($y+$h))*$k,($x+$w)*$k,($this->h-($y+$h))*$k); } if($txt!=='') { if($align=='R') $dx=$w-$this->cMargin-$this->GetStringWidth($txt); elseif($align=='C') $dx=($w-$this->GetStringWidth($txt))/2; else $dx=$this->cMargin; if($this->ColorFlag) $s.='q '.$this->TextColor.' '; $txt2=str_replace(')','\\)',str_replace('(','\\(',str_replace('\\','\\\\',$txt))); $s.=sprintf('BT %.2F %.2F Td (%s) Tj ET',($this->x+$dx)*$k,($this->h-($this->y+.5*$h+.3*$this->FontSize))*$k,$txt2); if($this->underline) $s.=' '.$this->_dounderline($this->x+$dx,$this->y+.5*$h+.3*$this->FontSize,$txt); if($this->ColorFlag) $s.=' Q'; if($link) $this->Link($this->x+$dx,$this->y+.5*$h-.5*$this->FontSize,$this->GetStringWidth($txt),$this->FontSize,$link); } if($s) $this->_out($s); $this->lasth=$h; if($ln>0) { //Go to next line $this->y+=$h; if($ln==1) $this->x=$this->lMargin; } else $this->x+=$w; } function MultiCell($w, $h, $txt, $border=0, $align='J', $fill=false) { //Output text with automatic or explicit line breaks $cw=&$this->CurrentFont['cw']; if($w==0) $w=$this->w-$this->rMargin-$this->x; $wmax=($w-2*$this->cMargin)*1000/$this->FontSize; $s=str_replace("\r",'',$txt); $nb=strlen($s); if($nb>0 && $s[$nb-1]=="\n") $nb--; $b=0; if($border) { if($border==1) { $border='LTRB'; $b='LRT'; $b2='LR'; } else { $b2=''; if(strpos($border,'L')!==false) $b2.='L'; if(strpos($border,'R')!==false) $b2.='R'; $b=(strpos($border,'T')!==false) ? $b2.'T' : $b2; } } $sep=-1; $i=0; $j=0; $l=0; $ns=0; $nl=1; while($i<$nb) { //Get next character $c=$s[$i]; if($c=="\n") { //Explicit line break if($this->ws>0) { $this->ws=0; $this->_out('0 Tw'); } $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill); $i++; $sep=-1; $j=$i; $l=0; $ns=0; $nl++; if($border && $nl==2) $b=$b2; continue; } if($c==' ') { $sep=$i; $ls=$l; $ns++; } $l+=$cw[$c]; if($l>$wmax) { //Automatic line break if($sep==-1) { if($i==$j) $i++; if($this->ws>0) { $this->ws=0; $this->_out('0 Tw'); } $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill); } else { if($align=='J') { $this->ws=($ns>1) ? ($wmax-$ls)/1000*$this->FontSize/($ns-1) : 0; $this->_out(sprintf('%.3F Tw',$this->ws*$this->k)); } $this->Cell($w,$h,substr($s,$j,$sep-$j),$b,2,$align,$fill); $i=$sep+1; } $sep=-1; $j=$i; $l=0; $ns=0; $nl++; if($border && $nl==2) $b=$b2; } else $i++; } //Last chunk if($this->ws>0) { $this->ws=0; $this->_out('0 Tw'); } if($border && strpos($border,'B')!==false) $b.='B'; $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill); $this->x=$this->lMargin; } function Write($h, $txt, $link='') { //Output text in flowing mode $cw=&$this->CurrentFont['cw']; $w=$this->w-$this->rMargin-$this->x; $wmax=($w-2*$this->cMargin)*1000/$this->FontSize; $s=str_replace("\r",'',$txt); $nb=strlen($s); $sep=-1; $i=0; $j=0; $l=0; $nl=1; while($i<$nb) { //Get next character $c=$s[$i]; if($c=="\n") { //Explicit line break $this->Cell($w,$h,substr($s,$j,$i-$j),0,2,'',0,$link); $i++; $sep=-1; $j=$i; $l=0; if($nl==1) { $this->x=$this->lMargin; $w=$this->w-$this->rMargin-$this->x; $wmax=($w-2*$this->cMargin)*1000/$this->FontSize; } $nl++; continue; } if($c==' ') $sep=$i; $l+=$cw[$c]; if($l>$wmax) { //Automatic line break if($sep==-1) { if($this->x>$this->lMargin) { //Move to next line $this->x=$this->lMargin; $this->y+=$h; $w=$this->w-$this->rMargin-$this->x; $wmax=($w-2*$this->cMargin)*1000/$this->FontSize; $i++; $nl++; continue; } if($i==$j) $i++; $this->Cell($w,$h,substr($s,$j,$i-$j),0,2,'',0,$link); } else { $this->Cell($w,$h,substr($s,$j,$sep-$j),0,2,'',0,$link); $i=$sep+1; } $sep=-1; $j=$i; $l=0; if($nl==1) { $this->x=$this->lMargin; $w=$this->w-$this->rMargin-$this->x; $wmax=($w-2*$this->cMargin)*1000/$this->FontSize; } $nl++; } else $i++; } //Last chunk if($i!=$j) $this->Cell($l/1000*$this->FontSize,$h,substr($s,$j),0,0,'',0,$link); } function Ln($h=null) { //Line feed; default value is last cell height $this->x=$this->lMargin; if($h===null) $this->y+=$this->lasth; else $this->y+=$h; } function Image($file, $x=null, $y=null, $w=0, $h=0, $type='', $link='') { //Put an image on the page if(!isset($this->images[$file])) { //First use of this image, get info if($type=='') { $pos=strrpos($file,'.'); if(!$pos) $this->Error('Image file has no extension and no type was specified: '.$file); $type=substr($file,$pos+1); } $type=strtolower($type); if($type=='jpeg') $type='jpg'; $mtd='_parse'.$type; if(!method_exists($this,$mtd)) $this->Error('Unsupported image type: '.$type); $info=$this->$mtd($file); $info['i']=count($this->images)+1; $this->images[$file]=$info; } else $info=$this->images[$file]; //Automatic width and height calculation if needed if($w==0 && $h==0) { //Put image at 72 dpi $w=$info['w']/$this->k; $h=$info['h']/$this->k; } elseif($w==0) $w=$h*$info['w']/$info['h']; elseif($h==0) $h=$w*$info['h']/$info['w']; //Flowing mode if($y===null) { if($this->y+$h>$this->PageBreakTrigger && !$this->InHeader && !$this->InFooter && $this->AcceptPageBreak()) { //Automatic page break $x2=$this->x; $this->AddPage($this->CurOrientation,$this->CurPageFormat); $this->x=$x2; } $y=$this->y; $this->y+=$h; } if($x===null) $x=$this->x; $this->_out(sprintf('q %.2F 0 0 %.2F %.2F %.2F cm /I%d Do Q',$w*$this->k,$h*$this->k,$x*$this->k,($this->h-($y+$h))*$this->k,$info['i'])); if($link) $this->Link($x,$y,$w,$h,$link); } function GetX() { //Get x position return $this->x; } function SetX($x) { //Set x position if($x>=0) $this->x=$x; else $this->x=$this->w+$x; } function GetY() { //Get y position return $this->y; } function SetY($y) { //Set y position and reset x $this->x=$this->lMargin; if($y>=0) $this->y=$y; else $this->y=$this->h+$y; } function SetXY($x, $y) { //Set x and y positions $this->SetY($y); $this->SetX($x); } function Output($name='', $dest='') { //Output PDF to some destination if($this->state<3) $this->Close(); $dest=strtoupper($dest); if($dest=='') { if($name=='') { $name='doc.pdf'; $dest='I'; } else $dest='F'; } switch($dest) { case 'I': //Send to standard output if(ob_get_length()) $this->Error('Some data has already been output, can\'t send PDF file'); if(php_sapi_name()!='cli') { //We send to a browser header('Content-Type: application/pdf'); if(headers_sent()) $this->Error('Some data has already been output, can\'t send PDF file'); header('Content-Length: '.strlen($this->buffer)); header('Content-Disposition: inline; filename="'.$name.'"'); header('Cache-Control: private, max-age=0, must-revalidate'); header('Pragma: public'); ini_set('zlib.output_compression','0'); } echo $this->buffer; break; case 'D': //Download file if(ob_get_length()) $this->Error('Some data has already been output, can\'t send PDF file'); header('Content-Type: application/x-download'); if(headers_sent()) $this->Error('Some data has already been output, can\'t send PDF file'); header('Content-Length: '.strlen($this->buffer)); header('Content-Disposition: attachment; filename="'.$name.'"'); header('Cache-Control: private, max-age=0, must-revalidate'); header('Pragma: public'); ini_set('zlib.output_compression','0'); echo $this->buffer; break; case 'F': //Save to local file $f=fopen($name,'wb'); if(!$f) $this->Error('Unable to create output file: '.$name); fwrite($f,$this->buffer,strlen($this->buffer)); fclose($f); break; case 'S': //Return as a string return $this->buffer; default: $this->Error('Incorrect output destination: '.$dest); } return ''; } /******************************************************************************* * * * Protected methods * * * *******************************************************************************/ function _dochecks() { //Check availability of %F if(sprintf('%.1F',1.0)!='1.0') $this->Error('This version of PHP is not supported'); //Check mbstring overloading if(ini_get('mbstring.func_overload') & 2) $this->Error('mbstring overloading must be disabled'); //Disable runtime magic quotes if(get_magic_quotes_runtime()) @set_magic_quotes_runtime(0); } function _getpageformat($format) { $format=strtolower($format); if(!isset($this->PageFormats[$format])) $this->Error('Unknown page format: '.$format); $a=$this->PageFormats[$format]; return array($a[0]/$this->k, $a[1]/$this->k); } function _getfontpath() { if(!defined('FPDF_FONTPATH') && is_dir(dirname(__FILE__).'/font')) define('FPDF_FONTPATH',dirname(__FILE__).'/font/'); return defined('FPDF_FONTPATH') ? FPDF_FONTPATH : ''; } function _beginpage($orientation, $format) { $this->page++; $this->pages[$this->page]=''; $this->state=2; $this->x=$this->lMargin; $this->y=$this->tMargin; $this->FontFamily=''; //Check page size if($orientation=='') $orientation=$this->DefOrientation; else $orientation=strtoupper($orientation[0]); if($format=='') $format=$this->DefPageFormat; else { if(is_string($format)) $format=$this->_getpageformat($format); } if($orientation!=$this->CurOrientation || $format[0]!=$this->CurPageFormat[0] || $format[1]!=$this->CurPageFormat[1]) { //New size if($orientation=='P') { $this->w=$format[0]; $this->h=$format[1]; } else { $this->w=$format[1]; $this->h=$format[0]; } $this->wPt=$this->w*$this->k; $this->hPt=$this->h*$this->k; $this->PageBreakTrigger=$this->h-$this->bMargin; $this->CurOrientation=$orientation; $this->CurPageFormat=$format; } if($orientation!=$this->DefOrientation || $format[0]!=$this->DefPageFormat[0] || $format[1]!=$this->DefPageFormat[1]) $this->PageSizes[$this->page]=array($this->wPt, $this->hPt); } function _endpage() { $this->state=1; } function _escape($s) { //Escape special characters in strings $s=str_replace('\\','\\\\',$s); $s=str_replace('(','\\(',$s); $s=str_replace(')','\\)',$s); $s=str_replace("\r",'\\r',$s); return $s; } function _textstring($s) { //Format a text string return '('.$this->_escape($s).')'; } function _UTF8toUTF16($s) { //Convert UTF-8 to UTF-16BE with BOM $res="\xFE\xFF"; $nb=strlen($s); $i=0; while($i<$nb) { $c1=ord($s[$i++]); if($c1>=224) { //3-byte character $c2=ord($s[$i++]); $c3=ord($s[$i++]); $res.=chr((($c1 & 0x0F)<<4) + (($c2 & 0x3C)>>2)); $res.=chr((($c2 & 0x03)<<6) + ($c3 & 0x3F)); } elseif($c1>=192) { //2-byte character $c2=ord($s[$i++]); $res.=chr(($c1 & 0x1C)>>2); $res.=chr((($c1 & 0x03)<<6) + ($c2 & 0x3F)); } else { //Single-byte character $res.="\0".chr($c1); } } return $res; } function _dounderline($x, $y, $txt) { //Underline text $up=$this->CurrentFont['up']; $ut=$this->CurrentFont['ut']; $w=$this->GetStringWidth($txt)+$this->ws*substr_count($txt,' '); return sprintf('%.2F %.2F %.2F %.2F re f',$x*$this->k,($this->h-($y-$up/1000*$this->FontSize))*$this->k,$w*$this->k,-$ut/1000*$this->FontSizePt); } function _parsejpg($file) { //Extract info from a JPEG file $a=GetImageSize($file); if(!$a) $this->Error('Missing or incorrect image file: '.$file); if($a[2]!=2) $this->Error('Not a JPEG file: '.$file); if(!isset($a['channels']) || $a['channels']==3) $colspace='DeviceRGB'; elseif($a['channels']==4) $colspace='DeviceCMYK'; else $colspace='DeviceGray'; $bpc=isset($a['bits']) ? $a['bits'] : 8; //Read whole file $f=fopen($file,'rb'); $data=''; while(!feof($f)) $data.=fread($f,8192); fclose($f); return array('w'=>$a[0], 'h'=>$a[1], 'cs'=>$colspace, 'bpc'=>$bpc, 'f'=>'DCTDecode', 'data'=>$data); } function _parsepng($file) { //Extract info from a PNG file $f=fopen($file,'rb'); if(!$f) $this->Error('Can\'t open image file: '.$file); //Check signature if($this->_readstream($f,8)!=chr(137).'PNG'.chr(13).chr(10).chr(26).chr(10)) $this->Error('Not a PNG file: '.$file); //Read header chunk $this->_readstream($f,4); if($this->_readstream($f,4)!='IHDR') $this->Error('Incorrect PNG file: '.$file); $w=$this->_readint($f); $h=$this->_readint($f); $bpc=ord($this->_readstream($f,1)); if($bpc>8) $this->Error('16-bit depth not supported: '.$file); $ct=ord($this->_readstream($f,1)); if($ct==0) $colspace='DeviceGray'; elseif($ct==2) $colspace='DeviceRGB'; elseif($ct==3) $colspace='Indexed'; else $this->Error('Alpha channel not supported: '.$file); if(ord($this->_readstream($f,1))!=0) $this->Error('Unknown compression method: '.$file); if(ord($this->_readstream($f,1))!=0) $this->Error('Unknown filter method: '.$file); if(ord($this->_readstream($f,1))!=0) $this->Error('Interlacing not supported: '.$file); $this->_readstream($f,4); $parms='/DecodeParms <>'; //Scan chunks looking for palette, transparency and image data $pal=''; $trns=''; $data=''; do { $n=$this->_readint($f); $type=$this->_readstream($f,4); if($type=='PLTE') { //Read palette $pal=$this->_readstream($f,$n); $this->_readstream($f,4); } elseif($type=='tRNS') { //Read transparency info $t=$this->_readstream($f,$n); if($ct==0) $trns=array(ord(substr($t,1,1))); elseif($ct==2) $trns=array(ord(substr($t,1,1)), ord(substr($t,3,1)), ord(substr($t,5,1))); else { $pos=strpos($t,chr(0)); if($pos!==false) $trns=array($pos); } $this->_readstream($f,4); } elseif($type=='IDAT') { //Read image data block $data.=$this->_readstream($f,$n); $this->_readstream($f,4); } elseif($type=='IEND') break; else $this->_readstream($f,$n+4); } while($n); if($colspace=='Indexed' && empty($pal)) $this->Error('Missing palette in '.$file); fclose($f); return array('w'=>$w, 'h'=>$h, 'cs'=>$colspace, 'bpc'=>$bpc, 'f'=>'FlateDecode', 'parms'=>$parms, 'pal'=>$pal, 'trns'=>$trns, 'data'=>$data); } function _readstream($f, $n) { //Read n bytes from stream $res=''; while($n>0 && !feof($f)) { $s=fread($f,$n); if($s===false) $this->Error('Error while reading stream'); $n-=strlen($s); $res.=$s; } if($n>0) $this->Error('Unexpected end of stream'); return $res; } function _readint($f) { //Read a 4-byte integer from stream $a=unpack('Ni',$this->_readstream($f,4)); return $a['i']; } function _parsegif($file) { //Extract info from a GIF file (via PNG conversion) if(!function_exists('imagepng')) $this->Error('GD extension is required for GIF support'); if(!function_exists('imagecreatefromgif')) $this->Error('GD has no GIF read support'); $im=imagecreatefromgif($file); if(!$im) $this->Error('Missing or incorrect image file: '.$file); imageinterlace($im,0); $tmp=tempnam('.','gif'); if(!$tmp) $this->Error('Unable to create a temporary file'); if(!imagepng($im,$tmp)) $this->Error('Error while saving to temporary file'); imagedestroy($im); $info=$this->_parsepng($tmp); unlink($tmp); return $info; } function _newobj() { //Begin a new object $this->n++; $this->offsets[$this->n]=strlen($this->buffer); $this->_out($this->n.' 0 obj'); } function _putstream($s) { $this->_out('stream'); $this->_out($s); $this->_out('endstream'); } function _out($s) { //Add a line to the document if($this->state==2) $this->pages[$this->page].=$s."\n"; else $this->buffer.=$s."\n"; } function _putpages() { $nb=$this->page; if(!empty($this->AliasNbPages)) { //Replace number of pages for($n=1;$n<=$nb;$n++) $this->pages[$n]=str_replace($this->AliasNbPages,$nb,$this->pages[$n]); } if($this->DefOrientation=='P') { $wPt=$this->DefPageFormat[0]*$this->k; $hPt=$this->DefPageFormat[1]*$this->k; } else { $wPt=$this->DefPageFormat[1]*$this->k; $hPt=$this->DefPageFormat[0]*$this->k; } $filter=($this->compress) ? '/Filter /FlateDecode ' : ''; for($n=1;$n<=$nb;$n++) { //Page $this->_newobj(); $this->_out('<_out('/Parent 1 0 R'); if(isset($this->PageSizes[$n])) $this->_out(sprintf('/MediaBox [0 0 %.2F %.2F]',$this->PageSizes[$n][0],$this->PageSizes[$n][1])); $this->_out('/Resources 2 0 R'); if(isset($this->PageLinks[$n])) { //Links $annots='/Annots ['; foreach($this->PageLinks[$n] as $pl) { $rect=sprintf('%.2F %.2F %.2F %.2F',$pl[0],$pl[1],$pl[0]+$pl[2],$pl[1]-$pl[3]); $annots.='<_textstring($pl[4]).'>>>>'; else { $l=$this->links[$pl[4]]; $h=isset($this->PageSizes[$l[0]]) ? $this->PageSizes[$l[0]][1] : $hPt; $annots.=sprintf('/Dest [%d 0 R /XYZ 0 %.2F null]>>',1+2*$l[0],$h-$l[1]*$this->k); } } $this->_out($annots.']'); } $this->_out('/Contents '.($this->n+1).' 0 R>>'); $this->_out('endobj'); //Page content $p=($this->compress) ? gzcompress($this->pages[$n]) : $this->pages[$n]; $this->_newobj(); $this->_out('<<'.$filter.'/Length '.strlen($p).'>>'); $this->_putstream($p); $this->_out('endobj'); } //Pages root $this->offsets[1]=strlen($this->buffer); $this->_out('1 0 obj'); $this->_out('<_out($kids.']'); $this->_out('/Count '.$nb); $this->_out(sprintf('/MediaBox [0 0 %.2F %.2F]',$wPt,$hPt)); $this->_out('>>'); $this->_out('endobj'); } function _putfonts() { $nf=$this->n; foreach($this->diffs as $diff) { //Encodings $this->_newobj(); $this->_out('<>'); $this->_out('endobj'); } foreach($this->FontFiles as $file=>$info) { //Font file embedding $this->_newobj(); $this->FontFiles[$file]['n']=$this->n; $font=''; $f=fopen($this->_getfontpath().$file,'rb',1); if(!$f) $this->Error('Font file not found'); while(!feof($f)) $font.=fread($f,8192); fclose($f); $compressed=(substr($file,-2)=='.z'); if(!$compressed && isset($info['length2'])) { $header=(ord($font[0])==128); if($header) { //Strip first binary header $font=substr($font,6); } if($header && ord($font[$info['length1']])==128) { //Strip second binary header $font=substr($font,0,$info['length1']).substr($font,$info['length1']+6); } } $this->_out('<_out('/Filter /FlateDecode'); $this->_out('/Length1 '.$info['length1']); if(isset($info['length2'])) $this->_out('/Length2 '.$info['length2'].' /Length3 0'); $this->_out('>>'); $this->_putstream($font); $this->_out('endobj'); } foreach($this->fonts as $k=>$font) { //Font objects $this->fonts[$k]['n']=$this->n+1; $type=$font['type']; $name=$font['name']; if($type=='core') { //Standard font $this->_newobj(); $this->_out('<_out('/BaseFont /'.$name); $this->_out('/Subtype /Type1'); if($name!='Symbol' && $name!='ZapfDingbats') $this->_out('/Encoding /WinAnsiEncoding'); $this->_out('>>'); $this->_out('endobj'); } elseif($type=='Type1' || $type=='TrueType') { //Additional Type1 or TrueType font $this->_newobj(); $this->_out('<_out('/BaseFont /'.$name); $this->_out('/Subtype /'.$type); $this->_out('/FirstChar 32 /LastChar 255'); $this->_out('/Widths '.($this->n+1).' 0 R'); $this->_out('/FontDescriptor '.($this->n+2).' 0 R'); if($font['enc']) { if(isset($font['diff'])) $this->_out('/Encoding '.($nf+$font['diff']).' 0 R'); else $this->_out('/Encoding /WinAnsiEncoding'); } $this->_out('>>'); $this->_out('endobj'); //Widths $this->_newobj(); $cw=&$font['cw']; $s='['; for($i=32;$i<=255;$i++) $s.=$cw[chr($i)].' '; $this->_out($s.']'); $this->_out('endobj'); //Descriptor $this->_newobj(); $s='<$v) $s.=' /'.$k.' '.$v; $file=$font['file']; if($file) $s.=' /FontFile'.($type=='Type1' ? '' : '2').' '.$this->FontFiles[$file]['n'].' 0 R'; $this->_out($s.'>>'); $this->_out('endobj'); } else { //Allow for additional types $mtd='_put'.strtolower($type); if(!method_exists($this,$mtd)) $this->Error('Unsupported font type: '.$type); $this->$mtd($font); } } } function _putimages() { $filter=($this->compress) ? '/Filter /FlateDecode ' : ''; reset($this->images); while(list($file,$info)=each($this->images)) { $this->_newobj(); $this->images[$file]['n']=$this->n; $this->_out('<_out('/Subtype /Image'); $this->_out('/Width '.$info['w']); $this->_out('/Height '.$info['h']); if($info['cs']=='Indexed') $this->_out('/ColorSpace [/Indexed /DeviceRGB '.(strlen($info['pal'])/3-1).' '.($this->n+1).' 0 R]'); else { $this->_out('/ColorSpace /'.$info['cs']); if($info['cs']=='DeviceCMYK') $this->_out('/Decode [1 0 1 0 1 0 1 0]'); } $this->_out('/BitsPerComponent '.$info['bpc']); if(isset($info['f'])) $this->_out('/Filter /'.$info['f']); if(isset($info['parms'])) $this->_out($info['parms']); if(isset($info['trns']) && is_array($info['trns'])) { $trns=''; for($i=0;$i_out('/Mask ['.$trns.']'); } $this->_out('/Length '.strlen($info['data']).'>>'); $this->_putstream($info['data']); unset($this->images[$file]['data']); $this->_out('endobj'); //Palette if($info['cs']=='Indexed') { $this->_newobj(); $pal=($this->compress) ? gzcompress($info['pal']) : $info['pal']; $this->_out('<<'.$filter.'/Length '.strlen($pal).'>>'); $this->_putstream($pal); $this->_out('endobj'); } } } function _putxobjectdict() { foreach($this->images as $image) $this->_out('/I'.$image['i'].' '.$image['n'].' 0 R'); } function _putresourcedict() { $this->_out('/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]'); $this->_out('/Font <<'); foreach($this->fonts as $font) $this->_out('/F'.$font['i'].' '.$font['n'].' 0 R'); $this->_out('>>'); $this->_out('/XObject <<'); $this->_putxobjectdict(); $this->_out('>>'); } function _putresources() { $this->_putfonts(); $this->_putimages(); //Resource dictionary $this->offsets[2]=strlen($this->buffer); $this->_out('2 0 obj'); $this->_out('<<'); $this->_putresourcedict(); $this->_out('>>'); $this->_out('endobj'); } function _putinfo() { $this->_out('/Producer '.$this->_textstring('FPDF '.FPDF_VERSION)); if(!empty($this->title)) $this->_out('/Title '.$this->_textstring($this->title)); if(!empty($this->subject)) $this->_out('/Subject '.$this->_textstring($this->subject)); if(!empty($this->author)) $this->_out('/Author '.$this->_textstring($this->author)); if(!empty($this->keywords)) $this->_out('/Keywords '.$this->_textstring($this->keywords)); if(!empty($this->creator)) $this->_out('/Creator '.$this->_textstring($this->creator)); $this->_out('/CreationDate '.$this->_textstring('D:'.@date('YmdHis'))); } function _putcatalog() { $this->_out('/Type /Catalog'); $this->_out('/Pages 1 0 R'); if($this->ZoomMode=='fullpage') $this->_out('/OpenAction [3 0 R /Fit]'); elseif($this->ZoomMode=='fullwidth') $this->_out('/OpenAction [3 0 R /FitH null]'); elseif($this->ZoomMode=='real') $this->_out('/OpenAction [3 0 R /XYZ null null 1]'); elseif(!is_string($this->ZoomMode)) $this->_out('/OpenAction [3 0 R /XYZ null null '.($this->ZoomMode/100).']'); if($this->LayoutMode=='single') $this->_out('/PageLayout /SinglePage'); elseif($this->LayoutMode=='continuous') $this->_out('/PageLayout /OneColumn'); elseif($this->LayoutMode=='two') $this->_out('/PageLayout /TwoColumnLeft'); } function _putheader() { $this->_out('%PDF-'.$this->PDFVersion); } function _puttrailer() { $this->_out('/Size '.($this->n+1)); $this->_out('/Root '.$this->n.' 0 R'); $this->_out('/Info '.($this->n-1).' 0 R'); } function _enddoc() { $this->_putheader(); $this->_putpages(); $this->_putresources(); //Info $this->_newobj(); $this->_out('<<'); $this->_putinfo(); $this->_out('>>'); $this->_out('endobj'); //Catalog $this->_newobj(); $this->_out('<<'); $this->_putcatalog(); $this->_out('>>'); $this->_out('endobj'); //Cross-ref $o=strlen($this->buffer); $this->_out('xref'); $this->_out('0 '.($this->n+1)); $this->_out('0000000000 65535 f '); for($i=1;$i<=$this->n;$i++) $this->_out(sprintf('%010d 00000 n ',$this->offsets[$i])); //Trailer $this->_out('trailer'); $this->_out('<<'); $this->_puttrailer(); $this->_out('>>'); $this->_out('startxref'); $this->_out($o); $this->_out('%%EOF'); $this->state=3; } //End of class } //Handle special IE contype request if(isset($_SERVER['HTTP_USER_AGENT']) && $_SERVER['HTTP_USER_AGENT']=='contype') { header('Content-Type: application/pdf'); exit; } ?> pnp4nagios-0.6.16/share/pnp/application/vendor/fpdf/fpdi.php0000664000000000000000000004006511662503006022443 0ustar rootrootcurrent_filename = $filename; $fn =& $this->current_filename; if (!isset($this->parsers[$fn])) $this->parsers[$fn] = new fpdi_pdf_parser($fn, $this); $this->current_parser =& $this->parsers[$fn]; return $this->parsers[$fn]->getPageCount(); } /** * Import a page * * @param int $pageno pagenumber * @return int Index of imported page - to use with fpdf_tpl::useTemplate() */ function importPage($pageno, $boxName='/CropBox') { if ($this->_intpl) { return $this->error('Please import the desired pages before creating a new template.'); } $fn =& $this->current_filename; // check if page already imported $pageKey = $fn.((int)$pageno).$boxName; if (isset($this->_importedPages[$pageKey])) return $this->_importedPages[$pageKey]; $parser =& $this->parsers[$fn]; $parser->setPageno($pageno); $this->tpl++; $this->tpls[$this->tpl] = array(); $tpl =& $this->tpls[$this->tpl]; $tpl['parser'] =& $parser; $tpl['resources'] = $parser->getPageResources(); $tpl['buffer'] = $parser->getContent(); if (!in_array($boxName, $parser->availableBoxes)) return $this->Error(sprintf('Unknown box: %s', $boxName)); $pageboxes = $parser->getPageBoxes($pageno); /** * MediaBox * CropBox: Default -> MediaBox * BleedBox: Default -> CropBox * TrimBox: Default -> CropBox * ArtBox: Default -> CropBox */ if (!isset($pageboxes[$boxName]) && ($boxName == '/BleedBox' || $boxName == '/TrimBox' || $boxName == '/ArtBox')) $boxName = '/CropBox'; if (!isset($pageboxes[$boxName]) && $boxName == '/CropBox') $boxName = '/MediaBox'; if (!isset($pageboxes[$boxName])) return false; $this->lastUsedPageBox = $boxName; $box = $pageboxes[$boxName]; $tpl['box'] = $box; // To build an array that can be used by PDF_TPL::useTemplate() $this->tpls[$this->tpl] = array_merge($this->tpls[$this->tpl],$box); // An imported page will start at 0,0 everytime. Translation will be set in _putformxobjects() $tpl['x'] = 0; $tpl['y'] = 0; $page =& $parser->pages[$parser->pageno]; // handle rotated pages $rotation = $parser->getPageRotation($pageno); $tpl['_rotationAngle'] = 0; if (isset($rotation[1]) && ($angle = $rotation[1] % 360) != 0) { $steps = $angle / 90; $_w = $tpl['w']; $_h = $tpl['h']; $tpl['w'] = $steps % 2 == 0 ? $_w : $_h; $tpl['h'] = $steps % 2 == 0 ? $_h : $_w; $tpl['_rotationAngle'] = $angle*-1; } $this->_importedPages[$pageKey] = $this->tpl; return $this->tpl; } function getLastUsedPageBox() { return $this->lastUsedPageBox; } function useTemplate($tplidx, $_x=null, $_y=null, $_w=0, $_h=0, $adjustPageSize=false) { if ($adjustPageSize == true && is_null($_x) && is_null($_y)) { $size = $this->getTemplateSize($tplidx, $_w, $_h); $format = array($size['w'], $size['h']); if ($format[0]!=$this->CurPageFormat[0] || $format[1]!=$this->CurPageFormat[1]) { $this->w=$format[0]; $this->h=$format[1]; $this->wPt=$this->w*$this->k; $this->hPt=$this->h*$this->k; $this->PageBreakTrigger=$this->h-$this->bMargin; $this->CurPageFormat=$format; $this->PageSizes[$this->page]=array($this->wPt, $this->hPt); } } $this->_out('q 0 J 1 w 0 j 0 G 0 g'); // reset standard values $s = parent::useTemplate($tplidx, $_x, $_y, $_w, $_h); $this->_out('Q'); return $s; } /** * Private method, that rebuilds all needed objects of source files */ function _putimportedobjects() { if (is_array($this->parsers) && count($this->parsers) > 0) { foreach($this->parsers AS $filename => $p) { $this->current_parser =& $this->parsers[$filename]; if (isset($this->_obj_stack[$filename]) && is_array($this->_obj_stack[$filename])) { while(($n = key($this->_obj_stack[$filename])) !== null) { $nObj = $this->current_parser->pdf_resolve_object($this->current_parser->c,$this->_obj_stack[$filename][$n][1]); $this->_newobj($this->_obj_stack[$filename][$n][0]); if ($nObj[0] == PDF_TYPE_STREAM) { $this->pdf_write_value ($nObj); } else { $this->pdf_write_value ($nObj[1]); } $this->_out('endobj'); $this->_obj_stack[$filename][$n] = null; // free memory unset($this->_obj_stack[$filename][$n]); reset($this->_obj_stack[$filename]); } } } } } /** * Private Method that writes the form xobjects */ function _putformxobjects() { $filter=($this->compress) ? '/Filter /FlateDecode ' : ''; reset($this->tpls); foreach($this->tpls AS $tplidx => $tpl) { $p=($this->compress) ? gzcompress($tpl['buffer']) : $tpl['buffer']; $this->_newobj(); $cN = $this->n; // TCPDF/Protection: rem current "n" $this->tpls[$tplidx]['n'] = $this->n; $this->_out('<<'.$filter.'/Type /XObject'); $this->_out('/Subtype /Form'); $this->_out('/FormType 1'); $this->_out(sprintf('/BBox [%.2F %.2F %.2F %.2F]', (isset($tpl['box']['llx']) ? $tpl['box']['llx'] : $tpl['x'])*$this->k, (isset($tpl['box']['lly']) ? $tpl['box']['lly'] : -$tpl['y'])*$this->k, (isset($tpl['box']['urx']) ? $tpl['box']['urx'] : $tpl['w'] + $tpl['x'])*$this->k, (isset($tpl['box']['ury']) ? $tpl['box']['ury'] : $tpl['h']-$tpl['y'])*$this->k )); $c = 1; $s = 0; $tx = 0; $ty = 0; if (isset($tpl['box'])) { $tx = -$tpl['box']['llx']; $ty = -$tpl['box']['lly']; if ($tpl['_rotationAngle'] <> 0) { $angle = $tpl['_rotationAngle'] * M_PI/180; $c=cos($angle); $s=sin($angle); switch($tpl['_rotationAngle']) { case -90: $tx = -$tpl['box']['lly']; $ty = $tpl['box']['urx']; break; case -180: $tx = $tpl['box']['urx']; $ty = $tpl['box']['ury']; break; case -270: $tx = $tpl['box']['ury']; $ty = 0; break; } } } else if ($tpl['x'] != 0 || $tpl['y'] != 0) { $tx = -$tpl['x']*2; $ty = $tpl['y']*2; } $tx *= $this->k; $ty *= $this->k; if ($c != 1 || $s != 0 || $tx != 0 || $ty != 0) { $this->_out(sprintf('/Matrix [%.5F %.5F %.5F %.5F %.5F %.5F]', $c, $s, -$s, $c, $tx, $ty )); } $this->_out('/Resources '); if (isset($tpl['resources'])) { $this->current_parser =& $tpl['parser']; $this->pdf_write_value($tpl['resources']); // "n" will be changed } else { $this->_out('<_res['tpl'][$tplidx]['fonts']) && count($this->_res['tpl'][$tplidx]['fonts'])) { $this->_out('/Font <<'); foreach($this->_res['tpl'][$tplidx]['fonts'] as $font) $this->_out('/F'.$font['i'].' '.$font['n'].' 0 R'); $this->_out('>>'); } if(isset($this->_res['tpl'][$tplidx]['images']) && count($this->_res['tpl'][$tplidx]['images']) || isset($this->_res['tpl'][$tplidx]['tpls']) && count($this->_res['tpl'][$tplidx]['tpls'])) { $this->_out('/XObject <<'); if (isset($this->_res['tpl'][$tplidx]['images']) && count($this->_res['tpl'][$tplidx]['images'])) { foreach($this->_res['tpl'][$tplidx]['images'] as $image) $this->_out('/I'.$image['i'].' '.$image['n'].' 0 R'); } if (isset($this->_res['tpl'][$tplidx]['tpls']) && count($this->_res['tpl'][$tplidx]['tpls'])) { foreach($this->_res['tpl'][$tplidx]['tpls'] as $i => $tpl) $this->_out($this->tplprefix.$i.' '.$tpl['n'].' 0 R'); } $this->_out('>>'); } $this->_out('>>'); } $nN = $this->n; // TCPDF: rem new "n" $this->n = $cN; // TCPDF: reset to current "n" $this->_out('/Length '.strlen($p).' >>'); $this->_putstream($p); $this->_out('endobj'); $this->n = $nN; // TCPDF: reset to new "n" } $this->_putimportedobjects(); } /** * Rewritten to handle existing own defined objects */ function _newobj($obj_id=false,$onlynewobj=false) { if (!$obj_id) { $obj_id = ++$this->n; } //Begin a new object if (!$onlynewobj) { $this->offsets[$obj_id] = is_subclass_of($this, 'TCPDF') ? $this->bufferlen : strlen($this->buffer); $this->_out($obj_id.' 0 obj'); $this->_current_obj_id = $obj_id; // for later use with encryption } return $obj_id; } /** * Writes a value * Needed to rebuild the source document * * @param mixed $value A PDF-Value. Structure of values see cases in this method */ function pdf_write_value(&$value) { if (is_subclass_of($this, 'TCPDF')) { parent::pdf_write_value($value); } switch ($value[0]) { case PDF_TYPE_TOKEN : $this->_straightOut($value[1] . ' '); break; case PDF_TYPE_NUMERIC : case PDF_TYPE_REAL : if (is_float($value[1]) && $value[1] != 0) { $this->_straightOut(rtrim(rtrim(sprintf('%F', $value[1]), '0'), '.') .' '); } else { $this->_straightOut($value[1] . ' '); } break; case PDF_TYPE_ARRAY : // An array. Output the proper // structure and move on. $this->_straightOut('['); for ($i = 0; $i < count($value[1]); $i++) { $this->pdf_write_value($value[1][$i]); } $this->_out(']'); break; case PDF_TYPE_DICTIONARY : // A dictionary. $this->_straightOut('<<'); reset ($value[1]); while (list($k, $v) = each($value[1])) { $this->_straightOut($k . ' '); $this->pdf_write_value($v); } $this->_straightOut('>>'); break; case PDF_TYPE_OBJREF : // An indirect object reference // Fill the object stack if needed $cpfn =& $this->current_parser->filename; if (!isset($this->_don_obj_stack[$cpfn][$value[1]])) { $this->_newobj(false,true); $this->_obj_stack[$cpfn][$value[1]] = array($this->n, $value); $this->_don_obj_stack[$cpfn][$value[1]] = array($this->n, $value); // Value is maybee obsolete!!! } $objid = $this->_don_obj_stack[$cpfn][$value[1]][0]; $this->_out($objid.' 0 R'); break; case PDF_TYPE_STRING : // A string. $this->_straightOut('('.$value[1].')'); break; case PDF_TYPE_STREAM : // A stream. First, output the // stream dictionary, then the // stream data itself. $this->pdf_write_value($value[1]); $this->_out('stream'); $this->_out($value[2][1]); $this->_out('endstream'); break; case PDF_TYPE_HEX : $this->_straightOut('<'.$value[1].'>'); break; case PDF_TYPE_BOOLEAN : $this->_straightOut($value[1] ? 'true ' : 'false '); break; case PDF_TYPE_NULL : // The null object. $this->_straightOut('null '); break; } } /** * Modified so not each call will add a newline to the output. */ function _straightOut($s) { if (!is_subclass_of($this, 'TCPDF')) { if($this->state==2) $this->pages[$this->page] .= $s; else $this->buffer .= $s; } else { if ($this->state == 2) { if (isset($this->footerlen[$this->page]) AND ($this->footerlen[$this->page] > 0)) { // puts data before page footer $page = substr($this->getPageBuffer($this->page), 0, -$this->footerlen[$this->page]); $footer = substr($this->getPageBuffer($this->page), -$this->footerlen[$this->page]); $this->setPageBuffer($this->page, $page.' '.$s."\n".$footer); } else { $this->setPageBuffer($this->page, $s, true); } } else { $this->setBuffer($s); } } } /** * rewritten to close opened parsers * */ function _enddoc() { parent::_enddoc(); $this->_closeParsers(); } /** * close all files opened by parsers */ function _closeParsers() { if ($this->state > 2 && count($this->parsers) > 0) { foreach ($this->parsers as $k => $_){ $this->parsers[$k]->closeFile(); $this->parsers[$k] = null; unset($this->parsers[$k]); } return true; } return false; } } pnp4nagios-0.6.16/share/pnp/application/i18n/0000775000000000000000000000000011662503006017346 5ustar rootrootpnp4nagios-0.6.16/share/pnp/application/i18n/ru_RU/0000775000000000000000000000000011662503006020402 5ustar rootrootpnp4nagios-0.6.16/share/pnp/application/i18n/ru_RU/error.php0000664000000000000000000001133711662503006022251 0ustar rootroot 'RRDTool не обнаружено в %s. Read FAQ online', 'config-not-found' => 'Файл конфигурации %s не найден. Read FAQ online', 'perfdata-dir-empty' => 'Директория с данными производительности "%s" пуста. Пожалуйста, проверьте конфигурацию Nagios. Read FAQ online', 'host-perfdata-dir-empty' => 'Директория с данными производительности "%s" пуста. Пожалуйста, проверьте конфигурацию Nagios. Read FAQ online', 'perfdata-dir-for-host' => 'Директория с данными производительности "%s" для хоста "%s" не существует. Read FAQ online', 'xml-not-found' => 'XML файл "%s" не найден. Read FAQ online', 'get-first-service' => 'Невозможно определить первую службу для хоста "%s". Read FAQ online', 'get-first-host' => 'Ни по одному хосту данных не обнаружено. Read FAQ online', 'xml-structure-mismatch' => 'Несоответствие структуры данных XML. Обнаружена версия "%d", ожидаемая версия - "%d". Read FAQ online', 'save-rrd-image' => 'Функция php fopen("%s") завершилась неудачей. Read FAQ online', 'xml-structure-without-version-tag' => 'Несоответствие структуры данных XML. Тэг версии не найден в "%s". Read FAQ online', 'template-without-opt' => 'Шаблон %s не предоставляет массив $opt[]. Read FAQ online', 'template-without-def' => 'Шаблон %s не предоставляет массив $def[]. Read FAQ online', 'no-data-for-page' => 'Извините, не удалось обнаружить никаких данных используя конфигурационный файл "%s", Read FAQ online', 'page-not-readable' => 'Конфигурационный файл "%s" не может быть прочитан или не существует. Read FAQ online', 'auth-pages' => 'Вы не авторизованы для просмотра "страниц" Read FAQ online', 'page-config-dir' => 'Файл конфигурации "страниц" не найден в "%s" Read FAQ online', 'xport-host-service' => 'Контроллер Xport требует параметры "host" и "srv" в URL. Read FAQ online', 'mod-rewrite' => 'Модуль Rewrite для Apache не включен. Read FAQ online', 'tpl-no-services-found' => 'Службы "%s" не найдены. Read FAQ online', 'tpl-no-hosts-found' => 'Хосты "%s" не найдены. Read FAQ online', 'no-templates-found' => 'Шаблоны "%s" не найдены. Read FAQ online', 'not_authorized' => 'Вы не авторизованы для просмотра данного хоста/службы', 'remote_user_missing' => 'Удалённый пользователь не указан. Проверка аутентификации отменена. Read FAQ online', 'livestatus_socket_error' => 'Ошибка Livestatus сокета: %s (%s) Read FAQ online', 'not_authorized_for_host_overview' => 'Вы не авторизованы для доступа к странице обзора хоста.', 'xml-generic_error' => 'Не удаётся распарсить XML файл "%s".

    Ошибки XML:%s

    ', ); pnp4nagios-0.6.16/share/pnp/application/i18n/ru_RU/common.php0000664000000000000000000000630311662503006022405 0ustar rootroot 'Источник данных: %s', 'host' => 'Хост: %s', 'service' => 'Служба: %s', 'page' => 'Страница: %s', 'page-basket' => 'Страница: Мой набор', 'zoom-header' => 'Детализация', 'status-box-header' => 'Статус', 'multisite-box-header' => 'Multisite links', 'search-box-header' => 'Поиск', 'icon-box-header' => 'Действия', 'basket-box-header' => 'Мой набор', 'timerange-box-header' => 'Интервалы времени', 'service-box-header' => 'Службы', 'special-templates-box-header' => 'Специальные шаблоны', 'pages-box-header' => 'Страницы', 'nagios-summary-link-title' => 'Последние алерты за данный промежуток', 'nagios-avail-link-title' => 'Сводка доступности за данный промежуток', 'timerange-selector-legend' => 'Выберите промежуток', 'timerange-selector-title' => 'Установка собственного интервала времени', 'timerange-selector-submit-button' => 'ввести', 'timerange-selector-clear-button' => 'очистить', 'timerange-selector-link' => 'Собственный интервал', 'timerange-selector-overview' => 'Overview', 'start' => 'Начало', 'end' => 'Окончание', 'service-details' => 'Подробности о службе', 'service-overview' => 'Обзор служб для "%s"', 'title-pages-link' => 'Обзор страниц', 'title-pdf-link' => 'Просмотр PDF', 'title-xml-link' => 'Просмотр XML', 'title-statistics-link' => 'Просмотр внутренней статистики PNP', 'title-calendar-link' => 'Установка собственного временного интервала', 'title-special-templates-link' => 'Просмотр специальных шаблонов', 'title-docs-link' => 'Просмотреть документацию', 'title-home-link' => 'Просмотр графиков', 'docs-home' => 'На главную', 'docs-box-header' => 'Меню', 'docs-header' => 'Версия документации %s', 'back' => 'назад', 'mobile-all-hosts' => 'Все хосты', 'mobile-search-hosts' => 'Поиск хостов', 'mobile-pages' => 'Просмотр страниц', 'mobile-special-templates' => 'Просмотр специальных шаблонов', 'mobile-statistics' => 'Просмотр внутренней статистики', 'mobile-go-classic' => 'Классический UI', 'mobile-submit' => 'Ввести', 'basket-empty' => 'Корзина пуста', 'basket-show' => 'Показать корзину', 'basket-clear' => 'Clear basket', 'basket-remove' => 'Убрать %s', 'basket-add-item' => 'Добавить этот элемент в мою корзину', 'basket-add-service' => 'Добавить эту службу в мою корзину', ); pnp4nagios-0.6.16/share/pnp/application/i18n/es_ES/0000775000000000000000000000000011662503006020344 5ustar rootrootpnp4nagios-0.6.16/share/pnp/application/i18n/es_ES/error.php0000664000000000000000000000754411662503006022220 0ustar rootroot 'RRDTool no se encuentra en %s. Leer FAQ en línea', 'config-not-found' => 'El fichero de configuración %s no se ha encontrado. Leer FAQ en línea', 'perfdata-dir-empty' => 'El directorio de Perfdata "%s" está vacío. Compruebe la configuración de Nagios. Leer FAQ en línea', 'host-perfdata-dir-empty' => 'El directorio de Perfdata "%s" está vacío. Compruebe la configuración de Nagios. Leer FAQ en línea', 'perfdata-dir-for-host' => 'El directorio Perfdata "%s" para el Equipo "%s" no existe. Leer FAQ en línea', 'xml-not-found' => 'Fichero XML "%s" no encontrado. Leer FAQ en línea', 'get-first-service' => 'No puedo encontrar el primer servicio para el equipo "%s". Leer FAQ en línea', 'get-first-host' => 'No puedo encuentrar ningún Equipo. Leer FAQ en línea', 'xml-structure-mismatch' => 'Error en la Estructura XML. Versión Encontrada "%d" pero debería ser "%d". Read FAQ online', 'save-rrd-image' => 'fallo en php fopen("%s"). Leer FAQ en línea', 'xml-structure-without-version-tag' => 'Error en la estructura XML. Etiqueta de Versión no encontrada. Leer FAQ en línea', 'template-without-opt' => 'La plantilla %s no tiene el array $opt[]. Leer FAQ en línea', 'template-without-def' => 'La plantilla %s no tiene el array $def[]. Leer FAQ en línea', 'no-data-for-page' => 'Lo siento, no puedo encontrar ningún dato usando el fichero de configuración "%s", Leer FAQ en línea', 'page-not-readable' => 'El fichero de configuración "%s" no es legible o no existe. Leer FAQ en línea', 'auth-pages' => 'No está autorizado a ver "páginas" Leer FAQ en línea', 'page-config-dir' => 'No hay fichero de configuración de página en "%s" Leer FAQ en línea', 'xport-host-service' => 'El controlador Xport necesita los parámetros de URL "host" y "srv". Leer FAQ en línea', 'mod-rewrite' => 'El módulo Apache Rewrite no está habilitado. Leer FAQ en línea', 'tpl-no-services-found' => 'No services could be found "%s". Read FAQ online', 'tpl-no-hosts-found' => 'No hosts could be found "%s". Read FAQ online', 'no-templates-found' => 'No templates could be found. Read FAQ online', 'not_authorized' => 'You are not authorized to view this host/service', 'remote_user_missing' => 'Remote user is missing. Authentication check cancled. Read FAQ online', 'livestatus_socket_error' => 'Livestatus Socket error: %s (%s) Read FAQ online', 'not_authorized_for_host_overview' => 'You are not authorized to access this host overview page.', 'xml-generic_error' => 'XML file "%s" not parsable.

    XML Errors:%s

    ', ); pnp4nagios-0.6.16/share/pnp/application/i18n/es_ES/common.php0000664000000000000000000000464511662503006022356 0ustar rootroot 'Fuente de Datos: %s', 'host' => 'Equipo: %s', 'service' => 'Servicio: %s', 'page' => 'Page: %s', 'page-basket' => 'Página: Cesta', 'zoom-header' => 'Zoom', 'status-box-header' => 'Estado', 'multisite-box-header' => 'Multisite links', 'search-box-header' => 'Buscar', 'icon-box-header' => 'Acciones', 'basket-box-header' => 'Mi Cesta', 'timerange-box-header' => 'Intervalos de Tiempo', 'service-box-header' => 'Servicios', 'pages-box-header' => 'Páginas', 'nagios-summary-link-title' => 'Alertas Recientes en el Intervalo de Tiempo', 'nagios-avail-link-title' => 'Informe de Disponibilidad en el Intervalo de Tiempo', 'timerange-selector-legend' => 'Seleccione un intervalo de tiempo personalizado', 'timerange-selector-title' => 'Seleccione un intervalo de tiempo personalizado', 'timerange-selector-submit-button' => 'enviar', 'timerange-selector-clear-button' => 'limpiar', 'timerange-selector-link' => 'Intervalo de tiempo personalizado', 'timerange-selector-overview' => 'Overview', 'start' => 'Comienzo', 'end' => 'Fin', 'service-details' => 'Detalles de Servicio', 'service-overview' => 'Vista General de Servicio para "%s"', 'title-pages-link' => 'Ver páginas', 'title-pdf-link' => 'Ver PDF', 'title-xml-link' => 'Ver XML', 'title-statistics-link' => 'Ver estadísticas internas de PNP', 'title-calendar-link' => 'Definir un intervalo de tiempo personalizado', 'title-special-templates-link' => 'View Special Templates', 'title-docs-link' => 'View Documentation', 'title-home-link' => 'View Graphs', 'docs-home' => 'Home', 'docs-box-header' => 'Menu', 'docs-header' => 'Documentation Version %s', 'back' => 'back', 'mobile-all-hosts' => 'All Hosts', 'mobile-search-hosts' => 'Search Hosts', 'mobile-pages' => 'View Pages', 'mobile-special-templates' => 'View Special Templates', 'mobile-statistics' => 'View internal statistics', 'mobile-go-classic' => 'Classic UI', 'mobile-submit' => 'Submit', 'basket-empty' => 'Basket is empty', 'basket-show' => 'Show basket', 'basket-clear' => 'Clear basket', 'basket-remove' => 'Remove %s', 'basket-add-item' => 'Add this item to my basket', 'basket-add-service' => 'Add this service to my basket', ); pnp4nagios-0.6.16/share/pnp/application/i18n/en_US/0000775000000000000000000000000011662503006020357 5ustar rootrootpnp4nagios-0.6.16/share/pnp/application/i18n/en_US/error.php0000664000000000000000000000706511662503006022231 0ustar rootroot 'RRDTool not found in %s. Read FAQ online', 'config-not-found' => 'Config file %s not found. Read FAQ online', 'perfdata-dir-empty' => 'perfdata directory "%s" is empty. Please check your Nagios config. Read FAQ online', 'host-perfdata-dir-empty' => 'perfdata directory "%s" is empty. Please check your Nagios config. Read FAQ online', 'perfdata-dir-for-host' => 'perfdata directory "%s" for host "%s" does not exist. Read FAQ online', 'xml-not-found' => 'XML file "%s" not found. Read FAQ online', 'get-first-service' => 'Can´t find first service for host "%s". Read FAQ online', 'get-first-host' => 'Can´t find any Host. Read FAQ online', 'xml-structure-mismatch' => 'XML structure mismatch. Found version "%d" but should be "%d". Read FAQ online', 'save-rrd-image' => 'php fopen("%s") failed. Read FAQ online', 'xml-structure-without-version-tag' => 'XML structure mismatch. Version tag not found in "%s". Read FAQ online', 'template-without-opt' => 'Template %s does not provide array $opt[]. Read FAQ online', 'template-without-def' => 'Template %s does not provide array $def[]. Read FAQ online', 'no-data-for-page' => 'Sorry, but we can´t find any data using config file "%s", Read FAQ online', 'page-not-readable' => 'Config file "%s" is not readable or does not exist. Read FAQ online', 'auth-pages' => 'You are not authorized to view "pages" Read FAQ online', 'page-config-dir' => 'No page config file found in "%s" Read FAQ online', 'xport-host-service' => 'Xport controller needs "host" and "srv" URL parameters. Read FAQ online', 'mod-rewrite' => 'Apache Rewrite Module is not enabled. Read FAQ online', 'tpl-no-services-found' => 'No services could be found "%s". Read FAQ online', 'tpl-no-hosts-found' => 'No hosts could be found "%s". Read FAQ online', 'no-templates-found' => 'No templates could be found. Read FAQ online', 'not_authorized' => 'You are not authorized to view this host/service', 'remote_user_missing' => 'Remote user is missing. Authentication check cancled. Read FAQ online', 'livestatus_socket_error' => 'Livestatus Socket error: %s (%s) Read FAQ online', 'not_authorized_for_host_overview' => 'You are not authorized to access this host overview page.', 'xml-generic_error' => 'XML file "%s" not parsable.

    XML Errors:%s

    ', ); pnp4nagios-0.6.16/share/pnp/application/i18n/en_US/common.php0000664000000000000000000000452611662503006022367 0ustar rootroot 'Datasource: %s', 'host' => 'Host: %s', 'service' => 'Service: %s', 'page' => 'Page: %s', 'page-basket' => 'Page: Basket', 'zoom-header' => 'Zoom', 'status-box-header' => 'Status', 'multisite-box-header' => 'Multisite links', 'search-box-header' => 'Search', 'icon-box-header' => 'Actions', 'basket-box-header' => 'My basket', 'timerange-box-header' => 'Time ranges', 'service-box-header' => 'Services', 'special-templates-box-header' => 'Special Templates', 'pages-box-header' => 'Pages', 'nagios-summary-link-title' => 'Most recent alerts for this time range', 'nagios-avail-link-title' => 'Nagios availability report for this time range', 'timerange-selector-legend' => 'Select a custom time range', 'timerange-selector-title' => 'Select a custom time range', 'timerange-selector-submit-button' => 'Submit', 'timerange-selector-clear-button' => 'Clear', 'timerange-selector-link' => 'Custom time range', 'timerange-selector-overview' => 'Overview', 'start' => 'Start', 'end' => 'End', 'service-details' => 'Service details', 'service-overview' => 'Service overview for "%s"', 'title-pages-link' => 'View Pages', 'title-pdf-link' => 'View PDF', 'title-xml-link' => 'View XML', 'title-statistics-link' => 'View internal statistics', 'title-calendar-link' => 'Define a custom time range', 'title-special-templates-link' => 'View Special Templates', 'title-docs-link' => 'View Documentation', 'title-home-link' => 'View Graphs', 'docs-home' => 'Home', 'docs-box-header' => 'Menu', 'docs-header' => 'Documentation Version %s', 'back' => 'back', 'mobile-all-hosts' => 'All Hosts', 'mobile-search-hosts' => 'Search Hosts', 'mobile-pages' => 'View Pages', 'mobile-special-templates' => 'View Special Templates', 'mobile-statistics' => 'View internal statistics', 'mobile-go-classic' => 'Classic UI', 'mobile-submit' => 'Submit', 'basket-empty' => 'Basket is empty', 'basket-show' => 'Show basket', 'basket-clear' => 'Clear basket', 'basket-remove' => 'Remove %s', 'basket-add-item' => 'Add this item to my basket', 'basket-add-service' => 'Add this service to my basket', ); pnp4nagios-0.6.16/share/pnp/application/i18n/fr_FR/0000775000000000000000000000000011662503006020344 5ustar rootrootpnp4nagios-0.6.16/share/pnp/application/i18n/fr_FR/error.php0000664000000000000000000000735611662503006022221 0ustar rootroot 'RRDTool non trouvé dans %s. Lire la FAQ', 'config-not-found' => 'Fichier de config %s non trouvé. Lire la FAQ', 'perfdata-dir-empty' => 'Répertoire perfdata "%s" vide. Merci de vérifier la configuration de Nagios. Lire la FAQ', 'host-perfdata-dir-empty' => 'Répertoire perfdata "%s" vide. Merci de vérifier la configuration de Nagios. Lire la FAQ', 'perfdata-dir-for-host' => 'Répertoire perfdata "%s" du serveur "%s" n\'existe pas. Lire la FAQ', 'xml-not-found' => 'Fichier XML "%s" non trouvé. Lire la FAQ', 'get-first-service' => 'Impossible de trouver le premier service du serveur "%s". Lire la FAQ', 'get-first-host' => 'Impossible de trouver un serveur. Lire la FAQ', 'xml-structure-mismatch' => 'Structure XML incorrecte. Version trouvé "%d" mais version attendu "%d". Lire la FAQ', 'save-rrd-image' => 'Échec de la fonction php fopen("%s"). Lire la FAQ', 'xml-structure-without-version-tag' => 'Structure XML incorrect. Balise de version introuvable dans "%s". Lire la FAQ', 'template-without-opt' => 'Le template %s ne renvoie pas de tableau $opt[]. Lire la FAQ', 'template-without-def' => 'Le template %s ne renvoie pas de tableau $def[]. Lire la FAQ', 'no-data-for-page' => 'Désolé, mais impossible de trouver des données en utilisant le fichier de configuration "%s", Lire la FAQ', 'page-not-readable' => 'Impossible de lire le fichier de configuration "%s" ou fichier introuvable. Lire la FAQ', 'auth-pages' => 'Vous n\'êtes pas autorisé de voir "pages" Lire la FAQ', 'page-config-dir' => 'Pas de fichier de configuration pour page dans "%s" Lire la FAQ', 'xport-host-service' => 'Le contrôleur Xport nécessite les paramètres "host" et "srv" en paramètres d\'URL. Lire la FAQ', 'mod-rewrite' => 'Module Apache Rewrite désactivé. Lire la FAQ', 'tpl-no-services-found' => 'Impossible de trouver des services "%s". Read FAQ online', 'tpl-no-hosts-found' => 'Impossible de trouver des serveurs "%s". Read FAQ online', 'no-templates-found' => 'Impossible de trouver des modèles. Read FAQ online', 'not_authorized' => 'You are not authorized to view this host/service', 'remote_user_missing' => 'Remote user is missing. Authentication check cancled. Read FAQ online', 'livestatus_socket_error' => 'Livestatus Socket error: %s (%s) Read FAQ online', 'not_authorized_for_host_overview' => 'You are not authorized to access this host overview page.', 'xml-generic_error' => 'XML file "%s" not parsable.

    XML Errors:%s

    ', ); pnp4nagios-0.6.16/share/pnp/application/i18n/fr_FR/common.php0000664000000000000000000000473011662503006022351 0ustar rootroot 'Source de données : %s', 'host' => 'Machine : %s', 'service' => 'Service : %s', 'page' => 'Page : %s', 'page-basket' => 'Page : Panier', 'zoom-header' => 'Zoom', 'status-box-header' => 'État', 'multisite-box-header' => 'Liens multisite', 'search-box-header' => 'Recherche', 'icon-box-header' => 'Actions', 'basket-box-header' => 'Mon panier', 'timerange-box-header' => 'Plage de temps', 'service-box-header' => 'Services', 'special-templates-box-header' => 'Patrons spécifiques', 'pages-box-header' => 'Pages', 'nagios-summary-link-title' => 'Alarmes les plus récentes dans cette plage de temps', 'nagios-avail-link-title' => 'Disponibilité de Nagios pendant cette plage de temps', 'timerange-selector-legend' => 'Selectionner une plage de temps', 'timerange-selector-title' => 'Selectionner une plage de temps', 'timerange-selector-submit-button' => 'démarrer', 'timerange-selector-clear-button' => 'effacer', 'timerange-selector-link' => 'Plage de temps personnalisée', 'timerange-selector-overview' => 'Overview', 'start' => 'Début', 'end' => 'Fin', 'service-details' => 'Détails du service', 'service-overview' => 'Aperçu du service sur "%s"', 'title-pages-link' => 'Voir la page', 'title-pdf-link' => 'Extraction PDF', 'title-xml-link' => 'Extraction XML', 'title-statistics-link' => 'Voir statistiques internes sur PNP', 'title-calendar-link' => 'Définir une plage de temps', 'title-special-templates-link' => 'Voir les patrons', 'title-docs-link' => 'Accèder à la documentation', 'title-home-link' => 'Accèder aux graphiques', 'docs-home' => 'Accueil', 'docs-box-header' => 'Menu', 'docs-header' => 'Version de la documentation %s', 'back' => 'back', 'mobile-all-hosts' => 'All Hosts', 'mobile-search-hosts' => 'Search Hosts', 'mobile-pages' => 'View Pages', 'mobile-special-templates' => 'View Special Templates', 'mobile-statistics' => 'View internal statistics', 'mobile-go-classic' => 'Classic UI', 'mobile-submit' => 'Submit', 'basket-empty' => 'Basket is empty', 'basket-show' => 'Show basket', 'basket-clear' => 'Clear basket', 'basket-remove' => 'Remove %s', 'basket-add-item' => 'Add this item to my basket', 'basket-add-service' => 'Add this service to my basket', ); pnp4nagios-0.6.16/share/pnp/application/i18n/de_DE/0000775000000000000000000000000011662503006020306 5ustar rootrootpnp4nagios-0.6.16/share/pnp/application/i18n/de_DE/error.php0000664000000000000000000000743111662503006022155 0ustar rootroot '"rrdtool"-Binary nicht in %s gefunden. FAQ online lesen', 'config-not-found' => 'Config-Datei %s nicht gefunden. FAQ online lesen', 'perfdata-dir-empty' => 'Das perfdata-Verzeichnis "%s" ist leer. Bitte die Nagios-Konfiguration prüfen. FAQ online lesen', 'host-perfdata-dir-empty' => 'Das perfdata-Verzeichnis "%s" ist leer. Bitte die Nagios-Konfiguration prüfen. FAQ online lesen', 'perfdata-dir-for-host' => 'Das perfdata-Verzeichnis "%s" für Host "%s" existiert nicht. FAQ online lesen', 'xml-not-found' => 'XML-Datei "%s" nicht gefunden. FAQ online lesen', 'get-first-service' => 'Konnte ersten Service für Host "%s" nicht finden. FAQ online lesen', 'get-first-host' => 'Keinen Host gefunden. FAQ online lesen', 'xml-structure-mismatch' => 'Version der XML-Struktur ungültig. Fand Version "%d", sollte aber "%d" sein. FAQ online lesen', 'save-rrd-image' => 'Speichern des Graphen gescheitert. php fopen("%s") failed. FAQ online lesen', 'xml-structure-without-version-tag' => 'Versionshinweis fehlt im XML-File. FAQ online lesen', 'template-without-opt' => 'Template %s übergibt Array $opt[] nicht. FAQ online lesen', 'template-without-def' => 'Template %s übergibt Array $def[] nicht. FAQ online lesen', 'no-data-for-page' => 'Keine Daten für die Page "%s", FAQ online lesen', 'page-not-readable' => 'Konfigurationsdatei "%s" ist nicht lesbar oder existiert nicht. FAQ online lesen', 'auth-pages' => 'Sie sind nicht berechtigt, "Pages" anzusehen FAQ online lesen', 'page-config-dir' => 'Keine page-Konfigurationsdatei in "%s" gefunden FAQ online lesen', 'xport-host-service' => 'Xport-Controller benötigt "host"- und "srv"-URL-Parameter. FAQ online lesen', 'mod-rewrite' => 'Apache Rewrite Module ist nicht aktiviert. Read FAQ online', 'tpl-no-services-found' => 'Es wurden keine Services gefunden "%s". Read FAQ online', 'tpl-no-hosts-found' => 'Es wurden keine Hosts gefunden "%s". Read FAQ online', 'no-templates-found' => 'Es wurde kein passendes Template gefunden. Read FAQ online', 'not_authorized' => 'You are not authorized to view this host/service', 'remote_user_missing' => 'Remote user is missing. Authentication check cancled. Read FAQ online', 'livestatus_socket_error' => 'Livestatus Socket error: %s (%s) Read FAQ online', 'not_authorized_for_host_overview' => 'You are not authorized to access this host overview page.', 'xml-generic_error' => 'XML file "%s" not parsable.

    XML Errors:%s

    ', ); pnp4nagios-0.6.16/share/pnp/application/i18n/de_DE/common.php0000664000000000000000000000470211662503006022312 0ustar rootroot 'Host: %s', 'service' => 'Service: %s', 'page' => 'Page: %s', 'page-basket' => 'Page: Basket', 'datasource' => 'Datasource: %s', 'zoom-header' => 'Zoom', 'status-box-header' => 'Status', 'multisite-box-header' => 'Multisite Links', 'search-box-header' => 'Suche', 'icon-box-header' => 'Aktionen', 'basket-box-header' => 'Mein Korb', 'timerange-box-header' => 'Zeitbereiche', 'service-box-header' => 'Services', 'special-templates-box-header' => 'Special Templates', 'pages-box-header' => 'Pages', 'nagios-summary-link-title' => 'aktuellste Alarme für diesen Zeitbereich', 'nagios-avail-link-title' => 'Nagios-Verügbarkeitsbericht für diesen Zeitbereich', 'timerange-selector-legend' => 'Auswahl eines Zeitbereichs', 'timerange-selector-title' => 'Auswahl eines Zeitbereichs', 'timerange-selector-submit-button' => 'absenden', 'timerange-selector-clear-button' => 'löschen', 'timerange-selector-link' => 'Spezieller Zeitbereich', 'timerange-selector-overview' => 'Übersicht', 'start' => 'Start', 'end' => 'Ende', 'service-details' => 'Service-Details', 'service-overview' => 'Service-Übersicht für "%s"', 'title-pages-link' => 'Pages anzeigen', 'title-pdf-link' => 'PDF anzeigen', 'title-xml-link' => 'XML anzeigen', 'title-statistics-link' => 'Interne PNP Statistiken', 'title-calendar-link' => 'Einen Zeitbereich definieren', 'title-special-templates-link' => 'Spezial Templates anzeigen', 'title-docs-link' => 'Dokumentation', 'title-home-link' => 'Zu den Graphen', 'docs-home' => 'Home', 'docs-box-header' => 'Menu', 'docs-header' => 'Dokumentation Version %s', 'back' => 'zurück', 'mobile-all-hosts' => 'Alle Hosts', 'mobile-search-hosts' => 'Hosts suchen', 'mobile-pages' => 'Pages anzeigen', 'mobile-special-templates' => 'Special Templates anzeigen', 'mobile-statistics' => 'Interne PNP Statistiken', 'mobile-go-classic' => 'Classic UI', 'mobile-submit' => 'absenden', 'basket-empty' => 'Basket ist leer', 'basket-show' => 'Zeige Basket', 'basket-clear' => 'Leere Basket', 'basket-remove' => 'Entferne %s', 'basket-add-item' => 'Graphen zum Basket hinzufügen', 'basket-add-service' => 'Alle Graphen zum Basket hinzufügen', ); pnp4nagios-0.6.16/share/pnp/application/helpers/0000775000000000000000000000000011662503006020231 5ustar rootrootpnp4nagios-0.6.16/share/pnp/application/helpers/pnp.php0000664000000000000000000001164111662503006021542 0ustar rootroot $length){ $string = substr($string, 0, $length) . "..."; } return $string; } /* * */ public static function xml_version_check($string = FALSE){ if($string === FALSE){ return FALSE; } if( $string == XML_STRUCTURE_VERSION ){ $string = "valid"; }else{ $string = Kohana::lang('error.xml-structure-mismatch', $string, XML_STRUCTURE_VERSION); } return $string; } /* * */ public static function zoom_icon($host,$service,$start,$end,$source,$view,$graph_width,$graph_height){ print "\n"; } /* * */ public static function zoom_icon_special($tpl,$start,$end,$source,$view,$graph_width,$graph_height){ print "\n"; } /* * */ public static function add_to_basket_icon($host,$service,$source=FALSE){ if($source === FALSE){ print "\n"; }else{ print "\n"; } } /* * */ public static function multisite_link($base_url=FALSE,$site=FALSE,$host=FALSE,$service=FALSE){ if($host && $service){ $link = sprintf("'%s/view.py?view_name=service&site=%s&host=%s&service=%s'", $base_url,$site,urlencode($host),urlencode($service)); return $link; } if($host){ $link = sprintf("'%s/view.py?view_name=host&site=%s&host=%s'", $base_url,$site,urlencode($host)); return $link; } } public static function addToUri($fields = array(),$base = True){ if(!is_array($fields)){ return false; } $get = $_GET; if($base === True){ $uri = url::base(TRUE); $uri .= Router::$current_uri; }else{ $uri = ""; } $uri .= '?'; foreach($fields as $key=>$value){ $get[$key] = $value; } foreach($get as $key=>$value){ if($value === ''){ continue; } $uri .= $key."=".urlencode($value)."&"; } return rtrim($uri,"&"); } /* "normalize" and adjust value / unit (similar to format string %s in RRDtool) * Parameters in: * value := number, maybe suffixed by unit string * examples: 1234, 1.234, 1234M, 1234Kb * base := base of value (1000, e.g. traffic or 1024, e.g. disk size) * format := format string * Parameters out: * val_unit := formatted value (including unit) * val_fmt := formatted value (without leading blanks and unit) * unit := adjusted unit * divisor := number used to "normalize" value */ public static function adjust_unit($value,$base=1000,$format='%.3lf'){ preg_match('/^(-?[0-9\.,]+)\s*(\S?)(\S?)/',$value,$matches); $mag = 0; while ($value >= $base){ $value /= $base; $mag++; } $pos = 0; if ($matches[2] == "%") { $unit = '%'; } else { if ($matches[2] == "") { $matches[2] = " "; } if (($matches[2] == "B") or ($matches[2] == "b")) { $matches[3] = $matches[2]; $matches[2] = " "; } $pos = strpos(' KMGTP',$matches[2]); $unit = substr(' KMGTP',$mag+$pos,1).$matches[3]; } $val_unit = sprintf ("$format %s", $value, $unit); $val_fmt = sprintf ($format, $value); $val_fmt = str_replace(' ','',$val_fmt); return array ($val_unit,$val_fmt,$unit,pow($base,$mag)); } } pnp4nagios-0.6.16/share/pnp/application/helpers/nagios.php0000664000000000000000000000542611662503006022231 0ustar rootrootconfig->conf['nagios_base']; print "\n"; } public function AvailLink($hostname,$servicedesc,$start,$end){ $hostname = urlencode($hostname); $servicedesc = urlencode($servicedesc); $smon = date('m' , $start); $sday = date('d' , $start); $syear = date('Y' , $start); $shour = date('G' , $start); $smin = date('i' , $start); $ssec = date('s' , $start); $emon = date('m' , $end); $eday = date('d' , $end); $eyear = date('Y' , $end); $ehour = date('G' , $end); $emin = date('i' , $end); $esec = date('s' , $end); $nagios_base = $this->config->conf['nagios_base']; if($servicedesc == "Host+Perfdata"){ print "\n"; } } pnp4nagios-0.6.16/share/pnp/application/helpers/rrd.php0000664000000000000000000003540111662503006021534 0ustar rootroot= 1 ){ $color .= "$ri"; } else { $color .= "00"; } if ( ($z & 2) >= 1 ){ $color .= "$ri"; } else { $color .= "00"; } if ( ($z & 1) >= 1 ){ $color .= "$ri"; } else { $color .= "00"; } $icolor = rrd::color_inverse($color); $pos = array_search($color,$colors); $ipos = array_search($icolor,$colors); if ( $pos == false ) { $colors[] = $color . $alpha; } if ( $ipos == false ) { $colors[] = $icolor . $alpha; } } } if (array_key_exists($num, $colors)) { return $colors[$num]; } else { return $colors[0]; } } /* * Gradient Function * Concept by Stefan Triep */ public static function gradient($vname=FALSE, $start_color='#0000a0', $end_color='#f0f0f0', $label=FALSE, $steps=20, $lower=FALSE){ if($vname === FALSE){ throw new Kohana_exception("rrd::". __FUNCTION__ . "() First Parameter 'vname' is missing"); } if(preg_match('/^#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})/i',$start_color,$matches)){ $r1=hexdec($matches[1]); $g1=hexdec($matches[2]); $b1=hexdec($matches[3]); }else{ throw new Kohana_exception("rrd::". __FUNCTION__ . "() Wrong Color Format: '".$start_color."'"); } if(preg_match('/^#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})/i',$end_color,$matches)){ $r2=hexdec($matches[1]); $g2=hexdec($matches[2]); $b2=hexdec($matches[3]); }else{ throw new Kohana_exception("rrd::". __FUNCTION__ . "() Wrong Color Format: '".$end_color."'"); } $diff_r=$r2-$r1; $diff_g=$g2-$g1; $diff_b=$b2-$b1; $spline = ""; $spline_vname = "var".substr(sha1(rand()),1,4); if(preg_match('/^([0-9]{1,3})%$/', $lower, $matches)){ if($matches[1] > 100) throw new Kohana_exception("rrd::". __FUNCTION__ . "() Lower gradient start > 100% is not allowed: '".$lower."'"); $lower = $matches[1]; $spline .= sprintf("CDEF:%sminimum=%s,100,/,%d,* ", $vname, $vname, $lower); }elseif(preg_match('/^([0-9]+)$/', $lower, $matches)){ $lower = $matches[1]; $spline .= sprintf("CDEF:%sminimum=%s,%d,- ", $vname, $vname, $lower); }else{ $lower = 0; $spline .= sprintf("CDEF:%sminimum=%s,%s,- ", $vname, $vname, $vname); } # debug # $spline .= sprintf("GPRINT:%sminimum:MAX:\"minumum %%lf\\n\" ",$vname); for ($i=$steps; $i>0; $i--){ $spline .= sprintf("CDEF:%s%d=%s,%sminimum,-,%d,/,%d,*,%sminimum,+ ",$spline_vname,$i,$vname,$vname,$steps,$i,$vname ); # debug # $spline .= sprintf("GPRINT:%s%d:MAX:\"%22d %%lf\\n\" ",$spline_vname,$i,$i); } for ($i=$steps; $i>0; $i--){ $factor=$i / $steps; $r=round($r1 + $diff_r * $factor); $g=round($g1 + $diff_g * $factor); $b=round($b1 + $diff_b * $factor); if (($i==$steps) and ($label!=FALSE)){ $spline .= sprintf("AREA:%s%d#%02X%02X%02X:\"%s\" ", $spline_vname,$i,$r,$g,$b,$label); }else{ $spline .= sprintf("AREA:%s%d#%02X%02X%02X ", $spline_vname,$i,$r,$g,$b); } } return $spline; } public static function cut($string, $length=18, $align='left'){ if(strlen($string) > $length){ $string = substr($string,0,($length-3))."..."; } if($align == 'left'){ $format = "%-".$length."s"; }else{ $format = "%".$length."s"; } $s = sprintf($format,$string); return $s; } public static function area($vname=FALSE, $color=FALSE, $text=FALSE, $stack=FALSE){ $line = ""; if($vname === FALSE){ throw new Kohana_exception("rrd::". __FUNCTION__ . "() First Parameter 'vname' is missing"); }else{ $line .= "AREA:".$vname; } if($color === FALSE){ throw new Kohana_exception("rrd::". __FUNCTION__ . "() Second Parameter 'color' is missing"); }else{ $line .= $color; } $line .= ":\"$text\""; if($stack != FALSE){ $line .= ":STACK"; } $line .= " "; return $line; } public static function line($type=1,$vname=FALSE, $color=FALSE, $text=FALSE, $stack=FALSE){ $line = ""; if($vname === FALSE){ throw new Kohana_exception("rrd::". __FUNCTION__ . "() First Parameter 'vname' is missing"); }else{ $line .= "LINE".$type.":".$vname; } if($color === FALSE){ throw new Kohana_exception("rrd::". __FUNCTION__ . "() Second Parameter 'color' is missing"); }else{ $line .= $color; } $line .= ":\"$text\""; if($stack != FALSE){ $line .= ":STACK"; } $line .= " "; return $line; } public static function line1($vname=FALSE, $color=FALSE, $text=FALSE, $stack=FALSE){ return rrd::line(1,$vname, $color,$text, $stack); } public static function line2($vname=FALSE, $color=FALSE, $text=FALSE, $stack=FALSE){ return rrd::line(2,$vname, $color,$text, $stack); } public static function line3($vname=FALSE, $color=FALSE, $text=FALSE, $stack=FALSE){ return rrd::line(3,$vname, $color,$text, $stack); } public static function gprint($vname=FALSE, $cf="AVERAGE", $text="%6.2lf %s"){ $line = ""; if($vname === FALSE){ throw new Kohana_exception("rrd::". __FUNCTION__ . "() First Parameter 'vname' is missing"); } if(is_array($cf)){ foreach($cf as $key => $val){ $line .= sprintf("GPRINT:%s:%s:",$vname,$val); if($key == sizeof($cf)-1){ $line .= '"'.$text.' '.ucfirst(strtolower($val)).'\\l" '; }else{ $line .= '"'.$text.' '.ucfirst(strtolower($val)).'" '; } } }else{ $line .= sprintf("GPRINT:%s:%s:",$vname,$cf); $line .= '"'.$text.'" '; } return $line; } public static function def($vname=FALSE, $rrdfile=FALSE, $ds=FALSE, $cf="AVERAGE"){ $line = ""; if($vname === FALSE){ throw new Kohana_exception("rrd::". __FUNCTION__ . "() First Parameter 'vname' is missing"); } if($rrdfile === FALSE){ throw new Kohana_exception("rrd::". __FUNCTION__ . "() Second Parameter 'rrdfile' is missing"); } if($rrdfile === FALSE){ throw new Kohana_exception("rrd::". __FUNCTION__ . "() Third Parameter 'ds' is missing"); } $line = sprintf("DEF:%s=%s:%s:%s ",$vname,$rrdfile,$ds,$cf); return $line; } public static function cdef($vname=FALSE, $rpn=FALSE){ $line = ""; if($vname === FALSE){ throw new Kohana_exception("rrd::". __FUNCTION__ . "() First Parameter 'vname' is missing"); } if($rpn === FALSE){ throw new Kohana_exception("rrd::". __FUNCTION__ . "() Second Parameter 'rpn' is missing"); } $line = sprintf("CDEF:%s=%s ",$vname,$rpn); return $line; } public static function vdef($vname=FALSE, $rpn=FALSE){ $line = ""; if($vname === FALSE){ throw new Kohana_exception("rrd::". __FUNCTION__ . "() First Parameter 'vname' is missing"); } if($rpn === FALSE){ throw new Kohana_exception("rrd::". __FUNCTION__ . "() Second Parameter 'rpn' is missing"); } $line = sprintf("VDEF:%s=%s ",$vname,$rpn); return $line; } public static function hrule($value=FALSE, $color=FALSE, $text=FALSE){ $line = ""; if($value === FALSE){ throw new Kohana_exception("rrd::". __FUNCTION__ ."() First Parameter 'value' is missing"); } if($color === FALSE){ throw new Kohana_exception("rrd::". __FUNCTION__ . "() Second Parameter 'color' is missing"); } $line = sprintf("HRULE:%s%s:\"%s\" ",$value,$color,$text); return $line; } public static function comment($text=FALSE){ $line = sprintf("COMMENT:\"%s\" ", $text); return $line; } public static function tick($vname=FALSE, $color=FALSE, $fraction=FALSE, $label=FALSE){ if($vname === FALSE){ throw new Kohana_exception("rrd::". __FUNCTION__ . "() First Parameter 'value' is missing"); } if($color === FALSE){ throw new Kohana_exception("rrd::". __FUNCTION__ . "() Second Parameter 'color' is missing"); } $line = sprintf("TICK:%s%s",$vname,$color); if($fraction != FALSE) $line .= ":$fraction"; if($label != FALSE) $line .= ":$label"; $line .= " "; return $line; } public static function alerter($vname=FALSE, $label=FALSE, $warning=FALSE, $critical=FALSE, $opacity = 'ff', $unit, $color_green = '#00ff00', $color_btw = '#ffff00', $color_red = '#ff0000', $line_col = '#0000ff') { if($vname === FALSE){ throw new Kohana_exception("rrd::". __FUNCTION__ . "() First Parameter 'vname' is missing"); } if($label === FALSE){ throw new Kohana_exception("rrd::". __FUNCTION__ . "() Second Parameter 'label' is missing"); } if($warning === FALSE){ throw new Kohana_exception("rrd::". __FUNCTION__ . "() Third Parameter 'warning' is missing"); } if($critical === FALSE){ throw new Kohana_exception("rrd::". __FUNCTION__ . "() Fourth Parameter 'critical' is missing"); } $line = ""; $green_vname = "var".substr(sha1(rand()),1,4); $btw_vname = "var".substr(sha1(rand()),1,4); $blue_vname = "var".substr(sha1(rand()),1,4); $red_vname = "var".substr(sha1(rand()),1,4); $line .= "CDEF:".$green_vname."=".$vname.",".$warning.",LT,".$vname.",UNKN,IF "; $line .= "CDEF:".$btw_vname."=".$vname.",".$critical.",LT,".$vname.",UNKN,IF "; $line .= "CDEF:".$blue_vname."=".$btw_vname.",".$warning.",GE,".$btw_vname.",UNKN,IF "; $line .= "CDEF:".$red_vname."=".$vname.",".$critical.",GE,".$vname.",UNKN,IF "; $line .= rrd::area($green_vname, $color_green.$opacity); $line .= rrd::area($blue_vname, $color_btw.$opacity); $line .= rrd::area($red_vname, $color_red.$opacity); $line .= rrd::line1($vname,$line_col,$label); return $line; } public static function alerter_gr($vname=FALSE,$label=FALSE,$warning=FALSE,$critical=FALSE,$opacity='ff',$unit,$color_green='#00ff00',$color_btw='#ffff00',$color_red='#ff0000',$line_col='#0000ff',$start_color="#ffffff") { if($vname === FALSE){ throw new Kohana_exception("rrd::". __FUNCTION__ . "() First Parameter 'vname' is missing"); } if($label === FALSE){ throw new Kohana_exception("rrd::". __FUNCTION__ . "() Second Parameter 'label' is missing"); } if($warning === FALSE){ throw new Kohana_exception("rrd::". __FUNCTION__ . "() Third Parameter 'warning' is missing"); } if($critical === FALSE){ throw new Kohana_exception("rrd::". __FUNCTION__ . "() Fourth Parameter 'critical' is missing"); } $line = ""; $green_vname = "var".substr(sha1(rand()),1,4); $btw_vname = "var".substr(sha1(rand()),1,4); $blue_vname = "var".substr(sha1(rand()),1,4); $red_vname = "var".substr(sha1(rand()),1,4); $line = ""; $line .= "CDEF:".$green_vname."=".$vname.",".$warning.",LT,".$vname.",UNKN,IF "; $line .= "CDEF:".$btw_vname."=".$vname.",".$critical.",LT,".$vname.",UNKN,IF "; $line .= "CDEF:".$blue_vname."=".$btw_vname.",".$warning.",GT,".$btw_vname.",UNKN,IF "; $line .= "CDEF:".$red_vname."=".$vname.",".$critical.",GT,".$vname.",UNKN,IF "; $line .= rrd::gradient($green_vname, $start_color, $color_green.$opacity); $line .= rrd::gradient($blue_vname, $start_color, $color_btw.$opacity); $line .= rrd::gradient($red_vname, $start_color, $color_red.$opacity); $line .= rrd::line1($vname,$line_col,$label); return $line; } public static function ticker($vname=FALSE, $warning=FALSE, $critical=FALSE, $fraction = -0.05, $opacity = 'ff', $color_green = '#00ff00', $color_btw = '#ffff00', $color_red = '#ff0000') { if($vname === FALSE){ throw new Kohana_exception("rrd::". __FUNCTION__ . "() First Parameter 'vname' is missing"); } if($warning === FALSE){ throw new Kohana_exception("rrd::". __FUNCTION__ . "() Second Parameter 'warning' is missing"); } if($critical === FALSE){ throw new Kohana_exception("rrd::". __FUNCTION__ . "() Third Parameter 'critical' is missing"); } $line = ""; $green_vname = "var".substr(sha1(rand()),1,4); $btw_vname = "var".substr(sha1(rand()),1,4); $blue_vname = "var".substr(sha1(rand()),1,4); $red_vname = "var".substr(sha1(rand()),1,4); $green2_vname = "var".substr(sha1(rand()),1,4); $line .= "CDEF:".$green_vname."=".$vname.",".$warning.",LT,".$vname.",UNKN,IF "; $line .= "CDEF:".$btw_vname."=".$vname.",".$critical.",LT,".$vname.",UNKN,IF "; $line .= "CDEF:".$blue_vname."=".$btw_vname.",".$warning.",GE,".$btw_vname.",UNKN,IF "; $line .= "CDEF:".$red_vname."=".$vname.",".$critical.",GE,".$vname.",UNKN,IF "; $line .= "CDEF:".$green2_vname."=".$green_vname.",0,EQ,0.000001,".$green_vname.",IF "; $line .= rrd::tick($green2_vname, $color_green.$opacity, $fraction); $line .= rrd::tick($blue_vname, $color_btw.$opacity, $fraction); $line .= rrd::tick($red_vname, $color_red.$opacity, $fraction); return $line; } public static function darkteint(){ $line = ''; $line .= '--color=BACK#000000 '; $line .= '--color=FONT#F7F7F7 '; $line .= '--color=SHADEA#ffffff '; $line .= '--color=SHADEB#ffffff '; $line .= '--color=CANVAS#000000 '; $line .= '--color=GRID#00991A '; $line .= '--color=MGRID#00991A '; $line .= '--color=ARROW#00FF00 '; return $line; } } pnp4nagios-0.6.16/share/pnp/media/0000775000000000000000000000000011662503006015343 5ustar rootrootpnp4nagios-0.6.16/share/pnp/media/css/0000775000000000000000000000000011662503006016133 5ustar rootrootpnp4nagios-0.6.16/share/pnp/media/css/ui-lightness/0000775000000000000000000000000011662503006020546 5ustar rootrootpnp4nagios-0.6.16/share/pnp/media/css/ui-lightness/jquery-ui.css0000664000000000000000000010137211662503006023216 0ustar rootroot/* * jQuery UI CSS Framework 1.8.14 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Theming/API */ /* Layout helpers ----------------------------------*/ .ui-helper-hidden { display: none; } .ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); } .ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; } .ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } .ui-helper-clearfix { display: inline-block; } /* required comment for clearfix to work in Opera \*/ * html .ui-helper-clearfix { height:1%; } .ui-helper-clearfix { display:block; } /* end clearfix */ .ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); } /* Interaction Cues ----------------------------------*/ .ui-state-disabled { cursor: default !important; } /* Icons ----------------------------------*/ /* states and images */ .ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; } /* Misc visuals ----------------------------------*/ /* Overlays */ .ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } /* * jQuery UI CSS Framework 1.8.14 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Theming/API * * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS,%20Tahoma,%20Verdana,%20Arial,%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=12_gloss_wave.png&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=03_highlight_soft.png&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=02_glass.png&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=03_highlight_soft.png&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=08_diagonals_thick.png&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=08_diagonals_thick.png&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=01_flat.png&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px */ /* Component containers ----------------------------------*/ .ui-widget { font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; font-size: 1.1em; } .ui-widget .ui-widget { font-size: 1em; } .ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; font-size: 1em; } .ui-widget-content { border: 1px solid #dddddd; background: #eeeeee url(images/ui-bg_highlight-soft_100_eeeeee_1x100.png) 50% top repeat-x; color: #333333; } .ui-widget-content a { color: #333333; } .ui-widget-header { border: 1px solid #e78f08; background: #f6a828 url(images/ui-bg_gloss-wave_35_f6a828_500x100.png) 50% 50% repeat-x; color: #ffffff; font-weight: bold; } .ui-widget-header a { color: #ffffff; } /* Interaction states ----------------------------------*/ .ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #cccccc; background: #f6f6f6 url(images/ui-bg_glass_100_f6f6f6_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #1c94c4; } .ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #1c94c4; text-decoration: none; } .ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #fbcb09; background: #fdf5ce url(images/ui-bg_glass_100_fdf5ce_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #c77405; } .ui-state-hover a, .ui-state-hover a:hover { color: #c77405; text-decoration: none; } .ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #fbd850; background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #eb8f00; } .ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #eb8f00; text-decoration: none; } .ui-widget :active { outline: none; } /* Interaction Cues ----------------------------------*/ .ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fed22f; background: #ffe45c url(images/ui-bg_highlight-soft_75_ffe45c_1x100.png) 50% top repeat-x; color: #363636; } .ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; } .ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #b81900 url(images/ui-bg_diagonals-thick_18_b81900_40x40.png) 50% 50% repeat; color: #ffffff; } .ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #ffffff; } .ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #ffffff; } .ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; } .ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; } .ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } /* Icons ----------------------------------*/ /* states and images */ .ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png); } .ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); } .ui-widget-header .ui-icon {background-image: url(images/ui-icons_ffffff_256x240.png); } .ui-state-default .ui-icon { background-image: url(images/ui-icons_ef8c08_256x240.png); } .ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_ef8c08_256x240.png); } .ui-state-active .ui-icon {background-image: url(images/ui-icons_ef8c08_256x240.png); } .ui-state-highlight .ui-icon {background-image: url(images/ui-icons_228ef1_256x240.png); } .ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_ffd27a_256x240.png); } /* positioning */ .ui-icon-carat-1-n { background-position: 0 0; } .ui-icon-carat-1-ne { background-position: -16px 0; } .ui-icon-carat-1-e { background-position: -32px 0; } .ui-icon-carat-1-se { background-position: -48px 0; } .ui-icon-carat-1-s { background-position: -64px 0; } .ui-icon-carat-1-sw { background-position: -80px 0; } .ui-icon-carat-1-w { background-position: -96px 0; } .ui-icon-carat-1-nw { background-position: -112px 0; } .ui-icon-carat-2-n-s { background-position: -128px 0; } .ui-icon-carat-2-e-w { background-position: -144px 0; } .ui-icon-triangle-1-n { background-position: 0 -16px; } .ui-icon-triangle-1-ne { background-position: -16px -16px; } .ui-icon-triangle-1-e { background-position: -32px -16px; } .ui-icon-triangle-1-se { background-position: -48px -16px; } .ui-icon-triangle-1-s { background-position: -64px -16px; } .ui-icon-triangle-1-sw { background-position: -80px -16px; } .ui-icon-triangle-1-w { background-position: -96px -16px; } .ui-icon-triangle-1-nw { background-position: -112px -16px; } .ui-icon-triangle-2-n-s { background-position: -128px -16px; } .ui-icon-triangle-2-e-w { background-position: -144px -16px; } .ui-icon-arrow-1-n { background-position: 0 -32px; } .ui-icon-arrow-1-ne { background-position: -16px -32px; } .ui-icon-arrow-1-e { background-position: -32px -32px; } .ui-icon-arrow-1-se { background-position: -48px -32px; } .ui-icon-arrow-1-s { background-position: -64px -32px; } .ui-icon-arrow-1-sw { background-position: -80px -32px; } .ui-icon-arrow-1-w { background-position: -96px -32px; } .ui-icon-arrow-1-nw { background-position: -112px -32px; } .ui-icon-arrow-2-n-s { background-position: -128px -32px; } .ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } .ui-icon-arrow-2-e-w { background-position: -160px -32px; } .ui-icon-arrow-2-se-nw { background-position: -176px -32px; } .ui-icon-arrowstop-1-n { background-position: -192px -32px; } .ui-icon-arrowstop-1-e { background-position: -208px -32px; } .ui-icon-arrowstop-1-s { background-position: -224px -32px; } .ui-icon-arrowstop-1-w { background-position: -240px -32px; } .ui-icon-arrowthick-1-n { background-position: 0 -48px; } .ui-icon-arrowthick-1-ne { background-position: -16px -48px; } .ui-icon-arrowthick-1-e { background-position: -32px -48px; } .ui-icon-arrowthick-1-se { background-position: -48px -48px; } .ui-icon-arrowthick-1-s { background-position: -64px -48px; } .ui-icon-arrowthick-1-sw { background-position: -80px -48px; } .ui-icon-arrowthick-1-w { background-position: -96px -48px; } .ui-icon-arrowthick-1-nw { background-position: -112px -48px; } .ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } .ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } .ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } .ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } .ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } .ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } .ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } .ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } .ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } .ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } .ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } .ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } .ui-icon-arrowreturn-1-w { background-position: -64px -64px; } .ui-icon-arrowreturn-1-n { background-position: -80px -64px; } .ui-icon-arrowreturn-1-e { background-position: -96px -64px; } .ui-icon-arrowreturn-1-s { background-position: -112px -64px; } .ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } .ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } .ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } .ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } .ui-icon-arrow-4 { background-position: 0 -80px; } .ui-icon-arrow-4-diag { background-position: -16px -80px; } .ui-icon-extlink { background-position: -32px -80px; } .ui-icon-newwin { background-position: -48px -80px; } .ui-icon-refresh { background-position: -64px -80px; } .ui-icon-shuffle { background-position: -80px -80px; } .ui-icon-transfer-e-w { background-position: -96px -80px; } .ui-icon-transferthick-e-w { background-position: -112px -80px; } .ui-icon-folder-collapsed { background-position: 0 -96px; } .ui-icon-folder-open { background-position: -16px -96px; } .ui-icon-document { background-position: -32px -96px; } .ui-icon-document-b { background-position: -48px -96px; } .ui-icon-note { background-position: -64px -96px; } .ui-icon-mail-closed { background-position: -80px -96px; } .ui-icon-mail-open { background-position: -96px -96px; } .ui-icon-suitcase { background-position: -112px -96px; } .ui-icon-comment { background-position: -128px -96px; } .ui-icon-person { background-position: -144px -96px; } .ui-icon-print { background-position: -160px -96px; } .ui-icon-trash { background-position: -176px -96px; } .ui-icon-locked { background-position: -192px -96px; } .ui-icon-unlocked { background-position: -208px -96px; } .ui-icon-bookmark { background-position: -224px -96px; } .ui-icon-tag { background-position: -240px -96px; } .ui-icon-home { background-position: 0 -112px; } .ui-icon-flag { background-position: -16px -112px; } .ui-icon-calendar { background-position: -32px -112px; } .ui-icon-cart { background-position: -48px -112px; } .ui-icon-pencil { background-position: -64px -112px; } .ui-icon-clock { background-position: -80px -112px; } .ui-icon-disk { background-position: -96px -112px; } .ui-icon-calculator { background-position: -112px -112px; } .ui-icon-zoomin { background-position: -128px -112px; } .ui-icon-zoomout { background-position: -144px -112px; } .ui-icon-search { background-position: -160px -112px; } .ui-icon-wrench { background-position: -176px -112px; } .ui-icon-gear { background-position: -192px -112px; } .ui-icon-heart { background-position: -208px -112px; } .ui-icon-star { background-position: -224px -112px; } .ui-icon-link { background-position: -240px -112px; } .ui-icon-cancel { background-position: 0 -128px; } .ui-icon-plus { background-position: -16px -128px; } .ui-icon-plusthick { background-position: -32px -128px; } .ui-icon-minus { background-position: -48px -128px; } .ui-icon-minusthick { background-position: -64px -128px; } .ui-icon-close { background-position: -80px -128px; } .ui-icon-closethick { background-position: -96px -128px; } .ui-icon-key { background-position: -112px -128px; } .ui-icon-lightbulb { background-position: -128px -128px; } .ui-icon-scissors { background-position: -144px -128px; } .ui-icon-clipboard { background-position: -160px -128px; } .ui-icon-copy { background-position: -176px -128px; } .ui-icon-contact { background-position: -192px -128px; } .ui-icon-image { background-position: -208px -128px; } .ui-icon-video { background-position: -224px -128px; } .ui-icon-script { background-position: -240px -128px; } .ui-icon-alert { background-position: 0 -144px; } .ui-icon-info { background-position: -16px -144px; } .ui-icon-notice { background-position: -32px -144px; } .ui-icon-help { background-position: -48px -144px; } .ui-icon-check { background-position: -64px -144px; } .ui-icon-bullet { background-position: -80px -144px; } .ui-icon-radio-off { background-position: -96px -144px; } .ui-icon-radio-on { background-position: -112px -144px; } .ui-icon-pin-w { background-position: -128px -144px; } .ui-icon-pin-s { background-position: -144px -144px; } .ui-icon-play { background-position: 0 -160px; } .ui-icon-pause { background-position: -16px -160px; } .ui-icon-seek-next { background-position: -32px -160px; } .ui-icon-seek-prev { background-position: -48px -160px; } .ui-icon-seek-end { background-position: -64px -160px; } .ui-icon-seek-start { background-position: -80px -160px; } /* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ .ui-icon-seek-first { background-position: -80px -160px; } .ui-icon-stop { background-position: -96px -160px; } .ui-icon-eject { background-position: -112px -160px; } .ui-icon-volume-off { background-position: -128px -160px; } .ui-icon-volume-on { background-position: -144px -160px; } .ui-icon-power { background-position: 0 -176px; } .ui-icon-signal-diag { background-position: -16px -176px; } .ui-icon-signal { background-position: -32px -176px; } .ui-icon-battery-0 { background-position: -48px -176px; } .ui-icon-battery-1 { background-position: -64px -176px; } .ui-icon-battery-2 { background-position: -80px -176px; } .ui-icon-battery-3 { background-position: -96px -176px; } .ui-icon-circle-plus { background-position: 0 -192px; } .ui-icon-circle-minus { background-position: -16px -192px; } .ui-icon-circle-close { background-position: -32px -192px; } .ui-icon-circle-triangle-e { background-position: -48px -192px; } .ui-icon-circle-triangle-s { background-position: -64px -192px; } .ui-icon-circle-triangle-w { background-position: -80px -192px; } .ui-icon-circle-triangle-n { background-position: -96px -192px; } .ui-icon-circle-arrow-e { background-position: -112px -192px; } .ui-icon-circle-arrow-s { background-position: -128px -192px; } .ui-icon-circle-arrow-w { background-position: -144px -192px; } .ui-icon-circle-arrow-n { background-position: -160px -192px; } .ui-icon-circle-zoomin { background-position: -176px -192px; } .ui-icon-circle-zoomout { background-position: -192px -192px; } .ui-icon-circle-check { background-position: -208px -192px; } .ui-icon-circlesmall-plus { background-position: 0 -208px; } .ui-icon-circlesmall-minus { background-position: -16px -208px; } .ui-icon-circlesmall-close { background-position: -32px -208px; } .ui-icon-squaresmall-plus { background-position: -48px -208px; } .ui-icon-squaresmall-minus { background-position: -64px -208px; } .ui-icon-squaresmall-close { background-position: -80px -208px; } .ui-icon-grip-dotted-vertical { background-position: 0 -224px; } .ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } .ui-icon-grip-solid-vertical { background-position: -32px -224px; } .ui-icon-grip-solid-horizontal { background-position: -48px -224px; } .ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } .ui-icon-grip-diagonal-se { background-position: -80px -224px; } /* Misc visuals ----------------------------------*/ /* Corner radius */ .ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; -khtml-border-top-left-radius: 4px; border-top-left-radius: 4px; } .ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; -khtml-border-top-right-radius: 4px; border-top-right-radius: 4px; } .ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; -khtml-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; } .ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; -khtml-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; } /* Overlays */ .ui-widget-overlay { background: #666666 url(images/ui-bg_diagonals-thick_20_666666_40x40.png) 50% 50% repeat; opacity: .50;filter:Alpha(Opacity=50); } .ui-widget-shadow { margin: -5px 0 0 -5px; padding: 5px; background: #000000 url(images/ui-bg_flat_10_000000_40x100.png) 50% 50% repeat-x; opacity: .20;filter:Alpha(Opacity=20); -moz-border-radius: 5px; -khtml-border-radius: 5px; -webkit-border-radius: 5px; border-radius: 5px; }/* * jQuery UI Resizable 1.8.14 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Resizable#theming */ .ui-resizable { position: relative;} .ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block; } .ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; } .ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; } .ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; } .ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; } .ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; } .ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; } .ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; } .ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; } .ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/* * jQuery UI Selectable 1.8.14 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Selectable#theming */ .ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; } /* * jQuery UI Accordion 1.8.14 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Accordion#theming */ /* IE/Win - Fix animation bug - #4615 */ .ui-accordion { width: 100%; } .ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; } .ui-accordion .ui-accordion-li-fix { display: inline; } .ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; } .ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; } .ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; } .ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; } .ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; } .ui-accordion .ui-accordion-content-active { display: block; } /* * jQuery UI Autocomplete 1.8.14 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Autocomplete#theming */ .ui-autocomplete { position: absolute; cursor: default; } /* workarounds */ * html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */ /* * jQuery UI Menu 1.8.14 * * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Menu#theming */ .ui-menu { list-style:none; padding: 2px; margin: 0; display:block; float: left; } .ui-menu .ui-menu { margin-top: -3px; } .ui-menu .ui-menu-item { margin:0; padding: 0; zoom: 1; float: left; clear: left; width: 100%; } .ui-menu .ui-menu-item a { text-decoration:none; display:block; padding:.2em .4em; line-height:1.5; zoom:1; } .ui-menu .ui-menu-item a.ui-state-hover, .ui-menu .ui-menu-item a.ui-state-active { font-weight: normal; margin: -1px; } /* * jQuery UI Button 1.8.14 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Button#theming */ .ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */ .ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */ button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */ .ui-button-icons-only { width: 3.4em; } button.ui-button-icons-only { width: 3.7em; } /*button text element */ .ui-button .ui-button-text { display: block; line-height: 1.4; } .ui-button-text-only .ui-button-text { padding: .4em 1em; } .ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; } .ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; } .ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; } .ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; } /* no icon support for input elements, provide padding by default */ input.ui-button { padding: .4em 1em; } /*button icon element(s) */ .ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; } .ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; } .ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; } .ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; } .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; } /*button sets*/ .ui-buttonset { margin-right: 7px; } .ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; } /* workarounds */ button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */ /* * jQuery UI Dialog 1.8.14 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Dialog#theming */ .ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; } .ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative; } .ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; } .ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; } .ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; } .ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; } .ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; } .ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; } .ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; } .ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; } .ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; } .ui-draggable .ui-dialog-titlebar { cursor: move; } /* * jQuery UI Slider 1.8.14 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Slider#theming */ .ui-slider { position: relative; text-align: left; } .ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; } .ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; } .ui-slider-horizontal { height: .8em; } .ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; } .ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; } .ui-slider-horizontal .ui-slider-range-min { left: 0; } .ui-slider-horizontal .ui-slider-range-max { right: 0; } .ui-slider-vertical { width: .8em; height: 100px; } .ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; } .ui-slider-vertical .ui-slider-range { left: 0; width: 100%; } .ui-slider-vertical .ui-slider-range-min { bottom: 0; } .ui-slider-vertical .ui-slider-range-max { top: 0; }/* * jQuery UI Tabs 1.8.14 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Tabs#theming */ .ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ .ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; } .ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; } .ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; } .ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; } .ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; } .ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */ .ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; } .ui-tabs .ui-tabs-hide { display: none !important; } /* * jQuery UI Datepicker 1.8.14 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Datepicker#theming */ .ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; } .ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; } .ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; } .ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; } .ui-datepicker .ui-datepicker-prev { left:2px; } .ui-datepicker .ui-datepicker-next { right:2px; } .ui-datepicker .ui-datepicker-prev-hover { left:1px; } .ui-datepicker .ui-datepicker-next-hover { right:1px; } .ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; } .ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; } .ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; } .ui-datepicker select.ui-datepicker-month-year {width: 100%;} .ui-datepicker select.ui-datepicker-month, .ui-datepicker select.ui-datepicker-year { width: 49%;} .ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; } .ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; } .ui-datepicker td { border: 0; padding: 1px; } .ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; } .ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; } .ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; } .ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; } /* with multiple calendars */ .ui-datepicker.ui-datepicker-multi { width:auto; } .ui-datepicker-multi .ui-datepicker-group { float:left; } .ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; } .ui-datepicker-multi-2 .ui-datepicker-group { width:50%; } .ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; } .ui-datepicker-multi-4 .ui-datepicker-group { width:25%; } .ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; } .ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; } .ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; } .ui-datepicker-row-break { clear:both; width:100%; font-size:0em; } /* RTL support */ .ui-datepicker-rtl { direction: rtl; } .ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; } .ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; } .ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; } .ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; } .ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; } .ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; } .ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; } .ui-datepicker-rtl .ui-datepicker-group { float:right; } .ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; } .ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; } /* IE6 IFRAME FIX (taken from datepicker 1.5.3 */ .ui-datepicker-cover { display: none; /*sorry for IE5*/ display/**/: block; /*sorry for IE5*/ position: absolute; /*must have*/ z-index: -1; /*must have*/ filter: mask(); /*must have*/ top: -4px; /*must have*/ left: -4px; /*must have*/ width: 200px; /*must have*/ height: 200px; /*must have*/ }/* * jQuery UI Progressbar 1.8.14 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Progressbar#theming */ .ui-progressbar { height:2em; text-align: left; } .ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }pnp4nagios-0.6.16/share/pnp/media/css/ui-lightness/images/0000775000000000000000000000000011662503006022013 5ustar rootrootpnp4nagios-0.6.16/share/pnp/media/css/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png0000664000000000000000000000015111662503006027363 0ustar rootrootPNG  IHDRoX 0IDAT8! + ̼JHR)[lk=O_(<` H"IENDB`pnp4nagios-0.6.16/share/pnp/media/css/ui-lightness/images/ui-bg_flat_0_aaaaaa_40x100.png0000664000000000000000000000026411662503006027134 0ustar rootrootPNG  IHDR(ddrz{IDATh1 17Y$t3;_TUAUPTUAUPTUAUPTUAUPTUAUPTUAUPTUAUPTUAUPTUAUPTUAUPTUAUPTUAUPTüŝc)IENDB`pnp4nagios-0.6.16/share/pnp/media/css/ui-lightness/images/ui-icons_888888_256x240.png0000664000000000000000000001042111662503006026136 0ustar rootrootPNG  IHDRIJPLTE{NtRNS2P."Tp@f` <BHJZ&0R,4j8D|($ blߝF>n~hhHIDATx]b۶H儒-{iZK:glkn-tIqq? E$dK>$>;PZsVh!Sy0E0}H)-t koܪKp\RϠ .E7 ) *V;~Pe Bx*,=$zDؾ JҸٻ9{ ǸHpqW@"2'B[$ @TiH/b٥96!XHq`DE*R HV!%;" i] dddddddd4y5  Rb@(8CdŪݡ,@T@ibrq0alX!pe, =4bW { 5Ƭhu~(Q^@3="b5XC@JCT76q_5 @,r šɩD)T|O@ ON-ՙ [n@RXIm݋(F @?=0puL;g$@6η K`>п @h գKVn"a" %l@.v$/U^ G:#`` uTtK~ŋZ5T%kxk]\*Q ,҇B44 OXK|yg+_M(lоEO V$T1BXb-|?@ fBXr%'@ҹA\IJ,}BBc\V rh(]tI^}oצo S3 ";ʙb}"߰ ){b$Gwwݾab")T@pF_er6JvШ"mޭM-d76x˰6ӥ;/`>KrP\_^u1%OTM.}Q3.Nس})>-w`a+sy$t)NbFFFFBejnNVn4,A*X*5>PGa 3 {oB &<L[ Nc.öi=`Q@d ͆I.Il`\t[< Cit484-r +f쑱BCB MH iy }>rxp|z;BǏ;burcK4tz1G~`ؚK| ̔>ۡO$~ Ao)0pzz }i`;ADm8n:cfA@s7L Z/..h8or? N93B~o_'`opO- :TG L;7]`B%˛>*wTpM0H}&t ^1'Oqr'2P͡+z,tIW''|en=dzgRm[NStK{҉mؓVt6ҲR`ζN&}B U(rۗ&1%Q''?l׸+&r{jN಻4) `N狌. ߭ ǣ)q 2?n3Hb`} .`pqY1e_bu7e+N_F(DT,L}LLrmP5|x芥1cx DAb`M(7NED~Mz +4BXd.Mzv͈Pd8p<6?8N*x.6ڍ6GFZ)O !lSshssNp8`'0/<s}.@Ǩs7ξO۟VDa5av]m1+3y6۠>@u50Ps51==p *KVҫ܂ݻc$N4(Xr2###c- 賟Lδ>]5.sYs1f0;'̨Yg銛{@9 `aC(=%bo2=n1 jBoS$n#m=i0ci9}oI qT]W%.(؅]z\x f"]o'u䫵tk{v;AC3ֆwwR_#X (xҋ/q%W hpk_IX'b/fXKi"#####QCLi2t 5L0 QiH2;yTOok;ע ٶ`RNg{zy!Kxm?A(vU~mL(`o/!nmX-{v[ dw=n「sdwzn(}Oy~ m ?XU;,V'+ V&JRZ]᧭:zC'-߆@y 4u `Vۓwъ#zP@Q N>2/{\o)W~a3xLw :_Q;=pּdt\'8~3SRP6y+XQ*޺r ̗ѭ*޺r gl/\U^u$|mbVnw \V|D͊NVNy7k<;/E}?E*dzgO ~g/96f cD}% g$QG7o)U Jo,O@0߾Q(;bw:5 NwRN5Iy'K?}:9mֽ*@f@jU9mҫÍ{$ؗ}dFp|%!DdF>}G{@FFFFFFƦQܞH 3 u Mo~vy}mwz<7nP9rWku=|_nz쿳}@IXn?sn~hhHIDATx]b۶H儒-{iZK:glkn-tIqq? E$dK>$>;PZsVh!Sy0E0}H)-t koܪKp\RϠ .E7 ) *V;~Pe Bx*,=$zDؾ JҸٻ9{ ǸHpqW@"2'B[$ @TiH/b٥96!XHq`DE*R HV!%;" i] dddddddd4y5  Rb@(8CdŪݡ,@T@ibrq0alX!pe, =4bW { 5Ƭhu~(Q^@3="b5XC@JCT76q_5 @,r šɩD)T|O@ ON-ՙ [n@RXIm݋(F @?=0puL;g$@6η K`>п @h գKVn"a" %l@.v$/U^ G:#`` uTtK~ŋZ5T%kxk]\*Q ,҇B44 OXK|yg+_M(lоEO V$T1BXb-|?@ fBXr%'@ҹA\IJ,}BBc\V rh(]tI^}oצo S3 ";ʙb}"߰ ){b$Gwwݾab")T@pF_er6JvШ"mޭM-d76x˰6ӥ;/`>KrP\_^u1%OTM.}Q3.Nس})>-w`a+sy$t)NbFFFFBejnNVn4,A*X*5>PGa 3 {oB &<L[ Nc.öi=`Q@d ͆I.Il`\t[< Cit484-r +f쑱BCB MH iy }>rxp|z;BǏ;burcK4tz1G~`ؚK| ̔>ۡO$~ Ao)0pzz }i`;ADm8n:cfA@s7L Z/..h8or? N93B~o_'`opO- :TG L;7]`B%˛>*wTpM0H}&t ^1'Oqr'2P͡+z,tIW''|en=dzgRm[NStK{҉mؓVt6ҲR`ζN&}B U(rۗ&1%Q''?l׸+&r{jN಻4) `N狌. ߭ ǣ)q 2?n3Hb`} .`pqY1e_bu7e+N_F(DT,L}LLrmP5|x芥1cx DAb`M(7NED~Mz +4BXd.Mzv͈Pd8p<6?8N*x.6ڍ6GFZ)O !lSshssNp8`'0/<s}.@Ǩs7ξO۟VDa5av]m1+3y6۠>@u50Ps51==p *KVҫ܂ݻc$N4(Xr2###c- 賟Lδ>]5.sYs1f0;'̨Yg銛{@9 `aC(=%bo2=n1 jBoS$n#m=i0ci9}oI qT]W%.(؅]z\x f"]o'u䫵tk{v;AC3ֆwwR_#X (xҋ/q%W hpk_IX'b/fXKi"#####QCLi2t 5L0 QiH2;yTOok;ע ٶ`RNg{zy!Kxm?A(vU~mL(`o/!nmX-{v[ dw=n「sdwzn(}Oy~ m ?XU;,V'+ V&JRZ]᧭:zC'-߆@y 4u `Vۓwъ#zP@Q N>2/{\o)W~a3xLw :_Q;=pּdt\'8~3SRP6y+XQ*޺r ̗ѭ*޺r gl/\U^u$|mbVnw \V|D͊NVNy7k<;/E}?E*dzgO ~g/96f cD}% g$QG7o)U Jo,O@0߾Q(;bw:5 NwRN5Iy'K?}:9mֽ*@f@jU9mҫÍ{$ؗ}dFp|%!DdF>}G{@FFFFFFƦQܞH 3 u Mo~vy}mwz<7nP9rWku=|_nz쿳}@IXn?sIDAT81 0Cџ $CB}1@)e_ƅ`I8-%cM0 )" LIENDB`pnp4nagios-0.6.16/share/pnp/media/css/ui-lightness/images/ui-icons_cd0a0a_256x240.png0000664000000000000000000001042111662503006026367 0ustar rootrootPNG  IHDRIJPLTE 7NtRNS2P."Tp@f` <BHJZ&0R,4j8D|($ blߝF>n~hhHIDATx]b۶H儒-{iZK:glkn-tIqq? E$dK>$>;PZsVh!Sy0E0}H)-t koܪKp\RϠ .E7 ) *V;~Pe Bx*,=$zDؾ JҸٻ9{ ǸHpqW@"2'B[$ @TiH/b٥96!XHq`DE*R HV!%;" i] dddddddd4y5  Rb@(8CdŪݡ,@T@ibrq0alX!pe, =4bW { 5Ƭhu~(Q^@3="b5XC@JCT76q_5 @,r šɩD)T|O@ ON-ՙ [n@RXIm݋(F @?=0puL;g$@6η K`>п @h գKVn"a" %l@.v$/U^ G:#`` uTtK~ŋZ5T%kxk]\*Q ,҇B44 OXK|yg+_M(lоEO V$T1BXb-|?@ fBXr%'@ҹA\IJ,}BBc\V rh(]tI^}oצo S3 ";ʙb}"߰ ){b$Gwwݾab")T@pF_er6JvШ"mޭM-d76x˰6ӥ;/`>KrP\_^u1%OTM.}Q3.Nس})>-w`a+sy$t)NbFFFFBejnNVn4,A*X*5>PGa 3 {oB &<L[ Nc.öi=`Q@d ͆I.Il`\t[< Cit484-r +f쑱BCB MH iy }>rxp|z;BǏ;burcK4tz1G~`ؚK| ̔>ۡO$~ Ao)0pzz }i`;ADm8n:cfA@s7L Z/..h8or? N93B~o_'`opO- :TG L;7]`B%˛>*wTpM0H}&t ^1'Oqr'2P͡+z,tIW''|en=dzgRm[NStK{҉mؓVt6ҲR`ζN&}B U(rۗ&1%Q''?l׸+&r{jN಻4) `N狌. ߭ ǣ)q 2?n3Hb`} .`pqY1e_bu7e+N_F(DT,L}LLrmP5|x芥1cx DAb`M(7NED~Mz +4BXd.Mzv͈Pd8p<6?8N*x.6ڍ6GFZ)O !lSshssNp8`'0/<s}.@Ǩs7ξO۟VDa5av]m1+3y6۠>@u50Ps51==p *KVҫ܂ݻc$N4(Xr2###c- 賟Lδ>]5.sYs1f0;'̨Yg銛{@9 `aC(=%bo2=n1 jBoS$n#m=i0ci9}oI qT]W%.(؅]z\x f"]o'u䫵tk{v;AC3ֆwwR_#X (xҋ/q%W hpk_IX'b/fXKi"#####QCLi2t 5L0 QiH2;yTOok;ע ٶ`RNg{zy!Kxm?A(vU~mL(`o/!nmX-{v[ dw=n「sdwzn(}Oy~ m ?XU;,V'+ V&JRZ]᧭:zC'-߆@y 4u `Vۓwъ#zP@Q N>2/{\o)W~a3xLw :_Q;=pּdt\'8~3SRP6y+XQ*޺r ̗ѭ*޺r gl/\U^u$|mbVnw \V|D͊NVNy7k<;/E}?E*dzgO ~g/96f cD}% g$QG7o)U Jo,O@0߾Q(;bw:5 NwRN5Iy'K?}:9mֽ*@f@jU9mҫÍ{$ؗ}dFp|%!DdF>}G{@FFFFFFƦQܞH 3 u Mo~vy}mwz<7nP9rWku=|_nz쿳}@IXn?sn~hhHIDATx]b۶H儒-{iZK:glkn-tIqq? E$dK>$>;PZsVh!Sy0E0}H)-t koܪKp\RϠ .E7 ) *V;~Pe Bx*,=$zDؾ JҸٻ9{ ǸHpqW@"2'B[$ @TiH/b٥96!XHq`DE*R HV!%;" i] dddddddd4y5  Rb@(8CdŪݡ,@T@ibrq0alX!pe, =4bW { 5Ƭhu~(Q^@3="b5XC@JCT76q_5 @,r šɩD)T|O@ ON-ՙ [n@RXIm݋(F @?=0puL;g$@6η K`>п @h գKVn"a" %l@.v$/U^ G:#`` uTtK~ŋZ5T%kxk]\*Q ,҇B44 OXK|yg+_M(lоEO V$T1BXb-|?@ fBXr%'@ҹA\IJ,}BBc\V rh(]tI^}oצo S3 ";ʙb}"߰ ){b$Gwwݾab")T@pF_er6JvШ"mޭM-d76x˰6ӥ;/`>KrP\_^u1%OTM.}Q3.Nس})>-w`a+sy$t)NbFFFFBejnNVn4,A*X*5>PGa 3 {oB &<L[ Nc.öi=`Q@d ͆I.Il`\t[< Cit484-r +f쑱BCB MH iy }>rxp|z;BǏ;burcK4tz1G~`ؚK| ̔>ۡO$~ Ao)0pzz }i`;ADm8n:cfA@s7L Z/..h8or? N93B~o_'`opO- :TG L;7]`B%˛>*wTpM0H}&t ^1'Oqr'2P͡+z,tIW''|en=dzgRm[NStK{҉mؓVt6ҲR`ζN&}B U(rۗ&1%Q''?l׸+&r{jN಻4) `N狌. ߭ ǣ)q 2?n3Hb`} .`pqY1e_bu7e+N_F(DT,L}LLrmP5|x芥1cx DAb`M(7NED~Mz +4BXd.Mzv͈Pd8p<6?8N*x.6ڍ6GFZ)O !lSshssNp8`'0/<s}.@Ǩs7ξO۟VDa5av]m1+3y6۠>@u50Ps51==p *KVҫ܂ݻc$N4(Xr2###c- 賟Lδ>]5.sYs1f0;'̨Yg銛{@9 `aC(=%bo2=n1 jBoS$n#m=i0ci9}oI qT]W%.(؅]z\x f"]o'u䫵tk{v;AC3ֆwwR_#X (xҋ/q%W hpk_IX'b/fXKi"#####QCLi2t 5L0 QiH2;yTOok;ע ٶ`RNg{zy!Kxm?A(vU~mL(`o/!nmX-{v[ dw=n「sdwzn(}Oy~ m ?XU;,V'+ V&JRZ]᧭:zC'-߆@y 4u `Vۓwъ#zP@Q N>2/{\o)W~a3xLw :_Q;=pּdt\'8~3SRP6y+XQ*޺r ̗ѭ*޺r gl/\U^u$|mbVnw \V|D͊NVNy7k<;/E}?E*dzgO ~g/96f cD}% g$QG7o)U Jo,O@0߾Q(;bw:5 NwRN5Iy'K?}:9mֽ*@f@jU9mҫÍ{$ؗ}dFp|%!DdF>}G{@FFFFFFƦQܞH 3 u Mo~vy}mwz<7nP9rWku=|_nz쿳}@IXn?sn~hhHIDATx]b۶H儒-{iZK:glkn-tIqq? E$dK>$>;PZsVh!Sy0E0}H)-t koܪKp\RϠ .E7 ) *V;~Pe Bx*,=$zDؾ JҸٻ9{ ǸHpqW@"2'B[$ @TiH/b٥96!XHq`DE*R HV!%;" i] dddddddd4y5  Rb@(8CdŪݡ,@T@ibrq0alX!pe, =4bW { 5Ƭhu~(Q^@3="b5XC@JCT76q_5 @,r šɩD)T|O@ ON-ՙ [n@RXIm݋(F @?=0puL;g$@6η K`>п @h գKVn"a" %l@.v$/U^ G:#`` uTtK~ŋZ5T%kxk]\*Q ,҇B44 OXK|yg+_M(lоEO V$T1BXb-|?@ fBXr%'@ҹA\IJ,}BBc\V rh(]tI^}oצo S3 ";ʙb}"߰ ){b$Gwwݾab")T@pF_er6JvШ"mޭM-d76x˰6ӥ;/`>KrP\_^u1%OTM.}Q3.Nس})>-w`a+sy$t)NbFFFFBejnNVn4,A*X*5>PGa 3 {oB &<L[ Nc.öi=`Q@d ͆I.Il`\t[< Cit484-r +f쑱BCB MH iy }>rxp|z;BǏ;burcK4tz1G~`ؚK| ̔>ۡO$~ Ao)0pzz }i`;ADm8n:cfA@s7L Z/..h8or? N93B~o_'`opO- :TG L;7]`B%˛>*wTpM0H}&t ^1'Oqr'2P͡+z,tIW''|en=dzgRm[NStK{҉mؓVt6ҲR`ζN&}B U(rۗ&1%Q''?l׸+&r{jN಻4) `N狌. ߭ ǣ)q 2?n3Hb`} .`pqY1e_bu7e+N_F(DT,L}LLrmP5|x芥1cx DAb`M(7NED~Mz +4BXd.Mzv͈Pd8p<6?8N*x.6ڍ6GFZ)O !lSshssNp8`'0/<s}.@Ǩs7ξO۟VDa5av]m1+3y6۠>@u50Ps51==p *KVҫ܂ݻc$N4(Xr2###c- 賟Lδ>]5.sYs1f0;'̨Yg銛{@9 `aC(=%bo2=n1 jBoS$n#m=i0ci9}oI qT]W%.(؅]z\x f"]o'u䫵tk{v;AC3ֆwwR_#X (xҋ/q%W hpk_IX'b/fXKi"#####QCLi2t 5L0 QiH2;yTOok;ע ٶ`RNg{zy!Kxm?A(vU~mL(`o/!nmX-{v[ dw=n「sdwzn(}Oy~ m ?XU;,V'+ V&JRZ]᧭:zC'-߆@y 4u `Vۓwъ#zP@Q N>2/{\o)W~a3xLw :_Q;=pּdt\'8~3SRP6y+XQ*޺r ̗ѭ*޺r gl/\U^u$|mbVnw \V|D͊NVNy7k<;/E}?E*dzgO ~g/96f cD}% g$QG7o)U Jo,O@0߾Q(;bw:5 NwRN5Iy'K?}:9mֽ*@f@jU9mҫÍ{$ؗ}dFp|%!DdF>}G{@FFFFFFƦQܞH 3 u Mo~vy}mwz<7nP9rWku=|_nz쿳}@IXn?s*{visibility:hidden}.ui-bar,.ui-body{position:relative;padding:.4em 15px;overflow:hidden;display:block;clear:both}.ui-bar{font-size:16px;margin:0}.ui-bar h1,.ui-bar h2,.ui-bar h3,.ui-bar h4,.ui-bar h5,.ui-bar h6{margin:0;padding:0;font-size:16px;display:inline-block}.ui-header,.ui-footer{display:block}.ui-page .ui-header,.ui-page .ui-footer{position:relative}.ui-header .ui-btn-left{position:absolute;left:10px;top:.4em}.ui-header .ui-btn-right{position:absolute;right:10px;top:.4em}.ui-header .ui-title,.ui-footer .ui-title{min-height:1.1em;text-align:center;font-size:16px;display:block;margin:.6em 90px .8em;padding:0;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;outline:0!important}.ui-content{border-width:0;overflow:visible;overflow-x:hidden;padding:15px}.ui-page-fullscreen .ui-content{padding:0}.ui-icon{width:18px;height:18px}.ui-fullscreen img{max-width:100%}.ui-nojs{position:absolute;left:-9999px}.spin{-webkit-transform:rotate(360deg);-webkit-animation-name:spin;-webkit-animation-duration:1s;-webkit-animation-iteration-count:infinite}@-webkit-keyframes spin{from{-webkit-transform:rotate(0deg)}to{-webkit-transform:rotate(360deg)}}.in,.out{-webkit-animation-timing-function:ease-in-out;-webkit-animation-duration:350ms}.slide.in{-webkit-transform:translateX(0);-webkit-animation-name:slideinfromright}.slide.out{-webkit-transform:translateX(-100%);-webkit-animation-name:slideouttoleft}.slide.in.reverse{-webkit-transform:translateX(0);-webkit-animation-name:slideinfromleft}.slide.out.reverse{-webkit-transform:translateX(100%);-webkit-animation-name:slideouttoright}.slideup.in{-webkit-transform:translateY(0);-webkit-animation-name:slideinfrombottom;z-index:10}.slideup.out{-webkit-animation-name:dontmove;z-index:0}.slideup.out.reverse{-webkit-transform:translateY(100%);z-index:10;-webkit-animation-name:slideouttobottom}.slideup.in.reverse{z-index:0;-webkit-animation-name:dontmove}.slidedown.in{-webkit-transform:translateY(0);-webkit-animation-name:slideinfromtop;z-index:10}.slidedown.out{-webkit-animation-name:dontmove;z-index:0}.slidedown.out.reverse{-webkit-transform:translateY(-100%);z-index:10;-webkit-animation-name:slideouttotop}.slidedown.in.reverse{z-index:0;-webkit-animation-name:dontmove}@-webkit-keyframes slideinfromright{from{-webkit-transform:translateX(100%)}to{-webkit-transform:translateX(0)}}@-webkit-keyframes slideinfromleft{from{-webkit-transform:translateX(-100%)}to{-webkit-transform:translateX(0)}}@-webkit-keyframes slideouttoleft{from{-webkit-transform:translateX(0)}to{-webkit-transform:translateX(-100%)}}@-webkit-keyframes slideouttoright{from{-webkit-transform:translateX(0)}to{-webkit-transform:translateX(100%)}}@-webkit-keyframes slideinfromtop{from{-webkit-transform:translateY(-100%)}to{-webkit-transform:translateY(0)}}@-webkit-keyframes slideinfrombottom{from{-webkit-transform:translateY(100%)}to{-webkit-transform:translateY(0)}}@-webkit-keyframes slideouttobottom{from{-webkit-transform:translateY(0)}to{-webkit-transform:translateY(100%)}}@-webkit-keyframes slideouttotop{from{-webkit-transform:translateY(0)}to{-webkit-transform:translateY(-100%)}}@-webkit-keyframes fadein{from{opacity:0}to{opacity:1}}@-webkit-keyframes fadeout{from{opacity:1}to{opacity:0}}.fade.in{opacity:1;z-index:10;-webkit-animation-name:fadein}.fade.out{z-index:0;-webkit-animation-name:fadeout}.viewport-flip{-webkit-perspective:1000;position:absolute}.ui-mobile-viewport-transitioning,.ui-mobile-viewport-transitioning .ui-page{width:100%;height:100%;overflow:hidden}.flip{-webkit-animation-duration:.65s;-webkit-backface-visibility:hidden;-webkit-transform:translateX(0)}.flip.in{-webkit-transform:rotateY(0) scale(1);-webkit-animation-name:flipinfromleft}.flip.out{-webkit-transform:rotateY(-180deg) scale(.8);-webkit-animation-name:flipouttoleft}.flip.in.reverse{-webkit-transform:rotateY(0) scale(1);-webkit-animation-name:flipinfromright}.flip.out.reverse{-webkit-transform:rotateY(180deg) scale(.8);-webkit-animation-name:flipouttoright}@-webkit-keyframes flipinfromright{from{-webkit-transform:rotateY(-180deg) scale(.8)}to{-webkit-transform:rotateY(0) scale(1)}}@-webkit-keyframes flipinfromleft{from{-webkit-transform:rotateY(180deg) scale(.8)}to{-webkit-transform:rotateY(0) scale(1)}}@-webkit-keyframes flipouttoleft{from{-webkit-transform:rotateY(0) scale(1)}to{-webkit-transform:rotateY(-180deg) scale(.8)}}@-webkit-keyframes flipouttoright{from{-webkit-transform:rotateY(0) scale(1)}to{-webkit-transform:rotateY(180deg) scale(.8)}}@-webkit-keyframes dontmove{from{opacity:1}to{opacity:1}}.pop{-webkit-transform-origin:50% 50%}.pop.in{-webkit-transform:scale(1);opacity:1;-webkit-animation-name:popin;z-index:10}.pop.out.reverse{-webkit-transform:scale(.2);opacity:0;-webkit-animation-name:popout;z-index:10}.pop.in.reverse{z-index:0;-webkit-animation-name:dontmove}@-webkit-keyframes popin{from{-webkit-transform:scale(.2);opacity:0}to{-webkit-transform:scale(1);opacity:1}}@-webkit-keyframes popout{from{-webkit-transform:scale(1);opacity:1}to{-webkit-transform:scale(.2);opacity:0}}.ui-grid-a,.ui-grid-b,.ui-grid-c,.ui-grid-d{overflow:hidden}.ui-block-a,.ui-block-b,.ui-block-c,.ui-block-d,.ui-block-e{margin:0;padding:0;border:0;float:left;min-height:1px}.ui-grid-solo .ui-block-a{width:100%;float:none}.ui-grid-a .ui-block-a,.ui-grid-a .ui-block-b{width:50%}.ui-grid-a .ui-block-a{clear:left}.ui-grid-b .ui-block-a,.ui-grid-b .ui-block-b,.ui-grid-b .ui-block-c{width:33.333%}.ui-grid-b .ui-block-a{clear:left}.ui-grid-c .ui-block-a,.ui-grid-c .ui-block-b,.ui-grid-c .ui-block-c,.ui-grid-c .ui-block-d{width:25%}.ui-grid-c .ui-block-a{clear:left}.ui-grid-d .ui-block-a,.ui-grid-d .ui-block-b,.ui-grid-d .ui-block-c,.ui-grid-d .ui-block-d,.ui-grid-d .ui-block-e{width:20%}.ui-grid-d .ui-block-a{clear:left}.ui-header,.ui-footer,.ui-page-fullscreen .ui-header,.ui-page-fullscreen .ui-footer{position:absolute;overflow:hidden;width:100%;border-left-width:0;border-right-width:0}.ui-header-fixed,.ui-footer-fixed{z-index:1000;-webkit-transform:translateZ(0)}.ui-footer-duplicate,.ui-page-fullscreen .ui-fixed-inline{display:none}.ui-page-fullscreen .ui-header,.ui-page-fullscreen .ui-footer{opacity:.9}.ui-navbar{overflow:hidden}.ui-navbar ul,.ui-navbar-expanded ul{list-style:none;padding:0;margin:0;position:relative;display:block;border:0}.ui-navbar-collapsed ul{float:left;width:75%;margin-right:-2px}.ui-navbar-collapsed .ui-navbar-toggle{float:left;width:25%}.ui-navbar li.ui-navbar-truncate{position:absolute;left:-9999px;top:-9999px}.ui-navbar li .ui-btn,.ui-navbar .ui-navbar-toggle .ui-btn{display:block;font-size:12px;text-align:center;margin:0;border-right-width:0}.ui-navbar li .ui-btn{margin-right:-1px}.ui-navbar li .ui-btn:last-child{margin-right:0}.ui-header .ui-navbar li .ui-btn,.ui-header .ui-navbar .ui-navbar-toggle .ui-btn,.ui-footer .ui-navbar li .ui-btn,.ui-footer .ui-navbar .ui-navbar-toggle .ui-btn{border-top-width:0;border-bottom-width:0}.ui-navbar .ui-btn-inner{padding-left:2px;padding-right:2px}.ui-navbar-noicons li .ui-btn .ui-btn-inner,.ui-navbar-noicons .ui-navbar-toggle .ui-btn-inner{padding-top:.8em;padding-bottom:.9em}.ui-navbar-expanded .ui-btn{margin:0;font-size:14px}.ui-navbar-expanded .ui-btn-inner{padding-left:5px;padding-right:5px}.ui-navbar-expanded .ui-btn-icon-top .ui-btn-inner{padding:45px 5px 15px;text-align:center}.ui-navbar-expanded .ui-btn-icon-top .ui-icon{top:15px}.ui-navbar-expanded .ui-btn-icon-bottom .ui-btn-inner{padding:15px 5px 45px;text-align:center}.ui-navbar-expanded .ui-btn-icon-bottom .ui-icon{bottom:15px}.ui-navbar-expanded li .ui-btn .ui-btn-inner{min-height:2.5em}.ui-navbar-expanded .ui-navbar-noicons .ui-btn .ui-btn-inner{padding-top:1.8em;padding-bottom:1.9em}.ui-btn{display:block;text-align:center;cursor:pointer;position:relative;margin:.5em 5px;padding:0}.ui-btn:focus,.ui-btn:active{outline:0}.ui-header .ui-btn,.ui-footer .ui-btn,.ui-bar .ui-btn{display:inline-block;font-size:13px;margin:0}.ui-btn-inline{display:inline-block}.ui-btn-inner{padding:.6em 25px;display:block;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;position:relative}.ui-header .ui-btn-inner,.ui-footer .ui-btn-inner,.ui-bar .ui-btn-inner{padding:.4em 8px .5em}.ui-btn-icon-notext{display:inline-block;width:20px;height:20px;padding:2px 1px 2px 3px;text-indent:-9999px}.ui-btn-icon-notext .ui-btn-inner{padding:0}.ui-btn-icon-notext .ui-btn-text{position:absolute;left:-999px}.ui-btn-icon-left .ui-btn-inner{padding-left:33px}.ui-header .ui-btn-icon-left .ui-btn-inner,.ui-footer .ui-btn-icon-left .ui-btn-inner,.ui-bar .ui-btn-icon-left .ui-btn-inner{padding-left:27px}.ui-btn-icon-right .ui-btn-inner{padding-right:33px}.ui-header .ui-btn-icon-right .ui-btn-inner,.ui-footer .ui-btn-icon-right .ui-btn-inner,.ui-bar .ui-btn-icon-right .ui-btn-inner{padding-right:27px}.ui-btn-icon-top .ui-btn-inner{padding-top:33px}.ui-header .ui-btn-icon-top .ui-btn-inner,.ui-footer .ui-btn-icon-top .ui-btn-inner,.ui-bar .ui-btn-icon-top .ui-btn-inner{padding-top:27px}.ui-btn-icon-bottom .ui-btn-inner{padding-bottom:33px}.ui-header .ui-btn-icon-bottom .ui-btn-inner,.ui-footer .ui-btn-icon-bottom .ui-btn-inner,.ui-bar .ui-btn-icon-bottom .ui-btn-inner{padding-bottom:27px}.ui-btn-icon-notext .ui-icon{display:block}.ui-btn-icon-left .ui-icon,.ui-btn-icon-right .ui-icon{position:absolute;top:50%;margin-top:-9px}.ui-btn-icon-top .ui-icon,.ui-btn-icon-bottom .ui-icon{position:absolute;left:50%;margin-left:-9px}.ui-btn-icon-left .ui-icon{left:10px}.ui-btn-icon-right .ui-icon{right:10px}.ui-header .ui-btn-icon-left .ui-icon,.ui-footer .ui-btn-icon-left .ui-icon,.ui-bar .ui-btn-icon-left .ui-icon{left:4px}.ui-header .ui-btn-icon-right .ui-icon,.ui-footer .ui-btn-icon-right .ui-icon,.ui-bar .ui-btn-icon-right .ui-icon{right:4px}.ui-header .ui-btn-icon-top .ui-icon,.ui-footer .ui-btn-icon-top .ui-icon,.ui-bar .ui-btn-icon-top .ui-icon{top:4px}.ui-header .ui-btn-icon-bottom .ui-icon,.ui-footer .ui-btn-icon-bottom .ui-icon,.ui-bar .ui-btn-icon-bottom .ui-icon{bottom:4px}.ui-btn-icon-top .ui-icon{top:5px}.ui-btn-icon-bottom .ui-icon{bottom:5px}.ui-btn-hidden{position:absolute;top:0;left:0;width:100%;height:100%;-webkit-appearance:button;opacity:0;cursor:pointer;-ms-filter:"alpha(opacity=0)";filter:alpha(opacity=0);background:transparent}.ui-collapsible-contain{margin:.5em 0}.ui-collapsible-heading{font-size:16px;display:block;margin:0 -8px;padding:0;border-width:0 0 1px 0;position:relative}.ui-collapsible-heading a{text-align:left;margin:0}.ui-collapsible-heading a .ui-btn-inner{padding-left:40px}.ui-collapsible-heading a span.ui-btn{position:absolute;left:6px;top:50%;margin:-12px 0 0 0;width:20px;height:20px;padding:1px 0 1px 2px;text-indent:-9999px}.ui-collapsible-heading a span.ui-btn .ui-btn-inner{padding:10px 0}.ui-collapsible-heading a span.ui-btn .ui-icon{left:0;margin-top:-10px}.ui-collapsible-heading-status{position:absolute;left:-9999px}.ui-collapsible-content{display:block;padding:10px 0 10px 8px}.ui-collapsible-content-collapsed{display:none}.ui-collapsible-set{margin:.5em 0}.ui-collapsible-set .ui-collapsible-contain{margin:-1px 0 0}.ui-controlgroup,fieldset.ui-controlgroup{padding:0;margin:.5em 0 1em}.ui-bar .ui-controlgroup{margin:0 .3em}.ui-controlgroup-label{font-size:16px;line-height:1.4;font-weight:normal;margin:0 0 .3em}.ui-controlgroup-controls{display:block;width:95%}.ui-controlgroup li{list-style:none}.ui-controlgroup-vertical .ui-btn,.ui-controlgroup-vertical .ui-checkbox,.ui-controlgroup-vertical .ui-radio{margin:0;border-bottom-width:0}.ui-controlgroup-vertical .ui-controlgroup-last{border-bottom-width:1px}.ui-controlgroup-horizontal{padding:0}.ui-controlgroup-horizontal .ui-btn,.ui-controlgroup-horizontal .ui-checkbox,.ui-controlgroup-horizontal .ui-radio{display:inline-block;margin:0 -5px 0 0}.ui-controlgroup-horizontal .ui-checkbox,.ui-controlgroup-horizontal .ui-radio{display:inline}.ui-controlgroup-horizontal .ui-checkbox .ui-btn,.ui-controlgroup-horizontal .ui-radio .ui-btn,.ui-controlgroup-horizontal .ui-checkbox:last-child,.ui-controlgroup-horizontal .ui-radio:last-child{margin-right:0}.ui-controlgroup-horizontal .ui-controlgroup-last{margin-right:0}.ui-controlgroup .ui-checkbox label,.ui-controlgroup .ui-radio label{font-size:16px}@media all and (min-width:450px){.ui-controlgroup-label{vertical-align:top;display:inline-block;width:20%;margin:0 2% 0 0}.ui-controlgroup-controls{width:60%;display:inline-block}}.ui-dialog{min-height:480px}.ui-dialog .ui-header,.ui-dialog .ui-content,.ui-dialog .ui-footer{margin:15px;position:relative}.ui-dialog .ui-header,.ui-dialog .ui-footer{z-index:10;width:auto}.ui-dialog .ui-content,.ui-dialog .ui-footer{margin-top:-15px}.ui-checkbox,.ui-radio{position:relative;margin:.2em 0 .5em;z-index:1}.ui-checkbox .ui-btn,.ui-radio .ui-btn{margin:0;text-align:left;z-index:2}.ui-checkbox .ui-btn-inner,.ui-radio .ui-btn-inner{white-space:normal}.ui-checkbox .ui-btn-icon-left .ui-btn-inner,.ui-radio .ui-btn-icon-left .ui-btn-inner{padding-left:45px}.ui-checkbox .ui-btn-icon-right .ui-btn-inner,.ui-radio .ui-btn-icon-right .ui-btn-inner{padding-right:45px}.ui-checkbox .ui-icon,.ui-radio .ui-icon{top:1.1em}.ui-checkbox .ui-btn-icon-left .ui-icon,.ui-radio .ui-btn-icon-left .ui-icon{left:15px}.ui-checkbox .ui-btn-icon-right .ui-icon,.ui-radio .ui-btn-icon-right .ui-icon{right:15px}.ui-checkbox input,.ui-radio input{position:absolute;left:20px;top:50%;width:10px;height:10px;margin:-5px 0 0 0;outline:0!important;z-index:1}.ui-field-contain{background:0;padding:1.5em 0;margin:0;border-bottom-width:1px;overflow:visible}.ui-field-contain:first-child{border-top-width:0}@media all and (min-width:450px){.ui-field-contain{border-width:0;padding:0;margin:1em 0}}.ui-select{display:block;position:relative}.ui-select select{position:absolute;left:-9999px;top:-9999px}.ui-select .ui-btn{overflow:hidden}.ui-select .ui-btn select{cursor:pointer;-webkit-appearance:button;left:0;top:0;width:100%;height:100%;opacity:0;-ms-filter:"alpha(opacity=0)";filter:alpha(opacity=0)}@-moz-document url-prefix(){.ui-select .ui-btn select{opacity:.0001}}.ui-select .ui-btn select.ui-select-nativeonly{opacity:1;text-indent:0}.ui-select .ui-btn-icon-right .ui-btn-inner{padding-right:45px}.ui-select .ui-btn-icon-right .ui-icon{right:15px}label.ui-select{font-size:16px;line-height:1.4;font-weight:normal;margin:0 0 .3em;display:block}.ui-select .ui-btn-text,.ui-selectmenu .ui-btn-text{display:inline-block;min-height:1em}.ui-select .ui-btn-text{text-overflow:ellipsis;overflow:hidden;display:block}.ui-selectmenu{position:absolute;padding:0;z-index:100!important;width:80%;max-width:350px;padding:6px}.ui-selectmenu .ui-listview{margin:0}.ui-selectmenu .ui-btn.ui-li-divider{cursor:default}.ui-selectmenu-hidden{top:-9999px;left:-9999px}.ui-selectmenu-screen{position:absolute;top:0;left:0;width:100%;height:100%;z-index:99}.ui-screen-hidden,.ui-selectmenu-list .ui-li .ui-icon{display:none}.ui-selectmenu-list .ui-li .ui-icon{display:block}.ui-li.ui-selectmenu-placeholder{display:none}.ui-selectmenu .ui-header .ui-title{margin:.6em 46px .8em}@media all and (min-width:450px){label.ui-select{display:inline-block;width:20%;margin:0 2% 0 0}.ui-select{width:60%;display:inline-block}}.ui-selectmenu .ui-header h1:after{content:'.';visibility:hidden}label.ui-input-text{font-size:16px;line-height:1.4;display:block;font-weight:normal;margin:0 0 .3em}input.ui-input-text,textarea.ui-input-text{background-image:none;padding:.4em;line-height:1.4;font-size:16px;display:block;width:95%}input.ui-input-text{-webkit-appearance:none}textarea.ui-input-text{height:50px;-webkit-transition:height 200ms linear;-moz-transition:height 200ms linear;-o-transition:height 200ms linear;transition:height 200ms linear}.ui-input-search{padding:0 30px;width:77%;background-position:8px 50%;background-repeat:no-repeat;position:relative}.ui-input-search input.ui-input-text{border:0;width:98%;padding:.4em 0;margin:0;display:block;background:transparent none;outline:0!important}.ui-input-search .ui-input-clear{position:absolute;right:0;top:50%;margin-top:-14px}.ui-input-search .ui-input-clear-hidden{display:none}@media all and (min-width:450px){label.ui-input-text{vertical-align:top;display:inline-block;width:20%;margin:0 2% 0 0}input.ui-input-text,textarea.ui-input-text,.ui-input-search{width:60%;display:inline-block}.ui-input-search{width:50%}.ui-input-search input.ui-input-text{width:98%}}.ui-listview{margin:0;counter-reset:listnumbering}.ui-content .ui-listview{margin:-15px}.ui-content .ui-listview-inset{margin:1em 0}.ui-listview,.ui-li{list-style:none;padding:0}.ui-li,.ui-li.ui-field-contain{display:block;margin:0;position:relative;overflow:visible;text-align:left;border-width:0;border-top-width:1px}.ui-li .ui-btn-text a.ui-link-inherit{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.ui-li-divider,.ui-li-static{padding:.5em 15px;font-size:14px;font-weight:bold}.ui-li-divider{counter-reset:listnumbering}ol.ui-listview .ui-link-inherit:before,ol.ui-listview .ui-li-static:before,.ui-li-dec{font-size:.8em;display:inline-block;padding-right:.3em;font-weight:normal;counter-increment:listnumbering;content:counter(listnumbering) ". "}ol.ui-listview .ui-li-jsnumbering:before{content:""!important}.ui-listview-inset .ui-li{border-right-width:1px;border-left-width:1px}.ui-li:last-child,.ui-li.ui-field-contain:last-child{border-bottom-width:1px}.ui-li>.ui-btn-inner{display:block;position:relative;padding:0}.ui-li .ui-btn-inner a.ui-link-inherit,.ui-li-static.ui-li{padding:.7em 75px .7em 15px;display:block}.ui-li-has-thumb .ui-btn-inner a.ui-link-inherit,.ui-li-static.ui-li-has-thumb{min-height:60px;padding-left:100px}.ui-li-has-icon .ui-btn-inner a.ui-link-inherit,.ui-li-static.ui-li-has-icon{min-height:20px;padding-left:40px}.ui-li-heading{font-size:16px;font-weight:bold;display:block;margin:.6em 0;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.ui-li-desc{font-size:12px;font-weight:normal;display:block;margin:-.5em 0 .6em;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.ui-li-thumb,.ui-li-icon{position:absolute;left:1px;top:0;max-height:80px;max-width:80px}.ui-li-icon{max-height:40px;max-width:40px;left:10px;top:.9em}.ui-li-thumb,.ui-li-icon,.ui-li-content{float:left;margin-right:10px}.ui-li-aside{float:right;width:50%;text-align:right;margin:.3em 0}@media all and (min-width:480px){.ui-li-aside{width:45%}}.ui-li-divider{cursor:default}.ui-li-has-alt .ui-btn-inner a.ui-link-inherit,.ui-li-static.ui-li-has-alt{padding-right:95px}.ui-li-count{position:absolute;font-size:11px;font-weight:bold;padding:.2em .5em;top:50%;margin-top:-.9em;right:38px}.ui-li-divider .ui-li-count,.ui-li-static .ui-li-count{right:10px}.ui-li-has-alt .ui-li-count{right:55px}.ui-li-link-alt{position:absolute;width:40px;height:100%;border-width:0;border-left-width:1px;top:0;right:0;margin:0;padding:0}.ui-li-link-alt .ui-btn{overflow:hidden;position:absolute;right:8px;top:50%;margin:-11px 0 0 0;border-bottom-width:1px}.ui-li-link-alt .ui-btn-inner{padding:0;position:static}.ui-li-link-alt .ui-btn .ui-icon{right:50%;margin-right:-9px}.ui-listview-filter{border-width:0;overflow:hidden;margin:-15px -15px 15px -15px}.ui-listview-filter .ui-input-search{margin:5px;width:auto;display:block}.ui-listview-filter-inset{margin:-15px -5px -15px -5px;background:transparent}.ui-li.ui-screen-hidden{display:none}@media only screen and (min-device-width:768px) and (max-device-width:1024px){.ui-li .ui-btn-text{overflow:visible}}label.ui-slider{display:block}input.ui-slider-input{display:inline-block;width:50px}select.ui-slider-switch{display:none}div.ui-slider{position:relative;display:inline-block;overflow:visible;height:15px;padding:0;margin:0 2% 0 20px;top:4px;width:66%}a.ui-slider-handle{position:absolute;z-index:10;top:50%;width:28px;height:28px;margin-top:-15px;margin-left:-15px}a.ui-slider-handle .ui-btn-inner{padding-left:0;padding-right:0}@media all and (min-width:480px){label.ui-slider{display:inline-block;width:20%;margin:0 2% 0 0}div.ui-slider{width:45%}}div.ui-slider-switch{height:32px;overflow:hidden;margin-left:0}div.ui-slider-inneroffset{margin-left:50%;position:absolute;top:1px;height:100%;width:50%}div.ui-slider-handle-snapping{-webkit-transition:left 100ms linear}div.ui-slider-labelbg{position:absolute;top:0;margin:0;border-width:0}div.ui-slider-switch div.ui-slider-labelbg-a{width:60%;height:100%;left:0}div.ui-slider-switch div.ui-slider-labelbg-b{width:60%;height:100%;right:0}.ui-slider-switch-a div.ui-slider-labelbg-a,.ui-slider-switch-b div.ui-slider-labelbg-b{z-index:-1}.ui-slider-switch-a div.ui-slider-labelbg-b,.ui-slider-switch-b div.ui-slider-labelbg-a{z-index:0}div.ui-slider-switch a.ui-slider-handle{z-index:20;width:101%;height:32px;margin-top:-18px;margin-left:-101%}span.ui-slider-label{width:100%;position:absolute;height:32px;font-size:16px;text-align:center;line-height:2;background:0;border-color:transparent}span.ui-slider-label-a{left:-100%;margin-right:-1px}span.ui-slider-label-b{right:-100%;margin-left:-1px}pnp4nagios-0.6.16/share/pnp/media/css/ui-multisite/0000775000000000000000000000000011662503006020565 5ustar rootrootpnp4nagios-0.6.16/share/pnp/media/css/ui-multisite/jquery-ui.css0000664000000000000000000010133411662503006023233 0ustar rootroot/* * jQuery UI CSS Framework 1.8.16 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Theming/API */ body { background-attachment:fixed; background-image:url("images/contentframe_background.jpg"); background-repeat:repeat; } /* Layout helpers ----------------------------------*/ .ui-helper-hidden { display: none; } .ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); } .ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; } .ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } .ui-helper-clearfix { display: inline-block; } /* required comment for clearfix to work in Opera \*/ * html .ui-helper-clearfix { height:1%; } .ui-helper-clearfix { display:block; } /* end clearfix */ .ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); } /* Interaction Cues ----------------------------------*/ .ui-state-disabled { cursor: default !important; } /* Icons ----------------------------------*/ /* states and images */ .ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; } /* Misc visuals ----------------------------------*/ /* Overlays */ .ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } /* * jQuery UI CSS Framework 1.8.16 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Theming/API * * To view and modify this theme, visit http://jqueryui.com/themeroller/?ctl=themeroller&ffDefault=Verdana,Arial,sans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=8eaEB8&bgTextureHeader=03_highlight_soft.png&bgImgOpacityHeader=75&borderColorHeader=86a3a3&fcHeader=fff&iconColorHeader=222222&bgColorContent=709aa5&bgTextureContent=01_flat.png&bgImgOpacityContent=75&borderColorContent=86a3a3&fcContent=fff&iconColorContent=222222&bgColorDefault=709aa5&bgTextureDefault=02_glass.png&bgImgOpacityDefault=75&borderColorDefault=86a3a3&fcDefault=fff&iconColorDefault=888888&bgColorHover=709aa5&bgTextureHover=02_glass.png&bgImgOpacityHover=75&borderColorHover=86a3a3&fcHover=fff&iconColorHover=454545&bgColorActive=709aa5&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=86a3a3&fcActive=fff&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=02_glass.png&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=05_inset_soft.png&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=01_flat.png&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px */ /* Component containers ----------------------------------*/ .ui-widget { font-family: Verdana,Arial,sans-serif; font-size: 1.1em; } .ui-widget .ui-widget { font-size: 1em; } .ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif; font-size: 1em; } .ui-widget-content { border: 1px solid #86a3a3; background: #709aa5 url(images/ui-bg_flat_75_709aa5_40x100.png) 50% 50% repeat-x; color: #fff; } .ui-widget-content a { color: #fff; } .ui-widget-header { border: 1px solid #86a3a3; background: #8eaeb8 url(images/ui-bg_highlight-soft_75_8eaeb8_1x100.png) 50% 50% repeat-x; color: #fff; font-weight: bold; } .ui-widget-header a { color: #fff; } /* Interaction states ----------------------------------*/ .ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #86a3a3; background: #709aa5 url(images/ui-bg_glass_75_709aa5_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #fff; } .ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #fff; text-decoration: none; } .ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #86a3a3; background: #709aa5 url(images/ui-bg_glass_75_709aa5_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #fff; } .ui-state-hover a, .ui-state-hover a:hover { color: #fff; text-decoration: none; } .ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #86a3a3; background: #709aa5 url(images/ui-bg_glass_65_709aa5_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #fff; } .ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #fff; text-decoration: none; } .ui-widget :active { outline: none; } /* Interaction Cues ----------------------------------*/ .ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fcefa1; background: #fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x; color: #363636; } .ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; } .ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec url(images/ui-bg_inset-soft_95_fef1ec_1x100.png) 50% bottom repeat-x; color: #cd0a0a; } .ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a; } .ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a; } .ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; } .ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; } .ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } /* Icons ----------------------------------*/ /* states and images */ .ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png); } .ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); } .ui-widget-header .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); } .ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png); } .ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); } .ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); } .ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png); } .ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png); } /* positioning */ .ui-icon-carat-1-n { background-position: 0 0; } .ui-icon-carat-1-ne { background-position: -16px 0; } .ui-icon-carat-1-e { background-position: -32px 0; } .ui-icon-carat-1-se { background-position: -48px 0; } .ui-icon-carat-1-s { background-position: -64px 0; } .ui-icon-carat-1-sw { background-position: -80px 0; } .ui-icon-carat-1-w { background-position: -96px 0; } .ui-icon-carat-1-nw { background-position: -112px 0; } .ui-icon-carat-2-n-s { background-position: -128px 0; } .ui-icon-carat-2-e-w { background-position: -144px 0; } .ui-icon-triangle-1-n { background-position: 0 -16px; } .ui-icon-triangle-1-ne { background-position: -16px -16px; } .ui-icon-triangle-1-e { background-position: -32px -16px; } .ui-icon-triangle-1-se { background-position: -48px -16px; } .ui-icon-triangle-1-s { background-position: -64px -16px; } .ui-icon-triangle-1-sw { background-position: -80px -16px; } .ui-icon-triangle-1-w { background-position: -96px -16px; } .ui-icon-triangle-1-nw { background-position: -112px -16px; } .ui-icon-triangle-2-n-s { background-position: -128px -16px; } .ui-icon-triangle-2-e-w { background-position: -144px -16px; } .ui-icon-arrow-1-n { background-position: 0 -32px; } .ui-icon-arrow-1-ne { background-position: -16px -32px; } .ui-icon-arrow-1-e { background-position: -32px -32px; } .ui-icon-arrow-1-se { background-position: -48px -32px; } .ui-icon-arrow-1-s { background-position: -64px -32px; } .ui-icon-arrow-1-sw { background-position: -80px -32px; } .ui-icon-arrow-1-w { background-position: -96px -32px; } .ui-icon-arrow-1-nw { background-position: -112px -32px; } .ui-icon-arrow-2-n-s { background-position: -128px -32px; } .ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } .ui-icon-arrow-2-e-w { background-position: -160px -32px; } .ui-icon-arrow-2-se-nw { background-position: -176px -32px; } .ui-icon-arrowstop-1-n { background-position: -192px -32px; } .ui-icon-arrowstop-1-e { background-position: -208px -32px; } .ui-icon-arrowstop-1-s { background-position: -224px -32px; } .ui-icon-arrowstop-1-w { background-position: -240px -32px; } .ui-icon-arrowthick-1-n { background-position: 0 -48px; } .ui-icon-arrowthick-1-ne { background-position: -16px -48px; } .ui-icon-arrowthick-1-e { background-position: -32px -48px; } .ui-icon-arrowthick-1-se { background-position: -48px -48px; } .ui-icon-arrowthick-1-s { background-position: -64px -48px; } .ui-icon-arrowthick-1-sw { background-position: -80px -48px; } .ui-icon-arrowthick-1-w { background-position: -96px -48px; } .ui-icon-arrowthick-1-nw { background-position: -112px -48px; } .ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } .ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } .ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } .ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } .ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } .ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } .ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } .ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } .ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } .ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } .ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } .ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } .ui-icon-arrowreturn-1-w { background-position: -64px -64px; } .ui-icon-arrowreturn-1-n { background-position: -80px -64px; } .ui-icon-arrowreturn-1-e { background-position: -96px -64px; } .ui-icon-arrowreturn-1-s { background-position: -112px -64px; } .ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } .ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } .ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } .ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } .ui-icon-arrow-4 { background-position: 0 -80px; } .ui-icon-arrow-4-diag { background-position: -16px -80px; } .ui-icon-extlink { background-position: -32px -80px; } .ui-icon-newwin { background-position: -48px -80px; } .ui-icon-refresh { background-position: -64px -80px; } .ui-icon-shuffle { background-position: -80px -80px; } .ui-icon-transfer-e-w { background-position: -96px -80px; } .ui-icon-transferthick-e-w { background-position: -112px -80px; } .ui-icon-folder-collapsed { background-position: 0 -96px; } .ui-icon-folder-open { background-position: -16px -96px; } .ui-icon-document { background-position: -32px -96px; } .ui-icon-document-b { background-position: -48px -96px; } .ui-icon-note { background-position: -64px -96px; } .ui-icon-mail-closed { background-position: -80px -96px; } .ui-icon-mail-open { background-position: -96px -96px; } .ui-icon-suitcase { background-position: -112px -96px; } .ui-icon-comment { background-position: -128px -96px; } .ui-icon-person { background-position: -144px -96px; } .ui-icon-print { background-position: -160px -96px; } .ui-icon-trash { background-position: -176px -96px; } .ui-icon-locked { background-position: -192px -96px; } .ui-icon-unlocked { background-position: -208px -96px; } .ui-icon-bookmark { background-position: -224px -96px; } .ui-icon-tag { background-position: -240px -96px; } .ui-icon-home { background-position: 0 -112px; } .ui-icon-flag { background-position: -16px -112px; } .ui-icon-calendar { background-position: -32px -112px; } .ui-icon-cart { background-position: -48px -112px; } .ui-icon-pencil { background-position: -64px -112px; } .ui-icon-clock { background-position: -80px -112px; } .ui-icon-disk { background-position: -96px -112px; } .ui-icon-calculator { background-position: -112px -112px; } .ui-icon-zoomin { background-position: -128px -112px; } .ui-icon-zoomout { background-position: -144px -112px; } .ui-icon-search { background-position: -160px -112px; } .ui-icon-wrench { background-position: -176px -112px; } .ui-icon-gear { background-position: -192px -112px; } .ui-icon-heart { background-position: -208px -112px; } .ui-icon-star { background-position: -224px -112px; } .ui-icon-link { background-position: -240px -112px; } .ui-icon-cancel { background-position: 0 -128px; } .ui-icon-plus { background-position: -16px -128px; } .ui-icon-plusthick { background-position: -32px -128px; } .ui-icon-minus { background-position: -48px -128px; } .ui-icon-minusthick { background-position: -64px -128px; } .ui-icon-close { background-position: -80px -128px; } .ui-icon-closethick { background-position: -96px -128px; } .ui-icon-key { background-position: -112px -128px; } .ui-icon-lightbulb { background-position: -128px -128px; } .ui-icon-scissors { background-position: -144px -128px; } .ui-icon-clipboard { background-position: -160px -128px; } .ui-icon-copy { background-position: -176px -128px; } .ui-icon-contact { background-position: -192px -128px; } .ui-icon-image { background-position: -208px -128px; } .ui-icon-video { background-position: -224px -128px; } .ui-icon-script { background-position: -240px -128px; } .ui-icon-alert { background-position: 0 -144px; } .ui-icon-info { background-position: -16px -144px; } .ui-icon-notice { background-position: -32px -144px; } .ui-icon-help { background-position: -48px -144px; } .ui-icon-check { background-position: -64px -144px; } .ui-icon-bullet { background-position: -80px -144px; } .ui-icon-radio-off { background-position: -96px -144px; } .ui-icon-radio-on { background-position: -112px -144px; } .ui-icon-pin-w { background-position: -128px -144px; } .ui-icon-pin-s { background-position: -144px -144px; } .ui-icon-play { background-position: 0 -160px; } .ui-icon-pause { background-position: -16px -160px; } .ui-icon-seek-next { background-position: -32px -160px; } .ui-icon-seek-prev { background-position: -48px -160px; } .ui-icon-seek-end { background-position: -64px -160px; } .ui-icon-seek-start { background-position: -80px -160px; } /* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ .ui-icon-seek-first { background-position: -80px -160px; } .ui-icon-stop { background-position: -96px -160px; } .ui-icon-eject { background-position: -112px -160px; } .ui-icon-volume-off { background-position: -128px -160px; } .ui-icon-volume-on { background-position: -144px -160px; } .ui-icon-power { background-position: 0 -176px; } .ui-icon-signal-diag { background-position: -16px -176px; } .ui-icon-signal { background-position: -32px -176px; } .ui-icon-battery-0 { background-position: -48px -176px; } .ui-icon-battery-1 { background-position: -64px -176px; } .ui-icon-battery-2 { background-position: -80px -176px; } .ui-icon-battery-3 { background-position: -96px -176px; } .ui-icon-circle-plus { background-position: 0 -192px; } .ui-icon-circle-minus { background-position: -16px -192px; } .ui-icon-circle-close { background-position: -32px -192px; } .ui-icon-circle-triangle-e { background-position: -48px -192px; } .ui-icon-circle-triangle-s { background-position: -64px -192px; } .ui-icon-circle-triangle-w { background-position: -80px -192px; } .ui-icon-circle-triangle-n { background-position: -96px -192px; } .ui-icon-circle-arrow-e { background-position: -112px -192px; } .ui-icon-circle-arrow-s { background-position: -128px -192px; } .ui-icon-circle-arrow-w { background-position: -144px -192px; } .ui-icon-circle-arrow-n { background-position: -160px -192px; } .ui-icon-circle-zoomin { background-position: -176px -192px; } .ui-icon-circle-zoomout { background-position: -192px -192px; } .ui-icon-circle-check { background-position: -208px -192px; } .ui-icon-circlesmall-plus { background-position: 0 -208px; } .ui-icon-circlesmall-minus { background-position: -16px -208px; } .ui-icon-circlesmall-close { background-position: -32px -208px; } .ui-icon-squaresmall-plus { background-position: -48px -208px; } .ui-icon-squaresmall-minus { background-position: -64px -208px; } .ui-icon-squaresmall-close { background-position: -80px -208px; } .ui-icon-grip-dotted-vertical { background-position: 0 -224px; } .ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } .ui-icon-grip-solid-vertical { background-position: -32px -224px; } .ui-icon-grip-solid-horizontal { background-position: -48px -224px; } .ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } .ui-icon-grip-diagonal-se { background-position: -80px -224px; } /* Misc visuals ----------------------------------*/ /* Corner radius */ .ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; -khtml-border-top-left-radius: 4px; border-top-left-radius: 4px; } .ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; -khtml-border-top-right-radius: 4px; border-top-right-radius: 4px; } .ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; -khtml-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; } .ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; -khtml-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; } /* Overlays */ .ui-widget-overlay { background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); } .ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -khtml-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; }/* * jQuery UI Resizable 1.8.16 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Resizable#theming */ .ui-resizable { position: relative;} .ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block; } .ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; } .ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; } .ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; } .ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; } .ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; } .ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; } .ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; } .ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; } .ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/* * jQuery UI Selectable 1.8.16 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Selectable#theming */ .ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; } /* * jQuery UI Accordion 1.8.16 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Accordion#theming */ /* IE/Win - Fix animation bug - #4615 */ .ui-accordion { width: 100%; } .ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; } .ui-accordion .ui-accordion-li-fix { display: inline; } .ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; } .ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; } .ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; } .ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; } .ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; } .ui-accordion .ui-accordion-content-active { display: block; } /* * jQuery UI Autocomplete 1.8.16 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Autocomplete#theming */ .ui-autocomplete { position: absolute; cursor: default; } /* workarounds */ * html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */ /* * jQuery UI Menu 1.8.16 * * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Menu#theming */ .ui-menu { list-style:none; padding: 2px; margin: 0; display:block; float: left; } .ui-menu .ui-menu { margin-top: -3px; } .ui-menu .ui-menu-item { margin:0; padding: 0; zoom: 1; float: left; clear: left; width: 100%; } .ui-menu .ui-menu-item a { text-decoration:none; display:block; padding:.2em .4em; line-height:1.5; zoom:1; } .ui-menu .ui-menu-item a.ui-state-hover, .ui-menu .ui-menu-item a.ui-state-active { font-weight: normal; margin: -1px; } /* * jQuery UI Button 1.8.16 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Button#theming */ .ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */ .ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */ button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */ .ui-button-icons-only { width: 3.4em; } button.ui-button-icons-only { width: 3.7em; } /*button text element */ .ui-button .ui-button-text { display: block; line-height: 1.4; } .ui-button-text-only .ui-button-text { padding: .4em 1em; } .ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; } .ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; } .ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; } .ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; } /* no icon support for input elements, provide padding by default */ input.ui-button { padding: .4em 1em; } /*button icon element(s) */ .ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; } .ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; } .ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; } .ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; } .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; } /*button sets*/ .ui-buttonset { margin-right: 7px; } .ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; } /* workarounds */ button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */ /* * jQuery UI Dialog 1.8.16 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Dialog#theming */ .ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; } .ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative; } .ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; } .ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; } .ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; } .ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; } .ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; } .ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; } .ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; } .ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; } .ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; } .ui-draggable .ui-dialog-titlebar { cursor: move; } /* * jQuery UI Slider 1.8.16 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Slider#theming */ .ui-slider { position: relative; text-align: left; } .ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; } .ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; } .ui-slider-horizontal { height: .8em; } .ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; } .ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; } .ui-slider-horizontal .ui-slider-range-min { left: 0; } .ui-slider-horizontal .ui-slider-range-max { right: 0; } .ui-slider-vertical { width: .8em; height: 100px; } .ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; } .ui-slider-vertical .ui-slider-range { left: 0; width: 100%; } .ui-slider-vertical .ui-slider-range-min { bottom: 0; } .ui-slider-vertical .ui-slider-range-max { top: 0; }/* * jQuery UI Tabs 1.8.16 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Tabs#theming */ .ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ .ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; } .ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; } .ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; } .ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; } .ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; } .ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */ .ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; } .ui-tabs .ui-tabs-hide { display: none !important; } /* * jQuery UI Datepicker 1.8.16 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Datepicker#theming */ .ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; } .ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; } .ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; } .ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; } .ui-datepicker .ui-datepicker-prev { left:2px; } .ui-datepicker .ui-datepicker-next { right:2px; } .ui-datepicker .ui-datepicker-prev-hover { left:1px; } .ui-datepicker .ui-datepicker-next-hover { right:1px; } .ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; } .ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; } .ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; } .ui-datepicker select.ui-datepicker-month-year {width: 100%;} .ui-datepicker select.ui-datepicker-month, .ui-datepicker select.ui-datepicker-year { width: 49%;} .ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; } .ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; } .ui-datepicker td { border: 0; padding: 1px; } .ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; } .ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; } .ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; } .ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; } /* with multiple calendars */ .ui-datepicker.ui-datepicker-multi { width:auto; } .ui-datepicker-multi .ui-datepicker-group { float:left; } .ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; } .ui-datepicker-multi-2 .ui-datepicker-group { width:50%; } .ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; } .ui-datepicker-multi-4 .ui-datepicker-group { width:25%; } .ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; } .ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; } .ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; } .ui-datepicker-row-break { clear:both; width:100%; font-size:0em; } /* RTL support */ .ui-datepicker-rtl { direction: rtl; } .ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; } .ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; } .ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; } .ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; } .ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; } .ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; } .ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; } .ui-datepicker-rtl .ui-datepicker-group { float:right; } .ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; } .ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; } /* IE6 IFRAME FIX (taken from datepicker 1.5.3 */ .ui-datepicker-cover { display: none; /*sorry for IE5*/ display/**/: block; /*sorry for IE5*/ position: absolute; /*must have*/ z-index: -1; /*must have*/ filter: mask(); /*must have*/ top: -4px; /*must have*/ left: -4px; /*must have*/ width: 200px; /*must have*/ height: 200px; /*must have*/ }/* * jQuery UI Progressbar 1.8.16 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Progressbar#theming */ .ui-progressbar { height:2em; text-align: left; } .ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; } pnp4nagios-0.6.16/share/pnp/media/css/ui-multisite/images/0000775000000000000000000000000011662503006022032 5ustar rootrootpnp4nagios-0.6.16/share/pnp/media/css/ui-multisite/images/ui-bg_glass_65_709aa5_1x400.png0000664000000000000000000000020111662503006027061 0ustar rootrootPNG  IHDRoX HIDAT8ϱ @C+7MFIA)So'RlUZ\Ž/ !q N:"IENDB`pnp4nagios-0.6.16/share/pnp/media/css/ui-multisite/images/ui-bg_inset-soft_95_fef1ec_1x100.png0000664000000000000000000000017311662503006030276 0ustar rootrootPNG  IHDRdG,Z`BIDAT;BRm`'K֥FbZ&ѺvЙ|3x [IENDB`pnp4nagios-0.6.16/share/pnp/media/css/ui-multisite/images/ui-bg_flat_0_aaaaaa_40x100.png0000664000000000000000000000026411662503006027153 0ustar rootrootPNG  IHDR(ddrz{IDATh1 17Y$t3;_TUAUPTUAUPTUAUPTUAUPTUAUPTUAUPTUAUPTUAUPTUAUPTUAUPTUAUPTUAUPTüŝc)IENDB`pnp4nagios-0.6.16/share/pnp/media/css/ui-multisite/images/ui-icons_888888_256x240.png0000664000000000000000000001042111662503006026155 0ustar rootrootPNG  IHDRIJPLTEƁONtRNS2P."Tp@f` <BHJZ&0R,4j8D|($ blߝF>n~hhHIDATx]b۶H儒-{iZK:glkn-tIqq? E$dK>$>;PZsVh!Sy0E0}H)-t koܪKp\RϠ .E7 ) *V;~Pe Bx*,=$zDؾ JҸٻ9{ ǸHpqW@"2'B[$ @TiH/b٥96!XHq`DE*R HV!%;" i] dddddddd4y5  Rb@(8CdŪݡ,@T@ibrq0alX!pe, =4bW { 5Ƭhu~(Q^@3="b5XC@JCT76q_5 @,r šɩD)T|O@ ON-ՙ [n@RXIm݋(F @?=0puL;g$@6η K`>п @h գKVn"a" %l@.v$/U^ G:#`` uTtK~ŋZ5T%kxk]\*Q ,҇B44 OXK|yg+_M(lоEO V$T1BXb-|?@ fBXr%'@ҹA\IJ,}BBc\V rh(]tI^}oצo S3 ";ʙb}"߰ ){b$Gwwݾab")T@pF_er6JvШ"mޭM-d76x˰6ӥ;/`>KrP\_^u1%OTM.}Q3.Nس})>-w`a+sy$t)NbFFFFBejnNVn4,A*X*5>PGa 3 {oB &<L[ Nc.öi=`Q@d ͆I.Il`\t[< Cit484-r +f쑱BCB MH iy }>rxp|z;BǏ;burcK4tz1G~`ؚK| ̔>ۡO$~ Ao)0pzz }i`;ADm8n:cfA@s7L Z/..h8or? N93B~o_'`opO- :TG L;7]`B%˛>*wTpM0H}&t ^1'Oqr'2P͡+z,tIW''|en=dzgRm[NStK{҉mؓVt6ҲR`ζN&}B U(rۗ&1%Q''?l׸+&r{jN಻4) `N狌. ߭ ǣ)q 2?n3Hb`} .`pqY1e_bu7e+N_F(DT,L}LLrmP5|x芥1cx DAb`M(7NED~Mz +4BXd.Mzv͈Pd8p<6?8N*x.6ڍ6GFZ)O !lSshssNp8`'0/<s}.@Ǩs7ξO۟VDa5av]m1+3y6۠>@u50Ps51==p *KVҫ܂ݻc$N4(Xr2###c- 賟Lδ>]5.sYs1f0;'̨Yg銛{@9 `aC(=%bo2=n1 jBoS$n#m=i0ci9}oI qT]W%.(؅]z\x f"]o'u䫵tk{v;AC3ֆwwR_#X (xҋ/q%W hpk_IX'b/fXKi"#####QCLi2t 5L0 QiH2;yTOok;ע ٶ`RNg{zy!Kxm?A(vU~mL(`o/!nmX-{v[ dw=n「sdwzn(}Oy~ m ?XU;,V'+ V&JRZ]᧭:zC'-߆@y 4u `Vۓwъ#zP@Q N>2/{\o)W~a3xLw :_Q;=pּdt\'8~3SRP6y+XQ*޺r ̗ѭ*޺r gl/\U^u$|mbVnw \V|D͊NVNy7k<;/E}?E*dzgO ~g/96f cD}% g$QG7o)U Jo,O@0߾Q(;bw:5 NwRN5Iy'K?}:9mֽ*@f@jU9mҫÍ{$ؗ}dFp|%!DdF>}G{@FFFFFFƦQܞH 3 u Mo~vy}mwz<7nP9rWku=|_nz쿳}@IXn?sn~hhHIDATx]b۶H儒-{iZK:glkn-tIqq? E$dK>$>;PZsVh!Sy0E0}H)-t koܪKp\RϠ .E7 ) *V;~Pe Bx*,=$zDؾ JҸٻ9{ ǸHpqW@"2'B[$ @TiH/b٥96!XHq`DE*R HV!%;" i] dddddddd4y5  Rb@(8CdŪݡ,@T@ibrq0alX!pe, =4bW { 5Ƭhu~(Q^@3="b5XC@JCT76q_5 @,r šɩD)T|O@ ON-ՙ [n@RXIm݋(F @?=0puL;g$@6η K`>п @h գKVn"a" %l@.v$/U^ G:#`` uTtK~ŋZ5T%kxk]\*Q ,҇B44 OXK|yg+_M(lоEO V$T1BXb-|?@ fBXr%'@ҹA\IJ,}BBc\V rh(]tI^}oצo S3 ";ʙb}"߰ ){b$Gwwݾab")T@pF_er6JvШ"mޭM-d76x˰6ӥ;/`>KrP\_^u1%OTM.}Q3.Nس})>-w`a+sy$t)NbFFFFBejnNVn4,A*X*5>PGa 3 {oB &<L[ Nc.öi=`Q@d ͆I.Il`\t[< Cit484-r +f쑱BCB MH iy }>rxp|z;BǏ;burcK4tz1G~`ؚK| ̔>ۡO$~ Ao)0pzz }i`;ADm8n:cfA@s7L Z/..h8or? N93B~o_'`opO- :TG L;7]`B%˛>*wTpM0H}&t ^1'Oqr'2P͡+z,tIW''|en=dzgRm[NStK{҉mؓVt6ҲR`ζN&}B U(rۗ&1%Q''?l׸+&r{jN಻4) `N狌. ߭ ǣ)q 2?n3Hb`} .`pqY1e_bu7e+N_F(DT,L}LLrmP5|x芥1cx DAb`M(7NED~Mz +4BXd.Mzv͈Pd8p<6?8N*x.6ڍ6GFZ)O !lSshssNp8`'0/<s}.@Ǩs7ξO۟VDa5av]m1+3y6۠>@u50Ps51==p *KVҫ܂ݻc$N4(Xr2###c- 賟Lδ>]5.sYs1f0;'̨Yg銛{@9 `aC(=%bo2=n1 jBoS$n#m=i0ci9}oI qT]W%.(؅]z\x f"]o'u䫵tk{v;AC3ֆwwR_#X (xҋ/q%W hpk_IX'b/fXKi"#####QCLi2t 5L0 QiH2;yTOok;ע ٶ`RNg{zy!Kxm?A(vU~mL(`o/!nmX-{v[ dw=n「sdwzn(}Oy~ m ?XU;,V'+ V&JRZ]᧭:zC'-߆@y 4u `Vۓwъ#zP@Q N>2/{\o)W~a3xLw :_Q;=pּdt\'8~3SRP6y+XQ*޺r ̗ѭ*޺r gl/\U^u$|mbVnw \V|D͊NVNy7k<;/E}?E*dzgO ~g/96f cD}% g$QG7o)U Jo,O@0߾Q(;bw:5 NwRN5Iy'K?}:9mֽ*@f@jU9mҫÍ{$ؗ}dFp|%!DdF>}G{@FFFFFFƦQܞH 3 u Mo~vy}mwz<7nP9rWku=|_nz쿳}@IXn?s2t+iF+xsUko&4ߛJR=2W#H[a|1_z^j>eT O! ~v+?0"GjPٵ?_t/OxXf3j?ݲJH[}_I7w6G޺:GI1kFHHyNzK|ЉPiCKV|ԑ/ru#^^=K Jt[O-7/Ͻt_잤'FF!EW<_+MX_:'MZ~Ycobߵ_>|ʿ Y!&*~H>_}u#Ҥ})2.m`b+Z^ ??_~7ԡ'֓L-اOY}J26\t=omG'dgQDʈ=<vyhh#^O/~/8EO]-zá2ߵt_}e_]dZ5xsUlS~}X_:Y{_}EC*b?v_~?oH,=ze$O!f_RexìWGZj[Ү+47zx厽OYV=!HJzHMW/{KORWDDEt:,FǷ/Zaj/uW;2}_}&W\1Z0OOe:/SOd|TR}1؀Tj-|?[F'2RfyK;O/z^H/HgXJڟT^U??EO_7R}LsL^z΋š|wW~yYc7c)P'ߙ2~-jKSɶ0F{_ofP%>]RW^97}16/q_:[$O9Դ ꕥ t1y%ٵ?_ިxy=%I~oQcsXC9ڟt/zx"}ɷjO~/z̭dmqR("8eO}}{笨DNEOYԑ?Rߵ5_?>GaUI8*u>N? M߿ǧuDG*|t #cM:KխDtj쬑ʳ}Oߟu?pڵ <~T,pT+?07We%|ː.m>L?%W=^K8h~zozU?׿O13+i?r sv+!/G{Ŷ牨{#G_?:?=JZ-+iEO|`zt_xatɢ/){?yORQuhО_+jn,c?S>}+W?.-jU_SS9lR_u"=3+˪J߽PDcpIl?~M߸=%/rfz_/}/[g ZfOj|0sUe?}ިKzx-*981ڟlT_?Ѝ/GDjzfo5;#}ozĪ(HI)?)T{.*/5]Q"'AR~=$R3?.?_uO\*H:(T=(dk_5qx/c)+/*O:$[?yV~miQ{:ˏ ھ XP.u9rD9mv\z?\]T))khs.<;k}pD0G)?v?se=h}32=z_ۊ_}_9=u"ED}QU~>9?O/l_.Јˢi>|Tڏ13 :i_/jJۋ-,c?q}_}k3tIXr>y|U976ئVzW iu[x>rn bc"l7o{V?TW넍_IQG.m}-?_~g`ut6 t1y%a4 eֿVb]}jݲ_ϳ-^/@(S& ߿;"=W:XYL*Oȏ?ǷY^}>ѡ!8?⤫jXfo)S߱˯;F_ Uxl?QiQ{JЯo]UqCy #>.W?q?. ʨV'&M)Q{$W:ߺIbtn ޼ǯqGc\eO93EE*ol\?XݿV%O!>>ڞ/G_Gr^]/jb2ɏoj㴾׿3E !⣐ŷc3}O>}EgzPd'3~{>}*W 7#kQGW #)(&,O}}$WX;/tTMKf&_G/~׿e$tWK~mL?EO5kE\^:|3x?ɱtIOˬMʉjC:%G=nRHN4bޫN?gc=ayd *k{ߞU?:__TORyKݼmv8t_Jl]5j/~+~ѢJ嫓_/7Qm)>|Se_.+~_/XؿcOtH^$O!}+?0iWCLXh~}t?넌[W?Pcq>;S=EOS&ߧ ֟w>K޺W6/EWG̔>{*}蘭? E -jHforu?_/}Ge2Ct:$fO57/{I? Z#GkCy #mIMߺU)J|ڞ+,wN}MoڋߺUzj{B_?p87tO^~J_rd$\obݳ{+II?3V_ǿtXZ<^ )QI.9v_~WzQ l!wCw#{X#SI WP_99ڟT^NΔU+.[KߵOڋ޺UOXUu2iS/Kq%]+,_~62ϬiN+RMo<:L_ZfߺU|erV"7cMI)[ڀo7,k_<_\>>ޞ/+GWG}T1y$ٷ?}k,ZtMOܢ!n7jmIQ[u~1L-=Ow6KߺU|e}q}zR~'Qg "*zܧBfo]*Q{JJ#_//KMoڋߺ;1DG * Qd%_!tSjҢ_:$չYcmo)PJQ[h2y(/p4Ջ(|Z)d>io{{:U$DyuC^_٩9EckTJMS?y l7z/Bָw'#oo<u{Jtѫ\VD~Xɫu1?mzo{׭OYe7?s`?{Mݗ޺K_R",?5v6v+?cMHMAC";QߺK|莇?v=7Y̏t_g=J i_#%ܖ|=37*.$QҺ*J>L ʿ^Һu:/RF̓ĕ_SU$C/)^׾]eCmzry_x 7+&*8+$dG0)=v_ug;I\4r tO}|I_>(ϯ#*>Q6A5__~e=Jxu厑#SQEK(LO_~-z^ t-KM[>үԔh^)Rjp{3?9ړjzWϩJ&O?un9̊Ej=**$KW|TU}\MүԨj|K9?͌Sv$WoY_Dt?c/y _=K=X5WDŽOygӟ~)N~*J݋o.fo1{IWԔR< /TKUu5RF-g?M޸q`Y=geҚ>%hEn߿I?L֤+$w#}Mo|Y|Ϭ;KWC/ o 4?Կ_~'fUdg>J_mا/c_`u I:h^/Aic/(O9ڟl?J̊b1Q5,ZOZiG7sTzKB)|JQ_ٌ;S޼Uu!./7Kܟ>)S޺z[D)_tTU+MmMoQ{9/@J|@I#?rl7/z_Τ)\YUoƪ#9z\~γ/%rHc5S}٦_:˫^v$jOy"6)ݲoJR*xA,1RNm~6v]%W ![<=<_hMOs!*s}n 5}~E3x&9G߾}*OPfIi'Ȱ/,G/~I}>!EK\<}?{rffOSb.ORc]z4$*ώX󟿃^/&9 |Y"M9%?u1W⢩j?M[/BmMp_ϯcME%d??0Џ7RY}g?Վ+%@;kK\GS+Raz-$xXm&i;Sߎzz̪6*Yϒ M'M(_'=fo?GjQK9;y;SIG_? 4Zxx#?9Jj/nc_d^R0qWsb;37jz?ctWORG*%کK'>M߾_}o_o)>xi?x*cϞqM^?:?:?u|J|~X!1Vc8b޸}{cڵ7}$R?ɱt}~CUO'??7_oI~|Yu[[#QK62?Nz/uCeCѦ:/ mi~}_:UO󞲆h/r,,r?)?_yu}3*' SĿ%w.fo_/~W%=sUв,Jک?|}.+eӥ~O",/l7M_?_f_kOV奋P}ئv__??.5j_!^aAyږ/~CZtj^JC(Ńm?TY}/^Wg]m,TRWGO2s?}׏ҿOz䱴^TOIO0z{4Wu/Pt*?HS[3suC]o_g"!O t/c2u^Ǥ1U_DI_tT5M˘ɉ5uzʞ@JOO޺ˮz<_SfO?~tkU/_m[GCf޺ψpv.%ZOyb6t}露kC/NT- _4x_`I'hժ)v){^!=ZDT_e/9 r>?ڌ:=_kyyr,,R?;SߺUgS"?:*J܎˘?Wqt? : *Z4u5r񟿃t:Y?.T_!'OK&n J:ߺ?*j$?-$_1^/Ү?|jgQQjjO]暖/Q2kKQ<}X6A5__~W'`uzX^/z?r,$r˲<qvOrG:'iS~cʟBjv 9#73?}{_gڢdO?wO~q,RrO/~:G_X,IW|45y^6:4yjҢOlSI\냶M-/ԑ-?6.7g__|gy"!+KJy6/Xgf*FzKIMA9ڒ?v_z/X|~Q}VxmSKo3x&9,Jָ=abadc)?N>;Sޫ_*'~}G#b8kv+s3x'?uo?~ΒU $Q%XUQ{zf{ydH2opt\:S*)ZloSo&lG/^Zz? ژzIQ4j<^+T}q  7g_`uzX^??v<,r˲<u.zhCǯ Si3 ;߾_Oz}:?)"R+pI>;PE*zړţWN*R'1}N+/} +bj.Ug.fo%1{WkW|*%3rE/,S}W4 Ő<ooDGWqcL|^V\"Hc_O#17M?g._FU%GSW$dSﳇ:KOQFE$h~?EoٿS{ε?uMrKjjܬ1b߾_^Z_+TUBpx?>ښ/tu6 -6A5_o~W_J_Qicz(#c]py9ړv_v:GPg6ЉG?a)f#i׎?5BXR*pI9ڏT^OzF^ՙTI_9:~^\E}0>]cKJ?Q{JQSGj$3Tee^yx>L$W?gX>} <{Tq&c?^+VOu٪z8O|UUIe<ԑ^lޛMIV任Ȟpk?ү:##SQKE?swM%+uGH4O rV{Ju(i&/<;QzG+A7G.jo_/~']z jʢJڨ?|}2޺UbDI?hnY#ɿ S_ޒ_֭\?}ئ#e_.&R2PEo57_{H"zOa?Y_֖*G~xXci!9ʏl׺Qѽ$zOZyO7;'zE?h_SOٌuFP_"gr59JT^O^V1ohWf_t_4y*Oү> /-ե\vsxrE/ټT>׺K]hZ&ੌM_/WUWɡeKP`qҾV+8=U ^)2. \1A?ݳ{I?Ri_A?OUehj_ݓpK)QߺUuNs?O^RU4teV^e3Nt_gRY1e,pj_5}Iz7ފO7qegJǵ$vFܧI+w=M錄WϬэ!X򤥪Q)S޺UZu?F?} R?{[Eǯu"$mP]~ourmI~(W=H_ *ҪOJZu9Y"iɰTJο |pxoٛ/4ߺKcJ|m )r4;Om|w޿J:ʬ!# "c!y62߻7uԋ4G҆o t_:άo1 V6r˛q?,G_~_⺐,{E-(ҏsTߺKyfADhn(Y6Rg$LEdM.?([W'˦>**Dr%_)m'R#>] Z媗ȳ?f͓?oObޱq^Oԏ] _ #|zKOYcULI}tTUKJo<muE]{#hdZ ,Q36O }M_^YWU7Ho$v"*z/:ʾ-B9j(bQ,ˇ`u&ݦ'2K΃TTt_BM>_JهA9jO}~>ϟYU&qޖ?DXZi?jzpgʪaH4iIUybE-NoO/~J| RkzK.`*H=%W'dE- ]Nv<ܿ͟R(_OYWŢJU-T*qf=T5gGuhK뒷dqxG7˯?uZ2GVrx _ۗ7%7?el7߾.?\,q c2O1S{^}gY24OO?`6Uo{J"ejW&ߊ^?e*/zKO>.vŏzHݢKƟw=Oq/.OzʣK""}GiOU`"%vߵ}+W?>Ƭ4.N͟_UP5Wo_잲,?qM "Jo<mt?}$'5ZԭȳIu9bwςM)}__oLlPGƁ=*o~ui}rPC%E B:d ]7_zW'|Yo,q7Z_Bg?egV\F??I.Y jݲOUfCkԱ]v M'Sg|>_g DO}RUXNoSuE]+>o\Q= j^Rs?qdZQ*?GQ{zK\$E$J>ijTe_5MQM???i˫k~Pq^97L|&l0?:̺:ߺM(x߀S`߾ΕqWט+e!! b6Gc)ݲ[W ~{}8 Y}X*kmoqV&9?όoϭ*/szX2ai`Sz~/zcК"(ZSxd%KG/zֿ>Ueѡ4}_?o)'^ҾgzU"D/tT5I?9^}_t:+R@,S/vKzGߗ]?Wx(x?p4;_?YοìO՝Jj(aT$ZݲՓ־g_!9["K1fq&{\?\[T]ɕ*/߃7߾ν,~@մ1xK?ݲO>]tG4#߀}uGfo$ivLrpp|IJ?ٽϥ>C׬-XeAN~s{ߟH)TM iZ~#_9;y*Po^W̌O?}Odx~ܿ?ʏ/zW=FeI!X$5V #4.dgq ֭lDHu9dmOW_߼={(?k,_ү}uOZ2I/KQCY#]5v_v?ՁFic,oUMǖ_z^Wt'-'~99QK;QU|b)}EgDs}׉HKBEN)b_92u?#Wz4:&O-tM])?H}dMAW_%__/A_잱ݏŢZҒ_NVHY,*T\G՞~Σ1zI[8Rgb?fo~'Wc^mhYRܙko<o9'qc.6Y=] &)2Eo'|m9/^af? GOuކs=+:[Nd>)-,ԑzG';qjXvQaisT_t 2(o1UidG'2s~I3|ZV>g:Jh8q\o۔(%W'̫.V/QWK!,c/)[˥8=Gd%lY"bMmOo~W\ꗏ$\}7?_z޵vw_jU3I0?Mޱҿ:[Fib oGTt zMടn#v>ϟQds=c O'OS8'=Ge $*qNv*9_sQ{^WF|o]o7J0_ZR_uܿOԷ5_잣M %\vR2F844_/uծJ߽'GM$XfS`:IHL_tZ|rd$ .߻/tXdfoP~ʸ}`uFѩQEQI\r˛{R7_:ڢoTI,%4cW3 H?H*vLrc%vt_Q1ѡt[<>׿}!bT-᢮G-|'7S1zZryi"T~m)}=*èя ֺm?GN)⣒%7NIzuR=x)ۓ=E޺UOXmvM+]NC_/AϨæJҒ_NQdqOuE)c{(CQB9wg1*k{^Vz&2EW2hhf1Itx>lcݾ:I|JC}WAL˃Sfu~b)Ufd}#O4*|RM`6OdOT=XVZSO(,#U2ũ=n_~^$GʰikVR(29ViҲ~A)PR \L[vJRdy?i2=T *i~o]%ާIb19(_E'_oeH >@x:u`,ӧ:nH'ߺT+r`:<ЊP__>Z/򖆳D톍|zOx:vҞ(jV:Ae f3ςV&W'1cTj ⒲E9Zra)Ӟ{Jh.f$*DxGԗKOzHhR*- GN6JvppmƑ'_ ʙQTE ,6 D HGʅϿt_u# AC%2l>߉gjeBo3c-?ɦa3wh'#NJK]d]1ľvy[Eni.IW_R3*c/5~/5ŭ]+W_Ϭe݆IwuTzfS {^W=HUhaS4,tw ҭo&?Y@-HFx`C[|87:[=*:*%QBE?'(67n_>}__oIE'HBiUqWgW|y$?fj"dd`p%jl\~P}I:̠}V3[E_'OmH>_:H{斟7-I*n|rE>Ng|:?eF!hVsN]/}'=J SZB! • rNK/9Pck{JuVF"W#Eo&gu "mTd**4h̢Eb/3L8?U:L "I>iןl~ޣ+OugTgW!z=H>&ʟLvN3Ƒ'>]f^Gi$MSET0%X%# e?zW_g:D25 K)8Dԟ 'ߏ/!Ԓ4ji7[.OG;ROI[}}gϬ-D> * HDX$C{tߏW:U|9 B2}أo7F־c17Gux"iUl}=x)W ‡*QVHU=HTi6VO},pB1[p=[_잲" Tj;믪??-_~_ԕ:4Uq\xm?ݟE+ݔhUTǙiҏ jm9I? :K|ɡô/GG?A)oܪ|uge 0Gsj_omH'޼WOTQ#JSӏƪ3u ܑ~Oo/j 1Zf֫%%A"sT>wNy/c#Tl~ğva;cb񜼢zT%{?ҿ+z"JV)Lo*eGOz΅hDj4fu r>c)Pj5AӞzu~Ul)AO>iE Io+Ԉo5H);gpp4?>zKuH`dc,ʒ}I9 OW˯i_AobM=}yICjy=/?oI|I\a@JMGeBux+?$zWS*݋zRRp"Q*53ܧ@z_잳" *LXI3H]#Mʩ}{_잲g%z١WU}TmOoہ'U_:̇!{ZV:.z@F@lfܦ$uZWҿcʃRHjkS2%J[gV۰Y? ?>޿Ϗ|ddgO/}IU*˃foܪ~otZWu1bsANrHo>ҿ:ͬ*qFM-;G7-ƪu$'߳_}gϮz|,TF}JbBNZ[* ~B~WW^WRuX1s vip񜼢zW:vҿ}3z@N,f$To؀GzWW^W'Iv G3!i+d\T4Sc_~]xZRyj֤I^ L+π>?nџKO~V??:դ)z=Haȃӎ?`v8$߳qW߳C-4}Tv Vdʁe?_g|!X,Pd$hL6ޅfZrt ozK_|ޝZvx$qA?I''oq>S`Jĵ=}<%FI<}]/i_AokTB-bo3U@ux*dE,lњT9>!PWQ[V}{J'@F}~hbkf7 0Z:Uӵۀ='}xr_V%OhiEYm![džAu?qU-jԟu1D"2nZ5ރxY? :cȼ AM:AA'˔e1$[z[U#߼U^f.d3YFʶ ay*s{_Ϭ-u/\P!͵}ԍ,ߓ~]%Wpg}R}сӘecYrnH'ީ^/LJRLR3!AuߴJmL8ozSR1T`+Phc/ rx%~_3ƧE.l"PdƕsXəg p<?{WdDz4fdG&G,rJPZ 0:bl߁??N?3uM2*X*l.FiAi.?WϤ_>?~]p`Yx8Dى#nn HzW}{~C)#yeDڪ/@"n'JϿ|@aqNC,FOӆЬ4'@->@G|>Ii5>'A.TT$}c?~ҹ-OCVbkdZd߇ֿFcUJ}5boa‖Z:WOϬ^hZx)n_uzS[%YTfx˘r %0S=-O}3@E44",|5}LqMi聈V/cjoSxv7S5j TELۡ✣SϢ߸|ҏ}u@7O -4 cF7"ԫSmkdz^W:ȫ&0iMFW "Oq%PS`|}b`ck1x07G'y߻P4z`uviE2ѸYS c# ?,MϒnH~J}>HuokUĨ}眓ߟNp*;asyD%P|׿|Ϩp5*JBJn`ǂ}?Ts h+xlRVJan7{':E֊dӢ|Ӆ(v[{ߗ^I/c ťOjt6fX3?Ƒ'߸|QAi 4 'P*H 6 D rl}<:Ha&> x~̍A%20zFjr@׿ -8?Ic?f9ʂIy9"zQgA#g^a@GR*Xx$Ž}M§^oQXY 4fJ`}[q/슉WQQO٧J MamN*PLXXkeDh)ߵMʯ{?N"Cus5T:̨T۴؁{׿!X u1E6x*` C2}Oҟ_:R+ d1JQmkVK~}$WWˬlEGh'_pbJi0JnOc`|cCq;ˣj//Io'_ϥ_`uG($佱ȂK5Ss䛒/zIʾaTMRUdVny:]?qϗJ_EkSSg8ds9y|%〖ۏzG?VS{x#5)y+7Q.HMہ/=c%*zӉZ8%3'#?$_åWurZƢr0|y>]?Tf/$b+hٌ?wH@Iۋ{IQJm Z덪%[:'(ͫG@uA2GXNns RW=ڏ}`'^DIh`EWXϪO6ݧ t{J?QUkOu)\آL͹Mo,kJ!uZ':Ǐ M&BXٌT56ݡ ?{/_y@UEiM6"IT-7u? [,@J>~ݕ+}_}%WWXli*5jboGSfS2{UO.%kRE@٪(e/V|d 5MrQx/qa&I|Kԫ:1RqbE,jҮ1/+ʗXjzgk`L ҨE˩u FhC2SaOӌYvJ}WϬB&Hh߿چO'~?~Ot%4h4GI_՘KNrS%W}H\V@|Qfr]*W_Y #50:(k6bE&2 ~,dJ:/ 0!hڕ3EN ~fDgT%_>_|$c2Q}nf-,[rIXe%+y#}gF-Jѵbݩ19DTbJ{I?;8d0QE_ 3Ҩ?~JQ0{K>|RaG$xwuHU3O71SRnO{[W=fKJtjdVTJi2ES1RmOdo$: ]M1R*6~o_oK?I! I< )j?MO۔W/ >+c+Ω|S@0& Oz[}__c`T4nP߈ ߼:Ρd&BưU遪iC祏R*N?[~_ύH&&HSa,MR&(_JϽt_#_0O\{P8NEТ`';no%]5گʭI7gƪtiTKP^k2~3TOr{>hEFN*Ti%U*5"~..5}?O˭Y0jODh>jjᠦR__}%W* ՔGȉv`dWR^Wg3%8&,J`J@d'޺V1!*Uќz8I= OpW~I Gߟ_OsdDXjhiꉒ߯5@MFv=o\OϬ{Ɗx|RfIS#a+t_잹Gk?:(_y:jOIx~_>}bKRL݊O : t\>T_=vA4qQJ "KkPGRLEo91Jܟ}3uaLS"0y<zT)v3??WϤډI/b`~V+-FPq)I_7XpuqG7ْU'pfnVܗ?{W':y^`1cMuGzW}_잕WC:$2'(q0T dTݎ>׳/4`'_ܯc~_ ZcJiZ(j*//f3U?؄1=ug_Kcw>ik}ŽunLΘ߁c_/}b+7=?0(GZ#O˨,UUj'0/<v ?#\:G_:HtajĨc#5=~f W}ۤo_:# . j9*_i\1oܛ'yҮ?.ɮ>I4UNXXP N?,%ϯ.Y%T*j0*&ԋ_}t_LM+Q*pLX5q"i%}_oZ>}`-b{#QK~*Ev~a>үOXJN*6bz9<$g*\t?mr"DWul)4ϟJ?=p4cRhhQIuy?c\~]`b%_Yj֥3H)~or"6VW[h M:x P%4x:{㵄~ǭ X8oΜ.#рr^}ү:̶y<$Xe4 !9~˭Zpy@ 2G@ibh%&)]gj.,W%W|P%jO>M?ݺy%XT}~r?TZBR\)Uv2iHE?^_~}G@5W?չ3LӕetÏ]$W'a?DttUu#W-Bkk+0UTZXepEϟnވ$/cLVE!ZĨqfAbO+~gyzyG2 Rh_dq&It_}`71ȢP3$Ӑm ;EAMϝ /zI:$4ĥ@#F/Ԁ/>^W Zڐ :pZ<*Iqx2T%_>X^A,%zMev~vzIxڭiI3@MFrW?WϨU`#UUjWwqy*!V1 ?sƈjᎥLih1Өn[=/ߙ;/,kS"i>޳1QT3rҞ8Qc)[ď#xD 1m̈́~W\)X0ub \P}ڥ+}ܗ?~W'Vux?dǬRaD!&57rߓW_g\K7J"8*K*s?RONϨdh p)4ɢO?뒯>=W~UnWߺUOXH1x$tDVݨ̿3h!5BnSov'=D*X$h!E[4>LItB|Wl7OC<;g>ÈuBo{J}*EiDsTn#dOvt_oXLPfB=E=I o*Q뼌Թz5\"oOǗ~'bBEUR0T<+$*ڿu>]`Y%J(;c 02_}YWQD:hڍD3%0,Uq2T&}蘭B  3ŷ!5p+r?'޺UO"B֞)q}yW!ݺK_Q"+zx0])=aNHsX>T/s8Ӡo{^W]FfYǦjŪ_<1Sbj n_.8)aXӠGKR(<?O>Ү$\IfZNtvoJN}rT}蘭4Jz|^S}6&[*'޺WWy CTh$BJ,=<6&T ƍ i- JJިW ~U:ADJfEz%(Ŀ5g>fވM~-}{ ׭ǝ9nLʲ7{I:U\,0Ml3ԁ WKfoCLt,kV+̱xZ;_'b*7 Oۇ_}%WQ"U!P50~`=H~o*??:9qTn)eK ԉ#ƓO쟏'׳ Ufx͙@Ix`Cw-ߺIWn^ieJ[E'G֭Qa:`!dqT󒭴Ot_K#BjF%1/U!]toS<+3RG஭xF| oϿu&,jesIFo HӀ' (IRUsr?_Ե]k*IQ-UZb lE-n>oҿx!BU-C*o/ O~-+?u).>'e벓1 v7ܐ~}}g giRcTZ3dɞt4^{R*?]{=I@A-)Bp-jʏp}@oEF԰La*eFrW>Ҿ6T*3D'۷`/W]I~]H UԽ\?xWG/n/<ԟozgR#MZR8Q[=w_n\*B?Ny}$W=gCX -J#Our4uvsN"l߁]+d%0RPGmyX` X_%JBcqgmK?r\rVKqL+>v5ҿ-8(}[37EQNnGߺK^HBcӪ9EHuM냛tR MwVc!' R}u?:οަ*bfvR#xz4 M$,~ԅ{ H3TQ*y6ND)a)z=+?8^0jPöXAzܗc>ԑ#BYhj[X8$8bvʂ}r:'ި:Yyu"$16:OhAUbc]'?g}0o}j/E&8)G\ChFܹ|)~^z]u))MQ0+cc )qt_?tVf1誕Q_fIx %CSd6?dG׿YҹgqC5E M۸hy$ҠXϿt??YTXH<>IMxl5LT\/f4E掍#榚9?N.d=Q~׫Opg X4iipڥzWoE#x_g=e ȫ4lZ3VW/Q:}^գI|\MLE $ U-w[50q$=׿@ ԊLW)t]&ҿ~]fM.|5wI*yQUv/97_Dz(jʀƄ+nJTg046ፁ{^/gV֮Y(ڢ? mkD=\Lb| 7dןK?RE QPc#R鍯>u_!R3#MJij&g/`dBiNmf;'1MJZdR~V%ZxDځrP.ϯ/pzȗ KA?Imy\P+_g ^"4מYe⍚;Qj1-%W?> PWU|u6~w6fkTONnG{d~"c&)kZ!ipԶ~o?q?.(R hf1xF( / O{?//^?:?u &*b 髲16-nl$?/]#KZ*hV<ѷ0$-$ҠiS׿8hL hǶY`fvƯzYYCxYy4pÃ_&nv(W/i0X$wiQvd@Mf)}_o%T_4X꫃ ^1z@/{ם?,j[đŒ[ %wS}{50FՎT YVUDQUJVWf %87>^}*~]vMipnc2Cg^?`uZ[-ZT;x,V:Nh04l=祿?aKsT,ΔmQEJ׋aq1x0T۔Y_]{! %;iZ;Sp('eϿ}{X0A2RAh|x=?Tbp~q$Jh'uə#JwQc/<|O~}o>C& QUh N|ALm9匬v}OO\hji5RKVKpЙÆ)ߟX#!k*.f`*~=S'b cI:LET" C- < Ou޸?g~]c}K7o<i06 =_EKZ0+q 6?͖O>?Zҧʿ>]bg,YQ?:QD#ɷv"%aMtAo_ouŮOHhuC풰?xV~W'$/Wij8~ժXbڳ;SnGzχ>_oXLmҰEFh)PI)/v᫿d\? 1F_W5\tTI^gqyObMZb2ɪJu'[7(qt~W@ LW+GY_<-.``q=_?.'!jZᣪQMZBdMM{=k1Vʠƌܓ#s<4᎐OzIu"fujH0 nn{g92I-E2 h"=R/>=3I?w`bbzx9XbJO IīBJhJ!A~݌m5KX*>;WQ\>T_GK SIyj݇6Gp|K>v_˥>ߟQ|`4q$ uu=y krfR_S?z]c*Q}FznPSW]bo%Joʳxӛ-T|aFl{q`p&V-DЃ vRhX0mo{I?X7TԲSGt$m/S_~CiE/؆@.V5업o>ҿ:$.GFԪ(L,[F"fr(a.?}pxHj8O%>.AI~Unͮ}W?Bq}xYyj@5h{zUOQj" v5SW\%JkqAP#qoۦ7#= g&xTGvc O߁+ Fy]*[3~}7=W=+`zuvoZ+AB\9i7_ob'Rih[X&*8`ܾ~xuI 2Kw IQ%0ϧϦݓ?; ,5 q3O7N9v_6.EB E'Yϝ?P.y׿?UhLDZLm5Xg+}*/zízJat%G:a?%`SQ1vOƯk_3n4TMGjR^R~\K3GQO?CcJ0 R5WnmO|t:|ZO5dyo b߇_gJ|Px(PAQq=@;\yGz8HeZ3Tm}D-g0x0t؈߁{?֝ksR9,CQU>OK_oG'%VU r+ `O}uծj֍([ZbR(c| 7>ү:#!XC(PΜiciM'ߺIXLwvSGI$A_hvz}PQ:!%h"-4豑&W((F>'a80O䉖 ;WQI?/B-HԱdI$6KpϞu1=_>ߟQt1 4-ٙT){' jURQq5\)k^{7aPsuCb]?*7046 ׸"&zŝ"]/яWse=WˬHv&5(f%cɐ=;w M(]@Ͻt'QǓSC] 7vQXݒ>O_gX$o ^x~ժ)xpPM Y'%bX4#vl$򊕗MvKzH)+ѵ\_tWĤ1|G`.*W}E +A8PN#d _EIuԕiz8j촚mZJXIeT ZHtUU[SqݪK;~\^WWYB (7L8>D/LU[Z{IԘ09j?j^ڮ>\2xV'7Tٜ!(&< QcqJfkw=GROz.UB!(Hܚ^31gR@߸'Y,Tm^,poznP/ڧ/EC_#c1ZߴwD;; "{/~}K_ga@uzzjoau~AtV-|z<6Sۍ>0ڿ&WRc:Ki*/$5̢`F?4|iB8#yl~ID31nX {I|Տz=!LT@sWh׶SrxNV{(ߺUi2y#(\jI\JInK&W'K39A*J5Uxr{OaC7/Ly+ tzR/ y $M/ӠI]{_oHdD~H=HmhHS)I}?~ޒu3҅\F^#M]^,qxHh0%Տu|ʮ_P/V/|&ߋ#DwT7Wg`u!/~G-ѴP?h~Cje0Tqv&jkM3b34u̮ۖ#ގz0:8~SVb#JEng+߾ΕԒ)ocT%_rh~k(u] DejJjodK}9OcML/TzW1_TYY*>%Dk2IrB>ߐ}Ҿ8ˬiDo^cSEea,mN!zo8jW554O00:d:Yǽp銑|>(LѼǴDXs{:חgu] W@ZH`3S[M\i+sh6f5NM4w{?ՎW԰LĨjU׈'/ 0aCsp}d^`Lf= mᶶq ;qmO_߿׿R TЉ)4׋T&߆8[߿/.Oތ 5>*/^a:)=Q1yW:FTG~jX̲31omLJu z*1FLM3p+LZ1zW]oBQY44RƂJ&K=7'i4JS Ɩ$ܷ/E_]o/b>妯s㫍olf1[hމJ|5u7J]{VdcrCLh?7}_n? ͦJխg,<+4f}4hkWϏYJUE3~+ZDq~~'Hgv:f&JQKJ8|<&P*To~ֿ~G'Pn%S4.$\MᇿA~f)iV55ToPMu%=*l*OPHieey 1EylDTZQoޘ"GoXE/Owğg*lK~S_=p#Hq)ڵ2b+ܚMڃ׿\]Lv褮w:;9|4{=~_~n7mp+bWFGH#>f7U?Ӭd*$H&" HCۀ0ڿ|W_aT_b#vA[^-Dxڀ叴?].$J->/^s2/Hoj/:bܵ,fYqlO:{]oS3PuBcngzlAt+LZW˥??Fc4q7cS_$C$,Eni4Wk?gnUYio?t?m}\=J{KѴ~-b׹Dw5Q)f?>?nOXT EYkr)r)P ! ߝW1iu&V1fI4W(A%Z_|`kJʧT*.KiONV'݇_. 3%BqQIJ}px~P*~W}[Q~8uxǚ47(=T#0yR}ouHߺQuK@K-)Ӵ}Դ ?O"do6.?{zT?XT~j,s,ek7D6|:I\?6(Wfxܚyyifogь?yWiVBk=Y9 Q_?>:ZHjiIK\GIi"IGäd9p_Ej9>|Oi><^?.50  C8kW|Ua;ԉ#53e{/ F@?>_.;oIEqVy,{~?3Lo~zh̲c[EvJkQ_~G>;@&hy)q 0&ܵW3+?B=ۏI?&/;U*-S[\.G;5jg߫ש=b{ۭrn|Pr}q]*?9;kBd5ek֚EbHjl<P,}?^W= #U3nj>E@ך ka7JxAhh74YjhHY:MC{'bfڒWFj<{JF+7<zbO{՞1]J2$}36c??&@ٷ?/_*#j-OFܚ#S!{=$W'yWɮ?fMkW;D;&fIQ?ɔBlk"9rY,=f7zZ&?@Z]8ì2n Lq*28 ݳ_}c'^m%Q#BO) AG8 [OS|x (G*AoDgh;T?W$?0뉼~/Z0#I%1RouAW߿Vqf&jaÙŞbi:T>~ҟ t4qҚ)>/&G=07 +I~_cq oIn3P e-UMڀ Qo~JOz$m6>CW)#RmTx4ݿf?8:GOX+7!dUČq =f?~jWQE b֧*"ͬ?ZG@^ҪW_QҤIT*2,2\ls1z ~eO_u-lq5$Z*jphŊR\_߫Ү3_+ɷ& *wU_Ï~'ekIHi25=VG:T_.#htWϮ| YU骲"4~#N@>h~%nZ3a>үGdhқ %xd!v}?=?/:!UVx=_xt^m>fPLEbR׻x"Rts3gXj?8i]w 䵙#NC'oG@4tՎe>Zb|Qe\'?l~4hkWtWQܙC *Ed+J4"Lv@{g`$zeS%AƬjpx~0jT?>ҏfƪ<Ѧ4Z i ouUǿu#OQHrh\~ׁ)ZUlY -}%WbfDifdy X|Bs{JQJ_ Scoy~3Sfw X {I.PQT槣BMr]|0AfU#*) G34ѢjY&OBb[ޞ?>zRE#@i/+I|!Ys_fPtd{/YX @i~:1cTNr$eu)5H=i$R:E[CoŽQO֕UduuN'̴;U k~_>ƆhHrf @z_Y=g[I0TUJUg2r釋WߺKԄ`kZdV&?CiV޺UL?u$0by A)3F8ô@? >}}e!i'Rj+!oaX%qӎO|^R_@Z7OpKxz(]{V|_jtYNG?j.=藍@?ۊ.i皚b[K3ҿe bH<&Zirܽ@̄Im?=IzDWPת]Ȯ,xGao{J=IEPakT^)*ao/0~6:̌&]AZK B y%A IK)oqWԔQ1V#ުX̔3r]}!Ou?V:+j$4 wx%"}1oN)47ߺKo#JtJ kh]=;s,?XWgRdh-I0c%.=0@ҭW>}eBkɍZdZf*7EydZwOfd0p?UzHďACnu|eN(W\Qڷ-Q끋[t_"0hDD]3Xy"Aҿ?~ԄE!U,Rj+Vs+$O I?h2]u¸3Rg~ՑO#`hm[tu%25Ѹ_ QaYpP!$[?gˬD2K>3U4˷-<<o~=$Վjt2q)gzWf0 V0 Ө{gWԀ|c?jtINGQ9,50$WԔESG@Կ]raMxD*wD,Οٷ_._>D2#OhbyVGل#qW/_i,zp/"?nkOO0=/1ш٫R-/<&LPߐ}uHuꚴU9Nbu/J'M9aK]>o۴^}*W: yOZWx)*˷n٩dڿ'޺+u3.('Ǣ3PqpLdnzt{8/IfV$Svʷ#޺WϬVeh[qY7Y=^%)ujXBh0L1}{?og[gh|emOIIS+ 779g7-Cq]'޿=sPRlWd̴80A{__`Q- p촭ef&8|&Oz_o˭W>Ya4?jUv%8Yj9X?HCIX{I?*6K(Mj/U^'=dB#eU?GQT+coO(L-Q끵[qXYShq$+,wKgt~? =_ˤd-'1 u֥%sVO;O ?߾}o_쟗Y`$?*8vd5 zU_\Y-VkHA)sG4Ԙ?ݲ$'׿ϗY!i颖&<+O1y__"!-MfMOᇿu:C)N+m@ ?,~ҿ/z5@yhh 2FZdeuBKi|xAA>-:Pj~gw-Gao{[z̈F#X~V-Y^^oe2ZL?.~A_?.WXi>K xU,bn?:a5VjC䁛os7mOlUWιCT?KGݶuSlU?qkO㤴>]r6:i8@*;vYcT:R<#'ᤥ%Tfv/Gu/p>ajK51N QIJ`='HߺW [Hǵ,|Pa^bD1}Co~>T_…:YrYC$k2{Igb$q%\)Wf{ >wt:Ca|腒06^)kVE<2ria6ߺO}W ]&dI*X$j C7~׼^'^fȫ/\Mwj\ APߒ}J~ϗXKyigc=2m<1)ſ,}Oڜg?i#23 Z)C4JL&ZHlC))juYG OC5QeG>T_١w.5"7WQ QoOSŽc_J#,IVՊĀedfuDKi~_{_gԚC A,^Hgw7Sc0?zǢ9TD!-VUE_#(aIʟ~׿D˯TՂKU {<шVJMO>oWϥ_uf*>!2CxLt`۴_|[W:"uAI2Ӊc|1dyi~5~I_XeyFkQ$h}6 YWw {_o^p%R<`KAˣHV77Q}=ҳ?|txnRBKoIJ=X?O1ey/|޸]̀LsRvV}o_uQvOOXcauLoo'i&fTp]kߟXBaHKy+`JLkb B/G}YDBRՉK^j+d;O o>\t_쟗\|E).;y'8!CiVk"BUkeH"=<J,3I;L Fߒ}_.kWE-]DTJx?oި{I?냟)&٩V-ϐ2O{uCDC-1jdW;q4AD!,_~W'2CΨ(I-&UWBtMO.cP8X* AjhڭiFFZq5y鈖 ^|>g[kUXS? }?{zUOX D!r^hak/2a!tߺ:m"/QΟI&ElS<_>?E0o Mғ74|Ō'ݣv4h~WK̕2}@wL 8O']ab24ZGh}6%YWv?>9 ҉-JS%MoHENnol{:W>}Cp"PXxu >,;WH?g. ԱKa^0'@\:Wz}U@(8dciJJ#=<_J,;IPNO :I.I2#2[NİJF?;N$}[߇JX\t-$H[\!Y^GgzgHq5\7Yt_߿_=E)#XE_jUF=YyfL80An#WQش ^ xTXVJ]O>oI׏W: f*j$>3s/1(HԿ=*'S_XX$N-?92R'Sbݓo'ߺKp3؆(%Dw+0Q(iso~OD[JK0&Jjۑ0Ed~/>9rd `)`TxaIZo[7%}/D<c,W*X =+XFuT_|UH*-}q2O0d^Z-opWG%sZQfD,}?ү ީd[%sVάNGl4?M\SiIZ+X=,_fHv[Ho>ҞY-YC* Ly*00eC~I|dIY(VgOӷȐJÿ@,}蘭c2jF Vap*Z%ot.ҮDd~]e;u^4B!0/.=$'Xe-7xhkFZ,Dr}jk1QoOSŽWϨE G8PAMꈖ>]@0z>7Vss~??-*W_Q "kVXF=Yi?H%R"t{G'ʚMV*'IaW4ot_uA/#5f8L3x3rQXz/?_g72)M27n٩{}%WWQ*AV*ۘ(Qf:z{\XJް4ÕhtL)KS}81,ݲ{_]F'Y-A)̪MIãE"<-nzR'0_>h55,\185+juT[߱үzU@iIK95B7&wTX7u*V( $^W,n t_Y!$FF̸x$M\ΫQ<ٷt_*DGi}Rԑ48.*5n~6Wz΄zT0Րq_s,_\ֿԈ^ȱPj R0 J,t?\ߕ>ү}f[L>zH+<>l A_./&x鋡[e:C~IFi44̟Lǎ[_}WR= 4xUi&]i~eifwNҾ VR)`*U\ǽueBKȫ9ۑ +G??@iߺKԸб3GCIӫټHPn[MtATG$#T^G bq}%R~)~$zk-CC}륟gYŧRj^&>ntuLi6= _u!Jz5tseO(ڗ OJ{v&b(--n`T )S}u 3js!dVİh pU7I~G_!ԍKy!ht=m2 GΜ.>'SSGᇿt(VD4ؕa l@_}zLՠ" tI&*=y>!-_W˥|?FBEx::es9)1Q넖~gH(-a)8ӗ2O+b7#t_잤",PjoY 5q7p&l~:L TJ_oYҪ\/VGzz4lt_@"_Qo5Bj)x-_Sfm:$K?ԠG;3yi''D1-'޺f=s4Ȟ WQGF/بJ=t\~߿N_Kx Di@q#U?6=|?8Y]sw IV!H{:KB-)02GpSiQXVr]R0*zԂ@ॿzQGV` ;S5i_3SӀH7ӤcRCu QX8H~iGҾ/a7VKZH4}%4շlB_W^/xʑ´5\.9) ֯1?Z{>g`"Uk۔W?p|֔}MU2]4w2I%"l7gHHp_Rf)mjboޙm_PZfĢJh6*s=t] =ԠZ_ v? ^V+>_p>}dSi\J?n^+CqMm{oI4*bґ !?*%e5fj/p=_?>*Uo"j5DD_˟9/LzYORBxS5Yl $?~x_o됴[K]OoI'H|}٧M>W_^c[}ԟhjcHL(CKvMe}ӥ|s:tNڌhd[GKZ6ˤERM$R_?^TP!Մt`6X`K~WfFv%V ci\wOaa_.dӥh"xoՄ%i,Wo~j-! VzY'zWpփxߺKOY=:ujt,8__) ^f ,G={W"h]$Vyg)x/qG{J՟FcC O8sY9[ ~giO\2 +Q0vmOߑ_~c?u+f\P9c ~O흴_?_ύd.[[-$f|2S>ئ?;LW={_j]/3N! G%m I*/v.!%A[~.?{oI~Y9_ HޓN/ fq_G:}eS S' 'W# Z?ozWK?Ȟ[_XVroTDߺ?>UԢ0HjO[;*>U]>1Bڦ/*[3LOkGָg?`%JfQx>mSgӚ׏00a'y$_Ʈ8|.zI N?Ke}(/"%mFb.)m/So_5QWX~ڼP ^{%`uȲiahBQm:8J^i~57{uGBԈ5D=P{zh`&?Q?|>T_=d !~Fθ$M\&Vpx%?o~:U0x)j$8c%4PLyp~[]bceEQazq^N\ҿ_! $)&gZE?oI'3ME=PƜ:"uBGf3Q?6ztRRxԌ*?7ҢZY#ߠjt[ߺQ)zЩtmy 5vz:U~gY`7Mܯ~c/q?>QrHZ*jTEAC7 O~OXd`cEVߝY|? '#:??.R۴T<MO>}^{uy5_I8/2}0D5./ҿ_Xjq+*ZoӷZPHU`_`2 |I8  qR~'crްxl4jTЭ.? ՙ[o~XNv4ċ~2 [GOzáijX(vj?rSG 3=nZ߾ޒҟUt=d?$Q,,՟$\_dªGAsUUJ#<̺ 3޼U_=Ga>z}a$w5:*& }؀_>q82fAYvPqKt ? vt:bvbi&;,8-Ge,}_`u]:ZgSVJ(Э$|بfzӯ#I?-k(2x@|wBu?V:>ϟQ acƤiJTw I,jt[ߺUOXtPL>@51F~_?>E $bMDOۃ>PP¿s?}=S_잰U}SXc '0bm7W?.IeK\Sj4)s/Bd{qop_?:[ďW_YIQ͗?A$KvKI?ΰI`β61zZ1᤭v;{#)U ^Ҝ3u)IPԊXt0;h`';L_d^GfMWS tc1<}notfpWzA"cB\8(Lc_ũF)T8dC'ZĚeZ[W cͽ X'zDp´m%%PZq3j:ݫz`# Y߸@Zڳۘ4L8#+dE:X"UX,No1 Y3 +~}` ,*_PI'ҢefmGO{H<>*12TK%"l7~_g_X٭餜9'-㴫kOt_JTjXJVƒ-"WobUӋ߾@ץ?: v*R*3L6ZpRaA"?kN ?Jt{]?AvSR!Ya pgL4p㴣>O:#&FfMS tc1?~Wzք.9xpQIk&XKV?7Gta_lY+dI7ԤF[!JقW2#/4Q}s9b^f\${WzDŽ -=e9Hүi[[-$gRLS9Lvl~;fI<*Ɠ"RIQqo~'u*F|2$]&"C:9$~VVzڑ^C_Rku?/uC8<pTDtsyXQ7-j6%tC*QrHd@=H|P >>=s2+[1LRZ}|TzLZZsNeSx>l~ZW]`,[oH-:s$I ./b 8vDkYo`|xU:#W Z]DJJHIOӁVn?zQ~7?ՁY\&Xi 4M[J<俧 ALu=~O5Ы j 6C?QXŽyF%`Yn$,X&JIQUnl/ODkx:J2ÌGSG¯3Q뀖{U:O,# YOF@&221޺K YWSG-NIPYi(i>SRI6u+,,P%4SNLxחAM5sGSu4xb|{ _ߏ dLWpTг$>^t=*QҡϬ3f5v=iQn/M:#%u1N]J-e>DY? zז]*YyHw !% D: ںɠߜ&IԈhʰ4fjhjz'XbqUg&A -*ϩ]gDiaę͚x$eGzc_LM*?xO!uć^,v6(&b>jq |rOvpҾΡuI&~Z|U,EHCہU5~o_oIzN?FfV_B"KTj_X(Ѫܓ+W]eRej"+K[c:m6M.)YCNglk;_}bUX>]*WWY`6 z.?JS< UQկW߸/X+I2q;r/ [VBoX f)O$JT)ݓapX1EL%+ĉ ϒuCعX{/?z4Z K%?^ c*=dJVᬸ%Mo+W}HHl_IkJ6JoUa?OY-r㑣oa I|KdU*%tdRCAۇZܓ*0&ml x>m+hRI6c >KrSh՞˔P,β.!_[O?T[GOt%"K5Oag0꒬(O{Jx(GZ*?՗2G4K&\ ~>`;ԒQ̟pz)iѪO:ʺ-RV%-vHG{Ōa-?mo4~qg_W˩@'P] k;i߽Ub|ut*4 E$+&=*?c U!H` Es`q[j# ]s[joſ[WWYVOYZX1ӟ5&>IO?97fHW%%PB$*Y1,R4xTstJd A?GCW?.c#YK<ԢUDϑ9apDsBbQ%W}HDD|%$2}2yrs/>_˯/g1?~LrOo?:ȥ5HG:^qߕgpW׿AԴe[Z\clD"Y⢵>G| !,Ho*mMpdMe4steX?䆊I'Lj^Pui?K{:_geoe1D 4,7߸՞k)s+OYQ7qL^oϬmQ&d Ja%d>>O^eR%I+VxdԘe  _~åyWORJ `?7Bьjr7G$TBfjىc+K_XKN(_=Oo_UzgI%%s? Jfh3GbUX?]+)DM%CFݓL_oUQ[Y/e[)Ki" C혌 ֵv&d:A"LW"M>9Ǫ- ȦpT'L_=WLT!\cBA4OM\hḇgLS_i9'$X½rG^ɄtKP~o_?8edQ-?tM*X^ "7%?ufr<V!dOc<׿Rfy#RRѴjb)ē v"-5A^Y_߳`[kGЃC k W\1 ⺓1*)c#SH|мLF2IʓO/?] D:?xZqxY{z߿^:Z-% $A"#q r9\Ke߿_Ϸa-Q_&  ~~Oy+/fR-_]o𞳠iy~Y ?_qHD :z IOˮLEUMFO>2I'3 @ ѪܓfS=I>"%X>lC~Mp?_pW~ϗYIY5N'PGSzaGbwUXCz?|Ϯ!]EnQq뢙_௽>=f@Q_jƷ!7z!+!:e)()Qg+Rns/֫O6*GoR)W09dYF/ "$׸?2+5 iQtb,Krߨ}jˏ۟pƥkc1ME D˴\f",ݩ<gT<ϬdYbQNռ1k0rGzWd~J-$Bh[,18c|Og%|C_y+?6 _~W(?{ K(wjl:^cp'op*?|?.: KUMߎ+xu[}ҿclLıɬw-ĴeK~za.tIWB5{Gq\C񿷥`|ƿuMh4+\>ސ>' F^Zh- NۈBjķշUoO?b JNC^1/顦NE^s{:G~=`dxxz)~ү?g&fb<-[hV4%ux*wOL.KTw RєX- v.uI_T<3y?wb9 5&+/ڡɠ:_ү:$x2,+J N2'AW%Iէo~qOJJ(iS ęŞ|묳hR=W=>Wz^-E ZU$$\@na|gq}Hh8%*a~66k='I%X&PO%&kLqrH#O0pM_^׿u/ejs,fd)k{ϕ`aȞV䟯t\;.S5A`$L-0i؇x %WR<7dTx*1|n"/oުR~ä.H\~y>}.M:7e \t__ _k+PBZZ'[_"hT7&[߾}$Wc)#M:Qj?ݣǼJhۜ~uQ1 X(_yijV%?ЖH(}_t/QxJKN&RXq`uUeI_+py'WϬmp` 5O,O9mT`Iׯ/GS\z|rcR CWQ1$_|ra#)BI/ n/N~}I? ?wS-A4 V47%lk bfYΖ1MFѢ /oؘ'oꙭzѧ΢;C,m`a#u{+~A"@}Нp'3gj?ݕVŽ=) BUJJ(}L~ C <{eG{q!WܤKBs$e$su?~T[WVKZ&(-hr 6k>VpOt_잰igPMR}鎺AI?cpȓFT5~CӞayYZy̬ƴ^OooѫO>ғIuCԫ5g DI[Tx[fi?}o?|%s:F WB5sG`D Nh[io׫e@bSEDžZYgonH|_oԒ}?`uB QBfk~[y [K0X閅~է>ZlsEsԏ~W=Fdxz/bī| KqTԖH{I8~_ac(Yڛ .Hh<򑒈9) |zRMsz\Җ'#ϓ EߺSWnDo,X½rg'GFE{/Xg.?y+KidgU&I o~=G3*4J("A3 Fh[ϓܳ,?zGo& $ċGMsTI:$vMQhrVk=!<ƛRS*W_QX3 wjd*x|x*n~Ij=?Xd_0{o"yώ%S^ cFrOҊSF&PL&aXRdd1-<4XXI !B4+gh1[iotQ82ThA1]-0MQիWߺU+mQ-4KE"E'0ְVC~-}&uҙcUUoPOQ^\e=Pᩉ{ \W\xYY( <^J~`Z1[+O]{Ѣ5:CBq-N߁E9T_$ Ixu1$<a#JLdx]*$JXp#{Y5r3PdcbT>Er#1jEjd*Rۄ$Q|L_)?1Y|P#fs OP4@kc|j7#?O'J?R#KW2ĩV6j`i$/R,ixk2UrؑZl?;(oIz̧ZRBS2piFI+?:0bz-NNfȖӆ. 6S naC-USCm2]R$?p ~WBNSǏ7|+6N0}S_@ 4gI$VN$*NriO?&ԑ_ZP5!|Sa)H5u6%{W=g5R1S}MTA2ZsU$#KJ=Ib!~'ҿ?g JVLayLEp`(/tՎyieIZViL9̳Zh?Ҩ_=TcORJ'v-EuH;*{[W!xh1ORb"Ս=DbqVeߏIԅ2PF17ȱMߊA\1U_Ѐ}th%Jpjiroח܂WVA?ԟ~/j pLE(J*Ց2i@>ҪJÅPUTFNVe$rYvR(7WzM_ϮJ¤q$q_4Y=S Nߒ}S_qLF֤OP iVdY?N`jl˥Wˬ,u*hq6L$X:M:D6>4橡[sW& D~ IW @:/raB)c!щĐ+/E]o?Ħ= TKCzPF'uھ=%_gʢ0#X:ST8D猥lOY\$~_zi !eV42?0A_>FY"0@-aufg2K]9_}^W'o=@q5BI*}ym(8 O}+~]gS蒼$iZpiw$?oaH$7gM3!rV-C4&jT):CBRϯc, :`00X,M4T Q>ΕԥPؖ Z&-dEeOU߂=>}%Wj-r45E:jO4@Ը*?L?_`|\@bd9!_!4, +[B@޿%W'ף BCECZ#r}՚ا6#{|_i7R#(Oz:K)$Q1[!IuXWˬ^ݠg&AIRo>%0"-k/52<iqtQ$(m+z?YMeYBR0d-Bޕ@G/W"#xEG^OpJxEuOU oŽ_잽ϬC izh Q C'xqV[(WWIוTWt\L]*Rws==nBDpu*;^2j;3Qm0iYR%vTU_z_`1ԚDO=eX\Mza{~ ^\1%?ڒYi9 JT V_iJc_!C"(Z J$/сxq+?=w,j4!\`ZA 5QۆzY,#TB!?Q+dB&Ot?>V)q9AW9̓ orAߪz_'qDq5@xym(XqߺK~]b#dRniZyW~IX̄X 2+W /?^9oXYVC:Q^>'-<ٔ _{|^Ht4(璅^oAeP~_?us4t/O~.")Οqo_OlW:ga?}~cO IbֲGHdW:? W3ӟMXWJ\mS`uz81Wj^N_46 Pԟz:WWzJHP-_;Oy"TDpHЭ6 \vPߝ^uj6D,QdC~Igx??dkF PM;#*N 4@*?L/W444G[ |TB66L#mU߿WW )#Jz3x_[k֥Yr_醢?}S_ub Q%(Wm]TZ ,_z_g|.5@y\Jy?R0/:}JA_uOzUc )_8 D9)UOz A("==R25+?q{OV9Z')zOvϟI?=urIVS@xȿ1BE?Kc_?u5 %pHYoβI1L OtشT^-:r(%h0ۗՏzK:3J4RJBÓn4`v`zP9߳_!44Ţjp(斊=m2ˇo$p*+mkQ/}_>Cyhޖ1ip!%qV[ O{qW:I4QE<D[~'J&5گ\`íg LBS505PyJk?8߾ޕp>mpFG#c"S!O$߇~^gE@zQž֥m9,s~#~:c_.+]I}>$;D,yG~7>Ү?\F,5 1h$c==nFD8|0S/:{zu~̄\|4ALuѷ0epP=__?7B,m_"&0Fs "CVPGCV:IOϬ# ضB**YYqɲS=^W'^P*5VB!L/cS!uuҝ*'Q&ʽ`]MNi0_Ho>t_oaVr-S4/52Y錢8j_}*9WidieY BRdL:*{:k ]i撊=O/.*+OT5NՁK4ѽ4b">Z\<[^:4Ԣ{)'_6P1/=\5d!gXIiOz"V՗uƩk=n3S_V:P$63IB::⪵l830_ U)"ߐ}_@MXTF*eܕD_%6Ge $W_P$}>H?`>ߒ}_gJ-jRIzz섩Q[7:{I?Ydi bjB4UmJʑp Um\zX\h% sGA-='xe=?lWa_vWG0ژS$, N'DG+7A=WX$1t jl<.=XDUڐr&kGQoZSQ?&?>ү}""ճƩjs#?O>N9E:1# %onld뀐]+W=C}+MYå_zPmMQQi٩yOӇÍ>S}u0yh9Q:Ѷ2k -JcR¤tSJGIooa,+6J^ߍ>Ү9 0-4L1\N!Du?}"\uBЕ}i@bQ` ѭn䬿W~W)Q~%4aj$#7R@GIO>׫YJ1\g 9?f3AaW`>N*)Q1QVvM_ufji6+D)EyMjt$Wn !B~.?E5"٦56l> xX'J4hJJEP%:7y|w ga~gSq8XWG |yg>y Ϥg1nXx)%x )n~WWjthmooz_RO(b%kTjz*#H?}綠IgϬHԳxdt8O2}륝g^FU+A]ϗ(o+J;F(VMoA"MN!=F/Ͽ_>+R x]LT|wծ_}JERIZwy(qѵeN#M+??zW|ΟE C^RIh5XI) #Ծ_z΀I"tc!u͸E!b{_޾ޕԅ|i5⦯a]|=yǚhhmqzo>׿tv sIBKizX+n[~/:$ֺZU$fOB4{zߺW?gˬ 3Lej 1Ѡz[xx&dOμ7$Υm"WTk>N2p?߿o:G:h,JmSciD{)u}!uӵNj&S)4}U5L+6ܔp?Uz- کH|<-yVI~MCDtV>}gQes[,KCƦon6 ʟzWWID`HB)*Y5d$ɛo9U1pO>ԅ&R5bֱSfH!Gt__WpW~?H-c"ou`nq`{zg_oQiKIxD Ŀ?ՁԐ|Z䎝h嚕])#nWtY%+/_`2h?Q *x|;/=\>_R#"2i~o˶ic|9[]oz>oYJ"RIN8>W&gb7K|Πc{BMd0jo՟K+ _3ԈtX}IY Hf>cD,NHuߨ҃VVO\ U{y5DF 46Eˬ6ڽ, mz83n_}_XueUK9*})0I4B< /${?Kuz2q@Nm$eC_Wz_`Hf3 Y!?mr_qdjݎ=ϥ`0 VJc@NeVsci}ȯ[=E?q'?=IO%3pbǽ,~ai&UMa ͸j olF#X*dvM?K/V87 ]+W'eO}lTO fv"ߐ}%W'хp"XLK]&sRU}+":oOS|gYyUcY^7:fxzMEoQ$k>ԆZ' +xN+cZ1}t_o| @QQ6!%׿EZi#hQI=(wGu奿J/oNYQ}kSSXjcqEwC- Ǥ?"t@eLfoNZkjzy/zqIN"wjtn=YlƂmW޾],Wzʷ"5DZ(k/ ?C>𞲭ٕ#q1vpY EMRG $hOWWҠ@&Icse{ 40}{uAƺRVoT‹DI!U7|~uuF-R($xM $F#mg>>]sHZWW#5f>4R68fJEvN8?޿^W%'ml)@ x`8m-ϓv̜Ž_잕jk-)QOVs~[JIf+|_%u<8J ESV YgW{>څRX"ik$I {/0QY['߿^|YOCV.>t~A?~ϳ_3n" Hk)+G.nxW)O:U!/_:ȥRKXlm2SgeШDo~M_%dvׯsrYN2J~ GpթV~C@VcbĐ~H`?8oWzwo\YH8Eҫ,M0XewE-/Q>-QB4jj{X|;-=Em6%(EVJTvi$$`V/:KOY"%#"䒇JABmZ?L_S_o^>g8"kbCK;yC߿?=dDr,@㧪#n 쫏C{}èB$s_ך˚4xWGiuA zRb&u1C,pQp:K_\4dMwjz(޷#޸}kmȯ#JeI-uoqJۜp^LY TSNԊD0G%ٌM ϑOǭg_pc1ZCQOVwԊ_'ҿOzo#K8wձHۊ O>M@yOXD:|_l:jɖgB߯?M(o\'=:OzHܖrI?808؀?*}?yBb:JLDIɰ?|y?&>U^zŭpup4n$}_g={:$MdT}4ϢEq8/$ژX?ϤuC#LH$6!'S}zW&"GLI5"ԔaGU/7P ߅?>X>,QFK@SkA"5;}e#CbŖzNDD0gR1?oQȸT85 :u坄~J낯J~Ҷ2M͙ Tο^ֿ'GcPKVZ!Vk.f?+~^_%W'2WlM*cXqCVZcMgI 9*~<4kO?E $zJ3eyZQ!񦪧QxxIY)sI? 3jet$9>]g]ooŽ/^WJq)̐v;EOgk?'ү/&Ab: )@qvJ,M3UMY)J&u%?+ž|:IOzUW3!o՟W1W{.zt)`>80l@>bUU%l93S(*z~e?IVLJ\=eJ@czz_Di=&ܢ܍FeHt8cZOL,>t.!yVA,m S-ru=ufx8VYVGF " nP?gI8Qhx,5? fqd_./|ޢK=L˶I:j ^vV_Ž'?=cQJp*)އMPgb߫yuoQɸP&] 5ZGן,*&o\<=?WeO8 W $3 W\ا$i?]$W'NF?}g˨ҐS*F>z]UNLHۜ\7넅iuuQKPh} .mQ>N"?={݉ZCAZ;UQQz~'zac%VS=TZeqVay)ޫҮVz֌Z jj"?g1X!ХCDZ|Fv =GҲ⒯VGI&jeyɍDk7޺WTXKS.cZHw$^|G|+kv&N?N+cZ?L}tΡkI&n('D|"SZ?ݓ_{?AYX8IGWtܠ?߀af6d (%9aaAA*_bү}[6  M'ISZ쟋~}O}`a*tZwy(qѰerxnB߸? dT5]y]?IHVFOzG#^Y)&b^W=E'dUO^^BUy}\^_W:߿P^m#j=Z xEoqW:}kis3g&OG?r(]=_4\1Ij 1zQxxILt }句S:a4K Fe*OSqV|uR#%1Ǩm@H>;[W=u 1I4ckꩪ:bn%?I?XZDA<_j*Z3ZQ4wXBnzWQ jX}"dToQ 8؀?*}祿Q|b+Ȏ\ʹi6 ҭtfVeF7:]i5 )164f_-Ggk@ZcIvS ґG%8 K;cd#EpVf4~T:a&k<.^2K1Vqqu~RTׯ!u#dwd34nrC}$W=G#c-bLMjAZWjXqzo>ү8U$ M*#Up0fU7E3j,DV2+li!=_WˬkG& zz=,>Zo]'/>xbeWIlgTՖ܌*V1jTT=DgҾM(2PGm5βC{jK~^Cd[$#ǜbv?[I.__IVqMQ\V4)P_Jj$ m? Nn\-6?ֱ/I:AZ_h!%6:i?UPfv4;=]s c4iaԋ>/Wϩqd`մU *hsǘߺUgꖍy,s4 ޺D+Ry>|pdU-sOCOȓ}I@fPr3KXz*THG4{JԀ0~aO <ٕO@XZ ?`&ڿ޺KԐWShqCٰ lW}=2V@?QC `)TVI+^ ,3-:wj,e})~ңz11Tˇo r{>Wϩ &0&29 3ue EIB''8|MYiXfr4,'MҮ]e,]2&B_n>?T[޺K3uV9Jvգ7!i>ҿt@2O'`A}k"-OB I׿YmGOM ?O f=G 4UjH~DBJ*uY:W1UPs|.T[ZnA(t__R*]&ib8^Jl{=cv`;P/OҮY>iĠPXJY[?Sc{[o_&%R:Dմswe2,1ǘłS|GIxuBDJ)<~S5vuRod)W4~CTMtr"Ȩ}$uS=:0閤ghg*2 U?CP)ozW},/gY-)xl_B Sk~?WLx!{c?g8 6ڴ} G/U$3΍[U-+oӘS-a gu.JQbZݣNCWg?,ǿ>_>1!`e5jyKL2ۊ}">|gRx*uǧ松,,XrkG`Y_=eU )rY/3j_N}Ix=IA&+8&H%#ՙL'@)uRؙ?,=WҼS_pȬW GYEX[JUf?)-/?:Τ8CKRj_SV!GuGbd~g_.'+a,G?~hSm{4]+q0H U+2X~AO-jFOW1}.d{W_I*G@SE($iCO丷- S TX^J\|^oHnz\K/ ]g__}s#j,o+~YfUQ܍"+K_=g->R:Dռs(g)`CWOQ}ϯ/e8'$#"N֙H)+W'A2}MBȠ|C&O%W_YP ZQu\vݦ? |ǯqW:̮a8<ِZs@\ڛW{)ҿuUrj(F ze4[ǿ/?zIT0FSC\yj͗޼]5W?ԢR}Noz`iWN:ʈMRMdo@.B̐ڧtb~Op^_U:Cjsxa9–FߧY~_YmrK X~Av}&<jߏ~_\Ze{UCs|&T߅uΪL}b^Jl{9}Bځ4>-\zWUϮxkO:% !eZ`2ͭj}u/sԨB#RҥIx?>e\v dhPʿ^&?Dh\2+$zއKQ_=r[îE$)!6}!?mZh>֊o$<:.JluT0G1N*7ڳr9Ox^u@ڒQVyhImt8[*?L_}?oէ^_>[F7)Nhc>8ZHL˔ܕ~/k?!Ozͨ Bd|^VyNy\ u9 fr{%V?}O\="xB k5<3a>Z_]//>^O(ưRI1:tϡxlyBK(2z_'eO*ңUlY ^t2Ҵ25>/E8,ү?o""91J)k2%ְxڃ v-'_u\ ?RHb? ~hc;z:]O.quث)$SaTųm>* >41MO(=?>ix}SWVuCM6!REP|qd^g>cuSozWWϧPST=d P*o%!6:E7-{uQzsPVyE-nFLs9Z_ÏI?"(4X~-ǜb0'{ָ:epIL!K /mx6*o$~W_JuG%u{}1UPǬ'\=6_ZI??^p ֪ 2ޖ5%>:W> sngYWu|#:A NEdv_O>Үg^4dJqLx(i\ OL}_t՞!R BHf-%+yWcj(S'߼o\)'<՗ϱjߺQ_uh %IԴSKx O*OhʹS}Oc/_X;T} <ِZ߻6{_oXVo2(pl,} $?]*W"6NF>:LD :XzGHG՛؎S_QpCjr:/ANc{k @+wES~}'f~4 ", \-MO:y-?Hߪ:S_@V2EL1,,jSW9]S,.=$T_=c1C,Q@!SA,LZfrb{sש˨e1:tΪՕϸcCL/{J0#ET%&JȞ z\bVFSߖI?X؇X3ԵS9*̄ m5$>i'ߪO^W]FQ^5Xz?M<10 VK4y.u"gRB)pO\TBIoǽt__.JI8 lTQ8\=>qr߾]*>X|2$>~#ިkXDoKyTJIg*_I?cJT:*h(]);7X/|랔W6@Z:%7&9R '!W\tjj['JGP@lo>?T<߿f,FC;E<’/~'h@_O?a_}7͙ (+vK>GˇX{ը6 %6X%$~W_JN?P>HE &fUu'Vokp?H대@nj KEKk+wA)b׿[xɍqbSY&i48Ϋx?*zF# LӷEUNG\ G?tI?&8ּ5MxXOPJzAceܓ_,uQVg>tQM_P/,pcR#3**Մz39995'oL}TPOUXd+\Imsf;}?W˨W?M417O.'_>ȡÄ)$R:ik;dm_u"[ Orn-~'"eZei)!}Dչځ4?WϨOhW^i:53U PrQxr8:E(kMxjKEB 8>=17Op}VrETNG;i@>ҏzģ[ h̆_]~}DGtaZ[1hg'DImO__}Cfilឣ0y0KBfsjm_$uBl\7A~mZH>֎${/ J!id`N.P*?ڳ{~lu0keh,bZO%c>pTsŁ/)Nh#"8MeQdc:7%`aWt_F%7IOSi??ng1xB kU%=<{f?{/7~G>8Q]vxxMLR~TozXhY];]gR,557S}綠`kHj9k2Fsms v-'JQ e𬈋 要a?t%O+p6=BfTچ8ՌGex'Pt(1‚d#_w~A'"X%VVD2L_'{Iz$*I,N^&R 2UgDd5U¬]^h+5+P|m)7YĚIo߷Y"9?" z}u }$HڇU5 J1NF m,i8'~__`ApX1m!Cooi$d[(Ot_u%éUc ,T$ ߢMVrK'Jԅ>%BdJ?^#)Gazr*g3?'Rt_gYM:bXQ[ XKKe!^Y0u.5*\+)G=X3d_\z޺YA.j-FEKDdR g|YJZ*ycNC$}֧݆޺WO˩:J*Yjg55$g&6㑨1eǤǩ:5jT}zxMoSzd^ҿu!t3,?iz5Q Va[>nh.PD(cMOKҐ,h;u*WYPhTA![K. ~ Fu}S%uFPJhޤ<!Q#noY "cE2e?kh-{JM?Ԩu\M ~f9?mH??IߺegqX+$hw .i$~/:-i 8}B&bw̤j~_`>]R4pSE5eG6712OOt'RLzB=B b$鱾4gj8%}ԈEFz-*2IgjjNz_"$(C ;F} %eCs=t>Y07~=$W=g[6,+i2@( 9I,aq޺Y_)D5B7_C'6LD؍'~'޳ .W ɴ4z*NJ<_mO=_Վ!v 4qć4o 4q*?Ir=&u[ MG؉vվȣWϯ+o1!f`T ?\q_uA  c_}IRb14P7 Y،ܯ>/EQqE .P֔hPǚE& iO?=H%S0ƕ*^+=JOYKY XNc2ךOGoi%gRT -bͬ5W*S(ڴ?{:Ivr~ $B.?@I>OA*ץo@kf2v4-CYݓE dRGHzMYg8 (h޶$4mبI<wJgY={_1*PByb/)Mh` Qv:>ҿGg*|ZXȔA tiH-O/(gVg`ݓ}?IiȐDSV%="??t>Z_LS{_잳"jp@ȓu/I3 W{K?B(BQV[ ԮR(O k1IN.(YTôuꔆI4J{W}{_oHeWJ&Z4J?1ƎؕwKoSqF+ v`XG,hUwJ߼ku^$?jѤ\ Y禷k_g:@BE1)p?-&AS*?Ρ}_oJ|*]=:()v\,^j[h4/?=f д\+/Gv O&}70GCZQ_ɸ,r~`}_gJ/z(V$BP * G2IDv+8a1TA4I \RatAb_~I~g%`Rm`b~aZ_:H³$E2'Q_SnQo=Ҿ?:?:ؙ=jM Q!Amh;REoޙH_:ɬ+!(Z-CK۸i$d0~[|Ϭ}s<$T&?5.JQj;|_tWW^'=d)HYK5;߶}z?=dR,we4,:8Ie?_//ז;8c 4x_wzQO?7YDSP*dO}Lc?s*Ð5,ӭ,3QrLAOt@}3U_udVj5*W +?I׸XGZoCp:˾ZI~OE߾]%u!:G7ފPD-Hm5?qO$ >J-"9obѤɒ(a+&j(O 2go ~Ta ]i &eg2P6?޺W_(KFEkgΰ:Z_L m>W4$~X>5Χ*)P sזu$W{Q:OO}(>4@]"~OB?)_:bp&PgاE[4IbmL?_OzcT+ R=Mƣ7$c,XcI ";~:߿u?)5jQqG &H_tO:MӤ"3Hk qQf5}/˭ FbMoKkhEZQu/>_zRiR)QK/ֺfSV;8hڽ OzKDn)^L=Iָhy $Tf*q[RSx'ϙMp,1#19҈tC?}{_잱0T OB2H4ꈏ_{JuW,UX'ӌWfH?0^b\Z* yU/]>Ki?In=$cr0ݝXšrLƣ@ZQXcn/ʌ4{u:}>}% DEFZ6?eE,~)Qܢ.h\Qn%Yo{-?S&0_xxRrDPiMo_:)mW ɬ[?)x6Ҋ?߸YO_eT^"_Go$#r=I8˨ Gj>J.㘰jo ?2~_3v!V%Z|G"ߺI"(2Vh y9gߺSz֔EuEcȕUL4 &9_Ȩ(&jU,s2x9oSb^W?gX UMڢJAVOүRLVI$:#]*UAEܣI 5ځdJPzp[n8B)"ẇү:#4p4 rV8{{$\>^]Gq֊DhbXZ*a[E.4 36)>ҟX Dj~=`1$(t RFEeB遏~')񢫸 WS\dY_w:ȟaqzWª$*EWJj"J]"_&Uqٍ'{'X$U`VjU-^XsSC$]OҿI4V*ISFJ Qiq1e>˪XMG-{wL=]Dg ydWm*orY'J@Աx4zw'F;u/>ODK,Bs \iڧq޺U|SԴFxMHv x4 Dڙu80mB:*7zAO~WX8eM"IBW6_׫y R"Ȋ*pco&fY&Q ?ߺIn$Zի53IP#8zU|̲20 %B.@}"rTA:K]XKV)dMhbQš6o{qo{Jċ Ja[ sƒ)dA!?05Q{ 2֊<,5RrKVz_u*0)+GZxa5Qjy&r}}gC>ZS=U$f:.zmKܟO{V:]r[iW|EWWRr^ih9e0XbrRtt.EjTkygu{\t՞Ʃ/2-<ΛfQ뮜e5Zr>ҿRT1>E[ɛܷ0oىKED#Hn, akjzJIJP!ΠH]{ S]FORk1q !ShX+_{/qJ-=X= VP6[u_;u$kQOYBa'`?8^"g^|q',?Ugpu jybj(FkaiT*?I|kX8Z?8z|<,mV39'_zXWՐ-Zb+aZgs&PsF׿Ԅ'\cvGAi~zΪ$I*|+#hĵ-I8toJ!XKfZխQOMzGiߺKYwK0 |Ա^1H/xKA_Wϥ|-V10eAT*ʷV>ΤỊ ixW|P?"ԅ|H"JhDsOPG7VKޝ}>C*ǮZL=; y#YGŇI?YQD` :_<ʕ `JLj?LK^kC/٥#Q]-ϐ6 XM$18>j|(vp[|j_}Su|YD~8iZ&[o9%㞒_>UU@yUI>7h W=Hh4Oӊq g!)c>z=e#XV kFdXIK$xq(ƯI?YťVGI!=TI8\)_/I 3]R(0'P^#̿m/6-O%c;V%SUP|XiR`'*׿γCPkUQ(H?_d_$b?eU- '`ywL>_:fbP54B%\x@(qu/d6)gY'f ]t~5Sdzұ_%IFE@US㹊3w9u?:?:Y&6hkESRh|pD_}!P i#ǵ,~-RRao@$k>P/^Y)fyu `LJJj?L:W" NawO f\ yOW{_쟟Y0aHBWE^0ǖƘW ~<Z.ԇL\qtE/o+OˬOr%/LtI?u>Rzŕi(Ĕҧ"ŷavȿ?ߩO={_\HCO)( UV{>[oc(~>,}L}!)UXZ?j|O(Vp;mmCީO=4?=dDX+R"vI[M9޿ӿ_]B+L/]V:3|N^_F~~xUPXsZb97!)OI@z; ԡxsYbW{u_"HTf_HȬpGx /*}_WPiq>Ifnя?}JBX-j(s_t,pTۓ>׸GuW\Phj& yS[nL(S"WtbUID08UJg?OֿՏ/#jh4Z yguo?߱׸z /zG_yTٜ;Vfk'_L 0ZTq}_t@8FB:*Ǐҹ$a6دp3ydQiS#j/,`i}&0!Bm,?EB[K8O~ޝu0ZUv-=b dC[]*˛ #?݋"^};|#)Jê]3VPjрJ?hG{׿ҍ-}I~;Co q'*O#W>yb4Qt(EfMNK?z?7Gh(iM$~uz|4 /ZHsK_~}+_qbWAS kΪzӟ̖i !Bim MKCNwt>t_잰y#{ kF䤒I<@o{߳,<\3֊<+7RI#3G*t6hݒjR`j߿Z/G6MF*OUA-"ˢ!U.r~=~_g\]384CXV=_ o=!5wE4K8o=d>;<.=,AޓGDI_.2:_eJy'lrsC[u,z?=c7FBӘ-U;o?]*W'SG(G:oܙi[QÏI?A2լyaȿLqR1?~ߗQ df"ԧ gi~W޿?J !-=XY)[_*aoSjAtϋ_/z p-$, ʢzUK O{W=3XDZ?og()9fJ.Gϥ\?:+[[Q,88Ein*?/+1ajX~RTHSoyH?=' |ޱP[-l-_FG?&qQ`?үg'[ m83Aiy'=a)_W30$sL1 7^Wuy+ElT0fG FOS_?Uk/`׎G@$mdVmFOi?VzIڹ*[䫢A FZUHj\?'{u~y.4M?6Ҵ?):߳+!D4RF#\ ӂD竔I> Yf/$x$jz\D (zj7GڇJcɌE)m%JI3SME}Z'gWxeOG@+THs3B&93~~_zSQHe2-('>\?Szi)+"8>OB?>}%W_˨Dy/4IOָ "Tf/=`"z]XeBbSnEҿ/`-$,gC=]0?*{zG?&A =G 78߽*܏ផ^gQfskyjHB}BXpQ?ֈjw7 Ǥ|?Z!4IܭSnUȱ8e/{^?WX2V@cdQQ6r ZAcvspn[Mwt}$W'uG%O0J׌KtJd WҮ?:֔_"H,UoG')^TI?XW xmy?[i=cڌYJUB.z%:.rrt_}`NegSKz9 q_X 2 Ot}_$WBk#_J$Y'‡`0) 笗2>Ҫ3ŌP54^%\xP(ú-FP\z*_hMVtJk3_Y?߸27]?<:( `?}{_잢WpCA(k *-&m0$YT3P$L//'=}Db3YG_@XGͮ=bM'M-'UdC\_{:U$TK J%Rpj?:>H1!?3o ĞluG0X_2&;qS|z=Gб!4GOOU"DsЗ=?N{JtdqyZ_F~OM%uܚ 35f7>oz$>gԠx\w?I$b='Xy+ElHeJ[8`)?{ 7OpӸL̰Ln+oߺI|/(.\-S}U'/*ˢ!Iܷ{JF@DInT5 h{n+̾(PO=뤿cBʐT:id#F9Gk{V8OuVIOQ!%"^ @4{n\@]{Xd--Qȶ8Lh93K7H c{ xm,{[W]HX)&cs0yğ=#h2~t*AZYIsEģ8bC2~_R| `Ѱcs}hٲS&e@IԀ6m:am?N\ax?gfOSo~_:Se1Q+ii$ZOnDa5oJ~[M|A–A4W-(MςuhҪu!ash15 OwF4ʥ:#Z}u!"5DKk4EͯܯA)Ko?>F<"uTWIOS'"2,{v\@o>_.%D}R՜4pYh,MMFjho׈Dϒ3*ߏ^/_.*[Ec_W.#\Uijy$/<~__\`a:J$Pc%Bջn,O{*W}K> i Z%J  GtR/6zʀ݀S c"^U1L"Fy$SiYxt>3B-t[h#-/YbE 0%|VW_YuU) Ԏ# fF(ᒙ'8HܟRe%$w?KP$\3 ZB~_}\z?=JQj1+~_./M0 #]%.FRWe'5&#n o=׿db +՚Nx5FXMz,J1b+~ڟtgPLrOamX\CyG)Htj/tuo I5E*Jod}_잒|\i/}HܟlfI[O|?SU&IVPIO-9Q$-[n=_tS}>xUQ Z掂Y-|ZQuJ5h ~u) V1\ đZR.]ޟֱs"> ЕHZJlnC]$ 'ëvC65*g|D-(eMs~OuNuB8F .ct8N~t/D -D_~-s lCNGlV]{/8S1^֖s/eC^ .?lD[SAG +3Nr hlʠPߥ܇Ao>|wů.9gBL!y"z0z&P=P̺߾];Jծ(!ѱVSq۪͒3*߳M %E5~bolFg'{/ctъ+2'$X f}]S_W ( ZJ&J y)m/_쟟XBY(K]i0Ԭ~cqkEZeGNF$jBU(ӗAi$)[ ?~]$W'qQ+ *U$_NFDWj?_؈]Hnӊ~|:xE!2!/.b1}Rm% }˥u7B*tդ֤ǿ۔v82~߿^W]c ʢc'ܵLjuUc.* lQү}'6H"#jhQƜ^ֹ?~=RSFq+d3[%/>^}hHC%>WΈMva/Wˤ|?ӅegYuW-0iֿ)?ui˯|Xoznc4q#/, GU_dH$. R!%5l9]s 0prc/}gXZ-jťuu~KggO~\/ 4>&]SC>`(0ې-޺Qg˨w)i-5%DžOT3.lt_8xDef 7-۪g%Qܙ_}{_,_ÿbH丂TL,d}*gϨ>QUG2݅7D@P[߸SX6Ahi Z% Zl}Jn|4#߸t§bGcLsјܱәdOEMdkO?d+V3ƙ MIOhW&J|mΘMv~t)42?ъe!ZPVa8-z~]xVz +\W3G)D>7q_n=$W_X 8\5BEKAlBI7OW 9nVO*uG vׄAb=|H"O34ch9LIڃ KN_>yu2zK3;PCģ~)`!=P̺ߺSQ̄ ~H&O-*m3F͒;*Lty NJB5E44Qɱ%9,Eo~JN?/|iTb,ZtEb)- f+5tBkD4!t՞ tYiüZWVCQkVE[1_Ƌ ߺGao򅨌=-{Rfaa?fߺOESϨf25yfit Zr, mRA](W]` &eR;d_&§֋U8 _t$K1i-%7E,% +)_PxF|ʲ1yLѳd<3"ߺID(mID&jvn<}ϺPk?oCfa! ٕCKl!5n4忮z5DPRFMZdK_-}䦹R-#ߺKN[H$c1%sAyđ G]L?ߺUPLC!"ցdmD1 ~7jQtI֪AS/#*®O&܇,Gt_u:dhX&lE?mk,߄>{_uf*`1ӊy򇎑ZmE)lf]_uϔ,_52q1%\qPÌTt?zWQ4z^JqE8AjvHEK?3MKRimJy(1L YZR$ zV> +$9PKI$ѵܢ.O{gAR[zxmgC?A`ߍ^_}LH`$9Y #-7 *KfgڦyP1VPG :Rc$?ߺg4?Ԥz,7}8Qaב]7_]^/SI!S˶b֣Wifz~ +OԵ' ( .hT~ڶDEpVen${It%*]5pQ#Tkү.G0yoUV+7# )O5_{IX"IR *#SuYZɤ GLpIPl_щ*|T_ۑt>^]2HWD C k/JRΨy Tm4356_TXxtq'EHOGLPz*>9VQ7)>ҳS#WD Y^O%e2xpf?Q_ͽW*bHXWK%jH]fIfk!7#~W=g"dzsrGpߐ= LjAf:+mݳ8'#?_>oԕSLxR;Y^ZyQޫy_oH_G+V׍E/)ݒ _K@3.?2Һcd$ub 0~OozW?eNuJt1|̷)*O/So_u!} Y~\D1e!fȿN4>_|bPEǢx2}(Pcٌ}XR"/OLˮZ,=4D(I+Gt?2ۡ,?3H5?~m]*WDQ"ґ*dVx1uA[_잳-Tu$TKW/+"~[RG5zIW8P ]V +X.VTHO(_}ϥ~cR'"iق&U|T_ۑt>_}gYA +I#oЦ)4QSP=C޿JZ/#HbhcjiԸqxB5Y _ˮAZ:?ʺ|Sv8=w.EDtMLt3Gѕˮpf?Q_ͽՎ_> K6!";ң~řGMMzm1LU騖Hn|Opߐ=JzΊ"U'5!*n[/ڿԏzg_WEeg5R:]E^c/>iq#6 oJ/f_ѵhG s5S#_ϯuڔ@aQDB}ʑȸ9%{?~p4QSΖ= 8yfjWͣO_.ԔGV:X5*n_=^}zdb4]P2 .,ٚyZw1ZWDy{r9{=%zH UT~)O?VVSߥ*=={_ofP*9%s" KuXS(0 7~^:r-R*-GPse y4ب"'޺K $FW-] ^H#*Osyb0C;S#6>7>NE?0^,WK5FqB0G1yr߿/ztED)Jx$]uĵ{~+G_?,č]-|K^H+OW7"7#~?c%ء_Z5TUg@stgI)t@A D_ˤdV41*m"[lEԏ{:OU]ax%f7RR!۔/#ް:WO#}+&2G=rA`ߋ[/}Ie,eeY)34&f>]4HkqAy?Fmpnp?k׿B6m@@bUQ+Nl,%쓋>ҿ>}e"Fx? tʛ^'tL SOe J̱JZ,=,[9TDUCrW˭/PhZd5Wd͙kP޺UOϮqiZBd2S=ïuRԥI)IS/-"~cIP I5_}?ռްZkPM$A4l,g:?: p̕s)rN'U4"؟W>]x>I^foi Vc PʑfO^W@>O+HѫA+ҫJ3J|G`O>LJߗI\ n#*|ScSrg$-*FgYSTKUkWG-'XFBF:J,mfI^W_\D1{ՎO\‚#*"gf_5@–?Dߐ=o_잹%X5Jm8cy$?3;yUP [NvnUKHFhߩ"0뒯_M2;<\tC L?N~5{_gY,^59ɦ)шl%? _\-4aL6YREߺp*SV) RH(UF#mXud\>_>}b$E2%(g툜qGNZԑ}?=vQӤG@Ա4Ly*Fm]{ $*( SY5j_٦?6z#- F:Ѧ:,9 Jx?1ߺWO\MC+Mȟ\c=B~ ƿʏlE>:m7+Es* 9@xTH?a`WϤ_zKmeC Y֜-q82bvH>Z/HUJҳ>JV_ 0r@dî\Et452RQDÜN E3-X`|V) 8,?y7)>_I?2Ck,TMMC:Xy/)]Q-^~=Z_~}E*4I r#$mfIZW[~FA?}d7R_U|S*u93~O"yWZW'5X֠ՓUUKhhGO A錟WG:I_?.YA('.Fhv+>|J^JZnjiDꈿO4(T=!Jpmn$ 1j揆b04:޼U?us3Ȳke[B3h4M/>ǤoC-y jFMQa2W?@.ו?:R5 il%GOK7gjA)'ߺS_B DfH5MlqVeMH'Y-?/*"S] 5y$ -345FFډ_>g;zbFVA `Йwr5?#~ң󞱵RjV_ VY떬Ixv"_{O}u̥jZʞhJ6 O$b`h߀}_gZWXܖSP*-I:ӗl_щ 6&+~A?*?!40ydBKWCQk40ӶTG~Yq\\FHij_#RFf|ي2_~zo__>3J_B?e_6JUh<:t6C:Xg9]as}sI2J:J>g_ѵ"R}s_^W z)J+NB[>JSvUBAd`nSޕ$T&#SN=2B4e2\KW+m~=t}E%t& ttVjDcYy%yzpZqe&)nW7>{/D {JOQ5X֠*"<ۨ":wXO?G_oϬ <@YkVľ'i$3Ehүw"{J]) 禈󎧊R`ߍ^O^H61o$r%_ՎhDIu ^׿Q3Βa)3xLR+_~V8GFZ Rδ*ҿy|2cD!#C]%|6>ŘV_=蘭g,?++z+;:ܙRE耂޺UzT>9&42>_8 oKmW}$@+$dy"'-RQm?tՎ9+տ}"ӵT!5n "lx8H?ݒ +~/{R*LRDƼM^˧``q鮾OW˨lL򤡘c䭡1;'ڸxLc87>zU:F ` hP+FlXK_%{Iz2iM4f잠EOn?1Ug >ƫs}*^jŪSE$IchnQjQW>׺ήL,r(䨢yFHihaKe>/:#+/Qs]UQHo"q-+WJѳ+EKUE&(oр!U&ɀu_ҔmA G$)cac]۟R~=u% CJ#FK:3F\<#ߺUƶ)ptCÖe9 &%W=INΥ+uI$r*PM1?Σфc޹P` / =k&S{Iԑ!K~(s.&'8 t:j-$O>Һ #BJ㠒H1K-& 7+BQjGnt_{/RY,j(;O߉NK/of6/^pWzT(5CV5@מx`W܏=g*iFj띣~řP%np}`FV~TH*R[BsV$1}"O>ׇud/ijU20i& W~/z?p3jdZwzxch@Zvnj_N>Ҿ?V:V.*aE%E#ȟn`њC$@oGߺK_ucFYԋvR */Qk0y%he=,= *3o^׿TF]tRX>v;M695y?,ߺK)hLof6F3rj2hen }*H\~}gE#C^45V$oո̱H'KoD$?%W=gXFP;_$SK4b~OGt_&%X" Ͼa22Ƌ$Ad'hW?Rk"jeC[3H=9۔_ڵC$u!YfƐTZӧ72L\ld48ؿݒ޸p_GԏP N#oP+,kCHvLP_޿/gG V8 "-+P*Lx0|}YSmCn"ҨIg O9&H%U{W:ca?&4MJe߅\_,mr{?_/z1G1h|~t^V넒GV:WVOY .W|PVyW7fW4tD'zKOR(tHKQ/x~\hc4 /)﷥^uu;N ˯w-DZ`}~@_Y+9i*w;SG$5)ڱЋ۴gH-|K|*Hg"Y$Y"o`њC_ە@O}+HFLlYTpʐx__uFI3ĢJ[K-m*P6I뛋~޽YBxpf#}my9Z|sk?޿ҿ/zΎ`H3<\8ϒGUN~!zK\?,kLQEIXRXhǯqeYbq>Fa!$=cHcū Zǒ*ow+y" uDzWWK~tBY)$DYlMJ?|zI_:΃X EjUJ  !>ݣޏ u}u :^G~햅h5:N>@}Һ:5Wr}GXLko:?8/eFW8*I+(fLD'1y5'vKT}>]{:+!@@iC\X FQ* g㓣G祟+$@io3FgvOm9,i9YzK~}s 4i1Ǣ&N9Z_\FO~z)0RD򫱮*_׸s27{_=g, X&*'ƞV/S Qȥg`8f#vEmPRo[үݺg %YkS"#We&A*, ܢԞ_}?},Wf\"j-I-E!ő0 GO@~^:PT : c)8G@"_:[ŮI$QC%]%%o6I`WWpW|ʩQf)!EJmy?M>9,|̄Dh՞)C8OGF°b=^Y8bč[iY`F{,|I6ޏY š]W@$S^ܲ b&LMԏzWggh q::ܒ'dcp؇?ïcyjVPm5=nZxZB隟mj߼^?\ ?r‚J@f_ӄD!C׿cyK71UaXF!?B?ןigfifZsJk%et'o7/Q쩵O>_oYu*hCFDߥhJ$iU27G=s !f_C4_q!RNK/oVf6Oͽ׫O?*-P q j :F߯?@ވI:]?/OYnO0d1UO2^ D&O~'>_O\ЙW'[@rSrX)0o?.P9rO-B[UK3 L'Sүw.V2,IO_?^:BӘv޿׿ιW$pG$ZR<_рFIPn[-yYte (8Sab"wζWtoy$:WJB 8[ Nlnk ?ꏿq׾|?|"WRa1H*o1ca&9[I?c2j$ Y@Эr=pUXc8J!LQF߯pD|Bo{/"4UV˦w,x/MOoڍo=Ґ"AUγ,S,h7$&/(tgu@ ֭\m<i$%Z`߀}_?zco?u& "TZa1$4ؿݒS/|lMvV:U<_C<&_cw)yu4i^E"aat,^SkuW>_oX4$tQZI0) :"T瓣k?ue,i3Qo/ry$}r1m|ǤxWB4(҆ zi{6b {!X g]tTU2ŚԘunΕ;$`խA6bJoW++~0O.\~ߗQجTZrS 0b(ƋPr g'& kJ#D:;CQWUv~B=Y_ ~}EfX( !XQqeD>JQ!${W#W'Bdp]ұyY/2h1AdAb *~I&%{JgX[J27-S,ޕ`߀}q':#y5 qBT4F&Cc˯q˨XmQ76&S~/??qW`wJJ5YWOfvT~׊</=p*ar$j8S$('ґN㩷:?{V? "~ZXFc4¿9Wn#k~W/cB qpՑS[^7{:?S=!&Usʿqfdyԥ bäd^FY2%\/%0l aO ?zUdžO~gV_FUZԻj0TA_=u$KQ H+s'ЍE}:_}c2K$E'ܰHF_roOү:$dyuSZu1 ! VH_[߿I?i$QKUCiib4`p'[Wqo`uiJCC G5 )Zlk,ks'Ү/}>#Hh:3~]LvzB=?1R 1Q:J’E~Ö")) 'O{˥T?'?в2jqXWnGf7=g lՊSh7mY\,r,%{I%j+P55nZtej}G,~:S|쯪GjShQM IJO}_oˬ {+}bZ6~ )ƞ?r~}rLAK%f=RtFyL:4qdT}ҿ/~αhCF5Kh|jMzGOâ3_zTt,k]4tA*½9$XVW$ʒ%a?{^W]G ?":@ae%dm;z`I?X݄iO0jCc"/#Pb@?]+3e/ƒcW?bo2C{'⺏$K;NJ#{ tZ5Z?rړOtұA%QK-&$455H!XticMQi%K7f?mzU=|qG qᆮƝco׸sf5l؈GֺWRPO[#EW<}{3# P!<7~/ :Q_t~*f/%0- Fof.|Oo)6e-JUKGO{7:%WbUDG:!ݣԾ_}'ҰvwEVZ#E+6 0@Ou9WH]1;TC0=-OtWˬ ̌JIkE-U1Yi?oRYMod~W3adjr ۴rXgk-~Y?`jo!HZSF-"IZui%pzmJ\T4̏IL=M,~:wӁF)DoGߺY(P@b#ӈ۪gVjviX^`C=1K-1Z[F+w= Jՠ14xp)`5[7WIh=GUzʀDHдa!XUco$R]Qc{`WmQR/|巋2ߐ=_. B"2"kV2M NkFI%W'KkˁVTTeJnb ?]+W_\J%wgBF@l' [>/\C2QLu1qŁ }t~ TxvKjyh1V", bp+4}+}W}cڔ"U%JU*f-H& TmȦT` W\GߺWԍ+-0k< pk̑,y,؍6&~B}r>BM#Hl-?eA],2:04H31uAۤ'SOԕM\Yꄖa9j̙[eX-_z]?. E汪Ug{O: 8O {_u!qS,pLʭYz:Í_.G$$u0=M~ JCQ D,Qzm2Lݕ@OI~)aJ[VIAjpSԏL^ҿ64ƍM;<8q%n9P/{^W}fFU$"4GV6L@#)jmi ?_.4IQrᢥ2^m2ߐ=CY(FeZT@da~.8?R!rژAZP>֣)"6l=j# :Yu 8@CQ+tG}/1yioސ:Ԉs-ARN*1;R`<=Aҭ'~]$V:̮QT GXY:ViP?zW:,~F`SFLH6щ۪ &"ʤ~__gYVeI))(W Y ?^WWK?R#QZoS΢X0£WC,y,ѤeG_};عCW#w9㖟rS$5b6W192Tt_gu_iDR#8* "L?0[߈^WY,_ Qδ,o/ҽ)#&hR߾ޕ?=g:V-q܌d-7 ~c47O\w/ά)JMx ~!:]W_u(>R\Vri2zmz7ۚ=Oꍬۅ~]e[jjjZga5!qyߏIu1T6F52G6!x$q{ze:Zu_|ir zHU3,_L%<u$"7ᏽPW\ˬ!")EaVIwԪ_z̈ee?dS"639b0ƌյB~_޾ޓq?n>Cs id 4*XV?]Cx-zWDlUQ)~"8`\%Hn Cҿ/󞳂a4dWۗLq}bk~>[}:KOT]Dg־Ds$ěUGGs#|.OSf3g)"?(`S`P[~z?t_o+0= }16/C{ggqRc_0Kj~_=d$ů}HH9RjNe ~=?>#+-xR|b8 =o5,BH[,k2emWsgQ5o=N?^L][U"T817:g(PQ?7cT"fYK4Q@&41Oc~/ǿtgIyJ>%3z85S,_CN DCԐꏿuoWG FZub?v}*qLJ[W)SQ&dMF8 baNjdDVy﷥\=rf0(.hUGW8wP+~=oV|7/)rH#\Hd1m'?\  Pfq"4A[rD#j[:o~}h_Y12k]"fӪFIߔ_ziMZ>֭KY>??kD2ۅW~_ oK"gHgb4巤~J:5T&ZPi+Dbqq& ߂}U˨̅$yjh.LUD;tҠ>`tՖц|VӈʰdO5/E>4!4I50|4l R5'*+{9? *DI?7]cQ3+/R 4FOM1ZKuF _]{_o+cb$ gKd?XOx*m[zA0`2OCRVR"\ ʃ[~I?uɮ%VzhZUK0x^P~}4Wt?oiFJN'o(jWPO{J?3 b4*MM>T)=Wk<#?jtX)ҔPqO:` ^@œMY:}g.Z-\'5Kr4 ܺ%te {J#E|#:(HN}}_aѭc%A4չ2*1sG|Q[p1=>c XQia^eHd%HWo{WIh=G'&ܔBM I{7)IinBAeϿ+RD#((}+7 TLFw8 =xuZBXT~}mw\bjAV?KI=G7;HzFj!xE3?YT~:Q:n-@S gă1;yD'R~[OIQ$TI!jqPoL2OpU VDBn-< #1RS{9wv8?fvoG+!chSI=4S6*? u?uwYa*Ԥ^KAOB&XV'\z*)>y9jn#K5?Iw=BOX`i|a0WߺV?V$O.jبN]ŖVJo %W=H :+V 3"5,1(/QzC~yW+y:c K~t*& Di 'ߺMVreW)F4r}\Z%>0ߺU\dyFeу#A3Qz}fiXsHk;*H۟c?s7ߒ=J ]@ԑ4jg,M6_ԅM"ZCHif8H"dޏIzЭ¼ܷk-{_y4"JP^hKd>1!fs0~7=IKHyVS0yҠ!^ȴo@?ͥJU1-jBlbc-.١dzW˩"{*>30ӣRa)ޕ?&W}Z2O+SotF1)u^Z~E֭I$V/4^T@)v?=(M|̷kqY.:zcADe'_H߫Lt?u#!"O β\<<-E% _zRU)T S0"o{KR:kf`(e3QXC6(rSfz_\44EK1k'ECdfM0 ^/pZ@QUL+,EL|}vIa\.ҧG$s2v9L:U+_.=Hc% l ,m{p`sut_잹đyuJ,IK_qec+-7? Ri1Xw9'E6nhA?D,\:Wy?upoWqO<֝!^?:?:̲3P(ޢ-5u>LXZk8o~`|#4 暈iak mPJqa,WhE}5 iNVdU'ޫO}gYQ7c4T HDƓ O'9*ݕGJX?=gD ()>=jT:0Qk-Z&ZUgzUįU]/Vcr59oL-~T־_DbX;=X4dKp1ԘzΧȪj[E0UAʈ.ާu߿ҿ_: ?[(V=gk"?5-&סK t`u7Vodayz%=d{{u:FVZWNEP~_H,&5Zމ ?m_t${?ǭ])w(hidY1qa^Z_u@ #~פ>_Y44J4JD8ȅVvH50YSJ0R/دbscSYBU޺WOsԄ.=#š U?ݗ0RKIracu/=rP$1ı뮆 bչ33Jl0{}׿:@5T yү}gϮ@$IQj?e7^ɳi߿['=ft#RX '\|/Y ҳ7)5-tz|ZU񆫦 f7(iii0+pW=fEYbXs9zԤ4d?VJcqm_>gtg5duM C1N)v=m=(W_땄$IXՒ3<_ fJ]C[?:.ȖɁ\.J'|Jyu+goz{X:/3&iRIZ '%v/D{WD 4IOQJQ6)> O#~WJ|>` J2Ue4Pr!U*?ݒr>CH[ QBtvIGp9oˮ^WY)wO*T$*~_\Ҥ-ZMj7GUXŅ $ ߆>ئ~ޫOA`umQ5pXG,Dh J"٨ԯuT ߛ{YF"Xb4ՋKPDd&9-j[O{^VM񆫥"?f76i0}=P"XZ:P&QYLs5.78J߸Oˬ$yJuh*'־RmZzP/}*WuLM?qYf4&ס^u 8ey3Gn#TFJ/7O~ϗX݃ϭZ$Q<*vc=={՞XvBY原HI^\;|I8'!7a}=gC$wPZj]1e UY VbotPL==hJPUL^Y(10?Ҋ['ݍI8|XLnJhs]c9\n%~@ҟ={"xM]2ճjtk7H!Q߳ rJ)]ecXWAEtVn<̌ҷI~\:IOŀU5`sQ5$v~g oڇӫu}o˨|\B2,&ܒGqё<ˎQh!å\~uu" dE%MVaqHCp{RT:Iᓋ& 24?e~X{XI5!4YVgDLf7j->t_gfԫJ,hk?ʷLo~'xx.i ,mR. q-fjaf \=>oX iiV<Uܺ,ZүzdµbJ2n]Ø3RI?uXM^<ՉR|GW-2XE~m=(_oG}U zՒ[#!aUB}QO2Qmz_HNqSR+$q;FOBXj{d?}_gI?.E2#J\$(q!}_1yy'W_` ҳK = %?'L d&̷#߿J+MЊuMJQ>)$.%R'jL~_INNSf 12D*LY$0~/c= K+Hu_UX\n*K0cץG+HBze.)s{*20=$z8XW/\+NEDXFy!Ӥ?BTi0uӄ6߆_.LlMHAPV32o"Dm;Ң&77(X_V_zQ6c4T L5ԘhVB){OWz%Hj@j֖uFV^AY-O>- U|Tq,Oy_잢i@իG]*i:wbSƗGIR c/_TPj[@VefCE8~/qֿQؙղj1gjF"O2z~J|QZ`!:hp5B=6{':򫕤W%oQ@GCp *Wa"ӔOXpPNFol}#ߺI"Yy Xjd ǧ [U5^Jot7E}D4"4&%10=i!SgvH58Wz AB<̳ j~:O{'zbVEbCL܎IQ ~W=D)$KZ(,+-1?a$_t_=`aC jϹ$Ks>8!|  U|ר \+Dܒn:ID6;D?QC~ =F`drezVֿpX4S ?[)1HX ,#j!GpX3^ _:/_]}1)_ZjoVȰU?h~X\Z5FcWM~E{~,yftߧ|d"3UJ.NE>×3R3>_ȼyc>@έ ^ZT'S]ON_.HLV8`fO 2RHƯ~W;&Z" 9 R]×e?}蘭z)GwZ$AQ+rWo` ?co~QW[/]DVDW;w 3j~LPdMKCZErPY/2&Lwڨq4}TT*a{˥}I<,BKSʂZL4/BrT~MkzGSU|ˌOgwyW]5f.@z:1JxxPOOt:T*$TVNEy ejm.~/Ig>Z@ӤadJEt]+WR 2R*%JI7%ɿq;sT}tޝ_߱_u6]`h^ ӷqS~95FZ)|hlVB*s$#ozd kP٧az[#@~O_gR4:}4#c(Pk]b{_T~=ץWϬDj<: =g3H5D 7?>:IԤA0U?H91p{K?H>D JV| <2-_4NKqT_._!Jի1Nf840 QI&ʧ}ү}u(Ct+Kd8LMizG>׿R8,ڝi'Ehl_~/ŧiYeZ%ptL?LvA ozҿԥP4N56 [nݜ~}_t_킾4yvpK{Q39ozc>g1)By<x\q)-fʂ? {^|޳@OZtjVB%ŧgMt%W'H %mJ{p0EX'^ԅ>UD 5ZT2CPOU?woA닀I?Y#3"K>6U_e '߾],VPji.NKzq;pt_zoϗYC-igt*WLT~52MCryb"Tnjf~G_./)+>*M:K_PbרyJiZl q: O^u!ERO, &Aᡃ*r߂}Wfg ,p5mY9{_Ԁ"*P:peSb?QozJzζ|KM+ BUx5h~&?5:7C(peD?ĪT*A(gAQ#|ˋ_jٿ1U=fb_2UYy `$_߿_z·ZUIG [Y9sHӫ?qp~qU?.+!fZ OO(0T_Ӥ7z__RKH)I2\rHq>뚲K.S ! -۸x3/ /凿^Whڞ!Llq("dz_ϐzoc,PJv,?̕P?Pb{ޒԈ`DtM -Ayh??rߵ*›:WϮh9XV;VIt/Hsn3TJ05)Sd)l{^UOn;b%W'KgzdJzҾ?au=e4RA*r0~ ?PttpO}%W.ZMO֒FYdLAᡀWw`uCG% dH(ӷq1^I /_XFI*Sai,[F#Z?K/տ>ϟY5f4H3θqi޳q SZ}蘭c0zE*5MIVW?fU?ѧE:L׹xQ]7#p? {J|Y"B4X+)㬿n=YƜ*V>EMX̐U;AU><:=>ݦu?}˯?γ 2f '@./ h0W2F_ܸ[;%Bә#''qp4" akpWz. i*5A-eFxC}6%ig_?}17:F4^}1X!S/,?${!)o$ڇv!oE#6[޼՟:YOY4$8~5G,t*w4~@_:VOϮKb5I[ BDg=L 7?>?IGzȪ?o@yUSVsqi?8o{_o%Y}fͺ<;m\GH?iyZ}uBʺ̒VSh5D#NZbI>OuVEH e+Ć/H_WϭY.`n)fJK+\Z;>{TM鈓oXB|h+O䬂*R|" `kSuTz$R|LNNd|djmO닀^?.-߸fXsn9>!ƒE4_޺0!U,sE%'pp}tޛ >]a, M >=Q(;sqX{gCz~~ט\#?3=-I.HZGNX{{_tW]^Xv {^=,jNG?7!~m_o6hJiXhZxjt-< 7 ޿OЊj(F@9s;27?>ZW'zWPrՐ}twac<_=_(LT__ٷOBieڗoS{_}{]~GZOϥuC侻 Q\bC<$_+cǯqW.yEQ,Ɯ* ?S~ `uG$Ze(Uϧoba&u#P@zuCn@_dӗN?eaKYvH 0߿=*gϬ$Ak5Q`OO^f[T׳1ѽ,~uVjLZxUH"%4GǬ-8QEr^X~H?ˤW*mZݨ\ @S[GW˭IK,XOjLb~e1S? n`X_=F!RdYK?_uihH(Uyę:*WaehK(U4cxO Qbxֳ?Qja_>94X;x|3HX'Q33n:DߺgDM@2RTIIlYHjGTq߿ҬѣH:\)]!c~&{UWO==$' !_Vi&&n&`Ot_잰 =bHߝn~տDnŖO0F(GA8\\ =@*~{zIìя$t",e7c#J7_.^%.\SWB krzU{I}>E 0+ۜ" 9:zx^+W_Y(VHPRCY#CVњm,$XkO`߀}êCSԋM~Oo"? P{Q3oAoڏЭWWYTp =-~WE;kAn_?}_]>GwT[^F4"\D#)\{5N),$4bV4.ʴKp?,=5? dI1hUEy1Έ"κX[ީ^Y :fL QMii*/3 7E㤿Wϩ :e`#Ϟ<$E!*-!Q+'=dGJOLHcQ\f? {qW:K"'chӜNOOf?ԏ~?Wz=H_rQEy)Y7ABGE_:WdGdJECTor K3 j1[?,$UǒK+SWeʒƀS&ԧ/R>߿JKFa9-M qP# ~2W  ]+/}eYnXElbڰTFaM_:j aϽԘ݉Y|H'P<as ـbG|zʣxD{e+WB[K߾+x \@iXI L'O-fOQ_Wˤ>ߟY" t̰Weg HU׸)BL`K&MWCY?Fgq4,cB__i.SQ*ʉEb~_j GV߇I?sH]VR6zZ[z(޸k_oJ%:ޣdKBŸM/_1ҿuHicGDAvl&ʀlä`QEC񨇌.f@~X{xVE*VL QMii*/1Z7Aozt_}eU`i^TGI!ku_U֟aYU]e▻'WH?ԏz=~oϬ@?W:e)*bߺחi0XJQ^dgsotZs toS_`ĚUI R.~ED f ~^߀}~guVyBԵbPLh=sO_>iiYNj,|C`pؔ>g) |>]r@7b5!?f" s/H׿ !B+K9\<y0 WG_g|S:%|H-.[EG[6׸Ot%4"i'̃Z&9Up_߿Ya ,,S+NwqK?3}~_JdY,CY!Zn6x䊂T,>__=s+Y)fOFL}T#2Qb OԀ*W/^V, )KS ] e2q?z=!ޔuj8>9,?&AV֋P߳}'>Z9Ӽ@ӊ?)q*VqjaS/QUV8VE~"[?y?߉7٣J3 iz-;qYUBjG̋Qx_>tҚhˀFs+_Ss.O?R/{Weff߆ߵ[~=?}u:9*R&z\[Oz6=J,y׿Xdc!2H:O_`uW2KTÎG /fgI>|ް0hB u"c[i.Wo{VzO~czEXSby\0fN/s0_g+XE!fi5S) )L2D23zI_1YtVLbg5̳㩯0d~^W'. _<]/ef?n1[~W<:8yV&zZ!#N8 &Ԁ[҄~}꥾uHZVwaxW=/}z -)LWqYXM^{!oDViWϬe A ±JjWex| ;COc׿81!~'nD0> 8^]*W' @њS x*;" H(Q]U>N_.5U_$ʕ6mHT?}˥Gcd$TMGap%b!&QA. U^|AV ~+3NM 2Jjp4Nxo'bfbRC2R-5pcYqp}nl1_Wr mT?m~0 dq un4+?g_/zm"&VB$v`-y*wi׭u HbTf`?]_ rn?k~ޕpW=G#@Ye_R3[do>O?/?iXk"Cn~. 56 ~~ogWJrJbwʲюjSGizT t_ocTqJ/ג@pxSi~H{=k\:r.JcvJ%-M:D9ml &哎W_#҂Z0c pE: o{'a:gq<FÜU-0d3/{:U_Ϩ4hU*UqC 2+.ۆI?/O7\ÍgrxNtFo"iGusFb"x+]Z:6que*6JNPS*W'ޫj%X(Y$#`{/t_}G5?ZT<5Hc0[+qkuzĆz:$!Z,qI #!P _.H_#35A䖌p!bP MP{ҿ7rU] 94QuKl&^HWΗ~g:KXie .pظy57`~'GQ#U/5.0E %nFbzGh*œRxZW2 Ik2MvO卵:!X"+N`CRxdd&iyYm!VHUkOњm,,xB&~_&aQ"V+P1x@ ߋߺ~Q,ZP5Jc6=oJ?!yF5$^J5<o"{IzĹ%)dI(8 @]X{J Y AL a!.T3W\/Ө`?-ǽQ˕eeQMgaY&vH2m(W}Gd*Z8$)_$r,2&GqTf6- SV`i<^6I" *r GCw__> B|K^4tM grӼSU!bߺU^bUFD_ T''p/Йem0[UC %*^9e?MFvrSߺWԨOбQ!C_Q k׺У) ѽI2"}Y,‰YG^ĖґC6[5X2BS[5//?JO=g+X+:⩝93+Ç _z/R4ZkeyF+h^?M,$~YWϩ Ab'Z7XIqL&]Kz[IH;0$RUЀ$cӂ@MGN`.ߓ*WPJRwcA~WgU-*a%jjT4]Iaeo&cI Tm4ԍ&"6챔'}_~]IPEHh=2S?c  8ߺg$ҵ*-VRYƤ g/,{I?Ԑ dQFtł@}Trx gRKg@O(ڑ ,. ?WjE7#=_oYKhHW 5X2B>\Ծ,JOt_잤5VWMiIgo:Xo@k{WIUe/\kKHҿ?0f.4RL1Ac#C7~m#߁/d:R4b)=QcROӅ* g?ݒؘ>׿e2B4mD|z<࢓TN`+Yܯ{J@>/jd?Y3MߺK>詪$Mse߷LH}u󞳢iGztQP~zM[H+W'ପ/](*~ȂZo(^^ԾU>PMX!=nZGq4ki2~O.cMwy&m=8D7ܠ]'޸=+W2i+EQLOkc7Gc`uNϭ4ȴSIFGΜ.@=mJn}}^H4*!L4F:so'{3_g*/B,PK&݊U*FG=SCr?ߏ=o8Sԅ&2$Y'4xjG,`;7Wˤ>ߟ^ED[# sK˗?%QsԈƢC0v5 cgotv9St_잲tǠU HۖXlq1u~W}%uu@U+ц@}h>m~XY[_ϯqW:Y\TKR1s&LB5DK}'߾]+W.&hJ(INE=znHޏzgq玙h&>/>O7d:KϮ4Qxo ŨEn7#{[WRHi( ?VK2{VfM޸*Wqʑ5*j"ٹ|6Y) lHj@JdֿYgW7 ~/`tWkZzYXUsZ M4?}o.2nMYb۔O޿K?ϗ\fe5PWD|"ciݓK~Oy9W:}HhХ3maxr#}o+~)xCij6-?ӱ('/s ӢwA/EOzSh#ߩ|?hc1R~o}`RUO ~Ӆ?=gSeejGj*6w?g%!DT1GGV Oչ23y2USߺY=p_Nں/SVkt:?OߺIOˬVM/yXĹ\yKr'ߺ~C]֑uG+ǦJkm+/>^;<4(e~.>39ZG^Z;olR}kR?OΐQ=!h3ÂOQf~~n=W]$^- )-j_ oJH{_=b#PV9WcYudί\ a'ש֭ aWQa'zI_\OR4nޞ/SRbMOr pgc>I*PWDc`pcݒOߟJ2c/HƊWom!-)=)_VXOQ%<_yҞ$wՒt~/)/G Krj%k4*4#rE_{V?%??R}n ozF1ho ?bi'_׿˨{ftHQO-a&O-$?M_qQWXC%)DzrZ.>=3_ۘOX螊4b Á@}TG-f~G{Z'gdNJT2$ȸEՓ̯չz"?=_g=GDd4Հ#[LYn[=&އ^gbtPuppGZLu灙^,E06suͦi+x\ֆoS` !tuW#F r0~\S.ݤ=-}qWɭa+OZ `>Sr'߼I:!(΅LLhhvӶ0o}JSD{1W :ITSDŧpwN5gta9wi#V)'GOя&mWWZ3̉ TgSIP&< ZH6 ~+_gW=G$$ԍNtQʫMjY{O]!~YeI$r\6aɒ9 (zWOXt58XK_{$ W kǔNӕFN&SOuWwc^("R =`ܨy50{$2R52-U^Z|jK09jO7h>Ov6Ӧ*'D"0xpP9<$Vn I]*WXG?ze\"Gՙz"?=爛}`+m+0XEMYy"(-r0Yet~_!cev⩝9gW~XtڷY]zGsWZ O,$å_zp0?sV*hXIUC1n'MI{?K_{]Gy5ky%yC%ek匝8,D?ovL=G}G%Q!Jgzr#ߺUs.JC3FQх ; 9)Ͽt_]`EJ/UJAzL5<ю6ۋ{QWzSEb@S?ߊW4 #u${^ ^ rIJ e}ōZO-,ۃ%ا{I:F1W?RG'yɒuӓez=*W=aӨzu0w5 c@=Yң*/zT=_]%!"eՑESU奇f2PR;?tT%lB%E<ȩܕ_{*cPk"K&%$y˗O _^DoDl tc HȈ=*H-5VhYK畢 ]KRyBZiyW&zx^C0qJk#?n=HPeYnY|3n)8 cvJ_C.bi!"_N۟_%WIYT]A(jZ`$H+Ԁ|a+LrFQ e6!aCnaGt_gY/ Yh>5]&SOewP$3TQzXXZ\?>ҿԕ"bc,S~//W[0,SߺE0mkOD^'/頤_MrF cJД-I~/%W]Hx$H_XBѼQm//_~YW,ɮJ5ڮ=5 c8"bT1߿?'}^]zcu%dyc+UU$ K60'߀_?u;QQGvX4^bZ\~}_XS9i(( u}vrS߸yU:b˜P/n8U(GFo=,BiW_/P涊YIYӦ5S^*jɉCvfVJ ޺WWzزk5 M2NHNd!ĢI⤮E,p[rf咢V9lY9?uzʊeʭVEIC&nhU~Y S/c?oˬ-gH_ۂXHp /^_?:ή3T'GS?N ugRf::i&z nhJHrG߾}+HFG,eVoх$0f*0գo{I?|ϬіjdHĉwS?2]ݗ{ח[_gBS(SUoc?*>==+WY!=@jEEnVi[t_잲DP" |tu YIui ?zïui֥S4Z ĐoS~@JR@[Hѿ/ LQ7/ }gˮjAթ$GHF #!60'ߏ^Ww(j Z'ma?Ҡ]߿ҿ:̖7+@G,1 (zrE=_}!-J(䅄nC!5Q쑮czΈRFCz*jz{qc|>_g*S^*Z sUuxzCzʬ/KCȫJS̹)S(1#IO\kTDs_|)[7#+EGoǽpdˡVZi!Eɛ/_CN OJ/*UhdINeSF8v'Վ:?:H|ijT%h +O?'}˯?p.\7@E3i<%%k=+WjLa:Ѫ%.!C_QOϽ{|ޤ c4kt _ON'=vdEEj8Oտr~JF3bg=_o^WYSǦ SHOwI8i__`tqW=d@ D*>:,NOOYYKJi~/_`u}3u*VjYFh3$\O>P{~=*:L3?~]s_~$hZ/ L#IR~_߿u}05Fi'C411O Nj'iJ/\T;I4Q "Z?U2NKJv{W=o_PkRRӑ"VKL4o+T#>",),Z" H>7S ~}ۏIx~_jдK4Bb$Sm5DFFޥ׸|P#T%#Jg3.ZsQ'zϗ("f6S[UX?f7 6##ߺWO^5N!&B]([5)VD׿2"2EQ g2` M~=xgoˬ\ :hw@pRPYlZ0닰xZFH\-DS)ݓ>׸|3ʨJ)di#m'Wotܕ^WtHY'hRI."f*7Gү/=pA.5tJ,M4X|-{g&"?X,bjV/H>A٧G>tC\EG ps{ 1uO{z[DK o#0S1Vbe\\?^Iٺ1G'zCb#ZIbaS*jDIJO~?ֿ?;(ƈ"#Js259*BxW_oQ*u5}Ix)ا6?GgI?XbIód!Y6JgF?p){zzW5ZՖ)$Q٢Y )${Gү?'E+%XyBpc΍~}tuGY9gڌF!$L-Vzd{O!b U>Ih$aWǯ~!ɦrGFц$P?fjGɹ)%gϬ.]15:X'HL_ԿߺSQ퐆44q0 9O)T{=%:IAa}Ы [nc6'=_OQB,"HG%AV=[+1yM5s?~/XUeVSI,nU򌢝i6~HQodahu[U&4ѿt_oFs6,=zk*?фxьs$Ot_94h$"gmabݪ :WXXh)ˌa*ڔj)ҞVzcjZa@BH*2ESڊ~}:uE(5xO?骪?K=_?#.E&V{2jrUO O䘌L$tW qiB~ggँbO$WJ#in\ԏ< Ҫ WJicU>vh]~a a)q"Oǽ_쟗QH7V p`YD c scv徇}_FhUa*2G}8fT_<~`(9h#S{/:@%Vc_K˚畡p){JX:+-[a@"|~a 84XJ`=_޺K|6 Hjdye-Iy>үu_/,MY@dXX|4\[~/MG&J,b!ZEƷ%w޺WYG ƣ%nV^F+*$4OF"Mt8Q/>vsWtPfF\Ý-Pftku&%TcRxl?n8'ߺKԅ(j٥ˢ|djdzML?Jp$~_O({(UAYp,7Ł~IzNBd󸤗ut$&lks >ҿu 0"GytA-M,ј*|ݕ~O_u$3}lf i^GR4ck?s*n5%Y4lci"+ࡪ0F?v{:ΟҔ%c2f"yU32U~(?Uzh1ƑENc \@%/}Yܻ 2 c}gAP+_ uH{q3Ӌz)S޺Kd)|zO Vwnl2i? - JYB5_0Kd2g0mqmOǿ_>|\/$z#M֖5 [s o%WԑfWkSJ)UXW؊m'/7'ߺW>Gnj 9 jqWRTgq{K_: Zfe>rxE ZYѨ6(zJԈ|ޯ*`@&M G?XXgjSYru^S;mxMb7OqW=&W]R hJ1xx<qQ.Ot_u$3BIb^GuQ8Zn5- WYRRD%5ďG5ۇ)<~GJuQozš)ec*^ڪrg~P%g˫g4" ki)!՞˿זE)OzYQVgPZ(d:sqj ܭD\{, O ?W={_o0Z|+ŭꥍ|3 0oҾ?ckYk9e-3M {bUb)}_}%u\6dxՔ AʦE"J ~>޽W:E`:q!1uϝ,5}S_gPBmQҊ‰5 pm1Hj>?SX1F2#ԤU)E $2Aʁnn{^W_Ϭkt CM^e󸳍$4mt~_?,zW_aqWdAJfZ#b Ni>IyIu_/+.?%ǀEg N.?rG^Iѱ6SJ.le7PHLKϽ|>}r[F kc :܂kiEUcr㟳?u/zOF"?%:)VW(]deyJxKW@!Xx<yxʁr?'ߏ[WŞK2Q"Zi^E[hbx N᩸Ͽc_Ҿ/p>cV RD%?G5~-Wj^`|:HhcE$]v2+qU\Y>='#1Ɛ5KUꤤ^w0LGߺ_'(4 ή?gם["k){=oW3`#hk^#O9[syY -- c[7Ү?=v:>X̱)4@euYc-jZ|+hhKf 5X7οI\?4Xӊr*؊k$'ߺ!0`vPQo~zۊ/+Ij?p˥V9ԓ7+~J|뢞*$TOO HPAQv`O&c/|Ϩ׍#]R׻,=D+1{~#?K¯!~>cG ߿N|afZiE5DDW/,'VNO?}o5_' l!UafKN}HOO >P=?GIi5_8se&^-zo&r}c__]1H)EEմ g4 =GPanO'f̔F-<SmZ o%\:W_z}>\ЭD> oNrr)<_ޱpka)M bhޡ˷aN~ўW{'?M6` Z:HdyĞ ɗ$??[KzyX (Y!P@xn?XO~J?>vҭ{Jd#[&Q2h߱ ׸EZԖU=vNhE OzBp>tb[YLIh7 /A`ߺcY&SJ%t}1[h?6_X$aih' ;k ~r9zG\\x]#SZ R!!cµڃrCq}gϨ|l[\tbCv1:@MO~W?=bb 4/5IEPI^8"jA#=)"W<1잣1imkK1v3z!okCX4*r撒Y켑@LG!$i~Wk_쟟Q7]ڧ:UWzBXJcT,w0 i>Εkqt6&m ES4'[+jdm{ ½\u^'k~^DsCL3} o_.ֿXֲ 4sH)Z]PK]$@ʈO$չ>?|+\( (8E<&CPKrJWr(1O,tKI,xFv1ߑU^WWϨĈA ېEXvrjt_g=a(b*4/ tTzlRrWڟ\GtlR8a&:ZwHiJLßzCh-`cR[܅ q=7^W_QQMU.3I:=ޥ8ү`$L<޻ cϝ!EHߓtWK ]̧,?I%4x`=s}OzSQ%k) 4΍MCO-Ͻ) DIbF֚VCc)ǏŠR~G^{_ Jѭ$j$'(fQD'!~\=U_잢rV&c2f_+t_g=aD*rSU Tp=Y 2euHүzyΪƶ2yMe?~'=`-1)^;#1MɖvQ 81 /o]{_H"zթ&eJdrmY?Ҟ?V:֨5#"inIT/_d }z!.BMjiRZ";hBi$'ߩN;}"j .EZJr?'I:2~D)eJtCRpv@!ZN$cJMٞ:AAU}bQ!X9Eܡ?O~Z@'=baU#x"5)JqH.rGCڐnA'އ_&+NBZG[ŜgV7JG=gK3 j~R?^gqc@4פѦjW3K2Oftz MBp}^U:eQ'S0ge% NRO >]'S^򏳘S$wl랟OnI~(,nJi񨠖+onaT纝uf}{ r̔FV豰K17ے}%ǨjMRJeo+੧Qj~үak,1,o;oC7<#$Z3O{&q7Qi"4(4^cII ՞̽G $i~G;^]f*s9N-0!e>u-8y1 |QD"'ɹr!SdTLR~޷)4@fm`G '޺UNT]kHaG,Ћ5,j`6-lΒHEFVQYOd+H6+;b~oϽt|Ƌ(t.RG/+R?x,g _Oo뤿Z~"$W4W#?m?a/T(JT+,x>lS_.^!&*~HE SnNjIR_Y~KMv*cO+J=P[C</tR^o%%%ns?}]fV GI>+j1m?GߺMD-*+K99O/~_R?g(+=jx^y~$T^^]$ZTGl~o+W]Hʾ]_{>rn "?m?TY}IzYCIP)?o6>ږ/tìGGm/bIAfsSI.Cн=cb]sv+WY#ooI&&"zWϬG'ŭy#E!'9{/LjB$QA3] -YSRG'3x9ԏQ{zWt,*+ ? Uڧ?m<>_z<E_8?6.Qbg\cʨ5kQʓe^Umk~^|*6f<Y"8Ϝn IԏSJMhKMKzUiy2KXh|Y}R|ZO2JlTR?b3/󞲢 ;_}=gSRG%fo9J~WץdU$d(8s-7/~WW[OYY*ר(d$?|]7+{/W,jV)ɫE/*߃?/{~gYj$SGo8 S{ txìߩ__U_G.BX o|e0;/t_\zVK[C,T/^W<ϮOelTRs7<}v/t|ϯUTaڎ[&Y쏽|_*5h"$TOݤS>9?9T^_&₺_ܤ?>:=IEգBy~^M߿_o/DW!_Nj/L]K_Wϭ?Ԉ̯.+~OAM$wql7_~~uɛ}~_J_ _SSeoWu2i]>!KXh|Wu޾Ζ|z.;@|Xf3gjݲSgB4tia9|l o늓#Oy#E'd9QIߟ\tiD8EKUK/T=r*"袮R]qvRTB".oݥSaj/j?H?\4ѥ|w!*n,3%SˬR~%bUdyTcb߸Y_c-_-o"ɸ%錋?ɰTٽXgS^/7]~/%G~Դ}&eϟXx?LJjL3~|\UW=af2>>/"<ފ_fNs{:IOF(t/)b_ߌO/~.OϨDIl1WGuE*W'^Buo-tQU Q$$DoT>^/*ZKT+$x6اuEzt_o~/#'y%*ozurYY>_ES+}ct}_}):#zW[Ck k//`uܚ׫ R)I/0?gjG}>CV:[K--|s$=YQ_=phTHZ"Qc_9s?t_FkY|T')Q{V:]F-)򨒯sKE*/~]G{J4I\rkyT#ɶ7_>c-iCM~MT`ݲs׸cvZW?o\kjzluytxe&?ͼ< ^Wlt/OCCgT_e?I?EOQC7oT0s}_g',*AE^p$o'd{䳕>_g=bӤ"C tRU5,RAU?^W' D]/05+?gg*QI控!,_v}2/pO:+p򴿧Z_ma{/t_u_'i?r~?sv}h>(Kj|?L[j)>oߨ#ȟ~/zǤQ"zx"hdc;S޸:/>J[Oz_J~$|?ɱt7[W'F+Mo<:D|}إO:||rn ccbl?_{WO?:!z_?kGSS[eèn+MC-] FI1Oay?3Em^:&@ CCaO_{\?W>?L~ 3Z/z_''ڼZ\te^{IߎQ2PSgt2,)"_|"J/] Ux|ϑ?4$W'-jC宊* q$'3%7/~gW*%Ojzܬ:߃5j/~W: |~Xo,g?|tN?9=z*R_Y~ɐ?smmv|:UQ$nY&[Ci|_/N?]brkJx&JOܦE'p?A}_c+GI:?&-Y܏u?c:ZtO$5_C_|djQ{I::QT*zo%/v~?j/zW=aUɥLu/ĕw<=T^O>=]:$J53U1}k?m_~Wu[>|rgca|7_{'XoKj}pozzol:U9^]!2Pfj@;/uj5<~h?r-s%W}Eo֚(0?f/~W7IQGcJ ̟{sGߺI+$*vOr) stuE}*v*",O*|ܿ-5j/~g GV.*hjȦj ɓ0x|cǃItWXE_ ysf_SO*"j55NZX0)T}뤿W˩ sZܞ5jHi|;*YFr֥Yc&(PmWW:^y>enH̀l]5v_z/H_KCR~!g/t6*G#R~5R˛G_~/B/Ӣ:rD g2>ү}(3EQ~j܏ rY4T/pđFJ+,|3x'*Q{JJ2MWU~MTg8SQ{^u"}IE2cð4^jܬE3}ץWˬ&r28hm?S[e%|>0E_Y}Wu+ז:GMD?)-(3*s?},jz|1е,^O6Qo7>sJRRɡxOJݩ/OjO}_>(h-?#p}82*rux/,>]_QWq\ss37r޿JRiU,yiɪ2G/OEJA62?Nv/t_}f|^~Ƿ3x*K;y.6hzb_9?N~;S޺',Q$9ة+v/ګ8$_oRQKhT$Q-WIle7/zǥdiJh㐗ɢO{7~W}$/c1Zjjܬc5{g>7A-]%X0Ri}`uU_*>Qbj㬾ԁ'yzHU 좇?jݳ{]+2)ҐDԱk?aiS/z= U*UF9f2WO/zW?Ԅ:ʩ,rcrO/zt Um^]QW[175E`礿gO*%STe$3cT|G:qd Wdl8ڋߏ^??q:̿꼕U! ^:LV?gAf{~׿.z>i?\{Ov_+WH_;4QJ?8 7t_,lH}TR~6>)?όeuX4GEQ9ߧ8s~?'A-'~x"/i3&W 4o-pə?Oq߼=IuВ#ڪ>:c~SQ{zW&К~%dsY5thǙ_55nVX c7Ï>y5gB:/sWO4tK꠴c]PO_~9?2DV(Z=f'>Jl-47s{ϥ|8c?MiݪF9,fOt|%|޳((hm+⤎[*4Mz!H|CE]݋\\߿JO}_=KX]J"yj-,̟l 7/~}oˬkTUO97੏S'>y6 Ixj*`[P>lSzjq_MIo7,_Ï&eYW;?8~T^?gJ?zOwS}_׸|YAЫ(k"UN9odvu}?xE?6G/7'Q{U}$^]P7.bo&'^׿*zy*y<=G+,|?/z?.֨w'?Ma<oҾ#?uغYi?楋\'eX;SC41 A?/~$$gyx"Vl|r˟;P?]{/|ϨjMQ}~LXSx'#Wϯp_'j0}ȰK/<O/~WXO$4+r;.bo\~^NO\4T($G+j~_gdoPQ~DI?k,v,*o{+/~娓j촑3mzlOJ ɩg9EEe?v?jZolzG:҆-G`_Y}_잒ibzHȰ.8|z/qW:>_oQʘ}螒?'CS?w=MՎ*/zލ /Eڜ$R}3 jG??tI/cr?436`$^]_Y3=%1{NOXTJ)8ld>{TjH}뤼>_>}ce4EEQY⿒-M-䳹+{Z_UXX8Ozt4ج?%rݼ:IO\oT*KPDcQV??kE:+i""EbY"ɿ {pOcLO߿ҿ_o˨6CU7 l4S_Ϥ|1{ZrTapmi={ylIe5?s?LKWߐy"!/ܤ~n$W",tOJ܏L _߇ϥ4X}RIV_򨖫M\3>M߾/=FbQWɡf?;M:)5Q. rD7mo~/WˬFMzi|QC-U #a(jjoti?vV@kKP(~_Y_}+FOWGOvQTjO}C/B$tOIM1~sԏm^8WzM ccJܩE'32^o?j?Q{s???czsVfRE'3?mQ{IsuR1.fo߽(uE]*W=F>MJOMQ/yml 13t_b+xw/5SM/)ǟX zZ<~X#fb>>lS{W:!W׭%RE{?zl]7_{'Q["xfCm)J .4TO5E/v7t EDt?e+y"}<3xg#[])W&fG~x#/jG/{g)Ih:*J(gEu+G**jH1aj/zWu$dS&?7M{zIZUZrx_>ڷ+$_1bݗ޺W|,J7UC/O}#<^/ZhGF?i? TjϤWϬmkݢU~N9?f2;QߺUsBZWK`*Q{I?V]z!X|ſˡ_˙^үswTJ<<YcgS_;}ǣ\y#W/E7%?ޛt}%W]G:5뒹*G]P>lS{JyuF&<ܱ˛ av_~IzVs*3:oVmG?u$O/J4KVr}UIkf`iP^JG-wɡj/1bol 5|:K^WKU_w&.VZoC<mJ[\O@T1xK1pkv}$WHV!ڃl?Wu޺⺒[sD>Ѫ)vLrcG,G_~WϗYU;KXJi?OnjIx=HUTҪZxeo%N9:T^ҿ}HEdhM.1_wۗWrߺKORQCDyQWK!$LJi^ҾʎJԮȒ^*ܑrgɶ5c b_{'%x$Gv%Jewgdj(,wpySeŗSY?qe%0: '~z)>g K;S޺Y+4_ڏԑr M'Zz6_>F4hbʒ#G!JoO/zUitO\/QIWUo ԈBUu˩֯/}'r=g_!t$ZdJ>)jdbi&Sb+:2떷eEpKfoؾ;l~/:CKu*T2(<mzW}+*g>Z(rd$k~׿R.}J6TI:;3)Z$.lmIJ}~yBxISJ? S~/} dKqK;S߿ҿ1å4_\?1U=o_잲F.V/訫ː?}2߾gg}Ht2yk_"Q+6L?ozǥy?R?Ϋt2'x$n /t@wyjQe/LG. e9=/c_>ԕ:Yݥ-Ra>? v{_Dy'ٛfs6}W^R=qcږ/LXZyxV~q-Wt#_4đEO}Rx?}stzMzΣe["D&;nLAzUߺWԘօ.Zۋ!Aԣޏ[W'b %ZUIKU7+$G/tI8X8rV}>"ɟ?LTCҾ?0@-.uj$(92SsT_OcW?]S;}K5] ^92E. d> 6./|#V(Uco_Qe_zWYӭsEjW.ߎN|u}Y/ϐDw"ǵ,ܢRN\:?4kJ}EIMWJo%uEzW\>oRJDkSQ{/=eV]1$?qQW!,Ws)2uޤj2$~FnX?؃7/yWe_WW#`뤿*û<eED.  ,Wԛgv(--: >sUSީQ:= 7E)f#?e>}eVhǏzXaiw~s=ʿ?*i#%Us9ru?+WB42'IM/vܹ9U"_u.7u:U(6rmI:=g__*ҮAVR2ESץ/A]/J߽pIopXϿ.ar]hZUh)n\ܔ3ɰX~|?*,eݥ=WIQYڛ~^t_gк?:6?UC_uzʊİCC]7$_).tz~쟗\t: kR_"'楋ߓ> 6إ׿~ߗY2G+5huCIҋ੽~qWQ%B 1e/ -t}_잽W>]e+Yi?˃ ^߸Xr_'qf'#v|z>_oYU ,{Rw,-4߃w5O}c*)?iIWbc_9NRtrSFD%zI\>,^ǯNƶ1hMF_t7>ڛ9Eu/_=rP*S/|M5G6޺ι.ݭB}qx1?ɰT߿|k72GH~OSK+%7?~M~:U\~ϗ^b1>Zr%\8|mvo_\$-MCQG6UebԩiZ$>2#>_3GT_΁cEw5O)>BhiOUs9/ruZ'UFS~?心Q{JVTlSP~]t _ItOK| [gg?:?>Vvy*eS,˃<kvVOZ|Xf]le;Ńo簪vd:ކG(w]o e#W^fh=#'PiVs}/׿?>"H򴥪Q/9:T^ҿ}36] KWD&;n\U*{ՁֿM zt?bMK+'=p:e-2%\tsxr[7`o߹]h.~XǃM>ޕqqmRGOt^wcڒ>?ݔXJi9Q~#gEQ4*_kOUO|#uC{_g;22hMҬOzʨt}kUr'>=kX)"q_nSOSt_잣2!XE]/\䦚iMoڋ.KK\YdS6K?ɶ=_SX_yrjO^?qx?pTzJ(bT$ ]7ozǗJm٥&?2Crl9uS>C-O7w]ov/^>}EZ_\X^Jl%oV+~Pq>97a-Mp':!2~PԙjoB>lcݾ׿Q뙈khaɐ/ 0Oغ{~Ҟ?]aBCk*eiFwaE=E'Ip.lg9Jl jP=$<(sI_Ϩ4z# 09ڟL>Ҭ=F`Fo{0^W_QUS QG/yOڋߺIz_%jUIS!{%}ئ?WkF?t+dG_ #?7O}蘭o_Q g\c5E >:e09SeF)h~he >P?#NGQ%] <ij6}tFfת<{ROݣK>sTZ5E8֒NJK߿9:j/{'sJ"D;nLAT?/zW=a4/u:u~ܿ~^o>?*֮OJJ|u9G_5}>tՎ} DqE੭{Y _ɡ&ZGimv')*ڥ qC-]>92E. d> M޺Uv-G҆9#(WuߺK/ :*<ӈI5O?uI"~PWYYTF&`bcsp B+w=CKM|FkSZ6NG->ۋ{JzX%\>GQ[pt_잤KiQd3JTd<~iGNx?)FҿԎ"&5 E~%"e?ݕ '޺KUg&@W,V ]r9+ss,?uto-&'OO4?yX_{'_}KPHhb&RWckש8t_>FBݔTv $HyY>PSQQO{_!W[%YLbhҰÑG2KJ:g{IԘe,"ႦQ n[otD KXGƕ \TҰLݻM#A_}u% " U _$JjmA_{_LmTfJ pBA'޺2XNao-ڃ>ݵ#K7I8}!'ۊ0#ZL;''M:Ui"0U܆ZPI:tߺM(1Mkq?h+ T679,A[ŭ]*We[A3T\HQ|0<鷤{[W'Q쨨ә2:ːRZ 0:bl |:KT8M2*KX*l& _^|z=ץW˩Q^ #3*}1w8DzIuyFiTQ5MB*Po`` ?T-}_`u?$. ,FOӆФ/RT(~?g?RHѫɦGgn|A?I?'%o?}>*P-!Qbc{dny_~?_WXh1EbaZw /HeUEh _׸7 G}Z?!W!SɧLK7eZM>CO?, E t?:vQVSe#$JQ7IzŨ7iZrNPX9߿׼ՏzQs}نL?rK/1Pc-TWJKJ j+X;y3i?I?:q љ֒@%x9AGNx#=QVjϹ,<[ |6'tR#%J"Фt"3$gӎñ ?8$/߳U!*IOSCTwD'[,ѭ)׿*7(LRx%jiap} ͡2? ~Oq_K#B,9,2OG9R$y>_.}S A4"1a%&'rI4?t޸]&Wzc%s 0g1)5yߵ [ޱt]L?v/IJ]øED(rߩ_z̋+K8A2%a& L t7*z" cf_ ^XG}URyɶ=nkW2 5jZ8R/)4!rD׭i_J* H!iNP)*ln.eZnpUdTWcSz>?!뚱5YQy*AI :hEn-] _]{_g=IA`1٧9rNK/9_ۀۋ{J|ϩ:`F~}-=XgLgV#G3"N; uH~ǥ_~ϗ]pҪIMSC ۸%X*OW:cWBaSPi20z"ej-'߿/!zuj M!s$$U'߰ǭ=OY+" 򰖇$E{tߏW:U}ߟY}Q:'݊J'\z5^oWߵ[޼˭ʅEFjC׷R¿pPA_GmZ?+??1GE$hVN nQu}Z?sAfXG_?ɶoz$WR|Q\ˡjpzad8c",5]4o.QLQm;ouW~W]y3)e4oW* "$SOϿu>_>㈼NaqCP6QR4~Ot_IFsKNbqƨYfɹ"zzחSJ*3Jb'Vz˛_~=+յ0O1MK(QCakzOa〖=T?|A3SWΩc&gu *M@o_Փn@QLљA* Ah0tÈ鉳~U: y4ȫ-`,:½ݤظV_>|ufHaf$zqg*c"O_?X %OjU t*>zUW:"&;4?NoB/Sܝ?_`|'>%L8AQK9Ss䓒/gmJ= yXKCQO4?{j._~WZWX\ R1V)+s~/-[ak{_?>zV5j _ոsh~UzfS {!ֿ MlfQJKo.cq`,LT{WWI?\o}J,O(,2}6ݧ?![OQxLիT|)Q^)3nrNoS>'~'J?-">*̴%lRMi{={_oc"4F^@,pD>&ĕCOONtcaNF_q{~@[}˯vp٥F9gL0^K,iju7>I#})W|"YռTFMVJ \o{rOO~U:IOzBFGoT`톍T^k8A^W?>WL~) V.fT %'>uR dpOc" ?,MϒnH'É'z*uQ4]JPc#c}VY]*??$yN!O0V^r[n=ӭQYMPdԤur"[˘G x!7n+dp ֒@%|A&M맽=ץ?.0"uϛhWV۴y\/e:ٙñ ӏ "O_g=o_]EsqfeI T ,6,#BO߿J o,0dFF p~AK4$\=4XE3R`s~A{_u,c0PDR6"Ji0i*}_`u/XNa-fv 3~Ot_]b]89d_//%㱊Yʛܕ'UИ1ԋ%&9 mNVnzB~O؍A1AYvFJ&9W~=WϨ 6O"}%} V2 ! ~Erzv{U4gZ: QVc)3NV Nc}MzߺVD edTfEk|~ܤٸVҏ:T8 ى÷v8Ҳ~AyӬYҪH(/ G`])Ol+2M $j!`vN[}y[(mJ`N&jD8؟n~Oi_AFAjzJ,LNNi7,t׺ޭQL>eCkf2^m#'n-%W=Fe+*k6XnO6ߺUrFP#Ya:291p(H*c_j>zQJ%A^Uc>>v1߁}(W]FcTpeZ߿ KJάļ*]bZq"G02J'.a֤%Q L EY?N3cMfj*_>T!+~{j>Tfa>Ҿ/ԔS Xҍ%&>)Vc%/9ʟCOǿt_";$UpZ*OHW{]DJEt_}g+8sXªTي[-ߺM(钭*dWO @}5NMDn"$+O~_SDP3GqIn~o]{ṑ[\I j u4QS 23,b+cdL!< LgTHu^?\RDaDD8jyZ\0=Soq{/YTha{RiMOn yj5Gg \S^:=Qh*JbV*Zmya5Du_(#XU|4qfܹiq7{JRNk HVs4`P?u?BjadLDð_}g%-du#4G(ۤ}g_ү/JRSRZ$˧c#i?' ^Hoᅒi+8RE,%޿Ju ;zeFX մ *GO02[@,jT8&,Jqi5SOI0ǡE1Yme'aw\z"G+SFՋOSv/e^9Sy)$W'XhUUE|Jwq*!Fv.W,?=I h!T4>zXǧH&4x:{I},/c$ $i$(lQ$a6?nR\)K#-:۟)M7XNg?ʁo?~ޕRD7(N}TXu_?\PgH dzEF&<JMSڳ r׿dz(HիJZKy0&?Ǻ,\4bqPGrfXUE1ݸg_gIRX:2+EQ?=|~q?a?y_uLQV9cByD?{[u(ikV' vjx*BƟ-eo•/=U>J% fOYi߹9~Τ#Y14Ë$/YaVN,%)eI,Jʢj?Z* iXy*G}^fYH3%8-!_pF84Ϛܫm?t}>+ h\$m a 7?V:K1)бGF5X&JLtS3S.Lz[>oYc@hUU{q'Kr~_잤FGk7ݏ**_:H&j<8n~}>5u ,I"N)5K0cKS}*>_:䎶y|M~=Y)DZR:չ3,ӕeQLoo^u vZgnFAln30(PW$tPfEDxei;lEc׿@|3VCN5<W4eY[{Cu(;85R}Tԉpzdy?7.>]g`I=eo;wHI7_^ڦXP3VQ"$XVi]H]{_~8 RT̔*)?ݒzX|Ϭ EWFq&f2,>r=]$1~I?YYcj&JLls~Fa5ڟB.c/q?>(aWuQJ~{q'L\޿үzV qx>P} T('3:UzũuҚzDN)6/2B?%cŤ#;V-u5GqԈ<ƏO }_g^:XyL) SU'p_WW/>ҿ:ɩAy^eO Vcx46[SzW'|]p3 &P`4qs?r?'GN/}> m@R}4O?꒫~=WQrש hUFFYuDh!I>MugJ.r9A˚&},Θ߁g{:ʁYbKj';?oTWǯ뚪ȪV+XBP Y,"qb./Ǥ.53::ٚ9H⹧=Ku)Y.֬ԷIUDb2.lbh0&Iu?e`F"Y3%T78{$ڿ|.ƥBYAȉ02ԋ_}}ſd0TXeJpY1+'`@rU?}%/XM.eJ/G 3$[v)>,3L_H$~OӭpSұF)qDg*y1=SC~}Fi@0E R?K3ǿ|i']($h/ݯAJY3Mp<])7 rߺU2VL9Ve#S3Ot?ϤOl_>j$q'uXC"Osa'tcb/fJTZNr^}_잷 yYJh6"Oʁ_zU_?닗ʔ"? "$R\/Sv8ߗ^ϟXR}4O?꒯ ~zryS׀1hU)Ej%9fTb9WָQ},5q 9չ3Lj 2:c{~|޺dn8Èk{ǟ[?.1UU¿3LRJo\7Tp!цE@?L1_{nn׿ $䪢_rLƏrnJ|&b)&U;caB¢,-8?0W>|FdPZ(Hv`eWR-O?M0m4FX1`K`3Q~}kS劋1(mE-C1݇J?=a*a:(ښ6ZzKQdQ?s^/|ޱȉ\iWUo>s*"Wb+OQRR8OᎥJ.mqE&. qWu|aeZW A*پRmP8[{ߟ^clc'm54;$|.:@~}_X%`CgcU:p`+FxSJ;2a#7DzT}.Uiu(DXtXo_u_dt_g!@>64Tv\cQʭzUOXQi K$JpUڊy0Bj3U#Bu[߾]{H#o!M\V3NU9ҟ{?t_u9 rU_4\{9 }Aꁯ߳үO˨UQjc9_GY>jkz"W{1Yikn3Q Lg)?_:i*K71ǦoC웁'߱үu`޶hƇ"a@̓NA[{ |47>w$ڿT ' \KjDc `d/Rʝ{_81kSjCGhh'C1SO:U>}ayD:Oו6R_g-~O'z4"GHij&Z\lrBA5ʟB.S^_>QU=TQWɪzU_䨅ZFt.GzWXj "Nk:1ipNMꁹoˤ~gDխL)zDR_g߇JxG˫n>>zH,ƏK6~}_gIpsX`Ջ%qCQcjl:>r^}_잵QY+Ω!Jh"o1Lڡ~Og_?}q.(~?P`#M.~T K>I8>-&<Jި]U_~W?=a 5ZGSv2ff OŽۤd`4^ ZunL4J]1&߀= _ ?] h_=Dc" )W_QU]aQvՒ>Zo\_C_}`b)2֥Cn3QE'tFs3RhdOrЉ9?_uE .WaK7cyS`𬐫CR&j׿uF>d%(j?DN4, 4g_Gekj5̔aVK`5Q~+R,4_Ò@&$܆N4+_?zW?X} tf&ZzܥG-rR?s_؇v/=Dkaꢊ@gU?FIFΟǽt:#Y`cRhGNK끾}{_uf_EzLRmOfߺI|J|bZSN=,HJhtk ? Jē(ms $S}j9Ӆ)9S+Ҳ+LF51yN=Sp.?'Gg4h(*PN*z_.W}T7-)ce|z!7)X2b7{^jtչ3Lg*߁}$Upm5R-],_9 E޺SvQ1бXs28 h|E-=n~_oFT-Cr*bQ!tXSU,3R'LE?~<^X%V6fS&52B0~'Q]y%*C5m"v`eʐ'U:ZOEh4x`t@5P?J>_VA. }׺\EQ%5"N,':L_]%WIT?HJzxсxe~+H"#EFiZw2Rcc+4}z-}%޿?Y+E\|L|V3HP+C'޺u)Yb)(3?.9?VGp9Q\/q!ٙT){IRul%DsK0W)ke^3i{Je VsQ諕pT6 =ԤDԝ&jpcO*KrB8%ISjh͓&yӷyKtTOu%`>SD= ,+*?-+G[MRs2Ek!fʛ_J#0R7k>uUw~߼՟:gf2[#_ 3|[޿~gǩ("ikVM QLO?RR5YjV㎮F!pe١1%&icuAZqW/!~AGN+<|O>.YxUh&c8ېOH'+}+?:SKyᒥ% \R~⍚9Q~:KO`_q }red?ا7#=}z)BzeuԤa5DS[,?\卌+Ku޿/~8[BE/<VG`i>}%?: SX "g O]?ӏǫCOse^W]gKJ_1 *6nIJ`>ҼeQa#0?%4Zk=V30?Qp[Ogˤ`uHw:6SkX88!fG#}ˇ^?$f!c+1cjcw ]'u}3"jY_ 3MDYz\V{%W=s52(d5Tn\ ko^W' KR*%3\:ڲvcO눛7{Ju4}&Fv/UW"Oۘޙ?~c[**"P9oۆ6={u[Zkftj(5aq14ۗ^},WgYK M3IDo B܌OJ6׾|YJ̎5*Yzy?:'ߺKYHhM5+hqIqXij@O>"^P*Q-l-&qrF@T_Ocʟ)x~^x^e\Rr[6hV|G1t_g44A]UQאٙSy?9_cpu_Zh^(R{WȣH5E/nI06 =={@$uT7OOԶxg_v_S4/]hdUXL?FDLJO޿^WӮ0G)e?'޿ge f玈Ʀ~bwگd\~O_/|޹f bSݦG?ْQ5\}tS;ck*N&9x|e^tOϬoG 3H l4ߦML GߏV:S3nfZUEU+Y_<-g0x0Dߩyuڑ5@ܢ*"UUqM}{Ailjʺ%PIXM9~ oY/P:QEe+k^/х RnQeϽu#\d0yhN?OM>ucBG0J\S3JO+!&fCH`S)GR?ۘW}XEU193 k2N2گʋI??=p+}C%J%.*7Y- BgT_c[޺~}b4ܹSO >u.$1P,2 ܶ,5>"7zָu._7$VR7].=jL&jp`O+CO6Y? cW=kJ*ufiDpC5E&۸y4Ҡ}+O}!a?e!J¦%[}_잔^Cn"]Vc<88fbjOU>}a1CJWooܧA'Ԥۆ]:pg,}_oqS%y>/S:GOϮ!5i(&i+Ԟ5nlܢ c9=_z߸T*%3\e|`uxodHkFr/5i 6397_??:Hfj[*0rO莁[:C{?'6^j։)"VּDhbc/M~}՞ˬ8$zQ`mc避kO|UXXXHJIH G$ިr'ߺS농ZVQc+O=?`.%W )(Mv3,e`_G+gϭpS,)M%煪vTrp,ڏ\`ޏ.~}EĐ-u6˙INnG{Hu=DsIbHCZ M닛W_ut*տ*iONlRo\:Uu2oQXKB 5In=b$W]c@WyRCRG%M<ۍLiNgkEb=7vXV7^$J4dMR50^HpIm"vʋ?'݇ˤa"y< |8%}U6/#_g?>IvN޿ү&BK;г<)ƌ <8}O:#ػI S 2S?Lf-f3>v@O^WWϨƅU1i3 $EaW \?gzWHVSL 5MՑ1 Ϝu/f@8 ]%q չs3Z4~=˥^xWl^%)Elr606q^_oz@9?lI*do / O{Ǥ~c %C,E過'^g! (ZH&z|3-JL`]k鷩?WNoXXi?oՑ*K;TN/SF~?}*W=Cd XBejGy7tr? #UjuRUab#~Pu8W3Zv5%JS]ETp>o?q/>ү}u8ZT4j<OVVgZ7Emk?o H4۔X?J4̆Iahj$C:qM 7~'b}1ME$QZE[k I?CGߺ30gSG'O;QrW˥_WϬ @Tz|l?&X'_G+$WXe#Rj!$Trp-4K>z~}Ep( : sffR7#=蘭g 5WIGrxn?@MuAUYjPYIt誔~7{^" \vXSvVxF>^sߦ͖O_.I fT8&@4)4u>ҪG7OF)Mt($B EavK·I>}`,eyj5V%A5L0K3frܔr?'ߺW_Yb,i)J?*V_5ۆ}-_#7SFq}_Ξ\IE{QER(८GSrfN#)ֿ|"+95GW#Y]Qeٌ %97ߺKrD$K 3]M\p&6t Zf"x+dPcBI"c׼VIh-+HonaA;Hob$WG,)bR#Jy X8JɀOt_ P*Pl|ZLmA8:d3+]%WʣRW"fI]hVsTZGko}*W}c]%kP69j)!UUo NiNjv,s{_]fM 2Ģ'Z]3H,epu1=Umkq]%WWRc zGj'pZSfqWԄ>z&f 2MEP)5H}?=뤺W;fj#rj{תlKd~׿ԞdPS{xC+=jbFhek~ҹnT,x?|-u~_k/G?xiOoلiҞXD, D0yNGn4jt_oI-FhF2^2%;8[ߺSA0%X%ދҢ_,uaxLj#@%@d>>Tml? =IG S=6$ҿrY+W}IF9E[AQj+$]Oz/RRޑ_rHnkMڀzʱuF#25eבx4ЏU5{I~_OR`Tҫ"I[+i/g#`C~A_.i?5Z Yv>!_)ƐOjԅ>VUڡU ҬpH˛1) 1z?T~2'K|T*#jSTW`,TʕޏJήbh%Z !`<С8+<X}3%#LF{Jy%SŗU_RUj?b)=:ID4k]?Ґ{|?FNhf5RG!5C_1gc O%V?H]1S\e+^M9YPr~Wɤ䌡s5%s)$gsSꝸ?i/Ot_잦),L*U+ڦ,>لi >ߺW)3A5H-040vN'Ͻu}u"3UU#-}soxHQh0Io{/_]g@Kx?C[K?Z~׈@ԨeQ6} ᇿt7YQ 4T遚g]j,~֟R#}ZJzp~K$2IM?=^''`)ޟe?Kj?6ɉ_dbiuF"2}Zզbcolf1]B?~?7Ju(i\,uYI[+i1Sߐo7:ʖK5[j41f#MD*d8ݵD>~Oj﷥4h~g:-IAHM.p'b3mm'߸ì{$E㩪"aqSjSK叿Pt_]IW,JSB5SHɷ&j?m=oJIKJ9ZC/ /-U]M~ݺK_˩*|:TTfS9/Q+KiҝZ{{՞(B}/_/֦f&,d ޼՞/Xu%j-85ܺ2/G+d)\A.?5$nT̶Rh_/}LRd@ؕѪkr[i+|\+>= !"yNG1'zK_axΫJJq%zx5u{( E4?V>׿*~@Z$~/0S`^Ԅ^1F@Xţs ߺKYQ 4Tbؙ56 jnZs2z9WϬ6hIM[+s]~:WORHRپS)X}yɯPr߿t/31TB!)u-5>)50R#z=_tSn]fdE$@ieoS`C~AJ.9zG}MYU< qf&/{=zK0Ea%O)c7Zis9lc:P\~}=YcVPT~Ǭԑx*~l<>A].ߗ?}*:ľ2i̴< %Uy{?gP3;$9\<ׄ#Uwg*GcϮPLTi3FcmbZP?LCi^_oYt1]ej#j&cMo Oҿ/󞳄cEx׶SrxNVk(dWMm7q͢=96_V:_i7R2HcMW^"7\4‹Ooلi yU2՚GtO)`(Ŵ ?~W^uJIR^3B$ו^-R~Io~W_Ϥ`|?z0,(DyTFz_`BR}e%c2@8`'72{]+!ו693S=6 PM3_j;=_ug EdxҘJ+ jbW+$,߿I)Nf>?f*ET"Xdjlqm[OtQ#?!u阙*ǭE,E**W/Ϭt*(|kytȿ!ڽW_HcO&rԱedža~%?+a_uL6A:&3oQ[hvN?|p4L-E$E*jpc@T,}_mGvEhkS4xmI _~GA=-.NR4}{B8ì/ $y :g0TVOI^W/X(R$Jx^*4;8 [߳I|#$ ?%Y_2'ڽϭ#:~+ ri2ɏ-o_)ӝE =`|!n(4Xgr_̮n>]$WX3dhV`LXEns<]G~^_?Ηn'OއAQQǽtM! ՕZjm #?Oj-{Gze BT*FT#Die?1Aai S~'uIZB}MY/!m/AZ4Jx?iV}+L"˝M>2O1LF߂ߨxh~N6"6*xjHxB={_3,KoЍT+0}mk^j5ᇿ/)?}kf@o+"do6.?=蘭`ujI]JvI/+Mm?/\uVzu+c3TȒ^m,PٌЙfҮs&|:`+Y>9OrjxNVk_쟟Q_&e]5I\mfU%vǿG7&S) fjT#ugdžߐ}ꂾ}hW#9ykt~8ɸOBeC8 M_S`^î&kG$ njFIQ_~W_[WWQY ,Tbgzh-Pa#߿JX &%Jhrjb«s.\{W]&~Ǭ/ $V7ݺ@ܷUU5j/E)?9$ڢ ^䦯c㬍I{5Qv[h{=c܅qW0Yd#d2} u^]ETZ4 `6jj!CT??'{J_FJ%PRpȰ˚r)&Tm->_ ,u$ԑh+a0*eJs~J~K'Юff&D(T=/%!ә(zhQTU_Uc'_uvoPLX%icZP?LCi*gLzLhj#`<@IzHu,TGޱŏV_UegA_{үdKZZFs5RZr-ڤ߿O_>9/eVW#'*ӑ0: *W?gPYV!Y y+] ~} 7 ^Iae8\K5&vq~>}?`3HYCcJ-o&"t?c+x/Z&cie.lLNu{Io nz{\XKC9l%&:7a:dgݙA=綠fb5CK1 яMR9zOTe޺UԤ#DXS䒃 J$EnUG?GZUTS}}q:O2W?%ߺO|±"JC ;D 391? =|>dm&=RV)+Vڗ/_~/Ryk)Z3hK[p;t_ [zU1ԐV@UrxN;(*O|M3\YJ)"+<`;;N9?ҾyKH!}ih5?-YwLGuXu)~xe;yPhbo,~n*LwjkUn?m,ο{JY* Uj IgrNk2%=%Jk-]C^Ew/"gw-q+%9@EUQzĤ1OF_,“H?}20uj,$Thj5-)%.ا#ߺU_RQDXzc2Sʿtoe>XGԯu)|mU8'~/)ҁ(%UwHH5Sc_g^_JR` $oӈbwJ#K_ å&5iidt8xb)j=޺UUR ?L&S$W?gYʥu tb1I1VGo>,Ԕ"PF9|2福Egv@?4]o.!,WLҺ.ĴOgV:]@]0Ì.X³&NaC\R(x%;mAGYGt_gRSMRiuC5:f|W|X>G ?sy5YfX_ˤ/}ZCUX9??O[F"fJ:|dʴ8?0]C~A_K)e"UתjT*9lnW˩*j4X95,t ndUOy_87]Z>ޡi]|.ݻf0biݓjztVT A‰1,}P㤿c%"!ZGQNJZs#O*Gz_>ZSGilBIXzTydJg[Hztԥp=c S?0[G$~-XoʟU?'$uL($չY{J}HXxqFy+aJӦY :/e(xʢ? u%%s"TVJ~̤>l<_M?U~]fʰ[tLc0˞?5dQ@Ak+~A*c H=<J,;=C.lJ=&W|ȟ$SAc6%z_߼^H2H!!JFf[cϐ4_?.+U-!zrn7+GPr,~}$WY7GD2ģ}gHu~EO_u4DG REMXXsw18q{g?>GLZUA4^Do՜ܷ ~yt[z4IB"gJ:}_-2tu=8QfKf=j=ĊNbx2,(b}7^?tw2T^1t7}ݤeUubGIxeZSεӊWh_)"vOӟq>_~C]W+q*.6 $Ynz{\X?}D%òҴ혚Ltg ~77U?=}._|eMT~9QeZ`=! $a}%_g",|14jWQuT_G޾}{VeGS$VWM>L&O~~]f[ϥWcLrjڃCV_?WsdY")rMҋ T;R``v o^/>]g:IZ@WOӷp%!7u?׿8aH5:'#a>_J0塠4˭Wihp֦^!W*?iqc/8cQ!e5kKX$ܽ@Y -I_3%]A,^D՝ܷq}n)2"Ia-XUf=yyi0P` ҿe]a.$Th*s3IT@RW^0-rMY)oneEm?ݲUOW_|?:k ^qPk7;.JEcvNiTů>/uꕤPK[@'۸8Uf7 PHS6b0Q(׸||ץ ,f8h&7AGPjU#~_gD4 m#ԱIA{݉[UpS.# >?Hd|oe 9Tb%'ˬj1ĕp], N&{C??HڧzԥuZoلW~E?XW\+It=$$`p4_`ߐ}^x e{՚C"sm4Xfyݩp0[eC~I*>]a-奜9Z3ѷzӋ?^jq)j$+}0i"Y/+#gX"0~f;u4~!? GSpSfML+8U^5D*MEm=N?/ ($H ZV(s=sY-u}33Ri 5Qy#՝ߵO8OHQZQUy|i& LP*}W^W?gXI.SV .%Tx*3F!Y)6?o_>?Ud 92тjndU{}o_o |Ii$N%RGmlL'߫?>]`cheD)ۘ(Ufm_p.-/}{uBH탽-o.Y!ZE~JW9}J /E$M+`=?ָ|zw61K[jWQ}=D~=ۏI??=b>aY0ܞe-PK[u~}aA#5-䭁+}0=;<21 :UzUd1 KV%-{lVVM>L& s_~]poTeV-#x䞶8w`h [u_X -Vլ!E l($i00eC~IҮ?|ͭ^B[EtQ+oaLÍzr-g}$W|~B J'fZPK>Bk=?=׸9Դƀx\{ja}ץ\?/X:4a$8[U_ 7S=<@=b)jڳYiǘ"X}zMPioѬ WybF;O |-uW=`*UzŢ1MF_4Iʟ~g_jTEF3:}$z]NGO|IXVڱ-4WJL24{v ү}^~c/2T2'4U?skO/u @Z k()۸8fm_{\X_X/ J$+@>aN5N !9ݲ^G |B)cy6BX0 _K#{Hh/\sR9/A{[Qޱp_)iUeL O{-$yj\D{Jɟ~}bE8&J-󻔤fL{I?#B]uK^k9>/L$_)9ޣJbSL\Չ8*/솲|>޷_$5*(\}(%CL 9?(*Op'|>-$(fm;w)8o~)Wbk1s д ntap dgMy꿯Ө6"5:$~ƊS}k_g=`&Hth 1]rbboݓ?o~+WϬ tj֒k8ph̄m?=H|!Ơp,^Hgw7ca~WdrauQUe?/M2`tݸt_oGb({\*ddEx*s3IQaY)v?o!'^?_ (| ̼nj"oRdhwOa`Ht:'̴XHLnZqMvO~/?èbV"Df?co#+@ ,œ)#nF#*sse=`|Cɓ)i-Sa㓁Y&jl?i4\bh0bLQQ~Gߋ{VGM" 4I1T+c{D)t_CXk[;!7"[G{H״Au,FH YT$0t_}D*ݭ[=bRUe[! QK}u*k5XTW3PI&E^l߃O)Z՘2@ʿEc7_l'ߺSQȧ7?˓;ݻf0bi_O_]FfBM[@'n`Esc*zkVM0c%.=M0\ijvʿGuuFdڄ25'qHHWߺI|kxԱrԯbPW#o~JX?UQ$u.>7$ՙj\ ^߀=Deц #!J%zT?"Q-{J0h)!hDA LwQb׺X4z_\884LY*?7,G_udҬe*+/25r:FJfҿԨcqIKRD#g',[=_:PXVAAǖ ?̳]Mr?{ZW_R#U{"AcW5J#Oԅ+(F͖>jWj\5?k(?]+YętOP/NԀͩ̅!ZJW0h,0}iVߓ%|R5,w䆙D$:pYMNnaz{1ҾxuYC¬^bV%Zߋ{I`V]M2V,x&ҥ$4T _.Wzm hiꉖ\n9HfZGZ߀=!  KN^ڳO/?}Eב 9c ~O홴,WRePTzp[gƌywLz`uP"xI]EsobI* Qqo~I8~Υ-:%Q"GS֏ ^V~Wz@ew܁&Zf\~bH "-/z pHMG`]YʋMv޺X?s<5zF =#ElS?g|P`צ?YEZVu)f|ԄྷSWIG6^daԸZqr_H?}I:R[V < cߺRiRӬ*Z]e1vX`GOYY^C$4Nүbg L?N#NJ F-Fbb#,:Q{J|sTuZjKA-k #zhҧsVߕ H_Ix|YC*G KXXqpH'ZIkAcTX j8nS$Q鄒GuWVOY# *R*$9Y9Z/L.@?}_gI~_?3Ԅ3%S +yYt^YZRy!5Tw$Q$?ݲߛ˥^u#Q!ñ!JI# cze'_:AitOY+hcuSRIQu0׿RjvpDtF|2$*R)<1xc5[ԯ|?NQr+$ݸ_=z 5~-%'gЩJG 48@7uՙooį̈ Tp.ޤN4ῒRVg_Ž/0Dm<)Yg Ici^:Z7 Ο~/?=fHZ(֕#|dH&y\${_?mt#-[OBA? ܦY,"I+VzEsU 5>82sfHl~:L,@o>Nq=rT\$VfgODڟ?+~Gqr| sBxq% ?vӫOg>5uDml)NWHb2_:ͩt:(-1$Hظzm%d|tf|% WzL=;1Q~QO26<]L:/^W\5hͽ_o,'g#F걤t$b"z:eo~gY`MYɿQJd~dWR"&i L-`ߕ>ֿ~gӮVSXg3PJ?m6XNlW5D9S D[Jz\?_f}l}m#Iiڿ$J|ˮ t4x@5i$]7u_l3CqW:׀dB `FoODAJHqR3@Jid\~k~o~FT9뎇BqѴq0Ue97#r=Վ@eD"!j QK P 7>=b UX~ue(O$?{H֙JZnxjuQ T@i6?oz??"Au'HlEԸZd'߇J~_gXeaĬKˢkYNk#?UB#W^,ez2u&26X)KqҋO/`uPah4ѽm*N3~{:zᲈҁSKBxpp7X Vg?7-oŽүOzǩa:ڈҠ"Z."K,*=oBz?Ѥ"cqM3 kO~zKJ~_3UFD[Vs4XLMr?{ϭ  uTqU(,o2$z,tFʟzW떥 3AbG>|I_:ug)ڢB,_$1Opu'keh`oiitieO Z9+hBob2UwN{"$W4)R)Ca }G?߸X>_>}F 'Q)Q܁&<.C?7o~W?=acґC 3 bZJTp?pjTqkoV$E5G/g+5PZI Ikij m\16+c?! tAj!\Fh`uOv8 85d~kjnc$3\oK8McUbΰ9āfz,|.F>@$>j}A$f3PJ?}ү_: v j`X%Q,?ݲߒ}}}`fgצsCx+ҭ>_:)Qgc*RI[GH]IVj+wN.G~^ةH2xiIos[nH[߸W%W}F?QM(VOr'DH2;_W6}k"C#CUe5f*M_>"wT2UCMu3~_?9ӛO_u_}خWX k-CAZzWoP2%Jbi<3'OH2ӵ&ڃC~}=#Ǔ\_t~RGM?͏FӟAíqWQ嶧Th?ڥ =8p**uڽtWQ>@BuMHe/m0ҎI?;Xi4OYNH1яӄjs[0T=_c #ZHE%ha-[YNXZX;Q}]de<=$SRMUn|+f ߺ_Ϩʚ8iGTbIdypc_g(! g1xtڊRq18j$99eCC S*W'}a$v5P>lӁӬZR y5E2xu/``?gm:$JQr[mlI1Oӂ1e?}+Ey$D[CN/oI&EcxԪeȐtG- sđ#޺UZY-fjFǮy sw!IV#dt[I HQңaFlܷؖ_ҿu eD"!*jTB[=#TC胐?HG}kȯYlNJXh1IkAQ 2ik֩9SOdI]>o}k_uMoW'#lz$4jd'ߺK,_M_ۥfT뤏^ғWˬ/uiu)*M q$!?NmZ>G}VQepiah45m*c%M3notf?WϬK#B^ /k, GIb?uKyfe\b`)%DiU`{I?X? B+41M GZ߀=T)<"5e?X:A8Gx4;_tq9vF5+]Crŗdq g\6^[tei!*F(1ă#j/&?~rG&WWR"Ec*´!AaDfqU6t>u%hB!Z Og6hܓ_m=뭏ש17;,<[O=9ٿQxIz87|, Y:h|ni߽Ubt_]fт1)LΓoDF0?UGV_~׺bЭ$KDȼ,fom[ _{I~Fb1v>Z<|(iPMWvNuߺU?B'c3P'+g$3>KqbcQ_WˤWJHh-,iz|x<]*#5[5Ot_!!"F&-*RF2r)Tagߺ=fvJk[FvɄTKP~o%W8 8tT-)TfR;!uI+ nIkrOt2}Ǡ5vB8NM8^@W߬OM_RMnԭlaL]8E?ub!#otB 3kD EeV FM6^Wʱ2MX֚?C$ˊSI4w%A?Ί)!Kxq&{څ,-?MVz.RCW$:ȸ~Mna<G=QAm>O/P&(/0ן=?5êJԡ? ]+W_Yo$Skx8V_p/p*RJ GCTc2}²&+h?F WU?W*ꔶ5KUZ"!1ea$[՞_.ds0!Bt*AhN7*~UKϫߺMWT51"R;Nܐ_o.[W߸/厤'AVh"}4́m*uoݪ:ɿ{=o_]eYXɛX_#ߩ\tԕAT(dHLQ+5چ)^W?ՏzȎae,RmU>F8冄MTdb5}u Gt_ GmxDm}+̔fx.uo$ư1[u:%uR(K~o^]+}"+/rS,a#.'$7}%ZѴqDKE>x2k=)\4E>z_OY[HA$Y㭐GRcO՗2G=r D?=5pyOc/21'7"S:1O}8|5c 1z&/B+dyGܶLGQ4acr.OxX/Ӫ߸tA#yTی!ZZq}>q~T~_޿^W]JVYMJWG1KFѪf d_L1؈@~Wyg~ϗ]nkB -7m]pd :+Lrs4M!B}1i&*N?{ˤ`|}v`)H?OigYo~W]z?gghddy 'q-?ʟ~/c>ߟ]"дqFI|C&x<-Y]e%d8s81AN_>KDu EǮfooDfjέïPʟYBDv|VS ߻TDߋ{I8X閄V>JLsxEqKΠ{Z>DOX(E5_)Ym 2C<:L/$ieZ@gZ&ګ+J{b'tW~}tэ)CD #_-*''5f"{_?1jo$Z~hQ0T )O3)HE\ !!e$؋Zܓg^(<:ˬ^(G Pmoy-˟~ի_.?n:\KP5.qD~.?v-W}S!>gU1DZ"$V$;VŬ Pq_뉐E*Ĵ 6o,TR8}vs̕'VŽcpϧ>}` )V2F/=>%3B=9?hڞN_g @(^IHoveC?S[qW"zu[~ңqcLLD2Lx[b4^H_XݒMS3ZRE񸈿>zK=zNC#KqRIܺa4Tu2qҟӠ}KDA ihm|V؉SWX꣬o~?_X4TD>ժ(v(isns=W׸=Fh%cx|{ySZ|~BY#Ҟ|=F +#-:RZIaljU$O7H]礟^>Vi<.rKIMs}2[EJP/{ ˥_7XYDH~2}GS#/d ',:$/gX$L )Zjܕӊ ЀߺTsuf3:ZW'5Fd78DBIbbTefF_:Wb= L6' ߿9ZzK^9_sBuC$LV.yvTZ_6A U+ (21 64,YՖa|Ǥ_/zOCr- ̒N_7 S}o_gQY-h($M^xҟz@"Y5I:u&8"MT?SWäNxuAejmC2{ϕ>)`a?FNoT`~O_uoc 1џStq _菉}bz)T{rn/ n+k ߺU_Qu3T)JjhI&!h6# rO_uf:R(c#4d_0aᵦ#oU|ևU GN'jFd meֈdX},gTo姡O'AW$6Ž̫Od(Ȋq$-o >Orx =WϬ!L(dg.%[A7T[S}$<4qDKQ~'YUmJOt_}E`ݫ;|Lqx(oq>J(}O7QC3Tمc)K]t?Wab$3 Эf"Eoު奿^=D0 Qr.=tvvM5GV_~WXOD-S ¿wZ~YM?ˬJfhS5&=PSG?wX_=?#TϏc4=##͑UW Q?{ZSǨ#CZaJ$c*V>rV#S_> ch_d@-L<|ּ4`Iu5\1re[/Da7t_}cUTUB=EzArrqC'@-rOS^]pefdj81y(ppIсhn?WuFH8 }t:\`#~ZA9Qۄc}%fB@LSQ+3ROt!?ʷt*]bHTUdAo[鍊C}S_Ȍ%LKnF)1`t]fU@]ELR7ɨWyO`(ߒ}zLU)iQLABRIR ʲHa,t+*,Z#LVgSbĀ, lO{IdYhE!>jLD2~l"Tn(OүRO(U)1(EQ)FPga:? :γ|%=B҃UgaVJɫ ،?ԟ{(W=H/hc\NFJ[٩Kᧄ>ҺH TF*]TEsbFit졿7=%2"kHI O,²]L 'Otbc;9#"[N 4?L/I W3 TALuѶeuH*}_c 4W9O>(b:tiO&$R,r6Z189e?$tRFY}i@pOE#hַqhؕ_W˥\?85HIM*5PI#IiVjc{-)&"A5|lQ39#C6v޺U,ANZhk+պ3Co_&+IPޮ&J~,L?R%W_ˬY#@M2DQaH$J՟:-*c5Z1G-2~eqAܼN?V:%jZ m0ތ2ΡiwJ+Q>Fo$mJi(SSD#]o_,'gizh <IV6[_O~=$WRxAR8o"4{~)5r:$ƣ=UBt~A/z+Li5Q^_r ^=Y?3R},I$Q2(VGs& ~TןgJ*7CMW-Q;Y3fKvP_5>+ Clj'dO*/:C~IO~޵u1Z=BT1oAYd8l:Tۛ_._.k\O䩢bxe2Hsc7Bx c|Sm_#T?5+'\1ɇZugF'BT쬿u:KCP9/%AICIqj*bZSDk3(& Ô`<4_eP/Gp:WRBbZ#LyhSTaX"?T~_GD;OR!WTn*J/b{_g=g d:CG hRpr:$|Q g+x% jpjiڮ j7O$7#oz_zQb*V6faJH>V?_d V@MVffT$UyZϧ%WhVG졿7S?U+R_#yOw0t>ߒ}V:kcYzfo3SdY>|8R0M!pKHuA%UC?F)q*}ץ?} 3~#:hd#Ƕe| .FG௽3SUzKYnPK-2bqMCWeeHA{>}g bގCJ,$\0gkw%g{/J?2 ,KR̩0B~ZBy~&? [_?2X~Lno8,&|o ?zt_쟟^) QP[# hjVjvo[b؏y/}HPz=j.D D"oی'}ץc_?. zӐgvDX5Y'+QaH$tοìDreZ0VeCDꗀߺ/fi5idW5 MHtnt`u KzUW_oC 75D7 iYoT{_]%W^T:3G IoZ$A)Ub;}_uOzaȦj`jjcPz-O+>gqr!I% %qVleS뀐_`uW UjũfTV"9,-67qYuеH"mQdOv0T>ߒ}S_?:=q1wJi aS`!zY>]xɫ\4lF>Z5FwѶeHPVy_?}RjWc m>8[`YrU6+UWzsƤ4gjIeXlp4b*P2Y {٧I)|YdjH6(pFZX?Wԯ{|>T_h#/Rԅqj3En}/ufBK Q dmDsy+UC>ҿXQǪ"]_tg2L5)O~u eT #XbauB~/ߙu5KfvGIsPei\v @ 'c c25b7L ^Nt]`wieY rFo x& 0fP5Q\:זx "F!ӠJLY{BC[=_!&Yн8bZbh׺3oS=>}$dש2&-YN+" b7->|~gbֈ$%#Kg:$04__Ho>ҟ_X҇b֭Sjezz(HRn^_{V?//;I*Hj4K5) Mс۾IZH@~־|XH;Z((.ʡG|XO izX%'@h}YoT?=_'zc zVG,umY+gjqJ~G11JL@j\jn1+E xo~zUÏgQtuL830_?s~7MKO?yYi E#Zxk22%a" E},w&eY]<>JpcT$ŠD OԼUwaK2qT1:F)F~@O{'_` Fhؘ]# i 㦉md"dUWGsZM4KLщY*^+7['ϐM:zؼXXdJxַq~O%{_Lb(~|–Ko/jDSox ޕ|ް; j|EX,-[BmX'?>hPbzufgig&NlG{_잱zFP=@Y ԇI2cp1O>JtXD*##Haw6:O!Qa}!$O}uuYKXLмVeg_28FI~>t_Q?d5 MHtEk0x,t=ֿ %v _J(>(vO?eP߽:KVXC ,GFъvipImxpR@tϨB1@"8Ŀo(ZMpՒ8sQJOcW%?IXcV];E OX ]B8'늪հn||(?T~A:SOwYq5bQHkrU~pH`8?7t_}C$TZWW"~KiC~I}*X_ԷgJ'ۙ+îEoTU$WgQeᦖD%媡T8> +*F*Uqaq'iᗘ _醢?}ۥ_`ujaOVZP6018N?c^]brА҂J8Qa Ԥ3Dێ_ҟTGKJgZjG(9T_%W EZ#MTmF0A'̪E7W׿Q!P^EZ#vM_ufjImE9߿JXUXQBA*Ty}(>&n2o{'B޿;974gI^m /-7zWްRXG):_N28፡j_tco#I*jh% `<(JX-/ߺS:@_+h:9bLF*=y<rjxc`GqVj@NW_QƱF&0H#-jtIMFz J؊cLZVWJɪ?I8g3atFl4$Z_չ3O@?Ot_ >5g $)Q܎e]:\vPߝ^ä}Gm5@]E]|)?K%Q}!$A5EDsf3?N4B:?L?_GpyPKUF#hF+Hʑp4{I+u]JfVf O(Q '`*za{~4J&XhK-2q8Vodp?I BUDIEOք3F_=_˨DjхJZJj5I%? ^XKe(#q&8969_I:QFEZQ5~ՙiد>zUz57U\^- 7 [}WuJZ?f׈i3@@O&oc; b]*ѡ*to)C8r$J%5ه}uMjb ]5P:q\6C_>CJ&Cp-b#Y ?t@i%bA>Ys^S0vZ)Ѡz_ѶƒR'qu.6fԒ ?y#RGq:?oˤ?ur1yTՕGn&-LOԀDWv:gjJHX0Xuw >^odU޺W!(05X 4)M>X59t>|̯gH(%v3Ru}zV/{Iu)BiI$j)F 8!6X9 #m~_.41=&FnSmD?:ꇿtʿ: D_S}sG]Q:l~K8}B4 )*NՍUr'ԅN,sҠLoӱT0ۊ rS{:IU?K?RJ4ՋZӬmOQ#$m~nA^_Mk_<u CK'?ΟJ~ GŃQ}gYGѥ/#(ztV$m$c'SWzWVRAjg:wjUwL]gM\{?}aR(D& 8hqO̾p=HʶPes.٦uTov_Žu=fa*I%:vz|o`\j*3وG{/:B 5\RIVpI,W'޾G|?R""Baq%d%!  {9!~W:KzʶJ%ZN[=s5Uk 0WϯqW?.HWj,1^8PhU_ҿ?:=aՖZU/hbv|I$4p}/߳PufW:4}c_?}!&ffΈ)g4 Qv:?>p5Y)-9YڧՍA";Ynd[Ǥ_%<48wU5L+6c\xu/ecj9 6lZQ,yX&?t_잲"Pu?Aq%S}?$Q_؋~A_잳FbU3W%-t%J5W3TIx>iN?gQ:MVfUzzXQ6DY_RMjȟ4GzE8hX?_}!7L^FU5F:/YGxDFhs{^W1kAE$ޒ&O(߽:W>}fxKqEq MOa5 Y̷7g|l ғ2Y:yj>;[o]ݩ׿J/ұI%8ZݨqѸerG _"Gzt_*܈Fmjȡ*пG,O+|zʷfTUd-5I6;hGtS]?^^ J&vU6o0Gu'T 9KIY~&s½R ,$V߿eã,KW/h94c<$MG|Ku!i^V\t՘]KXxI)8_zW={_hu-8Tk>N2p?zW] E?Yځlm*ZWgk?%cԕOޒ1(.=*UM[hfu^L/jJDbjᥬ'lD' YEelOO~W{=gE>E ]Z*Tn4hTb-޼K>|Ȉ%"/Z䤯a\y> OVӯ|"I/5bUʍOU?BjMA7]tu^#}if:rDV)|5[ïVYY]ZB OUA6!Fjd`S__1sgi"hrOJt7a|F?޲WD 8ҝ?hjcqFO*̷oOYԔZU)S٦ԓZ쿋{/?=dThhZwJ|o)q h1cO}{?\7T h-ן,O~[?eȳ?u֯ո3 ?@H :Uz T[b^k.j*^_˯q6e+}Iq}T‹D?M«/pӨ:U7Xiݩ3Gȣ^hLX[zX?zu}gˬr")$>jz/mDq+%*nq׿?z1d.ZOeQM;R)p{f14+>Fߺ}?{ui=E?ZߖR*;YT{J?돮Is漍/iSV"n*/%? cW7E?=b]}&Y ~VQ4pG?ϙ]"2r[`$Xxw@X0bzPJ! U+I3ui'&:TC{?!gXWYy 6O z=W_}ki5Q>?'༒ja`_>ֿ\2L^GU"jt_/XDFhT]OW_gX\;3ƋE$ԋ#RRYVl@6~W`|OmES,? OuX*{_/zUZOK L'_5IVje[߸$'g6ЉJER89% Əʟ{JpG"5PFZ(k\.זvx#}*W' M+JE4b6d$%S?S:u{Z~uB-ZJMjW0UYhhqzut_쟗X^XK16䩎Zc ?[{=kο58"JY'tWlhRHѭ>(}*g˨uiDcƚGm%dO.{W=$W2ͩԒBhvʖE'Su{_bM)Ǩ2B1t?}Ԟ{J_oXI$Y(4}U5d(qҼ y'?U_X?h*jҲ"V/+Y\By_ϙ>aХCDJow8H0oq~TWOX΢%JVVxLל%\<_MCt'[pbd+ es$urr5/cRk>F"}>Ii?0ң| \uY>zt_ѷ$-LasxZIgY&,2<&K@:߸$>}G#ZEjjPL5_|UzHK/U2.ڧ$5yZ_GDJY)Hwz|o7B&يG~ָG&Bct0׸yhu^;$pG_OQU)}`Byމjnq_dJʫJY&BC+&5}/Ftz_oXGR֥c=-Nzhj"#m䒺{~w:~D8h0 ?Ҿ?:-$ev AO!jdvN}tWXdc fycxZ9'Y&]OrH~:WQxِ04h򁅆~[wOY{Jlږ+KL64'_5Og?k~-I?uI$q<j)FՖMk?#G~Ҭ'RR7DC wwzI%"y[[{I?_zdf8A{sJB̚OrC{_ %Ts[={4y WJhqzu_g~C׵{YOk (pT_ߺI\; N͜>X9h _ȡuc0}rQ%'ƁGm%1/7_XdoKALg?هӉ/6-͔?eNǥYWYHS$ u"oOQ_5$bkH&Mk?S$W}ak)}k4xXziDc }]F1bՑRsD0CbW=Fuj㫗c"9ss{g*izk'JүQb%[Y D{{&~X^!h%GnD^\ɤ?~*=B{iB4kj 1~Hm$f?8ԧ{]avJg%yގ&,:;--rAr?ߺK_˨LER)$iS~hjGcqwO_{zS|N-u404~|yk&WQL'JGT$U,C-t]YxߺSQP鄚a(P{p,ZFuE>׿q5IR^q֠)yѺ) _15kj_כ#abuJb<W,16䨌V‡GV޺KbOzhU[LȮ=HI_.jţ47}σkz׺>o.m?^/Gp._+z<~; /FW=KMzk}>]?~W/ˬvѣtuMvIO'˩|:G?>=hұA~/o}Ǵ^/:K.E_?eoOGo/ֿzfҎ-4,6 /iWr{}뫏}>CԞ{[m?39h~^}ߗ㚾><+WRǓ@ߟ?k+QxsޏIey4C~]OB߇J|ξO_G>o}ϧ㧓INtjEy?G}+?.?}eKo/o˫o{O7ֿԱѯƟߺ[{g?]\::>@ίq_w]_{{.Ԩ^5_o~=W_*/}gx<4__Ox[^WR O}׃쿏i(1o3֯=$8|z^ͿY_ұN'~9q9oW~}@~q_uo }zG_>:MO_o.k_+NwQ!>Ou?v~Ptˣo]fO&__ckկG~^?~?okWsuZt Zi??coODիx|h7~{-?iKޞmwWUW"?Zwj߷oO?ÿhIq>{y[>Aow5~?.WRSow -O-xsޅ:Y צkjwv˟o.ݽ_}%W5?8>v~Os_y?sou5׿u,WG=?};O;}?c/>}sHG?zä|u%q>_G?zugh}3G9Ҽ|_YG/F_x8_^u^ϏϬ!{MoͣG>.<<_>>]44yÏQJZcﻷ}?C|_?.T-}:W?am2u_X7^~ytϤ_.myoW_o.ݽ׿ORv>}+~7k>iL^'k^Gz#qcw/n~Ͻ:|]$._oז߳oQ{/-QV}ÿh|Wo5yV w5~_ϭ<Uh?yo.m\_L??]N]>_e]?{]fѯƿ6?iy>O'h|?zt/Z|͏k/^z~7Owi9hNwͣyy=tgk%~׏O_q#^:)4<~F}}O>}˭χ~.<oi??-o~.}n> u7/>uvŵ}=o?t7[w:G?#m2>cϷO.^?G&+hzw߮zS<_ˇˬgOmƿ>>'kM=?i>_}ߧo~xycho_ǭQ^:{`W>_../t׫}ޟ_Qq'I?՟_׿jſ[sOg}_t>5_y_ռ^p>M?,/}_/O/{iJ T߫}=Wv~Po.ݿG=?4_cr#cO[{^| ix:U~_?h/=}??.~_'u~m?Ľ{g?oΒ}|ߟϮ ~|?m#~Zy|5>=ox?coѣ}X'O[Q) rx<z<=]~V{7?:GޝocAk0ޯz9'_:hwc~uWQ_Yo^]J|/[Gik?οqHO\N? >9{+N~_|y,>mjƝ$xyӮɧ_jo}|x<7-=\:|Ө4܇4woOBo'oV|M-W#otǦκyWun~4ᅦy>O'}q^G{9Zyxy?}(8S_]Qvϣg8=Zf!Ϭ_cxC}x~3vu~_O/G{sv{oz}?߿t_ϨU?O_so-]^tߟˮY>tjoy~ϲ ^u|ױӨ_4|>o^/8czUgXM'g}o?>]gI>ˬ27 c?GizvXңNM?c/m;R/MhNucc'vj{}wwOWXcT_e;<cwR}ƭkWk=)q&կ}} Aox/~W}*ϟ?zu4~_oo |ä_>b:&?o?ijG}_}(W~ݾH>=Zy?woǻuWӫB?8S}z/q<#~?J//z4_q:>yq_ƯkWߺgOmկ~Oǵq-x[[2ߣG_z=$3|o?uW q۷^ү?E>M#5}זO}'_~ϝ.Km_~Kw}oOBw}:|Ogѣt ϧ'X[|zkoOOu?O%Ǘ/t<y?oogW=?io'sK1koϽ':)WQ/h'z9'^WQEjݯs?WONżoO<?5~}'z~s[lei0ޫ~-޾ΕcOGޟ-]$z<ڏχG?_ޱt?pnp4nagios-0.6.16/share/pnp/media/css/ui-multisite/images/ui-icons_cd0a0a_256x240.png0000664000000000000000000001042111662503006026406 0ustar rootrootPNG  IHDRIJPLTE FcNtRNS2P."Tp@f` <BHJZ&0R,4j8D|($ blߝF>n~hhHIDATx]b۶H儒-{iZK:glkn-tIqq? E$dK>$>;PZsVh!Sy0E0}H)-t koܪKp\RϠ .E7 ) *V;~Pe Bx*,=$zDؾ JҸٻ9{ ǸHpqW@"2'B[$ @TiH/b٥96!XHq`DE*R HV!%;" i] dddddddd4y5  Rb@(8CdŪݡ,@T@ibrq0alX!pe, =4bW { 5Ƭhu~(Q^@3="b5XC@JCT76q_5 @,r šɩD)T|O@ ON-ՙ [n@RXIm݋(F @?=0puL;g$@6η K`>п @h գKVn"a" %l@.v$/U^ G:#`` uTtK~ŋZ5T%kxk]\*Q ,҇B44 OXK|yg+_M(lоEO V$T1BXb-|?@ fBXr%'@ҹA\IJ,}BBc\V rh(]tI^}oצo S3 ";ʙb}"߰ ){b$Gwwݾab")T@pF_er6JvШ"mޭM-d76x˰6ӥ;/`>KrP\_^u1%OTM.}Q3.Nس})>-w`a+sy$t)NbFFFFBejnNVn4,A*X*5>PGa 3 {oB &<L[ Nc.öi=`Q@d ͆I.Il`\t[< Cit484-r +f쑱BCB MH iy }>rxp|z;BǏ;burcK4tz1G~`ؚK| ̔>ۡO$~ Ao)0pzz }i`;ADm8n:cfA@s7L Z/..h8or? N93B~o_'`opO- :TG L;7]`B%˛>*wTpM0H}&t ^1'Oqr'2P͡+z,tIW''|en=dzgRm[NStK{҉mؓVt6ҲR`ζN&}B U(rۗ&1%Q''?l׸+&r{jN಻4) `N狌. ߭ ǣ)q 2?n3Hb`} .`pqY1e_bu7e+N_F(DT,L}LLrmP5|x芥1cx DAb`M(7NED~Mz +4BXd.Mzv͈Pd8p<6?8N*x.6ڍ6GFZ)O !lSshssNp8`'0/<s}.@Ǩs7ξO۟VDa5av]m1+3y6۠>@u50Ps51==p *KVҫ܂ݻc$N4(Xr2###c- 賟Lδ>]5.sYs1f0;'̨Yg銛{@9 `aC(=%bo2=n1 jBoS$n#m=i0ci9}oI qT]W%.(؅]z\x f"]o'u䫵tk{v;AC3ֆwwR_#X (xҋ/q%W hpk_IX'b/fXKi"#####QCLi2t 5L0 QiH2;yTOok;ע ٶ`RNg{zy!Kxm?A(vU~mL(`o/!nmX-{v[ dw=n「sdwzn(}Oy~ m ?XU;,V'+ V&JRZ]᧭:zC'-߆@y 4u `Vۓwъ#zP@Q N>2/{\o)W~a3xLw :_Q;=pּdt\'8~3SRP6y+XQ*޺r ̗ѭ*޺r gl/\U^u$|mbVnw \V|D͊NVNy7k<;/E}?E*dzgO ~g/96f cD}% g$QG7o)U Jo,O@0߾Q(;bw:5 NwRN5Iy'K?}:9mֽ*@f@jU9mҫÍ{$ؗ}dFp|%!DdF>}G{@FFFFFFƦQܞH 3 u Mo~vy}mwz<7nP9rWku=|_nz쿳}@IXn?sn~hhHIDATx]b۶H儒-{iZK:glkn-tIqq? E$dK>$>;PZsVh!Sy0E0}H)-t koܪKp\RϠ .E7 ) *V;~Pe Bx*,=$zDؾ JҸٻ9{ ǸHpqW@"2'B[$ @TiH/b٥96!XHq`DE*R HV!%;" i] dddddddd4y5  Rb@(8CdŪݡ,@T@ibrq0alX!pe, =4bW { 5Ƭhu~(Q^@3="b5XC@JCT76q_5 @,r šɩD)T|O@ ON-ՙ [n@RXIm݋(F @?=0puL;g$@6η K`>п @h գKVn"a" %l@.v$/U^ G:#`` uTtK~ŋZ5T%kxk]\*Q ,҇B44 OXK|yg+_M(lоEO V$T1BXb-|?@ fBXr%'@ҹA\IJ,}BBc\V rh(]tI^}oצo S3 ";ʙb}"߰ ){b$Gwwݾab")T@pF_er6JvШ"mޭM-d76x˰6ӥ;/`>KrP\_^u1%OTM.}Q3.Nس})>-w`a+sy$t)NbFFFFBejnNVn4,A*X*5>PGa 3 {oB &<L[ Nc.öi=`Q@d ͆I.Il`\t[< Cit484-r +f쑱BCB MH iy }>rxp|z;BǏ;burcK4tz1G~`ؚK| ̔>ۡO$~ Ao)0pzz }i`;ADm8n:cfA@s7L Z/..h8or? N93B~o_'`opO- :TG L;7]`B%˛>*wTpM0H}&t ^1'Oqr'2P͡+z,tIW''|en=dzgRm[NStK{҉mؓVt6ҲR`ζN&}B U(rۗ&1%Q''?l׸+&r{jN಻4) `N狌. ߭ ǣ)q 2?n3Hb`} .`pqY1e_bu7e+N_F(DT,L}LLrmP5|x芥1cx DAb`M(7NED~Mz +4BXd.Mzv͈Pd8p<6?8N*x.6ڍ6GFZ)O !lSshssNp8`'0/<s}.@Ǩs7ξO۟VDa5av]m1+3y6۠>@u50Ps51==p *KVҫ܂ݻc$N4(Xr2###c- 賟Lδ>]5.sYs1f0;'̨Yg銛{@9 `aC(=%bo2=n1 jBoS$n#m=i0ci9}oI qT]W%.(؅]z\x f"]o'u䫵tk{v;AC3ֆwwR_#X (xҋ/q%W hpk_IX'b/fXKi"#####QCLi2t 5L0 QiH2;yTOok;ע ٶ`RNg{zy!Kxm?A(vU~mL(`o/!nmX-{v[ dw=n「sdwzn(}Oy~ m ?XU;,V'+ V&JRZ]᧭:zC'-߆@y 4u `Vۓwъ#zP@Q N>2/{\o)W~a3xLw :_Q;=pּdt\'8~3SRP6y+XQ*޺r ̗ѭ*޺r gl/\U^u$|mbVnw \V|D͊NVNy7k<;/E}?E*dzgO ~g/96f cD}% g$QG7o)U Jo,O@0߾Q(;bw:5 NwRN5Iy'K?}:9mֽ*@f@jU9mҫÍ{$ؗ}dFp|%!DdF>}G{@FFFFFFƦQܞH 3 u Mo~vy}mwz<7nP9rWku=|_nz쿳}@IXn?sn~hhHIDATx]b۶H儒-{iZK:glkn-tIqq? E$dK>$>;PZsVh!Sy0E0}H)-t koܪKp\RϠ .E7 ) *V;~Pe Bx*,=$zDؾ JҸٻ9{ ǸHpqW@"2'B[$ @TiH/b٥96!XHq`DE*R HV!%;" i] dddddddd4y5  Rb@(8CdŪݡ,@T@ibrq0alX!pe, =4bW { 5Ƭhu~(Q^@3="b5XC@JCT76q_5 @,r šɩD)T|O@ ON-ՙ [n@RXIm݋(F @?=0puL;g$@6η K`>п @h գKVn"a" %l@.v$/U^ G:#`` uTtK~ŋZ5T%kxk]\*Q ,҇B44 OXK|yg+_M(lоEO V$T1BXb-|?@ fBXr%'@ҹA\IJ,}BBc\V rh(]tI^}oצo S3 ";ʙb}"߰ ){b$Gwwݾab")T@pF_er6JvШ"mޭM-d76x˰6ӥ;/`>KrP\_^u1%OTM.}Q3.Nس})>-w`a+sy$t)NbFFFFBejnNVn4,A*X*5>PGa 3 {oB &<L[ Nc.öi=`Q@d ͆I.Il`\t[< Cit484-r +f쑱BCB MH iy }>rxp|z;BǏ;burcK4tz1G~`ؚK| ̔>ۡO$~ Ao)0pzz }i`;ADm8n:cfA@s7L Z/..h8or? N93B~o_'`opO- :TG L;7]`B%˛>*wTpM0H}&t ^1'Oqr'2P͡+z,tIW''|en=dzgRm[NStK{҉mؓVt6ҲR`ζN&}B U(rۗ&1%Q''?l׸+&r{jN಻4) `N狌. ߭ ǣ)q 2?n3Hb`} .`pqY1e_bu7e+N_F(DT,L}LLrmP5|x芥1cx DAb`M(7NED~Mz +4BXd.Mzv͈Pd8p<6?8N*x.6ڍ6GFZ)O !lSshssNp8`'0/<s}.@Ǩs7ξO۟VDa5av]m1+3y6۠>@u50Ps51==p *KVҫ܂ݻc$N4(Xr2###c- 賟Lδ>]5.sYs1f0;'̨Yg銛{@9 `aC(=%bo2=n1 jBoS$n#m=i0ci9}oI qT]W%.(؅]z\x f"]o'u䫵tk{v;AC3ֆwwR_#X (xҋ/q%W hpk_IX'b/fXKi"#####QCLi2t 5L0 QiH2;yTOok;ע ٶ`RNg{zy!Kxm?A(vU~mL(`o/!nmX-{v[ dw=n「sdwzn(}Oy~ m ?XU;,V'+ V&JRZ]᧭:zC'-߆@y 4u `Vۓwъ#zP@Q N>2/{\o)W~a3xLw :_Q;=pּdt\'8~3SRP6y+XQ*޺r ̗ѭ*޺r gl/\U^u$|mbVnw \V|D͊NVNy7k<;/E}?E*dzgO ~g/96f cD}% g$QG7o)U Jo,O@0߾Q(;bw:5 NwRN5Iy'K?}:9mֽ*@f@jU9mҫÍ{$ؗ}dFp|%!DdF>}G{@FFFFFFƦQܞH 3 u Mo~vy}mwz<7nP9rWku=|_nz쿳}@IXn?sn~hhHIDATx]b۶H儒-{iZK:glkn-tIqq? E$dK>$>;PZsVh!Sy0E0}H)-t koܪKp\RϠ .E7 ) *V;~Pe Bx*,=$zDؾ JҸٻ9{ ǸHpqW@"2'B[$ @TiH/b٥96!XHq`DE*R HV!%;" i] dddddddd4y5  Rb@(8CdŪݡ,@T@ibrq0alX!pe, =4bW { 5Ƭhu~(Q^@3="b5XC@JCT76q_5 @,r šɩD)T|O@ ON-ՙ [n@RXIm݋(F @?=0puL;g$@6η K`>п @h գKVn"a" %l@.v$/U^ G:#`` uTtK~ŋZ5T%kxk]\*Q ,҇B44 OXK|yg+_M(lоEO V$T1BXb-|?@ fBXr%'@ҹA\IJ,}BBc\V rh(]tI^}oצo S3 ";ʙb}"߰ ){b$Gwwݾab")T@pF_er6JvШ"mޭM-d76x˰6ӥ;/`>KrP\_^u1%OTM.}Q3.Nس})>-w`a+sy$t)NbFFFFBejnNVn4,A*X*5>PGa 3 {oB &<L[ Nc.öi=`Q@d ͆I.Il`\t[< Cit484-r +f쑱BCB MH iy }>rxp|z;BǏ;burcK4tz1G~`ؚK| ̔>ۡO$~ Ao)0pzz }i`;ADm8n:cfA@s7L Z/..h8or? N93B~o_'`opO- :TG L;7]`B%˛>*wTpM0H}&t ^1'Oqr'2P͡+z,tIW''|en=dzgRm[NStK{҉mؓVt6ҲR`ζN&}B U(rۗ&1%Q''?l׸+&r{jN಻4) `N狌. ߭ ǣ)q 2?n3Hb`} .`pqY1e_bu7e+N_F(DT,L}LLrmP5|x芥1cx DAb`M(7NED~Mz +4BXd.Mzv͈Pd8p<6?8N*x.6ڍ6GFZ)O !lSshssNp8`'0/<s}.@Ǩs7ξO۟VDa5av]m1+3y6۠>@u50Ps51==p *KVҫ܂ݻc$N4(Xr2###c- 賟Lδ>]5.sYs1f0;'̨Yg銛{@9 `aC(=%bo2=n1 jBoS$n#m=i0ci9}oI qT]W%.(؅]z\x f"]o'u䫵tk{v;AC3ֆwwR_#X (xҋ/q%W hpk_IX'b/fXKi"#####QCLi2t 5L0 QiH2;yTOok;ע ٶ`RNg{zy!Kxm?A(vU~mL(`o/!nmX-{v[ dw=n「sdwzn(}Oy~ m ?XU;,V'+ V&JRZ]᧭:zC'-߆@y 4u `Vۓwъ#zP@Q N>2/{\o)W~a3xLw :_Q;=pּdt\'8~3SRP6y+XQ*޺r ̗ѭ*޺r gl/\U^u$|mbVnw \V|D͊NVNy7k<;/E}?E*dzgO ~g/96f cD}% g$QG7o)U Jo,O@0߾Q(;bw:5 NwRN5Iy'K?}:9mֽ*@f@jU9mҫÍ{$ؗ}dFp|%!DdF>}G{@FFFFFFƦQܞH 3 u Mo~vy}mwz<7nP9rWku=|_nz쿳}@IXn?sn~hhHIDATx]b۶H儒-{iZK:glkn-tIqq? E$dK>$>;PZsVh!Sy0E0}H)-t koܪKp\RϠ .E7 ) *V;~Pe Bx*,=$zDؾ JҸٻ9{ ǸHpqW@"2'B[$ @TiH/b٥96!XHq`DE*R HV!%;" i] dddddddd4y5  Rb@(8CdŪݡ,@T@ibrq0alX!pe, =4bW { 5Ƭhu~(Q^@3="b5XC@JCT76q_5 @,r šɩD)T|O@ ON-ՙ [n@RXIm݋(F @?=0puL;g$@6η K`>п @h գKVn"a" %l@.v$/U^ G:#`` uTtK~ŋZ5T%kxk]\*Q ,҇B44 OXK|yg+_M(lоEO V$T1BXb-|?@ fBXr%'@ҹA\IJ,}BBc\V rh(]tI^}oצo S3 ";ʙb}"߰ ){b$Gwwݾab")T@pF_er6JvШ"mޭM-d76x˰6ӥ;/`>KrP\_^u1%OTM.}Q3.Nس})>-w`a+sy$t)NbFFFFBejnNVn4,A*X*5>PGa 3 {oB &<L[ Nc.öi=`Q@d ͆I.Il`\t[< Cit484-r +f쑱BCB MH iy }>rxp|z;BǏ;burcK4tz1G~`ؚK| ̔>ۡO$~ Ao)0pzz }i`;ADm8n:cfA@s7L Z/..h8or? N93B~o_'`opO- :TG L;7]`B%˛>*wTpM0H}&t ^1'Oqr'2P͡+z,tIW''|en=dzgRm[NStK{҉mؓVt6ҲR`ζN&}B U(rۗ&1%Q''?l׸+&r{jN಻4) `N狌. ߭ ǣ)q 2?n3Hb`} .`pqY1e_bu7e+N_F(DT,L}LLrmP5|x芥1cx DAb`M(7NED~Mz +4BXd.Mzv͈Pd8p<6?8N*x.6ڍ6GFZ)O !lSshssNp8`'0/<s}.@Ǩs7ξO۟VDa5av]m1+3y6۠>@u50Ps51==p *KVҫ܂ݻc$N4(Xr2###c- 賟Lδ>]5.sYs1f0;'̨Yg銛{@9 `aC(=%bo2=n1 jBoS$n#m=i0ci9}oI qT]W%.(؅]z\x f"]o'u䫵tk{v;AC3ֆwwR_#X (xҋ/q%W hpk_IX'b/fXKi"#####QCLi2t 5L0 QiH2;yTOok;ע ٶ`RNg{zy!Kxm?A(vU~mL(`o/!nmX-{v[ dw=n「sdwzn(}Oy~ m ?XU;,V'+ V&JRZ]᧭:zC'-߆@y 4u `Vۓwъ#zP@Q N>2/{\o)W~a3xLw :_Q;=pּdt\'8~3SRP6y+XQ*޺r ̗ѭ*޺r gl/\U^u$|mbVnw \V|D͊NVNy7k<;/E}?E*dzgO ~g/96f cD}% g$QG7o)U Jo,O@0߾Q(;bw:5 NwRN5Iy'K?}:9mֽ*@f@jU9mҫÍ{$ؗ}dFp|%!DdF>}G{@FFFFFFƦQܞH 3 u Mo~vy}mwz<7nP9rWku=|_nz쿳}@IXn?sIDAT81 0Cџ $CB}1@)e_ƅ`I8-%cM0 )" LIENDB`pnp4nagios-0.6.16/share/pnp/media/css/ui-redmond/images/ui-icons_cd0a0a_256x240.png0000664000000000000000000001042111662503006026017 0ustar rootrootPNG  IHDRIJPLTE 7NtRNS2P."Tp@f` <BHJZ&0R,4j8D|($ blߝF>n~hhHIDATx]b۶H儒-{iZK:glkn-tIqq? E$dK>$>;PZsVh!Sy0E0}H)-t koܪKp\RϠ .E7 ) *V;~Pe Bx*,=$zDؾ JҸٻ9{ ǸHpqW@"2'B[$ @TiH/b٥96!XHq`DE*R HV!%;" i] dddddddd4y5  Rb@(8CdŪݡ,@T@ibrq0alX!pe, =4bW { 5Ƭhu~(Q^@3="b5XC@JCT76q_5 @,r šɩD)T|O@ ON-ՙ [n@RXIm݋(F @?=0puL;g$@6η K`>п @h գKVn"a" %l@.v$/U^ G:#`` uTtK~ŋZ5T%kxk]\*Q ,҇B44 OXK|yg+_M(lоEO V$T1BXb-|?@ fBXr%'@ҹA\IJ,}BBc\V rh(]tI^}oצo S3 ";ʙb}"߰ ){b$Gwwݾab")T@pF_er6JvШ"mޭM-d76x˰6ӥ;/`>KrP\_^u1%OTM.}Q3.Nس})>-w`a+sy$t)NbFFFFBejnNVn4,A*X*5>PGa 3 {oB &<L[ Nc.öi=`Q@d ͆I.Il`\t[< Cit484-r +f쑱BCB MH iy }>rxp|z;BǏ;burcK4tz1G~`ؚK| ̔>ۡO$~ Ao)0pzz }i`;ADm8n:cfA@s7L Z/..h8or? N93B~o_'`opO- :TG L;7]`B%˛>*wTpM0H}&t ^1'Oqr'2P͡+z,tIW''|en=dzgRm[NStK{҉mؓVt6ҲR`ζN&}B U(rۗ&1%Q''?l׸+&r{jN಻4) `N狌. ߭ ǣ)q 2?n3Hb`} .`pqY1e_bu7e+N_F(DT,L}LLrmP5|x芥1cx DAb`M(7NED~Mz +4BXd.Mzv͈Pd8p<6?8N*x.6ڍ6GFZ)O !lSshssNp8`'0/<s}.@Ǩs7ξO۟VDa5av]m1+3y6۠>@u50Ps51==p *KVҫ܂ݻc$N4(Xr2###c- 賟Lδ>]5.sYs1f0;'̨Yg銛{@9 `aC(=%bo2=n1 jBoS$n#m=i0ci9}oI qT]W%.(؅]z\x f"]o'u䫵tk{v;AC3ֆwwR_#X (xҋ/q%W hpk_IX'b/fXKi"#####QCLi2t 5L0 QiH2;yTOok;ע ٶ`RNg{zy!Kxm?A(vU~mL(`o/!nmX-{v[ dw=n「sdwzn(}Oy~ m ?XU;,V'+ V&JRZ]᧭:zC'-߆@y 4u `Vۓwъ#zP@Q N>2/{\o)W~a3xLw :_Q;=pּdt\'8~3SRP6y+XQ*޺r ̗ѭ*޺r gl/\U^u$|mbVnw \V|D͊NVNy7k<;/E}?E*dzgO ~g/96f cD}% g$QG7o)U Jo,O@0߾Q(;bw:5 NwRN5Iy'K?}:9mֽ*@f@jU9mҫÍ{$ؗ}dFp|%!DdF>}G{@FFFFFFƦQܞH 3 u Mo~vy}mwz<7nP9rWku=|_nz쿳}@IXn?sn~hhHIDATx]b۶H儒-{iZK:glkn-tIqq? E$dK>$>;PZsVh!Sy0E0}H)-t koܪKp\RϠ .E7 ) *V;~Pe Bx*,=$zDؾ JҸٻ9{ ǸHpqW@"2'B[$ @TiH/b٥96!XHq`DE*R HV!%;" i] dddddddd4y5  Rb@(8CdŪݡ,@T@ibrq0alX!pe, =4bW { 5Ƭhu~(Q^@3="b5XC@JCT76q_5 @,r šɩD)T|O@ ON-ՙ [n@RXIm݋(F @?=0puL;g$@6η K`>п @h գKVn"a" %l@.v$/U^ G:#`` uTtK~ŋZ5T%kxk]\*Q ,҇B44 OXK|yg+_M(lоEO V$T1BXb-|?@ fBXr%'@ҹA\IJ,}BBc\V rh(]tI^}oצo S3 ";ʙb}"߰ ){b$Gwwݾab")T@pF_er6JvШ"mޭM-d76x˰6ӥ;/`>KrP\_^u1%OTM.}Q3.Nس})>-w`a+sy$t)NbFFFFBejnNVn4,A*X*5>PGa 3 {oB &<L[ Nc.öi=`Q@d ͆I.Il`\t[< Cit484-r +f쑱BCB MH iy }>rxp|z;BǏ;burcK4tz1G~`ؚK| ̔>ۡO$~ Ao)0pzz }i`;ADm8n:cfA@s7L Z/..h8or? N93B~o_'`opO- :TG L;7]`B%˛>*wTpM0H}&t ^1'Oqr'2P͡+z,tIW''|en=dzgRm[NStK{҉mؓVt6ҲR`ζN&}B U(rۗ&1%Q''?l׸+&r{jN಻4) `N狌. ߭ ǣ)q 2?n3Hb`} .`pqY1e_bu7e+N_F(DT,L}LLrmP5|x芥1cx DAb`M(7NED~Mz +4BXd.Mzv͈Pd8p<6?8N*x.6ڍ6GFZ)O !lSshssNp8`'0/<s}.@Ǩs7ξO۟VDa5av]m1+3y6۠>@u50Ps51==p *KVҫ܂ݻc$N4(Xr2###c- 賟Lδ>]5.sYs1f0;'̨Yg銛{@9 `aC(=%bo2=n1 jBoS$n#m=i0ci9}oI qT]W%.(؅]z\x f"]o'u䫵tk{v;AC3ֆwwR_#X (xҋ/q%W hpk_IX'b/fXKi"#####QCLi2t 5L0 QiH2;yTOok;ע ٶ`RNg{zy!Kxm?A(vU~mL(`o/!nmX-{v[ dw=n「sdwzn(}Oy~ m ?XU;,V'+ V&JRZ]᧭:zC'-߆@y 4u `Vۓwъ#zP@Q N>2/{\o)W~a3xLw :_Q;=pּdt\'8~3SRP6y+XQ*޺r ̗ѭ*޺r gl/\U^u$|mbVnw \V|D͊NVNy7k<;/E}?E*dzgO ~g/96f cD}% g$QG7o)U Jo,O@0߾Q(;bw:5 NwRN5Iy'K?}:9mֽ*@f@jU9mҫÍ{$ؗ}dFp|%!DdF>}G{@FFFFFFƦQܞH 3 u Mo~vy}mwz<7nP9rWku=|_nz쿳}@IXn?sn~hhHIDATx]b۶H儒-{iZK:glkn-tIqq? E$dK>$>;PZsVh!Sy0E0}H)-t koܪKp\RϠ .E7 ) *V;~Pe Bx*,=$zDؾ JҸٻ9{ ǸHpqW@"2'B[$ @TiH/b٥96!XHq`DE*R HV!%;" i] dddddddd4y5  Rb@(8CdŪݡ,@T@ibrq0alX!pe, =4bW { 5Ƭhu~(Q^@3="b5XC@JCT76q_5 @,r šɩD)T|O@ ON-ՙ [n@RXIm݋(F @?=0puL;g$@6η K`>п @h գKVn"a" %l@.v$/U^ G:#`` uTtK~ŋZ5T%kxk]\*Q ,҇B44 OXK|yg+_M(lоEO V$T1BXb-|?@ fBXr%'@ҹA\IJ,}BBc\V rh(]tI^}oצo S3 ";ʙb}"߰ ){b$Gwwݾab")T@pF_er6JvШ"mޭM-d76x˰6ӥ;/`>KrP\_^u1%OTM.}Q3.Nس})>-w`a+sy$t)NbFFFFBejnNVn4,A*X*5>PGa 3 {oB &<L[ Nc.öi=`Q@d ͆I.Il`\t[< Cit484-r +f쑱BCB MH iy }>rxp|z;BǏ;burcK4tz1G~`ؚK| ̔>ۡO$~ Ao)0pzz }i`;ADm8n:cfA@s7L Z/..h8or? N93B~o_'`opO- :TG L;7]`B%˛>*wTpM0H}&t ^1'Oqr'2P͡+z,tIW''|en=dzgRm[NStK{҉mؓVt6ҲR`ζN&}B U(rۗ&1%Q''?l׸+&r{jN಻4) `N狌. ߭ ǣ)q 2?n3Hb`} .`pqY1e_bu7e+N_F(DT,L}LLrmP5|x芥1cx DAb`M(7NED~Mz +4BXd.Mzv͈Pd8p<6?8N*x.6ڍ6GFZ)O !lSshssNp8`'0/<s}.@Ǩs7ξO۟VDa5av]m1+3y6۠>@u50Ps51==p *KVҫ܂ݻc$N4(Xr2###c- 賟Lδ>]5.sYs1f0;'̨Yg銛{@9 `aC(=%bo2=n1 jBoS$n#m=i0ci9}oI qT]W%.(؅]z\x f"]o'u䫵tk{v;AC3ֆwwR_#X (xҋ/q%W hpk_IX'b/fXKi"#####QCLi2t 5L0 QiH2;yTOok;ע ٶ`RNg{zy!Kxm?A(vU~mL(`o/!nmX-{v[ dw=n「sdwzn(}Oy~ m ?XU;,V'+ V&JRZ]᧭:zC'-߆@y 4u `Vۓwъ#zP@Q N>2/{\o)W~a3xLw :_Q;=pּdt\'8~3SRP6y+XQ*޺r ̗ѭ*޺r gl/\U^u$|mbVnw \V|D͊NVNy7k<;/E}?E*dzgO ~g/96f cD}% g$QG7o)U Jo,O@0߾Q(;bw:5 NwRN5Iy'K?}:9mֽ*@f@jU9mҫÍ{$ؗ}dFp|%!DdF>}G{@FFFFFFƦQܞH 3 u Mo~vy}mwz<7nP9rWku=|_nz쿳}@IXn?sP-IENDB`pnp4nagios-0.6.16/share/pnp/media/css/images/0000775000000000000000000000000011662503006017400 5ustar rootrootpnp4nagios-0.6.16/share/pnp/media/css/images/icons-36-black.png0000664000000000000000000000765311662503006022534 0ustar rootrootPNG  IHDR $bsBITOPLTEĵ}{|kkkSSSBBB>;<:::956333***.*+&"#!!!!ҽ}{|kkkfff[YYSSSJJJBBB>;<:::956333***.*+&"#!!!!ę}{|rrrkkkfff[YYSSSJJJ&"#!!!BBB!!!Ľ>;;<956!333.*+!333.*+***!&"#!!tRNS"""""""""""""""""""""""""""""""33333333333333DDDDDDDDDUUUUUUUUUUffffffwwwwwwwww . pHYs  ~tEXtCreation Time3/25/11 RtEXtSoftwareAdobe Fireworks CS5q6 IDATx]VUkVۅ-|".*vWm[WTQL%Ϳm3dvsNt{ؙ0|C=vP22 >>iq*#ٯF1.ag.ċSxx|AE[A`AuC1&J! DI{P 2tlZw+t#򐊋Hŀ/QR$j24QeJ`D"4½xF?+ x](: -uW!K+}!9Ӎ7(pL\ pDܒމQVue9o9 IE΃,F v#j'P>(M׈MXEp-P6c-uӄύ7` OOK&Y8"YM0J[ӈDd!)&`N<ݮfywMT؛Ǚ&7RU" 6)D + _\:QUnGdْ'[F,Uh\ChHQ&vF'  0O .x>1|f|uGkA{DIՀbAᨄ&q9 X/ba3D1<^?ؘ> a 0K `GR nw/y\x7gjݮ=i>?bnuT s GT,ATiYJit!&Zkݔ h]"~N L8a+3o>1}eDV?MNԂzb`\eosy#L)@(󂲀Otj1ن!$2>"ǴHyI_7BԠȲB@}^qp?>񃭬9dJ hR:v\øLfJ@G5U%$%g& k(b$>Kvy}-T2LP OmrcHD ~+HtV.< +\1ǟjé&8<g_#PW$-0]@!ItT_q#DhF 3SgCuOM &rs?gEoU :q@7V*)'~[,.m]\,O?ZYdG!h2[,Ub[gJ3l5,DTU쭾X?~zi #ὭPo,Q?Lpl$ۇ?i3h1`~cAfOmrn7B; G:4ã%x^aCdm'y]z*/:ԁE;_yʉӉAŗN_>ՇSxxxx|孕=xy81sp*ÏtT<Kop*}w/ow[/"Ql;o?v©x<<<<<5>|Whd3"IENDB`pnp4nagios-0.6.16/share/pnp/media/css/images/icons-18-black.png0000664000000000000000000000413211662503006022521 0ustar rootrootPNG  IHDR~ EsBITO PLTEԹ{{{SSSLLLBBB:::333+++&"#!!!̹iiia^_ZYYSSSLLLBBB:::333+++&"#!!!{{{rrrskk!!!!ZYY{{{!!!!&"#{{{856!rrrfffa^_RJR!SSS!!!:::!856&"#!!!+++&"#!!!!!`tRNS""""""""""""""""""""""333333333DDDDUUUUUUUUfffwwwwe f pHYs  ~tEXtCreation Time3/25/11 RtEXtSoftwareAdobe Fireworks CS5q6IDAThZ wD RhƢ`>  ƑP/w]6V~gO|d~1A =,|[tK,w!)p ax2,bkQZ'z /O2/S^CC< c ljHO"l^dIC9:OU@A?XH0*%!xRiS d2^fL]Փ"" !tfFKLKvJTtS%5囿~rq!Ã!a!M΃]Vs29!Vu{A1ne4hDfJWrajP4g #F0fD -ZҾh4mg}`/[PL[y KlK%P YDL#GX)r+ F!Ӓh&!M5`+:(pħdZ0EiKn*Aެ*-hݻn4z^5kfZ{eIV%䭮ʅXMk)A6h+Ha/mPZEp)}<K^ .q {ڌŋbRDy%15N >NOg8MKJ{gisdc>_͛Y53~F Zf*3,˔, KvN6/|"i8]eCÄAMe:p`(66$4| CNFXh}ZB/#sf<8~2x͛9>kf)یN+'ZAʾ'D#WbāUyN+ 6JS…KYc%hNӠW:HbْK?eݕ{O߹x'FNr\Z!5cOpmj-y-4V x t5 HLul7"RҔ$5ർ6#9#&x A%9¸Tsf_jwqrO8ែ?f>B֧ ÃpXC N, ~dx0K|9.,ѫ=]C8rիW.P? &6 SuIENDB`pnp4nagios-0.6.16/share/pnp/media/css/images/icon-search-black.png0000664000000000000000000000233511662503006023356 0ustar rootrootPNG  IHDRatEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp QIDATxڔ+DQc +,,BDJl$k0CX KKD(=41Ӽms{f{*F;pcʤz;8D?D#p `DQN'[_ܣ;.0_D0spj \17 ,n@hФwN46.ů;$oZ0Z5:\ @E|t:ڴ3.zCfa%eO2 jvNk߰؏B{]IENDB`pnp4nagios-0.6.16/share/pnp/media/css/images/icons-36-white.png0000664000000000000000000001036711662503006022574 0ustar rootrootPNG  IHDR $bsBITOPLTEĵyyykkkRRRBBB:::333)))!!!̾yyykkkfff[[[RRRKKKBBB:::333)))!!!ę:::333)))!!!!!![[[)))tttKKK)))yyyfff[[[BBB:::)))!!!tttkkkRRR333kkkKKKBBBľľ{^utRNS"""""""""""""""""""""""""3333333333DDDDDDDUUUUffffffwwwwwwxL pHYs  ~tEXtCreation Time3/25/11 RtEXtSoftwareAdobe Fireworks CS5q6IDATx] {G$i4qTj[[/ [AxH[`iJ]m]=wH[wϏ~ޓ{gf{JB7g҂iҌgcaaaq1;h) Ӎ;P 9 SpɰCQ(|NFIl(ns , &eAʒ4CaߦX2㉪KA C CUW(L<#X~/`bȊRa5j'8p ; v\"i|ۙVQb@M&5 45tj43Qďf{x{wvo}E(r0H#2#8 y6Öi1q)_Q*' 0(q1ow%Ӯ/\ \ m. j24b . <AW~N x~Th G 3x(|jV (Ր-N"“͌(\.ܒ}7O#*n](D3h*nCޠR}]* &%_sPi W~AW3<8  drt.%s ш_gV A. $I ўneII<{2\|x~|&zk  &} $e=yJ#?c/S9 a֙N8UrDN *\T&?+$P/ڲkV >d-!{/#>i沆 r %wGpn؏3cB dhN`̢'O/nlYk4X BGi҇~F. FjQ\s2q |I#Y~xǭ t Gnx̔a^9qa*5s} 8cVyE*};B#y~0n0-X0Vj-%49 4)5@%ݩZ/YeNE&T$^zp~ y謪u=5q5]#dQ-+e$I>x#)>xXkDqCbMԧb j.kD~ΠaF+bTRjon"L2MK%`* NXQ:gl EjN᎕G 3Q_n->K[si)-XrpHAtĄ[[[O/m.I jJ u(`%oqS1TEcZ0 @#j]m}duꗨ4$C8Y1dN 1o >"EAd& b/\ 4\4Un S* ݭ-nsuu1SxJsk) t3#]+dc/{o1RwJ1m;> 8FTWAI>76-cJ6I Tv Gqcb@^jK:`R-ZWLTIԫ52S8MdXw)1@+CȹX1\^ep9إ@0)d+ 8y&ENK |rpU-{i]Bۀޘ| ѹB 1 \ n^)2g//F\~uWGLXXXX~|ku6 hs멇 (Ɒ8 ox͜s._o\C) eg3y(G=IENDB`pnp4nagios-0.6.16/share/pnp/media/css/images/icons-18-white.png0000664000000000000000000000423711662503006022573 0ustar rootrootPNG  IHDR~ EsBITO,PLTE׼{{{SSSIIIBBB:::333)))!!!̶iii[[[SSSIIIBBB:::333)))!!!333)))!!!BBB!!!:::333333)))sss{{{III׭IIIיfffȼdtRNS"""""""""""""""""""""3333333DDDDDDUUUUffffwwwww5w pHYs  ~tEXtCreation Time3/25/11 RtEXtSoftwareAdobe Fireworks CS5q6QIDAThZ sDwzY]+"#E mqޮ$:%q)=J]DzX?[P9GDN5xKʭEHY /5l49ucm-@{l5NT>m{(B"9}ڜ[!/Y!k 9ɱ P/(aV^Q7 l~/~߿h Of֤QTZR!@8BىRSY2].~B,d(a *,$˫X͓iE  ^7G'$g 8$ǃ8X\v+B̾޷ ۟Lf{{ɤm[RD>rNH%d1 tbJ`It,p$DJMAZOT+`+j`QAV("xT`1%o^oٟB~:hrzu&;!ƫݝI+ga23ӭKhEIIxATNd4^.6!8~e1\4Tb@-kVI=8[r~xyW|Dk-)g#\;?y:u79:+]ޡ\{SÒÏ:+G/-yJ {BJXPLȐd)3ˎ#kN/hi>r0k- ={T nd:, u;fO_)p;_y=85,98`&%P. iX"-/0 HL5=J٢^ BP_3>tS5"ZZ_ q"_e,B+Kc7v]ZѤwArAO6N KYr!/kctkhk$1SJP:(6uĕvFҾl*~,3_H6B$h!,W{y!2=.\b+33H갌*!%VPX^ޮF`~TB_F*%ʍ>9F\v(ò{]kb?Bj63::MSGrq|:r mNrV"򪇪Vj,EK4:]X„Ks;- Q agCt?|,S|Ѽ8KZ%\u7OG`wtt)`8#9 g%B`j=G؈E/#lGb{#Tt~ƔXdrI%QhGFtIK\ [w++R|>p Ŷӑh<nOAsm(+a[BIENDB`pnp4nagios-0.6.16/share/pnp/media/css/images/ajax-loader.png0000664000000000000000000000076711662503006022307 0ustar rootrootPNG  IHDR##jsBITO0PLTEHbtRNS"3DUfwv pHYs  ZtEXtSoftwareAdobe Fireworks CS5q6IDAT(c` 0*s̙&$ջBwNB XznSUw820W߽}ժ`j{*` D_iP#l߽+͜Ys̻wF͜ ww`;%:`Qp!AGG#\P\S ЅˋЅKЅlF/ `B`@"AA--U*$Sc 5()„TCC\B0{B.JJJ0Evqq )"9W,, dll*BSX IENDB`pnp4nagios-0.6.16/share/pnp/media/css/ui-smoothness/0000775000000000000000000000000011662503006020750 5ustar rootrootpnp4nagios-0.6.16/share/pnp/media/css/ui-smoothness/jquery-ui.css0000664000000000000000000010114211662503006023413 0ustar rootroot/* * jQuery UI CSS Framework 1.8.14 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Theming/API */ /* Layout helpers ----------------------------------*/ .ui-helper-hidden { display: none; } .ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); } .ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; } .ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } .ui-helper-clearfix { display: inline-block; } /* required comment for clearfix to work in Opera \*/ * html .ui-helper-clearfix { height:1%; } .ui-helper-clearfix { display:block; } /* end clearfix */ .ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); } /* Interaction Cues ----------------------------------*/ .ui-state-disabled { cursor: default !important; } /* Icons ----------------------------------*/ /* states and images */ .ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; } /* Misc visuals ----------------------------------*/ /* Overlays */ .ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } /* * jQuery UI CSS Framework 1.8.14 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Theming/API * * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana,Arial,sans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=03_highlight_soft.png&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=01_flat.png&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=02_glass.png&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=02_glass.png&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=02_glass.png&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=01_flat.png&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px */ /* Component containers ----------------------------------*/ .ui-widget { font-family: Verdana,Arial,sans-serif; font-size: 1.1em; } .ui-widget .ui-widget { font-size: 1em; } .ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif; font-size: 1em; } .ui-widget-content { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x; color: #222222; } .ui-widget-content a { color: #222222; } .ui-widget-header { border: 1px solid #aaaaaa; background: #cccccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x; color: #222222; font-weight: bold; } .ui-widget-header a { color: #222222; } /* Interaction states ----------------------------------*/ .ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3; background: #e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #555555; } .ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555; text-decoration: none; } .ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #999999; background: #dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; } .ui-state-hover a, .ui-state-hover a:hover { color: #212121; text-decoration: none; } .ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; } .ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121; text-decoration: none; } .ui-widget :active { outline: none; } /* Interaction Cues ----------------------------------*/ .ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fcefa1; background: #fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x; color: #363636; } .ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; } .ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x; color: #cd0a0a; } .ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a; } .ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a; } .ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; } .ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; } .ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } /* Icons ----------------------------------*/ /* states and images */ .ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png); } .ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); } .ui-widget-header .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); } .ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png); } .ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); } .ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); } .ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png); } .ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png); } /* positioning */ .ui-icon-carat-1-n { background-position: 0 0; } .ui-icon-carat-1-ne { background-position: -16px 0; } .ui-icon-carat-1-e { background-position: -32px 0; } .ui-icon-carat-1-se { background-position: -48px 0; } .ui-icon-carat-1-s { background-position: -64px 0; } .ui-icon-carat-1-sw { background-position: -80px 0; } .ui-icon-carat-1-w { background-position: -96px 0; } .ui-icon-carat-1-nw { background-position: -112px 0; } .ui-icon-carat-2-n-s { background-position: -128px 0; } .ui-icon-carat-2-e-w { background-position: -144px 0; } .ui-icon-triangle-1-n { background-position: 0 -16px; } .ui-icon-triangle-1-ne { background-position: -16px -16px; } .ui-icon-triangle-1-e { background-position: -32px -16px; } .ui-icon-triangle-1-se { background-position: -48px -16px; } .ui-icon-triangle-1-s { background-position: -64px -16px; } .ui-icon-triangle-1-sw { background-position: -80px -16px; } .ui-icon-triangle-1-w { background-position: -96px -16px; } .ui-icon-triangle-1-nw { background-position: -112px -16px; } .ui-icon-triangle-2-n-s { background-position: -128px -16px; } .ui-icon-triangle-2-e-w { background-position: -144px -16px; } .ui-icon-arrow-1-n { background-position: 0 -32px; } .ui-icon-arrow-1-ne { background-position: -16px -32px; } .ui-icon-arrow-1-e { background-position: -32px -32px; } .ui-icon-arrow-1-se { background-position: -48px -32px; } .ui-icon-arrow-1-s { background-position: -64px -32px; } .ui-icon-arrow-1-sw { background-position: -80px -32px; } .ui-icon-arrow-1-w { background-position: -96px -32px; } .ui-icon-arrow-1-nw { background-position: -112px -32px; } .ui-icon-arrow-2-n-s { background-position: -128px -32px; } .ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } .ui-icon-arrow-2-e-w { background-position: -160px -32px; } .ui-icon-arrow-2-se-nw { background-position: -176px -32px; } .ui-icon-arrowstop-1-n { background-position: -192px -32px; } .ui-icon-arrowstop-1-e { background-position: -208px -32px; } .ui-icon-arrowstop-1-s { background-position: -224px -32px; } .ui-icon-arrowstop-1-w { background-position: -240px -32px; } .ui-icon-arrowthick-1-n { background-position: 0 -48px; } .ui-icon-arrowthick-1-ne { background-position: -16px -48px; } .ui-icon-arrowthick-1-e { background-position: -32px -48px; } .ui-icon-arrowthick-1-se { background-position: -48px -48px; } .ui-icon-arrowthick-1-s { background-position: -64px -48px; } .ui-icon-arrowthick-1-sw { background-position: -80px -48px; } .ui-icon-arrowthick-1-w { background-position: -96px -48px; } .ui-icon-arrowthick-1-nw { background-position: -112px -48px; } .ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } .ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } .ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } .ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } .ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } .ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } .ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } .ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } .ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } .ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } .ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } .ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } .ui-icon-arrowreturn-1-w { background-position: -64px -64px; } .ui-icon-arrowreturn-1-n { background-position: -80px -64px; } .ui-icon-arrowreturn-1-e { background-position: -96px -64px; } .ui-icon-arrowreturn-1-s { background-position: -112px -64px; } .ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } .ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } .ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } .ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } .ui-icon-arrow-4 { background-position: 0 -80px; } .ui-icon-arrow-4-diag { background-position: -16px -80px; } .ui-icon-extlink { background-position: -32px -80px; } .ui-icon-newwin { background-position: -48px -80px; } .ui-icon-refresh { background-position: -64px -80px; } .ui-icon-shuffle { background-position: -80px -80px; } .ui-icon-transfer-e-w { background-position: -96px -80px; } .ui-icon-transferthick-e-w { background-position: -112px -80px; } .ui-icon-folder-collapsed { background-position: 0 -96px; } .ui-icon-folder-open { background-position: -16px -96px; } .ui-icon-document { background-position: -32px -96px; } .ui-icon-document-b { background-position: -48px -96px; } .ui-icon-note { background-position: -64px -96px; } .ui-icon-mail-closed { background-position: -80px -96px; } .ui-icon-mail-open { background-position: -96px -96px; } .ui-icon-suitcase { background-position: -112px -96px; } .ui-icon-comment { background-position: -128px -96px; } .ui-icon-person { background-position: -144px -96px; } .ui-icon-print { background-position: -160px -96px; } .ui-icon-trash { background-position: -176px -96px; } .ui-icon-locked { background-position: -192px -96px; } .ui-icon-unlocked { background-position: -208px -96px; } .ui-icon-bookmark { background-position: -224px -96px; } .ui-icon-tag { background-position: -240px -96px; } .ui-icon-home { background-position: 0 -112px; } .ui-icon-flag { background-position: -16px -112px; } .ui-icon-calendar { background-position: -32px -112px; } .ui-icon-cart { background-position: -48px -112px; } .ui-icon-pencil { background-position: -64px -112px; } .ui-icon-clock { background-position: -80px -112px; } .ui-icon-disk { background-position: -96px -112px; } .ui-icon-calculator { background-position: -112px -112px; } .ui-icon-zoomin { background-position: -128px -112px; } .ui-icon-zoomout { background-position: -144px -112px; } .ui-icon-search { background-position: -160px -112px; } .ui-icon-wrench { background-position: -176px -112px; } .ui-icon-gear { background-position: -192px -112px; } .ui-icon-heart { background-position: -208px -112px; } .ui-icon-star { background-position: -224px -112px; } .ui-icon-link { background-position: -240px -112px; } .ui-icon-cancel { background-position: 0 -128px; } .ui-icon-plus { background-position: -16px -128px; } .ui-icon-plusthick { background-position: -32px -128px; } .ui-icon-minus { background-position: -48px -128px; } .ui-icon-minusthick { background-position: -64px -128px; } .ui-icon-close { background-position: -80px -128px; } .ui-icon-closethick { background-position: -96px -128px; } .ui-icon-key { background-position: -112px -128px; } .ui-icon-lightbulb { background-position: -128px -128px; } .ui-icon-scissors { background-position: -144px -128px; } .ui-icon-clipboard { background-position: -160px -128px; } .ui-icon-copy { background-position: -176px -128px; } .ui-icon-contact { background-position: -192px -128px; } .ui-icon-image { background-position: -208px -128px; } .ui-icon-video { background-position: -224px -128px; } .ui-icon-script { background-position: -240px -128px; } .ui-icon-alert { background-position: 0 -144px; } .ui-icon-info { background-position: -16px -144px; } .ui-icon-notice { background-position: -32px -144px; } .ui-icon-help { background-position: -48px -144px; } .ui-icon-check { background-position: -64px -144px; } .ui-icon-bullet { background-position: -80px -144px; } .ui-icon-radio-off { background-position: -96px -144px; } .ui-icon-radio-on { background-position: -112px -144px; } .ui-icon-pin-w { background-position: -128px -144px; } .ui-icon-pin-s { background-position: -144px -144px; } .ui-icon-play { background-position: 0 -160px; } .ui-icon-pause { background-position: -16px -160px; } .ui-icon-seek-next { background-position: -32px -160px; } .ui-icon-seek-prev { background-position: -48px -160px; } .ui-icon-seek-end { background-position: -64px -160px; } .ui-icon-seek-start { background-position: -80px -160px; } /* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ .ui-icon-seek-first { background-position: -80px -160px; } .ui-icon-stop { background-position: -96px -160px; } .ui-icon-eject { background-position: -112px -160px; } .ui-icon-volume-off { background-position: -128px -160px; } .ui-icon-volume-on { background-position: -144px -160px; } .ui-icon-power { background-position: 0 -176px; } .ui-icon-signal-diag { background-position: -16px -176px; } .ui-icon-signal { background-position: -32px -176px; } .ui-icon-battery-0 { background-position: -48px -176px; } .ui-icon-battery-1 { background-position: -64px -176px; } .ui-icon-battery-2 { background-position: -80px -176px; } .ui-icon-battery-3 { background-position: -96px -176px; } .ui-icon-circle-plus { background-position: 0 -192px; } .ui-icon-circle-minus { background-position: -16px -192px; } .ui-icon-circle-close { background-position: -32px -192px; } .ui-icon-circle-triangle-e { background-position: -48px -192px; } .ui-icon-circle-triangle-s { background-position: -64px -192px; } .ui-icon-circle-triangle-w { background-position: -80px -192px; } .ui-icon-circle-triangle-n { background-position: -96px -192px; } .ui-icon-circle-arrow-e { background-position: -112px -192px; } .ui-icon-circle-arrow-s { background-position: -128px -192px; } .ui-icon-circle-arrow-w { background-position: -144px -192px; } .ui-icon-circle-arrow-n { background-position: -160px -192px; } .ui-icon-circle-zoomin { background-position: -176px -192px; } .ui-icon-circle-zoomout { background-position: -192px -192px; } .ui-icon-circle-check { background-position: -208px -192px; } .ui-icon-circlesmall-plus { background-position: 0 -208px; } .ui-icon-circlesmall-minus { background-position: -16px -208px; } .ui-icon-circlesmall-close { background-position: -32px -208px; } .ui-icon-squaresmall-plus { background-position: -48px -208px; } .ui-icon-squaresmall-minus { background-position: -64px -208px; } .ui-icon-squaresmall-close { background-position: -80px -208px; } .ui-icon-grip-dotted-vertical { background-position: 0 -224px; } .ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } .ui-icon-grip-solid-vertical { background-position: -32px -224px; } .ui-icon-grip-solid-horizontal { background-position: -48px -224px; } .ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } .ui-icon-grip-diagonal-se { background-position: -80px -224px; } /* Misc visuals ----------------------------------*/ /* Corner radius */ .ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; -khtml-border-top-left-radius: 4px; border-top-left-radius: 4px; } .ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; -khtml-border-top-right-radius: 4px; border-top-right-radius: 4px; } .ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; -khtml-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; } .ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; -khtml-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; } /* Overlays */ .ui-widget-overlay { background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); } .ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -khtml-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; }/* * jQuery UI Resizable 1.8.14 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Resizable#theming */ .ui-resizable { position: relative;} .ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block; } .ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; } .ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; } .ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; } .ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; } .ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; } .ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; } .ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; } .ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; } .ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/* * jQuery UI Selectable 1.8.14 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Selectable#theming */ .ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; } /* * jQuery UI Accordion 1.8.14 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Accordion#theming */ /* IE/Win - Fix animation bug - #4615 */ .ui-accordion { width: 100%; } .ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; } .ui-accordion .ui-accordion-li-fix { display: inline; } .ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; } .ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; } .ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; } .ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; } .ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; } .ui-accordion .ui-accordion-content-active { display: block; } /* * jQuery UI Autocomplete 1.8.14 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Autocomplete#theming */ .ui-autocomplete { position: absolute; cursor: default; } /* workarounds */ * html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */ /* * jQuery UI Menu 1.8.14 * * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Menu#theming */ .ui-menu { list-style:none; padding: 2px; margin: 0; display:block; float: left; } .ui-menu .ui-menu { margin-top: -3px; } .ui-menu .ui-menu-item { margin:0; padding: 0; zoom: 1; float: left; clear: left; width: 100%; } .ui-menu .ui-menu-item a { text-decoration:none; display:block; padding:.2em .4em; line-height:1.5; zoom:1; } .ui-menu .ui-menu-item a.ui-state-hover, .ui-menu .ui-menu-item a.ui-state-active { font-weight: normal; margin: -1px; } /* * jQuery UI Button 1.8.14 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Button#theming */ .ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */ .ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */ button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */ .ui-button-icons-only { width: 3.4em; } button.ui-button-icons-only { width: 3.7em; } /*button text element */ .ui-button .ui-button-text { display: block; line-height: 1.4; } .ui-button-text-only .ui-button-text { padding: .4em 1em; } .ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; } .ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; } .ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; } .ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; } /* no icon support for input elements, provide padding by default */ input.ui-button { padding: .4em 1em; } /*button icon element(s) */ .ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; } .ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; } .ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; } .ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; } .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; } /*button sets*/ .ui-buttonset { margin-right: 7px; } .ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; } /* workarounds */ button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */ /* * jQuery UI Dialog 1.8.14 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Dialog#theming */ .ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; } .ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative; } .ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; } .ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; } .ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; } .ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; } .ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; } .ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; } .ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; } .ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; } .ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; } .ui-draggable .ui-dialog-titlebar { cursor: move; } /* * jQuery UI Slider 1.8.14 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Slider#theming */ .ui-slider { position: relative; text-align: left; } .ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; } .ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; } .ui-slider-horizontal { height: .8em; } .ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; } .ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; } .ui-slider-horizontal .ui-slider-range-min { left: 0; } .ui-slider-horizontal .ui-slider-range-max { right: 0; } .ui-slider-vertical { width: .8em; height: 100px; } .ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; } .ui-slider-vertical .ui-slider-range { left: 0; width: 100%; } .ui-slider-vertical .ui-slider-range-min { bottom: 0; } .ui-slider-vertical .ui-slider-range-max { top: 0; }/* * jQuery UI Tabs 1.8.14 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Tabs#theming */ .ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ .ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; } .ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; } .ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; } .ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; } .ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; } .ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */ .ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; } .ui-tabs .ui-tabs-hide { display: none !important; } /* * jQuery UI Datepicker 1.8.14 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Datepicker#theming */ .ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; } .ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; } .ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; } .ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; } .ui-datepicker .ui-datepicker-prev { left:2px; } .ui-datepicker .ui-datepicker-next { right:2px; } .ui-datepicker .ui-datepicker-prev-hover { left:1px; } .ui-datepicker .ui-datepicker-next-hover { right:1px; } .ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; } .ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; } .ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; } .ui-datepicker select.ui-datepicker-month-year {width: 100%;} .ui-datepicker select.ui-datepicker-month, .ui-datepicker select.ui-datepicker-year { width: 49%;} .ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; } .ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; } .ui-datepicker td { border: 0; padding: 1px; } .ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; } .ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; } .ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; } .ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; } /* with multiple calendars */ .ui-datepicker.ui-datepicker-multi { width:auto; } .ui-datepicker-multi .ui-datepicker-group { float:left; } .ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; } .ui-datepicker-multi-2 .ui-datepicker-group { width:50%; } .ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; } .ui-datepicker-multi-4 .ui-datepicker-group { width:25%; } .ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; } .ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; } .ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; } .ui-datepicker-row-break { clear:both; width:100%; font-size:0em; } /* RTL support */ .ui-datepicker-rtl { direction: rtl; } .ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; } .ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; } .ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; } .ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; } .ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; } .ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; } .ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; } .ui-datepicker-rtl .ui-datepicker-group { float:right; } .ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; } .ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; } /* IE6 IFRAME FIX (taken from datepicker 1.5.3 */ .ui-datepicker-cover { display: none; /*sorry for IE5*/ display/**/: block; /*sorry for IE5*/ position: absolute; /*must have*/ z-index: -1; /*must have*/ filter: mask(); /*must have*/ top: -4px; /*must have*/ left: -4px; /*must have*/ width: 200px; /*must have*/ height: 200px; /*must have*/ }/* * jQuery UI Progressbar 1.8.14 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Progressbar#theming */ .ui-progressbar { height:2em; text-align: left; } .ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }pnp4nagios-0.6.16/share/pnp/media/css/ui-smoothness/images/0000775000000000000000000000000011662503006022215 5ustar rootrootpnp4nagios-0.6.16/share/pnp/media/css/ui-smoothness/images/ui-bg_glass_65_ffffff_1x400.png0000664000000000000000000000015111662503006027565 0ustar rootrootPNG  IHDRoX 0IDAT8! + ̼JHR)[lk=O_(<` H"IENDB`pnp4nagios-0.6.16/share/pnp/media/css/ui-smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png0000664000000000000000000000026411662503006027336 0ustar rootrootPNG  IHDR(ddrz{IDATh1 17Y$t3;_TUAUPTUAUPTUAUPTUAUPTUAUPTUAUPTUAUPTUAUPTUAUPTUAUPTUAUPTUAUPTüŝc)IENDB`pnp4nagios-0.6.16/share/pnp/media/css/ui-smoothness/images/ui-icons_888888_256x240.png0000664000000000000000000001042111662503006026340 0ustar rootrootPNG  IHDRIJPLTE{NtRNS2P."Tp@f` <BHJZ&0R,4j8D|($ blߝF>n~hhHIDATx]b۶H儒-{iZK:glkn-tIqq? E$dK>$>;PZsVh!Sy0E0}H)-t koܪKp\RϠ .E7 ) *V;~Pe Bx*,=$zDؾ JҸٻ9{ ǸHpqW@"2'B[$ @TiH/b٥96!XHq`DE*R HV!%;" i] dddddddd4y5  Rb@(8CdŪݡ,@T@ibrq0alX!pe, =4bW { 5Ƭhu~(Q^@3="b5XC@JCT76q_5 @,r šɩD)T|O@ ON-ՙ [n@RXIm݋(F @?=0puL;g$@6η K`>п @h գKVn"a" %l@.v$/U^ G:#`` uTtK~ŋZ5T%kxk]\*Q ,҇B44 OXK|yg+_M(lоEO V$T1BXb-|?@ fBXr%'@ҹA\IJ,}BBc\V rh(]tI^}oצo S3 ";ʙb}"߰ ){b$Gwwݾab")T@pF_er6JvШ"mޭM-d76x˰6ӥ;/`>KrP\_^u1%OTM.}Q3.Nس})>-w`a+sy$t)NbFFFFBejnNVn4,A*X*5>PGa 3 {oB &<L[ Nc.öi=`Q@d ͆I.Il`\t[< Cit484-r +f쑱BCB MH iy }>rxp|z;BǏ;burcK4tz1G~`ؚK| ̔>ۡO$~ Ao)0pzz }i`;ADm8n:cfA@s7L Z/..h8or? N93B~o_'`opO- :TG L;7]`B%˛>*wTpM0H}&t ^1'Oqr'2P͡+z,tIW''|en=dzgRm[NStK{҉mؓVt6ҲR`ζN&}B U(rۗ&1%Q''?l׸+&r{jN಻4) `N狌. ߭ ǣ)q 2?n3Hb`} .`pqY1e_bu7e+N_F(DT,L}LLrmP5|x芥1cx DAb`M(7NED~Mz +4BXd.Mzv͈Pd8p<6?8N*x.6ڍ6GFZ)O !lSshssNp8`'0/<s}.@Ǩs7ξO۟VDa5av]m1+3y6۠>@u50Ps51==p *KVҫ܂ݻc$N4(Xr2###c- 賟Lδ>]5.sYs1f0;'̨Yg銛{@9 `aC(=%bo2=n1 jBoS$n#m=i0ci9}oI qT]W%.(؅]z\x f"]o'u䫵tk{v;AC3ֆwwR_#X (xҋ/q%W hpk_IX'b/fXKi"#####QCLi2t 5L0 QiH2;yTOok;ע ٶ`RNg{zy!Kxm?A(vU~mL(`o/!nmX-{v[ dw=n「sdwzn(}Oy~ m ?XU;,V'+ V&JRZ]᧭:zC'-߆@y 4u `Vۓwъ#zP@Q N>2/{\o)W~a3xLw :_Q;=pּdt\'8~3SRP6y+XQ*޺r ̗ѭ*޺r gl/\U^u$|mbVnw \V|D͊NVNy7k<;/E}?E*dzgO ~g/96f cD}% g$QG7o)U Jo,O@0߾Q(;bw:5 NwRN5Iy'K?}:9mֽ*@f@jU9mҫÍ{$ؗ}dFp|%!DdF>}G{@FFFFFFƦQܞH 3 u Mo~vy}mwz<7nP9rWku=|_nz쿳}@IXn?sn~hhHIDATx]b۶H儒-{iZK:glkn-tIqq? E$dK>$>;PZsVh!Sy0E0}H)-t koܪKp\RϠ .E7 ) *V;~Pe Bx*,=$zDؾ JҸٻ9{ ǸHpqW@"2'B[$ @TiH/b٥96!XHq`DE*R HV!%;" i] dddddddd4y5  Rb@(8CdŪݡ,@T@ibrq0alX!pe, =4bW { 5Ƭhu~(Q^@3="b5XC@JCT76q_5 @,r šɩD)T|O@ ON-ՙ [n@RXIm݋(F @?=0puL;g$@6η K`>п @h գKVn"a" %l@.v$/U^ G:#`` uTtK~ŋZ5T%kxk]\*Q ,҇B44 OXK|yg+_M(lоEO V$T1BXb-|?@ fBXr%'@ҹA\IJ,}BBc\V rh(]tI^}oצo S3 ";ʙb}"߰ ){b$Gwwݾab")T@pF_er6JvШ"mޭM-d76x˰6ӥ;/`>KrP\_^u1%OTM.}Q3.Nس})>-w`a+sy$t)NbFFFFBejnNVn4,A*X*5>PGa 3 {oB &<L[ Nc.öi=`Q@d ͆I.Il`\t[< Cit484-r +f쑱BCB MH iy }>rxp|z;BǏ;burcK4tz1G~`ؚK| ̔>ۡO$~ Ao)0pzz }i`;ADm8n:cfA@s7L Z/..h8or? N93B~o_'`opO- :TG L;7]`B%˛>*wTpM0H}&t ^1'Oqr'2P͡+z,tIW''|en=dzgRm[NStK{҉mؓVt6ҲR`ζN&}B U(rۗ&1%Q''?l׸+&r{jN಻4) `N狌. ߭ ǣ)q 2?n3Hb`} .`pqY1e_bu7e+N_F(DT,L}LLrmP5|x芥1cx DAb`M(7NED~Mz +4BXd.Mzv͈Pd8p<6?8N*x.6ڍ6GFZ)O !lSshssNp8`'0/<s}.@Ǩs7ξO۟VDa5av]m1+3y6۠>@u50Ps51==p *KVҫ܂ݻc$N4(Xr2###c- 賟Lδ>]5.sYs1f0;'̨Yg銛{@9 `aC(=%bo2=n1 jBoS$n#m=i0ci9}oI qT]W%.(؅]z\x f"]o'u䫵tk{v;AC3ֆwwR_#X (xҋ/q%W hpk_IX'b/fXKi"#####QCLi2t 5L0 QiH2;yTOok;ע ٶ`RNg{zy!Kxm?A(vU~mL(`o/!nmX-{v[ dw=n「sdwzn(}Oy~ m ?XU;,V'+ V&JRZ]᧭:zC'-߆@y 4u `Vۓwъ#zP@Q N>2/{\o)W~a3xLw :_Q;=pּdt\'8~3SRP6y+XQ*޺r ̗ѭ*޺r gl/\U^u$|mbVnw \V|D͊NVNy7k<;/E}?E*dzgO ~g/96f cD}% g$QG7o)U Jo,O@0߾Q(;bw:5 NwRN5Iy'K?}:9mֽ*@f@jU9mҫÍ{$ؗ}dFp|%!DdF>}G{@FFFFFFƦQܞH 3 u Mo~vy}mwz<7nP9rWku=|_nz쿳}@IXn?sIDAT81 0Cџ $CB}1@)e_ƅ`I8-%cM0 )" LIENDB`pnp4nagios-0.6.16/share/pnp/media/css/ui-smoothness/images/ui-icons_cd0a0a_256x240.png0000664000000000000000000001042111662503006026571 0ustar rootrootPNG  IHDRIJPLTE 7NtRNS2P."Tp@f` <BHJZ&0R,4j8D|($ blߝF>n~hhHIDATx]b۶H儒-{iZK:glkn-tIqq? E$dK>$>;PZsVh!Sy0E0}H)-t koܪKp\RϠ .E7 ) *V;~Pe Bx*,=$zDؾ JҸٻ9{ ǸHpqW@"2'B[$ @TiH/b٥96!XHq`DE*R HV!%;" i] dddddddd4y5  Rb@(8CdŪݡ,@T@ibrq0alX!pe, =4bW { 5Ƭhu~(Q^@3="b5XC@JCT76q_5 @,r šɩD)T|O@ ON-ՙ [n@RXIm݋(F @?=0puL;g$@6η K`>п @h գKVn"a" %l@.v$/U^ G:#`` uTtK~ŋZ5T%kxk]\*Q ,҇B44 OXK|yg+_M(lоEO V$T1BXb-|?@ fBXr%'@ҹA\IJ,}BBc\V rh(]tI^}oצo S3 ";ʙb}"߰ ){b$Gwwݾab")T@pF_er6JvШ"mޭM-d76x˰6ӥ;/`>KrP\_^u1%OTM.}Q3.Nس})>-w`a+sy$t)NbFFFFBejnNVn4,A*X*5>PGa 3 {oB &<L[ Nc.öi=`Q@d ͆I.Il`\t[< Cit484-r +f쑱BCB MH iy }>rxp|z;BǏ;burcK4tz1G~`ؚK| ̔>ۡO$~ Ao)0pzz }i`;ADm8n:cfA@s7L Z/..h8or? N93B~o_'`opO- :TG L;7]`B%˛>*wTpM0H}&t ^1'Oqr'2P͡+z,tIW''|en=dzgRm[NStK{҉mؓVt6ҲR`ζN&}B U(rۗ&1%Q''?l׸+&r{jN಻4) `N狌. ߭ ǣ)q 2?n3Hb`} .`pqY1e_bu7e+N_F(DT,L}LLrmP5|x芥1cx DAb`M(7NED~Mz +4BXd.Mzv͈Pd8p<6?8N*x.6ڍ6GFZ)O !lSshssNp8`'0/<s}.@Ǩs7ξO۟VDa5av]m1+3y6۠>@u50Ps51==p *KVҫ܂ݻc$N4(Xr2###c- 賟Lδ>]5.sYs1f0;'̨Yg銛{@9 `aC(=%bo2=n1 jBoS$n#m=i0ci9}oI qT]W%.(؅]z\x f"]o'u䫵tk{v;AC3ֆwwR_#X (xҋ/q%W hpk_IX'b/fXKi"#####QCLi2t 5L0 QiH2;yTOok;ע ٶ`RNg{zy!Kxm?A(vU~mL(`o/!nmX-{v[ dw=n「sdwzn(}Oy~ m ?XU;,V'+ V&JRZ]᧭:zC'-߆@y 4u `Vۓwъ#zP@Q N>2/{\o)W~a3xLw :_Q;=pּdt\'8~3SRP6y+XQ*޺r ̗ѭ*޺r gl/\U^u$|mbVnw \V|D͊NVNy7k<;/E}?E*dzgO ~g/96f cD}% g$QG7o)U Jo,O@0߾Q(;bw:5 NwRN5Iy'K?}:9mֽ*@f@jU9mҫÍ{$ؗ}dFp|%!DdF>}G{@FFFFFFƦQܞH 3 u Mo~vy}mwz<7nP9rWku=|_nz쿳}@IXn?sn~hhHIDATx]b۶H儒-{iZK:glkn-tIqq? E$dK>$>;PZsVh!Sy0E0}H)-t koܪKp\RϠ .E7 ) *V;~Pe Bx*,=$zDؾ JҸٻ9{ ǸHpqW@"2'B[$ @TiH/b٥96!XHq`DE*R HV!%;" i] dddddddd4y5  Rb@(8CdŪݡ,@T@ibrq0alX!pe, =4bW { 5Ƭhu~(Q^@3="b5XC@JCT76q_5 @,r šɩD)T|O@ ON-ՙ [n@RXIm݋(F @?=0puL;g$@6η K`>п @h գKVn"a" %l@.v$/U^ G:#`` uTtK~ŋZ5T%kxk]\*Q ,҇B44 OXK|yg+_M(lоEO V$T1BXb-|?@ fBXr%'@ҹA\IJ,}BBc\V rh(]tI^}oצo S3 ";ʙb}"߰ ){b$Gwwݾab")T@pF_er6JvШ"mޭM-d76x˰6ӥ;/`>KrP\_^u1%OTM.}Q3.Nس})>-w`a+sy$t)NbFFFFBejnNVn4,A*X*5>PGa 3 {oB &<L[ Nc.öi=`Q@d ͆I.Il`\t[< Cit484-r +f쑱BCB MH iy }>rxp|z;BǏ;burcK4tz1G~`ؚK| ̔>ۡO$~ Ao)0pzz }i`;ADm8n:cfA@s7L Z/..h8or? N93B~o_'`opO- :TG L;7]`B%˛>*wTpM0H}&t ^1'Oqr'2P͡+z,tIW''|en=dzgRm[NStK{҉mؓVt6ҲR`ζN&}B U(rۗ&1%Q''?l׸+&r{jN಻4) `N狌. ߭ ǣ)q 2?n3Hb`} .`pqY1e_bu7e+N_F(DT,L}LLrmP5|x芥1cx DAb`M(7NED~Mz +4BXd.Mzv͈Pd8p<6?8N*x.6ڍ6GFZ)O !lSshssNp8`'0/<s}.@Ǩs7ξO۟VDa5av]m1+3y6۠>@u50Ps51==p *KVҫ܂ݻc$N4(Xr2###c- 賟Lδ>]5.sYs1f0;'̨Yg銛{@9 `aC(=%bo2=n1 jBoS$n#m=i0ci9}oI qT]W%.(؅]z\x f"]o'u䫵tk{v;AC3ֆwwR_#X (xҋ/q%W hpk_IX'b/fXKi"#####QCLi2t 5L0 QiH2;yTOok;ע ٶ`RNg{zy!Kxm?A(vU~mL(`o/!nmX-{v[ dw=n「sdwzn(}Oy~ m ?XU;,V'+ V&JRZ]᧭:zC'-߆@y 4u `Vۓwъ#zP@Q N>2/{\o)W~a3xLw :_Q;=pּdt\'8~3SRP6y+XQ*޺r ̗ѭ*޺r gl/\U^u$|mbVnw \V|D͊NVNy7k<;/E}?E*dzgO ~g/96f cD}% g$QG7o)U Jo,O@0߾Q(;bw:5 NwRN5Iy'K?}:9mֽ*@f@jU9mҫÍ{$ؗ}dFp|%!DdF>}G{@FFFFFFƦQܞH 3 u Mo~vy}mwz<7nP9rWku=|_nz쿳}@IXn?sn~hhHIDATx]b۶H儒-{iZK:glkn-tIqq? E$dK>$>;PZsVh!Sy0E0}H)-t koܪKp\RϠ .E7 ) *V;~Pe Bx*,=$zDؾ JҸٻ9{ ǸHpqW@"2'B[$ @TiH/b٥96!XHq`DE*R HV!%;" i] dddddddd4y5  Rb@(8CdŪݡ,@T@ibrq0alX!pe, =4bW { 5Ƭhu~(Q^@3="b5XC@JCT76q_5 @,r šɩD)T|O@ ON-ՙ [n@RXIm݋(F @?=0puL;g$@6η K`>п @h գKVn"a" %l@.v$/U^ G:#`` uTtK~ŋZ5T%kxk]\*Q ,҇B44 OXK|yg+_M(lоEO V$T1BXb-|?@ fBXr%'@ҹA\IJ,}BBc\V rh(]tI^}oצo S3 ";ʙb}"߰ ){b$Gwwݾab")T@pF_er6JvШ"mޭM-d76x˰6ӥ;/`>KrP\_^u1%OTM.}Q3.Nس})>-w`a+sy$t)NbFFFFBejnNVn4,A*X*5>PGa 3 {oB &<L[ Nc.öi=`Q@d ͆I.Il`\t[< Cit484-r +f쑱BCB MH iy }>rxp|z;BǏ;burcK4tz1G~`ؚK| ̔>ۡO$~ Ao)0pzz }i`;ADm8n:cfA@s7L Z/..h8or? N93B~o_'`opO- :TG L;7]`B%˛>*wTpM0H}&t ^1'Oqr'2P͡+z,tIW''|en=dzgRm[NStK{҉mؓVt6ҲR`ζN&}B U(rۗ&1%Q''?l׸+&r{jN಻4) `N狌. ߭ ǣ)q 2?n3Hb`} .`pqY1e_bu7e+N_F(DT,L}LLrmP5|x芥1cx DAb`M(7NED~Mz +4BXd.Mzv͈Pd8p<6?8N*x.6ڍ6GFZ)O !lSshssNp8`'0/<s}.@Ǩs7ξO۟VDa5av]m1+3y6۠>@u50Ps51==p *KVҫ܂ݻc$N4(Xr2###c- 賟Lδ>]5.sYs1f0;'̨Yg銛{@9 `aC(=%bo2=n1 jBoS$n#m=i0ci9}oI qT]W%.(؅]z\x f"]o'u䫵tk{v;AC3ֆwwR_#X (xҋ/q%W hpk_IX'b/fXKi"#####QCLi2t 5L0 QiH2;yTOok;ע ٶ`RNg{zy!Kxm?A(vU~mL(`o/!nmX-{v[ dw=n「sdwzn(}Oy~ m ?XU;,V'+ V&JRZ]᧭:zC'-߆@y 4u `Vۓwъ#zP@Q N>2/{\o)W~a3xLw :_Q;=pּdt\'8~3SRP6y+XQ*޺r ̗ѭ*޺r gl/\U^u$|mbVnw \V|D͊NVNy7k<;/E}?E*dzgO ~g/96f cD}% g$QG7o)U Jo,O@0߾Q(;bw:5 NwRN5Iy'K?}:9mֽ*@f@jU9mҫÍ{$ؗ}dFp|%!DdF>}G{@FFFFFFƦQܞH 3 u Mo~vy}mwz<7nP9rWku=|_nz쿳}@IXn?s')}$.imgAreaSelect=function(img,options){var $img=$(img),imgLoaded,$box=div(),$area=div(),$border=div().add(div()).add(div()).add(div()),$outer=div().add(div()).add(div()).add(div()),$handles=$([]),$areaOpera,left,top,imgOfs={left:0,top:0},imgWidth,imgHeight,$parent,parOfs={left:0,top:0},zIndex=0,position='absolute',startX,startY,scaleX,scaleY,resizeMargin=10,resize,minWidth,minHeight,maxWidth,maxHeight,aspectRatio,shown,x1,y1,x2,y2,selection={x1:0,y1:0,x2:0,y2:0,width:0,height:0},docElem=document.documentElement,$p,d,i,o,w,h,adjusted;function viewX(x){return x+imgOfs.left-parOfs.left}function viewY(y){return y+imgOfs.top-parOfs.top}function selX(x){return x-imgOfs.left+parOfs.left}function selY(y){return y-imgOfs.top+parOfs.top}function evX(event){return event.pageX-parOfs.left}function evY(event){return event.pageY-parOfs.top}function getSelection(noScale){var sx=noScale||scaleX,sy=noScale||scaleY;return{x1:round(selection.x1*sx),y1:round(selection.y1*sy),x2:round(selection.x2*sx),y2:round(selection.y2*sy),width:round(selection.x2*sx)-round(selection.x1*sx),height:round(selection.y2*sy)-round(selection.y1*sy)}}function setSelection(x1,y1,x2,y2,noScale){var sx=noScale||scaleX,sy=noScale||scaleY;selection={x1:round(x1/sx||0),y1:round(y1/sy||0),x2:round(x2/sx||0),y2:round(y2/sy||0)};selection.width=selection.x2-selection.x1;selection.height=selection.y2-selection.y1}function adjust(){if(!$img.width())return;imgOfs={left:round($img.offset().left),top:round($img.offset().top)};imgWidth=$img.innerWidth();imgHeight=$img.innerHeight();imgOfs.top+=($img.outerHeight()-imgHeight)>>1;imgOfs.left+=($img.outerWidth()-imgWidth)>>1;minWidth=options.minWidth||0;minHeight=options.minHeight||0;maxWidth=min(options.maxWidth||1<<24,imgWidth);maxHeight=min(options.maxHeight||1<<24,imgHeight);if($().jquery=='1.3.2'&&position=='fixed'&&!docElem['getBoundingClientRect']){imgOfs.top+=max(document.body.scrollTop,docElem.scrollTop);imgOfs.left+=max(document.body.scrollLeft,docElem.scrollLeft)}parOfs=$.inArray($parent.css('position'),['absolute','relative'])+1?{left:round($parent.offset().left)-$parent.scrollLeft(),top:round($parent.offset().top)-$parent.scrollTop()}:position=='fixed'?{left:$(document).scrollLeft(),top:$(document).scrollTop()}:{left:0,top:0};left=viewX(0);top=viewY(0);if(selection.x2>imgWidth||selection.y2>imgHeight)doResize()}function update(resetKeyPress){if(!shown)return;$box.css({left:viewX(selection.x1),top:viewY(selection.y1)}).add($area).width(w=selection.width).height(h=selection.height);$area.add($border).add($handles).css({left:0,top:0});$border.width(max(w-$border.outerWidth()+$border.innerWidth(),0)).height(max(h-$border.outerHeight()+$border.innerHeight(),0));$($outer[0]).css({left:left,top:top,width:selection.x1,height:imgHeight});$($outer[1]).css({left:left+selection.x1,top:top,width:w,height:selection.y1});$($outer[2]).css({left:left+selection.x2,top:top,width:imgWidth-selection.x2,height:imgHeight});$($outer[3]).css({left:left+selection.x1,top:top+selection.y2,width:w,height:imgHeight-selection.y2});w-=$handles.outerWidth();h-=$handles.outerHeight();switch($handles.length){case 8:$($handles[4]).css({left:w>>1});$($handles[5]).css({left:w,top:h>>1});$($handles[6]).css({left:w>>1,top:h});$($handles[7]).css({top:h>>1});case 4:$handles.slice(1,3).css({left:w});$handles.slice(2,4).css({top:h})}if(resetKeyPress!==false){if($.imgAreaSelect.keyPress!=docKeyPress)$(document).unbind($.imgAreaSelect.keyPress,$.imgAreaSelect.onKeyPress);if(options.keys)$(document)[$.imgAreaSelect.keyPress]($.imgAreaSelect.onKeyPress=docKeyPress)}if($.browser.msie&&$border.outerWidth()-$border.innerWidth()==2){$border.css('margin',0);setTimeout(function(){$border.css('margin','auto')},0)}}function doUpdate(resetKeyPress){adjust();update(resetKeyPress);x1=viewX(selection.x1);y1=viewY(selection.y1);x2=viewX(selection.x2);y2=viewY(selection.y2)}function hide($elem,fn){options.fadeSpeed?$elem.fadeOut(options.fadeSpeed,fn):$elem.hide()}function areaMouseMove(event){var x=selX(evX(event))-selection.x1,y=selY(evY(event))-selection.y1;if(!adjusted){adjust();adjusted=true;$box.one('mouseout',function(){adjusted=false})}resize='';if(options.resizable){if(y<=options.resizeMargin)resize='n';else if(y>=selection.height-options.resizeMargin)resize='s';if(x<=options.resizeMargin)resize+='w';else if(x>=selection.width-options.resizeMargin)resize+='e'}$box.css('cursor',resize?resize+'-resize':options.movable?'move':'');if($areaOpera)$areaOpera.toggle()}function docMouseUp(event){$('body').css('cursor','');if(options.autoHide||selection.width*selection.height==0)hide($box.add($outer),function(){$(this).hide()});$(document).unbind('mousemove',selectingMouseMove);$box.mousemove(areaMouseMove);options.onSelectEnd(img,getSelection())}function areaMouseDown(event){if(event.which!=1)return false;adjust();if(resize){$('body').css('cursor',resize+'-resize');x1=viewX(selection[/w/.test(resize)?'x2':'x1']);y1=viewY(selection[/n/.test(resize)?'y2':'y1']);$(document).mousemove(selectingMouseMove).one('mouseup',docMouseUp);$box.unbind('mousemove',areaMouseMove)}else if(options.movable){startX=left+selection.x1-evX(event);startY=top+selection.y1-evY(event);$box.unbind('mousemove',areaMouseMove);$(document).mousemove(movingMouseMove).one('mouseup',function(){options.onSelectEnd(img,getSelection());$(document).unbind('mousemove',movingMouseMove);$box.mousemove(areaMouseMove)})}else $img.mousedown(event);return false}function fixAspectRatio(xFirst){if(aspectRatio)if(xFirst){x2=max(left,min(left+imgWidth,x1+abs(y2-y1)*aspectRatio*(x2>x1||-1)));y2=round(max(top,min(top+imgHeight,y1+abs(x2-x1)/aspectRatio*(y2>y1||-1))));x2=round(x2)}else{y2=max(top,min(top+imgHeight,y1+abs(x2-x1)/aspectRatio*(y2>y1||-1)));x2=round(max(left,min(left+imgWidth,x1+abs(y2-y1)*aspectRatio*(x2>x1||-1))));y2=round(y2)}}function doResize(){x1=min(x1,left+imgWidth);y1=min(y1,top+imgHeight);if(abs(x2-x1)left+imgWidth)x1=left+imgWidth-minWidth}if(abs(y2-y1)top+imgHeight)y1=top+imgHeight-minHeight}x2=max(left,min(x2,left+imgWidth));y2=max(top,min(y2,top+imgHeight));fixAspectRatio(abs(x2-x1)maxWidth){x2=x1-maxWidth*(x2maxHeight){y2=y1-maxHeight*(y2=0)$handles.width(5).height(5);if(o=options.borderWidth)$handles.css({borderWidth:o,borderStyle:'solid'});styleOptions($handles,{borderColor1:'border-color',borderColor2:'background-color',borderOpacity:'opacity'})}scaleX=options.imageWidth/imgWidth||1;scaleY=options.imageHeight/imgHeight||1;if(newOptions.x1!=null){setSelection(newOptions.x1,newOptions.y1,newOptions.x2,newOptions.y2);newOptions.show=!newOptions.hide}if(newOptions.keys)options.keys=$.extend({shift:1,ctrl:'resize'},newOptions.keys);$outer.addClass(options.classPrefix+'-outer');$area.addClass(options.classPrefix+'-selection');for(i=0;i++<4;)$($border[i-1]).addClass(options.classPrefix+'-border'+i);styleOptions($area,{selectionColor:'background-color',selectionOpacity:'opacity'});styleOptions($border,{borderOpacity:'opacity',borderWidth:'border-width'});styleOptions($outer,{outerColor:'background-color',outerOpacity:'opacity'});if(o=options.borderColor1)$($border[0]).css({borderStyle:'solid',borderColor:o});if(o=options.borderColor2)$($border[1]).css({borderStyle:'dashed',borderColor:o});$box.append($area.add($border).add($areaOpera).add($handles));if($.browser.msie){if(o=$outer.css('filter').match(/opacity=([0-9]+)/))$outer.css('opacity',o[1]/100);if(o=$border.css('filter').match(/opacity=([0-9]+)/))$border.css('opacity',o[1]/100)}if(newOptions.hide)hide($box.add($outer));else if(newOptions.show&&imgLoaded){shown=true;$box.add($outer).fadeIn(options.fadeSpeed||0);doUpdate()}aspectRatio=(d=(options.aspectRatio||'').split(/:/))[0]/d[1];$img.add($outer).unbind('mousedown',imgMouseDown);if(options.disable||options.enable===false){$box.unbind('mousemove',areaMouseMove).unbind('mousedown',areaMouseDown);$(window).unbind('resize',windowResize)}else{if(options.enable||options.disable===false){if(options.resizable||options.movable)$box.mousemove(areaMouseMove).mousedown(areaMouseDown);$(window).resize(windowResize)}if(!options.persistent)$img.add($outer).mousedown(imgMouseDown)}options.enable=options.disable=undefined}this.remove=function(){setOptions({disable:true});$box.add($outer).remove()};this.getOptions=function(){return options};this.setOptions=setOptions;this.getSelection=getSelection;this.setSelection=setSelection;this.update=doUpdate;$p=$img;while($p.length){zIndex=max(zIndex,!isNaN($p.css('z-index'))?$p.css('z-index'):zIndex);if($p.css('position')=='fixed')position='fixed';$p=$p.parent(':not(body)')}zIndex=options.zIndex||zIndex;if($.browser.msie)$img.attr('unselectable','on');$.imgAreaSelect.keyPress=$.browser.msie||$.browser.safari?'keydown':'keypress';if($.browser.opera)$areaOpera=div().css({width:'100%',height:'100%',position:'absolute',zIndex:zIndex+2||2});$box.add($outer).css({visibility:'hidden',position:position,overflow:'hidden',zIndex:zIndex||'0'});$box.css({zIndex:zIndex+2||2});$area.add($border).css({position:'absolute',fontSize:0});img.complete||img.readyState=='complete'||!$img.is('img')?imgLoad():$img.one('load',imgLoad);if($.browser.msie&&$.browser.version>=9)img.src=img.src};$.fn.imgAreaSelect=function(options){options=options||{};this.each(function(){if($(this).data('imgAreaSelect')){if(options.remove){$(this).data('imgAreaSelect').remove();$(this).removeData('imgAreaSelect')}else $(this).data('imgAreaSelect').setOptions(options)}else if(!options.remove){if(options.enable===undefined&&options.disable===undefined)options.enable=true;$(this).data('imgAreaSelect',new $.imgAreaSelect(this,options))}});if(options.instance)return $(this).data('imgAreaSelect');return this}})(jQuery);pnp4nagios-0.6.16/share/pnp/media/js/jquery-ui-timepicker-addon.js0000664000000000000000000013615511662503006023477 0ustar rootroot/* * jQuery timepicker addon * By: Trent Richardson [http://trentrichardson.com] * Version 0.9.7 * Last Modified: 10/02/2011 * * Copyright 2011 Trent Richardson * Dual licensed under the MIT and GPL licenses. * http://trentrichardson.com/Impromptu/GPL-LICENSE.txt * http://trentrichardson.com/Impromptu/MIT-LICENSE.txt * * HERES THE CSS: * .ui-timepicker-div .ui-widget-header { margin-bottom: 8px; } * .ui-timepicker-div dl { text-align: left; } * .ui-timepicker-div dl dt { height: 25px; } * .ui-timepicker-div dl dd { margin: -25px 10px 10px 65px; } * .ui-timepicker-div td { font-size: 90%; } * .ui-tpicker-grid-label { background: none; border: none; margin: 0; padding: 0; } */ (function($) { $.extend($.ui, { timepicker: { version: "0.9.7" } }); /* Time picker manager. Use the singleton instance of this class, $.timepicker, to interact with the time picker. Settings for (groups of) time pickers are maintained in an instance object, allowing multiple different settings on the same page. */ function Timepicker() { this.regional = []; // Available regional settings, indexed by language code this.regional[''] = { // Default regional settings currentText: 'Now', closeText: 'Done', ampm: false, amNames: ['AM', 'A'], pmNames: ['PM', 'P'], timeFormat: 'hh:mm tt', timeSuffix: '', timeOnlyTitle: 'Choose Time', timeText: 'Time', hourText: 'Hour', minuteText: 'Minute', secondText: 'Second', millisecText: 'Millisecond', timezoneText: 'Time Zone' }; this._defaults = { // Global defaults for all the datetime picker instances showButtonPanel: true, timeOnly: false, showHour: true, showMinute: true, showSecond: false, showMillisec: false, showTimezone: false, showTime: true, stepHour: 0.05, stepMinute: 0.05, stepSecond: 0.05, stepMillisec: 0.5, hour: 0, minute: 0, second: 0, millisec: 0, timezone: '+0000', hourMin: 0, minuteMin: 0, secondMin: 0, millisecMin: 0, hourMax: 23, minuteMax: 59, secondMax: 59, millisecMax: 999, minDateTime: null, maxDateTime: null, onSelect: null, hourGrid: 0, minuteGrid: 0, secondGrid: 0, millisecGrid: 0, alwaysSetTime: true, separator: ' ', altFieldTimeOnly: true, showTimepicker: true, timezoneIso8609: false, timezoneList: null }; $.extend(this._defaults, this.regional['']); } $.extend(Timepicker.prototype, { $input: null, $altInput: null, $timeObj: null, inst: null, hour_slider: null, minute_slider: null, second_slider: null, millisec_slider: null, timezone_select: null, hour: 0, minute: 0, second: 0, millisec: 0, timezone: '+0000', hourMinOriginal: null, minuteMinOriginal: null, secondMinOriginal: null, millisecMinOriginal: null, hourMaxOriginal: null, minuteMaxOriginal: null, secondMaxOriginal: null, millisecMaxOriginal: null, ampm: '', formattedDate: '', formattedTime: '', formattedDateTime: '', timezoneList: null, /* Override the default settings for all instances of the time picker. @param settings object - the new settings to use as defaults (anonymous object) @return the manager object */ setDefaults: function(settings) { extendRemove(this._defaults, settings || {}); return this; }, //######################################################################## // Create a new Timepicker instance //######################################################################## _newInst: function($input, o) { var tp_inst = new Timepicker(), inlineSettings = {}; for (var attrName in this._defaults) { var attrValue = $input.attr('time:' + attrName); if (attrValue) { try { inlineSettings[attrName] = eval(attrValue); } catch (err) { inlineSettings[attrName] = attrValue; } } } tp_inst._defaults = $.extend({}, this._defaults, inlineSettings, o, { beforeShow: function(input, dp_inst) { if ($.isFunction(o.beforeShow)) o.beforeShow(input, dp_inst, tp_inst); }, onChangeMonthYear: function(year, month, dp_inst) { // Update the time as well : this prevents the time from disappearing from the $input field. tp_inst._updateDateTime(dp_inst); if ($.isFunction(o.onChangeMonthYear)) o.onChangeMonthYear.call($input[0], year, month, dp_inst, tp_inst); }, onClose: function(dateText, dp_inst) { if (tp_inst.timeDefined === true && $input.val() != '') tp_inst._updateDateTime(dp_inst); if ($.isFunction(o.onClose)) o.onClose.call($input[0], dateText, dp_inst, tp_inst); }, timepicker: tp_inst // add timepicker as a property of datepicker: $.datepicker._get(dp_inst, 'timepicker'); }); tp_inst.amNames = $.map(tp_inst._defaults.amNames, function(val) { return val.toUpperCase() }); tp_inst.pmNames = $.map(tp_inst._defaults.pmNames, function(val) { return val.toUpperCase() }); if (tp_inst._defaults.timezoneList === null) { var timezoneList = []; for (var i = -11; i <= 12; i++) timezoneList.push((i >= 0 ? '+' : '-') + ('0' + Math.abs(i).toString()).slice(-2) + '00'); if (tp_inst._defaults.timezoneIso8609) timezoneList = $.map(timezoneList, function(val) { return val == '+0000' ? 'Z' : (val.substring(0, 3) + ':' + val.substring(3)); }); tp_inst._defaults.timezoneList = timezoneList; } tp_inst.hour = tp_inst._defaults.hour; tp_inst.minute = tp_inst._defaults.minute; tp_inst.second = tp_inst._defaults.second; tp_inst.millisec = tp_inst._defaults.millisec; tp_inst.ampm = ''; tp_inst.$input = $input; if (o.altField) tp_inst.$altInput = $(o.altField) .css({ cursor: 'pointer' }) .focus(function(){ $input.trigger("focus"); }); if(tp_inst._defaults.minDate==0 || tp_inst._defaults.minDateTime==0) { tp_inst._defaults.minDate=new Date(); } if(tp_inst._defaults.maxDate==0 || tp_inst._defaults.maxDateTime==0) { tp_inst._defaults.maxDate=new Date(); } // datepicker needs minDate/maxDate, timepicker needs minDateTime/maxDateTime.. if(tp_inst._defaults.minDate !== undefined && tp_inst._defaults.minDate instanceof Date) tp_inst._defaults.minDateTime = new Date(tp_inst._defaults.minDate.getTime()); if(tp_inst._defaults.minDateTime !== undefined && tp_inst._defaults.minDateTime instanceof Date) tp_inst._defaults.minDate = new Date(tp_inst._defaults.minDateTime.getTime()); if(tp_inst._defaults.maxDate !== undefined && tp_inst._defaults.maxDate instanceof Date) tp_inst._defaults.maxDateTime = new Date(tp_inst._defaults.maxDate.getTime()); if(tp_inst._defaults.maxDateTime !== undefined && tp_inst._defaults.maxDateTime instanceof Date) tp_inst._defaults.maxDate = new Date(tp_inst._defaults.maxDateTime.getTime()); return tp_inst; }, //######################################################################## // add our sliders to the calendar //######################################################################## _addTimePicker: function(dp_inst) { var currDT = (this.$altInput && this._defaults.altFieldTimeOnly) ? this.$input.val() + ' ' + this.$altInput.val() : this.$input.val(); this.timeDefined = this._parseTime(currDT); this._limitMinMaxDateTime(dp_inst, false); this._injectTimePicker(); }, //######################################################################## // parse the time string from input value or _setTime //######################################################################## _parseTime: function(timeString, withDate) { var regstr = this._defaults.timeFormat.toString() .replace(/h{1,2}/ig, '(\\d?\\d)') .replace(/m{1,2}/ig, '(\\d?\\d)') .replace(/s{1,2}/ig, '(\\d?\\d)') .replace(/l{1}/ig, '(\\d?\\d?\\d)') .replace(/t{1,2}/ig, this._getPatternAmpm()) .replace(/z{1}/ig, '(z|[-+]\\d\\d:?\\d\\d)?') .replace(/\s/g, '\\s?') + this._defaults.timeSuffix + '$', order = this._getFormatPositions(), ampm = '', treg; if (!this.inst) this.inst = $.datepicker._getInst(this.$input[0]); if (withDate || !this._defaults.timeOnly) { // the time should come after x number of characters and a space. // x = at least the length of text specified by the date format var dp_dateFormat = $.datepicker._get(this.inst, 'dateFormat'); // escape special regex characters in the seperator var specials = new RegExp("[.*+?|()\\[\\]{}\\\\]", "g"); regstr = '.{' + dp_dateFormat.length + ',}' + this._defaults.separator.replace(specials, "\\$&") + regstr; } treg = timeString.match(new RegExp(regstr, 'i')); if (treg) { if (order.t !== -1) { if (treg[order.t] === undefined || treg[order.t].length === 0) { ampm = ''; this.ampm = ''; } else { ampm = $.inArray(treg[order.t].toUpperCase(), this.amNames) !== -1 ? 'AM' : 'PM'; this.ampm = this._defaults[ampm == 'AM' ? 'amNames' : 'pmNames'][0]; } } if (order.h !== -1) { if (ampm == 'AM' && treg[order.h] == '12') this.hour = 0; // 12am = 0 hour else if (ampm == 'PM' && treg[order.h] != '12') this.hour = (parseFloat(treg[order.h]) + 12).toFixed(0); // 12pm = 12 hour, any other pm = hour + 12 else this.hour = Number(treg[order.h]); } if (order.m !== -1) this.minute = Number(treg[order.m]); if (order.s !== -1) this.second = Number(treg[order.s]); if (order.l !== -1) this.millisec = Number(treg[order.l]); if (order.z !== -1 && treg[order.z] !== undefined) { var tz = treg[order.z].toUpperCase(); switch (tz.length) { case 1: // Z tz = this._defaults.timezoneIso8609 ? 'Z' : '+0000'; break; case 5: // +hhmm if (this._defaults.timezoneIso8609) tz = tz.substring(1) == '0000' ? 'Z' : tz.substring(0, 3) + ':' + tz.substring(3); break; case 6: // +hh:mm if (!this._defaults.timezoneIso8609) tz = tz == 'Z' || tz.substring(1) == '00:00' ? '+0000' : tz.replace(/:/, ''); else if (tz.substring(1) == '00:00') tz = 'Z'; break; } this.timezone = tz; } return true; } return false; }, //######################################################################## // pattern for standard and localized AM/PM markers //######################################################################## _getPatternAmpm: function() { var markers = []; o = this._defaults; if (o.amNames) $.merge(markers, o.amNames); if (o.pmNames) $.merge(markers, o.pmNames); markers = $.map(markers, function(val) { return val.replace(/[.*+?|()\[\]{}\\]/g, '\\$&') }); return '(' + markers.join('|') + ')?'; }, //######################################################################## // figure out position of time elements.. cause js cant do named captures //######################################################################## _getFormatPositions: function() { var finds = this._defaults.timeFormat.toLowerCase().match(/(h{1,2}|m{1,2}|s{1,2}|l{1}|t{1,2}|z)/g), orders = { h: -1, m: -1, s: -1, l: -1, t: -1, z: -1 }; if (finds) for (var i = 0; i < finds.length; i++) if (orders[finds[i].toString().charAt(0)] == -1) orders[finds[i].toString().charAt(0)] = i + 1; return orders; }, //######################################################################## // generate and inject html for timepicker into ui datepicker //######################################################################## _injectTimePicker: function() { var $dp = this.inst.dpDiv, o = this._defaults, tp_inst = this, // Added by Peter Medeiros: // - Figure out what the hour/minute/second max should be based on the step values. // - Example: if stepMinute is 15, then minMax is 45. hourMax = (o.hourMax - ((o.hourMax - o.hourMin) % o.stepHour)).toFixed(0), minMax = (o.minuteMax - ((o.minuteMax - o.minuteMin) % o.stepMinute)).toFixed(0), secMax = (o.secondMax - ((o.secondMax - o.secondMin) % o.stepSecond)).toFixed(0), millisecMax = (o.millisecMax - ((o.millisecMax - o.millisecMin) % o.stepMillisec)).toFixed(0), dp_id = this.inst.id.toString().replace(/([^A-Za-z0-9_])/g, ''); // Prevent displaying twice //if ($dp.find("div#ui-timepicker-div-"+ dp_id).length === 0) { if ($dp.find("div#ui-timepicker-div-"+ dp_id).length === 0 && o.showTimepicker) { var noDisplay = ' style="display:none;"', html = '
    ' + '
    ' + o.timeText + '
    ' + '
    ' + '
    ' + o.hourText + '
    ', hourGridSize = 0, minuteGridSize = 0, secondGridSize = 0, millisecGridSize = 0, size; // Hours if (o.showHour && o.hourGrid > 0) { html += '
    ' + '
    ' + '
    '; for (var h = o.hourMin; h <= hourMax; h += parseInt(o.hourGrid,10)) { hourGridSize++; var tmph = (o.ampm && h > 12) ? h-12 : h; if (tmph < 10) tmph = '0' + tmph; if (o.ampm) { if (h == 0) tmph = 12 +'a'; else if (h < 12) tmph += 'a'; else tmph += 'p'; } html += ''; } html += '
    ' + tmph + '
    ' + '
    '; } else html += '
    '; html += '
    ' + o.minuteText + '
    '; // Minutes if (o.showMinute && o.minuteGrid > 0) { html += '
    ' + '
    ' + '
    '; for (var m = o.minuteMin; m <= minMax; m += parseInt(o.minuteGrid,10)) { minuteGridSize++; html += ''; } html += '
    ' + ((m < 10) ? '0' : '') + m + '
    ' + '
    '; } else html += '
    '; // Seconds html += '
    ' + o.secondText + '
    '; if (o.showSecond && o.secondGrid > 0) { html += '
    ' + '
    ' + '
    '; for (var s = o.secondMin; s <= secMax; s += parseInt(o.secondGrid,10)) { secondGridSize++; html += ''; } html += '
    ' + ((s < 10) ? '0' : '') + s + '
    ' + '
    '; } else html += '
    '; // Milliseconds html += '
    ' + o.millisecText + '
    '; if (o.showMillisec && o.millisecGrid > 0) { html += '
    ' + '
    ' + '
    '; for (var l = o.millisecMin; l <= millisecMax; l += parseInt(o.millisecGrid,10)) { millisecGridSize++; html += ''; } html += '
    ' + ((l < 10) ? '0' : '') + s + '
    ' + '
    '; } else html += '
    '; // Timezone html += '
    ' + o.timezoneText + '
    '; html += '
    '; html += '
    '; $tp = $(html); // if we only want time picker... if (o.timeOnly === true) { $tp.prepend( '
    ' + '
    ' + o.timeOnlyTitle + '
    ' + '
    '); $dp.find('.ui-datepicker-header, .ui-datepicker-calendar').hide(); } this.hour_slider = $tp.find('#ui_tpicker_hour_'+ dp_id).slider({ orientation: "horizontal", value: this.hour, min: o.hourMin, max: hourMax, step: o.stepHour, slide: function(event, ui) { tp_inst.hour_slider.slider( "option", "value", ui.value); tp_inst._onTimeChange(); } }); // Updated by Peter Medeiros: // - Pass in Event and UI instance into slide function this.minute_slider = $tp.find('#ui_tpicker_minute_'+ dp_id).slider({ orientation: "horizontal", value: this.minute, min: o.minuteMin, max: minMax, step: o.stepMinute, slide: function(event, ui) { // update the global minute slider instance value with the current slider value tp_inst.minute_slider.slider( "option", "value", ui.value); tp_inst._onTimeChange(); } }); this.second_slider = $tp.find('#ui_tpicker_second_'+ dp_id).slider({ orientation: "horizontal", value: this.second, min: o.secondMin, max: secMax, step: o.stepSecond, slide: function(event, ui) { tp_inst.second_slider.slider( "option", "value", ui.value); tp_inst._onTimeChange(); } }); this.millisec_slider = $tp.find('#ui_tpicker_millisec_'+ dp_id).slider({ orientation: "horizontal", value: this.millisec, min: o.millisecMin, max: millisecMax, step: o.stepMillisec, slide: function(event, ui) { tp_inst.millisec_slider.slider( "option", "value", ui.value); tp_inst._onTimeChange(); } }); this.timezone_select = $tp.find('#ui_tpicker_timezone_'+ dp_id).append('').find("select"); $.fn.append.apply(this.timezone_select, $.map(o.timezoneList, function(val, idx) { return $("
    "),d=a("").append(e);return function(a){if(!(a in c)){var l=document.createElement("style"), m="@media "+a+" { #jquery-mediatest { position:absolute; } }";l.type="text/css";l.styleSheet?l.styleSheet.cssText=m:l.appendChild(document.createTextNode(m));b.prepend(d).prepend(l);c[a]=e.css("position")==="absolute";d.add(l).remove()}return c[a]}}();a.mobile.addResolutionBreakpoints=function(b){a.type(b)==="array"?e=e.concat(b):e.push(b);e.sort(function(a,b){return a-b});d()};a(document).bind("mobileinit.htmlclass",function(){c.bind("orientationchange.htmlclass throttledResize.htmlclass",function(a){a.orientation&& b.removeClass("portrait landscape").addClass(a.orientation);d()})});a(function(){c.trigger("orientationchange.htmlclass")})})(jQuery); (function(a,d){function c(a){var b=a.charAt(0).toUpperCase()+a.substr(1),a=(a+" "+f.join(b+" ")+b).split(" "),c;for(c in a)if(e[c]!==d)return!0}var b=a("").prependTo("html"),e=b[0].style,f=["webkit","moz","o"],g="palmGetResource"in window,i=window.blackberry;a.mobile.browser={};a.mobile.browser.ie=function(){for(var a=3,b=document.createElement("div"),c=b.all||[];b.innerHTML="<\!--[if gt IE "+ ++a+"]>
    ",c[0];);return a>4?a:!a}();a.extend(a.support,{orientation:"orientation"in window,touch:"ontouchend"in document,cssTransitions:"WebKitTransitionEvent"in window,pushState:!!history.pushState,mediaquery:a.mobile.media("only all"),cssPseudoElement:!!c("content"),boxShadow:!!c("boxShadow")&&!i,scrollTop:("pageXOffset"in window||"scrollTop"in document.documentElement||"scrollTop"in b[0])&&!g,dynamicBaseTag:function(){var c=location.protocol+"//"+location.host+location.pathname+"ui-dir/",e=a("head base"),d=null,f="";e.length?f=e.attr("href"):e=d=a("",{href:c}).appendTo("head"); var g=a("
    ").prependTo(b)[0].href;e[0].href=f?f:location.pathname;d&&d.remove();return g.indexOf(c)===0}(),eventCapture:"addEventListener"in document});b.remove();a.support.boxShadow||a("html").addClass("ui-mobile-nosupport-boxshadow")})(jQuery); (function(a,d,c,b){function e(a){for(;a&&typeof a.originalEvent!=="undefined";)a=a.originalEvent;return a}function f(b){for(var c={};b;){var e=a.data(b,n),d;for(d in e)if(e[d])c[d]=c.hasVirtualBinding=!0;b=b.parentNode}return c}function g(){v&&(clearTimeout(v),v=0);v=setTimeout(function(){A=v=0;B.length=0;w=!1;r=!0},a.vmouse.resetTimerDuration)}function i(c,d,r){var f=!1,g;if(!(g=r&&r[c])){if(r=!r)a:{for(r=d.target;r;){if((g=a.data(r,n))&&(!c||g[c]))break a;r=r.parentNode}r=null}g=r}if(g){f=d;r=f.type; f=a.Event(f);f.type=c;var h=f.originalEvent,j=a.event.props;if(h)for(c=j.length;c;)g=j[--c],f[g]=h[g];if(r.search(/^touch/)!==-1&&(c=e(h),r=c.touches,c=c.changedTouches,r=r&&r.length?r[0]:c&&c.length?c[0]:b)){c=0;for(h=y.length;ch||Math.abs(c.pageY-u)>h;c=f(b.target);s&&!d&&i("vmousecancel",b,c);i("vmousemove",b,c);g()}}function j(a){if(!r){r=!0;var b=f(a.target);i("vmouseup",a,b);if(!s&&i("vclick",a,b)){var c=e(a).changedTouches[0];B.push({touchID:A, x:c.clientX,y:c.clientY});w=!0}i("vmouseout",a,b);s=!1;g()}}function p(b){var b=a.data(b,n),c;if(b)for(c in b)if(b[c])return!0;return!1}function k(){}function q(b){var c=b.substr(1);return{setup:function(){p(this)||a.data(this,n,{});a.data(this,n)[b]=!0;t[b]=(t[b]||0)+1;t[b]===1&&C.bind(c,h);a(this).bind(c,k);if(E)t.touchstart=(t.touchstart||0)+1,t.touchstart===1&&C.bind("touchstart",l).bind("touchend",j).bind("touchmove",o).bind("scroll",m)},teardown:function(){--t[b];t[b]||C.unbind(c,h);E&&(--t.touchstart, t.touchstart||C.unbind("touchstart",l).unbind("touchmove",o).unbind("touchend",j).unbind("scroll",m));var d=a(this),e=a.data(this,n);e&&(e[b]=!1);d.unbind(c,k);p(this)||d.removeData(n)}}}var n="virtualMouseBindings",z="virtualTouchID",d="vmouseover vmousedown vmousemove vmouseup vclick vmouseout vmousecancel".split(" "),y="clientX clientY pageX pageY screenX screenY".split(" "),t={},v=0,x=0,u=0,s=!1,B=[],w=!1,r=!1,E=a.support.eventCapture,C=a(c),F=1,A=0;a.vmouse={moveDistanceThreshold:10,clickDistanceThreshold:10, resetTimerDuration:1500};for(var D=0;D10&&a.preventDefault()}}var m=c.originalEvent.touches?c.originalEvent.touches[0]:c,o={time:(new Date).getTime(),coords:[m.pageX,m.pageY],origin:a(c.target)},j;b.bind(g,e).one(f,function(){b.unbind(g,e); o&&j&&j.time-o.time<1E3&&Math.abs(o.coords[0]-j.coords[0])>30&&Math.abs(o.coords[1]-j.coords[1])<75&&o.origin.trigger("swipe").trigger(o.coords[0]>j.coords[0]?"swipeleft":"swiperight");o=j=d})})}};(function(a){function b(){var a=d();a!==e&&(e=a,c.trigger("orientationchange"))}var c=a(window),d,e;a.event.special.orientationchange={setup:function(){if(a.support.orientation)return!1;e=d();c.bind("throttledresize",b)},teardown:function(){if(a.support.orientation)return!1;c.unbind("throttledresize",b)}, add:function(a){var b=a.handler;a.handler=function(a){a.orientation=d();return b.apply(this,arguments)}}};a.event.special.orientationchange.orientation=d=function(){var a=document.documentElement;return a&&a.clientWidth/a.clientHeight<1.1?"portrait":"landscape"}})(jQuery);(function(){a.event.special.throttledresize={setup:function(){a(this).bind("resize",b)},teardown:function(){a(this).unbind("resize",b)}};var b=function(){e=(new Date).getTime();f=e-c;f>=250?(c=e,a(this).trigger("throttledresize")): (d&&clearTimeout(d),d=setTimeout(b,250-f))},c=0,d,e,f})();a.each({scrollstop:"scrollstart",taphold:"tap",swipeleft:"swipe",swiperight:"swipe"},function(b,c){a.event.special[b]={setup:function(){a(this).bind(c,a.noop)}}})})(jQuery); (function(a,d,c){function b(a){a=a||location.href;return"#"+a.replace(/^[^#]*#?(.*)$/,"$1")}var e="hashchange",f=document,g,i=a.event.special,h=f.documentMode,l="on"+e in d&&(h===c||h>7);a.fn[e]=function(a){return a?this.bind(e,a):this.trigger(e)};a.fn[e].delay=50;i[e]=a.extend(i[e],{setup:function(){if(l)return!1;a(g.start)},teardown:function(){if(l)return!1;a(g.stop)}});g=function(){function g(){var c=b(),f=n(i);if(c!==i)q(i=c,f),a(d).trigger(e);else if(f!==i)location.href=location.href.replace(/#.*/, "")+f;j=setTimeout(g,a.fn[e].delay)}var h={},j,i=b(),k=function(a){return a},q=k,n=k;h.start=function(){j||g()};h.stop=function(){j&&clearTimeout(j);j=c};a.browser.msie&&!l&&function(){var c,d;h.start=function(){if(!c)d=(d=a.fn[e].src)&&d+b(),c=a('':"");a._keyEvent=false;return w},_generateMonthYearHeader:function(a,b,c,e,f,h,i,g){var j=this._get(a,"changeMonth"), l=this._get(a,"changeYear"),u=this._get(a,"showMonthAfterYear"),k='
    ',o="";if(h||!j)o+=''+i[b]+"";else{i=e&&e.getFullYear()==c;var m=f&&f.getFullYear()==c;o+='"}u||(k+=o+(h||!(j&&l)?" ":""));if(!a.yearshtml){a.yearshtml="";if(h||!l)k+=''+c+"";else{g=this._get(a,"yearRange").split(":");var s=(new Date).getFullYear();i=function(q){q=q.match(/c[+-].*/)?c+parseInt(q.substring(1),10):q.match(/[+-].*/)?s+parseInt(q,10):parseInt(q,10);return isNaN(q)?s:q};b=i(g[0]);g=Math.max(b,i(g[1]||""));b=e?Math.max(b,e.getFullYear()):b;g=f?Math.min(g,f.getFullYear()): g;for(a.yearshtml+='";k+=a.yearshtml;a.yearshtml=null}}k+=this._get(a,"yearSuffix");if(u)k+=(h||!(j&&l)?" ":"")+o;k+="
    ";return k},_adjustInstDate:function(a,b,c){var e=a.drawYear+(c== "Y"?b:0),f=a.drawMonth+(c=="M"?b:0);b=Math.min(a.selectedDay,this._getDaysInMonth(e,f))+(c=="D"?b:0);e=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(e,f,b)));a.selectedDay=e.getDate();a.drawMonth=a.selectedMonth=e.getMonth();a.drawYear=a.selectedYear=e.getFullYear();if(c=="M"||c=="Y")this._notifyChange(a)},_restrictMinMax:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");b=c&&ba?a:b},_notifyChange:function(a){var b=this._get(a,"onChangeMonthYear"); if(b)b.apply(a.input?a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){a=this._get(a,"numberOfMonths");return a==null?[1,1]:typeof a=="number"?[1,a]:a},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+"Date"),null)},_getDaysInMonth:function(a,b){return 32-this._daylightSavingAdjust(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a,b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,e){var f=this._getNumberOfMonths(a); c=this._daylightSavingAdjust(new Date(c,e+(b<0?b:f[0]*f[1]),1));b<0&&c.setDate(this._getDaysInMonth(c.getFullYear(),c.getMonth()));return this._isInRange(a,c)},_isInRange:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");return(!c||b.getTime()>=c.getTime())&&(!a||b.getTime()<=a.getTime())},_getFormatConfig:function(a){var b=this._get(a,"shortYearCutoff");b=typeof b!="string"?b:(new Date).getFullYear()%100+parseInt(b,10);return{shortYearCutoff:b,dayNamesShort:this._get(a, "dayNamesShort"),dayNames:this._get(a,"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,b,c,e){if(!b){a.currentDay=a.selectedDay;a.currentMonth=a.selectedMonth;a.currentYear=a.selectedYear}b=b?typeof b=="object"?b:this._daylightSavingAdjust(new Date(e,c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,"dateFormat"),b,this._getFormatConfig(a))}});d.fn.datepicker= function(a){if(!this.length)return this;if(!d.datepicker.initialized){d(document).mousedown(d.datepicker._checkExternalClick).find("body").append(d.datepicker.dpDiv);d.datepicker.initialized=true}var b=Array.prototype.slice.call(arguments,1);if(typeof a=="string"&&(a=="isDisabled"||a=="getDate"||a=="widget"))return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));if(a=="option"&&arguments.length==2&&typeof arguments[1]=="string")return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker, [this[0]].concat(b));return this.each(function(){typeof a=="string"?d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this].concat(b)):d.datepicker._attachDatepicker(this,a)})};d.datepicker=new M;d.datepicker.initialized=false;d.datepicker.uuid=(new Date).getTime();d.datepicker.version="1.8.14";window["DP_jQuery_"+A]=d})(jQuery); ;/* * jQuery UI Progressbar 1.8.14 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Progressbar * * Depends: * jquery.ui.core.js * jquery.ui.widget.js */ (function(b,d){b.widget("ui.progressbar",{options:{value:0,max:100},min:0,_create:function(){this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min,"aria-valuemax":this.options.max,"aria-valuenow":this._value()});this.valueDiv=b("
    ").appendTo(this.element);this.oldValue=this._value();this._refreshValue()},destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"); this.valueDiv.remove();b.Widget.prototype.destroy.apply(this,arguments)},value:function(a){if(a===d)return this._value();this._setOption("value",a);return this},_setOption:function(a,c){if(a==="value"){this.options.value=c;this._refreshValue();this._value()===this.options.max&&this._trigger("complete")}b.Widget.prototype._setOption.apply(this,arguments)},_value:function(){var a=this.options.value;if(typeof a!=="number")a=0;return Math.min(this.options.max,Math.max(this.min,a))},_percentage:function(){return 100* this._value()/this.options.max},_refreshValue:function(){var a=this.value(),c=this._percentage();if(this.oldValue!==a){this.oldValue=a;this._trigger("change")}this.valueDiv.toggle(a>this.min).toggleClass("ui-corner-right",a===this.options.max).width(c.toFixed(0)+"%");this.element.attr("aria-valuenow",a)}});b.extend(b.ui.progressbar,{version:"1.8.14"})})(jQuery); ;/* * jQuery UI Effects 1.8.14 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Effects/ */ jQuery.effects||function(f,j){function m(c){var a;if(c&&c.constructor==Array&&c.length==3)return c;if(a=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(c))return[parseInt(a[1],10),parseInt(a[2],10),parseInt(a[3],10)];if(a=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(c))return[parseFloat(a[1])*2.55,parseFloat(a[2])*2.55,parseFloat(a[3])*2.55];if(a=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(c))return[parseInt(a[1], 16),parseInt(a[2],16),parseInt(a[3],16)];if(a=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(c))return[parseInt(a[1]+a[1],16),parseInt(a[2]+a[2],16),parseInt(a[3]+a[3],16)];if(/rgba\(0, 0, 0, 0\)/.exec(c))return n.transparent;return n[f.trim(c).toLowerCase()]}function s(c,a){var b;do{b=f.curCSS(c,a);if(b!=""&&b!="transparent"||f.nodeName(c,"body"))break;a="backgroundColor"}while(c=c.parentNode);return m(b)}function o(){var c=document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle, a={},b,d;if(c&&c.length&&c[0]&&c[c[0]])for(var e=c.length;e--;){b=c[e];if(typeof c[b]=="string"){d=b.replace(/\-(\w)/g,function(g,h){return h.toUpperCase()});a[d]=c[b]}}else for(b in c)if(typeof c[b]==="string")a[b]=c[b];return a}function p(c){var a,b;for(a in c){b=c[a];if(b==null||f.isFunction(b)||a in t||/scrollbar/.test(a)||!/color/i.test(a)&&isNaN(parseFloat(b)))delete c[a]}return c}function u(c,a){var b={_:0},d;for(d in a)if(c[d]!=a[d])b[d]=a[d];return b}function k(c,a,b,d){if(typeof c=="object"){d= a;b=null;a=c;c=a.effect}if(f.isFunction(a)){d=a;b=null;a={}}if(typeof a=="number"||f.fx.speeds[a]){d=b;b=a;a={}}if(f.isFunction(b)){d=b;b=null}a=a||{};b=b||a.duration;b=f.fx.off?0:typeof b=="number"?b:b in f.fx.speeds?f.fx.speeds[b]:f.fx.speeds._default;d=d||a.complete;return[c,a,b,d]}function l(c){if(!c||typeof c==="number"||f.fx.speeds[c])return true;if(typeof c==="string"&&!f.effects[c])return true;return false}f.effects={};f.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor", "borderTopColor","borderColor","color","outlineColor"],function(c,a){f.fx.step[a]=function(b){if(!b.colorInit){b.start=s(b.elem,a);b.end=m(b.end);b.colorInit=true}b.elem.style[a]="rgb("+Math.max(Math.min(parseInt(b.pos*(b.end[0]-b.start[0])+b.start[0],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[1]-b.start[1])+b.start[1],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[2]-b.start[2])+b.start[2],10),255),0)+")"}});var n={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0, 0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211, 211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]},q=["add","remove","toggle"],t={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};f.effects.animateClass=function(c,a,b, d){if(f.isFunction(b)){d=b;b=null}return this.queue(function(){var e=f(this),g=e.attr("style")||" ",h=p(o.call(this)),r,v=e.attr("class");f.each(q,function(w,i){c[i]&&e[i+"Class"](c[i])});r=p(o.call(this));e.attr("class",v);e.animate(u(h,r),{queue:false,duration:a,easing:b,complete:function(){f.each(q,function(w,i){c[i]&&e[i+"Class"](c[i])});if(typeof e.attr("style")=="object"){e.attr("style").cssText="";e.attr("style").cssText=g}else e.attr("style",g);d&&d.apply(this,arguments);f.dequeue(this)}})})}; f.fn.extend({_addClass:f.fn.addClass,addClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{add:c},a,b,d]):this._addClass(c)},_removeClass:f.fn.removeClass,removeClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{remove:c},a,b,d]):this._removeClass(c)},_toggleClass:f.fn.toggleClass,toggleClass:function(c,a,b,d,e){return typeof a=="boolean"||a===j?b?f.effects.animateClass.apply(this,[a?{add:c}:{remove:c},b,d,e]):this._toggleClass(c,a):f.effects.animateClass.apply(this, [{toggle:c},a,b,d])},switchClass:function(c,a,b,d,e){return f.effects.animateClass.apply(this,[{add:a,remove:c},b,d,e])}});f.extend(f.effects,{version:"1.8.14",save:function(c,a){for(var b=0;b
    ").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}); c.wrap(b);b=c.parent();if(c.css("position")=="static"){b.css({position:"relative"});c.css({position:"relative"})}else{f.extend(a,{position:c.css("position"),zIndex:c.css("z-index")});f.each(["top","left","bottom","right"],function(d,e){a[e]=c.css(e);if(isNaN(parseInt(a[e],10)))a[e]="auto"});c.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})}return b.css(a).show()},removeWrapper:function(c){if(c.parent().is(".ui-effects-wrapper"))return c.parent().replaceWith(c);return c},setTransition:function(c, a,b,d){d=d||{};f.each(a,function(e,g){unit=c.cssUnit(g);if(unit[0]>0)d[g]=unit[0]*b+unit[1]});return d}});f.fn.extend({effect:function(c){var a=k.apply(this,arguments),b={options:a[1],duration:a[2],callback:a[3]};a=b.options.mode;var d=f.effects[c];if(f.fx.off||!d)return a?this[a](b.duration,b.callback):this.each(function(){b.callback&&b.callback.call(this)});return d.call(this,b)},_show:f.fn.show,show:function(c){if(l(c))return this._show.apply(this,arguments);else{var a=k.apply(this,arguments); a[1].mode="show";return this.effect.apply(this,a)}},_hide:f.fn.hide,hide:function(c){if(l(c))return this._hide.apply(this,arguments);else{var a=k.apply(this,arguments);a[1].mode="hide";return this.effect.apply(this,a)}},__toggle:f.fn.toggle,toggle:function(c){if(l(c)||typeof c==="boolean"||f.isFunction(c))return this.__toggle.apply(this,arguments);else{var a=k.apply(this,arguments);a[1].mode="toggle";return this.effect.apply(this,a)}},cssUnit:function(c){var a=this.css(c),b=[];f.each(["em","px","%", "pt"],function(d,e){if(a.indexOf(e)>0)b=[parseFloat(a),e]});return b}});f.easing.jswing=f.easing.swing;f.extend(f.easing,{def:"easeOutQuad",swing:function(c,a,b,d,e){return f.easing[f.easing.def](c,a,b,d,e)},easeInQuad:function(c,a,b,d,e){return d*(a/=e)*a+b},easeOutQuad:function(c,a,b,d,e){return-d*(a/=e)*(a-2)+b},easeInOutQuad:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a+b;return-d/2*(--a*(a-2)-1)+b},easeInCubic:function(c,a,b,d,e){return d*(a/=e)*a*a+b},easeOutCubic:function(c,a,b,d,e){return d* ((a=a/e-1)*a*a+1)+b},easeInOutCubic:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a+b;return d/2*((a-=2)*a*a+2)+b},easeInQuart:function(c,a,b,d,e){return d*(a/=e)*a*a*a+b},easeOutQuart:function(c,a,b,d,e){return-d*((a=a/e-1)*a*a*a-1)+b},easeInOutQuart:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a+b;return-d/2*((a-=2)*a*a*a-2)+b},easeInQuint:function(c,a,b,d,e){return d*(a/=e)*a*a*a*a+b},easeOutQuint:function(c,a,b,d,e){return d*((a=a/e-1)*a*a*a*a+1)+b},easeInOutQuint:function(c,a,b,d,e){if((a/= e/2)<1)return d/2*a*a*a*a*a+b;return d/2*((a-=2)*a*a*a*a+2)+b},easeInSine:function(c,a,b,d,e){return-d*Math.cos(a/e*(Math.PI/2))+d+b},easeOutSine:function(c,a,b,d,e){return d*Math.sin(a/e*(Math.PI/2))+b},easeInOutSine:function(c,a,b,d,e){return-d/2*(Math.cos(Math.PI*a/e)-1)+b},easeInExpo:function(c,a,b,d,e){return a==0?b:d*Math.pow(2,10*(a/e-1))+b},easeOutExpo:function(c,a,b,d,e){return a==e?b+d:d*(-Math.pow(2,-10*a/e)+1)+b},easeInOutExpo:function(c,a,b,d,e){if(a==0)return b;if(a==e)return b+d;if((a/= e/2)<1)return d/2*Math.pow(2,10*(a-1))+b;return d/2*(-Math.pow(2,-10*--a)+2)+b},easeInCirc:function(c,a,b,d,e){return-d*(Math.sqrt(1-(a/=e)*a)-1)+b},easeOutCirc:function(c,a,b,d,e){return d*Math.sqrt(1-(a=a/e-1)*a)+b},easeInOutCirc:function(c,a,b,d,e){if((a/=e/2)<1)return-d/2*(Math.sqrt(1-a*a)-1)+b;return d/2*(Math.sqrt(1-(a-=2)*a)+1)+b},easeInElastic:function(c,a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e)==1)return b+d;g||(g=e*0.3);if(h").css({position:"absolute",visibility:"visible",left:-f*(h/d),top:-e*(i/c)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:h/d,height:i/c,left:g.left+f*(h/d)+(a.options.mode=="show"?(f-Math.floor(d/2))*(h/d):0),top:g.top+e*(i/c)+(a.options.mode=="show"?(e-Math.floor(c/2))*(i/c):0),opacity:a.options.mode=="show"?0:1}).animate({left:g.left+f*(h/d)+(a.options.mode=="show"?0:(f-Math.floor(d/2))*(h/d)),top:g.top+ e*(i/c)+(a.options.mode=="show"?0:(e-Math.floor(c/2))*(i/c)),opacity:a.options.mode=="show"?1:0},a.duration||500);setTimeout(function(){a.options.mode=="show"?b.css({visibility:"visible"}):b.css({visibility:"visible"}).hide();a.callback&&a.callback.apply(b[0]);b.dequeue();j("div.ui-effects-explode").remove()},a.duration||500)})}})(jQuery); ;/* * jQuery UI Effects Fade 1.8.14 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Effects/Fade * * Depends: * jquery.effects.core.js */ (function(b){b.effects.fade=function(a){return this.queue(function(){var c=b(this),d=b.effects.setMode(c,a.options.mode||"hide");c.animate({opacity:d},{queue:false,duration:a.duration,easing:a.options.easing,complete:function(){a.callback&&a.callback.apply(this,arguments);c.dequeue()}})})}})(jQuery); ;/* * jQuery UI Effects Fold 1.8.14 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Effects/Fold * * Depends: * jquery.effects.core.js */ (function(c){c.effects.fold=function(a){return this.queue(function(){var b=c(this),j=["position","top","bottom","left","right"],d=c.effects.setMode(b,a.options.mode||"hide"),g=a.options.size||15,h=!!a.options.horizFirst,k=a.duration?a.duration/2:c.fx.speeds._default/2;c.effects.save(b,j);b.show();var e=c.effects.createWrapper(b).css({overflow:"hidden"}),f=d=="show"!=h,l=f?["width","height"]:["height","width"];f=f?[e.width(),e.height()]:[e.height(),e.width()];var i=/([0-9]+)%/.exec(g);if(i)g=parseInt(i[1], 10)/100*f[d=="hide"?0:1];if(d=="show")e.css(h?{height:0,width:g}:{height:g,width:0});h={};i={};h[l[0]]=d=="show"?f[0]:g;i[l[1]]=d=="show"?f[1]:0;e.animate(h,k,a.options.easing).animate(i,k,a.options.easing,function(){d=="hide"&&b.hide();c.effects.restore(b,j);c.effects.removeWrapper(b);a.callback&&a.callback.apply(b[0],arguments);b.dequeue()})})}})(jQuery); ;/* * jQuery UI Effects Highlight 1.8.14 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Effects/Highlight * * Depends: * jquery.effects.core.js */ (function(b){b.effects.highlight=function(c){return this.queue(function(){var a=b(this),e=["backgroundImage","backgroundColor","opacity"],d=b.effects.setMode(a,c.options.mode||"show"),f={backgroundColor:a.css("backgroundColor")};if(d=="hide")f.opacity=0;b.effects.save(a,e);a.show().css({backgroundImage:"none",backgroundColor:c.options.color||"#ffff99"}).animate(f,{queue:false,duration:c.duration,easing:c.options.easing,complete:function(){d=="hide"&&a.hide();b.effects.restore(a,e);d=="show"&&!b.support.opacity&& this.style.removeAttribute("filter");c.callback&&c.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery); ;/* * jQuery UI Effects Pulsate 1.8.14 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Effects/Pulsate * * Depends: * jquery.effects.core.js */ (function(d){d.effects.pulsate=function(a){return this.queue(function(){var b=d(this),c=d.effects.setMode(b,a.options.mode||"show");times=(a.options.times||5)*2-1;duration=a.duration?a.duration/2:d.fx.speeds._default/2;isVisible=b.is(":visible");animateTo=0;if(!isVisible){b.css("opacity",0).show();animateTo=1}if(c=="hide"&&isVisible||c=="show"&&!isVisible)times--;for(c=0;c').appendTo(document.body).addClass(a.options.className).css({top:d.top,left:d.left,height:b.innerHeight(),width:b.innerWidth(),position:"absolute"}).animate(c,a.duration,a.options.easing,function(){f.remove();a.callback&&a.callback.apply(b[0],arguments); b.dequeue()})})}})(jQuery); ;pnp4nagios-0.6.16/share/pnp/media/images/0000775000000000000000000000000011662503006016610 5ustar rootrootpnp4nagios-0.6.16/share/pnp/media/images/int.gif0000664000000000000000000000012011662503006020062 0ustar rootrootGIF89a !, !&4SXY֌P=¦p ;pnp4nagios-0.6.16/share/pnp/media/images/remove.png0000664000000000000000000000143011662503006020611 0ustar rootrootPNG  IHDR szzgAMA7bKGDC pHYsHHFk>zIDATX핿kQ?3{{ A *VClI.UӤ2XFE0 jED[ B- Gng{wbH/ f@mCRV=LͿM@' HL~M~#Ap+wYX]NQ<:r ]BcoVv6>ZEy>K ,z,~LbB+k~a} <4~~SC'{uuPeTy9C5 Hj>|*%25I^^3ܵ9q:e/p$\R^qƎy!_|kdu\2I.n&"ܟƮ61,.=>1R;4~Bs6yLr_QXZɫger+,~y&PrOP`8h+8Nqkzl[Bk ﱸtOFmԞ7bp""zTXtSoftwarexsLOJUMLO JML/Ԯ MIENDB`pnp4nagios-0.6.16/share/pnp/media/images/special.png0000775000000000000000000001270711662503006020750 0ustar rootrootPNG  IHDR<<:rsRGBgAMA a cHRMz&u0`:pQ<EIDAThCTUǾs}ɻ/>s#tb`b/ E)"(c%jl`CE ҫSC޷ATZ5={|S39|%bŊ]g;26&Bԅ|WEFFjH$eee?B| qư {rrYcy7JxJJJkeZN111s> H"E. 4yq C( (+oݻ7A^+CVYRdE]B<Swnϯ5]fxur r(2#"9?{*ـg1u+-B)2o_Eډ0dFɕBѥ(\kQwQ|%|DEՐFMd^ AFY3s7KK57bi/"/r(ίW y77H{>(~G(y ej%d}YW|yAܬAU4鏛ꋄ<!? =ˠ7V8](J&xB$z4YP/@od܍Byys(5DtHhJr»S.ERlH΀wHF~%P;.<_ZՅ]'A~," 92g! ^Sw vM5Sӟ]FW $A=c Cy;J3QMr,iHc#dfguT ~鞞(JeEV؏ ou(:< }\|h czYHd Y:*Gg(%NEd#ed#V8k#Be@ϨwCE) !xrEw_Y_|iz'SpHlhS1|X#15Vbt2̴YvCy#9, X0#؄⩬**d I|*Ow<3O?DY~ (ΐqugiG~Z# ^d5X{o ow,bx-fM`f{S&@-%}y2R<PKMDVH\֦,B}Q wBWHwBj=̶3xW3eKHg:NȹD9#֏ȎGYq(*+¯GP2)xkڅM܅-&rRРs`~~ | i7f#w)9}!bCm%=:J#J:ʞ83= 0 ` /08xĖ(da#sPмi"Y1ÌQŪ[ j)Ѻs~Pw[H g kW͑(;-{N-tGDE¦opSnjd:~-½Y&eH)Fv\0も-kقl⇖(bӶAy5Y64N| u^+gR3+ Bq]ވ#89yN#Oq*Pplw ϻ36h"?H ]Ё"Thb &`Y歊g(ߦ]zPG!# Pv"5CbLP3͛<6:ěP`%F`bY@0 jQˍ,)7&y~}n 8R(Xbrz j8Q!5IpO A$t(nn!ۆ֎aګoLCfDNb)aű~_U dˮыc{wtF{KuozxwDWL(\@BUEAkBJ⠡(ep&}b.fļ/&X+bMl]G~w~cˈ61ӧgD %t D4t}(7CozS>(7sXPH o%UT\ U<ߟQLC9Aҏ~xo$AU[(-1` >MB}ݰ8P 鄠qdBgO"?]8'\`mV!9J*Cg:Y.6ZT$C4'~uVi2*Pl`Fֳf@@LTQAv @ўt @a5(g\+qq%'8yP!rp } ;GM'G.<8` C/XuUH0[fDqK}1BƎFŬ&ߩ=Ptt$rw}dWA[Ӈuұ[}3׫!ÒN d d:..U~gZ.ݢ+ ^L`$[ 9{k'ʸt}ċgt>[Y % F.>M|fénlrl{5qTl@6UHG{xOpavbq `&6r&p "& | Nw0ZUw4F~&CGXý0Τ'"fd ӂhE2BfMH4d*ң܄8b!Ǜ!(B̬m czaqo8\ΚR nҒp⧉%|vyZT&[/UGaC!Tkg ֫➇uz8n+MhzM?-߾ Cr:gDtvyM(f=ub9vH\m5*3We;hғ}tN [Nb}d>jPpA')ݹK Bw!prCLr0@׭c^ +]!O&xB 'U{ H8sˇA UAsy.\G\aMb񝢋­rL[xd9+n>MvחBsC 6+|^‚&qv!^<}ZTaCG|z"lGݻ ^_sVaKvq|=W6F'f|aKVI~&lnHtq,YBBwy@8 6ݫ\4V,Ov#nx@NYQoeQ #߉; ~,⃧IB<= JB3Ο5ݻwoϫ3f lE"{4KvUpc0#=dQ(˛duR)"Q~}EYnݺ$ߎPWǯ_ _/>i_ܹs'cҘ : ?oW_B۷r$ƹtRLvl)SV[~i==VKw[Nң]vm|eL_5SG柿aՑW_GC}ݾU۷iӽmۯor@6m5!?jݺGVݾElSī}t!X8!ajE ǂc+e6XG;upLIENDB`pnp4nagios-0.6.16/share/pnp/media/images/stats.png0000664000000000000000000001512011662503006020453 0ustar rootrootPNG  IHDR<<:rsRGBgAMA a cHRMz&u0`:pQ<IDAThCwT׶s}͍cEyr5bb%/aAXAF@EإX"* "]*w603tgHG0p>9_/߁#Ge~~l쌌?dff.cJJJ/&&fX,vutt|uO-߅B?3ckc!_E3Ȱx*tvv\{{Z/{3*uiw؁kzMM-m@EE 239(*ϗ&)PԢNV}qu 2-4 *QT$CFf)J(o}sq+wID@F; 1-pTN yºg̏Bem3>ƵnM#w\d.;so`]\7F+]u L-K& zk#)Xچa=7c[*p2cfYND`upصog,J)X)V.JY *))<*EUrYˣt=g9QP-%͒? ևEpk])Pp M7REdљ \(}JF:KA "l:/>T5ë/aٙɃɶ@s-0su SՄJ9ooz': (D6Fxͽ2_W 8&v f09_ gXZ?c%;U%{ a{YYN[`@I,*~/+,"`~]dJ9_ HT!yv#jmƵ&8+qv{[NddJƞO"G)aZpXS NhyXct%=YǪdl4DXhri\(]RRp#XNg/Gb$lĥySUKċݸV܎nKT3VV/5fk`UU8誀%iIMDxGjrA˥0jjVDZ-źB>)q>cB,:̃Ie<; 9c˨ }וcҁJʉiP('{%\8*yo 7ѝg9v,,$Tt6V,.=K\5 $ }n4 0rM: Ɯ7N=s]5"p^5vv}(某Aױ 6]i C?2]E Y [ZzpTIUJ`zrȨhoFGk#[Tͨi6QvFpYc4_l' 1D/}9x{]xm4fb7p-5Q|> :'ˠЊG1}J:)3` Ȱb9vPk%ܮI>x *ls%d\cEs1,_D,7JHD { CWw, A,FMŰaf rQSе&DBNEQ%o)ǻR(Fb__BL$X{^ +ra>USa 44lbTn6HHY>1Ƨ2 66#F⽅\_A D~05gs1mMx# waҋ&]XXB0הK9K[?ǔ0c1laJ|L*,k!t0 bYhP6@րyI0kƑFG 'bĪX YC19p,CqkSջ^~RQ$ (AA˺˝0'%Flcl&1#!&0h]4 0ڬm-I.>ߖͭBcS:[X+Zd`8 ] eQK$` ! hq0f}ƭIs`.vB*<_,-' {1`p?oK9BÔLHB5CäP ;t=Ì0|m->ceP}GMYOMyuؒH ^842.=gBy)K>ZɅd5Hy>ػ׃jTūҊʆfHS=;6}rhV5M\M3>=BsS>47A(k0tq*hJ_M ꠥ~Ȁ8uC, +Hsy @h.6GƮH?Kmbmm-Y-I{o94kk*Ҫfb"z^-|hmʃIhѩ>yܤ(]'ɤw/ώ Z-0V@ky0Ak?`R|`O̲0fa4,v-.mvYKw,|[bS6tu|йsNUcn1FVGm.(sB|z#(lژI OŇ 4L>TuY|ނՊ\Q;ʀDQ+1j="P_O2N?oJg20TeSTF\aTYbD |kS[1:\ٜCBw$VctX\#PU|3vb~Fߎ!1C1f='1V`Ro2L0$*+?5L䙞8tߜqzRSģWlUYYtl-XP ëq\O,iuҡY]틉iķOd;.MB87qʪ(&c0aS00_D9EgSh>#" ӭ2atϩ]jpS4@Ipr9Sa-fX%+ǘ3wYqV VCze==|e ?s Ea+gM4:Gm ʰ:XFs;SùF0$vx0=$[/B&<2ՠ3ҼԔQ'X<555Mu9A κ ̧`M!V.3"ً脀B:F;,~zNgCyC},,|1 _SX>(?DGќWlLN2Q8!YVo $eKL\fTsc~ٛ>*L̰$6-I4IF?X~9HMkf^ZwŢ^ja7AH/@(7Tm8%?\- vAgw͂ξlz$|s`O7_O>yacߧZ/waQQeȌÇ/&GvojjKmksjFFz)+ v%D66W>shO#3m~dl:p@GG?\t[sli$;[6lرIE]SN= Q3>-ff&,-[[[lɴG5KC1bĈ@4:O44|$ d2[z]}0|kDAzT@}ݝǾDl~1_ڭVUIwIENDB`pnp4nagios-0.6.16/share/pnp/media/images/zoom.png0000664000000000000000000000145211662503006020304 0ustar rootrootPNG  IHDRabKGD pHYs  tIME :irIDATxuKHTař3x#ENI-LAQ" ,jM",EPX"H"(b o9ʌm33"ӻzy95Jpvʁq9Ҵ=--Gt8tvv{yyϣʲ-'F_[Is3v{"~/D3dA% =wCK͏ _S}>/>T?ƠPvhtXK(0HFP$ nE,I`:'HRR/Bx] 8B` NgdϱŠ|6ۄ]pno@e{x1W+-\1Ź ĒhE+ @x:ƭVwJoɝPVnk48՛xA~z0qgUZSuaTy;6`uvqPU W^dcgw񲪹uj' 2v-{VlQE!\rgjG"+*aLvG̎& RFli_"ߘt.˼u_7|՛63Rꋀcs$H"#%'KcHǤ<* HG1 Q1C67R4Sd#4y5CewUNU8%жEiL&w 8xއ"(C. i!;Ǥ?\@dN3( ~ ?g6_DtgvrmR00|s/W3H,2?"sUg^t{oi_ѨK=A5\:wo;xÞь: $?'^X:^:TK,]pw jT߃8$ǽK=Qe+/5 HRv4FBUB7x`pS#+pq Y*~m|}‹t : M&ռAڛ&ǼmUO\#\NH2Fݽfh y/?c0u:)aS\E>1q,aUԚH16Mlz8}-9IjP/.=B2e *#Z[Vf{ K{᳄Vnw^:0D;׈3 *_[ŢРx"n]!z^ԥ]eN2\W"ӫyx!-4Gxt( GX MZR̽KtanG|>g\ܨwgp\ؚ ю?(rUyodJ@8a!’%!d^U2]%]d!}bp^'4RofS:ń7¸u 2*{qIúAF 5Z yI}5,k B6FPes$n~/q#vg~v#`.=Y/ѴdQrno SI=] ,M#:=FKH:}Cƒ-v|b&D\|AFx(nl-֚s5S@mS#œn ϫ+I *˂"Eb YB~ YX?+ZQ .btA})Ihp(ZzS9h>% EYqeQզK(q^=3@3&P֎30_qWz]EfiU>JESb5Ȳq{%-!'r5]k7<Z\,^k!?y׋uc;knBts=&9C3ke~/W.׮΋q5n=3XU ='ޭT,-FNʓ]eI8RY R3t,9hceH)%!]VK{H: =a,ݗ,} WX7ǫ$M_j<O!8($Apc 0 ;0}؋u3p݅uAj][ 7 Mf?߮rQp "X;$ģKi1{ ː`uTXCC{ze4 ̯Kt 1ݜwApb lm=|Oaa,l~Q$V~?{N.NJQg,H;Ţj=q!tWr]:;:}ƥ\6p:>tߕBg)q{B֧n2_rPܤϪ ?50Oq|# =o }*)k }XtN:D}UD.Z5jɸaHnIs>pP$lyU]ڷX^⪃ ؓW3d8`h0QC=G;7 7O#0v%g4A7Y#<ΚKSS`_[(Lm0!k[B-E%̀1$ hz Aip iT|e, @p*,\Kk QX1HY9Hh P)i]NO;X뮪?ЎBj`#|7',SV3'N6S^~9.]Oba6OlZJ3)vMDkjgcXXtLRj'_2!]JfՍ{ǣV?Dq=o^a\d9Q}r H8ɄX`j0w* #̠*0{r½.cɋirB[,I}Ie]cz :#DEXc.s铃OV}%, &{ə3V0rDkwB2LQ.?;lA cX7VfwpIW(tD>`ΨÝWTLS^H\O(c ]M^E E8ةT i rŒ-2+ԙ^m^R8T_qK݁<:WKhBX6ʺ8URDRc!%a|p,3A :,:`k]7]c؋yo/?l 7Ȗt~,NȺX"e4X>5H,:DbBՓ+J@8h9j”UYuZ>܀jm*W! )&yx)[^M^b3B|~߰ F|815Ð]Eu\bok0fU\{%Mg~^  GC "M=+LX! <{v,ܯ5*#CCvN=y gmֱ$ ' fQǪ/"nF!_[lŊ~湕rLxqcݍͲFgs8|zL!W3|^L5a{~1?t4j)xK!␱ź%HICN.#al59w󙛭D^~ 1ό.B$o c?NaW>|o:y8;n3%}W7rLc:Ξ8ᘁ,FgԘylW(Wɨzx#;Q%.EyoTz_y4{ fo?;{ yP}aЉ6N9:/x[󭆰Pó"x5kr!woB{O{=w(#wG= ߊmt^c gu7`D[_} ߰+$@]IENDB`pnp4nagios-0.6.16/share/pnp/media/images/favicon.ico0000664000000000000000000001027611662503006020737 0ustar rootroot  ( @   #%&&&&&&&&&&&&&&&&&&%#-ESXYYYYYYYYYYYYYYYYYYXSF.-OhtwwxxxxxxxxxxxxxxxxwwtiQ. Fkkkppp H"yxx{{zz#%%&&&&&&&gg&&}}&&&&&&&&db\&&Xf@';;L5&&m!%''&#zAZ&&SUUUUUSSg&&ghhhhgq&&{|}|~&&&&&&&&&%%"#>B<>pnp4nagios-0.6.16/share/pnp/media/images/int2.gif0000664000000000000000000000012011662503006020144 0ustar rootrootGIF89a !, !&4SXY֌P=¦p ;pnp4nagios-0.6.16/share/pnp/media/images/rrdtool.png0000664000000000000000000000064411662503006021007 0ustar rootrootPNG  IHDRPkIDATHcLKKcIa̙ :tÇd"//_E%'1000 3Xdqϟ?.]96<"߿{}~B# pWՊ5stL̚Gw ʢH@f``(+lm000YߖuWh9y2008ʵsh\J\E>q!%t\nu!DRh[h;O\LJ\L'LS'=vr.¶2^]{300ܽ(AAmRfΜ9B!YSFՒ<%С`i%vΛRIENDB`pnp4nagios-0.6.16/share/pnp/media/images/de_DE.png0000775000000000000000000000732111662503006020264 0ustar rootrootPNG  IHDR<<:rsRGBgAMA a cHRMz&u0`:pQ<OIDAThC[ PTW%&Ȫ%1 .(Qfcq%,AQ^X81NjT$F0';iHդy{;/t8p JJeSTTPY'|{ɓVTT\=}4TVVBuu U6-9^i ]U[X\<~wQTΟ?/ ՁN:qzIV}MwɸZo՝ !cɥ^MG?+^@FV`,&j;'\_K(S*˚޶icoU(/?A͛Зd:͢b(.*A.13Sa!+G<k˕WRJ Z(i8';=*( _C h.괂|(++ 4D;ӎQwyӯmߞ'fvxkچuCzZ:I ==8iii|~ijlӴY/QXy_z ]ָu<ϡC@(!mU:,_1..]cŌ9^j3榮Hnaw7,$D24摄1DsZz?1ɍپLk RKJ^)ƍ74HJLlXpř q8dB|Lq|>rB|د* owrڼMZC!Vn xP%oi2| @MIkqA.xU5(F?ZP9e$T*9QtU2^W8ӏkNƨO^n/2G4fZ3Z~҆fnD\AR,# "Ɠ lLp&,b:Zs_"}& xyXǝ0%Ÿz|qŝA7 t^1U0>?u5lvu5\*NTt='|"xs N-jf zaP֒3/ Cc6p'V⃎Lz!-91A2C 5g%KE.C'mUA:k{Knl^>>pq~$LEeKE.as[4AupnڰO GL2\ &TJTQds[4~(87}n%\Gvh|YK=\hDlj(.EZΑ6|"p1_l/b ^t9تuA^P8 ) ; 3FAQPb+=k6N\\wo3=Z';bvR'O7/u7cms͈7mv^ZQ\Ir|@?pu\wZv˻ -YiW4yO ,&Xcݔpy5~NqSOaoS/rLc?}٭fxY[Ko wJnYTFM1FLk,p~4X[>muarbZ1lN.bÎ p(4Ά[efA-_2n"KM=X. TDVr6τbܼq kü<)'SI× cШ &|5˂bs ǦX>L(Ȓˑ@qkkؿq<]aX=rawFu4)IKTLK2N8z) ]> GukX~zKGX M\X8~lmkDG݊yFM#v^j2;7cCПK-vBU"gdJB l=J=H!7G/A54}_:?(cRiF HŹZSk8]L7 >wt)^:a„YCwp;ӄQoKM*e,w^zngkq;g&[Z,}Ϥ~SnS7U&3r,eqzejD}WPgef )!{}_9lbЭMIh.cGnK[sղW-}0ubck6-η:n=},xI/vrrz޾pG.! QH''^0}?>1\5Ɵtqq3;8<׿OA}>j>#x 0p;;8<߿WGC~+d%_}'SIENDB`pnp4nagios-0.6.16/share/pnp/media/images/calendar.png0000664000000000000000000001244311662503006021073 0ustar rootrootPNG  IHDR<<:rsRGBgAMA a cHRMz&u0`:pQ<IDAThC[pUgze@6bƱw3L❝Lf{/:v6q5 &޻WDE a BC.$$!NιpC&83{gz;W]i{/~.22YYYaZrnt)))i^<uֱ{?5?S󍊊&??cKKSM .kpu4YYRlkksct"0T۷o.sp 899yݹsN@ pqq1 p$%%Muzy`Yy&46>ĘR'&"iLx=2ƅgqmX&8n.oDDF">!{OGVz^b|;M׳Дx܉A%~=f_YYKL,B]C^AZ숗@mVzk!Uh./GSQ1d(#cr^E&p]A- J|/" tg6"ޏLP-M_"iR?X[s3Z8Z4Wέ"4T=ŨYM/V20՗Pw Rsg!ȼp/%^9+^޸h(9CH&hWlPNJGѻ!@VJ *餖tJMEEl""PNT\ FTNg|PzJA#9r Oqd:Kg~D:"~yM4k7;\%nݺJϚZt.yܦ`Q*bq`F^@y_$#znOڃBE G^/F =V%cYNݍ.٭cWpn]?<F5OA>gś'yEȶmLh'n=WB57lBMn+AXlE1!wvncv>.Ǧ\%4J!Ç.pDahaaai]1pb`Y "eb-X`!ׯ8OKˑL9Y_>yz|(hgN2yw%ಲ2\| #qA`G|A_ѫȤbZϟGJ )NǴ<@:W!!`! g(\hXE,Dg0vs(N̿ŗ/yJ9K˺LQ$s3[v8-- Yꭡh1}`N:^$SA#H㨺Z"'ܛH卦.`t(>"!+W"b|[(ԥBrmӂ=5#Xiu___xUCy຺zDݼq#O~!CÓIoDZ cڼTi S)^0@ ˔$ReUIej @];Y523rYvU55u:/|k_yXU{ţׇCX$PUzAZ(T|$!+Gz܍Lu͜hK#km:zɲ4հ0^#ǏÛeff{¤{%:%j2>LP2'iW_s Bc̍aVuX?r WOm zF?Z7[@H8Of;v`u`-X3f4 nm \?Mlsgxݻ~:vލÇ SQ -iCѵT]hSf3KLNE}FV־w5V0? C X$бcbĉ4ޖk隣iՓKZ`<@ZO3Ϯ6V&;ZJK(,cɿ~SP b~ Z_rak^-l7PT++C`P0t`Z$Q3&':IEJM.QU$|e}oFccF2L!q]G\|QaZ妲 &N7olT4 }1d4=GOobȑlB^\/($#IETt,h0T؋cX5Tp͚5j()bO?5'-vBU_>6bD-㳈Y# ~b?Ҿ|zŖh]&A6'$ɫRjl4؋G^WM.z~  k)i{"Ћ^PD=Hcڋ19cG/^Cc]6` ҌbOXY,mzOFV[v3_yP!UX=0૤ykg?ch/Cx]O{cc]iŠ yXli2RI9yBa##J tFEY P:ܹsy0211`ikPΝ;rcۧQǃxB%ڵkZWPgX@T@Q]{+I U~,!Kiԑ ꊴEAm|#DNZ`Un>I S^'UkIkuv1>{h-1T̪dfbY׵4VݷoonxWP MHKG/E< *=Jo6^*h$r3f6iez>RLۊkYX`u&H)E*+SKU;T|lI5YzżX% *RUUnRƍ|ֵzjܾ%,+i,OQVH*1TIŢ@<&-(- =<<֎z[*DBߢ9]nU1CV3v0͞hDŜ.eC5= R)DXANdSi*5%&PL l+ɋ򦀉ºJ )DK 5S/''⢘&`k|shRQ!&+OtuP^^/`C;nsؾmw~=ǿ<߳M*s׻w^|ſݻ?@[̿sh"<4m_rs?~gG ;l~AbР=?O /<x]1շk%CģW]]yV (uzߗ!&Jl5P^_Z·<IENDB`pnp4nagios-0.6.16/share/pnp/media/images/en_US.png0000775000000000000000000002206611662503006020340 0ustar rootrootPNG  IHDR<<:rsRGBgAMA a cHRMz&u0`:pQ<#IDAThC{y\ǹvڞ䜯immjhOFEWdWTw((, ʎ컈," (˫ rks8|/Y枹gU~Iw Ӳ2jz Ɖx[aR]] z/Q䩩7p?&~[S]cZz-;wnZw6ٵƖvˮw< kp:{^ExlPJ9:oor5{naHݺEhhz\C[BVV+񟖕WɯaÇXX77l]#j/q2\q{PsY^Ќ6߼ uͨB]s'8Y$;{ |r' ʜ46gnKV1 WfRv!ӊp!5ye(Ȯ񬳬eV A,?y =uw;IO^RTFJO+IȓDzN!=,8pv٥R'0FThv I,9vȅ9h:<,ٸ$&?ϼU@NF)R#!UU.m*[ AI~sZ8xp; G&e$e@ =hj4zt1DGcMmtFC|2p@,'R~o݁?io}Ƥcg!eI{ ;*A bz$%ġ% ?$|CɥӢ9Z+"!,3h>1)hikwpM}:Qݓ]o1ƕ]9'q}O)}q"Q@UX8j}OoܔuOOq$:׿"J^yaGADb ˲Pf}+]$WH>1 ǖP2],8e\ȓ}(E6uGg P1qӖٵgwLPNH:n7`pYݲk|x {xE~KXdq݃±n[w48~;)վ!{/ Yխ$c=X]1j xnA)GKDw\C7.wo?Tڹ:=pv/؉22, %x ( d~!_~_(Q1r+X) RLzJȃq|N#$SDZ@~Xf;lރj3)pކahn؊>cP4Vs*vZD(ܴed(ùxNO`hHA[b܃tC}q޼ KKk}`4bBb 㗑H_~;vBlZap2X+qs8ǯrv]ٵ \VVـm]Rq vrodyz{-rWC4g#UI ~Cd/s +~ K7xy&CԵ栃pZ}2Odr>: "Ckn8.Yp^QxG.^6cxm%|$}/>A DO09CT^]88?ĭY #{_doކUqw9~ C˫qS!.1gĈ_V0^iF YhA-sknyn:kx%̲KH*`3l5G⡱'}ipX ,ӎK6&x.ZtS&t߀kqh7"*tPST<JqmVAg= ~Bbp,}=b 5~Һ-!5"$)ٓrl|O dž ؓMgJv֍֎y[6$1顔l\Vb)kz$r4egΞ(& iY?A?^JOqA*nH 5(}~%_|RΩyC#}0] #;غf)E}}t`V2؞t]V <1统бru0^C~/@NJknPD2,2lw[X_D:tIKO.{?$xԼoHxW㔖/'I. =E0u^O?8Rˠo [w2՘ ]˅0[KS}7b >kW/)Rıw*PʠPݻU{P'U{ˆ}Dk~~ g~q?P4]AcḄ6M5?;εNPs4=gh- P,ŞC0uL={b m 1ܠi,cTt`岜Zi>nkG? V8bnf8bfD7p'(K' J_} 3̱lu׶soT k6: h*!VKaNgmsl|N-} \0tLㅘ4Nm*$FfH6\sKh\MŰ+yfȓʰ@U#zӕ&R :2ňy"c]@T4l0i9խ0] VcL,].2g`+rSg[X;y!i1R %ƄJ %n!1݄qg60$I-NS9qN~7(#@)ej|JOf};ϑU ZSI *>6nz"*8םlcg|3.Eza#wGLӃ4l4A B}Bz7EtIą<m̙ipbd8QIͧ?3RiնPLF}_kӠ!.04xUq:?Q 6n10S4aU[!.g'̞ wuc2@ Q"A@a])=%ymJOcgD*NNBR$ b2#55Uє2>#Fh%U|:~*>TRRc+KOgH_L7S?a,񻿨_,wf:f|7jإ3:$A MBy곑={:f@g4d+OE&%IɽiR 2sXyWJVKF4xÒ=y+{QAyٛRi 6i0w]4 з^5|9̝ 7\~̅k GKw,cg!Je( KY9kYltD'` )SM(Y$MXz KxYZs:Zڻ .mfX]F)4B5rqG|z mR]踉+;&(0K &IL<3*(T|vHTaLA./CU<;L 2>]Vz[?AY(#DSUӨlT8$U9Ք< & y2"JDJWÂpGg+M׻{ҏ7@7C5k JO"1*=SadUB{px;eUfS"PCG͍ qR>W SˋxwF#҄졈1xh>G(j(Pj! il{@`I(SOBa?QxE;y:0 =K7F0$RJq}D/R:SʳVU;#q= n8HE=g&5ϚYIx6Nl YWӞ U / VGW83OE$#Q:?vPCTԱ[ĺ,Ý+a.i(#kmL͙"u 4pZ9]EefAZ8hCI|`?Ówmü)G^`=ul}csχowp4OU*%a|at#i# }$ʸ0E3]989#*@7(#[C byR$,tM4}bx@h+/Gy!GǠ#&D\>cw&"ڴ[x93z6<[ȣfhPC{ {=Fv!v{l6L&loD0bm26hhȼYZ#p*<k "3p ]0$a1] d'̯zyMR|ch7B!*s )ūCo[-AC|uZR k2tK1 "^AZ˚Ps OM/6./S]sz"SG 9?,]-$qǣ_wqڍ糈6d>@04I/n\D EUE 3f"|$0m444G\Zz)Wpő `eش) ˷Mqu"RA.GY$Ch#8Gœf$;Xy/ܛG>sy?/E]_ gJ 1$QTϛȌ7T/qe(KfPLzoß'ڋ[I7i0Orx"(G⤁6\,ͻ! wAi>pxA|ʻa6)m#-9ǸP{~xbYk(?d`H}sD[po(+†q [JqfG7Z 0h3fR"^pr.;gk\ 4 t3‘h Ix;Ԍ}1l'IBSb}xIO#~bS*GRHx<授4ǁ :`.7L͛ՖaeZ0|;f[a~WJ#|K ZJIDq.o-yGfKMi2Y@Pb܇}o6Çvp>!IڜOZC*M.e-oo-?Ӹ?]=ŋhD)vG(b($ <=nhRMmP $n@͛Epu=gh|KZSD92oby.Rl<:|r@r[lc9V$s,iM+vZڼ|(NbR\>s&AR\x~q/huc>C|,G-zlh-j,K-[a8Dmo<9D&hi$bORv :TAhv6 ]цP7[Yƞ Ѽz 典xÞo\C^܁ώJ=oĊX\A@TfKV 8L da"-p%Hڻ-WWA>X+_E60n tm|ng6k2&_B?9rG v iU|c{ T^GCkg_`C]D;~ǝ4_tY]U$L " .N8IR-Vf+O?ARDYv0]Qn $gzXQtN= mk0u?J^>_}`\tgԶ[;g;ܰWb#Lv% `+%ymᆦC9)pN`&f8#8",iDs}l㥝7e٬1`%YH#\΢ÙY [3?/^/^_4>i7bU/ٮK_Ô1NRS9K>bYJwH3HY(c$\hrFuOK0A}lK&~kTIuNg\gLH|^07)#FG# O>T_hn%ko{,gy2e.#D\o߼OVS)wry,Wd,K!A{yb.ŭ^-k/=q_V(:,QlT>bz]E[vu&&3Mr̘1;R}C[dd_a>CMuy..C]]]E0^^a^–7WgΒߍ˖Hw, S!#einv-nO~?_ūHd{?ѣ7i̬EUn®2',_⧯E?`[q";/A}׭v\mSm?v?h|2RNرcر#~Q?W|ߌ5[b|+#k/nj?|$GSw~&4(D,]#DoBي _AGRQ1OIENDB`pnp4nagios-0.6.16/share/pnp/media/images/go-left.png0000664000000000000000000000316111662503006020654 0ustar rootrootPNG  IHDR sbKGD#2 pHYsvv}Ղ vpAg RIDATH}O]g{νܹ3S'Qt.LM bi*fRǶ\BaaP\hv#4iŒ2J: qqФ=s^s2NM:pϿϳX7x!yGݸj2$dٰR;.x TK!;wd:sƱc˺ʸTmJ5S8^@P7:Z?t\f6{LA@T*ذ=wiKџm~؎oTs;8jژT*"*Bnӟז\b@B5{s6-iɴe2cƍ;+>}j\_n:l{S xۗEPaצglP.:hkՀTO(HRM̘ _700ꔋeճlqHKC-7tn@}WI`9Yhui/oZ%/;/jjiB9Y='KM4$o{U_pn -+'jhGxvgp%ՐOT6ni.MA)b(k %/rS$R3R Fխ&4$V6mLyݫ6]DR6jnۀʖx׻ 6]7?$`D_uC)qIAjLC7T*Qt#ZMha)cݣJ zI\#/CJ)&L=M{vkRĵ$ʕF5'}D-(pFJWR#^Nn[u\KӨ)od22RxK[Rr&g6:o5P$3yB\l(F5qOgR)~-J~\"Ṟө̿aۮ\nT*ͫTP.ʤ~.ܘ?E*.zј˖cq5>)3ZZus5qp3h 蹍?ę\eޗujU u7Visuxt8W) |G7\sZᲇ}K٨.瞌4rw:,?նwEO[ [Ά>lCx|zBx;" %tEXtcreate-date2009-11-15T17:02:37-07:00%tEXtdate:create2010-02-20T23:26:17-07:00M%tEXtdate:modify2010-01-11T09:30:08-07:00gtEXtLicensehttp://creativecommons.org/licenses/by-sa/3.0/ or http://creativecommons.org/licenses/LGPL/2.1/[e\cK3423DM!396~/vd xk@(< 㹥6&1Fel _di+ïQ2hq͙ja  !t2Xw>Vqi;3@aJtbk`IENDB`pnp4nagios-0.6.16/share/pnp/media/images/back.png0000664000000000000000000001440311662503006020220 0ustar rootrootPNG  IHDR;< IDATh՛yǝ?U~=A$[iS-91, ,Dmed$qX/ +YI>dx""9Crݯ*t7o39 __UzJs]{g… rc_l[.+.\8p@T*}ց'&&ܜ-T*rlk}߆ahK( C}VU[*lXvvvNLL,vvP*J8𩀾K/}V.NOMy[*lZZ%NA`]XXX㥗^zi96~rСw秕IDdqu6 1hum4J*<+$%ZZKut}>|>{0;wn\!Nj=>jbHZ(S   H*A6%ΓOwMgo ZJ344ĕ+W(Jy~SO=/Z`3L~vvvk׮20]Ƌ68_9h")vsPćդ8nk>հL 7s k:D )Jk\7v̙(,,,\FFFغukTt& ճ;6>y 񐎃 AcW5OџEI6exGejZKlJf `S8߮w)24LFrl8^'@:.R)Dh#LBZbƄ~`Ɵ=ܶ҉tõju_7qgWWIgyJ">~SXC.*)VBDOz8A MV5: 0A$]ɥaj͛72Ij)JVe9;N/уu$QXڄhFX! XbXZ[ D9;rogϋKPJsҕT@=^= @X hձ1lm8g׃͹N16=3sIAA;ȶ.P FyD#(!)tg6po .f~R^m4R(lfKV M>C?kmk%dS) \|^,}>>k{șLMQuk I{$RJ0hU0k J\6Go.*) =!0FS q$$1C\^;!9p뿌A5%'ʲP-_?v$QF.PnYv$܌ C(`lTDo~MΖˠ" })%]>ul 6RN(%c2X7sqyxG7+ )7+]QUm M ,mi,1S@kjz[!h`efEJI6gK Fx4¨Zl"RB< bl~yO.D"Zj7GV鱽ppya& g*FU>waRR{>GT9^:dLF6JE,ARM@QT%nfk.Oo,Rb|Jl鼕JP%6RB noڇLiGإE~I %%|z׿z0Cuc*zus`hJPdKlہٙX=[`L7|tdٽHXEIJ  u=La42~OH9Nl%_Qɾpj@]q=bI$Xd{gRR֘jLi)?0 o}Q!V1 ickdLWɍEZ8N;眺&HWIp{€ux7Bj*~WV*fggB_Š6Qr dXY!{^ny͝{ih "MS? .=8 ӥG7wϼϋܺD:BcZ`V%)1 i|y'wm}!FjE͵ږj4sssH)H"q\A6g|()%?߰(^D<4BfIx9:\vb׊{)qGpƻ?u|@51w$60X['xW8C?G?Oo~? WI6R=ν[C#`~~R]Jٲ3;9:oA~sעm%C-aϔ/ЙomDyZ?!]Ckw=[\uqmJRɱcXn}qr2k'_dl}F0#)'+<:PmT^ӈicscE|yPF˓1>1}w]\dn_lsU:Sƛ ţU(鴪vMBf@O NP:P(:΃7}:rq"SSm8)%;wX,QVRқ_ϗ9 p)d@f m$JɖoRduA" al R2Ztf7N:l{ H)T,rw/FӧO900Ph/2?xk}/-CQ8;F_#h$k}S$6w>sQ4٨kHp dR^}rۦ\&&&[onmo k81X TnL*G!EOn|;m]efvo!D J?G&M}ԩSiӦ*[_رcҷն7x|3'_8|m?K#! &b¢#\QiI(Xq o+5N\իLNMnVQ[Wֺ'شҗsk׮_ׇ֚L&t"ǚvtLWvddRyCMI&3ddǸ#M_6w>v?MbSn҉\}e <!xjXO:r/3"V wӖD?zzHe2\/SiQMaE`@qUۉB(r2NR^vY9G3~RYO]}/}ρS=WR?~gj5 o/9?r=z7zWkmC~3SSvttԞ}wo8rjg91_˗;&~CCC;ܶgϞgY~OnRnqr+5c4rZF>zqyϴtĉǏ~K2ث7'ۺukrhh3Wؾ};nq0ckmXC4 FGG9x?6oK'O,_tl?ZQp R8} p϶6,p8 Ucw d Vۮ@)z 8Cp#!Nb 2\ - FLIENDB`pnp4nagios-0.6.16/share/pnp/media/images/view-calendar.png0000664000000000000000000000241511662503006022041 0ustar rootrootPNG  IHDRĴl;bKGDC pHYsvv}Ղ vpAgXIDAT8˥k[G>%;$ŪbhY1E&YH,ZJҮJEJV% nvcLAnmYI).Éfιg%" ja]Tlll{rE Vwo?> V hHCUuo|s#:/XwR7qq"r?g0L,"(&q&Uog("#W74(*g:J(VJyMSLJ#("qrƘtqqCc8kN;;;iګT*+FV[?qj.//I}|eiiӐcdkkkWDהovR-/M%tEXtcreate-date2009-11-15T17:03:05-07:00q{%tEXtdate:create2010-02-20T23:26:18-07:00g=A%tEXtdate:modify2010-01-11T09:25:33-07:0081NgtEXtLicensehttp://creativecommons.org/licenses/by-sa/3.0/ or http://creativecommons.org/licenses/LGPL/2.1/[TAAu  :UAAZ[  "ؾ}1cHVJۗ$i+J?F3cƌuO]]&-^6luuu?@VPSS֭QZha߭6MDG49AYmFbTo0rH]骵/qne;v <RRRо}{ 8~9$9v+DDD_~(O*" ذa~G̜9jZ #3"8x饗:G} #yJQoeucر6l~TTTW^Mt ̙38p zX5 ݻwWN"hӦ z5k`_~h߾=nf >}::t.]`庢´laF\\͛QF!>>oҥKXhRRR{WtcqmCСCB~W<С:t耿oX;%%%lP?ZiGtȑ#;vW˵/{9øq| FDuBezM lvMœ9sH;NhL]s58{,Ν;ѹsg@II RSSuؔg̙3ۻ'$$̙3իmۆ.]hQ|(**_0bw4˛}ݺug}_pq9#Gcǎ5t{HMMeJGrr2*++ת?ZGhQUUC~UW]|%%%={"CTTѪU+9@y-Ο?ٳ{O-Hll,?Dze˘opWS:u III߉6mڠM6/^TTTw2ڵ+~G8q{1)))WIbb(}_:T_VV뮻NHHHnG\\Ο?ey71a]*_$''c={htt4E3Ez'S"1"R8@yy׺8f3Ȳ&:vo{(466?ƌ3pw~LL r[H֭+ԕ~bb"90a,Xn vСsZh٧?֟w_|\5m4{s[m6L<ِ4 m۶5JU"U]w݅9sӨ… ;wꚋĉ1}tŋoq]wgeeaΝ_q ~?>Ξ=3g`޼y ϓҥKԩSo>466 3fp?{tII f͚+}-c/g=z)]=i/(ZcX~=jjj؈}Yh%AxB …ֿ״7obcc~a^IZp!Ѯ];ykٳѳgO#YfaXl:w]5Q]j ={D^ x饗%*#NI&D||B^lkK`ِ鞰5ӧ1`8NM!MlbxG B IIIeee(++X&??_K,z7/>  ڵ vrAH N*r-5jjkk1fQ|V@An7,ڷ}vSE*L8'N "NAA j:UAA2=%  L:UAAT8gС[BAD PUU#G뮻ԩЀ.^ u+Z_qAa5GzzUUUcĈwos8W^zjs l6EGΕիݿ]YYhhUAAXM޽QXX@?ZQ]O~ ߍ -  C\\|?u ~¬1AwIvӌiFCY%'G>7N )K>7NNOYzKUU݋;v`ǎػw/C>Rƅ  #kjuV;(`(K=ss#e)Ko;Q:U"""D[jOV9=.\0\aӌ2 #K>'|Ȓs~ #`|ufHNN,YbAAQӧOPNU=Y}hN*NP9=HiF~X4,Ȓύ#'ύ%',%..Fff&2331x`ՉrA* hRzyU5rqEgNS[i*_}ܡ[̰SO~XdͷvcȏvJlHKKsoͰ,vR;vnf;J%%%Ƙ1c<>JPE?l6p]8 ZFF:Q<bkҞϵ!'K>7N|n|/(R"U(R|NN"#T`"U hF6!kC>7N6X|>.)6J'8THAT_D@F39WMOO7L'@#X#倖7%k3.)pstR;(R"UCЀ"UM"ؠHE:U~Md*Z̺0bׯLb'Sel~&_l~NZJq ] THh84HUAm6T֢gϞERR:u+BV"U swmxίmNkaZϵ9U[Z;Hڿ?jkkϡH TYCT6`Ì9U/_ɓ'qqwG"U hFT'>q:)R[Z;70tѣC%H{gg}իy :4iۇ}wARR~#Hh84HUAm6B۶mÆ p L6 {/'!CP^^!C`޼y͂F3P8P9E-I*G6X|ڹ9UHOOǩSЭ[7|wGee%n&sβѵkW|߿?~mYYTYCT6`#$#U<ո{0ei555ѣPܯƊ+qF@^^KgΠn\>{w{[J[Vݻt:a3N=a%wF 0Ϊ7`XN=aS)߼/&f'XԓqII"o3vnl~|mS4VWn\8tHվ}0ayX`йsg|TWnc+EFáEjDuaƌXz5-Z&sn,_ XbVUo]Sel(T?m=΍d,Tv}'ODuu5&NשS'WOFáEjDafj3fh_@D<>W_}5̙3'j嶬hFT'>q:)RσO5} d5,S(Pzh4P*I:6[SgG;Z.4#UfHqsZ"UO[l<97y9@*  >muFH/UUU"t~+mY૯b;uk 6MK9}3#Ӏ|E"--P;1? ;N|GRSSM^T;z3Ok_l~Nsh?Jaa!JJJPQQ_޽{cر{uH@Tω?Bph@*b5&OXM~ #FQ@y(> 48s_cN99kͩ2NN,sNfs4e)RD GBeJy e(R_hW6@ǬHӧQXXݻ#..N$G*h4 E eS8?G6X|ڹaDff&ѡB*Pk(cs}_L6TY*>i*/ь62N6}NQ tz%ǯD5E kڹ/1cxtPE'Pʿh+[%n\̊TܹW_}",, _5F)H4ц"UɆ)jaNo2Hqs-ZZ;$|ٳ'~GFCSgJJ Ӣfr@PKuS[th;䇷Ө|uOEAAvF j$vkdM3!T8##U.~o&~LXW^5jH~~>Յ=zcrzd/ksx4m}iF~x; KKK3L'DZۨG>7Rg 37^m'k/WΌKJWRY!*YoRX93o0[f fyNŋKa߾}> Se=4o#49UeNֺa6@'(WYYcҥ nvDFFbڵswmhNqs_cNZi v |_FFN'1c 33uuuYn! /j&ޥjbihFT'>q:)R7k`yKkBuNUee%v܉<_Bmm-ϟѣGO>~7L(Re=-e4LC*BfBzjE*>>Ǐq1lٲ՘8q_jC*dC2N'EH6- uڴiÇkQu|ˏT:UVITYM֩GMTFi*ET:U8ZH9uuc)K>F_cȆJ;E6֩bhSe[?9URmМ*Bs i! '@T:4BSel(TTiCsii[ ر{uOC5RFKbQzZhP"U"Ǘ40+R駟"==:Y?F!cT)~B:,T3X|N*t9PHYjz,kvҜ*j#DB) EVH0+RuiEDD{y=뮻 05 rE eS84JTiڹaDff&ѡة:x nVoGmm-.]aÆaРAoNouZ~_&)p:U~3֩:UPTNe?(Sumq3gN>~gה u4ևi)kyu>q>|u)N5D:Ui*#dC":U8θu>Vy$߿111^r DhNR^CnkaS1ǍYT\̚S}v3ƽ9111(\}-C͵SeΠ`(K=sSelsXTYOK PʿPT\W*cD@I_ii)F1eee͂Fп eS8҆"Uڴv/#UD0av특sgDZvZF@*i)aBTT5JP9Urx={ ;;W^y%{nJv 6 'OFzz:&OjC*dC2N'EH6-{˘1c<>jd=z߇jXb6n܈8~ԭYgϢI J[Vݻ$1thIoF~Dv;\n.e'._fXN=aS)߼˚vK5;M/owKU3[D5߾s6 MnS~uk¡C;JT@}\QQWWW9N.&&Fu^֩2FLXj5Se@9gZ*֩~iQTPi:UutNqbΜ9xPTTwyGq^VSe=-eͩ/4P j:UZbN< vލ:_/^,h648P9ͩ2N'ͩ҆Tiڹ/0@ #U-`B(5HjW"Z h E eS8҆"Uڴv-rS E\PzB) E EHUŬH+bFP8P9E镜Q"U5hi[U|ŋ())qװȽMIIVڲMiJE,55U%}3iTSQPP`Czjjh;Yesl~կ3Hf #o?vnr;7NDž())AEE|_K.ĭުh S^Jc} WZ8sϴNשr5C Sels_d^U9θu*++?۱cwQ?N>T4zB) ͩ/&ۻ2gGKi-%'fͩOѥKt6 ϟѿͩbZhCs ); CsIӆTiCs0`v~$yUWwފrA*1:|#Z~6 ?]GoưH?_t= 5\JZ hHn<(U9=!sPzd2N6X|ڹ/(~ҺrA*1z4lB*B*IڌuW6eiUiEu/60"U֎`aD7I9(Re2"U`5f.MN>Pk羖e *ZʷN9שLŖ2Qk _8pKu$u"SZ:Un#Yʙ~ݒә-_Aҟ`CѴ4㩩M_Fk*V] =s!t"%%E\V9={ bPF۩'?Tö,:G 3O?l'/kwrKK5کGN, iϥꀒN駧㧾t,K=an IDATu=_)>< k4QFF%-d/sNǦSj4oHO:s/loAA]<MTN SrkҜߖ̩"j#SUztZ*aʰ鄦UI3t-|۬Nυ gy̯9U \ 1:~Yp_t'9U4BN#5;7XF@ͩ`kI0δ46:g 2T 1ѫS 6Q{KOOW?,viޤ Ο?UVA֭e)RHk&Y1BTUh$lvJyGsQnΗ7 . kThjNGy:k\dh.#a=n;ͲBRVym+Ry-T-̋T?<º)E'' P ЩLn]ԩwfZ?rL"NCJmfLnd(-G:IC\PkxȄhCDXFn5nh$)_'uӒQS&C/aJvrgdP[ԠyKuKJBn3N3t@62nհlMvM)ױ$}_jY`32 )1+2 );=걫L:ujjhn粏|i |X]#r%Ds%\Hs!l;IT\۹t~ P[R㒒dJG# spq",k;[g@#_JvҲps)M)?`=TR ^Fb7Q+y=͆=l(.>ۙ;s.?TNWN>?BEᩈ*sC\[DiiMnufq+q 2Z~bj*Ր%^ݼNiKMKZib$NU?SɸId:0 >sNjªZL[&M9#C}yRsr ;\#)#'-K/s! u{s4l h.;u%JvB#moLR{e]N˵ȅj;`GR;t:XV5>dHaIl^\ UtΥ B*jp%rvYE\xDmƉrIetKӞK[zL+ ՐꖞKxk[gJgIKK^Ri&nirrڒ!8QC-bkRstӭuTN!sL43$r42*!9K~K,V/Cݭqr:ed;4{@V8KP?"UCd$hBIVEg}M跒>E2i#]8\5AHRLj!rQLv YG"ƬS5Z ȲMzNrWHUɚDuDU, FY{4]84[*T!HQs| 7>9POGE\`IxΩpmwd ׶X1ܹjiϩsi1B޴iKuIk5dy7ŮC_çɧ8|ڮ"sq 2v7O~a 2z%^ݼNiKMKZi!"UO%F9Umz.=e`%hE0QQ' ZS%7ڔGhgN=#m(TN`J: y润 ֜_Ú@`&hkBYEsTGBHs\F9RUߤJi \FFWe25ktni";UuR۔J۔(jt?CI̶2!RU2I_[TJQ:ʴH{Eɝw*)S?S1L.UTV69_}<7-!}^NI}#W v*;>JzN (Y;U˶_r3G _)/`_߲v׏s _r=K8$Mm+*/Vc*"t=ڹ[ya~+V~PLvj7o#(W|;\a: S`Iw?gcRZ3(G< 72\;wӌ4BgFS*Av:$DY0>7Hgݻ6+ ^Τ(R"''KTTJ2B v][2feq_*7" _(vH;^yo'URbŒ ld 2jrLkP HTNpܹ:l 9Uذa?ٗfdUNlchݥ:fQ0Y9sG|v ws\D(R"''O>hѹsgsYWr CuV;(`(K=s:O[,ܿ>_W^7h}LT1СCC^uV;(`(K=ss#eɱu0LڼMP H H\BX$ HF4` ;$l?%:tz  z':TAAu@ii)F1eeM+644`Μ9ڵ+v;v{}A1dٳGUUv,]T$kJ:x$G%=f^;^;y-[wވB޽uV]zzSSSѾ}{z8vWzQzz1 Js-Sx 22d͛i_|<;wuuuzmۆ 6ĉ6m^UV 믿Τܟ|wWz.KvZsvC=_|N /SzkU>k'O>N<sJeN|N<Vە0s\]]}Loߞs:\]]t:С'{UڴiÝ9sFQUvVUUqzV^-:nZ:ʸ(PF%=f^;^;yzz:UWWs7o>kU>k>o߾=uV۸q#>kU>k>WJWM>WY[f G*?PSSX=111TVVb׮]HHH@Ϟ=yf9u*Ѡjs=2e ڴi*;z)w}7~#ly)KJz.Kvz篾*&NL4 򊪍V\<^;/)S )) _~%Ν;jU>k'}N3}v%ԩQQQΝ;Q]](Mϐ R,_?}!##Æ ŋU[ekM6[#T؈+W⡇ZeN ?x뭷PUUիWJeN >J5 ^1, Xsvs7F!ԩr /_X\$Y fYnf̘իWcѢE So;t")) _z.KvZsvZSNhZɓ'cvY*Ӫvq ??N+۹;77F4smڴnFСC\]]w\֭dnϊx|N<*;6k7ƺ:ܺuTmcvY* ]KNN¸Ν;s>kU>k>#..{衇^;^;\hJ~N-IA'AAP  SEAaԩ" 0TAAu  /'K&-Gwn>cUz7/ADsn?:u_jm~X1jK(p0}tt;v… > Q)ȏxO>#GDLL :u"˗/c̘1AUm՗4AE~~>ZL4jD 7,*?v;V\dt~ѣG1x`cn1|$$$`J%ݎ ">>C 4 ɓ'#==SNu;y$}b޽c߿?bi&,ZSO=7t޲e˰tRdff⪫bE(W^Ott4 ?\3=>޲e 233qW]v2e ;>bժUx7m1j:|-fQW7p^~p cN}ZpaPITW^<ƍ ;<>|˖-gΜ;h۶yp:ݿFJ(--w܁YfVz/"6n܈k?v1c8q/ǦNW_}Oѽ{wѣѣGG> YYYŭTVaF[|`ii)6oެ ?*??=vڅ#GG~4ݧ=vڡ;v ̻qqK.x뭷)cp%ux ߪU+U=FԡbvD0E>¢Eо}{YYYY ;wFaaÇѹsgKLL̙3dgg2\C= Hxc(,,Ѻukܹ.oPN5@qq1x7fU08,Y_~%=FQWéSp1:uݡ";UKv}p{9]m6}㭏7l؀,@NN֭[쳸ѳgO$%%J/;;Æ 9o0qDџ:F`@뮌IDATFQYp;_W̜9ČʗyvpM7xw|[? h}'TtRlݺIIIwGЈ9UZг`yi A_._O> ,?`9*VTNAAnf5Ņ:UP  =% 0TAAOu:M'hX}~b}HYeD={Vɦ.>7vo=HHHO>鑖1 ©|Xضm222ݻfN[ޜ_^/%GIUt:U8{,Q]]Jt* Gi݌{s7Dnn/^cAB^^|I,Y'N@^^kr t:U(//'|VZaӦMto󑐐\ܹ3>C1ȑyf5\Mfݛc?0eʕ+#8cA?^z 7|3Ñ"zڽF~}ܹs2e :uꤸ=hFʐ9sE-t^a5558|0-[kI3joZ7{q)<Ø6mRRR~P;F,0FzQH_u$Q=#lc'p ::={ٳQ[[ Qbي+V@qq1>C:t[mv/28uڶmK.!::Zt/#K<_.ڛx{ǾK[O=D#v]u QRR+RQܽFx\NDt\s 9~ѷ{s._~VZZ͛7=J'F @xx8Fk"%%(VrEZ=O o7vo}Gob kHHH @ADoVUF^OX޷p8d|-Ω:{,F;v,jkkݝ*7|3u3ͱ,̚5 aaaIo#f͚3foŋqqL:gm۶?뜱cbܹ8uOС;3<~J(4R#G >ooК@o WKOMfݛc|J'#n6,X>(:tQFyӕC~aÆȾl2\|}8uO?>ƍk/FvpM7xw=[,S[ P ?ʧC[ POP.AAj  :UAA@*  NAAP  SEAaԩ" 0[~~>W[["m! Z¨CEA;ύ&xIENDB`OK u:0.04 s:0.04 r:0.07 pnp4nagios-0.6.16/share/pnp/media/images/add.png0000664000000000000000000000264711662503006020057 0ustar rootrootPNG  IHDR szzgAMA7bKGDC pHYsHHFk> IDATX[lUg"4U.@PFD&mDȃO$P$P"[*$ ."/ " yRTBsˇ9-i9L2g^_kkRe*:i`|T'j@5gNHe׹mW@md̞'?1|QB?@U!1pKqJȎGv0| N1&dPR6EqT g⌔l|r#߉E~.bXi;ٷ&2zq8]7PUӟ}/x2nlidՏ]G&M3b2G4?SM $v>maXAQ>t$]QOxrx+! 7CIG |~]nL'JL7S}B A{_}6+(*b#FMx"lvht膠ƢLzuٳHḯw'ťM@"̒ȴǺ?kF"rg fWȉ09rg^9/i|ٍS1{\ĘclU+ٱWH@ o)$So:mv~<˹/ätq|n 'uWqcɟys*ik}/ϯ:jsXITx(}>u$J7 ZvſSGj{l"zTXtSoftwarexsLOJUMLO JML/Ԯ MIENDB`pnp4nagios-0.6.16/share/pnp/media/images/docs.png0000775000000000000000000001331311662503006020252 0ustar rootrootPNG  IHDR<<:rsRGBgAMA a cHRMz&u0`:pQ<IIDAThC[TT׺/ƫ$L11Xb`{DC(" 6Aۢ)FŒX҇Tz޷όFePѼZ}Ϧ^jKȮ#Ǝ~Q rݸqwʕ>J2`0dWVVE|BN!kzו322<^d&HOE\.K2}Dh㉄\ը,6 %2)R,LCJrC*oΝ;j%Ly WWW\] / 呭lF C ݅P]8P(ODUyp}lj,zIh(#y#>syn|ڟ6݇ǍPtGN:}] ˺[s47ϸ^EIII'ѢX:28"7ht?;n$IPFߥ1 0^9L?G9PC[ʴ"w/K2'Ե y ZyZuTGUPuBe2{T<%hN8!g12v.ܟʊ'HCzdK$d6̅r? (OqFejTkHt5*sVLʼn(_xG&@b%I;!y %DѹP-AH3GPaEDnvvvGGZW-235}u^ӑ{ŗQR; T( 'l2/:@ P 1ڋ\( DP@IiŔefffׯ_Cr=ś3ʧ"$yHuɅB]h(jO2`9rX{7Q cJ A} N!+t ,T,"ET-DyJ"pj>]H߻YOM&Jm{__G b>k@{t6Jo.@y7$m IV6R4NLCD--,-| yK&ԫ&Z5\UV,u`r|'Lh(Or:BIS 3qp4~?Hw诇pAuuccIF$k (eb?cD%r?@,3A8nX*UeB{qe&YYh@eО }mBqdN$.Cq(Ls Hv;F^ $ΟP=%WgAupVfjXYc .Fc1_As<g djdOOOAiDCF69^#ZIתa.,|8bAa(0x&9C͉(<7ſ΁8ҽӯ\L#+֚bǣ;T][ͭsH0Q <3 0e b>ڟCT 2)@l4Mj *D&cQxv* O|Z{r\!Q.BeIqבi=i >SG$jkHF p 0>h(, k0oDtIúHD ~hH0G {ILB+r1 ζIMaO" (8&iseuq0Awք 3x6z nhFX&=d[UR꘸Gp&ȰH?KLEj:r4c> W|Zdf]D @\Y}X!sN>LL8Bqh02BKEtUQ:==!"Fc%]`<6WB6 POq0<ͤ/Lc$>%}ty"g'Jd+Abl!a ZA R%,qxXzPmFԴHڼby(aml$n}.=Qxz8ν4aLFѯF4g̤MD@Hd'xx[̧\BҠ}5v#Y Ϛ;bMD5M?K_k[#vV91k7 0~7%7l$ rzH3cHTMf..~ǑX#naw.hzHpMI֚kMG,H$ 5 Ea%i{&qI$-,qj(R#3""yGA1ɒ`IR"+4+h}zBh5#i6d9OMX&{؇cp?,#D:' G9s~ ̝T~ιۦqѫ$W![+D>$ڛ ݠ;vx}-I}7NA6"C񌄙,#OhmhbOhj]t%ca86f @i!《"CU}ymv0 uch&[C4hKh<ݼ! @}(+ !; #ٰ$Gu ajW %HVޝC!H߿{X7ȜB~xS4>D}:V`3|XZ%w?BV_2WvB3+XI54%A,w3A}4G6=][4(dqAϵs3~`;g[GO[h!i 6($vj5 l%I_r ^MKp5=u<؉L2D8Td飽Xҳ0艬po,&GhskWFƒp}[\ 34B~6rI L'B!$Fa$&H |jx/vAPqO\e: U2>g;wgy5AӁ}w%:@=V;]#qpc*];]pKGS˜Gp}l`VTt4g *Ji1FÝ-~*gS & @ "aY(-"5Tk; Xne.xZb]?%t$($2P HJy Ns;X%\.oOWƆn!"J-bj-Z.3]EmZsG5\#泖BARAf\Ӥ%%"q<]D-rmCD+~M%t'Y‡Fv!Y&n]nOl=+ P;ጇ}ʰ݈-\h^^B8gI !nG` nPP#=QtIې$1 cK0h@_K뺡`c-j;3Y'fZ) bkFw$@{?.P {3}όtu"scy 1;L2e m?q _~˂H P@m;1ZUݖhX]ϧ-`푻4߲ckØ|7=ȼXMa~x'{N"kbaZD澌"_f;"Wo]ș&h n+}Js&i!ސꊨ靑C{Y-ՑpH_RVq&\Mj6P>AJfh?`db@d^ +!OZoF+j}$7[lFoP]'T脬 i.՛1jp(׬bJG`<6o#qt[f]ܒPy1zpkGZ̪l3ύ$۬LSYeќCym;ZJ;mU7w iSMԞ؅0oÄbC 9uA Uj½̻so ./fAk`lpkZ'uM:|&?O&)}9r @B|)l07q|Ӈd!˄[xEPf![FRC@Ehj (>FO/Ӱx/7D W+vxү)Vӎ)Dj[CR+$oKMNslhNjWjo 찅zA~ȿxd%~VRfk |9^C>R-BP®!LrǽaPe+YJ~hyyRv.B|Njl3!@sA򲾈7rN"< ~-ˍ:BE)5܋Ms`^!HrTWO3!e-s"z!}3'?8V[Xq7oI~oAXmź\{W("dRw(Vt_屢Z4k6O&`xyM!|:Wwnߖk ^UUUD b!Νua0ѪYfϡSå0mQaĄ688tuv>As} qqq>`~PމDW_7w˖LE3}“y5joۨYyĄ#Ƌx (lKXQNw(?i{-ZOzy&o5_q5:,jڴU&MnްySZ$q>w1:N4"& b^KVg6_AV/?šIENDB`pnp4nagios-0.6.16/share/pnp/media/images/go-right.png0000664000000000000000000000316411662503006021042 0ustar rootrootPNG  IHDR sbKGD#2 pHYsvv}Ղ vpAg UIDATH}_\g{̜ٝD); BHoq6ޤ*i%VEA/T0xx HT+i i/ qEѰ^DE\-6?3g9s&:=}Ӭz43rr׆%'nT-Hɦay>v\tFr TK!8N/ lJC=smӚʴT]j.70tA@)m-Z8z/p6TsC{{e * ]=ڒp'뻀jah!͚ҐJAD2ڒ I\Fn9dfe2-L[fʴiSR_zo{Ó.ąJnh>>k֒W=~OS3IYQF ߻MƉ^\r2vW\/l:_x ⣎XЏ^_G{/xo%tEXtcreate-date2009-11-15T17:02:37-07:00%tEXtdate:create2010-02-20T23:26:17-07:00M%tEXtdate:modify2010-01-11T09:30:14-07:009gtEXtLicensehttp://creativecommons.org/licenses/by-sa/3.0/ or http://creativecommons.org/licenses/LGPL/2.1/[MS\\&v45n5qt:pfEIȑ#RUUoyJNkRsc%aj&aJHɯz@&,(R^^&uUm=233nѣ7]M}bql> i~MkP7x؅78C(JR$?bi95>|x6&odH&jML+Z-RN,Y4b(\+RFZ %Ip@N%p`׈7}ٸNkj+$WTT$Ʈ|N rm>4&ûWɾ"3z[d6s Ŀ)Ƥ! `}=T|g`q(/ayq`:7,}$E%bIee"L=Sš0ɷt^^ުt,ٞ++Lj |CAlH޷GOp8 b}iĵƏ?wޗ7KR=tX>H*pR6bX UB%|v)tT$Ltja͉ a:O^?ށwrAQOvE*e'"/$W^*^ 7dZM./,M%(.C<8yT=T~om?Ӈu ˤץW Am) Iሄ i6UQ)q;i|]§hҧ%Yd"O?%g$@qm TT uj;Vʞ^ݥ 詧$cРao&\PPS$=8 }|TաC8=MU X价D~H=.Kx1<AN$Z8#|ءbR.U#Z{&PƠJ_|Qn٣J(=/,eϛ (Q$:!$ :CA&ܾCY[,2}ȽHpb<s]OLT_}%oϚ5}񤤄XnEl?O"e Aͽn)wK00Qi<#e @6C4eERD^M)>b8pҰ3۷X-2Kd=&U ?֛,A0=GKxHҤ O&Pgv1rLLwH1$>񄔂y&LiRzV_^#QNI0 l}p%oEyA߭KS E8>?14)!M#FH/MpOKU0+w7[oG3cʇv#(Q١0M0뢣 zFIc ?!B3c810҆ӟBN  /HȨQR T*J\1P.Ƚf _Apra)%.)m0CA)<8k.,tL{Yd"7(}WqCj+CNk8q\{8oAl7(u $:q z IڴWc@E]VL{:) | wmC+ &%%FeAϬ4c&O>g9 Wߝlя\G@~s_}- )'_fT;$CfmӧK)#ADZQܧz! 6]7ỳ)%A{e"UR45q6u4MOJE‡HDJ>׉RxF

    >H͐p31Fm=Łɰ4`B*;)"\|BexP҅@>*Hua CʬGSlI\KNGF$OҨSqW>mE'rE"q\jB")K.W+؀^ T\}eR{颋/BWJy 폋u䬨\94%MUjML5SSSG8GoI_"Gk*ʁR:xZ6l, v v@ l$mYmR%Q@r$M,I-[dM}FI cDʆ Ga+>[^nEyCI*BֹseͲjX`lLXs33FfK# Xx|0t?x6,NÆ;iDRq0gmBo{VuԾ K=3(\b$jPh[k'+)f^"a"addZkvg w'9ҸcA5*ԩ!]^ tK1URfCO?trs9{Y$ݎD2aWRqA$?{al$ub|֞Z(0*ǕpII$^d}޴4%]/LÃcq#g[l)$a NO>aj5KVZ!Y2~Μ)>8fJ6,sa&kN>j1 ȥLR5XS0 Pg??n8<ʈ>L1-9{xjShKkEքY8,C@MK),.]@, Վ" :ȧ+is%=E9#j³M^. ̄u1SLuxڻw'L jU^/3gvA K ݒ&\kZDZ.Z.azCMج-rVHȥ}h(rI^6 aӞCHY Dd8S4a]=i»wVOJ3$h){鬾VpVqv!HحlքM`nGN]x)L56.m ӑІI+:0 ؤGuQ]5q=1dOM\{/rlEҌIjF!m/^, `Ž@Zy&4%|Y{0sdJDzP(]'ڹTӍvJ>h  z/VD|h{_{M¶̲zK4wnx|S\hّF^|#x_WXs k`?v+6Ë [MKXf*RN@f I$ժ?$b|}C@O+ < +AV$Ȩ%P0 =a eqn {xӀFWY9!ۢJL̄A$I=Zh >d2a%aoe2܌ӱdEA}}]/ Sߨd:k@M!l&afXb] EH2(Џ W3;#7l>#WBFkPm,YnCdLVk^Md́dkkCm[tZG"j'WD"Xp3Фc!ocRЊзlj $t8I۵;үu79sճ#-[ɴsTS*8- {٨8v1DlXK86vj^.zؙ@{"&e` 6ۆSCO\t|2j]AepR3nb5 ?},ZL}9O:]mؤn.BYBm׉H9(lF]P&L*Vder 89^o!Ie_z"I2ۙ>[]#RR+)iJm6̙O q߅3k`{ \>؞徫0Y#%\XT,Sϒ_Oy:veJe+%3k@0)dJYݼ%e,XDf}7Oz:UXQÐeTRC[;HN0lNih% To2)E4ld{AUg){1{T4 NXJV'ĵ#M',W8Q7m ~kZԌa8J%| ~pxBT֎)fif=jC* nɲaع[s ?ܑSv#S͔% +)_ _Y|,J 6Vs3SO0Whj ^8\UPSxSY -\ 6_JNv"86y찐_N/pmH*O&6<]v!6WVZ"N|23w_7ב-O=܂@{ԱUIjlV_3i&p/FĂޙarT6z` ХAP6|*-ʕ*g"F3Ӊ%cѢEܘm<=ܿ;n{`|C9-|鞱"͔0zٓnS:"$VzR:Ҩށ0' YkÉ(;a JK.]tć/-$l}y72hzG'N64Zn~&o:)ϙ3s9x]p97Sgܳ:8:|X``}3Vfp'piݻr9SPǎ.'OG>oIS71=>~5L4rĈyg$p9gu[n٫ϡ t;Nθbn&zqp<W/{-}?>3 E DX_?gϞѳoѹ=v;ܳѵ5ݻv W.vztzHD F|s=3gj"-V_mQEk eIENDB`pnp4nagios-0.6.16/share/pnp/media/images/home.png0000775000000000000000000001416711662503006020262 0ustar rootrootPNG  IHDR99iCCPiccxڍkYܠ ^ YH$4">IlmD Hvw[qƥ0{p…+(|!{EܨtWyV_ιs-.t ) s~d\VNNMH.2t0,A&>>xOs` ] *S 4>s@@z&@ڌ;C nD nXNV53 u9@' uV#MJ@?XJjxz7 fDF/9u&g򇚞"Β8xdI?Q_2`9R{OWǏlա|3k.ų0F8GFG2JM!/yo($GYm9H~l_ٯ/f=̂9Q@aZlsߥ M\k01ib1vr/S[D>fPbG Q &[ڽv=jlZ[-n%+$Fŀ؁{^[ SNLq!r[%~ksWsʂ=Oߌɩitnvk[`֚Ŷ]oA[Kps[7Mk˺'WFrmoA^YZRBiT̼*l]V_m4>]i4\p[E X`bKGDC pHYs  IDATh͚Y\y{om]E7pCzH3=-PKdX f6 !SCIH( $ -pY5֨I5!E콪.|yKWu7)%@`.g}O)_7R̃"RVDFRXklmK*~j}c0~ڵ?Y;w{瞯jy*?PTH5 t~HJ♤O$zw޹_$o?ɜ={űW]"J=]1T\J_4Cy7TAA$?}+FDx;V F\+^ndӨ}+LJ*Q|yr^X(s;H5S(< wp?u>*'R=LU$ cp. 硔B봳sLR@W{u[5B ZajFXD>;&" C~9LLLb}} +s6Bᥰ@5*WO.j 2@ԵxyH|GDÐ(H8t:zވ?Mlje9r0q[oT\ɤLSpZy88t Z5PFt 4ni*pbD*<̶y^$1*6{<UaƤDi)@js!.mH֑~rљgDŌAh34ss?1#A4Zk:~ h$l\m:[~.܋ gj7<a֚8 `$QJmr)a%c^Fc|y\0@lM/:s+dZ8U AKCZ?4$"~fiKDORCBKN28湤֎{tβա ێ)ք6m/~-$.N@HR@!WgiiLP'l^cQ=h ^%w! !U ݕі< ]H9T@Q1mCX⤄u's׉BYC|~BA=IĿ x>gPEQxcIהJ|27n n޼yq̹s}>DsIQ'AM! D =JDĈq>R F/џf}iWg_B鿁_>=<- l>TVDh6|ܹs~u_$;$6VbA^&Z'i T,u!EWAf |/0ހW%џy5%9^ǎ'Z C^{5<(TW]K?G.g=|: Hׯut,t?g9Lhs"YN$I/hgCǔ]En8t*d%Q*8llO.  I0q;Wﳲ™3g40AaKCkk2%)iX=ZL,0S9Dz@"5Spk9`TxX r\}s?֭[:uCWpq5FbSdMh,PQ*qP xeJ.qXoƇ{BjKS1^]aO0ӧO377G^/%x_z淘ZcMش($X Ѳʀњ>zÈqX? +`HAJeׇٓsqLR!x B'yIae<{k-I +k?/g^ȑLjq"c-o?BVkMT*jy6I3>.=s8{aag- u][[V>*Kr5sJCZp/w+y1=ʙ*"YqÌM'ZqS-b-7~wŋ|ᇅ wKQqҥbq?O}6.]… a1fXtsss .p=Jn{`"v1W677Y__/=ZʩK lGz~Ͻ{x뭷x'|28=zj:m9rj°z&rusiZz%&/^$ Cq_~/r5n)RspصSe`Rj5{=6kkkܼy+Wq}jZA^|3ϭ[ -CVe8&"(Tkբ,--Ƚ{{.?~Md1qb?v?W}M~@ca4JN>] T*0dzz0 <^x#GƹdtEv1* V 㘓'O233"Qsy8s $ V=@We$7n_%4,!c'Fl뭎Y1VnӉ^&l~ =Bޠ٢R0 >'O$VVa~~vnC,,,tq:xT*e߿ϳ~k-++cee~QJ)q갺 |[g8ZpOhoZGRf{{U]xvMe0ToCF=f;Wz>nn`0I#|AFh4q&wﶙHcZc4APi3Am0Oo BվwNN:x/L 14 9$I8Ƥ[; _y~P*rbbj4APBvFkEVe|ATСiݾo}[x(zzR<ꫯ~O~{vBA$V_R-Z5gHVrHzEZC~Lb֦>7e9ׯ_o~^A$QN9~Xkvf~RmxNzCcy,^Z֣.Ҍet.}nZ}/'ڥ+Wo7x|X]0W.K_}_|^7U-n""[[[[.믿ϟx0\[@2WgC}#Nn4DA@;ɶZ E8{ L~Ee`$P4-PŒj(Cxˮ=P 㹊%tEXtdate:create2011-07-17T06:00:21-05:00CI%tEXtdate:modify2011-07-17T06:00:21-05:00]Ipnp4nagios-0.6.16/share/pnp/media/images/1x1.gif0000664000000000000000000000005211662503006017705 0ustar rootrootGIF89a!,D;pnp4nagios-0.6.16/share/pnp/media/images/pages.png0000664000000000000000000001600711662503006020421 0ustar rootrootPNG  IHDR<<:rsRGBgAMA a cHRMz&u0`:pQ<IDAThC[tUvQgzqspBH4zگ(D t3iV+ swJ%n7gw/# d4F4B$DCnh[)cNXZ[`nl+j14Mpp"ʤW\;GAUaԚG6W18:ZaknJ+`,+>K)6ZeN&KaDv6qMGc&Iߊ$=v-&Z95lÇ`=TKiLE0e”A9? l r`,·MP\Uvdе~&xB}+fa! 0~x{:imCܗGAlifLTXf!9i0dHˊ`1J'5ޓG; 4J@ VSZ7RLطo=a=l;;ٳRaKKdL1ڰ7=IЦ:q;T;OItz_<*ƃ<_po|+4dbP.Ef p;u ]' b/0r2 6Bmt M<+6C n gXժ>hԨ/]o{9)نZ)jH7sҿ/CĤ:k*`ϧƯ|OVBv54f:hm6yTQK}-,-M0twèRC8~`N21΋Uw9j'{7E@QH/'>Nފx+{KK-9kttVC94i2(}p0|~fP.FI!r@&&6e1b?8E <+=A?-B NL졿sN=).*|l+)0m-p1,Sbf&+ QyVF&&6OJR7s4``13uчK,LGQVXu>۱8x觞 VEpσ~쨩>=Ȭ8.&$P"^꣸C##'` ?=ӬKP<$ aKfO܄HFDhޙÿq5|gK6˦\= 4Isd7Cn{p8n?\B `9(vx f}& q@Nv&~V$%1 ,*#5$r !fX.;3.2qqCyðð:)6/ :#T hGۨY w#_N#)Ĥ V2בz8mBckL9 Nx}p$Z JM q{A_VZ~Ȼ ?ZY}@V<;@Y#PN'*Z&.dFsI#AW dVD6V94O`qBBqdq8p"d0BOb2Ҽm8 Yo7g7o5C(ҟ*hrA |/AONH!j |{bSY0١CA rNG(+ >V0^84KiJN; k#zjil2dhuAO*N0,䩏C`/{w]G۰ csPe>'!K LRi3$㎓O x<5ea2-Cs\?{~QDžEi!DpkV FM11Ntfd̽K0GY@2Brmq "l}+|L~9ѓx?-B=[T ;N,g\0FY /$+gϳqg6 >a a'ijM,|W ʼnz欄,#-Ft`'c{ccvR3kQP#@RZ5*NM N`(V n0WuQ`G4`4b=?J}%5-cwX_)dA%Ju̬N"iVV|IO2&pbu$f-,<D%i$)Ʈk] kcM^Ȏu;w $dyx+Jf1,uKH:{DZQᵳCܧbBaԖ#o`ax,A$nƨ"Q= 9Dp*Žxlقmې+A`2YW'[`ukybIˆe1n;fLD 9"}L=EZ2 B2X\Phl8V]`Ⱦǁu.̬*:1EŮ9[y قj3Ԓ(Y 5C|ܱkym\4~}\abHtma)xҵ{壢XI(W#Y!#kPٽ ۗaYۛxU,m~=+}bX|J11I5<eniA`Ɉ}--Q &BNfkܻx-D$$/ϲ7 xkD~Ɩxi?ɿ ΜK/ącqCQq&=Xb`(מdDc 8IF,OfI`nH;[0Tt9$[EN_y SQQLPQ4S(~[{;,?7?.rg[Y30{<&]O*>1N x+BNO7̩d(9$Q[ /Mx,w` kY QV8_F Y)ҧV9EAQ>MdqLa%4=?U]++Cq݁o.]\¥ipw!5+&̴NҰxQd-BSaY~֪cxeK3YtfH[ʡ<\Go"Ї c̳Wk~CB8'~񳬫A2HIEq\ͳs^f9cjXpda9M(:>{n9R˒ۨ]v$л(|cmp0G0>Kfo|m5xz&nký`mP#VLT:w|xbK"6[5iBB ~ǁX%Y蛘xhZjLI: TI* VA*Q4ЬM Fqz!`C1(`pk"d ?P KG8]P!V5-'bɁӚAO k԰aVNDe$bh[n/j OBj@ Jq[c%0c2O&mCV\%×GplZwaxkAX\vbS7uƌ ڴ82ĸkHʼzbDˇk;l80д*~AwgQᵏ]Naה% {dzƒ8@ Ye[7㒱# ~J#sޏ |RhY5du] T,#,2Ԝ;VBNA΀.a``myQZ7grElE Aon)7ʼV=m/;'a_5~pml!|Y)K.l Y1I814 Iv2oxHx-/Dx7I< nƸ ٸ;pk|uq.-p b@Lic=Q 0=d&2N!c܉r7@>H[hUbX8HMMӸ8KKGr0N ?%A_^ %׸\뒱U,$G@nkx\ -\xcw!Elϊ_9st/~qrm3(s̃QKaQ`+0焿0|vFFq]qEƅN=gin9zH+vipԩSo?.r~8: W\6o5_1g4s>JpbcpygRU+WlhW g[[R|oܹ0mSLJS{V.[NMm-VaL8-7ݫ8Qnhڔ_r%_ycv-7a^pΙ3\p|.-.ʃa&~1119k8o]^['<Ͽhތ͛5뻳g_y.Y\kxb9{sg̸|y3i_tbv.N]3Hb*",Qߨ jJl1IENDB`pnp4nagios-0.6.16/share/pnp/media/images/loader.gif0000664000000000000000000000066011662503006020547 0ustar rootrootGIF89a+ 7<@! NETSCAPE2.0!Built with GIF Movie Gear 4.0!Made by AjaxLoad.info! ,+ 2˖؃ V˅6XYf'}ޚ g-Iׇ.ij> 2L! ,+ =Ď acǬ|adʡJCJp,kͱ$eoX}N,bRǯ! ,+ =0acj[o yyԠ Lc6R50G,bR! ,+ @˖ؘ~eL4GQ*t'Ů6dC]+JvE`";pnp4nagios-0.6.16/share/pnp/media/images/notify.gif0000664000000000000000000000166311662503006020615 0ustar rootrootGIF89a!!!)))BBB! ,H* F|@bƌ"yр P9Iٲ&/c ͚8M$@ ]J @J.Ed j=PWn5,BQ*pQ^>$"`4W`@;pnp4nagios-0.6.16/share/pnp/media/images/go-now.png0000664000000000000000000000317411662503006020531 0ustar rootrootPNG  IHDR sbKGD#2 pHYsvv}Ղ vpAg ]IDATH}OhwyfdZ%i`A{#b۪`E"zP=h%DAD0vbi{XwAR\V<40-nyf2gc.>|onepƂ.zz6kgFu㊧NT-Hɮ{j3.{lM+H2u5ٰJ\*]:۵֔ ?޾|<_Ώ }Ĭ ccC! y ùQv Pv;f4%[aۇ7RLI T76o65%?IX.FnxLkd2 M̔;|'0R. ׍W'=_u+>-T(& xΎiA/{ ʤ˝6OޒJ%O*dL\n*V 9 /sZ]{Z~afw3VTj$7w1@]۶54|JX)I #w9!Sw۳#Ɽ\(|H%rCCoX 02c Hդ3R([QM}\>&v DN[+´D"3foKIR٭ܱփu7Df:aV4oWA*ub/UX.JӾ#HuTyZًMJQM]QSÝiE5ATI?JCUNÔ)JqOEO>hRaRYQ** Me=_T7PHEY2)gQ;NKS,8]58eSR.[;bOō8?6A_7Q[c<窖m|)VJ/^djVxq['Jc|OkbOSC"\ x=[G6n"HdlX{ ҍ+ 5\!Y%tEXtcreate-date2009-11-15T17:02:37-07:00%tEXtdate:create2010-02-20T23:26:17-07:00M%tEXtdate:modify2010-01-11T09:29:57-07:00-NTgtEXtLicensehttp://creativecommons.org/licenses/by-sa/3.0/ or http://creativecommons.org/licenses/LGPL/2.1/[MACRO['TITLE'] = "Interface Traffic for ETH0"; $this->MACRO['COMMENT'] = "Inbound Traffc for all Cloud Nodes"; # # Get a List of Services by regex # Option 1 = 'Host Regex' # Option 2 = 'Service Regex' # $services = $this->tplGetServices("node","eth0"); # # The Datasource Name for Graph 0 $ds_name[0] = "RTA Times"; $opt[0] = "--title \"Stacked RTA Times\""; $def[0] = ""; # # Iterate through the list of hosts foreach($services as $key=>$val){ # # get the data for a given Host/Service $a = $this->tplGetData($val['host'],$val['service']); # # Throw an exception to debug the content of $a # Just to get Infos about the Array Structure # #throw new Kohana_exception(print_r($a,TRUE)); $def[0] .= rrd::def("a$key" ,$a['DS'][0]['RRDFILE'], $a['DS'][0]['DS'], "AVERAGE"); $def[0] .= rrd::area("a$key", rrd::color($key), $a['MACRO']['HOSTNAME'], "STACK"); $def[0] .= rrd::gprint("a$key", array("MIN", "MAX", "LAST"), "%.2lf%s"); } ?> pnp4nagios-0.6.16/share/pnp/templates.special/README0000664000000000000000000000004311662503006020556 0ustar rootrootPlace your special Templates here! pnp4nagios-0.6.16/share/pnp/templates.special/static.php-sample0000664000000000000000000000111411662503006023155 0ustar rootrootMACRO['TITLE'] = "All Ping Times for Cluster Nodes"; $this->MACRO['COMMENT'] = "This is a comment"; # # The Name of this Datasource (ds) $ds_name[0] = "RTA Times"; $opt[0] = "--title \"Graph Title\" "; $def[0] = "DEF:var1=/usr/local/pnp4nagios/var/perfdata/node1/_HOST_.rrd:1:AVERAGE "; $def[0] .= "DEF:var2=/usr/local/pnp4nagios/var/perfdata/node2/_HOST_.rrd:1:AVERAGE "; $def[0] .= "LINE1:var1".rrd::color(1).":\"Localhost \\n\" "; $def[0] .= "LINE1:var2".rrd::color(2).":\"Node1 \\n\" "; ?> pnp4nagios-0.6.16/share/pnp/templates.special/loop.php-sample0000664000000000000000000000143211662503006022642 0ustar rootrootMACRO['TITLE'] = "The Title"; $this->MACRO['COMMENT'] = "A Comment"; # # Define the Service we want to graph $service = '_HOST_'; # # Define a List of Host $hosts = array('localhost','node1','node2'); # # The Datasource Name for Graph 1 ( index 0 ) $ds_name[0] = "RTA Times"; $opt[0] = "--title \"Stacked RTA Times\""; $def[0] = ""; # # Iterate through the list of hosts foreach($hosts as $key=>$host){ # # get the data for a given Host/Service $a = $this->tplGetData($host,$service); $def[0] .= rrd::def("a$key" ,$a['DS'][0]['RRDFILE'], $a['DS'][0]['DS'], "AVERAGE"); $def[0] .= rrd::area("a$key", rrd::color($key), $a['MACRO']['HOSTNAME'], "STACK"); $def[0] .= rrd::gprint("a$key", array("MIN", "MAX", "LAST"), "%.2lf%s"); } ?> pnp4nagios-0.6.16/share/Makefile.in0000664000000000000000000002105111662503006015533 0ustar rootrootprefix=@prefix@ exec_prefix=@exec_prefix@ LOGDIR=@localstatedir@ CFGDIR=@sysconfdir@ BINDIR=@bindir@ CGIDIR=@sbindir@ INSTALL=@INSTALL@ INSTALL_OPTS=@INSTALL_OPTS@ DATAROOTDIR=@datarootdir@ CP=@CP@ all html: clean: -rm -f pnp/index.php -rm -f pnp/install.php distclean: clean -rm -f Makefile devclean: distclean install: $(INSTALL) -m 777 $(INSTALL_OPTS) -d $(DESTDIR)$(LOGDIR)/kohana $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(DATAROOTDIR) $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(DATAROOTDIR)/documents $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(DATAROOTDIR)/documents/_media $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(DATAROOTDIR)/documents/images $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(DATAROOTDIR)/documents/images/smileys $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(DATAROOTDIR)/documents/en_US $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(DATAROOTDIR)/documents/de_DE $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(DATAROOTDIR)/application $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(DATAROOTDIR)/application/lib $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(DATAROOTDIR)/application/cache $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(DATAROOTDIR)/application/controllers $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(DATAROOTDIR)/application/config $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(DATAROOTDIR)/application/helpers $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(DATAROOTDIR)/application/hooks $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(DATAROOTDIR)/application/i18n $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(DATAROOTDIR)/application/i18n/de_DE $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(DATAROOTDIR)/application/i18n/en_US $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(DATAROOTDIR)/application/i18n/es_ES $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(DATAROOTDIR)/application/i18n/ru_RU $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(DATAROOTDIR)/application/i18n/fr_FR $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(DATAROOTDIR)/application/models $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(DATAROOTDIR)/application/views $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(DATAROOTDIR)/application/vendor $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(DATAROOTDIR)/application/vendor/fpdf $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(DATAROOTDIR)/application/vendor/fpdf/filters $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(DATAROOTDIR)/application/vendor/fpdf/font for file in pnp/documents/_media/*; \ do $(INSTALL) -m 644 $(INSTALL_OPTS) $$file $(DESTDIR)$(DATAROOTDIR)/documents/_media; done for file in pnp/documents/images/smileys/*; \ do $(INSTALL) -m 644 $(INSTALL_OPTS) $$file $(DESTDIR)$(DATAROOTDIR)/documents/images/smileys; done for file in pnp/documents/en_US/*; \ do $(INSTALL) -m 644 $(INSTALL_OPTS) $$file $(DESTDIR)$(DATAROOTDIR)/documents/en_US; done for file in pnp/documents/de_DE/*; \ do $(INSTALL) -m 644 $(INSTALL_OPTS) $$file $(DESTDIR)$(DATAROOTDIR)/documents/de_DE; done for file in pnp/application/models/*.php; \ do $(INSTALL) -m 644 $(INSTALL_OPTS) $$file $(DESTDIR)$(DATAROOTDIR)/application/models; done for file in pnp/application/views/*.php; \ do $(INSTALL) -m 644 $(INSTALL_OPTS) $$file $(DESTDIR)$(DATAROOTDIR)/application/views; done for file in pnp/application/vendor/fpdf/*.php; \ do $(INSTALL) -m 644 $(INSTALL_OPTS) $$file $(DESTDIR)$(DATAROOTDIR)/application/vendor/fpdf; done for file in pnp/application/vendor/fpdf/font/*.php; \ do $(INSTALL) -m 644 $(INSTALL_OPTS) $$file $(DESTDIR)$(DATAROOTDIR)/application/vendor/fpdf/font; done for file in pnp/application/vendor/fpdf/filters/*.php; \ do $(INSTALL) -m 644 $(INSTALL_OPTS) $$file $(DESTDIR)$(DATAROOTDIR)/application/vendor/fpdf/filters; done for file in pnp/application/controllers/*.php; \ do $(INSTALL) -m 644 $(INSTALL_OPTS) $$file $(DESTDIR)$(DATAROOTDIR)/application/controllers; done for file in pnp/application/config/*.php; \ do $(INSTALL) -m 644 $(INSTALL_OPTS) $$file $(DESTDIR)$(DATAROOTDIR)/application/config; done for file in pnp/application/helpers/*.php; \ do $(INSTALL) -m 644 $(INSTALL_OPTS) $$file $(DESTDIR)$(DATAROOTDIR)/application/helpers; done for file in pnp/application/lib/*.php; \ do $(INSTALL) -m 644 $(INSTALL_OPTS) $$file $(DESTDIR)$(DATAROOTDIR)/application/lib; done for file in pnp/application/i18n/de_DE/*.php; \ do $(INSTALL) -m 644 $(INSTALL_OPTS) $$file $(DESTDIR)$(DATAROOTDIR)/application/i18n/de_DE; done for file in pnp/application/i18n/en_US/*.php; \ do $(INSTALL) -m 644 $(INSTALL_OPTS) $$file $(DESTDIR)$(DATAROOTDIR)/application/i18n/en_US; done for file in pnp/application/i18n/es_ES/*.php; \ do $(INSTALL) -m 644 $(INSTALL_OPTS) $$file $(DESTDIR)$(DATAROOTDIR)/application/i18n/es_ES; done for file in pnp/application/i18n/ru_RU/*.php; \ do $(INSTALL) -m 644 $(INSTALL_OPTS) $$file $(DESTDIR)$(DATAROOTDIR)/application/i18n/ru_RU; done for file in pnp/application/i18n/fr_FR/*.php; \ do $(INSTALL) -m 644 $(INSTALL_OPTS) $$file $(DESTDIR)$(DATAROOTDIR)/application/i18n/fr_FR; done $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(DATAROOTDIR)/media $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(DATAROOTDIR)/media/js $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(DATAROOTDIR)/media/css $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(DATAROOTDIR)/media/css/images $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(DATAROOTDIR)/media/css/ui-lightness $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(DATAROOTDIR)/media/css/ui-lightness/images $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(DATAROOTDIR)/media/css/ui-smoothness $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(DATAROOTDIR)/media/css/ui-smoothness/images $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(DATAROOTDIR)/media/css/ui-redmond $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(DATAROOTDIR)/media/css/ui-redmond/images $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(DATAROOTDIR)/media/css/ui-multisite $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(DATAROOTDIR)/media/css/ui-multisite/images $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(DATAROOTDIR)/media/images for file in pnp/media/css/*.*; \ do $(INSTALL) -m 644 $(INSTALL_OPTS) $$file $(DESTDIR)$(DATAROOTDIR)/media/css; done for file in pnp/media/css/images/*.*; \ do $(INSTALL) -m 644 $(INSTALL_OPTS) $$file $(DESTDIR)$(DATAROOTDIR)/media/css/images; done $(INSTALL) -m 644 $(INSTALL_OPTS) pnp/media/css/shadow.png $(DESTDIR)$(DATAROOTDIR)/media/css for file in pnp/media/css/ui-lightness/*.css; \ do $(INSTALL) -m 644 $(INSTALL_OPTS) $$file $(DESTDIR)$(DATAROOTDIR)/media/css/ui-lightness; done for file in pnp/media/css/ui-lightness/images/*; \ do $(INSTALL) -m 644 $(INSTALL_OPTS) $$file $(DESTDIR)$(DATAROOTDIR)/media/css/ui-lightness/images; done for file in pnp/media/css/ui-smoothness/*.css; \ do $(INSTALL) -m 644 $(INSTALL_OPTS) $$file $(DESTDIR)$(DATAROOTDIR)/media/css/ui-smoothness; done for file in pnp/media/css/ui-smoothness/images/*; \ do $(INSTALL) -m 644 $(INSTALL_OPTS) $$file $(DESTDIR)$(DATAROOTDIR)/media/css/ui-smoothness/images; done for file in pnp/media/css/ui-redmond/*.css; \ do $(INSTALL) -m 644 $(INSTALL_OPTS) $$file $(DESTDIR)$(DATAROOTDIR)/media/css/ui-redmond; done for file in pnp/media/css/ui-redmond/images/*; \ do $(INSTALL) -m 644 $(INSTALL_OPTS) $$file $(DESTDIR)$(DATAROOTDIR)/media/css/ui-redmond/images; done for file in pnp/media/css/ui-multisite/*.css; \ do $(INSTALL) -m 644 $(INSTALL_OPTS) $$file $(DESTDIR)$(DATAROOTDIR)/media/css/ui-multisite; done for file in pnp/media/css/ui-multisite/images/*; \ do $(INSTALL) -m 644 $(INSTALL_OPTS) $$file $(DESTDIR)$(DATAROOTDIR)/media/css/ui-multisite/images; done for file in pnp/media/js/*; \ do $(INSTALL) -m 644 $(INSTALL_OPTS) $$file $(DESTDIR)$(DATAROOTDIR)/media/js; done for file in pnp/media/images/*; \ do $(INSTALL) -m 644 $(INSTALL_OPTS) $$file $(DESTDIR)$(DATAROOTDIR)/media/images; done $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(DATAROOTDIR)/templates.dist for file in pnp/templates.dist/*.php; \ do $(INSTALL) -m 644 $(INSTALL_OPTS) $$file $(DESTDIR)$(DATAROOTDIR)/templates.dist; done $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(DATAROOTDIR)/templates.special for file in pnp/templates.special/*; \ do $(INSTALL) -m 644 $(INSTALL_OPTS) $$file $(DESTDIR)$(DATAROOTDIR)/templates.special; done $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(DATAROOTDIR)/templates $(INSTALL) -m 644 $(INSTALL_OPTS) pnp/index.php $(DESTDIR)$(DATAROOTDIR) $(INSTALL) -m 644 $(INSTALL_OPTS) pnp/install.php $(DESTDIR)$(DATAROOTDIR) pnp4nagios-0.6.16/man/0000775000000000000000000000000011662503006013140 5ustar rootrootpnp4nagios-0.6.16/man/Makefile.in0000664000000000000000000000056311662503006015211 0ustar rootrootprefix=@prefix@ exec_prefix=@exec_prefix@ MANDIR=@mandir@ INSTALL=@INSTALL@ INSTALL_OPTS=@INSTALL_OPTS@ DATAROOTDIR=@datarootdir@ CP=@CP@ all html: clean: -rm -f npcd.8 distclean: clean -rm -f Makefile devclean: distclean install: $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(MANDIR)/man8 $(INSTALL) -m 755 $(INSTALL_OPTS) npcd.8 $(DESTDIR)$(MANDIR)/man8 pnp4nagios-0.6.16/man/npcd.8.in0000664000000000000000000000205111662503006014560 0ustar rootroot.\" In .TH, FOO should be all caps, SECTION should be 1-8, maybe w/ subsection .\" other parms are allowed: see man(7), man(1) .\" .\" This template provided by Tom Christiansen . .\" .TH NPCD 8 .SH NAME npcd \- Nagios Performance C Daemon .SH SYNOPSIS \fBnpcd\fR [ \fB\-d | \--daemon\fR ] ( \fB\-f | \--config\fR ) \fI .SH DESCRIPTION The \fBnpcd\fR is a daemon processing nagios performance data. .PP For more information you can visit pnp4nagios website: .IP http://docs.pnp4nagios.org/ .PP and SourceForge project: .IP http://pnp4nagios.sourceforge.net .SH OPTIONS .TP \fB\-d, \--daemon Run \fBnpcd\fR as daemon in the background. .TP \fB\-f, \--config\fR \fI Path to the \fBnpcd\fR config file (typically @sysconfdir@/npcd.cfg). .SH "RETURN VALUE" On success starting \fBnpcd\fR 0 is returned. .SH ERRORS On error starting \fBnpcd\fR 1 is returned. .SH FILES .br .nf \fI@sysconfdir@/npcd.cfg\fR default config file .SH AUTHORS Joerg Linge , Hendrik Baecker pnp4nagios-0.6.16/config.sub0000775000000000000000000010115311662503006014351 0ustar rootroot#! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 # Free Software Foundation, Inc. timestamp='2008-01-16' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # This file 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 2 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, write to the Free Software # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray) os= basic_machine=$1 ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | mcore | mep \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64vr | mips64vrel \ | mips64orion | mips64orionel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | mt \ | msp430 \ | nios | nios2 \ | ns16k | ns32k \ | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ | score \ | sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu | strongarm \ | tahoe | thumb | tic4x | tic80 | tron \ | v850 | v850e \ | we32k \ | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ | z8k) basic_machine=$basic_machine-unknown ;; m6811 | m68hc11 | m6812 | m68hc12) # Motorola 68HC11/12. basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64vr-* | mips64vrel-* \ | mips64orion-* | mips64orionel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nios-* | nios2-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ | romp-* | rs6000-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ | tahoe-* | thumb-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tron-* \ | v850-* | v850e-* | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; c90) basic_machine=c90-cray os=-unicos ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; # I'm not sure what "Sysv32" means. Should this be sysv3.2? i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; mvs) basic_machine=i370-ibm os=-mvs ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc) basic_machine=powerpc-unknown ;; ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tic54x | c54x*) basic_machine=tic54x-unknown os=-coff ;; tic55x | c55x*) basic_machine=tic55x-unknown os=-coff ;; tic6x | c6x*) basic_machine=tic6x-unknown os=-coff ;; tile*) basic_machine=tile-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -zvmoe) os=-zvmoe ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 # This also exists in the configure program, but was not the # default. # os=-sunos4 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: pnp4nagios-0.6.16/summary.in0000664000000000000000000000654111662503006014420 0ustar rootroot#@PERL@ -w @PERL_LIB_PATH_CODE@ my %conf = ( VERSION => "@PKG_VERSION@", USE_RRDs => "@RRDS@", DEBUG_LEVEL => "@DEBUG@", PERL_LIB_PATH => "@PERL_LIB_PATH@" ); if ( $conf{USE_RRDs} == 1 ) { unless ( eval "use RRDs;1" ) { $conf{USE_RRDs} = 0; } } if($conf{USE_RRDs} == 1){ $rrds_version = $RRDs::VERSION; } my $RRD_BINARY = "@RRDTOOL@"; @T = `$RRD_BINARY`; @v = split(/ /,$T[0]); $rrdtool_version = $v[1]; $rrdtool_message = ""; if($rrdtool_version == ""){ $rrdtool_message = "WARNING: \"$RRD_BINARY\" does not look like rrdtool"; }else{ $rrdtool_message = "$RRD_BINARY Version $rrdtool_version"; } printf ("\n\n"); printf ("*** Configuration summary for %s-%s %s ***","@PKG_NAME@","@PKG_VERSION@","@PKG_REL_DATE@"); printf ("\n\n"); printf (" General Options:\n"); printf (" ------------------------- -------------------\n"); printf (" Nagios user/group: %s %s\n","@nagios_user@","@nagios_grp@"); printf (" Install directory: %s\n","@prefix@"); printf (" HTML Dir: %s\n","@datarootdir@"); printf (" Config Dir: %s\n","@sysconfdir@"); printf (" Location of rrdtool binary: %s\n",$rrdtool_message); printf (" RRDs Perl Modules: %s\n","*** NOT FOUND ***") if($conf{USE_RRDs} == 0); printf (" RRDs Perl Modules: %s (Version %s)\n","FOUND", $rrds_version) if($conf{USE_RRDs} == 1); printf (" RRDs Perl search path: %s\n","@PERL_LIB_PATH@") if($conf{PERL_LIB_PATH} ne ""); printf (" RRD Files stored in: %s\n","@PERFDATA_DIR@"); printf (" process_perfdata.pl Logfile: %s\n","@PERFDATA_LOG@"); printf (" Perfdata files (NPCD) stored in: %s\n","@PERFDATA_SPOOL_DIR@"); printf ("\n"); printf (" Web Interface Options:\n"); printf (" ------------------------- -------------------\n"); printf (" HTML URL: %s\n","http://localhost@BASE_URL@"); printf (" Apache Config File: %s\n","@HTTPD_CONF@/@PKG_NAME@.conf"); if( $#ARGV == -1){ printf ("\n\n"); printf (" Review the options above for accuracy. If they look okay,\n"); printf (" type 'make all' to compile.\n"); } if($conf{USE_RRDs} == 0){ print "\n\n"; print " WARNING: The RRDs Perl Modules are not found on your system\n"; print " Using RRDs will speedup things in larger installations.\n"; } if($ENV{DESTDIR}){ print "\n\n"; print " WARNING: \$DESTDIR is set to $ENV{DESTDIR} \n"; } if($conf{DEBUG_LEVEL} != 0){ printf ("\n\n"); printf (" Found PERL at: %s\n","@PERL@"); printf (" Found SHELL at: %s\n","@SHELL@"); printf (" Debug Level: %s\n","@DEBUG@"); printf (" Libexecdir: %s\n","@libexecdir@"); printf (" localstatedir: %s\n","@localstatedir@"); printf (" libdir: %s\n","@libdir@"); printf (" sysconfdir: %s\n","@sysconfdir@"); printf (" datarootdir: %s\n","@datarootdir@"); printf (" sbindir: %s\n","@sbindir@"); printf (" bindir: %s\n","@bindir@"); printf (" System: %s\n","@host_os@"); } print "\n\n"; exit 0; pnp4nagios-0.6.16/Makefile.in0000664000000000000000000001012511662503006014431 0ustar rootroot############################### # Makefile for PNP # # Last Modified: 12-10-2006 ############################### # Source code directories SRC_BASE=@srcdir@/src SRC_SHARE=@srcdir@/share SRC_LIB=@srcdir@/lib SRC_SCRIPTS=@srcdir@/scripts SRC_CONFIG=@srcdir@/sample-config SRC_MAN=@srcdir@/man SRC_CONTRIB=@srcdir@/contrib SRC_HELPERS=@srcdir@/helpers CC=@CC@ CFLAGS=@CFLAGS@ @DEFS@ LDFLAGS=@LDFLAGS@ @LIBS@ prefix=@prefix@ exec_prefix=@exec_prefix@ LOGDIR=@localstatedir@ CFGDIR=@sysconfdir@ BINDIR=@bindir@ LIBEXECDIR=@libexecdir@ LIBDIR=@libdir@ KOHANA=@KOHANA@ CGIDIR=@sbindir@ INSTALL=@INSTALL@ INSTALL_OPTS=@INSTALL_OPTS@ DATAROOTDIR=@datarootdir@ CP=@CP@ PERL=@PERL@ none: @echo "Please supply a command line argument (i.e. 'make all'). Other targets are:" @echo " clean" @echo " install install-init install-config install-processperfdata install-html fullinstall" @echo " install-plugins" all: cd $(SRC_BASE) && $(MAKE) cd $(SRC_SHARE) && $(MAKE) cd $(SRC_SCRIPTS) && $(MAKE) chmod a+r $(SRC_CONTRIB)/ssi/status-header.ssi chmod a+xr $(SRC_HELPERS)/w2h.pl @echo "" @echo "*** Compile finished ***" @echo "" @echo " make install" @echo " - This installs the main program and HTML files" @echo "" @echo " make fullinstall" @echo " - This installs the main program, runlevel scripts, config and HTML files" @echo "" @echo "Enjoy." @echo "" scripts: cd $(SRC_SCRIPTS) && $(MAKE) share: cd $(SRC_SHARE) && $(MAKE) clean: cd $(SRC_BASE) && $(MAKE) $@ cd $(SRC_MAN) && $(MAKE) $@ cd $(SRC_SHARE) && $(MAKE) $@ cd $(SRC_LIB) && $(MAKE) $@ cd $(SRC_SCRIPTS) && $(MAKE) $@ cd $(SRC_CONFIG) && $(MAKE) $@ -rm -f *.cfg core -rm -f *~ *.*~ */*~ */*.*~ -rm -f config.log config.status config.cache distclean: cd $(SRC_BASE) && $(MAKE) $@ cd $(SRC_MAN) && $(MAKE) $@ cd $(SRC_SHARE) && $(MAKE) $@ cd $(SRC_LIB) && $(MAKE) $@ cd $(SRC_SCRIPTS) && $(MAKE) $@ cd $(SRC_CONFIG) && $(MAKE) $@ -rm -f *.cfg core -rm -f *~ *.*~ */*~ */*.*~ -rm -f config.log config.status config.cache rm -f Makefile include/stamp-h1 include/config.h config.status config.log rm -f subst summary rm -f $(SRC_CONTRIB)/ssi/status-header.ssi rm -f $(SRC_HELPERS)/w2h.pl devclean: distclean install-html: cd $(SRC_SHARE) && $(MAKE) install install-base: cd $(SRC_BASE) && $(MAKE) install install-man: cd $(SRC_MAN) && $(MAKE) install install-processperfdata: cd $(SRC_SCRIPTS) && $(MAKE) install install-init: cd $(SRC_SCRIPTS) && $(MAKE) $@ install-config: cd $(SRC_CONFIG) && $(MAKE) $@ @echo "" @echo "*** PNP4Nagios sample config files installed ***" @echo "" @echo "Please run 'make install-init' if you want to use" @echo "BULK Mode with NPCD" @echo "" @echo "" @echo "" install-webconf: cd $(SRC_CONFIG) && $(MAKE) $@ @echo "" @echo "*** Apache config file installed ***" @echo "" @echo "Restart your apache webserver to activete your changes." @echo "" @echo "Please run 'make install-config' to install sample" @echo "configuration files" @echo "" @echo "Please run 'make install-init' if you want to use" @echo "BULK Mode with NPCD" @echo "" @echo "" @echo "" install-plugins: cd $(SRC_SCRIPTS) && $(MAKE) $@ install: cd $(SRC_BASE) && $(MAKE) $@ cd $(SRC_MAN) && $(MAKE) $@ cd $(SRC_SHARE) && $(MAKE) $@ if [ x$(KOHANA) = xyes ]; then \ cd $(SRC_LIB) && $(MAKE) $@; \ fi cd $(SRC_SCRIPTS) && $(MAKE) $@ cd $(SRC_CONFIG) && $(MAKE) $@ @echo "" @echo "*** Main program, Scripts and HTML files installed ***" @echo "" @echo "Please run 'make install-webconf' to install the" @echo "web configuration file" @echo "" @echo "Please run 'make install-config' to install sample" @echo "configuration files" @echo "" @echo "Please run 'make install-init' if you want to use" @echo "BULK Mode with NPCD" @echo "" @echo "" @echo "" install-unstripped: cd $(SRC_BASE) && $(MAKE) $@ cd $(SRC_SHARE) && $(MAKE) $@ cd $(SRC_SCRIPTS) && $(MAKE) $@ $(MAKE) install-basic fullinstall: install install-webconf install-config install-init $(PERL) summary fullinstall @echo "" @echo "*** Main program, Scripts and HTML files installed ***" @echo "" @echo "Enjoy." @echo "" pnp4nagios-0.6.16/src/0000775000000000000000000000000011662503006013154 5ustar rootrootpnp4nagios-0.6.16/src/logging.c0000664000000000000000000000462111662503006014751 0ustar rootroot// Copyright (C) 2007-2009 Hendrik Baecker // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License version 2 as // published by the Free Software Foundation; // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include "../include/config.h" #include "../include/pnp.h" int write_log(char *); extern char* log_file; extern int use_syslog; extern int loglevel; extern int max_logfile_size; int do_log(char *message) { if (use_syslog) { syslog(LOG_NOTICE, message); return OK; } else if (use_syslog == FALSE) { if (write_log(message)==0) return OK; else return ERROR; } return OK; } int write_log(char *message) { int fd; long filelen; struct timeval tv; char temp_buffer[2048]; time_t curtime; gettimeofday(&tv, NULL); curtime = tv.tv_sec; strftime(temp_buffer, sizeof(temp_buffer) - 1, "[%m-%d-%Y %T] NPCD: ", localtime(&curtime)); strcat(temp_buffer, message); /* open / create logfile */ if ((fd = open(log_file, O_WRONLY | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)) == -1) { printf("Cannot open log file %s\n", log_file); return 0; } /* write log message */ if (write(fd, temp_buffer, strlen(temp_buffer)) != strlen(temp_buffer)) { perror("NPCD: Error writing to log file"); close(fd); return 0; } /* rotate logfile if size > max_logfile_size */ if ((filelen = lseek(fd, 0L, SEEK_END)) > max_logfile_size) { /* LOG(0, "Begin Logrotation!\n"); */ char buffer[PATH_MAX]; close(fd); /* delete .old log file */ strncpy(buffer, log_file, sizeof(buffer) - 1); strncat(buffer, ".old", sizeof(buffer) - 1); unlink(buffer); /* rename log_file to log_file.old */ if (rename(log_file, buffer) != 0) { snprintf(buffer, sizeof(buffer) - 1, "Error rename() logfile - %s", strerror(errno)); LOG(0, buffer); //perror("Error renaming logfile\n"); return 0; } LOG(0, "Logfile rotated!\n"); } else { close(fd); } return filelen; } pnp4nagios-0.6.16/src/utils.c0000664000000000000000000001303011662503006014455 0ustar rootroot// Copyright (C) 2006-2009 Hendrik Baecker // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License version 2 as // published by the Free Software Foundation; // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include "../include/config.h" #include "../include/pnp.h" extern int prepare_vars(); extern int thread_counter; extern int max_threads; extern int daemon_mode; extern int loglevel; extern int use_syslog; int sighup_detected = FALSE; extern char** command; extern char *command_args; extern char *user; extern char *group; extern char *directory; extern char *macro_x; extern char *config_file; extern char buffer[MAX_LOGMESSAGE_SIZE]; extern void process_configfile(char *); extern int check_needed_config_options(void); typedef void (*sighandler_t)(int); // This function has special copyright!!! /* Copyright (c) 1999-2006 Ethan Galstad (nagios@nagios.org) */ /* strip newline, carriage return, and tab characters from beginning and end of a string */ void pnp_strip(char *buffer) { register int x; register int y; register int z; if (buffer == NULL || buffer[0] == '\x0') return; /* strip end of string */ y = (int) strlen(buffer); for (x = y - 1; x >= 0; x--) { if (buffer[x] == ' ' || buffer[x] == '\n' || buffer[x] == '\r' || buffer[x] == '\t' || buffer[x] == 13) buffer[x] = '\x0'; else break; } /* strip beginning of string (by shifting) */ y = (int) strlen(buffer); for (x = 0; x < y; x++) { if (buffer[x] == ' ' || buffer[x] == '\n' || buffer[x] == '\r' || buffer[x] == '\t' || buffer[x] == 13) continue; else break; } if (x > 0) { for (z = x; z < y; z++) buffer[z - x] = buffer[z]; buffer[y - x] = '\x0'; } return; } /******************************************************************/ /*********************** SECURITY FUNCTIONS ***********************/ /******************************************************************/ /* drops privileges */ int drop_privileges(char *user, char *group) { uid_t uid = -1; gid_t gid = -1; struct group *grp = NULL; struct passwd *pw = NULL; int result = OK; /* only drop privileges if we're running as root, so we don't interfere with being debugged while running as some random user */ if (getuid() != 0) return OK; /* set effective group ID */ if (group != NULL) { /* see if this is a group name */ if (strspn(group, "0123456789") < strlen(group)) { grp = (struct group *) getgrnam(group); if (grp != NULL) { gid = (gid_t) (grp->gr_gid); } else { printf("Warning: Could not get group entry for '%s'\n", group); } } /* else we were passed the GID */ else gid = (gid_t) atoi(group); /* set effective group ID if other than current EGID */ if (gid != getegid()) { if (setgid(gid) == -1) { printf("Warning: Could not set effective GID=%d\n", (int) gid); result = ERROR; } } } /* set effective user ID */ if (user != NULL) { /* see if this is a user name */ if (strspn(user, "0123456789") < strlen(user)) { pw = (struct passwd *) getpwnam(user); if (pw != NULL) uid = (uid_t) (pw->pw_uid); else { printf("Warning: Could not get passwd entry for '%s'\n", user); } } /* else we were passed the UID */ else uid = (uid_t) atoi(user); #ifdef HAVE_INITGROUPS if(uid!=geteuid()) { /* initialize supplementary groups */ if(initgroups(user,gid)==-1) { if(errno==EPERM) { printf("Warning: Unable to change supplementary groups using initgroups() -- I hope you know what you're doing\n"); } else { printf("Warning: Possibly root user failed dropping privileges with initgroups()\n"); return ERROR; } } } #endif if (setuid(uid) == -1) { printf("Warning: Could not set effective UID=%d\n", (int) uid); result = ERROR; } } return result; } /******************* * * Signal functions * *******************/ sighandler_t handle_signal(int sig_nr, sighandler_t signalhandler) { struct sigaction new_sig, old_sig; new_sig.sa_handler = signalhandler; sigemptyset(&new_sig.sa_mask); new_sig.sa_flags = SA_RESTART; if (sigaction(sig_nr, &new_sig, &old_sig) < 0) return SIG_ERR; return old_sig.sa_handler; } void check_sig(int signr) { char buffer[MAX_LOGMESSAGE_SIZE]; switch (signr) { case SIGINT: LOG(0, "Caught SIGINT - Good bye\n"); exit(EXIT_SUCCESS); break; case SIGTERM: LOG(0, "Caught Termination Signal - Astalavista... baby\n"); exit(EXIT_SUCCESS); break; case SIGHUP: LOG(0, "Caught SIGHUP - reloading configuration\n"); sighup_detected = TRUE; process_configfile(config_file); if (check_needed_config_options() != 0) { LOG(0, "There is an error in the config! Exiting...\n"); exit(EXIT_FAILURE); } prepare_vars(); LOG(0, "Configuration reload succesfull.\n"); break; default: snprintf(buffer, sizeof(buffer - 1), "Caught the Signal '%d' but don't care about this.\n", signr); LOG(2, buffer); break; } } /* This won't compile on Solaris and HP UX */ #ifdef HAVE_STRUCT_DIRENT_D_TYPE int is_file(const struct dirent *d) { if (d->d_type == DT_REG) return 1; //free(d); return 0; } #endif pnp4nagios-0.6.16/src/npcdmod.c0000664000000000000000000004103311662503006014745 0ustar rootroot/***************************************************************************** * * NPCDMOD.C * * Copyright (c) 2008-2010 Hendrik Baecker (http://www.pnp4nagios.org) * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation; * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Last Modified: 07-30-2010 * *****************************************************************************/ /* include (minimum required) event broker header files */ #include "../include/nebmodules.h" #include "../include/nebcallbacks.h" /* include other event broker header files that we need for our work */ #include "../include/nebstructs.h" #include "../include/broker.h" /* include some Nagios stuff as well */ #include "../include/config.h" #include "../include/common.h" #include "../include/nagios.h" /* include some pnp stuff */ #include "../include/pnp.h" #include "../include/npcdmod.h" /* specify event broker API version (required) */ NEB_API_VERSION(CURRENT_NEB_API_VERSION); extern int process_performance_data; FILE *fp = NULL; void *npcdmod_module_handle = NULL; char *perfdata_file = "/usr/local/nagios/var/perfdata"; char *perfdata_spool_filename = "perfdata"; char *spool_dir = NULL; char *perfdata_file_processing_interval = "15"; void npcdmod_file_roller(); int npcdmod_handle_data(int, void *); int npcdmod_process_config_var(char *arg); int npcdmod_process_module_args(char *args); /* this function gets called when the module is loaded by the event broker */ int nebmodule_init(int flags, char *args, nebmodule *handle) { char temp_buffer[1024]; time_t current_time; //unsigned long interval; /* save our handle */ npcdmod_module_handle = handle; /* set some info - this is completely optional, as Nagios doesn't do anything with this data */ neb_set_module_info(npcdmod_module_handle, NEBMODULE_MODINFO_TITLE, "npcdmod"); neb_set_module_info(npcdmod_module_handle, NEBMODULE_MODINFO_AUTHOR, "Hendrik Baecker"); neb_set_module_info(npcdmod_module_handle, NEBMODULE_MODINFO_TITLE, "Copyright (c) 2008-2009 Hendrik Baecker"); neb_set_module_info(npcdmod_module_handle, NEBMODULE_MODINFO_VERSION, "0.0.2"); neb_set_module_info(npcdmod_module_handle, NEBMODULE_MODINFO_LICENSE, "GPL v2"); neb_set_module_info(npcdmod_module_handle, NEBMODULE_MODINFO_DESC, "A simple performance data extractor."); /* log module info to the Nagios log file */ write_to_all_logs("npcdmod: Copyright (c) 2008-2009 Hendrik Baecker (andurin@process-zero.de) - http://www.pnp4nagios.org", NSLOG_INFO_MESSAGE); if (process_performance_data == FALSE) { write_to_all_logs("npcdmod: I can not work with disabled performance data in nagios.cfg.", NSLOG_INFO_MESSAGE); write_to_all_logs("npcdmod: Please enable it with 'process_performance_data=1' in nagios.cfg", NSLOG_INFO_MESSAGE); return -1; } /* process arguments */ if (npcdmod_process_module_args(args) == ERROR) { write_to_all_logs("npcdmod: An error occurred while attempting to process module arguments.", NSLOG_INFO_MESSAGE); return -1; } /* de-initialize if there is no perfdata file nor spool dir */ if (spool_dir == NULL || perfdata_file == NULL) { write_to_all_logs("npcdmod: An error occurred process your config file. Check your perfdata_file or perfdata_spool_dir.", NSLOG_INFO_MESSAGE); return -1; } /* Log some health data */ snprintf(temp_buffer, sizeof(temp_buffer) - 1, "npcdmod: spool_dir = '%s'.", spool_dir); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; write_to_all_logs(temp_buffer, NSLOG_INFO_MESSAGE); snprintf(temp_buffer, sizeof(temp_buffer) - 1, "npcdmod: perfdata file '%s'.", perfdata_file); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; write_to_all_logs(temp_buffer, NSLOG_INFO_MESSAGE); /* open perfdata_file to write perfdata in it */ if ((fp = fopen(perfdata_file, "a")) == NULL) { snprintf(temp_buffer, sizeof(temp_buffer) - 1, "npcdmod: Could not open file. %s", strerror(errno)); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; write_to_all_logs(temp_buffer, NSLOG_INFO_MESSAGE); return -1; } /* log a message to the Nagios log file that we're ready */ snprintf(temp_buffer, sizeof(temp_buffer) - 1, "npcdmod: Ready to run to have some fun!\n"); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; write_to_all_logs(temp_buffer, NSLOG_INFO_MESSAGE); /* register for a 15 seconds file move event */ time(¤t_time); //interval = 15; schedule_new_event(EVENT_USER_FUNCTION,TRUE, current_time + atoi(perfdata_file_processing_interval), TRUE, atoi(perfdata_file_processing_interval), NULL, TRUE, (void *) npcdmod_file_roller, "", 0); /* register to be notified of certain events... */ neb_register_callback(NEBCALLBACK_HOST_CHECK_DATA, npcdmod_module_handle, 0, npcdmod_handle_data); neb_register_callback(NEBCALLBACK_SERVICE_CHECK_DATA, npcdmod_module_handle, 0, npcdmod_handle_data); return 0; } /* this function gets called when the module is unloaded by the event broker */ int nebmodule_deinit(int flags, int reason) { char temp_buffer[1024]; /* deregister for all events we previously registered for... */ neb_deregister_callback(NEBCALLBACK_HOST_CHECK_DATA,npcdmod_handle_data); neb_deregister_callback(NEBCALLBACK_SERVICE_CHECK_DATA,npcdmod_handle_data); /* log a message to the Nagios log file */ snprintf(temp_buffer, sizeof(temp_buffer) - 1, "npcdmod: If you don't like me, I will go out! Bye.\n"); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; write_to_all_logs(temp_buffer, NSLOG_INFO_MESSAGE); return 0; } /* gets called every X seconds by an event in the scheduling queue */ void npcdmod_file_roller() { char temp_buffer[1024]; char spool_file[1024]; int result = 0; time_t current_time; time(¤t_time); sprintf(spool_file, "%s/%s.%d", spool_dir, perfdata_spool_filename, (int)current_time); spool_file[sizeof(spool_file) - 1] = '\x0'; /* close actual file */ fclose(fp); /* move the original file */ result = my_rename(perfdata_file, spool_file); /* open a new file */ if ((fp = fopen(perfdata_file, "a")) == NULL) { snprintf(temp_buffer, sizeof(temp_buffer) - 1, "npcdmod: Could not reopen file. %s", strerror(errno)); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; write_to_all_logs(temp_buffer, NSLOG_INFO_MESSAGE); } return; } /* handle data from Nagios daemon */ int npcdmod_handle_data(int event_type, void *data) { nebstruct_host_check_data *hostchkdata = NULL; nebstruct_service_check_data *srvchkdata = NULL; host *host=NULL; service *service=NULL; // char temp_buffer[1024]; char perfdatafile_template[9216]; /* what type of event/data do we have? */ switch (event_type) { case NEBCALLBACK_HOST_CHECK_DATA: /* an aggregated status data dump just started or ended... */ if ((hostchkdata = (nebstruct_host_check_data *) data)) { host = find_host(hostchkdata->host_name); if(host->process_performance_data == 0) { break; } /* Do some Debuglog */ /* snprintf(temp_buffer, sizeof(temp_buffer) - 1, "npcdmod: DEBUG >>> %s\n", host->host_check_command); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; write_to_all_logs(temp_buffer, NSLOG_INFO_MESSAGE); */ if (hostchkdata->type == NEBTYPE_HOSTCHECK_PROCESSED && hostchkdata->perf_data != NULL) { snprintf(perfdatafile_template, sizeof(perfdatafile_template) - 1, "DATATYPE::HOSTPERFDATA\t" "TIMET::%d\t" "HOSTNAME::%s\t" "HOSTPERFDATA::%s\t" "HOSTCHECKCOMMAND::%s!%s\t" "HOSTSTATE::%d\t" "HOSTSTATETYPE::%d\n", (int)hostchkdata->timestamp.tv_sec, hostchkdata->host_name, hostchkdata->perf_data, hostchkdata->command_name, hostchkdata->command_args, hostchkdata->state, hostchkdata->state_type); perfdatafile_template[sizeof(perfdatafile_template) - 1] = '\x0'; fputs(perfdatafile_template, fp); } } break; case NEBCALLBACK_SERVICE_CHECK_DATA: /* an aggregated status data dump just started or ended... */ if ((srvchkdata = (nebstruct_service_check_data *) data)) { if (srvchkdata->type == NEBTYPE_SERVICECHECK_PROCESSED && srvchkdata->perf_data != NULL) { /* find the nagios service object for this service */ service = find_service(srvchkdata->host_name, srvchkdata->service_description); if(service->process_performance_data == 0) { break; } /* Do some Debuglog */ /* snprintf(temp_buffer, sizeof(temp_buffer) - 1, "npcdmod: DEBUG >>> %s\n", service->service_check_command); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; write_to_all_logs(temp_buffer, NSLOG_INFO_MESSAGE); */ snprintf(perfdatafile_template, sizeof(perfdatafile_template) - 1, "DATATYPE::SERVICEPERFDATA\t" "TIMET::%d\t" "HOSTNAME::%s\t" "SERVICEDESC::%s\t" "SERVICEPERFDATA::%s\t" "SERVICECHECKCOMMAND::%s\t" "SERVICESTATE::%d\t" "SERVICESTATETYPE::%d\n", (int)srvchkdata->timestamp.tv_sec, srvchkdata->host_name, srvchkdata->service_description, srvchkdata->perf_data, service->service_check_command, srvchkdata->state, srvchkdata->state_type); perfdatafile_template[sizeof(perfdatafile_template) - 1] = '\x0'; fputs(perfdatafile_template, fp); } } break; default: break; } return 0; } /****************************************************************************/ /* CONFIG FUNCTIONS */ /****************************************************************************/ /* process arguments that were passed to the module at startup */ int npcdmod_process_module_args(char *args) { char *ptr = NULL; char **arglist = NULL; char **newarglist = NULL; int argcount = 0; int memblocks = 64; int arg = 0; if (args == NULL) return OK; /* get all the var/val argument pairs */ /* allocate some memory */ if ((arglist = (char **) malloc(memblocks * sizeof(char **))) == NULL) return ERROR; /* process all args */ ptr = strtok(args, ","); while (ptr) { /* save the argument */ arglist[argcount++] = strdup(ptr); /* allocate more memory if needed */ if (!(argcount % memblocks)) { if ((newarglist = (char **) realloc(arglist, (argcount + memblocks) * sizeof(char **))) == NULL) { for (arg = 0; arg < argcount; arg++) free(arglist[argcount]); free(arglist); return ERROR; } else arglist = newarglist; } ptr = strtok(NULL, ","); } /* terminate the arg list */ arglist[argcount] = '\x0'; /* process each argument */ for (arg = 0; arg < argcount; arg++) { if (npcdmod_process_config_var(arglist[arg]) == ERROR) { for (arg = 0; arg < argcount; arg++) free(arglist[arg]); free(arglist); return ERROR; } } /* free allocated memory */ for (arg = 0; arg < argcount; arg++) free(arglist[arg]); free(arglist); return OK; } /* process all config vars in a file */ int npcdmod_process_config_file(char *filename) { pnp_mmapfile *thefile = NULL; char *buf = NULL; char temp_buffer[1024]; int result = OK; /* open the file */ if ((thefile = pnp_mmap_fopen(filename)) == NULL) { snprintf(temp_buffer, sizeof(temp_buffer) - 1, "npcdmod ERROR: failed to open %s\n", filename); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; write_to_all_logs(temp_buffer, NSLOG_INFO_MESSAGE); return ERROR; } else { snprintf(temp_buffer, sizeof(temp_buffer) - 1, "npcdmod: %s initialized\n", filename); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; write_to_all_logs(temp_buffer, NSLOG_INFO_MESSAGE); } /* process each line of the file */ while ((buf = pnp_mmap_fgets(thefile))) { /* skip comments */ if (buf[0] == '#') { free(buf); continue; } /* skip blank lines */ if (!strcmp(buf, "")) { free(buf); continue; } /* skip new lines */ if (!strcmp(buf, "\n")) { free(buf); continue; } /* process the variable */ result = npcdmod_process_config_var(buf); /* free memory */ free(buf); if (result != OK) break; } /* close the file */ pnp_mmap_fclose(thefile); return result; } /* process a single module config variable */ int npcdmod_process_config_var(char *arg) { char *var = NULL; char *val = NULL; /* split var/val */ var = strtok(arg, "="); val = strtok(NULL, "\n"); /* skip incomplete var/val pairs */ if (var == NULL || val == NULL) return OK; /* strip var/val */ strip(var); strip(val); /* process the variable... */ if (!strcmp(var, "config_file")) npcdmod_process_config_file(val); else if (!strcmp(var, "perfdata_spool_dir")) spool_dir = strdup(val); else if (!strcmp(var, "perfdata_file")) perfdata_file = strdup(val); else if (!strcmp(var, "perfdata_spool_filename")) perfdata_spool_filename = strdup(val); else if (!strcmp(var, "perfdata_file_processing_interval")) perfdata_file_processing_interval = strdup(val); else if (!strcmp(var, "user")) ; else if (!strcmp(var, "group")) ; else if (!strcmp(var, "log_type")) ; else if (!strcmp(var, "log_file")) ; else if (!strcmp(var, "max_logfile_size")) ; else if (!strcmp(var, "log_level")) ; else if (!strcmp(var, "perfdata_file_run_cmd")) ; else if (!strcmp(var, "perfdata_file_run_cmd_args")) ; else if (!strcmp(var, "identify_npcd")) ; else if (!strcmp(var, "npcd_max_threads")) ; else if (!strcmp(var, "sleep_time")) ; else if (!strcmp(var, "load_threshold")) ; else if (!strcmp(var, "pid_file")) ; else return ERROR; return OK; } /**************************************************************/ /****** MMAP()'ED FILE FUNCTIONS ******************************/ /**************************************************************/ /* open a file read-only via mmap() */ pnp_mmapfile *pnp_mmap_fopen(char *filename) { pnp_mmapfile *new_mmapfile; int fd; void *mmap_buf; struct stat statbuf; int mode = O_RDONLY; /* allocate memory */ if ((new_mmapfile = (pnp_mmapfile *) malloc(sizeof(pnp_mmapfile))) == NULL) return NULL; /* open the file */ if ((fd = open(filename, mode)) == -1) { free(new_mmapfile); return NULL; } /* get file info */ if ((fstat(fd, &statbuf)) == -1) { close(fd); free(new_mmapfile); return NULL; } /* mmap() the file */ if ((mmap_buf = (void *) mmap(0, statbuf.st_size, PROT_READ, MAP_PRIVATE, fd, 0)) == MAP_FAILED) { close(fd); free(new_mmapfile); return NULL; } /* populate struct info for later use */ /*new_mmapfile->path=strdup(filename);*/ new_mmapfile->path = NULL; new_mmapfile->fd = fd; new_mmapfile->file_size = (unsigned long) (statbuf.st_size); new_mmapfile->current_position = 0L; new_mmapfile->current_line = 0L; new_mmapfile->mmap_buf = mmap_buf; return new_mmapfile; } /* close a file originally opened via mmap() */ int pnp_mmap_fclose(pnp_mmapfile *temp_mmapfile) { if (temp_mmapfile == NULL) return ERROR; /* un-mmap() the file */ munmap(temp_mmapfile->mmap_buf, temp_mmapfile->file_size); /* close the file */ close(temp_mmapfile->fd); /* free memory */ if (temp_mmapfile->path != NULL) free(temp_mmapfile->path); free(temp_mmapfile); return OK; } /* gets one line of input from an mmap()'ed file */ char *pnp_mmap_fgets(pnp_mmapfile *temp_mmapfile) { char *buf = NULL; unsigned long x = 0L; int len = 0; if (temp_mmapfile == NULL) return NULL; /* we've reached the end of the file */ if (temp_mmapfile->current_position >= temp_mmapfile->file_size) return NULL; /* find the end of the string (or buffer) */ for (x = temp_mmapfile->current_position; x < temp_mmapfile->file_size; x++) { if (*((char *) (temp_mmapfile->mmap_buf) + x) == '\n') { x++; break; } } /* calculate length of line we just read */ len = (int) (x - temp_mmapfile->current_position); /* allocate memory for the new line */ if ((buf = (char *) malloc(len + 1)) == NULL) { write_to_all_logs("could not allocate a new buf", NSLOG_INFO_MESSAGE); return NULL; } /* copy string to newly allocated memory and terminate the string */ memcpy(buf, ((char *) (temp_mmapfile->mmap_buf) + temp_mmapfile->current_position), len); buf[len] = '\x0'; /* update the current position */ temp_mmapfile->current_position = x; /* increment the current line */ temp_mmapfile->current_line++; return buf; } pnp4nagios-0.6.16/src/Makefile.in0000664000000000000000000000576311662503006015234 0ustar rootroot############################ # Makefile for PNP # # Last Modified: 11-17-2008 ############################ # Source code directories SRC_INCLUDE=../include CC=@CC@ CFLAGS=@CFLAGS@ @DEFS@ -DNSCORE # Compiler flags for use with Valgrind #CFLAGS=-O0 -g -DHAVE_CONFIG_H -DNSCORE # Compiler flags for optimization (overrides default) #CFLAGS=-O3 -Wall -fno-strict-aliasing -Wshadow -Wpointer-arith -Wcast-qual -Wcast-align -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -DHAVE_CONFIG_H -DNSCORE # Compiler flags for optimization (complements default) #CFLAGS_WARN=-Wall -Wshadow -Wpointer-arith -Wcast-qual -Wcast-align -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs #CFLAGS_DEBUG=-ggdb3 -g3 #CFLAGS_GPROF=-pg #CFLAGS+=$(CFLAGS_WARN) $(CFLAGS_DEBUG) $(CFLAGS_GPROF) LDFLAGS=@LDFLAGS@ LIBS=@LIBS@ MOD_LDFLAGS=@MOD_LDFLAGS@ MOD_CFLAGS=@MOD_CFLAGS@ prefix=@prefix@ exec_prefix=@exec_prefix@ LOGDIR=@localstatedir@ CFGDIR=@sysconfdir@ BINDIR=@bindir@ LIBEXECDIR=@libexecdir@ LIBDIR=@libdir@ CGIDIR=@sbindir@ INSTALL=@INSTALL@ INSTALL_OPTS=@INSTALL_OPTS@ STRIP=@STRIP@ DATAROOTDIR=@datarootdir@ PERFDATA_DIR=@PERFDATA_DIR@ PERFDATA_SPOOL_DIR=@PERFDATA_SPOOL_DIR@ MATHLIBS=-lm CP=@CP@ OBJS=pnpsender.o npcd.o config.o NPCDOBJS=utils.o config.o logging.o NPCDHEAD=$(SRC_INCLUDE)/pnp.h $(SRC_INCLUDE)/config.h OBJDEPS= all: npcd npcdmod.o # Required Objects logging: logging.c $(NPCDHEAD) $(CC) $(CFLAGS) -o $@ logging.c config: config.c $(NPCDHEAD) $(CC) $(CFLAGS) -o $@ config.c utils: utils.c $(NPCDHEAD) $(CC) $(CFLAGS) -o $@ utils.c ############################### # # PNPSENDER # ############################### pnpsender: pnpsender.c $(CC) $(CFLAGS) -o $@ pnpsender.c ############################### # # NPCD # ############################### npcd: npcd.c $(NPCDOBJS) $(NPCDHEAD) $(CC) $(CFLAGS) -o $@ npcd.c $(NPCDOBJS) -lpthread ############################### # # NPCDMOD # ############################### npcdmod.o: npcdmod.c $(CC) $(MOD_CFLAGS) $(CFLAGS) -o npcdmod.o npcdmod.c $(MOD_LDFLAGS) $(LDFLAGS) $(LIBS) -fPIC ############################### # # Cleanups # ############################### clean: -rm -f pnpsender *.o -rm -f npcd *.o -rm -f *~ *.*~ distclean: clean -rm -f Makefile devclean: distclean ############################### # # Install # ################################ install: $(MAKE) install-basic $(MAKE) strip-post-install install-unstripped: $(MAKE) install-basic install-basic: $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(BINDIR) $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(LIBDIR) $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(LOGDIR) $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(PERFDATA_DIR) $(INSTALL) -m 775 $(INSTALL_OPTS) -d $(DESTDIR)$(PERFDATA_SPOOL_DIR) $(INSTALL) -m 754 $(INSTALL_OPTS) @npcd_name@ $(DESTDIR)$(BINDIR) $(INSTALL) -m 754 $(INSTALL_OPTS) npcdmod.o $(DESTDIR)$(LIBDIR) strip-post-install: $(STRIP) $(DESTDIR)$(BINDIR)/@npcd_name@ $(STRIP) $(DESTDIR)$(LIBDIR)/npcdmod.o pnp4nagios-0.6.16/src/config.c0000664000000000000000000003567611662503006014606 0ustar rootroot// Copyright (C) 2007-2009 Hendrik Baecker // Inspired by Ethan Galstad // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License version 2 as // published by the Free Software Foundation; // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include "../include/config.h" #include "../include/pnp.h" #include extern void pnp_strip(char *); extern char *macro_x[CONFIG_OPT_COUNT]; extern char *log_file, *log_type; extern char *command, *command_args, *user, *group, *directory, *pidfile; extern int daemon_mode; extern int sighup_detected; extern int use_syslog; extern int loglevel; extern int max_logfile_size; extern int max_threads; extern int use_load_threshold; extern int sleeptime; extern int identmyself; extern double load_threshold; void process_configfile(char *config_file) { FILE *fh_config_file = NULL; char current_config_line[MAX_BUFFER_SIZE]; char error_msg[MAX_BUFFER_SIZE]; char variable[MAX_VARIABLE_LENGTH]; char value[MAX_VALUE_LENGTH]; // char *input = NULL; char *temp; extern int loglevel; int error = FALSE; // int warning = FALSE; int line_number = 0; fh_config_file = fopen(config_file, (const char*) "r"); /* check if we can not open that file */ if (fh_config_file == NULL) { snprintf(error_msg, MAX_BUFFER_SIZE, "ERROR - Could not open config file - %s", strerror(errno)); error = TRUE; } /* ok - parsing the config file line by line */ else { while (feof(fh_config_file) == 0) { line_number++; temp = fgets(current_config_line, 1024, fh_config_file); temp = NULL; if (current_config_line == NULL) { printf("Error reading config\n"); exit(1); } if (current_config_line[0] == '#' || current_config_line[0] == '\n') continue; pnp_strip(current_config_line); temp = strtok(current_config_line, "="); pnp_strip(temp); /* if there is no variable name, return error */ if (temp == NULL) { strcpy(error_msg, "No variable found - exiting"); error = TRUE; break; } /* else the variable is good */ strncpy(variable, temp, sizeof(variable)); variable[sizeof(variable) - 1] = '\x0'; /* get the value */ temp = strtok(NULL, "\n"); pnp_strip(temp); /* if no value exists, return error */ if (temp == NULL) { strcpy(error_msg, "NULL value"); error = TRUE; break; } /* else the value is good */ strncpy(value, temp, sizeof(value)); value[sizeof(value) - 1] = '\x0'; pnp_strip(value); /* process the variable/value */ /* log_file directive */ if (!strcmp(variable, "log_file")) { if (strlen(value) > MAX_FILENAME_LENGTH - 1) { strcpy(error_msg, "Log file is too long"); error = TRUE; break; } if (log_file != NULL) free(log_file); log_file = (char *) strdup(value); pnp_strip(log_file); /* save the macro */ if (macro_x[CONFIG_OPT_LOGFILE] != NULL) free(macro_x[CONFIG_OPT_LOGFILE]); macro_x[CONFIG_OPT_LOGFILE] = (char *) strdup(log_file); if (macro_x[CONFIG_OPT_LOGFILE] == NULL) { strcpy(error_msg, "Could not allocate memory for macro logfile"); error = TRUE; break; } pnp_strip(macro_x[CONFIG_OPT_LOGFILE]); } /* log_file_size directive */ else if (!strcmp(variable, "max_logfile_size")) { if (strlen(value) == 1) { if (isdigit((int)value[strlen(value)-1]) == FALSE) { strcpy(error_msg, "log_file_size should be an integer"); error = TRUE; break; } } /* save the macro */ if (macro_x[CONFIG_OPT_LOGFILESIZE] != NULL) free(macro_x[CONFIG_OPT_LOGFILESIZE]); macro_x[CONFIG_OPT_LOGFILESIZE] = (char *) strdup(value); max_logfile_size = atoi(value); if (macro_x[CONFIG_OPT_LOGFILESIZE] == NULL) { strcpy(error_msg, "Could not allocate memory for macro logfilesize"); error = TRUE; break; } pnp_strip(macro_x[CONFIG_OPT_LOGFILESIZE]); } /* log_level directive */ else if (!strcmp(variable, "log_level")) { if (strlen(value) == 1) { if (isdigit((int)value[strlen(value)-1]) == FALSE) { strcpy(error_msg, "log_level should be an integer"); error = TRUE; break; } } /* save the macro */ if (macro_x[CONFIG_OPT_LOGLEVEL] != NULL) free(macro_x[CONFIG_OPT_LOGLEVEL]); macro_x[CONFIG_OPT_LOGLEVEL] = (char *) strdup(value); loglevel = atoi(value); if (macro_x[CONFIG_OPT_LOGLEVEL] == NULL) { strcpy(error_msg, "Could not allocate memory for macro loglevel"); error = TRUE; break; } pnp_strip(macro_x[CONFIG_OPT_LOGLEVEL]); } /* log_type directive */ else if (!strcmp(variable, "log_type")) { if (log_type != NULL) free(log_type); log_type = (char *) strdup(value); pnp_strip(log_type); /* save the macro */ if (macro_x[CONFIG_OPT_LOGTYPE] != NULL) free(macro_x[CONFIG_OPT_LOGTYPE]); macro_x[CONFIG_OPT_LOGTYPE] = (char *) strdup(log_type); if (macro_x[CONFIG_OPT_LOGTYPE] == NULL) { strcpy(error_msg, "Could not allocate memory for macro log_type"); error = TRUE; break; } pnp_strip(macro_x[CONFIG_OPT_LOGTYPE]); if (strcmp(macro_x[CONFIG_OPT_LOGTYPE], "syslog") == 0) use_syslog = TRUE; else if (strcmp(macro_x[CONFIG_OPT_LOGTYPE], "file") == 0) use_syslog = FALSE; else { strcpy(error_msg, "Please define \"syslog\" or \"file\" as log_type!"); error = TRUE; break; } } else if (!strcmp(variable, "perfdata_spool_dir")) { if (strlen(value) > MAX_FILENAME_LENGTH - 1) { strcpy(error_msg, "Perfdata Spool Path is too long"); error = TRUE; break; } /* save the macro */ if (macro_x[CONFIG_OPT_SCANDIR] != NULL) free(macro_x[CONFIG_OPT_SCANDIR]); macro_x[CONFIG_OPT_SCANDIR] = (char *) strdup(value); if (macro_x[CONFIG_OPT_SCANDIR] == NULL) { strcpy(error_msg, "Could not allocate memory for macro Scandir"); error = TRUE; break; } pnp_strip(macro_x[CONFIG_OPT_LOGFILE]); } else if (!strcmp(variable, "perfdata_file")) ; else if (!strcmp(variable, "perfdata_spool_filename")) ; else if (!strcmp(variable, "perfdata_file_processing_interval")) ; else if (!strcmp(variable, "user")) { /* save the macro */ if (macro_x[CONFIG_OPT_USER] != NULL) free(macro_x[CONFIG_OPT_USER]); macro_x[CONFIG_OPT_USER] = (char *) strdup(value); if (macro_x[CONFIG_OPT_USER] == NULL) { strcpy(error_msg, "Could not allocate memory for macro user"); error = TRUE; break; } pnp_strip(macro_x[CONFIG_OPT_USER]); } else if (!strcmp(variable, "group")) { /* save the macro */ if (macro_x[CONFIG_OPT_GROUP] != NULL) free(macro_x[CONFIG_OPT_GROUP]); macro_x[CONFIG_OPT_GROUP] = (char *) strdup(value); if (macro_x[CONFIG_OPT_GROUP] == NULL) { strcpy(error_msg, "Could not allocate memory for macro group"); error = TRUE; break; } pnp_strip(macro_x[CONFIG_OPT_GROUP]); } else if (!strcmp(variable, "perfdata_file_run_cmd")) { /* save the macro */ if (macro_x[CONFIG_OPT_RUNCMD] != NULL) free(macro_x[CONFIG_OPT_RUNCMD]); macro_x[CONFIG_OPT_RUNCMD] = (char *) strdup(value); if (macro_x[CONFIG_OPT_RUNCMD] == NULL) { strcpy(error_msg, "Could not allocate memory for macro runcmd"); error = TRUE; break; } pnp_strip(macro_x[CONFIG_OPT_RUNCMD]); } else if (!strcmp(variable, "perfdata_file_run_cmd_args")) { /* save the macro */ if (macro_x[CONFIG_OPT_RUNCMD_ARG] != NULL) free(macro_x[CONFIG_OPT_RUNCMD_ARG]); macro_x[CONFIG_OPT_RUNCMD_ARG] = (char *) strdup(value); if (macro_x[CONFIG_OPT_RUNCMD_ARG] == NULL) { strcpy(error_msg, "Could not allocate memory for macro runcmd_arg"); error = TRUE; break; } pnp_strip(macro_x[CONFIG_OPT_RUNCMD_ARG]); } else if (!strcmp(variable, "npcd_max_threads")) { if (strlen(value) == 1) { if (isdigit((int)value[strlen(value)-1]) == FALSE) { strcpy(error_msg, "npcd_max_threads should be an integer"); error = TRUE; break; } } /* save the macro */ if (macro_x[CONFIG_OPT_MAXTHREADS] != NULL) free(macro_x[CONFIG_OPT_MAXTHREADS]); macro_x[CONFIG_OPT_MAXTHREADS] = (char *) strdup(value); if (macro_x[CONFIG_OPT_MAXTHREADS] == NULL) { strcpy(error_msg, "Could not allocate memory for macro MAXTHREADS"); error = TRUE; break; } pnp_strip(macro_x[CONFIG_OPT_MAXTHREADS]); } else if (!strcmp(variable, "use_load_threshold")) { strcpy(error_msg, "The option 'use_load_threshold' is obsolete."); printf( "An Warning occured while reading your config on line %d. Message was: \"%s\"\n", line_number, error_msg); } else if (!strcmp(variable, "load_threshold")) { /* save the macro */ if (macro_x[CONFIG_OPT_LOAD] != NULL) free(macro_x[CONFIG_OPT_LOAD]); macro_x[CONFIG_OPT_LOAD] = (char *) strdup(value); if (macro_x[CONFIG_OPT_LOAD] == NULL) { strcpy(error_msg, "Could not allocate memory for macro LOAD"); error = TRUE; break; } pnp_strip(macro_x[CONFIG_OPT_LOAD]); } else if (!strcmp(variable, "pid_file")) { FILE *fppid; /* save the macro */ if (macro_x[CONFIG_OPT_PIDFILE] != NULL) free(macro_x[CONFIG_OPT_PIDFILE]); macro_x[CONFIG_OPT_PIDFILE] = (char *) strdup(value); if (macro_x[CONFIG_OPT_PIDFILE] == NULL) { strcpy(error_msg, "Could not allocate memory for macro PIDFILE"); error = TRUE; break; } pnp_strip(macro_x[CONFIG_OPT_PIDFILE]); if (daemon_mode == TRUE && sighup_detected == FALSE) { fppid = fopen(macro_x[CONFIG_OPT_PIDFILE], "w"); if (fppid == NULL) { snprintf(error_msg, sizeof(error_msg), "Could not open pidfile '%s': %s", macro_x[CONFIG_OPT_PIDFILE], strerror(errno)); error = TRUE; } else { fclose(fppid); } } } else if (!strcmp(variable, "sleep_time")) { if (strlen(value) == 1) { if (isdigit((int)value[strlen(value)-1]) == FALSE) { strcpy(error_msg, "sleep_time should be an integer"); error = TRUE; break; } } /* save the macro */ if (macro_x[CONFIG_OPT_SLEEPTIME] != NULL) free(macro_x[CONFIG_OPT_SLEEPTIME]); macro_x[CONFIG_OPT_SLEEPTIME] = (char *) strdup(value); if (macro_x[CONFIG_OPT_MAXTHREADS] == NULL) { strcpy(error_msg, "Could not allocate memory for macro SLEEPTIME"); error = TRUE; break; } pnp_strip(macro_x[CONFIG_OPT_SLEEPTIME]); } else if (!strcmp(variable, "identify_npcd")) { if (strlen(value) == 1) { if (isdigit((int)value[strlen(value)-1]) == FALSE) { strcpy(error_msg, "identify_npcd should be an integer"); error = TRUE; break; } } /* save the macro */ if (macro_x[CONFIG_OPT_IDENTMYSELF] != NULL) free(macro_x[CONFIG_OPT_IDENTMYSELF]); macro_x[CONFIG_OPT_IDENTMYSELF] = (char *) strdup(value); if (macro_x[CONFIG_OPT_IDENTMYSELF] == NULL) { strcpy(error_msg, "Could not allocate memory for macro IDENTMYSELF"); error = TRUE; break; } pnp_strip(macro_x[CONFIG_OPT_IDENTMYSELF]); } else { strcpy(error_msg, "There is a config directive that I don't know"); error = TRUE; break; } } } if (fh_config_file != NULL) fclose(fh_config_file); if (error) { printf( "An Error occured while reading your config on line %d\nMessage was: \"%s\"\n", line_number, error_msg); exit(EXIT_FAILURE); } } /************************************ * * check if we have all we need * * **********************************/ int check_needed_config_options() { /* Needed config options are: * logtype * if syslog: ignore logfile * if file: logfile is needed * command * if command args: command is needed */ char error_msg[MAX_BUFFER_SIZE]; int error = FALSE; int warning = FALSE; if (macro_x[CONFIG_OPT_LOGTYPE] == NULL) { strcpy(error_msg, "You have to define a logtype."); error = TRUE; } else if ((strcmp(macro_x[CONFIG_OPT_LOGTYPE], "file") == 0) && (macro_x[CONFIG_OPT_LOGFILE] == NULL)) { strcpy(error_msg, "You have to define a logfile if you wish to use a file for logging."); error = TRUE; } else if (macro_x[CONFIG_OPT_RUNCMD_ARG] != NULL && macro_x[CONFIG_OPT_RUNCMD] == NULL) { strcpy(error_msg, "There should no argument to no command."); error = TRUE; } else if (macro_x[CONFIG_OPT_RUNCMD] == NULL) { strcpy(error_msg, "There is nothing I can do - please give me a 'perfdata_file_run_cmd'."); error = TRUE; } else if (macro_x[CONFIG_OPT_SCANDIR] == NULL) { strcpy(error_msg, "You should define a performance data spool directory."); warning = TRUE; } if (error) { printf("ERROR - %s\n", error_msg); return ERROR; } else if (warning) { printf("WARNING - %s\n", error_msg); return OK; } else return OK; } /* Prepare config file variables to program vars */ int prepare_vars() { if (macro_x[CONFIG_OPT_MAXTHREADS] != NULL) { max_threads = atoi(macro_x[CONFIG_OPT_MAXTHREADS]); } else max_threads = 5; if (macro_x[CONFIG_OPT_LOAD] != NULL) { load_threshold = strtod(macro_x[CONFIG_OPT_LOAD], NULL); if (load_threshold != 0.0) use_load_threshold = TRUE; } else { load_threshold = 0.0; use_load_threshold = FALSE; } if (macro_x[CONFIG_OPT_RUNCMD] != NULL) { command = macro_x[CONFIG_OPT_RUNCMD]; } if (macro_x[CONFIG_OPT_RUNCMD_ARG] != NULL) { command_args = macro_x[CONFIG_OPT_RUNCMD_ARG]; } if (macro_x[CONFIG_OPT_USER] != NULL) { user = macro_x[CONFIG_OPT_USER]; } else user = "nagios"; if (macro_x[CONFIG_OPT_GROUP] != NULL) { group = macro_x[CONFIG_OPT_GROUP]; } else group = "nagios"; if (macro_x[CONFIG_OPT_SCANDIR] != NULL) { directory = macro_x[CONFIG_OPT_SCANDIR]; } else { directory = "/usr/local/nagios/var/spool/perfdata/"; printf( "WARNING - Adapting a hardcoded default perfdata spooldir - '%s'\n", directory); } if (macro_x[CONFIG_OPT_PIDFILE] != NULL) { pidfile = macro_x[CONFIG_OPT_PIDFILE]; } else pidfile = "/var/run/npcd.pid"; if (macro_x[CONFIG_OPT_LOGLEVEL] != NULL) { loglevel = atoi(macro_x[CONFIG_OPT_LOGLEVEL]); } else loglevel = 0; if (macro_x[CONFIG_OPT_SLEEPTIME] != NULL) { sleeptime = atoi(macro_x[CONFIG_OPT_SLEEPTIME]); } else sleeptime = 15; if (macro_x[CONFIG_OPT_IDENTMYSELF] != NULL) { identmyself = atoi(macro_x[CONFIG_OPT_IDENTMYSELF]); } else identmyself = TRUE; return OK; } pnp4nagios-0.6.16/src/module/0000775000000000000000000000000011662503006014441 5ustar rootrootpnp4nagios-0.6.16/src/module/modpnpsender.c0000664000000000000000000002207411662503006017310 0ustar rootroot/***************************************************************************** * * modpnpsender.c - NEB Module for sending PNP performance data * * Copyright (c) 2007-2009 Hendrik Baecker (http://www.process-zero.de) * * Last Modified: $LastChangedDate: 2009-01-07 19:53:58 +0100 (Wed, 07 Jan 2009) $ * by: $Author: hendrikb $ * * * Description: * * Will follow soon.... * * * Instructions: * * Compile with the following command: * * gcc -shared -o modpnpsender.o modpnpsender.c * *****************************************************************************/ /* include (minimum required) event broker header files */ #include "../include/nebmodules.h" #include "../include/nebcallbacks.h" /* include other event broker header files that we need for our work */ #include "../include/nebstructs.h" #include "../include/broker.h" /* include some Nagios stuff as well */ #include "../include/config.h" #include "../include/common.h" #include "../include/nagios.h" #include #include #include #include #define OPEN 1 #define CLOSE 0 #define BUFFER 1024 /* specify event broker API version (required) */ NEB_API_VERSION(CURRENT_NEB_API_VERSION); #define DEFAULT_SERVERPORT 5661 void *modpnpsender_module_handle=NULL; int modpnpsender_handle_data(int,void *); int send_data(nebstruct_service_check_data *); int open_sock(); char *serverip="127.0.0.1"; char *port, *saveptr1; int serverport=DEFAULT_SERVERPORT; int socket_status=CLOSE; /* this function gets called when the module is loaded by the event broker */ int nebmodule_init(int flags, char *args, nebmodule *handle){ char temp_buffer[1024]; time_t current_time; unsigned long interval; /* save our handle */ modpnpsender_module_handle=handle; /* log module info to the Nagios log file */ write_to_all_logs("modpnpsender: Copyright (c)2007 Hendrik Baecker (andurin@process-zero.de)",NSLOG_INFO_MESSAGE); /* log a message to the Nagios log file */ snprintf(temp_buffer,sizeof(temp_buffer)-1,"modpnpsender: PNPSender module starting the engines!\n"); temp_buffer[sizeof(temp_buffer)-1]='\x0'; write_to_all_logs(temp_buffer,NSLOG_INFO_MESSAGE); if(args == NULL) { write_to_all_logs("modpnpsender: WARNING assuming '127.0.0.1' as destination IP Address)",NSLOG_INFO_MESSAGE); } else { if((serverip = strtok_r(args, " ", &saveptr1))!=NULL){ serverip = serverip; } if((port = strtok_r(NULL, " ", &saveptr1))!=NULL){ serverport=atoi(port); } } snprintf(temp_buffer,sizeof(temp_buffer)-1,"modpnpsender: Arguments are %s - %d",serverip,serverport); temp_buffer[sizeof(temp_buffer)-1]='\x0'; write_to_all_logs(temp_buffer,NSLOG_INFO_MESSAGE); /* register to be notified of certain events... */ neb_register_callback(NEBCALLBACK_SERVICE_CHECK_DATA,modpnpsender_module_handle,0,modpnpsender_handle_data); return 0; } /* this function gets called when the module is unloaded by the event broker */ int nebmodule_deinit(int flags, int reason){ char temp_buffer[1024]; /* deregister for all events we previously registered for... */ neb_deregister_callback(NEBCALLBACK_SERVICE_CHECK_DATA,modpnpsender_handle_data); /* log a message to the Nagios log file */ snprintf(temp_buffer,sizeof(temp_buffer)-1,"modpnpsender: Exiting - Thanks for for the flight!\n"); temp_buffer[sizeof(temp_buffer)-1]='\x0'; write_to_all_logs(temp_buffer,NSLOG_INFO_MESSAGE); return 0; } /* handle data from Nagios daemon */ int modpnpsender_handle_data(int event_type, void *data){ nebstruct_service_check_data *scdata=NULL; char temp_buffer[1024]; /* what type of event/data do we have? */ switch(event_type){ case NEBCALLBACK_SERVICE_CHECK_DATA: /* a service check event occurs */ if((scdata=(nebstruct_service_check_data *)data)!=NULL){ if (scdata->type==NEBTYPE_SERVICECHECK_INITIATE) { /* Check if this service check has performance data */ if (scdata->perf_data != NULL) { snprintf(temp_buffer,sizeof(temp_buffer)-1,"modpnpsender: Processing PNP for %s / %s with perfdata %s",scdata->host_name,scdata->service_description,scdata->perf_data); temp_buffer[sizeof(temp_buffer)-1]='\x0'; write_to_all_logs(temp_buffer,NSLOG_INFO_MESSAGE); if(send_data(scdata)!=0) { write_to_all_logs("modpnpsender: An error occured while sending data!",NSLOG_INFO_MESSAGE); } else { write_to_all_logs("modpnpsender: Message sent - finish for now.",NSLOG_INFO_MESSAGE); return 0; } } } } break; default: break; } return 0; } /********************************************* * * Sending Data * * *******************************************/ int send_data(nebstruct_service_check_data *data){ char temp_buffer[1024]; char *message; int socket; int message_length = 1024; char cmd[1024]; time_t t; if (socket_status == CLOSE) { socket = open_sock(); if (socket == -1) { write_to_all_logs("modpnpsender: Arg! Socket is -1",NSLOG_INFO_MESSAGE); return (-1); } } if (!(message = (char *) malloc(message_length))) { snprintf(temp_buffer,sizeof(temp_buffer)-1,"modpnpsender: cannot allocate memory for message. Aborting...\n"); temp_buffer[sizeof(temp_buffer)-1]='\x0'; write_to_all_logs(temp_buffer,NSLOG_INFO_MESSAGE); return (-1); } bzero((void *)message, message_length); strcat(message,"\n"); strcat(message,"\nserviceperfdata\n"); strcat(message,""); strcat(message,data->host_name); strcat(message,"\n"); strcat(message,""); strcat(message,data->service_description); strcat(message,"\n"); strcat(message,""); strcat(message,data->perf_data); strcat(message,"\n"); strcat(message,""); if (data->command_name != NULL) { strcat(message,data->command_name); } strcat(message,"\n"); strcat(message,""); if (data->command_args != NULL) strcat(message,data->command_args); strcat(message,"\n"); strcat(message,""); if (data->command_line != NULL) strcat(message,data->command_line); strcat(message,"\n"); strcat(message,""); if (data->output != NULL) strcat(message,data->output); strcat(message,"\n"); time(&t); snprintf(temp_buffer, sizeof(temp_buffer)-1,"%ld",t); temp_buffer[sizeof(temp_buffer)-1]='\x0'; strcat(message,""); strcat(message, temp_buffer); strcat(message,"\n"); bzero((void *)temp_buffer,sizeof(temp_buffer)-1); strcat(message,"\n"); if(send(socket, message, strlen(message), 0) == -1) { snprintf(temp_buffer,sizeof(temp_buffer)-1,"modpnpsender: error while sending message to server. - %s\n",strerror(errno)); temp_buffer[sizeof(temp_buffer)-1]='\x0'; write_to_all_logs(temp_buffer,NSLOG_INFO_MESSAGE); } close (socket); socket_status = CLOSE; snprintf(temp_buffer,sizeof(temp_buffer)-1,"modpnpsender: Sending perfdata for %s / %s with perfdata %s",data->host_name,data->service_description,data->perf_data); temp_buffer[sizeof(temp_buffer)-1]='\x0'; write_to_all_logs(temp_buffer,NSLOG_INFO_MESSAGE); return 0; } int open_sock(){ int tosocket; /* the socket descriptor*/ char temp_buffer[BUFFER]; /* description of struct sockaddr_in is mentioned in netinet/in.h */ struct sockaddr_in toaddr; /* store address of server here */ /* create tcp socket */ tosocket = socket(PF_INET,SOCK_STREAM,0); if(tosocket == -1){ snprintf(temp_buffer,sizeof(temp_buffer)-1,"modpnpsender: Unable to create socket. Aborting...\n"); temp_buffer[sizeof(temp_buffer)-1]='\x0'; write_to_all_logs(temp_buffer,NSLOG_INFO_MESSAGE); return(-1); } /* else { snprintf(temp_buffer,sizeof(temp_buffer)-1,"modpnpsender: Socket is OK....\n"); temp_buffer[sizeof(temp_buffer)-1]='\x0'; write_to_all_logs(temp_buffer,NSLOG_INFO_MESSAGE); } */ /* define server address */ toaddr.sin_family = PF_INET; toaddr.sin_addr.s_addr = inet_addr(serverip); toaddr.sin_port = htons(serverport); /* connect to server */ if(connect(tosocket, (struct sockaddr *)&toaddr, sizeof(toaddr)) == -1){ snprintf(temp_buffer,sizeof(temp_buffer)-1,"modpnpsender: Unable to connect to server '%s' on port %d. Aborting...\n", serverip, serverport); temp_buffer[sizeof(temp_buffer)-1]='\x0'; write_to_all_logs(temp_buffer,NSLOG_INFO_MESSAGE); // write_to_all_logs("modpnpsender: Connect failed... closing the socket...",NSLOG_INFO_MESSAGE); close (tosocket); // write_to_all_logs("modpnpsender: Socket closed...",NSLOG_INFO_MESSAGE); return(-1); } else { socket_status=OPEN; return tosocket; } return (-1); } pnp4nagios-0.6.16/src/npcd.c0000664000000000000000000003650011662503006014250 0ustar rootroot/* Copyright (C) 2007-2009 Hendrik Baecker * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation; * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "../include/config.h" #include "../include/pnp.h" typedef void (*sighandler_t)(int); void *processfile(void *); static void *exit_handler_mem(void *); extern int process_arguments(int, char **); extern void process_configfile(char *); extern void check_sig(int); extern int prepare_vars(void); extern int drop_privileges(char *, char *); extern sighandler_t handle_signal(int, sighandler_t); extern int is_file(const struct dirent *d); extern int check_needed_config_options(); double getload(int); static int thread_counter = 0; int max_threads = 5; int daemon_mode = FALSE; int use_syslog = TRUE; int loglevel = 0; int max_logfile_size = 10485760; /* default 10Mbyte */ int use_load_threshold = FALSE; int we_should_stop = FALSE; int sleeptime = 15; int identmyself = TRUE; double load_threshold = 10.0; extern int sighup_detected; char *command, *command_args, *user, *group, *pidfile; char *macro_x[CONFIG_OPT_COUNT]; char *log_file, *log_type; char *config_file = NULL; const char *directory = NULL; const char progname[5] = "npcd"; static void start_daemon(const char *log_name, int facility) { int i; pid_t pid; /* Kill parent after for to get a waise */ if ((pid = fork()) != 0) exit(EXIT_SUCCESS); /* Get this waise to sessionleader */ if (setsid() < 0) { printf("%s could not get sessionleader\n", log_name); exit(EXIT_FAILURE); } /* Ignore SIGHUP */ handle_signal(SIGHUP, SIG_IGN); /* terminate child */ if ((pid = fork()) != 0) exit(EXIT_SUCCESS); /* for core dump handling and better unmounting behavior */ /* Its return should not be ignored. * npcd.c:79: warning: ignoring return value of ‘chdir’ */ if (chdir("/") != 0) exit(EXIT_FAILURE); /* change umask to defined value - be independet from parent umask */ umask(002); /* close all possible file handles */ for (i = sysconf(_SC_OPEN_MAX); i > 0; i--) close(i); /* to hear the daemon you are calling... use syslog */ if (use_syslog == TRUE && log_name != NULL) openlog(log_name, LOG_PID | LOG_CONS | LOG_NDELAY, facility); /* close existing stdin, stdout, stderr */ close(0); close(1); close(2); /* re-open stdin, stdout, stderr with known values */ open("/dev/null",O_RDONLY); open("/dev/null",O_WRONLY); open("/dev/null",O_WRONLY); } int main(int argc, char **argv) { int i = 0; int filecounter = 0, pthread_ret = 0; double load; char buffer[MAX_LOGMESSAGE_SIZE]; FILE *fppid = NULL; struct dirent **namelist; load = 0.0; if (process_arguments(argc, argv) == EXIT_FAILURE) exit(EXIT_FAILURE); process_configfile(config_file); if (loglevel == -1) { printf("DEBUG: Config File = %s\n", config_file); printf("CONFIG_OPT_LOGTYPE = %s\n", macro_x[CONFIG_OPT_LOGTYPE]); printf("CONFIG_OPT_LOGFILE = %s\n", macro_x[CONFIG_OPT_LOGFILE]); printf("CONFIG_OPT_LOGFILESIZE = %s\n", macro_x[CONFIG_OPT_LOGFILESIZE]); printf("CONFIG_OPT_LOGLEVEL = %s\n", macro_x[CONFIG_OPT_LOGLEVEL]); printf("CONFIG_OPT_SCANDIR = %s\n", macro_x[CONFIG_OPT_SCANDIR]); printf("CONFIG_OPT_RUNCMD = %s\n", macro_x[CONFIG_OPT_RUNCMD]); printf("CONFIG_OPT_RUNCMD_ARG = %s\n", macro_x[CONFIG_OPT_RUNCMD_ARG]); printf("CONFIG_OPT_MAXTHREADS = %s\n", macro_x[CONFIG_OPT_MAXTHREADS]); printf("CONFIG_OPT_LOAD = %s\n", macro_x[CONFIG_OPT_LOAD]); printf("CONFIG_OPT_USER = %s\n", macro_x[CONFIG_OPT_USER]); printf("CONFIG_OPT_GROUP = %s\n", macro_x[CONFIG_OPT_GROUP]); printf("CONFIG_OPT_PIDFILE = %s\n", macro_x[CONFIG_OPT_PIDFILE]); printf("CONFIG_OPT_SLEEPTIME = %s\n", macro_x[CONFIG_OPT_SLEEPTIME]); printf("CONFIG_OPT_IDENTMYSELF = %s\n", macro_x[CONFIG_OPT_IDENTMYSELF]); printf("---------------------------\n"); if (check_needed_config_options() != 0) { printf("There is an Error! Exiting...\n"); exit(EXIT_FAILURE); } } if (prepare_vars() != 0) exit(EXIT_FAILURE); if (loglevel == -1) printf("DEBUG: load_threshold is %s - ('%f')\n", use_load_threshold ? "enabled" : "disabled", load_threshold); pthread_t th[max_threads]; for (i=0;i load_threshold)) { snprintf(buffer, sizeof(buffer) - 1, "WARN: MAX load reached: load %f/%f at i=%d", load, load_threshold, i); LOG(0, buffer); if (i > 0) i--; sleep(sleeptime); continue; } #endif snprintf(buffer, sizeof(buffer) - 1, "ThreadCounter %d/%d File is %s\n", thread_counter, max_threads, namelist[i]->d_name); LOG(2, buffer); struct stat attribute; if (stat(namelist[i]->d_name, &attribute) == -1) { LOG(0, "Error while getting file status"); break; } if (strstr((namelist[i]->d_name), "-PID-") != NULL) { snprintf( buffer, sizeof(buffer) - 1, "File '%s' is an already in process PNP file. Leaving it untouched.\n", namelist[i]->d_name); LOG(1, buffer); continue; } if (S_ISREG(attribute.st_mode)) { snprintf(buffer, sizeof(buffer) - 1, "Regular File: %s\n", namelist[i]->d_name); LOG(2, buffer); /* only start new threads if the max_thread config option is not reached */ if (thread_counter < max_threads && we_should_stop == FALSE) { if ((pthread_ret = pthread_create(&th[thread_counter], NULL, processfile, namelist[i]->d_name)) != 0) { snprintf(buffer, sizeof(buffer) - 1, "Could not create thread... exiting with error '%s'\n", strerror(errno)); LOG(0, buffer); exit(EXIT_FAILURE); } snprintf(buffer, sizeof(buffer) - 1, "A thread was started on thread_counter = %d\n", thread_counter); LOG(2, buffer); thread_counter++; } else if (we_should_stop == TRUE) break; else { snprintf( buffer, sizeof(buffer) - 1, "WARN: MAX Thread reached: %s comes later with ThreadCounter: %d\n", namelist[i]->d_name, thread_counter); LOG(2, buffer); i--; for (thread_counter = thread_counter; thread_counter > 0; thread_counter--) { snprintf(buffer, sizeof(buffer) - 1, "DEBUG: Will wait for th['%d']\n", thread_counter - 1); LOG(2, buffer); pthread_join(th[thread_counter - 1], NULL); } } } } if (thread_counter > 0) { /* Wait for open threads before working on the next run */ snprintf(buffer, sizeof(buffer) - 1, "Have to wait: Filecounter = %d - thread_counter = %d\n", filecounter - 2, thread_counter); LOG(2, buffer); for (thread_counter = thread_counter; thread_counter > 0; thread_counter--) pthread_join(th[thread_counter - 1], NULL); } if (we_should_stop == TRUE) break; for (i = 0, namelist; i < filecounter; i++) { free(namelist[i]); } free(namelist); snprintf(buffer, sizeof(buffer) - 1, "No more files to process... waiting for %d seconds\n", sleeptime); LOG(1, buffer); sleep(sleeptime); } snprintf(buffer, sizeof(buffer) - 1, "Daemon ended. PID was '%d'\n", getpid()); LOG(0, buffer); if (use_syslog) closelog(); return EXIT_SUCCESS; } /* ************************************************************** * * Function to parse and check the commandline arguments * * *************************************************************/ int process_arguments(int argc, char **argv) { int c; int error = FALSE; int display_license = FALSE; int display_help = FALSE; #ifdef HAVE_GETOPT_H int option_index = 0; static struct option long_options[] = { { "help", no_argument, 0, 'h' }, { "version", no_argument, 0, 'V' }, { "license", no_argument, 0, 'V' }, { "daemon", no_argument, 0, 'd' }, { "config", required_argument, 0, 'f' }, { 0, 0, 0, 0 } }; #endif /* make sure we have the correct number of command line arguments */ if (argc < 2) error = TRUE; while (1) { #ifdef HAVE_GETOPT_H c = getopt_long(argc, argv, "+hVdf:", long_options, &option_index); #else c = getopt(argc, argv, "+hVdf:"); #endif if (c == -1 || c == EOF) break; switch (c) { case '?': /* usage */ case 'h': display_help = TRUE; break; case 'V': /* version */ printf("%s %s - $Revision: 637 $\n\n", progname, PACKAGE_VERSION); display_license = TRUE; break; case 'd': /* run in daemon mode */ daemon_mode = TRUE; break; case 'f': /* config file */ if (optarg != NULL) config_file = optarg; break; default: break; } } if (display_license == TRUE) { printf( "This program is free software; you can redistribute it and/or modify\n"); printf( "it under the terms of the GNU General Public License version 2 as\n"); printf("published by the Free Software Foundation.\n\n"); printf( "This program is distributed in the hope that it will be useful,\n"); printf( "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"); printf( "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"); printf("GNU General Public License for more details.\n\n"); printf( "You should have received a copy of the GNU General Public License\n"); printf("along with this program; if not, write to the Free Software\n"); printf( "Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\n"); exit(EXIT_SUCCESS); } /* if there are no command line options (or if we encountered an error), print usage */ if (error == TRUE || display_help == TRUE) { printf("\nUsage: %s -f [-d] \n", argv[0]); printf("\n"); printf("Options:\n"); printf("\n"); printf(" -d | --daemon \n"); printf("\t\tRun as daemon in background\n"); printf("\n"); printf(" -f | --config \n"); printf("\t\tPath to config file\n"); printf("\n"); printf( "Visit the Website at http://sourceforge.net/projects/pnp4nagios/ for bug fixes, \n"); printf("new releases, online documentation, FAQs, Mailinglists.\n"); printf("\n"); exit(EXIT_FAILURE); } return EXIT_SUCCESS; } /******************************************************************** * * * processfile - this is the function for each thread * * * ********************************************************************/ void * processfile(void *filename) { char *file = (char *) filename; char command_line[MAX_COMMANDLINE_LENGTH]; char buffer[MAX_LOGMESSAGE_SIZE]; int result; FILE *proc; /* npcd.c:493: warning: ‘result’ may be used uninitialized in this function */ result = 0; snprintf(command_line, sizeof(command_line), "%s %s %s %s/%s", command, identmyself ? "-n" : "\b", command_args, directory, file); pthread_cleanup_push((void *) &exit_handler_mem, file); snprintf(buffer, sizeof(buffer) - 1, "Processing file %s with ID %ld - going to exec %s\n", file, pthread_self(), command_line); LOG(2, buffer); snprintf(buffer, sizeof(buffer) - 1, "Processing file '%s'\n", file); LOG(1, buffer); if ((proc = popen(command_line, "r")) != NULL) result = pclose(proc); result >>= 8; if (result != 0) { snprintf(buffer, sizeof(buffer) - 1, "ERROR: Executed command exits with return code '%d'\n", result); LOG(0, buffer); snprintf(buffer, sizeof(buffer) - 1, "ERROR: Command line was '%s'\n", command_line); LOG(0, buffer); we_should_stop = FALSE; } if (loglevel == -1) sleep(2); pthread_cleanup_pop(1); pthread_exit((void *) pthread_self()); } /* ****************************************************************** * * * processfile - this is the function for each thread * * * * ******************************************************************/ static void *exit_handler_mem(void * arg) { // syslog( LOG_NOTICE, "Will now clean up thread %ld\n",pthread_self()); //if (thread_counter > 0) //thread_counter--; return 0; } #ifdef HAVE_GETLOADAVG double getload(int which_sample) { double loadavg[3]; char buffer[MAX_LOGMESSAGE_SIZE]; if (which_sample == 1) { which_sample = 0; } else if (which_sample == 5) { which_sample = 1; } else if (which_sample == 15) { which_sample = 2; } else { snprintf(buffer, sizeof(buffer) - 1, "Invalid load sample %d - allowed is 1,5,15\n", which_sample); LOG(0, buffer); return -1; } getloadavg(loadavg, 3); return loadavg[which_sample]; } #endif pnp4nagios-0.6.16/src/pnpsender.c0000664000000000000000000002345011662503006015322 0ustar rootroot// Copyright (C) 2006-2009 Hendrik Baecker // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License version 2 as // published by the Free Software Foundation; // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include "../include/config.h" #include #include #include #include #include #include #ifdef HAVE_GETOPT_H #include #endif #include #include #include #include #define BUFFER_SIZE 255 #define DEFAULT_SERVERPORT 5661 /* Ein Port der auch von 'gewhnlichen' Benutzern verwendet werden darf */ #define MSG_SIZE 8192 /* Die maximale Anzahl an Zeichen, die 'msg' enhalten darf */ #define OPEN 1 #define CLOSE 0 #define TRUE 1 #define FALSE 0 #define OK 0 #define ERROR -1 struct Nagios_Env { char varname[128]; char varvalue[128]; struct Nagios_Env *next; }; /* function prototypes */ void print_list(int, struct Nagios_Env *); int parse_env(char *, struct Nagios_Env **); int process_env(char *[]); int open_sock(); int process_arguments(int, char **); void timeout_sighandler(int); /* variable declaration*/ pid_t fork(void); int socket_status = CLOSE; int serverport = DEFAULT_SERVERPORT; int timeout = 10; /* Default time out to 10 seconds */ char *serverip, *datatype; char msg[MSG_SIZE]; /* Buffer for sending the message to remote server */ int main(int argc, char *argv[], char *envp[]) { if (process_arguments(argc, argv) == ERROR) exit(ERROR); pid_t pid; int error_code = 0; switch (pid = fork()) { case -1: /* Here pid is -1, the fork failed */ /* Some possible reasons are that you're */ /* out of process slots or virtual memory */ perror("The fork failed!"); error_code = -1; break; case 0: /* pid of zero is the child */ signal(SIGALRM, timeout_sighandler); alarm(timeout); process_env(envp); _exit(0); default: /* pid greater than zero is parent getting the child's pid */ //printf("Child's pid is %d\n",pid); error_code = 0; } exit(error_code); } void timeout_sighandler(int sig) { /* force the child process to exit... */ fprintf(stderr, "Caught SIGALRM - timeout\n"); _exit(-1); } /*************************************************** * processing command line arguments * * Gets number of args and pointer reference to argv ***************************************************/ int process_arguments(int argc, char **argv) { int c; int error = FALSE; int test_mode = FALSE; int display_license = FALSE; int display_help = FALSE; #ifdef HAVE_GETOPT_H int option_index=0; static struct option long_options[]= { { "help",no_argument,0,'h'}, { "version",no_argument,0,'V'}, { "license",no_argument,0,'V'}, { "test",no_argument,0,'t'}, { "host",required_argument,0,'H'}, { "port",required_argument,0,'p'}, { "datatype",required_argument,0,'d'}, { "timeout",required_argument,0,'t'}, { 0,0,0,0} }; #endif /* make sure we have the correct number of command line arguments */ if (argc < 2) error = TRUE; while (1) { #ifdef HAVE_GETOPT_H c=getopt_long(argc,argv,"+hH:p:d:Vt:",long_options,&option_index); #else c = getopt(argc, argv, "+hH:p:d:Vt:"); #endif if (c == -1 || c == EOF) break; switch (c) { case '?': /* usage */ case 'h': display_help = TRUE; break; case 'V': /* version */ display_license = TRUE; break; case 'H': /* host ip */ // ToDo: Check if it there if (optarg != NULL) { serverip = optarg; } else error = TRUE; break; case 'p': /* port to use */ // ToDo: Check for port if (optarg != NULL) serverport = atoi(optarg); break; case 'd': /* datatype like hostperfdata, serviceperfdata and so on */ if (optarg != NULL) datatype = optarg; else error = TRUE; break; case 't': /* timeout */ if (optarg != NULL) timeout = atoi(optarg); else error = TRUE; break; default: break; } } /* it makes no sense to do anything without a target host*/ if (serverip == NULL) error = TRUE; if (display_license == TRUE) { printf( "This program is free software; you can redistribute it and/or modify\n"); printf( "it under the terms of the GNU General Public License version 2 as\n"); printf("published by the Free Software Foundation.\n\n"); printf( "This program is distributed in the hope that it will be useful,\n"); printf( "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"); printf( "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"); printf("GNU General Public License for more details.\n\n"); printf( "You should have received a copy of the GNU General Public License\n"); printf("along with this program; if not, write to the Free Software\n"); printf( "Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.\n\n"); exit(OK); } /* if there are no command line options (or if we encountered an error), print usage */ if (error == TRUE || display_help == TRUE) { printf( "Usage: %s -H [-p ] -d -t \n", argv[0]); printf("\n"); printf("Options:\n"); printf("\n"); printf(" -H | --host Host IP Address to send data to.\n"); printf("\n"); printf( " -p | --port Host Port to send data to. (Default: tcp/1500)\n"); printf("\n"); printf( " -t | --timeout Timeout value to kill process (Default: 10 seconds)\n"); printf("\n"); printf(" -d | --datatype Free string what this Data stands for\n"); printf( " like \"serviceperfdata\", \"hostperfdata\", \"eventhandler\"\n"); printf("\n\n"); printf( "Visit the PNP website at http://www.pnp4nagios.org/pnp/ for bug fixes, new\n"); printf( "releases, online documentation, FAQs, information on subscribing to\n"); printf("the mailing lists.\n"); printf("\n"); exit(ERROR); } return OK; } int process_env(char *envp[]) { int count = 0; int socket; struct Nagios_Env *base = NULL; struct Nagios_Env *ptr = NULL; while (1) { if (socket_status == CLOSE) { socket = open_sock(serverip); } if (envp[count] == NULL) { break; } parse_env(envp[count], &base); count++; } print_list(socket, base); return (0); } void print_list(int socket, struct Nagios_Env *base) { struct Nagios_Env *ptr = NULL; char *message, dtype[BUFFER_SIZE]; int message_length = sizeof(struct Nagios_Env) - sizeof(ptr->next); ptr = base; strcat(dtype, "\n"); strcat(dtype, "\n"); strcat(dtype, " "); strcat(dtype, datatype); strcat(dtype, "\n"); if (send(socket, dtype, strlen(dtype), 0) == -1) { fprintf(stderr, "error while sending request to server\n"); } bzero((void *) dtype, BUFFER_SIZE); while (ptr != NULL) { if (!(message = (char *) malloc(sizeof(struct Nagios_Env)))) { fprintf(stderr, "Cannot allocate memory for this message\n"); exit(ERROR); } strncat(message, " <", message_length); strncat(message, ptr->varname, message_length); strncat(message, ">", message_length); strncat(message, ptr->varvalue, message_length); strncat(message, "varname, message_length); strncat(message, ">\n", message_length); message[message_length] = '\0'; if (send(socket, message, strlen(message), 0) == -1) { fprintf(stderr, "error while sending request to server\n"); } ptr = ptr->next; } strcat(dtype, "\n"); if (send(socket, dtype, strlen(dtype), 0) == -1) { fprintf(stderr, "error while sending request to server\n"); } } int parse_env(char *curr, struct Nagios_Env **base) { char tmpbuf[BUFFER_SIZE]; char *var1; char *var2; struct Nagios_Env *ptr = NULL; ptr = *base; strncpy(tmpbuf, curr, BUFFER_SIZE); var1 = strtok(tmpbuf, "="); var2 = strtok(NULL, ""); if (strncmp(var1, (char *) "NAGIOS_", 7) == 0) { if (var2 != NULL) { if (ptr == NULL) { /* create first list element */ ptr = (struct Nagios_Env *) malloc(sizeof(struct Nagios_Env)); if (ptr == NULL) return ERROR; *base = ptr; } else { /* create a new list element */ /* first look for the end of list */ while (ptr->next != NULL) ptr = ptr->next; /* neues Listenelement erzeugen */ ptr->next = (struct Nagios_Env *) malloc( sizeof(struct Nagios_Env)); if (ptr->next == NULL) return ERROR; ptr = ptr->next; } // Building dynamic list strcpy(ptr->varname, var1); strcpy(ptr->varvalue, var2); ptr->next = NULL; } } bzero((void *) tmpbuf, BUFFER_SIZE); return (0); } int open_sock() { int tosocket; /* the socket descriptor*/ /* description of struct sockaddr_in is mentioned in netinet/in.h */ struct sockaddr_in toaddr; /* store address of server here */ /* create tcp socket */ tosocket = socket(PF_INET, SOCK_STREAM, 0); if (tosocket == -1) { fprintf(stderr, "cannot open socket\n"); exit(1); } /* define server address */ toaddr.sin_family = PF_INET; toaddr.sin_addr.s_addr = inet_addr(serverip); toaddr.sin_port = htons(serverport); /* connect to server */ if (connect(tosocket, (struct sockaddr *) &toaddr, sizeof(toaddr)) == -1) { fprintf(stderr, "Unable to connect to server '%s' on port %d. Exiting...\n", serverip, serverport); close(tosocket); exit(1); } else { socket_status = OPEN; return tosocket; } return -1; } pnp4nagios-0.6.16/scripts/0000775000000000000000000000000011662503006014054 5ustar rootrootpnp4nagios-0.6.16/scripts/rc.npcd.in0000664000000000000000000000702111662503006015733 0ustar rootroot#!@SHELL@ # ### BEGIN INIT INFO # Provides: npcd # Required-Start: # Required-Stop: # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: @PKG_NAME@ NPCD Daemon Version @PKG_VERSION@ # Description: Nagios Performance Data C Daemon ### END INIT INFO # chkconfig: 345 99 01 # # File : npcd # servicename=@npcd_name@ prefix=@prefix@ exec_prefix=${prefix} NpcdBin=@bindir@/@npcd_name@ NpcdCfgFile=@sysconfdir@/npcd.cfg NpcdVarDir=@localstatedir@ NpcdRunFile=/var/run/npcd.pid NpcdLockDir=/var/lock/subsys NpcdLockFile=@npcd_name@ NpcdUser=@nagios_user@ NpcdGroup=@nagios_grp@ status_npcd (){ pid_npcd if ps -p $NpcdPID > /dev/null 2>&1; then return 0 else if test -f $NpcdLockDir/$NpcdLockFile; then return 2 else return 1 fi fi return 1 } printstatus_npcd(){ if status_npcd $1 $2; then echo "$servicename (pid $NpcdPID) is running..." exit 0 elif test $? == 2; then echo "$servicename is not running but subsystem locked" exit 2 else echo "$servicename is not running" exit 1 fi } killproc_npcd (){ kill $2 $NpcdPID } pid_npcd (){ if test ! -f $NpcdRunFile; then return 1 fi NpcdPID=`head -n 1 $NpcdRunFile` return 0 } # Source function library # Solaris doesn't have an rc.d directory, so do a test first if [ -f /etc/rc.d/init.d/functions ]; then . /etc/rc.d/init.d/functions elif [ -f /etc/init.d/functions ]; then . /etc/init.d/functions fi # Check that npcd exists. if [ ! -f $NpcdBin ]; then echo "Executable file $NpcdBin not found. Exiting." exit 1 fi # Check that npcd.cfg exists. if [ ! -f $NpcdCfgFile ]; then echo "Configuration file $NpcdCfgFile not found. Exiting." exit 1 fi # See how we were called. case "$1" in start) status_npcd if [ $? -eq 0 ]; then echo "$servicename already started..." exit 1 fi echo -n "Starting $servicename:" touch $NpcdRunFile chown $NpcdUser:$NpcdGroup $NpcdRunFile $NpcdBin -d -f $NpcdCfgFile if [ -d $NpcdLockDir ]; then touch $NpcdLockDir/$NpcdLockFile; fi echo " done." exit 0 ;; stop) status_npcd if ! [ $? -eq 0 ]; then echo "$servicename was not running... could not stop" exit 1 fi echo -n "Stopping $servicename: " pid_npcd killproc_npcd npcd # now we have to wait for npcd to exit and remove its # own NpcdRunFile, otherwise a following "start" could # happen, and then the exiting npcd will remove the # new NpcdRunFile, allowing multiple npcd daemons # to (sooner or later) run - John Sellens #echo -n 'Waiting for npcd to exit .' for i in 1 2 3 4 5 6 7 8 9 10 ; do if status_npcd > /dev/null; then echo -n '.' sleep 1 else break fi done if status_npcd > /dev/null; then echo '' echo 'Warning - $servicename did not exit in a timely manner' else echo 'done.' fi rm -f $NpcdLockDir/$NpcdLockFile ;; status) printstatus_npcd ;; reload) $0 restart ;; restart) $0 stop $0 start ;; *) echo "Usage: $servicename {start|stop|restart|status}" exit 1 ;; esac # End of this script pnp4nagios-0.6.16/scripts/verify_pnp_config_v2.pl0000775000000000000000000006422211662503006020537 0ustar rootroot#!/usr/bin/perl # Copyright (c) 2005-2011 PNP4Nagios Developer Team (http://www.pnp4nagios.org) # # 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 2 # 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, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # use strict; use warnings; use Data::Dumper; use Getopt::Long; use File::Find; use File::Glob; use Term::ANSIColor; my $version = 'pnp4nagios-head'; # process command line parameters use vars qw ( $help $debug $mode $vInfo $PNPCfg $MainCfg $last_check); Getopt::Long::Configure('bundling'); GetOptions( "h|help" => \$help, "d|debug" => \$debug, "m|mode=s" => \$mode, "c|config=s" => \$MainCfg, "p|pnpcfg=s" => \$PNPCfg, ); my @modes = ("bulk", "bulk+npcd", "sync", "npcdmod"); my @products = ("nagios", "icinga"); my @states = ("OK", "WARN", "CRIT", "UNKN", "INFO", "HINT", "DBG"); my @colors = ("bold green", "bold yellow", "bold red", "bold blue", "bold blue", "bold yellow", "black on_red"); my %process_perf_data_stats = ('hosts' => 0, 'services' => 0, 'noperf' => 0, 'noperf_but_enabled' => 0 , 0 => 0, 1 => 0); my %stats = ( 0 => 0, 1 => 0, 2 => 0, 3 => 0, 4 => 0, 5 =>0 ); my %sizing = ( 50 => 'sync', 200 => 'bulk', 5000 => 'bulk+npcd', 10000 => 'npcdmod', ); if ( ! $MainCfg ){ usage(); usage_no_config(); exit; } if ( ! $mode ){ usage(); usage_no_mode(); exit; } if ( ! $PNPCfg ){ usage(); usage_no_pnpcfg(); exit; } if( ! in_array(\@modes, $mode)){ usage(); info("'$mode' is not a valid option",2); info("Valid modes are [@modes]",2); exit; } my %statistics = ( 'OK' => 0, 'WARN' => 0, 'CRIT' => 0, ); my %cfg = (); my %commands = (); my $uid = 0; my $gid = 0; my $process_perfdata_cfg = 0; # # Begin # info("========== Starting Environment Checks ============",4); info("My version is: ".$version,4); # # Read Main config file # process_nagios_cfg(); # # get the product name # my $product = get_product(); if( $product eq 0 ){ info("Can´t determine product while reading $MainCfg", 4); info_and_exit("$MainCfg does not look like a valid config file", 2); }else{ info("Running product is '$product'", 0); } # # Read objects cache file to get more information # Needs a running product # check_config_var('object_cache_file', 'exists', 'break'); if( -r $cfg{'object_cache_file'} ){ process_objects_file($cfg{'object_cache_file'}); }else{ info_and_exit($cfg{'object_cache_file'}. " is not readable", 2); } # # Read resource.cfg # check_config_var('resource_file', 'exists', 'break'); if( -r $cfg{'resource_file'} ){ process_npcd_cfg($cfg{'resource_file'}); }else{ info_and_exit($cfg{'resource_file'}. " is not readable", 2); } # # Read process_perfdata.cfg # if ( ! -d $PNPCfg ){ info_and_exit("Directory $PNPCfg does not exist",2); } if ( ! -d "$PNPCfg/check_commands" ){ info("Directory $PNPCfg/check_commands does not exist",2); info_and_exit("$PNPCfg does not look like a PNP4Nagios config directory",2); } my $ppcfg = "$PNPCfg/process_perfdata.cfg"; process_perfdata_cfg($ppcfg); # # Read etc/pnp_release file if exists # if( -r "$PNPCfg/pnp4nagios_release" ){ process_pnp4nagios_release("$PNPCfg/pnp4nagios_release"); info("Found PNP4Nagios version ".get_config_var('PKG_VERSION'), 0); }else{ info("No pnp4nagios_release file found. This might be an older version of PNP4Nagios", 0); } # # Start Main config checks # if(config_var_exists($product.'_user') ){ my $user = get_config_var($product.'_user'); $uid = getpwnam($user); info( "Effective User is '$user'", 0); if($uid){ info("User $user exists with ID '$uid'", 0 ); }else{ info_and_exit("User $user does not exist", 2 ); } }else{ info_and_exit("Option '".$product."_user' not found in $MainCfg", 2); } if(config_var_exists($product.'_group') ){ my $group = get_config_var($product.'_group'); $gid = getgrnam($group); info( "Effective group is '$group'", 0); if($gid){ info("Group $group exists with ID '$gid'", 0 ); }else{ info_and_exit("Group $group does not exist", 2 ); } }else{ info_and_exit("Option '".$product."_group' not found in $MainCfg", 2); } # # Start sync config checks # if($mode eq "sync"){ info("========== Checking Sync Mode Config ============",4); compare_config_var('process_performance_data', '1'); compare_config_var('enable_environment_macros', '1'); check_config_var('service_perfdata_command', 'exists'); check_config_var('host_perfdata_command', 'exists');; last_info("Needed config options are missing.",5,$last_check); # Options not allowed in sync mode check_config_var('service_perfdata_file', 'notexists'); check_config_var('service_perfdata_file_template', 'notexists'); check_config_var('service_perfdata_file_mode', 'notexists'); check_config_var('service_perfdata_file_processing_interval', 'notexists'); check_config_var('service_perfdata_file_processing_command', 'notexists',); check_config_var('host_perfdata_file', 'notexists'); check_config_var('host_perfdata_file_template', 'notexists'); check_config_var('host_perfdata_file_mode', 'notexists'); check_config_var('host_perfdata_file_processing_interval', 'notexists'); check_config_var('host_perfdata_file_processing_command', 'notexists'); check_config_var('broker_module', 'notexists'); last_info("Config options are not allowed in sync mode. http://docs.pnp4nagios.org",5,$last_check); info(ucfirst($product)." config looks good so far",4); info("========== Checking config values ============",4); my $command_line; $command_line = check_command_definition('service_perfdata_command'); check_process_perfdata_pl($command_line); $command_line = check_command_definition('host_perfdata_command'); check_process_perfdata_pl($command_line); } if($mode eq "bulk"){ info("========== Checking Bulk Mode Config ============",4); compare_config_var('process_performance_data', '1'); check_config_var('service_perfdata_file', 'exists'); check_config_var('service_perfdata_file_template', 'exists'); check_perfdata_file_template(get_config_var('service_perfdata_file_template')); check_config_var('service_perfdata_file_mode', 'exists'); check_config_var('service_perfdata_file_processing_interval', 'exists'); check_config_var('service_perfdata_file_processing_command', 'exists'); check_config_var('host_perfdata_file', 'exists'); check_config_var('host_perfdata_file_template', 'exists'); check_perfdata_file_template(get_config_var('host_perfdata_file_template')); check_config_var('host_perfdata_file_mode', 'exists'); check_config_var('host_perfdata_file_processing_interval', 'exists'); check_config_var('host_perfdata_file_processing_command', 'exists'); last_info("Needed config options are missing.",5,$last_check); # Options not allowed in bulk mode check_config_var('service_perfdata_command', 'notexists'); check_config_var('host_perfdata_command', 'notexists'); check_config_var('broker_module', 'notexists'); last_info("Config options are not allowed in bulk mode",5,$last_check); info(ucfirst($product)." config looks good so far",4); info("========== Checking config values ============",4); my $command_line; $command_line = check_command_definition('service_perfdata_file_processing_command'); check_process_perfdata_pl($command_line); $command_line = check_command_definition('host_perfdata_file_processing_command'); check_process_perfdata_pl($command_line); } if($mode eq "bulk+npcd"){ info("========== Checking Bulk Mode + NPCD Config ============",4); compare_config_var('process_performance_data', '1'); check_config_var('service_perfdata_file', 'exists'); check_config_var('service_perfdata_file_template', 'exists'); check_perfdata_file_template(get_config_var('service_perfdata_file_template')); check_config_var('service_perfdata_file_mode', 'exists'); check_config_var('service_perfdata_file_processing_interval', 'exists'); check_config_var('service_perfdata_file_processing_command', 'exists'); check_config_var('host_perfdata_file', 'exists'); check_config_var('host_perfdata_file_template', 'exists'); check_perfdata_file_template(get_config_var('host_perfdata_file_template')); check_config_var('host_perfdata_file_mode', 'exists'); check_config_var('host_perfdata_file_processing_interval', 'exists'); check_config_var('host_perfdata_file_processing_command', 'exists'); last_info("Needed config options are missing. http://docs.pnp4nagios.org",5,$last_check); # Options not allowed in bulk mode check_config_var('service_perfdata_command', 'notexists'); check_config_var('host_perfdata_command', 'notexists'); check_config_var('broker_module', 'notexists'); last_info("Config options are not allowed in bulk mode with npcd",5,$last_check); info(ucfirst($product)." config looks good so far",4); info("========== Checking config values ============",4); my $command_line; my $npcd_cfg = check_proc_npcd(get_config_var($product.'_user')); if( -r $npcd_cfg){ info("$npcd_cfg is used by npcd and readable",0); }else{ info_and_exit("$npcd_cfg is not readable",0); } # read npcd.cfg into %cfg process_npcd_cfg($npcd_cfg); check_config_var('perfdata_spool_dir', 'exists'); $command_line = check_command_definition('service_perfdata_file_processing_command'); $command_line = check_command_definition('host_perfdata_file_processing_command'); check_process_perfdata_pl($cfg{'perfdata_file_run_cmd'}); } if($mode eq "npcdmod"){ my $val; info("========== Checking npcdmod Mode Config ============",4); compare_config_var('process_performance_data', '1'); last_info ("Needed config options are missing. http://docs.pnp4nagios.org",5,$last_check); # Options not allowed in sync mode check_config_var('service_perfdata_file', 'notexists'); check_config_var('service_perfdata_file_template', 'notexists'); check_config_var('service_perfdata_file_mode', 'notexists'); check_config_var('service_perfdata_file_processing_interval', 'notexists'); check_config_var('service_perfdata_file_processing_command', 'notexists'); check_config_var('host_perfdata_file', 'notexists'); check_config_var('host_perfdata_file_template', 'notexists'); check_config_var('host_perfdata_file_mode', 'notexists'); check_config_var('host_perfdata_file_processing_interval', 'notexists'); check_config_var('host_perfdata_file_processing_command', 'notexists'); last_info("Config options are not allowed in bulk mode with npcd",5,$last_check); # event_broker_option must have enabled bits 2 and 3 (0b01100) check_config_var ('event_broker_options', 'exists'); $val = get_config_var('event_broker_options') & 0x0c; if($val == 12){ info("event_broker_option bits 2 and 3 enabled ($val)",0); }else{ info_and_exit("event_broker_option bits 2 and/or 3 not enabled",2); } check_config_var('broker_module', 'exists', 'break'); $val = get_config_var('broker_module'); # extract npcd.cfg patch from broker_module definition my $npcdmod_npcd_cfg; $val =~ /npcdmod\.o\s+config_file=(.*)$/; if($1){ $npcdmod_npcd_cfg=$1; info("npcdmod.o config file is $npcdmod_npcd_cfg",0); if( -r $npcdmod_npcd_cfg){ info("$npcdmod_npcd_cfg used by npcdmod.o is readable",0); }else{ info_and_exit("$npcdmod_npcd_cfg used by npcdmod.o is not readable",2); } }else{ info("broker_module definition looks suspect '$val'",2); info_and_exit("Can´t extract path to npcd.cfg from your broker_module definition",2); } # extract npcd.cfg path from process list my $npcd_cfg = check_proc_npcd(get_config_var($product.'_user')); if( -r $npcd_cfg){ info("$npcd_cfg is used by npcd and readable",0); } if($npcd_cfg eq $npcdmod_npcd_cfg){ info("npcd and npcdmod.o are using the same config file ($npcd_cfg)",0); }else{ info_and_exit("npcd and npcdmod.o are not using the same config file($npcd_cfg<=>$npcdmod_npcd_cfg)",2); } info(ucfirst($product)." config looks good so far",4); info("========== Checking config values ============",4); # read npcd.cfg into %cfg process_npcd_cfg($npcd_cfg); check_process_perfdata_pl($cfg{'perfdata_file_run_cmd'}); } info("========== Starting global checks ============",4); check_config_var('status_file', 'exists', 'break'); process_status_file(); info("==== Starting rrdtool checks ====",4); check_rrdtool(); info("==== Starting directory checks ====",4); check_config_var('RRDPATH', 'exists', 'break'); check_perfdata_dir(get_config_var('RRDPATH')); if($process_perf_data_stats{1} == 0){ info("'process_perf_data 1' is not set for any of your hosts/services",2); } if($process_perf_data_stats{'noperf'} > 0){ info($process_perf_data_stats{'noperf'}." hosts/services are not providing performance data",1); } if($process_perf_data_stats{'noperf_but_enabled'} > 0){ info("'process_perf_data 1' is set for ".$process_perf_data_stats{'noperf_but_enabled'}." hosts/services which are not providing performance data!",1); } if($process_perf_data_stats{0} > 0){ info("'process_perf_data 0' is set for ".$process_perf_data_stats{0}." of your hosts/services",1); } if($process_perf_data_stats{1} > 0){ info("'process_perf_data 1' is set for ".$process_perf_data_stats{1}." of your hosts/services",0); } if ( get_config_var('LOG_LEVEL') gt 0 ){ info("Logging is enabled in process_perfdata.cfg. This will reduce the overall performance of PNP4Nagios",1) } info("==== System sizing ====",4); print_sizing(); info("==== Check statistics ====",4); print_stats(); exit; # # Helper Functions # sub config_var_exists { my $key = shift; if(exists $cfg{$key}){ return 1; }else{ return 0; } } sub get_config_var { my $key = shift; if(exists $cfg{$key}){ return $cfg{$key}; }else{ return undef; } } sub check_command_definition { my $option = shift; my $key = get_config_var($option); my $val = $commands{$key}; if(exists $commands{$key}){ info("Command $key is defined",0); info("'$val'",0); }else{ info_and_exit("Command $key is not defined",2); } if($mode eq "sync"){ if( $val =~ m/process_perfdata.pl$/ or $val =~ m/process_perfdata.pl\s+-d\s+HOSTPERFDATA/ ){ info ( "Command looks good",0 ); }else{ info_and_exit ( "Command looks suspect ($val)",2 ); } } if($mode eq "bulk"){ if( $val =~ m/process_perfdata.pl\s+--bulk=/){ info ( "Command looks good",0 ); }else{ info_and_exit ( "Command looks suspect ($val)",2 ); } } if($mode eq "bulk+npcd"){ my $dump_file = get_config_var( $option =~m/(.*)_processing_command/ ); my $perfdata_spool_dir = get_config_var( 'perfdata_spool_dir'); #print "$dump_file\n"; my $regex = qr/\/bin\/mv\s$dump_file\s$perfdata_spool_dir/; if( $val =~ m/$regex/){ info ( "Command looks good",0 ); }else{ info ( "Regex = $regex", 4 ); info_and_exit ( "Command looks suspect ($val)",2 ); } } return $commands{$key}; } # # Max three parameters # sub check_config_var { my $key = shift; my $check = shift; my $break = shift||0; my $var = get_config_var($key); if($check eq "exists"){ if(defined($var)){ info("$key is defined",0); info("$key=$var",0); #$last_check = 0; }else{ info("$key is not defined",2); $last_check++; exit if $break; } } if($check eq "notexists"){ if( ! defined($var)){ #info("$key is not defined",0); #$last_check = 0; }else{ info("$key is defined ($key=$var)",2); info("$key is not allowed in mode '$mode'",2); $last_check++; exit if $break; } } } sub compare_config_var { my $key = shift; my $compare = shift; my $break = shift||0; my $var = get_config_var($key); if( $var =~ /$compare/){ info("$key is $var compared with '/$compare/'",0); }else{ info("$key is $var compared with '/$compare/'",2); exit if $break; } } sub check_perfdata_file_template { $_ = shift; if( /^DATATYPE::(HOST|SERVICE)PERFDATA/ ){ info("PERFDATA template looks good",0); }else{ info("PERFDATA template looks suspect",2); } } sub info { my $string = shift; my $state = shift||0; my $break = shift||0; $stats{$state}++; return if $state == 6 and not defined $debug; $statistics{$states[$state]}++; print color $colors[$state]; printf("[%-4s]", $states[$state]); print color 'reset'; printf(" %s\n", $string); } sub last_info { my $string = shift; my $state = shift; my $break = shift||0; return if $break == 0; info("$string ($break)", $state); exit if $break > 0; } sub info_and_exit { my $string = shift; my $state = shift; info($string, $state); exit $state; } sub print_stats { my $state = 0; $state = 1 if $stats{1} > 0; $state = 2 if $stats{2} > 0; info(sprintf("Warning: %d, Critical: %d",$stats{1}, $stats{2}),$state); info("Checks finished...", $state); } sub print_sizing { my $object_count = ($process_perf_data_stats{'hosts'} + $process_perf_data_stats{'services'}); my $graph_count = ($process_perf_data_stats{'hosts'} + $process_perf_data_stats{'services'}); info("$object_count hosts/service objects defined",0); foreach my $limit ( sort {$a <=> $b} keys %sizing){ if($graph_count >= $limit and $sizing{$limit} eq $mode){ info("Use at least mode '".get_mode_by_size($graph_count)."' to reduce I/O",5); last; } } } sub get_mode_by_size { my $graph_count = shift; foreach my $limit ( sort {$a <=> $b} keys %sizing){ return $sizing{$limit} if $limit >= $graph_count; } return 'gearman'; } sub check_rrdtool { check_config_var('RRDTOOL', 'exists', 'break'); my $rrdtool = get_config_var('RRDTOOL'); if ( -x $rrdtool ){ info("$rrdtool is executable",0); }else{ info_and_exit("$rrdtool is not executable",2); } my @version = `$rrdtool`; chomp $version[0]; info($version[0],0); check_config_var('USE_RRDs', 'exists', 'break'); if(get_config_var('USE_RRDs')){ unless ( eval "use RRDs;1" ) { info("Perl RRDs modules are not loadable",1); }else{ info("Perl RRDs modules are loadable",0); } }else{ unless ( eval "use RRDs;1" ) { info("Perl RRDs modules are neither loadable nor enabled (USE_RRDs = 0)",1); }else{ info("RRDs modules are loadable but not enabled (USE_RRDs = 0)",1); } } } sub check_proc_npcd { my $user = shift; my $out = `ps -u $user -o cmd | grep /npcd | grep -v grep`; my $rc = $?; chomp $out; info("Check process: 'ps -u $user -o cmd | grep /npcd | grep -v grep'", 6); info("Result: $out", 6); info("Returncode: $rc", 6); #extract npcd.cfg $out =~ /-f\s?(\S+)/; my $npcd_cfg = $1; if($rc == 0){ info("npcd daemon is running",0); }else{ info("npcd daemon is not running",2); info_and_exit("A running npcd daemon is needed to process data.",4); } return $npcd_cfg; } # process nagios.cfg sub process_nagios_cfg { info ("Reading $MainCfg", 4); open (NFILE, "$MainCfg") || info_and_exit("Failed to open '$MainCfg'. $! ", 2); while () { process_main_cfg_line(); } close (NFILE); } # process process_perfdata.cfg sub process_perfdata_cfg { my $cfg_file = shift; if ( -r $cfg_file ){ if ( process_cfg($cfg_file) ){ $process_perfdata_cfg = 1; }else{ $process_perfdata_cfg = 0; } }elsif(-e "$PNPCfg/process_perfdata.cfg-sample"){ info ("$cfg_file does not exist.",1); info ("We will try to parse defaults from process_perfdata.pl later on", 1); info ("process_perfdata.cfg-sample exists in $PNPCfg", 5); info ("It is recommended to rename process_perfdata.cfg-sample to process_perfdata.cfg", 5); $process_perfdata_cfg = 0; # we have to parse process_perfdata.pl to get defaults }else{ info ("$cfg_file does not exist.",1); info ("We will try to parse defaults from process_perfdata.pl later on", 1); info ("It is recommended to place $cfg_file in $PNPCfg", 5); info ("A sample file is installed by 'make install-config'", 5); $process_perfdata_cfg = 0; # we have to parse process_perfdata.pl to get defaults } } sub process_pnp4nagios_release { my $cfg_file = shift; if ( -r $cfg_file ){ process_cfg($cfg_file); } } sub process_cfg { my $cfg_file = shift; if ( -r $cfg_file ){ info ("Reading $cfg_file", 4); open (NFILE, "$cfg_file") || info_and_exit("Failed to open '$cfg_file'. $! ", 2); while () { process_main_cfg_line(); } close (NFILE); return 1; } return 0; } # process npcd.cfg sub process_npcd_cfg { my $cfg_file = shift; if ( -r $cfg_file ){ info ("Reading $cfg_file", 4); }else{ info ("$cfg_file does not exist", 4); info ("this file is needed to get more information about your system", 5); info_and_exit("no further processing possible",2); } open (NFILE, "$cfg_file") || info_and_exit("Failed to open '$cfg_file'. $! ", 2); while () { process_main_cfg_line(); } close (NFILE); } # process main config line sub process_main_cfg_line { chomp; return if (/^$/); return if (/^#/); s/#.*//; s/\s*$//; if (my ($par, $val) = /([^=]+)\s?=\s?(.*)/){ $par = trim($par); $val = trim($val);; if ( (defined($par) && $par eq "") ) { info ("oddLine -> $_" ,4); return;; } # skip broker_module lines. return if (($par eq "broker_module") and ($val !~ /npcdmod.o/)); info("'$par' -> '$val'",6); $cfg{"$par"} = $val; } } sub trim { my $string = shift; $string =~ s/^\s+//; $string =~ s/\s+$//; return $string; } # read object_file sub process_objects_file { my ($file) = @_; my $cmd = ""; my $line = ""; info ("Reading $file", 4); open (CFILE, "$file") || info_and_exit("Failed to open '$file'. $! ", 2); while () { s/#.*//; next if (/^$/); chomp; if (/command_name/) { ($cmd) = /command_name\s*(.*)/; next; } next unless ( /command_line/); ($line) = /command_line\s*(.*)/ ; $commands{"$cmd"} = "$line"; next unless (/process_perfdata.pl/); my @cmd = split (/\s+/,$line); } close (CFILE); } sub process_status_file { my ($file) = get_config_var('status_file'); my $line = ""; my $perfdata_found = 0; info ("Reading $file", 4); open (CFILE, "$file") || info_and_exit("Failed to open '$file'. $! ", 2); while () { s/#.*//; next if (/^$/); chomp; # count process_perf_data definitions if (/process_performance_data=(\d)$/){ $process_perf_data_stats{$1}++; if ( $perfdata_found == 0 && $1 == 1){ $process_perf_data_stats{'noperf_but_enabled'}++; } } if(/\sperformance_data=$/){ $process_perf_data_stats{'noperf'}++; $perfdata_found = 0; } if(/\sperformance_data=(.+)$/){ $perfdata_found = 1; } if(/^hoststatus /){ $process_perf_data_stats{'hosts'}++; } if(/^servicestatus /){ $process_perf_data_stats{'services'}++; } } close (CFILE); } sub check_process_perfdata_pl { my $command_line = shift; my $path = ''; if( $command_line =~ /\s?([^\s]*)\/process_perfdata.pl\s?/ ){ $path = $1; if ($path =~ /(\$USER\d+\$)/) { if (exists $cfg{"$1"}) { my $val = $cfg{"$1"}; $path =~ s/\$USER\d+\$/$val/; } } if( -x "$path/process_perfdata.pl" ){ info("Script $path/process_perfdata.pl is executable",0); }else{ info_and_exit("Script $path/process_perfdata.pl is not executable",2); } process_pp_pl ("$path/process_perfdata.pl") if $process_perfdata_cfg == 0; }else{ info_and_exit("Can´t find path to process_perfdata.pl",2); } } sub check_perfdata_spool_dir { my $dir = shift; if( -d $dir ){ info("Spool directory '$dir' exists",0); }else{ info_and_exit("Spool directory $dir does not exist",2); } my @files = <$dir/*>; my $count = @files; if($count > 1){ info("$count files in $dir", 1); }else{ info("$dir is empty", 0); } } # sub check_perfdata_dir { my $dir = shift; if( -d $dir ){ info("Perfdata directory '$dir' exists",0); find(\&check_perm, "$dir"); }else{ info_and_exit("Perfdata directory $dir does not exist",2); } } sub check_perm { -d ; my $f = "$File::Find::name"; return unless (($f =~ /\/$/) or ($f =~ /rrd$|xml$/)); check_usrgrp ($f); } sub check_usrgrp { my $file = shift; my $break = shift || 0; if ($uid) { my $fuid = (stat("$file"))[4]; my $fname = getpwuid($fuid); info ("$file: owner is $fname", 2, $break) if ($fuid != $uid); } if ($gid) { my $fgid = (stat("$file"))[5]; my $fgroup = getgrgid($fgid); info ("$file: group is $fgroup", 2, $break) if ($fgid != $gid); } } # read config inside process_perfdata.pl sub process_pp_pl { my $cfg_file = shift; my $loop = 0; info ("Reading $cfg_file", 4); open (NFILE, "$cfg_file") || info_and_exit("Failed to open '$cfg_file'. $! ", 2); while () { chomp; last if (/^\s*\);/); s/#.*//; s/\s*$//; s/^\s+//; next if (/^$/); #$loop++ if (/%conf/); #next unless ($loop); my ($par, $val) = /([^\s]+)\s+=>\s+([^\s]+)/; # shortest string next unless ((defined $par) and (defined $val)); $val =~ s/['",]//g; $cfg{"$par"} = $val; } close (NFILE); } sub get_product { for my $product (@products){ my $string = $product . "_user"; if ( exists $cfg{$string} ){ return $product; } } return 0; } sub in_array{ my ($arr,$search_for) = @_; my %items = map {$_ => 1} @$arr; return (exists($items{$search_for}))?1:0; } sub usage{ print </dev/null` if [ "$pid" != "" ]; then ps -p $pid > /dev/null 2>&1 if [ $? -eq 0 ]; then echo "$NAME is running with pid $pid" return 0; fi fi echo "$NAME is not running" return 1; } function kill_procs() { pid=`cat $PIDFILE 2>/dev/null` if [ -z $pid ]; then echo ". Not running." else # do a kill if still now down ps -p $pid > /dev/null 2>&1 && kill $pid for x in 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5; do echo -n "." ps -p $pid > /dev/null 2>&1 && sleep 1; done ps -p $pid > /dev/null 2>&1; if [ $? -ne 0 ]; then echo "done" exit 0; else echo "failed" exit 1; fi fi } case "$1" in start) echo -n "Starting $NAME " get_status > /dev/null; if [ $? = 0 ]; then echo "failed" echo "$NAME already running" exit 0; fi if [ "$USERID" -eq 0 ]; then su -s $SHELL - $USER -c "$CMD" else $CMD fi if [ $? -eq 0 ]; then echo "done" exit 0; else echo "failed" exit 1; fi ;; stop) echo -n "Stopping $NAME" pid=`cat $PIDFILE 2>/dev/null` if [ -z $pid ]; then echo ". Not running." else # kill if still running ps -p $pid > /dev/null 2>&1 && kill_procs; fi ;; status) get_status; exit $?; ;; restart) $0 stop && sleep 1 && $0 start exit $? ;; *) echo "Usage: $NAME {start|stop|status|restart}" exit 1 ;; esac exit 0 pnp4nagios-0.6.16/scripts/check_pnp_rrds.pl.in0000775000000000000000000001436511662503006020016 0ustar rootroot#!@PERL@ # nagios: -epn ## check_pnp_rrds - PNP4Nagios. ## Copyright (c) 2006-2009 Joerg Linge (http://www.pnp4nagios.org) ## ## 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 2 ## 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, write to the Free Software ## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. use File::Find; use File::Basename; use warnings; use strict; use Getopt::Long; Getopt::Long::Configure('bundling'); my ( $opt_d, $opt_V, $opt_h, $opt_b ); my $opt_a = 7; my $opt_w = 1; my $opt_c = 10; my $opt_t = 10; my $opt_p = "@PERFDATA_DIR@"; my $opt_ncmd = "/usr/local/nagios/var/rw/nagios.cmd"; my $opt_phost = ""; my $opt_pservice = ""; my $opt_ignore; my $VERSION = "@PKG_VERSION@"; my $PROGNAME = basename($0); my $PASV = 0; my $USER = getpwuid($<); sub print_help () ; sub print_usage () ; GetOptions( "V" => \$opt_V, "version" => \$opt_V, "h" => \$opt_h, "help" => \$opt_h, "t=i" => \$opt_t, "timeout=i" => \$opt_t, "w=i" => \$opt_w, "warning=i" => \$opt_w, "c=i" => \$opt_c, "critical=i" => \$opt_c, "fileage=i" => \$opt_a, "a=i" => \$opt_a, "p=s" => \$opt_p, "rrdpath=s" => \$opt_p, "passiv-hostname=s" => \$opt_phost, "passiv-servicedesc=s" => \$opt_pservice, "nagios-cmd=s" => \$opt_ncmd, "ignore-hosts=s" => \$opt_ignore, ) or print_help(); print_help() if ($opt_h); my $RRD_ERRORS = 0; my $RRD_ERR = ""; my $RRD_AGE = ""; my $XML_COUNT_AGE = 0; my $XML_COUNT = 0; my $RRD_COUNT = 0; my $RC = 0; my $OUT = "OK: "; my $PERF = ""; $SIG{'ALRM'} = sub { print "UNKNOWN: Timeout after $opt_t sec.\n"; exit 3; }; alarm($opt_t); $PASV = 1 if($opt_phost && $opt_pservice && $opt_ncmd); if($PASV == 1 && !-e $opt_ncmd){ print "\n\nUNKNOWN: $opt_ncmd does not exist\n\n"; print_usage(); exit 3; } if($PASV == 1 && !-w $opt_ncmd){ print "\n\nUNKNOWN: $opt_ncmd is not writable by \"$USER\" \n\n"; print_usage(); exit 3; } if ( -r $opt_p ) { find { no_chdir => 1, wanted => \&inspect_files, } => $opt_p } else { print "UNKNOWN: $opt_p not readable\n"; exit 3; } sub inspect_files { my $file = $File::Find::name; return unless m/\.xml$/; return unless -f $file; my $found = -1; my $TXT = "invalid xml file"; my $host; my $service; my $dir = $File::Find::dir; if ( $file =~ /\.xml/ ) { $service = basename($file); $host = dirname($file); $host = basename($host); if ( defined $opt_ignore && $host =~ $opt_ignore ) { return; } $XML_COUNT++; open F, $file or print "couldn't open $file\n" && return; while () { if (m/(.*)<\/RC>/) { $found = $1; } if ( $found != 0 && m/(.*)<\/TXT>/ ) { $TXT = $1; last; } } close F; my $mtime = ( stat($file) )[9]; my $fileage = ( ( time() - $mtime ) / 86400 ); if ( $fileage >= ( $opt_a ) ) { #print "Age -> ".$fileage."\n"; $XML_COUNT_AGE++; $RRD_AGE .= sprintf(".../%s/%s is %d days old.\n",$host,$service,$fileage); } $RRD_ERRORS++ if $found != "0"; $RRD_ERR .= ".../$host/$service $TXT\n" if $found != 0; } else { return; } } sub PROCESS_SERVICE_CHECK_RESULT { my $RC = shift; my $OUT = shift; my $time = time(); my $CommandLine = "[$time] PROCESS_SERVICE_CHECK_RESULT;$opt_phost;$opt_pservice;$RC;$OUT"; print "PROCESS_SERVICE_CHECK_RESULT\n"; print $OUT; open(CommandFile, ">>$opt_ncmd"); print CommandFile $CommandLine; close CommandFile; } if ( $XML_COUNT == 0 ) { print "UNKNOWN: No XML files found in $opt_p\n"; exit 3; } if ( $RRD_ERRORS >= $opt_w || $XML_COUNT_AGE >= $opt_w ) { $RC = 1; $OUT = "WARNING: "; } if ( $RRD_ERRORS >= $opt_c || $XML_COUNT_AGE >= $opt_c ) { $RC = 2; $OUT = "CRITICAL: "; } $OUT .= "$XML_COUNT XML Files checked. $RRD_ERRORS RRD Errors found. $XML_COUNT_AGE old XML Files found"; $PERF = " | total=$XML_COUNT errors=$RRD_ERRORS;$opt_w;$opt_c;0;$XML_COUNT old=$XML_COUNT_AGE;$opt_w;$opt_c;0;$XML_COUNT\n"; $OUT .= $PERF . $RRD_ERR . $RRD_AGE; if($PASV == 0){ print $OUT; exit $RC; }else{ PROCESS_SERVICE_CHECK_RESULT($RC,$OUT); } sub print_help (){ print "Copyright (c) 2008 Joerg Linge, Pitchfork\@pnp4nagios.org\n\n"; print "\n"; print "$PROGNAME $VERSION\n"; print "$PROGNAME is used to find old or unusable RRD Files\n"; print "\n"; print_usage(); print "\n"; print "\n"; print_support(); exit 3; } sub print_usage () { print "USAGE: $PROGNAME [OPTIONS]\n"; print " -w,--warning\n"; print " Default: $opt_w\n"; print " -c,--critical\n"; print " Default: $opt_c\n"; print " -a,--fileage Max XML File Age.\n"; print " Default: $opt_a Days\n"; print " -p,--rrdpath Path to your RRD and XML Files.\n"; print " Default: $opt_p\n"; print " -t,--timeout Max Plugin Runtime.\n"; print " Default: $opt_t Seconds\n"; print " --ignore-hosts \n"; print " Regular expression to ignore a set of hosts"; print "\n\n"; print " --passiv-hostname=\n"; print " Nagios Hostname\n"; print " --passiv-servicedesc=\n"; print " Nagios Servicedesc\n"; print " --nagios-cmd=\n"; print " External Command File (nagios.cmd)\n"; } sub print_support { print "SUPPORT: http://www.pnp4nagios.org/pnp/\n"; print "\n\n"; } # vim: set ai tabstop=4 shiftwidth=4 pnp4nagios-0.6.16/scripts/process_perfdata.pl.in0000664000000000000000000014632011662503006020350 0ustar rootroot#!@PERL@ # nagios: -epn ## @PKG_NAME@–@PKG_VERSION@ ## Copyright (c) 2005-2010 Joerg Linge (http://www.pnp4nagios.org) ## ## 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 2 ## 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, write to the Free Software ## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. @PERL_LIB_PATH_CODE@ if( $< == 0 ){ print "dont try this as root \n"; exit 1; } use warnings; use strict; use POSIX; use Getopt::Long; use Time::HiRes qw(gettimeofday tv_interval); use vars qw ( $TEMPLATE %NAGIOS $t0 $t1 $rt $delayed_write $rrdfile @ds_create $count $line $name $ds_update $dstype); my %conf = ( TIMEOUT => 15, CFG_DIR => "@sysconfdir@/", USE_RRDs => 1, RRDPATH => "@PERFDATA_DIR@", RRDTOOL => "@RRDTOOL@", RRD_STORAGE_TYPE => "SINGLE", RRD_HEARTBEAT => 8640, RRA_STEP => 60, RRA_CFG => "@sysconfdir@/rra.cfg", STATS_DIR => "@localstatedir@/stats", LOG_FILE => "@PERFDATA_LOG@", LOG_FILE_MAX_SIZE => "10485760", #Truncate after 10MB LOG_LEVEL => @DEBUG@, XML_ENC => "UTF-8", XML_UPDATE_DELAY => 0, # Write XML only if file is older then XML_UPDATE_DELAY seconds RRD_DAEMON_OPTS => "", GEARMAN_HOST => "localhost:4730", # How many gearman worker childs to start PREFORK => 2, # How many gearman worker childs to start REQUESTS_PER_CHILD => 20000, # Restart after a given count of requests ENCRYPTION => 1, # Decrypt mod_gearman packets KEY => 'should_be_changed', KEY_FILE => '@sysconfdir@/secret.key', UOM2TYPE => { 'c' => 'DERIVE', 'd' => 'DERIVE' }, ); my %const = ( XML_STRUCTURE_VERSION => "@XML_STRUCTURE_VERSION@", VERSION => "@PKG_VERSION@", ); # # Dont change anything below these lines ... # # # "rrdtool create" Syntax # my @default_rrd_create = ( "RRA:AVERAGE:0.5:1:2880", "RRA:AVERAGE:0.5:5:2880", "RRA:AVERAGE:0.5:30:4320", "RRA:AVERAGE:0.5:360:5840", "RRA:MAX:0.5:1:2880", "RRA:MAX:0.5:5:2880", "RRA:MAX:0.5:30:4320", "RRA:MAX:0.5:360:5840", "RRA:MIN:0.5:1:2880", "RRA:MIN:0.5:5:2880", "RRA:MIN:0.5:30:4320", "RRA:MIN:0.5:360:5840", ); Getopt::Long::Configure('bundling'); my ( $opt_d, $opt_V, $opt_h, $opt_i, $opt_n, $opt_b, $opt_gm, $opt_pidfile,$opt_daemon ); my $opt_t = $conf{TIMEOUT}; # Default Timeout my $opt_c = $conf{CFG_DIR} . "process_perfdata.cfg"; GetOptions( "V" => \$opt_V, "version" => \$opt_V, "h" => \$opt_h, "help" => \$opt_h, "i" => \$opt_i, "inetd" => \$opt_i, "b=s" => \$opt_b, "bulk=s" => \$opt_b, "d=s" => \$opt_d, "datatype=s" => \$opt_d, "t=i" => \$opt_t, "timeout=i" => \$opt_t, "c=s" => \$opt_c, "config=s" => \$opt_c, "n" => \$opt_n, "npcd" => \$opt_n, "gearman:s" => \$opt_gm, "daemon" => \$opt_daemon, "pidfile=s" => \$opt_pidfile, ); parse_config($opt_c); $conf{'GLOBAL_RRD_STORAGE_TYPE'} = uc($conf{'RRD_STORAGE_TYPE'}); # store the initial value for later use $opt_t = $conf{TIMEOUT}; # Reset Timeout from config file my %stats = init_stats(); my $cypher; # # RRDs Perl Module Detection # if ( $conf{USE_RRDs} == 1 ) { unless ( eval "use RRDs;1" ) { $conf{USE_RRDs} = 0; } } # # Include Gearman modules if needed # if ( defined($opt_gm) ) { unless ( eval "use Gearman::Worker;1" ) { print "Perl module Gearman::Worker not found\n"; exit 1; } unless ( eval "use MIME::Base64;1" ) { print "Perl module MIME::Base64 not found\n"; exit 1; } unless ( eval "use Crypt::Rijndael;1" ) { print "Perl module Crypt::Rijndael not found\n"; exit 1; } } print_help() if ($opt_h); print_version() if ($opt_V); init_signals(); my %children = (); # keys are current child process IDs my $children = 0; # current number of children if( ! defined($opt_gm) ){ # # synchronos / bulk / npcd mode # main(); }else{ # # Gearman worker main loop # print_log( "process_perfdata.pl-$const{VERSION} Gearman Worker Daemon", 0 ); if($opt_gm =~ /:\d+/ ){ $conf{'GEARMAN_HOST'} = $opt_gm; } if($conf{ENCRYPTION} == 1){ print_log( "Encryptions is enabled", 0 ); read_keyfile($conf{'KEY_FILE'}); # fill key up to 32 bytes $conf{'KEY'} = substr($conf{'KEY'},0,32) . chr(0) x ( 32 - length( $conf{'KEY'} ) ); $cypher = Crypt::Rijndael->new( $conf{'KEY'}, Crypt::Rijndael::MODE_ECB() ); } daemonize(); } # # Subs # # Main function to switch to the right mode. sub main { my $job = shift; my $t0 = [gettimeofday]; my $t1; my $rt; my $lines = 0; # Gearman Worker if (defined $opt_gm) { print_log( "Gearman Worker Job start", 1 ); %NAGIOS = parse_env($job->arg); $lines = process_perfdata(); $t1 = [gettimeofday]; $rt = tv_interval $t0, $t1; $stats{runtime} += $rt; $stats{rows}++; if( ( int $stats{timet} / 60 ) < ( int time / 60 )){ store_internals(); init_stats(); } print_log( "Gearman job end (runtime ${rt}s) ...", 1 ); return 1; } elsif ( $opt_b && !$opt_n ) { # Bulk mode alarm($opt_t); print_log( "process_perfdata.pl-$const{VERSION} starting in BULK Mode called by Nagios", 1 ); $lines = process_perfdata_file(); } elsif ( $opt_b && $opt_n ) { # Bulk mode with npcd alarm($opt_t); print_log( "process_perfdata.pl-$const{VERSION} starting in BULK Mode called by NPCD", 1 ); $lines = process_perfdata_file(); } else { # Synchronous mode $opt_t = 5 if $opt_t > 5; # maximum timeout alarm($opt_t); print_log( "process_perfdata.pl-$const{VERSION} starting in SYNC Mode", 1 ); %NAGIOS = parse_env(); $lines = process_perfdata(); } $rt = tv_interval $t0, $t1; $stats{runtime} = $rt; $stats{rows} = $lines; store_internals(); print_log( "PNP exiting (runtime ${rt}s) ...", 1 ); exit 0; } # # Parse %ENV and return a global hash %NAGIOS # sub parse_env { my $job_data = shift; %NAGIOS = (); $NAGIOS{DATATYPE} = "SERVICEPERFDATA"; if(defined $opt_gm){ # Gearman Worker $job_data = decode_base64($job_data); if($conf{ENCRYPTION} == 1){ $job_data = $cypher->decrypt( $job_data ) } my @LINE = split(/\t/, $job_data); foreach my $k (@LINE) { $k =~ /([A-Z 0-9_]+)::(.*)$/; $NAGIOS{$1} = $2 if ($2); } if ( !$NAGIOS{HOSTNAME} ) { print_log( "Gearman job data missmatch. Please check your encryption key.", 0 ); return %NAGIOS; } } elsif ( defined($opt_b) ){ # Bulk Mode my @LINE = split(/\t/, $job_data); foreach my $k (@LINE) { $k =~ /([A-Z 0-9_]+)::(.*)$/; $NAGIOS{$1} = $2 if ($2); } }else{ if ( ( !$ENV{NAGIOS_HOSTNAME} ) and ( !$ENV{ICINGA_HOSTNAME} ) ) { print_log( "Cant find Nagios Environment. Exiting ....", 1 ); exit 2; } foreach my $key ( sort keys %ENV ) { if ( $key =~ /^(NAGIOS|ICINGA)_(.*)/ ) { $NAGIOS{$2} = $ENV{$key}; } } } if ($opt_d) { $NAGIOS{DATATYPE} = $opt_d; } $NAGIOS{DISP_HOSTNAME} = $NAGIOS{HOSTNAME}; $NAGIOS{DISP_SERVICEDESC} = $NAGIOS{SERVICEDESC}; $NAGIOS{HOSTNAME} = cleanup( $NAGIOS{HOSTNAME} ); $NAGIOS{SERVICEDESC} = cleanup( $NAGIOS{SERVICEDESC} ); $NAGIOS{PERFDATA} = $NAGIOS{SERVICEPERFDATA}; $NAGIOS{CHECK_COMMAND} = $NAGIOS{SERVICECHECKCOMMAND}; if ( $NAGIOS{DATATYPE} eq "HOSTPERFDATA" ) { $NAGIOS{SERVICEDESC} = "_HOST_"; $NAGIOS{DISP_SERVICEDESC} = "Host Perfdata"; $NAGIOS{PERFDATA} = $NAGIOS{HOSTPERFDATA}; $NAGIOS{CHECK_COMMAND} = $NAGIOS{HOSTCHECKCOMMAND}; } print_log( "Datatype set to '$NAGIOS{DATATYPE}' ", 2 ); return %NAGIOS; } # # Perfdata sanity check # sub process_perfdata { if ( keys( %NAGIOS ) == 1 && defined($opt_gm) ) { $stats{skipped}++; return 1; } if ( ! defined($NAGIOS{PERFDATA}) && ! defined($opt_gm) ) { print_log( "No Performance Data for $NAGIOS{HOSTNAME} / $NAGIOS{SERVICEDESC} ", 1 ); if ( !$opt_b ) { print_log( "PNP exiting ...", 1 ); exit 3; } } if ( $NAGIOS{PERFDATA} =~ /^(.*)\s\[(.*)\]$/ ) { $NAGIOS{PERFDATA} = $1; $NAGIOS{CHECK_COMMAND} = $2; print_log( "Found Perfdata from Distributed Server $NAGIOS{HOSTNAME} / $NAGIOS{SERVICEDESC} ($NAGIOS{PERFDATA})", 1 ); } else { print_log( "Found Performance Data for $NAGIOS{HOSTNAME} / $NAGIOS{SERVICEDESC} ($NAGIOS{PERFDATA}) ", 1 ); } $NAGIOS{PERFDATA} =~ s/,/./g; $NAGIOS{PERFDATA} =~ s/\s+=/=/g; $NAGIOS{PERFDATA} =~ s/=\s+/=/g; $NAGIOS{PERFDATA} .= " "; parse_perfstring( $NAGIOS{PERFDATA} ); return 1; } # # Process Perfdata in Bulk Mode # sub process_perfdata_file { if ( $opt_b =~ /-PID-(\d+)/ ) { print_log( "Oops: $opt_b already processed by $1 - please check timeout settings", 0 ); } print_log( "searching for $opt_b", 2 ); if ( -e "$opt_b" ) { my $pdfile = "$opt_b" . "-PID-" . $$; print_log( "renaming $opt_b to $pdfile for bulk update", 2 ); unless ( rename "$opt_b", "$pdfile" ) { print_log( "ERROR: rename $opt_b to $pdfile failed", 1 ); exit 4; } print_log( "reading $pdfile for bulk update", 2 ); open( PDFILE, "< $pdfile" ); my $count = 0; while () { my $job_data = $_; $count++; print_log( "Processing Line $count", 2 ); my @LINE = split(/\t/); %NAGIOS = (); # cleaning %NAGIOS Hash #foreach my $k (@LINE) { # $k =~ /([A-Z 0-9_]+)::(.*)$/; # $ENV{ 'NAGIOS_' . $1 } = $2 if ($2); #} parse_env($job_data); if ( $NAGIOS{SERVICEPERFDATA} || $NAGIOS{HOSTPERFDATA} ) { process_perfdata(); } else { print_log( "No Perfdata. Skipping line $count", 2 ); $stats{skipped}++; } } print_log( "$count lines processed", 1 ); if ( unlink("$pdfile") == 1 ) { print_log( "$pdfile deleted", 1 ); }else { print_log( "Could not delete $pdfile:$!", 1 ); } return $count; } else { print_log( "ERROR: File $opt_b not found", 1 ); } } # # Write Data to RRD Files # sub data2rrd { my @data = @_; my @rrd_state = (); my $rrd_storage_type; print_log( "data2rrd called", 2 ); $NAGIOS{XMLFILE} = $conf{RRDPATH} . "/" . $data[0]{hostname} . "/" . $data[0]{servicedesc} . ".xml"; $NAGIOS{SERVICEDESC} = $data[0]{servicedesc}; $NAGIOS{DISP_SERVICEDESC} = $data[0]{disp_servicedesc}; $NAGIOS{AUTH_SERVICEDESC} = $data[0]{auth_servicedesc} || ""; $NAGIOS{AUTH_HOSTNAME} = $data[0]{auth_hostname} || ""; $NAGIOS{MULTI_PARENT} = ""; $NAGIOS{MULTI_PARENT} = $data[0]{multi_parent} || ""; $TEMPLATE = $data[0]{template}; unless ( -d "$conf{RRDPATH}" ) { unless ( mkdir "$conf{RRDPATH}" ) { print_log( "mkdir $conf{RRDPATH}, permission denied ", 1 ); print_log( "PNP exiting ...", 1 ); exit 5; } } unless ( -d "$conf{RRDPATH}/$NAGIOS{HOSTNAME}" ) { unless ( mkdir "$conf{RRDPATH}/$NAGIOS{HOSTNAME}" ) { print_log( "mkdir $conf{RRDPATH}/$NAGIOS{HOSTNAME}, permission denied ", 1 ); print_log( "PNP exiting ...", 1 ); exit 6; } } # # Create PHP Template File # open_template( $NAGIOS{XMLFILE} ); @ds_create = (); $ds_update = ''; for my $i ( 0 .. $#data ) { print_log( " -- Job $i ", 3 ); my $DS = $i + 1; # # for each datasource # for my $job ( sort keys %{ $data[$i] } ) { if ( defined $data[$i]{$job} ) { print_log( " -- $job -> $data[$i]{$job}", 3 ); } } if ( uc($conf{'GLOBAL_RRD_STORAGE_TYPE'}) eq "MULTIPLE" ) { my $file = $conf{RRDPATH} . "/" . $data[$i]{hostname} . "/" . $data[$i]{servicedesc} . ".rrd"; if ( -e $file ){ print_log("RRD_STORAGE_TYPE=MULTIPLE ignored because $file exists!", 1 ) if $i == 0; $data[$i]{rrd_storage_type} = "SINGLE"; } } if ( $i == 0 ){ $ds_update = "$data[$i]{timet}"; } if ( $data[$i]{rrd_storage_type} eq "MULTIPLE" ) { print_log( "DEBUG: MULTIPLE Storage Type", 3 ); $DS = 1; # PNP 0.4.x Template compatibility $NAGIOS{RRDFILE} = ""; # $rrd_storage_type = "MULTIPLE"; $rrdfile = $conf{RRDPATH} . "/" . $data[$i]{hostname} . "/" . $data[$i]{servicedesc} . "_" . $data[$i]{name} . ".rrd"; # DS is set to 1 @ds_create = "DS:$DS:$data[$i]{dstype}:$data[$i]{rrd_heartbeat}:$data[$i]{rrd_min}:$data[$i]{rrd_max}"; $ds_update = "$data[$i]{timet}:$data[$i]{value}"; @rrd_state = write_rrd(); @ds_create = (); $ds_update = ""; } else { print_log( "DEBUG: SINGLE Storage Type", 3 ); # PNP 0.4.x Template compatibility $NAGIOS{RRDFILE} = $conf{RRDPATH} . "/" . $data[0]{hostname} . "/" . $data[0]{servicedesc} . ".rrd"; # $rrd_storage_type = "SINGLE"; $rrdfile = $conf{RRDPATH} . "/" . $data[$i]{hostname} . "/" . $data[$i]{servicedesc} . ".rrd"; push( @ds_create, "DS:$DS:$data[$i]{dstype}:$data[$i]{rrd_heartbeat}:$data[$i]{rrd_min}:$data[$i]{rrd_max}" ); $ds_update = "$ds_update:$data[$i]{value}"; } write_to_template( "TEMPLATE", $data[0]{template} ); write_to_template( "RRDFILE", $rrdfile ); write_to_template( "RRD_STORAGE_TYPE", $data[$i]{rrd_storage_type} ); write_to_template( "RRD_HEARTBEAT", $data[$i]{rrd_heartbeat} ); write_to_template( "IS_MULTI", $data[0]{multi} ); write_to_template( "DS", $DS ); write_to_template( "NAME", $data[$i]{name} ); write_to_template( "LABEL", $data[$i]{label} ); write_to_template( "UNIT", $data[$i]{uom} ); write_to_template( "ACT", $data[$i]{value} ); write_to_template( "WARN", $data[$i]{warning} ); write_to_template( "WARN_MIN", $data[$i]{warning_min} ); write_to_template( "WARN_MAX", $data[$i]{warning_max} ); write_to_template( "WARN_RANGE_TYPE", $data[$i]{warning_range_type} ); write_to_template( "CRIT", $data[$i]{critical} ); write_to_template( "CRIT_MIN", $data[$i]{critical_min} ); write_to_template( "CRIT_MAX", $data[$i]{critical_max} ); write_to_template( "CRIT_RANGE_TYPE", $data[$i]{critical_range_type} ); write_to_template( "MIN", $data[$i]{min} ); write_to_template( "MAX", $data[$i]{max} ); } if ( $rrd_storage_type eq "SINGLE" ) { @rrd_state = write_rrd(); } write_state_to_template(@rrd_state); write_env_to_template(); close_template( $NAGIOS{XMLFILE} ); } sub write_rrd { my @rrd_create = (); my @rrd_state = (); print_log( "DEBUG: TPL-> $TEMPLATE", 3 ); print_log( "DEBUG: CRE-> @ds_create", 3 ); print_log( "DEBUG: UPD-> $ds_update", 3 ); if ( !-e "$rrdfile" ) { @rrd_create = parse_rra_config($TEMPLATE); if ( $conf{USE_RRDs} == 1 ) { print_log( "RRDs::create $rrdfile @rrd_create @ds_create --start=$NAGIOS{TIMET} --step=$conf{RRA_STEP}", 2 ); RRDs::create( "$rrdfile", @rrd_create, @ds_create, "--start=$NAGIOS{TIMET}", "--step=$conf{RRA_STEP}" ); my $err = RRDs::error(); if ($err) { print_log( "RRDs::create $rrdfile @rrd_create @ds_create --start=$NAGIOS{TIMET} --step=$conf{RRA_STEP}", 0 ); print_log( "RRDs::create ERROR $err", 0 ); @rrd_state = ( 1, $err ); $stats{error}++; } else { print_log( "$rrdfile created", 2 ); @rrd_state = ( 0, "just created" ); $stats{create}++; } } else { print_log( "RRDs Perl Modules are not installed. Falling back to rrdtool system call.", 2 ); print_log( "$conf{RRDTOOL} create $rrdfile @rrd_create @ds_create --start=$NAGIOS{TIMET} --step=$conf{RRA_STEP}", 2 ); system("$conf{RRDTOOL} create $rrdfile @rrd_create @ds_create --start=$NAGIOS{TIMET} --step=$conf{RRA_STEP}"); if ( $? > 0 ) { print_log( "$conf{RRDTOOL} create $rrdfile @rrd_create @ds_create --start=$NAGIOS{TIMET} --step=$conf{RRA_STEP}", 0 ); print_log( "rrdtool create returns $?", 0 ); @rrd_state = ( $?, "create failed" ); $stats{error}++; } else { print_log( "rrdtool create returns $?", 1 ); @rrd_state = ( 0, "just created" ); $stats{create}++; } } } else { if ( $conf{USE_RRDs} == 1 ) { if ( $conf{RRD_DAEMON_OPTS} ) { print_log( "RRDs::update --daemon=$conf{RRD_DAEMON_OPTS} $rrdfile $ds_update", 2 ); RRDs::update( "--daemon=$conf{RRD_DAEMON_OPTS}", "$rrdfile", "$ds_update" ); } else { print_log( "RRDs::update $rrdfile $ds_update", 2 ); RRDs::update( "$rrdfile", "$ds_update" ); } my $err = RRDs::error(); if ($err) { print_log( "RRDs::update $rrdfile $ds_update", 0 ); print_log( "RRDs::update ERROR $err", 0 ); @rrd_state = ( 1, $err ); $stats{error}++; } else { print_log( "$rrdfile updated", 2 ); @rrd_state = ( 0, "successful updated" ); $stats{update}++; } } else { print_log( "RRDs Perl Modules are not installed. Falling back to rrdtool system call.", 2 ); if ( $conf{RRD_DAEMON_OPTS} ) { print_log( "$conf{RRDTOOL} update --daemon=$conf{RRD_DAEMON_OPTS} $rrdfile $ds_update", 2 ); system("$conf{RRDTOOL} update --daemon=$conf{RRD_DAEMON_OPTS} $rrdfile $ds_update"); } else { print_log( "$conf{RRDTOOL} update $rrdfile $ds_update", 2 ); system("$conf{RRDTOOL} update $rrdfile $ds_update"); } if ( $? > 0 ) { print_log( "$conf{RRDTOOL} update $rrdfile $ds_update", 0 ); print_log( "rrdtool update returns $?", 0 ); @rrd_state = ( $?, "update failed" ); $stats{error}++; } else { print_log( "rrdtool update returns $?", 1 ); @rrd_state = ( $?, "successful updated" ); $stats{update}++; } } } return @rrd_state; } # # Write Template # sub open_template { my $xmlfile = shift; $delayed_write = 0; if( -e $xmlfile ){ my $mtime = (stat($xmlfile))[9]; my $t = time(); my $age = ($t - $mtime); if ( $age < $conf{'XML_UPDATE_DELAY'} ){ print_log( "DEBUG: XML File is $age seconds old. No update needed", 3 ); $delayed_write = 1; return; } print_log( "DEBUG: XML File is $age seconds old. UPDATE!", 3 ); } open( XML, "> $xmlfile.$$" ) or die "Cant create temporary XML file ", $!; print XML "\n"; print XML "\n"; } # # Close Template FH # sub close_template { return if $delayed_write == 1; my $xmlfile = shift; printf( XML " \n" ); printf( XML " %d\n", $const{'XML_STRUCTURE_VERSION'} ); printf( XML " \n" ); printf( XML "\n" ); close(XML); rename( "$xmlfile.$$", "$xmlfile" ); } # # Add Lines # sub write_to_template { return if $delayed_write == 1; my $tag = shift; my $data = shift; if ( !defined $data ) { $data = ""; } if ( $tag =~ /^TEMPLATE$/ ) { printf( XML " \n" ); printf( XML " <%s>%s\n", $tag, "$data", $tag ); } elsif ( $tag =~ /^MAX$/ ) { printf( XML " <%s>%s\n", $tag, "$data", $tag ); printf( XML " \n" ); } else { printf( XML " <%s>%s\n", $tag, "$data", $tag ); } } sub write_state_to_template { return if $delayed_write == 1; my @rrd_state = @_; printf( XML " \n" ); printf( XML " %s\n", $rrd_state[0] ); printf( XML " %s\n", $rrd_state[1] ); printf( XML " \n" ); } # # Store the complete Nagios ENV # sub write_env_to_template { return if $delayed_write == 1; foreach my $key ( sort keys %NAGIOS ) { $NAGIOS{$key} = urlencode($NAGIOS{$key}); printf( XML " %s\n", $key, $NAGIOS{$key}, $key ); } } # # Recursive Template search # sub adjust_template { my $command = shift; my $uom = shift; my $count = shift; my @temp_template = split /\!/, $command; my $initial_template = cleanup( $temp_template[0] ); my $template = cleanup( $temp_template[0] ); my %CTPL = read_custom_template ( $command, $uom, $count ); # if ( $CTPL{'TEMPLATE'} ne $initial_template ){ %CTPL = read_custom_template ( $CTPL{'TEMPLATE'}, $uom, $count ); } return %CTPL; } # # Analyse check_command to find PNP Template . # sub read_custom_template { my $command = shift; my $uom = shift; my $count = shift; my @dstype_list = (); my $use_min_on_create = 0; my $use_max_on_create = 0; my $rrd_storage_type = $conf{'RRD_STORAGE_TYPE'}; my $rrd_heartbeat = $conf{'RRD_HEARTBEAT'}; if ( defined($conf{'UOM2TYPE'}{$uom}) ) { $dstype = $conf{'UOM2TYPE'}{$uom}; print_log( "DEBUG: DSTYPE adjusted to $dstype by UOM", 3 ); }else { $dstype = 'GAUGE'; } print_log( "DEBUG: RAW Command -> $command", 3 ); my @temp_template = split /\!/, $command; my $template = cleanup( $temp_template[0] ); $template = trim($template); my $template_cfg = "$conf{CFG_DIR}/check_commands/$template.cfg"; if ( -e $template_cfg ) { print_log( "DEBUG: adjust_template() => $template_cfg", 3 ); my $initial_dstype = $dstype; open FH, "<", $template_cfg; while () { next if /^#/; next if /^$/; s/#.*//; s/ //g; if (/^(.*)=(.*)$/) { if ( $1 eq "DATATYPE" ) { $dstype = uc($2); $dstype =~ s/ //g; @dstype_list = split /,/, $dstype; if ( exists $dstype_list[$count] && $dstype_list[$count] =~ /^(COUNTER|GAUGE|ABSOLUTE|DERIVE)$/ ) { $dstype = $dstype_list[$count]; print_log( "Adapting RRD Datatype to \"$dstype\" as defined in $template_cfg with key $count", 2 ); } elsif ( $dstype =~ /^(COUNTER|GAUGE|ABSOLUTE|DERIVE)$/ ) { print_log( "Adapting RRD Datatype to \"$dstype\" as defined in $template_cfg", 2 ); } else { print_log( "RRD Datatype \"$dstype\" defined in $template_cfg is invalid", 2 ); $dstype = $initial_dstype; } } if ( $1 eq "CUSTOM_TEMPLATE" ) { print_log( "Adapting Template using ARG $2", 2 ); my $i = 1; my @keys = split /,/, $2; foreach my $keys (@keys) { if ( $i == 1 && exists $temp_template[$keys] ) { $template = trim( $temp_template[$keys] ); print_log( "Adapting Template to $template.php (added ARG$keys)", 2 ); }elsif( exists $temp_template[$keys] ){ $template .= "_" . trim( $temp_template[$keys] ); print_log( "Adapting Template to $template.php (added ARG$keys)", 2 ); } $i++; } print_log( "Adapting Template to $template.php as defined in $template_cfg", 2 ); } if ( $1 eq "USE_MIN_ON_CREATE" && $2 eq "1" ) { $use_min_on_create = 1; } if ( $1 eq "USE_MAX_ON_CREATE" && $2 eq "1" ) { $use_max_on_create = 1; } if ( $1 eq "RRD_STORAGE_TYPE" && uc($2) eq "MULTIPLE" ) { $rrd_storage_type = uc($2); } if ( $1 eq "RRD_HEARTBEAT" ) { $rrd_heartbeat = $2; } } } close FH; } else { print_log( "No Custom Template found for $template ($template_cfg) ", 2 ); print_log( "RRD Datatype is $dstype", 3 ); } print_log( "Template is $template.php", 2 ); my %CTPL = ( TEMPLATE => $template, DSTYPE => $dstype, RRD_STORAGE_TYPE => $rrd_storage_type, RRD_HEARTBEAT => $rrd_heartbeat, USE_MIN_ON_CREATE => $use_min_on_create, USE_MAX_ON_CREATE => $use_max_on_create, ); return %CTPL; } # # Parse process_perfdata.cfg # sub parse_config { my $config_file = shift; my $line = 0; if ( -e $config_file ) { open CFG, '<', "$config_file"; while () { $line++; chomp; s/ //g; next if /^#/; next if /^$/; s/#.*//; if (/^(.*)=(.*)$/) { if ( defined $conf{$1} ) { $conf{$1} = $2; } } } close CFG; print_log( "Using Config File $config_file parameters", 2 ); } else { print_log( "Config File $config_file not found, using defaults", 2 ); } } # # Parse rra.cfg # sub parse_rra_config { my $template = shift; my $rra_template = ""; my @rrd_create = @default_rrd_create; if ( -e $conf{'CFG_DIR'} . "/" . $template . ".rra.cfg" ) { $rra_template = $conf{'CFG_DIR'} . "/" . $template . ".rra.cfg"; print_log( "Reading $rra_template", 2 ); } elsif ( -e $conf{'RRA_CFG'} ) { $rra_template = $conf{'RRA_CFG'}; print_log( "Reading $conf{'RRA_CFG'}", 2 ); } else { print_log( "No rra.cfg found. Using default values.", 2 ); } if ( $rra_template ne "" ) { @rrd_create = (); open RRA, "<", $rra_template; while () { next if /^#/; next if /^$/; s/#.*//; if(/^RRA_STEP=(\d+)/i){ $conf{'RRA_STEP'} = $1; next; } chomp; push @rrd_create, "$_"; } close RRA; } else { @rrd_create = @default_rrd_create; } return @rrd_create; } # # Function adapted from Nagios::Plugin::Performance # Thanks to Gavin Carr and Ton Voon # sub _parse { # Nagios::Plugin::Performance my $string = shift; my $tmp_string = $string; $string =~ s/^([^=]+)=([\d\.\-]+)([\w\/%]*);?([\d\.\-:~@]+)?;?([\d\.\-:~@]+)?;?([\d\.\-]+)?;?([\d\.\-]+)?;?\s*//; if ( $tmp_string eq $string ) { print_log( "No pattern match in function _parse($string)", 2 ); return undef; } return undef unless ( ( defined $1 && $1 ne "" ) && ( defined $2 && $2 ne "" ) ); # create hash from all performance data values my %p = ( "label" => $1, "name" => $1, "value" => $2, "uom" => $3, "warning" => $4, "critical" => $5, "min" => $6, "max" => $7 ); $p{label} =~ s/[']//g; # cleanup $p{name} =~ s/[']//g; # cleanup $p{name} =~ s/[\/\\]/_/g; # cleanup $p{name} = cleanup($p{name}); if ( $p{uom} eq "%" ) { $p{uom} = "%%"; print_log( "DEBUG: UOM adjust = $p{uom}", 3 ); } # # Check for warning and critical ranges # if ( $p{warning} && $p{warning} =~ /^([\d\.\-~@]+)?:([\d\.\-~@]+)?$/ ) { print_log( "DEBUG: Processing warning ranges ( $p{warning} )", 3 ); $p{warning_min} = $1; $p{warning_max} = $2; delete( $p{warning} ); if ( $p{warning_min} =~ /^@/ ) { $p{warning_min} =~ s/@//; $p{warning_range_type} = "inside"; } else { $p{warning_range_type} = "outside"; } } if ( $p{critical} && $p{critical} =~ /^([\d\.\-~@]+)?:([\d\.\-~@]+)?$/ ) { print_log( "DEBUG: Processing critical ranges ( $p{critical} )", 3 ); $p{critical_min} = $1; $p{critical_max} = $2; delete( $p{critical} ); if ( $p{critical_min} =~ /^@/ ) { $p{critical_min} =~ s/@//; $p{critical_range_type} = "inside"; } else { $p{critical_range_type} = "outside"; } } # Strip Range indicators $p{warning} =~ s/[~@]// if($p{warning}); $p{critical} =~ s/[~@]// if($p{critical}); return ( $string, %p ); } # # clean Strings # sub cleanup { my $string = shift; if ($string) { $string =~ s/[ :\/\\]/_/g; } return $string; } # # Urlencode # sub urlencode { my $string = shift; if ($string) { $string =~ s/([<>&])/sprintf("%%%02x",ord($1))/eg; # URLencode; } return $string; } # # Trim leading whitespaces # sub trim { my $string = shift; $string =~ s/^\s*//g; return $string; } # # Parse the Performance String and call data2rrd() # sub parse_perfstring { # # Default RRD Datatype # Value will be overwritten by adjust_template() # my %CTPL = (); $dstype = "GAUGE"; my $perfstring = shift; my $is_multi = "0"; my @perfs; my @multi; my %p; my $use_min_on_create = 0; my $use_max_on_create = 0; # # check_multi # if ( $perfstring =~ /^[']?([a-zA-Z0-9\.\-_\s\/\#]+)::([a-zA-Z0-9\.\-_\s]+)::([^=]+)[']?=/ ) { $is_multi = 1; print_log( "check_multi Perfdata start", 3 ); my $count = 0; my $check_multi_blockcount = 0; my $multi_parent = cleanup( $NAGIOS{SERVICEDESC} ); my $auth_servicedesc = $NAGIOS{DISP_SERVICEDESC}; while ($perfstring) { ( $perfstring, %p ) = _parse($perfstring); if ( !$p{label} ) { print_log( "Invalid Perfdata detected ", 1 ); $stats{invalid}++; @perfs = (); last; } if ( $p{label} =~ /^[']?([a-zA-Z0-9\.\-_\s\/\#]+)::([a-zA-Z0-9\.\-_\s]+)::([^=]+)[']?$/ ) { @multi = ( $1, $2, $3 ); if ( $count == 0 ) { print_log( "DEBUG: First check_multi block", 3 ); # Keep servicedesc while processing the first block. $p{servicedesc} = cleanup( $NAGIOS{SERVICEDESC} ); $p{disp_servicedesc} = $NAGIOS{DISP_SERVICEDESC}; $p{auth_servicedesc} = $auth_servicedesc; $p{multi} = 1; $p{multi_parent} = $multi_parent; } else { print_log( "DEBUG: A new check_multi block ($count) starts", 3 ); $p{servicedesc} = cleanup( $multi[0] ); # Use the multi servicedesc. $p{multi} = 2; $p{multi_parent} = $multi_parent; $p{servicedesc} = cleanup( $multi[0] ); # Use the multi servicedesc. $p{disp_servicedesc} = cleanup( $multi[0] ); # Use the multi servicedesc. $p{auth_servicedesc} = $auth_servicedesc; data2rrd(@perfs) if ( $#perfs >= 0 ); # Process when a new block starts. @perfs = (); # Clear the perfs array. # reset check_multi block count $check_multi_blockcount = 0; } %CTPL = adjust_template( $multi[1], $p{uom}, $check_multi_blockcount++ ); if ( $CTPL{'USE_MAX_ON_CREATE'} == 1 && defined $p{max} ) { $p{rrd_max} = $p{max}; } else { $p{rrd_max} = "U"; } if ( $CTPL{'USE_MIN_ON_CREATE'} == 1 && defined $p{min} ) { $p{rrd_min} = $p{min}; } elsif( $CTPL{'DSTYPE'} eq 'DERIVE' ){ $p{rrd_min} = 0; # Add minimum value 0 if DSTYPE = DERIVE } else { $p{rrd_min} = "U"; } $p{template} = $CTPL{'TEMPLATE'}; $p{dstype} = $CTPL{'DSTYPE'}; $p{rrd_storage_type} = $CTPL{'RRD_STORAGE_TYPE'}; $p{rrd_heartbeat} = $CTPL{'RRD_HEARTBEAT'}; $p{label} = cleanup( $multi[2] ); # store the original label from check_multi header $p{name} = cleanup( $multi[2] ); # store the original label from check_multi header $p{hostname} = cleanup( $NAGIOS{HOSTNAME} ); $p{disp_hostname} = $NAGIOS{DISP_HOSTNAME}; $p{auth_hostname} = $NAGIOS{HOSTNAME}; $p{timet} = $NAGIOS{TIMET}; push @perfs, {%p}; $count++; } else { print_log( "DEBUG: Next check_multi data for block $count multiblock $check_multi_blockcount", 3 ); # additional check_multi data %CTPL = adjust_template( $multi[1], $p{uom}, $check_multi_blockcount++ ); if ( $CTPL{'USE_MAX_ON_CREATE'} == 1 && defined $p{max} ) { $p{rrd_max} = $p{max}; } else { $p{rrd_max} = "U"; } if ( $CTPL{'USE_MIN_ON_CREATE'} == 1 && defined $p{min} ) { $p{rrd_min} = $p{min}; } elsif( $CTPL{'DSTYPE'} eq 'DERIVE' ){ $p{rrd_min} = 0; # Add minimum value 0 if DSTYPE = DERIVE } else { $p{rrd_min} = "U"; } $p{template} = $CTPL{'TEMPLATE'}; $p{dstype} = $CTPL{'DSTYPE'}; $p{rrd_storage_type} = $CTPL{'RRD_STORAGE_TYPE'}; $p{rrd_heartbeat} = $CTPL{'RRD_HEARTBEAT'}; $p{hostname} = cleanup( $NAGIOS{HOSTNAME} ); $p{disp_hostname} = $NAGIOS{DISP_HOSTNAME}; $p{auth_hostname} = $NAGIOS{HOSTNAME}; $p{timet} = $NAGIOS{TIMET}; if ( $count == 1 ) { $p{servicedesc} = cleanup( $NAGIOS{SERVICEDESC} ); # Use the servicedesc. $p{disp_servicedesc} = $NAGIOS{DISP_SERVICEDESC}; # Use the servicedesc. } else { $p{servicedesc} = cleanup( $multi[0] ); # Use the multi servicedesc. $p{disp_servicedesc} = $multi[0]; # Use the multi servicedesc. } $p{multi} = $is_multi; $p{multi_parent} = $multi_parent; $p{auth_servicedesc} = $auth_servicedesc; # Use the servicedesc. push @perfs, {%p}; } } data2rrd(@perfs) if ( $#perfs >= 0 ); @perfs = (); } else { # # Normal Performance Data # print_log( "DEBUG: Normal perfdata", 3 ); my $count = 0; while ($perfstring) { ( $perfstring, %p ) = _parse($perfstring); if ( !$p{label} ) { print_log( "Invalid Perfdata detected ", 1 ); @perfs = (); last; } %CTPL = adjust_template( $NAGIOS{CHECK_COMMAND}, $p{uom}, $count ); if ( $CTPL{'USE_MAX_ON_CREATE'} == 1 && defined $p{max} ) { $p{rrd_max} = $p{max}; } else { $p{rrd_max} = "U"; } if ( $CTPL{'USE_MIN_ON_CREATE'} == 1 && defined $p{min} ) { $p{rrd_min} = $p{min}; } elsif ( $CTPL{'DSTYPE'} eq 'DERIVE' ){ $p{rrd_min} = 0; # Add minimum value 0 if DSTYPE = DERIVE } else { $p{rrd_min} = "U"; } $p{template} = $CTPL{'TEMPLATE'}; $p{dstype} = $CTPL{'DSTYPE'}; $p{rrd_storage_type} = $CTPL{'RRD_STORAGE_TYPE'}; $p{rrd_heartbeat} = $CTPL{'RRD_HEARTBEAT'}; $p{multi} = $is_multi; $p{hostname} = cleanup( $NAGIOS{HOSTNAME} ); $p{disp_hostname} = $NAGIOS{DISP_HOSTNAME}; $p{auth_hostname} = $NAGIOS{DISP_HOSTNAME}; $p{servicedesc} = cleanup( $NAGIOS{SERVICEDESC} ); $p{disp_servicedesc} = $NAGIOS{DISP_SERVICEDESC}; $p{auth_servicedesc} = $NAGIOS{DISP_SERVICEDESC}; $p{timet} = $NAGIOS{TIMET}; push @perfs, {%p}; $count++; } data2rrd(@perfs) if ( $#perfs >= 0 ); @perfs = (); } } # # Write to Logfile # sub print_log { my $out = shift; my $severity = shift; if ( $severity <= $conf{LOG_LEVEL} ) { open( LOG, ">>" . $conf{LOG_FILE} ) || die "Can't open logfile ($conf{LOG_FILE}) ", $!; if ( -s LOG > $conf{LOG_FILE_MAX_SIZE} ) { truncate( LOG, 0 ); printf( LOG "File truncated" ); } my ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) = localtime(time); printf( LOG "%02d-%02d-%02d %02d:%02d:%02d [%d] [%d] %s\n", $year + 1900, $mon + 1, $mday, $hour, $min, $sec, $$, $severity, $out ); close(LOG); } } # # Signals and Handlers # sub init_signals { $SIG{'INT'} = \&handle_signal; $SIG{'QUIT'} = \&handle_signal; $SIG{'ALRM'} = \&handle_signal; $SIG{'ILL'} = \&handle_signal; $SIG{'ABRT'} = \&handle_signal; $SIG{'FPE'} = \&handle_signal; $SIG{'SEGV'} = \&handle_signal; $SIG{'TERM'} = \&handle_signal; $SIG{'BUS'} = \&handle_signal; $SIG{'SYS'} = \&handle_signal; $SIG{'XCPU'} = \&handle_signal; $SIG{'XFSZ'} = \&handle_signal; $SIG{'IOT'} = \&handle_signal; $SIG{'PIPE'} = \&handle_signal; $SIG{'HUP'} = \&handle_signal; $SIG{'CHLD'} = \&handle_signal; } # # Handle Signals # sub handle_signal { my ($signal) = (@_); # # Gearman child process # if ( defined ( $opt_gm ) ){ if($signal eq "CHLD" && defined($opt_gm) ){ my $pid = waitpid(-1, &WNOHANG); if($pid == -1){ print_log( "### no hanging child ###", 1 ); } elsif ( WIFEXITED($?)) { print_log( "### child $pid exited ###", 1 ); $children--; } else { print_log( "### wrong signal ###", 1 ); $children--; } $SIG{'CHLD'} = \&handle_signal; } if($signal eq "INT" || $signal eq "TERM"){ local($SIG{CHLD}) = 'IGNORE'; # we're going to kill our children kill $signal => keys %children; print_log( "*** process_perfdata.pl terminated on signal $signal", 0 ); pidlock("remove"); exit; # clean up with dignity } print_log( "*** process_perfdata.pl received signal $signal (ignored)", 0 ); }else{ if ( $signal eq "ALRM" ) { print_log( "*** TIMEOUT: Timeout after $opt_t secs. ***", 0 ); if ( $opt_b && !$opt_n ) { print_log( "*** TIMEOUT: Deleting current file to avoid loops", 0 ); print_log( "*** TIMEOUT: Please check your process_perfdata.cfg", 0 ); } elsif ( $opt_b && $opt_n ) { print_log( "*** TIMEOUT: Deleting current file to avoid NPCD loops", 0 ); print_log( "*** TIMEOUT: Please check your process_perfdata.cfg", 0 ); } if ($opt_b) { my $pdfile = "$opt_b" . "-PID-" . $$; if ( unlink("$pdfile") == 1 ) { print_log( "*** TIMEOUT: $pdfile deleted", 0 ); } else { print_log( "*** TIMEOUT: Could not delete $pdfile:$!", 0 ); } } my $temp_file = "$conf{RRDPATH}/$NAGIOS{HOSTNAME}/$NAGIOS{SERVICEDESC}.xml.$$"; if ( -f $temp_file ) { unlink($temp_file); } $t1 = [gettimeofday]; $rt = tv_interval $t0, $t1; $stats{runtime} = $rt; print_log( "*** Timeout while processing Host: \"$NAGIOS{HOSTNAME}\" Service: \"$NAGIOS{SERVICEDESC}\"", 0 ); print_log( "*** process_perfdata.pl terminated on signal $signal", 0 ); exit 7; } } } sub init_stats { %stats = ( timet => time, error => 0, invalid => 0, skipped => 0, runtime => 0, rows => 0, create => 0, update => 0, ); } # # Store some internal runtime infos # sub store_internals { if( ! -w $conf{'STATS_DIR'}){ print_log("*** ERROR: ".$conf{'STATS_DIR'}." is not writable or does not exist",0); return; } my $statsfile = $conf{'STATS_DIR'}."/".(int $stats{timet} / 60); open( STAT, ">> $statsfile" ) or die "Cant create statistic file ", $!; printf(STAT "%d %f %d %d %d %d %d %d\n", $stats{timet},$stats{runtime},$stats{rows},$stats{update},$stats{create},$stats{error},$stats{invalid},$stats{skipped}); close(STAT); check_internals(); } # # Search for statistic files # sub check_internals { my $file; my @files; opendir(STATS, $conf{'STATS_DIR'}); while ( defined ( my $file = readdir STATS) ){ next if $file =~ /^\.\.?$/; # skip . and .. next if $file =~ /-PID-/; # skip temporary files next if $file == (int $stats{timet} / 60); # skip our current file push @files, $file; } read_internals(@files); } # # Read and aggregate files found by check_internals() # sub read_internals { my @files = @_; my @chunks; foreach my $file (sort { $a <=> $b} @files){ unless ( rename($conf{'STATS_DIR'}."/".$file, $conf{'STATS_DIR'}."/".$file."-PID-".$$) ){ print_log( "ERROR: renaming stats file " . $conf{'STATS_DIR'}."/".$file . " to " . $conf{'STATS_DIR'}."/".$file."-PID-".$$ . " failed", 1 ); next; } open( STAT, "< ".$conf{'STATS_DIR'}."/".$file."-PID-".$$ ); %stats = ( timet => 0, error => 0, invalid => 0, skipped => 0, runtime => 0, rows => 0, create => 0, update => 0, ); while(){ @chunks = split(); $stats{timet} = $chunks[0]; $stats{runtime} += $chunks[1]; $stats{rows} += $chunks[2]; $stats{update} += $chunks[3]; $stats{create} += $chunks[4]; $stats{error} += $chunks[5]; $stats{invalid} += $chunks[6]; $stats{skipped} += $chunks[7]; } close(STAT); unlink($conf{'STATS_DIR'}."/".$file."-PID-".$$); process_internals(); } } # # # sub process_internals { my $last_rrd_dtorage_type = $conf{'RRD_STORAGE_TYPE'}; $conf{'RRD_STORAGE_TYPE'} = "MULTIPLE"; %NAGIOS = ( HOSTNAME => '.pnp-internal', DISP_HOSTNAME => 'pnp-internal', SERVICEDESC => 'runtime', DISP_SERVICEDESC => 'runtime', TIMET => $stats{timet}, DATATYPE => 'SERVICEPERFDATA', CHECK_COMMAND => 'pnp-runtime', PERFDATA => "runtime=".$stats{runtime}."s rows=".$stats{rows}." errors=".$stats{error}." invalid=".$stats{invalid}." skipped=".$stats{skipped} ." update=".$stats{update}. " create=".$stats{create} ); parse_perfstring( $NAGIOS{PERFDATA} ); $conf{'RRD_STORAGE_TYPE'} = $last_rrd_dtorage_type; } # # Gearman Worker Daemon # sub daemonize { if( defined($opt_daemon) ){ print_log("daemonize init",1); chdir '/' or die "Can't chdir to /: $!"; open STDIN, '/dev/null' or die "Can't read /dev/null: $!"; open STDOUT, '>>/dev/null' or die "Can't write to /dev/null: $!"; open STDERR, '>>/dev/null' or die "Can't write to /dev/null: $!"; defined( my $pid = fork ) or die "Can't fork: $!"; exit if $pid; pidlock("create"); setsid or die "Can't start a new session: $!"; } else { pidlock("create"); } # Fork off our children. for (1 .. $conf{'PREFORK'}) { new_child(); print_log( "starting child process $children", 1 ); } while (1) { sleep; # wait for a signal (i.e., child's death) for (my $i = $children; $i < $conf{'PREFORK'}; $i++) { print_log("starting new child (running = $i)",1); new_child(); # top up the child pool } } return; } # # start a new worker process # sub new_child { my $pid; my $sigset; my $req = 0; # block signal for fork $sigset = POSIX::SigSet->new(SIGINT); sigprocmask(SIG_BLOCK, $sigset) or die "Can't block SIGINT for fork: $!\n"; die "fork: $!" unless defined ($pid = fork); if ($pid) { # Parent records the child's birth and returns. sigprocmask(SIG_UNBLOCK, $sigset) or die "Can't unblock SIGINT for fork: $!\n"; $children{$pid} = 1; $children++; return; } else { # Child can *not* return from this subroutine. $SIG{INT} = 'DEFAULT'; # make SIGINT kill us as it did before # unblock signals sigprocmask(SIG_UNBLOCK, $sigset) or die "Can't unblock SIGINT for fork: $!\n"; my $worker = Gearman::Worker->new(); $worker->job_servers($conf{'GEARMAN_HOST'}); $worker->register_function("perfdata", 2, sub { return main(@_); }); my %opt = ( on_complete => sub { $req++; }, stop_if => sub { if ( $req > $conf{'REQUESTS_PER_CHILD'} ) { return 1;}; } ); print_log("connecting to gearmand '".$conf{'GEARMAN_HOST'}."'",0); $worker->work( %opt ); print_log("max requests per child reached (".$conf{'REQUESTS_PER_CHILD'}.")",1); # this exit is VERY important, otherwise the child will become # a producer of more and more children, forking yourself into # process death. exit; } } # # Create a pid file # sub pidlock { return unless defined $opt_pidfile; my $action = shift; my $PIDFILE = $opt_pidfile; if($action eq "create"){ if ( -e $PIDFILE ) { if ( open( OLDPID, "<$PIDFILE" ) ) { $_ = ; chop($_); my $oldpid = $_; close(OLDPID); if ( -e "/proc/$oldpid/cmdline" ) { print_log("Another instance is already running with PID: $oldpid",0); exit 0; } else { print_log("Pidfile $PIDFILE seems to be stale!",0); print_log("Removing old pidfile",0); unlink $PIDFILE; } } } if ( !open( PID, ">$PIDFILE" ) ) { print_log("Can not create $PIDFILE ( $! )",0); exit 1; } print( PID "$$\n" ); close(PID); print_log("Pidfile ($PIDFILE) created",0); }elsif( $action eq "remove" ){ if ( -e $PIDFILE ) { print_log("Removing pidfile ($PIDFILE)",0); unlink $PIDFILE; } } } # # Read crypt key # sub read_keyfile { my $file = shift; my $key = ''; if( -r $file){ open(FH, "<", $file); while(){ chomp(); # avoid \n on last field $conf{'KEY'} = $_; last; } close(FH); print_log("Using encryption key specified in '$file'",0); return 1; }else{ print_log("Using encryption key specified in ".$conf{'CFG_DIR'}."/process_perfdata.cfg",0); return 0; } } # # # sub print_help { print < Use process_perfdata.pl to store Nagios Plugin Performance Data into RRD Databases Options: -h, --help Print detailed help screen -V, --version Print version information -t, --timeout=INTEGER Seconds before process_perfdata.pl times out (default: $opt_t) -i, --inetd Use this Option if process_perfdata.pl is executed by inetd/xinetd. -d, --datatype Defaults to \"SERVICEPERFDATA\". Use \"HOSTPERFDATA\" to process Perfdata from regular Host Checks Only used in default or inetd Mode -b, --bulk Provide a file for bulk update -c, --config Optional process_perfdata config file Default: @sysconfdir@/process_perfdata.cfg Gearman Worker Options: --gearman Start in gearman worker mode --daemon Run as daemon --pidfile=/var/run/process_perfdata.pid The pidfile used while running in as gearman worker daemon EOD exit 0; } # # # sub print_version { print "Version: process_perfdata.pl $const{VERSION}\n"; print "Copyright (c) 2005-2010 Joerg Linge \n"; exit 0; } pnp4nagios-0.6.16/scripts/rrd_convert.pl.in0000775000000000000000000003223511662503006017355 0ustar rootroot#!@PERL@ ## @PKG_NAME@–@PKG_VERSION@ rrd_convert.pl ## Copyright (c) 2006-2010 Joerg Linge (http://www.pnp4nagios.org) ## ## 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 2 ## 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, write to the Free Software ## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. @PERL_LIB_PATH_CODE@ use strict; use warnings; use Getopt::Long; use Time::HiRes qw(gettimeofday tv_interval); use File::Find; use File::Copy; if( $< == 0 ){ print "dont try this as root \n"; exit 1; } # # Some global Vars # my %conf = ( CFG_DIR => "@sysconfdir@/", RRDPATH => "@PERFDATA_DIR@", RRDTOOL => "@RRDTOOL@", LOG_LEVEL => 0, DRY_RUN => 0, FORCE => 0, RRD_BACKUP => 1, RRD_STORAGE_TYPE => "SINGLE", TMP_DIR => '/tmp/rrd_convert', RRD_DAEMON_OPTS => "", XML_MAX_AGE => 3600, ); Getopt::Long::Configure('bundling'); my ( $opt_V, $opt_h, $opt_c, $opt_l, $opt_x, $opt_p ); # defaults $opt_x = 1; GetOptions( "V|version" => \$opt_V, "h|help" => \$opt_h, "c|check_command=s" => \$opt_c, "p|cfg_dir=s" => \$opt_p, "l|list_commands" => \$opt_l, "x|no_structure_check" => \$opt_x, "d|dry-run" => \$conf{DRY_RUN}, "t|tmp_dir=s" => \$conf{TMP_DIR}, "force" => \$conf{FORCE}, ); print_help() if $opt_h; print_help_opt_p() if !$opt_p; print_help() if !$opt_c and !$opt_l; print_version() if $opt_V; if($opt_p){ $conf{CFG_DIR} = $opt_p; } parse_config($conf{CFG_DIR}."/process_perfdata.cfg"); if ( $conf{RRD_DAEMON_OPTS} ){ $conf{RRD_DAEMON_OPTS} = "--daemon=".$conf{RRD_DAEMON_OPTS}; } my @STRUCT; my %FILEHANDLE; my @commands; # list of commands my @worklist; # list of found xml files my %ds_list; my %original_ds_list; my $max_age = time() - $conf{XML_MAX_AGE}; my %stats = ( 'rrd_in' => 0, 'rrd_out' => 0, 'old_xml' => 0, 'xml_without_rrd' => 0, 'runtime' => 0, ); main(); sub main{ check_storage_type(); find(\&wanted_xml_files, $conf{RRDPATH}); summary(); if($opt_l){ # List commands and exit summary_command_list(); exit; } if($#worklist+1 > 0 ){ my $answer = read_choice("Start Converter [n|y]?"); unless ( $answer =~ m/^y$/i ){ print "Exit...\n"; exit; } }else{ print "Check Command '".$opt_c."' not found in any XML File\n"; print "\n"; print "\n"; summary_command_list(); exit; } check_custom_template(); write_custom_template(); my $t0 = [gettimeofday]; my $i = 0; foreach my $xmlfile ( @worklist ) { $i++; undef %ds_list; undef %original_ds_list; my($host,$service) = parse_xml_filename($xmlfile); my ($rrdfile) = $xmlfile =~ /^(.*)\.xml$/; $rrdfile .= ".rrd"; if(-r $rrdfile){ create_dir($conf{TMP_DIR}); my $dumpfile = sprintf("%s/%s-%s.dump",$conf{TMP_DIR},$host,$service); print "File ".$i."/".($#worklist+1)."\n"; rrdtool_dump($rrdfile,$dumpfile); parse_pnp_xml($xmlfile); build_ds_list($rrdfile); next if check_ds_list(); open_files($host,$service); manipulate_rrd_dump($dumpfile); close_files(); restore_files($host,$service); backup_rrd_file($rrdfile); } } my $t1 = [gettimeofday]; $stats{runtime} = tv_interval $t0, $t1; print "DONE\n"; stats(); } sub build_ds_list{ my $rrdfile = shift; my @info; @info = `$conf{'RRDTOOL'} info $rrdfile`; if( $? > 0 ){ print "ERROR: $conf{'RRDTOOL'} info $rrdfile returns with $?\n"; exit 1; } foreach(@info){ if(m/ds\[(\d+)\]\.type/ ) { $ds_list{$1} = $1; } } my $test = keys %ds_list; %original_ds_list = %ds_list; } sub check_ds_list{ my $rrd_ds_count = keys %ds_list; my $xml_ds_count = $#STRUCT; if($rrd_ds_count == $xml_ds_count){ return 0; }elsif($rrd_ds_count <= $xml_ds_count && $opt_x){ printf("OK: RRD contains '%s' DS but XML contains '%s'. Convert forced by --no_structure_check\n",$rrd_ds_count,$xml_ds_count); return 0; }else{ printf ("ERROR: RRD Structure mismatch. DS Count is '%s' but should be '%s'\n",$rrd_ds_count,$xml_ds_count); return 1; } } sub wanted_xml_files{ if(m/.xml$/){ #printf("File: %s\n",$File::Find::name); my $xmlfile = $File::Find::name; my ($rrdfile) = $xmlfile =~ /^(.*)\.xml$/; $rrdfile .= ".rrd"; my $mtime = (stat($xmlfile))[9]; if ( $mtime < $max_age ){ $stats{old_xml}++; return; } open(XML, $xmlfile); while () { if(/CHECKCOMMAND>(.*) $seen{$a} } keys %seen ) { printf " |- %-36s %5s\n",$key,$seen{$key}; } } sub stats{ print "\n\n \\Statistics:\n"; foreach my $key (sort { $stats{$b} cmp $stats{$a} } keys %stats ) { printf " |- %-15s %s\n",$key,$stats{$key}; } } sub create_dir{ my $dir = shift; unless ( -d "$dir" ) { unless ( mkdir "$dir" ) { print "ERROR: $dir is not writable\n"; exit 1; } } } sub open_files(){ my $host = shift; my $service = shift; foreach my $ds (keys %ds_list){ my $file = sprintf("%s/%s-%s-%s.restore",$conf{TMP_DIR},$host,$service,$STRUCT[$ds]{NAME}); #print "Open Filehandle ".$file."\n"; open($FILEHANDLE{$ds}, ">", $file); } } sub close_files(){ foreach my $ds (keys %ds_list){ #$ds--; #print "Close Filehandle ".$STRUCT[$ds]{NAME}."\n"; close($FILEHANDLE{$ds}); } } sub write_to_files{ my $data = shift; foreach my $ds (keys %ds_list){ print { $FILEHANDLE{$ds} } $data; } } sub restore_files(){ my $host = shift; my $service = shift; my $err; $| = 1; print "Restoring File\n"; foreach my $ds (keys %ds_list){ my $rrdfile = ''; my $restorefile = sprintf("%s/%s-%s-%s.restore",$conf{TMP_DIR},$host,$service,$STRUCT[$ds]{NAME}); if( $conf{'DRY_RUN'} == 1 ){ $rrdfile = sprintf("%s/%s/%s_%s.rrd",$conf{TMP_DIR},$host,$service,$STRUCT[$ds]{NAME}); }else{ $rrdfile = sprintf("%s/%s/%s_%s.rrd",$conf{RRDPATH},$host,$service,$STRUCT[$ds]{NAME}); } print "$rrdfile\n"; $err = system("$conf{'RRDTOOL'} restore -f $restorefile $rrdfile"); #my $err = RRDs::error(); if($err){ printf("RRDtool Error: %s\n",$err); exit; } unlink($restorefile); $stats{rrd_out}++; } print "... done\n"; $| = 0; } sub backup_rrd_file{ my $rrdfile = shift; if ( $conf{RRD_BACKUP} == 1 ){ move($rrdfile, $rrdfile.".backup"); } } sub parse_pnp_xml{ my $xmlfile = shift; undef @STRUCT; #print "reading $xmlfile\n"; open(XML, $xmlfile); my $DATASOURCE = 0; while () { if(//){ $DATASOURCE++; } if(//){ $DATASOURCE = 0; } if(/<([A-Z_]+)>(.*)<\/[A-Z_]+>/ && $DATASOURCE != -1){ $STRUCT[$DATASOURCE]{$1} = $2; } } close(XML); return @STRUCT; } sub rrdtool_dump{ my $rrdfile = shift; my $dumpfile = shift; my $err; print "RRDtool dump to $dumpfile\n"; if ( $conf{RRD_DAEMON_OPTS} ){ $err = system("$conf{'RRDTOOL'} dump $conf{RRD_DAEMON_OPTS} $rrdfile > $dumpfile"); }else{ $err = system("$conf{'RRDTOOL'} dump $rrdfile > $dumpfile"); } if($err){ printf("RRDtool Error: %s\n",$err); exit; } $stats{rrd_in}++; return $dumpfile; } sub manipulate_rrd_dump{ my $tmpfile = shift; my $i = 0; open (XML,$tmpfile); my @ROW = (); my $tmpds = 1; my $inside_ds_block = 0; print "Manipulating $tmpfile\n"; while (){ $i++; unless ( $i % 5000 ){ $| = 1; print "."; $| = 0; } my $d = $_; # # A Data Row if(m//){ m/(.*)/; my $rowstart = $1; @ROW = m{([^<].*?)<\/v>}gc; my $fh = 1; foreach my $VAL (@ROW){ undef %ds_list; $ds_list{$fh} = $fh; write_to_files($rowstart."".$VAL."\n"); $fh++; } next; } if(m//){ $inside_ds_block = 1; undef %ds_list; $ds_list{$tmpds} = $tmpds; write_to_files($d); $tmpds++; next; } if(m//){ write_to_files($d); $inside_ds_block = 0; $tmpds = 1; %ds_list = %original_ds_list; next; } if(m/<\/ds>/){ write_to_files($d); $inside_ds_block = 0; # write to all files alter %ds_list = %original_ds_list; next; } if(m/<\/database>/){ # write to all files alter %ds_list = %original_ds_list; write_to_files($d); next; } if($inside_ds_block == 1){ # rename DS $d =~ s/(.*)<\/name>/ 1 <\/name>/; } write_to_files($d); } close(XML); print "... done $i lines\n"; unlink($tmpfile); } # # Parse process_perfdata.cfg # sub parse_config { my $config_file = shift; my $line = 0; if( ! -e $config_file ){ print "$config_file not found\n"; exit; } if ( -e $config_file ) { open CFG, '<', "$config_file"; while () { $line++; chomp; s/ //g; next if /^#/; next if /^$/; s/#.*//; if (/^(.*)=(.*)$/) { if ( defined $conf{$1} ) { $conf{$1} = $2; } } } close CFG; } } # # Change RRD_STORAGE_TYPE to MULTIPLE # sub change_config { my $cfg_file = $conf{'CFG_DIR'}."/process_perfdata.cfg"; my $error = system("sed -i -e ".'s/\s*RRD_STORAGE_TYPE\s*=\s*SINGLE/RRD_STORAGE_TYPE=MULTIPLE/i'." $cfg_file"); } sub check_storage_type{ if($conf{'RRD_STORAGE_TYPE'} eq "MULTIPLE"){ print "RRD_STORAGE_TYPE is already set to ".$conf{'RRD_STORAGE_TYPE'}."\n"; } } sub check_custom_template { my $command = $opt_c; if ( $conf{DRY_RUN} == 1 ){ print "No config check while DRY_RUN = 1\n"; return; } if ( $command eq "ALL" ){ return; } my $config_file = $conf{'CFG_DIR'}."/check_commands/".$command.".cfg"; my $storage_type = "MULTIPLE"; if ( -e $config_file && $conf{'FORCE'} == 0 ) { print "\nConfig for command $command does already exist ($config_file)\n\n"; exit 0; } } sub write_custom_template { my $command = $opt_c; if ( $conf{DRY_RUN} == 1 ){ print "No config check while DRY_RUN = 1\n"; return; } if ( $opt_c eq "ALL"){ change_config(); return; } my $config_file = $conf{'CFG_DIR'}."/check_commands/".$command.".cfg"; my $storage_type = "MULTIPLE"; open(CFG, ">", $config_file); print CFG "# Generated by rrd_convert.pl @PKG_VERSION@\n"; print CFG "RRD_STORAGE_TYPE = MULTIPLE\n"; close(CFG); if ( -s $config_file ) { print "\nConfig for command $command created ($config_file)\n"; } } sub read_choice{ my $question = shift; print $question.":"; my $answer = ; chomp $answer; return $answer; } sub print_help{ print "Usage: $0 --check_command=\n"; print " --cfg_dir=\n"; print " [ --list_commands ]\n"; print " [ --dry-run ]\n"; print " [ --tmp_dir= ]\n"; print " [ --no_structure_check ]\n"; print "\n"; print "This script is used to switch to RRD_STORAGE_TYPE = MULTIPLE for a given Nagios Check Command\n"; print "More info online http://docs.pnp4nagios.org/pnp-0.6/rrd_convert\n"; exit; } sub print_help_opt_p{ print "\n"; print "--cfg_dir not set\n"; print "Please provide the path to your PNP4Nagios config directory\n"; print "\n"; print_help(); } sub print_version{ print "Version @PKG_VERSION@\n"; exit; } pnp4nagios-0.6.16/lib/0000775000000000000000000000000011662503006013133 5ustar rootrootpnp4nagios-0.6.16/lib/Makefile.in0000664000000000000000000010551511662503006015207 0ustar rootrootprefix=@prefix@ exec_prefix=@exec_prefix@ LOGDIR=@localstatedir@ CFGDIR=@sysconfdir@ BINDIR=@bindir@ CGIDIR=@sbindir@ LIBDIR=@libdir@ INSTALL=@INSTALL@ INSTALL_OPTS=@INSTALL_OPTS@ DATAROOTDIR=@datarootdir@ CP=@CP@ all html: clean: distclean: clean -rm -f Makefile devclean: distclean install: $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(LIBDIR) $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(LIBDIR)/kohana $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(LIBDIR)/kohana/system $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(LIBDIR)/kohana/system/controllers $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(LIBDIR)/kohana/system/i18n $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(LIBDIR)/kohana/system/i18n/de_DE $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(LIBDIR)/kohana/system/i18n/nl_NL $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(LIBDIR)/kohana/system/i18n/es_ES $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(LIBDIR)/kohana/system/i18n/ru_RU $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(LIBDIR)/kohana/system/i18n/en_US $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(LIBDIR)/kohana/system/i18n/fr_FR $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(LIBDIR)/kohana/system/i18n/it_IT $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(LIBDIR)/kohana/system/helpers $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(LIBDIR)/kohana/system/libraries $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(LIBDIR)/kohana/system/libraries/drivers $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(LIBDIR)/kohana/system/libraries/drivers/Database $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(LIBDIR)/kohana/system/libraries/drivers/Captcha $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(LIBDIR)/kohana/system/libraries/drivers/Cache $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(LIBDIR)/kohana/system/libraries/drivers/Image $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(LIBDIR)/kohana/system/libraries/drivers/Session $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(LIBDIR)/kohana/system/config $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(LIBDIR)/kohana/system/core $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(LIBDIR)/kohana/system/core/utf8 $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(LIBDIR)/kohana/system/views $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(LIBDIR)/kohana/system/views/kohana $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(LIBDIR)/kohana/system/views/pagination $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(LIBDIR)/kohana/system/fonts $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/controllers/captcha.php $(DESTDIR)$(LIBDIR)/kohana/system/controllers/captcha.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/controllers/template.php $(DESTDIR)$(LIBDIR)/kohana/system/controllers/template.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/de_DE/validation.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/de_DE/validation.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/de_DE/core.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/de_DE/core.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/de_DE/pagination.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/de_DE/pagination.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/de_DE/captcha.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/de_DE/captcha.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/de_DE/encrypt.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/de_DE/encrypt.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/de_DE/orm.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/de_DE/orm.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/de_DE/image.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/de_DE/image.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/de_DE/session.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/de_DE/session.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/de_DE/database.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/de_DE/database.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/de_DE/calendar.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/de_DE/calendar.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/de_DE/profiler.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/de_DE/profiler.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/de_DE/cache.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/de_DE/cache.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/de_DE/upload.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/de_DE/upload.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/de_DE/event.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/de_DE/event.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/de_DE/errors.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/de_DE/errors.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/de_DE/swift.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/de_DE/swift.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/nl_NL/validation.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/nl_NL/validation.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/nl_NL/core.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/nl_NL/core.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/nl_NL/pagination.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/nl_NL/pagination.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/nl_NL/captcha.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/nl_NL/captcha.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/nl_NL/encrypt.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/nl_NL/encrypt.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/nl_NL/orm.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/nl_NL/orm.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/nl_NL/image.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/nl_NL/image.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/nl_NL/session.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/nl_NL/session.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/nl_NL/database.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/nl_NL/database.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/nl_NL/calendar.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/nl_NL/calendar.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/nl_NL/profiler.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/nl_NL/profiler.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/nl_NL/cache.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/nl_NL/cache.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/nl_NL/upload.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/nl_NL/upload.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/nl_NL/event.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/nl_NL/event.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/nl_NL/errors.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/nl_NL/errors.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/nl_NL/swift.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/nl_NL/swift.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/es_ES/validation.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/es_ES/validation.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/es_ES/core.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/es_ES/core.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/es_ES/pagination.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/es_ES/pagination.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/es_ES/captcha.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/es_ES/captcha.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/es_ES/encrypt.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/es_ES/encrypt.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/es_ES/orm.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/es_ES/orm.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/es_ES/image.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/es_ES/image.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/es_ES/session.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/es_ES/session.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/es_ES/database.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/es_ES/database.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/es_ES/calendar.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/es_ES/calendar.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/es_ES/profiler.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/es_ES/profiler.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/es_ES/cache.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/es_ES/cache.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/es_ES/upload.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/es_ES/upload.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/es_ES/event.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/es_ES/event.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/es_ES/errors.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/es_ES/errors.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/es_ES/swift.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/es_ES/swift.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/ru_RU/validation.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/ru_RU/validation.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/ru_RU/core.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/ru_RU/core.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/ru_RU/pagination.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/ru_RU/pagination.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/ru_RU/captcha.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/ru_RU/captcha.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/ru_RU/encrypt.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/ru_RU/encrypt.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/ru_RU/orm.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/ru_RU/orm.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/ru_RU/image.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/ru_RU/image.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/ru_RU/session.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/ru_RU/session.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/ru_RU/database.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/ru_RU/database.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/ru_RU/calendar.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/ru_RU/calendar.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/ru_RU/profiler.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/ru_RU/profiler.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/ru_RU/cache.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/ru_RU/cache.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/ru_RU/upload.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/ru_RU/upload.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/ru_RU/event.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/ru_RU/event.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/ru_RU/errors.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/ru_RU/errors.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/ru_RU/swift.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/ru_RU/swift.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/en_US/validation.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/en_US/validation.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/en_US/core.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/en_US/core.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/en_US/pagination.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/en_US/pagination.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/en_US/captcha.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/en_US/captcha.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/en_US/encrypt.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/en_US/encrypt.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/en_US/orm.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/en_US/orm.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/en_US/image.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/en_US/image.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/en_US/session.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/en_US/session.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/en_US/database.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/en_US/database.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/en_US/calendar.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/en_US/calendar.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/en_US/profiler.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/en_US/profiler.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/en_US/cache.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/en_US/cache.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/en_US/upload.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/en_US/upload.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/en_US/event.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/en_US/event.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/en_US/errors.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/en_US/errors.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/en_US/swift.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/en_US/swift.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/fr_FR/validation.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/fr_FR/validation.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/fr_FR/core.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/fr_FR/core.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/fr_FR/pagination.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/fr_FR/pagination.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/fr_FR/captcha.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/fr_FR/captcha.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/fr_FR/encrypt.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/fr_FR/encrypt.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/fr_FR/orm.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/fr_FR/orm.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/fr_FR/image.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/fr_FR/image.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/fr_FR/session.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/fr_FR/session.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/fr_FR/database.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/fr_FR/database.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/fr_FR/calendar.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/fr_FR/calendar.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/fr_FR/profiler.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/fr_FR/profiler.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/fr_FR/cache.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/fr_FR/cache.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/fr_FR/upload.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/fr_FR/upload.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/fr_FR/event.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/fr_FR/event.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/fr_FR/errors.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/fr_FR/errors.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/fr_FR/swift.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/fr_FR/swift.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/it_IT/validation.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/it_IT/validation.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/it_IT/core.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/it_IT/core.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/it_IT/pagination.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/it_IT/pagination.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/it_IT/captcha.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/it_IT/captcha.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/it_IT/encrypt.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/it_IT/encrypt.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/it_IT/orm.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/it_IT/orm.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/it_IT/image.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/it_IT/image.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/it_IT/session.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/it_IT/session.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/it_IT/database.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/it_IT/database.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/it_IT/calendar.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/it_IT/calendar.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/it_IT/profiler.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/it_IT/profiler.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/it_IT/cache.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/it_IT/cache.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/it_IT/upload.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/it_IT/upload.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/it_IT/event.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/it_IT/event.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/it_IT/errors.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/it_IT/errors.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/i18n/it_IT/swift.php $(DESTDIR)$(LIBDIR)/kohana/system/i18n/it_IT/swift.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/helpers/remote.php $(DESTDIR)$(LIBDIR)/kohana/system/helpers/remote.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/helpers/url.php $(DESTDIR)$(LIBDIR)/kohana/system/helpers/url.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/helpers/feed.php $(DESTDIR)$(LIBDIR)/kohana/system/helpers/feed.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/helpers/expires.php $(DESTDIR)$(LIBDIR)/kohana/system/helpers/expires.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/helpers/text.php $(DESTDIR)$(LIBDIR)/kohana/system/helpers/text.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/helpers/email.php $(DESTDIR)$(LIBDIR)/kohana/system/helpers/email.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/helpers/download.php $(DESTDIR)$(LIBDIR)/kohana/system/helpers/download.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/helpers/format.php $(DESTDIR)$(LIBDIR)/kohana/system/helpers/format.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/helpers/form.php $(DESTDIR)$(LIBDIR)/kohana/system/helpers/form.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/helpers/arr.php $(DESTDIR)$(LIBDIR)/kohana/system/helpers/arr.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/helpers/html.php $(DESTDIR)$(LIBDIR)/kohana/system/helpers/html.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/helpers/valid.php $(DESTDIR)$(LIBDIR)/kohana/system/helpers/valid.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/helpers/date.php $(DESTDIR)$(LIBDIR)/kohana/system/helpers/date.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/helpers/file.php $(DESTDIR)$(LIBDIR)/kohana/system/helpers/file.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/helpers/request.php $(DESTDIR)$(LIBDIR)/kohana/system/helpers/request.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/helpers/upload.php $(DESTDIR)$(LIBDIR)/kohana/system/helpers/upload.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/helpers/cookie.php $(DESTDIR)$(LIBDIR)/kohana/system/helpers/cookie.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/helpers/security.php $(DESTDIR)$(LIBDIR)/kohana/system/helpers/security.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/helpers/num.php $(DESTDIR)$(LIBDIR)/kohana/system/helpers/num.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/helpers/inflector.php $(DESTDIR)$(LIBDIR)/kohana/system/helpers/inflector.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/libraries/Pagination.php $(DESTDIR)$(LIBDIR)/kohana/system/libraries/Pagination.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/libraries/ORM_Tree.php $(DESTDIR)$(LIBDIR)/kohana/system/libraries/ORM_Tree.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/libraries/Encrypt.php $(DESTDIR)$(LIBDIR)/kohana/system/libraries/Encrypt.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/libraries/Calendar.php $(DESTDIR)$(LIBDIR)/kohana/system/libraries/Calendar.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/libraries/Database_Expression.php $(DESTDIR)$(LIBDIR)/kohana/system/libraries/Database_Expression.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/libraries/Event_Observer.php $(DESTDIR)$(LIBDIR)/kohana/system/libraries/Event_Observer.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/libraries/Event_Subject.php $(DESTDIR)$(LIBDIR)/kohana/system/libraries/Event_Subject.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/libraries/Captcha.php $(DESTDIR)$(LIBDIR)/kohana/system/libraries/Captcha.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/libraries/Cache.php $(DESTDIR)$(LIBDIR)/kohana/system/libraries/Cache.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/libraries/Session.php $(DESTDIR)$(LIBDIR)/kohana/system/libraries/Session.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/libraries/drivers/Database/Mssql.php $(DESTDIR)$(LIBDIR)/kohana/system/libraries/drivers/Database/Mssql.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/libraries/drivers/Database/Pdosqlite.php $(DESTDIR)$(LIBDIR)/kohana/system/libraries/drivers/Database/Pdosqlite.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/libraries/drivers/Database/Mysqli.php $(DESTDIR)$(LIBDIR)/kohana/system/libraries/drivers/Database/Mysqli.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/libraries/drivers/Database/Pgsql.php $(DESTDIR)$(LIBDIR)/kohana/system/libraries/drivers/Database/Pgsql.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/libraries/drivers/Database/Mysql.php $(DESTDIR)$(LIBDIR)/kohana/system/libraries/drivers/Database/Mysql.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/libraries/drivers/Captcha/Alpha.php $(DESTDIR)$(LIBDIR)/kohana/system/libraries/drivers/Captcha/Alpha.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/libraries/drivers/Captcha/Math.php $(DESTDIR)$(LIBDIR)/kohana/system/libraries/drivers/Captcha/Math.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/libraries/drivers/Captcha/Word.php $(DESTDIR)$(LIBDIR)/kohana/system/libraries/drivers/Captcha/Word.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/libraries/drivers/Captcha/Riddle.php $(DESTDIR)$(LIBDIR)/kohana/system/libraries/drivers/Captcha/Riddle.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/libraries/drivers/Captcha/Basic.php $(DESTDIR)$(LIBDIR)/kohana/system/libraries/drivers/Captcha/Basic.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/libraries/drivers/Captcha/Black.php $(DESTDIR)$(LIBDIR)/kohana/system/libraries/drivers/Captcha/Black.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/libraries/drivers/Captcha.php $(DESTDIR)$(LIBDIR)/kohana/system/libraries/drivers/Captcha.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/libraries/drivers/Cache.php $(DESTDIR)$(LIBDIR)/kohana/system/libraries/drivers/Cache.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/libraries/drivers/Session.php $(DESTDIR)$(LIBDIR)/kohana/system/libraries/drivers/Session.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/libraries/drivers/Image.php $(DESTDIR)$(LIBDIR)/kohana/system/libraries/drivers/Image.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/libraries/drivers/Cache/Eaccelerator.php $(DESTDIR)$(LIBDIR)/kohana/system/libraries/drivers/Cache/Eaccelerator.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/libraries/drivers/Cache/Apc.php $(DESTDIR)$(LIBDIR)/kohana/system/libraries/drivers/Cache/Apc.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/libraries/drivers/Cache/Memcache.php $(DESTDIR)$(LIBDIR)/kohana/system/libraries/drivers/Cache/Memcache.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/libraries/drivers/Cache/Xcache.php $(DESTDIR)$(LIBDIR)/kohana/system/libraries/drivers/Cache/Xcache.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/libraries/drivers/Cache/File.php $(DESTDIR)$(LIBDIR)/kohana/system/libraries/drivers/Cache/File.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/libraries/drivers/Cache/Sqlite.php $(DESTDIR)$(LIBDIR)/kohana/system/libraries/drivers/Cache/Sqlite.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/libraries/drivers/Image/GraphicsMagick.php $(DESTDIR)$(LIBDIR)/kohana/system/libraries/drivers/Image/GraphicsMagick.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/libraries/drivers/Image/GD.php $(DESTDIR)$(LIBDIR)/kohana/system/libraries/drivers/Image/GD.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/libraries/drivers/Image/ImageMagick.php $(DESTDIR)$(LIBDIR)/kohana/system/libraries/drivers/Image/ImageMagick.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/libraries/drivers/Session/Cookie.php $(DESTDIR)$(LIBDIR)/kohana/system/libraries/drivers/Session/Cookie.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/libraries/drivers/Session/Cache.php $(DESTDIR)$(LIBDIR)/kohana/system/libraries/drivers/Session/Cache.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/libraries/drivers/Session/Database.php $(DESTDIR)$(LIBDIR)/kohana/system/libraries/drivers/Session/Database.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/libraries/drivers/Database.php $(DESTDIR)$(LIBDIR)/kohana/system/libraries/drivers/Database.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/libraries/Image.php $(DESTDIR)$(LIBDIR)/kohana/system/libraries/Image.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/libraries/Validation.php $(DESTDIR)$(LIBDIR)/kohana/system/libraries/Validation.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/libraries/ORM_Versioned.php $(DESTDIR)$(LIBDIR)/kohana/system/libraries/ORM_Versioned.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/libraries/Controller.php $(DESTDIR)$(LIBDIR)/kohana/system/libraries/Controller.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/libraries/Profiler.php $(DESTDIR)$(LIBDIR)/kohana/system/libraries/Profiler.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/libraries/Model.php $(DESTDIR)$(LIBDIR)/kohana/system/libraries/Model.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/libraries/View.php $(DESTDIR)$(LIBDIR)/kohana/system/libraries/View.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/libraries/Router.php $(DESTDIR)$(LIBDIR)/kohana/system/libraries/Router.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/libraries/ORM_Iterator.php $(DESTDIR)$(LIBDIR)/kohana/system/libraries/ORM_Iterator.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/libraries/Profiler_Table.php $(DESTDIR)$(LIBDIR)/kohana/system/libraries/Profiler_Table.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/libraries/URI.php $(DESTDIR)$(LIBDIR)/kohana/system/libraries/URI.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/libraries/ORM.php $(DESTDIR)$(LIBDIR)/kohana/system/libraries/ORM.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/libraries/Calendar_Event.php $(DESTDIR)$(LIBDIR)/kohana/system/libraries/Calendar_Event.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/libraries/Tagcloud.php $(DESTDIR)$(LIBDIR)/kohana/system/libraries/Tagcloud.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/libraries/Input.php $(DESTDIR)$(LIBDIR)/kohana/system/libraries/Input.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/libraries/Database.php $(DESTDIR)$(LIBDIR)/kohana/system/libraries/Database.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/config/locale.php $(DESTDIR)$(LIBDIR)/kohana/system/config/locale.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/config/routes.php $(DESTDIR)$(LIBDIR)/kohana/system/config/routes.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/config/pagination.php $(DESTDIR)$(LIBDIR)/kohana/system/config/pagination.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/config/sql_types.php $(DESTDIR)$(LIBDIR)/kohana/system/config/sql_types.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/config/captcha.php $(DESTDIR)$(LIBDIR)/kohana/system/config/captcha.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/config/email.php $(DESTDIR)$(LIBDIR)/kohana/system/config/email.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/config/image.php $(DESTDIR)$(LIBDIR)/kohana/system/config/image.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/config/cache_sqlite.php $(DESTDIR)$(LIBDIR)/kohana/system/config/cache_sqlite.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/config/cache_memcache.php $(DESTDIR)$(LIBDIR)/kohana/system/config/cache_memcache.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/config/session.php $(DESTDIR)$(LIBDIR)/kohana/system/config/session.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/config/database.php $(DESTDIR)$(LIBDIR)/kohana/system/config/database.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/config/credit_cards.php $(DESTDIR)$(LIBDIR)/kohana/system/config/credit_cards.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/config/http.php $(DESTDIR)$(LIBDIR)/kohana/system/config/http.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/config/mimes.php $(DESTDIR)$(LIBDIR)/kohana/system/config/mimes.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/config/profiler.php $(DESTDIR)$(LIBDIR)/kohana/system/config/profiler.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/config/view.php $(DESTDIR)$(LIBDIR)/kohana/system/config/view.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/config/cache.php $(DESTDIR)$(LIBDIR)/kohana/system/config/cache.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/config/encryption.php $(DESTDIR)$(LIBDIR)/kohana/system/config/encryption.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/config/upload.php $(DESTDIR)$(LIBDIR)/kohana/system/config/upload.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/config/cookie.php $(DESTDIR)$(LIBDIR)/kohana/system/config/cookie.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/config/user_agents.php $(DESTDIR)$(LIBDIR)/kohana/system/config/user_agents.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/config/inflector.php $(DESTDIR)$(LIBDIR)/kohana/system/config/inflector.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/config/cache_xcache.php $(DESTDIR)$(LIBDIR)/kohana/system/config/cache_xcache.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/core/Event.php $(DESTDIR)$(LIBDIR)/kohana/system/core/Event.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/core/utf8/transliterate_to_ascii.php $(DESTDIR)$(LIBDIR)/kohana/system/core/utf8/transliterate_to_ascii.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/core/utf8/ucfirst.php $(DESTDIR)$(LIBDIR)/kohana/system/core/utf8/ucfirst.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/core/utf8/ord.php $(DESTDIR)$(LIBDIR)/kohana/system/core/utf8/ord.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/core/utf8/strrpos.php $(DESTDIR)$(LIBDIR)/kohana/system/core/utf8/strrpos.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/core/utf8/strtolower.php $(DESTDIR)$(LIBDIR)/kohana/system/core/utf8/strtolower.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/core/utf8/substr.php $(DESTDIR)$(LIBDIR)/kohana/system/core/utf8/substr.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/core/utf8/str_pad.php $(DESTDIR)$(LIBDIR)/kohana/system/core/utf8/str_pad.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/core/utf8/strcspn.php $(DESTDIR)$(LIBDIR)/kohana/system/core/utf8/strcspn.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/core/utf8/trim.php $(DESTDIR)$(LIBDIR)/kohana/system/core/utf8/trim.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/core/utf8/rtrim.php $(DESTDIR)$(LIBDIR)/kohana/system/core/utf8/rtrim.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/core/utf8/strcasecmp.php $(DESTDIR)$(LIBDIR)/kohana/system/core/utf8/strcasecmp.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/core/utf8/strtoupper.php $(DESTDIR)$(LIBDIR)/kohana/system/core/utf8/strtoupper.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/core/utf8/str_split.php $(DESTDIR)$(LIBDIR)/kohana/system/core/utf8/str_split.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/core/utf8/strpos.php $(DESTDIR)$(LIBDIR)/kohana/system/core/utf8/strpos.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/core/utf8/stristr.php $(DESTDIR)$(LIBDIR)/kohana/system/core/utf8/stristr.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/core/utf8/ucwords.php $(DESTDIR)$(LIBDIR)/kohana/system/core/utf8/ucwords.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/core/utf8/str_ireplace.php $(DESTDIR)$(LIBDIR)/kohana/system/core/utf8/str_ireplace.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/core/utf8/strlen.php $(DESTDIR)$(LIBDIR)/kohana/system/core/utf8/strlen.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/core/utf8/to_unicode.php $(DESTDIR)$(LIBDIR)/kohana/system/core/utf8/to_unicode.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/core/utf8/substr_replace.php $(DESTDIR)$(LIBDIR)/kohana/system/core/utf8/substr_replace.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/core/utf8/from_unicode.php $(DESTDIR)$(LIBDIR)/kohana/system/core/utf8/from_unicode.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/core/utf8/strrev.php $(DESTDIR)$(LIBDIR)/kohana/system/core/utf8/strrev.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/core/utf8/strspn.php $(DESTDIR)$(LIBDIR)/kohana/system/core/utf8/strspn.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/core/utf8/ltrim.php $(DESTDIR)$(LIBDIR)/kohana/system/core/utf8/ltrim.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/core/Benchmark.php $(DESTDIR)$(LIBDIR)/kohana/system/core/Benchmark.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/core/Bootstrap.php $(DESTDIR)$(LIBDIR)/kohana/system/core/Bootstrap.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/core/Kohana.php $(DESTDIR)$(LIBDIR)/kohana/system/core/Kohana.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/core/utf8.php $(DESTDIR)$(LIBDIR)/kohana/system/core/utf8.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/views/kohana_profiler_table.php $(DESTDIR)$(LIBDIR)/kohana/system/views/kohana_profiler_table.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/views/kohana/template.php $(DESTDIR)$(LIBDIR)/kohana/system/views/kohana/template.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/views/kohana_error_page.php $(DESTDIR)$(LIBDIR)/kohana/system/views/kohana_error_page.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/views/kohana_calendar.php $(DESTDIR)$(LIBDIR)/kohana/system/views/kohana_calendar.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/views/pagination/digg.php $(DESTDIR)$(LIBDIR)/kohana/system/views/pagination/digg.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/views/pagination/punbb.php $(DESTDIR)$(LIBDIR)/kohana/system/views/pagination/punbb.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/views/pagination/extended.php $(DESTDIR)$(LIBDIR)/kohana/system/views/pagination/extended.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/views/pagination/classic.php $(DESTDIR)$(LIBDIR)/kohana/system/views/pagination/classic.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/views/kohana_profiler_table.css $(DESTDIR)$(LIBDIR)/kohana/system/views/kohana_profiler_table.css $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/views/kohana_profiler.php $(DESTDIR)$(LIBDIR)/kohana/system/views/kohana_profiler.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/views/kohana_error_disabled.php $(DESTDIR)$(LIBDIR)/kohana/system/views/kohana_error_disabled.php $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/views/kohana_errors.css $(DESTDIR)$(LIBDIR)/kohana/system/views/kohana_errors.css $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/fonts/LICENSE $(DESTDIR)$(LIBDIR)/kohana/system/fonts/LICENSE $(INSTALL) -m 644 $(INSTALL_OPTS) kohana/system/fonts/DejaVuSerif.ttf $(DESTDIR)$(LIBDIR)/kohana/system/fonts/DejaVuSerif.ttf pnp4nagios-0.6.16/lib/kohana/0000775000000000000000000000000011662503006014374 5ustar rootrootpnp4nagios-0.6.16/lib/kohana/system/0000775000000000000000000000000011662503006015720 5ustar rootrootpnp4nagios-0.6.16/lib/kohana/system/libraries/0000775000000000000000000000000011662503006017674 5ustar rootrootpnp4nagios-0.6.16/lib/kohana/system/libraries/Validation.php0000664000000000000000000004164011662503006022504 0ustar rootrootsubmitted = ! empty($array); parent::__construct($array, ArrayObject::ARRAY_AS_PROPS | ArrayObject::STD_PROP_LIST); } /** * Magic clone method, clears errors and messages. * * @return void */ public function __clone() { $this->errors = array(); $this->messages = array(); } /** * Create a copy of the current validation rules and change the array. * * @chainable * @param array new array to validate * @return Validation */ public function copy(array $array) { $copy = clone $this; $copy->exchangeArray($array); return $copy; } /** * Test if the data has been submitted. * * @return boolean */ public function submitted($value = NULL) { if (is_bool($value)) { $this->submitted = $value; } return $this->submitted; } /** * Returns an array of all the field names that have filters, rules, or callbacks. * * @return array */ public function field_names() { // All the fields that are being validated $fields = array_keys(array_merge ( $this->pre_filters, $this->rules, $this->callbacks, $this->post_filters )); // Remove wildcard fields $fields = array_diff($fields, array('*')); return $fields; } /** * Returns the array values of the current object. * * @return array */ public function as_array() { return $this->getArrayCopy(); } /** * Returns the ArrayObject values, removing all inputs without rules. * To choose specific inputs, list the field name as arguments. * * @param boolean return only fields with filters, rules, and callbacks * @return array */ public function safe_array() { // Load choices $choices = func_get_args(); $choices = empty($choices) ? NULL : array_combine($choices, $choices); // Get field names $fields = $this->field_names(); $safe = array(); foreach ($fields as $field) { if ($choices === NULL OR isset($choices[$field])) { if (isset($this[$field])) { $value = $this[$field]; if (is_object($value)) { // Convert the value back into an array $value = $value->getArrayCopy(); } } else { // Even if the field is not in this array, it must be set $value = NULL; } // Add the field to the array $safe[$field] = $value; } } return $safe; } /** * Add additional rules that will forced, even for empty fields. All arguments * passed will be appended to the list. * * @chainable * @param string rule name * @return object */ public function allow_empty_rules($rules) { // Any number of args are supported $rules = func_get_args(); // Merge the allowed rules $this->empty_rules = array_merge($this->empty_rules, $rules); return $this; } /** * Converts a filter, rule, or callback into a fully-qualified callback array. * * @return mixed */ protected function callback($callback) { if (is_string($callback)) { if (strpos($callback, '::') !== FALSE) { $callback = explode('::', $callback); } elseif (function_exists($callback)) { // No need to check if the callback is a method $callback = $callback; } elseif (method_exists($this, $callback)) { // The callback exists in Validation $callback = array($this, $callback); } elseif (method_exists('valid', $callback)) { // The callback exists in valid:: $callback = array('valid', $callback); } } if ( ! is_callable($callback, FALSE)) { if (is_array($callback)) { if (is_object($callback[0])) { // Object instance syntax $name = get_class($callback[0]).'->'.$callback[1]; } else { // Static class syntax $name = $callback[0].'::'.$callback[1]; } } else { // Function syntax $name = $callback; } throw new Kohana_Exception('validation.not_callable', $name); } return $callback; } /** * Add a pre-filter to one or more inputs. Pre-filters are applied before * rules or callbacks are executed. * * @chainable * @param callback filter * @param string fields to apply filter to, use TRUE for all fields * @return object */ public function pre_filter($filter, $field = TRUE) { if ($field === TRUE OR $field === '*') { // Use wildcard $fields = array('*'); } else { // Add the filter to specific inputs $fields = func_get_args(); $fields = array_slice($fields, 1); } // Convert to a proper callback $filter = $this->callback($filter); foreach ($fields as $field) { // Add the filter to specified field $this->pre_filters[$field][] = $filter; } return $this; } /** * Add a post-filter to one or more inputs. Post-filters are applied after * rules and callbacks have been executed. * * @chainable * @param callback filter * @param string fields to apply filter to, use TRUE for all fields * @return object */ public function post_filter($filter, $field = TRUE) { if ($field === TRUE) { // Use wildcard $fields = array('*'); } else { // Add the filter to specific inputs $fields = func_get_args(); $fields = array_slice($fields, 1); } // Convert to a proper callback $filter = $this->callback($filter); foreach ($fields as $field) { // Add the filter to specified field $this->post_filters[$field][] = $filter; } return $this; } /** * Add rules to a field. Validation rules may only return TRUE or FALSE and * can not manipulate the value of a field. * * @chainable * @param string field name * @param callback rules (one or more arguments) * @return object */ public function add_rules($field, $rules) { // Get the rules $rules = func_get_args(); $rules = array_slice($rules, 1); if ($field === TRUE) { // Use wildcard $field = '*'; } foreach ($rules as $rule) { // Arguments for rule $args = NULL; if (is_string($rule)) { if (preg_match('/^([^\[]++)\[(.+)\]$/', $rule, $matches)) { // Split the rule into the function and args $rule = $matches[1]; $args = preg_split('/(?array_fields[$field] = $field; } // Convert to a proper callback $rule = $this->callback($rule); // Add the rule, with args, to the field $this->rules[$field][] = array($rule, $args); } return $this; } /** * Add callbacks to a field. Callbacks must accept the Validation object * and the input name. Callback returns are not processed. * * @chainable * @param string field name * @param callbacks callbacks (unlimited number) * @return object */ public function add_callbacks($field, $callbacks) { // Get all callbacks as an array $callbacks = func_get_args(); $callbacks = array_slice($callbacks, 1); if ($field === TRUE) { // Use wildcard $field = '*'; } foreach ($callbacks as $callback) { // Convert to a proper callback $callback = $this->callback($callback); // Add the callback to specified field $this->callbacks[$field][] = $callback; } return $this; } /** * Validate by processing pre-filters, rules, callbacks, and post-filters. * All fields that have filters, rules, or callbacks will be initialized if * they are undefined. Validation will only be run if there is data already * in the array. * * @param object Validation object, used only for recursion * @param object name of field for errors * @return bool */ public function validate($object = NULL, $field_name = NULL) { if ($object === NULL) { // Use the current object $object = $this; } // Get all field names $fields = $this->field_names(); // Copy the array from the object, to optimize multiple sets $array = $this->getArrayCopy(); foreach ($fields as $field) { if ($field === '*') { // Ignore wildcard continue; } if ( ! isset($array[$field])) { if (isset($this->array_fields[$field])) { // This field must be an array $array[$field] = array(); } else { $array[$field] = NULL; } } } // Swap the array back into the object $this->exchangeArray($array); // Get all defined field names $fields = array_keys($array); foreach ($this->pre_filters as $field => $callbacks) { foreach ($callbacks as $callback) { if ($field === '*') { foreach ($fields as $f) { $this[$f] = is_array($this[$f]) ? array_map($callback, $this[$f]) : call_user_func($callback, $this[$f]); } } else { $this[$field] = is_array($this[$field]) ? array_map($callback, $this[$field]) : call_user_func($callback, $this[$field]); } } } if ($this->submitted === FALSE) return FALSE; foreach ($this->rules as $field => $callbacks) { foreach ($callbacks as $callback) { // Separate the callback and arguments list ($callback, $args) = $callback; // Function or method name of the rule $rule = is_array($callback) ? $callback[1] : $callback; if ($field === '*') { foreach ($fields as $f) { // Note that continue, instead of break, is used when // applying rules using a wildcard, so that all fields // will be validated. if (isset($this->errors[$f])) { // Prevent other rules from being evaluated if an error has occurred continue; } if (empty($this[$f]) AND ! in_array($rule, $this->empty_rules)) { // This rule does not need to be processed on empty fields continue; } if ($args === NULL) { if ( ! call_user_func($callback, $this[$f])) { $this->errors[$f] = $rule; // Stop validating this field when an error is found continue; } } else { if ( ! call_user_func($callback, $this[$f], $args)) { $this->errors[$f] = $rule; // Stop validating this field when an error is found continue; } } } } else { if (isset($this->errors[$field])) { // Prevent other rules from being evaluated if an error has occurred break; } if ( ! in_array($rule, $this->empty_rules) AND ! $this->required($this[$field])) { // This rule does not need to be processed on empty fields continue; } if ($args === NULL) { if ( ! call_user_func($callback, $this[$field])) { $this->errors[$field] = $rule; // Stop validating this field when an error is found break; } } else { if ( ! call_user_func($callback, $this[$field], $args)) { $this->errors[$field] = $rule; // Stop validating this field when an error is found break; } } } } } foreach ($this->callbacks as $field => $callbacks) { foreach ($callbacks as $callback) { if ($field === '*') { foreach ($fields as $f) { // Note that continue, instead of break, is used when // applying rules using a wildcard, so that all fields // will be validated. if (isset($this->errors[$f])) { // Stop validating this field when an error is found continue; } call_user_func($callback, $this, $f); } } else { if (isset($this->errors[$field])) { // Stop validating this field when an error is found break; } call_user_func($callback, $this, $field); } } } foreach ($this->post_filters as $field => $callbacks) { foreach ($callbacks as $callback) { if ($field === '*') { foreach ($fields as $f) { $this[$f] = is_array($this[$f]) ? array_map($callback, $this[$f]) : call_user_func($callback, $this[$f]); } } else { $this[$field] = is_array($this[$field]) ? array_map($callback, $this[$field]) : call_user_func($callback, $this[$field]); } } } // Return TRUE if there are no errors return $this->errors === array(); } /** * Add an error to an input. * * @chainable * @param string input name * @param string unique error name * @return object */ public function add_error($field, $name) { $this->errors[$field] = $name; return $this; } /** * Sets or returns the message for an input. * * @chainable * @param string input key * @param string message to set * @return string|object */ public function message($input = NULL, $message = NULL) { if ($message === NULL) { if ($input === NULL) { $messages = array(); $keys = array_keys($this->messages); foreach ($keys as $input) { $messages[] = $this->message($input); } return implode("\n", $messages); } // Return nothing if no message exists if (empty($this->messages[$input])) return ''; // Return the HTML message string return $this->messages[$input]; } else { $this->messages[$input] = $message; } return $this; } /** * Return the errors array. * * @param boolean load errors from a lang file * @return array */ public function errors($file = NULL) { if ($file === NULL) { return $this->errors; } else { $errors = array(); foreach ($this->errors as $input => $error) { // Key for this input error $key = "$file.$input.$error"; if (($errors[$input] = Kohana::lang($key)) === $key) { // Get the default error message $errors[$input] = Kohana::lang("$file.$input.default"); } } return $errors; } } /** * Rule: required. Generates an error if the field has an empty value. * * @param mixed input value * @return bool */ public function required($str) { if (is_object($str) AND $str instanceof ArrayObject) { // Get the array from the ArrayObject $str = $str->getArrayCopy(); } if (is_array($str)) { return ! empty($str); } else { return ! ($str === '' OR $str === NULL OR $str === FALSE); } } /** * Rule: matches. Generates an error if the field does not match one or more * other fields. * * @param mixed input value * @param array input names to match against * @return bool */ public function matches($str, array $inputs) { foreach ($inputs as $key) { if ($str !== (isset($this[$key]) ? $this[$key] : NULL)) return FALSE; } return TRUE; } /** * Rule: length. Generates an error if the field is too long or too short. * * @param mixed input value * @param array minimum, maximum, or exact length to match * @return bool */ public function length($str, array $length) { if ( ! is_string($str)) return FALSE; $size = utf8::strlen($str); $status = FALSE; if (count($length) > 1) { list ($min, $max) = $length; if ($size >= $min AND $size <= $max) { $status = TRUE; } } else { $status = ($size === (int) $length[0]); } return $status; } /** * Rule: depends_on. Generates an error if the field does not depend on one * or more other fields. * * @param mixed field name * @param array field names to check dependency * @return bool */ public function depends_on($field, array $fields) { foreach ($fields as $depends_on) { if ( ! isset($this[$depends_on]) OR $this[$depends_on] == NULL) return FALSE; } return TRUE; } /** * Rule: chars. Generates an error if the field contains characters outside of the list. * * @param string field value * @param array allowed characters * @return bool */ public function chars($value, array $chars) { return ! preg_match('![^'.implode('', $chars).']!u', $value); } } // End Validation pnp4nagios-0.6.16/lib/kohana/system/libraries/ORM_Iterator.php0000664000000000000000000000760511662503006022723 0ustar rootrootclass_name = get_class($model); $this->primary_key = $model->primary_key; $this->primary_val = $model->primary_val; // Database result $this->result = $result->result(TRUE); } /** * Returns an array of the results as ORM objects. * * @return array */ public function as_array() { $array = array(); if ($results = $this->result->result_array()) { // Import class name $class = $this->class_name; foreach ($results as $obj) { $array[] = new $class($obj); } } return $array; } /** * Return an array of all of the primary keys for this object. * * @return array */ public function primary_key_array() { $ids = array(); foreach ($this->result as $row) { $ids[] = $row->{$this->primary_key}; } return $ids; } /** * Create a key/value array from the results. * * @param string key column * @param string value column * @return array */ public function select_list($key = NULL, $val = NULL) { if ($key === NULL) { // Use the default key $key = $this->primary_key; } if ($val === NULL) { // Use the default value $val = $this->primary_val; } $array = array(); foreach ($this->result->result_array() as $row) { $array[$row->$key] = $row->$val; } return $array; } /** * Return a range of offsets. * * @param integer start * @param integer end * @return array */ public function range($start, $end) { // Array of objects $array = array(); if ($this->result->offsetExists($start)) { // Import the class name $class = $this->class_name; // Set the end offset $end = $this->result->offsetExists($end) ? $end : $this->count(); for ($i = $start; $i < $end; $i++) { // Insert each object in the range $array[] = new $class($this->result->offsetGet($i)); } } return $array; } /** * Countable: count */ public function count() { return $this->result->count(); } /** * Iterator: current */ public function current() { if ($row = $this->result->current()) { // Import class name $class = $this->class_name; $row = new $class($row); } return $row; } /** * Iterator: key */ public function key() { return $this->result->key(); } /** * Iterator: next */ public function next() { return $this->result->next(); } /** * Iterator: rewind */ public function rewind() { $this->result->rewind(); } /** * Iterator: valid */ public function valid() { return $this->result->valid(); } /** * ArrayAccess: offsetExists */ public function offsetExists($offset) { return $this->result->offsetExists($offset); } /** * ArrayAccess: offsetGet */ public function offsetGet($offset) { if ($this->result->offsetExists($offset)) { // Import class name $class = $this->class_name; return new $class($this->result->offsetGet($offset)); } } /** * ArrayAccess: offsetSet * * @throws Kohana_Database_Exception */ public function offsetSet($offset, $value) { throw new Kohana_Database_Exception('database.result_read_only'); } /** * ArrayAccess: offsetUnset * * @throws Kohana_Database_Exception */ public function offsetUnset($offset) { throw new Kohana_Database_Exception('database.result_read_only'); } } // End ORM Iteratorpnp4nagios-0.6.16/lib/kohana/system/libraries/Event_Observer.php0000664000000000000000000000305311662503006023336 0ustar rootrootupdate($caller); } /** * Updates the observer subject with a new caller. * * @chainable * @param object Event_Subject * @return object */ public function update(SplSubject $caller) { if ( ! ($caller instanceof Event_Subject)) throw new Kohana_Exception('event.invalid_subject', get_class($caller), get_class($this)); // Update the caller $this->caller = $caller; return $this; } /** * Detaches this observer from the subject. * * @chainable * @return object */ public function remove() { // Detach this observer from the caller $this->caller->detach($this); return $this; } /** * Notify the observer of a new message. This function must be defined in * all observers and must take exactly one parameter of any type. * * @param mixed message string, object, or array * @return void */ abstract public function notify($message); } // End Event Observerpnp4nagios-0.6.16/lib/kohana/system/libraries/Model.php0000664000000000000000000000116711662503006021452 0ustar rootrootdb)) { // Load the default database $this->db = Database::instance($this->db); } } } // End Modelpnp4nagios-0.6.16/lib/kohana/system/libraries/Calendar.php0000664000000000000000000002067411662503006022127 0ustar rootroot 3) ? '%A' : '%a'; // Days of the week $days = array('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'); if (Calendar::$start_monday === TRUE) { // Push Sunday to the end of the days array_push($days, array_shift($days)); } if (strpos(Kohana::config('locale.language.0'), 'en') !== 0) { // This is a bit awkward, but it works properly and is reliable foreach ($days as $i => $day) { // Convert the English names to i18n names $days[$i] = strftime($format, strtotime($day)); } } if (is_int($length) OR ctype_digit($length)) { foreach ($days as $i => $day) { // Shorten the days to the expected length $days[$i] = utf8::substr($day, 0, $length); } } return $days; } /** * Create a new Calendar instance. A month and year can be specified. * By default, the current month and year are used. * * @param integer month number * @param integer year number * @return object */ public static function factory($month = NULL, $year = NULL) { return new Calendar($month, $year); } /** * Create a new Calendar instance. A month and year can be specified. * By default, the current month and year are used. * * @param integer month number * @param integer year number * @return void */ public function __construct($month = NULL, $year = NULL) { empty($month) and $month = date('n'); // Current month empty($year) and $year = date('Y'); // Current year // Set the month and year $this->month = (int) $month; $this->year = (int) $year; if (Calendar::$start_monday === TRUE) { // Week starts on Monday $this->week_start = 1; } } /** * Allows fetching the current month and year. * * @param string key to get * @return mixed */ public function __get($key) { if ($key === 'month' OR $key === 'year') { return $this->$key; } } /** * Calendar_Event factory method. * * @param string unique name for the event * @return object Calendar_Event */ public function event($name = NULL) { return new Calendar_Event($this); } /** * Calendar_Event factory method. * * @chainable * @param string standard event type * @return object */ public function standard($name) { switch ($name) { case 'today': // Add an event for the current day $this->attach($this->event()->condition('timestamp', strtotime('today'))->add_class('today')); break; case 'prev-next': // Add an event for padding days $this->attach($this->event()->condition('current', FALSE)->add_class('prev-next')); break; case 'holidays': // Base event $event = $this->event()->condition('current', TRUE)->add_class('holiday'); // Attach New Years $holiday = clone $event; $this->attach($holiday->condition('month', 1)->condition('day', 1)); // Attach Valentine's Day $holiday = clone $event; $this->attach($holiday->condition('month', 2)->condition('day', 14)); // Attach St. Patrick's Day $holiday = clone $event; $this->attach($holiday->condition('month', 3)->condition('day', 17)); // Attach Easter $holiday = clone $event; $this->attach($holiday->condition('easter', TRUE)); // Attach Memorial Day $holiday = clone $event; $this->attach($holiday->condition('month', 5)->condition('day_of_week', 1)->condition('last_occurrence', TRUE)); // Attach Independance Day $holiday = clone $event; $this->attach($holiday->condition('month', 7)->condition('day', 4)); // Attach Labor Day $holiday = clone $event; $this->attach($holiday->condition('month', 9)->condition('day_of_week', 1)->condition('occurrence', 1)); // Attach Halloween $holiday = clone $event; $this->attach($holiday->condition('month', 10)->condition('day', 31)); // Attach Thanksgiving $holiday = clone $event; $this->attach($holiday->condition('month', 11)->condition('day_of_week', 4)->condition('occurrence', 4)); // Attach Christmas $holiday = clone $event; $this->attach($holiday->condition('month', 12)->condition('day', 25)); break; case 'weekends': // Weekend events $this->attach($this->event()->condition('weekend', TRUE)->add_class('weekend')); break; } return $this; } /** * Returns an array for use with a view. The array contains an array for * each week. Each week contains 7 arrays, with a day number and status: * TRUE if the day is in the month, FALSE if it is padding. * * @return array */ public function weeks() { // First day of the month as a timestamp $first = mktime(1, 0, 0, $this->month, 1, $this->year); // Total number of days in this month $total = (int) date('t', $first); // Last day of the month as a timestamp $last = mktime(1, 0, 0, $this->month, $total, $this->year); // Make the month and week empty arrays $month = $week = array(); // Number of days added. When this reaches 7, start a new week $days = 0; $week_number = 1; if (($w = (int) date('w', $first) - $this->week_start) < 0) { $w = 6; } if ($w > 0) { // Number of days in the previous month $n = (int) date('t', mktime(1, 0, 0, $this->month - 1, 1, $this->year)); // i = number of day, t = number of days to pad for ($i = $n - $w + 1, $t = $w; $t > 0; $t--, $i++) { // Notify the listeners $this->notify(array($this->month - 1, $i, $this->year, $week_number, FALSE)); // Add previous month padding days $week[] = array($i, FALSE, $this->observed_data); $days++; } } // i = number of day for ($i = 1; $i <= $total; $i++) { if ($days % 7 === 0) { // Start a new week $month[] = $week; $week = array(); $week_number++; } // Notify the listeners $this->notify(array($this->month, $i, $this->year, $week_number, TRUE)); // Add days to this month $week[] = array($i, TRUE, $this->observed_data); $days++; } if (($w = (int) date('w', $last) - $this->week_start) < 0) { $w = 6; } if ($w >= 0) { // i = number of day, t = number of days to pad for ($i = 1, $t = 6 - $w; $t > 0; $t--, $i++) { // Notify the listeners $this->notify(array($this->month + 1, $i, $this->year, $week_number, FALSE)); // Add next month padding days $week[] = array($i, FALSE, $this->observed_data); } } if ( ! empty($week)) { // Append the remaining days $month[] = $week; } return $month; } /** * Adds new data from an observer. All event data contains and array of CSS * classes and an array of output messages. * * @param array observer data. * @return void */ public function add_data(array $data) { // Add new classes $this->observed_data['classes'] += $data['classes']; if ( ! empty($data['output'])) { // Only add output if it's not empty $this->observed_data['output'][] = $data['output']; } } /** * Resets the observed data and sends a notify to all attached events. * * @param array UNIX timestamp * @return void */ public function notify($data) { // Reset observed data $this->observed_data = array ( 'classes' => array(), 'output' => array(), ); // Send a notify parent::notify($data); } /** * Convert the calendar to HTML using the kohana_calendar view. * * @return string */ public function render() { $view = new View('kohana_calendar', array ( 'month' => $this->month, 'year' => $this->year, 'weeks' => $this->weeks(), )); return $view->render(); } /** * Magically convert this object to a string, the rendered calendar. * * @return string */ public function __toString() { return $this->render(); } } // End Calendarpnp4nagios-0.6.16/lib/kohana/system/libraries/Database.php0000664000000000000000000010405511662503006022116 0ustar rootroot TRUE, 'persistent' => FALSE, 'connection' => '', 'character_set' => 'utf8', 'table_prefix' => '', 'object' => TRUE, 'cache' => FALSE, 'escape' => TRUE, ); // Database driver object protected $driver; protected $link; // Un-compiled parts of the SQL query protected $select = array(); protected $set = array(); protected $from = array(); protected $join = array(); protected $where = array(); protected $orderby = array(); protected $order = array(); protected $groupby = array(); protected $having = array(); protected $distinct = FALSE; protected $limit = FALSE; protected $offset = FALSE; protected $last_query = ''; // Stack of queries for push/pop protected $query_history = array(); /** * Returns a singleton instance of Database. * * @param mixed configuration array or DSN * @return Database_Core */ public static function & instance($name = 'default', $config = NULL) { if ( ! isset(Database::$instances[$name])) { // Create a new instance Database::$instances[$name] = new Database($config === NULL ? $name : $config); } return Database::$instances[$name]; } /** * Returns the name of a given database instance. * * @param Database instance of Database * @return string */ public static function instance_name(Database $db) { return array_search($db, Database::$instances, TRUE); } /** * Sets up the database configuration, loads the Database_Driver. * * @throws Kohana_Database_Exception */ public function __construct($config = array()) { if (empty($config)) { // Load the default group $config = Kohana::config('database.default'); } elseif (is_array($config) AND count($config) > 0) { if ( ! array_key_exists('connection', $config)) { $config = array('connection' => $config); } } elseif (is_string($config)) { // The config is a DSN string if (strpos($config, '://') !== FALSE) { $config = array('connection' => $config); } // The config is a group name else { $name = $config; // Test the config group name if (($config = Kohana::config('database.'.$config)) === NULL) throw new Kohana_Database_Exception('database.undefined_group', $name); } } // Merge the default config with the passed config $this->config = array_merge($this->config, $config); if (is_string($this->config['connection'])) { // Make sure the connection is valid if (strpos($this->config['connection'], '://') === FALSE) throw new Kohana_Database_Exception('database.invalid_dsn', $this->config['connection']); // Parse the DSN, creating an array to hold the connection parameters $db = array ( 'type' => FALSE, 'user' => FALSE, 'pass' => FALSE, 'host' => FALSE, 'port' => FALSE, 'socket' => FALSE, 'database' => FALSE ); // Get the protocol and arguments list ($db['type'], $connection) = explode('://', $this->config['connection'], 2); if (strpos($connection, '@') !== FALSE) { // Get the username and password list ($db['pass'], $connection) = explode('@', $connection, 2); // Check if a password is supplied $logindata = explode(':', $db['pass'], 2); $db['pass'] = (count($logindata) > 1) ? $logindata[1] : ''; $db['user'] = $logindata[0]; // Prepare for finding the database $connection = explode('/', $connection); // Find the database name $db['database'] = array_pop($connection); // Reset connection string $connection = implode('/', $connection); // Find the socket if (preg_match('/^unix\([^)]++\)/', $connection)) { // This one is a little hairy: we explode based on the end of // the socket, removing the 'unix(' from the connection string list ($db['socket'], $connection) = explode(')', substr($connection, 5), 2); } elseif (strpos($connection, ':') !== FALSE) { // Fetch the host and port name list ($db['host'], $db['port']) = explode(':', $connection, 2); } else { $db['host'] = $connection; } } else { // File connection $connection = explode('/', $connection); // Find database file name $db['database'] = array_pop($connection); // Find database directory name $db['socket'] = implode('/', $connection).'/'; } // Reset the connection array to the database config $this->config['connection'] = $db; } // Set driver name $driver = 'Database_'.ucfirst($this->config['connection']['type']).'_Driver'; // Load the driver if ( ! Kohana::auto_load($driver)) throw new Kohana_Database_Exception('core.driver_not_found', $this->config['connection']['type'], get_class($this)); // Initialize the driver $this->driver = new $driver($this->config); // Validate the driver if ( ! ($this->driver instanceof Database_Driver)) throw new Kohana_Database_Exception('core.driver_implements', $this->config['connection']['type'], get_class($this), 'Database_Driver'); Kohana::log('debug', 'Database Library initialized'); } /** * Simple connect method to get the database queries up and running. * * @return void */ public function connect() { // A link can be a resource or an object if ( ! is_resource($this->link) AND ! is_object($this->link)) { $this->link = $this->driver->connect(); if ( ! is_resource($this->link) AND ! is_object($this->link)) throw new Kohana_Database_Exception('database.connection', $this->driver->show_error()); // Clear password after successful connect $this->config['connection']['pass'] = NULL; } } /** * Runs a query into the driver and returns the result. * * @param string SQL query to execute * @return Database_Result */ public function query($sql = '') { if ($sql == '') return FALSE; // No link? Connect! $this->link or $this->connect(); // Start the benchmark $start = microtime(TRUE); if (func_num_args() > 1) //if we have more than one argument ($sql) { $argv = func_get_args(); $binds = (is_array(next($argv))) ? current($argv) : array_slice($argv, 1); } // Compile binds if needed if (isset($binds)) { $sql = $this->compile_binds($sql, $binds); } // Fetch the result $result = $this->driver->query($this->last_query = $sql); // Stop the benchmark $stop = microtime(TRUE); if ($this->config['benchmark'] == TRUE) { // Benchmark the query Database::$benchmarks[] = array('query' => $sql, 'time' => $stop - $start, 'rows' => count($result)); } return $result; } /** * Selects the column names for a database query. * * @param string string or array of column names to select * @return Database_Core This Database object. */ public function select($sql = '*') { if (func_num_args() > 1) { $sql = func_get_args(); } elseif (is_string($sql)) { $sql = explode(',', $sql); } else { $sql = (array) $sql; } foreach ($sql as $val) { if (($val = trim($val)) === '') continue; if (strpos($val, '(') === FALSE AND $val !== '*') { if (preg_match('/^DISTINCT\s++(.+)$/i', $val, $matches)) { // Only prepend with table prefix if table name is specified $val = (strpos($matches[1], '.') !== FALSE) ? $this->config['table_prefix'].$matches[1] : $matches[1]; $this->distinct = TRUE; } else { $val = (strpos($val, '.') !== FALSE) ? $this->config['table_prefix'].$val : $val; } $val = $this->driver->escape_column($val); } $this->select[] = $val; } return $this; } /** * Selects the from table(s) for a database query. * * @param string string or array of tables to select * @return Database_Core This Database object. */ public function from($sql) { if (func_num_args() > 1) { $sql = func_get_args(); } elseif (is_string($sql)) { $sql = explode(',', $sql); } else { $sql = array($sql); } foreach ($sql as $val) { if (is_string($val)) { if (($val = trim($val)) === '') continue; // TODO: Temporary solution, this should be moved to database driver (AS is checked for twice) if (stripos($val, ' AS ') !== FALSE) { $val = str_ireplace(' AS ', ' AS ', $val); list($table, $alias) = explode(' AS ', $val); // Attach prefix to both sides of the AS $val = $this->config['table_prefix'].$table.' AS '.$this->config['table_prefix'].$alias; } else { $val = $this->config['table_prefix'].$val; } } $this->from[] = $val; } return $this; } /** * Generates the JOIN portion of the query. * * @param string table name * @param string|array where key or array of key => value pairs * @param string where value * @param string type of join * @return Database_Core This Database object. */ public function join($table, $key, $value = NULL, $type = '') { $join = array(); if ( ! empty($type)) { $type = strtoupper(trim($type)); if ( ! in_array($type, array('LEFT', 'RIGHT', 'OUTER', 'INNER', 'LEFT OUTER', 'RIGHT OUTER'), TRUE)) { $type = ''; } else { $type .= ' '; } } $cond = array(); $keys = is_array($key) ? $key : array($key => $value); foreach ($keys as $key => $value) { $key = (strpos($key, '.') !== FALSE) ? $this->config['table_prefix'].$key : $key; if (is_string($value)) { // Only escape if it's a string $value = $this->driver->escape_column($this->config['table_prefix'].$value); } $cond[] = $this->driver->where($key, $value, 'AND ', count($cond), FALSE); } if ( ! is_array($this->join)) { $this->join = array(); } if ( ! is_array($table)) { $table = array($table); } foreach ($table as $t) { if (is_string($t)) { // TODO: Temporary solution, this should be moved to database driver (AS is checked for twice) if (stripos($t, ' AS ') !== FALSE) { $t = str_ireplace(' AS ', ' AS ', $t); list($table, $alias) = explode(' AS ', $t); // Attach prefix to both sides of the AS $t = $this->config['table_prefix'].$table.' AS '.$this->config['table_prefix'].$alias; } else { $t = $this->config['table_prefix'].$t; } } $join['tables'][] = $this->driver->escape_column($t); } $join['conditions'] = '('.trim(implode(' ', $cond)).')'; $join['type'] = $type; $this->join[] = $join; return $this; } /** * Selects the where(s) for a database query. * * @param string|array key name or array of key => value pairs * @param string value to match with key * @param boolean disable quoting of WHERE clause * @return Database_Core This Database object. */ public function where($key, $value = NULL, $quote = TRUE) { $quote = (func_num_args() < 2 AND ! is_array($key)) ? -1 : $quote; if (is_object($key)) { $keys = array((string) $key => ''); } elseif ( ! is_array($key)) { $keys = array($key => $value); } else { $keys = $key; } foreach ($keys as $key => $value) { $key = (strpos($key, '.') !== FALSE) ? $this->config['table_prefix'].$key : $key; $this->where[] = $this->driver->where($key, $value, 'AND ', count($this->where), $quote); } return $this; } /** * Selects the or where(s) for a database query. * * @param string|array key name or array of key => value pairs * @param string value to match with key * @param boolean disable quoting of WHERE clause * @return Database_Core This Database object. */ public function orwhere($key, $value = NULL, $quote = TRUE) { $quote = (func_num_args() < 2 AND ! is_array($key)) ? -1 : $quote; if (is_object($key)) { $keys = array((string) $key => ''); } elseif ( ! is_array($key)) { $keys = array($key => $value); } else { $keys = $key; } foreach ($keys as $key => $value) { $key = (strpos($key, '.') !== FALSE) ? $this->config['table_prefix'].$key : $key; $this->where[] = $this->driver->where($key, $value, 'OR ', count($this->where), $quote); } return $this; } /** * Selects the like(s) for a database query. * * @param string|array field name or array of field => match pairs * @param string like value to match with field * @param boolean automatically add starting and ending wildcards * @return Database_Core This Database object. */ public function like($field, $match = '', $auto = TRUE) { $fields = is_array($field) ? $field : array($field => $match); foreach ($fields as $field => $match) { $field = (strpos($field, '.') !== FALSE) ? $this->config['table_prefix'].$field : $field; $this->where[] = $this->driver->like($field, $match, $auto, 'AND ', count($this->where)); } return $this; } /** * Selects the or like(s) for a database query. * * @param string|array field name or array of field => match pairs * @param string like value to match with field * @param boolean automatically add starting and ending wildcards * @return Database_Core This Database object. */ public function orlike($field, $match = '', $auto = TRUE) { $fields = is_array($field) ? $field : array($field => $match); foreach ($fields as $field => $match) { $field = (strpos($field, '.') !== FALSE) ? $this->config['table_prefix'].$field : $field; $this->where[] = $this->driver->like($field, $match, $auto, 'OR ', count($this->where)); } return $this; } /** * Selects the not like(s) for a database query. * * @param string|array field name or array of field => match pairs * @param string like value to match with field * @param boolean automatically add starting and ending wildcards * @return Database_Core This Database object. */ public function notlike($field, $match = '', $auto = TRUE) { $fields = is_array($field) ? $field : array($field => $match); foreach ($fields as $field => $match) { $field = (strpos($field, '.') !== FALSE) ? $this->config['table_prefix'].$field : $field; $this->where[] = $this->driver->notlike($field, $match, $auto, 'AND ', count($this->where)); } return $this; } /** * Selects the or not like(s) for a database query. * * @param string|array field name or array of field => match pairs * @param string like value to match with field * @return Database_Core This Database object. */ public function ornotlike($field, $match = '', $auto = TRUE) { $fields = is_array($field) ? $field : array($field => $match); foreach ($fields as $field => $match) { $field = (strpos($field, '.') !== FALSE) ? $this->config['table_prefix'].$field : $field; $this->where[] = $this->driver->notlike($field, $match, $auto, 'OR ', count($this->where)); } return $this; } /** * Selects the like(s) for a database query. * * @param string|array field name or array of field => match pairs * @param string like value to match with field * @return Database_Core This Database object. */ public function regex($field, $match = '') { $fields = is_array($field) ? $field : array($field => $match); foreach ($fields as $field => $match) { $field = (strpos($field, '.') !== FALSE) ? $this->config['table_prefix'].$field : $field; $this->where[] = $this->driver->regex($field, $match, 'AND ', count($this->where)); } return $this; } /** * Selects the or like(s) for a database query. * * @param string|array field name or array of field => match pairs * @param string like value to match with field * @return Database_Core This Database object. */ public function orregex($field, $match = '') { $fields = is_array($field) ? $field : array($field => $match); foreach ($fields as $field => $match) { $field = (strpos($field, '.') !== FALSE) ? $this->config['table_prefix'].$field : $field; $this->where[] = $this->driver->regex($field, $match, 'OR ', count($this->where)); } return $this; } /** * Selects the not regex(s) for a database query. * * @param string|array field name or array of field => match pairs * @param string regex value to match with field * @return Database_Core This Database object. */ public function notregex($field, $match = '') { $fields = is_array($field) ? $field : array($field => $match); foreach ($fields as $field => $match) { $field = (strpos($field, '.') !== FALSE) ? $this->config['table_prefix'].$field : $field; $this->where[] = $this->driver->notregex($field, $match, 'AND ', count($this->where)); } return $this; } /** * Selects the or not regex(s) for a database query. * * @param string|array field name or array of field => match pairs * @param string regex value to match with field * @return Database_Core This Database object. */ public function ornotregex($field, $match = '') { $fields = is_array($field) ? $field : array($field => $match); foreach ($fields as $field => $match) { $field = (strpos($field, '.') !== FALSE) ? $this->config['table_prefix'].$field : $field; $this->where[] = $this->driver->notregex($field, $match, 'OR ', count($this->where)); } return $this; } /** * Chooses the column to group by in a select query. * * @param string column name to group by * @return Database_Core This Database object. */ public function groupby($by) { if ( ! is_array($by)) { $by = explode(',', (string) $by); } foreach ($by as $val) { $val = trim($val); if ($val != '') { // Add the table prefix if we are using table.column names if(strpos($val, '.')) { $val = $this->config['table_prefix'].$val; } $this->groupby[] = $this->driver->escape_column($val); } } return $this; } /** * Selects the having(s) for a database query. * * @param string|array key name or array of key => value pairs * @param string value to match with key * @param boolean disable quoting of WHERE clause * @return Database_Core This Database object. */ public function having($key, $value = '', $quote = TRUE) { $this->having[] = $this->driver->where($key, $value, 'AND', count($this->having), TRUE); return $this; } /** * Selects the or having(s) for a database query. * * @param string|array key name or array of key => value pairs * @param string value to match with key * @param boolean disable quoting of WHERE clause * @return Database_Core This Database object. */ public function orhaving($key, $value = '', $quote = TRUE) { $this->having[] = $this->driver->where($key, $value, 'OR', count($this->having), TRUE); return $this; } /** * Chooses which column(s) to order the select query by. * * @param string|array column(s) to order on, can be an array, single column, or comma seperated list of columns * @param string direction of the order * @return Database_Core This Database object. */ public function orderby($orderby, $direction = NULL) { if ( ! is_array($orderby)) { $orderby = array($orderby => $direction); } foreach ($orderby as $column => $direction) { $direction = strtoupper(trim($direction)); // Add a direction if the provided one isn't valid if ( ! in_array($direction, array('ASC', 'DESC', 'RAND()', 'RANDOM()', 'NULL'))) { $direction = 'ASC'; } // Add the table prefix if a table.column was passed if (strpos($column, '.')) { $column = $this->config['table_prefix'].$column; } $this->orderby[] = $this->driver->escape_column($column).' '.$direction; } return $this; } /** * Selects the limit section of a query. * * @param integer number of rows to limit result to * @param integer offset in result to start returning rows from * @return Database_Core This Database object. */ public function limit($limit, $offset = NULL) { $this->limit = (int) $limit; if ($offset !== NULL OR ! is_int($this->offset)) { $this->offset($offset); } return $this; } /** * Sets the offset portion of a query. * * @param integer offset value * @return Database_Core This Database object. */ public function offset($value) { $this->offset = (int) $value; return $this; } /** * Allows key/value pairs to be set for inserting or updating. * * @param string|array key name or array of key => value pairs * @param string value to match with key * @return Database_Core This Database object. */ public function set($key, $value = '') { if ( ! is_array($key)) { $key = array($key => $value); } foreach ($key as $k => $v) { // Add a table prefix if the column includes the table. if (strpos($k, '.')) $k = $this->config['table_prefix'].$k; $this->set[$k] = $this->driver->escape($v); } return $this; } /** * Compiles the select statement based on the other functions called and runs the query. * * @param string table name * @param string limit clause * @param string offset clause * @return Database_Result */ public function get($table = '', $limit = NULL, $offset = NULL) { if ($table != '') { $this->from($table); } if ( ! is_null($limit)) { $this->limit($limit, $offset); } $sql = $this->driver->compile_select(get_object_vars($this)); $this->reset_select(); $result = $this->query($sql); $this->last_query = $sql; return $result; } /** * Compiles the select statement based on the other functions called and runs the query. * * @param string table name * @param array where clause * @param string limit clause * @param string offset clause * @return Database_Core This Database object. */ public function getwhere($table = '', $where = NULL, $limit = NULL, $offset = NULL) { if ($table != '') { $this->from($table); } if ( ! is_null($where)) { $this->where($where); } if ( ! is_null($limit)) { $this->limit($limit, $offset); } $sql = $this->driver->compile_select(get_object_vars($this)); $this->reset_select(); $result = $this->query($sql); return $result; } /** * Compiles the select statement based on the other functions called and returns the query string. * * @param string table name * @param string limit clause * @param string offset clause * @return string sql string */ public function compile($table = '', $limit = NULL, $offset = NULL) { if ($table != '') { $this->from($table); } if ( ! is_null($limit)) { $this->limit($limit, $offset); } $sql = $this->driver->compile_select(get_object_vars($this)); $this->reset_select(); return $sql; } /** * Compiles an insert string and runs the query. * * @param string table name * @param array array of key/value pairs to insert * @return Database_Result Query result */ public function insert($table = '', $set = NULL) { if ( ! is_null($set)) { $this->set($set); } if ($this->set == NULL) throw new Kohana_Database_Exception('database.must_use_set'); if ($table == '') { if ( ! isset($this->from[0])) throw new Kohana_Database_Exception('database.must_use_table'); $table = $this->from[0]; } // If caching is enabled, clear the cache before inserting ($this->config['cache'] === TRUE) and $this->clear_cache(); $sql = $this->driver->insert($this->config['table_prefix'].$table, array_keys($this->set), array_values($this->set)); $this->reset_write(); return $this->query($sql); } /** * Adds an "IN" condition to the where clause * * @param string Name of the column being examined * @param mixed An array or string to match against * @param bool Generate a NOT IN clause instead * @return Database_Core This Database object. */ public function in($field, $values, $not = FALSE) { if (is_array($values)) { $escaped_values = array(); foreach ($values as $v) { if (is_numeric($v)) { $escaped_values[] = $v; } else { $escaped_values[] = "'".$this->driver->escape_str($v)."'"; } } $values = implode(",", $escaped_values); } $where = $this->driver->escape_column(((strpos($field,'.') !== FALSE) ? $this->config['table_prefix'] : ''). $field).' '.($not === TRUE ? 'NOT ' : '').'IN ('.$values.')'; $this->where[] = $this->driver->where($where, '', 'AND ', count($this->where), -1); return $this; } /** * Adds a "NOT IN" condition to the where clause * * @param string Name of the column being examined * @param mixed An array or string to match against * @return Database_Core This Database object. */ public function notin($field, $values) { return $this->in($field, $values, TRUE); } /** * Compiles a merge string and runs the query. * * @param string table name * @param array array of key/value pairs to merge * @return Database_Result Query result */ public function merge($table = '', $set = NULL) { if ( ! is_null($set)) { $this->set($set); } if ($this->set == NULL) throw new Kohana_Database_Exception('database.must_use_set'); if ($table == '') { if ( ! isset($this->from[0])) throw new Kohana_Database_Exception('database.must_use_table'); $table = $this->from[0]; } $sql = $this->driver->merge($this->config['table_prefix'].$table, array_keys($this->set), array_values($this->set)); $this->reset_write(); return $this->query($sql); } /** * Compiles an update string and runs the query. * * @param string table name * @param array associative array of update values * @param array where clause * @return Database_Result Query result */ public function update($table = '', $set = NULL, $where = NULL) { if ( is_array($set)) { $this->set($set); } if ( ! is_null($where)) { $this->where($where); } if ($this->set == FALSE) throw new Kohana_Database_Exception('database.must_use_set'); if ($table == '') { if ( ! isset($this->from[0])) throw new Kohana_Database_Exception('database.must_use_table'); $table = $this->from[0]; } $sql = $this->driver->update($this->config['table_prefix'].$table, $this->set, $this->where); $this->reset_write(); return $this->query($sql); } /** * Compiles a delete string and runs the query. * * @param string table name * @param array where clause * @return Database_Result Query result */ public function delete($table = '', $where = NULL) { if ($table == '') { if ( ! isset($this->from[0])) throw new Kohana_Database_Exception('database.must_use_table'); $table = $this->from[0]; } else { $table = $this->config['table_prefix'].$table; } if (! is_null($where)) { $this->where($where); } if (count($this->where) < 1) throw new Kohana_Database_Exception('database.must_use_where'); $sql = $this->driver->delete($table, $this->where); $this->reset_write(); return $this->query($sql); } /** * Returns the last query run. * * @return string SQL */ public function last_query() { return $this->last_query; } /** * Count query records. * * @param string table name * @param array where clause * @return integer */ public function count_records($table = FALSE, $where = NULL) { if (count($this->from) < 1) { if ($table == FALSE) throw new Kohana_Database_Exception('database.must_use_table'); $this->from($table); } if ($where !== NULL) { $this->where($where); } $query = $this->select('COUNT(*) AS '.$this->escape_column('records_found'))->get()->result(TRUE); return (int) $query->current()->records_found; } /** * Resets all private select variables. * * @return void */ protected function reset_select() { $this->select = array(); $this->from = array(); $this->join = array(); $this->where = array(); $this->orderby = array(); $this->groupby = array(); $this->having = array(); $this->distinct = FALSE; $this->limit = FALSE; $this->offset = FALSE; } /** * Resets all private insert and update variables. * * @return void */ protected function reset_write() { $this->set = array(); $this->from = array(); $this->where = array(); } /** * Lists all the tables in the current database. * * @return array */ public function list_tables() { $this->link or $this->connect(); return $this->driver->list_tables(); } /** * See if a table exists in the database. * * @param string table name * @param boolean True to attach table prefix * @return boolean */ public function table_exists($table_name, $prefix = TRUE) { if ($prefix) return in_array($this->config['table_prefix'].$table_name, $this->list_tables()); else return in_array($table_name, $this->list_tables()); } /** * Combine a SQL statement with the bind values. Used for safe queries. * * @param string query to bind to the values * @param array array of values to bind to the query * @return string */ public function compile_binds($sql, $binds) { foreach ((array) $binds as $val) { // If the SQL contains no more bind marks ("?"), we're done. if (($next_bind_pos = strpos($sql, '?')) === FALSE) break; // Properly escape the bind value. $val = $this->driver->escape($val); // Temporarily replace possible bind marks ("?"), in the bind value itself, with a placeholder. $val = str_replace('?', '{%B%}', $val); // Replace the first bind mark ("?") with its corresponding value. $sql = substr($sql, 0, $next_bind_pos).$val.substr($sql, $next_bind_pos + 1); } // Restore placeholders. return str_replace('{%B%}', '?', $sql); } /** * Get the field data for a database table, along with the field's attributes. * * @param string table name * @return array */ public function field_data($table = '') { $this->link or $this->connect(); return $this->driver->field_data($this->config['table_prefix'].$table); } /** * Get the field data for a database table, along with the field's attributes. * * @param string table name * @return array */ public function list_fields($table = '') { $this->link or $this->connect(); return $this->driver->list_fields($this->config['table_prefix'].$table); } /** * Escapes a value for a query. * * @param mixed value to escape * @return string */ public function escape($value) { return $this->driver->escape($value); } /** * Escapes a string for a query. * * @param string string to escape * @return string */ public function escape_str($str) { return $this->driver->escape_str($str); } /** * Escapes a table name for a query. * * @param string string to escape * @return string */ public function escape_table($table) { return $this->driver->escape_table($table); } /** * Escapes a column name for a query. * * @param string string to escape * @return string */ public function escape_column($table) { return $this->driver->escape_column($table); } /** * Returns table prefix of current configuration. * * @return string */ public function table_prefix() { return $this->config['table_prefix']; } /** * Clears the query cache. * * @param string|TRUE clear cache by SQL statement or TRUE for last query * @return Database_Core This Database object. */ public function clear_cache($sql = NULL) { if ($sql === TRUE) { $this->driver->clear_cache($this->last_query); } elseif (is_string($sql)) { $this->driver->clear_cache($sql); } else { $this->driver->clear_cache(); } return $this; } /** * Pushes existing query space onto the query stack. Use push * and pop to prevent queries from clashing before they are * executed * * @return Database_Core This Databaes object */ public function push() { array_push($this->query_history, array( $this->select, $this->from, $this->join, $this->where, $this->orderby, $this->order, $this->groupby, $this->having, $this->distinct, $this->limit, $this->offset )); $this->reset_select(); return $this; } /** * Pops from query stack into the current query space. * * @return Database_Core This Databaes object */ public function pop() { if (count($this->query_history) == 0) { // No history return $this; } list( $this->select, $this->from, $this->join, $this->where, $this->orderby, $this->order, $this->groupby, $this->having, $this->distinct, $this->limit, $this->offset ) = array_pop($this->query_history); return $this; } /** * Count the number of records in the last query, without LIMIT or OFFSET applied. * * @return integer */ public function count_last_query() { if ($sql = $this->last_query()) { if (stripos($sql, 'LIMIT') !== FALSE) { // Remove LIMIT from the SQL $sql = preg_replace('/\sLIMIT\s+[^a-z]+/i', ' ', $sql); } if (stripos($sql, 'OFFSET') !== FALSE) { // Remove OFFSET from the SQL $sql = preg_replace('/\sOFFSET\s+\d+/i', '', $sql); } // Get the total rows from the last query executed $result = $this->query ( 'SELECT COUNT(*) AS '.$this->escape_column('total_rows').' '. 'FROM ('.trim($sql).') AS '.$this->escape_table('counted_results') ); // Return the total number of rows from the query return (int) $result->current()->total_rows; } return FALSE; } } // End Database Class /** * Sets the code for a Database exception. */ class Kohana_Database_Exception extends Kohana_Exception { protected $code = E_DATABASE_ERROR; } // End Kohana Database Exception pnp4nagios-0.6.16/lib/kohana/system/libraries/ORM_Tree.php0000664000000000000000000000361111662503006022022 0ustar rootrootrelated[$column])) { // Load child model $model = ORM::factory(inflector::singular($this->ORM_Tree_children)); if (array_key_exists($this->ORM_Tree_parent_key, $this->object)) { // Find children of this parent $model->where($model->primary_key, $this->object[$this->ORM_Tree_parent_key])->find(); } $this->related[$column] = $model; } return $this->related[$column]; } elseif ($column === 'children') { if (empty($this->related[$column])) { $model = ORM::factory(inflector::singular($this->ORM_Tree_children)); if ($this->ORM_Tree_children === $this->table_name) { // Load children within this table $this->related[$column] = $model ->where($this->ORM_Tree_parent_key, $this->object[$this->primary_key]) ->find_all(); } else { // Find first selection of children $this->related[$column] = $model ->where($this->foreign_key(), $this->object[$this->primary_key]) ->where($this->ORM_Tree_parent_key, NULL) ->find_all(); } } return $this->related[$column]; } return parent::__get($column); } } // End ORM Treepnp4nagios-0.6.16/lib/kohana/system/libraries/URI.php0000664000000000000000000001431711662503006021052 0ustar rootrootbuild_array(URI::$segments, $offset, $associative); } /** * Returns an array containing all the re-routed URI segments. * * @param integer rsegment offset * @param boolean return an associative array * @return array */ public function rsegment_array($offset = 0, $associative = FALSE) { return $this->build_array(URI::$rsegments, $offset, $associative); } /** * Returns an array containing all the URI arguments. * * @param integer segment offset * @param boolean return an associative array * @return array */ public function argument_array($offset = 0, $associative = FALSE) { return $this->build_array(URI::$arguments, $offset, $associative); } /** * Creates a simple or associative array from an array and an offset. * Used as a helper for (r)segment_array and argument_array. * * @param array array to rebuild * @param integer offset to start from * @param boolean create an associative array * @return array */ public function build_array($array, $offset = 0, $associative = FALSE) { // Prevent the keys from being improperly indexed array_unshift($array, 0); // Slice the array, preserving the keys $array = array_slice($array, $offset + 1, count($array) - 1, TRUE); if ($associative === FALSE) return $array; $associative = array(); $pairs = array_chunk($array, 2); foreach ($pairs as $pair) { // Add the key/value pair to the associative array $associative[$pair[0]] = isset($pair[1]) ? $pair[1] : ''; } return $associative; } /** * Returns the complete URI as a string. * * @return string */ public function string() { return URI::$current_uri; } /** * Magic method for converting an object to a string. * * @return string */ public function __toString() { return URI::$current_uri; } /** * Returns the total number of URI segments. * * @return integer */ public function total_segments() { return count(URI::$segments); } /** * Returns the total number of re-routed URI segments. * * @return integer */ public function total_rsegments() { return count(URI::$rsegments); } /** * Returns the total number of URI arguments. * * @return integer */ public function total_arguments() { return count(URI::$arguments); } /** * Returns the last URI segment. * * @param mixed default value returned if segment does not exist * @return string */ public function last_segment($default = FALSE) { if (($end = $this->total_segments()) < 1) return $default; return URI::$segments[$end - 1]; } /** * Returns the last re-routed URI segment. * * @param mixed default value returned if segment does not exist * @return string */ public function last_rsegment($default = FALSE) { if (($end = $this->total_segments()) < 1) return $default; return URI::$rsegments[$end - 1]; } /** * Returns the path to the current controller (not including the actual * controller), as a web path. * * @param boolean return a full url, or only the path specifically * @return string */ public function controller_path($full = TRUE) { return ($full) ? url::site(URI::$controller_path) : URI::$controller_path; } /** * Returns the current controller, as a web path. * * @param boolean return a full url, or only the controller specifically * @return string */ public function controller($full = TRUE) { return ($full) ? url::site(URI::$controller_path.URI::$controller) : URI::$controller; } /** * Returns the current method, as a web path. * * @param boolean return a full url, or only the method specifically * @return string */ public function method($full = TRUE) { return ($full) ? url::site(URI::$controller_path.URI::$controller.'/'.URI::$method) : URI::$method; } } // End URI Class pnp4nagios-0.6.16/lib/kohana/system/libraries/Encrypt.php0000664000000000000000000001032011662503006022025 0ustar rootroot $size) { // Shorten the key to the maximum size $config['key'] = substr($config['key'], 0, $size); } // Find the initialization vector size $config['iv_size'] = mcrypt_get_iv_size($config['cipher'], $config['mode']); // Cache the config in the object $this->config = $config; Kohana::log('debug', 'Encrypt Library initialized'); } /** * Encrypts a string and returns an encrypted string that can be decoded. * * @param string data to be encrypted * @return string encrypted data */ public function encode($data) { // Set the rand type if it has not already been set if (Encrypt::$rand === NULL) { if (KOHANA_IS_WIN) { // Windows only supports the system random number generator Encrypt::$rand = MCRYPT_RAND; } else { if (defined('MCRYPT_DEV_URANDOM')) { // Use /dev/urandom Encrypt::$rand = MCRYPT_DEV_URANDOM; } elseif (defined('MCRYPT_DEV_RANDOM')) { // Use /dev/random Encrypt::$rand = MCRYPT_DEV_RANDOM; } else { // Use the system random number generator Encrypt::$rand = MCRYPT_RAND; } } } if (Encrypt::$rand === MCRYPT_RAND) { // The system random number generator must always be seeded each // time it is used, or it will not produce true random results mt_srand(); } // Create a random initialization vector of the proper size for the current cipher $iv = mcrypt_create_iv($this->config['iv_size'], Encrypt::$rand); // Encrypt the data using the configured options and generated iv $data = mcrypt_encrypt($this->config['cipher'], $this->config['key'], $data, $this->config['mode'], $iv); // Use base64 encoding to convert to a string return base64_encode($iv.$data); } /** * Decrypts an encoded string back to its original value. * * @param string encoded string to be decrypted * @return string decrypted data */ public function decode($data) { // Convert the data back to binary $data = base64_decode($data); // Extract the initialization vector from the data $iv = substr($data, 0, $this->config['iv_size']); // Remove the iv from the data $data = substr($data, $this->config['iv_size']); // Return the decrypted data, trimming the \0 padding bytes from the end of the data return rtrim(mcrypt_decrypt($this->config['cipher'], $this->config['key'], $data, $this->config['mode'], $iv), "\0"); } } // End Encrypt pnp4nagios-0.6.16/lib/kohana/system/libraries/Input.php0000664000000000000000000003115011662503006021504 0ustar rootrootuse_xss_clean = (bool) Kohana::config('core.global_xss_filtering'); if (Input::$instance === NULL) { // magic_quotes_runtime is enabled if (get_magic_quotes_runtime()) { set_magic_quotes_runtime(0); Kohana::log('debug', 'Disable magic_quotes_runtime! It is evil and deprecated: http://php.net/magic_quotes'); } // magic_quotes_gpc is enabled if (get_magic_quotes_gpc()) { $this->magic_quotes_gpc = TRUE; Kohana::log('debug', 'Disable magic_quotes_gpc! It is evil and deprecated: http://php.net/magic_quotes'); } // register_globals is enabled if (ini_get('register_globals')) { if (isset($_REQUEST['GLOBALS'])) { // Prevent GLOBALS override attacks exit('Global variable overload attack.'); } // Destroy the REQUEST global $_REQUEST = array(); // These globals are standard and should not be removed $preserve = array('GLOBALS', '_REQUEST', '_GET', '_POST', '_FILES', '_COOKIE', '_SERVER', '_ENV', '_SESSION'); // This loop has the same effect as disabling register_globals foreach (array_diff(array_keys($GLOBALS), $preserve) as $key) { global $$key; $$key = NULL; // Unset the global variable unset($GLOBALS[$key], $$key); } // Warn the developer about register globals Kohana::log('debug', 'Disable register_globals! It is evil and deprecated: http://php.net/register_globals'); } if (is_array($_GET)) { foreach ($_GET as $key => $val) { // Sanitize $_GET $_GET[$this->clean_input_keys($key)] = $this->clean_input_data($val); } } else { $_GET = array(); } if (is_array($_POST)) { foreach ($_POST as $key => $val) { // Sanitize $_POST $_POST[$this->clean_input_keys($key)] = $this->clean_input_data($val); } } else { $_POST = array(); } if (is_array($_COOKIE)) { foreach ($_COOKIE as $key => $val) { // Ignore special attributes in RFC2109 compliant cookies if ($key == '$Version' OR $key == '$Path' OR $key == '$Domain') continue; // Sanitize $_COOKIE $_COOKIE[$this->clean_input_keys($key)] = $this->clean_input_data($val); } } else { $_COOKIE = array(); } // Create a singleton Input::$instance = $this; Kohana::log('debug', 'Global GET, POST and COOKIE data sanitized'); } } /** * Fetch an item from the $_GET array. * * @param string key to find * @param mixed default value * @param boolean XSS clean the value * @return mixed */ public function get($key = array(), $default = NULL, $xss_clean = FALSE) { return $this->search_array($_GET, $key, $default, $xss_clean); } /** * Fetch an item from the $_POST array. * * @param string key to find * @param mixed default value * @param boolean XSS clean the value * @return mixed */ public function post($key = array(), $default = NULL, $xss_clean = FALSE) { return $this->search_array($_POST, $key, $default, $xss_clean); } /** * Fetch an item from the $_COOKIE array. * * @param string key to find * @param mixed default value * @param boolean XSS clean the value * @return mixed */ public function cookie($key = array(), $default = NULL, $xss_clean = FALSE) { return $this->search_array($_COOKIE, $key, $default, $xss_clean); } /** * Fetch an item from the $_SERVER array. * * @param string key to find * @param mixed default value * @param boolean XSS clean the value * @return mixed */ public function server($key = array(), $default = NULL, $xss_clean = FALSE) { return $this->search_array($_SERVER, $key, $default, $xss_clean); } /** * Fetch an item from a global array. * * @param array array to search * @param string key to find * @param mixed default value * @param boolean XSS clean the value * @return mixed */ protected function search_array($array, $key, $default = NULL, $xss_clean = FALSE) { if ($key === array()) return $array; if ( ! isset($array[$key])) return $default; // Get the value $value = $array[$key]; if ($this->use_xss_clean === FALSE AND $xss_clean === TRUE) { // XSS clean the value $value = $this->xss_clean($value); } return $value; } /** * Fetch the IP Address. * * @return string */ public function ip_address() { if ($this->ip_address !== NULL) return $this->ip_address; // Server keys that could contain the client IP address $keys = array('HTTP_X_FORWARDED_FOR', 'HTTP_CLIENT_IP', 'REMOTE_ADDR'); foreach ($keys as $key) { if ($ip = $this->server($key)) { $this->ip_address = $ip; // An IP address has been found break; } } if ($comma = strrpos($this->ip_address, ',') !== FALSE) { $this->ip_address = substr($this->ip_address, $comma + 1); } if ( ! valid::ip($this->ip_address)) { // Use an empty IP $this->ip_address = '0.0.0.0'; } return $this->ip_address; } /** * Clean cross site scripting exploits from string. * HTMLPurifier may be used if installed, otherwise defaults to built in method. * Note - This function should only be used to deal with data upon submission. * It's not something that should be used for general runtime processing * since it requires a fair amount of processing overhead. * * @param string data to clean * @param string xss_clean method to use ('htmlpurifier' or defaults to built-in method) * @return string */ public function xss_clean($data, $tool = NULL) { if ($tool === NULL) { // Use the default tool $tool = Kohana::config('core.global_xss_filtering'); } if (is_array($data)) { foreach ($data as $key => $val) { $data[$key] = $this->xss_clean($val, $tool); } return $data; } // Do not clean empty strings if (trim($data) === '') return $data; if ($tool === TRUE) { // NOTE: This is necessary because switch is NOT type-sensative! $tool = 'default'; } switch ($tool) { case 'htmlpurifier': /** * @todo License should go here, http://htmlpurifier.org/ */ if ( ! class_exists('HTMLPurifier_Config', FALSE)) { // Load HTMLPurifier require Kohana::find_file('vendor', 'htmlpurifier/HTMLPurifier.auto', TRUE); require 'HTMLPurifier.func.php'; } // Set configuration $config = HTMLPurifier_Config::createDefault(); $config->set('HTML', 'TidyLevel', 'none'); // Only XSS cleaning now // Run HTMLPurifier $data = HTMLPurifier($data, $config); break; default: // http://svn.bitflux.ch/repos/public/popoon/trunk/classes/externalinput.php // +----------------------------------------------------------------------+ // | Copyright (c) 2001-2006 Bitflux GmbH | // +----------------------------------------------------------------------+ // | Licensed under the Apache License, Version 2.0 (the "License"); | // | you may not use this file except in compliance with the License. | // | You may obtain a copy of the License at | // | http://www.apache.org/licenses/LICENSE-2.0 | // | Unless required by applicable law or agreed to in writing, software | // | distributed under the License is distributed on an "AS IS" BASIS, | // | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or | // | implied. See the License for the specific language governing | // | permissions and limitations under the License. | // +----------------------------------------------------------------------+ // | Author: Christian Stocker | // +----------------------------------------------------------------------+ // // Kohana Modifications: // * Changed double quotes to single quotes, changed indenting and spacing // * Removed magic_quotes stuff // * Increased regex readability: // * Used delimeters that aren't found in the pattern // * Removed all unneeded escapes // * Deleted U modifiers and swapped greediness where needed // * Increased regex speed: // * Made capturing parentheses non-capturing where possible // * Removed parentheses where possible // * Split up alternation alternatives // * Made some quantifiers possessive // Fix &entity\n; $data = str_replace(array('&','<','>'), array('&amp;','&lt;','&gt;'), $data); $data = preg_replace('/(&#*\w+)[\x00-\x20]+;/u', '$1;', $data); $data = preg_replace('/(&#x*[0-9A-F]+);*/iu', '$1;', $data); $data = html_entity_decode($data, ENT_COMPAT, 'UTF-8'); // Remove any attribute starting with "on" or xmlns $data = preg_replace('#(<[^>]+?[\x00-\x20"\'])(?:on|xmlns)[^>]*+>#iu', '$1>', $data); // Remove javascript: and vbscript: protocols $data = preg_replace('#([a-z]*)[\x00-\x20]*=[\x00-\x20]*([`\'"]*)[\x00-\x20]*j[\x00-\x20]*a[\x00-\x20]*v[\x00-\x20]*a[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iu', '$1=$2nojavascript...', $data); $data = preg_replace('#([a-z]*)[\x00-\x20]*=([\'"]*)[\x00-\x20]*v[\x00-\x20]*b[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iu', '$1=$2novbscript...', $data); $data = preg_replace('#([a-z]*)[\x00-\x20]*=([\'"]*)[\x00-\x20]*-moz-binding[\x00-\x20]*:#u', '$1=$2nomozbinding...', $data); // Only works in IE: $data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?expression[\x00-\x20]*\([^>]*+>#i', '$1>', $data); $data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?behaviour[\x00-\x20]*\([^>]*+>#i', '$1>', $data); $data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:*[^>]*+>#iu', '$1>', $data); // Remove namespaced elements (we do not need them) $data = preg_replace('#]*+>#i', '', $data); do { // Remove really unwanted tags $old_data = $data; $data = preg_replace('#]*+>#i', '', $data); } while ($old_data !== $data); break; } return $data; } /** * This is a helper method. It enforces W3C specifications for allowed * key name strings, to prevent malicious exploitation. * * @param string string to clean * @return string */ public function clean_input_keys($str) { $chars = PCRE_UNICODE_PROPERTIES ? '\pL' : 'a-zA-Z'; if ( ! preg_match('#^['.$chars.'0-9:_.-]++$#uD', $str)) { exit('Disallowed key characters in global data.'); } return $str; } /** * This is a helper method. It escapes data and forces all newline * characters to "\n". * * @param unknown_type string to clean * @return string */ public function clean_input_data($str) { if (is_array($str)) { $new_array = array(); foreach ($str as $key => $val) { // Recursion! $new_array[$this->clean_input_keys($key)] = $this->clean_input_data($val); } return $new_array; } if ($this->magic_quotes_gpc === TRUE) { // Remove annoying magic quotes $str = stripslashes($str); } if ($this->use_xss_clean === TRUE) { $str = $this->xss_clean($str); } if (strpos($str, "\r") !== FALSE) { // Standardize newlines $str = str_replace(array("\r\n", "\r"), "\n", $str); } return $str; } } // End Input Class pnp4nagios-0.6.16/lib/kohana/system/libraries/Event_Subject.php0000664000000000000000000000262111662503006023146 0ustar rootrootlisteners[spl_object_hash($obj)] = $obj; return $this; } /** * Detach an observer from the object. * * @chainable * @param object Event_Observer * @return object */ public function detach(SplObserver $obj) { // Remove the listener unset($this->listeners[spl_object_hash($obj)]); return $this; } /** * Notify all attached observers of a new message. * * @chainable * @param mixed message string, object, or array * @return object */ public function notify($message) { foreach ($this->listeners as $obj) { $obj->notify($message); } return $this; } } // End Event Subjectpnp4nagios-0.6.16/lib/kohana/system/libraries/Captcha.php0000664000000000000000000001502411662503006021752 0ustar rootroot 'basic', 'width' => 150, 'height' => 50, 'complexity' => 4, 'background' => '', 'fontpath' => '', 'fonts' => array(), 'promote' => FALSE, ); /** * Singleton instance of Captcha. * * @return object */ public static function instance() { // Create the instance if it does not exist empty(Captcha::$instance) and new Captcha; return Captcha::$instance; } /** * Constructs and returns a new Captcha object. * * @param string config group name * @return object */ public static function factory($group = NULL) { return new Captcha($group); } /** * Constructs a new Captcha object. * * @throws Kohana_Exception * @param string config group name * @return void */ public function __construct($group = NULL) { // Create a singleton instance once empty(Captcha::$instance) and Captcha::$instance = $this; // No config group name given if ( ! is_string($group)) { $group = 'default'; } // Load and validate config group if ( ! is_array($config = Kohana::config('captcha.'.$group))) throw new Kohana_Exception('captcha.undefined_group', $group); // All captcha config groups inherit default config group if ($group !== 'default') { // Load and validate default config group if ( ! is_array($default = Kohana::config('captcha.default'))) throw new Kohana_Exception('captcha.undefined_group', 'default'); // Merge config group with default config group $config += $default; } // Assign config values to the object foreach ($config as $key => $value) { if (array_key_exists($key, Captcha::$config)) { Captcha::$config[$key] = $value; } } // Store the config group name as well, so the drivers can access it Captcha::$config['group'] = $group; // If using a background image, check if it exists if ( ! empty($config['background'])) { Captcha::$config['background'] = str_replace('\\', '/', realpath($config['background'])); if ( ! is_file(Captcha::$config['background'])) throw new Kohana_Exception('captcha.file_not_found', Captcha::$config['background']); } // If using any fonts, check if they exist if ( ! empty($config['fonts'])) { Captcha::$config['fontpath'] = str_replace('\\', '/', realpath($config['fontpath'])).'/'; foreach ($config['fonts'] as $font) { if ( ! is_file(Captcha::$config['fontpath'].$font)) throw new Kohana_Exception('captcha.file_not_found', Captcha::$config['fontpath'].$font); } } // Set driver name $driver = 'Captcha_'.ucfirst($config['style']).'_Driver'; // Load the driver if ( ! Kohana::auto_load($driver)) throw new Kohana_Exception('core.driver_not_found', $config['style'], get_class($this)); // Initialize the driver $this->driver = new $driver; // Validate the driver if ( ! ($this->driver instanceof Captcha_Driver)) throw new Kohana_Exception('core.driver_implements', $config['style'], get_class($this), 'Captcha_Driver'); Kohana::log('debug', 'Captcha Library initialized'); } /** * Validates a Captcha response and updates response counter. * * @param string captcha response * @return boolean */ public static function valid($response) { // Maximum one count per page load static $counted; // User has been promoted, always TRUE and don't count anymore if (Captcha::instance()->promoted()) return TRUE; // Challenge result $result = (bool) Captcha::instance()->driver->valid($response); // Increment response counter if ($counted !== TRUE) { $counted = TRUE; // Valid response if ($result === TRUE) { Captcha::instance()->valid_count(Session::instance()->get('captcha_valid_count') + 1); } // Invalid response else { Captcha::instance()->invalid_count(Session::instance()->get('captcha_invalid_count') + 1); } } return $result; } /** * Gets or sets the number of valid Captcha responses for this session. * * @param integer new counter value * @param boolean trigger invalid counter (for internal use only) * @return integer counter value */ public function valid_count($new_count = NULL, $invalid = FALSE) { // Pick the right session to use $session = ($invalid === TRUE) ? 'captcha_invalid_count' : 'captcha_valid_count'; // Update counter if ($new_count !== NULL) { $new_count = (int) $new_count; // Reset counter = delete session if ($new_count < 1) { Session::instance()->delete($session); } // Set counter to new value else { Session::instance()->set($session, (int) $new_count); } // Return new count return (int) $new_count; } // Return current count return (int) Session::instance()->get($session); } /** * Gets or sets the number of invalid Captcha responses for this session. * * @param integer new counter value * @return integer counter value */ public function invalid_count($new_count = NULL) { return $this->valid_count($new_count, TRUE); } /** * Resets the Captcha response counters and removes the count sessions. * * @return void */ public function reset_count() { $this->valid_count(0); $this->valid_count(0, TRUE); } /** * Checks whether user has been promoted after having given enough valid responses. * * @param integer valid response count threshold * @return boolean */ public function promoted($threshold = NULL) { // Promotion has been disabled if (Captcha::$config['promote'] === FALSE) return FALSE; // Use the config threshold if ($threshold === NULL) { $threshold = Captcha::$config['promote']; } // Compare the valid response count to the threshold return ($this->valid_count() >= $threshold); } /** * Returns or outputs the Captcha challenge. * * @param boolean TRUE to output html, e.g. * @return mixed html string or void */ public function render($html = TRUE) { return $this->driver->render($html); } /** * Magically outputs the Captcha challenge. * * @return mixed */ public function __toString() { return $this->render(); } } // End Captcha Classpnp4nagios-0.6.16/lib/kohana/system/libraries/ORM_Versioned.php0000664000000000000000000000550111662503006023061 0ustar rootrootlast_version = 1 + ($this->last_version === NULL ? $this->object['version'] : $this->last_version); $this->__set('version', $this->last_version); parent::save(); if ($this->saved) { $data = array(); foreach ($this->object as $key => $value) { if ($key === 'id') continue; $data[$key] = $value; } $data[$this->foreign_key()] = $this->id; $this->db->insert($this->table_name.'_versions', $data); } return $this; } /** * Loads previous version from current object * * @chainable * @return ORM */ public function previous() { if ( ! $this->loaded) return $this; $this->last_version = ($this->last_version === NULL) ? $this->object['version'] : $this->last_version; $version = $this->last_version - 1; $query = $this->db ->where($this->foreign_key(), $this->object[$this->primary_key]) ->where('version', $version) ->limit(1) ->get($this->table_name.'_versions'); if ($query->count()) { $this->load_values($query->result(FALSE)->current()); } return $this; } /** * Restores the object with data from stored version * * @param integer version number you want to restore * @return ORM */ public function restore($version) { if ( ! $this->loaded) return $this; $query = $this->db ->where($this->foreign_key(), $this->object[$this->primary_key]) ->where('version', $version) ->limit(1) ->get($this->table_name.'_versions'); if ($query->count()) { $row = $query->result(FALSE)->current(); foreach ($row as $key => $value) { if ($key === $this->primary_key OR $key === $this->foreign_key()) { // Do not overwrite the primary key continue; } if ($key === 'version') { // Always use the current version $value = $this->version; } $this->__set($key, $value); } $this->save(); } return $this; } /** * Overloads ORM::delete() to delete all versioned entries of current object * and the object itself * * @param integer id of the object you want to delete * @return ORM */ public function delete($id = NULL) { if ($id === NULL) { // Use the current object id $id = $this->object[$this->primary_key]; } if ($status = parent::delete($id)) { $this->db->where($this->foreign_key(), $id)->delete($this->table_name.'_versions'); } return $status; } }pnp4nagios-0.6.16/lib/kohana/system/libraries/ORM.php0000664000000000000000000010147211662503006021047 0ustar rootrootobject_name = strtolower(substr(get_class($this), 0, -6)); $this->object_plural = inflector::plural($this->object_name); if (!isset($this->sorting)) { // Default sorting $this->sorting = array($this->primary_key => 'asc'); } // Initialize database $this->__initialize(); // Clear the object $this->clear(); if (is_object($id)) { // Load an object $this->load_values((array) $id); } elseif (!empty($id)) { // Find an object $this->find($id); } } /** * Prepares the model database connection, determines the table name, * and loads column information. * * @return void */ public function __initialize() { if ( ! is_object($this->db)) { // Get database instance $this->db = Database::instance($this->db); } if (empty($this->table_name)) { // Table name is the same as the object name $this->table_name = $this->object_name; if ($this->table_names_plural === TRUE) { // Make the table name plural $this->table_name = inflector::plural($this->table_name); } } if (is_array($this->ignored_columns)) { // Make the ignored columns mirrored = mirrored $this->ignored_columns = array_combine($this->ignored_columns, $this->ignored_columns); } // Load column information $this->reload_columns(); } /** * Allows serialization of only the object data and state, to prevent * "stale" objects being unserialized, which also requires less memory. * * @return array */ public function __sleep() { // Store only information about the object return array('object_name', 'object', 'changed', 'loaded', 'saved', 'sorting'); } /** * Prepares the database connection and reloads the object. * * @return void */ public function __wakeup() { // Initialize database $this->__initialize(); if ($this->reload_on_wakeup === TRUE) { // Reload the object $this->reload(); } } /** * Handles pass-through to database methods. Calls to query methods * (query, get, insert, update) are not allowed. Query builder methods * are chainable. * * @param string method name * @param array method arguments * @return mixed */ public function __call($method, array $args) { if (method_exists($this->db, $method)) { if (in_array($method, array('query', 'get', 'insert', 'update', 'delete'))) throw new Kohana_Exception('orm.query_methods_not_allowed'); // Method has been applied to the database $this->db_applied[$method] = $method; // Number of arguments passed $num_args = count($args); if ($method === 'select' AND $num_args > 3) { // Call select() manually to avoid call_user_func_array $this->db->select($args); } else { // We use switch here to manually call the database methods. This is // done for speed: call_user_func_array can take over 300% longer to // make calls. Most database methods are 4 arguments or less, so this // avoids almost any calls to call_user_func_array. switch ($num_args) { case 0: if (in_array($method, array('open_paren', 'close_paren', 'enable_cache', 'disable_cache'))) { // Should return ORM, not Database $this->db->$method(); } else { // Support for things like reset_select, reset_write, list_tables return $this->db->$method(); } break; case 1: $this->db->$method($args[0]); break; case 2: $this->db->$method($args[0], $args[1]); break; case 3: $this->db->$method($args[0], $args[1], $args[2]); break; case 4: $this->db->$method($args[0], $args[1], $args[2], $args[3]); break; default: // Here comes the snail... call_user_func_array(array($this->db, $method), $args); break; } } return $this; } else { throw new Kohana_Exception('core.invalid_method', $method, get_class($this)); } } /** * Handles retrieval of all model values, relationships, and metadata. * * @param string column name * @return mixed */ public function __get($column) { if (array_key_exists($column, $this->object)) { return $this->object[$column]; } elseif (isset($this->related[$column])) { return $this->related[$column]; } elseif ($column === 'primary_key_value') { return $this->object[$this->primary_key]; } elseif ($model = $this->related_object($column)) { // This handles the has_one and belongs_to relationships if (in_array($model->object_name, $this->belongs_to) OR ! array_key_exists($this->foreign_key($column), $model->object)) { // Foreign key lies in this table (this model belongs_to target model) OR an invalid has_one relationship $where = array($model->table_name.'.'.$model->primary_key => $this->object[$this->foreign_key($column)]); } else { // Foreign key lies in the target table (this model has_one target model) $where = array($this->foreign_key($column, $model->table_name) => $this->primary_key_value); } // one<>alias:one relationship return $this->related[$column] = $model->find($where); } elseif (isset($this->has_many[$column])) { // Load the "middle" model $through = ORM::factory(inflector::singular($this->has_many[$column])); // Load the "end" model $model = ORM::factory(inflector::singular($column)); // Join ON target model's primary key set to 'through' model's foreign key // User-defined foreign keys must be defined in the 'through' model $join_table = $through->table_name; $join_col1 = $through->foreign_key($model->object_name, $join_table); $join_col2 = $model->table_name.'.'.$model->primary_key; // one<>alias:many relationship return $this->related[$column] = $model ->join($join_table, $join_col1, $join_col2) ->where($through->foreign_key($this->object_name, $join_table), $this->object[$this->primary_key]) ->find_all(); } elseif (in_array($column, $this->has_many)) { // one<>many relationship $model = ORM::factory(inflector::singular($column)); return $this->related[$column] = $model ->where($this->foreign_key($column, $model->table_name), $this->object[$this->primary_key]) ->find_all(); } elseif (in_array($column, $this->has_and_belongs_to_many)) { // Load the remote model, always singular $model = ORM::factory(inflector::singular($column)); if ($this->has($model, TRUE)) { // many<>many relationship return $this->related[$column] = $model ->in($model->table_name.'.'.$model->primary_key, $this->changed_relations[$column]) ->find_all(); } else { // empty many<>many relationship return $this->related[$column] = $model ->where($model->table_name.'.'.$model->primary_key, NULL) ->find_all(); } } elseif (isset($this->ignored_columns[$column])) { return NULL; } elseif (in_array($column, array ( 'object_name', 'object_plural', // Object 'primary_key', 'primary_val', 'table_name', 'table_columns', // Table 'loaded', 'saved', // Status 'has_one', 'belongs_to', 'has_many', 'has_and_belongs_to_many', 'load_with' // Relationships ))) { // Model meta information return $this->$column; } else { throw new Kohana_Exception('core.invalid_property', $column, get_class($this)); } } /** * Handles setting of all model values, and tracks changes between values. * * @param string column name * @param mixed column value * @return void */ public function __set($column, $value) { if (isset($this->ignored_columns[$column])) { return NULL; } elseif (isset($this->object[$column]) OR array_key_exists($column, $this->object)) { if (isset($this->table_columns[$column])) { // Data has changed $this->changed[$column] = $column; // Object is no longer saved $this->saved = FALSE; } $this->object[$column] = $this->load_type($column, $value); } elseif (in_array($column, $this->has_and_belongs_to_many) AND is_array($value)) { // Load relations $model = ORM::factory(inflector::singular($column)); if ( ! isset($this->object_relations[$column])) { // Load relations $this->has($model); } // Change the relationships $this->changed_relations[$column] = $value; if (isset($this->related[$column])) { // Force a reload of the relationships unset($this->related[$column]); } } else { throw new Kohana_Exception('core.invalid_property', $column, get_class($this)); } } /** * Checks if object data is set. * * @param string column name * @return boolean */ public function __isset($column) { return (isset($this->object[$column]) OR isset($this->related[$column])); } /** * Unsets object data. * * @param string column name * @return void */ public function __unset($column) { unset($this->object[$column], $this->changed[$column], $this->related[$column]); } /** * Displays the primary key of a model when it is converted to a string. * * @return string */ public function __toString() { return (string) $this->object[$this->primary_key]; } /** * Returns the values of this object as an array. * * @return array */ public function as_array() { $object = array(); foreach ($this->object as $key => $val) { // Reconstruct the array (calls __get) $object[$key] = $this->$key; } return $object; } /** * Binds another one-to-one object to this model. One-to-one objects * can be nested using 'object1:object2' syntax * * @param string $target_path * @return void */ public function with($target_path) { if (isset($this->with_applied[$target_path])) { // Don't join anything already joined return $this; } // Split object parts $objects = explode(':', $target_path); $target = $this; foreach ($objects as $object) { // Go down the line of objects to find the given target $parent = $target; $target = $parent->related_object($object); if ( ! $target) { // Can't find related object return $this; } } $target_name = $object; // Pop-off top object to get the parent object (user:photo:tag becomes user:photo - the parent table prefix) array_pop($objects); $parent_path = implode(':', $objects); if (empty($parent_path)) { // Use this table name itself for the parent object $parent_path = $this->table_name; } else { if( ! isset($this->with_applied[$parent_path])) { // If the parent object hasn't been joined yet, do it first (otherwise LEFT JOINs fail) $this->with($parent_path); } } // Add to with_applied to prevent duplicate joins $this->with_applied[$target_path] = TRUE; // Use the keys of the empty object to determine the columns $select = array_keys($target->object); foreach ($select as $i => $column) { // Add the prefix so that load_result can determine the relationship $select[$i] = $target_path.'.'.$column.' AS '.$target_path.':'.$column; } // Select all of the prefixed keys in the object $this->db->select($select); if (in_array($target->object_name, $parent->belongs_to) OR ! isset($target->object[$parent->foreign_key($target_name)])) { // Parent belongs_to target, use target's primary key as join column $join_col1 = $target->foreign_key(TRUE, $target_path); $join_col2 = $parent->foreign_key($target_name, $parent_path); } else { // Parent has_one target, use parent's primary key as join column $join_col2 = $parent->foreign_key(TRUE, $parent_path); $join_col1 = $parent->foreign_key($target_name, $target_path); } // This allows for models to use different table prefixes (sharing the same database) $join_table = new Database_Expression($target->db->table_prefix().$target->table_name.' AS '.$this->db->table_prefix().$target_path); // Join the related object into the result $this->db->join($join_table, $join_col1, $join_col2, 'LEFT'); return $this; } /** * Finds and loads a single database row into the object. * * @chainable * @param mixed primary key or an array of clauses * @return ORM */ public function find($id = NULL) { if ($id !== NULL) { if (is_array($id)) { // Search for all clauses $this->db->where($id); } else { // Search for a specific column $this->db->where($this->table_name.'.'.$this->unique_key($id), $id); } } return $this->load_result(); } /** * Finds multiple database rows and returns an iterator of the rows found. * * @chainable * @param integer SQL limit * @param integer SQL offset * @return ORM_Iterator */ public function find_all($limit = NULL, $offset = NULL) { if ($limit !== NULL AND ! isset($this->db_applied['limit'])) { // Set limit $this->limit($limit); } if ($offset !== NULL AND ! isset($this->db_applied['offset'])) { // Set offset $this->offset($offset); } return $this->load_result(TRUE); } /** * Creates a key/value array from all of the objects available. Uses find_all * to find the objects. * * @param string key column * @param string value column * @return array */ public function select_list($key = NULL, $val = NULL) { if ($key === NULL) { $key = $this->primary_key; } if ($val === NULL) { $val = $this->primary_val; } // Return a select list from the results return $this->select($key, $val)->find_all()->select_list($key, $val); } /** * Validates the current object. This method should generally be called * via the model, after the $_POST Validation object has been created. * * @param object Validation array * @return boolean */ public function validate(Validation $array, $save = FALSE) { $safe_array = $array->safe_array(); if ( ! $array->submitted()) { foreach ($safe_array as $key => $value) { // Get the value from this object $value = $this->$key; if (is_object($value) AND $value instanceof ORM_Iterator) { // Convert the value to an array of primary keys $value = $value->primary_key_array(); } // Pre-fill data $array[$key] = $value; } } // Validate the array if ($status = $array->validate()) { // Grab only set fields (excludes missing data, unlike safe_array) $fields = $array->as_array(); foreach ($fields as $key => $value) { if (isset($safe_array[$key])) { // Set new data, ignoring any missing fields or fields without rules $this->$key = $value; } } if ($save === TRUE OR is_string($save)) { // Save this object $this->save(); if (is_string($save)) { // Redirect to the saved page url::redirect($save); } } } // Return validation status return $status; } /** * Saves the current object. * * @chainable * @return ORM */ public function save() { if ( ! empty($this->changed)) { $data = array(); foreach ($this->changed as $column) { // Compile changed data $data[$column] = $this->object[$column]; } if ($this->loaded === TRUE) { $query = $this->db ->where($this->primary_key, $this->object[$this->primary_key]) ->update($this->table_name, $data); // Object has been saved $this->saved = TRUE; } else { $query = $this->db ->insert($this->table_name, $data); if ($query->count() > 0) { if (empty($this->object[$this->primary_key])) { // Load the insert id as the primary key $this->object[$this->primary_key] = $query->insert_id(); } // Object is now loaded and saved $this->loaded = $this->saved = TRUE; } } if ($this->saved === TRUE) { // All changes have been saved $this->changed = array(); } } if ($this->saved === TRUE AND ! empty($this->changed_relations)) { foreach ($this->changed_relations as $column => $values) { // All values that were added $added = array_diff($values, $this->object_relations[$column]); // All values that were saved $removed = array_diff($this->object_relations[$column], $values); if (empty($added) AND empty($removed)) { // No need to bother continue; } // Clear related columns unset($this->related[$column]); // Load the model $model = ORM::factory(inflector::singular($column)); if (($join_table = array_search($column, $this->has_and_belongs_to_many)) === FALSE) continue; if (is_int($join_table)) { // No "through" table, load the default JOIN table $join_table = $model->join_table($this->table_name); } // Foreign keys for the join table $object_fk = $this->foreign_key(NULL); $related_fk = $model->foreign_key(NULL); if ( ! empty($added)) { foreach ($added as $id) { // Insert the new relationship $this->db->insert($join_table, array ( $object_fk => $this->object[$this->primary_key], $related_fk => $id, )); } } if ( ! empty($removed)) { $this->db ->where($object_fk, $this->object[$this->primary_key]) ->in($related_fk, $removed) ->delete($join_table); } // Clear all relations for this column unset($this->object_relations[$column], $this->changed_relations[$column]); } } return $this; } /** * Deletes the current object from the database. This does NOT destroy * relationships that have been created with other objects. * * @chainable * @return ORM */ public function delete($id = NULL) { if ($id === NULL AND $this->loaded) { // Use the the primary key value $id = $this->object[$this->primary_key]; } // Delete this object $this->db->where($this->primary_key, $id)->delete($this->table_name); return $this->clear(); } /** * Delete all objects in the associated table. This does NOT destroy * relationships that have been created with other objects. * * @chainable * @param array ids to delete * @return ORM */ public function delete_all($ids = NULL) { if (is_array($ids)) { // Delete only given ids $this->db->in($this->primary_key, $ids); } elseif (is_null($ids)) { // Delete all records $this->db->where('1=1'); } else { // Do nothing - safeguard return $this; } // Delete all objects $this->db->delete($this->table_name); return $this->clear(); } /** * Unloads the current object and clears the status. * * @chainable * @return ORM */ public function clear() { // Create an array with all the columns set to NULL $columns = array_keys($this->table_columns); $values = array_combine($columns, array_fill(0, count($columns), NULL)); // Replace the current object with an empty one $this->load_values($values); return $this; } /** * Reloads the current object from the database. * * @chainable * @return ORM */ public function reload() { return $this->find($this->object[$this->primary_key]); } /** * Reload column definitions. * * @chainable * @param boolean force reloading * @return ORM */ public function reload_columns($force = FALSE) { if ($force === TRUE OR empty($this->table_columns)) { if (isset(ORM::$column_cache[$this->object_name])) { // Use cached column information $this->table_columns = ORM::$column_cache[$this->object_name]; } else { // Load table columns ORM::$column_cache[$this->object_name] = $this->table_columns = $this->list_fields(); } } return $this; } /** * Tests if this object has a relationship to a different model. * * @param object related ORM model * @param boolean check for any relations to given model * @return boolean */ public function has(ORM $model, $any = FALSE) { // Determine plural or singular relation name $related = ($model->table_names_plural === TRUE) ? $model->object_plural : $model->object_name; if (($join_table = array_search($related, $this->has_and_belongs_to_many)) === FALSE) return FALSE; if (is_int($join_table)) { // No "through" table, load the default JOIN table $join_table = $model->join_table($this->table_name); } if ( ! isset($this->object_relations[$related])) { // Load the object relationships $this->changed_relations[$related] = $this->object_relations[$related] = $this->load_relations($join_table, $model); } if ( ! $model->empty_primary_key()) { // Check if a specific object exists return in_array($model->primary_key_value, $this->changed_relations[$related]); } elseif ($any) { // Check if any relations to given model exist return ! empty($this->changed_relations[$related]); } else { return FALSE; } } /** * Adds a new relationship to between this model and another. * * @param object related ORM model * @return boolean */ public function add(ORM $model) { if ($this->has($model)) return TRUE; // Get the faked column name $column = $model->object_plural; // Add the new relation to the update $this->changed_relations[$column][] = $model->primary_key_value; if (isset($this->related[$column])) { // Force a reload of the relationships unset($this->related[$column]); } return TRUE; } /** * Adds a new relationship to between this model and another. * * @param object related ORM model * @return boolean */ public function remove(ORM $model) { if ( ! $this->has($model)) return FALSE; // Get the faked column name $column = $model->object_plural; if (($key = array_search($model->primary_key_value, $this->changed_relations[$column])) === FALSE) return FALSE; // Remove the relationship unset($this->changed_relations[$column][$key]); if (isset($this->related[$column])) { // Force a reload of the relationships unset($this->related[$column]); } return TRUE; } /** * Count the number of records in the table. * * @return integer */ public function count_all() { // Return the total number of records in a table return $this->db->count_records($this->table_name); } /** * Proxy method to Database list_fields. * * @param string table name or NULL to use this table * @return array */ public function list_fields($table = NULL) { if ($table === NULL) { $table = $this->table_name; } // Proxy to database return $this->db->list_fields($table); } /** * Proxy method to Database field_data. * * @param string table name * @return array */ public function field_data($table) { // Proxy to database return $this->db->field_data($table); } /** * Proxy method to Database field_data. * * @chainable * @param string SQL query to clear * @return ORM */ public function clear_cache($sql = NULL) { // Proxy to database $this->db->clear_cache($sql); ORM::$column_cache = array(); return $this; } /** * Returns the unique key for a specific value. This method is expected * to be overloaded in models if the model has other unique columns. * * @param mixed unique value * @return string */ public function unique_key($id) { return $this->primary_key; } /** * Determines the name of a foreign key for a specific table. * * @param string related table name * @param string prefix table name (used for JOINs) * @return string */ public function foreign_key($table = NULL, $prefix_table = NULL) { if ($table === TRUE) { if (is_string($prefix_table)) { // Use prefix table name and this table's PK return $prefix_table.'.'.$this->primary_key; } else { // Return the name of this table's PK return $this->table_name.'.'.$this->primary_key; } } if (is_string($prefix_table)) { // Add a period for prefix_table.column support $prefix_table .= '.'; } if (isset($this->foreign_key[$table])) { // Use the defined foreign key name, no magic here! $foreign_key = $this->foreign_key[$table]; } else { if ( ! is_string($table) OR ! array_key_exists($table.'_'.$this->primary_key, $this->object)) { // Use this table $table = $this->table_name; if (strpos($table, '.') !== FALSE) { // Hack around support for PostgreSQL schemas list ($schema, $table) = explode('.', $table, 2); } if ($this->table_names_plural === TRUE) { // Make the key name singular $table = inflector::singular($table); } } $foreign_key = $table.'_'.$this->primary_key; } return $prefix_table.$foreign_key; } /** * This uses alphabetical comparison to choose the name of the table. * * Example: The joining table of users and roles would be roles_users, * because "r" comes before "u". Joining products and categories would * result in categories_products, because "c" comes before "p". * * Example: zoo > zebra > robber > ocean > angel > aardvark * * @param string table name * @return string */ public function join_table($table) { if ($this->table_name > $table) { $table = $table.'_'.$this->table_name; } else { $table = $this->table_name.'_'.$table; } return $table; } /** * Returns an ORM model for the given object name; * * @param string object name * @return ORM */ protected function related_object($object) { if (isset($this->has_one[$object])) { $object = ORM::factory($this->has_one[$object]); } elseif (isset($this->belongs_to[$object])) { $object = ORM::factory($this->belongs_to[$object]); } elseif (in_array($object, $this->has_one) OR in_array($object, $this->belongs_to)) { $object = ORM::factory($object); } else { return FALSE; } return $object; } /** * Loads an array of values into into the current object. * * @chainable * @param array values to load * @return ORM */ public function load_values(array $values) { if (array_key_exists($this->primary_key, $values)) { // Replace the object and reset the object status $this->object = $this->changed = $this->related = array(); // Set the loaded and saved object status based on the primary key $this->loaded = $this->saved = ($values[$this->primary_key] !== NULL); } // Related objects $related = array(); foreach ($values as $column => $value) { if (strpos($column, ':') === FALSE) { if (isset($this->table_columns[$column])) { // The type of the value can be determined, convert the value $value = $this->load_type($column, $value); } $this->object[$column] = $value; } else { list ($prefix, $column) = explode(':', $column, 2); $related[$prefix][$column] = $value; } } if ( ! empty($related)) { foreach ($related as $object => $values) { // Load the related objects with the values in the result $this->related[$object] = $this->related_object($object)->load_values($values); } } return $this; } /** * Loads a value according to the types defined by the column metadata. * * @param string column name * @param mixed value to load * @return mixed */ protected function load_type($column, $value) { $type = gettype($value); if ($type == 'object' OR $type == 'array' OR ! isset($this->table_columns[$column])) return $value; // Load column data $column = $this->table_columns[$column]; if ($value === NULL AND ! empty($column['null'])) return $value; if ( ! empty($column['binary']) AND ! empty($column['exact']) AND (int) $column['length'] === 1) { // Use boolean for BINARY(1) fields $column['type'] = 'boolean'; } switch ($column['type']) { case 'int': if ($value === '' AND ! empty($column['null'])) { // Forms will only submit strings, so empty integer values must be null $value = NULL; } elseif ((float) $value > PHP_INT_MAX) { // This number cannot be represented by a PHP integer, so we convert it to a string $value = (string) $value; } else { $value = (int) $value; } break; case 'float': $value = (float) $value; break; case 'boolean': $value = (bool) $value; break; case 'string': $value = (string) $value; break; } return $value; } /** * Loads a database result, either as a new object for this model, or as * an iterator for multiple rows. * * @chainable * @param boolean return an iterator or load a single row * @return ORM for single rows * @return ORM_Iterator for multiple rows */ protected function load_result($array = FALSE) { if ($array === FALSE) { // Only fetch 1 record $this->db->limit(1); } if ( ! isset($this->db_applied['select'])) { // Select all columns by default $this->db->select($this->table_name.'.*'); } if ( ! empty($this->load_with)) { foreach ($this->load_with as $alias => $object) { // Join each object into the results if (is_string($alias)) { // Use alias $this->with($alias); } else { // Use object $this->with($object); } } } if ( ! isset($this->db_applied['orderby']) AND ! empty($this->sorting)) { $sorting = array(); foreach ($this->sorting as $column => $direction) { if (strpos($column, '.') === FALSE) { // Keeps sorting working properly when using JOINs on // tables with columns of the same name $column = $this->table_name.'.'.$column; } $sorting[$column] = $direction; } // Apply the user-defined sorting $this->db->orderby($sorting); } // Load the result $result = $this->db->get($this->table_name); if ($array === TRUE) { // Return an iterated result return new ORM_Iterator($this, $result); } if ($result->count() === 1) { // Load object values $this->load_values($result->result(FALSE)->current()); } else { // Clear the object, nothing was found $this->clear(); } return $this; } /** * Return an array of all the primary keys of the related table. * * @param string table name * @param object ORM model to find relations of * @return array */ protected function load_relations($table, ORM $model) { // Save the current query chain (otherwise the next call will clash) $this->db->push(); $query = $this->db ->select($model->foreign_key(NULL).' AS id') ->from($table) ->where($this->foreign_key(NULL, $table), $this->object[$this->primary_key]) ->get() ->result(TRUE); $this->db->pop(); $relations = array(); foreach ($query as $row) { $relations[] = $row->id; } return $relations; } /** * Returns whether or not primary key is empty * * @return bool */ protected function empty_primary_key() { return (empty($this->object[$this->primary_key]) AND $this->object[$this->primary_key] !== '0'); } } // End ORM pnp4nagios-0.6.16/lib/kohana/system/libraries/Tagcloud.php0000664000000000000000000000625511662503006022157 0ustar rootroot 'tag'); public $shuffle = FALSE; // Tag elements, biggest and smallest values protected $elements; protected $biggest; protected $smallest; /** * Construct a new tagcloud. The elements must be passed in as an array, * with each entry in the array having a "title" ,"link", and "count" key. * Font sizes will be applied via the "style" attribute as a percentage. * * @param array elements of the tagcloud * @param integer minimum font size * @param integer maximum font size * @return void */ public function __construct(array $elements, $min_size = NULL, $max_size = NULL, $shuffle = FALSE) { $this->elements = $elements; if($shuffle !== FALSE) { $this->shuffle = TRUE; } $counts = array(); foreach ($elements as $data) { $counts[] = $data['count']; } // Find the biggest and smallest values of the elements $this->biggest = max($counts); $this->smallest = min($counts); if ($min_size !== NULL) { $this->min_size = $min_size; } if ($max_size !== NULL) { $this->max_size = $max_size; } } /** * Magic __toString method. Returns all of the links as a single string. * * @return string */ public function __toString() { return implode("\n", $this->render()); } /** * Renders the elements of the tagcloud into an array of links. * * @return array */ public function render() { if ($this->shuffle === TRUE) { shuffle($this->elements); } // Minimum values must be 1 to prevent divide by zero errors $range = max($this->biggest - $this->smallest, 1); $scale = max($this->max_size - $this->min_size, 1); // Import the attributes locally to prevent overwrites $attr = $this->attributes; $output = array(); foreach ($this->elements as $data) { if (strpos($data['title'], ' ') !== FALSE) { // Replace spaces with non-breaking spaces to prevent line wrapping // in the middle of a link $data['title'] = str_replace(' ', ' ', $data['title']); } // Determine the size based on the min/max scale and the smallest/biggest range $size = ((($data['count'] - $this->smallest) * $scale) / $range) + $this->min_size; $attr['style'] = 'font-size: '.round($size, 0).'%'; $output[] = html::anchor($data['link'], $data['title'], $attr)."\n"; } return $output; } } // End Tagcloudpnp4nagios-0.6.16/lib/kohana/system/libraries/Database_Expression.php0000664000000000000000000000113711662503006024332 0ustar rootrootexpression = $expression; } public function __toString() { return (string) $this->expression; } } // End Database Expr Classpnp4nagios-0.6.16/lib/kohana/system/libraries/Calendar_Event.php0000664000000000000000000001731311662503006023264 0ustar rootrootconditions[$key]); } else { if ($key === 'callback') { // Do nothing } elseif (in_array($key, $this->booleans)) { // Make the value boolean $value = (bool) $value; } else { // Make the value an int $value = (int) $value; } $this->conditions[$key] = $value; } return $this; } /** * Add a CSS class for this event. This can be called multiple times. * * @chainable * @param string CSS class name * @return object */ public function add_class($class) { $this->classes[$class] = $class; return $this; } /** * Remove a CSS class for this event. This can be called multiple times. * * @chainable * @param string CSS class name * @return object */ public function remove_class($class) { unset($this->classes[$class]); return $this; } /** * Set HTML output for this event. * * @chainable * @param string HTML output * @return object */ public function output($str) { $this->output = $str; return $this; } /** * Add a CSS class for this event. This can be called multiple times. * * @chainable * @param string CSS class name * @return object */ public function notify($data) { // Split the date and current status list ($month, $day, $year, $week, $current) = $data; // Get a timestamp for the day $timestamp = mktime(0, 0, 0, $month, $day, $year); // Date conditionals $condition = array ( 'timestamp' => (int) $timestamp, 'day' => (int) date('j', $timestamp), 'week' => (int) $week, 'month' => (int) date('n', $timestamp), 'year' => (int) date('Y', $timestamp), 'day_of_week' => (int) date('w', $timestamp), 'current' => (bool) $current, ); // Tested conditions $tested = array(); foreach ($condition as $key => $value) { // Timestamps need to be handled carefully if($key === 'timestamp' AND isset($this->conditions['timestamp'])) { // This adds 23 hours, 59 minutes and 59 seconds to today's timestamp, as 24 hours // is classed as a new day $next_day = $timestamp + 86399; if($this->conditions['timestamp'] < $timestamp OR $this->conditions['timestamp'] > $next_day) return FALSE; } // Test basic conditions first elseif (isset($this->conditions[$key]) AND $this->conditions[$key] !== $value) return FALSE; // Condition has been tested $tested[$key] = TRUE; } if (isset($this->conditions['weekend'])) { // Weekday vs Weekend $condition['weekend'] = ($condition['day_of_week'] === 0 OR $condition['day_of_week'] === 6); } if (isset($this->conditions['first_day'])) { // First day of month $condition['first_day'] = ($condition['day'] === 1); } if (isset($this->conditions['last_day'])) { // Last day of month $condition['last_day'] = ($condition['day'] === (int) date('t', $timestamp)); } if (isset($this->conditions['occurrence'])) { // Get the occurance of the current day $condition['occurrence'] = $this->day_occurrence($timestamp); } if (isset($this->conditions['last_occurrence'])) { // Test if the next occurance of this date is next month $condition['last_occurrence'] = ((int) date('n', $timestamp + 604800) !== $condition['month']); } if (isset($this->conditions['easter'])) { if ($condition['month'] === 3 OR $condition['month'] === 4) { // This algorithm is from Practical Astronomy With Your Calculator, 2nd Edition by Peter // Duffett-Smith. It was originally from Butcher's Ecclesiastical Calendar, published in // 1876. This algorithm has also been published in the 1922 book General Astronomy by // Spencer Jones; in The Journal of the British Astronomical Association (Vol.88, page // 91, December 1977); and in Astronomical Algorithms (1991) by Jean Meeus. $a = $condition['year'] % 19; $b = (int) ($condition['year'] / 100); $c = $condition['year'] % 100; $d = (int) ($b / 4); $e = $b % 4; $f = (int) (($b + 8) / 25); $g = (int) (($b - $f + 1) / 3); $h = (19 * $a + $b - $d - $g + 15) % 30; $i = (int) ($c / 4); $k = $c % 4; $l = (32 + 2 * $e + 2 * $i - $h - $k) % 7; $m = (int) (($a + 11 * $h + 22 * $l) / 451); $p = ($h + $l - 7 * $m + 114) % 31; $month = (int) (($h + $l - 7 * $m + 114) / 31); $day = $p + 1; $condition['easter'] = ($condition['month'] === $month AND $condition['day'] === $day); } else { // Easter can only happen in March or April $condition['easter'] = FALSE; } } if (isset($this->conditions['callback'])) { // Use a callback to determine validity $condition['callback'] = call_user_func($this->conditions['callback'], $condition, $this); } $conditions = array_diff_key($this->conditions, $tested); foreach ($conditions as $key => $value) { if ($key === 'callback') { // Callbacks are tested on a TRUE/FALSE basis $value = TRUE; } // Test advanced conditions if ($condition[$key] !== $value) return FALSE; } $this->caller->add_data(array ( 'classes' => $this->classes, 'output' => $this->output, )); } /** * Find the week day occurrence for a specific timestamp. The occurrence is * relative to the current month. For example, the second Saturday of any * given month will return "2" as the occurrence. This is used in combination * with the "occurrence" condition. * * @param integer UNIX timestamp * @return integer */ protected function day_occurrence($timestamp) { // Get the current month for the timestamp $month = date('m', $timestamp); // Default occurrence is one $occurrence = 1; // Reduce the timestamp by one week for each loop. This has the added // benefit of preventing an infinite loop. while ($timestamp -= 604800) { if (date('m', $timestamp) !== $month) { // Once the timestamp has gone into the previous month, the // proper occurrence has been found. return $occurrence; } // Increment the occurrence $occurrence++; } } } // End Calendar Event pnp4nagios-0.6.16/lib/kohana/system/libraries/Profiler.php0000664000000000000000000001542411662503006022175 0ustar rootrootshow OR (is_array($this->show) AND ! in_array($args[0], $this->show))) return FALSE; // Class name $class = 'Profiler_'.ucfirst($method); $class = new $class(); $this->profiles[$args[0]] = $class; return $class; } /** * Disables the profiler for this page only. * Best used when profiler is autoloaded. * * @return void */ public function disable() { // Removes itself from the event queue Event::clear('system.display', array($this, 'render')); } /** * Render the profiler. Output is added to the bottom of the page by default. * * @param boolean return the output if TRUE * @return void|string */ public function render($return = FALSE) { $start = microtime(TRUE); $get = isset($_GET['profiler']) ? explode(',', $_GET['profiler']) : array(); $this->show = empty($get) ? Kohana::config('profiler.show') : $get; Event::run('profiler.run', $this); $styles = ''; foreach ($this->profiles as $profile) { $styles .= $profile->styles(); } // Don't display if there's no profiles if (empty($this->profiles)) return; // Load the profiler view $data = array ( 'profiles' => $this->profiles, 'styles' => $styles, 'execution_time' => microtime(TRUE) - $start ); $view = new View('kohana_profiler', $data); // Return rendered view if $return is TRUE if ($return === TRUE) return $view->render(); // Add profiler data to the output if (stripos(Kohana::$output, '') !== FALSE) { // Closing body tag was found, insert the profiler data before it Kohana::$output = str_ireplace('', $view->render().'', Kohana::$output); } else { // Append the profiler data to the output Kohana::$output .= $view->render(); } } /** * Benchmark times and memory usage from the Benchmark library. * * @return void */ public function benchmarks() { if ( ! $table = $this->table('benchmarks')) return; $table->add_column(); $table->add_column('kp-column kp-data'); $table->add_column('kp-column kp-data'); $table->add_column('kp-column kp-data'); $table->add_row(array('Benchmarks', 'Time', 'Count', 'Memory'), 'kp-title', 'background-color: #FFE0E0'); $benchmarks = Benchmark::get(TRUE); // Moves the first benchmark (total execution time) to the end of the array $benchmarks = array_slice($benchmarks, 1) + array_slice($benchmarks, 0, 1); text::alternate(); foreach ($benchmarks as $name => $benchmark) { // Clean unique id from system benchmark names $name = ucwords(str_replace(array('_', '-'), ' ', str_replace(SYSTEM_BENCHMARK.'_', '', $name))); $data = array($name, number_format($benchmark['time'], 3), $benchmark['count'], number_format($benchmark['memory'] / 1024 / 1024, 2).'MB'); $class = text::alternate('', 'kp-altrow'); if ($name == 'Total Execution') $class = 'kp-totalrow'; $table->add_row($data, $class); } } /** * Database query benchmarks. * * @return void */ public function database() { if ( ! $table = $this->table('database')) return; $table->add_column(); $table->add_column('kp-column kp-data'); $table->add_column('kp-column kp-data'); $table->add_row(array('Queries', 'Time', 'Rows'), 'kp-title', 'background-color: #E0FFE0'); $queries = Database::$benchmarks; text::alternate(); $total_time = $total_rows = 0; foreach ($queries as $query) { $data = array($query['query'], number_format($query['time'], 3), $query['rows']); $class = text::alternate('', 'kp-altrow'); $table->add_row($data, $class); $total_time += $query['time']; $total_rows += $query['rows']; } $data = array('Total: ' . count($queries), number_format($total_time, 3), $total_rows); $table->add_row($data, 'kp-totalrow'); } /** * Session data. * * @return void */ public function session() { if (empty($_SESSION)) return; if ( ! $table = $this->table('session')) return; $table->add_column('kp-name'); $table->add_column(); $table->add_row(array('Session', 'Value'), 'kp-title', 'background-color: #CCE8FB'); text::alternate(); foreach($_SESSION as $name => $value) { if (is_object($value)) { $value = get_class($value).' [object]'; } $data = array($name, $value); $class = text::alternate('', 'kp-altrow'); $table->add_row($data, $class); } } /** * POST data. * * @return void */ public function post() { if (empty($_POST)) return; if ( ! $table = $this->table('post')) return; $table->add_column('kp-name'); $table->add_column(); $table->add_row(array('POST', 'Value'), 'kp-title', 'background-color: #E0E0FF'); text::alternate(); foreach($_POST as $name => $value) { $data = array($name, $value); $class = text::alternate('', 'kp-altrow'); $table->add_row($data, $class); } } /** * Cookie data. * * @return void */ public function cookies() { if (empty($_COOKIE)) return; if ( ! $table = $this->table('cookies')) return; $table->add_column('kp-name'); $table->add_column(); $table->add_row(array('Cookies', 'Value'), 'kp-title', 'background-color: #FFF4D7'); text::alternate(); foreach($_COOKIE as $name => $value) { $data = array($name, $value); $class = text::alternate('', 'kp-altrow'); $table->add_row($data, $class); } } }pnp4nagios-0.6.16/lib/kohana/system/libraries/Router.php0000664000000000000000000001706411662503006021675 0ustar rootroot 1) { // Custom routing Router::$rsegments = Router::routed_uri(Router::$current_uri); } // The routed URI is now complete Router::$routed_uri = Router::$rsegments; // Routed segments will never be empty Router::$rsegments = explode('/', Router::$rsegments); // Prepare to find the controller $controller_path = ''; $method_segment = NULL; // Paths to search $paths = Kohana::include_paths(); foreach (Router::$rsegments as $key => $segment) { // Add the segment to the search path $controller_path .= $segment; $found = FALSE; foreach ($paths as $dir) { // Search within controllers only $dir .= 'controllers/'; if (is_dir($dir.$controller_path) OR is_file($dir.$controller_path.EXT)) { // Valid path $found = TRUE; // The controller must be a file that exists with the search path if ($c = str_replace('\\', '/', realpath($dir.$controller_path.EXT)) AND is_file($c) AND strpos($c, $dir) === 0) { // Set controller name Router::$controller = $segment; // Change controller path Router::$controller_path = $c; // Set the method segment $method_segment = $key + 1; // Stop searching break; } } } if ($found === FALSE) { // Maximum depth has been reached, stop searching break; } // Add another slash $controller_path .= '/'; } if ($method_segment !== NULL AND isset(Router::$rsegments[$method_segment])) { // Set method Router::$method = Router::$rsegments[$method_segment]; if (isset(Router::$rsegments[$method_segment + 1])) { // Set arguments Router::$arguments = array_slice(Router::$rsegments, $method_segment + 1); } } // Last chance to set routing before a 404 is triggered Event::run('system.post_routing'); if (Router::$controller === NULL) { // No controller was found, so no page can be rendered Event::run('system.404'); } } /** * Attempts to determine the current URI using CLI, GET, PATH_INFO, ORIG_PATH_INFO, or PHP_SELF. * * @return void */ public static function find_uri() { if (PHP_SAPI === 'cli') { // Command line requires a bit of hacking if (isset($_SERVER['argv'][1])) { Router::$current_uri = $_SERVER['argv'][1]; // Remove GET string from segments if (($query = strpos(Router::$current_uri, '?')) !== FALSE) { list (Router::$current_uri, $query) = explode('?', Router::$current_uri, 2); // Parse the query string into $_GET parse_str($query, $_GET); // Convert $_GET to UTF-8 $_GET = utf8::clean($_GET); } } } elseif (isset($_GET['kohana_uri'])) { // Use the URI defined in the query string Router::$current_uri = $_GET['kohana_uri']; // Remove the URI from $_GET unset($_GET['kohana_uri']); // Remove the URI from $_SERVER['QUERY_STRING'] $_SERVER['QUERY_STRING'] = preg_replace('~\bkohana_uri\b[^&]*+&?~', '', $_SERVER['QUERY_STRING']); } elseif (isset($_SERVER['PATH_INFO']) AND $_SERVER['PATH_INFO']) { Router::$current_uri = $_SERVER['PATH_INFO']; } elseif (isset($_SERVER['ORIG_PATH_INFO']) AND $_SERVER['ORIG_PATH_INFO']) { Router::$current_uri = $_SERVER['ORIG_PATH_INFO']; } elseif (isset($_SERVER['PHP_SELF']) AND $_SERVER['PHP_SELF']) { Router::$current_uri = $_SERVER['PHP_SELF']; } if (($strpos_fc = strpos(Router::$current_uri, KOHANA)) !== FALSE) { // Remove the front controller from the current uri Router::$current_uri = (string) substr(Router::$current_uri, $strpos_fc + strlen(KOHANA)); } // Remove slashes from the start and end of the URI Router::$current_uri = trim(Router::$current_uri, '/'); if (Router::$current_uri !== '') { if ($suffix = Kohana::config('core.url_suffix') AND strpos(Router::$current_uri, $suffix) !== FALSE) { // Remove the URL suffix Router::$current_uri = preg_replace('#'.preg_quote($suffix).'$#u', '', Router::$current_uri); // Set the URL suffix Router::$url_suffix = $suffix; } // Reduce multiple slashes into single slashes Router::$current_uri = preg_replace('#//+#', '/', Router::$current_uri); } } /** * Generates routed URI from given URI. * * @param string URI to convert * @return string Routed uri */ public static function routed_uri($uri) { if (Router::$routes === NULL) { // Load routes Router::$routes = Kohana::config('routes'); } // Prepare variables $routed_uri = $uri = trim($uri, '/'); if (isset(Router::$routes[$uri])) { // Literal match, no need for regex $routed_uri = Router::$routes[$uri]; } else { // Loop through the routes and see if anything matches foreach (Router::$routes as $key => $val) { if ($key === '_default') continue; // Trim slashes $key = trim($key, '/'); $val = trim($val, '/'); if (preg_match('#^'.$key.'$#u', $uri)) { if (strpos($val, '$') !== FALSE) { // Use regex routing $routed_uri = preg_replace('#^'.$key.'$#u', $val, $uri); } else { // Standard routing $routed_uri = $val; } // A valid route has been found break; } } } if (isset(Router::$routes[$routed_uri])) { // Check for double routing (without regex) $routed_uri = Router::$routes[$routed_uri]; } return trim($routed_uri, '/'); } } // End Routerpnp4nagios-0.6.16/lib/kohana/system/libraries/Profiler_Table.php0000664000000000000000000000256711662503006023310 0ustar rootrootcolumns[] = array('class' => $class, 'style' => $style); } /** * Add row to table. * * @param array data to go in table cells * @param string CSS class * @param string CSS style */ public function add_row($data, $class = '', $style = '') { $this->rows[] = array('data' => $data, 'class' => $class, 'style' => $style); } /** * Render table. * * @return string */ public function render() { $data['rows'] = $this->rows; $data['columns'] = $this->columns; return View::factory('kohana_profiler_table', $data)->render(); } }pnp4nagios-0.6.16/lib/kohana/system/libraries/Image.php0000664000000000000000000002451511662503006021436 0ustar rootroot 'gif', IMAGETYPE_JPEG => 'jpg', IMAGETYPE_PNG => 'png', IMAGETYPE_TIFF_II => 'tiff', IMAGETYPE_TIFF_MM => 'tiff', ); // Driver instance protected $driver; // Driver actions protected $actions = array(); // Reference to the current image filename protected $image = ''; /** * Creates a new Image instance and returns it. * * @param string filename of image * @param array non-default configurations * @return object */ public static function factory($image, $config = NULL) { return new Image($image, $config); } /** * Creates a new image editor instance. * * @throws Kohana_Exception * @param string filename of image * @param array non-default configurations * @return void */ public function __construct($image, $config = NULL) { static $check; // Make the check exactly once ($check === NULL) and $check = function_exists('getimagesize'); if ($check === FALSE) throw new Kohana_Exception('image.getimagesize_missing'); // Check to make sure the image exists if ( ! is_file($image)) throw new Kohana_Exception('image.file_not_found', $image); // Disable error reporting, to prevent PHP warnings $ER = error_reporting(0); // Fetch the image size and mime type $image_info = getimagesize($image); // Turn on error reporting again error_reporting($ER); // Make sure that the image is readable and valid if ( ! is_array($image_info) OR count($image_info) < 3) throw new Kohana_Exception('image.file_unreadable', $image); // Check to make sure the image type is allowed if ( ! isset(Image::$allowed_types[$image_info[2]])) throw new Kohana_Exception('image.type_not_allowed', $image); // Image has been validated, load it $this->image = array ( 'file' => str_replace('\\', '/', realpath($image)), 'width' => $image_info[0], 'height' => $image_info[1], 'type' => $image_info[2], 'ext' => Image::$allowed_types[$image_info[2]], 'mime' => $image_info['mime'] ); // Load configuration $this->config = (array) $config + Kohana::config('image'); // Set driver class name $driver = 'Image_'.ucfirst($this->config['driver']).'_Driver'; // Load the driver if ( ! Kohana::auto_load($driver)) throw new Kohana_Exception('core.driver_not_found', $this->config['driver'], get_class($this)); // Initialize the driver $this->driver = new $driver($this->config['params']); // Validate the driver if ( ! ($this->driver instanceof Image_Driver)) throw new Kohana_Exception('core.driver_implements', $this->config['driver'], get_class($this), 'Image_Driver'); } /** * Handles retrieval of pre-save image properties * * @param string property name * @return mixed */ public function __get($property) { if (isset($this->image[$property])) { return $this->image[$property]; } else { throw new Kohana_Exception('core.invalid_property', $property, get_class($this)); } } /** * Resize an image to a specific width and height. By default, Kohana will * maintain the aspect ratio using the width as the master dimension. If you * wish to use height as master dim, set $image->master_dim = Image::HEIGHT * This method is chainable. * * @throws Kohana_Exception * @param integer width * @param integer height * @param integer one of: Image::NONE, Image::AUTO, Image::WIDTH, Image::HEIGHT * @return object */ public function resize($width, $height, $master = NULL) { if ( ! $this->valid_size('width', $width)) throw new Kohana_Exception('image.invalid_width', $width); if ( ! $this->valid_size('height', $height)) throw new Kohana_Exception('image.invalid_height', $height); if (empty($width) AND empty($height)) throw new Kohana_Exception('image.invalid_dimensions', __FUNCTION__); if ($master === NULL) { // Maintain the aspect ratio by default $master = Image::AUTO; } elseif ( ! $this->valid_size('master', $master)) throw new Kohana_Exception('image.invalid_master'); $this->actions['resize'] = array ( 'width' => $width, 'height' => $height, 'master' => $master, ); return $this; } /** * Crop an image to a specific width and height. You may also set the top * and left offset. * This method is chainable. * * @throws Kohana_Exception * @param integer width * @param integer height * @param integer top offset, pixel value or one of: top, center, bottom * @param integer left offset, pixel value or one of: left, center, right * @return object */ public function crop($width, $height, $top = 'center', $left = 'center') { if ( ! $this->valid_size('width', $width)) throw new Kohana_Exception('image.invalid_width', $width); if ( ! $this->valid_size('height', $height)) throw new Kohana_Exception('image.invalid_height', $height); if ( ! $this->valid_size('top', $top)) throw new Kohana_Exception('image.invalid_top', $top); if ( ! $this->valid_size('left', $left)) throw new Kohana_Exception('image.invalid_left', $left); if (empty($width) AND empty($height)) throw new Kohana_Exception('image.invalid_dimensions', __FUNCTION__); $this->actions['crop'] = array ( 'width' => $width, 'height' => $height, 'top' => $top, 'left' => $left, ); return $this; } /** * Allows rotation of an image by 180 degrees clockwise or counter clockwise. * * @param integer degrees * @return object */ public function rotate($degrees) { $degrees = (int) $degrees; if ($degrees > 180) { do { // Keep subtracting full circles until the degrees have normalized $degrees -= 360; } while($degrees > 180); } if ($degrees < -180) { do { // Keep adding full circles until the degrees have normalized $degrees += 360; } while($degrees < -180); } $this->actions['rotate'] = $degrees; return $this; } /** * Flip an image horizontally or vertically. * * @throws Kohana_Exception * @param integer direction * @return object */ public function flip($direction) { if ($direction !== Image::HORIZONTAL AND $direction !== Image::VERTICAL) throw new Kohana_Exception('image.invalid_flip'); $this->actions['flip'] = $direction; return $this; } /** * Change the quality of an image. * * @param integer quality as a percentage * @return object */ public function quality($amount) { $this->actions['quality'] = max(1, min($amount, 100)); return $this; } /** * Sharpen an image. * * @param integer amount to sharpen, usually ~20 is ideal * @return object */ public function sharpen($amount) { $this->actions['sharpen'] = max(1, min($amount, 100)); return $this; } /** * Save the image to a new image or overwrite this image. * * @throws Kohana_Exception * @param string new image filename * @param integer permissions for new image * @param boolean keep or discard image process actions * @return object */ public function save($new_image = FALSE, $chmod = 0644, $keep_actions = FALSE) { // If no new image is defined, use the current image empty($new_image) and $new_image = $this->image['file']; // Separate the directory and filename $dir = pathinfo($new_image, PATHINFO_DIRNAME); $file = pathinfo($new_image, PATHINFO_BASENAME); // Normalize the path $dir = str_replace('\\', '/', realpath($dir)).'/'; if ( ! is_writable($dir)) throw new Kohana_Exception('image.directory_unwritable', $dir); if ($status = $this->driver->process($this->image, $this->actions, $dir, $file)) { if ($chmod !== FALSE) { // Set permissions chmod($new_image, $chmod); } } // Reset actions. Subsequent save() or render() will not apply previous actions. if ($keep_actions === FALSE) $this->actions = array(); return $status; } /** * Output the image to the browser. * * @param boolean keep or discard image process actions * @return object */ public function render($keep_actions = FALSE) { $new_image = $this->image['file']; // Separate the directory and filename $dir = pathinfo($new_image, PATHINFO_DIRNAME); $file = pathinfo($new_image, PATHINFO_BASENAME); // Normalize the path $dir = str_replace('\\', '/', realpath($dir)).'/'; // Process the image with the driver $status = $this->driver->process($this->image, $this->actions, $dir, $file, $render = TRUE); // Reset actions. Subsequent save() or render() will not apply previous actions. if ($keep_actions === FALSE) $this->actions = array(); return $status; } /** * Sanitize a given value type. * * @param string type of property * @param mixed property value * @return boolean */ protected function valid_size($type, & $value) { if (is_null($value)) return TRUE; if ( ! is_scalar($value)) return FALSE; switch ($type) { case 'width': case 'height': if (is_string($value) AND ! ctype_digit($value)) { // Only numbers and percent signs if ( ! preg_match('/^[0-9]++%$/D', $value)) return FALSE; } else { $value = (int) $value; } break; case 'top': if (is_string($value) AND ! ctype_digit($value)) { if ( ! in_array($value, array('top', 'bottom', 'center'))) return FALSE; } else { $value = (int) $value; } break; case 'left': if (is_string($value) AND ! ctype_digit($value)) { if ( ! in_array($value, array('left', 'right', 'center'))) return FALSE; } else { $value = (int) $value; } break; case 'master': if ($value !== Image::NONE AND $value !== Image::AUTO AND $value !== Image::WIDTH AND $value !== Image::HEIGHT) return FALSE; break; } return TRUE; } } // End Imagepnp4nagios-0.6.16/lib/kohana/system/libraries/View.php0000664000000000000000000001626511662503006021331 0ustar rootrootset_filename($name, $type); } if (is_array($data) AND ! empty($data)) { // Preload data using array_merge, to allow user extensions $this->kohana_local_data = array_merge($this->kohana_local_data, $data); } } /** * Magic method access to test for view property * * @param string View property to test for * @return boolean */ public function __isset($key = NULL) { return $this->is_set($key); } /** * Sets the view filename. * * @chainable * @param string view filename * @param string view file type * @return object */ public function set_filename($name, $type = NULL) { if ($type == NULL) { // Load the filename and set the content type $this->kohana_filename = Kohana::find_file('views', $name, TRUE); $this->kohana_filetype = EXT; } else { // Check if the filetype is allowed by the configuration if ( ! in_array($type, Kohana::config('view.allowed_filetypes'))) throw new Kohana_Exception('core.invalid_filetype', $type); // Load the filename and set the content type $this->kohana_filename = Kohana::find_file('views', $name, TRUE, $type); $this->kohana_filetype = Kohana::config('mimes.'.$type); if ($this->kohana_filetype == NULL) { // Use the specified type $this->kohana_filetype = $type; } } return $this; } /** * Sets a view variable. * * @param string|array name of variable or an array of variables * @param mixed value when using a named variable * @return object */ public function set($name, $value = NULL) { if (is_array($name)) { foreach ($name as $key => $value) { $this->__set($key, $value); } } else { $this->__set($name, $value); } return $this; } /** * Checks for a property existence in the view locally or globally. Unlike the built in __isset(), * this method can take an array of properties to test simultaneously. * * @param string $key property name to test for * @param array $key array of property names to test for * @return boolean property test result * @return array associative array of keys and boolean test result */ public function is_set( $key = FALSE ) { // Setup result; $result = FALSE; // If key is an array if (is_array($key)) { // Set the result to an array $result = array(); // Foreach key foreach ($key as $property) { // Set the result to an associative array $result[$property] = (array_key_exists($property, $this->kohana_local_data) OR array_key_exists($property, View::$kohana_global_data)) ? TRUE : FALSE; } } else { // Otherwise just check one property $result = (array_key_exists($key, $this->kohana_local_data) OR array_key_exists($key, View::$kohana_global_data)) ? TRUE : FALSE; } // Return the result return $result; } /** * Sets a bound variable by reference. * * @param string name of variable * @param mixed variable to assign by reference * @return object */ public function bind($name, & $var) { $this->kohana_local_data[$name] =& $var; return $this; } /** * Sets a view global variable. * * @param string|array name of variable or an array of variables * @param mixed value when using a named variable * @return void */ public static function set_global($name, $value = NULL) { if (is_array($name)) { foreach ($name as $key => $value) { View::$kohana_global_data[$key] = $value; } } else { View::$kohana_global_data[$name] = $value; } } /** * Magically sets a view variable. * * @param string variable key * @param string variable value * @return void */ public function __set($key, $value) { $this->kohana_local_data[$key] = $value; } /** * Magically gets a view variable. * * @param string variable key * @return mixed variable value if the key is found * @return void if the key is not found */ public function &__get($key) { if (isset($this->kohana_local_data[$key])) return $this->kohana_local_data[$key]; if (isset(View::$kohana_global_data[$key])) return View::$kohana_global_data[$key]; if (isset($this->$key)) return $this->$key; } /** * Magically converts view object to string. * * @return string */ public function __toString() { try { return $this->render(); } catch (Exception $e) { // Display the exception using its internal __toString method return (string) $e; } } /** * Renders a view. * * @param boolean set to TRUE to echo the output instead of returning it * @param callback special renderer to pass the output through * @return string if print is FALSE * @return void if print is TRUE */ public function render($print = FALSE, $renderer = FALSE) { if (empty($this->kohana_filename)) throw new Kohana_Exception('core.view_set_filename'); if (is_string($this->kohana_filetype)) { // Merge global and local data, local overrides global with the same name $data = array_merge(View::$kohana_global_data, $this->kohana_local_data); // Load the view in the controller for access to $this $output = Kohana::$instance->_kohana_load_view($this->kohana_filename, $data); if ($renderer !== FALSE AND is_callable($renderer, TRUE)) { // Pass the output through the user defined renderer $output = call_user_func($renderer, $output); } if ($print === TRUE) { // Display the output echo $output; return; } } else { // Set the content type and size header('Content-Type: '.$this->kohana_filetype[0]); if ($print === TRUE) { if ($file = fopen($this->kohana_filename, 'rb')) { // Display the output fpassthru($file); fclose($file); } return; } // Fetch the file contents $output = file_get_contents($this->kohana_filename); } return $output; } } // End Viewpnp4nagios-0.6.16/lib/kohana/system/libraries/Session.php0000664000000000000000000002367211662503006022042 0ustar rootrootinput = Input::instance(); // This part only needs to be run once if (Session::$instance === NULL) { // Load config Session::$config = Kohana::config('session'); // Makes a mirrored array, eg: foo=foo Session::$protect = array_combine(Session::$protect, Session::$protect); // Configure garbage collection ini_set('session.gc_probability', (int) Session::$config['gc_probability']); ini_set('session.gc_divisor', 100); ini_set('session.gc_maxlifetime', (Session::$config['expiration'] == 0) ? 86400 : Session::$config['expiration']); // Create a new session $this->create(); if (Session::$config['regenerate'] > 0 AND ($_SESSION['total_hits'] % Session::$config['regenerate']) === 0) { // Regenerate session id and update session cookie $this->regenerate(); } else { // Always update session cookie to keep the session alive cookie::set(Session::$config['name'], $_SESSION['session_id'], Session::$config['expiration']); } // Close the session just before sending the headers, so that // the session cookie(s) can be written. Event::add('system.send_headers', array($this, 'write_close')); // Make sure that sessions are closed before exiting register_shutdown_function(array($this, 'write_close')); // Singleton instance Session::$instance = $this; } Kohana::log('debug', 'Session Library initialized'); } /** * Get the session id. * * @return string */ public function id() { return $_SESSION['session_id']; } /** * Create a new session. * * @param array variables to set after creation * @return void */ public function create($vars = NULL) { // Destroy any current sessions $this->destroy(); if (Session::$config['driver'] !== 'native') { // Set driver name $driver = 'Session_'.ucfirst(Session::$config['driver']).'_Driver'; // Load the driver if ( ! Kohana::auto_load($driver)) throw new Kohana_Exception('core.driver_not_found', Session::$config['driver'], get_class($this)); // Initialize the driver Session::$driver = new $driver(); // Validate the driver if ( ! (Session::$driver instanceof Session_Driver)) throw new Kohana_Exception('core.driver_implements', Session::$config['driver'], get_class($this), 'Session_Driver'); // Register non-native driver as the session handler session_set_save_handler ( array(Session::$driver, 'open'), array(Session::$driver, 'close'), array(Session::$driver, 'read'), array(Session::$driver, 'write'), array(Session::$driver, 'destroy'), array(Session::$driver, 'gc') ); } // Validate the session name if ( ! preg_match('~^(?=.*[a-z])[a-z0-9_]++$~iD', Session::$config['name'])) throw new Kohana_Exception('session.invalid_session_name', Session::$config['name']); // Name the session, this will also be the name of the cookie session_name(Session::$config['name']); // Set the session cookie parameters session_set_cookie_params ( Session::$config['expiration'], Kohana::config('cookie.path'), Kohana::config('cookie.domain'), Kohana::config('cookie.secure') ); // Start the session! session_start(); // Put session_id in the session variable $_SESSION['session_id'] = session_id(); // Set defaults if ( ! isset($_SESSION['_kf_flash_'])) { $_SESSION['total_hits'] = 0; $_SESSION['_kf_flash_'] = array(); $_SESSION['user_agent'] = Kohana::$user_agent; $_SESSION['ip_address'] = $this->input->ip_address(); } // Set up flash variables Session::$flash =& $_SESSION['_kf_flash_']; // Increase total hits $_SESSION['total_hits'] += 1; // Validate data only on hits after one if ($_SESSION['total_hits'] > 1) { // Validate the session foreach (Session::$config['validate'] as $valid) { switch ($valid) { // Check user agent for consistency case 'user_agent': if ($_SESSION[$valid] !== Kohana::$user_agent) return $this->create(); break; // Check ip address for consistency case 'ip_address': if ($_SESSION[$valid] !== $this->input->$valid()) return $this->create(); break; // Check expiration time to prevent users from manually modifying it case 'expiration': if (time() - $_SESSION['last_activity'] > ini_get('session.gc_maxlifetime')) return $this->create(); break; } } } // Expire flash keys $this->expire_flash(); // Update last activity $_SESSION['last_activity'] = time(); // Set the new data Session::set($vars); } /** * Regenerates the global session id. * * @return void */ public function regenerate() { if (Session::$config['driver'] === 'native') { // Generate a new session id // Note: also sets a new session cookie with the updated id session_regenerate_id(TRUE); // Update session with new id $_SESSION['session_id'] = session_id(); } else { // Pass the regenerating off to the driver in case it wants to do anything special $_SESSION['session_id'] = Session::$driver->regenerate(); } // Get the session name $name = session_name(); if (isset($_COOKIE[$name])) { // Change the cookie value to match the new session id to prevent "lag" $_COOKIE[$name] = $_SESSION['session_id']; } } /** * Destroys the current session. * * @return void */ public function destroy() { if (session_id() !== '') { // Get the session name $name = session_name(); // Destroy the session session_destroy(); // Re-initialize the array $_SESSION = array(); // Delete the session cookie cookie::delete($name); } } /** * Runs the system.session_write event, then calls session_write_close. * * @return void */ public function write_close() { static $run; if ($run === NULL) { $run = TRUE; // Run the events that depend on the session being open Event::run('system.session_write'); // Expire flash keys $this->expire_flash(); // Close the session session_write_close(); } } /** * Set a session variable. * * @param string|array key, or array of values * @param mixed value (if keys is not an array) * @return void */ public function set($keys, $val = FALSE) { if (empty($keys)) return FALSE; if ( ! is_array($keys)) { $keys = array($keys => $val); } foreach ($keys as $key => $val) { if (isset(Session::$protect[$key])) continue; // Set the key $_SESSION[$key] = $val; } } /** * Set a flash variable. * * @param string|array key, or array of values * @param mixed value (if keys is not an array) * @return void */ public function set_flash($keys, $val = FALSE) { if (empty($keys)) return FALSE; if ( ! is_array($keys)) { $keys = array($keys => $val); } foreach ($keys as $key => $val) { if ($key == FALSE) continue; Session::$flash[$key] = 'new'; Session::set($key, $val); } } /** * Freshen one, multiple or all flash variables. * * @param string variable key(s) * @return void */ public function keep_flash($keys = NULL) { $keys = ($keys === NULL) ? array_keys(Session::$flash) : func_get_args(); foreach ($keys as $key) { if (isset(Session::$flash[$key])) { Session::$flash[$key] = 'new'; } } } /** * Expires old flash data and removes it from the session. * * @return void */ public function expire_flash() { static $run; // Method can only be run once if ($run === TRUE) return; if ( ! empty(Session::$flash)) { foreach (Session::$flash as $key => $state) { if ($state === 'old') { // Flash has expired unset(Session::$flash[$key], $_SESSION[$key]); } else { // Flash will expire Session::$flash[$key] = 'old'; } } } // Method has been run $run = TRUE; } /** * Get a variable. Access to sub-arrays is supported with key.subkey. * * @param string variable key * @param mixed default value returned if variable does not exist * @return mixed Variable data if key specified, otherwise array containing all session data. */ public function get($key = FALSE, $default = FALSE) { if (empty($key)) return $_SESSION; $result = isset($_SESSION[$key]) ? $_SESSION[$key] : Kohana::key_string($_SESSION, $key); return ($result === NULL) ? $default : $result; } /** * Get a variable, and delete it. * * @param string variable key * @param mixed default value returned if variable does not exist * @return mixed */ public function get_once($key, $default = FALSE) { $return = Session::get($key, $default); Session::delete($key); return $return; } /** * Delete one or more variables. * * @param string variable key(s) * @return void */ public function delete($keys) { $args = func_get_args(); foreach ($args as $key) { if (isset(Session::$protect[$key])) continue; // Unset the key unset($_SESSION[$key]); } } } // End Session Class pnp4nagios-0.6.16/lib/kohana/system/libraries/drivers/0000775000000000000000000000000011662503006021352 5ustar rootrootpnp4nagios-0.6.16/lib/kohana/system/libraries/drivers/Database/0000775000000000000000000000000011662503006023056 5ustar rootrootpnp4nagios-0.6.16/lib/kohana/system/libraries/drivers/Database/Pdosqlite.php0000664000000000000000000002476011662503006025544 0ustar rootroot */ class Database_Pdosqlite_Driver extends Database_Driver { // Database connection link protected $link; protected $db_config; /* * Constructor: __construct * Sets up the config for the class. * * Parameters: * config - database configuration * */ public function __construct($config) { $this->db_config = $config; Kohana::log('debug', 'PDO:Sqlite Database Driver Initialized'); } public function connect() { // Import the connect variables extract($this->db_config['connection']); try { $this->link = new PDO('sqlite:'.$socket.$database, $user, $pass, array(PDO::ATTR_PERSISTENT => $this->db_config['persistent'])); $this->link->setAttribute(PDO::ATTR_CASE, PDO::CASE_NATURAL); //$this->link->query('PRAGMA count_changes=1;'); if ($charset = $this->db_config['character_set']) { $this->set_charset($charset); } } catch (PDOException $e) { throw new Kohana_Database_Exception('database.error', $e->getMessage()); } // Clear password after successful connect $this->db_config['connection']['pass'] = NULL; return $this->link; } public function query($sql) { try { $sth = $this->link->prepare($sql); } catch (PDOException $e) { throw new Kohana_Database_Exception('database.error', $e->getMessage()); } return new Pdosqlite_Result($sth, $this->link, $this->db_config['object'], $sql); } public function set_charset($charset) { $this->link->query('PRAGMA encoding = '.$this->escape_str($charset)); } public function escape_table($table) { if ( ! $this->db_config['escape']) return $table; return '`'.str_replace('.', '`.`', $table).'`'; } public function escape_column($column) { if ( ! $this->db_config['escape']) return $column; if ($column == '*') return $column; // This matches any functions we support to SELECT. if ( preg_match('/(avg|count|sum|max|min)\(\s*(.*)\s*\)(\s*as\s*(.+)?)?/i', $column, $matches)) { if ( count($matches) == 3) { return $matches[1].'('.$this->escape_column($matches[2]).')'; } else if ( count($matches) == 5) { return $matches[1].'('.$this->escape_column($matches[2]).') AS '.$this->escape_column($matches[2]); } } // This matches any modifiers we support to SELECT. if ( ! preg_match('/\b(?:rand|all|distinct(?:row)?|high_priority|sql_(?:small_result|b(?:ig_result|uffer_result)|no_cache|ca(?:che|lc_found_rows)))\s/i', $column)) { if (stripos($column, ' AS ') !== FALSE) { // Force 'AS' to uppercase $column = str_ireplace(' AS ', ' AS ', $column); // Runs escape_column on both sides of an AS statement $column = array_map(array($this, __FUNCTION__), explode(' AS ', $column)); // Re-create the AS statement return implode(' AS ', $column); } return preg_replace('/[^.*]+/', '`$0`', $column); } $parts = explode(' ', $column); $column = ''; for ($i = 0, $c = count($parts); $i < $c; $i++) { // The column is always last if ($i == ($c - 1)) { $column .= preg_replace('/[^.*]+/', '`$0`', $parts[$i]); } else // otherwise, it's a modifier { $column .= $parts[$i].' '; } } return $column; } public function limit($limit, $offset = 0) { return 'LIMIT '.$offset.', '.$limit; } public function compile_select($database) { $sql = ($database['distinct'] == TRUE) ? 'SELECT DISTINCT ' : 'SELECT '; $sql .= (count($database['select']) > 0) ? implode(', ', $database['select']) : '*'; if (count($database['from']) > 0) { $sql .= "\nFROM "; $sql .= implode(', ', $database['from']); } if (count($database['join']) > 0) { foreach($database['join'] AS $join) { $sql .= "\n".$join['type'].'JOIN '.implode(', ', $join['tables']).' ON '.$join['conditions']; } } if (count($database['where']) > 0) { $sql .= "\nWHERE "; } $sql .= implode("\n", $database['where']); if (count($database['groupby']) > 0) { $sql .= "\nGROUP BY "; $sql .= implode(', ', $database['groupby']); } if (count($database['having']) > 0) { $sql .= "\nHAVING "; $sql .= implode("\n", $database['having']); } if (count($database['orderby']) > 0) { $sql .= "\nORDER BY "; $sql .= implode(', ', $database['orderby']); } if (is_numeric($database['limit'])) { $sql .= "\n"; $sql .= $this->limit($database['limit'], $database['offset']); } return $sql; } public function escape_str($str) { if ( ! $this->db_config['escape']) return $str; if (function_exists('sqlite_escape_string')) { $res = sqlite_escape_string($str); } else { $res = str_replace("'", "''", $str); } return $res; } public function list_tables() { $sql = "SELECT `name` FROM `sqlite_master` WHERE `type`='table' ORDER BY `name`;"; try { $result = $this->query($sql)->result(FALSE, PDO::FETCH_ASSOC); $tables = array(); foreach ($result as $row) { $tables[] = current($row); } } catch (PDOException $e) { throw new Kohana_Database_Exception('database.error', $e->getMessage()); } return $tables; } public function show_error() { $err = $this->link->errorInfo(); return isset($err[2]) ? $err[2] : 'Unknown error!'; } public function list_fields($table, $query = FALSE) { static $tables; if (is_object($query)) { if (empty($tables[$table])) { $tables[$table] = array(); foreach ($query->result() as $row) { $tables[$table][] = $row->name; } } return $tables[$table]; } else { $result = $this->link->query( 'PRAGMA table_info('.$this->escape_table($table).')' ); foreach ($result as $row) { $tables[$table][$row['name']] = $this->sql_type($row['type']); } return $tables[$table]; } } public function field_data($table) { Kohana::log('error', 'This method is under developing'); } /** * Version number query string * * @access public * @return string */ function version() { return $this->link->getAttribute(constant("PDO::ATTR_SERVER_VERSION")); } } // End Database_PdoSqlite_Driver Class /* * PDO-sqlite Result */ class Pdosqlite_Result extends Database_Result { // Data fetching types protected $fetch_type = PDO::FETCH_OBJ; protected $return_type = PDO::FETCH_ASSOC; /** * Sets up the result variables. * * @param resource query result * @param resource database link * @param boolean return objects or arrays * @param string SQL query that was run */ public function __construct($result, $link, $object = TRUE, $sql) { if (is_object($result) OR $result = $link->prepare($sql)) { // run the query. Return true if success, false otherwise if( ! $result->execute()) { // Throw Kohana Exception with error message. See PDOStatement errorInfo() method $arr_infos = $result->errorInfo(); throw new Kohana_Database_Exception('database.error', $arr_infos[2]); } if (preg_match('/^SELECT|PRAGMA|EXPLAIN/i', $sql)) { $this->result = $result; $this->current_row = 0; $this->total_rows = $this->sqlite_row_count(); $this->fetch_type = ($object === TRUE) ? PDO::FETCH_OBJ : PDO::FETCH_ASSOC; } elseif (preg_match('/^DELETE|INSERT|UPDATE/i', $sql)) { $this->insert_id = $link->lastInsertId(); $this->total_rows = $result->rowCount(); } } else { // SQL error throw new Kohana_Database_Exception('database.error', $link->errorInfo().' - '.$sql); } // Set result type $this->result($object); // Store the SQL $this->sql = $sql; } private function sqlite_row_count() { $count = 0; while ($this->result->fetch()) { $count++; } // The query must be re-fetched now. $this->result->execute(); return $count; } /* * Destructor: __destruct * Magic __destruct function, frees the result. */ public function __destruct() { if (is_object($this->result)) { $this->result->closeCursor(); $this->result = NULL; } } public function result($object = TRUE, $type = PDO::FETCH_BOTH) { $this->fetch_type = (bool) $object ? PDO::FETCH_OBJ : PDO::FETCH_BOTH; if ($this->fetch_type == PDO::FETCH_OBJ) { $this->return_type = (is_string($type) AND Kohana::auto_load($type)) ? $type : 'stdClass'; } else { $this->return_type = $type; } return $this; } public function as_array($object = NULL, $type = PDO::FETCH_ASSOC) { return $this->result_array($object, $type); } public function result_array($object = NULL, $type = PDO::FETCH_ASSOC) { $rows = array(); if (is_string($object)) { $fetch = $object; } elseif (is_bool($object)) { if ($object === TRUE) { $fetch = PDO::FETCH_OBJ; // NOTE - The class set by $type must be defined before fetching the result, // autoloading is disabled to save a lot of stupid overhead. $type = (is_string($type) AND Kohana::auto_load($type)) ? $type : 'stdClass'; } else { $fetch = PDO::FETCH_OBJ; } } else { // Use the default config values $fetch = $this->fetch_type; if ($fetch == PDO::FETCH_OBJ) { $type = (is_string($type) AND Kohana::auto_load($type)) ? $type : 'stdClass'; } } try { while ($row = $this->result->fetch($fetch)) { $rows[] = $row; } } catch(PDOException $e) { throw new Kohana_Database_Exception('database.error', $e->getMessage()); return FALSE; } return $rows; } public function list_fields() { $field_names = array(); for ($i = 0, $max = $this->result->columnCount(); $i < $max; $i++) { $info = $this->result->getColumnMeta($i); $field_names[] = $info['name']; } return $field_names; } public function seek($offset) { // To request a scrollable cursor for your PDOStatement object, you must // set the PDO::ATTR_CURSOR attribute to PDO::CURSOR_SCROLL when you // prepare the statement. Kohana::log('error', get_class($this).' does not support scrollable cursors, '.__FUNCTION__.' call ignored'); return FALSE; } public function offsetGet($offset) { try { return $this->result->fetch($this->fetch_type, PDO::FETCH_ORI_ABS, $offset); } catch(PDOException $e) { throw new Kohana_Database_Exception('database.error', $e->getMessage()); } } public function rewind() { // Same problem that seek() has, see above. return $this->seek(0); } } // End PdoSqlite_Result Classpnp4nagios-0.6.16/lib/kohana/system/libraries/drivers/Database/Pgsql.php0000664000000000000000000003020311662503006024653 0ustar rootrootdb_config = $config; Kohana::log('debug', 'PgSQL Database Driver Initialized'); } public function connect() { // Check if link already exists if (is_resource($this->link)) return $this->link; // Import the connect variables extract($this->db_config['connection']); // Persistent connections enabled? $connect = ($this->db_config['persistent'] == TRUE) ? 'pg_pconnect' : 'pg_connect'; // Build the connection info $port = isset($port) ? 'port=\''.$port.'\'' : ''; $host = isset($host) ? 'host=\''.$host.'\' '.$port : ''; // if no host, connect with the socket $connection_string = $host.' dbname=\''.$database.'\' user=\''.$user.'\' password=\''.$pass.'\''; // Make the connection and select the database if ($this->link = $connect($connection_string)) { if ($charset = $this->db_config['character_set']) { echo $this->set_charset($charset); } // Clear password after successful connect $this->db_config['connection']['pass'] = NULL; return $this->link; } return FALSE; } public function query($sql) { // Only cache if it's turned on, and only cache if it's not a write statement if ($this->db_config['cache'] AND ! preg_match('#\b(?:INSERT|UPDATE|SET)\b#i', $sql)) { $hash = $this->query_hash($sql); if ( ! isset($this->query_cache[$hash])) { // Set the cached object $this->query_cache[$hash] = new Pgsql_Result(pg_query($this->link, $sql), $this->link, $this->db_config['object'], $sql); } else { // Rewind cached result $this->query_cache[$hash]->rewind(); } return $this->query_cache[$hash]; } // Suppress warning triggered when a database error occurs (e.g., a constraint violation) return new Pgsql_Result(@pg_query($this->link, $sql), $this->link, $this->db_config['object'], $sql); } public function set_charset($charset) { $this->query('SET client_encoding TO '.pg_escape_string($this->link, $charset)); } public function escape_table($table) { if (!$this->db_config['escape']) return $table; return '"'.str_replace('.', '"."', $table).'"'; } public function escape_column($column) { if (!$this->db_config['escape']) return $column; if ($column == '*') return $column; // This matches any functions we support to SELECT. if ( preg_match('/(avg|count|sum|max|min)\(\s*(.*)\s*\)(\s*as\s*(.+)?)?/i', $column, $matches)) { if ( count($matches) == 3) { return $matches[1].'('.$this->escape_column($matches[2]).')'; } else if ( count($matches) == 5) { return $matches[1].'('.$this->escape_column($matches[2]).') AS '.$this->escape_column($matches[2]); } } // This matches any modifiers we support to SELECT. if ( ! preg_match('/\b(?:all|distinct)\s/i', $column)) { if (stripos($column, ' AS ') !== FALSE) { // Force 'AS' to uppercase $column = str_ireplace(' AS ', ' AS ', $column); // Runs escape_column on both sides of an AS statement $column = array_map(array($this, __FUNCTION__), explode(' AS ', $column)); // Re-create the AS statement return implode(' AS ', $column); } return preg_replace('/[^.*]+/', '"$0"', $column); } $parts = explode(' ', $column); $column = ''; for ($i = 0, $c = count($parts); $i < $c; $i++) { // The column is always last if ($i == ($c - 1)) { $column .= preg_replace('/[^.*]+/', '"$0"', $parts[$i]); } else // otherwise, it's a modifier { $column .= $parts[$i].' '; } } return $column; } public function regex($field, $match, $type, $num_regexs) { $prefix = ($num_regexs == 0) ? '' : $type; return $prefix.' '.$this->escape_column($field).' ~* \''.$this->escape_str($match).'\''; } public function notregex($field, $match, $type, $num_regexs) { $prefix = $num_regexs == 0 ? '' : $type; return $prefix.' '.$this->escape_column($field).' !~* \''.$this->escape_str($match) . '\''; } public function limit($limit, $offset = 0) { return 'LIMIT '.$limit.' OFFSET '.$offset; } public function compile_select($database) { $sql = ($database['distinct'] == TRUE) ? 'SELECT DISTINCT ' : 'SELECT '; $sql .= (count($database['select']) > 0) ? implode(', ', $database['select']) : '*'; if (count($database['from']) > 0) { $sql .= "\nFROM "; $sql .= implode(', ', $database['from']); } if (count($database['join']) > 0) { foreach($database['join'] AS $join) { $sql .= "\n".$join['type'].'JOIN '.implode(', ', $join['tables']).' ON '.$join['conditions']; } } if (count($database['where']) > 0) { $sql .= "\nWHERE "; } $sql .= implode("\n", $database['where']); if (count($database['groupby']) > 0) { $sql .= "\nGROUP BY "; $sql .= implode(', ', $database['groupby']); } if (count($database['having']) > 0) { $sql .= "\nHAVING "; $sql .= implode("\n", $database['having']); } if (count($database['orderby']) > 0) { $sql .= "\nORDER BY "; $sql .= implode(', ', $database['orderby']); } if (is_numeric($database['limit'])) { $sql .= "\n"; $sql .= $this->limit($database['limit'], $database['offset']); } return $sql; } public function escape_str($str) { if (!$this->db_config['escape']) return $str; is_resource($this->link) or $this->connect(); return pg_escape_string($this->link, $str); } public function list_tables() { $sql = 'SELECT table_schema || \'.\' || table_name FROM information_schema.tables WHERE table_schema NOT IN (\'pg_catalog\', \'information_schema\')'; $result = $this->query($sql)->result(FALSE, PGSQL_ASSOC); $retval = array(); foreach ($result as $row) { $retval[] = current($row); } return $retval; } public function show_error() { return pg_last_error($this->link); } public function list_fields($table) { $result = NULL; foreach ($this->field_data($table) as $row) { // Make an associative array $result[$row->column_name] = $this->sql_type($row->data_type); if (!strncmp($row->column_default, 'nextval(', 8)) { $result[$row->column_name]['sequenced'] = TRUE; } if ($row->is_nullable === 'YES') { $result[$row->column_name]['null'] = TRUE; } } if (!isset($result)) throw new Kohana_Database_Exception('database.table_not_found', $table); return $result; } public function field_data($table) { // http://www.postgresql.org/docs/8.3/static/infoschema-columns.html $result = $this->query(' SELECT column_name, column_default, is_nullable, data_type, udt_name, character_maximum_length, numeric_precision, numeric_precision_radix, numeric_scale FROM information_schema.columns WHERE table_name = \''. $this->escape_str($table) .'\' ORDER BY ordinal_position '); return $result->result_array(TRUE); } } // End Database_Pgsql_Driver Class /** * PostgreSQL Result */ class Pgsql_Result extends Database_Result { // Data fetching types protected $fetch_type = 'pgsql_fetch_object'; protected $return_type = PGSQL_ASSOC; /** * Sets up the result variables. * * @param resource query result * @param resource database link * @param boolean return objects or arrays * @param string SQL query that was run */ public function __construct($result, $link, $object = TRUE, $sql) { $this->link = $link; $this->result = $result; // If the query is a resource, it was a SELECT, SHOW, DESCRIBE, EXPLAIN query if (is_resource($result)) { // Its an DELETE, INSERT, REPLACE, or UPDATE query if (preg_match('/^(?:delete|insert|replace|update)\b/iD', trim($sql), $matches)) { $this->insert_id = (strtolower($matches[0]) == 'insert') ? $this->insert_id() : FALSE; $this->total_rows = pg_affected_rows($this->result); } else { $this->current_row = 0; $this->total_rows = pg_num_rows($this->result); $this->fetch_type = ($object === TRUE) ? 'pg_fetch_object' : 'pg_fetch_array'; } } else { throw new Kohana_Database_Exception('database.error', pg_last_error().' - '.$sql); } // Set result type $this->result($object); // Store the SQL $this->sql = $sql; } /** * Magic __destruct function, frees the result. */ public function __destruct() { if (is_resource($this->result)) { pg_free_result($this->result); } } public function result($object = TRUE, $type = PGSQL_ASSOC) { $this->fetch_type = ((bool) $object) ? 'pg_fetch_object' : 'pg_fetch_array'; // This check has to be outside the previous statement, because we do not // know the state of fetch_type when $object = NULL // NOTE - The class set by $type must be defined before fetching the result, // autoloading is disabled to save a lot of stupid overhead. if ($this->fetch_type == 'pg_fetch_object') { $this->return_type = (is_string($type) AND Kohana::auto_load($type)) ? $type : 'stdClass'; } else { $this->return_type = $type; } return $this; } public function as_array($object = NULL, $type = PGSQL_ASSOC) { return $this->result_array($object, $type); } public function result_array($object = NULL, $type = PGSQL_ASSOC) { $rows = array(); if (is_string($object)) { $fetch = $object; } elseif (is_bool($object)) { if ($object === TRUE) { $fetch = 'pg_fetch_object'; // NOTE - The class set by $type must be defined before fetching the result, // autoloading is disabled to save a lot of stupid overhead. $type = (is_string($type) AND Kohana::auto_load($type)) ? $type : 'stdClass'; } else { $fetch = 'pg_fetch_array'; } } else { // Use the default config values $fetch = $this->fetch_type; if ($fetch == 'pg_fetch_object') { $type = (is_string($type) AND Kohana::auto_load($type)) ? $type : 'stdClass'; } } if ($this->total_rows) { pg_result_seek($this->result, 0); while ($row = $fetch($this->result, NULL, $type)) { $rows[] = $row; } } return $rows; } public function insert_id() { if ($this->insert_id === NULL) { $query = 'SELECT LASTVAL() AS insert_id'; // Disable error reporting for this, just to silence errors on // tables that have no serial column. $ER = error_reporting(0); $result = pg_query($this->link, $query); $insert_id = pg_fetch_array($result, NULL, PGSQL_ASSOC); $this->insert_id = $insert_id['insert_id']; // Reset error reporting error_reporting($ER); } return $this->insert_id; } public function seek($offset) { if ($this->offsetExists($offset) AND pg_result_seek($this->result, $offset)) { // Set the current row to the offset $this->current_row = $offset; return TRUE; } return FALSE; } public function list_fields() { $field_names = array(); $fields = pg_num_fields($this->result); for ($i = 0; $i < $fields; ++$i) { $field_names[] = pg_field_name($this->result, $i); } return $field_names; } /** * ArrayAccess: offsetGet */ public function offsetGet($offset) { if ( ! $this->seek($offset)) return FALSE; // Return the row by calling the defined fetching callback $fetch = $this->fetch_type; return $fetch($this->result, NULL, $this->return_type); } } // End Pgsql_Result Class /** * PostgreSQL Prepared Statement (experimental) */ class Kohana_Pgsql_Statement { protected $link = NULL; protected $stmt; public function __construct($sql, $link) { $this->link = $link; $this->stmt = $this->link->prepare($sql); return $this; } public function __destruct() { $this->stmt->close(); } // Sets the bind parameters public function bind_params() { $argv = func_get_args(); return $this; } // sets the statement values to the bound parameters public function set_vals() { return $this; } // Runs the statement public function execute() { return $this; } } pnp4nagios-0.6.16/lib/kohana/system/libraries/drivers/Database/Mssql.php0000664000000000000000000002554011662503006024674 0ustar rootrootdb_config = $config; Kohana::log('debug', 'MSSQL Database Driver Initialized'); } /** * Closes the database connection. */ public function __destruct() { is_resource($this->link) and mssql_close($this->link); } /** * Make the connection * * @return return connection */ public function connect() { // Check if link already exists if (is_resource($this->link)) return $this->link; // Import the connect variables extract($this->db_config['connection']); // Persistent connections enabled? $connect = ($this->db_config['persistent'] == TRUE) ? 'mssql_pconnect' : 'mssql_connect'; // Build the connection info $host = isset($host) ? $host : $socket; // Windows uses a comma instead of a colon $port = (isset($port) AND is_string($port)) ? (KOHANA_IS_WIN ? ',' : ':').$port : ''; // Make the connection and select the database if (($this->link = $connect($host.$port, $user, $pass, TRUE)) AND mssql_select_db($database, $this->link)) { /* This is being removed so I can use it, will need to come up with a more elegant workaround in the future... * if ($charset = $this->db_config['character_set']) { $this->set_charset($charset); } */ // Clear password after successful connect $this->db_config['connection']['pass'] = NULL; return $this->link; } return FALSE; } public function query($sql) { // Only cache if it's turned on, and only cache if it's not a write statement if ($this->db_config['cache'] AND ! preg_match('#\b(?:INSERT|UPDATE|REPLACE|SET)\b#i', $sql)) { $hash = $this->query_hash($sql); if ( ! isset($this->query_cache[$hash])) { // Set the cached object $this->query_cache[$hash] = new Mssql_Result(mssql_query($sql, $this->link), $this->link, $this->db_config['object'], $sql); } else { // Rewind cached result $this->query_cache[$hash]->rewind(); } // Return the cached query return $this->query_cache[$hash]; } return new Mssql_Result(mssql_query($sql, $this->link), $this->link, $this->db_config['object'], $sql); } public function escape_table($table) { if (stripos($table, ' AS ') !== FALSE) { // Force 'AS' to uppercase $table = str_ireplace(' AS ', ' AS ', $table); // Runs escape_table on both sides of an AS statement $table = array_map(array($this, __FUNCTION__), explode(' AS ', $table)); // Re-create the AS statement return implode(' AS ', $table); } return '['.str_replace('.', '[.]', $table).']'; } public function escape_column($column) { if (!$this->db_config['escape']) return $column; if ($column == '*') return $column; // This matches any functions we support to SELECT. if ( preg_match('/(avg|count|sum|max|min)\(\s*(.*)\s*\)(\s*as\s*(.+)?)?/i', $column, $matches)) { if ( count($matches) == 3) { return $matches[1].'('.$this->escape_column($matches[2]).')'; } else if ( count($matches) == 5) { return $matches[1].'('.$this->escape_column($matches[2]).') AS '.$this->escape_column($matches[2]); } } // This matches any modifiers we support to SELECT. if ( ! preg_match('/\b(?:rand|all|distinct(?:row)?|high_priority|sql_(?:small_result|b(?:ig_result|uffer_result)|no_cache|ca(?:che|lc_found_rows)))\s/i', $column)) { if (stripos($column, ' AS ') !== FALSE) { // Force 'AS' to uppercase $column = str_ireplace(' AS ', ' AS ', $column); // Runs escape_column on both sides of an AS statement $column = array_map(array($this, __FUNCTION__), explode(' AS ', $column)); // Re-create the AS statement return implode(' AS ', $column); } return preg_replace('/[^.*]+/', '[$0]', $column); } $parts = explode(' ', $column); $column = ''; for ($i = 0, $c = count($parts); $i < $c; $i++) { // The column is always last if ($i == ($c - 1)) { $column .= preg_replace('/[^.*]+/', '[$0]', $parts[$i]); } else // otherwise, it's a modifier { $column .= $parts[$i].' '; } } return $column; } /** * Limit in SQL Server 2000 only uses the keyword * 'TOP'; 2007 may have an offset keyword, but * I am unsure - for pagination style limit,offset * functionality, a fancy query needs to be built. * * @param unknown_type $limit * @return unknown */ public function limit($limit, $offset=null) { return 'TOP '.$limit; } public function compile_select($database) { $sql = ($database['distinct'] == TRUE) ? 'SELECT DISTINCT ' : 'SELECT '; $sql .= (count($database['select']) > 0) ? implode(', ', $database['select']) : '*'; if (count($database['from']) > 0) { // Escape the tables $froms = array(); foreach ($database['from'] as $from) $froms[] = $this->escape_column($from); $sql .= "\nFROM "; $sql .= implode(', ', $froms); } if (count($database['join']) > 0) { foreach($database['join'] AS $join) { $sql .= "\n".$join['type'].'JOIN '.implode(', ', $join['tables']).' ON '.$join['conditions']; } } if (count($database['where']) > 0) { $sql .= "\nWHERE "; } $sql .= implode("\n", $database['where']); if (count($database['groupby']) > 0) { $sql .= "\nGROUP BY "; $sql .= implode(', ', $database['groupby']); } if (count($database['having']) > 0) { $sql .= "\nHAVING "; $sql .= implode("\n", $database['having']); } if (count($database['orderby']) > 0) { $sql .= "\nORDER BY "; $sql .= implode(', ', $database['orderby']); } if (is_numeric($database['limit'])) { $sql .= "\n"; $sql .= $this->limit($database['limit']); } return $sql; } public function escape_str($str) { if (!$this->db_config['escape']) return $str; is_resource($this->link) or $this->connect(); //mssql_real_escape_string($str, $this->link); <-- this function doesn't exist $characters = array('/\x00/', '/\x1a/', '/\n/', '/\r/', '/\\\/', '/\'/'); $replace = array('\\\x00', '\\x1a', '\\n', '\\r', '\\\\', "''"); return preg_replace($characters, $replace, $str); } public function list_tables() { $sql = 'SHOW TABLES FROM ['.$this->db_config['connection']['database'].']'; $result = $this->query($sql)->result(FALSE, MSSQL_ASSOC); $retval = array(); foreach ($result as $row) { $retval[] = current($row); } return $retval; } public function show_error() { return mssql_get_last_message($this->link); } public function list_fields($table) { $result = array(); foreach ($this->field_data($table) as $row) { // Make an associative array $result[$row->Field] = $this->sql_type($row->Type); } return $result; } public function field_data($table) { $query = $this->query("SELECT COLUMN_NAME AS Field, DATA_TYPE as Type FROM INFORMATION_SCHEMA.Columns WHERE TABLE_NAME = '".$this->escape_table($table)."'", $this->link); return $query->result_array(TRUE); } } /** * MSSQL Result */ class Mssql_Result extends Database_Result { // Fetch function and return type protected $fetch_type = 'mssql_fetch_object'; protected $return_type = MSSQL_ASSOC; /** * Sets up the result variables. * * @param resource query result * @param resource database link * @param boolean return objects or arrays * @param string SQL query that was run */ public function __construct($result, $link, $object = TRUE, $sql) { $this->result = $result; // If the query is a resource, it was a SELECT, SHOW, DESCRIBE, EXPLAIN query if (is_resource($result)) { $this->current_row = 0; $this->total_rows = mssql_num_rows($this->result); $this->fetch_type = ($object === TRUE) ? 'mssql_fetch_object' : 'mssql_fetch_array'; } elseif (is_bool($result)) { if ($result == FALSE) { // SQL error throw new Kohana_Database_Exception('database.error', mssql_get_last_message($link).' - '.$sql); } else { // Its an DELETE, INSERT, REPLACE, or UPDATE querys $last_id = mssql_query('SELECT @@IDENTITY AS last_id', $link); $result = mssql_fetch_assoc($last_id); $this->insert_id = $result['last_id']; $this->total_rows = mssql_rows_affected($link); } } // Set result type $this->result($object); // Store the SQL $this->sql = $sql; } /** * Destruct, the cleanup crew! */ public function __destruct() { if (is_resource($this->result)) { mssql_free_result($this->result); } } public function result($object = TRUE, $type = MSSQL_ASSOC) { $this->fetch_type = ((bool) $object) ? 'mssql_fetch_object' : 'mssql_fetch_array'; // This check has to be outside the previous statement, because we do not // know the state of fetch_type when $object = NULL // NOTE - The class set by $type must be defined before fetching the result, // autoloading is disabled to save a lot of stupid overhead. if ($this->fetch_type == 'mssql_fetch_object') { $this->return_type = (is_string($type) AND Kohana::auto_load($type)) ? $type : 'stdClass'; } else { $this->return_type = $type; } return $this; } public function as_array($object = NULL, $type = MSSQL_ASSOC) { return $this->result_array($object, $type); } public function result_array($object = NULL, $type = MSSQL_ASSOC) { $rows = array(); if (is_string($object)) { $fetch = $object; } elseif (is_bool($object)) { if ($object === TRUE) { $fetch = 'mssql_fetch_object'; // NOTE - The class set by $type must be defined before fetching the result, // autoloading is disabled to save a lot of stupid overhead. $type = (is_string($type) AND Kohana::auto_load($type)) ? $type : 'stdClass'; } else { $fetch = 'mssql_fetch_array'; } } else { // Use the default config values $fetch = $this->fetch_type; if ($fetch == 'mssql_fetch_object') { $type = (is_string($type) AND Kohana::auto_load($type)) ? $type : 'stdClass'; } } if (mssql_num_rows($this->result)) { // Reset the pointer location to make sure things work properly mssql_data_seek($this->result, 0); while ($row = $fetch($this->result, $type)) { $rows[] = $row; } } return isset($rows) ? $rows : array(); } public function list_fields() { $field_names = array(); while ($field = mssql_fetch_field($this->result)) { $field_names[] = $field->name; } return $field_names; } public function seek($offset) { if ( ! $this->offsetExists($offset)) return FALSE; return mssql_data_seek($this->result, $offset); } } // End mssql_Result Class pnp4nagios-0.6.16/lib/kohana/system/libraries/drivers/Database/Mysql.php0000664000000000000000000002635111662503006024703 0ustar rootrootdb_config = $config; Kohana::log('debug', 'MySQL Database Driver Initialized'); } /** * Closes the database connection. */ public function __destruct() { is_resource($this->link) and mysql_close($this->link); } public function connect() { // Check if link already exists if (is_resource($this->link)) return $this->link; // Import the connect variables extract($this->db_config['connection']); // Persistent connections enabled? $connect = ($this->db_config['persistent'] == TRUE) ? 'mysql_pconnect' : 'mysql_connect'; // Build the connection info $host = isset($host) ? $host : $socket; $port = isset($port) ? ':'.$port : ''; // Make the connection and select the database if (($this->link = $connect($host.$port, $user, $pass, TRUE)) AND mysql_select_db($database, $this->link)) { if ($charset = $this->db_config['character_set']) { $this->set_charset($charset); } // Clear password after successful connect $this->db_config['connection']['pass'] = NULL; return $this->link; } return FALSE; } public function query($sql) { // Only cache if it's turned on, and only cache if it's not a write statement if ($this->db_config['cache'] AND ! preg_match('#\b(?:INSERT|UPDATE|REPLACE|SET|DELETE|TRUNCATE)\b#i', $sql)) { $hash = $this->query_hash($sql); if ( ! isset($this->query_cache[$hash])) { // Set the cached object $this->query_cache[$hash] = new Mysql_Result(mysql_query($sql, $this->link), $this->link, $this->db_config['object'], $sql); } else { // Rewind cached result $this->query_cache[$hash]->rewind(); } // Return the cached query return $this->query_cache[$hash]; } return new Mysql_Result(mysql_query($sql, $this->link), $this->link, $this->db_config['object'], $sql); } public function set_charset($charset) { $this->query('SET NAMES '.$this->escape_str($charset)); } public function escape_table($table) { if (!$this->db_config['escape']) return $table; if (stripos($table, ' AS ') !== FALSE) { // Force 'AS' to uppercase $table = str_ireplace(' AS ', ' AS ', $table); // Runs escape_table on both sides of an AS statement $table = array_map(array($this, __FUNCTION__), explode(' AS ', $table)); // Re-create the AS statement return implode(' AS ', $table); } return '`'.str_replace('.', '`.`', $table).'`'; } public function escape_column($column) { if (!$this->db_config['escape']) return $column; if ($column == '*') return $column; // This matches any functions we support to SELECT. if ( preg_match('/(avg|count|sum|max|min)\(\s*(.*)\s*\)(\s*as\s*(.+)?)?/i', $column, $matches)) { if ( count($matches) == 3) { return $matches[1].'('.$this->escape_column($matches[2]).')'; } else if ( count($matches) == 5) { return $matches[1].'('.$this->escape_column($matches[2]).') AS '.$this->escape_column($matches[2]); } } // This matches any modifiers we support to SELECT. if ( ! preg_match('/\b(?:rand|all|distinct(?:row)?|high_priority|sql_(?:small_result|b(?:ig_result|uffer_result)|no_cache|ca(?:che|lc_found_rows)))\s/i', $column)) { if (stripos($column, ' AS ') !== FALSE) { // Force 'AS' to uppercase $column = str_ireplace(' AS ', ' AS ', $column); // Runs escape_column on both sides of an AS statement $column = array_map(array($this, __FUNCTION__), explode(' AS ', $column)); // Re-create the AS statement return implode(' AS ', $column); } return preg_replace('/[^.*]+/', '`$0`', $column); } $parts = explode(' ', $column); $column = ''; for ($i = 0, $c = count($parts); $i < $c; $i++) { // The column is always last if ($i == ($c - 1)) { $column .= preg_replace('/[^.*]+/', '`$0`', $parts[$i]); } else // otherwise, it's a modifier { $column .= $parts[$i].' '; } } return $column; } public function regex($field, $match, $type, $num_regexs) { $prefix = ($num_regexs == 0) ? '' : $type; return $prefix.' '.$this->escape_column($field).' REGEXP \''.$this->escape_str($match).'\''; } public function notregex($field, $match, $type, $num_regexs) { $prefix = $num_regexs == 0 ? '' : $type; return $prefix.' '.$this->escape_column($field).' NOT REGEXP \''.$this->escape_str($match) . '\''; } public function merge($table, $keys, $values) { // Escape the column names foreach ($keys as $key => $value) { $keys[$key] = $this->escape_column($value); } return 'REPLACE INTO '.$this->escape_table($table).' ('.implode(', ', $keys).') VALUES ('.implode(', ', $values).')'; } public function limit($limit, $offset = 0) { return 'LIMIT '.$offset.', '.$limit; } public function compile_select($database) { $sql = ($database['distinct'] == TRUE) ? 'SELECT DISTINCT ' : 'SELECT '; $sql .= (count($database['select']) > 0) ? implode(', ', $database['select']) : '*'; if (count($database['from']) > 0) { // Escape the tables $froms = array(); foreach ($database['from'] as $from) { $froms[] = $this->escape_column($from); } $sql .= "\nFROM ("; $sql .= implode(', ', $froms).")"; } if (count($database['join']) > 0) { foreach($database['join'] AS $join) { $sql .= "\n".$join['type'].'JOIN '.implode(', ', $join['tables']).' ON '.$join['conditions']; } } if (count($database['where']) > 0) { $sql .= "\nWHERE "; } $sql .= implode("\n", $database['where']); if (count($database['groupby']) > 0) { $sql .= "\nGROUP BY "; $sql .= implode(', ', $database['groupby']); } if (count($database['having']) > 0) { $sql .= "\nHAVING "; $sql .= implode("\n", $database['having']); } if (count($database['orderby']) > 0) { $sql .= "\nORDER BY "; $sql .= implode(', ', $database['orderby']); } if (is_numeric($database['limit'])) { $sql .= "\n"; $sql .= $this->limit($database['limit'], $database['offset']); } return $sql; } public function escape_str($str) { if (!$this->db_config['escape']) return $str; is_resource($this->link) or $this->connect(); return mysql_real_escape_string($str, $this->link); } public function list_tables() { $tables = array(); if ($query = $this->query('SHOW TABLES FROM '.$this->escape_table($this->db_config['connection']['database']))) { foreach ($query->result(FALSE) as $row) { $tables[] = current($row); } } return $tables; } public function show_error() { return mysql_error($this->link); } public function list_fields($table) { $result = NULL; foreach ($this->field_data($table) as $row) { // Make an associative array $result[$row->Field] = $this->sql_type($row->Type); if ($row->Key === 'PRI' AND $row->Extra === 'auto_increment') { // For sequenced (AUTO_INCREMENT) tables $result[$row->Field]['sequenced'] = TRUE; } if ($row->Null === 'YES') { // Set NULL status $result[$row->Field]['null'] = TRUE; } } if (!isset($result)) throw new Kohana_Database_Exception('database.table_not_found', $table); return $result; } public function field_data($table) { $result = $this->query('SHOW COLUMNS FROM '.$this->escape_table($table)); return $result->result_array(TRUE); } } // End Database_Mysql_Driver Class /** * MySQL Result */ class Mysql_Result extends Database_Result { // Fetch function and return type protected $fetch_type = 'mysql_fetch_object'; protected $return_type = MYSQL_ASSOC; /** * Sets up the result variables. * * @param resource query result * @param resource database link * @param boolean return objects or arrays * @param string SQL query that was run */ public function __construct($result, $link, $object = TRUE, $sql) { $this->result = $result; // If the query is a resource, it was a SELECT, SHOW, DESCRIBE, EXPLAIN query if (is_resource($result)) { $this->current_row = 0; $this->total_rows = mysql_num_rows($this->result); $this->fetch_type = ($object === TRUE) ? 'mysql_fetch_object' : 'mysql_fetch_array'; } elseif (is_bool($result)) { if ($result == FALSE) { // SQL error throw new Kohana_Database_Exception('database.error', mysql_error($link).' - '.$sql); } else { // Its an DELETE, INSERT, REPLACE, or UPDATE query $this->insert_id = mysql_insert_id($link); $this->total_rows = mysql_affected_rows($link); } } // Set result type $this->result($object); // Store the SQL $this->sql = $sql; } /** * Destruct, the cleanup crew! */ public function __destruct() { if (is_resource($this->result)) { mysql_free_result($this->result); } } public function result($object = TRUE, $type = MYSQL_ASSOC) { $this->fetch_type = ((bool) $object) ? 'mysql_fetch_object' : 'mysql_fetch_array'; // This check has to be outside the previous statement, because we do not // know the state of fetch_type when $object = NULL // NOTE - The class set by $type must be defined before fetching the result, // autoloading is disabled to save a lot of stupid overhead. if ($this->fetch_type == 'mysql_fetch_object' AND $object === TRUE) { $this->return_type = (is_string($type) AND Kohana::auto_load($type)) ? $type : 'stdClass'; } else { $this->return_type = $type; } return $this; } public function as_array($object = NULL, $type = MYSQL_ASSOC) { return $this->result_array($object, $type); } public function result_array($object = NULL, $type = MYSQL_ASSOC) { $rows = array(); if (is_string($object)) { $fetch = $object; } elseif (is_bool($object)) { if ($object === TRUE) { $fetch = 'mysql_fetch_object'; $type = (is_string($type) AND Kohana::auto_load($type)) ? $type : 'stdClass'; } else { $fetch = 'mysql_fetch_array'; } } else { // Use the default config values $fetch = $this->fetch_type; if ($fetch == 'mysql_fetch_object') { $type = (is_string($this->return_type) AND Kohana::auto_load($this->return_type)) ? $this->return_type : 'stdClass'; } } if (mysql_num_rows($this->result)) { // Reset the pointer location to make sure things work properly mysql_data_seek($this->result, 0); while ($row = $fetch($this->result, $type)) { $rows[] = $row; } } return isset($rows) ? $rows : array(); } public function list_fields() { $field_names = array(); while ($field = mysql_fetch_field($this->result)) { $field_names[] = $field->name; } return $field_names; } public function seek($offset) { if ($this->offsetExists($offset) AND mysql_data_seek($this->result, $offset)) { // Set the current row to the offset $this->current_row = $offset; return TRUE; } else { return FALSE; } } } // End Mysql_Result Class pnp4nagios-0.6.16/lib/kohana/system/libraries/drivers/Database/Mysqli.php0000664000000000000000000001751011662503006025051 0ustar rootrootdb_config = $config; Kohana::log('debug', 'MySQLi Database Driver Initialized'); } /** * Closes the database connection. */ public function __destruct() { is_object($this->link) and $this->link->close(); } public function connect() { // Check if link already exists if (is_object($this->link)) return $this->link; // Import the connect variables extract($this->db_config['connection']); // Build the connection info $host = isset($host) ? $host : $socket; // Make the connection and select the database if ($this->link = new mysqli($host, $user, $pass, $database, $port)) { if ($charset = $this->db_config['character_set']) { $this->set_charset($charset); } // Clear password after successful connect $this->db_config['connection']['pass'] = NULL; return $this->link; } return FALSE; } public function query($sql) { // Only cache if it's turned on, and only cache if it's not a write statement if ($this->db_config['cache'] AND ! preg_match('#\b(?:INSERT|UPDATE|REPLACE|SET|DELETE|TRUNCATE)\b#i', $sql)) { $hash = $this->query_hash($sql); if ( ! isset($this->query_cache[$hash])) { // Set the cached object $this->query_cache[$hash] = new Kohana_Mysqli_Result($this->link, $this->db_config['object'], $sql); } else { // Rewind cached result $this->query_cache[$hash]->rewind(); } // Return the cached query return $this->query_cache[$hash]; } return new Kohana_Mysqli_Result($this->link, $this->db_config['object'], $sql); } public function set_charset($charset) { if ($this->link->set_charset($charset) === FALSE) throw new Kohana_Database_Exception('database.error', $this->show_error()); } public function escape_str($str) { if (!$this->db_config['escape']) return $str; is_object($this->link) or $this->connect(); return $this->link->real_escape_string($str); } public function show_error() { return $this->link->error; } } // End Database_Mysqli_Driver Class /** * MySQLi Result */ class Kohana_Mysqli_Result extends Database_Result { // Database connection protected $link; // Data fetching types protected $fetch_type = 'mysqli_fetch_object'; protected $return_type = MYSQLI_ASSOC; /** * Sets up the result variables. * * @param object database link * @param boolean return objects or arrays * @param string SQL query that was run */ public function __construct($link, $object = TRUE, $sql) { $this->link = $link; if ( ! $this->link->multi_query($sql)) { // SQL error throw new Kohana_Database_Exception('database.error', $this->link->error.' - '.$sql); } else { $this->result = $this->link->store_result(); // If the query is an object, it was a SELECT, SHOW, DESCRIBE, EXPLAIN query if (is_object($this->result)) { $this->current_row = 0; $this->total_rows = $this->result->num_rows; $this->fetch_type = ($object === TRUE) ? 'fetch_object' : 'fetch_array'; } elseif ($this->link->error) { // SQL error throw new Kohana_Database_Exception('database.error', $this->link->error.' - '.$sql); } else { // Its an DELETE, INSERT, REPLACE, or UPDATE query $this->insert_id = $this->link->insert_id; $this->total_rows = $this->link->affected_rows; } } // Set result type $this->result($object); // Store the SQL $this->sql = $sql; } /** * Magic __destruct function, frees the result. */ public function __destruct() { if (is_object($this->result)) { $this->result->free_result(); // this is kinda useless, but needs to be done to avoid the "Commands out of sync; you // can't run this command now" error. Basically, we get all results after the first one // (the one we actually need) and free them. if (is_resource($this->link) AND $this->link->more_results()) { do { if ($result = $this->link->store_result()) { $result->free_result(); } } while ($this->link->next_result()); } } } public function result($object = TRUE, $type = MYSQLI_ASSOC) { $this->fetch_type = ((bool) $object) ? 'fetch_object' : 'fetch_array'; // This check has to be outside the previous statement, because we do not // know the state of fetch_type when $object = NULL // NOTE - The class set by $type must be defined before fetching the result, // autoloading is disabled to save a lot of stupid overhead. if ($this->fetch_type == 'fetch_object') { $this->return_type = (is_string($type) AND Kohana::auto_load($type)) ? $type : 'stdClass'; } else { $this->return_type = $type; } return $this; } public function as_array($object = NULL, $type = MYSQLI_ASSOC) { return $this->result_array($object, $type); } public function result_array($object = NULL, $type = MYSQLI_ASSOC) { $rows = array(); if (is_string($object)) { $fetch = $object; } elseif (is_bool($object)) { if ($object === TRUE) { $fetch = 'fetch_object'; // NOTE - The class set by $type must be defined before fetching the result, // autoloading is disabled to save a lot of stupid overhead. $type = (is_string($type) AND Kohana::auto_load($type)) ? $type : 'stdClass'; } else { $fetch = 'fetch_array'; } } else { // Use the default config values $fetch = $this->fetch_type; if ($fetch == 'fetch_object') { $type = (is_string($type) AND Kohana::auto_load($type)) ? $type : 'stdClass'; } } if ($this->result->num_rows) { // Reset the pointer location to make sure things work properly $this->result->data_seek(0); while ($row = $this->result->$fetch($type)) { $rows[] = $row; } } return isset($rows) ? $rows : array(); } public function list_fields() { $field_names = array(); while ($field = $this->result->fetch_field()) { $field_names[] = $field->name; } return $field_names; } public function seek($offset) { if ($this->offsetExists($offset) AND $this->result->data_seek($offset)) { // Set the current row to the offset $this->current_row = $offset; return TRUE; } return FALSE; } public function offsetGet($offset) { if ( ! $this->seek($offset)) return FALSE; // Return the row $fetch = $this->fetch_type; return $this->result->$fetch($this->return_type); } } // End Mysqli_Result Class /** * MySQLi Prepared Statement (experimental) */ class Kohana_Mysqli_Statement { protected $link = NULL; protected $stmt; protected $var_names = array(); protected $var_values = array(); public function __construct($sql, $link) { $this->link = $link; $this->stmt = $this->link->prepare($sql); return $this; } public function __destruct() { $this->stmt->close(); } // Sets the bind parameters public function bind_params($param_types, $params) { $this->var_names = array_keys($params); $this->var_values = array_values($params); call_user_func_array(array($this->stmt, 'bind_param'), array_merge($param_types, $var_names)); return $this; } public function bind_result($params) { call_user_func_array(array($this->stmt, 'bind_result'), $params); } // Runs the statement public function execute() { foreach ($this->var_names as $key => $name) { $$name = $this->var_values[$key]; } $this->stmt->execute(); return $this->stmt; } } pnp4nagios-0.6.16/lib/kohana/system/libraries/drivers/Captcha/0000775000000000000000000000000011662503006022715 5ustar rootrootpnp4nagios-0.6.16/lib/kohana/system/libraries/drivers/Captcha/Word.php0000664000000000000000000000170211662503006024341 0ustar rootrootimage $this->image_create(Captcha::$config['background']); // Add a random gradient if (empty(Captcha::$config['background'])) { $color1 = imagecolorallocate($this->image, mt_rand(200, 255), mt_rand(200, 255), mt_rand(150, 255)); $color2 = imagecolorallocate($this->image, mt_rand(200, 255), mt_rand(200, 255), mt_rand(150, 255)); $this->image_gradient($color1, $color2); } // Add a few random lines for ($i = 0, $count = mt_rand(5, Captcha::$config['complexity'] * 4); $i < $count; $i++) { $color = imagecolorallocatealpha($this->image, mt_rand(0, 255), mt_rand(0, 255), mt_rand(100, 255), mt_rand(50, 120)); imageline($this->image, mt_rand(0, Captcha::$config['width']), 0, mt_rand(0, Captcha::$config['width']), Captcha::$config['height'], $color); } // Calculate character font-size and spacing $default_size = min(Captcha::$config['width'], Captcha::$config['height'] * 2) / (strlen($this->response) + 1); $spacing = (int) (Captcha::$config['width'] * 0.9 / strlen($this->response)); // Draw each Captcha character with varying attributes for ($i = 0, $strlen = strlen($this->response); $i < $strlen; $i++) { // Use different fonts if available $font = Captcha::$config['fontpath'].Captcha::$config['fonts'][array_rand(Captcha::$config['fonts'])]; // Allocate random color, size and rotation attributes to text $color = imagecolorallocate($this->image, mt_rand(0, 150), mt_rand(0, 150), mt_rand(0, 150)); $angle = mt_rand(-40, 20); // Scale the character size on image height $size = $default_size / 10 * mt_rand(8, 12); $box = imageftbbox($size, $angle, $font, $this->response[$i]); // Calculate character starting coordinates $x = $spacing / 4 + $i * $spacing; $y = Captcha::$config['height'] / 2 + ($box[2] - $box[5]) / 4; // Write text character to image imagefttext($this->image, $size, $angle, $x, $y, $color, $font, $this->response[$i]); } // Output return $this->image_render($html); } } // End Captcha Basic Driver Classpnp4nagios-0.6.16/lib/kohana/system/libraries/drivers/Captcha/Alpha.php0000664000000000000000000000646211662503006024463 0ustar rootrootimage $this->image_create(Captcha::$config['background']); // Add a random gradient if (empty(Captcha::$config['background'])) { $color1 = imagecolorallocate($this->image, mt_rand(0, 100), mt_rand(0, 100), mt_rand(0, 100)); $color2 = imagecolorallocate($this->image, mt_rand(0, 100), mt_rand(0, 100), mt_rand(0, 100)); $this->image_gradient($color1, $color2); } // Add a few random circles for ($i = 0, $count = mt_rand(10, Captcha::$config['complexity'] * 3); $i < $count; $i++) { $color = imagecolorallocatealpha($this->image, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255), mt_rand(80, 120)); $size = mt_rand(5, Captcha::$config['height'] / 3); imagefilledellipse($this->image, mt_rand(0, Captcha::$config['width']), mt_rand(0, Captcha::$config['height']), $size, $size, $color); } // Calculate character font-size and spacing $default_size = min(Captcha::$config['width'], Captcha::$config['height'] * 2) / strlen($this->response); $spacing = (int) (Captcha::$config['width'] * 0.9 / strlen($this->response)); // Background alphabetic character attributes $color_limit = mt_rand(96, 160); $chars = 'ABEFGJKLPQRTVY'; // Draw each Captcha character with varying attributes for ($i = 0, $strlen = strlen($this->response); $i < $strlen; $i++) { // Use different fonts if available $font = Captcha::$config['fontpath'].Captcha::$config['fonts'][array_rand(Captcha::$config['fonts'])]; $angle = mt_rand(-40, 20); // Scale the character size on image height $size = $default_size / 10 * mt_rand(8, 12); $box = imageftbbox($size, $angle, $font, $this->response[$i]); // Calculate character starting coordinates $x = $spacing / 4 + $i * $spacing; $y = Captcha::$config['height'] / 2 + ($box[2] - $box[5]) / 4; // Draw captcha text character // Allocate random color, size and rotation attributes to text $color = imagecolorallocate($this->image, mt_rand(150, 255), mt_rand(200, 255), mt_rand(0, 255)); // Write text character to image imagefttext($this->image, $size, $angle, $x, $y, $color, $font, $this->response[$i]); // Draw "ghost" alphabetic character $text_color = imagecolorallocatealpha($this->image, mt_rand($color_limit + 8, 255), mt_rand($color_limit + 8, 255), mt_rand($color_limit + 8, 255), mt_rand(70, 120)); $char = $chars[mt_rand(0, 14)]; imagettftext($this->image, $size * 2, mt_rand(-45, 45), ($x - (mt_rand(5, 10))), ($y + (mt_rand(5, 10))), $text_color, $font, $char); } // Output return $this->image_render($html); } } // End Captcha Alpha Driver Classpnp4nagios-0.6.16/lib/kohana/system/libraries/drivers/Captcha/Math.php0000664000000000000000000000237311662503006024324 0ustar rootrootmath_exercice = implode(' + ', $numbers).' = '; // Return the answer return array_sum($numbers); } /** * Outputs the Captcha riddle. * * @param boolean html output * @return mixed */ public function render($html) { return $this->math_exercice; } } // End Captcha Math Driver Classpnp4nagios-0.6.16/lib/kohana/system/libraries/drivers/Captcha/Black.php0000664000000000000000000000625711662503006024454 0ustar rootrootimage_create(Captcha::$config['background']); // Add random white/gray arcs, amount depends on complexity setting $count = (Captcha::$config['width'] + Captcha::$config['height']) / 2; $count = $count / 5 * min(10, Captcha::$config['complexity']); for ($i = 0; $i < $count; $i++) { imagesetthickness($this->image, mt_rand(1, 2)); $color = imagecolorallocatealpha($this->image, 255, 255, 255, mt_rand(0, 120)); imagearc($this->image, mt_rand(-Captcha::$config['width'], Captcha::$config['width']), mt_rand(-Captcha::$config['height'], Captcha::$config['height']), mt_rand(-Captcha::$config['width'], Captcha::$config['width']), mt_rand(-Captcha::$config['height'], Captcha::$config['height']), mt_rand(0, 360), mt_rand(0, 360), $color); } // Use different fonts if available $font = Captcha::$config['fontpath'].Captcha::$config['fonts'][array_rand(Captcha::$config['fonts'])]; // Draw the character's white shadows $size = (int) min(Captcha::$config['height'] / 2, Captcha::$config['width'] * 0.8 / strlen($this->response)); $angle = mt_rand(-15 + strlen($this->response), 15 - strlen($this->response)); $x = mt_rand(1, Captcha::$config['width'] * 0.9 - $size * strlen($this->response)); $y = ((Captcha::$config['height'] - $size) / 2) + $size; $color = imagecolorallocate($this->image, 255, 255, 255); imagefttext($this->image, $size, $angle, $x + 1, $y + 1, $color, $font, $this->response); // Add more shadows for lower complexities (Captcha::$config['complexity'] < 10) and imagefttext($this->image, $size, $angle, $x - 1, $y - 1, $color, $font , $this->response); (Captcha::$config['complexity'] < 8) and imagefttext($this->image, $size, $angle, $x - 2, $y + 2, $color, $font , $this->response); (Captcha::$config['complexity'] < 6) and imagefttext($this->image, $size, $angle, $x + 2, $y - 2, $color, $font , $this->response); (Captcha::$config['complexity'] < 4) and imagefttext($this->image, $size, $angle, $x + 3, $y + 3, $color, $font , $this->response); (Captcha::$config['complexity'] < 2) and imagefttext($this->image, $size, $angle, $x - 3, $y - 3, $color, $font , $this->response); // Finally draw the foreground characters $color = imagecolorallocate($this->image, 0, 0, 0); imagefttext($this->image, $size, $angle, $x, $y, $color, $font, $this->response); // Output return $this->image_render($html); } } // End Captcha Black Driver Classpnp4nagios-0.6.16/lib/kohana/system/libraries/drivers/Captcha/Riddle.php0000664000000000000000000000173611662503006024640 0ustar rootrootriddle = $riddle[0]; // Return the answer return $riddle[1]; } /** * Outputs the Captcha riddle. * * @param boolean html output * @return mixed */ public function render($html) { return $this->riddle; } } // End Captcha Riddle Driver Classpnp4nagios-0.6.16/lib/kohana/system/libraries/drivers/Session/0000775000000000000000000000000011662503006022775 5ustar rootrootpnp4nagios-0.6.16/lib/kohana/system/libraries/drivers/Session/Database.php0000664000000000000000000000651111662503006025215 0ustar rootrootencrypt = Encrypt::instance(); } if (is_array($config['storage'])) { if ( ! empty($config['storage']['group'])) { // Set the group name $this->db = $config['storage']['group']; } if ( ! empty($config['storage']['table'])) { // Set the table name $this->table = $config['storage']['table']; } } // Load database $this->db = Database::instance($this->db); Kohana::log('debug', 'Session Database Driver Initialized'); } public function open($path, $name) { return TRUE; } public function close() { return TRUE; } public function read($id) { // Load the session $query = $this->db->from($this->table)->where('session_id', $id)->limit(1)->get()->result(TRUE); if ($query->count() === 0) { // No current session $this->session_id = NULL; return ''; } // Set the current session id $this->session_id = $id; // Load the data $data = $query->current()->data; return ($this->encrypt === NULL) ? base64_decode($data) : $this->encrypt->decode($data); } public function write($id, $data) { $data = array ( 'session_id' => $id, 'last_activity' => time(), 'data' => ($this->encrypt === NULL) ? base64_encode($data) : $this->encrypt->encode($data) ); if ($this->session_id === NULL) { // Insert a new session $query = $this->db->insert($this->table, $data); } elseif ($id === $this->session_id) { // Do not update the session_id unset($data['session_id']); // Update the existing session $query = $this->db->update($this->table, $data, array('session_id' => $id)); } else { // Update the session and id $query = $this->db->update($this->table, $data, array('session_id' => $this->session_id)); // Set the new session id $this->session_id = $id; } return (bool) $query->count(); } public function destroy($id) { // Delete the requested session $this->db->delete($this->table, array('session_id' => $id)); // Session id is no longer valid $this->session_id = NULL; return TRUE; } public function regenerate() { // Generate a new session id session_regenerate_id(); // Return new session id return session_id(); } public function gc($maxlifetime) { // Delete all expired sessions $query = $this->db->delete($this->table, array('last_activity <' => time() - $maxlifetime)); Kohana::log('debug', 'Session garbage collected: '.$query->count().' row(s) deleted.'); return TRUE; } } // End Session Database Driver pnp4nagios-0.6.16/lib/kohana/system/libraries/drivers/Session/Cookie.php0000664000000000000000000000313411662503006024720 0ustar rootrootcookie_name = Kohana::config('session.name').'_data'; if (Kohana::config('session.encryption')) { $this->encrypt = Encrypt::instance(); } Kohana::log('debug', 'Session Cookie Driver Initialized'); } public function open($path, $name) { return TRUE; } public function close() { return TRUE; } public function read($id) { $data = (string) cookie::get($this->cookie_name); if ($data == '') return $data; return empty($this->encrypt) ? base64_decode($data) : $this->encrypt->decode($data); } public function write($id, $data) { $data = empty($this->encrypt) ? base64_encode($data) : $this->encrypt->encode($data); if (strlen($data) > 4048) { Kohana::log('error', 'Session ('.$id.') data exceeds the 4KB limit, ignoring write.'); return FALSE; } return cookie::set($this->cookie_name, $data, Kohana::config('session.expiration')); } public function destroy($id) { return cookie::delete($this->cookie_name); } public function regenerate() { session_regenerate_id(TRUE); // Return new id return session_id(); } public function gc($maxlifetime) { return TRUE; } } // End Session Cookie Driver Classpnp4nagios-0.6.16/lib/kohana/system/libraries/drivers/Session/Cache.php0000664000000000000000000000440211662503006024511 0ustar rootroot 'apc', * 'requests' => 10000 * ); * Lifetime does not need to be set as it is * overridden by the session expiration setting. * * $Id: Cache.php 3769 2008-12-15 00:48:56Z zombor $ * * @package Core * @author Kohana Team * @copyright (c) 2007-2008 Kohana Team * @license http://kohanaphp.com/license.html */ class Session_Cache_Driver implements Session_Driver { protected $cache; protected $encrypt; public function __construct() { // Load Encrypt library if (Kohana::config('session.encryption')) { $this->encrypt = new Encrypt; } Kohana::log('debug', 'Session Cache Driver Initialized'); } public function open($path, $name) { $config = Kohana::config('session.storage'); if (empty($config)) { // Load the default group $config = Kohana::config('cache.default'); } elseif (is_string($config)) { $name = $config; // Test the config group name if (($config = Kohana::config('cache.'.$config)) === NULL) throw new Kohana_Exception('cache.undefined_group', $name); } $config['lifetime'] = (Kohana::config('session.expiration') == 0) ? 86400 : Kohana::config('session.expiration'); $this->cache = new Cache($config); return is_object($this->cache); } public function close() { return TRUE; } public function read($id) { $id = 'session_'.$id; if ($data = $this->cache->get($id)) { return Kohana::config('session.encryption') ? $this->encrypt->decode($data) : $data; } // Return value must be string, NOT a boolean return ''; } public function write($id, $data) { $id = 'session_'.$id; $data = Kohana::config('session.encryption') ? $this->encrypt->encode($data) : $data; return $this->cache->set($id, $data); } public function destroy($id) { $id = 'session_'.$id; return $this->cache->delete($id); } public function regenerate() { session_regenerate_id(TRUE); // Return new session id return session_id(); } public function gc($maxlifetime) { // Just return, caches are automatically cleaned up return TRUE; } } // End Session Cache Driver pnp4nagios-0.6.16/lib/kohana/system/libraries/drivers/Database.php0000664000000000000000000003105011662503006023566 0ustar rootrootescape_table($table).' WHERE '.implode(' ', $where); } /** * Builds an UPDATE query. * * @param string table name * @param array key => value pairs * @param array where clause * @return string */ public function update($table, $values, $where) { foreach ($values as $key => $val) { $valstr[] = $this->escape_column($key).' = '.$val; } return 'UPDATE '.$this->escape_table($table).' SET '.implode(', ', $valstr).' WHERE '.implode(' ',$where); } /** * Set the charset using 'SET NAMES '. * * @param string character set to use */ public function set_charset($charset) { throw new Kohana_Database_Exception('database.not_implemented', __FUNCTION__); } /** * Wrap the tablename in backticks, has support for: table.field syntax. * * @param string table name * @return string */ abstract public function escape_table($table); /** * Escape a column/field name, has support for special commands. * * @param string column name * @return string */ abstract public function escape_column($column); /** * Builds a WHERE portion of a query. * * @param mixed key * @param string value * @param string type * @param int number of where clauses * @param boolean escape the value * @return string */ public function where($key, $value, $type, $num_wheres, $quote) { $prefix = ($num_wheres == 0) ? '' : $type; if ($quote === -1) { $value = ''; } else { if ($value === NULL) { if ( ! $this->has_operator($key)) { $key .= ' IS'; } $value = ' NULL'; } elseif (is_bool($value)) { if ( ! $this->has_operator($key)) { $key .= ' ='; } $value = ($value == TRUE) ? ' 1' : ' 0'; } else { if ( ! $this->has_operator($key) AND ! empty($key)) { $key = $this->escape_column($key).' ='; } else { preg_match('/^(.+?)([<>!=]+|\bIS(?:\s+NULL))\s*$/i', $key, $matches); if (isset($matches[1]) AND isset($matches[2])) { $key = $this->escape_column(trim($matches[1])).' '.trim($matches[2]); } } $value = ' '.(($quote == TRUE) ? $this->escape($value) : $value); } } return $prefix.$key.$value; } /** * Builds a LIKE portion of a query. * * @param mixed field name * @param string value to match with field * @param boolean add wildcards before and after the match * @param string clause type (AND or OR) * @param int number of likes * @return string */ public function like($field, $match, $auto, $type, $num_likes) { $prefix = ($num_likes == 0) ? '' : $type; $match = $this->escape_str($match); if ($auto === TRUE) { // Add the start and end quotes $match = '%'.str_replace('%', '\\%', $match).'%'; } return $prefix.' '.$this->escape_column($field).' LIKE \''.$match . '\''; } /** * Builds a NOT LIKE portion of a query. * * @param mixed field name * @param string value to match with field * @param string clause type (AND or OR) * @param int number of likes * @return string */ public function notlike($field, $match, $auto, $type, $num_likes) { $prefix = ($num_likes == 0) ? '' : $type; $match = $this->escape_str($match); if ($auto === TRUE) { // Add the start and end quotes $match = '%'.$match.'%'; } return $prefix.' '.$this->escape_column($field).' NOT LIKE \''.$match.'\''; } /** * Builds a REGEX portion of a query. * * @param string field name * @param string value to match with field * @param string clause type (AND or OR) * @param integer number of regexes * @return string */ public function regex($field, $match, $type, $num_regexs) { throw new Kohana_Database_Exception('database.not_implemented', __FUNCTION__); } /** * Builds a NOT REGEX portion of a query. * * @param string field name * @param string value to match with field * @param string clause type (AND or OR) * @param integer number of regexes * @return string */ public function notregex($field, $match, $type, $num_regexs) { throw new Kohana_Database_Exception('database.not_implemented', __FUNCTION__); } /** * Builds an INSERT query. * * @param string table name * @param array keys * @param array values * @return string */ public function insert($table, $keys, $values) { // Escape the column names foreach ($keys as $key => $value) { $keys[$key] = $this->escape_column($value); } return 'INSERT INTO '.$this->escape_table($table).' ('.implode(', ', $keys).') VALUES ('.implode(', ', $values).')'; } /** * Builds a MERGE portion of a query. * * @param string table name * @param array keys * @param array values * @return string */ public function merge($table, $keys, $values) { throw new Kohana_Database_Exception('database.not_implemented', __FUNCTION__); } /** * Builds a LIMIT portion of a query. * * @param integer limit * @param integer offset * @return string */ abstract public function limit($limit, $offset = 0); /** * Creates a prepared statement. * * @param string SQL query * @return Database_Stmt */ public function stmt_prepare($sql = '') { throw new Kohana_Database_Exception('database.not_implemented', __FUNCTION__); } /** * Compiles the SELECT statement. * Generates a query string based on which functions were used. * Should not be called directly, the get() function calls it. * * @param array select query values * @return string */ abstract public function compile_select($database); /** * Determines if the string has an arithmetic operator in it. * * @param string string to check * @return boolean */ public function has_operator($str) { return (bool) preg_match('/[<>!=]|\sIS(?:\s+NOT\s+)?\b|BETWEEN/i', trim($str)); } /** * Escapes any input value. * * @param mixed value to escape * @return string */ public function escape($value) { if ( ! $this->db_config['escape']) return $value; switch (gettype($value)) { case 'string': $value = '\''.$this->escape_str($value).'\''; break; case 'boolean': $value = (int) $value; break; case 'double': // Convert to non-locale aware float to prevent possible commas $value = sprintf('%F', $value); break; default: $value = ($value === NULL) ? 'NULL' : $value; break; } return (string) $value; } /** * Escapes a string for a query. * * @param mixed value to escape * @return string */ abstract public function escape_str($str); /** * Lists all tables in the database. * * @return array */ abstract public function list_tables(); /** * Lists all fields in a table. * * @param string table name * @return array */ abstract function list_fields($table); /** * Returns the last database error. * * @return string */ abstract public function show_error(); /** * Returns field data about a table. * * @param string table name * @return array */ abstract public function field_data($table); /** * Fetches SQL type information about a field, in a generic format. * * @param string field datatype * @return array */ protected function sql_type($str) { static $sql_types; if ($sql_types === NULL) { // Load SQL data types $sql_types = Kohana::config('sql_types'); } $str = strtolower(trim($str)); if (($open = strpos($str, '(')) !== FALSE) { // Find closing bracket $close = strpos($str, ')', $open) - 1; // Find the type without the size $type = substr($str, 0, $open); } else { // No length $type = $str; } empty($sql_types[$type]) and exit ( 'Unknown field type: '.$type.'. '. 'Please report this: http://trac.kohanaphp.com/newticket' ); // Fetch the field definition $field = $sql_types[$type]; switch ($field['type']) { case 'string': case 'float': if (isset($close)) { // Add the length to the field info $field['length'] = substr($str, $open + 1, $close - $open); } break; case 'int': // Add unsigned value $field['unsigned'] = (strpos($str, 'unsigned') !== FALSE); break; } return $field; } /** * Clears the internal query cache. * * @param string SQL query */ public function clear_cache($sql = NULL) { if (empty($sql)) { $this->query_cache = array(); } else { unset($this->query_cache[$this->query_hash($sql)]); } Kohana::log('debug', 'Database cache cleared: '.get_class($this)); } /** * Creates a hash for an SQL query string. Replaces newlines with spaces, * trims, and hashes. * * @param string SQL query * @return string */ protected function query_hash($sql) { return sha1(str_replace("\n", ' ', trim($sql))); } } // End Database Driver Interface /** * Database_Result * */ abstract class Database_Result implements ArrayAccess, Iterator, Countable { // Result resource, insert id, and SQL protected $result; protected $insert_id; protected $sql; // Current and total rows protected $current_row = 0; protected $total_rows = 0; // Fetch function and return type protected $fetch_type; protected $return_type; /** * Returns the SQL used to fetch the result. * * @return string */ public function sql() { return $this->sql; } /** * Returns the insert id from the result. * * @return mixed */ public function insert_id() { return $this->insert_id; } /** * Prepares the query result. * * @param boolean return rows as objects * @param mixed type * @return Database_Result */ abstract function result($object = TRUE, $type = FALSE); /** * Builds an array of query results. * * @param boolean return rows as objects * @param mixed type * @return array */ abstract function result_array($object = NULL, $type = FALSE); /** * Gets the fields of an already run query. * * @return array */ abstract public function list_fields(); /** * Seek to an offset in the results. * * @return boolean */ abstract public function seek($offset); /** * Countable: count */ public function count() { return $this->total_rows; } /** * ArrayAccess: offsetExists */ public function offsetExists($offset) { if ($this->total_rows > 0) { $min = 0; $max = $this->total_rows - 1; return ! ($offset < $min OR $offset > $max); } return FALSE; } /** * ArrayAccess: offsetGet */ public function offsetGet($offset) { if ( ! $this->seek($offset)) return FALSE; // Return the row by calling the defined fetching callback return call_user_func($this->fetch_type, $this->result, $this->return_type); } /** * ArrayAccess: offsetSet * * @throws Kohana_Database_Exception */ final public function offsetSet($offset, $value) { throw new Kohana_Database_Exception('database.result_read_only'); } /** * ArrayAccess: offsetUnset * * @throws Kohana_Database_Exception */ final public function offsetUnset($offset) { throw new Kohana_Database_Exception('database.result_read_only'); } /** * Iterator: current */ public function current() { return $this->offsetGet($this->current_row); } /** * Iterator: key */ public function key() { return $this->current_row; } /** * Iterator: next */ public function next() { ++$this->current_row; return $this; } /** * Iterator: prev */ public function prev() { --$this->current_row; return $this; } /** * Iterator: rewind */ public function rewind() { $this->current_row = 0; return $this; } /** * Iterator: valid */ public function valid() { return $this->offsetExists($this->current_row); } } // End Database Result Interface pnp4nagios-0.6.16/lib/kohana/system/libraries/drivers/Captcha.php0000664000000000000000000001352511662503006023434 0ustar rootrootresponse = $this->generate_challenge(); // Store the correct Captcha response in a session Event::add('system.post_controller', array($this, 'update_response_session')); } /** * Generate a new Captcha challenge. * * @return string the challenge answer */ abstract public function generate_challenge(); /** * Output the Captcha challenge. * * @param boolean html output * @return mixed the rendered Captcha (e.g. an image, riddle, etc.) */ abstract public function render($html); /** * Stores the response for the current Captcha challenge in a session so it is available * on the next page load for Captcha::valid(). This method is called after controller * execution (in the system.post_controller event) in order not to overwrite itself too soon. * * @return void */ public function update_response_session() { Session::instance()->set('captcha_response', sha1(strtoupper($this->response))); } /** * Validates a Captcha response from a user. * * @param string captcha response * @return boolean */ public function valid($response) { return (sha1(strtoupper($response)) === Session::instance()->get('captcha_response')); } /** * Returns the image type. * * @param string filename * @return string|FALSE image type ("png", "gif" or "jpeg") */ public function image_type($filename) { switch (strtolower(substr(strrchr($filename, '.'), 1))) { case 'png': return 'png'; case 'gif': return 'gif'; case 'jpg': case 'jpeg': // Return "jpeg" and not "jpg" because of the GD2 function names return 'jpeg'; default: return FALSE; } } /** * Creates an image resource with the dimensions specified in config. * If a background image is supplied, the image dimensions are used. * * @throws Kohana_Exception if no GD2 support * @param string path to the background image file * @return void */ public function image_create($background = NULL) { // Check for GD2 support if ( ! function_exists('imagegd2')) throw new Kohana_Exception('captcha.requires_GD2'); // Create a new image (black) $this->image = imagecreatetruecolor(Captcha::$config['width'], Captcha::$config['height']); // Use a background image if ( ! empty($background)) { // Create the image using the right function for the filetype $function = 'imagecreatefrom'.$this->image_type($background); $this->background_image = $function($background); // Resize the image if needed if (imagesx($this->background_image) !== Captcha::$config['width'] OR imagesy($this->background_image) !== Captcha::$config['height']) { imagecopyresampled ( $this->image, $this->background_image, 0, 0, 0, 0, Captcha::$config['width'], Captcha::$config['height'], imagesx($this->background_image), imagesy($this->background_image) ); } // Free up resources imagedestroy($this->background_image); } } /** * Fills the background with a gradient. * * @param resource gd image color identifier for start color * @param resource gd image color identifier for end color * @param string direction: 'horizontal' or 'vertical', 'random' by default * @return void */ public function image_gradient($color1, $color2, $direction = NULL) { $directions = array('horizontal', 'vertical'); // Pick a random direction if needed if ( ! in_array($direction, $directions)) { $direction = $directions[array_rand($directions)]; // Switch colors if (mt_rand(0, 1) === 1) { $temp = $color1; $color1 = $color2; $color2 = $temp; } } // Extract RGB values $color1 = imagecolorsforindex($this->image, $color1); $color2 = imagecolorsforindex($this->image, $color2); // Preparations for the gradient loop $steps = ($direction === 'horizontal') ? Captcha::$config['width'] : Captcha::$config['height']; $r1 = ($color1['red'] - $color2['red']) / $steps; $g1 = ($color1['green'] - $color2['green']) / $steps; $b1 = ($color1['blue'] - $color2['blue']) / $steps; if ($direction === 'horizontal') { $x1 =& $i; $y1 = 0; $x2 =& $i; $y2 = Captcha::$config['height']; } else { $x1 = 0; $y1 =& $i; $x2 = Captcha::$config['width']; $y2 =& $i; } // Execute the gradient loop for ($i = 0; $i <= $steps; $i++) { $r2 = $color1['red'] - floor($i * $r1); $g2 = $color1['green'] - floor($i * $g1); $b2 = $color1['blue'] - floor($i * $b1); $color = imagecolorallocate($this->image, $r2, $g2, $b2); imageline($this->image, $x1, $y1, $x2, $y2, $color); } } /** * Returns the img html element or outputs the image to the browser. * * @param boolean html output * @return mixed html string or void */ public function image_render($html) { // Output html element if ($html) return 'Captcha'; // Send the correct HTTP header header('Content-Type: image/'.$this->image_type); // Pick the correct output function $function = 'image'.$this->image_type; $function($this->image); // Free up resources imagedestroy($this->image); } } // End Captcha Driverpnp4nagios-0.6.16/lib/kohana/system/libraries/drivers/Cache/0000775000000000000000000000000011662503006022355 5ustar rootrootpnp4nagios-0.6.16/lib/kohana/system/libraries/drivers/Cache/Eaccelerator.php0000664000000000000000000000250511662503006025461 0ustar rootrootdirectory = $directory; } /** * Finds an array of files matching the given id or tag. * * @param string cache id or tag * @param bool search for tags * @return array of filenames matching the id or tag */ public function exists($id, $tag = FALSE) { if ($id === TRUE) { // Find all the files return glob($this->directory.'*~*~*'); } elseif ($tag === TRUE) { // Find all the files that have the tag name $paths = glob($this->directory.'*~*'.$id.'*~*'); // Find all tags matching the given tag $files = array(); foreach ($paths as $path) { // Split the files $tags = explode('~', basename($path)); // Find valid tags if (count($tags) !== 3 OR empty($tags[1])) continue; // Split the tags by plus signs, used to separate tags $tags = explode('+', $tags[1]); if (in_array($tag, $tags)) { // Add the file to the array, it has the requested tag $files[] = $path; } } return $files; } else { // Find the file matching the given id return glob($this->directory.$id.'~*'); } } /** * Sets a cache item to the given data, tags, and lifetime. * * @param string cache id to set * @param string data in the cache * @param array cache tags * @param integer lifetime * @return bool */ public function set($id, $data, array $tags = NULL, $lifetime) { // Remove old cache files $this->delete($id); // Cache File driver expects unix timestamp if ($lifetime !== 0) { $lifetime += time(); } if ( ! empty($tags)) { // Convert the tags into a string list $tags = implode('+', $tags); } // Write out a serialized cache return (bool) file_put_contents($this->directory.$id.'~'.$tags.'~'.$lifetime, serialize($data)); } /** * Finds an array of ids for a given tag. * * @param string tag name * @return array of ids that match the tag */ public function find($tag) { // An array will always be returned $result = array(); if ($paths = $this->exists($tag, TRUE)) { // Length of directory name $offset = strlen($this->directory); // Find all the files with the given tag foreach ($paths as $path) { // Get the id from the filename list($id, $junk) = explode('~', basename($path), 2); if (($data = $this->get($id)) !== FALSE) { // Add the result to the array $result[$id] = $data; } } } return $result; } /** * Fetches a cache item. This will delete the item if it is expired or if * the hash does not match the stored hash. * * @param string cache id * @return mixed|NULL */ public function get($id) { if ($file = $this->exists($id)) { // Use the first file $file = current($file); // Validate that the cache has not expired if ($this->expired($file)) { // Remove this cache, it has expired $this->delete($id); } else { // Turn off errors while reading the file $ER = error_reporting(0); if (($data = file_get_contents($file)) !== FALSE) { // Unserialize the data $data = unserialize($data); } else { // Delete the data unset($data); } // Turn errors back on error_reporting($ER); } } // Return NULL if there is no data return isset($data) ? $data : NULL; } /** * Deletes a cache item by id or tag * * @param string cache id or tag, or TRUE for "all items" * @param boolean use tags * @return boolean */ public function delete($id, $tag = FALSE) { $files = $this->exists($id, $tag); if (empty($files)) return FALSE; // Disable all error reporting while deleting $ER = error_reporting(0); foreach ($files as $file) { // Remove the cache file if ( ! unlink($file)) Kohana::log('error', 'Cache: Unable to delete cache file: '.$file); } // Turn on error reporting again error_reporting($ER); return TRUE; } /** * Deletes all cache files that are older than the current time. * * @return void */ public function delete_expired() { if ($files = $this->exists(TRUE)) { // Disable all error reporting while deleting $ER = error_reporting(0); foreach ($files as $file) { if ($this->expired($file)) { // The cache file has already expired, delete it if ( ! unlink($file)) Kohana::log('error', 'Cache: Unable to delete cache file: '.$file); } } // Turn on error reporting again error_reporting($ER); } } /** * Check if a cache file has expired by filename. * * @param string filename * @return bool */ protected function expired($file) { // Get the expiration time $expires = (int) substr($file, strrpos($file, '~') + 1); // Expirations of 0 are "never expire" return ($expires !== 0 AND $expires <= time()); } } // End Cache File Driverpnp4nagios-0.6.16/lib/kohana/system/libraries/drivers/Cache/Memcache.php0000664000000000000000000000770111662503006024575 0ustar rootrootbackend = new Memcache; $this->flags = Kohana::config('cache_memcache.compression') ? MEMCACHE_COMPRESSED : FALSE; $servers = Kohana::config('cache_memcache.servers'); foreach ($servers as $server) { // Make sure all required keys are set $server += array('host' => '127.0.0.1', 'port' => 11211, 'persistent' => FALSE); // Add the server to the pool $this->backend->addServer($server['host'], $server['port'], (bool) $server['persistent']) or Kohana::log('error', 'Cache: Connection failed: '.$server['host']); } // Load tags self::$tags = $this->backend->get(self::TAGS_KEY); if ( ! is_array(self::$tags)) { // Create a new tags array self::$tags = array(); // Tags have been created self::$tags_changed = TRUE; } } public function __destruct() { if (self::$tags_changed === TRUE) { // Save the tags $this->backend->set(self::TAGS_KEY, self::$tags, $this->flags, 0); // Tags are now unchanged self::$tags_changed = FALSE; } } public function find($tag) { if (isset(self::$tags[$tag]) AND $results = $this->backend->get(self::$tags[$tag])) { // Return all the found caches return $results; } else { // No matching tags return array(); } } public function get($id) { return (($return = $this->backend->get($id)) === FALSE) ? NULL : $return; } public function set($id, $data, array $tags = NULL, $lifetime) { if ( ! empty($tags)) { // Tags will be changed self::$tags_changed = TRUE; foreach ($tags as $tag) { // Add the id to each tag self::$tags[$tag][$id] = $id; } } if ($lifetime !== 0) { // Memcache driver expects unix timestamp $lifetime += time(); } // Set a new value return $this->backend->set($id, $data, $this->flags, $lifetime); } public function delete($id, $tag = FALSE) { // Tags will be changed self::$tags_changed = TRUE; if ($id === TRUE) { if ($status = $this->backend->flush()) { // Remove all tags, all items have been deleted self::$tags = array(); // We must sleep after flushing, or overwriting will not work! // @see http://php.net/manual/en/function.memcache-flush.php#81420 sleep(1); } return $status; } elseif ($tag === TRUE) { if (isset(self::$tags[$id])) { foreach (self::$tags[$id] as $_id) { // Delete each id in the tag $this->backend->delete($_id); } // Delete the tag unset(self::$tags[$id]); } return TRUE; } else { foreach (self::$tags as $tag => $_ids) { if (isset(self::$tags[$tag][$id])) { // Remove the id from the tags unset(self::$tags[$tag][$id]); } } return $this->backend->delete($id); } } public function delete_expired() { // Tags will be changed self::$tags_changed = TRUE; foreach (self::$tags as $tag => $_ids) { foreach ($_ids as $id) { if ( ! $this->backend->get($id)) { // This id has disappeared, delete it from the tags unset(self::$tags[$tag][$id]); } } if (empty(self::$tags[$tag])) { // The tag no longer has any valid ids unset(self::$tags[$tag]); } } // Memcache handles garbage collection internally return TRUE; } } // End Cache Memcache Driver pnp4nagios-0.6.16/lib/kohana/system/libraries/drivers/Cache/Apc.php0000664000000000000000000000241411662503006023572 0ustar rootrootauth(); $result = TRUE; for ($i = 0, $max = xcache_count(XC_TYPE_VAR); $i < $max; $i++) { if (xcache_clear_cache(XC_TYPE_VAR, $i) !== NULL) { $result = FALSE; break; } } // Undo the login $this->auth(TRUE); return $result; } return TRUE; } public function delete_expired() { return TRUE; } private function auth($reverse = FALSE) { static $backup = array(); $keys = array('PHP_AUTH_USER', 'PHP_AUTH_PW'); foreach ($keys as $key) { if ($reverse) { if (isset($backup[$key])) { $_SERVER[$key] = $backup[$key]; unset($backup[$key]); } else { unset($_SERVER[$key]); } } else { $value = getenv($key); if ( ! empty($value)) { $backup[$key] = $value; } $_SERVER[$key] = Kohana::config('cache_xcache.'.$key); } } } } // End Cache Xcache Driver pnp4nagios-0.6.16/lib/kohana/system/libraries/drivers/Cache/Sqlite.php0000664000000000000000000001363311662503006024335 0ustar rootrootdb = new SQLiteDatabase($filename, '0666', $error); // Throw an exception if there's an error if ( ! empty($error)) throw new Kohana_Exception('cache.driver_error', sqlite_error_string($error)); $query = "SELECT name FROM sqlite_master WHERE type = 'table' AND name = 'caches'"; $tables = $this->db->query($query, SQLITE_BOTH, $error); // Throw an exception if there's an error if ( ! empty($error)) throw new Kohana_Exception('cache.driver_error', sqlite_error_string($error)); if ($tables->numRows() == 0) { Kohana::log('error', 'Cache: Initializing new SQLite cache database'); // Issue a CREATE TABLE command $this->db->unbufferedQuery(Kohana::config('cache_sqlite.schema')); } } /** * Checks if a cache id is already set. * * @param string cache id * @return boolean */ public function exists($id) { // Find the id that matches $query = "SELECT id FROM caches WHERE id = '$id'"; return ($this->db->query($query)->numRows() > 0); } /** * Sets a cache item to the given data, tags, and lifetime. * * @param string cache id to set * @param string data in the cache * @param array cache tags * @param integer lifetime * @return bool */ public function set($id, $data, array $tags = NULL, $lifetime) { // Serialize and escape the data $data = sqlite_escape_string(serialize($data)); if ( ! empty($tags)) { // Escape the tags, adding brackets so the tag can be explicitly matched $tags = sqlite_escape_string('<'.implode('>,<', $tags).'>'); } // Cache Sqlite driver expects unix timestamp if ($lifetime !== 0) { $lifetime += time(); } $query = $this->exists($id) ? "UPDATE caches SET tags = '$tags', expiration = '$lifetime', cache = '$data' WHERE id = '$id'" : "INSERT INTO caches VALUES('$id', '$tags', '$lifetime', '$data')"; // Run the query $this->db->unbufferedQuery($query, SQLITE_BOTH, $error); if ( ! empty($error)) { self::log_error($error); return FALSE; } else { return TRUE; } } /** * Finds an array of ids for a given tag. * * @param string tag name * @return array of ids that match the tag */ public function find($tag) { $query = "SELECT id,cache FROM caches WHERE tags LIKE '%<{$tag}>%'"; $query = $this->db->query($query, SQLITE_BOTH, $error); // An array will always be returned $result = array(); if ( ! empty($error)) { self::log_error($error); } elseif ($query->numRows() > 0) { // Disable notices for unserializing $ER = error_reporting(~E_NOTICE); while ($row = $query->fetchObject()) { // Add each cache to the array $result[$row->id] = unserialize($row->cache); } // Turn notices back on error_reporting($ER); } return $result; } /** * Fetches a cache item. This will delete the item if it is expired or if * the hash does not match the stored hash. * * @param string cache id * @return mixed|NULL */ public function get($id) { $query = "SELECT id, expiration, cache FROM caches WHERE id = '$id' LIMIT 0, 1"; $query = $this->db->query($query, SQLITE_BOTH, $error); if ( ! empty($error)) { self::log_error($error); } elseif ($cache = $query->fetchObject()) { // Make sure the expiration is valid and that the hash matches if ($cache->expiration != 0 AND $cache->expiration <= time()) { // Cache is not valid, delete it now $this->delete($cache->id); } else { // Disable notices for unserializing $ER = error_reporting(~E_NOTICE); // Return the valid cache data $data = $cache->cache; // Turn notices back on error_reporting($ER); } } // No valid cache found return NULL; } /** * Deletes a cache item by id or tag * * @param string cache id or tag, or TRUE for "all items" * @param bool delete a tag * @return bool */ public function delete($id, $tag = FALSE) { if ($id === TRUE) { // Delete all caches $where = '1'; } elseif ($tag === TRUE) { // Delete by tag $where = "tags LIKE '%<{$id}>%'"; } else { // Delete by id $where = "id = '$id'"; } $this->db->unbufferedQuery('DELETE FROM caches WHERE '.$where, SQLITE_BOTH, $error); if ( ! empty($error)) { self::log_error($error); return FALSE; } else { return TRUE; } } /** * Deletes all cache files that are older than the current time. */ public function delete_expired() { // Delete all expired caches $query = 'DELETE FROM caches WHERE expiration != 0 AND expiration <= '.time(); $this->db->unbufferedQuery($query); return TRUE; } } // End Cache SQLite Driverpnp4nagios-0.6.16/lib/kohana/system/libraries/drivers/Image.php0000664000000000000000000000673111662503006023114 0ustar rootroot $args) { if ( ! $this->$func($args)) return FALSE; } return TRUE; } /** * Sanitize and normalize a geometry array based on the temporary image * width and height. Valid properties are: width, height, top, left. * * @param array geometry properties * @return void */ protected function sanitize_geometry( & $geometry) { list($width, $height) = $this->properties(); // Turn off error reporting $reporting = error_reporting(0); // Width and height cannot exceed current image size $geometry['width'] = min($geometry['width'], $width); $geometry['height'] = min($geometry['height'], $height); // Set standard coordinates if given, otherwise use pixel values if ($geometry['top'] === 'center') { $geometry['top'] = floor(($height / 2) - ($geometry['height'] / 2)); } elseif ($geometry['top'] === 'top') { $geometry['top'] = 0; } elseif ($geometry['top'] === 'bottom') { $geometry['top'] = $height - $geometry['height']; } // Set standard coordinates if given, otherwise use pixel values if ($geometry['left'] === 'center') { $geometry['left'] = floor(($width / 2) - ($geometry['width'] / 2)); } elseif ($geometry['left'] === 'left') { $geometry['left'] = 0; } elseif ($geometry['left'] === 'right') { $geometry['left'] = $width - $geometry['height']; } // Restore error reporting error_reporting($reporting); } /** * Return the current width and height of the temporary image. This is mainly * needed for sanitizing the geometry. * * @return array width, height */ abstract protected function properties(); /** * Process an image with a set of actions. * * @param string image filename * @param array actions to execute * @param string destination directory path * @param string destination filename * @return boolean */ abstract public function process($image, $actions, $dir, $file); /** * Flip an image. Valid directions are horizontal and vertical. * * @param integer direction to flip * @return boolean */ abstract function flip($direction); /** * Crop an image. Valid properties are: width, height, top, left. * * @param array new properties * @return boolean */ abstract function crop($properties); /** * Resize an image. Valid properties are: width, height, and master. * * @param array new properties * @return boolean */ abstract public function resize($properties); /** * Rotate an image. Valid amounts are -180 to 180. * * @param integer amount to rotate * @return boolean */ abstract public function rotate($amount); /** * Sharpen and image. Valid amounts are 1 to 100. * * @param integer amount to sharpen * @return boolean */ abstract public function sharpen($amount); } // End Image Driverpnp4nagios-0.6.16/lib/kohana/system/libraries/drivers/Session.php0000664000000000000000000000233511662503006023511 0ustar rootrootimage = $image; // Create the GD image resource $this->tmp_image = $create($image['file']); // Get the quality setting from the actions $quality = arr::remove('quality', $actions); if ($status = $this->execute($actions)) { // Prevent the alpha from being lost imagealphablending($this->tmp_image, TRUE); imagesavealpha($this->tmp_image, TRUE); switch ($save) { case 'imagejpeg': // Default the quality to 95 ($quality === NULL) and $quality = 95; break; case 'imagegif': // Remove the quality setting, GIF doesn't use it unset($quality); break; case 'imagepng': // Always use a compression level of 9 for PNGs. This does not // affect quality, it only increases the level of compression! $quality = 9; break; } if ($render === FALSE) { // Set the status to the save return value, saving with the quality requested $status = isset($quality) ? $save($this->tmp_image, $dir.$file, $quality) : $save($this->tmp_image, $dir.$file); } else { // Output the image directly to the browser switch ($save) { case 'imagejpeg': header('Content-Type: image/jpeg'); break; case 'imagegif': header('Content-Type: image/gif'); break; case 'imagepng': header('Content-Type: image/png'); break; } $status = isset($quality) ? $save($this->tmp_image, NULL, $quality) : $save($this->tmp_image); } // Destroy the temporary image imagedestroy($this->tmp_image); } return $status; } public function flip($direction) { // Get the current width and height $width = imagesx($this->tmp_image); $height = imagesy($this->tmp_image); // Create the flipped image $flipped = $this->imagecreatetransparent($width, $height); if ($direction === Image::HORIZONTAL) { for ($x = 0; $x < $width; $x++) { $status = imagecopy($flipped, $this->tmp_image, $x, 0, $width - $x - 1, 0, 1, $height); } } elseif ($direction === Image::VERTICAL) { for ($y = 0; $y < $height; $y++) { $status = imagecopy($flipped, $this->tmp_image, 0, $y, 0, $height - $y - 1, $width, 1); } } else { // Do nothing return TRUE; } if ($status === TRUE) { // Swap the new image for the old one imagedestroy($this->tmp_image); $this->tmp_image = $flipped; } return $status; } public function crop($properties) { // Sanitize the cropping settings $this->sanitize_geometry($properties); // Get the current width and height $width = imagesx($this->tmp_image); $height = imagesy($this->tmp_image); // Create the temporary image to copy to $img = $this->imagecreatetransparent($properties['width'], $properties['height']); // Execute the crop if ($status = imagecopyresampled($img, $this->tmp_image, 0, 0, $properties['left'], $properties['top'], $width, $height, $width, $height)) { // Swap the new image for the old one imagedestroy($this->tmp_image); $this->tmp_image = $img; } return $status; } public function resize($properties) { // Get the current width and height $width = imagesx($this->tmp_image); $height = imagesy($this->tmp_image); if (substr($properties['width'], -1) === '%') { // Recalculate the percentage to a pixel size $properties['width'] = round($width * (substr($properties['width'], 0, -1) / 100)); } if (substr($properties['height'], -1) === '%') { // Recalculate the percentage to a pixel size $properties['height'] = round($height * (substr($properties['height'], 0, -1) / 100)); } // Recalculate the width and height, if they are missing empty($properties['width']) and $properties['width'] = round($width * $properties['height'] / $height); empty($properties['height']) and $properties['height'] = round($height * $properties['width'] / $width); if ($properties['master'] === Image::AUTO) { // Change an automatic master dim to the correct type $properties['master'] = (($width / $properties['width']) > ($height / $properties['height'])) ? Image::WIDTH : Image::HEIGHT; } if (empty($properties['height']) OR $properties['master'] === Image::WIDTH) { // Recalculate the height based on the width $properties['height'] = round($height * $properties['width'] / $width); } if (empty($properties['width']) OR $properties['master'] === Image::HEIGHT) { // Recalculate the width based on the height $properties['width'] = round($width * $properties['height'] / $height); } // Test if we can do a resize without resampling to speed up the final resize if ($properties['width'] > $width / 2 AND $properties['height'] > $height / 2) { // Presize width and height $pre_width = $width; $pre_height = $height; // The maximum reduction is 10% greater than the final size $max_reduction_width = round($properties['width'] * 1.1); $max_reduction_height = round($properties['height'] * 1.1); // Reduce the size using an O(2n) algorithm, until it reaches the maximum reduction while ($pre_width / 2 > $max_reduction_width AND $pre_height / 2 > $max_reduction_height) { $pre_width /= 2; $pre_height /= 2; } // Create the temporary image to copy to $img = $this->imagecreatetransparent($pre_width, $pre_height); if ($status = imagecopyresized($img, $this->tmp_image, 0, 0, 0, 0, $pre_width, $pre_height, $width, $height)) { // Swap the new image for the old one imagedestroy($this->tmp_image); $this->tmp_image = $img; } // Set the width and height to the presize $width = $pre_width; $height = $pre_height; } // Create the temporary image to copy to $img = $this->imagecreatetransparent($properties['width'], $properties['height']); // Execute the resize if ($status = imagecopyresampled($img, $this->tmp_image, 0, 0, 0, 0, $properties['width'], $properties['height'], $width, $height)) { // Swap the new image for the old one imagedestroy($this->tmp_image); $this->tmp_image = $img; } return $status; } public function rotate($amount) { // Use current image to rotate $img = $this->tmp_image; // White, with an alpha of 0 $transparent = imagecolorallocatealpha($img, 255, 255, 255, 127); // Rotate, setting the transparent color $img = imagerotate($img, 360 - $amount, $transparent, -1); // Fill the background with the transparent "color" imagecolortransparent($img, $transparent); // Merge the images if ($status = imagecopymerge($this->tmp_image, $img, 0, 0, 0, 0, imagesx($this->tmp_image), imagesy($this->tmp_image), 100)) { // Prevent the alpha from being lost imagealphablending($img, TRUE); imagesavealpha($img, TRUE); // Swap the new image for the old one imagedestroy($this->tmp_image); $this->tmp_image = $img; } return $status; } public function sharpen($amount) { // Make sure that the sharpening function is available if ( ! function_exists('imageconvolution')) throw new Kohana_Exception('image.unsupported_method', __FUNCTION__); // Amount should be in the range of 18-10 $amount = round(abs(-18 + ($amount * 0.08)), 2); // Gaussian blur matrix $matrix = array ( array(-1, -1, -1), array(-1, $amount, -1), array(-1, -1, -1), ); // Perform the sharpen return imageconvolution($this->tmp_image, $matrix, $amount - 8, 0); } protected function properties() { return array(imagesx($this->tmp_image), imagesy($this->tmp_image)); } /** * Returns an image with a transparent background. Used for rotating to * prevent unfilled backgrounds. * * @param integer image width * @param integer image height * @return resource */ protected function imagecreatetransparent($width, $height) { if (self::$blank_png === NULL) { // Decode the blank PNG if it has not been done already self::$blank_png = imagecreatefromstring(base64_decode ( 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29'. 'mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAADqSURBVHjaYvz//z/DYAYAAcTEMMgBQAANegcCBN'. 'CgdyBAAA16BwIE0KB3IEAADXoHAgTQoHcgQAANegcCBNCgdyBAAA16BwIE0KB3IEAADXoHAgTQoHcgQ'. 'AANegcCBNCgdyBAAA16BwIE0KB3IEAADXoHAgTQoHcgQAANegcCBNCgdyBAAA16BwIE0KB3IEAADXoH'. 'AgTQoHcgQAANegcCBNCgdyBAAA16BwIE0KB3IEAADXoHAgTQoHcgQAANegcCBNCgdyBAAA16BwIE0KB'. '3IEAADXoHAgTQoHcgQAANegcCBNCgdyBAgAEAMpcDTTQWJVEAAAAASUVORK5CYII=' )); // Set the blank PNG width and height self::$blank_png_width = imagesx(self::$blank_png); self::$blank_png_height = imagesy(self::$blank_png); } $img = imagecreatetruecolor($width, $height); // Resize the blank image imagecopyresized($img, self::$blank_png, 0, 0, 0, 0, $width, $height, self::$blank_png_width, self::$blank_png_height); // Prevent the alpha from being lost imagealphablending($img, FALSE); imagesavealpha($img, TRUE); return $img; } } // End Image GD Driverpnp4nagios-0.6.16/lib/kohana/system/libraries/drivers/Image/ImageMagick.php0000664000000000000000000001327711662503006025255 0ustar rootrootext = (PHP_SHLIB_SUFFIX === 'dll') ? '.exe' : ''; // Check to make sure the provided path is correct if ( ! is_file(realpath($config['directory']).'/convert'.$this->ext)) throw new Kohana_Exception('image.imagemagick.not_found', 'convert'.$this->ext); // Set the installation directory $this->dir = str_replace('\\', '/', realpath($config['directory'])).'/'; } /** * Creates a temporary image and executes the given actions. By creating a * temporary copy of the image before manipulating it, this process is atomic. */ public function process($image, $actions, $dir, $file, $render = FALSE) { // We only need the filename $image = $image['file']; // Unique temporary filename $this->tmp_image = $dir.'k2img--'.sha1(time().$dir.$file).substr($file, strrpos($file, '.')); // Copy the image to the temporary file copy($image, $this->tmp_image); // Quality change is done last $quality = (int) arr::remove('quality', $actions); // Use 95 for the default quality empty($quality) and $quality = 95; // All calls to these will need to be escaped, so do it now $this->cmd_image = escapeshellarg($this->tmp_image); $this->new_image = ($render)? $this->cmd_image : escapeshellarg($dir.$file); if ($status = $this->execute($actions)) { // Use convert to change the image into its final version. This is // done to allow the file type to change correctly, and to handle // the quality conversion in the most effective way possible. if ($error = exec(escapeshellcmd($this->dir.'convert'.$this->ext).' -quality '.$quality.'% '.$this->cmd_image.' '.$this->new_image)) { $this->errors[] = $error; } else { // Output the image directly to the browser if ($render !== FALSE) { $contents = file_get_contents($this->tmp_image); switch (substr($file, strrpos($file, '.') + 1)) { case 'jpg': case 'jpeg': header('Content-Type: image/jpeg'); break; case 'gif': header('Content-Type: image/gif'); break; case 'png': header('Content-Type: image/png'); break; } echo $contents; } } } // Remove the temporary image unlink($this->tmp_image); $this->tmp_image = ''; return $status; } public function crop($prop) { // Sanitize and normalize the properties into geometry $this->sanitize_geometry($prop); // Set the IM geometry based on the properties $geometry = escapeshellarg($prop['width'].'x'.$prop['height'].'+'.$prop['left'].'+'.$prop['top']); if ($error = exec(escapeshellcmd($this->dir.'convert'.$this->ext).' -crop '.$geometry.' '.$this->cmd_image.' '.$this->cmd_image)) { $this->errors[] = $error; return FALSE; } return TRUE; } public function flip($dir) { // Convert the direction into a IM command $dir = ($dir === Image::HORIZONTAL) ? '-flop' : '-flip'; if ($error = exec(escapeshellcmd($this->dir.'convert'.$this->ext).' '.$dir.' '.$this->cmd_image.' '.$this->cmd_image)) { $this->errors[] = $error; return FALSE; } return TRUE; } public function resize($prop) { switch ($prop['master']) { case Image::WIDTH: // Wx $dim = escapeshellarg($prop['width'].'x'); break; case Image::HEIGHT: // xH $dim = escapeshellarg('x'.$prop['height']); break; case Image::AUTO: // WxH $dim = escapeshellarg($prop['width'].'x'.$prop['height']); break; case Image::NONE: // WxH! $dim = escapeshellarg($prop['width'].'x'.$prop['height'].'!'); break; } // Use "convert" to change the width and height if ($error = exec(escapeshellcmd($this->dir.'convert'.$this->ext).' -resize '.$dim.' '.$this->cmd_image.' '.$this->cmd_image)) { $this->errors[] = $error; return FALSE; } return TRUE; } public function rotate($amt) { if ($error = exec(escapeshellcmd($this->dir.'convert'.$this->ext).' -rotate '.escapeshellarg($amt).' -background transparent '.$this->cmd_image.' '.$this->cmd_image)) { $this->errors[] = $error; return FALSE; } return TRUE; } public function sharpen($amount) { // Set the sigma, radius, and amount. The amount formula allows a nice // spread between 1 and 100 without pixelizing the image badly. $sigma = 0.5; $radius = $sigma * 2; $amount = round(($amount / 80) * 3.14, 2); // Convert the amount to an IM command $sharpen = escapeshellarg($radius.'x'.$sigma.'+'.$amount.'+0'); if ($error = exec(escapeshellcmd($this->dir.'convert'.$this->ext).' -unsharp '.$sharpen.' '.$this->cmd_image.' '.$this->cmd_image)) { $this->errors[] = $error; return FALSE; } return TRUE; } protected function properties() { return array_slice(getimagesize($this->tmp_image), 0, 2, FALSE); } } // End Image ImageMagick Driverpnp4nagios-0.6.16/lib/kohana/system/libraries/drivers/Image/GraphicsMagick.php0000664000000000000000000001325111662503006025763 0ustar rootrootext = (PHP_SHLIB_SUFFIX === 'dll') ? '.exe' : ''; // Check to make sure the provided path is correct if ( ! is_file(realpath($config['directory']).'/gm'.$this->ext)) throw new Kohana_Exception('image.graphicsmagick.not_found', 'gm'.$this->ext); // Set the installation directory $this->dir = str_replace('\\', '/', realpath($config['directory'])).'/'; } /** * Creates a temporary image and executes the given actions. By creating a * temporary copy of the image before manipulating it, this process is atomic. */ public function process($image, $actions, $dir, $file, $render = FALSE) { // We only need the filename $image = $image['file']; // Unique temporary filename $this->tmp_image = $dir.'k2img--'.sha1(time().$dir.$file).substr($file, strrpos($file, '.')); // Copy the image to the temporary file copy($image, $this->tmp_image); // Quality change is done last $quality = (int) arr::remove('quality', $actions); // Use 95 for the default quality empty($quality) and $quality = 95; // All calls to these will need to be escaped, so do it now $this->cmd_image = escapeshellarg($this->tmp_image); $this->new_image = ($render)? $this->cmd_image : escapeshellarg($dir.$file); if ($status = $this->execute($actions)) { // Use convert to change the image into its final version. This is // done to allow the file type to change correctly, and to handle // the quality conversion in the most effective way possible. if ($error = exec(escapeshellcmd($this->dir.'gm'.$this->ext.' convert').' -quality '.$quality.'% '.$this->cmd_image.' '.$this->new_image)) { $this->errors[] = $error; } else { // Output the image directly to the browser if ($render !== FALSE) { $contents = file_get_contents($this->tmp_image); switch (substr($file, strrpos($file, '.') + 1)) { case 'jpg': case 'jpeg': header('Content-Type: image/jpeg'); break; case 'gif': header('Content-Type: image/gif'); break; case 'png': header('Content-Type: image/png'); break; } echo $contents; } } } // Remove the temporary image unlink($this->tmp_image); $this->tmp_image = ''; return $status; } public function crop($prop) { // Sanitize and normalize the properties into geometry $this->sanitize_geometry($prop); // Set the IM geometry based on the properties $geometry = escapeshellarg($prop['width'].'x'.$prop['height'].'+'.$prop['left'].'+'.$prop['top']); if ($error = exec(escapeshellcmd($this->dir.'gm'.$this->ext.' convert').' -crop '.$geometry.' '.$this->cmd_image.' '.$this->cmd_image)) { $this->errors[] = $error; return FALSE; } return TRUE; } public function flip($dir) { // Convert the direction into a GM command $dir = ($dir === Image::HORIZONTAL) ? '-flop' : '-flip'; if ($error = exec(escapeshellcmd($this->dir.'gm'.$this->ext.' convert').' '.$dir.' '.$this->cmd_image.' '.$this->cmd_image)) { $this->errors[] = $error; return FALSE; } return TRUE; } public function resize($prop) { switch ($prop['master']) { case Image::WIDTH: // Wx $dim = escapeshellarg($prop['width'].'x'); break; case Image::HEIGHT: // xH $dim = escapeshellarg('x'.$prop['height']); break; case Image::AUTO: // WxH $dim = escapeshellarg($prop['width'].'x'.$prop['height']); break; case Image::NONE: // WxH! $dim = escapeshellarg($prop['width'].'x'.$prop['height'].'!'); break; } // Use "convert" to change the width and height if ($error = exec(escapeshellcmd($this->dir.'gm'.$this->ext.' convert').' -resize '.$dim.' '.$this->cmd_image.' '.$this->cmd_image)) { $this->errors[] = $error; return FALSE; } return TRUE; } public function rotate($amt) { if ($error = exec(escapeshellcmd($this->dir.'gm'.$this->ext.' convert').' -rotate '.escapeshellarg($amt).' -background transparent '.$this->cmd_image.' '.$this->cmd_image)) { $this->errors[] = $error; return FALSE; } return TRUE; } public function sharpen($amount) { // Set the sigma, radius, and amount. The amount formula allows a nice // spread between 1 and 100 without pixelizing the image badly. $sigma = 0.5; $radius = $sigma * 2; $amount = round(($amount / 80) * 3.14, 2); // Convert the amount to an GM command $sharpen = escapeshellarg($radius.'x'.$sigma.'+'.$amount.'+0'); if ($error = exec(escapeshellcmd($this->dir.'gm'.$this->ext.' convert').' -unsharp '.$sharpen.' '.$this->cmd_image.' '.$this->cmd_image)) { $this->errors[] = $error; return FALSE; } return TRUE; } protected function properties() { return array_slice(getimagesize($this->tmp_image), 0, 2, FALSE); } } // End Image GraphicsMagick Driverpnp4nagios-0.6.16/lib/kohana/system/libraries/drivers/Cache.php0000664000000000000000000000145511662503006023073 0ustar rootrootinitialize($config); Kohana::log('debug', 'Pagination Library initialized'); } /** * Sets config values. * * @throws Kohana_Exception * @param array configuration settings * @return void */ public function initialize($config = array()) { // Load config group if (isset($config['group'])) { // Load and validate config group if ( ! is_array($group_config = Kohana::config('pagination.'.$config['group']))) throw new Kohana_Exception('pagination.undefined_group', $config['group']); // All pagination config groups inherit default config group if ($config['group'] !== 'default') { // Load and validate default config group if ( ! is_array($default_config = Kohana::config('pagination.default'))) throw new Kohana_Exception('pagination.undefined_group', 'default'); // Merge config group with default config group $group_config += $default_config; } // Merge custom config items with config group $config += $group_config; } // Assign config values to the object foreach ($config as $key => $value) { if (property_exists($this, $key)) { $this->$key = $value; } } // Clean view directory $this->directory = trim($this->directory, '/').'/'; // Build generic URL with page in query string if ($this->query_string !== '') { // Extract current page $this->current_page = isset($_GET[$this->query_string]) ? (int) $_GET[$this->query_string] : 1; // Insert {page} placeholder $_GET[$this->query_string] = '{page}'; // Create full URL $base_url = ($this->base_url === '') ? Router::$current_uri : $this->base_url; $this->url = url::site($base_url).'?'.str_replace('%7Bpage%7D', '{page}', http_build_query($_GET)); // Reset page number $_GET[$this->query_string] = $this->current_page; } // Build generic URL with page as URI segment else { // Use current URI if no base_url set $this->url = ($this->base_url === '') ? Router::$segments : explode('/', trim($this->base_url, '/')); // Convert uri 'label' to corresponding integer if needed if (is_string($this->uri_segment)) { if (($key = array_search($this->uri_segment, $this->url)) === FALSE) { // If uri 'label' is not found, auto add it to base_url $this->url[] = $this->uri_segment; $this->uri_segment = count($this->url) + 1; } else { $this->uri_segment = $key + 2; } } // Insert {page} placeholder $this->url[$this->uri_segment - 1] = '{page}'; // Create full URL $this->url = url::site(implode('/', $this->url)).Router::$query_string; // Extract current page $this->current_page = URI::instance()->segment($this->uri_segment); } // Core pagination values $this->total_items = (int) max(0, $this->total_items); $this->items_per_page = (int) max(1, $this->items_per_page); $this->total_pages = (int) ceil($this->total_items / $this->items_per_page); $this->current_page = (int) min(max(1, $this->current_page), max(1, $this->total_pages)); $this->current_first_item = (int) min((($this->current_page - 1) * $this->items_per_page) + 1, $this->total_items); $this->current_last_item = (int) min($this->current_first_item + $this->items_per_page - 1, $this->total_items); // If there is no first/last/previous/next page, relative to the // current page, value is set to FALSE. Valid page number otherwise. $this->first_page = ($this->current_page === 1) ? FALSE : 1; $this->last_page = ($this->current_page >= $this->total_pages) ? FALSE : $this->total_pages; $this->previous_page = ($this->current_page > 1) ? $this->current_page - 1 : FALSE; $this->next_page = ($this->current_page < $this->total_pages) ? $this->current_page + 1 : FALSE; // SQL values $this->sql_offset = (int) ($this->current_page - 1) * $this->items_per_page; $this->sql_limit = sprintf(' LIMIT %d OFFSET %d ', $this->items_per_page, $this->sql_offset); } /** * Generates the HTML for the chosen pagination style. * * @param string pagination style * @return string pagination html */ public function render($style = NULL) { // Hide single page pagination if ($this->auto_hide === TRUE AND $this->total_pages <= 1) return ''; if ($style === NULL) { // Use default style $style = $this->style; } // Return rendered pagination view return View::factory($this->directory.$style, get_object_vars($this))->render(); } /** * Magically converts Pagination object to string. * * @return string pagination html */ public function __toString() { return $this->render(); } /** * Magically gets a pagination variable. * * @param string variable key * @return mixed variable value if the key is found * @return void if the key is not found */ public function __get($key) { if (isset($this->$key)) return $this->$key; } /** * Adds a secondary interface for accessing properties, e.g. $pagination->total_pages(). * Note that $pagination->total_pages is the recommended way to access properties. * * @param string function name * @return string */ public function __call($func, $args = NULL) { return $this->__get($func); } } // End Pagination Classpnp4nagios-0.6.16/lib/kohana/system/libraries/Cache.php0000664000000000000000000001136711662503006021420 0ustar rootrootconfig = $config; // Set driver name $driver = 'Cache_'.ucfirst($this->config['driver']).'_Driver'; // Load the driver if ( ! Kohana::auto_load($driver)) throw new Kohana_Exception('core.driver_not_found', $this->config['driver'], get_class($this)); // Initialize the driver $this->driver = new $driver($this->config['params']); // Validate the driver if ( ! ($this->driver instanceof Cache_Driver)) throw new Kohana_Exception('core.driver_implements', $this->config['driver'], get_class($this), 'Cache_Driver'); Kohana::log('debug', 'Cache Library initialized'); if (Cache::$loaded !== TRUE) { $this->config['requests'] = (int) $this->config['requests']; if ($this->config['requests'] > 0 AND mt_rand(1, $this->config['requests']) === 1) { // Do garbage collection $this->driver->delete_expired(); Kohana::log('debug', 'Cache: Expired caches deleted.'); } // Cache has been loaded once Cache::$loaded = TRUE; } } /** * Fetches a cache by id. NULL is returned when a cache item is not found. * * @param string cache id * @return mixed cached data or NULL */ public function get($id) { // Sanitize the ID $id = $this->sanitize_id($id); return $this->driver->get($id); } /** * Fetches all of the caches for a given tag. An empty array will be * returned when no matching caches are found. * * @param string cache tag * @return array all cache items matching the tag */ public function find($tag) { return $this->driver->find($tag); } /** * Set a cache item by id. Tags may also be added and a custom lifetime * can be set. Non-string data is automatically serialized. * * @param string unique cache id * @param mixed data to cache * @param array|string tags for this item * @param integer number of seconds until the cache expires * @return boolean */ function set($id, $data, $tags = NULL, $lifetime = NULL) { if (is_resource($data)) throw new Kohana_Exception('cache.resources'); // Sanitize the ID $id = $this->sanitize_id($id); if ($lifetime === NULL) { // Get the default lifetime $lifetime = $this->config['lifetime']; } return $this->driver->set($id, $data, (array) $tags, $lifetime); } /** * Delete a cache item by id. * * @param string cache id * @return boolean */ public function delete($id) { // Sanitize the ID $id = $this->sanitize_id($id); return $this->driver->delete($id); } /** * Delete all cache items with a given tag. * * @param string cache tag name * @return boolean */ public function delete_tag($tag) { return $this->driver->delete($tag, TRUE); } /** * Delete ALL cache items items. * * @return boolean */ public function delete_all() { return $this->driver->delete(TRUE); } /** * Replaces troublesome characters with underscores. * * @param string cache id * @return string */ protected function sanitize_id($id) { // Change slashes and spaces to underscores return str_replace(array('/', '\\', ' '), '_', $id); } } // End Cache pnp4nagios-0.6.16/lib/kohana/system/libraries/Controller.php0000664000000000000000000000371411662503006022535 0ustar rootrooturi = URI::instance(); // Input should always be available $this->input = Input::instance(); } /** * Handles methods that do not exist. * * @param string method name * @param array arguments * @return void */ public function __call($method, $args) { // Default to showing a 404 page Event::run('system.404'); } /** * Includes a View within the controller scope. * * @param string view filename * @param array array of view variables * @return string */ public function _kohana_load_view($kohana_view_filename, $kohana_input_data) { if ($kohana_view_filename == '') return; // Buffering on ob_start(); // Import the view variables to local namespace extract($kohana_input_data, EXTR_SKIP); // Views are straight HTML pages with embedded PHP, so importing them // this way insures that $this can be accessed as if the user was in // the controller, which gives the easiest access to libraries in views try { include $kohana_view_filename; } catch (Exception $e) { ob_end_clean(); throw $e; } // Fetch the output and close the buffer return ob_get_clean(); } } // End Controller Classpnp4nagios-0.6.16/lib/kohana/system/views/0000775000000000000000000000000011662503006017055 5ustar rootrootpnp4nagios-0.6.16/lib/kohana/system/views/pagination/0000775000000000000000000000000011662503006021206 5ustar rootrootpnp4nagios-0.6.16/lib/kohana/system/views/pagination/extended.php0000664000000000000000000000206211662503006023517 0ustar rootroot

    «  «  | | |  »  »

    pnp4nagios-0.6.16/lib/kohana/system/views/pagination/digg.php0000664000000000000000000000556211662503006022641 0ustar rootroot

    «  «  $total_pages - 8): /* « Previous 1 2 … 17 18 19 20 21 22 23 24 25 26 Next » */ ?> 1 2 1 2  »  »

    pnp4nagios-0.6.16/lib/kohana/system/views/pagination/classic.php0000664000000000000000000000200111662503006023331 0ustar rootroot Last › */ ?>

    ‹  < >  ›

    pnp4nagios-0.6.16/lib/kohana/system/views/pagination/punbb.php0000664000000000000000000000171311662503006023027 0ustar rootroot

    : 3): ?> 1 $total_pages) continue ?>

    pnp4nagios-0.6.16/lib/kohana/system/views/kohana_errors.css0000664000000000000000000000245311662503006022430 0ustar rootrootdiv#framework_error { background:#fff; border:solid 1px #ccc; font-family:sans-serif; color:#111; font-size:14px; line-height:130%; } div#framework_error h3 { color:#fff; font-size:16px; padding:8px 6px; margin:0 0 8px; background:#f15a00; text-align:center; } div#framework_error a { color:#228; text-decoration:none; } div#framework_error a:hover { text-decoration:underline; } div#framework_error strong { color:#900; } div#framework_error p { margin:0; padding:4px 6px 10px; } div#framework_error tt, div#framework_error pre, div#framework_error code { font-family:monospace; padding:2px 4px; font-size:12px; color:#333; white-space:pre-wrap; /* CSS 2.1 */ white-space:-moz-pre-wrap; /* For Mozilla */ word-wrap:break-word; /* For IE5.5+ */ } div#framework_error tt { font-style:italic; } div#framework_error tt:before { content:">"; color:#aaa; } div#framework_error code tt:before { content:""; } div#framework_error pre, div#framework_error code { background:#eaeee5; border:solid 0 #D6D8D1; border-width:0 1px 1px 0; } div#framework_error .block { display:block; text-align:left; } div#framework_error .stats { padding:4px; background: #eee; border-top:solid 1px #ccc; text-align:center; font-size:10px; color:#888; } div#framework_error .backtrace { margin:0; padding:0 6px; list-style:none; line-height:12px; }pnp4nagios-0.6.16/lib/kohana/system/views/kohana_profiler_table.php0000664000000000000000000000141511662503006024101 0ustar rootroot > $column) { $class = empty($column['class']) ? '' : ' class="'.$column['class'].'"'; $style = empty($column['style']) ? '' : ' style="'.$column['style'].'"'; $value = $row['data'][$index]; $value = (is_array($value) OR is_object($value)) ? '
    '.html::specialchars(print_r($value, TRUE)).'
    ' : html::specialchars($value); echo '', $value, ''; } ?>
    pnp4nagios-0.6.16/lib/kohana/system/views/kohana/0000775000000000000000000000000011662503006020316 5ustar rootrootpnp4nagios-0.6.16/lib/kohana/system/views/kohana/template.php0000664000000000000000000000267511662503006022654 0ustar rootroot <?php echo html::specialchars($title) ?>

    pnp4nagios-0.6.16/lib/kohana/system/views/kohana_calendar.php0000664000000000000000000000300311662503006022654 0ustar rootroot date('n', $prev), 'year' => date('Y', $prev)))); $next = Router::$current_uri.'?'.http_build_query(array_merge($qs, array('month' => date('n', $next), 'year' => date('Y', $next)))); ?>
  • '.implode('
  • ', $data['output']).'
  • '; } else { $classes = array(); $output = ''; } ?>
    pnp4nagios-0.6.16/lib/kohana/system/views/kohana_profiler.php0000664000000000000000000000130411662503006022727 0ustar rootroot
    render(); } ?>

    Profiler executed in s

    pnp4nagios-0.6.16/lib/kohana/system/views/kohana_error_disabled.php0000664000000000000000000000123611662503006024071 0ustar rootroot <?php echo $error ?>

    pnp4nagios-0.6.16/lib/kohana/system/views/kohana_profiler_table.css0000664000000000000000000000221111662503006024075 0ustar rootroot#kohana-profiler .kp-table { font-size: 1.0em; color: #4D6171; width: 100%; border-collapse: collapse; border-top: 1px solid #E5EFF8; border-right: 1px solid #E5EFF8; border-left: 1px solid #E5EFF8; margin-bottom: 10px; } #kohana-profiler .kp-table td { background-color: #FFFFFF; border-bottom: 1px solid #E5EFF8; padding: 3px; vertical-align: top; } #kohana-profiler .kp-table .kp-title td { font-weight: bold; background-color: inherit; } #kohana-profiler .kp-table .kp-altrow td { background-color: #F7FBFF; } #kohana-profiler .kp-table .kp-totalrow td { background-color: #FAFAFA; border-top: 1px solid #D2DCE5; font-weight: bold; } #kohana-profiler .kp-table .kp-column { width: 100px; border-left: 1px solid #E5EFF8; text-align: center; } #kohana-profiler .kp-table .kp-data, #kohana-profiler .kp-table .kp-name { background-color: #FAFAFB; vertical-align: top; } #kohana-profiler .kp-table .kp-name { width: 200px; border-right: 1px solid #E5EFF8; } #kohana-profiler .kp-table .kp-altrow .kp-data, #kohana-profiler .kp-table .kp-altrow .kp-name { background-color: #F6F8FB; }pnp4nagios-0.6.16/lib/kohana/system/views/kohana_error_page.php0000664000000000000000000000207711662503006023242 0ustar rootroot <?php echo $error ?>

    pnp4nagios-0.6.16/lib/kohana/system/core/0000775000000000000000000000000011662503006016650 5ustar rootrootpnp4nagios-0.6.16/lib/kohana/system/core/Kohana.php0000664000000000000000000012237311662503006020572 0ustar rootroot 1, 'alert' => 2, 'info' => 3, 'debug' => 4, ); // Internal caches and write status private static $internal_cache = array(); private static $write_cache; private static $internal_cache_path; private static $internal_cache_key; private static $internal_cache_encrypt; /** * Sets up the PHP environment. Adds error/exception handling, output * buffering, and adds an auto-loading method for loading classes. * * This method is run immediately when this file is loaded, and is * benchmarked as environment_setup. * * For security, this function also destroys the $_REQUEST global variable. * Using the proper global (GET, POST, COOKIE, etc) is inherently more secure. * The recommended way to fetch a global variable is using the Input library. * @see http://www.php.net/globals * * @return void */ public static function setup() { static $run; // This function can only be run once if ($run === TRUE) return; // Start the environment setup benchmark Benchmark::start(SYSTEM_BENCHMARK.'_environment_setup'); // Define Kohana error constant define('E_KOHANA', 42); // Define 404 error constant define('E_PAGE_NOT_FOUND', 43); // Define database error constant define('E_DATABASE_ERROR', 44); if (self::$cache_lifetime = self::config('core.internal_cache')) { // Are we using encryption for caches? self::$internal_cache_encrypt = self::config('core.internal_cache_encrypt'); if(self::$internal_cache_encrypt===TRUE) { self::$internal_cache_key = self::config('core.internal_cache_key'); // Be sure the key is of acceptable length for the mcrypt algorithm used self::$internal_cache_key = substr(self::$internal_cache_key, 0, 24); } // Set the directory to be used for the internal cache if ( ! self::$internal_cache_path = self::config('core.internal_cache_path')) { self::$internal_cache_path = APPPATH.'cache/'; } // Load cached configuration and language files self::$internal_cache['configuration'] = self::cache('configuration', self::$cache_lifetime); self::$internal_cache['language'] = self::cache('language', self::$cache_lifetime); // Load cached file paths self::$internal_cache['find_file_paths'] = self::cache('find_file_paths', self::$cache_lifetime); // Enable cache saving Event::add('system.shutdown', array(__CLASS__, 'internal_cache_save')); } // Disable notices and "strict" errors $ER = error_reporting(~E_NOTICE & ~E_STRICT); // Set the user agent self::$user_agent = ( ! empty($_SERVER['HTTP_USER_AGENT']) ? trim($_SERVER['HTTP_USER_AGENT']) : ''); if (function_exists('date_default_timezone_set')) { $timezone = self::config('locale.timezone'); // Set default timezone, due to increased validation of date settings // which cause massive amounts of E_NOTICEs to be generated in PHP 5.2+ date_default_timezone_set(empty($timezone) ? date_default_timezone_get() : $timezone); } // Restore error reporting error_reporting($ER); // Start output buffering ob_start(array(__CLASS__, 'output_buffer')); // Save buffering level self::$buffer_level = ob_get_level(); // Set autoloader spl_autoload_register(array('Kohana', 'auto_load')); // Set error handler set_error_handler(array('Kohana', 'exception_handler')); // Set exception handler set_exception_handler(array('Kohana', 'exception_handler')); // Send default text/html UTF-8 header header('Content-Type: text/html; charset=UTF-8'); // Load locales $locales = self::config('locale.language'); // Make first locale UTF-8 $locales[0] .= '.UTF-8'; // Set locale information self::$locale = setlocale(LC_ALL, $locales); if (self::$configuration['core']['log_threshold'] > 0) { // Set the log directory self::log_directory(self::$configuration['core']['log_directory']); // Enable log writing at shutdown register_shutdown_function(array(__CLASS__, 'log_save')); } // Enable Kohana routing Event::add('system.routing', array('Router', 'find_uri')); Event::add('system.routing', array('Router', 'setup')); // Enable Kohana controller initialization Event::add('system.execute', array('Kohana', 'instance')); // Enable Kohana 404 pages Event::add('system.404', array('Kohana', 'show_404')); // Enable Kohana output handling Event::add('system.shutdown', array('Kohana', 'shutdown')); if (self::config('core.enable_hooks') === TRUE) { // Find all the hook files $hooks = self::list_files('hooks', TRUE); foreach ($hooks as $file) { // Load the hook include $file; } } // Setup is complete, prevent it from being run again $run = TRUE; // Stop the environment setup routine Benchmark::stop(SYSTEM_BENCHMARK.'_environment_setup'); } /** * Loads the controller and initializes it. Runs the pre_controller, * post_controller_constructor, and post_controller events. Triggers * a system.404 event when the route cannot be mapped to a controller. * * This method is benchmarked as controller_setup and controller_execution. * * @return object instance of controller */ public static function & instance() { if (self::$instance === NULL) { Benchmark::start(SYSTEM_BENCHMARK.'_controller_setup'); // Include the Controller file require Router::$controller_path; try { // Start validation of the controller $class = new ReflectionClass(ucfirst(Router::$controller).'_Controller'); } catch (ReflectionException $e) { // Controller does not exist Event::run('system.404'); } if ($class->isAbstract() OR (IN_PRODUCTION AND $class->getConstant('ALLOW_PRODUCTION') == FALSE)) { // Controller is not allowed to run in production Event::run('system.404'); } // Run system.pre_controller Event::run('system.pre_controller'); // Create a new controller instance $controller = $class->newInstance(); // Controller constructor has been executed Event::run('system.post_controller_constructor'); try { // Load the controller method $method = $class->getMethod(Router::$method); // Method exists if (Router::$method[0] === '_') { // Do not allow access to hidden methods Event::run('system.404'); } if ($method->isProtected() or $method->isPrivate()) { // Do not attempt to invoke protected methods throw new ReflectionException('protected controller method'); } // Default arguments $arguments = Router::$arguments; } catch (ReflectionException $e) { // Use __call instead $method = $class->getMethod('__call'); // Use arguments in __call format $arguments = array(Router::$method, Router::$arguments); } // Stop the controller setup benchmark Benchmark::stop(SYSTEM_BENCHMARK.'_controller_setup'); // Start the controller execution benchmark Benchmark::start(SYSTEM_BENCHMARK.'_controller_execution'); // Execute the controller method $method->invokeArgs($controller, $arguments); // Controller method has been executed Event::run('system.post_controller'); // Stop the controller execution benchmark Benchmark::stop(SYSTEM_BENCHMARK.'_controller_execution'); } return self::$instance; } /** * Get all include paths. APPPATH is the first path, followed by module * paths in the order they are configured, follow by the SYSPATH. * * @param boolean re-process the include paths * @return array */ public static function include_paths($process = FALSE) { if ($process === TRUE) { // Add APPPATH as the first path self::$include_paths = array(APPPATH); foreach (self::$configuration['core']['modules'] as $path) { if ($path = str_replace('\\', '/', realpath($path))) { // Add a valid path self::$include_paths[] = $path.'/'; } } // Add SYSPATH as the last path self::$include_paths[] = SYSPATH; } return self::$include_paths; } /** * Get a config item or group. * * @param string item name * @param boolean force a forward slash (/) at the end of the item * @param boolean is the item required? * @return mixed */ public static function config($key, $slash = FALSE, $required = TRUE) { if (self::$configuration === NULL) { // Load core configuration self::$configuration['core'] = self::config_load('core'); // Re-parse the include paths self::include_paths(TRUE); } // Get the group name from the key $group = explode('.', $key, 2); $group = $group[0]; if ( ! isset(self::$configuration[$group])) { // Load the configuration group self::$configuration[$group] = self::config_load($group, $required); } // Get the value of the key string $value = self::key_string(self::$configuration, $key); if ($slash === TRUE AND is_string($value) AND $value !== '') { // Force the value to end with "/" $value = rtrim($value, '/').'/'; } return $value; } /** * Sets a configuration item, if allowed. * * @param string config key string * @param string config value * @return boolean */ public static function config_set($key, $value) { // Do this to make sure that the config array is already loaded self::config($key); if (substr($key, 0, 7) === 'routes.') { // Routes cannot contain sub keys due to possible dots in regex $keys = explode('.', $key, 2); } else { // Convert dot-noted key string to an array $keys = explode('.', $key); } // Used for recursion $conf =& self::$configuration; $last = count($keys) - 1; foreach ($keys as $i => $k) { if ($i === $last) { $conf[$k] = $value; } else { $conf =& $conf[$k]; } } if ($key === 'core.modules') { // Reprocess the include paths self::include_paths(TRUE); } return TRUE; } /** * Load a config file. * * @param string config filename, without extension * @param boolean is the file required? * @return array */ public static function config_load($name, $required = TRUE) { if ($name === 'core') { // Load the application configuration file require APPPATH.'config/config'.EXT; if ( ! isset($config['site_domain'])) { // Invalid config file die('Your Kohana application configuration file is not valid.'); } return $config; } if (isset(self::$internal_cache['configuration'][$name])) return self::$internal_cache['configuration'][$name]; // Load matching configs $configuration = array(); if ($files = self::find_file('config', $name, $required)) { foreach ($files as $file) { require $file; if (isset($config) AND is_array($config)) { // Merge in configuration $configuration = array_merge($configuration, $config); } } } if ( ! isset(self::$write_cache['configuration'])) { // Cache has changed self::$write_cache['configuration'] = TRUE; } return self::$internal_cache['configuration'][$name] = $configuration; } /** * Clears a config group from the cached configuration. * * @param string config group * @return void */ public static function config_clear($group) { // Remove the group from config unset(self::$configuration[$group], self::$internal_cache['configuration'][$group]); if ( ! isset(self::$write_cache['configuration'])) { // Cache has changed self::$write_cache['configuration'] = TRUE; } } /** * Add a new message to the log. * * @param string type of message * @param string message text * @return void */ public static function log($type, $message) { if (self::$log_levels[$type] <= self::$configuration['core']['log_threshold']) { $message = array(date('Y-m-d H:i:s P'), $type, $message); // Run the system.log event Event::run('system.log', $message); self::$log[] = $message; } } /** * Save all currently logged messages. * * @return void */ public static function log_save() { if (empty(self::$log) OR self::$configuration['core']['log_threshold'] < 1) return; // Filename of the log $filename = self::log_directory().date('Y-m-d').'.log'.EXT; if ( ! is_file($filename)) { // Write the SYSPATH checking header file_put_contents($filename, ''.PHP_EOL.PHP_EOL); // Prevent external writes chmod($filename, 0644); } // Messages to write $messages = array(); do { // Load the next mess list ($date, $type, $text) = array_shift(self::$log); // Add a new message line $messages[] = $date.' --- '.$type.': '.$text; } while ( ! empty(self::$log)); // Write messages to log file file_put_contents($filename, implode(PHP_EOL, $messages).PHP_EOL, FILE_APPEND); } /** * Get or set the logging directory. * * @param string new log directory * @return string */ public static function log_directory($dir = NULL) { static $directory; if ( ! empty($dir)) { // Get the directory path $dir = realpath($dir); if (is_dir($dir) AND is_writable($dir)) { // Change the log directory $directory = str_replace('\\', '/', $dir).'/'; } else { // Log directory is invalid throw new Kohana_Exception('core.log_dir_unwritable', $dir); } } return $directory; } /** * Load data from a simple cache file. This should only be used internally, * and is NOT a replacement for the Cache library. * * @param string unique name of cache * @param integer expiration in seconds * @return mixed */ public static function cache($name, $lifetime) { if ($lifetime > 0) { $path = self::$internal_cache_path.'kohana_'.$name; if (is_file($path)) { // Check the file modification time if ((time() - filemtime($path)) < $lifetime) { // Cache is valid! Now, do we need to decrypt it? if(self::$internal_cache_encrypt===TRUE) { $data = file_get_contents($path); $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB); $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); $decrypted_text = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, self::$internal_cache_key, $data, MCRYPT_MODE_ECB, $iv); $cache = unserialize($decrypted_text); // If the key changed, delete the cache file if(!$cache) unlink($path); // If cache is false (as above) return NULL, otherwise, return the cache return ($cache ? $cache : NULL); } else { return unserialize(file_get_contents($path)); } } else { // Cache is invalid, delete it unlink($path); } } } // No cache found return NULL; } /** * Save data to a simple cache file. This should only be used internally, and * is NOT a replacement for the Cache library. * * @param string cache name * @param mixed data to cache * @param integer expiration in seconds * @return boolean */ public static function cache_save($name, $data, $lifetime) { if ($lifetime < 1) return FALSE; $path = self::$internal_cache_path.'kohana_'.$name; if ($data === NULL) { // Delete cache return (is_file($path) and unlink($path)); } else { // Using encryption? Encrypt the data when we write it if(self::$internal_cache_encrypt===TRUE) { // Encrypt and write data to cache file $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB); $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); // Serialize and encrypt! $encrypted_text = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, self::$internal_cache_key, serialize($data), MCRYPT_MODE_ECB, $iv); return (bool) file_put_contents($path, $encrypted_text); } else { // Write data to cache file return (bool) file_put_contents($path, serialize($data)); } } } /** * Kohana output handler. Called during ob_clean, ob_flush, and their variants. * * @param string current output buffer * @return string */ public static function output_buffer($output) { // Could be flushing, so send headers first if ( ! Event::has_run('system.send_headers')) { // Run the send_headers event Event::run('system.send_headers'); } self::$output = $output; // Set and return the final output return self::$output; } /** * Closes all open output buffers, either by flushing or cleaning, and stores the Kohana * output buffer for display during shutdown. * * @param boolean disable to clear buffers, rather than flushing * @return void */ public static function close_buffers($flush = TRUE) { if (ob_get_level() >= self::$buffer_level) { // Set the close function $close = ($flush === TRUE) ? 'ob_end_flush' : 'ob_end_clean'; while (ob_get_level() > self::$buffer_level) { // Flush or clean the buffer $close(); } // Store the Kohana output buffer ob_end_clean(); } } /** * Triggers the shutdown of Kohana by closing the output buffer, runs the system.display event. * * @return void */ public static function shutdown() { // Close output buffers self::close_buffers(TRUE); // Run the output event Event::run('system.display', self::$output); // Render the final output self::render(self::$output); } /** * Inserts global Kohana variables into the generated output and prints it. * * @param string final output that will displayed * @return void */ public static function render($output) { if (self::config('core.render_stats') === TRUE) { // Fetch memory usage in MB $memory = function_exists('memory_get_usage') ? (memory_get_usage() / 1024 / 1024) : 0; // Fetch benchmark for page execution time $benchmark = Benchmark::get(SYSTEM_BENCHMARK.'_total_execution'); // Replace the global template variables $output = str_replace( array ( '{kohana_version}', '{kohana_codename}', '{execution_time}', '{memory_usage}', '{included_files}', ), array ( KOHANA_VERSION, KOHANA_CODENAME, $benchmark['time'], number_format($memory, 2).'MB', count(get_included_files()), ), $output ); } if ($level = self::config('core.output_compression') AND ini_get('output_handler') !== 'ob_gzhandler' AND (int) ini_get('zlib.output_compression') === 0) { if ($level < 1 OR $level > 9) { // Normalize the level to be an integer between 1 and 9. This // step must be done to prevent gzencode from triggering an error $level = max(1, min($level, 9)); } if (stripos(@$_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== FALSE) { $compress = 'gzip'; } elseif (stripos(@$_SERVER['HTTP_ACCEPT_ENCODING'], 'deflate') !== FALSE) { $compress = 'deflate'; } } if (isset($compress) AND $level > 0) { switch ($compress) { case 'gzip': // Compress output using gzip $output = gzencode($output, $level); break; case 'deflate': // Compress output using zlib (HTTP deflate) $output = gzdeflate($output, $level); break; } // This header must be sent with compressed content to prevent // browser caches from breaking header('Vary: Accept-Encoding'); // Send the content encoding header header('Content-Encoding: '.$compress); // Sending Content-Length in CGI can result in unexpected behavior if (stripos(PHP_SAPI, 'cgi') === FALSE) { header('Content-Length: '.strlen($output)); } } echo $output; } /** * Displays a 404 page. * * @throws Kohana_404_Exception * @param string URI of page * @param string custom template * @return void */ public static function show_404($page = FALSE, $template = FALSE) { throw new Kohana_404_Exception($page, $template); } /** * Dual-purpose PHP error and exception handler. Uses the kohana_error_page * view to display the message. * * @param integer|object exception object or error code * @param string error message * @param string filename * @param integer line number * @return void */ public static function exception_handler($exception, $message = NULL, $file = NULL, $line = NULL) { try { // PHP errors have 5 args, always $PHP_ERROR = (func_num_args() === 5); // Test to see if errors should be displayed if ($PHP_ERROR AND (error_reporting() & $exception) === 0) return; // This is useful for hooks to determine if a page has an error self::$has_error = TRUE; // Error handling will use exactly 5 args, every time if ($PHP_ERROR) { $code = $exception; $type = 'PHP Error'; $template = 'kohana_error_page'; } else { $code = $exception->getCode(); $type = get_class($exception); $message = $exception->getMessage(); $file = $exception->getFile(); $line = $exception->getLine(); $template = ($exception instanceof Kohana_Exception) ? $exception->getTemplate() : 'kohana_error_page'; } if (is_numeric($code)) { $codes = self::lang('errors'); if ( ! empty($codes[$code])) { list($level, $error, $description) = $codes[$code]; } else { $level = 1; $error = $PHP_ERROR ? 'Unknown Error' : get_class($exception); $description = ''; } } else { // Custom error message, this will never be logged $level = 5; $error = $code; $description = ''; } // Remove the DOCROOT from the path, as a security precaution $file = str_replace('\\', '/', realpath($file)); $file = preg_replace('|^'.preg_quote(DOCROOT).'|', '', $file); if ($level <= self::$configuration['core']['log_threshold']) { // Log the error self::log('error', self::lang('core.uncaught_exception', $type, $message, $file, $line)); } if ($PHP_ERROR) { //$description = self::lang('errors.'.E_RECOVERABLE_ERROR); $description = is_array($description) ? $description[2] : ''; if ( ! headers_sent()) { // Send the 500 header header('HTTP/1.1 500 Internal Server Error'); } } else { if (method_exists($exception, 'sendHeaders') AND ! headers_sent()) { // Send the headers if they have not already been sent $exception->sendHeaders(); } } // Close all output buffers except for Kohana while (ob_get_level() > self::$buffer_level) { ob_end_clean(); } // Test if display_errors is on if (self::$configuration['core']['display_errors'] === TRUE) { if ( ! IN_PRODUCTION AND $line != FALSE) { // Remove the first entry of debug_backtrace(), it is the exception_handler call $trace = $PHP_ERROR ? array_slice(debug_backtrace(), 1) : $exception->getTrace(); // Beautify backtrace $trace = self::backtrace($trace); } // Load the error require self::find_file('views', empty($template) ? 'kohana_error_page' : $template); } else { // Get the i18n messages $error = self::lang('core.generic_error'); $message = self::lang('core.errors_disabled', url::site(), url::site(Router::$current_uri)); // Load the errors_disabled view require self::find_file('views', 'kohana_error_disabled'); } if ( ! Event::has_run('system.shutdown')) { // Run the shutdown even to ensure a clean exit Event::run('system.shutdown'); } // Turn off error reporting error_reporting(0); exit; } catch (Exception $e) { if (IN_PRODUCTION) { die('Fatal Error'); } else { die('Fatal Error: '.$e->getMessage().' File: '.$e->getFile().' Line: '.$e->getLine()); } } } /** * Provides class auto-loading. * * @throws Kohana_Exception * @param string name of class * @return bool */ public static function auto_load($class) { if (class_exists($class, FALSE)) return TRUE; if (($suffix = strrpos($class, '_')) > 0) { // Find the class suffix $suffix = substr($class, $suffix + 1); } else { // No suffix $suffix = FALSE; } if ($suffix === 'Core') { $type = 'libraries'; $file = substr($class, 0, -5); } elseif ($suffix === 'Controller') { $type = 'controllers'; // Lowercase filename $file = strtolower(substr($class, 0, -11)); } elseif ($suffix === 'Model') { $type = 'models'; // Lowercase filename $file = strtolower(substr($class, 0, -6)); } elseif ($suffix === 'Driver') { $type = 'libraries/drivers'; $file = str_replace('_', '/', substr($class, 0, -7)); } else { // This could be either a library or a helper, but libraries must // always be capitalized, so we check if the first character is // uppercase. If it is, we are loading a library, not a helper. $type = ($class[0] < 'a') ? 'libraries' : 'helpers'; $file = $class; } if ($filename = self::find_file($type, $file)) { // Load the class require $filename; } else { // The class could not be found return FALSE; } if ($filename = self::find_file($type, self::$configuration['core']['extension_prefix'].$class)) { // Load the class extension require $filename; } elseif ($suffix !== 'Core' AND class_exists($class.'_Core', FALSE)) { // Class extension to be evaluated $extension = 'class '.$class.' extends '.$class.'_Core { }'; // Start class analysis $core = new ReflectionClass($class.'_Core'); if ($core->isAbstract()) { // Make the extension abstract $extension = 'abstract '.$extension; } // Transparent class extensions are handled using eval. This is // a disgusting hack, but it gets the job done. eval($extension); } return TRUE; } /** * Find a resource file in a given directory. Files will be located according * to the order of the include paths. Configuration and i18n files will be * returned in reverse order. * * @throws Kohana_Exception if file is required and not found * @param string directory to search in * @param string filename to look for (without extension) * @param boolean file required * @param string file extension * @return array if the type is config, i18n or l10n * @return string if the file is found * @return FALSE if the file is not found */ public static function find_file($directory, $filename, $required = FALSE, $ext = FALSE) { // NOTE: This test MUST be not be a strict comparison (===), or empty // extensions will be allowed! if ($ext == '') { // Use the default extension $ext = EXT; } else { // Add a period before the extension $ext = '.'.$ext; } // Search path $search = $directory.'/'.$filename.$ext; if (isset(self::$internal_cache['find_file_paths'][$search])) return self::$internal_cache['find_file_paths'][$search]; // Load include paths $paths = self::$include_paths; // Nothing found, yet $found = NULL; if ($directory === 'config' OR $directory === 'i18n') { // Search in reverse, for merging $paths = array_reverse($paths); foreach ($paths as $path) { if (is_file($path.$search)) { // A matching file has been found $found[] = $path.$search; } } } else { foreach ($paths as $path) { if (is_file($path.$search)) { // A matching file has been found $found = $path.$search; // Stop searching break; } } } if ($found === NULL) { if ($required === TRUE) { // Directory i18n key $directory = 'core.'.inflector::singular($directory); // If the file is required, throw an exception throw new Kohana_Exception('core.resource_not_found', self::lang($directory), $filename); } else { // Nothing was found, return FALSE $found = FALSE; } } if ( ! isset(self::$write_cache['find_file_paths'])) { // Write cache at shutdown self::$write_cache['find_file_paths'] = TRUE; } return self::$internal_cache['find_file_paths'][$search] = $found; } /** * Lists all files and directories in a resource path. * * @param string directory to search * @param boolean list all files to the maximum depth? * @param string full path to search (used for recursion, *never* set this manually) * @return array filenames and directories */ public static function list_files($directory, $recursive = FALSE, $path = FALSE) { $files = array(); if ($path === FALSE) { $paths = array_reverse(self::include_paths()); foreach ($paths as $path) { // Recursively get and merge all files $files = array_merge($files, self::list_files($directory, $recursive, $path.$directory)); } } else { $path = rtrim($path, '/').'/'; if (is_readable($path)) { $items = (array) glob($path.'*'); if ( ! empty($items)) { foreach ($items as $index => $item) { $files[] = $item = str_replace('\\', '/', $item); // Handle recursion if (is_dir($item) AND $recursive == TRUE) { // Filename should only be the basename $item = pathinfo($item, PATHINFO_BASENAME); // Append sub-directory search $files = array_merge($files, self::list_files($directory, TRUE, $path.$item)); } } } } } return $files; } /** * Fetch an i18n language item. * * @param string language key to fetch * @param array additional information to insert into the line * @return string i18n language string, or the requested key if the i18n item is not found */ public static function lang($key, $args = array()) { // Extract the main group from the key $group = explode('.', $key, 2); $group = $group[0]; // Get locale name $locale = self::config('locale.language.0'); if ( ! isset(self::$internal_cache['language'][$locale][$group])) { // Messages for this group $messages = array(); if ($files = self::find_file('i18n', $locale.'/'.$group)) { foreach ($files as $file) { include $file; // Merge in configuration if ( ! empty($lang) AND is_array($lang)) { foreach ($lang as $k => $v) { $messages[$k] = $v; } } } } if ( ! isset(self::$write_cache['language'])) { // Write language cache self::$write_cache['language'] = TRUE; } self::$internal_cache['language'][$locale][$group] = $messages; } // Get the line from cache $line = self::key_string(self::$internal_cache['language'][$locale], $key); if ($line === NULL) { self::log('error', 'Missing i18n entry '.$key.' for language '.$locale); // Return the key string as fallback return $key; } if (is_string($line) AND func_num_args() > 1) { $args = array_slice(func_get_args(), 1); // Add the arguments into the line $line = vsprintf($line, is_array($args[0]) ? $args[0] : $args); } return $line; } /** * Returns the value of a key, defined by a 'dot-noted' string, from an array. * * @param array array to search * @param string dot-noted string: foo.bar.baz * @return string if the key is found * @return void if the key is not found */ public static function key_string($array, $keys) { if (empty($array)) return NULL; // Prepare for loop $keys = explode('.', $keys); do { // Get the next key $key = array_shift($keys); if (isset($array[$key])) { if (is_array($array[$key]) AND ! empty($keys)) { // Dig down to prepare the next loop $array = $array[$key]; } else { // Requested key was found return $array[$key]; } } else { // Requested key is not set break; } } while ( ! empty($keys)); return NULL; } /** * Sets values in an array by using a 'dot-noted' string. * * @param array array to set keys in (reference) * @param string dot-noted string: foo.bar.baz * @return mixed fill value for the key * @return void */ public static function key_string_set( & $array, $keys, $fill = NULL) { if (is_object($array) AND ($array instanceof ArrayObject)) { // Copy the array $array_copy = $array->getArrayCopy(); // Is an object $array_object = TRUE; } else { if ( ! is_array($array)) { // Must always be an array $array = (array) $array; } // Copy is a reference to the array $array_copy =& $array; } if (empty($keys)) return $array; // Create keys $keys = explode('.', $keys); // Create reference to the array $row =& $array_copy; for ($i = 0, $end = count($keys) - 1; $i <= $end; $i++) { // Get the current key $key = $keys[$i]; if ( ! isset($row[$key])) { if (isset($keys[$i + 1])) { // Make the value an array $row[$key] = array(); } else { // Add the fill key $row[$key] = $fill; } } elseif (isset($keys[$i + 1])) { // Make the value an array $row[$key] = (array) $row[$key]; } // Go down a level, creating a new row reference $row =& $row[$key]; } if (isset($array_object)) { // Swap the array back in $array->exchangeArray($array_copy); } } /** * Retrieves current user agent information: * keys: browser, version, platform, mobile, robot, referrer, languages, charsets * tests: is_browser, is_mobile, is_robot, accept_lang, accept_charset * * @param string key or test name * @param string used with "accept" tests: user_agent(accept_lang, en) * @return array languages and charsets * @return string all other keys * @return boolean all tests */ public static function user_agent($key = 'agent', $compare = NULL) { static $info; // Return the raw string if ($key === 'agent') return self::$user_agent; if ($info === NULL) { // Parse the user agent and extract basic information $agents = self::config('user_agents'); foreach ($agents as $type => $data) { foreach ($data as $agent => $name) { if (stripos(self::$user_agent, $agent) !== FALSE) { if ($type === 'browser' AND preg_match('|'.preg_quote($agent).'[^0-9.]*+([0-9.][0-9.a-z]*)|i', self::$user_agent, $match)) { // Set the browser version $info['version'] = $match[1]; } // Set the agent name $info[$type] = $name; break; } } } } if (empty($info[$key])) { switch ($key) { case 'is_robot': case 'is_browser': case 'is_mobile': // A boolean result $return = ! empty($info[substr($key, 3)]); break; case 'languages': $return = array(); if ( ! empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { if (preg_match_all('/[-a-z]{2,}/', strtolower(trim($_SERVER['HTTP_ACCEPT_LANGUAGE'])), $matches)) { // Found a result $return = $matches[0]; } } break; case 'charsets': $return = array(); if ( ! empty($_SERVER['HTTP_ACCEPT_CHARSET'])) { if (preg_match_all('/[-a-z0-9]{2,}/', strtolower(trim($_SERVER['HTTP_ACCEPT_CHARSET'])), $matches)) { // Found a result $return = $matches[0]; } } break; case 'referrer': if ( ! empty($_SERVER['HTTP_REFERER'])) { // Found a result $return = trim($_SERVER['HTTP_REFERER']); } break; } // Cache the return value isset($return) and $info[$key] = $return; } if ( ! empty($compare)) { // The comparison must always be lowercase $compare = strtolower($compare); switch ($key) { case 'accept_lang': // Check if the lange is accepted return in_array($compare, self::user_agent('languages')); break; case 'accept_charset': // Check if the charset is accepted return in_array($compare, self::user_agent('charsets')); break; default: // Invalid comparison return FALSE; break; } } // Return the key, if set return isset($info[$key]) ? $info[$key] : NULL; } /** * Quick debugging of any variable. Any number of parameters can be set. * * @return string */ public static function debug() { if (func_num_args() === 0) return; // Get params $params = func_get_args(); $output = array(); foreach ($params as $var) { $output[] = '
    ('.gettype($var).') '.html::specialchars(print_r($var, TRUE)).'
    '; } return implode("\n", $output); } /** * Displays nice backtrace information. * @see http://php.net/debug_backtrace * * @param array backtrace generated by an exception or debug_backtrace * @return string */ public static function backtrace($trace) { if ( ! is_array($trace)) return; // Final output $output = array(); foreach ($trace as $entry) { $temp = '
  • '; if (isset($entry['file'])) { $temp .= self::lang('core.error_file_line', preg_replace('!^'.preg_quote(DOCROOT).'!', '', $entry['file']), $entry['line']); } $temp .= '
    ';
    
    			if (isset($entry['class']))
    			{
    				// Add class and call type
    				$temp .= $entry['class'].$entry['type'];
    			}
    
    			// Add function
    			$temp .= $entry['function'].'( ';
    
    			// Add function args
    			if (isset($entry['args']) AND is_array($entry['args']))
    			{
    				// Separator starts as nothing
    				$sep = '';
    
    				while ($arg = array_shift($entry['args']))
    				{
    					if (is_string($arg) AND is_file($arg))
    					{
    						// Remove docroot from filename
    						$arg = preg_replace('!^'.preg_quote(DOCROOT).'!', '', $arg);
    					}
    
    					$temp .= $sep.html::specialchars(print_r($arg, TRUE));
    
    					// Change separator to a comma
    					$sep = ', ';
    				}
    			}
    
    			$temp .= ' )
  • '; $output[] = $temp; } return '
      '.implode("\n", $output).'
    '; } /** * Saves the internal caches: configuration, include paths, etc. * * @return boolean */ public static function internal_cache_save() { if ( ! is_array(self::$write_cache)) return FALSE; // Get internal cache names $caches = array_keys(self::$write_cache); // Nothing written $written = FALSE; foreach ($caches as $cache) { if (isset(self::$internal_cache[$cache])) { // Write the cache file self::cache_save($cache, self::$internal_cache[$cache], self::$configuration['core']['internal_cache']); // A cache has been written $written = TRUE; } } return $written; } } // End Kohana /** * Creates a generic i18n exception. */ class Kohana_Exception extends Exception { // Template file protected $template = 'kohana_error_page'; // Header protected $header = FALSE; // Error code protected $code = E_KOHANA; /** * Set exception message. * * @param string i18n language key for the message * @param array addition line parameters */ public function __construct($error) { $args = array_slice(func_get_args(), 1); // Fetch the error message $message = Kohana::lang($error, $args); if ($message === $error OR empty($message)) { // Unable to locate the message for the error $message = 'Unknown Exception: '.$error; } // Sets $this->message the proper way parent::__construct($message); } /** * Magic method for converting an object to a string. * * @return string i18n message */ public function __toString() { return (string) $this->message; } /** * Fetch the template name. * * @return string */ public function getTemplate() { return $this->template; } /** * Sends an Internal Server Error header. * * @return void */ public function sendHeaders() { // Send the 500 header header('HTTP/1.1 500 Internal Server Error'); } } // End Kohana Exception /** * Creates a custom exception. */ class Kohana_User_Exception extends Kohana_Exception { /** * Set exception title and message. * * @param string exception title string * @param string exception message string * @param string custom error template */ public function __construct($title, $message, $template = FALSE) { Exception::__construct($message); $this->code = $title; if ($template !== FALSE) { $this->template = $template; } } } // End Kohana PHP Exception /** * Creates a Page Not Found exception. */ class Kohana_404_Exception extends Kohana_Exception { protected $code = E_PAGE_NOT_FOUND; /** * Set internal properties. * * @param string URL of page * @param string custom error template */ public function __construct($page = FALSE, $template = FALSE) { if ($page === FALSE) { // Construct the page URI using Router properties $page = Router::$current_uri.Router::$url_suffix.Router::$query_string; } Exception::__construct(Kohana::lang('core.page_not_found', $page)); $this->template = $template; } /** * Sends "File Not Found" headers, to emulate server behavior. * * @return void */ public function sendHeaders() { // Send the 404 header header('HTTP/1.1 404 File Not Found'); } } // End Kohana 404 Exception pnp4nagios-0.6.16/lib/kohana/system/core/Benchmark.php0000664000000000000000000000533711662503006021263 0ustar rootroot microtime(TRUE), 'stop' => FALSE, 'memory_start' => self::memory_usage(), 'memory_stop' => FALSE ); array_unshift(self::$marks[$name], $mark); } /** * Set a benchmark stop point. * * @param string benchmark name * @return void */ public static function stop($name) { if (isset(self::$marks[$name]) AND self::$marks[$name][0]['stop'] === FALSE) { self::$marks[$name][0]['stop'] = microtime(TRUE); self::$marks[$name][0]['memory_stop'] = self::memory_usage(); } } /** * Get the elapsed time between a start and stop. * * @param string benchmark name, TRUE for all * @param integer number of decimal places to count to * @return array */ public static function get($name, $decimals = 4) { if ($name === TRUE) { $times = array(); $names = array_keys(self::$marks); foreach ($names as $name) { // Get each mark recursively $times[$name] = self::get($name, $decimals); } // Return the array return $times; } if ( ! isset(self::$marks[$name])) return FALSE; if (self::$marks[$name][0]['stop'] === FALSE) { // Stop the benchmark to prevent mis-matched results self::stop($name); } // Return a string version of the time between the start and stop points // Properly reading a float requires using number_format or sprintf $time = $memory = 0; for ($i = 0; $i < count(self::$marks[$name]); $i++) { $time += self::$marks[$name][$i]['stop'] - self::$marks[$name][$i]['start']; $memory += self::$marks[$name][$i]['memory_stop'] - self::$marks[$name][$i]['memory_start']; } return array ( 'time' => number_format($time, $decimals), 'memory' => $memory, 'count' => count(self::$marks[$name]) ); } /** * Returns the current memory usage. This is only possible if the * memory_get_usage function is supported in PHP. * * @return integer */ private static function memory_usage() { static $func; if ($func === NULL) { // Test if memory usage can be seen $func = function_exists('memory_get_usage'); } return $func ? memory_get_usage() : 0; } } // End Benchmark pnp4nagios-0.6.16/lib/kohana/system/core/Event.php0000664000000000000000000001306511662503006020447 0ustar rootroot $event_callback) { if ($callback === $event_callback) { unset(self::$events[$name][$i]); } } } } /** * Execute all of the callbacks attached to an event. * * @param string event name * @param array data can be processed as Event::$data by the callbacks * @return void */ public static function run($name, & $data = NULL) { if ( ! empty(self::$events[$name])) { // So callbacks can access Event::$data self::$data =& $data; $callbacks = self::get($name); foreach ($callbacks as $callback) { call_user_func($callback); } // Do this to prevent data from getting 'stuck' $clear_data = ''; self::$data =& $clear_data; } // The event has been run! self::$has_run[$name] = $name; } /** * Check if a given event has been run. * * @param string event name * @return boolean */ public static function has_run($name) { return isset(self::$has_run[$name]); } } // End Eventpnp4nagios-0.6.16/lib/kohana/system/core/utf8/0000775000000000000000000000000011662503006017536 5ustar rootrootpnp4nagios-0.6.16/lib/kohana/system/core/utf8/ord.php0000664000000000000000000000371611662503006021042 0ustar rootroot= 0 AND $ord0 <= 127) { return $ord0; } if ( ! isset($chr[1])) { trigger_error('Short sequence - at least 2 bytes expected, only 1 seen', E_USER_WARNING); return FALSE; } $ord1 = ord($chr[1]); if ($ord0 >= 192 AND $ord0 <= 223) { return ($ord0 - 192) * 64 + ($ord1 - 128); } if ( ! isset($chr[2])) { trigger_error('Short sequence - at least 3 bytes expected, only 2 seen', E_USER_WARNING); return FALSE; } $ord2 = ord($chr[2]); if ($ord0 >= 224 AND $ord0 <= 239) { return ($ord0 - 224) * 4096 + ($ord1 - 128) * 64 + ($ord2 - 128); } if ( ! isset($chr[3])) { trigger_error('Short sequence - at least 4 bytes expected, only 3 seen', E_USER_WARNING); return FALSE; } $ord3 = ord($chr[3]); if ($ord0 >= 240 AND $ord0 <= 247) { return ($ord0 - 240) * 262144 + ($ord1 - 128) * 4096 + ($ord2-128) * 64 + ($ord3 - 128); } if ( ! isset($chr[4])) { trigger_error('Short sequence - at least 5 bytes expected, only 4 seen', E_USER_WARNING); return FALSE; } $ord4 = ord($chr[4]); if ($ord0 >= 248 AND $ord0 <= 251) { return ($ord0 - 248) * 16777216 + ($ord1-128) * 262144 + ($ord2 - 128) * 4096 + ($ord3 - 128) * 64 + ($ord4 - 128); } if ( ! isset($chr[5])) { trigger_error('Short sequence - at least 6 bytes expected, only 5 seen', E_USER_WARNING); return FALSE; } if ($ord0 >= 252 AND $ord0 <= 253) { return ($ord0 - 252) * 1073741824 + ($ord1 - 128) * 16777216 + ($ord2 - 128) * 262144 + ($ord3 - 128) * 4096 + ($ord4 - 128) * 64 + (ord($chr[5]) - 128); } if ($ord0 >= 254 AND $ord0 <= 255) { trigger_error('Invalid UTF-8 with surrogate ordinal '.$ord0, E_USER_WARNING); return FALSE; } }pnp4nagios-0.6.16/lib/kohana/system/core/utf8/str_ireplace.php0000664000000000000000000000313111662503006022721 0ustar rootroot $val) { $str[$key] = utf8::str_ireplace($search, $replace, $val, $count); } return $str; } if (is_array($search)) { $keys = array_keys($search); foreach ($keys as $k) { if (is_array($replace)) { if (array_key_exists($k, $replace)) { $str = utf8::str_ireplace($search[$k], $replace[$k], $str, $count); } else { $str = utf8::str_ireplace($search[$k], '', $str, $count); } } else { $str = utf8::str_ireplace($search[$k], $replace, $str, $count); } } return $str; } $search = utf8::strtolower($search); $str_lower = utf8::strtolower($str); $total_matched_strlen = 0; $i = 0; while (preg_match('/(.*?)'.preg_quote($search, '/').'/s', $str_lower, $matches)) { $matched_strlen = strlen($matches[0]); $str_lower = substr($str_lower, $matched_strlen); $offset = $total_matched_strlen + strlen($matches[1]) + ($i * (strlen($replace) - 1)); $str = substr_replace($str, $replace, $offset, strlen($search)); $total_matched_strlen += $matched_strlen; $i++; } $count += $i; return $str; } pnp4nagios-0.6.16/lib/kohana/system/core/utf8/str_pad.php0000664000000000000000000000311111662503006021677 0ustar rootroot= $strlen OR ($length < 0 AND $length <= $offset - $strlen)) return ''; // Whole string if ($offset == 0 AND ($length === NULL OR $length >= $strlen)) return $str; // Build regex $regex = '^'; // Create an offset expression if ($offset > 0) { // PCRE repeating quantifiers must be less than 65536, so repeat when necessary $x = (int) ($offset / 65535); $y = (int) ($offset % 65535); $regex .= ($x == 0) ? '' : '(?:.{65535}){'.$x.'}'; $regex .= ($y == 0) ? '' : '.{'.$y.'}'; } // Create a length expression if ($length === NULL) { $regex .= '(.*)'; // No length set, grab it all } // Find length from the left (positive length) elseif ($length > 0) { // Reduce length so that it can't go beyond the end of the string $length = min($strlen - $offset, $length); $x = (int) ($length / 65535); $y = (int) ($length % 65535); $regex .= '('; $regex .= ($x == 0) ? '' : '(?:.{65535}){'.$x.'}'; $regex .= '.{'.$y.'})'; } // Find length from the right (negative length) else { $x = (int) (-$length / 65535); $y = (int) (-$length % 65535); $regex .= '(.*)'; $regex .= ($x == 0) ? '' : '(?:.{65535}){'.$x.'}'; $regex .= '.{'.$y.'}'; } preg_match('/'.$regex.'/us', $str, $matches); return $matches[1]; }pnp4nagios-0.6.16/lib/kohana/system/core/utf8/ucwords.php0000664000000000000000000000136511662503006021742 0ustar rootroot 0x10FFFF)) { trigger_error('utf8::to_unicode: Illegal sequence or codepoint in UTF-8 at byte '.$i, E_USER_WARNING); return FALSE; } if (0xFEFF != $mUcs4) { // BOM is legal but we don't want to output it $out[] = $mUcs4; } // Initialize UTF-8 cache $mState = 0; $mUcs4 = 0; $mBytes = 1; } } else { // ((0xC0 & (*in) != 0x80) AND (mState != 0)) // Incomplete multi-octet sequence trigger_error('utf8::to_unicode: Incomplete multi-octet sequence in UTF-8 at byte '.$i, E_USER_WARNING); return FALSE; } } } return $out; }pnp4nagios-0.6.16/lib/kohana/system/core/utf8/stristr.php0000664000000000000000000000125511662503006021764 0ustar rootroot0x0041, 0x03C6=>0x03A6, 0x0163=>0x0162, 0x00E5=>0x00C5, 0x0062=>0x0042, 0x013A=>0x0139, 0x00E1=>0x00C1, 0x0142=>0x0141, 0x03CD=>0x038E, 0x0101=>0x0100, 0x0491=>0x0490, 0x03B4=>0x0394, 0x015B=>0x015A, 0x0064=>0x0044, 0x03B3=>0x0393, 0x00F4=>0x00D4, 0x044A=>0x042A, 0x0439=>0x0419, 0x0113=>0x0112, 0x043C=>0x041C, 0x015F=>0x015E, 0x0144=>0x0143, 0x00EE=>0x00CE, 0x045E=>0x040E, 0x044F=>0x042F, 0x03BA=>0x039A, 0x0155=>0x0154, 0x0069=>0x0049, 0x0073=>0x0053, 0x1E1F=>0x1E1E, 0x0135=>0x0134, 0x0447=>0x0427, 0x03C0=>0x03A0, 0x0438=>0x0418, 0x00F3=>0x00D3, 0x0440=>0x0420, 0x0454=>0x0404, 0x0435=>0x0415, 0x0449=>0x0429, 0x014B=>0x014A, 0x0431=>0x0411, 0x0459=>0x0409, 0x1E03=>0x1E02, 0x00F6=>0x00D6, 0x00F9=>0x00D9, 0x006E=>0x004E, 0x0451=>0x0401, 0x03C4=>0x03A4, 0x0443=>0x0423, 0x015D=>0x015C, 0x0453=>0x0403, 0x03C8=>0x03A8, 0x0159=>0x0158, 0x0067=>0x0047, 0x00E4=>0x00C4, 0x03AC=>0x0386, 0x03AE=>0x0389, 0x0167=>0x0166, 0x03BE=>0x039E, 0x0165=>0x0164, 0x0117=>0x0116, 0x0109=>0x0108, 0x0076=>0x0056, 0x00FE=>0x00DE, 0x0157=>0x0156, 0x00FA=>0x00DA, 0x1E61=>0x1E60, 0x1E83=>0x1E82, 0x00E2=>0x00C2, 0x0119=>0x0118, 0x0146=>0x0145, 0x0070=>0x0050, 0x0151=>0x0150, 0x044E=>0x042E, 0x0129=>0x0128, 0x03C7=>0x03A7, 0x013E=>0x013D, 0x0442=>0x0422, 0x007A=>0x005A, 0x0448=>0x0428, 0x03C1=>0x03A1, 0x1E81=>0x1E80, 0x016D=>0x016C, 0x00F5=>0x00D5, 0x0075=>0x0055, 0x0177=>0x0176, 0x00FC=>0x00DC, 0x1E57=>0x1E56, 0x03C3=>0x03A3, 0x043A=>0x041A, 0x006D=>0x004D, 0x016B=>0x016A, 0x0171=>0x0170, 0x0444=>0x0424, 0x00EC=>0x00CC, 0x0169=>0x0168, 0x03BF=>0x039F, 0x006B=>0x004B, 0x00F2=>0x00D2, 0x00E0=>0x00C0, 0x0434=>0x0414, 0x03C9=>0x03A9, 0x1E6B=>0x1E6A, 0x00E3=>0x00C3, 0x044D=>0x042D, 0x0436=>0x0416, 0x01A1=>0x01A0, 0x010D=>0x010C, 0x011D=>0x011C, 0x00F0=>0x00D0, 0x013C=>0x013B, 0x045F=>0x040F, 0x045A=>0x040A, 0x00E8=>0x00C8, 0x03C5=>0x03A5, 0x0066=>0x0046, 0x00FD=>0x00DD, 0x0063=>0x0043, 0x021B=>0x021A, 0x00EA=>0x00CA, 0x03B9=>0x0399, 0x017A=>0x0179, 0x00EF=>0x00CF, 0x01B0=>0x01AF, 0x0065=>0x0045, 0x03BB=>0x039B, 0x03B8=>0x0398, 0x03BC=>0x039C, 0x045C=>0x040C, 0x043F=>0x041F, 0x044C=>0x042C, 0x00FE=>0x00DE, 0x00F0=>0x00D0, 0x1EF3=>0x1EF2, 0x0068=>0x0048, 0x00EB=>0x00CB, 0x0111=>0x0110, 0x0433=>0x0413, 0x012F=>0x012E, 0x00E6=>0x00C6, 0x0078=>0x0058, 0x0161=>0x0160, 0x016F=>0x016E, 0x03B1=>0x0391, 0x0457=>0x0407, 0x0173=>0x0172, 0x00FF=>0x0178, 0x006F=>0x004F, 0x043B=>0x041B, 0x03B5=>0x0395, 0x0445=>0x0425, 0x0121=>0x0120, 0x017E=>0x017D, 0x017C=>0x017B, 0x03B6=>0x0396, 0x03B2=>0x0392, 0x03AD=>0x0388, 0x1E85=>0x1E84, 0x0175=>0x0174, 0x0071=>0x0051, 0x0437=>0x0417, 0x1E0B=>0x1E0A, 0x0148=>0x0147, 0x0105=>0x0104, 0x0458=>0x0408, 0x014D=>0x014C, 0x00ED=>0x00CD, 0x0079=>0x0059, 0x010B=>0x010A, 0x03CE=>0x038F, 0x0072=>0x0052, 0x0430=>0x0410, 0x0455=>0x0405, 0x0452=>0x0402, 0x0127=>0x0126, 0x0137=>0x0136, 0x012B=>0x012A, 0x03AF=>0x038A, 0x044B=>0x042B, 0x006C=>0x004C, 0x03B7=>0x0397, 0x0125=>0x0124, 0x0219=>0x0218, 0x00FB=>0x00DB, 0x011F=>0x011E, 0x043E=>0x041E, 0x1E41=>0x1E40, 0x03BD=>0x039D, 0x0107=>0x0106, 0x03CB=>0x03AB, 0x0446=>0x0426, 0x00FE=>0x00DE, 0x00E7=>0x00C7, 0x03CA=>0x03AA, 0x0441=>0x0421, 0x0432=>0x0412, 0x010F=>0x010E, 0x00F8=>0x00D8, 0x0077=>0x0057, 0x011B=>0x011A, 0x0074=>0x0054, 0x006A=>0x004A, 0x045B=>0x040B, 0x0456=>0x0406, 0x0103=>0x0102, 0x03BB=>0x039B, 0x00F1=>0x00D1, 0x043D=>0x041D, 0x03CC=>0x038C, 0x00E9=>0x00C9, 0x00F0=>0x00D0, 0x0457=>0x0407, 0x0123=>0x0122, ); } $uni = utf8::to_unicode($str); if ($uni === FALSE) return FALSE; for ($i = 0, $c = count($uni); $i < $c; $i++) { if (isset($UTF8_LOWER_TO_UPPER[$uni[$i]])) { $uni[$i] = $UTF8_LOWER_TO_UPPER[$uni[$i]]; } } return utf8::from_unicode($uni); }pnp4nagios-0.6.16/lib/kohana/system/core/utf8/from_unicode.php0000664000000000000000000000314611662503006022724 0ustar rootroot= 0) AND ($arr[$k] <= 0x007f)) { echo chr($arr[$k]); } // 2 byte sequence elseif ($arr[$k] <= 0x07ff) { echo chr(0xc0 | ($arr[$k] >> 6)); echo chr(0x80 | ($arr[$k] & 0x003f)); } // Byte order mark (skip) elseif ($arr[$k] == 0xFEFF) { // nop -- zap the BOM } // Test for illegal surrogates elseif ($arr[$k] >= 0xD800 AND $arr[$k] <= 0xDFFF) { // Found a surrogate trigger_error('utf8::from_unicode: Illegal surrogate at index: '.$k.', value: '.$arr[$k], E_USER_WARNING); return FALSE; } // 3 byte sequence elseif ($arr[$k] <= 0xffff) { echo chr(0xe0 | ($arr[$k] >> 12)); echo chr(0x80 | (($arr[$k] >> 6) & 0x003f)); echo chr(0x80 | ($arr[$k] & 0x003f)); } // 4 byte sequence elseif ($arr[$k] <= 0x10ffff) { echo chr(0xf0 | ($arr[$k] >> 18)); echo chr(0x80 | (($arr[$k] >> 12) & 0x3f)); echo chr(0x80 | (($arr[$k] >> 6) & 0x3f)); echo chr(0x80 | ($arr[$k] & 0x3f)); } // Out of range else { trigger_error('utf8::from_unicode: Codepoint out of Unicode range at index: '.$k.', value: '.$arr[$k], E_USER_WARNING); return FALSE; } } $result = ob_get_contents(); ob_end_clean(); return $result; } pnp4nagios-0.6.16/lib/kohana/system/core/utf8/strlen.php0000664000000000000000000000101511662503006021553 0ustar rootroot 'a', 'ô' => 'o', 'ď' => 'd', 'ḟ' => 'f', 'ë' => 'e', 'š' => 's', 'ơ' => 'o', 'ß' => 'ss', 'ă' => 'a', 'ř' => 'r', 'ț' => 't', 'ň' => 'n', 'ā' => 'a', 'ķ' => 'k', 'ŝ' => 's', 'ỳ' => 'y', 'ņ' => 'n', 'ĺ' => 'l', 'ħ' => 'h', 'ṗ' => 'p', 'ó' => 'o', 'ú' => 'u', 'ě' => 'e', 'é' => 'e', 'ç' => 'c', 'ẁ' => 'w', 'ċ' => 'c', 'õ' => 'o', 'ṡ' => 's', 'ø' => 'o', 'ģ' => 'g', 'ŧ' => 't', 'ș' => 's', 'ė' => 'e', 'ĉ' => 'c', 'ś' => 's', 'î' => 'i', 'ű' => 'u', 'ć' => 'c', 'ę' => 'e', 'ŵ' => 'w', 'ṫ' => 't', 'ū' => 'u', 'č' => 'c', 'ö' => 'o', 'è' => 'e', 'ŷ' => 'y', 'ą' => 'a', 'ł' => 'l', 'ų' => 'u', 'ů' => 'u', 'ş' => 's', 'ğ' => 'g', 'ļ' => 'l', 'ƒ' => 'f', 'ž' => 'z', 'ẃ' => 'w', 'ḃ' => 'b', 'å' => 'a', 'ì' => 'i', 'ï' => 'i', 'ḋ' => 'd', 'ť' => 't', 'ŗ' => 'r', 'ä' => 'a', 'í' => 'i', 'ŕ' => 'r', 'ê' => 'e', 'ü' => 'u', 'ò' => 'o', 'ē' => 'e', 'ñ' => 'n', 'ń' => 'n', 'ĥ' => 'h', 'ĝ' => 'g', 'đ' => 'd', 'ĵ' => 'j', 'ÿ' => 'y', 'ũ' => 'u', 'ŭ' => 'u', 'ư' => 'u', 'ţ' => 't', 'ý' => 'y', 'ő' => 'o', 'â' => 'a', 'ľ' => 'l', 'ẅ' => 'w', 'ż' => 'z', 'ī' => 'i', 'ã' => 'a', 'ġ' => 'g', 'ṁ' => 'm', 'ō' => 'o', 'ĩ' => 'i', 'ù' => 'u', 'į' => 'i', 'ź' => 'z', 'á' => 'a', 'û' => 'u', 'þ' => 'th', 'ð' => 'dh', 'æ' => 'ae', 'µ' => 'u', 'ĕ' => 'e', ); } $str = str_replace( array_keys($UTF8_LOWER_ACCENTS), array_values($UTF8_LOWER_ACCENTS), $str ); } if ($case >= 0) { if ($UTF8_UPPER_ACCENTS === NULL) { $UTF8_UPPER_ACCENTS = array( 'À' => 'A', 'Ô' => 'O', 'Ď' => 'D', 'Ḟ' => 'F', 'Ë' => 'E', 'Š' => 'S', 'Ơ' => 'O', 'Ă' => 'A', 'Ř' => 'R', 'Ț' => 'T', 'Ň' => 'N', 'Ā' => 'A', 'Ķ' => 'K', 'Ĕ' => 'E', 'Ŝ' => 'S', 'Ỳ' => 'Y', 'Ņ' => 'N', 'Ĺ' => 'L', 'Ħ' => 'H', 'Ṗ' => 'P', 'Ó' => 'O', 'Ú' => 'U', 'Ě' => 'E', 'É' => 'E', 'Ç' => 'C', 'Ẁ' => 'W', 'Ċ' => 'C', 'Õ' => 'O', 'Ṡ' => 'S', 'Ø' => 'O', 'Ģ' => 'G', 'Ŧ' => 'T', 'Ș' => 'S', 'Ė' => 'E', 'Ĉ' => 'C', 'Ś' => 'S', 'Î' => 'I', 'Ű' => 'U', 'Ć' => 'C', 'Ę' => 'E', 'Ŵ' => 'W', 'Ṫ' => 'T', 'Ū' => 'U', 'Č' => 'C', 'Ö' => 'O', 'È' => 'E', 'Ŷ' => 'Y', 'Ą' => 'A', 'Ł' => 'L', 'Ų' => 'U', 'Ů' => 'U', 'Ş' => 'S', 'Ğ' => 'G', 'Ļ' => 'L', 'Ƒ' => 'F', 'Ž' => 'Z', 'Ẃ' => 'W', 'Ḃ' => 'B', 'Å' => 'A', 'Ì' => 'I', 'Ï' => 'I', 'Ḋ' => 'D', 'Ť' => 'T', 'Ŗ' => 'R', 'Ä' => 'A', 'Í' => 'I', 'Ŕ' => 'R', 'Ê' => 'E', 'Ü' => 'U', 'Ò' => 'O', 'Ē' => 'E', 'Ñ' => 'N', 'Ń' => 'N', 'Ĥ' => 'H', 'Ĝ' => 'G', 'Đ' => 'D', 'Ĵ' => 'J', 'Ÿ' => 'Y', 'Ũ' => 'U', 'Ŭ' => 'U', 'Ư' => 'U', 'Ţ' => 'T', 'Ý' => 'Y', 'Ő' => 'O', 'Â' => 'A', 'Ľ' => 'L', 'Ẅ' => 'W', 'Ż' => 'Z', 'Ī' => 'I', 'Ã' => 'A', 'Ġ' => 'G', 'Ṁ' => 'M', 'Ō' => 'O', 'Ĩ' => 'I', 'Ù' => 'U', 'Į' => 'I', 'Ź' => 'Z', 'Á' => 'A', 'Û' => 'U', 'Þ' => 'Th', 'Ð' => 'Dh', 'Æ' => 'Ae', ); } $str = str_replace( array_keys($UTF8_UPPER_ACCENTS), array_values($UTF8_UPPER_ACCENTS), $str ); } return $str; }pnp4nagios-0.6.16/lib/kohana/system/core/utf8/strtolower.php0000664000000000000000000001035111662503006022473 0ustar rootroot0x0061, 0x03A6=>0x03C6, 0x0162=>0x0163, 0x00C5=>0x00E5, 0x0042=>0x0062, 0x0139=>0x013A, 0x00C1=>0x00E1, 0x0141=>0x0142, 0x038E=>0x03CD, 0x0100=>0x0101, 0x0490=>0x0491, 0x0394=>0x03B4, 0x015A=>0x015B, 0x0044=>0x0064, 0x0393=>0x03B3, 0x00D4=>0x00F4, 0x042A=>0x044A, 0x0419=>0x0439, 0x0112=>0x0113, 0x041C=>0x043C, 0x015E=>0x015F, 0x0143=>0x0144, 0x00CE=>0x00EE, 0x040E=>0x045E, 0x042F=>0x044F, 0x039A=>0x03BA, 0x0154=>0x0155, 0x0049=>0x0069, 0x0053=>0x0073, 0x1E1E=>0x1E1F, 0x0134=>0x0135, 0x0427=>0x0447, 0x03A0=>0x03C0, 0x0418=>0x0438, 0x00D3=>0x00F3, 0x0420=>0x0440, 0x0404=>0x0454, 0x0415=>0x0435, 0x0429=>0x0449, 0x014A=>0x014B, 0x0411=>0x0431, 0x0409=>0x0459, 0x1E02=>0x1E03, 0x00D6=>0x00F6, 0x00D9=>0x00F9, 0x004E=>0x006E, 0x0401=>0x0451, 0x03A4=>0x03C4, 0x0423=>0x0443, 0x015C=>0x015D, 0x0403=>0x0453, 0x03A8=>0x03C8, 0x0158=>0x0159, 0x0047=>0x0067, 0x00C4=>0x00E4, 0x0386=>0x03AC, 0x0389=>0x03AE, 0x0166=>0x0167, 0x039E=>0x03BE, 0x0164=>0x0165, 0x0116=>0x0117, 0x0108=>0x0109, 0x0056=>0x0076, 0x00DE=>0x00FE, 0x0156=>0x0157, 0x00DA=>0x00FA, 0x1E60=>0x1E61, 0x1E82=>0x1E83, 0x00C2=>0x00E2, 0x0118=>0x0119, 0x0145=>0x0146, 0x0050=>0x0070, 0x0150=>0x0151, 0x042E=>0x044E, 0x0128=>0x0129, 0x03A7=>0x03C7, 0x013D=>0x013E, 0x0422=>0x0442, 0x005A=>0x007A, 0x0428=>0x0448, 0x03A1=>0x03C1, 0x1E80=>0x1E81, 0x016C=>0x016D, 0x00D5=>0x00F5, 0x0055=>0x0075, 0x0176=>0x0177, 0x00DC=>0x00FC, 0x1E56=>0x1E57, 0x03A3=>0x03C3, 0x041A=>0x043A, 0x004D=>0x006D, 0x016A=>0x016B, 0x0170=>0x0171, 0x0424=>0x0444, 0x00CC=>0x00EC, 0x0168=>0x0169, 0x039F=>0x03BF, 0x004B=>0x006B, 0x00D2=>0x00F2, 0x00C0=>0x00E0, 0x0414=>0x0434, 0x03A9=>0x03C9, 0x1E6A=>0x1E6B, 0x00C3=>0x00E3, 0x042D=>0x044D, 0x0416=>0x0436, 0x01A0=>0x01A1, 0x010C=>0x010D, 0x011C=>0x011D, 0x00D0=>0x00F0, 0x013B=>0x013C, 0x040F=>0x045F, 0x040A=>0x045A, 0x00C8=>0x00E8, 0x03A5=>0x03C5, 0x0046=>0x0066, 0x00DD=>0x00FD, 0x0043=>0x0063, 0x021A=>0x021B, 0x00CA=>0x00EA, 0x0399=>0x03B9, 0x0179=>0x017A, 0x00CF=>0x00EF, 0x01AF=>0x01B0, 0x0045=>0x0065, 0x039B=>0x03BB, 0x0398=>0x03B8, 0x039C=>0x03BC, 0x040C=>0x045C, 0x041F=>0x043F, 0x042C=>0x044C, 0x00DE=>0x00FE, 0x00D0=>0x00F0, 0x1EF2=>0x1EF3, 0x0048=>0x0068, 0x00CB=>0x00EB, 0x0110=>0x0111, 0x0413=>0x0433, 0x012E=>0x012F, 0x00C6=>0x00E6, 0x0058=>0x0078, 0x0160=>0x0161, 0x016E=>0x016F, 0x0391=>0x03B1, 0x0407=>0x0457, 0x0172=>0x0173, 0x0178=>0x00FF, 0x004F=>0x006F, 0x041B=>0x043B, 0x0395=>0x03B5, 0x0425=>0x0445, 0x0120=>0x0121, 0x017D=>0x017E, 0x017B=>0x017C, 0x0396=>0x03B6, 0x0392=>0x03B2, 0x0388=>0x03AD, 0x1E84=>0x1E85, 0x0174=>0x0175, 0x0051=>0x0071, 0x0417=>0x0437, 0x1E0A=>0x1E0B, 0x0147=>0x0148, 0x0104=>0x0105, 0x0408=>0x0458, 0x014C=>0x014D, 0x00CD=>0x00ED, 0x0059=>0x0079, 0x010A=>0x010B, 0x038F=>0x03CE, 0x0052=>0x0072, 0x0410=>0x0430, 0x0405=>0x0455, 0x0402=>0x0452, 0x0126=>0x0127, 0x0136=>0x0137, 0x012A=>0x012B, 0x038A=>0x03AF, 0x042B=>0x044B, 0x004C=>0x006C, 0x0397=>0x03B7, 0x0124=>0x0125, 0x0218=>0x0219, 0x00DB=>0x00FB, 0x011E=>0x011F, 0x041E=>0x043E, 0x1E40=>0x1E41, 0x039D=>0x03BD, 0x0106=>0x0107, 0x03AB=>0x03CB, 0x0426=>0x0446, 0x00DE=>0x00FE, 0x00C7=>0x00E7, 0x03AA=>0x03CA, 0x0421=>0x0441, 0x0412=>0x0432, 0x010E=>0x010F, 0x00D8=>0x00F8, 0x0057=>0x0077, 0x011A=>0x011B, 0x0054=>0x0074, 0x004A=>0x006A, 0x040B=>0x045B, 0x0406=>0x0456, 0x0102=>0x0103, 0x039B=>0x03BB, 0x00D1=>0x00F1, 0x041D=>0x043D, 0x038C=>0x03CC, 0x00C9=>0x00E9, 0x00D0=>0x00F0, 0x0407=>0x0457, 0x0122=>0x0123, ); } $uni = utf8::to_unicode($str); if ($uni === FALSE) return FALSE; for ($i = 0, $c = count($uni); $i < $c; $i++) { if (isset($UTF8_UPPER_TO_LOWER[$uni[$i]])) { $uni[$i] = $UTF8_UPPER_TO_LOWER[$uni[$i]]; } } return utf8::from_unicode($uni); }pnp4nagios-0.6.16/lib/kohana/system/core/utf8/rtrim.php0000664000000000000000000000106111662503006021402 0ustar rootrootPCRE has not been compiled with UTF-8 support. '. 'See PCRE Pattern Modifiers '. 'for more information. This application cannot be run without UTF-8 support.', E_USER_ERROR ); } if ( ! extension_loaded('iconv')) { trigger_error ( 'The iconv extension is not loaded. '. 'Without iconv, strings cannot be properly translated to UTF-8 from user input. '. 'This application cannot be run without UTF-8 support.', E_USER_ERROR ); } if (extension_loaded('mbstring') AND (ini_get('mbstring.func_overload') & MB_OVERLOAD_STRING)) { trigger_error ( 'The mbstring extension is overloading PHP\'s native string functions. '. 'Disable this by setting mbstring.func_overload to 0, 1, 4 or 5 in php.ini or a .htaccess file.'. 'This application cannot be run without UTF-8 support.', E_USER_ERROR ); } // Check PCRE support for Unicode properties such as \p and \X. $ER = error_reporting(0); define('PCRE_UNICODE_PROPERTIES', (bool) preg_match('/^\pL$/u', 'ñ')); error_reporting($ER); // SERVER_UTF8 ? use mb_* functions : use non-native functions if (extension_loaded('mbstring')) { mb_internal_encoding('UTF-8'); define('SERVER_UTF8', TRUE); } else { define('SERVER_UTF8', FALSE); } // Convert all global variables to UTF-8. $_GET = utf8::clean($_GET); $_POST = utf8::clean($_POST); $_COOKIE = utf8::clean($_COOKIE); $_SERVER = utf8::clean($_SERVER); if (PHP_SAPI == 'cli') { // Convert command line arguments $_SERVER['argv'] = utf8::clean($_SERVER['argv']); } final class utf8 { // Called methods static $called = array(); /** * Recursively cleans arrays, objects, and strings. Removes ASCII control * codes and converts to UTF-8 while silently discarding incompatible * UTF-8 characters. * * @param string string to clean * @return string */ public static function clean($str) { if (is_array($str) OR is_object($str)) { foreach ($str as $key => $val) { // Recursion! $str[self::clean($key)] = self::clean($val); } } elseif (is_string($str) AND $str !== '') { // Remove control characters $str = self::strip_ascii_ctrl($str); if ( ! self::is_ascii($str)) { // Disable notices $ER = error_reporting(~E_NOTICE); // iconv is expensive, so it is only used when needed $str = iconv('UTF-8', 'UTF-8//IGNORE', $str); // Turn notices back on error_reporting($ER); } } return $str; } /** * Tests whether a string contains only 7bit ASCII bytes. This is used to * determine when to use native functions or UTF-8 functions. * * @param string string to check * @return bool */ public static function is_ascii($str) { return ! preg_match('/[^\x00-\x7F]/S', $str); } /** * Strips out device control codes in the ASCII range. * * @param string string to clean * @return string */ public static function strip_ascii_ctrl($str) { return preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+/S', '', $str); } /** * Strips out all non-7bit ASCII bytes. * * @param string string to clean * @return string */ public static function strip_non_ascii($str) { return preg_replace('/[^\x00-\x7F]+/S', '', $str); } /** * Replaces special/accented UTF-8 characters by ASCII-7 'equivalents'. * * @author Andreas Gohr * * @param string string to transliterate * @param integer -1 lowercase only, +1 uppercase only, 0 both cases * @return string */ public static function transliterate_to_ascii($str, $case = 0) { if ( ! isset(self::$called[__FUNCTION__])) { require SYSPATH.'core/utf8/'.__FUNCTION__.EXT; // Function has been called self::$called[__FUNCTION__] = TRUE; } return _transliterate_to_ascii($str, $case); } /** * Returns the length of the given string. * @see http://php.net/strlen * * @param string string being measured for length * @return integer */ public static function strlen($str) { if ( ! isset(self::$called[__FUNCTION__])) { require SYSPATH.'core/utf8/'.__FUNCTION__.EXT; // Function has been called self::$called[__FUNCTION__] = TRUE; } return _strlen($str); } /** * Finds position of first occurrence of a UTF-8 string. * @see http://php.net/strlen * * @author Harry Fuecks * * @param string haystack * @param string needle * @param integer offset from which character in haystack to start searching * @return integer position of needle * @return boolean FALSE if the needle is not found */ public static function strpos($str, $search, $offset = 0) { if ( ! isset(self::$called[__FUNCTION__])) { require SYSPATH.'core/utf8/'.__FUNCTION__.EXT; // Function has been called self::$called[__FUNCTION__] = TRUE; } return _strpos($str, $search, $offset); } /** * Finds position of last occurrence of a char in a UTF-8 string. * @see http://php.net/strrpos * * @author Harry Fuecks * * @param string haystack * @param string needle * @param integer offset from which character in haystack to start searching * @return integer position of needle * @return boolean FALSE if the needle is not found */ public static function strrpos($str, $search, $offset = 0) { if ( ! isset(self::$called[__FUNCTION__])) { require SYSPATH.'core/utf8/'.__FUNCTION__.EXT; // Function has been called self::$called[__FUNCTION__] = TRUE; } return _strrpos($str, $search, $offset); } /** * Returns part of a UTF-8 string. * @see http://php.net/substr * * @author Chris Smith * * @param string input string * @param integer offset * @param integer length limit * @return string */ public static function substr($str, $offset, $length = NULL) { if ( ! isset(self::$called[__FUNCTION__])) { require SYSPATH.'core/utf8/'.__FUNCTION__.EXT; // Function has been called self::$called[__FUNCTION__] = TRUE; } return _substr($str, $offset, $length); } /** * Replaces text within a portion of a UTF-8 string. * @see http://php.net/substr_replace * * @author Harry Fuecks * * @param string input string * @param string replacement string * @param integer offset * @return string */ public static function substr_replace($str, $replacement, $offset, $length = NULL) { if ( ! isset(self::$called[__FUNCTION__])) { require SYSPATH.'core/utf8/'.__FUNCTION__.EXT; // Function has been called self::$called[__FUNCTION__] = TRUE; } return _substr_replace($str, $replacement, $offset, $length); } /** * Makes a UTF-8 string lowercase. * @see http://php.net/strtolower * * @author Andreas Gohr * * @param string mixed case string * @return string */ public static function strtolower($str) { if ( ! isset(self::$called[__FUNCTION__])) { require SYSPATH.'core/utf8/'.__FUNCTION__.EXT; // Function has been called self::$called[__FUNCTION__] = TRUE; } return _strtolower($str); } /** * Makes a UTF-8 string uppercase. * @see http://php.net/strtoupper * * @author Andreas Gohr * * @param string mixed case string * @return string */ public static function strtoupper($str) { if ( ! isset(self::$called[__FUNCTION__])) { require SYSPATH.'core/utf8/'.__FUNCTION__.EXT; // Function has been called self::$called[__FUNCTION__] = TRUE; } return _strtoupper($str); } /** * Makes a UTF-8 string's first character uppercase. * @see http://php.net/ucfirst * * @author Harry Fuecks * * @param string mixed case string * @return string */ public static function ucfirst($str) { if ( ! isset(self::$called[__FUNCTION__])) { require SYSPATH.'core/utf8/'.__FUNCTION__.EXT; // Function has been called self::$called[__FUNCTION__] = TRUE; } return _ucfirst($str); } /** * Makes the first character of every word in a UTF-8 string uppercase. * @see http://php.net/ucwords * * @author Harry Fuecks * * @param string mixed case string * @return string */ public static function ucwords($str) { if ( ! isset(self::$called[__FUNCTION__])) { require SYSPATH.'core/utf8/'.__FUNCTION__.EXT; // Function has been called self::$called[__FUNCTION__] = TRUE; } return _ucwords($str); } /** * Case-insensitive UTF-8 string comparison. * @see http://php.net/strcasecmp * * @author Harry Fuecks * * @param string string to compare * @param string string to compare * @return integer less than 0 if str1 is less than str2 * @return integer greater than 0 if str1 is greater than str2 * @return integer 0 if they are equal */ public static function strcasecmp($str1, $str2) { if ( ! isset(self::$called[__FUNCTION__])) { require SYSPATH.'core/utf8/'.__FUNCTION__.EXT; // Function has been called self::$called[__FUNCTION__] = TRUE; } return _strcasecmp($str1, $str2); } /** * Returns a string or an array with all occurrences of search in subject (ignoring case). * replaced with the given replace value. * @see http://php.net/str_ireplace * * @note It's not fast and gets slower if $search and/or $replace are arrays. * @author Harry Fuecks * * @param string input string * @param string needle * @return string matched substring if found * @return boolean FALSE if the substring was not found */ public static function stristr($str, $search) { if ( ! isset(self::$called[__FUNCTION__])) { require SYSPATH.'core/utf8/'.__FUNCTION__.EXT; // Function has been called self::$called[__FUNCTION__] = TRUE; } return _stristr($str, $search); } /** * Finds the length of the initial segment matching mask. * @see http://php.net/strspn * * @author Harry Fuecks * * @param string input string * @param string mask for search * @param integer start position of the string to examine * @param integer length of the string to examine * @return integer length of the initial segment that contains characters in the mask */ public static function strspn($str, $mask, $offset = NULL, $length = NULL) { if ( ! isset(self::$called[__FUNCTION__])) { require SYSPATH.'core/utf8/'.__FUNCTION__.EXT; // Function has been called self::$called[__FUNCTION__] = TRUE; } return _strspn($str, $mask, $offset, $length); } /** * Finds the length of the initial segment not matching mask. * @see http://php.net/strcspn * * @author Harry Fuecks * * @param string input string * @param string mask for search * @param integer start position of the string to examine * @param integer length of the string to examine * @return integer length of the initial segment that contains characters not in the mask */ public static function strcspn($str, $mask, $offset = NULL, $length = NULL) { if ( ! isset(self::$called[__FUNCTION__])) { require SYSPATH.'core/utf8/'.__FUNCTION__.EXT; // Function has been called self::$called[__FUNCTION__] = TRUE; } return _strcspn($str, $mask, $offset, $length); } /** * Pads a UTF-8 string to a certain length with another string. * @see http://php.net/str_pad * * @author Harry Fuecks * * @param string input string * @param integer desired string length after padding * @param string string to use as padding * @param string padding type: STR_PAD_RIGHT, STR_PAD_LEFT, or STR_PAD_BOTH * @return string */ public static function str_pad($str, $final_str_length, $pad_str = ' ', $pad_type = STR_PAD_RIGHT) { if ( ! isset(self::$called[__FUNCTION__])) { require SYSPATH.'core/utf8/'.__FUNCTION__.EXT; // Function has been called self::$called[__FUNCTION__] = TRUE; } return _str_pad($str, $final_str_length, $pad_str, $pad_type); } /** * Converts a UTF-8 string to an array. * @see http://php.net/str_split * * @author Harry Fuecks * * @param string input string * @param integer maximum length of each chunk * @return array */ public static function str_split($str, $split_length = 1) { if ( ! isset(self::$called[__FUNCTION__])) { require SYSPATH.'core/utf8/'.__FUNCTION__.EXT; // Function has been called self::$called[__FUNCTION__] = TRUE; } return _str_split($str, $split_length); } /** * Reverses a UTF-8 string. * @see http://php.net/strrev * * @author Harry Fuecks * * @param string string to be reversed * @return string */ public static function strrev($str) { if ( ! isset(self::$called[__FUNCTION__])) { require SYSPATH.'core/utf8/'.__FUNCTION__.EXT; // Function has been called self::$called[__FUNCTION__] = TRUE; } return _strrev($str); } /** * Strips whitespace (or other UTF-8 characters) from the beginning and * end of a string. * @see http://php.net/trim * * @author Andreas Gohr * * @param string input string * @param string string of characters to remove * @return string */ public static function trim($str, $charlist = NULL) { if ( ! isset(self::$called[__FUNCTION__])) { require SYSPATH.'core/utf8/'.__FUNCTION__.EXT; // Function has been called self::$called[__FUNCTION__] = TRUE; } return _trim($str, $charlist); } /** * Strips whitespace (or other UTF-8 characters) from the beginning of a string. * @see http://php.net/ltrim * * @author Andreas Gohr * * @param string input string * @param string string of characters to remove * @return string */ public static function ltrim($str, $charlist = NULL) { if ( ! isset(self::$called[__FUNCTION__])) { require SYSPATH.'core/utf8/'.__FUNCTION__.EXT; // Function has been called self::$called[__FUNCTION__] = TRUE; } return _ltrim($str, $charlist); } /** * Strips whitespace (or other UTF-8 characters) from the end of a string. * @see http://php.net/rtrim * * @author Andreas Gohr * * @param string input string * @param string string of characters to remove * @return string */ public static function rtrim($str, $charlist = NULL) { if ( ! isset(self::$called[__FUNCTION__])) { require SYSPATH.'core/utf8/'.__FUNCTION__.EXT; // Function has been called self::$called[__FUNCTION__] = TRUE; } return _rtrim($str, $charlist); } /** * Returns the unicode ordinal for a character. * @see http://php.net/ord * * @author Harry Fuecks * * @param string UTF-8 encoded character * @return integer */ public static function ord($chr) { if ( ! isset(self::$called[__FUNCTION__])) { require SYSPATH.'core/utf8/'.__FUNCTION__.EXT; // Function has been called self::$called[__FUNCTION__] = TRUE; } return _ord($chr); } /** * Takes an UTF-8 string and returns an array of ints representing the Unicode characters. * Astral planes are supported i.e. the ints in the output can be > 0xFFFF. * Occurrances of the BOM are ignored. Surrogates are not allowed. * * The Original Code is Mozilla Communicator client code. * The Initial Developer of the Original Code is Netscape Communications Corporation. * Portions created by the Initial Developer are Copyright (C) 1998 the Initial Developer. * Ported to PHP by Henri Sivonen , see http://hsivonen.iki.fi/php-utf8/. * Slight modifications to fit with phputf8 library by Harry Fuecks . * * @param string UTF-8 encoded string * @return array unicode code points * @return boolean FALSE if the string is invalid */ public static function to_unicode($str) { if ( ! isset(self::$called[__FUNCTION__])) { require SYSPATH.'core/utf8/'.__FUNCTION__.EXT; // Function has been called self::$called[__FUNCTION__] = TRUE; } return _to_unicode($str); } /** * Takes an array of ints representing the Unicode characters and returns a UTF-8 string. * Astral planes are supported i.e. the ints in the input can be > 0xFFFF. * Occurrances of the BOM are ignored. Surrogates are not allowed. * * The Original Code is Mozilla Communicator client code. * The Initial Developer of the Original Code is Netscape Communications Corporation. * Portions created by the Initial Developer are Copyright (C) 1998 the Initial Developer. * Ported to PHP by Henri Sivonen , see http://hsivonen.iki.fi/php-utf8/. * Slight modifications to fit with phputf8 library by Harry Fuecks . * * @param array unicode code points representing a string * @return string utf8 string of characters * @return boolean FALSE if a code point cannot be found */ public static function from_unicode($arr) { if ( ! isset(self::$called[__FUNCTION__])) { require SYSPATH.'core/utf8/'.__FUNCTION__.EXT; // Function has been called self::$called[__FUNCTION__] = TRUE; } return _from_unicode($arr); } } // End utf8pnp4nagios-0.6.16/lib/kohana/system/core/Bootstrap.php0000664000000000000000000000270711662503006021344 0ustar rootroot" /> * * $Id: captcha.php 3769 2008-12-15 00:48:56Z zombor $ * * @package Captcha * @author Kohana Team * @copyright (c) 2007-2008 Kohana Team * @license http://kohanaphp.com/license.html */ class Captcha_Controller extends Controller { public function __call($method, $args) { // Output the Captcha challenge resource (no html) // Pull the config group name from the URL Captcha::factory($this->uri->segment(2))->render(FALSE); } } // End Captcha_Controllerpnp4nagios-0.6.16/lib/kohana/system/controllers/template.php0000664000000000000000000000246311662503006022617 0ustar rootroottemplate = new View($this->template); if ($this->auto_render == TRUE) { // Render the template immediately after the controller method Event::add('system.post_controller', array($this, '_render')); } } /** * Render the loaded template. */ public function _render() { if ($this->auto_render == TRUE) { // Render the template when the class is destroyed $this->template->render(TRUE); } } } // End Template_Controllerpnp4nagios-0.6.16/lib/kohana/system/config/0000775000000000000000000000000011662503006017165 5ustar rootrootpnp4nagios-0.6.16/lib/kohana/system/config/cookie.php0000664000000000000000000000157711662503006021161 0ustar rootroot array('type' => 'int', 'max' => 127), 'smallint' => array('type' => 'int', 'max' => 32767), 'mediumint' => array('type' => 'int', 'max' => 8388607), 'int' => array('type' => 'int', 'max' => 2147483647), 'integer' => array('type' => 'int', 'max' => 2147483647), 'bigint' => array('type' => 'int', 'max' => 9223372036854775807), 'float' => array('type' => 'float'), 'float unsigned' => array('type' => 'float', 'min' => 0), 'boolean' => array('type' => 'boolean'), 'time' => array('type' => 'string', 'format' => '00:00:00'), 'time with time zone' => array('type' => 'string'), 'date' => array('type' => 'string', 'format' => '0000-00-00'), 'year' => array('type' => 'string', 'format' => '0000'), 'datetime' => array('type' => 'string', 'format' => '0000-00-00 00:00:00'), 'timestamp with time zone' => array('type' => 'string'), 'char' => array('type' => 'string', 'exact' => TRUE), 'binary' => array('type' => 'string', 'binary' => TRUE, 'exact' => TRUE), 'varchar' => array('type' => 'string'), 'varbinary' => array('type' => 'string', 'binary' => TRUE), 'blob' => array('type' => 'string', 'binary' => TRUE), 'text' => array('type' => 'string') ); // DOUBLE $config['double'] = $config['double precision'] = $config['decimal'] = $config['real'] = $config['numeric'] = $config['float']; $config['double unsigned'] = $config['float unsigned']; // BIT $config['bit'] = $config['boolean']; // TIMESTAMP $config['timestamp'] = $config['timestamp without time zone'] = $config['datetime']; // ENUM $config['enum'] = $config['set'] = $config['varchar']; // TEXT $config['tinytext'] = $config['mediumtext'] = $config['longtext'] = $config['text']; // BLOB $config['tsvector'] = $config['tinyblob'] = $config['mediumblob'] = $config['longblob'] = $config['clob'] = $config['bytea'] = $config['blob']; // CHARACTER $config['character'] = $config['char']; $config['character varying'] = $config['varchar']; // TIME $config['time without time zone'] = $config['time']; pnp4nagios-0.6.16/lib/kohana/system/config/session.php0000664000000000000000000000231611662503006021363 0ustar rootroot 'K0H@NA+PHP_7hE-SW!FtFraM3w0R|<', 'mode' => MCRYPT_MODE_NOFB, 'cipher' => MCRYPT_RIJNDAEL_128 ); pnp4nagios-0.6.16/lib/kohana/system/config/email.php0000664000000000000000000000142311662503006020765 0ustar rootroot '127.0.0.1', 'port' => 11211, 'persistent' => FALSE, ) ); /** * Enable cache data compression. */ $config['compression'] = FALSE; pnp4nagios-0.6.16/lib/kohana/system/config/profiler.php0000664000000000000000000000046511662503006021525 0ustar rootroot 'Windows Vista', 'windows nt 5.2' => 'Windows 2003', 'windows nt 5.0' => 'Windows 2000', 'windows nt 5.1' => 'Windows XP', 'windows nt 4.0' => 'Windows NT', 'winnt4.0' => 'Windows NT', 'winnt 4.0' => 'Windows NT', 'winnt' => 'Windows NT', 'windows 98' => 'Windows 98', 'win98' => 'Windows 98', 'windows 95' => 'Windows 95', 'win95' => 'Windows 95', 'windows' => 'Unknown Windows OS', 'os x' => 'Mac OS X', 'intel mac' => 'Intel Mac', 'ppc mac' => 'PowerPC Mac', 'powerpc' => 'PowerPC', 'ppc' => 'PowerPC', 'cygwin' => 'Cygwin', 'linux' => 'Linux', 'debian' => 'Debian', 'openvms' => 'OpenVMS', 'sunos' => 'Sun Solaris', 'amiga' => 'Amiga', 'beos' => 'BeOS', 'apachebench' => 'ApacheBench', 'freebsd' => 'FreeBSD', 'netbsd' => 'NetBSD', 'bsdi' => 'BSDi', 'openbsd' => 'OpenBSD', 'os/2' => 'OS/2', 'warp' => 'OS/2', 'aix' => 'AIX', 'irix' => 'Irix', 'osf' => 'DEC OSF', 'hp-ux' => 'HP-UX', 'hurd' => 'GNU/Hurd', 'unix' => 'Unknown Unix OS', ); // The order of this array should NOT be changed. Many browsers return // multiple browser types so we want to identify the sub-type first. $config['browser'] = array ( 'Opera' => 'Opera', 'MSIE' => 'Internet Explorer', 'Internet Explorer' => 'Internet Explorer', 'Shiira' => 'Shiira', 'Firefox' => 'Firefox', 'Chimera' => 'Chimera', 'Phoenix' => 'Phoenix', 'Firebird' => 'Firebird', 'Camino' => 'Camino', 'Netscape' => 'Netscape', 'OmniWeb' => 'OmniWeb', 'Chrome' => 'Chrome', 'Safari' => 'Safari', 'Konqueror' => 'Konqueror', 'Epiphany' => 'Epiphany', 'Galeon' => 'Galeon', 'Mozilla' => 'Mozilla', 'icab' => 'iCab', 'lynx' => 'Lynx', 'links' => 'Links', 'hotjava' => 'HotJava', 'amaya' => 'Amaya', 'IBrowse' => 'IBrowse', ); $config['mobile'] = array ( 'mobileexplorer' => 'Mobile Explorer', 'openwave' => 'Open Wave', 'opera mini' => 'Opera Mini', 'operamini' => 'Opera Mini', 'elaine' => 'Palm', 'palmsource' => 'Palm', 'digital paths' => 'Palm', 'avantgo' => 'Avantgo', 'xiino' => 'Xiino', 'palmscape' => 'Palmscape', 'nokia' => 'Nokia', 'ericsson' => 'Ericsson', 'blackBerry' => 'BlackBerry', 'motorola' => 'Motorola', 'iphone' => 'iPhone', 'android' => 'Android', ); // There are hundreds of bots but these are the most common. $config['robot'] = array ( 'googlebot' => 'Googlebot', 'msnbot' => 'MSNBot', 'slurp' => 'Inktomi Slurp', 'yahoo' => 'Yahoo', 'askjeeves' => 'AskJeeves', 'fastcrawler' => 'FastCrawler', 'infoseek' => 'InfoSeek Robot 1.0', 'lycos' => 'Lycos', );pnp4nagios-0.6.16/lib/kohana/system/config/image.php0000664000000000000000000000044711662503006020765 0ustar rootroot array ( 'length' => '13,14,15,16,17,18,19', 'prefix' => '', 'luhn' => TRUE ), 'american express' => array ( 'length' => '15', 'prefix' => '3[47]', 'luhn' => TRUE ), 'diners club' => array ( 'length' => '14,16', 'prefix' => '36|55|30[0-5]', 'luhn' => TRUE ), 'discover' => array ( 'length' => '16', 'prefix' => '6(?:5|011)', 'luhn' => TRUE, ), 'jcb' => array ( 'length' => '15,16', 'prefix' => '3|1800|2131', 'luhn' => TRUE ), 'maestro' => array ( 'length' => '16,18', 'prefix' => '50(?:20|38)|6(?:304|759)', 'luhn' => TRUE ), 'mastercard' => array ( 'length' => '16', 'prefix' => '5[1-5]', 'luhn' => TRUE ), 'visa' => array ( 'length' => '13,16', 'prefix' => '4', 'luhn' => TRUE ), );pnp4nagios-0.6.16/lib/kohana/system/config/captcha.php0000664000000000000000000000174411662503006021307 0ustar rootroot 'basic', 'width' => 150, 'height' => 50, 'complexity' => 4, 'background' => '', 'fontpath' => SYSPATH.'fonts/', 'fonts' => array('DejaVuSerif.ttf'), 'promote' => FALSE, );pnp4nagios-0.6.16/lib/kohana/system/config/cache.php0000664000000000000000000000262711662503006020750 0ustar rootroot File cache is fast and reliable, but requires many filesystem lookups. * > Database cache can be used to cache items remotely, but is slower. * > Memcache is very high performance, but prevents cache tags from being used. * * params - Driver parameters, specific to each driver. * * lifetime - Default lifetime of caches in seconds. By default caches are stored for * thirty minutes. Specific lifetime can also be set when creating a new cache. * Setting this to 0 will never automatically delete caches. * * requests - Average number of cache requests that will processed before all expired * caches are deleted. This is commonly referred to as "garbage collection". * Setting this to 0 or a negative number will disable automatic garbage collection. */ $config['default'] = array ( 'driver' => 'file', 'params' => APPPATH.'cache', 'lifetime' => 1800, 'requests' => 1000 ); pnp4nagios-0.6.16/lib/kohana/system/config/pagination.php0000664000000000000000000000175711662503006022041 0ustar rootroot 'pagination', 'style' => 'classic', 'uri_segment' => 3, 'query_string' => '', 'items_per_page' => 20, 'auto_hide' => FALSE, ); pnp4nagios-0.6.16/lib/kohana/system/config/cache_sqlite.php0000664000000000000000000000034011662503006022317 0ustar rootroot 'children', 'clothes' => 'clothing', 'man' => 'men', 'movie' => 'movies', 'person' => 'people', 'woman' => 'women', 'mouse' => 'mice', 'goose' => 'geese', 'ox' => 'oxen', 'leaf' => 'leaves', 'course' => 'courses', 'size' => 'sizes', ); pnp4nagios-0.6.16/lib/kohana/system/config/view.php0000664000000000000000000000043611662503006020653 0ustar rootroot array('text/h323'), '7z' => array('application/x-7z-compressed'), 'abw' => array('application/x-abiword'), 'acx' => array('application/internet-property-stream'), 'ai' => array('application/postscript'), 'aif' => array('audio/x-aiff'), 'aifc' => array('audio/x-aiff'), 'aiff' => array('audio/x-aiff'), 'asf' => array('video/x-ms-asf'), 'asr' => array('video/x-ms-asf'), 'asx' => array('video/x-ms-asf'), 'atom' => array('application/atom+xml'), 'avi' => array('video/avi', 'video/msvideo', 'video/x-msvideo'), 'bin' => array('application/octet-stream','application/macbinary'), 'bmp' => array('image/bmp'), 'c' => array('text/x-csrc'), 'c++' => array('text/x-c++src'), 'cab' => array('application/x-cab'), 'cc' => array('text/x-c++src'), 'cda' => array('application/x-cdf'), 'class' => array('application/octet-stream'), 'cpp' => array('text/x-c++src'), 'cpt' => array('application/mac-compactpro'), 'csh' => array('text/x-csh'), 'css' => array('text/css'), 'csv' => array('text/x-comma-separated-values', 'application/vnd.ms-excel', 'text/comma-separated-values', 'text/csv'), 'dbk' => array('application/docbook+xml'), 'dcr' => array('application/x-director'), 'deb' => array('application/x-debian-package'), 'diff' => array('text/x-diff'), 'dir' => array('application/x-director'), 'divx' => array('video/divx'), 'dll' => array('application/octet-stream', 'application/x-msdos-program'), 'dmg' => array('application/x-apple-diskimage'), 'dms' => array('application/octet-stream'), 'doc' => array('application/msword'), 'dvi' => array('application/x-dvi'), 'dxr' => array('application/x-director'), 'eml' => array('message/rfc822'), 'eps' => array('application/postscript'), 'evy' => array('application/envoy'), 'exe' => array('application/x-msdos-program', 'application/octet-stream'), 'fla' => array('application/octet-stream'), 'flac' => array('application/x-flac'), 'flc' => array('video/flc'), 'fli' => array('video/fli'), 'flv' => array('video/x-flv'), 'gif' => array('image/gif'), 'gtar' => array('application/x-gtar'), 'gz' => array('application/x-gzip'), 'h' => array('text/x-chdr'), 'h++' => array('text/x-c++hdr'), 'hh' => array('text/x-c++hdr'), 'hpp' => array('text/x-c++hdr'), 'hqx' => array('application/mac-binhex40'), 'hs' => array('text/x-haskell'), 'htm' => array('text/html'), 'html' => array('text/html'), 'ico' => array('image/x-icon'), 'ics' => array('text/calendar'), 'iii' => array('application/x-iphone'), 'ins' => array('application/x-internet-signup'), 'iso' => array('application/x-iso9660-image'), 'isp' => array('application/x-internet-signup'), 'jar' => array('application/java-archive'), 'java' => array('application/x-java-applet'), 'jpe' => array('image/jpeg', 'image/pjpeg'), 'jpeg' => array('image/jpeg', 'image/pjpeg'), 'jpg' => array('image/jpeg', 'image/pjpeg'), 'js' => array('application/x-javascript'), 'json' => array('application/json'), 'latex' => array('application/x-latex'), 'lha' => array('application/octet-stream'), 'log' => array('text/plain', 'text/x-log'), 'lzh' => array('application/octet-stream'), 'm4a' => array('audio/mpeg'), 'm4p' => array('video/mp4v-es'), 'm4v' => array('video/mp4'), 'man' => array('application/x-troff-man'), 'mdb' => array('application/x-msaccess'), 'midi' => array('audio/midi'), 'mid' => array('audio/midi'), 'mif' => array('application/vnd.mif'), 'mka' => array('audio/x-matroska'), 'mkv' => array('video/x-matroska'), 'mov' => array('video/quicktime'), 'movie' => array('video/x-sgi-movie'), 'mp2' => array('audio/mpeg'), 'mp3' => array('audio/mpeg'), 'mp4' => array('application/mp4','audio/mp4','video/mp4'), 'mpa' => array('video/mpeg'), 'mpe' => array('video/mpeg'), 'mpeg' => array('video/mpeg'), 'mpg' => array('video/mpeg'), 'mpg4' => array('video/mp4'), 'mpga' => array('audio/mpeg'), 'mpp' => array('application/vnd.ms-project'), 'mpv' => array('video/x-matroska'), 'mpv2' => array('video/mpeg'), 'ms' => array('application/x-troff-ms'), 'msg' => array('application/msoutlook','application/x-msg'), 'msi' => array('application/x-msi'), 'nws' => array('message/rfc822'), 'oda' => array('application/oda'), 'odb' => array('application/vnd.oasis.opendocument.database'), 'odc' => array('application/vnd.oasis.opendocument.chart'), 'odf' => array('application/vnd.oasis.opendocument.forumla'), 'odg' => array('application/vnd.oasis.opendocument.graphics'), 'odi' => array('application/vnd.oasis.opendocument.image'), 'odm' => array('application/vnd.oasis.opendocument.text-master'), 'odp' => array('application/vnd.oasis.opendocument.presentation'), 'ods' => array('application/vnd.oasis.opendocument.spreadsheet'), 'odt' => array('application/vnd.oasis.opendocument.text'), 'oga' => array('audio/ogg'), 'ogg' => array('application/ogg'), 'ogv' => array('video/ogg'), 'otg' => array('application/vnd.oasis.opendocument.graphics-template'), 'oth' => array('application/vnd.oasis.opendocument.web'), 'otp' => array('application/vnd.oasis.opendocument.presentation-template'), 'ots' => array('application/vnd.oasis.opendocument.spreadsheet-template'), 'ott' => array('application/vnd.oasis.opendocument.template'), 'p' => array('text/x-pascal'), 'pas' => array('text/x-pascal'), 'patch' => array('text/x-diff'), 'pbm' => array('image/x-portable-bitmap'), 'pdf' => array('application/pdf', 'application/x-download'), 'php' => array('application/x-httpd-php'), 'php3' => array('application/x-httpd-php'), 'php4' => array('application/x-httpd-php'), 'php5' => array('application/x-httpd-php'), 'phps' => array('application/x-httpd-php-source'), 'phtml' => array('application/x-httpd-php'), 'pl' => array('text/x-perl'), 'pm' => array('text/x-perl'), 'png' => array('image/png', 'image/x-png'), 'po' => array('text/x-gettext-translation'), 'pot' => array('application/vnd.ms-powerpoint'), 'pps' => array('application/vnd.ms-powerpoint'), 'ppt' => array('application/powerpoint'), 'ps' => array('application/postscript'), 'psd' => array('application/x-photoshop', 'image/x-photoshop'), 'pub' => array('application/x-mspublisher'), 'py' => array('text/x-python'), 'qt' => array('video/quicktime'), 'ra' => array('audio/x-realaudio'), 'ram' => array('audio/x-realaudio', 'audio/x-pn-realaudio'), 'rar' => array('application/rar'), 'rgb' => array('image/x-rgb'), 'rm' => array('audio/x-pn-realaudio'), 'rpm' => array('audio/x-pn-realaudio-plugin', 'application/x-redhat-package-manager'), 'rss' => array('application/rss+xml'), 'rtf' => array('text/rtf'), 'rtx' => array('text/richtext'), 'rv' => array('video/vnd.rn-realvideo'), 'sea' => array('application/octet-stream'), 'sh' => array('text/x-sh'), 'shtml' => array('text/html'), 'sit' => array('application/x-stuffit'), 'smi' => array('application/smil'), 'smil' => array('application/smil'), 'so' => array('application/octet-stream'), 'src' => array('application/x-wais-source'), 'svg' => array('image/svg+xml'), 'swf' => array('application/x-shockwave-flash'), 't' => array('application/x-troff'), 'tar' => array('application/x-tar'), 'tcl' => array('text/x-tcl'), 'tex' => array('application/x-tex'), 'text' => array('text/plain'), 'texti' => array('application/x-texinfo'), 'textinfo' => array('application/x-texinfo'), 'tgz' => array('application/x-tar'), 'tif' => array('image/tiff'), 'tiff' => array('image/tiff'), 'torrent' => array('application/x-bittorrent'), 'tr' => array('application/x-troff'), 'tsv' => array('text/tab-separated-values'), 'txt' => array('text/plain'), 'wav' => array('audio/x-wav'), 'wax' => array('audio/x-ms-wax'), 'wbxml' => array('application/wbxml'), 'wm' => array('video/x-ms-wm'), 'wma' => array('audio/x-ms-wma'), 'wmd' => array('application/x-ms-wmd'), 'wmlc' => array('application/wmlc'), 'wmv' => array('video/x-ms-wmv', 'application/octet-stream'), 'wmx' => array('video/x-ms-wmx'), 'wmz' => array('application/x-ms-wmz'), 'word' => array('application/msword', 'application/octet-stream'), 'wp5' => array('application/wordperfect5.1'), 'wpd' => array('application/vnd.wordperfect'), 'wvx' => array('video/x-ms-wvx'), 'xbm' => array('image/x-xbitmap'), 'xcf' => array('image/xcf'), 'xhtml' => array('application/xhtml+xml'), 'xht' => array('application/xhtml+xml'), 'xl' => array('application/excel', 'application/vnd.ms-excel'), 'xla' => array('application/excel', 'application/vnd.ms-excel'), 'xlc' => array('application/excel', 'application/vnd.ms-excel'), 'xlm' => array('application/excel', 'application/vnd.ms-excel'), 'xls' => array('application/excel', 'application/vnd.ms-excel'), 'xlt' => array('application/excel', 'application/vnd.ms-excel'), 'xml' => array('text/xml'), 'xof' => array('x-world/x-vrml'), 'xpm' => array('image/x-xpixmap'), 'xsl' => array('text/xml'), 'xvid' => array('video/x-xvid'), 'xwd' => array('image/x-xwindowdump'), 'z' => array('application/x-compress'), 'zip' => array('application/x-zip', 'application/zip', 'application/x-zip-compressed') ); pnp4nagios-0.6.16/lib/kohana/system/config/cache_xcache.php0000664000000000000000000000037011662503006022254 0ustar rootroot 'mysql://dbuser:secret@localhost/kohana' * character_set - Database character set * table_prefix - Database table prefix * object - Enable or disable object results * cache - Enable or disable query caching * escape - Enable automatic query builder escaping */ $config['default'] = array ( 'benchmark' => TRUE, 'persistent' => FALSE, 'connection' => array ( 'type' => 'mysql', 'user' => 'dbuser', 'pass' => 'p@ssw0rd', 'host' => 'localhost', 'port' => FALSE, 'socket' => FALSE, 'database' => 'kohana' ), 'character_set' => 'utf8', 'table_prefix' => '', 'object' => TRUE, 'cache' => FALSE, 'escape' => TRUE );pnp4nagios-0.6.16/lib/kohana/system/config/locale.php0000664000000000000000000000104211662503006021132 0ustar rootroot$6hheaP$hmtx\Gt-(kern]bd̜loca-,maxpE name|!!NpostY:$j\prepuy^iVaVa      6 7 A B I DFLTcyrl*grekFlatnVMKD SRB R AZE RCRT RGAG RISM RKAZ RKRK RKSM RLSM RNSM RSKS RSSM RTAT RTRK Rkernmarkmkmk 6 8>DJPV\bhntzdfGffllfGS  7 7 9 9 ; ?  7 A  $*06<D  "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~      & , 2 8 > D J P V \ b h n t z     " ( . 4 : @ F L R X ^ d j p v |     $ * 0 6 < B H N T Z ` f l r x ~      & , 2 8 > D J P V \ b h n t z     " ( . 4 : @ F L R X ^ d j p v | ==XX}}RIIggHHHH9D9HhDh 9^D^5V\D\RHHHHvRHHHDRDhDhDHR9DR(DHD9HDRBDBoDoBDB<D  ?@BBBHJCLLFPPGRRHUUI_aJijMnnOuyPUVXYZ^`hiAAjGGkBBlDEmNNoQQpSTqVVsXXt\\u^^vaawhixknzqq~stvvxx||~`t + B C E H"- 5 7 A6A $*06<BHNTZ`flrx~ &,28>DJPV\bhntzDDDDDDDDDDDDDDDDDD|rrDrDrDDDDDDDDDDDD8>4)?k&&&&&&NuuuuNu&ak}}Y N}}}KaaDK&////&K&aaaakaaaaaaakDDD2uDDD}DDDDDDDD}DKkNNYuNNuYYuuuu&aaNNNaa<NNNNNN)& K&Y N2&aaaakaaaaaaaaaaknUaV}U}//99999S$$%%&&''(())**-- .. // 11 22 33445566778899::;;<<==IINNRRUUYZ[[\\  ! "#    ""&&$0077%::??ii&sszz&~~'(  ; ;$$&&**--22 66 77 88 99 ::;;<<DDFFGGHHIIJJLLMMOOPQRRSSTTUUVVWWXXYY ZZ![["\\#]]$% &'&()*+*,-,./00121212))3333+333 455  !!6"" ##6$$7%%8&& ''800 11/66977:88;999::233783;00911<22933<44955<rs9{{=~~>=  8f$%&'()*-./123456789:;<=INRUYZ[\  "&07:?isz~ ; JDFLTcyrl*grekTlatndMKD SRB XAZE dCRT dGAG dISM pKAZ dKRK dKSM pLSM pNSM pSKS pSSM pTAT dTRK ~TUR ccmp&dlig,liga2liga:locl@loclF"*2:BJ@$BlZZZhz LMLL11 !gg"W$=IIKKLMOO      ""$$&&((**,,..0022446688:;==??AAHHRRTTVVLL11ggqo < 0 & IO O I OI (  IL L LI   W WVA : 8 ; 9 > ? 7 @ < A   B C E F G LML1g33fR  PfEd@ m`,d l, d8JJ~!BE?COXauz~_eku .<[ex{-KcEMWY[]}  & 1 : > I d q !! !!!!!"!$!'!+!I!K!""" " "" "-"="C"H"U"a"e"""## ###!#%#(#}##$#&&<&G&g&o'''))**/+,l,w... $EPCOXatz~bjr,0>bw{0Ph HPY[]_  * 9 < G _ j t !! ! !!!!"!$!&!*!<82 dZUPFE@432,zxvtrqponlkjhgedcb_XWO:532!|xtmcaEA,R2B;5ߺnfܱ   ~b|!$BEEPiptuyz?CCOOXXaatuzz~~_.bejkru*W XZ[],.`0<c>[pbewx{{-0KPchLPblnrz EHMPWYY[[]]_}!0>DWZ c  &y * 1 9 : < > G I _ d j q t       !!! ! ! !!!!!!!!"!"!$!$!&!'!*!+!<!I!K!K!S!!""""" " " """" "#"-"8"="B"C"H"H"P"U"`"a"d"e""""""#### ##### #!#%#%#(#(#}#}####$#$#%&&8&< &?&G &`&g &i&o '' !'' "'' #') %)) * * */*/ ++ ,g,l ,u,w .. ....   89 ;> @D FF JP Rk  ,   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ardeixpkvjsgw l|cnTm}bvw~z{: y|p~qz{|z}q sLjq{)j/s3fbwPP;f=fRBsJ}s jjb\jjjj jj)R`fX{Hjj``'''Djb{sj\)'\jj=fHf JJ }T{3`}TjNNs, %Id@QX Y!-,%Id@QX Y!-,  P y PXY%%# P y PXY%-,KPX EDY!-,%E`D-,KSX%%EDY!!-,ED-ff@ ]/10!%!!fsr)! m@a ` b  10@9pp``__OO??]@ q%4632#"&!#5L97NN79LD{h8NN87NM@ b1<20#!#h++W@6 cc       991/<22<2222220!! !3!!!!#!#!5!!5!T54&'3.54673#.'#.qwvrdgripbldeYm vd`D n_VxiXPj!H@  1)t 7#5!#3RWWfoiҙ30CsqngDlEO ٬cSeNfGXVe=yB""kpqZ=yqPikk`hb10#h+ @  q 21990&7󚆆mcdmbjj} @ q 2199056'5bj\]jbm''!LI@+   i   <2<29912290 %#'-73%yL LyL\ \նv}vw} !@r    <<1/<<0!!#!5!1Ϡ1Ϣ11J@   91990>=3J^XE%ZZZs10!!Zs 8  KQX <<<32!53!5>54&#"pkh ou=Ŗq 9< mĖ*M@+ etee)te&ei`+  #) #  +9999190>32!"&'332654&+532654&#"#u^unp _2 p,. ׫23"f~?@%d d M ss i  <<91/<<290KSXY"/ ] ]K TK T[K T[KT[X@878Y@ 8I( 68 GH ]] !53!53!!3Xtj%m ky@%xetee wb `     9190K TK T[KT[X  @878YKTKT[X @ 878Y@& //]]!>32!"&'332654&#"#T4Vgqq Z5VդT$$23"@C %c@" eely#ei`&    &190@%   ) ) NN N!]%2654&#">32#"!2#.#"DlB%O[q n¾FȽKJy^ejr@Mwb  91/90KSXY"K TX  @878YKTX @ 878Y] #!#!-Nuo1\ />@"$e ee*i`0$ ' -'! 09919904&#"3264&#"326#"$5467.54632)|{{|lv͟ҟϴ%]@$ elyee i`& #  &190@ !"AAA ]#"5432!"&'5332"32654&CmO[p m¾KJ xRel%"ɽy @a a ` <21074632#"&4632#"&M88ML99LM89LL98Mh8NN88MM8ML99LMJy"@a  1990>=34632#"&J^X?M88MM88ME%Z 8MN78MM^@29190 5Ѧf@rr<210!!!!^@<919055//y "<@ a ! ei `#! #10%4632#"&>32#>54&#"#hM97NN79MjT{~rah8NN87NMc/.ֶ3H+ʜ{o@Mm@;BAKE'N$ KE($ Ez Kzz@|$z+ |z+7N'(HA ==1N22991<9999990%#"&5463253>54&'&$#"3267#"$'&5476$3254&#"326;]گ];DCjϳZVd_m+`5l}YawLNsyzrRPPR%oT&']gw}LLF]]{GF~b|i}@Qdddd  Mo ob    91/<290KSX22Y"(]@((( (,+]]! 5333!53!3$H}}jkjjHjqd$E@'o obo ~ $ !$ !%229991/2290%!2654&#!532654&+53#5!2!+w埙jj~}jkäs8@ndn i`&' %10o]#"&'&5!2#.#"3267BapmIzq%0dap\@Aq=@ ob o  $ !299991/220@ 0O]%3 !#53#5! !#7ܺwRPjL66Hjkvtq3R@*  obo ~ $ !2221/00O]353#5!#5!!53#5!!53q{R{{{jk q7F@'  obo ~  $ !2221/20353#5!#5!!53#5!3q{>{{jk ~jsG@"  o ndni` &%1990 0 O ].# 3267!5!# !2#q]ͯiY88kMM_b;<q^@.  o bo ~ $ $$ $!2222221/<2<20@ p]353#5!#!#5!#3!53!3qGGjkkkkjj~jq 7@ obo $$! 221/220@ 0 P ` p ]%3!53#5!#GjjjkkTVm@ dn o b $ 12990K TX@878Y0]KTKT[X@878Y533265#5!##"&rXXw^qGca9kk"q(@Dd  dM  o bo $$!2<2991/<22<290KSX2Y"p]@  $ '6 F HW YYhzz    * % % & &'(: 6 6F F @ F @ F @ F@B@@@@@S X X U UPXXi i e efb```y  y  v vvyyC]]353#5!##5!# 3!3qGͪ3 HapmmpbEnpbNQJKQkdappbcVobcqC@!o ob o # $ !2299991/220_]!2654&#!53#5!2#!3wjkjs"@@nn i`#  %#99999190_$o$$] 47>3 ;.'2#"`jmpbE6mdapbcVm:C@QJKQq7$@H  Mo #ob o#   $ $ !%229999991/<2229990KSX9Y"3!.+3!53#5!2%!2654&#!Fe(ٶCpbz'[REjۊQjjkп&)'@B#"$!   M !dn'dni'`* !)$)*9999190KSX99Y"+]@ +0+P+p++]KTKT[KT[X*@**878Y@t( ) ) ) )) )!)"8 9 : : : 99:: :!9"8#I I J I HI I!I"Y Y Y Y Y Y!Y"j l l l k kl l!l"i#{ { { { y{{ {!{"y#7++]]732654&/.54$32#.#"!"&sq֯hq|ɹ˭{HTlt7;A©-+ž{kz<7=2B{@  ob o $ $1/2<20K TX@878Y]K TK T[X@878Y@ /`]!53!#!#5!3I{.{Ij` j`bn@%   ob`$$ $$!1<299990`]KTKT[X@878Y]#5!#326#5!#! H廿jkkkkS@9dd  M o b   91/<290KSX22Y"]@"   (* * ']] #5!###5!f jzkkjkk 3@[d d    dd     M  o b 91/<<<290KSX22Y"]KTX@878Y@   %) $?< 5L FX\ Tm d~ t        &&&&)$ &546 4 7 IIEBFE G D H[[XW[X Y [_______feeehgff g g f d ehjjhusvuu v u w t y||yV]]!# ##5!# 3 #5!#y!7TZ9Bjkk9\kk @gdddd   M o bo  91/<2<290KSX2222Y"]]K TK T[KT[X@878Y@ )(%&65EFVUjicdyz        &&'& ()%%$$/6777 8997FCGGEE KIFIIUSSSSWSV V S [[WYYedeedede e d kllke``eee`xzzzz{yx x y {~||@{{}yuxxur]] 3!53 #5!# #5!# 3!53LP@Iuנjjskkkk?jjZ/@E  d d    M  o bo    $$999991/2<290KSX22Y"]]K TX@878YK TK T[KT[X@878Y@d 6 E [Zf xw       **/::7 8 ? 9 ? 9 ? ???F I V Y [ [ i h o h o `vvx x x )]]!53#5!# #5!#33+uu?jkk\kk,j\? m@#  M b     991/0KSXY"]@  O ]]35!#!!53\{^LzHZH$@ssq10!!!!/jjB*@Mb/9910KSXY"#mo@ssq9910!5!!5o/jNj@ b91290 # #}-m/10!5mPPsdv10K TKT[X@878YKTK T[K T[KT[KT[KT[X@878YKTX@878Y #oudxfD (~@/!  z!#&` z!-" ,' "*)22991/99990@$*o*x(*z( ]]5#"3263!5#"&5463!54&#"#5>32/퉆ts=kn_`VNvzojsJFIydb));!G@%!zqz` 5,'0"2221/990#]7#5!>32#"&'!532654&#"i6{{6ij@jmd__djuʿfD5@  `- *10o]#"532#.#"3267'ްeekw?31/0|}f!O@& zqz` ,',5 *"<<1/990@ ####]%3!5#"5432#5!54&#"32636{{6fjjd_76_d)jifVDN@z  ` *2190@ @]]!32673#"5432.#"V碞y,}34ױJqq@& zq z - '6,0<2<91/222990]KTX@878Y``?]]#.#"!!3!53#5354632qaSOgT)CBKNqkjjRkf9D,f@3, )z) #`- -, '5&7*-22199990@ ....]#"&'53326=#"54325!4&#"32653iX`}6{{6h[&&h`ďd_76_dkJo@,  zqz =,,' :,',021/<299990/]KTX@878Y353#5!>323!534&#"3Th3l_zj@jVlnjjÏjJ` I@ z z , ',021/20]KTX@878Y4632#"&3!53#5!C/.CB//C갰hq.DD./BB(jjRk;9 i@"   z-6' , 01990/ ` p ]KTX@878Yss]4632#"&#5!#"&'533265C/.CA0/C-fëH>_UR[Wq.DD./BBzkq!!`Z{;@X    >>M z zqz   ,',0<9991/<2290KSX9Y"]@  &))899HVWggghw           ( ( ( &)-**+,)/6 6 6959?F D D DEY X X WVVVh f f gegaabef`x x x zxxvz T]])53#5!#5!# 3!533Ji‘j@j kkjj;R @@zqz,',0 21/20 ]KTX  @878Y%3!53#5!鱱ijjj@jJ^D0@A  +'z)%! z.#  = ", , '?=',?(,* '$,&01291/<<222990@ ?2_2o222]KTX111@878Y@/ / // 2 ]>323!534&#"3!534&#"3!53#5!>32%5n`o{`o{h3d|Xuwjj%jj,jjTijp{JDp@.  zz =,,' :,',021/<290/]KTX@878Y353#5!>323!534&#"3Th3l`yjRklnjjÑjfjD +@  `D *10 o]%2654&#""5432hFc32;VD #U@,  z"z ` $,5!,' 0$22212990%%]32654&#"'#5!>32#"&'3!53i6{{6Hiʵkd__dkkfVD#S@+# zz `$,',5 *$2<<12990%%]3!53#"54325!4&#"326536{{6hkkd_76_dkJD@" z z -,' ,021/2990@8/@@@@@@D@@@  ]]KTX@878Y#.#"3!53#5!>32jNKͦh6z-c)ONjjTioksD)@A#"$!>  > M !''`* !->'F$-E*9999190KSX99Y" +]@X'' '!'"'#Z Z Z Z ZZ Z!Z"X# !"# !"# !"#@++]]75332654&/.54632#.#"#"&sj|_{ֽTcjutwZg;wv]YFV1-,f,*gtRRCQ*-/o,;'qh@  z`, '/<291<2990K TX@878Y@&&/ ]#533!!32673#"&5ݢZ4FHBkJk]LU_7'u@"   z `,',:,' /<1/<2299990K TX@878Y]KTX@878Y!3!5#"&5#5!3265#X3k__z'Cjjo9k'@9    >>M z    91/<290KSX22Y" ]@H' Scv   %*** * *80HG GWXghvvwxx x x ]]!#5!# #5!#yy++wykk%kkD!'@[   >  >> > M  z  91/<<<290KSX22Y"`]@ $, (3= 9DJ IW ^di itz z          &() & # **%&:;??????:; 9 ; 8 8:9FEEE F F I H HHHHFQPPPPPPPPP R T XVSPb``dd````` b d fb`uxy}}yyyz@y v q u v vvwwwtw x]] #5!## ##5!#vęw'kkDkk->j'@g >  >>>Mz z    91/<2<290KSX2222Y"K TKT[X@878Y@ %*GIWWYXffhhyy       (),,% % ( '&&&))'9?9?HIGFGZYYYWY WUVVVVjjjgh h h gefx||||y wttttxvuuu []]#5!# 3!53 3!53 #5!#TߏLl%3kkw7jj>jjkk9'@Y  > >M z   - 9991<29990KSX229Y"]@ZYix))* * ''&XSUPUPSV V hd``dvwx~~tty x x yuuvvvv(]]7#5!# #5!##"&'53326Fsy++w2zo/c2^9<7Cñkk%kkT|[D;=R' j@" >> M z z  - - 991/0KSXY"K TK T[X@878Yif ]35!#!!53RjffBkVf#V$^@0 !   ! s ssq! %$ '%<29991/999999990#"&54&+5326546;#"3>l==l>DVdbVititݓhXឈ"XG10#$[@/   ss#sq%' %<29991/9999999903265467.54&+532;#"+FUbcUF?l>>l?W"Whtitݔ'>@    919999990#"/&'&#"5>32326d]` _\Yd^` a\'XTB 9IMWQB:J! !@ ai   1/04632#"&53L97NN79LC{Dm8MN78NN5PL"I@'  `# -" #222212<2<0%#&5473#.'>7u#dd\PjsdZt,+ .'{ i ldL@(  seis   I <2291/22990#.#"!!!53!53#534632Ni q`ydt%UK_ekjRk'h\#/o@= -'! 0 -!-'!0 *$0* $ $*099999991999999907'#"&''7.5467'7>324&#"326^+))-`8wE@}=_))*,_8xEBzQrpqq^z@Fw9^,*(ppr$K@]dd  M s s sb"s# % #I! I%<<9999991/22<22<290KSX22Y"]@6iih     89969::9F K M MKKJ@@BBFIXVYYYYge g g gffgjhohojjhu y||yzF]]!53!5!5'!5!#5!# #5!#!!!!3hlR)WSGmjoiAikk\kkizTij@ G<210##  \= Ak@;39 (',o$ o?i$B3/9)'J54&#.#"#"&'532654'&'.5467.54632{D7k :;\hXds }irNI̭ZM\lkhy ~vmROȦN.S5&`9KHSaSamc_~,/~[PQbTq zc^1~O77! z@   1<20K TK T[KT[KT[X@878YK TK T[KT[X@878YK TX878Y2#"&546!2#"&546=0EB32BE/EB23BE!E03BB30EE03BB30E2JM@+    ? 3?' REK!Q9K!M-K1/90#"&54632#.#"32672#"$'&5476$"3267>54&'.`PWTriwyxvaqmmllmmmmllmm^]__]^⃄^]]^\^=%'mf_cnmmmmnnmmmmng^^]僂^^__^]⃅]^^}(,q@<&+))&i-) #*#Y#Y -2299991999903#5#"&546;54&#"#5>325#"326!!FP0}WtiWfLMBilea\oFTP30pr-T^FEPNQUah%# :@     Z Z <21<222<220 5 5%)+#)+#ssRssR^@ r 10!#!^ZZs10!!Zs$<T@TN N M  1%=1I 7" " PNPN"L7KCL+KCMOU2<99999991/2<229990KSX9Y"32654&+3#'.+3!53#5!2"3267>54&'.'2#"$'&5476$}SSTR}*;tL#>1\TSS`׃^]__]^⃄^]]^\^ㄘmmllmmmmllmmLKJL3(DF/DDCpmS[j^^]僂^^__^]⃅]^^gnmmmmnnmmmmnb+(10K TX@878Y!!Vu= @  i 10"32654&'2#"&546LhgMLhjJ@v+..fiMLfgKKk1.-rB *@r  r   <2<21/<<0!!#!5!!!1Ϡ1yyZk@6   M   h  \ 9999199990KSX9Y"#5>32!53!5%>54&#"FBEJVJaTN^ "hzlKMzBUcLd*R@,& )&h+  #)#\\ +999919990>32#"&'532654&+532654&#"#}I;j_wyHDFb\^ffe5acQLRWFlcHdwdrzJMXR]_JJJCH@ARfO10K TKT[X@878YK TK T[KT[X@878Y3#uf;V'@3   zzz ` , ,',:, '0 2<91/<2299990!]K TX @ 878Y!]!3!5#"&'3!53#5!3265#X4Z9^'鱦^`y'Ahjo$$kkk;-@ ob   912290!####.54$yvkkk/NݸBL  a  104632#"&M97NN79M8MN78ML#u"@    991/90!#"&'532654&'B@?~p*X.)O#9B,,@p1QY 5-X< ?@Mh \ 12990KSXY"535733fTzj^T^d ,@ i Y Y99102654&#""&54632!!jklihmliԯP-LװױbhH# :@     Z Z <<1<222<220 5 %5 s+)N+(#^R^sXXs^R^sXX'd&{5?&{'5tdd'd&u5 "8@a ! e` i#! #10#"&54632#"$54675332673 M87NN79LjU{~q`m8NN87NM/.ֶ3+ʜ{k&$ :uk&$ 8uk&$ ;u^&$ 9u\&$ 7um )@a dd )('d&d  %"#$M %o  f'#o!$ ('& *%"   *99999991/<29990KSX22Y"]@://   / & ) "!   ///..)(%'&+/]]4&#"326! 53.546323!53!3wY?@WW@?Y#"HHKrrNH}}Z?YWA?XXj%zSrrP#jjHj#@Udd  ddMo!ob o~  $ "$ $<22991/<2220KSX2Y"]@ !"#0%O%o%%]!#53!3!53#5!#5!!53#5!!53dZ昤XN{P{{{MjHjjk su&&zLq3k&( :uq3k&( 8uq3k&( ;uq3\&( 7uqk&, :uqk&, 8uWk&, ;u_\&, 7uq M@%  obo   $!<2299991/22<200]%3 !#!!53#53#5! !#8ܼPyȾRPjL66H}1je}kvtd^&1 9usk&2 :Husk&2 8Husk&2 ;Hus^&2 9Hus\&2 7HuD /@   <291<290  ' 7 1s33r4rP13p4pq3d' +s@:, +&  ) *& nn&i`,,#* # )+#%,99999999199990_-o--].#"324&'7!"&''7&5!27A| "5@}!"{WWoeNWUC`PXVwQ`YYQJuRlSVVEiZUSG`bk&8 :u`bk&8 8u`bk&8 ;u`b\&8 7uZk&< 8uqM@&oo ob o # $ !222299991/220_]!2654&#!53#5!#!2#!3wp9jkkj;3@;-.# z#"'q` z*-.$-">1'*'"', 04999991/99990@D --./5``o55/0123-/0123]].#"!534632#"#"&'5332654&/.546wz 6IYwUOmofoPuVhYwZj8l]4M/7cr%#eiyhTuI6ARzfd&DC9ff&Dv9ff&Dp9f7&D~9f!&Dj9f&D|9fD 8?@G,2*$ 29z*z2/*<'!6`@ $+-?+239**@22999912<2999990@(AoA*+,9?]]5#"326#"&5463!54&#"#5>32>32!32673#"&.#"/퉆tsmS}t_`V7Ju衟y+z\NvzoF[XIxcc))WZXY}[,fuD&FzdfVd&HC^fVf&Hv^fVf&Hp^fV!&Hj^`d&CHJf&vH f&pH!&jHfj-a@3-,+'$#"!( `(q.-, #"! '($+ D*.99999999199990 /o/].#"32654&#"5432.''%.'7%5-Q(/l#K4I2%%=_w\B% pاy/"5k7N:QV^DNJ7&Q~fjd&RChfjf&Rvhfjf&Rphfj7&R~hfj!&Rjhy '@a ar  <<104632#"&4632#"&!!M87NN79LM87NN79L8MN78MLU8NN87NML} +@?+*&  ) *& &`,,#* # )#+D#*,99999999199990@ -o-wx]].#"32654&'7#"&''7.54327H&pJ-(oJw>@^CL=>^@Lo99Hv1g=;Ly3Jv56?Ms232?7d&XCH7f&XvH7f&XpH7!&XjH9f&\vD;V #S@+ "z zq` $,5!,' 0$2221299990%]32654&#"#5!>32#"&'3!53i6{{6Hijmd__dkk9!&\jD1'q;$f&q#Di'z!$f-&zSDw'}$fwD'}bDsk&& 85uff&Fv^sk' ;=u&ff&phFs^' ?=u&f!&{hFsk&& <5uff&Fq^qk&' <uf&G 6Zqf)d@2!z! 'zqz` $,',5$ **<2<91/<2990@ ++++]%3!5#"5432!5!5#5!3#54&#"32636{{6Ffjjd_76_dJjujjiq32'q<(fV&q^Hq3m' >u(fVH&z^Hq3^' ?u(fV!&{^Hqw3'}q(fwVD'}Hq3k&( <5ufVf&Hq^sk' ;Xu*f9f&p\Jsm&* >3uf9H&Jzs^' ?Xu*f9!&{\Js6'*f9'\Jqk' ;}u+k' ;uKq'@ $&$$" $$ !(<2222<2222221@# o b%!o~/<2<2@   9/<<220@ )p)))]!5!53#535#5!#!5#5!#3#3!53!3wGGfjzkkkkz?jj~jJ%@= $, ,':," ',0&<2221@"z q#z/<29999@ z 9/<20/''']KTX&&&@878Y353#535#5!!!>323!534&#"3Th<3l_zjPzvjzlnjjÏjJ^' 9u,7'~Gi2'q<,`'q]m' >u,H'zGqw&,}Jw`&L}q^&, ?uJ`' @@zz,',0 21/20 ]KTX  @878Y%3!53#5!갰hjjjRkqV &,-4@"!1J9&LMH@6%1TVk' ;u-;9Ef'pqS't.;S'N;$@X    >>M z zz   ,',0<9991/<2290KSX9Y"]@  &))899HVWggghw           ( ( ( &)-**+,)/6 6 6959?F D D DEY X X WVVVh f f gegaabef`x x x zxxvz T]])53#5!#5!# 3!533Ji‘jOkkkjjqm' 8fw/;Rl' 8vOqS'/;XR'0$Oq' 6n/;X' 6Oq'y(/;E'y|}OV)Q@-  o bo  $ $ !<2299991/290353'7#5!#%!53{FF3F{jq\kk\-{a@% z qz, ' , 0<2<9991/290P]KTX@878Y%3!53'7#5!7ꮊ=Ǯf`VjbVdl' 8jv1J6&vKQdE'1JSD'Qdu&1 <gJf&Qq^q}&jQ`V'M@ $%!(221@ $%!dnob! i%o/290353#5!>32#"&'5332765&#"3`{JGIp[Xu1/Ѿkkrt""caKI@$kJ9JD(l@',':,%',0)261@%" z'z /290ss]@ /*`****]353#5!>32#"&'53327654&#"3Th3lUSëH>_UR[++`yjRklnec!!`Z><Ñjs2'qH<2fj&qhRsm' >Hu2fjH&zhRsk' @Hu2fjf'Rwu!^@0 obo~    %"2299991/0 #0#]%# !! )#5!!53#5!!53q7#3P{Ryy{jjb_ fD ,3k@/ '--z  0*$`4'3 - !*429912<2<9990@P5 -3]]%2654&#"!32673#"&'#"5432>32.#"h碞y,IEςFIzF}ba`c32c``cױq7l' 8v5J6&vKUqS7'5JSD'4Uq7k&5 <uJf&Uq4l' 8v6s6&vKVk' ;u6sf&pVu&6zsuD&Vzk&6 <usf&VquB'z7;u'q&zWBk&7 <u;'M&W 6B@  $ $ <<1@o o bo/2<2<20K TX@878Y]K TK T[X@878Y@ /`]!53!5!!#!#5!!!3 I{.{I j=w@`wj;'q!#533!!3#327673#"'&5#53ݢZ4FH!!BBkJkԇL*+_GF,`b^' 9u877&~HX`b2'qa<87&qxX`bm' >u87H&zHX`bi&8|mc7&X|U`bk' @u87f&rX`gb&8}h7w)'&X}h 3r' ;|:!f'ppZZr' ;|<9f&p<\Z\&< 7u\?l' 8v=R6&vK]\?p' ?=R&{<]\?k&= <uRf&]qJqi@-'6, 0<21@ z qz/2990]KTX@878Y``?]]%3!53#5354632#.#"CBaSOg**jjjRkKN8;;(7#535#5!!!>32#"&'!532654&#"찰h<6{{6ijPzvjzd_ _djuʿ@d(2"#6763!2)53327654'&+!2654'&#!/DGfsb#tsOPabNLKKk+SRjY[XL$]\OOabj??+>ONqdO;+327654'&#"#5!67632#"'&'!53#5JIHIIHIJPi6TS{||{ST6edqqppeed/0 /0dj@jqd%!2654&#! 3 )53#+w|bNjVvjv; 32654&#">32#"&'!53#56{{6ʿmd_ _dj~s4@ % &'1@nidn `06$32!"$'332#"sB7apmnzq%0HdapU@AXSIHSs9^6#"&'&'&576!247632#4'&#"#&'&#"32767Bap67IzcmQKrHBA>_2*R[Vq%op{{{{ll0lkdap\ (W:<!`--zYYPOf1#"'&5763267632#4'&#"#&'&#"3267'ް荍ed12R<|HAB>_1+R[,*kFGLLKLw? H5!`--==@@st4tt|}q@"#6763! )5; 76!#/DG^wP˺#ܺjY[Xg tjlHqd %!"3#3! $5476!3!#յSRNb|S{jNMkkjސvL;+54'&#"3276!#3!5#"'&32!#OIJIHHIJI6ST{||{TS6iieeppqqdejjd0/60/dfjD&2%#"'&'57276'4'&#"'&7632" 76&bB!&bb6hhpl HHEI%Mb鍌荍?ɔLKKL(LK18DCY.-14B_ KCuu8uttuq3)3!!#3!!#!#33>{{{R{LqLks!*"#6763 #"'&'&'&=!'&!3276Sll0BE77pc}~ap67{}#|}}|OPklVpb2122apG1ܜ}(H@ !'$%)91@!e e tee'i`)90#.#";#"32673#"$5467.546!2{p 2_۴&˸ ~j9iѫ 5V7"'533276'#5!#5!!53#5!Xrw/0{>{{]VDKM9k =c7;q/#4'&'&#"!!#"&'5332765#53547632qa *Og**)\]CBa *Og**\]CB.'89k1[[.'98k[[sM^0"#5'&# 327!5!! '&76!267632#4'&@}$q4QjLSeY=@}|_nv6P DnpkӚ_bTM9uG_<=c6e kk&%3!53!5!#5!#!! G jjj Lkkq!632#4'&'" 3!3!53#5!#}|CAG9_1%=WKͪ<Gj`-&<3jjjkkF( #5!# 3!533!5347632#4'&#"‘baM=A>_2*R[++kkjjjjK_^!`--=;;R53#5!3#3!53<ijpj&jjjfT'&'&#"#56763273!53 3!53''%%"#5<^212/o==2<wqŪy&= \D.-|bVskk"kkcVJ^3%#"'&5#5!#32765#5!#32765#5!#3!5#"&5nSR`o{@A`o{A@3d|uwggjj+]^jj$]^jjijp{3V533265#5!#5!###"'&r/,Xw^ yEIJc019kf/kky]JVDq@/  zz =,,' :,',021/290/]KTX@878Y353#5!>323!534&#"3Th3l`yjRklnjjÑjs'"&'&7>3 '276!'&#"HapmmpbE77pc}~}s # s} o}}o dapjpbcVpb21k$ܜnP&2c+D&Rs+7"&'&7>32676323!534&#"'2#"Hapmmpb̚==IGƾ^wX,77pc}~dapjpbcT(kkږ0pb21kQJKQfV9D'476323!534&#"#"3226& e-AHðW[A 鐐ؗ  kk{ 328@#!2#!3!53"#676!27654&#!/DGbs-NNqrjjY[XI'#PQ;V8327654'&#"47632#4'&#"67632#"'&'3!53JIHIIHIJabCFB>_1+R[,*6TS{||{ST6HiedqqppeeT\]!`-->54'&#"#67632327673ӄ{VW˹|RSXYq||hWXŶ98^]^]sH3ٟ_^=7+ҾaaA;7::lGFRQsD1%#"'&5476?67654'&#"#5>32327673bgtsCB--<;tujcT>=0/AA|GFj;,,WVoFG/-*)(CR))tg*,fBB,-1++FY/.;;wS:9 0"!276'&6=3327673#"'&7&"# 76!275.dzYl;+[R+*_>ABHaxwfAk{_H>~=_@@VmQ>.,`"]s]=;9'q'#533!!32673#"&'533276=#"&5ݢZ4FHBëH>_UR[,*0>kJk]LU_!!`Z>_2*R[++'k]L*+_CCGFk_^!`--=;VB#"&7!#!#5!327673 IIJGI{.{I/-yX,,r"5`NK10cZ&8,A&X'}'.!#! 764'5!#5! '&'&'&5476DuP]\Nu9:ncco::{zL-F骩6FӉW֗g[`0/\gհq%!'&5#5!#764'&'531KuG*֑\Xlj}9;mci Ae kk}B/ rSٗd[0'c%3!53#5!# 632#&'&#" 3+uuCFB>_*+R~3gjjjkk\k!`--Hl9M=% #"&'53326?#5!# >32#.#"L2zo/c2^9<7C%Fsy+ 2zo/c2^9<7C9|[D;=\kk%|[D;=\?!!53!5#5!!#!FLzr{BH,<ZHR'53!#!3#!53!5'jfɄBkf!j#VijVzfI##5!#!!"'&'3327654'&_X{iOfeuopnp YX[[TfZ}Cyx}|9DdcfefI#"32673# '&5476?5!#5![[XY pnpouefOi{XTefŬcd9|}xy}`ff6I'#"32673# '&5476?5!#5![[XY pnpouefOfjJefŬcd9|}xyVݸQfa&#676323!!53!567!5!67654'&#"pkmlht0ou="&[ @NON\q 9‡0m"!~UUGGq !"&'332654&#!#5!#5!32cunp ={džUH23"tk'6I'$!"'&'3327654'&#!#5!#5!feuopnp YX[[ȱi yx}|9Ddcfeialq%33##"'&'53327654'&+#53rRbbaHBA>_+*R[++++[tqjM^]]"`,.><<>j#+'!5!3!!!!#!5!ssssS Ѣ %#5#9cq k'?j'q Vf'@j'f f'@GqV''-P/q9'MP/;9A'MOdV '-1d9'M1J9'M'Qk&$ <uff&Dq8Vk&, <uf&qGsk&2 <Gufjf&Rqg`bk&8 <u7f&XqG`b'72'qH<`b' 87'Jt`b' <7'Jt`b' :7'JtfVD'f2'q9<''u$f2'9<'9D1'q;f'qs&.# 32675!5!5!5!3## !2#q]DɅͯiY88kkkMM_b;<f9D2#534'&#"3267#"&'53326=#"325!#3{IJiX`}6{{6hkde8&&h`ďd_76_dkksk' <Yu*f9f'\Jqk' <Gu. ' <KNsg'}L2fgjD&}lRsg2'qH<fgj&qhfIk' <Kuyf6If&qA;9f&qGq '=j'q V']j'f ']Gsk' 8Uu*f9f'\Jq+5!3!53#5!#!#5!#3276#5!# '&GG]^FJfR~jjkkkkqqqvUl+dk' :su1Jd'RQk0'!4&#"3233!53!3!53&'&54767"$GY?@WW@?@3P'$}}\#%P?TeW~YWA?XO2QrP?&jjHjjw%=SrQ? fk (6B5#"3263!5#"&5463!54&#"#5>323"&47674&#"326/퉆ts=kn_`VŸ1)OOHdX@AWWA@XNvzojsJFIydb))(P栠PG?XW@AWXk' 8ufk'd'k' 8IuL}f'k' Au$ff'9D'u$fH'9Dq3k' Au(fVf'^Hq3'u(fVH'^Hk' Au,`f&E]'u,H'Hsk' A6u2fjf'hRs'Hu2fjH'hRq7k' Au5Jf'(Uq7'u5JH'(U`bk' Atu87f'HX`b'u87H'HX4&6s4D&V4B&7;4'q&Wqk' <u+ ' <KK`Vb353#5!>323!53&#"3`{JѾkkrt'kk$kfja 9 54!"54&#"3262; !"'&'#767#"32#5! ]5.퓌 fAd T{{6f3k{_H>i]=G=_@@B6 /76_d)j\?35!#!!3'6767\{^P^, HZHZPE^=ORp'35!#!!3'6767RjffP^, Vf#VZPE]EY^' ?u$f!'9Dqu3'(fuVD'SHs'Ifj2'qh<s'Ifj2'q`<s\' ?Hs2fj &{hRs'H'Hu2fj2'qh<Z2'q<<9&q<\;% %354'632!"'#767'&5#5!Do$k rni^m|iG UeOjJ%D4%3544&#"3!53#5!>32632!"'#767'&5Do`yh3l$k ro^m|@ÑjjRkln֐WG UeO;%q&%354632!"'#767'&5#533!Do$k roZ^m|XiG UeOkJk;9'U@ - 6',01@ z990/`p]KTX@8Ys s ]#5!#"&'533265fëH>_UR[Wkq!!`Z{fG 754&#"326732654&#"5#"32#5!>32#"&'{6{{6i6{{6iʿd_76_d)jmd_ _dfVGD 0=4&#"326553>32#"&';#!53#"3232654&#"{6{{66{{6Hkk;d_ _dkkd_76_di"#5373 3!53!3!'7#;! c7P5N}* 4@VHNdj=.hGjjHj99V:.$.'7&'&5!27#&'32673#"&/7&'&#"|N:#7IzgsuPvq {0Ba=p9EO[\ *GJ;daqY%V *'7&5327#&'32673#"'7&'&#"qLhed99gL\k  Lw'ްчAG^?ɐ1 {?n9-t|}|N@v&353!5!#5!#!!!53q G {j Lkk)53'!#!7#53!N|I{3PJ{IsjE`9GRy_Js9D?32673#"'&/&'&'5332654&/.54632#.#"#"'J*P+9^2c=>]2O j|_{ֽTcjutwZ76!];D(^1(>Vf#VIa;D(3!2#0#3!5332654&#VU$+`>H&0ʕk&,`" jjLmD 27654'&#"#5>;23!53VNNNNU$+`>H1ZgQPQP&,`" rqrMjjfD ,32654&#"#5!>32#!32673#"'&퉆tsGF\=kJIn_`[ZVstvzoGGD.jsJFIyCBdb)mnfD!O@& zz` ',,5 *"<<1/990@ ####]%3!5#"54325!#54&#"32636{{6hkkd_76_dk#ifD'%!53#5!67632#"'&327654'&#"h6TS{|}{ST6JIIHHIIJkRjd/0 /0ieeppqqed;'867632#"'&'!53547632#&'&#"327654'&#"6TS{||{ST6baHBA>_+*R[++JIHIIHIJEd/0 /0djc]^!`--=;*edqqppeefD A@  -!԰ KT KT[X8Y1@  `!0>32#"'&'3327654'&#"f'ް荍eddekGFLLLKw課0@@sttt|}f%D.%546! !"'#767&'&57632#&'&#"C ڴ} k r eddekFGLL\m}G UeO 0@@stf9'8327673#"'&=#"'&32#5!54'&#"32764*,[R+*_>BAHba6ST{}|{TS6fIJHIIHJIh<>--`!]^&d0/60/d)jieeppqqdef%647632#&'&#"3!5#"'&3254'&#"3276zbaHBA>_+*R[++6ST{}|{TR7IJHIIHJI4]^!`--=;jd0/60/ieeppqqdefVD!7632#"'&'33276=%!.#"fwv,MNyQQ@HIXX}?@nmj_^fVD!!54'&#"#67632#"'&73267fQQyNM,vw鍎IH'nm?@}XX̕_^x:D-9#"'&'#"'&'&'&#"#67632%332327654KM/_q`T )e !QyNL ,vwrAER@HBAN0]Qk̕vp>,m?>XX!%=;>+eU^_\;d20s@) !)*1KSKQZX8Y/3<91@-z%!%  %`19/90@ p2`P!@2 2]`2P2@2q47632#.#"!3#"32673#"'&74767&'&bb6hhpl ^]\MJ5Wt ljlhP{ziGxR6f*DCYZi>ie2D"'56763273327#&'&''"'&'53327654'&+53 54^HH lphh6b[rBDRj-J-#6Ws_S 6RxGgz}Oiljl tW5JM\]-.YC?u=;>-N& \Q#6NOP$fjR2Ot<>ifD9"327654'&+5327654'&$%67632#"'& X)G`&>l:9FG&&GF9:yU:eNJkjKLLK(p7 %{ 33`i54d54j_34KS4MMfGHGGg;9`'#5!3##"&'533265#53fëH>_UR[WkjȤ!!`Z{8jf9 :!"3265#"&'53326=#"543!547632#&'&#"{~~iX`}6{XabHAB>_*+R[,*Htp|}&&h`ďd_76]^!`--=<f9''!##"&'53326=#"54!"3265#iX`}6{'k[&&h`ďd_76!tf;(7&'&#"32767#5!#"'&57632j >Rx[Y\O=G5 S]lkz폎Te`l!Z/@ywtdMn8+^8+- #5!##5!##"'&5476327654'&'fPSatsR4aA/!56'B8iU4Tkk?kkcӤÂKJgAkyЋ6"6/"9wB&6626;2#54+"#"'&54767#"#327654'&'X0i/D_;a*jp1O@q1)f3-SZ:%8,NY/2E9K/ߚ|xN+kk.Pf}W);A*&@fr|7V'3#"'&5#5!3265#5!3!'Ǯ3QQkTS_0/zXj87ed9kHHkjT/676323!534'&#"3!53547632#&'&#"3PRl/0zbaHBA>_+*R[++jl77jjGHjjc]^!`--=9T9J?67632#"'&'533276=4'&#"3!53547632#&'&#"3PRlbaHBA>_+*R[++/0zbaHBA>_+*R[++jl77^]!`--><GHjjc]^!`--=;J`& D CJc' #5!3"'&h*,[b]_]k8<=c^YJ`' D@ zz ,',0 221/220 ]KTX  @878Y%3!53#5!#갰jjjRkgI(%3!53&'&#"#67632#5!32673#"'*`33[i+0`33[jjj~('LJI;jPKJIIs%3!53$'&72#5!3#'&W;iH;jjjj8dj ccri;9b#5!327673#"'&5i*,[R+*_>BAHbaj<>--`!]^ ;6g-#5!#3!53#5!!!"'&'3327654'&._Jf鱱ibOfeuopnp YX[[ffjj@jVyx}|9DdcfeJ^D0%#"'&5#5!32765#5!32765#5!3!5#"'&5RSnRR^`o{@AX00o{A@X3d|SSu;=JV^D23!53#"'&'#"'&5#5!32765#5!32765#5!3d|SS5RSnRR^`o{@AX00o{A@Xkkjp>=qu;3267632abHAB>_*+R[,*`o{@A00o{A@h3d|SS5RSnRRh^]!`--><]]jj,CD]]jjTijp>=qu;_+*R[++h3RQl00yCCh^]!`--><$kl77jjIH^]J9D.4'&#"3!53#5!67632327673#"'&500yCCh3QRlUS*,[R+*_>BAHbajIH^]jjRkl77ec<>--`!]^T'353#5!#5!##3T jRkkk'=Y7\`7Y=>"jGGgMM47MMgGG(xjlͩjx(POpoOQj=f=jQOopOPfVj#+3!53&'&767#5!#'676'&Ʈ갪qqooS3KL3 P2KK2jj)zzkkgyyiNt8uNfLutLJ'332765#5!#3!5#"'&JjNKHI36UUz-21 ON^^jjio65J332765#5!#3!5#"'&JjNKKI36UUz-21 ON^[jjio65J9'+!5#"'&'332765#5!#32673#"'&'k6UUz-217jNKHI3++\RT^>AAHa]o65  ON^^jj<>Z`!]ZJXD#.#"3!53#5!67632jNKIHͦh6UUz-12)ON^^rjjio56J9D+#.#"327673#"'&=#5!67632jNKIH*,[R+*_>BAHbah6UUz-12)ON^^<>--`!]^hio56Tp=%3!53547632#&'&#"ͥabHAB>_*+R[,*jjj j^]!`-->BAHbaj j<>--`!]^jjjG')3!&'&+3!73#5!2%32764'&+2$$0((Ez!^UT>=6m2334k IgRbyggYgJJf??.3323G')#!53#'!#32767!#32764'&#z=>TUzE((0$$~k4332m??fJJgYggybRgI K3233r9DB327673#"'&=353332654&/.54632#.#"#"'+++[R*+_>ABHabjGF|_{ֽTcjutwZgbd<>--`!]^w;8]YFV1-,f,*gtRRCQ*-/o;9'#"'&'533276'&7632#&'&#"yaHBA>_+*RY-<j_waHBA>_+*R[+;^ht]!`-->Pnr]"`,.>Qmi;9q.3##"&'533265#53+5;54632#.#"ëH>_UR[WCBaSOg**~jȤ!!`Z{8jkKN8;J9>%6'&#"#567632327673#"'&?;+[R*+_>ABHa <-YR*+_>ABHahGnQ=--`!^|nP>--`!]}:9 0276'&# %# '&!237&7632#&'&#"#54Y.5AfxaHBA>_*+R[+;lYzd>H_{k~G=]s]"`,.>QmV@@_;'D%3##!5!4&#"#>32Z4FH!!BBkkJkL+*_FG;V'q#533!!327673#"'&5ݢZ4FH!!BBkJkЇL+*_FG7'(!3#3!5#"'&=#53#5!!#!3276X3QQkTS_ߠ!0/zCA'jjj87edMjkHH^\fH,##"&'&'&54767!5! 7654'&'5!8ZZ++PH^_jkIR*+ZZwzZ[&Z[==ve@o`cIC#$FDKaan@j.Ιppppgf.Jx'"3#&'&5#5!7654'&'pYZ*,PH^^ki]h*+\}p[==v@o`cIC#$^S]k8<<kgf.' 3!53 3!53y՟qw'Dkk%kk!'!3!533 33!53v<;w>-kkDkk 3!53 3!5367632#&'&#"Fy՟qw2==o/212^<7!"2kk%kk|-.DT)57#5% #5%7'ڹh3ooHoojR9'35!#!!327673#"'&=Rjff*,[R*+_>BAHdaVf#V҃;>--`!]\hRB'%254#"!5!#!!2!#?0jff.lcyVf#VEȾf6I'##5!#!!"'&'3327654'&_JjfOfeuopnp YX[[f#Vyx}|9Ddcfe6I'$, '&654'&+5!#!#'7&"2( /i-[[_JjfOfeq vLo6V{fef#Vyx}K56{_x!%327654'&#"#5>323+5tZ,**,ZR++`>HbRrj><¾<>.,`" ^Mjjx#!+53&'&547632#&'&#";3ȸrRbbaHBA>_+*R[++++[tj{M^]]"`,.><<>*jx";##"'&'53327654'&+#5rRbbbHBB>`VRZ,**,Ztj M^]^!`Z=<<=jr9'747632#&'&#"327673#"'&5rbaHBA>_+*R[++++[R*+_>ABHab}7^]!`-->;<>--`!]^s -47632"'&2#""&'&7>3 " 0." B^ "rapmmpbEnpb.""""./B!!QJKQkdapjpbcVobcI+'pfD:%27676'&'&#";#"#&'&54767&'&547632 X)G`&>l:9FG&&GF9:U:eNJkjKLLKjj(p7F%| 34_i55c55i`33̶LMgGGGGgLMf9#&'&#"32767#5!#"'&57632547632#.#"k>Rx[Y\O=G5 S]lkz폎Z_aaHAA>^TR\++՝/@ywzdMn8]^!`Z=;F'{;93& Dx E;T'7!#3!533!53 #5!#^@_*+R[,*IJHIIHJIkkd0/60/dL]^!`--=;eeppqqdex)%3+53#53327654'&#"#5>323#RtZ,**,ZR++`>HbRrjjjfj><¾<>.,`" ^Mjx+!+53#535&'&547632#&'&#";3#3ȸrRbbaHBA>_+*R[++++[tjfjM^]]"`,.><<>jjf ',54&#"326!!53!+5#"32#5!!{ffBk7ї6{{6fyiVզd_76_d)j};f67D#5!#3!5#"32#5!!!"'&'3327654'&%54&#"326_Ji6{{6feOfeuopnp YX[[ ffjd_76_d)jVyx}|9Ddcfe8ifB8=%254#"%54'&#"3276!3!2!#5!5#"'&32#5!!f?IJHIIHJIdf.6ST{}|{TS6fwlcyieeppqqdeVDȾd0/60/d)j8;-qF#533!!3267332654&/.54632#.#"#"&'5#"&5ݢZ4FHB:G|_{ֽTcjutw-.CCgb GkJk]LU_19;]YFV1-,f,*gtRRC(*)-.HFo,, C;9C@#"'&'533276'!32673#"&5#533!&7&7632#&'&#"NxaHBA>_+*RY-<x14FHBGxaHBA>_+*RY-;^hs]!`-->PnC]LU_kJs]"]/.>Qmi;%q=E6! !"'#767#"&5#533!!32767&57632#&'&#"54]} k rGZ4FH!!:eddekFGLL_C ڴ G UXGCkJk]L**]z0@@st\m}J9A!53!3!53#5354632#.#"!>32#"&'53327654&#"3)CBaSOgT3lUSëH>_UR[,*`yjRjjRkKNqlnec!!`Z><Ñj;%44632#.#"#"'&'!53#5!332654&/.ֽTcjutw-.CCgbih|_{ ,*gtRRC(*)-.HFoj@j'wv]YFV1-,;!!53!#!53#5!!ffBk5iy'Vj@j};G`)#53## ##5!##53## ##5!#_I_[I*kP_I_[I*k5/<<C<ABHab0/z'jkl77<=--`!^]HGj;9B54'&#"#567632#3265#5!3327673#"'&=37#"&5++[R*+_>ABHab0/zV*,[R+*_>BAHba3RQl'<=--`!^]HGjY<>--`!]^h=l77.!53#53676323!534'&#"34gm 23Cm34ecKP)*c;;=99w;;m((44c;.1676323!534'&#"3!53547632#&'&#" 13Cm34ecKP)*cg<=j-()&;38=99w;;m((44c;;\44 z6#K. "4632#"'#53#"'&'5332765'**l<=j,))&;384&&47%ME}@?[%@ b  91990>=3ME}F@?[% 0.'03%N}EFP[?u452654DŽu@XX@sPOOP=>X@?X=>POPPu"'&4763"3sPOOPs@XX@PPOP>=X?@X>..#327654'&#"#5676323+5L::6?)+*/o?@@5Jqqxr""mj""6z 44}5+;;..!+53&'&547632#&'&#";3exqqJ5@@?o/+*(>6;88;Lr;d+5}44 z6DjmDi;?f[@ 91290K TKT[X@878YK TK T[KT[KT[X@878Y3# #ttf?fL@ 91<90K TKT[X@878YKTX@878Y33ttx5h3Ԕ5"b+qh3Ԕ"x)3!#c=c= llx!#c=xu#lu#mZ:8 533##5#5s)9H n@  [[120KTX@878YK TX@878YKTKT[KT[X@878Y332673#"&` hddh ` HOGGO7u! -  10K TK T[X @ 878Y2#"&5460EB33BE!E03BB30E \@  [[10K TK T[K T[X@878YK TK T[X@878Y#"&546324&#"326sssszX@AWWA@Xssss?XW@AWXLw&@   9991/9990!33267#"&546^WC8:$C q|<{/.8  YQ1iJ7@  [[99991<299990@A            ]K TKT[KT[X@878YKTKT[KT[X@878Y'.#"#>3232673#"&9!*0`f[&@%9"+0`f[&@Z7OL!7PKf:@ 91<20K TKT[X@878Y3#3#rtfxtZ%3327#&'&',rBDRj-J/!6Ws_S c=;>-N( \Q.#+x#5!#7#5!##"'&73254hs}>m,wQ(('<<<cWYPFE{7<=@E-,LKNX_a,+KKC@?BB2'0J9R/. : !..&('>U01 .7#5!#3!53'3!537'#5!#] \ZXZ\U5S<<<<<<<<..!+53&'&547632#&'&#";3exqqJ5@@?o/+*(>6;88;Lr;d+5}44 z6DjmDi;+4#!5+>4+4!5!3#>”x(+4!5!3#>”PP+43#!5>x(+4)5!3+”y>=3%>=3%ME}^ME}F@?[P@?[ydCRfv?fpD7~b+!!V )9Hz7u!{71!jB2#567654'&#"5676+ 1El6)IR,ao 18X(Op6'< "|f?fqLm3~*m'"Af###=rtfxx)9'{z)9H #."#> ` hh ` ")OGGO& #6767LF::u*pPgIJ62'67&'&5476 D( JP 1"&6"7#,LS#&8F'kv2&'&75476-"6&"1 PK ('F8&#SL,#7}f3#DƐtf}eC Sev[G%53#5#5"lG%33##lۥpNt!#!pޔt"JZA532654&'#"&|..8  ZP2hM^WC8:$C q|<:_"'&4763"3sOPPOs@XX@:OPPP{X@?X6533!5"%##5#5񥔥۔G% 533##5#5%!!"۔9'#"&'533276=ëH>_UR[++褻!!`Z><9T%332673#"&5ݹ*,[RU_>HÀ<>Z`!!xub{Ax5bjAAf|`74gd >=37LF::ud*pPgIJ6#uzLw}Jd3~+f#!#5iVyC>b#"3327473327673#"'&0W ` : J ` 9 J ` T0N  J?q$?p&C9bzE9d #."#> ` hh ` "EOGGOKDe~.+fqpmB]y=Q'9'&'&#"#676763232767673#"'&'&#"#676763 gf7K`25cdTi gf7K`2=[X`i gf7K`25cdT) 9>(&;=3)B 9>(&;F*)F 9>(&;=3):5!jj:5!jj'LL^??'&NsP9EG@e2#52654&#sOPPOs@XX@OPPP{X@?X&l53!3y?g!!ub&b&C>b632#&'&#"#&'&#"#320W ` : J ` 9 J ` T0N  J!U '77''thuuhtthuuhwuhtthuuhtth.54675>54'&'!KP7!LO0PQX$  +0PQX$   '7 !{p#&'& #676)$ɟd$):`wwww`Ttf3AntVH%#AnHP =3?H33g(Ղ] Jy>=3462"J^X?MpMMpE%ZpMN78MRfO10K TKT[X@878YK TK T[KT[X@878Y3#uf7R&jf& BLyf'\f'Vf'V=f& @f'Wf&0&H$qd%q7 %3!53#5!#5!{>jjjkNp)3 p=/JHyq3(\?=q+s ,`@n ni `-,')!&$  %-221@ +"!(%&/K TKT[X&8Y220_.o..]%2#""&'&547>3 #3!53#5HapmmpbEnpbo{{{{NQJKQkdappbcVobc q,q.% 3!5333!5bJH\jyjjkjjf0d1q#%53!3!#!##3!53#5{N{D{{7{{{{L]Lcs2q]q3S !53! !#5! {5h{I.B7Z<s'093!535&'&'.46767675#5!#67654'&'mmpd}dNNe|dpmmpgyBqGqBygm`}}c˫c}}`/OF! ajja !FOOHdkkdHZvmVcVmvZ ;`11;#"3!53$'&6+5321#5!#676,f[to[f]BGA^"#kwijj i~3k_Ckk|C_}')M@( n!iw   '%*991/<22990%!53!565#"!3!&5476$32`PuuNsnccotӶF7SF-W`֗g[`_\gb\& 7uZ\& 7uf0f&edf&JVJf&LJf&HJx&Wf0D$2'&'&5476276737'&' &'&767t(_>n{||uVL'$ge`"hF$&7}ˏA:?2sWIINsSoV7$C;%oi4;^ΝKyuz8Q &{eq{ V9-%32654'&+5327654'&7632!"'9P[]_2XH/M\wRx_FE|he=;Z]kH=EOq08tdTS(ml^\JSc'%'&7#5!76'&'53>:/Ej.4T (0pt(g(32#4&#"h3l`yklnÑfi+1@  *221@z q`9/0'&#"!32762#"DKLCSDLLD@AkKJkjJ' #5!7'&hJ8|̎]"k#JyuzPF'xT &'&#"#5676323!53 3!53%"#5<^212/o==2wqŪy\D.-|#kk"kkFV'n@,',:, '02<1@  zz `/<299990]K TX@878Y]!3!5#"&'##5!3265#X4Z9^'^`y'Ahjo$$+fkJr'%6767676'&'53##5!zP_=*9HpqP>H_{ኹht0tFld\Fa ;1mTfJ=,g\,kSU) 3$#5254# '&54767$54%!#!N_K19+kZs{'Ii@k>moHrZLlwVe z&fjDRJ'J@%z z =,' ,,:,',01/<2220/@]353#5!#3!53!3T!jRkkjjRjVMD32654'&#"#476763 #"&'9HWQIWaCX{6HihzoeOzr#. _dfUD %$#5254#$'&532#.#"9+kZ茍eekKMHrZLl1/0qrf:' %2654'&'" !!#"76hKCGK8rFlmuk3|S'7'&7!#!J7}̎]if"KyuzP kJx'"3#&'&5#5!765'&'p}]WAMA-B_URK;X./z~+45ˆFspTS'D.1xz #BJ[5"5ghZS'Ds`U!!`Z>ZsV $%2#"#&'&'&7>3 HR`[apmmpbEnpb~YNQJKQfn #2apjpbcVob2"fVjD%26& #&'& hؗ﹥ssF8]m{2|sU{# '&'&5!2#.#"%$#52'&hpmIzq%{tX,kZ 2,gp\@AĵrZLlfU$&3$#5254#$'&57637673#j`LKM9+kZ茍Ĝ.R k3[t^qrrZLlz2]Iq7)GPr%47632#.#"!!#"&'533276{e3vFbKIP,>?|f2tGbJHP+AbdVRE@jbdVRFgk: )##5!33:Ey3j  #!3qq|OiU# #&'#&'&#6$3 #5276xP{rp%qzH !9vC o`[YXA@뗲72k\VLD#&'&'#&%5 #66`0  2oP^R V Tf4!|nXv\GE67327673#"'&'&7'&76?'&'&#"#567632676FC(yZh4*<^212/3 8 c}}capmmpbEnpbQ}dapjpbcVobcfE+%673#&'&'&'&'6767676#&'&!!j4!HZZ.= ore_\kLH<$ FKAc2:/BA>NiSfE+% !5!&'&'&#676"'&'&'&'3" $<ۂHLk\_ero =.ZZH!4FiN>AB/:2cAKq!2654&#!53#5!#!2#!3wp9jkkj;V 32654&#"#5!>32#"&'i6{{6HiOTjmd_ _ds#"&'&5!2#.#"3267BapmIzq%0dap\@Af353#5! !#3!53#3q  ǿjkAkjj+=j`V_' !#3!53##GZӇӸ'"fhjvqUVD'!!#5#53476763 #"&'32654'&#"reeWaBY{6IVPJkppkzr#. _dihzoes332#"#6$3 #"$s0ا%qzImpaSHISXA@Upads )4632#"&#"&'&5!2#.#"3267M97NN79MBapmIzq%08MN78MLdap\@As )#"&54632332#"#6$3 #"$EM97NN79M.0ا%qzImpa9LM87NMSHISXA@Upadq3k' :uSq3\' 7uSBBBB|#I #Iabh FaF`C`#BC`CUXC`C85YBB #Ih; 5#I@PX@855YE,U@&% $ $ -<1@$d)n!% n  ob o /2<204&#"3!53!#!#5!6$32#"&'533265x¼{?{89@ $ $ $$ !221@ ob o/<220#3!53!3!53#5kjjjjkq3s&B7r@    91@M n` ob<2990KSX@  d d d9Y"&'5332?#5!# #5!#)Jr\8T0G%P`n""dK}Tkk2kkb.u/%.7`@+ $&$3$/$8<<2<<21@ b'7no/<<2KSX&/n#<<2&/n#$o<<2Y0!#32+3!535#".54>;5#326&+";/FaootzDžgWϫԦkSBuzǒJqjjq?܂pǩ?S ;qF@$ $ $ $ !291@ obo /2<20)53#5!#!#5!#3#4GGj$kjjjjT>C@$$$$ 2<21@ obo/2<20#3!53! $5#5!#3!#5ƾB&kjjƬkkkq\@$$ $$$ $ !221@ob o /22<<20@ ]%!#5!#3!53#5!#!#5!#1GG1G{jjkkjjjjqd@ $$$$$ $ ! 291@ob o /22<<20@ ]!#3#4#!53#5!#!#5!#!#iGj$dG1G1jT>kjjjjFG@  $$ 291@o  obo/20%!2654&#!#3 )53!# Cp{jkLjLqn',jq@@ #  $!2291@o ob o /220%!2654&#!)53#5!#3  !pGYjLjkksV@ & ' 91@   n dni`90@ ////] !"$'3!2!5! #"#$I^B`O 0 %q<U^F"z@Xq (Q@ &  $ $!)2<2991@#nin` ob o/22990%3!53#5!#!76! ! '&!2#"Gg3E]6jjjkkV_AQKJQF `@$$ !2<1@M oobo/<222290KSX@$$   <7367632#"'& 3 e "Y^SZjHdB6[Z醆՘+k^EQ-B_ 42lGjQO͒3I+'"8@ , 0#221@z"z" z /2290 #!53#532654&+32654&+\zu(ק_jstiu~v'^q #힖jSj[YDDZp[[n;' 0@,- , 021@  z  z/20#5!3!53#5j6'ߦjjSjJ' !H@,  ,-!"99991@ z z/2220 #]3!%#5!#3#'&#!"#32>56 hddh8J^a3jj{fVDHC'+@  ,+,),<2<29991@M (#*z%  z/<<2<<290KSX@#  > >      <<<<< >    Y##5!# 3!533!53#5J‘'jbjjjjjjSj$'$?@= , = ,-%1@ " z` z/220%>76=#5!#3!53!#"&/326("  ({SBDL?)?*hMȼjjjjDuSPHO}J'@== , , ,,09991@ z z/<2<290KSX@>>Y353#5! !#3!53#3J++jSj%jjj65jF'@ ,==,: ,022<221@ z  z /<2<20/]@)////____]3!53!3!53#5!#!#5!CjjfjjSjj=jjfjDRF'E@ , = ,:, 0221@ z z/<220/]#3!53!3!53#5馦'jjjBjjSj;VDSfDFS'3@-, - , 1@   z/2<20#5!3!53!#iߦi'ߦjjB!9'\OV#0=b@8 ,2*,,0><<<<1@#21$0!zq>;'!5-`>z>2<2<290#5!7632#"/3!53#"32'&#"32?32654&#"ƱiC0ii0CC0ii0CC(MSSM(CC(MSSM(iF22FejjF2/-2F((FUF((j'[J'M@= , , :, 0291@ zz /2<20/])53#5!#!#5!#3#'&IhiTjjBjj{F'^@,,=,:, 2<1@ zz/2<2 #I#IRX 8Y0#3!53!"&5#5!#3!#5ݦb^E<Z'jjj9M@jjsPjJ8'^@,, ,== , 0221@z z /22<<20@  //]%!#5!#3!53#5!#!#5!#{BjjjjSjjBjjJ8'f@ ,,,== , 0 291@z z /22<<20@ //  !]!#3#'&#!53#5!#!#5!#!#4hd'j{jSjjBjjB<'T@,, - 21@z  z z/2<0@ ]%32654&+##!#3 )53`evwdxʦjp\\o jj<'#i@,",!,  ,0$22221@z z! z /<2<20@  ]%32654&+)53#5!#3 3!53#5!evwdajjp\\ojSjjLjjSjl<'N@,  ,0221@ zz z /220@  ]%32654&+)53#5!#3 evwdajp\\ojSjjfDR@ - 291@z`IIPX@8Y0! #632#"&'33 !5Dk'4" $\_i;D(T@ D& ,  ,0)2<22991@ #` z z/229903!53#5!#367632#"'&'2654&#" ~zjjTikٌ͙wA'BB@= , 2<1@Mz z z/<222#I #IRX8Y90KSXK RX >>  << #I@aC`#BC`CPXC`C8YYY#"3#3!53#!53.54637lfemRGЩUhdOOfjjjjwfVd&sCfV!&sjhBBBB|#I%+#Iabh%FaF`C`#BC`CUX+C`C8+5YBB%+#Ih;%5"#I@PX"@8"55Y+9$53#5!!!6!2'654&#"3!53+ϰhg;[kjk~[wUūjjR;f&v:qfDQ@ - *291@z `IIPX@8Y0%673#"'32#.# !!j4!q\k$ F3)0/{iSsDVJ`L!'jHJ KTKT[KT[$KT[X"@""8448YKTKT[X"""@8448Y;9M$'"+L@' =,+,- ,<1@+z  z `#z/220!53!#"/32>6=#5!#32!'32654&+:&{IIXL44?0# ĻevwdfHӔO}lMȼjjfp^^oF'(\@$ ,== : , 0)22<<221@( z  z /<2<2<20)53!3!53#5!#!#5!#3232654&+evwd4ffjjSjj=jjp^^o+%j@= , , $,!&<2<<1@z #z%q z/<2<<0KTKT[X !=8Y!!>323!5354&#"3!53#53#5!3l_zϰh'klnjjÏjjRkjFf&vHxFd&vC9' <'m@==, , 0221@ z  z/<2<20$KTX@8@8Y!"#'&#!53#5!#!#5!#3Qdhd[iTjjBjjiF(!5#5!#!#'&+3 )53#"!2654&#!FGobYb !gkkgj<}"%3264&+3 )53#"#5!#5!!#&#evwdVbb(i(bbjpojSzizq,2#.#"!!3 3# '&!3!53#5!#!76735!23!53&+3!53#"3--t/KZZK/tZj\@`'HH`@jj>D~jjDjC'( 53>35!23!53&+3!53#"3##&>d d>&DjV%QVV%Vejjw#fjj#jsfD '&'& 325 VQh~h  {2|߽jh5!# 632#4&#"# 2?aP_T5Rjkkz&gQ:jUD5!# 632#4&#"#+"F2NW_L:;~ykk%ğ()_1P2^ 5!5#5!#!!3 )53!2654&#!2@G@Y {gkkg{j⛪$%3264&+53#5!3#3 )53evwdȱijpojijfWq  /@   $ !21@ obo/20%3!53#5!3!{jjjk%`;X 0@,- , 021@  z  z/203!3!53#5yi'1TjjTig53#5!#5!!!3!53gȾ{{k{jjp;'53#5!#5!!!3!53;i6|{jߦ{jjXqEb,3!53#5!#5!6%$#"&'5332654'&{>9"nGIrXXw^NxpZUjjkp&+rI""ca5Q[V;9q'(3!53#5!#5!!2#"'533276=4&#igMSca|_URT2,_jjTiem_]B`Z>5Ï/353 #5!##5!##5!# 3#4#!533!53'3-"eGe"-j$dAAjkkykkykkU>jjjxjC'/353 #5!##5!##5!# 3#'&#!533!53'3ɶhdʏʘj.%jjbjjbjj{jjj.Kjou&z,UZuD&zuq353#5!##5!# 3#4#!533qGjj;'!533!53#5!##5!# 3#'&#ۘ‘hdjjjTikckk{d#!#3##5!# 3!533!53#535#qGF'353#5!#!#5!#3#'&#!53!3FhdjSjj=jj{jfjq353#5!#!#5!#5!3!53!3qG{jkkkjj~jFx'353#5!#!#5!#5!3!53!3Fj6jSjj>iߦjjfjqE 326%$#"&'5332654'&3!53!3!53#5!#9"nGIrXXw^NxpZUʌ&+rI""ca5Q[Vojjjjkk;9'.3!53!3!53#5!#!2#"'533276=4&#BgMSca|_URT2,_jjBjjTiiem_]B`Z>5Ïsu'zL_fuD&zdB!53!#!#5!3#4#I{.{Ij$dj` T>S'!53!#!#5!3#'&#7iihdjB {Z<V'5!# #5!#3!53-)wkkkkwjjsZ5!# #5!#!!3!53!5!5+uu?6ʿ63jkk\kk,{jj&{xV'5!# #5!#!!3!535!5!5-)wkkkkwG{jj{G !53 3!53 #5!# #5!# 3#4#XLP@Iu״j$djjjskkkk@T>q'!53 3!53 #5!##5!# 3#'&#l%ߏLhdj>jjkk3kkw7{1!53!#!#5!!#5!#3#4#I{.{IGj$dj`jjT>S'!53!#!#5!!#5!#3#'&#7iihdjB Bjj{w!53! $5#5!#3!#5!#3#4#3?Ej$dj#9kkǘrkkT>F'!!53!"'&5#5!#3!#5!#3#'&#T<)?hdjW6%MTjjs-#jj{#53#5!#! 3!534&#!3a9)kjjkkWpkJKq,m' >uTCH'ztqE167$#"&'5332654'&3!53#5!##5!#,5"nGIrXXw^NxpZUGh +rI""ca5Q[Vojjkk5kk;9'.3!53#5!##5!#32#"'533276=4&#8zMSca|_URT2,_4jjTikckkem_]B`Z>5ÏqE%%0!3!53#5!#!#5!##"&'53326GGGIrXXzX%~jjkkkk""caF9'%!3!53#5!#!#5!##"'533276ca|_URZ,.hlfjjSjj=jjۣ_]B`Z>>)"#3! $5#5!#3!#5!#3d$j?E"9kkǘrkkF'!)"#3!"'&5#5!#3!#5!#3dhT<)?W6%MTjjs-#jj;X !#3!53#;鱱jjj@i'z(!Nf-&zSn\&N 7uf!&nj9fDq3m' >uSfVH&z^ssQfVDs\' 7HufV!&jh\' 7uTC!'jto\' 7uUZ!&j ufIyf6I'Aq2'q<VF'qvq\' 7uVF!'jvs\&\ 7Hufj!&|jhs2fjD$s\& 7Hufj!&jhs\' 7ukf!&j32'q<a9'q\' 7ua9!'jk' @ua9f'\' 7;ueF!'jq353#5!#5!3#4#q{j$djkT>;'353#5!#5!3#'&#Fi5hdjTi{qn\' 7 ui<!'j9n1:4.+"#5#5%7>323!354.#!53#5!#!23! 2'3W?#y$?'k6 N`5zzzyyyJqM'z%&'6!#39ac20Ag?a, eIIg&C[5`n*+%354&#!53!".5'5!#3!#5!#323!l-zp[S'yy/ zzTUJmBBeLEpQbc52C){cczn`n/#2>54.+53!3!57#5!#32!A4!"@^=zy&yyz.cp8p )TK8J+e.ih*ccKC4.+";2>53#!".=4>?!#57!3#'5!,(]mbi7*aul])PtuŎPb]EqMOYE<}wiN.0n{A;usJx:GoڙSUلti~P_a/a.F[hu<n1%3!3!57#5!#3!Vzy&yyzz%bb.bbN`nf%4.#!3!53!3!53#5!#!23!;*z'xx(yyzZ3^F*T+;$``dd.bb(E_7fw94.#!;2>5#!".5%".=#5!#3!'!2"3"b,G4"3"坥i>iK*+B,yy %w5lW6{"=-5J/3VB)E\2/FT%fbbZ6+c AdDO7";7#4.#!!"$&=4>3!!23!ϔQ%Ec|R--4-yٸr9iry H~_7~f鄲K}]6CbA S^tb_5`Y3]Qe%3!".=#5!#3!#3!v/H1wx6Cqq3I"9K(bb?@c`nR )4.#!3%7!53!".5#5!#!2&Ea;1XF;}!{.I8) yxGiE"MAaA!/DfD"a` !7HPS&>cc9iZ14.#!>57#!".5!53'5!#!21D(1G-(?+/UvGN|X/xx|@vX5`"E8"$G8#)CU-L`7,TxMod-bb1To?H";2>54.++".5)5%".5'#5!'3!#!23!rNd8/H2r2M49/N;%O|XYf7(E2v{)"/|;D`=}!4T>%O@*&>P*B@L) WyL"&OxQ^G5L0jcc{-,b=iQfnE+23!54&#!!23!534.#!3!53#53U=!Y?4Z[-z%z0O:y&yy2N7*f8-(V```C5R8``axYU4.+";2>5#".'+".=4>;22>5!^8rr\ezC0IazJpEyeO7d)FBA"9YNK,W~[31X|[\yW/)E^406C/"<-%aokBlA2Z|ZƐ3T>,8" 9f\Wf:9f_P*':'2A#p3#+".5#".=5!#3!#;2>5#5%p|)\gk`-1F,xw1L3Ax &C51;! z|IJmI$"EkI"=R0UcbN'4 c@5G,.K6a)%3%"&5'".5'#5!#;3!5!3!ylj}0I1xyO? 5( zyy$>x~ 3U@bbBD*C0 cbO`n34.#!+".5#5!#;265#5!#!23!9)FoFQb7zy'=,TU||[?eF%{ !:+SZV*9cO6dc7cK-wbb^IxXgn2##+".5#5!#;2>5#5!2~9eSHi?yy$;++:#|INvN(*QxMbb.5354.#!53'5!2#!!23!Wd;1I1x%A2yyud,+cv=cu<}!UU :.E:'fb6P6>`C#9Zn6_xYR4.+";2>52654.'+".=4>;2!P3KbxGZK|eL25Me{GZlo9HG/N9,v]^[2/V{a^{W0 Q~W.=U}\44[~U`Va7sRB4/& QY/=k]^`66a^*jdN :K]:X_n 2";4.+32>7+3!5#"3!2PF_;;_F>aFFa>A}t|%u6wo2s2;1osэF}`` .3F1754&#%3!5%".55!'3!#5!!2!v\T{#{`:eK+ww.I5 {}6`I+{&fr``J"A^<cc&H7"cb)E[3en.!!34.#%"3!534>3!23!Rx +- y)x$Rb z$ejHHk__,x{?_n1%3!".5#5!#3!#5!#3!Tz}_X)yy&?/\zzz#B#QbccGc? ccO`n02#+".=4>73;25!".5#5!#3%#'!/zAiBAmE-EQ$s\T(wy2.| 6gO1+Lg<|$KD9 N`bbH"G9%~bn2%34.#!3!53#5!#!23!R{-L7x)wwzF{[5} @1S=#5!'3# -?NV]-JS+UJ}dL21Jc{JY)^\UA'rzz443&kڙ r#?Vfs;TaagJLI9"7_ODb:!4BB;bb_n;";2>54.++".5463!#5!#!23!fHgB6R8d-G0-%/5e^Zm>z~1+ZI/z!%A2h@V51WE@|#/ Z{K )PxOz.bb=[54.#!3!53#5!2#!23!%#7'7-9 !6'z(vvJ?z`;6]|EoQmBt<,"2U0(__c*@L#6T;#>X4bn\>+".=4>3;2>=4.#!#5!#3!!32\2UrAxiʞ`5Wn9W2^UI.]UJ6=iNy~1l0CpXB+/VzJ^@jL*`>)Eb?,=EL%G}^7aacj8pnn2%!354.#!53#5!#!#5!#3%!2!Tz4L3myyux||Ӄ{#*9"e.cc.cccbpo^n @4+32>53+3!53#"7!5463%!".5'#5!#3!2츸CZ7z#{DT/x'yW|N%y{1ZH^p?(-G5``>#LzW``N'A1cc#IqNZ;)#+".5!!53#5!#;2>5#5!;z8bO_n;yy{5N4%A0{!KhA@iKoc.ccCA];8P3Hcn1754.#!3!57#5!#!23!U{)?+{$yy{Vw\$z$E_;`_cc3!#5!aoIpQ/sJ 8LX_/jƿ;nc`]-9aFj:Y==}pT1]]xE!:O^h5A]]/aZO;"hQx[H"!8GaI8cI+=82#-;VwRn3%3!".5#5!#3!#5!#3!Vyoe/yvGz||#@CpUcc ccO`n%3!5!57#5!#!#5!#3!x'xxxyy|zaa c.bb.bbd E4.+!2>5";2653+"&=4>;#5!2/!'3!5T; -H3B&F6!/G1Q\`=n^Q4q~u~|%=+h*9"3J.,S@'pLI|Z3rNzT, clvwhdd/#".546732>54.=3K|VPnAUb?1%4Rf3BY51KVK1v%=NQN=%gj64c^r'&5%?hK)2XxFY|^OYqQ><@V=.0=Zd(<#".54>76.=34.#"32>;rjss9%@c\ &;AB5!*=E6 <~gC 0`RW_, /d[X\)vCLi:xpeO3BS5)C6``'.'+HpW A|^xDDw\Sk>?lP;57K%#".54>7>54&'".54>324.#"32>5R]nM)W]WvIbW/TA&%H) (W_K^5T{J#DeBSsH!!GrQIhB mw??rb^tb0-NGC"UR .!#0 '5@%1[E)(F_7R~5% LzzVpA2glSV,#Qe:Qe#4.'.#"'>7.'4>32>32#".54>7.#"54.#"2>;/EuWK_G>*5.(Y3*AS0S~X!-QBCX33XQ-:%G@6&0i)5uѐYrB!2?EIf[O)E[fi16UJD# 1_Zdp$Gc{lDmL)&Zn]\.)VP:;#".54>732>54.#".54>32hu?0=@>!7Y?@U49Q3-Q<#0<<(B04bWLŵ=lX9YC/@ +>P2IqN)9ZAg732>54.+532>54.#".54>32>rdh{D/Nd54*?`B=S34N6QY%G7"5T<5aJ+2,#,D/:iWMxK.L`3AiI(!hj6*Xa:jV< =([Hc>!QfDb<[7".54>32>>7.4.32>4.#"32>;Bw̤r> 4(EoN+0Sl<7YE1 H#/@V81I3CtU0 :0EHII+7 ?_A32#".>32+532>54.#"4.#"326dI{YZ~KAxgeuAKQM^p?L{M5.1S;!7V= 3?A{#@X6ŇFfKyMod/ "A6od//dܢj4d&#5>54.#"#&54>32Շsl$:'2`RHW/FJi}=rcdu@^= /cXxF(dC=aoOLF: H#".54>732>54.+52>'.#"'>3232E{b\|H5O\'tRY) 0'8qJ <4$B <)' TX-+54.#"#5>=4.#"#5>=4.#"#4.'.'>7.54>32>32>32'AW_c-5N40F,/F/*G64G,  2P:8H*8eaW_?>`vq^WvS;3NCA'Q&GIN.bxDFsN(UK: 8KS$%PG6 :JW/LnB^Q|dF%TKf\~N"9[Bq+E)(()E+t7\A$$A\7v+C)((%$&s7Y=!!:O\f3jzX@.8UwP%:+  ,#m&qhx72O76Q66Q66N3/id0D#".54>324&'&.54>324.#"32>FvRt{?J{U'UK8 }4bL.!%s BiAw9&Ea:>V6>^BI\5|h-NsmP$(nMN-D--u044HlH%'PzRd$;l\ri11ad4I#".54>3232>7#".#">3254.#"32>Jb`q?'MsK7P?5!:654?I),HB@" /MQMYwE8R67dM- ?^?8[@#ɋI:ql\S'#$C3!/N:%5!B^h89omxY#(Nrd@O.#5>54.#"#5>=4.#"#.4>32632[`~3C41"I#A@D'Z] +D24P68Q47F++7ADpP,9j^j&HWe8",1'W5I-Z1aYL8 (Hf>T'F&((&F'T>fH(+Ldt{<@rZ> W"iҳIwyLdL#".54>732>54.+532>54.=3:ohnx?'Ea;  <[>NX- AdEg.>&,I]a]I,V6YqwqY6 6FKK Mh>cq=^E9R;&  4bG:DK%#".54>732>5'&'57>54.5>539poRQ:T5";bHC];2Z\b:"PD-0O=?s2:74(2 &8I[59uG]UɊH*NpEFiK/ $#W@U3 BeE (CeI-WH3 *"F7 !/:@;0&3db>32>32#52>54.#"#5>=4.#"3#.54>7>7'":O_6i(&bZo?+TT[;O0'OF#H;&$7D!;V7$AW3eL\4,PfoG;%<]YQkJ% ?cE$lxxlJk[q!g0cjVyH@iMV&I%((%I&VNi@9lafm8gvRDp276++Kdqw8!A#".54.#"#54>3232>54.54>7"!H{X[o>%  ?0J4u5Q9I`8"3;3"80./22KWK3dp=4e^PEW1$,$@0oZ&OmWmF/2C9?:3x' '>>G_}d:u`t%#".54>7&'>7667332>54.'.'#"&54>7.546324.#">4.'326uR擘V%KqMAcI1 +%H2=9/((!'a{r\'  $2&#-cP 15@.&\6UggU4e13*j""$&+0(!W466223  *=;j%+".54>7;2>&54.#"5>5'4&#"#".573267>32>32 :[XfHzM+QtJ(!:Q/Z@S/#..4 ,6,7!)3"(E1..',14=\)6E+AoQ-AyjX?#)[fEpT3G )@X:Xk;%;LOK-:# $.. ,.,((-/-AK356M3?bGx\U0;$#Qdd;cw#".54>732>5<.#52>54.#"#".54>32>3224.#"32>but|Q/@_A3^PjR! 5U@Xc1 *J:#510 ErM_l;;oc!LKFFGB[m=6^JF`9.N;CU0/SC@Q-__W)-=EK$(6$&$%-N:"!BeE=[C, POqClL()$1AO-d)K|UZ}K"8+(8#?nUdY0 &TPcS$-ZW[U(&SP:D#".54>732>5.#".54>32'%30dk=xm^F'7[t= -"-Kb5JV- 2G@D/#;*',L6*-Pl>8XKD% "WsD':Qh@[U-A +BZ9@kN+0Tq@?H$ 'A19?-B]C;hM,(@0@[e:c'>54.#"#5>=4.#"#4.'&'>7.54>32>32&T_:B" -O=;]A#9Y@=Q0$2"1}]7E:fY/TG7b,g>IqM(?q]4`O<E[j6Zh9`P~l.H'P]tKcW()Id;W&H%((%H&W;dI)*X`%VZYO?0/2;GYoF,G=658! :'W97 $Mpt;7Q62Q9AuP8=%#".54>73265#".54>7332>53[~J0UuD!!3S324.#"#54&#".54>32>324.#"32>R@xilq::Qcs>*UH6 -9DALTK0)1D*/JZ,]oX@jK)(F`8DW17]G>\<Ym=_bCp^C&%9E"1[f^^f[-,9#I5>@BY6Td\\(\oXm>+_o\wE"^dB>'4.#">32/32>54.#"#4>32*$;-$3!3AV@TqB(AV_`+$(JB.3P:6fO/2^WH`:OHI1!9+"9I')H5>tf_~]=O%dNe:0Nb1G{p5&BX2?gd:)Z#".=4>75>7332>54.#'532>54.53]]{ŊJ"B`=*MMP-;HPJ<I&6% )NrJKqK&$>U1}'8$(;E;(X"7GIF7!H{^#MKD4hl7TR8 +9& #+eF\klg+cwB,OoBN^5\2P9+OKIKM))=2+*0324.#524.#"32>Awdrr9>nY2]N>+06L08]E8Z?!nFJ́^U!:M,L]3>0YQ/a{F?mThp<,^P:Zv'>54&#"#54.#">32#>'.'.54>32>324.#">7>"2! E;$=-a 5+3;/zKf< (@MVTM<$G "-5  FqQOg(7I0E^9+B,9eL,#SN@!J'>5/+),9:'3nn 4%*QwNROni3]RDSc='iv{r]BGFAcr*zQih3XV0B)3M0:_E&'BY3*QwI0+*ahmP:p'".54>732>54.5&6?#".54>32>&'.'.''>737%5.#"2>#4=4#>sΩyB1Od2"6P4Ib;#(" #$IHF"2K34Q6@GJ& M? */- $042A4@dE$ 398' $0;:4E_L@J^Crc-%R`CiN5>)8O98]D% CiHBlZMGE% I)+UC*1JU#*YI/%9F!1TF8Dy/ $-37ZyFF=RpMKR)>E[E B?9RZ,x:( .55/ &1+6I#".54&#"#54>32>74>764."32>+Nd_k9*I1M61O8%:%%?V2(DQ,:MlA2SxaC$4N5jn.̀8E|g&/,7DJDY44^L-BPyX:{2;@PȚi7&BZ5AmN,;o2:7%#".'72#".5332>54.#"'>7>7.#".54>32>7>54&#".54>3232654.'76K.&OPPMH 8VB2@DB3 4`V/WB(D/:3F,!0A )9&315 &<:B+*#-1T99'@R*WiR$B>3&:'>6 e"6B 0O92D' 2FV. %,$"E8(F+k6V=!)Hpl#8:B+ ,>Q3FoM)1H/% /I3+O=$  "?@F+ ( ~l0*7M(k.~H1XC'=ti )1>*/9 0< &*' (B.9V;-NB6''IKN-:E% DD z'6Gd9e#".546732>54.#5>54.#5>54.'.533FuT6qj^G)ah! *Lj@BT1#,.,xx@;* *,*oo@;)3bRQyO'.'?P*m%,GX-0]H-"@\:7bI*fa0"9SqIb&/#2D0CiI'&HjDGZ52$ %C7(7# /- $@4(7"+J:'9S6"<1& ,=+,E4% 6GSd?h4&#"3>#".54>3 #32>54.#52654.#52>54.'7T@K-9 Oi>$8F";01<<2hL+WW *_n(JiAJ^5'LJHZ-:KN(B/*;$!?CB4 KE,TzNf->W)F9,$/9"4-&-!e%!4?0N6&7D=9,4/,:![gM 2CRZ^eN@4.#"73>737".'#5>7.54>324X@yu,DN# *SB(DmN"LKG-gr|B 5kor;NUU!RtJ#KZ9ncT=#3jZ'ɏd##dV{j.  #6A<6* 2o~SkF!=Wk}d<R>'##".546732>73#".546732>54.'5',VOD13ali$Lh>&m#"(Ga9HvbR$}:\r8OxQ(8qq^{Hx 3WC;Y<5U>[8VidS>3 4\HGW=$B(,'%C\8^/QWfDw0.aj!L :JM>oS1-fxNtN)cd:[%#".54>732>54.'5>54.'.54>2.#"T6(SD+1Rm;,]WM:!~lzB=d}AIqV@T,B[?Ia98]zC`[- >.A)5Q?2@X|WKiC@lQ AR.&<-4YJ<%.>R6n/dP#"32>534.#"'##".54>$735#"$.54>3237'#376t`*~)J8!*g #>V4pxPOn 7egm~EM JAwfqi8 gMMgnOT>_A|u"3#m0 u~Qh AvNuM'2[MYW.(U]MZ1!HrQyC5Id<T'b4.#"32>".54>323>73>32#"&'##732>54.#"3v8N/$WJ2-GY-1N6_q?Bt\5?D!,N?8=?[uA7>54.#".54>3232>5<.'7X[XW^KvF4jV5$,G4 td@/cR5*T{QLfG1<_g.Ok=;YID&>Ueod8=332>54.'3#".'32>74.'7#"&5d*F\39I*;Y:{W~P&CrU*I=1u3232>76&'7#".54%5.732>54&#"dR]nM $5ES,YzK!2G+.R>$$(=7&:hWK}Z2T{J!BcBSuK"Jf?Fmw??rb2_VK),,)PMI"'9' -!*9d3J13U=#(D[3j% Lz]Ve83gl,\dljB 14#"32>7! 4>323267#".#"363205&Ge? $$:*":%0.# @2~y5H* /O9 >  !+d  /64>2".4>2".4>2".h%*&&*%&*%%*&%*%%*%`,'',','','},((,'d[E'>54.#".#".#".54>73.'.54>32l 1`Q6]C&'MpI&E9* d %4C(+*-   .="=V-/DzdZzGiUlC -\J/  '$ 5+" 'I!7R[p?6afD 8?32654&#"'>32#!32673#"&'#"!54&#"#>323267U퉆tsmS}t_`V7Juy+zvzoF[XIxcc))WZXY*}[ԺfD22#"'&'53327654'&+5327654'&'&#676KLLKT__hc >>ul:9FG&&GF99ms|[YDgGGHGf%]-.43_j45d45i`32\|a_JJ`- #"&5462#5!#3!C/.CB^C.DD./BBjjkfD(/" 6&!54&#"#>32>32#"&'#"73267(Ry,IEςFIz8F}ba`cc``c)fjD 4& #4 ؗ2fj  653 5=(.2+z!53##!#!2654&#!jjokktX4j^`z{ 14632#"&4632#"&!53##!#!2654&#!E03BB30EE03BB30Ejjokk$0FB42BF0DB22BDX2l`^z\p0#!#3!2654&#!#3!2654&#!#3!53# uwjj%jj,jjTijp{5n`o{`o{3d|!5333!53'!3ZISOjP\iOtNgC; ;;;#!#535!3!53#5!#5!!53#5!!53 4?8w`gRtMN6NNN;;;32v6ʝ8`=GEEG=aEG>ȼ86?ef?77d>77G632654&+53#5!2+3?^bb^xxőFZUVY;<;G#3#.+3!53#5!2%3264&+j,@rݓ*G>xx݉mi_ZZ_; 3.; M.;;32VUVXth&eCp\TER <32+32673#"'&VUVXth&eCp..TER <<:87HI4~BE>IP9;@)(jY]f)C&%87x ==@'53#3#5#"'&63254'&#"32761oo"45M|ON}M54"..XZ-..-ZX..]<$;]8WW;k98?>|{@?89@| 7>32654&#"'>32+32673#"&'#"&'!54&#"#>323267VUVIHYE4N|ZQIS <IP'32ff)CK87x0312x{GFbc3hjkg% #53>32#"&'#5732654&#"p"iM||Mi"\XY\\YX\;8658];kq{|}qk@ 3#5#"&632#5354&#"326o"iM|}Mi"mt\XZ[[ZX\;]85686;;kq}|{q@!32673#"&54632.#" fcMa]z\UP\ x{GFbbchjjh@!!54'&#"#67632#"'&73267@33dL11]KKyYYQR.-VP\ x>=#$Fb12WUSSch55kg@U1"&54767&'&54632#&'&#";#"2673T0/UU/0|5<''ID%$,-WW-,HEHN ^98VO:'( ((9OW x45<8;683FI65@U02#"'&'53327654'&+532654'&#&#>B/0UU0/|5<323!534&#"3!534&#"3!53#53>32"hEihhe=FMQde=FMReio!c?Ni{BCtu;;4[Mhc;;8YKhc;;;j32#"&'5332654&#"35io!fDn55{l-S'<649697yK\i{62DImQhd;@26&""&6 '___&Ã@>32#"&'53326'&#"@oYXXY@~@D -,R^`0/_KY=_dVVVUN$$AAEF@ 4&"#46 @__&ƀ@ 2653 &5__ڱ% "32654&#"'#53>32#"&'3!53 \XY\\YX\tp"iM||Mi"mp;kq{|}qe<]8658<<%#53533#32673#"&5ffu!,-*WY[eS<py>32#"&'!532654&#"iX`}6{{6h&&h`ďd_ _dktGgq'53#5!#3#3!53rjkgzjjjf9R%3#"&'533276=!53#5!ëH>_UR[++ijjh!!`Z>w^y<S+L!- 05&T,@U1"'&'3367654'&+532654'&#"#567632B99_ NIE$#,,WWX#%DJ''?B<<5|/0UU0/56IF36;8:<54x WO9(( (':OV/+#.#"3#3!53#5354632+=42A5oootq*T*w*+?QM<$;;88y>:aR=;_I""6{ 45\v3#"&'533276=#53#53 m{k.R'<549ppu\i{62""I:;;5 53#5!#!535xxow!N;<< /<D#"'&'5332654'&#"3!534'&#"3!53#536763267632<=>k.))'<3:6FM)(deFMReio!12?N45"35Ei44b\54 {6DI['&44c;;8Y%&hc;;;j< #"@B!";9u/13!53#"'&'#"&5#5332765#5332765#535om c?N54!44Eihh=FM()eFM)(d<<-;?#"?A!"tu?<\M44d32327673#"'&5?MP*+eio!fDn5594<'*)-l>=m)(44d;;97yKI""6{ 45\553#53#5!##35WW(~JYq;C,-UNRC++JI%&U\_**IIA>8I""6{ 45\dC! 42'0%%9R./ :! .%'(>T10 &#"'&'533276'&7632#&'&#"L=l.))'<638& C< K=l-*)'<49% ;bPA4 {62"->lrQ?4 {6#->%&#53533#32673#"&'53326=#"&5ffu!,-*Wzl.R'<63:6&eS<88y+;< m()53@+#"&'&'&54767#5!27654'&'53`993-;XHI#<]tUh?>>?hV9:]/"3#&'&5#537654'&'Ga893-;ufuVH&z^q7^' ?u)Jq]&I5<sk&*Xuf9&J\q^' ?}u+J]&KH<qx'}+Jx'Kq\' 7}u+ ^&KH<qu&+Ju&K'qC&+}JC&KFK&,K&LHqr&. 8L|;&N 8?qx&.I;x&Nq&.I;&Nqx'/;xR'FOix2&q<xq3&qF=q&/s&OHq'/ 'HOfk' 8u0J^f'Pf^' ?u0J^!&P{fx'0Jx^D'Pd^' ?gu1J!'{Qdx'g1JxD'Qd&1gJD&Qd'g1JD'Qs&2'Hu :Hfj&R'hhxs'Hu&2 8Hfj'hx'hRqk' 8u3;Vf'Sq^' ?u3;V!&S{q7^' ?u5J!&U(qx7'5JxD'HUqx72&q<Jx&q4q7'5D&UH^' ?u6s!&V{x'6sxD'Vx^' ?usx!'B^' ?u7;']'{:<WxB&7;x'q&WB&7;-q&WB'7;Aq'W`xb'87x''RX`Kb&87K'&XR`b'87''RX`b&8'u 87&X'HHr`b&8'u7]&X'HH<j&9 97&YBx'9x''DY 3k' :u:!d'oZ 3k' 8u:!f'oZ 3\' 7u:!!'jpZ 3^' ?u:!!&Zo x3&:!x'&Zo ^' ?u;j!&[B \' 7u;j!&[BZ^' ?u<9!&\<\?k' ;u=Rf&]\x?&=Rx'&]\?&=R'&]J&K'^&W9<!&Zo9&\<fL&Dls!&Vx&$fxD&D9E&$uf&D9x&$'ufxf&D'99 'u&$ 8%f'9&Dv9 &$'u :%f&D'99 &$'u f{&D'99&$'u 9f&D'99ox&$'ufxH&D'99qx3&(fxVD&H^q3E&(ufV&H^q3j&( 9fV7&H^qx3k&(' ;ufxVf&H'^^qE&,uJ`&=qx',Jx`'VLsx'H2fxjD'hRsE&2Hufj&Rhsxk&2'H ;Hufxjf&R'hh`xb'87x'&X`bE&8u7&XHZr&< :|96&\CxZ'<9''h\ZL'|<9'<\Zj' 9<97'<\f0&*|f0&bf0&7f0&Df0&8f0&Ef0&9f0&F&*&bX ',7| ',D &8d /&TE&9&Fsd&*$d&bd&7!d&Dd&8Bd&El /'* 'b '7| 'D m':8d 'pEJVJ&*dJVJ&bXJVJ&7\JVJ&DlJVJ&8JVJ&EJVJ&9xJVJ&Fx '* 'b A'7| Y'D 'L8d '|EW'9XQ'FXJ&*FJ&bL&7g&Dd@&8 &E&9L&FO '* 'b p'7| v'D 'F8d 4'|E'9Xz'FXfj& *]fj& b]fj& 7Nfj& D]fj& 8fj& E &* n&Qb 'g7| 'vD  '8d D''EJx&*NJx&b?Jx&79Jx&DWJx&8{Jx&EJx&9QJx&FE 'b 'ZD l'E'XFXZ"&*0Z"&b0Z"&7 Z"&D,Z"&8<Z"&EDZ"&98Z"&F@ '&* {&Tb 'j7| 'vD '8d S',E'9XG' FXf0d&Vf0fdd&VrdfJVJd&VJVJfd&VXJffjd& V{fjfJxd&VcJxfZ"d&V1Z"ffP0&2zfP0&2{fP0&2|fP0&2}fP0&2~fP0&2fP0&2fP0&2P')P') P') P') P') P/')P')P')JPJ'jJPJ'jJPJ'jJPJ'jJPJ'jJPJ'jJPJ'jJPJ'j P') P')s P A')5 P Y')M P') P ')PW')KPQ')EZP"'@ZP"'@ZP"'@ZP"'@ZP"'@ZP"'@ZP"'@ZP"'@ P'')R P{') P') P') P')B PS')~P')0PG')rf0H&zf0&qfP0d&2fP0D&2fP0f&2f07&+fP07&2!i&z!1&q;d&VdfP')*P2'67&'&5476D' JO 1!&6"7#,LS#&8F'J7~7J&j+VJPJd'jJPJD'jJPJf'jJVJ7&+xJPJ7'j0d'tV^fd'V^fqP')}'* Vd'*(aJ'+*H&zU!&qL&TR7&+d&,d]m& >ui2&q<Dd'V^f'Vbv&a$bJ'+bJxH&zQJx&q]Jx&TBJxVM&*DVM&bDJx7&+HJx&,<Zi&z!Z1&q;pd'V^@f  'b77'Vj7RsdCZP"d'@ZP"''@ZP"f'@Z"'+>ZP"'@Z?d'"V^=fed'>V^Wf}P'')RRfv2&'&75476,"7&"1 OJ ''F8&#SL,#7ZZs10!!ZsZZssZb/10!!ZcbZb/10!!ZLbZb/10!!ZLbb/10!!b]&BB%@ i  91990#>7%ME}@?[@ b  91990>=3NF~+?=[Z@   91990>=3Z_WE%Z.'3N~F+P[=/@  i  991<290#>7#>7LE|ME}@?[P@?[r3@  b  991<290>=3%>=3NF~@LE}+?=[P??[Z`2@     991<290>=3%>=3Z_W;_XE%ZPE%Zr.'3.'3rN~FN}E+P[=?P[?9; 6@   b HH  <2<21<2<203%%#5#p##pFs9;\@1  b  H  H <222<22212<2<22<203%%%%#55#p##p##p##pFE%'3!    104632#"&3~|}}||}3q3 64632#"M87NN790pNN87N $4632#"$4632#"{M87NN79 M87NN790pNN87NMpNN87N/ #&@a! `$ $1<<220%4632#"&%4632#"&%4632#"&%M87NN79LVM87NN79LVM87NN79Lh8NN87NM88NN87NM88NN87NMq L #0<@L|@B?@=@=>?>M G$jjGj=*j1?7`A=iM$>0-'@!' :  - :4! D4 J M9912<<2290KSXY"2#"&546"32654&"32654&"32654&#'2#"&5463#2#"&546WddWVbcXcdWVbcXbdVVbaU"ZܻۻZݦ!\ܻۻ ۻۼ q o !-9DOS]2#"&546"32654&%2#"&546"32654&"32654&"26&#'2#"&5463#  &54 WddWVbcWddWVbcXcdWVbcXbdbaU"Z<¹ۻZZۻZݦ!&\ۻ ۻۼs##@Z210 5s)+#ssR##@Z<105 +(#^R^sXX't&>32##4632#"67654'&jT{:IaM97NN795S4ZI)/.ֶ3 B{pNN87N(;eO- BE&""|&"[|'t"4 2654&" '&5476 0jjj}_^^_R_^^ļrrrrrrr/462#"3!53#53}+:*)inoo4&&4%n;;<5P@'  M  h  \<<91<<290KSXY" !535!533#3TNriTTRD$!67632#"&'5332654'&#"#%$01;bacbHNNrfmv:;n?/0%;\ KKJJOTtnl::%( ,27654'&#"67632#"'&54632#.#"85445bch4K&EG?[Z¢]^7<=?OZMBB::lm::pjo<j%LKij 8554&'5[aUUa7<;7=r.!53#53676323!534'&#"34gm 23Cm34ecKP)*c;Eh3 Dh吏uZ#0;37367"76!32!73 4&+3 #"'3254#"8t* @|0vDP4JJH4\V|JJDR_^wژznX,sB7#RmNCq]$)05353#535#535#5!23#3##!3!27!5!654'%!&#!qVVVVI ^FEZ M@8Bj6kVkkq@Xkk^CrjVkRC327673# $547#53676?67!5!654'&#"#676323#! 8^]^]s{U͹$!7RSXYq||h YՌ :lGFRQ3K=j^=7 j+ҾA7jb@*jq!*#&'&76753#&'&'6767q+t]d{dCBd|jL?\WP ~~ef@Af(;ϭ;'_x'&r_ ')r`3#353#5!#!#5!#3!53!33!3`R8Dyyy yyyydy\bl3#7!>323!654'&#"chHl?'ox!z"sjVlne=fCUjjgE=!HZ353#5!#5!#!335Z mU/yyyy7By\RoizL+ /#"&63264&"!!463"##52765#5!+ghhg-OOuNN̓ԗ#"yԗ#"t+iihhhP">Qrkf`)353#5!2#!332654&+367654'&`R&ppyefjGgfGyyy㭑vx:SR9V 2F$! ;#"&2#">54.&7u[xy5y3L5{z/SS:%/?`{|;a?//?`hjdt/92)BKLB̾>cxc#@`UcTR~RSdU_A#$A_UbSQ`#'1B3!.+3!53#5! %326&+#!&'&/67654&'&?Yz-ڙEaV=Ty"&$:%&˦.\1<,0: \W`yÌMyyy!h?#J*^p)7Q%+7fCa#+(z@D  # '%!b) &S"7$S P PP TPS$T 7)2291<<22<22999903#3!53#3#53#5)#5#3!53##^VVV+TVV}-DVVABBBB7VBBBhBBBhL 35!#!!53 3L{5jhA\}'}''!#! 4'5!#5! &'&54DuPNusnccotL-FS6FӉW֗g[`_\gaq.mF'353#5!#3!53!33!#3FPpppy5yyyy5y52S '$4'&7#5!76'&'53%7654&3276&/7#cĚA6\k36|u, >KhO$<.)37X#E̸Gwgnk!4fMJ,:]B`%b*VEZ;h1.p` %3!53#5!#5!3#ӿ3yyyy-`2#3!53!3!53#5#!#2yyy-yyyS%!5! !#5! !53#7MXh{{ڗAcP*Z\H!!6$3 !"$'53 !"kJu^uopkoSUggHF_`2/.2%!#!5!)+!5!_++!# #3bef9 '%3265!#73#7! !%#$65&?}F o)jIIbSy,G|dyyYgy[Mk"&44#"26?6$ #7!3!7 '&547 3 &477_n{- ց$=9cyAdCDph'=q[Hz*`华"Xico*xeydKX"?Ԗ8pCsL?vDD ,364'&"3273# '&547 &4?67354B8;&*Y~VNwS3hoL%96XUS\wԹfFS(kO\:qhjG;  462"&3!73#7!&>4&"3#*NOox0<1 !pp-ha7g`yy5y(%#(<(j59 #+462"&#7!!"'72672654#>7#LOO%@8x,q%L0 !=79wJRp-gb7f`y\'?:^{(<(.A1UK+qa 7 >54&#"%!>3 #"&'332654&'3!53>7'#FWWfMi.30CsqngDlEO 'cSNfGXVe=yB""kpqZ=yq Pikk`X'ud'5{ZX'ud'5tq'd'5{Zq'd'5tdq'd'5u5q'd'5'd'5{D'd'5'd'5{d'd'5uD'd'5O'd'5'5{q,qH %3!53#5!+3)׾jjjkkq %3!53#5!+3#3gpjjjkkq #5!###3!53#5!Z{jzkkjjjkk9h%3!53###5!# #5!# 9jjjjkkzkk%3!53###5!# #5!+3:) ɾjjjjkkzkk %3!53###5!# #5!#!#3#3 ʾ Yjjjjkkzkkqj 3!53#5!# #5!# 3!533 h@Iuנ.Ljjkkkk?jjs ; %3!53 3!53 #5!# #5!## FTLP@I˿ujjjjjskkkk? #%3!53 3!53 #5!# #5!+3!# ־IJLP@Ipujjjjjskkkk?q/s&q'f0J`LJ'LLJ~'L'LLJ'YL'Y'LY t'L'LY 'L'L'L YJ'[Lj'['L[ r'L'L[;ROfDFfGJ^DPq 0 ) ) # !33 !P]P7#˺#7vAtjLlHq &#5! )5; !#67654'&/RP˺#7ܺxxc9LL9jkvtjLlHasXutWq 0)56'3 !#5#35&'&76! ) 6#7ܺxx{6 xxNP]P22 DLlHa2lk2aD vAts332#"#6$3 #"$s0ا%qzImpaSHISXA@UpadfD33276'&#"#67632#"&fwKLLLFGkedde荍?}|ttts@@0L?8 L@  <2991@    990@ D D@@@@@ T TPPPP ]!#53? _   J@  991@ /<2990@ KKOOOO@ [[____ ]!53%   _ uh8 L@  <2991@  990@ KKOOOO@ [[____ ]!3#!u _ Qc cQ L@  991@  <2990@ DD@@@@@ TTPPPP ]%#5Qc cQ _ Lh83#!#53} _ _ Qc cQ -#553%Qc cQ  _ F _ -Q %'7srfKrKfP %%7%Kfrfwqj 7%'%sfwjrqwf.j '7.rqwfsrfKL??!'!#53!? _ QE XEuh?5!!3#!'uP _ EXEQc cQErFf'7327>2'&""'&'fK^X{|X>>sWX>UV=Kf^XX>JJ>sXX>J%&=NFB"&'&"'7>232?%7%]=VU>XWs>>X|{X^K^=&%J>XXs>JJ>XX^fL?8!###5333? \ _ \T Q Q!#5553%%Q Q T\ _ \ uh85!333###u T\ _ \ EQQc cQQ3%%#555 QQc cQQ \ _ \T LF8 !#53Tr.r _ Qs sQ nh8 '57!3#4r.rTI _ Es* *sQc cQL?8 3#!#53 _ 88  )5!53%!8 8f _ uh8 3!3#!uf _  Qc cQ !5!!%#5 Qc cQ( _ )5!553%%!EQ QEa  _ E L?c2644#!#530-@@-qq _ @Z@ uhc!3#!"&463" _ qq-@@Qc cQ➢@Z@L?c#!#53!5462+7264&"â _ ➞qmm-@@Z@@ mq➢@Z@@-muhc#"&462!3#!354&"mq _ m@Z@@@➞qmQc cQm-@@Z@Lh8/ 3276;3##"#"&"#"'&+#5332327V*!NUI _ 6%VZ.V.ZV%6 _ IUN!-~Qc cQ** ~-Lh?3#!'!#53!} _ \ _ Qc cQE XE` -'7%l! )ev|  =f !#!#53 _ ^  3#!# _ Qc cQ #53!3 _ V( ^ !3!3#V _ (Qc c  %#5!5!Qc cQ,v _ FmU4 #53!31 _  Z)'R#4."%#54>2'AnnAQc cQ[Ԛ[TnAAnT _ uԚ[[)ZR4>2%#54."[Ԛ[Qc cQAnnAuԚ[[u _ TnAAnTQ %'7%5!!1srfKjrKfɢu?'sr^ !2>4&''7".4677AAnnAA7fKM[[Ԛ[[M7nAAn7KfMԚ[[M!7".467%7%2>4&rM[[Ԛ[[MKf7AAnnAArMԚ[[Mfw7nAAnFE?83!!F QF?5!!#F>    %# >3#5  uEn8!5!3n Q Qun #!5!n >Q #3% Q/> 53Q/ Lh' ^ZZ'!^Lh'^ L2?'>'>u2h' > '!>!F,n'O8JF,n'NK8L?%#53!7!!!!'7!%7! _ Y&VBDMxVBD33 77^^Lh!!'3#7!'7!#53!!!7!7'BY _ Y>VBY _ Y; 33D337c c7 ^^^^uh%'7!5!7!5!7!'3#7!!7'B2 DVBlY _ YDD3377c c^^^L?8%#53!!!! _ Y33` ^^53'#'# ^^G _ Y`33uh83#7!5!7'!5! _ Y`338c c^^#5373c c^^ _ Y33`Lh83#7!#53!!7'! _ YY _ Yv1(3338c c ^^^53'7#5' c c^^^^G _ YY _ Yv1(333.'78KEr|gsiK4sg|rE7%''/'-K4sg|rErg|sEjW%'77?7|rg|sE4Es|gr.jW%'74Es|grtKEr|gsL?%#53!!!!!! _ =5==| uh3#7!5!7!5!'!5! _ =|==5 L?8##53373#' - _ xx~?E ==Ϣm==uh8' #53733#@?~xx _ Em==m==Qc cQ!#!5!5!5!53%!!!!88 88X _ GX3!!!!%#5!5!5!5! 88Qc cQ88MXG _ XL?8#5!#5!##53!#5w _ 碢 #53#53#553%#53 VJ _ \uh853!53!533#!53=VJ _ \EQc cQ3#3#3%#53# Qc cQ _ u?8 !##33!? a }E^^u?8 !33##!u} a QEEQL?8!55!!#53d=_=;EE %3'3!#53#EE dd=_=uh8!7'!!53#5d=_=EERc c#7#%!3#53EERc cfd=_=%5!!!'3'3!#53#dEE dd^SdS=_=+ %3!53#53#'3'3#!5#c^ș dEE=_=d22+ 3'!3#!5#73!53#53#3'E77Ed^ș Py7722d=_=Q+3'!5#73!53#53#3#E;d^ș ŸEy12d=_=OϺ2)#57#53##3'373!3'3c cDD JEE>==_==;H>+%%3!53#57#53##3'3733'3#!5c^ș cDD EED==_==;z 22uhg #3!53#577'!5#35o=_=d22șc cdEE&" %'7!!srfKd{rKfd  7%'%!5!sfwrqwfQ}d3#53#53#7#3'3cc c EEEE=_=`=_=<(uh8"+!6762!3#!"'&'!%3&'&#"#3276uz2PP2 _ 2PP2 (:4.  (:4. ?2PP2?Qc cQ?2PP2? )) ))ZZ'^!uhJ !'3#7!!'3#7!!'3#7!u{ [ {{ [ {{ [ {q , L?8!#!#53!3?Т _ 68 8uh85!3!3#!#u06 _ ʢE8Qc cQ8Lh83#!#!#53!3} _ .. _ ҢQc cQ8 8L?8!###!#53!333?MXG _ X88 88uh85!333!3#!###uX _ GXE88Qc cQ88Lh83#!###!#53!333} _ X _ UXQc cQ88 88L?8 #53!P=_=Q uh8 7%3#!5=_=,QQc cQLh83#!#53%7=_==_=Qc cQ ,  !3!3*B᫻1+h-)6@'! '!* $$*9991990>54&#"#"&54632#"&54324&#"32IH7$$0e՘ݢe WOmVPmmWKt,>bFأ[t}t{| !5!!5!!5gg+|!'7#53#5!!5!73 !@4Eq#W?4,+*â*â g3VM@)ddMwb91/90KSXY"% 33^]<;A+3V! !#3#Ŭ1+%!!"$$3!!"!![Hج(HA,m,Aޠ(\(oLTTLo"*%!!"''&'&$;3#!!'!#"[Hc[mqQV(^cNyLAp,5$A,87T\(8נo[6TLZoLT!5!2#!5!26767!5!&'.H(خHA,m,AdجoLTTLo"*!5!2+'7#53!5!&!&'& 326767Hd[mqQVخ]cNAp1,4#A,d+8Uج8נ~\TLZdooLT5w'=@"  V WV V WV22122<20!#3!53!3!53#56JJJJJJJ5w'!53#5!#!#5!#3'TTwJJJJJJJwJ@#    <91990@  *]]!#'.#!!>?3!5 nNI =DN)u?$ HNh"%!%)/1@ r10!!Ӣ !!#!5!!!1Ϡ1yyTF 4632#"&!!#!5!M97NN79M1Ϡ18MN78MLyy+@M`i10KSXY"3#7RS %#'-73%yL LyL\ \8v}vw}g&"265$62"&VzTT|TQOSWU|ST3"31UevYQJPG__KDa*M2CXXieu~९{YY /D@$ !- $'!!0 $U*U0999919999032654&#".#"326#"&54632>32#"&2TevYQ1UevYQG__KDa_/YYie9XXie~९{⦮uI%!3!~$I%!3!ȢT~$8{#{e8# 37#'usus usous8###٢ee8a3737##'esآes^?ces@es!3# ihTJ3 3##"JT#4$ #4. x(\(ނ~(خ~ނ3 $53 ><جނi~ج(~ނ/%#@  & XX&1026732#"&'.#" #"&546327j Pd@7*8  kOeD=!0 l9TA6?&#Hn!bSA8?S/'/ D'J'1y 4632#"&!!M87NN79L8MN78MLy 4632#"&4632#"!!M87NN79LM87NN79r8MN78MLpNN87NHy "-14632#"&4632#"4632#"&4632#"!!M87NN79LM87NN79M87NN79LM87NN798MN78MLpNN87Ni8MN78MLpNN87NHy*#"/&#"5632324632#"&4632#"ۿ\e\eM87NN79LM87NN79'? E? Eb8MN78MLpNN87N'#"/&#"563232ۿ\e\e'? E? E'32?632&#"#"'ٮe\e\'E ?E ?!!#"/&'&#"5>32326c]\ _\Ye]` a\ZT? 9ILZRB 9If!!#"/&#"5>32326b^` !_\Ye]` a\YSB 9ILZRA 9I8l@9216/$#(!6/,(+! /(/6 6!921$#+9<2919999999999990#"'&'&'&#"5>32326#"/&'&#"5>32326c]\ _\Ye]` a\Xb^` _\Ye]` a\dZT?9ILZRB 9IѓYSB9ILZRA 9IfD 4632#"&!!!!M97NN79M8MN78MLD %4632#"&4632#"&!!!!M97NN79MM97NN79MF8MN78ML8MN78MLD %4632#"&4632#"&!!!!M97NN79M M97NN79MF8MN78ML8MN78MLD 4632#"&4632#"&!!!!M97NN79M M97NN79M8MN78ML8MN78ML1k 4632#"&4632#"&!!!!M97NN79MM97NN79MN8MN78ML8MN78ML!1k 4632#"&4632#"&!!!!`M97NN79MM97NN79MyN8MN78ML8MN78ML!'<@!  r r  <291<2<29990!!!!!'7!5!7!}/H{}?f٠f٠F !!!!!!Ҡ &@r  <2291/90 5 !!po &@ r  <<291/90%!555f%!!"$$3!!"[ج(ނޠ(\(ނ!5!2#!5!2>.Y(خނdجނ$%!!"''&'&$;!!'#"[20ea#!(cNOނABn8 V(\(8נ>+oq? #!'7#53!5!32>&'&TYRخcN_poނoE80Vج8נĠEA)j7!!!!"$$3!!"ج(ނ ̠(\(ނj7!!!5!2#!5!2>.(خނ جނ !#533 $53 >] = ]uجނӢ9 9j~ج(~ނ 4632#"&%3 $53 >M97NN79Mhجނ8MN78ML ~ج(~ނ !5!3!!3 $53 > ,,جނ++բc~ج(~ނ3!!!q<!5!!5qĠj 7!!!!!q ,<j 7!!!5!!5q 0Ġ!#!#<r)3!3Ġr #+$  $!!&'&'&!67676!ج(\(ULoA,,AoL6uULoA,u,AoL\(ج'-AoL7uTLoA-u-AoLTLoA- $  $! 676%!&'. ج(\(J,AA,X,AA,\(جTLooLTLooL &/$  $ 7 &'&  676'&  76ج(\( A  oo AA oo\(جXo AA oos AA  !$  $&'&  >'&ج(\( A oaoނA \(جXo AJa Ao #4632#"&$ >. $  $M97NN79Mނެ(\(8MN78MLނނ\(ج)&"265$62". >. $  $VzTT|TQOSłނެ(\(WU|ST. $  $7L L7L  ۂނެ(\(vKvwKyނނ\(ج!!!! >. $  $VVނެ(\(llނނ\(ج!!& >. $  $Vނެ(\(Ӣނނ\(ج 3!%!)!!!!.p0ppq1qq 3!!%!!@@1q 3!%!  !  m$nn#n 3!4632#"&!M97NN79Mf@8MN78MLY@3!!#٢sgf#!5!s+!!#!gg 35!3! 3!!#٢5ˢgf 3!!!!#٢55ˢ/. 3!!!!#٢ss #!3!!#{^/Ѣ+gf#!#!3!!#{^/++gff 3!!!!##7ss+3!!!'!#٢{[agDzDBf3!!!!!'!#7!٢<SWAs3;XDn)D#!33!!#'7#{^{CnAA+gDD[[f#!3!!!!!'7#7#%7!{^S4WNtX+Dn)DbBL  a  104632#"&M97NN79M8MN78ML 3 %! ||$$$`j!!#jHo#!5oj3!"Hjo!5!3o/j^!#^c?$%%$~  1;FOY!! &546;#"&546 !54632+32#"&=54&#"3#"32653264&"2654&#l(ع(DbEDbbEEbbEDbPDbabbabDv(D(غPEaabbDEbbDbaaE DbbEDb^!3!b?c6732#"'&'.#" Pd@7* l l9TA6?%Hn*u( #"&546323267u Pd@7* l (Vl9DTA6?%Hkn T !!!!%!!Bf6L̔4+x  #/;GS_kw+7CO[gs!2#!"543!254#!"+"=4;2+"=4;2%+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2%+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2'+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2'+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;22+"=4#"=43+"=4;2+"=4;2"=43!2#UݓJIIJ%J%%J%%K$$K%J%J%%J%F%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%%%%C%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%$%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%$%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%%%%%%%*$%%%J%%J%%K$$K%%%%%JJJI%%I&%J%%J%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%%% %I%HJ%%J%%J%%J%%J%%J%.@ 7!!!!!!u(3(! !! $<.73!3!`5!!X3 2!@ 2 5!!5!!5!4)4𬬬 !!!!!4)4XXX 333 Nf  !!!@@@ Nf  53353353353𬬬 3333333XXXX 333322s's' !!!!@@@@22s's'!!!!\!!#!!#\!5!Z!!X!5!$Z!!$X3!-Ԭ3!-.*!!@Ԭ!!@.*5!3,,(!3,X5!!@,(!!@X3!!- 2Ԭ3!!- 2* #!!!P@ZԬ 33!!P-#,Ԭ!!!@# 2Ԭ #!!!P@.* 33!!P-#\*!!!@# 2*!5!3,Z,!!3,X !5!!#@PZ,( !5!33$,PZ,!5!!$@Z, !!!#@PX !!33$,PX*!!!$@X!5!!Z !!!!-XV !5!5!!,ZV!!!X!5!!$#Z !!!!$#XV !5!5!!$#ZV!!!$#X5!3!,-,Ԭ !3!!,-XԬV 5!3!!5,-3,*V!3!,-X*5!!!@,Ԭ !!!!@#XԬV 5!!!!5@,*V!!!@X* #!5!3!,-Z,Ԭ !!3!!,-XԬ !5!3!!,-Z,* !!3!!,-X* !5!!!!@Z,Ԭ !5!3!!$,-#Z,Ԭ !5!!!!$@#Z,Ԭ !!!!!#@#PXԬV #5!5!!!!P$@V,* !!33!!$,P#X*V !5!533!!$P-#ZV* !!!!!@X* !!3!!$,-#X* !!!!!$@#XԬ !5!!!!$@#Z,* !!!!!$@#X*5!35!,-𬬬!!!-,XX33*!!@@*DH5!5!xX333x 2 2H !!!!-Rx !!##xmsZxH !!3!!xm3-sZRH !5!5!5!,NX 5!###lZZXH !5!!!5!4l t,ND 3!!!--Dx 333!x,ԬxD 3!3!,(D 5!5!5!3,,D|X 5!333,,(DX 5!35!3̠| 3!!!!-- 2Rx 333!!xs 2 2Ԭx 3!33!!-s, 2ZR !5!5!5!3,,X !5!333xtZ, 2X 5!3!5!33t, 2H !5!!5!4R 5!!###sZZH 5!!5!3!!t,-sZRD 5!5!3!,-DX 5!333!,,ԬD 5!5!333!DX,!5!5!5!3!!!!,,--R5!333!!###s,,ԬZZ !!!!5!5!333!-s t,ZR, 4763!!"Q[yY[`~| 4'&#!5!2.-Yx[Q`~=?x 5!2653#xY[Q[~|2Ψx !"'&533![Q[Yyx2|~>3m 2>#3> 2> # # 3 3>ݲ}#$cc|5!F3F~|5!|iF3P|!XF!@F~|!|iXF!@P5!5!!5iVV333PP~P!!!iXVV#!#P@P~P;(;!O;!O ;!O;!O;!O;!O;#!O#;(!O(q(!((!((!((!'(I(!]((!((3(:(' q( #'+/3!33!33!33!33!33!3mnmnm;(%8K#!1!!!!!!!#!1!!!!!!!#!1!!!!!!!#!1!!!!!!qlllllllllmmm((((;(!%)-13#3#3!3!##!#3#3#3#3#3#3#^^(ll(lm#;(#q:(!&9'(9(&&9(&9(&&9(&&9('9(&9(&&%! %!!!,7r+uv ))xxp) )$7632#"'327$%&#"%632#"'~~~~eMM>yJJJJJ6````qq|qq#u"@91990  9%-p) 327$%&#"%632#"'MM>y````qq|qqr' '/7?G%&'&'6767&'&'7%'676727"'64'7&"'62&47\+;.81F9K58.42d;E9G,:.80G9J6&8.;+d1O9FLL&_`JnLL'`_n<1& j(0=Ju &,A=N:0('<1& j(0=Ju &1<>EB0(n_II'[[JnII'[[p) %/36%632#"'327&#"6767&'&6py AAAA,+-,,-+A@@Rqq|qq%%mܱ[0$ %@%|"p) )73276'&#"7632#"'327$%&#"%632#"'r99:9rr9:99XWXXXXWXMM>yB!!BB!!oe33eje33````qq|qqp $  $pkk]Ak^p $  $27$%&#pkk]<MAk^a``p $  $"3pkk]<MAk^``p $  $327$pkk]\MMAk^>``p $  $%&#"pkk]Ak^>``p $  $"327$!pkk]<MMgAk^```p $  $"!pkk]<Ak^`p})6%63"'pRqq)#2y|q*q( 2654&#"!|~}}|v< ( $%632#"'327$%&#"!IMM>y_O````|qqqqH( ( !#%&#")%632OyyMMqq>~``  3327$3!#"'$@1>qq``) %63"æqv`) 2#%&#u)q>` 527$3Muyv`>q "'$33yuMq`p)%632#%&#"puqq>``p03327$3#"'$puMMuyy``>qq!% !% !%! !%!$3! 2654&#"4632"&nȊce;~|ddcc||}%!%!!d r<%!%!!We r<%!%!W7 r<%!%!W7 r<% !%!!!!+c,b r<<!% 4632"&! W>>VV}V2 j>VV>>VVJ !%! c  !%! b  p(  7& $  %;<*X֖% !!!!!!,7,rWb<)) Ie% !!!!%!!,crWbM)MM^??@7`d?\gOOOOy>*<?v^  <BHNTZ`fl3264'&#"&7367'67675673#''5&'&'7&'677&'67'%%&'&'%6767%&'0/CB^0/AC/88pkTcR|NOOfUip88pqUfONNQaQh!$ b)dLQk KRt!% c'd&//^000NN|P_Pfp88poQ`QyNNP\ Qgp88pmQ \Py,  M N>&`7" bK*V&"g{ M M !)1a + 0,+0$++A & 6 F V f v ]A ]A]A)9IYiy ],и(и(/A0&060F0V0f0v0000000 ]A00]3 +++&"+&"*и&.01! ! 3254#"&#%#7&'67&'6767KJ]_VNEWMCe2ntjnti7IL6a] ]pu otpu ot !)1a + 0,+0$++A & 6 F V f v ]A ]A]A)9IYiy ],и(и(/A0&060F0V0f0v0000000 ]A00]3 +++&"+&"*и&.01! ! 3254#"3$3&'67&'6767KJ]_TNEAgntjnti7IL6a] Uypu otpu ot %ͺ + ++и/A]A)9IYiy ] "и"/' + ++ и / и$01! ! #$''&'6%&'667KJOR`7IL0c Z    "*2:AIXY/Z/ܸܸи/и/Yи/и/BиB/CиC/EиGиG/LAL&L6LFLVLfLvLLLLLLL ]ALL]F/H///W+$'+$+и'/013#''%#&'52#"'&5476!!'5%!!'53'5%3'5%3#'32765'&#"sNN99=>-1\ H0e%FKSwZGr=;=NN$E| 1 ?'_>?@7`d@\hPPPPy?+<>w_VG{?,rCA0:1@!7+7 + .++..9и  и /к.9A7&767F7V7f7v7777777 ]A77]7!и+=и.B /"/+/-/ / + '2+':+:2'9и и и/2'9017#'#53'&'&54767&'&=33676=3#32654'&i($lm$(($[Uu&tU[$&uU[[UV$|ddb e|$% ZSSZ %_TYYT* $+++A]A)9IYiy ]A&6FVfv ]A]и/"и&/++ #+ #ии!и!/014&#"326&5432%##5!&w衤礡PP䤣L~~| * $!+ + +A&6FVfv ]A]A ]A ) 9 I Y i y ] и/и/&/+ + + и/ и/ 01"32654&'#5!3%#"5476礡𳉧פ㤤ף |~~L #+%+01&$76+"'&5'476%7!ttsstEus pid5s qttrtt<֤ꧦg\ul9S//и/A&6FVfv ]A]9ܸܸ//++0152654&#"#43233#!5 z{ym㗗yyy{(|jǸ /!/ и/и ܸи!ܸA]A)9IYiy ]и/ ///+ + ик  901#53533#632#4654&#"#*jjoon}mZyH{zF2 4˺+ + .++. ܸ"и$и&и (и+-ܸ0и+2и.6/$!+$ + &+&$'и&)и$+и!-и /и1и301"32654&7#"&54767!!53#5!!3!!#3!!8OO87ON=0LmkL/>Λ2  1O79NN97Os0LllllL1KӘJJ-'< ++4)+4к 49ик 49 49" 49#A))]A)))9)I)Y)i)y))))))) ])+и+/, 4942и2/9и4>//:+:и:к 9 99999"9#9+9,9192901%#5#535&'&'5'73'3#'73'676=35'73'33◰zhNgeMjzzTThOʍ7NjYYӖy?//и/и/ܸ ܸиA]A)9IYiy ] + + +01! #!!!'!27674'&#.d ;6zFH%QM_\ǃ$P<C#+///"/01#"'##56'##"/547?^'5@_*SU&/UL ;Yԧ9UP(` XI.s2Q3/4/ ܸ!ܸ и /3и/ܺ+ 9/&+и&/0122732#&547636=4'&# #4'&#"*t pz&=<xQ>hG:V Hek%PF5NP B|-&pA&NFX // 901 &&5 <F:^;" V gdG7C+///99 9/901236;2"##'65##"'&5476;235&'&=476e x<JT`(GeRUdfB3 VNT9D///4 +4 к#94+к=9>901+"'##56#+"'&575477;2732;276=4'3&'"~V"0b*SV*8UiQ"_|Q )w`SgA ? 6N #euB? gIo5 F(pZRw// /9012367632#&5476(t*#\l~ ΨT]1klSI|-X //01 &47E osU H2`g+Z+N+99V9AZZ]AZ)Z9ZIZYZiZyZZZZZZZ ]i//^+J+J):+)и/) и!и),и,/:7и7/JAи:QиQ/:Sи:UиU/V:790126;2"##'65##"'&5476;2&'5476&+"326733276=4/#"567654'&#"35&5hr=)\"IfRUdgC3&=cG kv ==Nr%SZU 6vk 6)S<F98:d  mOE:R p&i  C]&'Ax.+0 nM,W`c%+///9013#"/4?23hH0#!cZ-@o3+///99013#'654'&'#"54732XWz=\9`Y'6?F` 1TFG*֙-@x/e/ /и/и/ ܸи/ܸ//99901#"=4?2%#"=4?26ձ'VQܖCت+YP*~: ۉ8z"Co//ܸи/ ܸи/ܸи ++ +и/и/ 9901"'4723!# 5472!5kmOdXX[;Z$}@Ϝ"  ++к 9A]A)9IYiy ]// /+ 9013363'$6'"-8 w?WXc1 0 // и /и/ ܸи/иܸи/ ܸи и//// /99 9 999013%#'#3%#)N(4/c}4(,=++и ܺ 9ик  9ܺ9к9и!и%и&и'и+и(и)и*к, 9////99 9 999999&9*9,901377#'#'547#5773%%.wwzy.**  <<7CA<<{8AMtuh8 !53#5u=_=c c#u ! ! j.u-1{3 #pph # 3hp(53'#'#'## ɻEEG _ Ax/'/@(#5337373(7 7EE _ A@/'/xel2%2>4."%#54>2"&'7nAAnnAQc cQ[Ԛ[[M7AAnnAAnT _ uԚ[[Ԛ[[MlO%".4>2%#54."26rMԚ[[Ԛ[Qc cQAnnAAnrM[[Ԛ[[u _ TnAAnnAAu%-5=53676$ 33## $'&'336767675&'&'&'#uBV(\(VB _ BVVB,AoMTTMoA,,AoMTTMoA,EqqQc cQqqTLnB-u-BnLTTLnB-u-BnLTL 8 !#53 4 _  u ,8 !3#!u _ 4Qc cQL ,83#!#53 A _ _ Qc cQ L 8%#53!!!! _ Y dC33  ^^u ,83#7!5!7'!5! _ Y 33C d8c c^^L ,83#7!#53!!7'! _ YY _ Y:m3338c c ^^^L 8 3#!#53 a _ 88 u ,8 3!3#!u * _  Qc cQL 8 3#5!#53!5! a>Y _ Y33 ^^u ,8 #3!'3#7!!7'Y _ Y> 33 c c^^^u ,8#!3#!' #537鷷x _ ??x==Qc cQm=====m==gP I,g I,gP' I, I,g I,gP' I, I,g' I, I,gP' I,' I, I,uP IP' I I,P' I I,P' I' I, I,P' I I,P' I' I, I,P' I' I, I,P' I' I,' I, I,u IP' I I,' I I,P' I' I, I,' I I,P' I' I, I,' I' I, I,P' I' I,' I, I,uP' I IP' I' I I,P' I' I I,P' I' I' I, I,P' I' I I,P' I' I' I, I,P' I' I' I, I,P' I' I' I,' I, I,u IP' I I,' I I,P' I' I, I,' I I,P' I' I, I,' I' I, I,P' I' I,' I, I,uP' I IP' I' I I,P' I' I I,P' I' I' I, I,P' I' I I,P' I' I' I, I,P' I' I' I, I,P' I' I' I,' I, I,u' I IP' I' I I,' I' I I,P' I' I' I, I,' I' I I,P' I' I' I, I,' I' I' I, I,P' I' I' I,' I, I,uP' I' I IP' I' I' I I,P' I' I' I I,P' I' I' I' I, I,P' I' I' I I,P' I' I' I' I, I,P' I' I' I' I, I,P' I' I' I' I,' I, I,ag I,pagP' I,p I,ag' I,p I,agP' I,p' I, I,ag' I,p I,agP' I,p' I, I,ag' I,p' I, I,agP' I,p' I,' I, I,aP' I,p IaP' I,p' I I,aP' I,p' I I,aP' I,p' I' I, I,aP' I,p' I I,aP' I,p' I' I, I,aP' I,p' I' I, I,aP' I,p' I' I,' I, I,a' I,p IaP' I,p' I I,a' I,p' I I,aP' I,p' I' I, I,a' I,p' I I,aP' I,p' I' I, I,a' I,p' I' I, I,aP' I,p' I' I,' I, I,aP' I,p' I IaP' I,p' I' I I,aP' I,p' I' I I,aP' I,p' I' I' I, I,aP' I,p' I' I I,aP' I,p' I' I' I, I,aP' I,p' I' I' I, I,aP' I,p' I' I' I,' I, I,a' I,p IaP' I,p' I I,a' I,p' I I,aP' I,p' I' I, I,a' I,p' I I,aP' I,p' I' I, I,a' I,p' I' I, I,aP' I,p' I' I,' I, I,aP' I,p' I IaP' I,p' I' I I,aP' I,p' I' I I,aP' I,p' I' I' I, I,aP' I,p' I' I I,aP' I,p' I' I' I, I,aP' I,p' I' I' I, I,aP' I,p' I' I' I,' I, I,a' I,p' I IaP' I,p' I' I I,a' I,p' I' I I,aP' I,p' I' I' I, I,a' I,p' I' I I,aP' I,p' I' I' I, I,a' I,p' I' I' I, I,aP' I,p' I' I' I,' I, I,aP' I,p' I' I IaP' I,p' I' I' I I,aP' I,p' I' I' I I,aP' I,p' I' I' I' I, I,aP' I,p' I' I' I I,aP' I,p' I' I' I' I, I,aP' I,p' I' I' I' I, I,aP' I,p' I' I' I' I,' I, I,ua IpaP' Ip I,a' Ip I,aP' Ip' I, I,a' Ip I,aP' Ip' I, I,a' Ip' I, I,aP' Ip' I,' I, I,uaP' Ip IaP' Ip' I I,aP' Ip' I I,aP' Ip' I' I, I,aP' Ip' I I,aP' Ip' I' I, I,aP' Ip' I' I, I,aP' Ip' I' I,' I, I,ua' Ip IaP' Ip' I I,a' Ip' I I,aP' Ip' I' I, I,a' Ip' I I,aP' Ip' I' I, I,a' Ip' I' I, I,aP' Ip' I' I,' I, I,uaP' Ip' I IaP' Ip' I' I I,aP' Ip' I' I I,aP' Ip' I' I' I, I,aP' Ip' I' I I,aP' Ip' I' I' I, I,aP' Ip' I' I' I, I,aP' Ip' I' I' I,' I, I,ua' Ip IaP' Ip' I I,a' Ip' I I,aP' Ip' I' I, I,a' Ip' I I,aP' Ip' I' I, I,a' Ip' I' I, I,aP' Ip' I' I,' I, I,uaP' Ip' I IaP' Ip' I' I I,aP' Ip' I' I I,aP' Ip' I' I' I, I,aP' Ip' I' I I,aP' Ip' I' I' I, I,aP' Ip' I' I' I, I,aP' Ip' I' I' I,' I, I,ua' Ip' I IaP' Ip' I' I I,a' Ip' I' I I,aP' Ip' I' I' I, I,a' Ip' I' I I,aP' Ip' I' I' I, I,a' Ip' I' I' I, I,aP' Ip' I' I' I,' I, I,uaP' Ip' I' I IaP' Ip' I' I' I I,aP' Ip' I' I' I I,aP' Ip' I' I' I' I, I,aP' Ip' I' I' I I,aP' Ip' I' I' I' I, I,aP' Ip' I' I' I' I, I,aP' Ip' I' I' I' I,' I, I,a' Ip I,paP' Ip' I,p I,a' Ip' I,p I,aP' Ip' I,p' I, I,a' Ip' I,p I,aP' Ip' I,p' I, I,a' Ip' I,p' I, I,aP' Ip' I,p' I,' I, I,aP' Ip' I,p IaP' Ip' I,p' I I,aP' Ip' I,p' I I,aP' Ip' I,p' I' I, I,aP' Ip' I,p' I I,aP' Ip' I,p' I' I, I,aP' Ip' I,p' I' I, I,aP' Ip' I,p' I' I,' I, I,a' Ip' I,p IaP' Ip' I,p' I I,a' Ip' I,p' I I,aP' Ip' I,p' I' I, I,a' Ip' I,p' I I,aP' Ip' I,p' I' I, I,a' Ip' I,p' I' I, I,aP' Ip' I,p' I' I,' I, I,aP' Ip' I,p' I IaP' Ip' I,p' I' I I,aP' Ip' I,p' I' I I,aP' Ip' I,p' I' I' I, I,aP' Ip' I,p' I' I I,aP' Ip' I,p' I' I' I, I,aP' Ip' I,p' I' I' I, I,aP' Ip' I,p' I' I' I,' I, I,a' Ip' I,p IaP' Ip' I,p' I I,a' Ip' I,p' I I,aP' Ip' I,p' I' I, I,a' Ip' I,p' I I,aP' Ip' I,p' I' I, I,a' Ip' I,p' I' I, I,aP' Ip' I,p' I' I,' I, I,aP' Ip' I,p' I IaP' Ip' I,p' I' I I,aP' Ip' I,p' I' I I,aP' Ip' I,p' I' I' I, I,aP' Ip' I,p' I' I I,aP' Ip' I,p' I' I' I, I,aP' Ip' I,p' I' I' I, I,aP' Ip' I,p' I' I' I,' I, I,a' Ip' I,p' I IaP' Ip' I,p' I' I I,a' Ip' I,p' I' I I,aP' Ip' I,p' I' I' I, I,a' Ip' I,p' I' I I,aP' Ip' I,p' I' I' I, I,a' Ip' I,p' I' I' I, I,aP' Ip' I,p' I' I' I,' I, I,aP' Ip' I,p' I' I IaP' Ip' I,p' I' I' I I,aP' Ip' I,p' I' I' I I,aP' Ip' I,p' I' I' I' I, I,aP' Ip' I,p' I' I' I I,aP' Ip' I,p' I' I' I' I, I,aP' Ip' I,p' I' I' I' I, I,aP' Ip' I,p' I' I' I' I,' I, I,uh8#!5!3!333###!4̢ dL _ L ` 88QQc cQQuh8!###!5!333!333###!`XOX# dL _ L  8888QQc cQQL?83!!!!#5!#53!5!m00Т2Y _ Y33 ^^uh8#5!5!5!5!53!'3#7!!7'G00Y _ Y2'33 c c^^^Lh8!#5!#53!53!'3#7!!7')!Y _ YjjY _ Y33=33  c c^^^^^uh8 #!#3!333#1 l dL _ EQQQc cQL?8 3#5!#53!5!Y _ Y33 ^^uh8 #3!'3#7!!7'Y _ YW33 c c^^^3!!%#5!5! 8Qc cQ8Т _ 6!#!5!53%!!8 806 _ ʢT`53'#'##T G _ =|==5T`#53373`  _ =5==|L?8 !5#!#53? _ 碢 uh8 5!35!3#ur _ EQc cQL?8 !#53!!5#!5s _  uh8 5!3#!5!35!A< _ ddEQc cQnh8#5##53333#!'573}J dL _ r.rT1碢QQQc cQs* *snh8  +6=4632#"$4632#"$4632#"$4632#"$4632#"3#~5(&77&(5(&77&(5(&77&(5(&77&(5(&77&( _ oN77'&76N77'&76N77'&76N77'&76N77'&7c c !5!5!!% ^^} a  %!!5!5QEEQ a }nh83!3#!##'573  _ .r.rTQc cQ8s* *snh83!3#!####'57333U _ XXr.rTXXQc cQ88s* *s8nh8333###!'57 dL _ L r.rTQQc cQQs* *snh83!333###!##'573< dL _ L Ģqr.rTqQQc cQQ8s* *snh8%33333#######'5733 dL _ L ϢXr.r8XQQc cQQ8s* *suF8 !5! Tr.rEQs sn?8 !!'574 r.rs* *suF8!5!3rCTriTr.rEsQQsQs sQn?8'7!!'7#'57rTCrir.rTsss* *sL?8!!#5 k8th8%!=!37' kQQnnL?83#!#53! k r8uh8#3!37'#!r k  QnnQ.i%'%'7fwfKLweKe.h%'7%7%xfLffJfx-/ '7"'7264m0eKPPr [?Kf1PߠPs ?[27"&47%7%F?[ rPߠPKe Z@ sPPewjy %'%&462&"Few1PPr [?1wePPs @Z.j0y64&"'62'7m ?[ rPߠP1we Z@ sPO0eKQ% ' '7 %7%s..sfJJfr-rJfJfQ%' 7 %7% %'%r-rJfJfQss-IffIj7  %'% '7ss-JffJjr-r-fJfJ-Q  '7 '7-r-r-fJfJs-.sfIJfQ 7% 7rrrr~srssrrrQ ' 7  ~rsr$s~~ssr}r}Q ''7%7%%%'%r~rrfqfqEr~s#rfqfQ  7 %'%''%7%~rfrfs~f}sfQ '7%7% ' 7rf~rsrrf~ssrQ %'%'  7fjrr~sFfrrrQ 7'7 %7%rsrfr~frr~rfrfqQ '7%7% ' '7rf~rsrfrf~s~rfLh8!3#!"&'&"'7>2,Q _ ^>XWs>>XQc cQI>XXs>JJ>W,%!5!26553%V[ ɢ] ` P.2%#54&#!5؞Rb dP[VޠP ` ]F^ #!#53!2653^ޠP ` ]_ [Vn 33!3#!"&V] ` P_V[Pd bRW%>4.'7'7Kj;;jKr[FF[wLԴLrZZfK]%%'%.67fw[FF[rKj;;jwfZ ZrLԴrO'7>$ ."UwfZ ZrLԴfK[FF[rKj;;jh?E%7% .'72>bKfZZrLԴ(fw[FF[rKj;;jeB%!5!%."'>$ %'KLԴLrZ ZfKj;;jKr[FF[wrO !533##5#5%'7>$ ."HwfZ ZrLԴJfK[FF[rKj;;j(=m7"&''72>4&SrM[[MfK7nAAnrMԚ[[MKf7AAnG=267%7%".467a7AAn7KfMԚ[[Mn7nAA7fwM[[Ml9)2>4.##".4>76732AnnAAnT Mn[Ԛ[[jv uԚnAAnnA:!nxԚ[[Ԛ-r[l9)2>4.'&'#"".4>33AnnAAnM Tn[Ԛ[[u vjnAAnn!QAnxԚ[[Ԛ[Q-Lh !#53 !3#!Z _  _  Qc cQLh !3#!!#53Z# _  _ Qc cQ^ Lh !3#!!#53Z# _  _ EQc cQ uh8 533##5#5!3#!d _ JQc cQL?8 533##5#5!#53= _ J uh8!5!'77!3#!''Zrr _ &rrErrQc cQrrLh8'/3#!"'&'!#53!6762!3&'&"#276} _ 2PP2 _ 2PP2 (t(  (t( Qc cQ?2PP2? ?2PP2? )) ))#264&"7"&47675553%%QtQQt?2PP2?Q Q8tQQtQ|2P䠠P2 T\ _ \ Fn8 3!#!F  Q QFn8 !#5!3n  Q  Q %#5 Q   3%#5 Q   FEn8 3!3!F  QQ   #3%% Q/( F Fn #!#5!n F (Q  3#55 Q  u ?8 #33!a }E^u ?8 !5!33#} aEQE !5!!%# ^(  %3%!!5 QE( u? !!##3( ^u? 3##!5 8EQ #5!5!^(} a %!!5!538EQa }F ?8 3!3#!F  Q88u n8 !#3!3n Q Q %!!5!88 ࢢW #!5!!% Q/W F? 5!3#!#FW  88un #!#3!n ࢢWQ 3!!5!5 88  5!5!!Q/  F,?'K8J'M8Lu,n'O8N'PQ8F}n 3!!!5!'3F (hP| F,n #!5!5!!#n >>hPQ F}n !5!3!!5n dhO QԵ KF,n 5!!#7!5!F> h> , F? !5'3!!?6/ AFN? !55!!#?6/>  un !5%!5!3?6 A QuNn #!5!!5n >/65QL'PM8'Q8Lu?!264&#!5!2#!u-@@-EqqE)@Z@uhq!!!!!3#!44g _ qQc cQuh#"/&#"563232!3#!zu;jnAsozt;jo@s _ ? E? EQc cQL?8#"/&#"563232!#53zu;jnAsozt;jo@s _ ᓮ? E? E uh8#"/&#"563232!3#!zu;jnAsozt;jo@s _ ᓮ? E? EQc cQuoh8'1%#"/&#"563232#"/&#"563232!3#!zu;jnAsozt;jo@spzu;jnAsozt;jo@s _ ? E? E? E? EQc cQLd?6 5!#53d _ Ѧ! Lre!!#53!?2 _ 'ת Ӫudh655 !3#! _ //yFQc cQudh !3#!!!"&63!!"u _  ͑ NnnWQc cQ"͢nnLk%%!!"$'&'!#53!676$3!!"!!VB _ 7BV(A,/,A޴q qoLTTLoLd? !#53264&#!5!2#!5? _ NnnN ͑W Xnn͢Z+t%"&767&'&63"3!!"3f f͑NnnNDNnnN+"f f"͢nnnn@+Z2#5264&#!5!264&#f f͑NnnNDNnnNf f͢nnnn46 676 #4&"#4&""f f"͢nnnnEg g͑NnnNDNnnNx '&' &532653265f f͢nnnn֑g g͑NnnNDNnnN#u  u-/ 'J'&/-27!5!7632#"&'.#"!!#"&546327jR_Pd@7*8  k^_OeD=!0 TA6?&#Hc!SA8?S/4#"&5463232#5!767!5!7632#"&'.#"!!!lL_OeD=!0 d<_Pd@7*8  b`SA8?SfEZQTA6?&#HMD% '7%'11m,J+mU1L1wl++l/"%77%7 '711m+J,mU11l+K+lj^ 7%'71M1m+,m1L1ql++l/j"^ '%' '71M1vm,+m11wl+K+lLh8!53#5!#537'!55*`=_==_=c c EEEEL?8 !#53?=_=  )#53#c =_= !3#53Qc c=_=  '7%'m,J+m9wl++l/" '7m+J,m9l+K+lj^ 7%'7m+,m^l++l/j"^ '7vm,+m^l+K+lLh8!53#5!#53*`=_==_=c c 3#53#53cc c =_=`=_=uh %#5!5!Qc cQ _ Vu1h !5!53^ )V _ L? !!%#5Qc c _ L1? 53%!! ^) _ %!%!!W7 r%!!!W7 %!!,7rj~jJ!353#5!>323#'&#!534&#"3Th3lhd_zj@jVln{jÏjq353#5!##5!# 3#4+3qGͪj$dij;)53#5!#5!# 3#'&#!533Jihd‘j@j kk{j\?35!#!!#4#\{^j$dHZHD>R'35!#!!#'&#RjffhdVf#V{q{!3!53#5!#!53#G{{~jjkkF'53#5!3!53#5!#{{fjjSjjZ@-'5&'&'&'&54767347676567654'&#"q;FHA-BV"H)27=ט+LdP # [$!9) 3}3P1 020 KT KT[X@848YKTX@848Y4632327&54632#".}E00E2mm2E00E-*.EE0 0EE.-0b^2]9fU1 020 KTX@848YKTKT[KT[X@848Y4632327&54632! &0""02||20""04400$$##$$00J*5v@ -1%-$1,/'$64,-'6 , 06<2<<<91@!+ $/z$#( q05z ,3/<222<2<22290%3!53#5354632#.#"!54632#.#"!!3!53BB`RPfTBB`RPfT(jjRkKNqKNqkjjJ'"}@1z"q z - =,' , ,'0#<221/<222990@ $/$o$$]KTX###@878Y'.#"!3!53!3!53#5354632/^z{Ǯ갰WYVUdCjjRjjRk`Ju@. z zqz  =',, ',0<2<991/<222990/]KTX@878Y!3!53#"!!3!53#53546ף'ٮ갰Vjj@dkjjRk`H ;@%/,-'2-4%-$7,5'$:,-'6 , 0<<2<<<1@$+ $5z$#( q.36;z ,19/<<222<2<22290/=12]!3!53#5354632#.#"!54632'.#"!3!53!3!53CBaSOgT-WY^z{ǮjjRkKNq`VUdCjjRjjF6y@-'6 , 07<2<@ 2,1,'5,<<@#,!'&,/'91@"&15z. %4/<<222@0 z (z!qq220!3!53#5354632#.#"!5463!3!53#"!!3!53CBaSOgT+ף'ٮjjRkKNq`Vjj@dkjjO.&#"3!53#5354632!!32673#"&5#53Cr갰W[CZ4FHB.dCjjRk` Nk]LU_kdV#.#"#"&'5332654&/.54632&54632!!32673#"&5#5354&#"jjutw-.CCgbj|_{ֽ V?@<Z4FHBhHE+gtRRC(*)-.HFo,,wv]YFV1-,fW))+`prk]LU_kreoX-TL !%$32654&#"3>3235>54$#" M97NN79ar~{TpMN78N{+3캶.L#5333!53!3!73#z23E{}<ؖMy\yy1y#;l`R$(:H353#5! !32654&+32654&+#67>54'&67654'&'`uyHBi?#"L?W-3S3QGyyƤf}v-iCZ5*"(!4M0k?4'%*Ly8!Z$;`'%32+53#5! !%#676'&UoɏB YABy,GE+yyy%;53;`353#5!#5!!53#5!!533`>yyy!\`353#5!#5!!53#5!33`3{ yy!y\V3$2.#"3267#5!# !267'&?-ҿT;I6::T | Q?=Ʊ&&xNLhi@AAguity'<̫:`` 353#5!#33`8yyyy\jV{533265#5!#!"&6765MLaMS2G)S^X+yy"e%L3`3 353#5!##5!# 3!333`y-ٓg8?MUyyy!yy3yy\Bu`s 353#5!#!533`L%yyy-\V{!353#5! !#3!53#3#3%#3Vhg13呑D|_yyByyysy\V *ABC%2#" ! %&7>4.'2%{TxyS}|;a?//@`);`?//?`<!%\BKLByddERSdT`AFB_UcTQRScU_@F@`UcTR1P|xL)H7332654&/.54$!2#.#"!"$654'&/.'&54ؿn۲' ĵhлђ::AP_cAD;`<1ZHbvrZd+78Ǹ,,gf]a4742O}AH/71GTH3 5#"32634.'&547hFnzjsq_q cjMORdyp(@1 P)NI`yTP?{Wc""ldlRr<3^MUfK`Und/F#77#5!>32#"&'!5326&#"#>54.ǘ-pp-_jmYYmj_yp,00, ;G3# /+4#y#xSQQSyfʯ1"C56 AYXDuQC( TD&# !2#.#"3267&&4oup~r}zk>.uv.=HL& (**هπxT,qo+ Th $354&#"3263!5#"32#5!3&'&767o`inYZmi`b-pp-pk::W:dd;i6ySQ,*QSxy"rqCstDTD%*4&#"!32673# ! &=473&5N^[O%|s+. C%$#Xҩwηzt#(vshjh?$#.#"!!3!53#535463234pKEPH :UN R@p NLsyyy5yklP7T9hD+2A!"&'53326=#"325!4&#"326565#&'&76jsq-pp-`inYZmi`HpW:dd;W::`!!ifySQ,*QSy6V`^CstDrq?!1353#5!>323!534&#"3334.F@}EUkdp p#5/y#x}_Tyy5i#y"-/.3/1+Dg<)F #'4632#"&3!53#5!32654&#"3#pQOooOQpo ((!ppTQooQOonuyy5y-((5h9= +34632#"&#5!#"&'5326532654&#">5#oRNpoOQp)F %3!53#5!3#?oppyyy#xe"FHD0=LP>323!534&#"3!534&#"3!53#5!>3234.%34.#Js=S^h>R_h>np"4.)p&:pyjayyhyyhyy5y]Vc"9y +Eg<'"323!534&#"33%34.F@}EUkdp p#5/y5y_Tyy5i#y5/.3/1+Dg<)TD+%26&" ! 67654'&'&p[Z\\?>-$yy$-/,$yy$,0Tq+)w"qq"x!qq"z/VFD !%3326&#"%#5!>32#"&'3!5;#676'&)_jmYYmj_-pp-bp::X;ee;HiʯySQQSHyy!qrDtsDTVhD"&53!53#"325!4&#"32653%&'&76їc-pp-`inYZmi`ypjW:dd;W::!yySQ,*QSy6!CstDrq;LD#.#"3!53#5!>32#LqPLtF4|Yp3US̵\yy5yok >5X-D)S7332654&/.54632#.#"!"&67>54'&/&'.'&54`qlsIi^Ձq lo@SѠcO E(1Q1 '$+9," E)w}KF@F%)!mnEB6>%51nQ)3"% .).3+ O ۜ p#yJyuDVZQ8+);)/')3!5#"&5#5!3265#5#.'#?}BXkckq*p"40'Ry_T+ykyR51Cg<)'!#5!# #5!# 3ub  {Igyy`yyR5 '#5!## ##5!##37 37Pȋ}tZ}|%FD';LyyRfyyyR'4'#5!# 3!53 3!53 #5!# #ϼ<\ɏJwgOyyFyyyyyy59' #"&'5326?#5!##5!#!70s1xGqCCAP(1se4ubMJGc%5yyuyyjHF' 35!#!!53 37Hb5wwp4,y9+wF`1 )$26&" ! '676'&'&QYYY>+*>+##,/-##-/XHIpq,, LM-f- !5!5%!!3w;yyw,#>3 !53!57$54&#"!!67654&'&'xzz?`Év?^3@4::TVdB%%ДJ=o^DUlJo**zɴ*7H>3 !"&'332654&+532654&#"#67>54'&'67654&'&'v!vy B4vyT9;5?9vI_f10*14O# ##̱((Hx{'(lHC<o21U:U!#1?2JSMT=)53!5!!!3 3#qxC6ys+o#/!>3 !"&'332654&#"#!!67654'&'BZ@zxLw3d[P9uw:P[34(*F?Be32! !2#.#"26&"64&'&577A_^XZvynwXXWvb!2C!u44qffiѯPW !7N@%mǗ' #!#!!7!XE4+()Pj#!-7AKW $5467.54$! 4&#"264&#"326>54&'&547&547>54.ȺL\]KKK']rs\]rq^=VPPc""bQPF-[_Z .nZ)J̥Υ$Ⱦ'wwuuշaLTu!IxMOuU!uTMae^|k\^g&\-JF7o!+8"26#"54! !"&'3326.547676'&!WWX B^$23232653#"'0)'4`fU$>71,)/ag^CH> 9.dv 7/ir-qP10@ //]K TX@878YKTX@878Y#u?u@ 91290K TX@878Y@/// ]KTX@878YKTX@878Y3#'#tt?c@ 91<90K TX@878Y@//// ]KTX@878Y373tt7 #."#>32^kk^7667u}|7 N@ [[1<0K TK T[K T[X@878Y@  ]332673#"&^k\\k^7667u}|u -  10K TK T[X  @878Y2#"&546/FC22CFF.2CC2.F3#3#uuT #!#uuJw`'&}J`'%3!53#53#5!3#갰hjjjfjkj 47632"'&!"/.!"B^"!q.""""./B!!;93'#'# 54!2#5!'&#"32+qdof8o~bBKL<kqqZ{_K'&HJx`'&Vd9$@ $#$! $  $!!%221@! o b"o/2<2299dn%0@ ! ! MKSXY" ]@0&O&p&&&]]353#5!#5!##"'&'53367653d @NtBA>_+*}A*&Fjkf/kkyPc!`--?9j;< '4632#"&^GDaaDG^F``FDa`@53_<VV: o m p o Jf7q3!JZ?JJqsjqqqdsq)q5TqPq1fdsbqsq{V`9  H\f;{fffJf'JJ{;;;J'Jf;fJs7;'7!7R7h\}Z5Z5d3;#5^dJsqqqq)q)q)W)_uqdsssssd````HhqX;fffffff{fffffJ f'JfffffL'7'7'7'7;fffs{fs{fs{fs{fjqfuqfqfqfqfqfqfdsfdsfdsfdsfq'q'J)J)i)])qJ)qJiqDJ5T{;q;;Pq;Pq;Pq4;_q;ZV-d'Jd'Jd'Jq`'Jsfsfsf wfqJqJqJ{s{s{s{sV7;V7;V7;`'7`'7`'7`'7`'7`'79 !HH\7R\7R\7RJ;@q;q;ss{fuqj@q;fqs}5;dsuJ)q)&qF;TJ3'JsncQsufb@;q{sS;7;VW7;VZ',}qM\7Rfff~q'J\\ q q Vfqq ; 5d {dJf)Vsf`'7`'7`'7`'7`'7ffffsfdsfq sfsfff; q q Vfdsf ;qd'JffdLffqfqf))]sfsfqJqJ`'7`'7{sV7;q' `f\7RfqfsfsfsfsfH;J;{;ff.{%P&Vs7RLLfff;{f{f-fvfffx%dh/ef;wffZf^'7'T'TJ#JJ II;;JJJ&;J+TfRf.ffJJiJJJTTGGr,;;J;7;7;'7fJ!>TR{Rf{JJJrsIf;fUF;;+TwfJJfDffx;;B;&J,;h;GG?;";v.p....q."..c.:uuuu>.?.33uuuuZLW..7d.?.BAl~[lp7#L"p::J3P.#qqNq\qs)qq1fdqsqbqSVHs `})bHgf%dJ#JJgfJf%dVSJf#JFT3FJhSfBJ{fvfmSJZFZ#JfJZfF~=~=tM,\sfs{fqGkGB\\{f{;s{f{fhq;s1f`Usssqqdqs{)q)_5T4q1q:qqqqLqfqoqq1q41fqsqbqsVu q/ !q !q[Fqdqs qvFfWI1;Jf\]ZUFUFF$9JUFfUF;{fmSCO%JJFpJpJ<^<[<{f; Aff+1;{fsJ{;$F'+FUF@<F< q;\skfm2[$`q;;Lg0;q;\oKZ1q;1d2 F<q!F qF q;s{fVmSHH 2SF'J)q\q;qUFUF;fffqfsfsf\o]ZffqUFqUFsfsfsfs{f/JFLq1;q^<nnXnnnmZn_Z6n:xZnn#nx,nFnnnnn,nznnnVnZcnnnjnHdPdPQe'PFZd9d8FdPdPd@dMd2G=dd2=,d:Pe?PdQd%dSdXP(P?2QddReRdPd dddSdddpdPdffJfff G GGGHeGGGXG)@h?h?!HdGG\ ?<.@@3@@3%3@@@@@3@f/%/1/@@@@3%%1#//.1#feGq3@@@@@/3@1#///Hg%f5//A</15@@H%1#@/444@@fq;q;q;s{fjqfjqfjqfjqfjqfqfqfqfqfqfqJdsfq'Jq'Jq' q'Jq'J)Fq;q;q;Pq;PiPqPq 1fJ1fJ1fJd'Jd'Jd'Jd'Jsfsfbq;bq;qJqJqJq{s{s{sV7;V7;V7;V7;`'7`'7`'7`'7`'79 !9 !9 !9 !9 !  H\7R\7R\7R'J7!:fsffffffffqfqfqfqf)qJ)qJsfsfsf`'7`'7HHHHgfgfgfgfgfgfgfgf    KdKdKdKdKdKd     G JJJJJJJJ  F v #J#J###@###+    o  ffffff      JJJJJJJJ  Z ZZZZZZZZ     gfgfKdKdJJ##JffJJZZgfgfgfgfgfgfgfgf    JJJJJJJJ  F v ZZZZZZZZ     gfgfgfgfgfgfgfJJJJJK3Pq##!####)])iJJJJJJHH^.R ZZZZZ}VZZZZZZ%Z9933V q q338JE54/555D5(5O5553999f[v.5455Z5d555D5(5O5553999f[@@@d.@HRuq>R^V_a_`'bPZL`V`L}}qFH2``S3uuD aZZd5DdDO)qqIqq i tq u  Pqsjq1fJJJJ 2J ;{ffJ qjq qs{fLuL-.LurNLuLnLuLuLuLL` FZuFF uu LZLLuFFLLuLuL..LuLuLuuuLuuuZuLuLLuLLuL #hW|W|33^5^5Vp===jT+// u/DD??++* xZ+xxxxxxx||''''''''''''''''''''''q''''''''''llgg'''''''''''''''''pprppppppppp7p7Tpp''''3'''ppppp'''',,,,,,,,S,,,,,C,,X,,B,,X,,x,ueDu xL xu xL xL xu xL xL xu xL xu xuuuuuuuuuuuuuuuuuuLuLuLuTTLuLunnnnnnnununLtLu..-.-L,.FVWrher(GLLLuLuLFFF FuuuuFuFuFuFFFFFFuuuuuLuuLLuuLLZ@ /+/+///LL//LuuLL''''q'Jq;\7RqrFZJJf}JVJVJ9H>F,Ovd45````V`j``VVF55 /T/TTTq?T? FhF FwFFVT/T7;X1/H`TjoTJJ;Jd,$ 79k:;<&:$7$9$:$<$I$W$Y$Z$\$$$$$$%$&$'$6$7$8$9$:$$$$0$1$2$3$4$5$r$s${$$ $ $ %&%&&%*&%2&%<%&%&%&%&%&%&%&%%&%&%&%&%&%&%&%&%&%&%&%&%8%:%&%&%&%&&''&''9(&))))))$N)Du)H)R)N)N)N)N)N)u)u)u)u)u)u)u)))))))))))N)u)N)u)N)u))))))))))u)))**&**<**:--a--.k.$.&.2.8.:.<.H.R.X.\}................................}.}......0.1.:/7Y/8/9 /:N/<}/\/////}///&Y/0/:}/{/1}1}1122K2292;3a33a333$D383D3H3R3V3D3D3D3D3D333333333333333333333333!3#3044K44{&4&57595:5<5D/5\55/5/5/5/5/5/5/5&555&5:5{566K6666 6"777777$77&7Da7Fa7Ha7Ra7Vk7Z7777777a77777a7a77a7777a7777a7a7a7a7a7!k7#k7&&8D88D888$8-8888899D992929$u929DD9HD9L9RD9X}9\9u9u9u9u9u9999999D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9}9}9}9}999D99D91}9{K9K::k::N:N:$:DN:HY:L:Ru:U:X:\::::::N:N:N:N:N:N:u:Y:Y:Y:Y:u:u:u:u:u:u:::::::Y:u:::1:{&:&;;$;&;2;;;;;;;;;;;;;;;<<<<<<$a<&<Da<HN<L<RN<XN<a<a<a<a<a<<a<a<a<a<a<a<<<N<N<N<N<N<N<N<N<N<N<N<N<N<N<<<N<)<1N==IIII{I~&INRUUY Y Z Z [\\79:<IWYZ\$%&'6789:012345rs{ 79:<IWYZ\$%&'6789:012345rs{ 79:<IWYZ\$%&'6789:012345rs{ 79:<IWYZ\$%&'6789:012345rs{ 79:<IWYZ\$%&'6789:012345rs{ &&&&&K$9<:}}K9;K9;K9;K9;K9;K9;DD$-DD$-DD$-DD$-$a&DaHNLRNXNaaaaaaaaaaa<NNNNNNNNNNNNNNN)1N&79:<IWYZ\$%&'6789:012345rs{ 79:<IWYZ\$%&'6789:012345rs{ 79:<IWYZ\$%&'6789:012345rs{ &9&9&&<:7Y89 :N<}\}&Y0:}{7Y89 :N<}\}&Y0:}{O7Y89 :N<2\2&Y0:2{ } }  &79:<D/\///////&&:{79:<D/\///////&&:{  K  6   """K""6" ""&&&&&&$&7&&Da&Fa&Ha&Ra&Vk&Z&&&&&&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&!k&#k&&&0D00D000$0-00000777Dn7FU7Ga7HV7I7Ja7L7M7P}7Q}7RU7S7Ta7U}7V7W7X7Y7Z7[7\7]777 ::::::$a:&:Da:HN:L:RN:XN:a:a:a:a:a::a:a:a:a:a:a:<:N:N:N:N:N:N:N:N:N:N:N:N:N:N:::N:):1N??i$i-/iiiiiis7s9ks:s;s<ss&s:z$z-/zzzzzz~$~-/~99~:9~;9~<9~~~~~~~9~:979:;9<YZ&:    { ~&  ; ;DDDD4  xXHd @   P,L,\Pd@\ \!X##$|%L'4)+++,<,,,-./4/0|1,12348567@8p989:x;<< =t>(>?AD EpFFGGH`H`HIJ4K8LM@NlO4PdQ\QRR@STTTUVVWX8XxXYHYZTZtZZ[X[p[[[[]P^^^^^^__,_D_\``,`D`\`t``ab$b<bTblbbcHddddde e$fffffgg g8gPghh`hxhhhhhitjjjjjjkkklll4lLldl|lllllm m$m<mTmdnDn\ntnnnnnooo4oLodo|ooooop p$qr r$r<rTrlrrrrrsLspsssssuuuvv,vDv\vtvw(wwwxx(x@xXxpy0zz(z@zXzpzz{x||||||}},}D}\}t}}}}}~~~4t4Ld| $<TlTl|\`xx8$, P<xD\t$Hx `X(x`P,@Xp0H`x 8Ph0H\t4Ld|`x0 $<Tl,D\t4Ld| $0x 8Ph$,tXP,h$HHXTTp$<p\ôĐŰpǀ8ȼ\Hʠ xT̨0͸ppЀ(Ѥ0Ҡ4ӤTԬ հ|\ؼdtٌڼ0۬<ވHd< ($|\$$P,(<h hxLl(Hp$8L`t4H\p L Dd(Ht0Dp8L`t Tx40Lx$<Td,<p 0@(Xp88HT4D |  ` p  `  , p  <t,l@4p dXh| l8L@ X p!,!<!L!!"#$\$t$$%@%P&&&t'$'4()*H*+x, ,0,@,P,,,--../h001x220234d5,5<667779l: :; <<=>l>|???$??@@AhBBCD@EEF`G4HTHlI I|IJDJTJdJJKL|MTMlMMN\NODOPXPQpQQR,R|RS@STTPTU UV,VVVWTWX(XXY\YZZpZ[\[[\\X\\\]X]^(^^_D_``\`l`|``a@ab8bc cpccccddd d8dPd`dpdddddeee e8ePeheeeeeefff0fHf`fxfffffg,ghggh<hi ij jk4kl(lm@nnohoptqqtrrs|tt|tuluvwDwxxyz(z{8{{|}4}~d<@x<h4 Xt,P|`h8Pd@D$h ll0`@h8(TxtXh(<Pdx Ldd48dd0¬0xtD,Ơ$ǔh0ɠɸ0H`xʐʨ 8Phˀˠ0H`x̨̐ 8Ph̀͘Ͱ(@XpΈΠθ0H`xϐϨ 8PhЀИа0H`xѐѨ 8PhҀҘҰ(@XpӈӠӸ0PpԐ԰(@XpՈՠո0H`x֐֨ 8Ph׀טװ0Ppؐذ0Ppِ٨ @`xڐڨ @`xېۨ 8Ph܀ܘܰ(@Xp݌ݤݼ4Ld|ޔް4Ld|ߔ߬,H`|,D\t,Hd| $@Xt4Lh,D\t (D\l $4L\t4Ld| $<Tl,D\t4Ld| $<Tl\l(DTl(@Xp0@Xp0@Ph 8HDl PxdD`L`x@D$Xtl  4H\p`T @  \ @   T d   dX@`$Dd$<L(x804L\t,<L\X h` ( p  !!D!!"D""#@##$$$p$$%$%`%%&D&''( (P((()0)h))*P**+ +++,,(,L,t,,,,--0-L-h---. .//</x//0H00101x122H233X344T44505l55686|670778X89$9l9:::;4;|;< <|<=H==>>X??D?@(@T@ADAB8BBCCDD`DDE<EdEEEFlG<G\GGGGH@HlHHI,IIJJ<JK(KKL0LLNN\NO,OOPdPQ QQR(RtRSlSTTTUdUUUVV@VdWWXTXY`YZ[ [[\\p\\]]0]T]x]]^ ^L^^_0__`<`t````aahbdbbc8cph(h\hxhhhiii8iliijjPjjk$kHklkkkkl lDldllllmm0mTm|mmmn$nTnnnno$oPoxooop$pPp|pppq$qLqpqqqrrDrprrrs0sdsstt8tpttuuHu|uuvv4v`vvvww4whwwwx xLxxxy y<ypyyzzXzzz{0{`{{|,|||}$}X}x}}}~ ~(~D~`~|~~~$L`|$@\xdx <Ph 8,<D`(Dl@\4`|Dl<x(D @l8|,X\\Dl$L 0x<4X8 €¬8ÌXŠHƄTǐ ȤȤȸ4XlɈɤ,Xlʈʤ,Xt˘˼ 8d̘̬$Hl͘ʹ(LxΤ<hόϸ<hД(\јѬ$HlҘҴ(LxӤ<hԌԸ<hՔ(\ִ֘(Lxפ(T؈شX|٨4hڜ8lۨTܘܬ$Hlݘݴ(Lxޤ<hߌ߸<h(\(Lx(TX|4h8lT(Lx(TX|4h8lTHtDxX8lTDLl$<TXP$@dH8hHD dD(l`  p  @  $   X   P P,`$TDt4h,\xD P@xd`@Ht$xp,\ , l  !!T!!!""8"h"""#$$d$%$%`%%& &'H'(@()*+|,L-|.//////////////////////0x012D223348445d6D77`78489,9:D:;t<<= =>>?@ @@A$ABTBCD EExEFLFG8GGHHIdJ<JK0KL0M<NN8NO\PQ0QRPRSSdSSSTTHTTTUU J +@ ^>_ :Q p    a 4      G V }   " :% & h;   Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. DejaVu changes are in public domain Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. DejaVu changes are in public domain DejaVu SerifDejaVu SerifBookBookDejaVu SerifDejaVu SerifDejaVu SerifDejaVu SerifVersion 2.25Version 2.25DejaVuSerifDejaVuSerifDejaVu fonts teamDejaVu fonts teamhttp://dejavu.sourceforge.nethttp://dejavu.sourceforge.netFonts are (c) Bitstream (see below). DejaVu changes are in public domain. Bitstream Vera Fonts Copyright ------------------------------ Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org. Fonts are (c) Bitstream (see below). DejaVu changes are in public domain. Bitstream Vera Fonts Copyright ------------------------------ Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org. http://dejavu.sourceforge.net/wiki/index.php/Licensehttp://dejavu.sourceforge.net/wiki/index.php/LicenseDejaVu SerifDejaVu SerifBookBook~Z J  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghjikmlnoqprsutvwxzy{}|~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L sfthyphenAmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccent Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJij Jcircumflex jcircumflex Kcommaaccent kcommaaccent kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflex Tcommaaccent tcommaaccentTcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentlongsuni0180uni0181uni0182uni0183uni0184uni0185uni0186uni0187uni0188uni0189uni018Auni018Buni018Cuni018Duni018Euni018Funi0190uni0191uni0193uni0194uni0195uni0196uni0197uni0198uni0199uni019Auni019Buni019Cuni019Duni019Euni019FOhornohornuni01A2uni01A3uni01A4uni01A5uni01A6uni01A7uni01A8uni01A9uni01AAuni01ABuni01ACuni01ADuni01AEUhornuhornuni01B1uni01B2uni01B3uni01B4uni01B5uni01B6uni01B7uni01B8uni01B9uni01BBuni01BCuni01BDuni01BEuni01C0uni01C1uni01C2uni01C3uni01C4uni01C5uni01C6uni01C7uni01C8uni01C9uni01CAuni01CBuni01CCuni01CDuni01CEuni01CFuni01D0uni01D1uni01D2uni01D3uni01D4uni01D5uni01D6uni01D7uni01D8uni01D9uni01DAuni01DBuni01DCuni01DDuni01DEuni01DFuni01E0uni01E1uni01E2uni01E3uni01E4uni01E5Gcarongcaronuni01E8uni01E9uni01EAuni01EBuni01ECuni01EDuni01EEuni01EFuni01F0uni01F1uni01F2uni01F3uni01F4uni01F5uni01F6uni01F8uni01F9 Aringacute aringacuteAEacuteaeacute Oslashacute oslashacuteuni0200uni0201uni0202uni0203uni0204uni0205uni0206uni0207uni0208uni0209uni020Auni020Buni020Cuni020Duni020Euni020Funi0210uni0211uni0212uni0213uni0214uni0215uni0216uni0217 Scommaaccent scommaaccentuni021Auni021Buni021Euni021Funi0220uni0221uni0224uni0225uni0226uni0227uni0228uni0229uni022Auni022Buni022Cuni022Duni022Euni022Funi0230uni0231uni0232uni0233uni0234uni0235uni0236dotlessjuni0238uni0239uni023Auni023Buni023Cuni023Duni023Euni023Funi0240uni0241uni0242uni0245uni0250uni0251uni0252uni0253uni0254uni0255uni0256uni0257uni0258uni0259uni025Auni025Buni025Cuni025Duni025Euni025Funi0260uni0261uni0262uni0263uni0264uni0265uni0266uni0267uni0268uni0269uni026Auni026Buni026Cuni026Duni026Euni026Funi0270uni0271uni0272uni0273uni0274uni0275uni0276uni0277uni0278uni0279uni027Auni027Buni027Cuni027Duni027Euni027Funi0280uni0281uni0282uni0283uni0284uni0285uni0286uni0287uni0288uni0289uni028Auni028Buni028Cuni028Duni028Euni028Funi0290uni0291uni0292uni0293uni0294uni0295uni0296uni0297uni0298uni0299uni029Auni029Buni029Cuni029Duni029Euni029Funi02A0uni02A1uni02A2uni02A3uni02A4uni02A5uni02A6uni02A7uni02A8uni02A9uni02AAuni02ABuni02ACuni02ADuni02AEuni02AFuni02B0uni02B1uni02B2uni02B3uni02B4uni02B5uni02B6uni02B7uni02B8uni02B9uni02BBuni02BCuni02BDuni02BEuni02BFuni02C0uni02C1uni02C8uni02C9uni02CCuni02D0uni02D1uni02D2uni02D3uni02D6uni02DEuni02E0uni02E1uni02E2uni02E3uni02E4uni02E5uni02E6uni02E7uni02E8uni02E9uni02EE gravecomb acutecombuni0302 tildecombuni0304uni0305uni0306uni0307uni0308 hookabovecombuni030Auni030Buni030Cuni030Duni030Euni030Funi0310uni0311uni0312uni0313uni0314uni0315uni0316uni0317uni0318uni0319uni031Auni031Buni031Cuni031Duni031Euni031Funi0320uni0321uni0322 dotbelowcombuni0324uni0325uni0326uni0327uni0328uni0329uni032Auni032Buni032Cuni032Duni032Euni032Funi0330uni0331uni0332uni0333uni0334uni0335uni0336uni0337uni0338uni0339uni033Auni033Buni033Cuni033Duni033Euni033Funi0343uni034Funi0358uni0361uni0374uni0375uni037Auni037Etonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammauni0394EpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsi IotadieresisUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdauni03BCnuxiomicronrhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonosuni03D0theta1Upsilon1uni03D3uni03D4phi1omega1uni03D7uni03D8uni03D9uni03DAuni03DBuni03DCuni03DDuni03DEuni03DFuni03E0uni03E1uni03F0uni03F1uni03F2uni03F3uni03F4uni03F5uni03F6uni03F7uni03F8uni03F9uni03FAuni03FBuni03FCuni03FDuni03FEuni03FFuni0400uni0401uni0402uni0403uni0404uni0405uni0406uni0407uni0408uni0409uni040Auni040Buni040Cuni040Duni040Euni040Funi0410uni0411uni0412uni0413uni0414uni0415uni0416uni0417uni0418uni0419uni041Auni041Buni041Cuni041Duni041Euni041Funi0420uni0421uni0422uni0423uni0424uni0425uni0426uni0427uni0428uni0429uni042Auni042Buni042Cuni042Duni042Euni042Funi0430uni0431uni0432uni0433uni0434uni0435uni0436uni0437uni0438uni0439uni043Auni043Buni043Cuni043Duni043Euni043Funi0440uni0441uni0442uni0443uni0444uni0445uni0446uni0447uni0448uni0449uni044Auni044Buni044Cuni044Duni044Euni044Funi0450uni0451uni0452uni0453uni0454uni0455uni0456uni0457uni0458uni0459uni045Auni045Buni045Cuni045Duni045Euni045Funi0462uni0463uni0464uni0465uni046Auni046Buni0472uni0473uni0474uni0475uni048Cuni048Duni0490uni0491uni0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni049Euni049Funi04A0uni04A1uni04A2uni04A3uni04A4uni04A5uni04A6uni04A7uni04AAuni04ABuni04ACuni04ADuni04AEuni04AFuni04B0uni04B1uni04B2uni04B3uni04B4uni04B5uni04B6uni04B7uni04BAuni04BBuni04C0uni04C1uni04C2uni04C3uni04C4uni04C7uni04C8uni04CBuni04CCuni04CFuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8uni04D9uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E0uni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04F6uni04F7uni04F8uni04F9uni10A0uni10A1uni10A2uni10A3uni10A4uni10A5uni10A6uni10A7uni10A8uni10A9uni10AAuni10ABuni10ACuni10ADuni10AEuni10AFuni10B0uni10B1uni10B2uni10B3uni10B4uni10B5uni10B6uni10B7uni10B8uni10B9uni10BAuni10BBuni10BCuni10BDuni10BEuni10BFuni10C0uni10C1uni10C2uni10C3uni10C4uni10C5uni10D0uni10D1uni10D2uni10D3uni10D4uni10D5uni10D6uni10D7uni10D8uni10D9uni10DAuni10DBuni10DCuni10DDuni10DEuni10DFuni10E0uni10E1uni10E2uni10E3uni10E4uni10E5uni10E6uni10E7uni10E8uni10E9uni10EAuni10EBuni10ECuni10EDuni10EEuni10EFuni10F0uni10F1uni10F2uni10F3uni10F4uni10F5uni10F6uni10F7uni10F8uni10F9uni10FAuni10FBuni10FCuni1D02uni1D08uni1D09uni1D14uni1D16uni1D17uni1D1Duni1D1Euni1D1Funi1D2Cuni1D2Duni1D2Euni1D30uni1D31uni1D32uni1D33uni1D34uni1D35uni1D36uni1D37uni1D38uni1D39uni1D3Auni1D3Buni1D3Cuni1D3Euni1D3Funi1D40uni1D41uni1D42uni1D43uni1D44uni1D45uni1D46uni1D47uni1D48uni1D49uni1D4Auni1D4Buni1D4Cuni1D4Duni1D4Euni1D4Funi1D50uni1D51uni1D52uni1D53uni1D54uni1D55uni1D56uni1D57uni1D58uni1D59uni1D5Auni1D5Buni1D62uni1D63uni1D64uni1D65uni1D77uni1D78uni1D7Buni1D85uni1D9Buni1D9Cuni1D9Duni1D9Euni1D9Funi1DA0uni1DA1uni1DA2uni1DA3uni1DA4uni1DA5uni1DA6uni1DA7uni1DA8uni1DA9uni1DAAuni1DABuni1DACuni1DADuni1DAEuni1DAFuni1DB0uni1DB1uni1DB2uni1DB3uni1DB4uni1DB5uni1DB6uni1DB7uni1DB9uni1DBAuni1DBBuni1DBCuni1DBDuni1DBEuni1DBFuni1E00uni1E01uni1E02uni1E03uni1E04uni1E05uni1E06uni1E07uni1E08uni1E09uni1E0Auni1E0Buni1E0Cuni1E0Duni1E0Euni1E0Funi1E10uni1E11uni1E12uni1E13uni1E14uni1E15uni1E16uni1E17uni1E18uni1E19uni1E1Auni1E1Buni1E1Cuni1E1Duni1E1Euni1E1Funi1E20uni1E21uni1E22uni1E23uni1E24uni1E25uni1E26uni1E27uni1E28uni1E29uni1E2Auni1E2Buni1E2Cuni1E2Duni1E30uni1E31uni1E32uni1E33uni1E34uni1E35uni1E36uni1E37uni1E38uni1E39uni1E3Auni1E3Buni1E3Cuni1E3Duni1E3Euni1E3Funi1E40uni1E41uni1E42uni1E43uni1E44uni1E45uni1E46uni1E47uni1E48uni1E49uni1E4Auni1E4Buni1E50uni1E51uni1E52uni1E53uni1E54uni1E55uni1E56uni1E57uni1E58uni1E59uni1E5Auni1E5Buni1E5Cuni1E5Duni1E5Euni1E5Funi1E60uni1E61uni1E62uni1E63uni1E68uni1E69uni1E6Auni1E6Buni1E6Cuni1E6Duni1E6Euni1E6Funi1E70uni1E71uni1E72uni1E73uni1E74uni1E75uni1E76uni1E77uni1E78uni1E79uni1E7Auni1E7Buni1E7Cuni1E7Duni1E7Euni1E7FWgravewgraveWacutewacute Wdieresis wdieresisuni1E86uni1E87uni1E88uni1E89uni1E8Auni1E8Buni1E8Cuni1E8Duni1E8Euni1E8Funi1E90uni1E91uni1E92uni1E93uni1E94uni1E95uni1E96uni1E97uni1E98uni1E99uni1E9Auni1E9Buni1EA0uni1EA1uni1EA2uni1EA3uni1EACuni1EADuni1EAEuni1EAFuni1EB0uni1EB1uni1EB2uni1EB3uni1EB4uni1EB5uni1EB6uni1EB7uni1EB8uni1EB9uni1EBAuni1EBBuni1EBCuni1EBDuni1EC6uni1EC7uni1EC8uni1EC9uni1ECAuni1ECBuni1ECCuni1ECDuni1ECEuni1ECFuni1ED8uni1ED9uni1EE4uni1EE5uni1EE6uni1EE7Ygraveygraveuni1EF4uni1EF5uni1EF6uni1EF7uni1EF8uni1EF9uni1F00uni1F01uni1F02uni1F03uni1F04uni1F05uni1F06uni1F07uni1F08uni1F09uni1F0Auni1F0Buni1F0Cuni1F0Duni1F0Euni1F0Funi1F10uni1F11uni1F12uni1F13uni1F14uni1F15uni1F18uni1F19uni1F1Auni1F1Buni1F1Cuni1F1Duni1F20uni1F21uni1F22uni1F23uni1F24uni1F25uni1F26uni1F27uni1F28uni1F29uni1F2Auni1F2Buni1F2Cuni1F2Duni1F2Euni1F2Funi1F30uni1F31uni1F32uni1F33uni1F34uni1F35uni1F36uni1F37uni1F38uni1F39uni1F3Auni1F3Buni1F3Cuni1F3Duni1F3Euni1F3Funi1F40uni1F41uni1F42uni1F43uni1F44uni1F45uni1F48uni1F49uni1F4Auni1F4Buni1F4Cuni1F4Duni1F50uni1F51uni1F52uni1F53uni1F54uni1F55uni1F56uni1F57uni1F59uni1F5Buni1F5Duni1F5Funi1F60uni1F61uni1F62uni1F63uni1F64uni1F65uni1F66uni1F67uni1F68uni1F69uni1F6Auni1F6Buni1F6Cuni1F6Duni1F6Euni1F6Funi1F70uni1F71uni1F72uni1F73uni1F74uni1F75uni1F76uni1F77uni1F78uni1F79uni1F7Auni1F7Buni1F7Cuni1F7Duni1F80uni1F81uni1F82uni1F83uni1F84uni1F85uni1F86uni1F87uni1F88uni1F89uni1F8Auni1F8Buni1F8Cuni1F8Duni1F8Euni1F8Funi1F90uni1F91uni1F92uni1F93uni1F94uni1F95uni1F96uni1F97uni1F98uni1F99uni1F9Auni1F9Buni1F9Cuni1F9Duni1F9Euni1F9Funi1FA0uni1FA1uni1FA2uni1FA3uni1FA4uni1FA5uni1FA6uni1FA7uni1FA8uni1FA9uni1FAAuni1FABuni1FACuni1FADuni1FAEuni1FAFuni1FB0uni1FB1uni1FB2uni1FB3uni1FB4uni1FB6uni1FB7uni1FB8uni1FB9uni1FBAuni1FBBuni1FBCuni1FBDuni1FBEuni1FBFuni1FC0uni1FC1uni1FC2uni1FC3uni1FC4uni1FC6uni1FC7uni1FC8uni1FC9uni1FCAuni1FCBuni1FCCuni1FCDuni1FCEuni1FCFuni1FD0uni1FD1uni1FD2uni1FD3uni1FD6uni1FD7uni1FD8uni1FD9uni1FDAuni1FDBuni1FDDuni1FDEuni1FDFuni1FE0uni1FE1uni1FE2uni1FE3uni1FE4uni1FE5uni1FE6uni1FE7uni1FE8uni1FE9uni1FEAuni1FEBuni1FECuni1FEDuni1FEEuni1FEFuni1FF2uni1FF3uni1FF4uni1FF6uni1FF7uni1FF8uni1FF9uni1FFAuni1FFBuni1FFCuni1FFDuni1FFEuni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni200Buni200Cuni200Duni200Euni200Funi2010uni2011 figuredashuni2015 underscoredbl quotereverseduni201Funi2023onedotenleadertwodotenleaderuni202Auni202Buni202Cuni202Duni202Euni202Funi2031 exclamdbluni203Duni203Euni2047uni2048uni2049uni205Funi2060uni2061uni2062uni2063uni2064uni206Auni206Buni206Cuni206Duni206Euni206Funi2070uni2071uni2074uni2075uni2076uni2077uni2078uni2079uni207Auni207Buni207Cuni207Duni207Euni207Funi2080uni2081uni2082uni2083uni2084uni2085uni2086uni2087uni2088uni2089uni208Auni208Buni208Cuni208Duni208Euni2090uni2091uni2092uni2093uni2094uni20A6Eurouni20AFuni20B1uni20B4uni20B5uni2102uni2103uni2109uni210Duni210Euni2115uni2116uni2119uni211Auni211Duni2124uni2126uni2127uni212Auni212Buni213Cuni213Duni213Euni213Funi2140uni2141uni2142uni2143uni2144uni2145uni2146uni2147uni2148uni2149uni214Bonethird twothirdsuni2155uni2156uni2157uni2158uni2159uni215A oneeighth threeeighths fiveeighths seveneighthsuni215Funi2160uni2161uni2162uni2163uni2164uni2165uni2166uni2167uni2168uni2169uni216Auni216Buni216Cuni216Duni216Euni216Funi2170uni2171uni2172uni2173uni2174uni2175uni2176uni2177uni2178uni2179uni217Auni217Buni217Cuni217Duni217Euni217Funi2180uni2181uni2182uni2183uni2184 arrowleftarrowup arrowright arrowdown arrowboth arrowupdnuni2196uni2197uni2198uni2199uni219Auni219Buni219Cuni219Duni219Euni219Funi21A0uni21A1uni21A2uni21A3uni21A4uni21A5uni21A6uni21A7 arrowupdnbseuni21A9uni21AAuni21ABuni21ACuni21ADuni21AEuni21AFuni21B0uni21B1uni21B2uni21B3uni21B4carriagereturnuni21B6uni21B7uni21B8uni21B9uni21BAuni21BBuni21BCuni21BDuni21BEuni21BFuni21C0uni21C1uni21C2uni21C3uni21C4uni21C5uni21C6uni21C7uni21C8uni21C9uni21CAuni21CBuni21CCuni21CDuni21CEuni21CF arrowdblleft arrowdblup arrowdblright arrowdbldown arrowdblbothuni21D5uni21D6uni21D7uni21D8uni21D9uni21DAuni21DBuni21DCuni21DDuni21DEuni21DFuni21E0uni21E1uni21E2uni21E3uni21E4uni21E5uni21E6uni21E7uni21E8uni21E9uni21EAuni21EBuni21ECuni21EDuni21EEuni21EFuni21F0uni21F1uni21F2uni21F3uni21F4uni21F5uni21F6uni21F7uni21F8uni21F9uni21FAuni21FBuni21FCuni21FDuni21FEuni21FF universal existentialuni2204gradientelement notelementsuchthatuni220Cuni2210uni2213uni2214uni2215 asteriskmathuni2218uni2219uni221Buni221C proportional orthogonalangleuni2223uni2224uni2225uni2226 logicaland logicalor intersectionunionuni222Cuni222Duni2238uni2239uni223Auni223Bsimilaruni223Duni2242uni2243uni2250uni2251uni2252uni2253uni2254uni2255 equivalence propersubsetpropersuperset notsubsetuni2285 reflexsubsetreflexsupersetuni228Cuni228Duni228Euni228Funi2290uni2291uni2292uni2293uni2294 circleplusuni2296circlemultiplyuni2298uni2299uni229Auni229Buni229Cuni229Duni229Euni229Funi22A0uni22A1uni22A2uni22A3uni22A4 perpendicularuni22A6uni22A7uni22A8uni22A9uni22AAuni22ABuni22ACuni22ADuni22AEuni22AFdotmathhouseuni2308uni2309uni230Auni230B revlogicalnotuni2311uni2318uni2319 integraltp integralbtuni2325uni2328uni237Duni23AEuni23CFuni2423SF100000uni2501SF110000uni2503uni2504uni2505uni2506uni2507uni2508uni2509uni250Auni250BSF010000uni250Duni250Euni250FSF030000uni2511uni2512uni2513SF020000uni2515uni2516uni2517SF040000uni2519uni251Auni251BSF080000uni251Duni251Euni251Funi2520uni2521uni2522uni2523SF090000uni2525uni2526uni2527uni2528uni2529uni252Auni252BSF060000uni252Duni252Euni252Funi2530uni2531uni2532uni2533SF070000uni2535uni2536uni2537uni2538uni2539uni253Auni253BSF050000uni253Duni253Euni253Funi2540uni2541uni2542uni2543uni2544uni2545uni2546uni2547uni2548uni2549uni254Auni254Buni254Cuni254Duni254Euni254FSF430000SF240000SF510000SF520000SF390000SF220000SF210000SF250000SF500000SF490000SF380000SF280000SF270000SF260000SF360000SF370000SF420000SF190000SF200000SF230000SF470000SF480000SF410000SF450000SF460000SF400000SF540000SF530000SF440000uni256Duni256Euni256Funi2570uni2571uni2572uni2573uni2574uni2575uni2576uni2577uni2578uni2579uni257Auni257Buni257Cuni257Duni257Euni257Fupblockuni2581uni2582uni2583dnblockuni2585uni2586uni2587blockuni2589uni258Auni258Blfblockuni258Duni258Euni258Frtblockltshadeshadedkshadeuni2594uni2595uni2596uni2597uni2598uni2599uni259Auni259Buni259Cuni259Duni259Euni259F filledboxH22073uni25A2uni25A3uni25A4uni25A5uni25A6uni25A7uni25A8uni25A9H18543H18551 filledrectuni25ADuni25AEuni25AFuni25B0uni25B1triagupuni25B3uni25B4uni25B5uni25B6uni25B7uni25B8uni25B9triagrtuni25BBtriagdnuni25BDuni25BEuni25BFuni25C0uni25C1uni25C2uni25C3triaglfuni25C5uni25C6uni25C7uni25C8uni25C9circleuni25CCuni25CDuni25CEH18533uni25D0uni25D1uni25D2uni25D3uni25D4uni25D5uni25D6uni25D7 invbullet invcircleuni25DAuni25DBuni25DCuni25DDuni25DEuni25DFuni25E0uni25E1uni25E2uni25E3uni25E4uni25E5 openbulletuni25E7uni25E8uni25E9uni25EAuni25EBuni25ECuni25EDuni25EEuni25EFuni25F0uni25F1uni25F2uni25F3uni25F4uni25F5uni25F6uni25F7uni25F8uni25F9uni25FAuni25FBuni25FCuni25FDuni25FEuni25FFuni2600uni2638uni2639 smileface invsmilefacesununi263Ffemaleuni2641maleuni2643uni2644uni2645uni2646uni2647spadeuni2661uni2662clubuni2664heartdiamonduni2667uni2669 musicalnotemusicalnotedbluni266Cuni266Duni266Euni266Funi27A1uni27E0uni27E8uni27E9uni27F0uni27F1uni27F2uni27F3uni27F4uni27F5uni27F6uni27F7uni27F8uni27F9uni27FAuni27FBuni27FCuni27FDuni27FEuni27FFuni2800uni2801uni2802uni2803uni2804uni2805uni2806uni2807uni2808uni2809uni280Auni280Buni280Cuni280Duni280Euni280Funi2810uni2811uni2812uni2813uni2814uni2815uni2816uni2817uni2818uni2819uni281Auni281Buni281Cuni281Duni281Euni281Funi2820uni2821uni2822uni2823uni2824uni2825uni2826uni2827uni2828uni2829uni282Auni282Buni282Cuni282Duni282Euni282Funi2830uni2831uni2832uni2833uni2834uni2835uni2836uni2837uni2838uni2839uni283Auni283Buni283Cuni283Duni283Euni283Funi2840uni2841uni2842uni2843uni2844uni2845uni2846uni2847uni2848uni2849uni284Auni284Buni284Cuni284Duni284Euni284Funi2850uni2851uni2852uni2853uni2854uni2855uni2856uni2857uni2858uni2859uni285Auni285Buni285Cuni285Duni285Euni285Funi2860uni2861uni2862uni2863uni2864uni2865uni2866uni2867uni2868uni2869uni286Auni286Buni286Cuni286Duni286Euni286Funi2870uni2871uni2872uni2873uni2874uni2875uni2876uni2877uni2878uni2879uni287Auni287Buni287Cuni287Duni287Euni287Funi2880uni2881uni2882uni2883uni2884uni2885uni2886uni2887uni2888uni2889uni288Auni288Buni288Cuni288Duni288Euni288Funi2890uni2891uni2892uni2893uni2894uni2895uni2896uni2897uni2898uni2899uni289Auni289Buni289Cuni289Duni289Euni289Funi28A0uni28A1uni28A2uni28A3uni28A4uni28A5uni28A6uni28A7uni28A8uni28A9uni28AAuni28ABuni28ACuni28ADuni28AEuni28AFuni28B0uni28B1uni28B2uni28B3uni28B4uni28B5uni28B6uni28B7uni28B8uni28B9uni28BAuni28BBuni28BCuni28BDuni28BEuni28BFuni28C0uni28C1uni28C2uni28C3uni28C4uni28C5uni28C6uni28C7uni28C8uni28C9uni28CAuni28CBuni28CCuni28CDuni28CEuni28CFuni28D0uni28D1uni28D2uni28D3uni28D4uni28D5uni28D6uni28D7uni28D8uni28D9uni28DAuni28DBuni28DCuni28DDuni28DEuni28DFuni28E0uni28E1uni28E2uni28E3uni28E4uni28E5uni28E6uni28E7uni28E8uni28E9uni28EAuni28EBuni28ECuni28EDuni28EEuni28EFuni28F0uni28F1uni28F2uni28F3uni28F4uni28F5uni28F6uni28F7uni28F8uni28F9uni28FAuni28FBuni28FCuni28FDuni28FEuni28FFuni2900uni2901uni2902uni2903uni2904uni2905uni2906uni2907uni2908uni2909uni290Auni290Buni290Cuni290Duni290Euni290Funi2910uni2911uni2912uni2913uni2914uni2915uni2916uni2917uni2918uni2919uni291Auni291Buni291Cuni291Duni291Euni291Funi2920uni2921uni2922uni2923uni2924uni2925uni2926uni2927uni2928uni2929uni292Auni292Buni292Cuni292Duni292Euni292Funi2930uni2931uni2932uni2933uni2934uni2935uni2936uni2937uni2938uni2939uni293Auni293Buni293Cuni293Duni293Euni293Funi2940uni2941uni2942uni2943uni2944uni2945uni2946uni2947uni2948uni2949uni294Auni294Buni294Cuni294Duni294Euni294Funi2950uni2951uni2952uni2953uni2954uni2955uni2956uni2957uni2958uni2959uni295Auni295Buni295Cuni295Duni295Euni295Funi2960uni2961uni2962uni2963uni2964uni2965uni2966uni2967uni2968uni2969uni296Auni296Buni296Cuni296Duni296Euni296Funi2970uni2971uni2972uni2973uni2974uni2975uni2976uni2977uni2978uni2979uni297Auni297Buni297Cuni297Duni297Euni297Funi29EBuni2A0Cuni2A0Duni2A0Euni2A2Funi2B00uni2B01uni2B02uni2B03uni2B04uni2B05uni2B06uni2B07uni2B08uni2B09uni2B0Auni2B0Buni2B0Cuni2B0Duni2B0Euni2B0Funi2B10uni2B11uni2B12uni2B13uni2B14uni2B15uni2B16uni2B17uni2B18uni2B19uni2B1Auni2C67uni2C68uni2C69uni2C6Auni2C6Buni2C6Cuni2C75uni2C76uni2C77uni2E18uni2E2EuniF6C5cyrBrevecyrbreveuniFB00uniFB03uniFB04uniFB05uniFB06uniFE00uniFE01uniFE02uniFE03uniFE04uniFE05uniFE06uniFE07uniFE08uniFE09uniFE0AuniFE0BuniFE0CuniFE0DuniFE0EuniFE0FuniFFF9uniFFFAuniFFFBuniFFFCuniFFFDu1D538u1D539u1D53Bu1D53Cu1D53Du1D53Eu1D540u1D541u1D542u1D543u1D544u1D546u1D54Au1D54Bu1D54Cu1D54Du1D54Eu1D54Fu1D550u1D552u1D553u1D554u1D555u1D556u1D557u1D558u1D559u1D55Au1D55Bu1D55Cu1D55Du1D55Eu1D55Fu1D560u1D561u1D562u1D563u1D564u1D565u1D566u1D567u1D568u1D569u1D56Au1D56Bu1D7D8u1D7D9u1D7DAu1D7DBu1D7DCu1D7DDu1D7DEu1D7DFu1D7E0u1D7E1 dlLtcaronDieresisAcuteTildeGrave CircumflexCaron uni0311.caseBreve Dotaccent Hungarumlaut Doubleacuteiogonek.dotlessuni0268.dotless dotaccent.iuni029D.dotlessuni1E2D.dotlessuni1ECB.dotlessEng.alt brailledot@$d@$ 'd']}  22GG}  2d2dd%x %K.%x @@%0% @@   @I o} @ :]%]@%@0d0 ddl~}~2}|{|{zyx wv wvuv utltsrqp qp p@o}nm>nkm>lk llk k@jddjihihg]hhgf%g]g@f%eddeddcba`_.`_.^]\K[}ZYDXWVUSdRQ2POP}ONA@BL JdI"IH2GGFE EDCDkCBCBA BA@ A @ @@S?>->M=<=K<; <<@; :9:]98987 654543432 321 2 2@1 0/0D/.//. ..- d-,+,K+"++@* *d)(0)A(-(0'-'&:% %]$#$S#"##@"! !]     @#$0S-0 k@-B d-    @    @8k d } d2}-2- Sd+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++pnp4nagios-0.6.16/lib/kohana/system/fonts/LICENSE0000664000000000000000000001132011662503006020053 0ustar rootrootFonts are (c) Bitstream (see below). DejaVu changes are in public domain. Glyphs imported from Arev fonts are (c) Tavmjong Bah (see below) Bitstream Vera Fonts Copyright ------------------------------ Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org. Arev Fonts Copyright ------------------------------ Copyright (c) 2006 by Tavmjong Bah. All Rights Reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the modifications to the Bitstream Vera Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Tavmjong Bah" or the word "Arev". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Tavmjong Bah Arev" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL TAVMJONG BAH BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the name of Tavmjong Bah shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from Tavmjong Bah. For further information, contact: tavmjong @ free . fr. $Id: LICENSE 2133 2007-11-28 02:46:28Z lechimp $ pnp4nagios-0.6.16/lib/kohana/system/i18n/0000775000000000000000000000000011662503006016477 5ustar rootrootpnp4nagios-0.6.16/lib/kohana/system/i18n/nl_NL/0000775000000000000000000000000011662503006017501 5ustar rootrootpnp4nagios-0.6.16/lib/kohana/system/i18n/nl_NL/session.php0000664000000000000000000000040111662503006021670 0ustar rootroot 'De sessienaam, %s, is ongeldig. Hij mag alleen maar bestaan uit alfanumerieke tekens en underscores. Hij moet ook minstens één letter bevatten.', );pnp4nagios-0.6.16/lib/kohana/system/i18n/nl_NL/validation.php0000664000000000000000000000376111662503006022353 0ustar rootroot 'Ongeldige validatieregel gebruikt: %s', // Algemene errors 'unknown_error' => 'Onbekende validatiefout bij het valideren van het %s veld.', 'required' => 'Het %s veld is verplicht.', 'min_length' => 'Het %s veld moet minstens %s karakters lang zijn.', 'max_length' => 'Het %s veld mag maximum %s karakters lang zijn.', 'exact_length' => 'Het %s veld moet exact %s karakters lang zijn.', 'in_array' => 'Het %s veld moet geselecteerd worden uit de gegeven opties.', 'matches' => 'Het %s veld moet overeenkomen met het %s veld.', 'valid_url' => 'Het %s veld moet een geldige URL zijn.', 'valid_email' => 'Het %s veld moet een geldig e-mailadres zijn.', 'valid_ip' => 'Het %s veld moet een geldig IP-adres zijn.', 'valid_type' => 'Het %s veld mag alleen maar %s karakters bevatten.', 'range' => 'Het %s veld moet tussen bepaalde waardes liggen.', 'regex' => 'Het %s veld valideert niet als geldige invoer.', 'depends_on' => 'Het %s veld is afhankelijk van het %s veld.', // Upload errors 'user_aborted' => 'Het uploaden van het %s bestand werd afgebroken.', 'invalid_type' => 'Het bestandstype van het %s bestand is niet toegestaan.', 'max_size' => 'Het %s bestand dat je wilde uploaden is te groot. De maximum toegelaten grootte is %s.', 'max_width' => 'Het %s upgeloade bestand is te groot: maximum toegelaten breedte is %spx.', 'max_height' => 'Het %s upgeloade bestand is te groot: maximum toegelaten hoogte is %spx.', 'min_width' => 'Het %s upgeloade bestand is te klein: minimum toegelaten breedte is %spx.', 'min_height' => 'Het %s upgeloade bestand is te klein: minimum toegelaten breedte is %spx.', // Field types 'alpha' => 'alfabetisch', 'alpha_numeric' => 'alfanumeriek', 'alpha_dash' => 'alfabetisch, streepje, en underscore', 'digit' => 'cijfers', 'numeric' => 'getal', );pnp4nagios-0.6.16/lib/kohana/system/i18n/nl_NL/core.php0000664000000000000000000000363711662503006021153 0ustar rootroot 'Er kan maar één instantie van Kohana zijn per pagina oproep.', 'uncaught_exception' => 'Uncaught %s: %s in bestand %s op lijn %s', 'invalid_method' => 'Ongeldige method %s opgeroepen in %s.', 'invalid_property' => 'De %s property bestaat niet in de %s class.', 'log_dir_unwritable' => 'De log directory is niet schrijfbaar: %s', 'resource_not_found' => 'De opgevraagde %s, %s, kon niet gevonden worden.', 'invalid_filetype' => 'Het opgevraagde bestandstype, .%s, wordt niet toegestaan door het view configuratiebestand.', 'view_set_filename' => 'Je moet de view bestandsnaam opgeven voordat je render aanroept.', 'no_default_route' => 'Zet een default route in config/routes.php.', 'no_controller' => 'Kohana kon geen controller aanduiden om deze pagina te verwerken: %s', 'page_not_found' => 'De opgevraagde pagina, %s, kon niet gevonden worden.', 'stats_footer' => 'Geladen in {execution_time} seconden, met een geheugengebruik van {memory_usage}. Aangedreven door Kohana v{kohana_version}.', 'error_file_line' => '%s [%s]:', 'stack_trace' => 'Stack Trace', 'generic_error' => 'Oproep kon niet afgewerkt worden', 'errors_disabled' => 'Ga naar de homepage of probeer opnieuw.', // Drivers 'driver_implements' => 'De %s driver voor de %s library moet de %s interface implementeren.', 'driver_not_found' => 'De %s driver voor de %s library werd niet gevonden.', // Resource names 'config' => 'configuratiebestand', 'controller' => 'controller', 'helper' => 'helper', 'library' => 'library', 'driver' => 'driver', 'model' => 'model', 'view' => 'view', );pnp4nagios-0.6.16/lib/kohana/system/i18n/nl_NL/upload.php0000664000000000000000000000022311662503006021473 0ustar rootroot 'De upload doelmap, %s, is niet schrijfbaar.', );pnp4nagios-0.6.16/lib/kohana/system/i18n/nl_NL/encrypt.php0000664000000000000000000000061511662503006021700 0ustar rootroot 'De %s groep is niet gedefinieerd in je configuratie.', 'requires_mcrypt' => 'Om de Encrypt library te gebruiken, moet mcrypt ingeschakeld zijn in je PHP installatie.', 'no_encryption_key' => 'Om de Encrypt library te gebruiken, moet je een encryption key zetten in je config bestand.', ); pnp4nagios-0.6.16/lib/kohana/system/i18n/nl_NL/profiler.php0000664000000000000000000000070211662503006022033 0ustar rootroot 'Benchmarks', 'post_data' => 'Post Data', 'no_post' => 'Geen post data', 'session_data' => 'Session Data', 'no_session' => 'Geen session data', 'queries' => 'Database Queries', 'no_queries' => 'Geen queries', 'no_database' => 'Database niet geladen', 'cookie_data' => 'Cookie Data', 'no_cookie' => 'Geen cookie data', ); pnp4nagios-0.6.16/lib/kohana/system/i18n/nl_NL/calendar.php0000664000000000000000000000240611662503006021765 0ustar rootroot 'zo', 'mo' => 'ma', 'tu' => 'di', 'we' => 'wo', 'th' => 'do', 'fr' => 'vr', 'sa' => 'za', // Short day names 'sun' => 'zon', 'mon' => 'maa', 'tue' => 'din', 'wed' => 'woe', 'thu' => 'don', 'fri' => 'vri', 'sat' => 'zat', // Long day names 'sunday' => 'zondag', 'monday' => 'maandag', 'tuesday' => 'dinsdag', 'wednesday' => 'woensdag', 'thursday' => 'donderdag', 'friday' => 'vrijdag', 'saturday' => 'zaterdag', // Short month names 'jan' => 'jan', 'feb' => 'feb', 'mar' => 'maa', 'apr' => 'apr', 'may' => 'mei', 'jun' => 'jun', 'jul' => 'jul', 'aug' => 'aug', 'sep' => 'sep', 'oct' => 'okt', 'nov' => 'nov', 'dec' => 'dec', // Long month names 'january' => 'januari', 'february' => 'februari', 'march' => 'maart', 'april' => 'april', 'mayl' => 'mei', 'june' => 'juni', 'july' => 'juli', 'august' => 'augustus', 'september' => 'september', 'october' => 'oktober', 'november' => 'november', 'december' => 'december', );pnp4nagios-0.6.16/lib/kohana/system/i18n/nl_NL/event.php0000664000000000000000000000053311662503006021334 0ustar rootroot 'Poging om ongeldig subject %s te binden aan %s mislukt. Subjects moeten de Event_Subject class extenden.', 'invalid_observer' => 'Poging om ongeldige observer %s te binden aan %s mislukt. Observers moeten de Event_Subject class extenden.', ); pnp4nagios-0.6.16/lib/kohana/system/i18n/nl_NL/image.php0000664000000000000000000000255211662503006021300 0ustar rootroot 'De Image library vereist de getimagesize() functie en die is niet beschikbaar op dit systeem.', 'unsupported_method' => 'De huidige Image driver ondersteunt volgende transformatie niet: %s.', 'file_not_found' => 'De opgegeven afbeelding, %s, werd niet gevonden. Controleer a.u.b. eerst of afbeeldingen bestaan via de file_exists() functie voordat je ze begint te bewerken.', 'type_not_allowed' => 'De opgegeven afbeelding, %s, is geen toegestaan afbeeldingstype.', 'invalid_width' => 'De breedte die je opgaf, %s, is ongeldig.', 'invalid_height' => 'De hoogte die je opgaf, %s, is ongeldig.', 'invalid_dimensions' => 'De afmetingen die je opgaf voor %s zijn ongeldig.', 'invalid_master' => 'De master afmeting die je opgaf, is ongeldig.', 'invalid_flip' => 'De spiegelrichting die je opgaf, is ongeldig.', 'directory_unwritable' => 'De opgegeven directory, %s, is niet schrijfbaar.', // ImageMagick specific messages 'imagemagick' => array ( 'not_found' => 'De opgegeven ImageMagick directory bevat een vereist programma niet: %s.', ), // GD specific messages 'gd' => array ( 'requires_v2' => 'De Image library vereist GD2. Kijk op http://php.net/gd_info voor meer informatie.', ), ); pnp4nagios-0.6.16/lib/kohana/system/i18n/nl_NL/captcha.php0000664000000000000000000000261211662503006021616 0ustar rootroot 'Het opgegeven bestand, %s, werd niet gevonden. Controleer met file_exists() of bestanden bestaan, voordat je ze gebruikt.', 'requires_GD2' => 'De Captcha library vereist GD2 met FreeType ondersteuning. Zie http://php.net/gd_info voor meer informatie.', // Words of varying length for the Captcha_Word_Driver to pick from // Note: use only alphanumeric characters 'words' => array ( 'cd', 'tv', 'ok', 'pc', 'nu', 'ik', 'zon', 'kar', 'kat', 'bed', 'tof', 'hoi', 'puin', 'hoop', 'mens', 'roof', 'auto', 'haar', 'water', 'beter', 'aarde', 'appel', 'mango', 'liter', 'ananas', 'bakker', 'wekker', 'kroket', 'zingen', 'dansen', 'fietsen', 'zwemmen', 'kolonel', 'potlood', 'kookpot', 'voetbal', 'barbecue', 'computer', 'generaal', 'koelkast', 'fietsers', 'spelling', 'appelmoes', 'president', 'kangoeroe', 'frankrijk', 'luxemburg', 'apartheid', ), // Riddles for the Captcha_Riddle_Driver to pick from // Note: use only alphanumeric characters 'riddles' => array ( array('Haat jij spam? (ja of nee)', 'ja'), array('Ben jij een robot? (ja of nee)', 'nee'), array('Vuur is... (heet of koud)', 'heet'), array('Het seizoen na herfst is...', 'winter'), array('Welke dag van de week is het vandaag?', strftime('%A')), array('In welke maand van het jaar zijn we?', strftime('%B')), ), ); pnp4nagios-0.6.16/lib/kohana/system/i18n/nl_NL/cache.php0000664000000000000000000000076411662503006021264 0ustar rootroot 'De %s groep is niet gedefinieerd in uw configuratie.', 'extension_not_loaded' => 'De %s PHP extensie moet geladen zijn om deze driver te gebruiken.', 'unwritable' => 'De geconfigureerde opslaglocatie, %s, is niet schrijfbaar.', 'resources' => 'Het cachen van resources is onmogelijk omdat resources niet geserialized kunnen worden.', 'driver_error' => '%s', );pnp4nagios-0.6.16/lib/kohana/system/i18n/nl_NL/pagination.php0000664000000000000000000000061611662503006022346 0ustar rootroot 'De %s groep werd niet gedefinieerd in uw pagination configuratie.', 'page' => 'pagina', 'pages' => 'pagina\'s', 'item' => 'item', 'items' => 'items', 'of' => 'van', 'first' => 'eerste', 'last' => 'laatste', 'previous' => 'vorige', 'next' => 'volgende', ); pnp4nagios-0.6.16/lib/kohana/system/i18n/nl_NL/swift.php0000664000000000000000000000024111662503006021343 0ustar rootroot 'Er vond een fout plaats bij het verzenden van de e-mail.', );pnp4nagios-0.6.16/lib/kohana/system/i18n/nl_NL/orm.php0000664000000000000000000000023011662503006021002 0ustar rootroot 'De %s groep is niet opgegeven in je configuratie.', 'error' => 'Er was een SQL fout: %s', 'connection' => 'Fout bij het verbinden met de database: %s', 'invalid_dsn' => 'De DSN die je opgaf is ongeldig: %s', 'must_use_set' => 'Je moet een SET clause opgeven voor je query.', 'must_use_where' => 'Je moet een WHERE clause opgeven voor je query.', 'must_use_table' => 'Je moet een database tabel opgeven voor je query.', 'table_not_found' => 'De tabel %s bestaat niet in je database.', 'not_implemented' => 'De method die je opriep, %s, wordt niet ondersteund door deze driver.', 'result_read_only' => 'Query resultaten kunnen alleen maar gelezen worden.', );pnp4nagios-0.6.16/lib/kohana/system/i18n/nl_NL/errors.php0000664000000000000000000000227411662503006021533 0ustar rootroot array( 1, 'Framework Error', 'Bekijk de Kohana documentatie voor meer informatie over deze fout.'), E_PAGE_NOT_FOUND => array( 1, 'Pagina Niet Gevonden', 'De opgevraagde pagina werd niet gevonden. Mogelijk werd deze verplaatst of verwijderd.'), E_DATABASE_ERROR => array( 1, 'Database Error', 'Er vond een database fout plaats bij het verwerken van de opgeroepen procedure. Bekijk het errorbericht hieronder voor meer informatie.'), E_RECOVERABLE_ERROR => array( 1, 'Recoverable Error', 'Er vond een fout plaats waardoor deze pagina niet geladen kon worden. Als dit probleem aanhoudt, contacteer dan a.u.b. de website beheerder.'), E_ERROR => array( 1, 'Fatal Error', ''), E_USER_ERROR => array( 1, 'Fatal Error', ''), E_PARSE => array( 1, 'Syntax Error', ''), E_WARNING => array( 1, 'Warning Message', ''), E_USER_WARNING => array( 1, 'Warning Message', ''), E_STRICT => array( 2, 'Strict Mode Error', ''), E_NOTICE => array( 2, 'Runtime Message', ''), );pnp4nagios-0.6.16/lib/kohana/system/i18n/ru_RU/0000775000000000000000000000000011662503006017533 5ustar rootrootpnp4nagios-0.6.16/lib/kohana/system/i18n/ru_RU/session.php0000664000000000000000000000047611662503006021736 0ustar rootroot 'Имя сессии, %s, некорректно. Оно должно состоять только из буквенно-цифровых символов, и, как минимум, одной буквы.', ); pnp4nagios-0.6.16/lib/kohana/system/i18n/ru_RU/validation.php0000664000000000000000000000561211662503006022402 0ustar rootroot 'Некорректное правило валидации: %s', // General errors 'unknown_error' => 'Неизвестная ошибка при валидации поля %s.', 'required' => 'Поле %s обязательно для заполнения.', 'min_length' => 'Поле %s должно быть не короче %d символов.', 'max_length' => 'Поле %s должно быть не длиннее %d символов.', 'exact_length' => 'Поле %s должно быть длиной в %d символов.', 'in_array' => 'Поле %s должно содержать одно из перечисленных значений.', 'matches' => 'Поле %s должно совпадать с полем %s.', 'valid_url' => 'Поле %s должно содержать корректный URL.', 'valid_email' => 'Поле %s должно содержать корректный email.', 'valid_ip' => 'Поле %s должно содержать корректный IP-адрес.', 'valid_type' => 'Поле %s должно содержать только символы %s.', 'range' => 'Поле %s должно сожержать значение из заданных пределов.', 'regex' => 'Поле %s не является принимаемым значением.', 'depends_on' => 'Поле %s зависит от поля %s.', // Upload errors 'user_aborted' => 'Загрузка файла %s отменена пользователем.', 'invalid_type' => 'Загруженный файл, %s, не является файлом разрешённого типа.', 'max_size' => 'Загруженный файл, %s, слишком велик. Максимальный разрешённый размер файла: %s.', 'max_width' => 'Загруженный файл, %s, слишком велик. Максимальная разрешённая ширина: %s пикселей.', 'max_height' => 'Загруженный файл, %s, слишком велик. Максимальная разрешённая высота: %s пикселей.', 'min_width' => 'Загруженный файл, %s, слишком мал. Минимальная разрешённая ширина: %s пикселей.', 'min_height' => 'Загруженный файл, %s, слишком мал. Минимальная разрешённая высота: %s пикселей.', // Field types 'alpha' => 'буквенное', 'alpha_numeric' => 'буквенно-цифровое', 'alpha_dash' => 'буквенное, c дефисом и символом подчёркивания', 'digit' => 'цифровое', 'numeric' => 'числовое', ); pnp4nagios-0.6.16/lib/kohana/system/i18n/ru_RU/core.php0000664000000000000000000000501311662503006021173 0ustar rootroot 'Наличие более, чем одного экземпляра Kohana, в пределах одного запроса страницы, невозможно', 'uncaught_exception' => 'Не пойманное %s: %s в файле %s, на строке %s', 'invalid_method' => 'Вызов метода %s из файла %s невозможен', 'invalid_property' => 'Свойство %s не входит в состав класса %s.', 'log_dir_unwritable' => 'Директория для хранения журналов, %s, не доступна для записи', 'resource_not_found' => 'Запрошенный %s, %s, не найден', 'invalid_filetype' => 'Запрошенный тип файла, .%s, не разрешён конфигурацией видов', 'view_set_filename' => 'Необходимо задать файл вида перед вызовом render()', 'no_default_route' => 'Установите путь по умолчанию в файле config/routes.php.', 'no_controller' => 'Kohana не удалось найти контроллер для обработки этого запроса: %s', 'page_not_found' => 'Запрошенная страница, %s, не найдена.', 'stats_footer' => 'Загружено за {execution_time} секунд, используя {memory_usage} памяти. Сгенерировано Kohana v{kohana_version}.', 'error_file_line' => '%s [%s]:', 'stack_trace' => 'Стек вызовов', 'generic_error' => 'Не удалось обработать запрос', 'errors_disabled' => 'Вы можете вернуться на начальную страницу или повторить попытку.', // Drivers 'driver_implements' => 'Драйвер %s библиотеки %s не реализует интерфейс %s', 'driver_not_found' => 'Драйвер %s библиотеки %s не найден', // Resource names 'config' => 'конфигурация', 'controller' => 'контроллер', 'helper' => 'помощник', 'library' => 'библиотека', 'driver' => 'драйвер', 'model' => 'модель', 'view' => 'вид', ); pnp4nagios-0.6.16/lib/kohana/system/i18n/ru_RU/upload.php0000664000000000000000000000435111662503006021533 0ustar rootroot 'POST-переменная %s не найдена.', 'file_exceeds_limit' => 'Размер закачанного файла превышает максимальный разрешённый конфигурацией PHP', 'file_partial' => 'Файл закачан не полностью', 'no_file_selected' => 'Вы не выбрали файл для закачивания', 'invalid_filetype' => 'Тип файла, который вы пытаетесь закачать, не разрешён.', 'invalid_filesize' => 'Размер файла, который вы пытаетесь закачать, превышает максимальный разрешённый (%s)', 'invalid_dimensions' => 'Разрешение картинки, которую вы пытаетесь закачать, превышает максимальное разрешённое (%s)', 'destination_error' => 'Не удалось переместить закачанный файл в пункт назначения.', 'no_filepath' => 'Путь для закачивания некорректен.', 'no_file_types' => 'Вы не разрешили ни один тип файлов.', 'bad_filename' => 'Файл с таким именем уже существует на сервере.', 'not_writable' => 'Запись в целевой каталог, %s, не возможна.', 'error_on_file' => 'Ошибка при закачивании %s:', // Error code responses 'set_allowed' => 'В целях безопасности, установите разрешённые для закачивания типы файлов.', 'max_file_size' => 'В целях безопасности, не используйте MAX_FILE_SIZE для ограничения размера закачиваемых файлов.', 'no_tmp_dir' => 'Временная директория для закачивания файлов не найдена.', 'tmp_unwritable' => 'Нет прав записи во временную директорию для закачивания файлов, %s.' ); pnp4nagios-0.6.16/lib/kohana/system/i18n/ru_RU/encrypt.php0000664000000000000000000000110611662503006021726 0ustar rootroot 'Группа %s не определена вашей конфигурацией.', 'requires_mcrypt' => 'Для использования библиотеки Encrypt необходимо включить расширение "mcrypt" в конфигурации PHP.', 'no_encryption_key' => 'Для использования библиотеки Encrypt необходимо задать ключ шифрования в конфигурационном файле.' ); pnp4nagios-0.6.16/lib/kohana/system/i18n/ru_RU/profiler.php0000664000000000000000000000107611662503006022072 0ustar rootroot 'Производительность', 'post_data' => 'Данные POST', 'no_post' => 'Нет данных POST', 'session_data' => 'Данные сессии', 'no_session' => 'Нет данных сессии', 'queries' => 'Запросов к БД', 'no_queries' => 'Нет запросов к БД', 'no_database' => 'БД не загружена', 'cookie_data' => 'Данные cookie', 'no_cookie' => 'Нет данных cookie', ); pnp4nagios-0.6.16/lib/kohana/system/i18n/ru_RU/calendar.php0000664000000000000000000000270311662503006022017 0ustar rootroot 'Пн', 'tu' => 'Вт', 'we' => 'Ср', 'th' => 'Чт', 'fr' => 'Пт', 'sa' => 'Сб', 'su' => 'Вс', // Short day names 'mon' => 'Пнд', 'tue' => 'Втр', 'wed' => 'Срд', 'thu' => 'Чтв', 'fri' => 'Птн', 'sat' => 'Сбт', 'sun' => 'Вск', // Long day names 'monday' => 'Понедельник', 'tuesday' => 'Вторник', 'wednesday' => 'Среда', 'thursday' => 'Четверг', 'friday' => 'Пятница', 'saturday' => 'Суббота', 'sunday' => 'Воскресенье', // Short month names 'jan' => 'Янв', 'feb' => 'Фев', 'mar' => 'Мар', 'apr' => 'Апр', 'may' => 'Май', 'jun' => 'Июн', 'jul' => 'Июл', 'aug' => 'Авг', 'sep' => 'Сен', 'oct' => 'Окт', 'nov' => 'Ноя', 'dec' => 'Дек', // Long month names 'january' => 'Январь', 'february' => 'Февраль', 'march' => 'Март', 'april' => 'Апрель', 'mayl' => 'Май', 'june' => 'Июнь', 'july' => 'Июль', 'august' => 'Август', 'september' => 'Сентябрь', 'october' => 'Октябрь', 'november' => 'Ноябрь', 'december' => 'Декабрь' ); pnp4nagios-0.6.16/lib/kohana/system/i18n/ru_RU/event.php0000664000000000000000000000102511662503006021363 0ustar rootroot 'Попытка привязать некорректный субъект %s к %s не удалась: Субъект должен быть наследником класса Event_Subject', 'invalid_observer' => 'Попытка привязать некорректный наблюдатель %s к %s не удалась: Наблюдатель должен быть наследником класса Event_Observer', ); pnp4nagios-0.6.16/lib/kohana/system/i18n/ru_RU/image.php0000664000000000000000000000334511662503006021333 0ustar rootroot 'Библиотеке Image необходима функция getimagesize(), недоступная в вашей инсталляции PHP.', 'unsupported_method' => 'Указанный драйвер не поддерживает операцию %s.', 'file_not_found' => 'Заданное изображение, %s, не найдено. Удостоверьтесь в наличии изображения функцией file_exists() перед его обработкой.', 'type_not_allowed' => 'Заданное изображение, %s, не является разрешённым типом изображений.', 'invalid_width' => 'Заданная ширина, %s, некорректна.', 'invalid_height' => 'Заданная высота, %s, некорректна.', 'invalid_dimensions' => 'Заданный размер для %s некорректен.', 'invalid_master' => 'Заданная основная сторона некорректна.', 'invalid_flip' => 'Направление разворота некорректно.', 'directory_unwritable' => 'Заданная директория, %s, недоступна для записи.', // ImageMagick specific messages 'imagemagick' => array ( 'not_found' => 'Директория ImageMagick не содержит запрошенную программу, %s.', ), // GD specific messages 'gd' => array ( 'requires_v2' => 'Библиотеке Image необходимо расширение GD2. Подробности на http://php.net/gd_info .', ), ); pnp4nagios-0.6.16/lib/kohana/system/i18n/ru_RU/captcha.php0000664000000000000000000000274311662503006021655 0ustar rootroot 'Файл "%s" не найден. Убедитесь в наличии файлов функцией file_exists() перед их использованием.', 'requires_GD2' => 'Библиотека Captcha нуждается в расширении GD2 с поддержкой FreeType. Подробности на http://php.net/gd_info .', // Words of varying length for the Captcha_Word_Driver to pick from // Note: use only alphanumeric characters 'words' => array ( 'cd', 'tv', 'it', 'to', 'be', 'or', 'sun', 'car', 'dog', 'bed', 'kid', 'egg', 'bike', 'tree', 'bath', 'roof', 'road', 'hair', 'hello', 'world', 'earth', 'beard', 'chess', 'water', 'barber', 'bakery', 'banana', 'market', 'purple', 'writer', 'america', 'release', 'playing', 'working', 'foreign', 'general', 'aircraft', 'computer', 'laughter', 'alphabet', 'kangaroo', 'spelling', 'architect', 'president', 'cockroach', 'encounter', 'terrorism', 'cylinders', ), // Riddles for the Captcha_Riddle_Driver to pick from // Note: use only alphanumeric characters 'riddles' => array ( array('Do you hate spam? (yes or no)', 'yes'), array('Are you a robot? (yes or no)', 'no'), array('Fire is... (hot or cold)', 'hot'), array('The season after fall is...', 'winter'), array('Which day of the week is it today?', strftime('%A')), array('Which month of the year are we in?', strftime('%B')), ), ); pnp4nagios-0.6.16/lib/kohana/system/i18n/ru_RU/cache.php0000664000000000000000000000130211662503006021303 0ustar rootroot 'Группа "%s" не определена Вашей конфигурацией.', 'extension_not_loaded' => 'Расширение PHP "%s" должно быть загружено для использования этого драйвера.', 'unwritable' => 'Целевая директория хранения кеша, %s, не доступна для записи.', 'resources' => 'Кеширование ресурсов невозможно, так как ресурсы не могут быть сериализованы.', 'driver_error' => '%s', ); pnp4nagios-0.6.16/lib/kohana/system/i18n/ru_RU/pagination.php0000664000000000000000000000100011662503006022364 0ustar rootroot 'Группа %s не определена конфигурацией нумератора страниц.', 'page' => 'страница', 'pages' => 'страницы', 'item' => 'пункт', 'items' => 'пунктов', 'of' => 'из', 'first' => 'первая', 'last' => 'последняя', 'previous' => 'предыдущая', 'next' => 'следующая', ); pnp4nagios-0.6.16/lib/kohana/system/i18n/ru_RU/swift.php0000664000000000000000000000023311662503006021376 0ustar rootroot 'Отправка письма не удалась.' ); pnp4nagios-0.6.16/lib/kohana/system/i18n/ru_RU/orm.php0000664000000000000000000000030611662503006021040 0ustar rootroot 'Группа %s не определена Вашей конфигурацией.', 'error' => 'Ошибка SQL: %s', 'connection' => 'Не удалось подключиться к базе данных: %s', 'invalid_dsn' => 'Переданный DSN некорректен: %s', 'must_use_set' => 'Необходимо использовать оператор SET в этом запросе.', 'must_use_where' => 'Необходимо использовать оператор WHERE в этом запросе.', 'must_use_table' => 'Необходимо указать таблицу базы данных в этом запросе.', 'table_not_found' => 'Таблица %s не существует в Вашей базе данных.', 'not_implemented' => 'Запрошенный метод, %s, не поддерживается этим драйвером.', 'result_read_only' => 'Результат запроса доступен только для чтения.' ); pnp4nagios-0.6.16/lib/kohana/system/i18n/ru_RU/errors.php0000664000000000000000000000307511662503006021565 0ustar rootroot array( 1, 'Ошибка фреймворка', 'Информация об этой ошибке доступна в документации Kohana.'), E_PAGE_NOT_FOUND => array( 1, 'Page Not Found', 'Запрошенная страница не найдена. Возможно, она была перемещена, удалена, или архивирована.'), E_DATABASE_ERROR => array( 1, 'Database Error', 'При обработке запроса произошла ошибка в базе данных. Пожалуйста, уточните причину ошибки ниже'), E_RECOVERABLE_ERROR => array( 1, 'Recoverable Error', 'Обнаружена ошибка, препятствующая загрузке этой страницы. Если это повторится, пожалуйста, уведомите администрацию сайта.'), E_ERROR => array( 1, 'Фатальная ошибка', ''), E_USER_ERROR => array( 1, 'Фатальная ошибка', ''), E_PARSE => array( 1, 'Синтаксическая ошибка', ''), E_WARNING => array( 1, 'Предупреждение', ''), E_USER_WARNING => array( 1, 'Предупреждение', ''), E_STRICT => array( 2, 'Стилистическая ошибка', ''), E_NOTICE => array( 2, 'Уведомление', ''), ); pnp4nagios-0.6.16/lib/kohana/system/i18n/es_ES/0000775000000000000000000000000011662503006017475 5ustar rootrootpnp4nagios-0.6.16/lib/kohana/system/i18n/es_ES/session.php0000664000000000000000000000040511662503006021670 0ustar rootroot 'El parametro session_name, %s, no es valido. Solo debe contener caracteres alfanumericos y guiones bajos. Tambien al menos uno debe de ser una letra.', );pnp4nagios-0.6.16/lib/kohana/system/i18n/es_ES/validation.php0000664000000000000000000000467011662503006022347 0ustar rootroot 'La regla de validación usada es invalida: %s', 'i18n_array' => 'La clave %s i18n debe de ser un array para ser utilizado en la regla in_lang', 'not_callable' => 'La llamada de retorno %s utilizada para la validación no puede ser llamada', // General errors 'unknown_error' => 'Error de validación desconocido al comprobar el campo %s.', 'required' => 'El campo %s es obligatorio.', 'min_length' => 'El campo %s debe tener un mínimo de %d caracteres.', 'max_length' => 'El campo %s debe tener un máximo de %d caracteres.', 'exact_length' => 'El campo %s debe tener exactamente %d caracteres.', 'in_array' => 'El campo %s debe ser seleccionado de las opciones listadas.', 'matches' => 'El campo %s debe conincidir con el campo %s.', 'valid_url' => 'El campo %s debe contener una url valida, empezando con %s://.', 'valid_email' => 'El campo %s debe contener una dirección de email valida.', 'valid_ip' => 'El campo %s debe contener una dirección IP valida.', 'valid_type' => 'El campo %s debe contener unicamente %s.', 'range' => 'El campo %s debe estar entre los rangos especificados.', 'regex' => 'El campo %s no coincide con los datos aceptados.', 'depends_on' => 'El campo %s depende del campo %s.', // Upload errors 'user_aborted' => 'El envio del archivo %s fue abortado antes de completarse.', 'invalid_type' => 'El archivo %s no es un tipo de archivo permitido.', 'max_size' => 'El archivo %s que estas enviando es muy grande. El tamaño máximo es de %s.', 'max_width' => 'El archivo %s debe tener como ancho máximo %s, y tiene %spx.', 'max_height' => 'El archivo %s debe tener como alto máximo %s, y tiene %spx.', 'min_width' => 'El archivo %s que estas enviando es muy pequeño. El ancho mínimo permitido es de %spx.', 'min_height' => 'El archivo %s que estas enviando es muy pequeño. El alto mínimo permitido es de %spx.', // Field types 'alpha' => 'caracteres del alfabeto', 'alpha_numeric' => 'caracteres del alfabeto y numericos', 'alpha_dash' => 'caracteres del alfabeto, guiones y subrayado', 'digit' => 'digitos', 'numeric' => 'caracteres numéricos', );pnp4nagios-0.6.16/lib/kohana/system/i18n/es_ES/core.php0000664000000000000000000000351711662503006021144 0ustar rootroot 'Solo puede haber una instancia de Kohana por cada página.', 'uncaught_exception' => '%s no capturada: %s en el archivo %s, linea %s', 'invalid_method' => 'Método inválido %s llamado en %s.', 'invalid_property' => 'La propiedad %s no existe en la clase %s.', 'log_dir_unwritable' => 'Tu configuración del &8220;log.directory&8221; no apunta a un directorio con permiso de escritura.', 'resource_not_found' => 'El fichero de %s con nombre %s, no pudo ser encontrado.', 'invalid_filetype' => 'El tipo de fichero solicitado, .%s, no esta permitido en la configuración de tus vistas.', 'view_set_filename' => 'Tienes que definir el nombre de la vista antes de llamar al metodo render', 'no_default_route' => 'Por favor, especifica la ruta en config/routes.php.', 'no_controller' => 'Kohana no pudo determinar un controlador para procesar: %s', 'page_not_found' => 'La página que solicitase, %s, no se encuentra.', 'stats_footer' => 'Cargado en {execution_time} segundos, usando {memory_usage} de memoria. Generado con Kohana v{kohana_version}.', 'error_file_line' => '%s [%s]:', 'stack_trace' => 'Stack Trace', 'generic_error' => 'Imposible completar la solicitud', 'errors_disabled' => 'Puedes volver a la página de inico o volver a intentarlo.', // Drivers 'driver_implements' => 'El driver %s para la libreria %s debe implementar el interface %s', 'driver_not_found' => 'No se ha encontrado el driver %s para la libreria %s', // Resource names 'config' => 'fichero de configuración', 'controller' => 'controlador', 'helper' => 'helper', 'library' => 'librería', 'driver' => 'driver', 'model' => 'modelo', 'view' => 'vista', ); pnp4nagios-0.6.16/lib/kohana/system/i18n/es_ES/upload.php0000664000000000000000000000024711662503006021475 0ustar rootroot 'El directorio seleccionado, %s, no tiene permisos de escritura.', );pnp4nagios-0.6.16/lib/kohana/system/i18n/es_ES/encrypt.php0000664000000000000000000000063111662503006021672 0ustar rootroot 'El grupo %s no esta definidp en la configuración.', 'requires_mcrypt' => 'Para usar la librería de Encriptación, mcrypt debe estar habilitado.', 'no_encryption_key' => 'Para usar la librería de Encriptación, tienes que especificar una llave de encriptación en tu archivo de configuración.', ); pnp4nagios-0.6.16/lib/kohana/system/i18n/es_ES/profiler.php0000664000000000000000000000104611662503006022031 0ustar rootroot 'Benchmarks', 'post_data' => 'Datos Posteados', 'no_post' => 'No hay datos posteados', 'session_data' => 'Datos de sesión', 'no_session' => 'No hay datos de sesión', 'queries' => 'Consultas a la base de datos', 'no_queries' => 'No hay consultas a la base de datos', 'no_database' => 'No se encuentra la base de datos', 'cookie_data' => 'Datos de la cookie', 'no_cookie' => 'No se encuentran los datos de la cookie', ); pnp4nagios-0.6.16/lib/kohana/system/i18n/es_ES/calendar.php0000664000000000000000000000237711662503006021770 0ustar rootroot 'Do', 'mo' => 'Lu', 'tu' => 'Ma', 'we' => 'Mi', 'th' => 'Ju', 'fr' => 'Vi', 'sa' => 'Sa', // Short day names 'sun' => 'Dom', 'mon' => 'Lun', 'tue' => 'Mar', 'wed' => 'Mie', 'thu' => 'Jue', 'fri' => 'Vie', 'sat' => 'Sab', // Long day names 'sunday' => 'Domingo', 'monday' => 'Lunes', 'tuesday' => 'Martes', 'wednesday' => 'Miércoles', 'thursday' => 'Jueves', 'friday' => 'Viernes', 'saturday' => 'Sábado', // Short month names 'jan' => 'Ene', 'feb' => 'Feb', 'mar' => 'Mar', 'apr' => 'Abr', 'may' => 'May', 'jun' => 'Jun', 'jul' => 'Jul', 'aug' => 'Ago', 'sep' => 'Sep', 'oct' => 'Oct', 'nov' => 'Nov', 'dec' => 'Dic', // Long month names 'january' => 'Enero', 'february' => 'Febrero', 'march' => 'Marzo', 'april' => 'Abril', 'mayl' => 'Mayo', 'june' => 'Junio', 'july' => 'Julio', 'august' => 'Agosto', 'september' => 'Septiembre', 'october' => 'Octubre', 'november' => 'Noviembre', 'december' => 'Diciembre', );pnp4nagios-0.6.16/lib/kohana/system/i18n/es_ES/event.php0000664000000000000000000000052311662503006021327 0ustar rootroot 'Fallo el intento de añadir el sujeto %s a %s. Los sujetos deben extender la clase Event_Subject.', 'invalid_observer' => 'Fallo el intento de añadir el observador %s a %s. Los observadores deben extender la clase Event_Observer.', ); pnp4nagios-0.6.16/lib/kohana/system/i18n/es_ES/image.php0000664000000000000000000000311711662503006021272 0ustar rootroot 'La librería &8220;Image&8221; requiere la función PHP getimagesize, que no parece estar disponible en tu instalación.', 'unsupported_method' => 'El driver que has elegido en la configuración no soporta el tipo de transformación %s.', 'file_not_found' => 'La imagen especificada, %s no se ha encontrado. Por favor, verifica que existe utilizando file_exists() antes de manipularla.', 'type_not_allowed' => 'El tipo de imagen especificado, %s, no es un tipo de imagen permitido.', 'invalid_width' => 'El ancho que has especificado, %s, no es valido.', 'invalid_height' => 'El alto que has especificado, %s, no es valido.', 'invalid_dimensions' => 'Las dimensiones que has especificado para %s no son validas.', 'invalid_master' => 'The master dim specified is not valid.', 'invalid_flip' => 'La dirección de rotación especificada no es valida.', 'directory_unwritable' => 'El directorio especificado, %s, no tiene permisos de escritura.', // ImageMagick specific messages 'imagemagick' => array ( 'not_found' => 'El directorio de ImageMagick especificado, no contiene el programa requerido, %s.', ), // GraphicsMagick specific messages 'graphicsmagick' => array ( 'not_found' => 'El directorio de GraphicsMagick especificado, no contiene el programa requerido, %s.', ), // GD specific messages 'gd' => array ( 'requires_v2' => 'La librería &8220;Image&8221; requiere GD2. Por favor, lee http://php.net/gd_info para más información.', ), ); pnp4nagios-0.6.16/lib/kohana/system/i18n/es_ES/captcha.php0000664000000000000000000000270711662503006021617 0ustar rootroot 'El archivo especificado, %s, no ha sido encontrado. Por favor, verifica que el fichero existe utilizando file_exists() antes de intentar utilizarlo.', 'requires_GD2' => 'La libreria Captcha requiere GD2 con soporte FreeType. Lea lo siguiente http://php.net/gd_info para ampliar la informacion.', // Words of varying length for the Captcha_Word_Driver to pick from // Note: use only alphanumeric characters 'words' => array ( 'cd', 'tv', 'it', 'to', 'be', 'or', 'sun', 'car', 'dog', 'bed', 'kid', 'egg', 'bike', 'tree', 'bath', 'roof', 'road', 'hair', 'hello', 'world', 'earth', 'beard', 'chess', 'water', 'barber', 'bakery', 'banana', 'market', 'purple', 'writer', 'america', 'release', 'playing', 'working', 'foreign', 'general', 'aircraft', 'computer', 'laughter', 'alphabet', 'kangaroo', 'spelling', 'architect', 'president', 'cockroach', 'encounter', 'terrorism', 'cylinders', ), // Riddles for the Captcha_Riddle_Driver to pick from // Note: use only alphanumeric characters 'riddles' => array ( array('¿Odias el spam? (si o no)', 'si'), array('¿Eres un robot? (si o no)', 'no'), array('El fuego es... (caliente o frio)', 'caliente'), array('La estación que viene despues del otoño es...', 'invierno'), array('¿Qué día de la semana es hoy?', strftime('%A')), array('¿En qué mes del año estamos?', strftime('%B')), ), ); pnp4nagios-0.6.16/lib/kohana/system/i18n/es_ES/cache.php0000664000000000000000000000077311662503006021260 0ustar rootroot 'El grupo %s no esta definido en la configuracion.', 'extension_not_loaded' => 'La extensión PHP %s tiene que estar cargada para poder utilizar este driver.', 'unwritable' => 'El directorio seleccionado, %s, no tiene permisos de escritura.', 'resources' => 'No es posible guardar el contenido en la cache, el contenido no es serializable.', 'driver_error' => '%s', );pnp4nagios-0.6.16/lib/kohana/system/i18n/es_ES/pagination.php0000664000000000000000000000063311662503006022341 0ustar rootroot 'El grupo %s no esta definido en la configuracion de la paginacion.', 'page' => 'página', 'pages' => 'páginas', 'item' => 'elemento', 'items' => 'elementos', 'of' => 'de', 'first' => 'primero', 'last' => 'último', 'previous' => 'anterior', 'next' => 'siguiente', ); pnp4nagios-0.6.16/lib/kohana/system/i18n/es_ES/swift.php0000664000000000000000000000026011662503006021340 0ustar rootroot 'Ocurrió un error mientras se realizaba el envio del mensaje de correo.', );pnp4nagios-0.6.16/lib/kohana/system/i18n/es_ES/orm.php0000664000000000000000000000024111662503006021000 0ustar rootroot 'El grupo %s no esta definido en tu configuración.', 'error' => 'Ocurrió un error de SQL: %s', 'connection' => 'Ocurrió un error conectando a la base de datos: %s', 'invalid_dsn' => 'El DSN que pusiste no es válido: %s', 'must_use_set' => 'Necesitas una clausula SET para tu consulta.', 'must_use_where' => 'Necesitas una clausula WHERE para tu consulta.', 'must_use_table' => 'Necesitas especificar la tabla para tu consulta.', 'table_not_found' => 'La tabla %s no existe en tu base de datos.', 'not_implemented' => 'El método requerido, %s, no esta soportado por este driver.', 'result_read_only' => 'Los resultados del query son de solo lectura.' );pnp4nagios-0.6.16/lib/kohana/system/i18n/es_ES/errors.php0000664000000000000000000000224111662503006021521 0ustar rootroot array( 1, 'Error del Framework', 'Revisa la documentación de Kohana para información sobre el siguiente error.'), E_PAGE_NOT_FOUND => array( 1, 'No se encuentra la página', 'No se encontró la página solicitada. Puede ser que haya sido movida, borrada o archivada.'), E_DATABASE_ERROR => array( 1, 'Error de Base de Datos', 'Ocurrió un error en la base de datos mientras se ejecutaba el procedimiento requerido. Para más información, revisa el error que aparece más abajo.'), E_RECOVERABLE_ERROR => array( 1, 'Error Recuperable', 'Se detectó un error que evitó que esta página cargara. Si el problema persiste, contacta con el administrador de la web.'), E_ERROR => array( 1, 'Error Fatal', ''), E_USER_ERROR => array( 1, 'Error Fatal', ''), E_PARSE => array( 1, 'Error de Syntaxis', ''), E_WARNING => array( 1, 'Advertencia', ''), E_USER_WARNING => array( 1, 'Advertencia', ''), E_STRICT => array( 2, 'Strict Mode Error', ''), E_NOTICE => array( 2, 'Runtime Message', ''), );pnp4nagios-0.6.16/lib/kohana/system/i18n/en_US/0000775000000000000000000000000011662503006017510 5ustar rootrootpnp4nagios-0.6.16/lib/kohana/system/i18n/en_US/session.php0000664000000000000000000000037111662503006021705 0ustar rootroot 'The session_name, %s, is invalid. It must contain only alphanumeric characters and underscores. Also at least one letter must be present.', );pnp4nagios-0.6.16/lib/kohana/system/i18n/en_US/validation.php0000664000000000000000000000412111662503006022351 0ustar rootroot 'Invalid validation rule used: %s', 'i18n_array' => 'The %s i18n key must be an array to be used with the in_lang rule', 'not_callable' => 'Callback %s used for Validation is not callable', // General errors 'unknown_error' => 'Unknown validation error while validating the %s field.', 'required' => 'The %s field is required.', 'min_length' => 'The %s field must be at least %d characters long.', 'max_length' => 'The %s field must be %d characters or fewer.', 'exact_length' => 'The %s field must be exactly %d characters.', 'in_array' => 'The %s field must be selected from the options listed.', 'matches' => 'The %s field must match the %s field.', 'valid_url' => 'The %s field must contain a valid URL.', 'valid_email' => 'The %s field must contain a valid email address.', 'valid_ip' => 'The %s field must contain a valid IP address.', 'valid_type' => 'The %s field must only contain %s characters.', 'range' => 'The %s field must be between specified ranges.', 'regex' => 'The %s field does not match accepted input.', 'depends_on' => 'The %s field depends on the %s field.', // Upload errors 'user_aborted' => 'The %s file was aborted during upload.', 'invalid_type' => 'The %s file is not an allowed file type.', 'max_size' => 'The %s file you uploaded was too large. The maximum size allowed is %s.', 'max_width' => 'The %s file you uploaded was too big. The maximum allowed width is %spx.', 'max_height' => 'The %s file you uploaded was too big. The maximum allowed height is %spx.', 'min_width' => 'The %s file you uploaded was too small. The minimum allowed width is %spx.', 'min_height' => 'The %s file you uploaded was too small. The minimum allowed height is %spx.', // Field types 'alpha' => 'alphabetical', 'alpha_numeric' => 'alphabetical and numeric', 'alpha_dash' => 'alphabetical, dash, and underscore', 'digit' => 'digit', 'numeric' => 'numeric', ); pnp4nagios-0.6.16/lib/kohana/system/i18n/en_US/core.php0000664000000000000000000000352511662503006021156 0ustar rootroot 'There can be only one instance of Kohana per page request', 'uncaught_exception' => 'Uncaught %s: %s in file %s on line %s', 'invalid_method' => 'Invalid method %s called in %s', 'invalid_property' => 'The %s property does not exist in the %s class.', 'log_dir_unwritable' => 'The log directory is not writable: %s', 'resource_not_found' => 'The requested %s, %s, could not be found', 'invalid_filetype' => 'The requested filetype, .%s, is not allowed in your view configuration file', 'view_set_filename' => 'You must set the the view filename before calling render', 'no_default_route' => 'Please set a default route in config/routes.php', 'no_controller' => 'Kohana was not able to determine a controller to process this request: %s', 'page_not_found' => 'The page you requested, %s, could not be found.', 'stats_footer' => 'Loaded in {execution_time} seconds, using {memory_usage} of memory. Generated by Kohana v{kohana_version}.', 'error_file_line' => '%s [%s]:', 'stack_trace' => 'Stack Trace', 'generic_error' => 'Unable to Complete Request', 'errors_disabled' => 'You can go to the home page or try again.', // Drivers 'driver_implements' => 'The %s driver for the %s library must implement the %s interface', 'driver_not_found' => 'The %s driver for the %s library could not be found', // Resource names 'config' => 'config file', 'controller' => 'controller', 'helper' => 'helper', 'library' => 'library', 'driver' => 'driver', 'model' => 'model', 'view' => 'view', ); pnp4nagios-0.6.16/lib/kohana/system/i18n/en_US/upload.php0000664000000000000000000000025211662503006021504 0ustar rootroot 'The upload destination folder, %s, does not appear to be writable.', );pnp4nagios-0.6.16/lib/kohana/system/i18n/en_US/encrypt.php0000664000000000000000000000056011662503006021706 0ustar rootroot 'The %s group is not defined in your configuration.', 'requires_mcrypt' => 'To use the Encrypt library, mcrypt must be enabled in your PHP installation', 'no_encryption_key' => 'To use the Encrypt library, you must set an encryption key in your config file' ); pnp4nagios-0.6.16/lib/kohana/system/i18n/en_US/profiler.php0000664000000000000000000000067011662503006022046 0ustar rootroot 'Benchmarks', 'post_data' => 'Post Data', 'no_post' => 'No post data', 'session_data' => 'Session Data', 'no_session' => 'No session data', 'queries' => 'Database Queries', 'no_queries' => 'No queries', 'no_database' => 'Database not loaded', 'cookie_data' => 'Cookie Data', 'no_cookie' => 'No cookie data', ); pnp4nagios-0.6.16/lib/kohana/system/i18n/en_US/calendar.php0000664000000000000000000000240111662503006021767 0ustar rootroot 'Su', 'mo' => 'Mo', 'tu' => 'Tu', 'we' => 'We', 'th' => 'Th', 'fr' => 'Fr', 'sa' => 'Sa', // Short day names 'sun' => 'Sun', 'mon' => 'Mon', 'tue' => 'Tue', 'wed' => 'Wed', 'thu' => 'Thu', 'fri' => 'Fri', 'sat' => 'Sat', // Long day names 'sunday' => 'Sunday', 'monday' => 'Monday', 'tuesday' => 'Tuesday', 'wednesday' => 'Wednesday', 'thursday' => 'Thursday', 'friday' => 'Friday', 'saturday' => 'Saturday', // Short month names 'jan' => 'Jan', 'feb' => 'Feb', 'mar' => 'Mar', 'apr' => 'Apr', 'may' => 'May', 'jun' => 'Jun', 'jul' => 'Jul', 'aug' => 'Aug', 'sep' => 'Sep', 'oct' => 'Oct', 'nov' => 'Nov', 'dec' => 'Dec', // Long month names 'january' => 'January', 'february' => 'February', 'march' => 'March', 'april' => 'April', 'mayl' => 'May', 'june' => 'June', 'july' => 'July', 'august' => 'August', 'september' => 'September', 'october' => 'October', 'november' => 'November', 'december' => 'December' );pnp4nagios-0.6.16/lib/kohana/system/i18n/en_US/event.php0000664000000000000000000000051111662503006021337 0ustar rootroot 'Attempt to attach invalid subject %s to %s failed: Subjects must extend the Event_Subject class', 'invalid_observer' => 'Attempt to attach invalid observer %s to %s failed: Observers must extend the Event_Observer class', ); pnp4nagios-0.6.16/lib/kohana/system/i18n/en_US/image.php0000664000000000000000000000276511662503006021315 0ustar rootroot 'The Image library requires the getimagesize() PHP function, which is not available in your installation.', 'unsupported_method' => 'Your configured driver does not support the %s image transformation.', 'file_not_found' => 'The specified image, %s, was not found. Please verify that images exist by using file_exists() before manipulating them.', 'type_not_allowed' => 'The specified image, %s, is not an allowed image type.', 'invalid_width' => 'The width you specified, %s, is not valid.', 'invalid_height' => 'The height you specified, %s, is not valid.', 'invalid_dimensions' => 'The dimensions specified for %s are not valid.', 'invalid_master' => 'The master dimension specified is not valid.', 'invalid_flip' => 'The flip direction specified is not valid.', 'directory_unwritable' => 'The specified directory, %s, is not writable.', // ImageMagick specific messages 'imagemagick' => array ( 'not_found' => 'The ImageMagick directory specified does not contain a required program, %s.', ), // GraphicsMagick specific messages 'graphicsmagick' => array ( 'not_found' => 'The GraphicsMagick directory specified does not contain a required program, %s.', ), // GD specific messages 'gd' => array ( 'requires_v2' => 'The Image library requires GD2. Please see http://php.net/gd_info for more information.', ), ); pnp4nagios-0.6.16/lib/kohana/system/i18n/en_US/captcha.php0000664000000000000000000000257611662503006021636 0ustar rootroot 'The specified file, %s, was not found. Please verify that files exist by using file_exists() before using them.', 'requires_GD2' => 'The Captcha library requires GD2 with FreeType support. Please see http://php.net/gd_info for more information.', // Words of varying length for the Captcha_Word_Driver to pick from // Note: use only alphanumeric characters 'words' => array ( 'cd', 'tv', 'it', 'to', 'be', 'or', 'sun', 'car', 'dog', 'bed', 'kid', 'egg', 'bike', 'tree', 'bath', 'roof', 'road', 'hair', 'hello', 'world', 'earth', 'beard', 'chess', 'water', 'barber', 'bakery', 'banana', 'market', 'purple', 'writer', 'america', 'release', 'playing', 'working', 'foreign', 'general', 'aircraft', 'computer', 'laughter', 'alphabet', 'kangaroo', 'spelling', 'architect', 'president', 'cockroach', 'encounter', 'terrorism', 'cylinders', ), // Riddles for the Captcha_Riddle_Driver to pick from // Note: use only alphanumeric characters 'riddles' => array ( array('Do you hate spam? (yes or no)', 'yes'), array('Are you a robot? (yes or no)', 'no'), array('Fire is... (hot or cold)', 'hot'), array('The season after fall is...', 'winter'), array('Which day of the week is it today?', strftime('%A')), array('Which month of the year are we in?', strftime('%B')), ), ); pnp4nagios-0.6.16/lib/kohana/system/i18n/en_US/cache.php0000664000000000000000000000072711662503006021272 0ustar rootroot 'The %s group is not defined in your configuration.', 'extension_not_loaded' => 'The %s PHP extension must be loaded to use this driver.', 'unwritable' => 'The configured storage location, %s, is not writable.', 'resources' => 'Caching of resources is impossible, because resources cannot be serialized.', 'driver_error' => '%s', );pnp4nagios-0.6.16/lib/kohana/system/i18n/en_US/pagination.php0000664000000000000000000000057511662503006022361 0ustar rootroot 'The %s group is not defined in your pagination configuration.', 'page' => 'page', 'pages' => 'pages', 'item' => 'item', 'items' => 'items', 'of' => 'of', 'first' => 'first', 'last' => 'last', 'previous' => 'previous', 'next' => 'next', ); pnp4nagios-0.6.16/lib/kohana/system/i18n/en_US/swift.php0000664000000000000000000000023211662503006021352 0ustar rootroot 'An error occurred while sending the email message.' );pnp4nagios-0.6.16/lib/kohana/system/i18n/en_US/orm.php0000664000000000000000000000021711662503006021016 0ustar rootroot 'The %s group is not defined in your configuration.', 'error' => 'There was an SQL error: %s', 'connection' => 'There was an error connecting to the database: %s', 'invalid_dsn' => 'The DSN you supplied is not valid: %s', 'must_use_set' => 'You must set a SET clause for your query.', 'must_use_where' => 'You must set a WHERE clause for your query.', 'must_use_table' => 'You must set a database table for your query.', 'table_not_found' => 'Table %s does not exist in your database.', 'not_implemented' => 'The method you called, %s, is not supported by this driver.', 'result_read_only' => 'Query results are read only.' );pnp4nagios-0.6.16/lib/kohana/system/i18n/en_US/errors.php0000664000000000000000000000172311662503006021540 0ustar rootroot array( 1, 'Framework Error', 'Please check the Kohana documentation for information about the following error.'), E_PAGE_NOT_FOUND => array( 1, 'Page Not Found', 'The requested page was not found. It may have moved, been deleted, or archived.'), E_DATABASE_ERROR => array( 1, 'Database Error', 'A database error occurred while performing the requested procedure. Please review the database error below for more information.'), E_ERROR => array( 1, 'Fatal Error', ''), E_USER_ERROR => array( 1, 'Fatal Error', ''), E_PARSE => array( 1, 'Syntax Error', ''), E_WARNING => array( 1, 'Warning Message', ''), E_USER_WARNING => array( 1, 'Warning Message', ''), E_STRICT => array( 2, 'Strict Mode Error', ''), E_NOTICE => array( 2, 'Runtime Message', ''), ); pnp4nagios-0.6.16/lib/kohana/system/i18n/it_IT/0000775000000000000000000000000011662503006017507 5ustar rootrootpnp4nagios-0.6.16/lib/kohana/system/i18n/it_IT/session.php0000664000000000000000000000040711662503006021704 0ustar rootroot 'Il parametro session_name, %s, non è valido. Può contenere solo caratteri alfanumerici o il trattino basso. Almeno una lettera deve essere presente.', ); pnp4nagios-0.6.16/lib/kohana/system/i18n/it_IT/validation.php0000664000000000000000000000433211662503006022354 0ustar rootroot 'Regola di validazione usata non valida: %s', 'i18n_array' => 'Il parametro i18n %s deve essere un array per essere utilizzato con la regola in_lang', 'not_callable' => 'La callback %s usata per la Validation non puo essere richiamata', // Errori generici 'unknown_error' => 'Errore sconosciuto durante la validazione del campo %s.', 'required' => 'Il campo %s è obbligatorio.', 'min_length' => 'Il campo %s deve essere lungo almeno %d caratteri.', 'max_length' => 'Il campo %s non deve superare i %d caratteri.', 'exact_length' => 'Il campo %s deve contenere esattamente %d caratteri.', 'in_array' => 'Il campo %s deve essere selezionato dalla lista delle opzioni.', 'matches' => 'Il campo %s deve coincidere con il campo %s.', 'valid_url' => 'Il campo %s deve contenere un URL valido.', 'valid_email' => 'Il campo %s deve contenere un indirizzo email valido.', 'valid_ip' => 'Il campo %s deve contenere un indirizzo IP valido.', 'valid_type' => 'Il campo %s deve contenere solo i caratteri %s.', 'range' => 'Il campo %s deve trovarsi negli intervalli specificati.', 'regex' => 'Il campo %s non coincide con i dati accettati.', 'depends_on' => 'Il campo %s dipende dal campo %s.', // Errori di upload 'user_aborted' => 'Il caricamento del file %s è stato interrotto.', 'invalid_type' => 'Il file %s non è un tipo di file permesso.', 'max_size' => 'Il file %s inviato è troppo grande. La dimensone massima consentita è %s.', 'max_width' => 'Il file %s inviato è troppo grande. La larghezza massima consentita è %spx.', 'max_height' => 'Il file %s inviato è troppo grande. L\'altezza massima consentita è %spx.', 'min_width' => 'Il file %s inviato è troppo piccolo. La larghezza minima consentita è %spx.', 'min_height' => 'Il file %s inviato è troppo piccolo. L\'altezza minima consentita è %spx.', // Tipi di valore dei campi 'alpha' => 'alfabetico', 'alpha_numeric' => 'alfanumerico', 'alpha_dash' => 'alfabetico, trattino e sottolineato', 'digit' => 'cifra', 'numeric' => 'numerico', ); pnp4nagios-0.6.16/lib/kohana/system/i18n/it_IT/core.php0000664000000000000000000000405611662503006021155 0ustar rootroot 'Ci può essere una sola istanza di Kohana per ogni pagina richiesta.', 'uncaught_exception' => 'Uncaught %s: %s in %s, linea %s', 'invalid_method' => 'Metodo non valido %s chiamato in %s.', 'invalid_property' => 'La proprietà %s non esiste nella classe %s.', 'log_dir_unwritable' => 'Il parametro di configurazione log.directory non punta ad una cartella con permesso di scrittura.', 'resource_not_found' => 'Il %s richiesto, %s, non è stato trovato.', 'invalid_filetype' => 'Il tipo di file richiesto, .%s, non è presente nel file di configurazione.', 'view_set_filename' => 'Bisogna definire il nome di una vista prima di chiamare il metodo render', 'no_default_route' => 'Non è stato definito il default route in config/routes.php.', 'no_controller' => 'Kohana non è in grado di determinare a quale controller inoltrare la richiesta: %s', 'page_not_found' => 'La pagina richiesta, %s, non è stata trovata.', 'stats_footer' => 'Caricato in {execution_time} secondi, usando {memory_usage} di memoria. Generato da Kohana v{kohana_version}.', 'error_file_line' => 'Errore in %s linea: %s.', 'stack_trace' => 'Tracciato', 'generic_error' => 'Impossibile completare la richiesta', 'errors_disabled' => 'Puoi andare alla pagina iniziale o ritentare.', // Drivers 'driver_implements' => 'Il driver %s per la libreria %s non implementa l\'interfaccia %s', 'driver_not_found' => 'Il driver %s per la libreria %s non è stato trovato', // Resource names 'config' => 'file di configurazione', 'controller' => 'controller', 'helper' => 'helper', 'library' => 'libreria', 'driver' => 'driver', 'model' => 'modello', 'view' => 'vista', ); pnp4nagios-0.6.16/lib/kohana/system/i18n/it_IT/upload.php0000664000000000000000000000027111662503006021504 0ustar rootroot 'La cartella di destinazione, %s, non sembra avere i permessi in scrittura.', ); pnp4nagios-0.6.16/lib/kohana/system/i18n/it_IT/encrypt.php0000664000000000000000000000057711662503006021715 0ustar rootroot 'Il gruppo %s non è definito nel file di configurazione.', 'requires_mcrypt' => 'L\'uso della libreria Encrypt richiede l\'abilitazione di mcrypt.', 'no_encryption_key' => 'Per usare la libreria Encrypt bisogna definire una chiave di codifica nel file di configurazione.' ); pnp4nagios-0.6.16/lib/kohana/system/i18n/it_IT/profiler.php0000664000000000000000000000101411662503006022036 0ustar rootroot 'Benchmarks', 'post_data' => 'Dati postati', 'no_post' => 'Non ci sono dati postati', 'session_data' => 'Dati di sessione', 'no_session' => 'Non ci sono dati di sessione', 'queries' => 'Query al database', 'no_queries' => 'Non ci sono query al database', 'no_database' => 'Database non caricato', 'cookie_data' => 'Dati del cookie', 'no_cookie' => 'I dati del cookie non sono stati trovati', ); pnp4nagios-0.6.16/lib/kohana/system/i18n/it_IT/calendar.php0000664000000000000000000000241611662503006021774 0ustar rootroot 'Do', 'mo' => 'Lu', 'tu' => 'Ma', 'we' => 'Me', 'th' => 'Gi', 'fr' => 'Ve', 'sa' => 'Sa', // Short day names 'sun' => 'Dom', 'mon' => 'Lun', 'tue' => 'Mar', 'wed' => 'Mer', 'thu' => 'Gio', 'fri' => 'Ven', 'sat' => 'Sab', // Long day names 'sunday' => 'Domenica', 'monday' => 'Lunedì', 'tuesday' => 'Martedì', 'wednesday' => 'Mercoledì', 'thursday' => 'Giovedì', 'friday' => 'Venerdì', 'saturday' => 'Sabato', // Short month names 'jan' => 'Gen', 'feb' => 'Feb', 'mar' => 'Mar', 'apr' => 'Apr', 'may' => 'Mag', 'jun' => 'Giu', 'jul' => 'Lug', 'aug' => 'Ago', 'sep' => 'Set', 'oct' => 'Ott', 'nov' => 'Nov', 'dec' => 'Dic', // Long month names 'january' => 'Gennaio', 'february' => 'Febbraio', 'march' => 'Marzo', 'april' => 'Aprile', 'mayl' => 'Maggio', 'june' => 'Giugno', 'july' => 'Luglio', 'august' => 'Agosto', 'september' => 'Settembre', 'october' => 'Ottobre', 'november' => 'Novembre', 'december' => 'Dicembre' );pnp4nagios-0.6.16/lib/kohana/system/i18n/it_IT/event.php0000664000000000000000000000063111662503006021341 0ustar rootroot 'Fallito il tentativo di aggiungere il soggetto %s a %s. I soggetti devono estendere la classe Event_Subject.', 'invalid_observer' => 'Fallito il tentativo di aggiungere l\'observer %s a %s. Gli observer devono estendere la classe Event_Observer.', ); pnp4nagios-0.6.16/lib/kohana/system/i18n/it_IT/image.php0000664000000000000000000000310011662503006021274 0ustar rootroot 'La libreria Image richiede la funzione PHP getimagesize, che non è disponibile nella tua intallazione.', 'unsupported_method' => 'Il driver impostato in configurazione non supporta il tipo di trasformazione %s.', 'file_not_found' => 'L\'immagine specificata, %s, non è stata trovata. Verificarne l\'esistenza con file_exists prima di manipolarla.', 'type_not_allowed' => 'Il tipo d\'immagine specificato, %s, non è permesso.', 'invalid_width' => 'La larghezza specificata, %s, non è valida.', 'invalid_height' => 'L\'altezza specificata, %s, non è valida.', 'invalid_dimensions' => 'Le dimensioni specificate per %s non sono valide.', 'invalid_master' => 'Master dimension specificato non valido.', 'invalid_flip' => 'La direzione di rotazione specificata non è valida.', 'directory_unwritable' => 'La directory specificata, %s, non consente la scrittura.', // Messaggi specifici per ImageMagick 'imagemagick' => array ( 'not_found' => 'La cartella di ImageMagick specificata non contiene il programma richiesto, %s.', ), // Messaggi specifici per GraphicsMagick 'graphicsmagick' => array ( 'not_found' => 'La cartella di GraphicsMagick specificata non contiene il programma richiesto, %s.', ), // Messaggi specifici per GD 'gd' => array ( 'requires_v2' => 'La libreria Image richiede GD2. Leggere http://php.net/gd_info per maggiori informazioni.', ), ); pnp4nagios-0.6.16/lib/kohana/system/i18n/it_IT/captcha.php0000664000000000000000000000262011662503006021623 0ustar rootroot 'Il file specificato, %s, non è stato trovato. Verificarne l\'esistenza con file_exists prima di usarlo.', 'requires_GD2' => 'La libreria Captcha richiede GD2 con supporto FreeType. Leggere http://php.net/gd_info per maggiori informazioni.', // Words of varying length for the Captcha_Word_Driver to pick from // Note: use only alphanumeric characters 'words' => array ( 'cd', 'tv', 'it', 'to', 'be', 'or', 'sun', 'car', 'dog', 'bed', 'kid', 'egg', 'bike', 'tree', 'bath', 'roof', 'road', 'hair', 'hello', 'world', 'earth', 'beard', 'chess', 'water', 'barber', 'bakery', 'banana', 'market', 'purple', 'writer', 'america', 'release', 'playing', 'working', 'foreign', 'general', 'aircraft', 'computer', 'laughter', 'alphabet', 'kangaroo', 'spelling', 'architect', 'president', 'cockroach', 'encounter', 'terrorism', 'cylinders', ), // Riddles for the Captcha_Riddle_Driver to pick from // Note: use only alphanumeric characters 'riddles' => array ( array('Detesti lo spam? (si o no)', 'si'), array('Sei un robot? (si o no)', 'no'), array('Il fuoco è... (caldo o freddo)', 'caldo'), array('La stagione che viene dopo l\'autunno è...', 'inverno'), array('Che giorno della settimana è oggi?', strftime('%A')), array('In quale mese dell\'anno siamo?', strftime('%B')), ), ); pnp4nagios-0.6.16/lib/kohana/system/i18n/it_IT/cache.php0000664000000000000000000000075111662503006021266 0ustar rootroot 'Il gruppo %s non è stato definito in configurazione.', 'extension_not_loaded' => 'L\'estensione di PHP %s deve essere caricata per poter usare questo driver.', 'unwritable' => 'La cartella di deposito, %s, non ha i permessi in scrittura.', 'resources' => 'Risorsa non serializzabile. Impossibile immagazzinare.', 'driver_error' => '%s', );pnp4nagios-0.6.16/lib/kohana/system/i18n/it_IT/pagination.php0000664000000000000000000000074411662503006022356 0ustar rootroot 'Il gruppo %s non è stato definito nel file di configurazione per la paginazione.', 'page' => 'pagina', 'pages' => 'pagine', 'item' => 'elemento', 'items' => 'elementi', 'of' => 'di', 'first' => 'primo', 'last' => 'ultimo', 'previous' => 'precedente', 'next' => 'successivo', ); pnp4nagios-0.6.16/lib/kohana/system/i18n/it_IT/swift.php0000664000000000000000000000026711662503006021361 0ustar rootroot 'Si è verificato un errore durante l\'invio del messaggio di posta elettronica.' );pnp4nagios-0.6.16/lib/kohana/system/i18n/it_IT/orm.php0000664000000000000000000000024211662503006021013 0ustar rootroot 'Il gruppo %s non è stato definito nel file di configurazione.', 'error' => 'Si è verificato un errore SQL: %s', 'connection' => 'Si è verificato un errore durante la connessione al database: %s', 'invalid_dsn' => 'Il DSN fornito non è valido: %s', 'must_use_set' => 'È necessario definire una clausola SET per la query.', 'must_use_where' => 'È necessario definire una clausola WHERE per la query.', 'must_use_table' => 'È necessario definire una tabella per la query.', 'table_not_found' => 'La tabella %s non esiste nella base di dati.', 'not_implemented' => 'Il metodo chiamato, %s, non è supportato da questo driver.', 'result_read_only' => 'Il risultato della query è in sola lettura.', );pnp4nagios-0.6.16/lib/kohana/system/i18n/it_IT/errors.php0000664000000000000000000000227711662503006021544 0ustar rootroot array( 1, 'Errore del Framework', 'Controlla la documentazione di Kohana per informazioni circa il seguente errore.'), E_PAGE_NOT_FOUND => array( 1, 'Pagina non trovata', 'La pagina richiesta non è stata trovata. Potrebbe essere stata spostata, rimossa o archiviata.'), E_DATABASE_ERROR => array( 1, 'Errore del Database', 'Si è verificato un errore durante l\'esecuzione della procedura richiesta. Per maggiori informazioni fare riferimento al messaggio sottostante.'), E_RECOVERABLE_ERROR => array( 1, 'Errore Recuperabile', 'Un errore ha impedito il caricamento della pagina. Se l\'errore persiste contattare l\'amministratore del sito.'), E_ERROR => array( 1, 'Errore Fatale', ''), E_USER_ERROR => array( 1, 'Errore Fatale', ''), E_PARSE => array( 1, 'Errore di Sintassi', ''), E_WARNING => array( 1, 'Avviso', ''), E_USER_WARNING => array( 1, 'Avviso', ''), E_STRICT => array( 2, 'Strict Mode Error', ''), E_NOTICE => array( 2, 'Runtime Message', ''), );pnp4nagios-0.6.16/lib/kohana/system/i18n/fr_FR/0000775000000000000000000000000011662503006017475 5ustar rootrootpnp4nagios-0.6.16/lib/kohana/system/i18n/fr_FR/session.php0000664000000000000000000000041611662503006021672 0ustar rootroot 'Le nom de session "session_name", %s, est invalide. Il doit contenir uniquement des caractères alphanumériques et au moins une lettre doit être présente.', ); pnp4nagios-0.6.16/lib/kohana/system/i18n/fr_FR/validation.php0000664000000000000000000000471111662503006022343 0ustar rootroot 'La règle de validation %s utilisée est invalide', 'i18n_array' => 'La clé i18n %s doit être un tableau pour pouvoir être utilisée avec la règle in_lang', 'not_callable' => 'La callback %s utilisé pour la Validation n\'est pas appellable', // General errors 'unknown_error' => 'Erreur de validation inconnue lors de la validation du champ %s.', 'required' => 'Le champ %s est requis.', 'min_length' => 'Le champ %s doit contenir au minimum %d caractères.', 'max_length' => 'Le champ %s ne peut contenir plus de %d caractères.', 'exact_length' => 'Le champ %s doit contenir exactement %d caractères.', 'in_array' => 'Le champ %s doit être sélectionné dans parmi les options listées.', 'matches' => 'Le champ %s doit correspondre au champ %s.', 'valid_url' => 'Le champ %s doit contenir une URL valide.', 'valid_email' => 'Le champ %s doit contenir une adresse email valide.', 'valid_ip' => 'Le champ %s doit contenir une adresse IP valide.', 'valid_type' => 'Le champ %s doit contenir uniquement %s caractères', 'range' => 'Le champ %s doit être situé dans la plage de valeurs spécifiée.', 'regex' => 'Le champ %s ne correspond pas aux valeurs acceptées.', 'depends_on' => 'Le champ %s est dépendant du champ %s.', // Upload errors 'user_aborted' => 'L\'envoi du fichier %s sur le serveur a échoué.', 'invalid_type' => 'Le type du fichier %s n\'est pas autorisé.', 'max_size' => 'La taille du fichier %s que vous tentez d\'envoyer est trop volumineuse. La taille maximale autorisée est de %s', 'max_width' => 'La largeur de l\'image %s que vous envoyez est trop grande. La largeur maximale autorisée est de %spx', 'max_height' => 'La hauteur de l\'image %s que vous envoyez est trop grande. La hauteur maximale autorisée est de %spx', 'min_width' => 'La largeur de l\'image %s que vous envoyez n\'est pas assez grande. La largeur minimale demandée est de %spx', 'min_height' => 'La hauteur de l\'image %s que vous envoyez n\'est pas assez grande. La hauteur minimale demandée est de %spx', // Field types 'alpha' => 'alphabétiques', 'alpha_numeric' => 'alphabétiques et numériques', 'alpha_dash' => 'alphabétiques, tirets haut ou tirets bas (underscore)', 'digit' => 'digitaux', 'numeric' => 'numériques', );pnp4nagios-0.6.16/lib/kohana/system/i18n/fr_FR/core.php0000664000000000000000000000421011662503006021133 0ustar rootroot 'Il ne peut y avoir qu\'une instance de Kohana par page.', 'uncaught_exception' => 'Uncaught %s: %s dans le fichier %s à la ligne %s', 'invalid_method' => 'La méthode %s appelée dans %s est invalide.', 'invalid_property' => 'La propriété %s n\'existe pas dans la classe %s.', 'log_dir_unwritable' => 'Le répertoire spécifié dans votre fichier de configuration pour le fichier de log ne pointe pas vers un répertoire accessible en écriture.', 'resource_not_found' => 'La ressource %s, %s, n\'a pas été trouvée.', 'invalid_filetype' => 'Le type de ficher demandé, .%s, n\'est pas autorisé dans le fichier de configuration des vues (view configuration file).', 'view_set_filename' => 'Vous devez renseigner le nom de la vue avant d\'appeller la méthode render', 'no_default_route' => 'Aucune route par défaut n\a été définie. Veuillez la spécifer dans le fichier config/routes.php.', 'no_controller' => 'Kohana n\'a pu déterminer aucun controlleur pour effectuer la requête: %s.', 'page_not_found' => 'La page demandée %s n\'a pu être trouvée.', 'stats_footer' => 'Chargé en {execution_time} secondes, {memory_usage} de mémoire utilisée. Généré par Kohana v{kohana_version}.', 'error_file_line' => '%s [%s]:', 'stack_trace' => 'Stack Trace', 'generic_error' => 'Impossible de terminer la requête.', 'errors_disabled' => 'Vous pouvez aller sur la page d\'accueil ou essayer encore.', // Drivers 'driver_implements' => 'Le driver %s de la librairie %s doit implémenter l\'interface %s.', 'driver_not_found' => 'Le driver %s de la librairie %s est introuvable.', // Resource names 'config' => 'fichier de configuration', 'controller' => 'contrôleur', 'helper' => 'helper', 'library' => 'librairie', 'driver' => 'driver', 'model' => 'modèle', 'view' => 'vue', ); pnp4nagios-0.6.16/lib/kohana/system/i18n/fr_FR/upload.php0000664000000000000000000000031211662503006021466 0ustar rootroot 'Le répertoire de destination pour l\'upload, %s, ne semble pas être accessible en écriture.', ); pnp4nagios-0.6.16/lib/kohana/system/i18n/fr_FR/encrypt.php0000664000000000000000000000076411662503006021701 0ustar rootroot 'Le groupe %s n\'est pas défini dans votre configuration.', 'requires_mcrypt' => 'Afin de pouvoir utiliser la librairie de chiffrement (Encrypt library), mcrypt doit être activé dans votre installation PHP.', 'no_encryption_key' => 'Afin de pouvoir utiliser la librairie de chiffrement (Encrypt library), vous devez définir une clé de chiffrement dans votre fichier de configuration.' ); pnp4nagios-0.6.16/lib/kohana/system/i18n/fr_FR/profiler.php0000664000000000000000000000075411662503006022036 0ustar rootroot 'Benchmarks', 'post_data' => 'Données POST', 'no_post' => 'Aucune donnée POST', 'session_data' => 'Données de session', 'no_session' => 'Aucune donnée de session', 'queries' => 'Requêtes', 'no_queries' => 'Aucune requête', 'no_database' => 'Base de données non chargée', 'cookie_data' => 'Données du Cookie', 'no_cookie' => 'Aucune donnée de Cookie', );pnp4nagios-0.6.16/lib/kohana/system/i18n/fr_FR/calendar.php0000664000000000000000000000240211662503006021755 0ustar rootroot 'Di', 'mo' => 'Lu', 'tu' => 'Ma', 'we' => 'Me', 'th' => 'Je', 'fr' => 'Ve', 'sa' => 'Sa', // Short day names 'sun' => 'Dim', 'mon' => 'Lun', 'tue' => 'Mar', 'wed' => 'Mer', 'thu' => 'Jeu', 'fri' => 'Ven', 'sat' => 'Sam', // Long day names 'sunday' => 'Dimanche', 'monday' => 'Lundi', 'tuesday' => 'Mardi', 'wednesday' => 'Mercredi', 'thursday' => 'Jeudi', 'friday' => 'Vendredi', 'saturday' => 'Samedi', // Short month names 'jan' => 'Jan', 'feb' => 'Fév', 'mar' => 'Mar', 'apr' => 'Avr', 'may' => 'Mai', 'jun' => 'Jui', 'jul' => 'Juil', 'aug' => 'Aoû', 'sep' => 'Sep', 'oct' => 'Oct', 'nov' => 'Nov', 'dec' => 'Déc', // Long month names 'january' => 'Janvier', 'february' => 'Février', 'march' => 'Mars', 'april' => 'Avril', 'mayl' => 'Mai', 'june' => 'Juin', 'july' => 'Juillet', 'august' => 'Août', 'september' => 'Septembre', 'october' => 'Octobre', 'november' => 'Novembre', 'december' => 'Décembre' );pnp4nagios-0.6.16/lib/kohana/system/i18n/fr_FR/event.php0000664000000000000000000000053711662503006021334 0ustar rootroot 'Le sujet %s n\'a pas pu peut être attaché à %s. Les sujets doivent étendre la classe Event_Subject.', 'invalid_observer' => 'L\'observeur %s n\'a pas pu peut être attaché à %s. Les observeurs doivent étendre la classe Event_Observer.', ); pnp4nagios-0.6.16/lib/kohana/system/i18n/fr_FR/image.php0000664000000000000000000000320211662503006021265 0ustar rootroot 'Le répertoire %s spécifié n\'est pas accessible en écriture.', 'getimagesize_missing' => 'La librairie d\'image requiert la function PHP getimagesize. Celle-ci n\'est pas disponible dans votre installation.', 'unsupported_method' => 'Le pilote configuré ne supporte pas la transformation d\'image %s.', 'file_not_found' => 'L\'image spécifié %s n\'a pas été trouvée. Merci de vérifier que l\'image existe bien avec la fonction file_exists avant sa manipulation.', 'type_not_allowed' => 'L\'image spécifié %s n\'est pas d\'un type autorisé.', 'invalid_width' => 'La largeur que vous avez spécifiée, %s, est invalide.', 'invalid_height' => 'La hauteur que vous avez spécifiée, %s, est invalide.', 'invalid_dimensions' => 'Les dimensions spécifiées pour %s ne sont pas valides.', 'invalid_master' => 'La dimension principale (master dim) n\'est pas valide.', 'invalid_flip' => 'La direction de rotation spécifiée n\'est pas valide.', // ImageMagick specific messages 'imagemagick' => array ( 'not_found' => 'Le répertoire ImageMagick spécifié ne contient pas le programme requis %s.', ), // GraphicsMagick specific messages 'graphicsmagick' => array ( 'not_found' => 'Le répertoire GraphicsMagick spécifié ne contient pas le programme requis %s.', ), // GD specific messages 'gd' => array ( 'requires_v2' => 'La librairie d\'image requiert GD2. Veuillez consulter http://php.net/gd_info pour de plus amples informations.', ), );pnp4nagios-0.6.16/lib/kohana/system/i18n/fr_FR/captcha.php0000664000000000000000000000272211662503006021614 0ustar rootroot 'Le fichier spécifié, %s, est introuvable. Merci de vérifier que les fichiers existent, grâce à la fontion file_exists, avant de les utiliser.', 'requires_GD2' => 'La librairie Captcha requiert GD2 avec le support FreeType installé. Voir http://php.net/gd_info pour de plus amples renseignements, merci.', // Words of varying length for the Captcha_Word_Driver to pick from // Note: use only alphanumeric characters 'words' => array ( 'cd', 'tv', 'le', 'il', 'ou', 'an', 'moi', 'age', 'coq', 'ici', 'bob', 'eau', 'cake', 'agir', 'bain', 'dodo', 'elle', 'faux', 'hello', 'monde', 'terre', 'adore', 'baton', 'chats', 'absent', 'cendre', 'banane', 'cirque', 'violet', 'disque', 'abricot', 'billets', 'cendres', 'frisson', 'nations', 'respect', 'accepter', 'batterie', 'collines', 'desserts', 'feuilles', 'sandwich', 'acheteurs', 'tellement', 'renverser', 'histoires', 'dimanches', 'cinquante', ), // Riddles for the Captcha_Riddle_Driver to pick from // Note: use only alphanumeric characters 'riddles' => array ( array('Détestez-vous le spam? (oui ou non)', 'oui'), array('Etes vous un robot? (oui ou non)', 'non'), array('Le feu est... (chaud ou froid)', 'chaud'), array('La saison après l\'automne est l\'...', 'hiver'), array('Quel jour est-il?', strftime('%A')), array('Quel est le mois en cours?', strftime('%B')), ) ); pnp4nagios-0.6.16/lib/kohana/system/i18n/fr_FR/cache.php0000664000000000000000000000102411662503006021246 0ustar rootroot 'Le groupe %s n\'est pas défini dans votre configuration.', 'extension_not_loaded' => 'l\'extension PHP %s doit être chargée pour utiliser ce driver.', 'unwritable' => 'Le chemin %s configuré pour le cache n\'est pas accessible en écriture.', 'resources' => 'La mise en cache des ressources est impossible car elles n\'ont pas pu être sérialisées.', 'driver_error' => '%s' ); pnp4nagios-0.6.16/lib/kohana/system/i18n/fr_FR/pagination.php0000664000000000000000000000064111662503006022340 0ustar rootroot 'Le groupe %s n\'est pas défini dans votre configuration de la pagination.', 'page' => 'page', 'pages' => 'pages', 'item' => 'résultat', 'items' => 'résultats', 'of' => 'sur', 'first' => 'premier', 'last' => 'dernier', 'previous' => 'précédent', 'next' => 'suivant', ); pnp4nagios-0.6.16/lib/kohana/system/i18n/fr_FR/swift.php0000664000000000000000000000023511662503006021342 0ustar rootroot 'Une erreur est survenue lors de l\'envoi du message.' ); pnp4nagios-0.6.16/lib/kohana/system/i18n/fr_FR/orm.php0000664000000000000000000000025411662503006021004 0ustar rootroot 'Le groupe de base de données %s n\'existe pas dans votre fichier de configuration.', 'error' => 'L\'erreur SQL suivante est survenue: %s', 'connection' => 'Il y a eu une erreur lors de la connexion à la base de données: %s', 'invalid_dsn' => 'Le DSN que vous avez spécifié n\'est pas valide: %s', 'must_use_set' => 'Vous devez spécifier une clause SET pour votre requête.', 'must_use_where' => 'Vous devez spécifier une clause WHERE pour votre requête.', 'must_use_table' => 'Vous devez spécifier une table de la base de données pour votre requête.', 'table_not_found' => 'La table %s n\'existe pas dans votre base de données.', 'not_implemented' => 'La méthode %s que vous avez appelée n\'est pas supportée par le driver de base de données.', 'result_read_only' => 'Les résultats de la requête sont en lecture seule.' ); pnp4nagios-0.6.16/lib/kohana/system/i18n/fr_FR/errors.php0000664000000000000000000000235211662503006021524 0ustar rootroot array( 1, 'Framework Error', 'Veuillez vous référer à la documentation de Kohana pour plus d\'informations sur l\'erreur suivante.'), E_PAGE_NOT_FOUND => array( 1, 'Page Not Found', 'La page demandée n\'a pas été trouvée. Elle a peut-être été déplacée, supprimée, ou archivée.'), E_DATABASE_ERROR => array( 1, 'Database Error', 'Une erreur de base de données est survenue lors de l\'exécution de la procèdure demandée. Veuillez vous référer à l\'erreur renvoyée ci-dessous pour plus d\'informations.'), E_RECOVERABLE_ERROR => array( 1, 'Recoverable Error', 'Une erreur a empêché le chargement de la page. Si le problème persiste, veuillez contacter l\'administrateur du site.'), E_ERROR => array( 1, 'Fatal Error', ''), E_USER_ERROR => array( 1, 'Fatal Error', ''), E_PARSE => array( 1, 'Syntax Error', ''), E_WARNING => array( 1, 'Warning Message', ''), E_USER_WARNING => array( 1, 'Warning Message', ''), E_STRICT => array( 2, 'Strict Mode Error', ''), E_NOTICE => array( 2, 'Runtime Message', ''), ); pnp4nagios-0.6.16/lib/kohana/system/i18n/de_DE/0000775000000000000000000000000011662503006017437 5ustar rootrootpnp4nagios-0.6.16/lib/kohana/system/i18n/de_DE/session.php0000664000000000000000000000035011662503006021631 0ustar rootroot 'Der Sessionname %s ist ungültig. Dieser darf nur aus alphanumerischen Zeichen und mindestens einem Buchstaben bestehen.', );pnp4nagios-0.6.16/lib/kohana/system/i18n/de_DE/validation.php0000664000000000000000000000435011662503006022304 0ustar rootroot 'Ungültige Validierungsregel benutzt: %s', 'i18n_array' => 'Der i18n-Schlüssel %s muss ein Array sein, um diesen in der in_array-Regel benutzen zu können', 'not_callable' => 'Die Callback-Funktion %s, die zur Validierung benutzt wird, ist nicht aufrufbar', // General errors 'unknown_error' => 'Unbekannter Fehler bei der Validierungsregel von dem Feld %s aufgetreten.', 'required' => 'Das Feld %s ist erforderlich.', 'min_length' => 'Das Feld %s muss mindestens %d Zeichen lang sein.', 'max_length' => 'Das Feld %s darf höchstens %d Zeichen lang sein.', 'exact_length' => 'Das Feld %s muss genau %d Zeichen enthalten.', 'in_array' => 'Das Feld %s muss ausgewählt werden.', 'matches' => 'Das Feld %s muss mit dem Feld %s übereinstimmen.', 'valid_url' => 'Das Feld %s muss eine gültige URL beinhalten.', 'valid_email' => 'Das Feld %s muss eine gültige E-Mailadresse beinhalten.', 'valid_ip' => 'Das Feld %s muss eine gültige IP-Adresse beinhalten.', 'valid_type' => 'Das Feld %s darf nur %s beinhalten.', 'range' => 'Das Feld %s muss zwischen festgelegten Bereichen sein.', 'regex' => 'Das Feld %s entspricht nicht einer akzeptierten Eingabe.', 'depends_on' => 'Das Feld %s hängt vom Feld %s ab.', // Upload errors 'user_aborted' => 'Das Hochladen der Datei %s wurde abgebrochen.', 'invalid_type' => 'Die Datei %s entspricht nicht den erlaubten Dateitypen.', 'max_size' => 'Die Datei %s ist zu groß. Die maximale Größe beträgt %s.', 'max_width' => 'Die Datei %s ist zu groß. Die maximal erlaubte Breite betägt %spx.', 'max_height' => 'Die Datei %s ist zu groß. Die maximal erlaubte Höhe betägt %spx.', 'min_width' => 'Die Datei %s ist zu klein. Die minimal erlaubte Breite betägt %spx.', 'min_height' => 'Die Datei %s ist zu klein. Die minimal erlaubte Höhe betägt %spx.', // Field types 'alpha' => 'alphabetische Zeichen', 'alpha_numeric' => 'alphabetische und numerische Zeichen', 'alpha_dash' => 'alphabetische Zeichen, Trennstriche und Unterstriche', 'digit' => 'Zahlen', 'numeric' => 'Nummern', ); pnp4nagios-0.6.16/lib/kohana/system/i18n/de_DE/core.php0000664000000000000000000000400411662503006021076 0ustar rootroot 'Pro Seitenaufruf kann es nur eine Instanz von Kohana geben', 'uncaught_exception' => 'Unerwarteter Fehler vom Typ %s: %s in %s in Zeile %s', 'invalid_method' => 'Ungültige Methode %s aufgerufen in %s', 'invalid_property' => '%s ist keine Eigenschaft der Klasse %s.', 'log_dir_unwritable' => 'Das Log-Verzeichnis ist nicht beschreibbar: %s', 'resource_not_found' => '%s %s konnte nicht gefunden werden', 'invalid_filetype' => 'Die Dateiendung .%s ist in Ihrer View-Konfiguration nicht vorhanden', 'view_set_filename' => 'Sie müssen den Dateinamen der Ansicht festlegen, bevor render aufgerufen wird', 'no_default_route' => 'Erstellen Sie bitte eine Standardroute config/routes.php', 'no_controller' => 'Kohana gelang es nicht einen Controller zu finden, um diesen Aufruf zu verarbeiten: %s', 'page_not_found' => 'Die Seite %s konnte nicht gefunden werden.', 'stats_footer' => 'Seite geladen in {execution_time} Sekunden bei {memory_usage} Speichernutzung. Generiert von Kohana v{kohana_version}.', 'error_file_line' => '%s [%s]:', 'stack_trace' => 'Stack Trace', 'generic_error' => 'Die Abfrage konnte nicht abgeschlossen werden', 'errors_disabled' => 'Sie können zur Startseite zurück kehren oder es erneut versuchen.', // Drivers 'driver_implements' => 'Der Treiber %s für die Bibliothek %s muss das Interface %s implementieren', 'driver_not_found' => 'Der Treiber %s für die Bibliothek %s konnte nicht gefunden werden', // Resource names 'config' => 'Die Konfigurationsdatei', 'controller' => 'Der Controller', 'helper' => 'Der Helfer', 'library' => 'Die Bibliothek', 'driver' => 'Der Treiber', 'model' => 'Das Modell', 'view' => 'Die Ansicht', );pnp4nagios-0.6.16/lib/kohana/system/i18n/de_DE/upload.php0000664000000000000000000000025611662503006021437 0ustar rootroot 'Das Verzeichnis für hochgeladene Dateien, %s, ist nicht beschreibbar.', );pnp4nagios-0.6.16/lib/kohana/system/i18n/de_DE/encrypt.php0000664000000000000000000000063711662503006021642 0ustar rootroot 'Die Gruppe %s ist nicht in Ihrer Konfiguration enthalten.', 'requires_mcrypt' => 'Um die Bibliothek Encrypt zu benutzen, muss mcrypt in Ihrer PHP-Installation aktiviert werden', 'no_encryption_key' => 'Um die Bibliothek Encrypt zu benutzen, müssen Sie einen Schlüssel in Ihrer Konfiguration eintragen' ); pnp4nagios-0.6.16/lib/kohana/system/i18n/de_DE/profiler.php0000664000000000000000000000072711662503006022000 0ustar rootroot 'Benchmark-Tests', 'post_data' => 'POST-Daten:', 'no_post' => 'Keine POST-Daten', 'session_data' => 'Session-Daten', 'no_session' => 'Keine Session-Daten', 'queries' => 'Datenbank-Anfragen', 'no_queries' => 'Keine Anfragen', 'no_database' => 'Datenbank nicht geladen', 'cookie_data' => 'Cookie-Daten', 'no_cookie' => 'Keine Cookie-Daten', ); pnp4nagios-0.6.16/lib/kohana/system/i18n/de_DE/calendar.php0000664000000000000000000000240311662503006021720 0ustar rootroot 'So', 'mo' => 'Mo', 'tu' => 'Di', 'we' => 'Mi', 'th' => 'Do', 'fr' => 'Fr', 'sa' => 'Sa', // Short day names 'sun' => 'Son', 'mon' => 'Mon', 'tue' => 'Die', 'wed' => 'Mit', 'thu' => 'Don', 'fri' => 'Fre', 'sat' => 'Sam', // Long day names 'sunday' => 'Sonntag', 'monday' => 'Montag', 'tuesday' => 'Dienstag', 'wednesday' => 'Mittwoch', 'thursday' => 'Donnerstag', 'friday' => 'Freitag', 'saturday' => 'Samstag', // Short month names 'jan' => 'Jan', 'feb' => 'Feb', 'mar' => 'Mär', 'apr' => 'Apr', 'may' => 'Mai', 'jun' => 'Jun', 'jul' => 'Jul', 'aug' => 'Aug', 'sep' => 'Sep', 'oct' => 'Okt', 'nov' => 'Nov', 'dec' => 'Dez', // Long month names 'january' => 'Januar', 'february' => 'Februar', 'march' => 'März', 'april' => 'April', 'mayl' => 'Mai', 'june' => 'Juni', 'july' => 'Juli', 'august' => 'August', 'september' => 'September', 'october' => 'Oktober', 'november' => 'November', 'december' => 'Dezember' );pnp4nagios-0.6.16/lib/kohana/system/i18n/de_DE/event.php0000664000000000000000000000062311662503006021272 0ustar rootroot 'Der Versuch, das ungültige Subjekt %s an %s anzuhängen, ist fehlgeschlagen. Subjekte müssen die Klasse Event_Subject erweitern.', 'invalid_observer' => 'Der Versuch, den ungültigen Beobachter %s an %s anzuhängen, ist fehlgeschlagen. Beobachter müssen die Klasse Event_Observer erweitern.', ); pnp4nagios-0.6.16/lib/kohana/system/i18n/de_DE/image.php0000664000000000000000000000314711662503006021237 0ustar rootroot 'Die Bildbibliothek versucht die PHP-Funktion getimagesize() zu benutzen, die aber nicht Bestandteil ihrer PHP-Installation ist.', 'unsupported_method' => 'Der Bildtreiber, den Sie benutzen, unterstützt nicht die %s-Bildtransformation.', 'file_not_found' => 'Das angegebene Bild %s konnte nicht gefunden werden. Stellen Sie bitte sicher, dass das Bild existiert. Benutzen Sie hierzu die Funktion file_exists().', 'type_not_allowed' => 'Das angegebene Bild %s ist kein erlaubter Bildtyp.', 'invalid_width' => 'Die von Ihnen festgelegte Bildbreite, %s, ist ungültig.', 'invalid_height' => 'Die von Ihnen festgelegte Bildhöhe, %s, ist ungültig.', 'invalid_dimensions' => 'Das festgelegte Format für %s ist ungültig.', 'invalid_master' => 'Die festgelegte Master-Dimension ist ungültig.', 'invalid_flip' => 'Die festgelegte Richtung der Spiegelung ist ungültig.', 'directory_unwritable' => 'Das Verzeichnis %s ist nicht beschreibbar.', // ImageMagick specific messages 'imagemagick' => array ( 'not_found' => 'Das festgelegte ImageMagic-Verzeichnis enthält nicht das benötigte Programm %s.', ), // GraphicsMagick specific messages 'graphicsmagick' => array ( 'not_found' => 'Das festgelegte GraphicsMagick-Verzeichnis enthält nicht das benötigte Programm %s.', ), // GD specific messages 'gd' => array ( 'requires_v2' => 'Die Bildbibliothek erfordert GD2. Sehen Sie sich die Seite http://php.net/gd_info an, um weitere Informationen zu erhalten.', ), ); pnp4nagios-0.6.16/lib/kohana/system/i18n/de_DE/captcha.php0000664000000000000000000000303511662503006021554 0ustar rootroot 'Die eingestellte Datei %s konnte nicht gefunden werden. Kontrollieren Sie bitte, bevor Sie Dateien benutzen, ob diese existieren. Sie können dafür die Funktion file_exists() benutzen.', 'requires_GD2' => 'Die Captcha-Bibliothek erfordert GD2 mit FreeType-Unterstützung. Sehen Sie sich die Seite http://php.net/gd_info an, um weitere Informationen zu erhalten.', // Words of varying length for the Captcha_Word_Driver to pick from // Note: use only alphanumeric characters 'words' => array ( 'cd', 'tv', 'it', 'to', 'be', 'or', 'sun', 'car', 'dog', 'bed', 'kid', 'egg', 'bike', 'tree', 'bath', 'roof', 'road', 'hair', 'hello', 'world', 'earth', 'beard', 'chess', 'water', 'barber', 'bakery', 'banana', 'market', 'purple', 'writer', 'america', 'release', 'playing', 'working', 'foreign', 'general', 'aircraft', 'computer', 'laughter', 'alphabet', 'kangaroo', 'spelling', 'architect', 'president', 'cockroach', 'encounter', 'terrorism', 'cylinders', ), // Riddles for the Captcha_Riddle_Driver to pick from // Note: use only alphanumeric characters 'riddles' => array ( array('Hasst du Spam? (ja oder nein)', 'ja'), array('Bist du ein Roboter? (ja oder nein)', 'nein'), array('Feuer ist ... (heiß or kalt)', 'heiß'), array('Die Jahreszeit, die nach Herbst kommt ist ...', 'Winter'), array('Welcher Wochentag ist heute?', strftime('%A')), array('In welchem Monat befinden wir uns gerade?', strftime('%B')), ), ); pnp4nagios-0.6.16/lib/kohana/system/i18n/de_DE/cache.php0000664000000000000000000000100611662503006021210 0ustar rootroot 'Die Gruppe %s ist in Ihrer Konfiguration nicht definiert.', 'extension_not_loaded' => 'Die PHP-Erweiterung %s muss geladen sein, um diesen Treiber benutzen zu können.', 'unwritable' => 'Der eingestellte Speicherort %s ist nicht beschreibbar.', 'resources' => 'Das Cachen von Ressourcen ist nicht möglich, da diese nicht serialisiert werden können.', 'driver_error' => '%s' );pnp4nagios-0.6.16/lib/kohana/system/i18n/de_DE/pagination.php0000664000000000000000000000063111662503006022301 0ustar rootroot 'Die Gruppe %s ist nicht in der Pagination-Konfiguration definiert worden.', 'page' => 'Seite', 'pages' => 'Seiten', 'item' => 'Element', 'items' => 'Elemente', 'of' => 'von', 'first' => 'Erste', 'last' => 'Letzte', 'previous' => 'Vorherige', 'next' => 'Nächste', ); pnp4nagios-0.6.16/lib/kohana/system/i18n/de_DE/swift.php0000664000000000000000000000022411662503006021302 0ustar rootroot 'Fehler beim Senden einer E-Mail aufgetreten.' );pnp4nagios-0.6.16/lib/kohana/system/i18n/de_DE/orm.php0000664000000000000000000000024111662503006020742 0ustar rootroot 'Die Gruppe %s ist in Ihrer Konfiguration nicht definiert worden.', 'error' => 'Es gab einen SQL-Fehler: %s', 'connection' => 'Es gab einen Fehler bei der Verbindung mit der Datenbank: %s', 'invalid_dsn' => 'Die von Ihnen angegebene DSN ist ungültig: %s', 'must_use_set' => 'Sie müssen SET in Ihrem Query benutzen.', 'must_use_where' => 'Sie müssen WHERE in Ihrem Query benutzen.', 'must_use_table' => 'Sie müssen eine Tabelle für Ihren Query angeben.', 'table_not_found' => 'Die Tabelle %s konnte in der Datenbank nicht gefunden werden.', 'not_implemented' => 'Die Methode %s wird von diesem Datenbanktreiber nicht unterstützt.', 'result_read_only' => 'Ergebnisse der Anfrage können nur gelesen werden.', );pnp4nagios-0.6.16/lib/kohana/system/i18n/de_DE/errors.php0000664000000000000000000000236311662503006021470 0ustar rootroot array( 1, 'Framework-Fehler', 'Lesen Sie bitte in der Kohana-Dokumentation, um mehr über den folgenden Fehler zu erfahren.'), E_PAGE_NOT_FOUND => array( 1, 'Seite Nicht Gefunden', 'Die aufgerufene Seite wurde nicht gefunden. Sie wurde entweder verschoben, gelöscht oder archiviert.'), E_DATABASE_ERROR => array( 1, 'Datenbank-Fehler', 'Ein Datenbankfehler ist während des Aufrufs aufgetreten. Überprüfen Sie bitte den unten stehenden Fehler für mehr Informationen.'), E_RECOVERABLE_ERROR => array( 1, 'Behebbarer Fehler', 'Es ist ein Fehler aufgetreten, der das Laden der Seite verhindert hat. Wenn der Fehler weiterhin besteht, kontaktieren Sie bitte den Administrator der Seite.'), E_ERROR => array( 1, 'Fataler Fehler', ''), E_USER_ERROR => array( 1, 'Fataler Fehler', ''), E_PARSE => array( 1, 'Syntax-Fehler', ''), E_WARNING => array( 1, 'Warnung', ''), E_USER_WARNING => array( 1, 'Warnung', ''), E_STRICT => array( 2, 'Strict Mode Error', ''), E_NOTICE => array( 2, 'Laufzeitfehler', ''), );pnp4nagios-0.6.16/lib/kohana/system/helpers/0000775000000000000000000000000011662503006017362 5ustar rootrootpnp4nagios-0.6.16/lib/kohana/system/helpers/download.php0000664000000000000000000000472211662503006021707 0ustar rootroot> 1); } /** * Converts a DOS timestamp to UNIX format. * * @param integer DOS timestamp * @return integer */ public static function dos2unix($timestamp = FALSE) { $sec = 2 * ($timestamp & 0x1f); $min = ($timestamp >> 5) & 0x3f; $hrs = ($timestamp >> 11) & 0x1f; $day = ($timestamp >> 16) & 0x1f; $mon = ($timestamp >> 21) & 0x0f; $year = ($timestamp >> 25) & 0x7f; return mktime($hrs, $min, $sec, $mon, $day, $year + 1980); } /** * Returns the offset (in seconds) between two time zones. * @see http://php.net/timezones * * @param string timezone that to find the offset of * @param string|boolean timezone used as the baseline * @return integer */ public static function offset($remote, $local = TRUE) { static $offsets; // Default values $remote = (string) $remote; $local = ($local === TRUE) ? date_default_timezone_get() : (string) $local; // Cache key name $cache = $remote.$local; if (empty($offsets[$cache])) { // Create timezone objects $remote = new DateTimeZone($remote); $local = new DateTimeZone($local); // Create date objects from timezones $time_there = new DateTime('now', $remote); $time_here = new DateTime('now', $local); // Find the offset $offsets[$cache] = $remote->getOffset($time_there) - $local->getOffset($time_here); } return $offsets[$cache]; } /** * Number of seconds in a minute, incrementing by a step. * * @param integer amount to increment each step by, 1 to 30 * @param integer start value * @param integer end value * @return array A mirrored (foo => foo) array from 1-60. */ public static function seconds($step = 1, $start = 0, $end = 60) { // Always integer $step = (int) $step; $seconds = array(); for ($i = $start; $i < $end; $i += $step) { $seconds[$i] = ($i < 10) ? '0'.$i : $i; } return $seconds; } /** * Number of minutes in an hour, incrementing by a step. * * @param integer amount to increment each step by, 1 to 30 * @return array A mirrored (foo => foo) array from 1-60. */ public static function minutes($step = 5) { // Because there are the same number of minutes as seconds in this set, // we choose to re-use seconds(), rather than creating an entirely new // function. Shhhh, it's cheating! ;) There are several more of these // in the following methods. return date::seconds($step); } /** * Number of hours in a day. * * @param integer amount to increment each step by * @param boolean use 24-hour time * @param integer the hour to start at * @return array A mirrored (foo => foo) array from start-12 or start-23. */ public static function hours($step = 1, $long = FALSE, $start = NULL) { // Default values $step = (int) $step; $long = (bool) $long; $hours = array(); // Set the default start if none was specified. if ($start === NULL) { $start = ($long === FALSE) ? 1 : 0; } $hours = array(); // 24-hour time has 24 hours, instead of 12 $size = ($long === TRUE) ? 23 : 12; for ($i = $start; $i <= $size; $i += $step) { $hours[$i] = $i; } return $hours; } /** * Returns AM or PM, based on a given hour. * * @param integer number of the hour * @return string */ public static function ampm($hour) { // Always integer $hour = (int) $hour; return ($hour > 11) ? 'PM' : 'AM'; } /** * Adjusts a non-24-hour number into a 24-hour number. * * @param integer hour to adjust * @param string AM or PM * @return string */ public static function adjust($hour, $ampm) { $hour = (int) $hour; $ampm = strtolower($ampm); switch ($ampm) { case 'am': if ($hour == 12) $hour = 0; break; case 'pm': if ($hour < 12) $hour += 12; break; } return sprintf('%02s', $hour); } /** * Number of days in month. * * @param integer number of month * @param integer number of year to check month, defaults to the current year * @return array A mirrored (foo => foo) array of the days. */ public static function days($month, $year = FALSE) { static $months; // Always integers $month = (int) $month; $year = (int) $year; // Use the current year by default $year = ($year == FALSE) ? date('Y') : $year; // We use caching for months, because time functions are used if (empty($months[$year][$month])) { $months[$year][$month] = array(); // Use date to find the number of days in the given month $total = date('t', mktime(1, 0, 0, $month, 1, $year)) + 1; for ($i = 1; $i < $total; $i++) { $months[$year][$month][$i] = $i; } } return $months[$year][$month]; } /** * Number of months in a year * * @return array A mirrored (foo => foo) array from 1-12. */ public static function months() { return date::hours(); } /** * Returns an array of years between a starting and ending year. * Uses the current year +/- 5 as the max/min. * * @param integer starting year * @param integer ending year * @return array */ public static function years($start = FALSE, $end = FALSE) { // Default values $start = ($start === FALSE) ? date('Y') - 5 : (int) $start; $end = ($end === FALSE) ? date('Y') + 5 : (int) $end; $years = array(); // Add one, so that "less than" works $end += 1; for ($i = $start; $i < $end; $i++) { $years[$i] = $i; } return $years; } /** * Returns time difference between two timestamps, in human readable format. * * @param integer timestamp * @param integer timestamp, defaults to the current time * @param string formatting string * @return string|array */ public static function timespan($time1, $time2 = NULL, $output = 'years,months,weeks,days,hours,minutes,seconds') { // Array with the output formats $output = preg_split('/[^a-z]+/', strtolower((string) $output)); // Invalid output if (empty($output)) return FALSE; // Make the output values into keys extract(array_flip($output), EXTR_SKIP); // Default values $time1 = max(0, (int) $time1); $time2 = empty($time2) ? time() : max(0, (int) $time2); // Calculate timespan (seconds) $timespan = abs($time1 - $time2); // All values found using Google Calculator. // Years and months do not match the formula exactly, due to leap years. // Years ago, 60 * 60 * 24 * 365 isset($years) and $timespan -= 31556926 * ($years = (int) floor($timespan / 31556926)); // Months ago, 60 * 60 * 24 * 30 isset($months) and $timespan -= 2629744 * ($months = (int) floor($timespan / 2629743.83)); // Weeks ago, 60 * 60 * 24 * 7 isset($weeks) and $timespan -= 604800 * ($weeks = (int) floor($timespan / 604800)); // Days ago, 60 * 60 * 24 isset($days) and $timespan -= 86400 * ($days = (int) floor($timespan / 86400)); // Hours ago, 60 * 60 isset($hours) and $timespan -= 3600 * ($hours = (int) floor($timespan / 3600)); // Minutes ago, 60 isset($minutes) and $timespan -= 60 * ($minutes = (int) floor($timespan / 60)); // Seconds ago, 1 isset($seconds) and $seconds = $timespan; // Remove the variables that cannot be accessed unset($timespan, $time1, $time2); // Deny access to these variables $deny = array_flip(array('deny', 'key', 'difference', 'output')); // Return the difference $difference = array(); foreach ($output as $key) { if (isset($$key) AND ! isset($deny[$key])) { // Add requested key to the output $difference[$key] = $$key; } } // Invalid output formats string if (empty($difference)) return FALSE; // If only one output format was asked, don't put it in an array if (count($difference) === 1) return current($difference); // Return array return $difference; } /** * Returns time difference between two timestamps, in the format: * N year, N months, N weeks, N days, N hours, N minutes, and N seconds ago * * @param integer timestamp * @param integer timestamp, defaults to the current time * @param string formatting string * @return string */ public static function timespan_string($time1, $time2 = NULL, $output = 'years,months,weeks,days,hours,minutes,seconds') { if ($difference = date::timespan($time1, $time2, $output) AND is_array($difference)) { // Determine the key of the last item in the array $last = end($difference); $last = key($difference); $span = array(); foreach ($difference as $name => $amount) { if ($amount === 0) { // Skip empty amounts continue; } // Add the amount to the span $span[] = ($name === $last ? ' and ' : ', ').$amount.' '.($amount === 1 ? inflector::singular($name) : $name); } // If the difference is less than 60 seconds, remove the preceding and. if (count($span) === 1) { $span[0] = ltrim($span[0], 'and '); } // Replace difference by making the span into a string $difference = trim(implode('', $span), ','); } elseif (is_int($difference)) { // Single-value return $difference = $difference.' '.($difference === 1 ? inflector::singular($output) : $output); } return $difference; } } // End datepnp4nagios-0.6.16/lib/kohana/system/helpers/cookie.php0000664000000000000000000000436011662503006021347 0ustar rootrootcookie($name, $default, $xss_clean); } /** * Nullify and unset a cookie. * * @param string cookie name * @param string URL path * @param string URL domain * @return boolean */ public static function delete($name, $path = NULL, $domain = NULL) { if ( ! isset($_COOKIE[$name])) return FALSE; // Delete the cookie from globals unset($_COOKIE[$name]); // Sets the cookie value to an empty string, and the expiration to 24 hours ago return cookie::set($name, '', -86400, $path, $domain, FALSE, FALSE); } } // End cookie pnp4nagios-0.6.16/lib/kohana/system/helpers/expires.php0000664000000000000000000000524511662503006021560 0ustar rootroot 0) { // Re-send headers header('Last-Modified: '.gmdate('D, d M Y H:i:s T', $mod_time)); header('Expires: '.gmdate('D, d M Y H:i:s T', time() + $mod_time_diff)); header('Cache-Control: max-age='.$mod_time_diff); header('Status: 304 Not Modified', TRUE, 304); // Prevent any output Event::add('system.display', array('expires', 'prevent_output')); // Exit to prevent other output exit; } } return FALSE; } /** * Check headers already created to not step on download or Img_lib's feet * * @return boolean */ public static function check_headers() { foreach (headers_list() as $header) { if ((session_cache_limiter() == '' AND stripos($header, 'Last-Modified:') === 0) OR stripos($header, 'Expires:') === 0) { return FALSE; } } return TRUE; } /** * Prevent any output from being displayed. Executed during system.display. * * @return void */ public static function prevent_output() { Kohana::$output = ''; } } // End expirespnp4nagios-0.6.16/lib/kohana/system/helpers/email.php0000664000000000000000000001130511662503006021162 0ustar rootrootsetUsername($config['options']['username']); empty($config['options']['password']) or $connection->setPassword($config['options']['password']); if ( ! empty($config['options']['auth'])) { // Get the class name and params list ($class, $params) = arr::callback_string($config['options']['auth']); if ($class === 'PopB4Smtp') { // Load the PopB4Smtp class manually, due to its odd filename require Kohana::find_file('vendor', 'swift/Swift/Authenticator/$PopB4Smtp$'); } // Prepare the class name for auto-loading $class = 'Swift_Authenticator_'.$class; // Attach the authenticator $connection->attachAuthenticator(($params === NULL) ? new $class : new $class($params[0])); } // Set the timeout to 5 seconds $connection->setTimeout(empty($config['options']['timeout']) ? 5 : (int) $config['options']['timeout']); break; case 'sendmail': // Create a sendmail connection $connection = new Swift_Connection_Sendmail ( empty($config['options']) ? Swift_Connection_Sendmail::AUTO_DETECT : $config['options'] ); // Set the timeout to 5 seconds $connection->setTimeout(5); break; default: // Use the native connection $connection = new Swift_Connection_NativeMail($config['options']); break; } // Create the SwiftMailer instance return email::$mail = new Swift($connection); } /** * Send an email message. * * @param string|array recipient email (and name), or an array of To, Cc, Bcc names * @param string|array sender email (and name) * @param string message subject * @param string message body * @param boolean send email as HTML * @return integer number of emails sent */ public static function send($to, $from, $subject, $message, $html = FALSE) { // Connect to SwiftMailer (email::$mail === NULL) and email::connect(); // Determine the message type $html = ($html === TRUE) ? 'text/html' : 'text/plain'; // Create the message $message = new Swift_Message($subject, $message, $html, '8bit', 'utf-8'); if (is_string($to)) { // Single recipient $recipients = new Swift_Address($to); } elseif (is_array($to)) { if (isset($to[0]) AND isset($to[1])) { // Create To: address set $to = array('to' => $to); } // Create a list of recipients $recipients = new Swift_RecipientList; foreach ($to as $method => $set) { if ( ! in_array($method, array('to', 'cc', 'bcc'))) { // Use To: by default $method = 'to'; } // Create method name $method = 'add'.ucfirst($method); if (is_array($set)) { // Add a recipient with name $recipients->$method($set[0], $set[1]); } else { // Add a recipient without name $recipients->$method($set); } } } if (is_string($from)) { // From without a name $from = new Swift_Address($from); } elseif (is_array($from)) { // From with a name $from = new Swift_Address($from[0], $from[1]); } return email::$mail->send($message, $recipients, $from); } } // End emailpnp4nagios-0.6.16/lib/kohana/system/helpers/upload.php0000664000000000000000000001050711662503006021362 0ustar rootroot=')) { $str = htmlspecialchars($str, ENT_QUOTES, 'UTF-8', FALSE); } else { $str = preg_replace('/&(?!(?:#\d++|[a-z]++);)/ui', '&', $str); $str = str_replace(array('<', '>', '\'', '"'), array('<', '>', ''', '"'), $str); } } return $str; } /** * Perform a html::specialchars() with additional URL specific encoding. * * @param string string to convert * @param boolean encode existing entities * @return string */ public static function specialurlencode($str, $double_encode = TRUE) { return str_replace(' ', '%20', html::specialchars($str, $double_encode)); } /** * Create HTML link anchors. * * @param string URL or URI string * @param string link text * @param array HTML anchor attributes * @param string non-default protocol, eg: https * @param boolean option to escape the title that is output * @return string */ public static function anchor($uri, $title = NULL, $attributes = NULL, $protocol = NULL, $escape_title = FALSE) { if ($uri === '') { $site_url = url::base(FALSE); } elseif (strpos($uri, '#') === 0) { // This is an id target link, not a URL $site_url = $uri; } elseif (strpos($uri, '://') === FALSE) { $site_url = url::site($uri, $protocol); } else { if (html::$windowed_urls === TRUE AND empty($attributes['target'])) { $attributes['target'] = '_blank'; } $site_url = $uri; } return // Parsed URL '' // Title empty? Use the parsed URL .($escape_title ? html::specialchars((($title === NULL) ? $site_url : $title), FALSE) : (($title === NULL) ? $site_url : $title)).''; } /** * Creates an HTML anchor to a file. * * @param string name of file to link to * @param string link text * @param array HTML anchor attributes * @param string non-default protocol, eg: ftp * @return string */ public static function file_anchor($file, $title = NULL, $attributes = NULL, $protocol = NULL) { return // Base URL + URI = full URL '' // Title empty? Use the filename part of the URI .(($title === NULL) ? end(explode('/', $file)) : $title) .''; } /** * Similar to anchor, but with the protocol parameter first. * * @param string link protocol * @param string URI or URL to link to * @param string link text * @param array HTML anchor attributes * @return string */ public static function panchor($protocol, $uri, $title = NULL, $attributes = FALSE) { return html::anchor($uri, $title, $attributes, $protocol); } /** * Create an array of anchors from an array of link/title pairs. * * @param array link/title pairs * @return array */ public static function anchor_array(array $array) { $anchors = array(); foreach ($array as $link => $title) { // Create list of anchors $anchors[] = html::anchor($link, $title); } return $anchors; } /** * Generates an obfuscated version of an email address. * * @param string email address * @return string */ public static function email($email) { $safe = ''; foreach (str_split($email) as $letter) { switch (($letter === '@') ? rand(1, 2) : rand(1, 3)) { // HTML entity code case 1: $safe .= '&#'.ord($letter).';'; break; // Hex character code case 2: $safe .= '&#x'.dechex(ord($letter)).';'; break; // Raw (no) encoding case 3: $safe .= $letter; } } return $safe; } /** * Creates an email anchor. * * @param string email address to send to * @param string link text * @param array HTML anchor attributes * @return string */ public static function mailto($email, $title = NULL, $attributes = NULL) { if (empty($email)) return $title; // Remove the subject or other parameters that do not need to be encoded if (strpos($email, '?') !== FALSE) { // Extract the parameters from the email address list ($email, $params) = explode('?', $email, 2); // Make the params into a query string, replacing spaces $params = '?'.str_replace(' ', '%20', $params); } else { // No parameters $params = ''; } // Obfuscate email address $safe = html::email($email); // Title defaults to the encoded email address empty($title) and $title = $safe; // Parse attributes empty($attributes) or $attributes = html::attributes($attributes); // Encoded start of the href="" is a static encoded version of 'mailto:' return ''.$title.''; } /** * Generate a "breadcrumb" list of anchors representing the URI. * * @param array segments to use as breadcrumbs, defaults to using Router::$segments * @return string */ public static function breadcrumb($segments = NULL) { empty($segments) and $segments = Router::$segments; $array = array(); while ($segment = array_pop($segments)) { $array[] = html::anchor ( // Complete URI for the URL implode('/', $segments).'/'.$segment, // Title for the current segment ucwords(inflector::humanize($segment)) ); } // Retrun the array of all the segments return array_reverse($array); } /** * Creates a meta tag. * * @param string|array tag name, or an array of tags * @param string tag "content" value * @return string */ public static function meta($tag, $value = NULL) { if (is_array($tag)) { $tags = array(); foreach ($tag as $t => $v) { // Build each tag and add it to the array $tags[] = html::meta($t, $v); } // Return all of the tags as a string return implode("\n", $tags); } // Set the meta attribute value $attr = in_array(strtolower($tag), Kohana::config('http.meta_equiv')) ? 'http-equiv' : 'name'; return ''; } /** * Creates a stylesheet link. * * @param string|array filename, or array of filenames to match to array of medias * @param string|array media type of stylesheet, or array to match filenames * @param boolean include the index_page in the link * @return string */ public static function stylesheet($style, $media = FALSE, $index = FALSE) { return html::link($style, 'stylesheet', 'text/css', '.css', $media, $index); } /** * Creates a link tag. * * @param string|array filename * @param string|array relationship * @param string|array mimetype * @param string specifies suffix of the file * @param string|array specifies on what device the document will be displayed * @param boolean include the index_page in the link * @return string */ public static function link($href, $rel, $type, $suffix = FALSE, $media = FALSE, $index = FALSE) { $compiled = ''; if (is_array($href)) { foreach ($href as $_href) { $_rel = is_array($rel) ? array_shift($rel) : $rel; $_type = is_array($type) ? array_shift($type) : $type; $_media = is_array($media) ? array_shift($media) : $media; $compiled .= html::link($_href, $_rel, $_type, $suffix, $_media, $index); } } else { if (strpos($href, '://') === FALSE) { // Make the URL absolute $href = url::base($index).$href; } $length = strlen($suffix); if ( $length > 0 AND substr_compare($href, $suffix, -$length, $length, FALSE) !== 0) { // Add the defined suffix $href .= $suffix; } $attr = array ( 'rel' => $rel, 'type' => $type, 'href' => $href, ); if ( ! empty($media)) { // Add the media type to the attributes $attr['media'] = $media; } $compiled = ''; } return $compiled."\n"; } /** * Creates a script link. * * @param string|array filename * @param boolean include the index_page in the link * @return string */ public static function script($script, $index = FALSE) { $compiled = ''; if (is_array($script)) { foreach ($script as $name) { $compiled .= html::script($name, $index); } } else { if (strpos($script, '://') === FALSE) { // Add the suffix only when it's not already present $script = url::base((bool) $index).$script; } if (substr_compare($script, '.js', -3, 3, FALSE) !== 0) { // Add the javascript suffix $script .= '.js'; } $compiled = ''; } return $compiled."\n"; } /** * Creates a image link. * * @param string image source, or an array of attributes * @param string|array image alt attribute, or an array of attributes * @param boolean include the index_page in the link * @return string */ public static function image($src = NULL, $alt = NULL, $index = FALSE) { // Create attribute list $attributes = is_array($src) ? $src : array('src' => $src); if (is_array($alt)) { $attributes += $alt; } elseif ( ! empty($alt)) { // Add alt to attributes $attributes['alt'] = $alt; } if (strpos($attributes['src'], '://') === FALSE) { // Make the src attribute into an absolute URL $attributes['src'] = url::base($index).$attributes['src']; } return ''; } /** * Compiles an array of HTML attributes into an attribute string. * * @param string|array array of attributes * @return string */ public static function attributes($attrs) { if (empty($attrs)) return ''; if (is_string($attrs)) return ' '.$attrs; $compiled = ''; foreach ($attrs as $key => $val) { $compiled .= ' '.$key.'="'.html::specialchars($val).'"'; } return $compiled; } } // End html pnp4nagios-0.6.16/lib/kohana/system/helpers/num.php0000664000000000000000000000110111662503006020663 0ustar rootroot 'Refresh', '300' => 'Multiple Choices', '301' => 'Moved Permanently', '302' => 'Found', '303' => 'See Other', '304' => 'Not Modified', '305' => 'Use Proxy', '307' => 'Temporary Redirect' ); // Validate the method and default to 302 $method = isset($codes[$method]) ? (string) $method : '302'; if ($method === '300') { $uri = (array) $uri; $output = '
      '; foreach ($uri as $link) { $output .= '
    • '.html::anchor($link).'
    • '; } $output .= '
    '; // The first URI will be used for the Location header $uri = $uri[0]; } else { $output = '

    '.html::anchor($uri).'

    '; } // Run the redirect event Event::run('system.redirect', $uri); if (strpos($uri, '://') === FALSE) { // HTTP headers expect absolute URLs $uri = url::site($uri, request::protocol()); } if ($method === 'refresh') { header('Refresh: 0; url='.$uri); } else { header('HTTP/1.1 '.$method.' '.$codes[$method]); header('Location: '.$uri); } // We are about to exit, so run the send_headers event Event::run('system.send_headers'); exit('

    '.$method.' - '.$codes[$method].'

    '.$output); } } // End urlpnp4nagios-0.6.16/lib/kohana/system/helpers/format.php0000664000000000000000000000327311662503006021370 0ustar rootroot'."\n"; // Add hidden fields immediate after opening tag empty($hidden) or $form .= form::hidden($hidden); return $form; } /** * Generates an opening HTML form tag that can be used for uploading files. * * @param string form action attribute * @param array extra attributes * @param array hidden fields to be created immediately after the form tag * @return string */ public static function open_multipart($action = NULL, $attr = array(), $hidden = array()) { // Set multi-part form type $attr['enctype'] = 'multipart/form-data'; return form::open($action, $attr, $hidden); } /** * Generates a fieldset opening tag. * * @param array html attributes * @param string a string to be attached to the end of the attributes * @return string */ public static function open_fieldset($data = NULL, $extra = '') { return ''."\n"; } /** * Generates a fieldset closing tag. * * @return string */ public static function close_fieldset() { return ''."\n"; } /** * Generates a legend tag for use with a fieldset. * * @param string legend text * @param array HTML attributes * @param string a string to be attached to the end of the attributes * @return string */ public static function legend($text = '', $data = NULL, $extra = '') { return ''.$text.''."\n"; } /** * Generates hidden form fields. * You can pass a simple key/value string or an associative array with multiple values. * * @param string|array input name (string) or key/value pairs (array) * @param string input value, if using an input name * @return string */ public static function hidden($data, $value = '') { if ( ! is_array($data)) { $data = array ( $data => $value ); } $input = ''; foreach ($data as $name => $value) { $attr = array ( 'type' => 'hidden', 'name' => $name, 'value' => $value ); $input .= form::input($attr)."\n"; } return $input; } /** * Creates an HTML form input tag. Defaults to a text type. * * @param string|array input name or an array of HTML attributes * @param string input value, when using a name * @param string a string to be attached to the end of the attributes * @return string */ public static function input($data, $value = '', $extra = '') { if ( ! is_array($data)) { $data = array('name' => $data); } // Type and value are required attributes $data += array ( 'type' => 'text', 'value' => $value ); return ''; } /** * Creates a HTML form password input tag. * * @param string|array input name or an array of HTML attributes * @param string input value, when using a name * @param string a string to be attached to the end of the attributes * @return string */ public static function password($data, $value = '', $extra = '') { if ( ! is_array($data)) { $data = array('name' => $data); } $data['type'] = 'password'; return form::input($data, $value, $extra); } /** * Creates an HTML form upload input tag. * * @param string|array input name or an array of HTML attributes * @param string input value, when using a name * @param string a string to be attached to the end of the attributes * @return string */ public static function upload($data, $value = '', $extra = '') { if ( ! is_array($data)) { $data = array('name' => $data); } $data['type'] = 'file'; return form::input($data, $value, $extra); } /** * Creates an HTML form textarea tag. * * @param string|array input name or an array of HTML attributes * @param string input value, when using a name * @param string a string to be attached to the end of the attributes * @param boolean encode existing entities * @return string */ public static function textarea($data, $value = '', $extra = '', $double_encode = TRUE) { if ( ! is_array($data)) { $data = array('name' => $data); } // Use the value from $data if possible, or use $value $value = isset($data['value']) ? $data['value'] : $value; // Value is not part of the attributes unset($data['value']); return ''.html::specialchars($value, $double_encode).''; } /** * Creates an HTML form select tag, or "dropdown menu". * * @param string|array input name or an array of HTML attributes * @param array select options, when using a name * @param string|array option key(s) that should be selected by default * @param string a string to be attached to the end of the attributes * @return string */ public static function dropdown($data, $options = NULL, $selected = NULL, $extra = '') { if ( ! is_array($data)) { $data = array('name' => $data); } else { if (isset($data['options'])) { // Use data options $options = $data['options']; } if (isset($data['selected'])) { // Use data selected $selected = $data['selected']; } } if (is_array($selected)) { // Multi-select box $data['multiple'] = 'multiple'; } else { // Single selection (but converted to an array) $selected = array($selected); } $input = ''."\n"; foreach ((array) $options as $key => $val) { // Key should always be a string $key = (string) $key; if (is_array($val)) { $input .= ''."\n"; foreach ($val as $inner_key => $inner_val) { // Inner key should always be a string $inner_key = (string) $inner_key; $sel = in_array($inner_key, $selected) ? ' selected="selected"' : ''; $input .= ''."\n"; } $input .= ''."\n"; } else { $sel = in_array($key, $selected) ? ' selected="selected"' : ''; $input .= ''."\n"; } } $input .= ''; return $input; } /** * Creates an HTML form checkbox input tag. * * @param string|array input name or an array of HTML attributes * @param string input value, when using a name * @param boolean make the checkbox checked by default * @param string a string to be attached to the end of the attributes * @return string */ public static function checkbox($data, $value = '', $checked = FALSE, $extra = '') { if ( ! is_array($data)) { $data = array('name' => $data); } $data['type'] = 'checkbox'; if ($checked == TRUE OR (isset($data['checked']) AND $data['checked'] == TRUE)) { $data['checked'] = 'checked'; } else { unset($data['checked']); } return form::input($data, $value, $extra); } /** * Creates an HTML form radio input tag. * * @param string|array input name or an array of HTML attributes * @param string input value, when using a name * @param boolean make the radio selected by default * @param string a string to be attached to the end of the attributes * @return string */ public static function radio($data = '', $value = '', $checked = FALSE, $extra = '') { if ( ! is_array($data)) { $data = array('name' => $data); } $data['type'] = 'radio'; if ($checked == TRUE OR (isset($data['checked']) AND $data['checked'] == TRUE)) { $data['checked'] = 'checked'; } else { unset($data['checked']); } return form::input($data, $value, $extra); } /** * Creates an HTML form submit input tag. * * @param string|array input name or an array of HTML attributes * @param string input value, when using a name * @param string a string to be attached to the end of the attributes * @return string */ public static function submit($data = '', $value = '', $extra = '') { if ( ! is_array($data)) { $data = array('name' => $data); } if (empty($data['name'])) { // Remove the name if it is empty unset($data['name']); } $data['type'] = 'submit'; return form::input($data, $value, $extra); } /** * Creates an HTML form button input tag. * * @param string|array input name or an array of HTML attributes * @param string input value, when using a name * @param string a string to be attached to the end of the attributes * @return string */ public static function button($data = '', $value = '', $extra = '') { if ( ! is_array($data)) { $data = array('name' => $data); } if (empty($data['name'])) { // Remove the name if it is empty unset($data['name']); } if (isset($data['value']) AND empty($value)) { $value = arr::remove('value', $data); } return ''.$value.''; } /** * Closes an open form tag. * * @param string string to be attached after the closing tag * @return string */ public static function close($extra = '') { return ''."\n".$extra; } /** * Creates an HTML form label tag. * * @param string|array label "for" name or an array of HTML attributes * @param string label text or HTML * @param string a string to be attached to the end of the attributes * @return string */ public static function label($data = '', $text = NULL, $extra = '') { if ( ! is_array($data)) { if (is_string($data)) { // Specify the input this label is for $data = array('for' => $data); } else { // No input specified $data = array(); } } if ($text === NULL AND isset($data['for'])) { // Make the text the human-readable input name $text = ucwords(inflector::humanize($data['for'])); } return ''.$text.''; } /** * Sorts a key/value array of HTML attributes, putting form attributes first, * and returns an attribute string. * * @param array HTML attributes array * @return string */ public static function attributes($attr, $type = NULL) { if (empty($attr)) return ''; if (isset($attr['name']) AND empty($attr['id']) AND strpos($attr['name'], '[') === FALSE) { if ($type === NULL AND ! empty($attr['type'])) { // Set the type by the attributes $type = $attr['type']; } switch ($type) { case 'text': case 'textarea': case 'password': case 'select': case 'checkbox': case 'file': case 'image': case 'button': case 'submit': // Only specific types of inputs use name to id matching $attr['id'] = $attr['name']; break; } } $order = array ( 'action', 'method', 'type', 'id', 'name', 'value', 'src', 'size', 'maxlength', 'rows', 'cols', 'accept', 'tabindex', 'accesskey', 'align', 'alt', 'title', 'class', 'style', 'selected', 'checked', 'readonly', 'disabled' ); $sorted = array(); foreach ($order as $key) { if (isset($attr[$key])) { // Move the attribute to the sorted array $sorted[$key] = $attr[$key]; // Remove the attribute from unsorted array unset($attr[$key]); } } // Combine the sorted and unsorted attributes and create an HTML string return html::attributes(array_merge($sorted, $attr)); } } // End formpnp4nagios-0.6.16/lib/kohana/system/helpers/inflector.php0000664000000000000000000001014011662503006022054 0ustar rootroot 1) return $str; // Cache key name $key = 'singular_'.$str.$count; if (isset(inflector::$cache[$key])) return inflector::$cache[$key]; if (inflector::uncountable($str)) return inflector::$cache[$key] = $str; if (empty(inflector::$irregular)) { // Cache irregular words inflector::$irregular = Kohana::config('inflector.irregular'); } if ($irregular = array_search($str, inflector::$irregular)) { $str = $irregular; } elseif (preg_match('/[sxz]es$/', $str) OR preg_match('/[^aeioudgkprt]hes$/', $str)) { // Remove "es" $str = substr($str, 0, -2); } elseif (preg_match('/[^aeiou]ies$/', $str)) { $str = substr($str, 0, -3).'y'; } elseif (substr($str, -1) === 's' AND substr($str, -2) !== 'ss') { $str = substr($str, 0, -1); } return inflector::$cache[$key] = $str; } /** * Makes a singular word plural. * * @param string word to pluralize * @return string */ public static function plural($str, $count = NULL) { // Remove garbage $str = strtolower(trim($str)); if (is_string($count)) { // Convert to integer when using a digit string $count = (int) $count; } // Do nothing with singular if ($count === 1) return $str; // Cache key name $key = 'plural_'.$str.$count; if (isset(inflector::$cache[$key])) return inflector::$cache[$key]; if (inflector::uncountable($str)) return inflector::$cache[$key] = $str; if (empty(inflector::$irregular)) { // Cache irregular words inflector::$irregular = Kohana::config('inflector.irregular'); } if (isset(inflector::$irregular[$str])) { $str = inflector::$irregular[$str]; } elseif (preg_match('/[sxz]$/', $str) OR preg_match('/[^aeioudgkprt]h$/', $str)) { $str .= 'es'; } elseif (preg_match('/[^aeiou]y$/', $str)) { // Change "y" to "ies" $str = substr_replace($str, 'ies', -1); } else { $str .= 's'; } // Set the cache and return return inflector::$cache[$key] = $str; } /** * Makes a phrase camel case. * * @param string phrase to camelize * @return string */ public static function camelize($str) { $str = 'x'.strtolower(trim($str)); $str = ucwords(preg_replace('/[\s_]+/', ' ', $str)); return substr(str_replace(' ', '', $str), 1); } /** * Makes a phrase underscored instead of spaced. * * @param string phrase to underscore * @return string */ public static function underscore($str) { return preg_replace('/\s+/', '_', trim($str)); } /** * Makes an underscored or dashed phrase human-reable. * * @param string phrase to make human-reable * @return string */ public static function humanize($str) { return preg_replace('/[_-]+/', ' ', trim($str)); } } // End inflectorpnp4nagios-0.6.16/lib/kohana/system/helpers/remote.php0000664000000000000000000000262711662503006021375 0ustar rootroot 1) { if (ctype_alpha($str)) { // Add a random digit $str[mt_rand(0, $length - 1)] = chr(mt_rand(48, 57)); } elseif (ctype_digit($str)) { // Add a random letter $str[mt_rand(0, $length - 1)] = chr(mt_rand(65, 90)); } } return $str; } /** * Reduces multiple slashes in a string to single slashes. * * @param string string to reduce slashes of * @return string */ public static function reduce_slashes($str) { return preg_replace('#(? $badword) { $badwords[$key] = str_replace('\*', '\S*?', preg_quote((string) $badword)); } $regex = '('.implode('|', $badwords).')'; if ($replace_partial_words == TRUE) { // Just using \b isn't sufficient when we need to replace a badword that already contains word boundaries itself $regex = '(?<=\b|\s|^)'.$regex.'(?=\b|\s|$)'; } $regex = '!'.$regex.'!ui'; if (utf8::strlen($replacement) == 1) { $regex .= 'e'; return preg_replace($regex, 'str_repeat($replacement, utf8::strlen(\'$1\'))', $str); } return preg_replace($regex, $replacement, $str); } /** * Finds the text that is similar between a set of words. * * @param array words to find similar text of * @return string */ public static function similar(array $words) { // First word is the word to match against $word = current($words); for ($i = 0, $max = strlen($word); $i < $max; ++$i) { foreach ($words as $w) { // Once a difference is found, break out of the loops if ( ! isset($w[$i]) OR $w[$i] !== $word[$i]) break 2; } } // Return the similar text return substr($word, 0, $i); } /** * Converts text email addresses and anchors into links. * * @param string text to auto link * @return string */ public static function auto_link($text) { // Auto link emails first to prevent problems with "www.domain.com@example.com" return text::auto_link_urls(text::auto_link_emails($text)); } /** * Converts text anchors into links. * * @param string text to auto link * @return string */ public static function auto_link_urls($text) { // Finds all http/https/ftp/ftps links that are not part of an existing html anchor if (preg_match_all('~\b(?)(?:ht|f)tps?://\S+(?:/|\b)~i', $text, $matches)) { foreach ($matches[0] as $match) { // Replace each link with an anchor $text = str_replace($match, html::anchor($match), $text); } } // Find all naked www.links.com (without http://) if (preg_match_all('~\b(?|58;)(?!\.)[-+_a-z0-9.]++(? and
    markup to text. Basically nl2br() on steroids. * * @param string subject * @return string */ public static function auto_p($str) { // Trim whitespace if (($str = trim($str)) === '') return ''; // Standardize newlines $str = str_replace(array("\r\n", "\r"), "\n", $str); // Trim whitespace on each line $str = preg_replace('~^[ \t]+~m', '', $str); $str = preg_replace('~[ \t]+$~m', '', $str); // The following regexes only need to be executed if the string contains html if ($html_found = (strpos($str, '<') !== FALSE)) { // Elements that should not be surrounded by p tags $no_p = '(?:p|div|h[1-6r]|ul|ol|li|blockquote|d[dlt]|pre|t[dhr]|t(?:able|body|foot|head)|c(?:aption|olgroup)|form|s(?:elect|tyle)|a(?:ddress|rea)|ma(?:p|th))'; // Put at least two linebreaks before and after $no_p elements $str = preg_replace('~^<'.$no_p.'[^>]*+>~im', "\n$0", $str); $str = preg_replace('~$~im', "$0\n", $str); } // Do the

    magic! $str = '

    '.trim($str).'

    '; $str = preg_replace('~\n{2,}~', "

    \n\n

    ", $str); // The following regexes only need to be executed if the string contains html if ($html_found !== FALSE) { // Remove p tags around $no_p elements $str = preg_replace('~

    (?=]*+>)~i', '', $str); $str = preg_replace('~(]*+>)

    ~i', '$1', $str); } // Convert single linebreaks to
    $str = preg_replace('~(?\n", $str); return $str; } /** * Returns human readable sizes. * @see Based on original functions written by: * @see Aidan Lister: http://aidanlister.com/repos/v/function.size_readable.php * @see Quentin Zervaas: http://www.phpriot.com/d/code/strings/filesize-format/ * * @param integer size in bytes * @param string a definitive unit * @param string the return string format * @param boolean whether to use SI prefixes or IEC * @return string */ public static function bytes($bytes, $force_unit = NULL, $format = NULL, $si = TRUE) { // Format string $format = ($format === NULL) ? '%01.2f %s' : (string) $format; // IEC prefixes (binary) if ($si == FALSE OR strpos($force_unit, 'i') !== FALSE) { $units = array('B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB'); $mod = 1024; } // SI prefixes (decimal) else { $units = array('B', 'kB', 'MB', 'GB', 'TB', 'PB'); $mod = 1000; } // Determine unit to use if (($power = array_search((string) $force_unit, $units)) === FALSE) { $power = ($bytes > 0) ? floor(log($bytes, $mod)) : 0; } return sprintf($format, $bytes / pow($mod, $power), $units[$power]); } /** * Prevents widow words by inserting a non-breaking space between the last two words. * @see http://www.shauninman.com/archive/2006/08/22/widont_wordpress_plugin * * @param string string to remove widows from * @return string */ public static function widont($str) { $str = rtrim($str); $space = strrpos($str, ' '); if ($space !== FALSE) { $str = substr($str, 0, $space).' '.substr($str, $space + 1); } return $str; } } // End textpnp4nagios-0.6.16/lib/kohana/system/helpers/file.php0000664000000000000000000001173311662503006021017 0ustar rootroot 0); } /** * Compare the q values for given array of content types and return the one with the highest value. * If items are found to have the same q value, the first one encountered in the given array wins. * If all items in the given array have a q value of 0, FALSE is returned. * * @param array content types * @param boolean set to TRUE to disable wildcard checking * @return mixed string mime type with highest q value, FALSE if none of the given types are accepted */ public static function preferred_accept($types, $explicit_check = FALSE) { // Initialize $mime_types = array(); $max_q = 0; $preferred = FALSE; // Load q values for all given content types foreach (array_unique($types) as $type) { $mime_types[$type] = request::accepts_at_quality($type, $explicit_check); } // Look for the highest q value foreach ($mime_types as $type => $q) { if ($q > $max_q) { $max_q = $q; $preferred = $type; } } return $preferred; } /** * Returns quality factor at which the client accepts content type. * * @param string content type (e.g. "image/jpg", "jpg") * @param boolean set to TRUE to disable wildcard checking * @return integer|float */ public static function accepts_at_quality($type = NULL, $explicit_check = FALSE) { request::parse_accept_header(); // Normalize type $type = strtolower((string) $type); // General content type (e.g. "jpg") if (strpos($type, '/') === FALSE) { // Don't accept anything by default $q = 0; // Look up relevant mime types foreach ((array) Kohana::config('mimes.'.$type) as $type) { $q2 = request::accepts_at_quality($type, $explicit_check); $q = ($q2 > $q) ? $q2 : $q; } return $q; } // Content type with subtype given (e.g. "image/jpg") $type = explode('/', $type, 2); // Exact match if (isset(request::$accept_types[$type[0]][$type[1]])) return request::$accept_types[$type[0]][$type[1]]; // Wildcard match (if not checking explicitly) if ($explicit_check === FALSE AND isset(request::$accept_types[$type[0]]['*'])) return request::$accept_types[$type[0]]['*']; // Catch-all wildcard match (if not checking explicitly) if ($explicit_check === FALSE AND isset(request::$accept_types['*']['*'])) return request::$accept_types['*']['*']; // Content type not accepted return 0; } /** * Parses client's HTTP Accept request header, and builds array structure representing it. * * @return void */ protected static function parse_accept_header() { // Run this function just once if (request::$accept_types !== NULL) return; // Initialize accept_types array request::$accept_types = array(); // No HTTP Accept header found if (empty($_SERVER['HTTP_ACCEPT'])) { // Accept everything request::$accept_types['*']['*'] = 1; return; } // Remove linebreaks and parse the HTTP Accept header foreach (explode(',', str_replace(array("\r", "\n"), '', $_SERVER['HTTP_ACCEPT'])) as $accept_entry) { // Explode each entry in content type and possible quality factor $accept_entry = explode(';', trim($accept_entry), 2); // Explode each content type (e.g. "text/html") $type = explode('/', $accept_entry[0], 2); // Skip invalid content types if ( ! isset($type[1])) continue; // Assume a default quality factor of 1 if no custom q value found $q = (isset($accept_entry[1]) AND preg_match('~\bq\s*+=\s*+([.0-9]+)~', $accept_entry[1], $match)) ? (float) $match[1] : 1; // Populate accept_types array if ( ! isset(request::$accept_types[$type[0]][$type[1]]) OR $q > request::$accept_types[$type[0]][$type[1]]) { request::$accept_types[$type[0]][$type[1]] = $q; } } } } // End requestpnp4nagios-0.6.16/lib/kohana/system/helpers/security.php0000664000000000000000000000202711662503006021743 0ustar rootrootxss_clean($str); } /** * Remove image tags from a string. * * @param string string to sanitize * @return string */ public static function strip_image_tags($str) { return preg_replace('#\s]*)["\']?[^>]*)?>#is', '$1', $str); } /** * Remove PHP tags from a string. * * @param string string to sanitize * @return string */ public static function encode_php_tags($str) { return str_replace(array(''), array('<?', '?>'), $str); } } // End securitypnp4nagios-0.6.16/lib/kohana/system/helpers/feed.php0000664000000000000000000000616111662503006021002 0ustar rootrootchannel) ? $feed->xpath('//item') : $feed->entry; $i = 0; $items = array(); foreach ($feed as $item) { if ($limit > 0 AND $i++ === $limit) break; $items[] = (array) $item; } return $items; } /** * Creates a feed from the given parameters. * * @param array feed information * @param array items to add to the feed * @param string define which format to use * @param string define which encoding to use * @return string */ public static function create($info, $items, $format = 'rss2', $encoding = 'UTF-8') { $info += array('title' => 'Generated Feed', 'link' => '', 'generator' => 'KohanaPHP'); $feed = ''; $feed = simplexml_load_string($feed); foreach ($info as $name => $value) { if (($name === 'pubDate' OR $name === 'lastBuildDate') AND (is_int($value) OR ctype_digit($value))) { // Convert timestamps to RFC 822 formatted dates $value = date(DATE_RFC822, $value); } elseif (($name === 'link' OR $name === 'docs') AND strpos($value, '://') === FALSE) { // Convert URIs to URLs $value = url::site($value, 'http'); } // Add the info to the channel $feed->channel->addChild($name, $value); } foreach ($items as $item) { // Add the item to the channel $row = $feed->channel->addChild('item'); foreach ($item as $name => $value) { if ($name === 'pubDate' AND (is_int($value) OR ctype_digit($value))) { // Convert timestamps to RFC 822 formatted dates $value = date(DATE_RFC822, $value); } elseif (($name === 'link' OR $name === 'guid') AND strpos($value, '://') === FALSE) { // Convert URIs to URLs $value = url::site($value, 'http'); } // Add the info to the row $row->addChild($name, $value); } } return $feed->asXML(); } } // End feedpnp4nagios-0.6.16/lib/kohana/system/helpers/arr.php0000664000000000000000000001457111662503006020667 0ustar rootroot $value) { $value = ($keep_keys === TRUE) ? $value : array_values($value); foreach ($value as $k => $v) { $new_array[$k][$key] = $v; } } return $new_array; } /** * Removes a key from an array and returns the value. * * @param string key to return * @param array array to work on * @return mixed value of the requested array key */ public static function remove($key, & $array) { if ( ! array_key_exists($key, $array)) return NULL; $val = $array[$key]; unset($array[$key]); return $val; } /** * Extract one or more keys from an array. Each key given after the first * argument (the array) will be extracted. Keys that do not exist in the * search array will be NULL in the extracted data. * * @param array array to search * @param string key name * @return array */ public static function extract(array $search, $keys) { // Get the keys, removing the $search array $keys = array_slice(func_get_args(), 1); $found = array(); foreach ($keys as $key) { if (isset($search[$key])) { $found[$key] = $search[$key]; } else { $found[$key] = NULL; } } return $found; } /** * Because PHP does not have this function. * * @param array array to unshift * @param string key to unshift * @param mixed value to unshift * @return array */ public static function unshift_assoc( array & $array, $key, $val) { $array = array_reverse($array, TRUE); $array[$key] = $val; $array = array_reverse($array, TRUE); return $array; } /** * Because PHP does not have this function, and array_walk_recursive creates * references in arrays and is not truly recursive. * * @param mixed callback to apply to each member of the array * @param array array to map to * @return array */ public static function map_recursive($callback, array $array) { foreach ($array as $key => $val) { // Map the callback to the key $array[$key] = is_array($val) ? arr::map_recursive($callback, $val) : call_user_func($callback, $val); } return $array; } /** * @param mixed $needle the value to search for * @param array $haystack an array of values to search in * @param boolean $sort sort the array now * @return integer|FALSE the index of the match or FALSE when not found */ public static function binary_search($needle, $haystack, $sort = FALSE) { if ($sort) { sort($haystack); } $high = count($haystack) - 1; $low = 0; while ($low <= $high) { $mid = ($low + $high) >> 1; if ($haystack[$mid] < $needle) { $low = $mid + 1; } elseif ($haystack[$mid] > $needle) { $high = $mid - 1; } else { return $mid; } } return FALSE; } /** * Emulates array_merge_recursive, but appends numeric keys and replaces * associative keys, instead of appending all keys. * * @param array any number of arrays * @return array */ public static function merge() { $total = func_num_args(); $result = array(); for ($i = 0; $i < $total; $i++) { foreach (func_get_arg($i) as $key => $val) { if (isset($result[$key])) { if (is_array($val)) { // Arrays are merged recursively $result[$key] = arr::merge($result[$key], $val); } elseif (is_int($key)) { // Indexed arrays are appended array_push($result, $val); } else { // Associative arrays are replaced $result[$key] = $val; } } else { // New values are added $result[$key] = $val; } } } return $result; } /** * Overwrites an array with values from input array(s). * Non-existing keys will not be appended! * * @param array key array * @param array input array(s) that will overwrite key array values * @return array */ public static function overwrite($array1, $array2) { foreach (array_intersect_key($array2, $array1) as $key => $value) { $array1[$key] = $value; } if (func_num_args() > 2) { foreach (array_slice(func_get_args(), 2) as $array2) { foreach (array_intersect_key($array2, $array1) as $key => $value) { $array1[$key] = $value; } } } return $array1; } /** * Fill an array with a range of numbers. * * @param integer stepping * @param integer ending number * @return array */ public static function range($step = 10, $max = 100) { if ($step < 1) return array(); $array = array(); for ($i = $step; $i <= $max; $i += $step) { $array[$i] = $i; } return $array; } /** * Recursively convert an array to an object. * * @param array array to convert * @return object */ public static function to_object(array $array, $class = 'stdClass') { $object = new $class; foreach ($array as $key => $value) { if (is_array($value)) { // Convert the array to an object $value = arr::to_object($value, $class); } // Add the value to the object $object->{$key} = $value; } return $object; } } // End arr pnp4nagios-0.6.16/lib/kohana/system/helpers/valid.php0000664000000000000000000002114511662503006021175 0ustar rootroot= 0; $i -= 2) { // Add up every 2nd digit, starting from the right $checksum += $number[$i]; } for ($i = $length - 2; $i >= 0; $i -= 2) { // Add up every 2nd digit doubled, starting from the right $double = $number[$i] * 2; // Subtract 9 from the double where value is greater than 10 $checksum += ($double >= 10) ? $double - 9 : $double; } // If the checksum is a multiple of 10, the number is valid return ($checksum % 10 === 0); } /** * Checks if a phone number is valid. * * @param string phone number to check * @return boolean */ public static function phone($number, $lengths = NULL) { if ( ! is_array($lengths)) { $lengths = array(7,10,11); } // Remove all non-digit characters from the number $number = preg_replace('/\D+/', '', $number); // Check if the number is within range return in_array(strlen($number), $lengths); } /** * Tests if a string is a valid date string. * * @param string date to check * @return boolean */ public static function date($str) { return (strtotime($str) !== FALSE); } /** * Checks whether a string consists of alphabetical characters only. * * @param string input string * @param boolean trigger UTF-8 compatibility * @return boolean */ public static function alpha($str, $utf8 = FALSE) { return ($utf8 === TRUE) ? (bool) preg_match('/^\pL++$/uD', (string) $str) : ctype_alpha((string) $str); } /** * Checks whether a string consists of alphabetical characters and numbers only. * * @param string input string * @param boolean trigger UTF-8 compatibility * @return boolean */ public static function alpha_numeric($str, $utf8 = FALSE) { return ($utf8 === TRUE) ? (bool) preg_match('/^[\pL\pN]++$/uD', (string) $str) : ctype_alnum((string) $str); } /** * Checks whether a string consists of alphabetical characters, numbers, underscores and dashes only. * * @param string input string * @param boolean trigger UTF-8 compatibility * @return boolean */ public static function alpha_dash($str, $utf8 = FALSE) { return ($utf8 === TRUE) ? (bool) preg_match('/^[-\pL\pN_]++$/uD', (string) $str) : (bool) preg_match('/^[-a-z0-9_]++$/iD', (string) $str); } /** * Checks whether a string consists of digits only (no dots or dashes). * * @param string input string * @param boolean trigger UTF-8 compatibility * @return boolean */ public static function digit($str, $utf8 = FALSE) { return ($utf8 === TRUE) ? (bool) preg_match('/^\pN++$/uD', (string) $str) : ctype_digit((string) $str); } /** * Checks whether a string is a valid number (negative and decimal numbers allowed). * * @see Uses locale conversion to allow decimal point to be locale specific. * @see http://www.php.net/manual/en/function.localeconv.php * * @param string input string * @return boolean */ public static function numeric($str) { // Use localeconv to set the decimal_point value: Usually a comma or period. $locale = localeconv(); return (bool) preg_match('/^-?[0-9'.$locale['decimal_point'].']++$/D', (string) $str); } /** * Checks whether a string is a valid text. Letters, numbers, whitespace, * dashes, periods, and underscores are allowed. * * @param string text to check * @return boolean */ public static function standard_text($str) { // pL matches letters // pN matches numbers // pZ matches whitespace // pPc matches underscores // pPd matches dashes // pPo matches normal puncuation return (bool) preg_match('/^[\pL\pN\pZ\p{Pc}\p{Pd}\p{Po}]++$/uD', (string) $str); } /** * Checks if a string is a proper decimal format. The format array can be * used to specify a decimal length, or a number and decimal length, eg: * array(2) would force the number to have 2 decimal places, array(4,2) * would force the number to have 4 digits and 2 decimal places. * * @param string input string * @param array decimal format: y or x,y * @return boolean */ public static function decimal($str, $format = NULL) { // Create the pattern $pattern = '/^[0-9]%s\.[0-9]%s$/'; if ( ! empty($format)) { if (count($format) > 1) { // Use the format for number and decimal length $pattern = sprintf($pattern, '{'.$format[0].'}', '{'.$format[1].'}'); } elseif (count($format) > 0) { // Use the format as decimal length $pattern = sprintf($pattern, '+', '{'.$format[0].'}'); } } else { // No format $pattern = sprintf($pattern, '+', '+'); } return (bool) preg_match($pattern, (string) $str); } } // End valid pnp4nagios-0.6.16/contrib/0000775000000000000000000000000011662503006014025 5ustar rootrootpnp4nagios-0.6.16/contrib/ssi/0000775000000000000000000000000011662503006014623 5ustar rootrootpnp4nagios-0.6.16/contrib/ssi/status-header.ssi.in0000664000000000000000000000054311662503006020523 0ustar rootroot pnp4nagios-0.6.16/contrib/pnp4nagios.spec0000664000000000000000000000314111662503006016762 0ustar rootrootName: pnp4nagios Version: 0.6.7 Release: 1 License: GNU Public License version 2 Packager: Olivier Raginel Vendor: PNP4nagios team URL: http://pnp4nagios.org Prefix: /opt/pnp4nagios Source: http://github.com/Babar/pnp4nagios/tarball/%{name}-%{version}.tar.gz Group: Applications/Monitoring Requires: perl(Gearman::Worker), perl(Crypt::Rijndael) BuildRoot: %{_tmppath}/%{name}-%{version}-root-%(%{__id_u} -n) Summary: Gearman version of pnp4nagios Provides: pnp4nagios %description From the web page (http://docs.pnp4nagios.org/pnp-0.6/start): PNP is an addon to Nagios which analyzes performance data provided by plugins and stores them automatically into RRD-databases (Round Robin Databases, see RRD Tool). This is the version with support for Gearman, suitable to use with mod_gearman. %prep %setup -q %build ./configure --with-nagios-user=nagios \ --with-nagios-group=nagios \ --prefix=%{_prefix} \ --libdir=%{_libdir}/%{name} \ --sysconfdir=%{_sysconfdir}/%{name} \ --localstatedir=%{_localstatedir} \ --with-init-dir=%{_initrddir} \ --with-layout=debian %{__make} all %install rm -rf $RPM_BUILD_ROOT mkdir -p $RPM_BUILD_ROOT/%{_prefix} %{__make} install fullinstall DESTDIR=$RPM_BUILD_ROOT INIT_OPTS= INSTALL_OPTS= %clean rm -rf $RPM_BUILD_ROOT %post -p /sbin/ldconfig %postun -p /sbin/ldconfig %files %defattr(-,root,root) %docdir %{_defaultdocdir} %{_prefix} %{_sysconfdir} %defattr(-,nagios,root) %{_localstatedir} %changelog * Wed Oct 21 2010 Olivier Raginel - First build pnp4nagios-0.6.16/install-sh0000775000000000000000000002202111662503006014366 0ustar rootroot#!/bin/sh # install - install a program, script, or datafile scriptversion=2005-05-14.22 # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # 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 # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. It can only install one file at a time, a restriction # shared with many OS's install programs. # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" # put in absolute paths if you don't have them in your path; or use env. vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" chmodcmd="$chmodprog 0755" chowncmd= chgrpcmd= stripcmd= rmcmd="$rmprog -f" mvcmd="$mvprog" src= dst= dir_arg= dstarg= no_target_directory= usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: -c (ignored) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. --help display this help and exit. --version display version info and exit. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test -n "$1"; do case $1 in -c) shift continue;; -d) dir_arg=true shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; --help) echo "$usage"; exit $?;; -m) chmodcmd="$chmodprog $2" shift shift continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -s) stripcmd=$stripprog shift continue;; -t) dstarg=$2 shift shift continue;; -T) no_target_directory=true shift continue;; --version) echo "$0 $scriptversion"; exit $?;; *) # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. test -n "$dir_arg$dstarg" && break # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dstarg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dstarg" shift # fnord fi shift # arg dstarg=$arg done break;; esac done if test -z "$1"; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi for src do # Protect names starting with `-'. case $src in -*) src=./$src ;; esac if test -n "$dir_arg"; then dst=$src src= if test -d "$dst"; then mkdircmd=: chmodcmd= else mkdircmd=$mkdirprog fi else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dstarg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dstarg # Protect names starting with `-'. case $dst in -*) dst=./$dst ;; esac # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dstarg: Is a directory" >&2 exit 1 fi dst=$dst/`basename "$src"` fi fi # This sed command emulates the dirname command. dstdir=`echo "$dst" | sed -e 's,/*$,,;s,[^/]*$,,;s,/*$,,;s,^$,.,'` # Make sure that the destination directory exists. # Skip lots of stat calls in the usual case. if test ! -d "$dstdir"; then defaultIFS=' ' IFS="${IFS-$defaultIFS}" oIFS=$IFS # Some sh's can't handle IFS=/ for some reason. IFS='%' set x `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'` shift IFS=$oIFS pathcomp= while test $# -ne 0 ; do pathcomp=$pathcomp$1 shift if test ! -d "$pathcomp"; then $mkdirprog "$pathcomp" # mkdir can fail with a `File exist' error in case several # install-sh are creating the directory concurrently. This # is OK. test -d "$pathcomp" || exit fi pathcomp=$pathcomp/ done fi if test -n "$dir_arg"; then $doit $mkdircmd "$dst" \ && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \ && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \ && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \ && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; } else dstfile=`basename "$dst"` # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 trap '(exit $?); exit' 1 2 13 15 # Copy the file name to the temp name. $doit $cpprog "$src" "$dsttmp" && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \ && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \ && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \ && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } && # Now rename the file to the real destination. { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \ || { # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { if test -f "$dstdir/$dstfile"; then $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \ || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \ || { echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2 (exit 1); exit 1 } else : fi } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dstdir/$dstfile" } } fi || { (exit 1); exit 1; } done # The final little trick to "correctly" pass the exit status to the exit trap. { (exit 0); exit 0 } # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: pnp4nagios-0.6.16/.gitignore0000664000000000000000000000145611662503006014363 0ustar rootrootautom4te.cache subst summary *Makefile config.log config.status scripts/rc.npcd scripts/rc.pnp_gearman_worker scripts/check_pnp_rrds.pl scripts/process_perfdata.pl src/*.o src/npcd include/config.h *~ sample-config/pnp/config.php sample-config/pnp/pnp4nagios_release sample-config/pnp/process_perfdata.cfg-sample sample-config/pnp/npcd.cfg-sample sample-config/misccommands.cfg-sample sample-config/nagios.cfg-sample share/pnp/application/config/config.php share/pnp/index.php share/pnp/install.php sample-config/httpd.conf share/pnp/application/logs/* contrib/ssi/status-header.ssi helpers/w2h.pl helpers/wiki2html.sh scripts/verify_pnp_config.pl sample-config/lighttpd.pnp4nagios.conf sample-config/nginx.pnp4nagios.conf share/pnp/media/js/basket.js scripts/rrd_convert.pl scripts/rrd_converter.pl man/npcd.8 pnp4nagios-0.6.16/configure0000775000000000000000000060163311662503006014305 0ustar rootroot#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.61 for pnp 0.6.16. # # Report bugs to . # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi # PATH needs CR # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) as_nl=' ' IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 { (exit 1); exit 1; } fi # Work around bugs in pre-3.0 UWIN ksh. for as_var in ENV MAIL MAILPATH do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # Name of the executable. as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # CDPATH. $as_unset CDPATH if test "x$CONFIG_SHELL" = x; then if (eval ":") 2>/dev/null; then as_have_required=yes else as_have_required=no fi if test $as_have_required = yes && (eval ": (as_func_return () { (exit \$1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = \"\$1\" ); then : else exitcode=1 echo positional parameters were not saved. fi test \$exitcode = 0) || { (exit 1); exit 1; } ( as_lineno_1=\$LINENO as_lineno_2=\$LINENO test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } ") 2> /dev/null; then : else as_candidate_shells= as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. case $as_dir in /*) for as_base in sh bash ksh sh5; do as_candidate_shells="$as_candidate_shells $as_dir/$as_base" done;; esac done IFS=$as_save_IFS for as_shell in $as_candidate_shells $SHELL; do # Try only shells that exist, to save several forks. if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { ("$as_shell") 2> /dev/null <<\_ASEOF if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi : _ASEOF }; then CONFIG_SHELL=$as_shell as_have_required=yes if { "$as_shell" 2> /dev/null <<\_ASEOF if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi : (as_func_return () { (exit $1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = "$1" ); then : else exitcode=1 echo positional parameters were not saved. fi test $exitcode = 0) || { (exit 1); exit 1; } ( as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } _ASEOF }; then break fi fi done if test "x$CONFIG_SHELL" != x; then for as_var in BASH_ENV ENV do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done export CONFIG_SHELL exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} fi if test $as_have_required = no; then echo This script requires a shell more modern than all the echo shells that I found on your system. Please install a echo modern shell, or manually run the script under such a echo shell if you do have one. { (exit 1); exit 1; } fi fi fi (eval "as_func_return () { (exit \$1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = \"\$1\" ); then : else exitcode=1 echo positional parameters were not saved. fi test \$exitcode = 0") || { echo No shell found that supports shell functions. echo Please tell autoconf@gnu.org about your system, echo including any error possibly output before this echo message } as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line after each line using $LINENO; the second 'sed' # does the real work. The second script uses 'N' to pair each # line-number line with the line containing $LINENO, and appends # trailing '-' during substitution so that $LINENO is not a special # case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # scripts with optimization help from Paolo Bonzini. Blame Lee # E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in -n*) case `echo 'x\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. *) ECHO_C='\c';; esac;; *) ECHO_N='-n';; esac if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir fi echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= SHELL=${CONFIG_SHELL-/bin/sh} # Identity of this package. PACKAGE_NAME='pnp' PACKAGE_TARNAME='pnp' PACKAGE_VERSION='0.6.16' PACKAGE_STRING='pnp 0.6.16' PACKAGE_BUGREPORT='pnp4nagios-devel@lists.sourceforge.net' ac_unique_file="src/" ac_default_prefix=/usr/local/pnp4nagios # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datarootdir datadir sysconfdir sharedstatedir localstatedir includedir oldincludedir docdir infodir htmldir dvidir pdfdir psdir libdir localedir mandir DEFS ECHO_C ECHO_N ECHO_T LIBS build_alias host_alias target_alias PKG_NAME PKG_VERSION PKG_HOME_URL PKG_REL_DATE ac_configure_args XML_STRUCTURE_VERSION INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA INSTALL build build_cpu build_vendor build_os host host_cpu host_vendor host_os CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT SET_MAKE STRIP CP CPP GREP EGREP LIBOBJS KOHANA KOHANA_SYSTEM nagios_user nagios_grp INSTALL_OPTS PERL PERL_LIB_PATH RRDTOOL PERFDATA_LOG PERFDATA_DIR PERFDATA_SPOOL_DIR DEBUG HTTPD_CONF BASE_URL init_dir pnpsender_name npcd_name pp_pl_name MOD_CFLAGS MOD_LDFLAGS RRDS LTLIBOBJS' ac_subst_files='' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'` eval enable_$ac_feature=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'` eval enable_$ac_feature=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package | sed 's/[-.]/_/g'` eval with_$ac_package=\$ac_optarg ;; -without-* | --without-*) ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package | sed 's/[-.]/_/g'` eval with_$ac_package=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) { echo "$as_me: error: unrecognized option: $ac_option Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 { (exit 1); exit 1; }; } eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` { echo "$as_me: error: missing argument to $ac_option" >&2 { (exit 1); exit 1; }; } fi # Be sure to have absolute directory names. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; } done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used." >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || { echo "$as_me: error: Working directory cannot be determined" >&2 { (exit 1); exit 1; }; } test "X$ac_ls_di" = "X$ac_pwd_ls_di" || { echo "$as_me: error: pwd does not report name of working directory" >&2 { (exit 1); exit 1; }; } # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$0" || $as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$0" : 'X\(//\)[^/]' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || echo X"$0" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 { (exit 1); exit 1; }; } fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2 { (exit 1); exit 1; }; } pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures pnp 0.6.16 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/pnp] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of pnp 0.6.16:";; esac cat <<\_ACEOF Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-layout=\default,debian\ sets directory layout --without-kohana does not install the kohana framework --with-kohana_system= Points to an already installed kohana framework --with-nagios-user= sets user name to run nagios --with-nagios-group= sets group name to run nagios --with-perl_lib_path= sets path to rrdtool RRDs perl modules. --with-rrdtool= sets path to rrdtool --with-perfdata-logfile= Tell me where I should store the 'process_perfdata.pl' Logfile --with-perfdata-dir= Tell me where I should store the RRD Database Files --with-perfdata-spool-dir= Tell me where I should store perfdata files for bulk mode with npcd --with-debug Enable debuging for process_perfdata.pl --with-httpd-conf= sets path to Apache conf.d directory --with-base-url=/${PKG_NAME} --with-init-dir= sets directory to place init script into Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF pnp configure 0.6.16 generated by GNU Autoconf 2.61 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by pnp $as_me 0.6.16, which was generated by GNU Autoconf 2.61. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; 2) ac_configure_args1="$ac_configure_args1 '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac done done $as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } $as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo cat <<\_ASBOX ## ---------------- ## ## Cache variables. ## ## ---------------- ## _ASBOX echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( *) $as_unset $ac_var ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo cat <<\_ASBOX ## ----------------- ## ## Output variables. ## ## ----------------- ## _ASBOX echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then cat <<\_ASBOX ## ------------------- ## ## File substitutions. ## ## ------------------- ## _ASBOX echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then cat <<\_ASBOX ## ----------- ## ## confdefs.h. ## ## ----------- ## _ASBOX echo cat confdefs.h echo fi test "$ac_signal" != 0 && echo "$as_me: caught signal $ac_signal" echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer explicitly selected file to automatically selected ones. if test -n "$CONFIG_SITE"; then set x "$CONFIG_SITE" elif test "x$prefix" != xNONE; then set x "$prefix/share/config.site" "$prefix/etc/config.site" else set x "$ac_default_prefix/share/config.site" \ "$ac_default_prefix/etc/config.site" fi shift for ac_site_file do if test -r "$ac_site_file"; then { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special # files actually), so we avoid doing that. if test -f "$cache_file"; then { echo "$as_me:$LINENO: loading cache $cache_file" >&5 echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { echo "$as_me:$LINENO: creating cache $cache_file" >&5 echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 echo "$as_me: former value: $ac_old_val" >&2;} { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 echo "$as_me: current value: $ac_new_val" >&2;} ac_cache_corrupted=: fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 echo "$as_me: error: changes in the environment can compromise the build" >&2;} { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} { (exit 1); exit 1; }; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_config_headers="$ac_config_headers include/config.h:include/config.h.in" cat >>confdefs.h <<\_ACEOF #define DEFAULT_NAGIOS_USER nagios _ACEOF cat >>confdefs.h <<\_ACEOF #define DEFAULT_NAGIOS_GROUP nagios _ACEOF PKG_NAME=pnp4nagios PKG_VERSION="0.6.16" PKG_HOME_URL="http://www.pnp4nagios.org/pnp/start" PKG_REL_DATE="11-21-2011" XML_STRUCTURE_VERSION="4" ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5 echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;} { (exit 1); exit 1; }; } fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. { echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6; } if test -z "$INSTALL"; then if test "${ac_cv_path_install+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in ./ | .// | /cC/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi done done ;; esac done IFS=$as_save_IFS fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { echo "$as_me:$LINENO: result: $INSTALL" >&5 echo "${ECHO_T}$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' #dnl What OS are we running? # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || { { echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5 echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;} { (exit 1); exit 1; }; } { echo "$as_me:$LINENO: checking build system type" >&5 echo $ECHO_N "checking build system type... $ECHO_C" >&6; } if test "${ac_cv_build+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 echo "$as_me: error: cannot guess build type; you must specify one" >&2;} { (exit 1); exit 1; }; } ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5 echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;} { (exit 1); exit 1; }; } fi { echo "$as_me:$LINENO: result: $ac_cv_build" >&5 echo "${ECHO_T}$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) { { echo "$as_me:$LINENO: error: invalid value of canonical build" >&5 echo "$as_me: error: invalid value of canonical build" >&2;} { (exit 1); exit 1; }; };; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { echo "$as_me:$LINENO: checking host system type" >&5 echo $ECHO_N "checking host system type... $ECHO_C" >&6; } if test "${ac_cv_host+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5 echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;} { (exit 1); exit 1; }; } fi fi { echo "$as_me:$LINENO: result: $ac_cv_host" >&5 echo "${ECHO_T}$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) { { echo "$as_me:$LINENO: error: invalid value of canonical host" >&5 echo "$as_me: error: invalid value of canonical host" >&2;} { (exit 1); exit 1; }; };; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&5 echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&5 echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&5 echo "$as_me: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } # Provide some information about the compiler. echo "$as_me:$LINENO: checking for C compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (ac_try="$ac_compiler --version >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler --version >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -v >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler -v >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -V >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler -V >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6; } ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # # List of possible output files, starting from the most likely. # The algorithm is not robust to junk in `.', hence go to wildcards (a.*) # only as a last resort. b.out is created by i960 compilers. ac_files='a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out' # # The IRIX 6 linker writes into existing files which may not be # executable, retaining their permissions. Remove them first so a # subsequent execution test works. ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { (ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link_default") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi { echo "$as_me:$LINENO: result: $ac_file" >&5 echo "${ECHO_T}$ac_file" >&6; } if test -z "$ac_file"; then echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { echo "$as_me:$LINENO: error: C compiler cannot create executables See \`config.log' for more details." >&5 echo "$as_me: error: C compiler cannot create executables See \`config.log' for more details." >&2;} { (exit 77); exit 77; }; } fi ac_exeext=$ac_cv_exeext # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { echo "$as_me:$LINENO: checking whether the C compiler works" >&5 echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6; } # FIXME: These cross compiler hacks should be removed for Autoconf 3.0 # If not cross compiling, check that we can run a simple program. if test "$cross_compiling" != yes; then if { ac_try='./$ac_file' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { echo "$as_me:$LINENO: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&5 echo "$as_me: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi fi fi { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } rm -f a.out a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6; } { echo "$as_me:$LINENO: result: $cross_compiling" >&5 echo "${ECHO_T}$cross_compiling" >&6; } { echo "$as_me:$LINENO: checking for suffix of executables" >&5 echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6; } if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f conftest$ac_cv_exeext { echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 echo "${ECHO_T}$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT { echo "$as_me:$LINENO: checking for suffix of object files" >&5 echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6; } if test "${ac_cv_objext+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 echo "${ECHO_T}$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; } if test "${ac_cv_c_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_compiler_gnu=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; } GCC=`test $ac_compiler_gnu = yes && echo yes` ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; } if test "${ac_cv_prog_cc_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 CFLAGS="" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 echo "${ECHO_T}$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; } if test "${ac_cv_prog_cc_c89+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_c89=$ac_arg else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { echo "$as_me:$LINENO: result: none needed" >&5 echo "${ECHO_T}none needed" >&6; } ;; xno) { echo "$as_me:$LINENO: result: unsupported" >&5 echo "${ECHO_T}unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6; } set x ${MAKE-make}; ac_make=`echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } SET_MAKE= else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_path_STRIP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $STRIP in [\\/]* | ?:[\\/]*) ac_cv_path_STRIP="$STRIP" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_STRIP="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_STRIP" && ac_cv_path_STRIP="true" ;; esac fi STRIP=$ac_cv_path_STRIP if test -n "$STRIP"; then { echo "$as_me:$LINENO: result: $STRIP" >&5 echo "${ECHO_T}$STRIP" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi # Extract the first word of "cp", so it can be a program name with args. set dummy cp; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_path_CP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $CP in [\\/]* | ?:[\\/]*) ac_cv_path_CP="$CP" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_CP="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi CP=$ac_cv_path_CP if test -n "$CP"; then { echo "$as_me:$LINENO: result: $CP" >&5 echo "${ECHO_T}$CP" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi # Checks for libraries. # Checks for header files. ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if test "${ac_cv_prog_CPP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { echo "$as_me:$LINENO: result: $CPP" >&5 echo "${ECHO_T}$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&5 echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5 echo $ECHO_N "checking for grep that handles long lines and -e... $ECHO_C" >&6; } if test "${ac_cv_path_GREP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # Extract the first word of "grep ggrep" to use in msg output if test -z "$GREP"; then set dummy grep ggrep; ac_prog_name=$2 if test "${ac_cv_path_GREP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break ac_count=`expr $ac_count + 1` if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS fi GREP="$ac_cv_path_GREP" if test -z "$GREP"; then { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} { (exit 1); exit 1; }; } fi else ac_cv_path_GREP=$GREP fi fi { echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5 echo "${ECHO_T}$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { echo "$as_me:$LINENO: checking for egrep" >&5 echo $ECHO_N "checking for egrep... $ECHO_C" >&6; } if test "${ac_cv_path_EGREP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else # Extract the first word of "egrep" to use in msg output if test -z "$EGREP"; then set dummy egrep; ac_prog_name=$2 if test "${ac_cv_path_EGREP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break ac_count=`expr $ac_count + 1` if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS fi EGREP="$ac_cv_path_EGREP" if test -z "$EGREP"; then { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} { (exit 1); exit 1; }; } fi else ac_cv_path_EGREP=$EGREP fi fi fi { echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5 echo "${ECHO_T}$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { echo "$as_me:$LINENO: checking for ANSI C header files" >&5 echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6; } if test "${ac_cv_header_stdc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_header_stdc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF rm -f conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi fi { echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 echo "${ECHO_T}$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then cat >>confdefs.h <<\_ACEOF #define STDC_HEADERS 1 _ACEOF fi ac_header_dirent=no for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do as_ac_Header=`echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` { echo "$as_me:$LINENO: checking for $ac_hdr that defines DIR" >&5 echo $ECHO_N "checking for $ac_hdr that defines DIR... $ECHO_C" >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include <$ac_hdr> int main () { if ((DIR *) 0) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then eval "$as_ac_Header=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_Header=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi ac_res=`eval echo '${'$as_ac_Header'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_hdr" | $as_tr_cpp` 1 _ACEOF ac_header_dirent=$ac_hdr; break fi done # Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. if test $ac_header_dirent = dirent.h; then { echo "$as_me:$LINENO: checking for library containing opendir" >&5 echo $ECHO_N "checking for library containing opendir... $ECHO_C" >&6; } if test "${ac_cv_search_opendir+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_func_search_save_LIBS=$LIBS cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' dir; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_search_opendir=$ac_res else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext if test "${ac_cv_search_opendir+set}" = set; then break fi done if test "${ac_cv_search_opendir+set}" = set; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_search_opendir" >&5 echo "${ECHO_T}$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi else { echo "$as_me:$LINENO: checking for library containing opendir" >&5 echo $ECHO_N "checking for library containing opendir... $ECHO_C" >&6; } if test "${ac_cv_search_opendir+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_func_search_save_LIBS=$LIBS cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' x; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_search_opendir=$ac_res else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext if test "${ac_cv_search_opendir+set}" = set; then break fi done if test "${ac_cv_search_opendir+set}" = set; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_search_opendir" >&5 echo "${ECHO_T}$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi fi { echo "$as_me:$LINENO: checking for sys/wait.h that is POSIX.1 compatible" >&5 echo $ECHO_N "checking for sys/wait.h that is POSIX.1 compatible... $ECHO_C" >&6; } if test "${ac_cv_header_sys_wait_h+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #ifndef WEXITSTATUS # define WEXITSTATUS(stat_val) ((unsigned int) (stat_val) >> 8) #endif #ifndef WIFEXITED # define WIFEXITED(stat_val) (((stat_val) & 255) == 0) #endif int main () { int s; wait (&s); s = WIFEXITED (s) ? WEXITSTATUS (s) : 1; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_header_sys_wait_h=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_header_sys_wait_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_header_sys_wait_h" >&5 echo "${ECHO_T}$ac_cv_header_sys_wait_h" >&6; } if test $ac_cv_header_sys_wait_h = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_SYS_WAIT_H 1 _ACEOF fi #AC_CHECK_HEADERS(netinet/in.h string.h sys/socket.h unistd.h stdio.h stdlib.h getopt.h signal.h) # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` { echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then eval "$as_ac_Header=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_Header=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi ac_res=`eval echo '${'$as_ac_Header'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in dirent.h stdio.h errno.h unistd.h syslog.h signal.h stdlib.h dirent.h string.h pthread.h getopt.h grp.h pwd.h sys/mman.h sys/types.h sys/wait.h sys/stat.h sys/socket.h sys/loadavg.h netinet/in.h fcntl.h limits.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then { echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi ac_res=`eval echo '${'$as_ac_Header'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } else # Is the header compilable? { echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6; } # Is the header present? { echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext { echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ----------------------------------------------------- ## ## Report this to pnp4nagios-devel@lists.sourceforge.net ## ## ----------------------------------------------------- ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi ac_res=`eval echo '${'$as_ac_Header'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done # Checks for typedefs, structures, and compiler characteristics. { echo "$as_me:$LINENO: checking for pid_t" >&5 echo $ECHO_N "checking for pid_t... $ECHO_C" >&6; } if test "${ac_cv_type_pid_t+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default typedef pid_t ac__type_new_; int main () { if ((ac__type_new_ *) 0) return 0; if (sizeof (ac__type_new_)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_type_pid_t=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_pid_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_type_pid_t" >&5 echo "${ECHO_T}$ac_cv_type_pid_t" >&6; } if test $ac_cv_type_pid_t = yes; then : else cat >>confdefs.h <<_ACEOF #define pid_t int _ACEOF fi { echo "$as_me:$LINENO: checking return type of signal handlers" >&5 echo $ECHO_N "checking return type of signal handlers... $ECHO_C" >&6; } if test "${ac_cv_type_signal+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include int main () { return *(signal (0, 0)) (0) == 1; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_type_signal=int else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_signal=void fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_type_signal" >&5 echo "${ECHO_T}$ac_cv_type_signal" >&6; } cat >>confdefs.h <<_ACEOF #define RETSIGTYPE $ac_cv_type_signal _ACEOF { echo "$as_me:$LINENO: checking for uid_t in sys/types.h" >&5 echo $ECHO_N "checking for uid_t in sys/types.h... $ECHO_C" >&6; } if test "${ac_cv_type_uid_t+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "uid_t" >/dev/null 2>&1; then ac_cv_type_uid_t=yes else ac_cv_type_uid_t=no fi rm -f conftest* fi { echo "$as_me:$LINENO: result: $ac_cv_type_uid_t" >&5 echo "${ECHO_T}$ac_cv_type_uid_t" >&6; } if test $ac_cv_type_uid_t = no; then cat >>confdefs.h <<\_ACEOF #define uid_t int _ACEOF cat >>confdefs.h <<\_ACEOF #define gid_t int _ACEOF fi # Checks for structure members #AC_CHECK_MEMBER([struct dirent.d_type], [AC_MSG_RESULT([We successfully have a `dirent_d_type'!])], # [AC_MSG_ERROR([We need `dirent.d_type'!])], # [#include ]) { echo "$as_me:$LINENO: checking for struct dirent.d_type" >&5 echo $ECHO_N "checking for struct dirent.d_type... $ECHO_C" >&6; } if test "${ac_cv_member_struct_dirent_d_type+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #ifdef HAVE_DIRENT_H # include #else # define dirent direct # ifdef HAVE_SYS_NDIR_H # include # endif # ifdef HAVE_SYS_DIR_H # include # endif # ifdef HAVE_NDIR_H # include # endif #endif int main () { static struct dirent ac_aggr; if (ac_aggr.d_type) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_member_struct_dirent_d_type=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #ifdef HAVE_DIRENT_H # include #else # define dirent direct # ifdef HAVE_SYS_NDIR_H # include # endif # ifdef HAVE_SYS_DIR_H # include # endif # ifdef HAVE_NDIR_H # include # endif #endif int main () { static struct dirent ac_aggr; if (sizeof ac_aggr.d_type) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_member_struct_dirent_d_type=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_member_struct_dirent_d_type=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_member_struct_dirent_d_type" >&5 echo "${ECHO_T}$ac_cv_member_struct_dirent_d_type" >&6; } if test $ac_cv_member_struct_dirent_d_type = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_DIRENT_D_TYPE 1 _ACEOF fi # Checks for library functions. for ac_header in vfork.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then { echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi ac_res=`eval echo '${'$as_ac_Header'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } else # Is the header compilable? { echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6; } # Is the header present? { echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext { echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ----------------------------------------------------- ## ## Report this to pnp4nagios-devel@lists.sourceforge.net ## ## ----------------------------------------------------- ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi ac_res=`eval echo '${'$as_ac_Header'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in fork vfork do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` { echo "$as_me:$LINENO: checking for $ac_func" >&5 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$ac_func || defined __stub___$ac_func choke me #endif int main () { return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi ac_res=`eval echo '${'$as_ac_var'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done if test "x$ac_cv_func_fork" = xyes; then { echo "$as_me:$LINENO: checking for working fork" >&5 echo $ECHO_N "checking for working fork... $ECHO_C" >&6; } if test "${ac_cv_func_fork_works+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then ac_cv_func_fork_works=cross else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { /* By Ruediger Kuhlmann. */ return fork () < 0; ; return 0; } _ACEOF rm -f conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_fork_works=yes else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_func_fork_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi { echo "$as_me:$LINENO: result: $ac_cv_func_fork_works" >&5 echo "${ECHO_T}$ac_cv_func_fork_works" >&6; } else ac_cv_func_fork_works=$ac_cv_func_fork fi if test "x$ac_cv_func_fork_works" = xcross; then case $host in *-*-amigaos* | *-*-msdosdjgpp*) # Override, as these systems have only a dummy fork() stub ac_cv_func_fork_works=no ;; *) ac_cv_func_fork_works=yes ;; esac { echo "$as_me:$LINENO: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&5 echo "$as_me: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&2;} fi ac_cv_func_vfork_works=$ac_cv_func_vfork if test "x$ac_cv_func_vfork" = xyes; then { echo "$as_me:$LINENO: checking for working vfork" >&5 echo $ECHO_N "checking for working vfork... $ECHO_C" >&6; } if test "${ac_cv_func_vfork_works+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then ac_cv_func_vfork_works=cross else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Thanks to Paul Eggert for this test. */ $ac_includes_default #include #ifdef HAVE_VFORK_H # include #endif /* On some sparc systems, changes by the child to local and incoming argument registers are propagated back to the parent. The compiler is told about this with #include , but some compilers (e.g. gcc -O) don't grok . Test for this by using a static variable whose address is put into a register that is clobbered by the vfork. */ static void #ifdef __cplusplus sparc_address_test (int arg) # else sparc_address_test (arg) int arg; #endif { static pid_t child; if (!child) { child = vfork (); if (child < 0) { perror ("vfork"); _exit(2); } if (!child) { arg = getpid(); write(-1, "", 0); _exit (arg); } } } int main () { pid_t parent = getpid (); pid_t child; sparc_address_test (0); child = vfork (); if (child == 0) { /* Here is another test for sparc vfork register problems. This test uses lots of local variables, at least as many local variables as main has allocated so far including compiler temporaries. 4 locals are enough for gcc 1.40.3 on a Solaris 4.1.3 sparc, but we use 8 to be safe. A buggy compiler should reuse the register of parent for one of the local variables, since it will think that parent can't possibly be used any more in this routine. Assigning to the local variable will thus munge parent in the parent process. */ pid_t p = getpid(), p1 = getpid(), p2 = getpid(), p3 = getpid(), p4 = getpid(), p5 = getpid(), p6 = getpid(), p7 = getpid(); /* Convince the compiler that p..p7 are live; otherwise, it might use the same hardware register for all 8 local variables. */ if (p != p1 || p != p2 || p != p3 || p != p4 || p != p5 || p != p6 || p != p7) _exit(1); /* On some systems (e.g. IRIX 3.3), vfork doesn't separate parent from child file descriptors. If the child closes a descriptor before it execs or exits, this munges the parent's descriptor as well. Test for this by closing stdout in the child. */ _exit(close(fileno(stdout)) != 0); } else { int status; struct stat st; while (wait(&status) != child) ; return ( /* Was there some problem with vforking? */ child < 0 /* Did the child fail? (This shouldn't happen.) */ || status /* Did the vfork/compiler bug occur? */ || parent != getpid() /* Did the file descriptor bug occur? */ || fstat(fileno(stdout), &st) != 0 ); } } _ACEOF rm -f conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_vfork_works=yes else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_func_vfork_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi { echo "$as_me:$LINENO: result: $ac_cv_func_vfork_works" >&5 echo "${ECHO_T}$ac_cv_func_vfork_works" >&6; } fi; if test "x$ac_cv_func_fork_works" = xcross; then ac_cv_func_vfork_works=$ac_cv_func_vfork { echo "$as_me:$LINENO: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&5 echo "$as_me: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&2;} fi if test "x$ac_cv_func_vfork_works" = xyes; then cat >>confdefs.h <<\_ACEOF #define HAVE_WORKING_VFORK 1 _ACEOF else cat >>confdefs.h <<\_ACEOF #define vfork fork _ACEOF fi if test "x$ac_cv_func_fork_works" = xyes; then cat >>confdefs.h <<\_ACEOF #define HAVE_WORKING_FORK 1 _ACEOF fi for ac_func in bzero socket alarm strerror strspn getloadavg do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` { echo "$as_me:$LINENO: checking for $ac_func" >&5 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$ac_func || defined __stub___$ac_func choke me #endif int main () { return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi ac_res=`eval echo '${'$as_ac_var'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in stdlib.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then { echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi ac_res=`eval echo '${'$as_ac_Header'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } else # Is the header compilable? { echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6; } # Is the header present? { echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext { echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ----------------------------------------------------- ## ## Report this to pnp4nagios-devel@lists.sourceforge.net ## ## ----------------------------------------------------- ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi ac_res=`eval echo '${'$as_ac_Header'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done { echo "$as_me:$LINENO: checking for GNU libc compatible malloc" >&5 echo $ECHO_N "checking for GNU libc compatible malloc... $ECHO_C" >&6; } if test "${ac_cv_func_malloc_0_nonnull+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then ac_cv_func_malloc_0_nonnull=no else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #if defined STDC_HEADERS || defined HAVE_STDLIB_H # include #else char *malloc (); #endif int main () { return ! malloc (0); ; return 0; } _ACEOF rm -f conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_malloc_0_nonnull=yes else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_func_malloc_0_nonnull=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi { echo "$as_me:$LINENO: result: $ac_cv_func_malloc_0_nonnull" >&5 echo "${ECHO_T}$ac_cv_func_malloc_0_nonnull" >&6; } if test $ac_cv_func_malloc_0_nonnull = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_MALLOC 1 _ACEOF else cat >>confdefs.h <<\_ACEOF #define HAVE_MALLOC 0 _ACEOF case " $LIBOBJS " in *" malloc.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS malloc.$ac_objext" ;; esac cat >>confdefs.h <<\_ACEOF #define malloc rpl_malloc _ACEOF fi { echo "$as_me:$LINENO: checking whether lstat dereferences a symlink specified with a trailing slash" >&5 echo $ECHO_N "checking whether lstat dereferences a symlink specified with a trailing slash... $ECHO_C" >&6; } if test "${ac_cv_func_lstat_dereferences_slashed_symlink+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else rm -f conftest.sym conftest.file echo >conftest.file if test "$as_ln_s" = "ln -s" && ln -s conftest.file conftest.sym; then if test "$cross_compiling" = yes; then ac_cv_func_lstat_dereferences_slashed_symlink=no else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { struct stat sbuf; /* Linux will dereference the symlink and fail. That is better in the sense that it means we will not have to compile and use the lstat wrapper. */ return lstat ("conftest.sym/", &sbuf) == 0; ; return 0; } _ACEOF rm -f conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_lstat_dereferences_slashed_symlink=yes else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_func_lstat_dereferences_slashed_symlink=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi else # If the `ln -s' command failed, then we probably don't even # have an lstat function. ac_cv_func_lstat_dereferences_slashed_symlink=no fi rm -f conftest.sym conftest.file fi { echo "$as_me:$LINENO: result: $ac_cv_func_lstat_dereferences_slashed_symlink" >&5 echo "${ECHO_T}$ac_cv_func_lstat_dereferences_slashed_symlink" >&6; } test $ac_cv_func_lstat_dereferences_slashed_symlink = yes && cat >>confdefs.h <<_ACEOF #define LSTAT_FOLLOWS_SLASHED_SYMLINK 1 _ACEOF if test $ac_cv_func_lstat_dereferences_slashed_symlink = no; then case " $LIBOBJS " in *" lstat.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS lstat.$ac_objext" ;; esac fi { echo "$as_me:$LINENO: checking whether stat accepts an empty string" >&5 echo $ECHO_N "checking whether stat accepts an empty string... $ECHO_C" >&6; } if test "${ac_cv_func_stat_empty_string_bug+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then ac_cv_func_stat_empty_string_bug=yes else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { struct stat sbuf; return stat ("", &sbuf) == 0; ; return 0; } _ACEOF rm -f conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_stat_empty_string_bug=no else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_func_stat_empty_string_bug=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi { echo "$as_me:$LINENO: result: $ac_cv_func_stat_empty_string_bug" >&5 echo "${ECHO_T}$ac_cv_func_stat_empty_string_bug" >&6; } if test $ac_cv_func_stat_empty_string_bug = yes; then case " $LIBOBJS " in *" stat.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS stat.$ac_objext" ;; esac cat >>confdefs.h <<_ACEOF #define HAVE_STAT_EMPTY_STRING_BUG 1 _ACEOF fi { echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5 echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6; } if test "${ac_cv_c_const+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { /* FIXME: Include the comments suggested by Paul. */ #ifndef __cplusplus /* Ultrix mips cc rejects this. */ typedef int charset[2]; const charset cs; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this. */ char *t; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; }; struct s *b; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; if (!foo) return 0; } return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_c_const=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5 echo "${ECHO_T}$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then cat >>confdefs.h <<\_ACEOF #define const _ACEOF fi layout="default" # Check whether --with-layout was given. if test "${with_layout+set}" = set; then withval=$with_layout; layout=$withval fi case $layout in debian) prefix="/" sysconfdir="/etc/${PKG_NAME}" localstatedir="/var/log/${PKG_NAME}" libexecdir="/usr/lib/${PKG_NAME}/libexec" libdir="/usr/lib/${PKG_NAME}" datarootdir="/usr/share/${PKG_NAME}/html" PERFDATA_LOG="/var/log/${PKG_NAME}/perfdata.log" PERFDATA_DIR="/var/lib/${PKG_NAME}/perfdata" PERFDATA_SPOOL_DIR="/var/spool/${PKG_NAME}" bindir="/usr/bin" sbindir="/usr/sbin" ;; default-0.4) prefix="/usr/local/nagios" sysconfdir="\${prefix}/etc/pnp" localstatedir="\${prefix}/var" libexecdir="\${prefix}/libexec" datarootdir="\${prefix}/share/pnp" libdir="\${prefix}/lib/pnp" PERFDATA_LOG="\${prefix}/var/perfdata.log" PERFDATA_DIR="\${prefix}/share/perfdata" PERFDATA_SPOOL_DIR="\${prefix}/var/spool/perfdata" ;; default) PERFDATA_LOG="${localstatedir}/perfdata.log" PERFDATA_DIR="${localstatedir}/perfdata" PERFDATA_SPOOL_DIR="${localstatedir}/spool" mandir="\${prefix}/man" ;; esac # Check whether --with-kohana was given. if test "${with_kohana+set}" = set; then withval=$with_kohana; KOHANA=no else KOHANA=yes fi # Check whether --with-kohana_system was given. if test "${with_kohana_system+set}" = set; then withval=$with_kohana_system; KOHANA_SYSTEM=$withval else KOHANA_SYSTEM=$libdir/kohana/system fi # Check whether --with-nagios_user was given. if test "${with_nagios_user+set}" = set; then withval=$with_nagios_user; nagios_user=$withval else nagios_user=nagios fi # Check whether --with-nagios_group was given. if test "${with_nagios_group+set}" = set; then withval=$with_nagios_group; nagios_grp=$withval else nagios_grp=nagios fi cat >>confdefs.h <<_ACEOF #define DEFAULT_NAGIOS_USER "$nagios_user" _ACEOF cat >>confdefs.h <<_ACEOF #define DEFAULT_NAGIOS_GROUP "$nagios_grp" _ACEOF INSTALL_OPTS="-o $nagios_user -g $nagios_grp" # Checks for programs. # Extract the first word of "perl", so it can be a program name with args. set dummy perl; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_path_PERL+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $PERL in [\\/]* | ?:[\\/]*) ac_cv_path_PERL="$PERL" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_PERL="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PERL=$ac_cv_path_PERL if test -n "$PERL"; then { echo "$as_me:$LINENO: result: $PERL" >&5 echo "${ECHO_T}$PERL" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi # Check for Perl lib path PERL_LIB_PATH=no # Check whether --with-perl_lib_path was given. if test "${with_perl_lib_path+set}" = set; then withval=$with_perl_lib_path; PERL_LIB_PATH=$withval else PERL_LIB_PATH=no fi # Check for rrdtool RRDTOOL=no # Check whether --with-rrdtool was given. if test "${with_rrdtool+set}" = set; then withval=$with_rrdtool; RRDTOOL=$withval else RRDTOOL=no fi if test RRDTOOL=no; then # Extract the first word of "rrdtool", so it can be a program name with args. set dummy rrdtool; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_path_RRDTOOL+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $RRDTOOL in [\\/]* | ?:[\\/]*) ac_cv_path_RRDTOOL="$RRDTOOL" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_RRDTOOL="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi RRDTOOL=$ac_cv_path_RRDTOOL if test -n "$RRDTOOL"; then { echo "$as_me:$LINENO: result: $RRDTOOL" >&5 echo "${ECHO_T}$RRDTOOL" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi fi { echo "$as_me:$LINENO: checking rrdtool path $RRDTOOL" >&5 echo $ECHO_N "checking rrdtool path $RRDTOOL... $ECHO_C" >&6; } if test -d $RRDTOOL ;then { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } { { echo "$as_me:$LINENO: error: $RRDTOOL is a directory! PNP needs the Path to the rrdtool binary!" >&5 echo "$as_me: error: $RRDTOOL is a directory! PNP needs the Path to the rrdtool binary!" >&2;} { (exit 1); exit 1; }; } fi { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } { echo "$as_me:$LINENO: checking for executable Bit on $RRDTOOL" >&5 echo $ECHO_N "checking for executable Bit on $RRDTOOL... $ECHO_C" >&6; } if ! test -x $RRDTOOL ;then { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } { { echo "$as_me:$LINENO: error: $RRDTOOL is not executable!" >&5 echo "$as_me: error: $RRDTOOL is not executable!" >&2;} { (exit 1); exit 1; }; } fi { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } # Check whether --with-perfdata-logfile was given. if test "${with_perfdata_logfile+set}" = set; then withval=$with_perfdata_logfile; PERFDATA_LOG=$withval fi # Check whether --with-perfdata-dir was given. if test "${with_perfdata_dir+set}" = set; then withval=$with_perfdata_dir; PERFDATA_DIR=$withval fi # Check whether --with-perfdata-spool-dir was given. if test "${with_perfdata_spool_dir+set}" = set; then withval=$with_perfdata_spool_dir; PERFDATA_SPOOL_DIR=$withval fi # Check whether --with-debug was given. if test "${with_debug+set}" = set; then withval=$with_debug; DEBUG="2" else DEBUG="0" fi HTTP_CONF=no # Check whether --with-httpd_conf was given. if test "${with_httpd_conf+set}" = set; then withval=$with_httpd_conf; HTTPD_CONF=$withval else HTTPD_CONF=no fi if test x$HTTPD_CONF = xno; then if test -d /etc/httpd/conf.d; then HTTPD_CONF="/etc/httpd/conf.d" elif test -d /etc/apache2/conf.d; then HTTPD_CONF="/etc/apache2/conf.d" elif test -d /etc/apache/conf.d; then HTTPD_CONF="/etc/apache/conf.d" else HTTPD_CONF="/etc/httpd/conf.d" fi fi init_dir=/etc/rc.d/init.d if test -d /etc/rc.d/init.d; then init_dir="/etc/rc.d/init.d" elif test -d /usr/local/etc/rc.d; then init_dir="/usr/local/etc/rc.d" elif test -d /etc/rc.d; then init_dir="/etc/rc.d" elif test -d /etc/init.d; then init_dir="/etc/init.d" elif test -d /sbin/init.d; then init_dir="/sbin/init.d" fi BASE_URL=${PKG_NAME} # Check whether --with-base-url was given. if test "${with_base_url+set}" = set; then withval=$with_base_url; BASE_URL=$withval else BASE_URL=/${PKG_NAME} fi # Check whether --with-init_dir was given. if test "${with_init_dir+set}" = set; then withval=$with_init_dir; init_dir=$withval fi pnpsender_name=pnpsender npcd_name=npcd pp_pl_name=process_perfdata.pl { echo "$as_me:$LINENO: checking for linker flags for loadable modules" >&5 echo $ECHO_N "checking for linker flags for loadable modules... $ECHO_C" >&6; } case $host_os in solaris2*|sysv4*) MOD_LDFLAGS="-G" ;; aix4*|aix5*) #MOD_LDFLAGS="-G -bnoentry -bexpall" MOD_LDFLAGS="-shared -Wl,-G -Wl,-bM:SRE -Wl,-bnoentry -Wl,-bexpall" ;; freebsd2*) # Non-ELF GNU linker MOD_LDFLAGS="-Bshareable" ;; darwin*) # Mach-O linker, a shared lib and a loadable # object file is not the same thing. MOD_LDFLAGS="-bundle -flat_namespace -undefined suppress" MOD_CFLAGS="$MOD_CFLAGS -fno-common" ;; linux* | k*bsd*-gnu*) # assume GNU linker and ELF MOD_LDFLAGS="-shared" MOD_CFLAGS="-fPIC" ;; *) # assume GNU linker and ELF MOD_LDFLAGS="-shared" ;; esac { echo "$as_me:$LINENO: result: $MOD_LDFLAGS" >&5 echo "${ECHO_T}$MOD_LDFLAGS" >&6; } # # Checking for Perl Modules # { echo "$as_me:$LINENO: checking for Perl Module Time::HiRes" >&5 echo $ECHO_N "checking for Perl Module Time::HiRes... $ECHO_C" >&6; } $PERL -MTime::HiRes -e exit >/dev/null 2>&1 if test $? -ne 0; then { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } { { echo "$as_me:$LINENO: error: Perl Module Time::HiRes not available" >&5 echo "$as_me: error: Perl Module Time::HiRes not available" >&2;} { (exit 1); exit 1; }; } else { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } fi { echo "$as_me:$LINENO: checking for Perl Module Getopt::Long" >&5 echo $ECHO_N "checking for Perl Module Getopt::Long... $ECHO_C" >&6; } $PERL -MGetopt::Long -e exit >/dev/null 2>&1 if test $? -ne 0; then { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } { { echo "$as_me:$LINENO: error: Perl Module Getopt::Long not available" >&5 echo "$as_me: error: Perl Module Getopt::Long not available" >&2;} { (exit 1); exit 1; }; } else { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } fi RRDS=0 { echo "$as_me:$LINENO: checking for optional Perl Module RRDs" >&5 echo $ECHO_N "checking for optional Perl Module RRDs... $ECHO_C" >&6; } $PERL -I${PERL_LIB_PATH} -MRRDs -e exit >/dev/null 2>&1 if test $? -ne 0; then { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } { echo "$as_me:$LINENO: WARNING: Perl Module RRDs not available" >&5 echo "$as_me: WARNING: Perl Module RRDs not available" >&2;} RRDS=0 else { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } RRDS=1 fi ac_config_files="$ac_config_files subst Makefile share/Makefile lib/Makefile scripts/Makefile src/Makefile sample-config/Makefile man/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( *) $as_unset $ac_var ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes (double-quote # substitution turns \\\\ into \\, and sed turns \\ into \). sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then test "x$cache_file" != "x/dev/null" && { echo "$as_me:$LINENO: updating cache $cache_file" >&5 echo "$as_me: updating cache $cache_file" >&6;} cat confcache >$cache_file else { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : ${CONFIG_STATUS=./config.status} ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 echo "$as_me: creating $CONFIG_STATUS" >&6;} cat >$CONFIG_STATUS <<_ACEOF #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi # PATH needs CR # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) as_nl=' ' IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 { (exit 1); exit 1; } fi # Work around bugs in pre-3.0 UWIN ksh. for as_var in ENV MAIL MAILPATH do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # Name of the executable. as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # CDPATH. $as_unset CDPATH as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line after each line using $LINENO; the second 'sed' # does the real work. The second script uses 'N' to pair each # line-number line with the line containing $LINENO, and appends # trailing '-' during substitution so that $LINENO is not a special # case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # scripts with optimization help from Paolo Bonzini. Blame Lee # E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in -n*) case `echo 'x\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. *) ECHO_C='\c';; esac;; *) ECHO_N='-n';; esac if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir fi echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 # Save the log message, to keep $[0] and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by pnp $as_me 0.6.16, which was generated by GNU Autoconf 2.61. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF cat >>$CONFIG_STATUS <<_ACEOF # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF ac_cs_usage="\ \`$as_me' instantiates files from templates according to the current configuration. Usage: $0 [OPTIONS] [FILE]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ pnp config.status 0.6.16 configured by $0, generated by GNU Autoconf 2.61, with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" Copyright (C) 2006 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # If no file are specified by the user, then we need to provide default # value. By we need to know if files were specified by the user. ac_need_defaults=: while test $# != 0 do case $1 in --*=*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) echo "$ac_cs_version"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift CONFIG_FILES="$CONFIG_FILES $ac_optarg" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header { echo "$as_me: error: ambiguous option: $1 Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; };; --help | --hel | -h ) echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) { echo "$as_me: error: unrecognized option: $1 Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *) ac_config_targets="$ac_config_targets $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF if \$ac_cs_recheck; then echo "running CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 CONFIG_SHELL=$SHELL export CONFIG_SHELL exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "include/config.h") CONFIG_HEADERS="$CONFIG_HEADERS include/config.h:include/config.h.in" ;; "subst") CONFIG_FILES="$CONFIG_FILES subst" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "share/Makefile") CONFIG_FILES="$CONFIG_FILES share/Makefile" ;; "lib/Makefile") CONFIG_FILES="$CONFIG_FILES lib/Makefile" ;; "scripts/Makefile") CONFIG_FILES="$CONFIG_FILES scripts/Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "sample-config/Makefile") CONFIG_FILES="$CONFIG_FILES sample-config/Makefile" ;; "man/Makefile") CONFIG_FILES="$CONFIG_FILES man/Makefile" ;; *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 echo "$as_me: error: invalid argument: $ac_config_target" >&2;} { (exit 1); exit 1; }; };; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= trap 'exit_status=$? { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status ' 0 trap '{ (exit 1); exit 1; }' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || { echo "$me: cannot create a temporary directory in ." >&2 { (exit 1); exit 1; } } # # Set up the sed scripts for CONFIG_FILES section. # # No need to generate the scripts if there are no CONFIG_FILES. # This happens for instance when ./config.status config.h if test -n "$CONFIG_FILES"; then _ACEOF ac_delim='%!_!# ' for ac_last_try in false false false false false :; do cat >conf$$subs.sed <<_ACEOF SHELL!$SHELL$ac_delim PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim PACKAGE_NAME!$PACKAGE_NAME$ac_delim PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim PACKAGE_STRING!$PACKAGE_STRING$ac_delim PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim exec_prefix!$exec_prefix$ac_delim prefix!$prefix$ac_delim program_transform_name!$program_transform_name$ac_delim bindir!$bindir$ac_delim sbindir!$sbindir$ac_delim libexecdir!$libexecdir$ac_delim datarootdir!$datarootdir$ac_delim datadir!$datadir$ac_delim sysconfdir!$sysconfdir$ac_delim sharedstatedir!$sharedstatedir$ac_delim localstatedir!$localstatedir$ac_delim includedir!$includedir$ac_delim oldincludedir!$oldincludedir$ac_delim docdir!$docdir$ac_delim infodir!$infodir$ac_delim htmldir!$htmldir$ac_delim dvidir!$dvidir$ac_delim pdfdir!$pdfdir$ac_delim psdir!$psdir$ac_delim libdir!$libdir$ac_delim localedir!$localedir$ac_delim mandir!$mandir$ac_delim DEFS!$DEFS$ac_delim ECHO_C!$ECHO_C$ac_delim ECHO_N!$ECHO_N$ac_delim ECHO_T!$ECHO_T$ac_delim LIBS!$LIBS$ac_delim build_alias!$build_alias$ac_delim host_alias!$host_alias$ac_delim target_alias!$target_alias$ac_delim PKG_NAME!$PKG_NAME$ac_delim PKG_VERSION!$PKG_VERSION$ac_delim PKG_HOME_URL!$PKG_HOME_URL$ac_delim PKG_REL_DATE!$PKG_REL_DATE$ac_delim ac_configure_args!$ac_configure_args$ac_delim XML_STRUCTURE_VERSION!$XML_STRUCTURE_VERSION$ac_delim INSTALL_PROGRAM!$INSTALL_PROGRAM$ac_delim INSTALL_SCRIPT!$INSTALL_SCRIPT$ac_delim INSTALL_DATA!$INSTALL_DATA$ac_delim INSTALL!$INSTALL$ac_delim build!$build$ac_delim build_cpu!$build_cpu$ac_delim build_vendor!$build_vendor$ac_delim build_os!$build_os$ac_delim host!$host$ac_delim host_cpu!$host_cpu$ac_delim host_vendor!$host_vendor$ac_delim host_os!$host_os$ac_delim CC!$CC$ac_delim CFLAGS!$CFLAGS$ac_delim LDFLAGS!$LDFLAGS$ac_delim CPPFLAGS!$CPPFLAGS$ac_delim ac_ct_CC!$ac_ct_CC$ac_delim EXEEXT!$EXEEXT$ac_delim OBJEXT!$OBJEXT$ac_delim SET_MAKE!$SET_MAKE$ac_delim STRIP!$STRIP$ac_delim CP!$CP$ac_delim CPP!$CPP$ac_delim GREP!$GREP$ac_delim EGREP!$EGREP$ac_delim LIBOBJS!$LIBOBJS$ac_delim KOHANA!$KOHANA$ac_delim KOHANA_SYSTEM!$KOHANA_SYSTEM$ac_delim nagios_user!$nagios_user$ac_delim nagios_grp!$nagios_grp$ac_delim INSTALL_OPTS!$INSTALL_OPTS$ac_delim PERL!$PERL$ac_delim PERL_LIB_PATH!$PERL_LIB_PATH$ac_delim RRDTOOL!$RRDTOOL$ac_delim PERFDATA_LOG!$PERFDATA_LOG$ac_delim PERFDATA_DIR!$PERFDATA_DIR$ac_delim PERFDATA_SPOOL_DIR!$PERFDATA_SPOOL_DIR$ac_delim DEBUG!$DEBUG$ac_delim HTTPD_CONF!$HTTPD_CONF$ac_delim BASE_URL!$BASE_URL$ac_delim init_dir!$init_dir$ac_delim pnpsender_name!$pnpsender_name$ac_delim npcd_name!$npcd_name$ac_delim pp_pl_name!$pp_pl_name$ac_delim MOD_CFLAGS!$MOD_CFLAGS$ac_delim MOD_LDFLAGS!$MOD_LDFLAGS$ac_delim RRDS!$RRDS$ac_delim LTLIBOBJS!$LTLIBOBJS$ac_delim _ACEOF if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 91; then break elif $ac_last_try; then { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} { (exit 1); exit 1; }; } else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed` if test -n "$ac_eof"; then ac_eof=`echo "$ac_eof" | sort -nru | sed 1q` ac_eof=`expr $ac_eof + 1` fi cat >>$CONFIG_STATUS <<_ACEOF cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof /@[a-zA-Z_][a-zA-Z_0-9]*@/!b end _ACEOF sed ' s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g s/^/s,@/; s/!/@,|#_!!_#|/ :n t n s/'"$ac_delim"'$/,g/; t s/$/\\/; p N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n ' >>$CONFIG_STATUS >$CONFIG_STATUS <<_ACEOF :end s/|#_!!_#|//g CEOF$ac_eof _ACEOF # VPATH may cause trouble with some makes, so we remove $(srcdir), # ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=/{ s/:*\$(srcdir):*/:/ s/:*\${srcdir}:*/:/ s/:*@srcdir@:*/:/ s/^\([^=]*=[ ]*\):*/\1/ s/:*$// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF fi # test -n "$CONFIG_FILES" for ac_tag in :F $CONFIG_FILES :H $CONFIG_HEADERS do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5 echo "$as_me: error: Invalid tag $ac_tag." >&2;} { (exit 1); exit 1; }; };; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 echo "$as_me: error: cannot find input file: $ac_f" >&2;} { (exit 1); exit 1; }; };; esac ac_file_inputs="$ac_file_inputs $ac_f" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input="Generated from "`IFS=: echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure." if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { echo "$as_me:$LINENO: creating $ac_file" >&5 echo "$as_me: creating $ac_file" >&6;} fi case $ac_tag in *:-:* | *:-) cat >"$tmp/stdin";; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` { as_dir="$ac_dir" case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 echo "$as_me: error: cannot create directory $as_dir" >&2;} { (exit 1); exit 1; }; }; } ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= case `sed -n '/datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p ' $ac_file_inputs` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF sed "$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s&@configure_input@&$configure_input&;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t $ac_datarootdir_hack " $ac_file_inputs | sed -f "$tmp/subs-1.sed" >$tmp/out test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined." >&5 echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined." >&2;} rm -f "$tmp/stdin" case $ac_file in -) cat "$tmp/out"; rm -f "$tmp/out";; *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;; esac ;; :H) # # CONFIG_HEADER # _ACEOF # Transform confdefs.h into a sed script `conftest.defines', that # substitutes the proper values into config.h.in to produce config.h. rm -f conftest.defines conftest.tail # First, append a space to every undef/define line, to ease matching. echo 's/$/ /' >conftest.defines # Then, protect against being on the right side of a sed subst, or in # an unquoted here document, in config.status. If some macros were # called several times there might be several #defines for the same # symbol, which is useless. But do not sort them, since the last # AC_DEFINE must be honored. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* # These sed commands are passed to sed as "A NAME B PARAMS C VALUE D", where # NAME is the cpp macro being defined, VALUE is the value it is being given. # PARAMS is the parameter list in the macro definition--in most cases, it's # just an empty string. ac_dA='s,^\\([ #]*\\)[^ ]*\\([ ]*' ac_dB='\\)[ (].*,\\1define\\2' ac_dC=' ' ac_dD=' ,' uniq confdefs.h | sed -n ' t rset :rset s/^[ ]*#[ ]*define[ ][ ]*// t ok d :ok s/[\\&,]/\\&/g s/^\('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/ '"$ac_dA"'\1'"$ac_dB"'\2'"${ac_dC}"'\3'"$ac_dD"'/p s/^\('"$ac_word_re"'\)[ ]*\(.*\)/'"$ac_dA"'\1'"$ac_dB$ac_dC"'\2'"$ac_dD"'/p ' >>conftest.defines # Remove the space that was appended to ease matching. # Then replace #undef with comments. This is necessary, for # example, in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. # (The regexp can be short, since the line contains either #define or #undef.) echo 's/ $// s,^[ #]*u.*,/* & */,' >>conftest.defines # Break up conftest.defines: ac_max_sed_lines=50 # First sed command is: sed -f defines.sed $ac_file_inputs >"$tmp/out1" # Second one is: sed -f defines.sed "$tmp/out1" >"$tmp/out2" # Third one will be: sed -f defines.sed "$tmp/out2" >"$tmp/out1" # et cetera. ac_in='$ac_file_inputs' ac_out='"$tmp/out1"' ac_nxt='"$tmp/out2"' while : do # Write a here document: cat >>$CONFIG_STATUS <<_ACEOF # First, check the format of the line: cat >"\$tmp/defines.sed" <<\\CEOF /^[ ]*#[ ]*undef[ ][ ]*$ac_word_re[ ]*\$/b def /^[ ]*#[ ]*define[ ][ ]*$ac_word_re[( ]/b def b :def _ACEOF sed ${ac_max_sed_lines}q conftest.defines >>$CONFIG_STATUS echo 'CEOF sed -f "$tmp/defines.sed"' "$ac_in >$ac_out" >>$CONFIG_STATUS ac_in=$ac_out; ac_out=$ac_nxt; ac_nxt=$ac_in sed 1,${ac_max_sed_lines}d conftest.defines >conftest.tail grep . conftest.tail >/dev/null || break rm -f conftest.defines mv conftest.tail conftest.defines done rm -f conftest.defines conftest.tail echo "ac_result=$ac_in" >>$CONFIG_STATUS cat >>$CONFIG_STATUS <<\_ACEOF if test x"$ac_file" != x-; then echo "/* $configure_input */" >"$tmp/config.h" cat "$ac_result" >>"$tmp/config.h" if diff $ac_file "$tmp/config.h" >/dev/null 2>&1; then { echo "$as_me:$LINENO: $ac_file is unchanged" >&5 echo "$as_me: $ac_file is unchanged" >&6;} else rm -f $ac_file mv "$tmp/config.h" $ac_file fi else echo "/* $configure_input */" cat "$ac_result" fi rm -f "$tmp/out12" ;; esac done # for ac_tag { (exit 0); exit 0; } _ACEOF chmod +x $CONFIG_STATUS ac_clean_files=$ac_clean_files_save # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || { (exit 1); exit 1; } fi $PERL subst summary $PERL subst scripts/process_perfdata.pl $PERL subst scripts/rrd_convert.pl $PERL subst scripts/rc.npcd $PERL subst scripts/rc.pnp_gearman_worker $PERL subst scripts/check_pnp_rrds.pl $PERL subst share/pnp/index.php $PERL subst share/pnp/install.php $PERL subst sample-config/httpd.conf $PERL subst sample-config/lighttpd.pnp4nagios.conf $PERL subst sample-config/nginx.pnp4nagios.conf $PERL subst sample-config/nagios.cfg-sample $PERL subst sample-config/misccommands.cfg-sample $PERL subst sample-config/pnp/config.php $PERL subst sample-config/pnp/npcd.cfg-sample $PERL subst sample-config/pnp/process_perfdata.cfg-sample $PERL subst sample-config/pnp/pnp4nagios_release $PERL subst contrib/ssi/status-header.ssi $PERL subst helpers/w2h.pl $PERL subst man/npcd.8 $PERL summary pnp4nagios-0.6.16/config.guess0000775000000000000000000012753411662503006014721 0ustar rootroot#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 # Free Software Foundation, Inc. timestamp='2008-01-23' # This file 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 2 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, write to the Free Software # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Per Bothner . # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # The plan is that this can be called by configure scripts if you # don't specify an explicit build system type. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep __ELF__ >/dev/null then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` exit ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm:riscos:*:*|arm:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[456]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep __LP64__ >/dev/null then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) case ${UNAME_MACHINE} in pc98) echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:[3456]*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; EM64T | authenticamd) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-gnu else echo ${UNAME_MACHINE}-unknown-linux-gnueabi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; cris:Linux:*:*) echo cris-axis-linux-gnu exit ;; crisv32:Linux:*:*) echo crisv32-axis-linux-gnu exit ;; frv:Linux:*:*) echo frv-unknown-linux-gnu exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; mips:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips #undef mipsel #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mipsel #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips #else CPU= #endif #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^CPU/{ s: ::g p }'`" test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips64 #undef mips64el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mips64el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips64 #else CPU= #endif #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^CPU/{ s: ::g p }'`" test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; or32:Linux:*:*) echo or32-unknown-linux-gnu exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-gnu exit ;; x86_64:Linux:*:*) echo x86_64-unknown-linux-gnu exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; i*86:Linux:*:*) # The BFD linker knows what the default object file format is, so # first see if it will tell us. cd to the root directory to prevent # problems with other programs or directories called `ld' in the path. # Set LC_ALL=C to ensure ld outputs messages in English. ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ | sed -ne '/supported targets:/!d s/[ ][ ]*/ /g s/.*supported targets: *// s/ .*// p'` case "$ld_supported_targets" in elf32-i386) TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" ;; a.out-i386-linux) echo "${UNAME_MACHINE}-pc-linux-gnuaout" exit ;; coff-i386) echo "${UNAME_MACHINE}-pc-linux-gnucoff" exit ;; "") # Either a pre-BFD a.out linker (linux-gnuoldld) or # one that does not give us useful --help. echo "${UNAME_MACHINE}-pc-linux-gnuoldld" exit ;; esac # Determine whether the default compiler is a.out or elf eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include #ifdef __ELF__ # ifdef __GLIBC__ # if __GLIBC__ >= 2 LIBC=gnu # else LIBC=gnulibc1 # endif # else LIBC=gnulibc1 # endif #else #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) LIBC=gnu #else LIBC=gnuaout #endif #endif #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^LIBC/{ s: ::g p }'`" test x"${LIBC}" != x && { echo "${UNAME_MACHINE}-pc-linux-${LIBC}" exit } test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; } ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i386. echo i386-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown case $UNAME_PROCESSOR in unknown) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NSE-?:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: pnp4nagios-0.6.16/COPYING0000664000000000000000000004312211662503006013422 0ustar rootroot GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) 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 this service 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 make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. 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. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), 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 distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the 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 a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE 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. 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 convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 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 2 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, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision 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, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This 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 Library General Public License instead of this License. pnp4nagios-0.6.16/README0000664000000000000000000000027011662503006013244 0ustar rootroot######################### # # # README # # # ######################### See our online documentation at: http://pnp4nagios.sourceforge.net or: http://docs.pnp4nagios.org/ pnp4nagios-0.6.16/ChangeLog0000664000000000000000000001572611662503006014152 0ustar rootroot**pnp-0.6.17 ??/??/2011** **pnp-0.6.16 11/21/2011** * Bugfix: Fixed single quoted check_multi labels (Reported by Matthias Flacke) * Bugfix: Append missing slash to perfdata_spool_dir ( Reported by Juergen-Michael Radtke ) * Bugfix: Fixed jQuery-ui multisite theme * Feature: PDF margins are now adjustable via config.php ( Thomas Witzenrath ) * Featire: Support for PDF size 'letter' added ( Robert Becht ) **pnp-0.6.15 09/15/2011** * Bugfix: Fixed Overview link (reported by Stefan Triep) * Bugfix: Fixed zoom popup (reported by Rudolf Labuschagne) * Bugfix: Fixed double urlencode() (reported by Mathias Kettner) * Feature: "Clear basket" button added (suggested by Stefan Triep) * Feature: New helper function "rrd::alerter_gr()" ( committed by Stefan Trip ) **pnp-0.6.14 08/05/2011** * Feature: Webinterface for mobile devices based on jQuery Mobile \\ ( http://jquerymobile.com/ ) * Feature: Zoom based on jQuery plugin imgAreaSelect \\ ( http://odyniec.net/projects/imgareaselect/ ) * Feature: New template check_mssql_health.php * Bugfix: Fixed popups to work under nginx ( Joram Agten ) * Bugfix: Helper rrd::vdef() fixed * Update: jQuery update to 1.6.2 * Update: jQuery-ui update to 1.8.14 **pnp-0.6.13 05/19/2011** * Feature: New option --ignore-hosts added to check_pnp_rrds.pl ( by Jochen Bern ) * Feature: New options zgraph_width and zgraph_height in config.php ( Mike Liebsch ) * Bugfix: rrd_convert.pl: parse_xml_filename() regex fix * Info: Version used by OMD-0.48 [[http://omdistro.org|OMD]] **pnp-0.6.12 04/22/2011** * Feature: mod_gearman support added * Feature: rrd_convert.pl is now able to convert all RRDs from RRD_STORAGE_TYPE=SINGLE to RRD_STORAGE_TYPE=MULTIPLE * Feature: New template check_gearman.php * Feature: Install process_perfdata.cfg and npcd.cfg by default * Bugfix: rrd_convert.pl is now able to parse xml dumps created by rrdtool 1.4.x * Bugfix: process_perfdata.pl default timeout value set to 15 seconds **pnp-0.6.11 01/15/2011** * Bugfix: urldecoding fixed * Bugfix: Zoom in/out is working again ( Reported by Thorben Soehl ) * Featue: npcd.cfg - New option perfdata_file_processing_interval used by npcdmod * Info: Version used by OMD-0.46 [[http://omdistro.org|OMD]] **pnp-0.6.10 12/15/2010** * Feature: Add RRDTool Option --only-graph if graph height is below 32px to create thumbnails * Feature: RRDTool Option --width and --height is now allowed in templates * Feature: RRDTool DS Type for UOM of "c" changed from COUNTER to DERIVE * Feature: Pass query string from special controller to image controller ( Matthew Garrett ) * Feature: Authorisation against [[http://mathias-kettner.de/checkmk_livestatus.html|mk_livestatus]] API added * Feature: Sample nginx webserver config added ( by evax@users.sourceforge.net ) * Feature: Kohana backport to support PHP 5.1.6 ( Kudos to Andreas Ericsson ) * Bugfix: Sort list of special templates * Bugfix: Urlencode hostname and service description ( Reported by Yannick ) * Bugfix: corrected warning/critical thresholds in ticker/alerter functions **pnp-0.6.7 09/27/2010** * Bugfix: Page config parser fix (Beau Gunderson) * Bugfix: Zoom window size fixed (Report by Rudolf Labuschagne) * Bugfix: Fixed undefined offset while using 'ds_name' in templates (Reported by Vladimir Bilik) * Bugfix: Npcdmod respects process_perf_data option used in hosts and services definitions ( Reported by Wolfgang Barth ) * Template: New Template check_nagiostats.php used with check_nagiostats written by Jochen Bern **pnp-0.6.6 08/07/2010** * Bugfix: Fixed max amount of graphs per template * Bugfix: Autodetect PNP base URL * Bugfix: Too short npcdmod perfdata_template to take perfdata + overhead, increased +1024byte * Bugfix: Ignore files in var/perfdata and check for empty directories * Bugfix: Reducing memory usage while parsing page config (Laurent Freval) **pnp-0.6.5 07/09/2010** * Feature: Special Templates are back [[tpl_special]] * Feature: New rrdtool helper functions makes template design easier [[tpl_helper]] * Feature: config.php -> 'recursive_template_search' is enabled by default * Feature: config.php -> 'template_dirs' is now an array of directorys to search for PNP templates **pnp-0.6.4 06/03/2010** * Update: jQuery Update to 1.4.2 * Update: jQuery-ui Update to 1.8 * Feature: New configure Option --with-base-url * Template: New template check_ntp_time.php (Mathias Kettner) * Feature: New i18n files for fr_FR (Yannig Parre) * Feature: New jQuery Theme 'multisite' **pnp-0.6.3 03/16/2010** * Feature: New helper script libexec/rrd_convert.pl -> [[rrd_convert]] * Bugfix: Ignore old XML files while building the service list * Template: New template check_hpasm.php * Bugfix: Installer now checks for json_decode() * Workaround: Allow "trailing unfilled semicolons". Workaround for nsclient++ * Template: Updates for check_openmanage.php, check_hp_bladecenter.php and check_dell_baldecenter.php ( Trond Hasle Amundsen )" **pnp-0.6.2 12/23/2009** * Feature: XML_WRITE_DELAY option added to process_perfdata.cfg as suggested by Mathias Kettner * Feature: New template integer.php * Update: FPDI update to 1.3.1 * Feature: PNP will now work with [[http://http://www.lighttpd.net|lighttpd]] and php-cgi * Template: check_mk-ps.perf.php added ( by Mathias Kettner ) * Feature: PNP will now work without mod_rewrite -> [[webfe]] * Bugfix: Wrong pdf link used on site 'pages' and 'basket' * Bugfix: Incorrect group permissions on spool directory **pnp-0.6.1 11/22/2009** * Feature: RRD heartbeat per check_command -> [[tpl_custom]] * Feature: New config.php option pdf_graph_opt * Feature: Recognize the 'background_pdf' option in page definitions -> [[pages]] * Feature: Recognize the 'source' option in page definitions -> [[pages]] * Feature: Array $TIMERANGE now available for templates -> [[timeranges]] * Bugfix: ./configure --sysconfdir no longer ignored * Feature: Store internal runtime statistics on a per minute base * Feature: Added two widgets views/widget_menu.php and views/widget_graph.php **pnp-0.6.0 10/30/2009** * Webfrontend based on [[http://www.kohanaphp.com|Kohana]] * Webfrontend based on [[http://jqueryui.com/themeroller/|jQuery Themes]] * Javascript-functions using [[http://jquery.com/|jQuery]] plugins * process_perfdata.pl will be able to use one RRD database per datasource * improved installer. Specification of directory layouts using --with-layout * RRDtool errors are now displayed as images. no more missing images * PNP templates cannot overwrite internal variables anymore * PNP templates of version 0.4.x can still be used * PDF functions recoded * Template default.php optimized * Export from RRD databases into XML, CSV and JSON format using the RRDtool "xport" function * Page functions recoded * Error pages links to online FAQ * Mouseover Popup in Nagios frontend via jQuery.clueTip plugin * Full support of rrdcached pnp4nagios-0.6.16/subst.in0000775000000000000000000000712011662503006014060 0ustar rootroot#!@PERL@ -w my ${prefix}="@prefix@"; my ${exec_prefix}="@exec_prefix@"; my ${datarootdir}="@datarootdir@"; my ${datadir}="@datadir@"; my $PERL="@PERL@"; my $PERL_LIB_PATH="@PERL_LIB_PATH@"; if( $PERL_LIB_PATH ne "no" ){ $PERL_LIB_PATH_CODE = "use lib '".$PERL_LIB_PATH."';"; }else{ $PERL_LIB_PATH = ""; $PERL_LIB_PATH_CODE = ""; } my $SHELL="@SHELL@"; my $STRIP="@STRIP@"; my $INSTALL="@INSTALL@"; if($INSTALL =~ /^\.\//){ $INSTALL =~ s/^\.\//\.\.\//; } my $INSTALL_OPTS="@INSTALL_OPTS@"; my $DEBUG="@DEBUG@"; my $PERFDATA_DIR="@PERFDATA_DIR@"; my $PERFDATA_LOG="@PERFDATA_LOG@"; my $PERFDATA_SPOOL_DIR="@PERFDATA_SPOOL_DIR@"; my $RRDTOOL="@RRDTOOL@"; my $RRDS="@RRDS@"; my $XML_STRUCTURE_VERSION="@XML_STRUCTURE_VERSION@"; my $PKG_REL_DATE="@PKG_REL_DATE@"; my $PKG_VERSION="@PKG_VERSION@"; my $PKG_NAME="@PKG_NAME@"; my $BASE_URL="@BASE_URL@"; my $HTTPD_CONF="@HTTPD_CONF@"; my $init_dir="@init_dir@"; my $npcd_name="@npcd_name@"; my $pp_pl_name="@pp_pl_name@"; my $nagios_user="@nagios_user@"; my $nagios_grp="@nagios_grp@"; my $libexecdir="@libexecdir@"; # put all --with-vars before directories my $localstatedir="@localstatedir@"; my $KOHANA="@KOHANA@"; my $KOHANA_SYSTEM="@KOHANA_SYSTEM@"; my $libdir="@libdir@"; my $sysconfdir="@sysconfdir@"; my $host_os="@host_os@"; my $ac_configure_args="@ac_configure_args@"; my $sbindir="@sbindir@"; my $bindir="@bindir@"; my $srcdir="@srcdir@"; my $CC="@CC@"; my $CFLAGS="@CFLAGS@"; my $DEFS="@DEFS@"; my $LDFLAGS="@LDFLAGS@"; my $LIBS="@LIBS@"; my $MOD_CFLAGS="@MOD_CFLAGS@"; my $MOD_LDFLAGS="@MOD_LDFLAGS@"; my $CP="@CP@"; while ($f = shift @ARGV) { if (-x "/bin/mktemp") { $TEMP = `/bin/mktemp $f.$$.XXXXXX`; die 'Cannot make temporary file $TEMP' if($?); chomp $TEMP; } else { $XXXXXX = rand; $TEMP = "$f.$$.$XXXXXX"; } open(IN,"<$f.in"); open(OUT,">$TEMP") || die 'Cannot make temporary file $TEMP'; while () { s|\@PERL\@|$PERL|g; s|\@PERL_LIB_PATH\@|$PERL_LIB_PATH|g; s|\@PERL_LIB_PATH_CODE\@|$PERL_LIB_PATH_CODE|g; s|\@SHELL\@|$SHELL|g; s|\@STRIP\@|$STRIP|g; s|\@INSTALL\@|$INSTALL|g; s|\@INSTALL_OPTS\@|$INSTALL_OPTS|g; s|\@DEBUG\@|$DEBUG|g; s|\@PERFDATA_DIR\@|$PERFDATA_DIR|g; s|\@PERFDATA_LOG\@|$PERFDATA_LOG|g; s|\@PERFDATA_SPOOL_DIR\@|$PERFDATA_SPOOL_DIR|g; s|\@RRDTOOL\@|$RRDTOOL|g; s|\@RRDS\@|$RRDS|g; s|\@XML_STRUCTURE_VERSION\@|$XML_STRUCTURE_VERSION|g; s|\@PKG_REL_DATE\@|$PKG_REL_DATE|g; s|\@PKG_VERSION\@|$PKG_VERSION|g; s|\@PKG_NAME\@|$PKG_NAME|g; s|\@BASE_URL\@|$BASE_URL|g; s|\@HTTPD_CONF\@|$HTTPD_CONF|g; s|\@npcd_name\@|$npcd_name|g; s|\@pp_pl_name\@|$pp_pl_name|g; s|\@nagios_user\@|$nagios_user|g; s|\@nagios_grp\@|$nagios_grp|g; s|\@libexecdir\@|$libexecdir|g; # put all --with-vars before directories s|\@localstatedir\@|$localstatedir|g; s|\@KOHANA\@|$KOHANA|g; s|\@KOHANA_SYSTEM\@|$KOHANA_SYSTEM|g; s|\@libdir\@|$libdir|g; s|\@init_dir\@|$init_dir|g; s|\@sysconfdir\@|$sysconfdir|g; s|\@datarootdir\@|$datarootdir|g; s|\@datadir\@|$datadir|g; s|\@sbindir\@|$sbindir|g; s|\@bindir\@|$bindir|g; s|\@srcdir\@|$srcdir|g; s|\@CC\@|$CC|g; s|\@CFLAGS\@|$CFLAGS|g; s|\@DEFS\@|$DEFS|g; s|\@LDFLAGS\@|$LDFLAGS|g; s|\@MOD_LDFLAGS\@|$MOD_LDFLAGS|g; s|\@MOD_CFLAGS\@|$MOD_CFLAGS|g; s|\@LIBS\@|$LIBS|g; s|\@CP\@|$CP|g; s|\@prefix\@|$prefix|g; s|\@host_os\@|$host_os|g; s|\@ac_configure_args\@|$ac_configure_args|g; s|\$\{exec_prefix\}|$exec_prefix|g; # must be next to last s|\$\{prefix\}|$prefix|g; # must be last print OUT $_; } close IN; close OUT; if ((! -e $f) || (`diff $f $TEMP`)) { `mv $TEMP $f`; } else { unlink $TEMP; } } pnp4nagios-0.6.16/INSTALL0000664000000000000000000002243211662503006013421 0ustar rootrootInstallation Instructions ************************* Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005 Free Software Foundation, Inc. This file is free documentation; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. Basic Installation ================== These are generic installation instructions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. (Caching is disabled by default to prevent problems with accidental use of stale cache files.) If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You only need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. If you're using `csh' on an old version of System V, you might need to type `sh ./configure' instead to prevent `csh' from trying to execute `configure' itself. Running `configure' takes awhile. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package. 4. Type `make install' to install the programs and any data files and documentation. 5. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you must use a version of `make' that supports the `VPATH' variable, such as GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. If you have to use a `make' that does not support the `VPATH' variable, you have to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. Installation Names ================== By default, `make install' installs the package's commands under `/usr/local/bin', include files under `/usr/local/include', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PREFIX'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you pass the option `--exec-prefix=PREFIX' to `configure', the package uses PREFIX as the prefix for installing programs and libraries. Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=DIR' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the option `--target=TYPE' to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc causes the specified `gcc' to be used as the C compiler (unless it is overridden in the site shell script). Here is a another example: /bin/bash ./configure CONFIG_SHELL=/bin/bash Here the `CONFIG_SHELL=/bin/bash' operand causes subsequent configuration-related scripts to be executed by `/bin/bash'. `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of the options to `configure', and exit. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. pnp4nagios-0.6.16/AUTHORS0000664000000000000000000000012611662503006013434 0ustar rootrootAuthors: Jörg Linge pitchfork@pnp4nagios.org Hendrik Bäcker andurin@process-zero.de pnp4nagios-0.6.16/sample-config/0000775000000000000000000000000011662503006015111 5ustar rootrootpnp4nagios-0.6.16/sample-config/pnp/0000775000000000000000000000000011662503006015706 5ustar rootrootpnp4nagios-0.6.16/sample-config/pnp/process_perfdata.cfg-sample.in0000664000000000000000000000464211662503006023605 0ustar rootroot# @PKG_NAME@–@PKG_VERSION@ # Config File for process_perfdata.pl # # More info on RRDtool can be found at www.rrdtool.org # # process_perfdata.pl Timeout in seconds # TIMEOUT = 15 # # Use RRDs Perl module # USE_RRDs = 1 # # Path to XML/RRD files # RRDPATH = @PERFDATA_DIR@ # # Location of RRDtool binary # RRDTOOL = @RRDTOOL@ # # Location of PNP config files # CFG_DIR = @sysconfdir@ # # Use a single RRD database per service # one or more datasources per RRD database # RRD_STORAGE_TYPE = SINGLE # # Use multiple RRD databases per service # one RRD Database per Datasource. # RRD_STORAGE_TYPE = MULTIPLE # RRD_STORAGE_TYPE = SINGLE # # max. interval between samples/updates # RRD_HEARTBEAT = 8460 # # file with RRA options used to create new RRD files # RRA_CFG = @sysconfdir@/rra.cfg # # interval at which PDPs are generated # RRA_STEP = 60 # # name of the log file # LOG_FILE = @PERFDATA_LOG@ # # Loglevel 0=silent 1=normal 2=debug # LOG_LEVEL = @DEBUG@ # # XML encoding # The supported encodings are ISO-8859-1, UTF-8 and US-ASCII. # http://www.php.net/xml-parser-create # XML_ENC = UTF-8 # # XML update delay in seconds # 0 = Update XML Files everytime new data arrives # # Use this option to reduce disk I/O # XML_UPDATE_DELAY = 0 # # Use only with rrdtool svn revision 1511+ # # RRD_DAEMON_OPTS = unix:/tmp/rrdcached.sock RRD_DAEMON_OPTS = # # Spool Directory used for internal statistic # STATS_DIR = @localstatedir@/stats ######################################################### # Gearman Worker Config # Only used while running as gearman worker # # How many child processes # PREFORK = 1 # # Gearman server to connect to # GEARMAN_HOST = localhost:4730 # # Restart child process after a given count of requests # REQUESTS_PER_CHILD = 10000 # enables or disables encryption. It is strongly # advised to not disable encryption. Anybody will be # able to inject packages to your worker. # Encryption is enabled by default and you have to # explicitly disable it. # When using encryption, you will either have to # specify a shared password with KEY = ... # Default is 1. # ENCRYPTION = 1 # A shared password which will be used for # encryption of data pakets. Should be at least 8 # bytes long. Maximum length is 32 characters. # KEY = should_be_changed # The shared password will be read from this file. # Use either key or keyfile. Only the first 32 # characters will be used. # KEY_FILE = @sysconfdir@/secret.key pnp4nagios-0.6.16/sample-config/pnp/config.php.in0000664000000000000000000001471511662503006020301 0ustar rootroot # Example: conf['allowed_for_all_services'] = "nagiosadmin,operator"; # This option is used while $conf['auth_enabled'] = TRUE $conf['allowed_for_all_services'] = ""; $conf['allowed_for_all_hosts'] = ""; # Which user is allowed to see additional service links ? # Keywords: EVERYONE NONE # Example: conf['allowed_for_service_links'] = "nagiosadmin,operator"; # $conf['allowed_for_service_links'] = "EVERYONE"; # # Who can use the host search function ? # Keywords: EVERYONE NONE # $conf['allowed_for_host_search'] = "EVERYONE"; # # Who can use the host overview ? # This function is called if no Service Description is given. # $conf['allowed_for_host_overview'] = "EVERYONE"; # # Who can use the Pages function? # Keywords: EVERYONE NONE # Example: conf['allowed_for_pages'] = "nagiosadmin,operator"; # $conf['allowed_for_pages'] = "EVERYONE"; # # Which timerange should be used for the host overview site ? # use a key from array $views[] # $conf['overview-range'] = 1 ; # # Scale the preview images used in /popup # $conf['popup-width'] = "300px"; # # jQuery UI Theme # http://jqueryui.com/themeroller/ # Possible values are: lightness, smoothness, redmond, multisite $conf['ui-theme'] = 'smoothness'; # Language definitions to use. # valid options are en_US, de_DE, es_ES, ru_RU, fr_FR # $conf['lang'] = "en_US"; # # Date format # $conf['date_fmt'] = "d.m.y G:i"; # # This option breaks down the template name based on _ and then starts to # build it up and check the different template directories for a suitable template. # # Example: # # Template to be used: check_esx3_host_net_usage you create a check_esx3.php # # It will find and match on check_esx3 first in templates dir then in templates.dist # $conf['enable_recursive_template_search'] = 1; # # Direct link to the raw XML file. # $conf['show_xml_icon'] = 1; # # Use FPDF Lib for PDF creation ? # $conf['use_fpdf'] = 1; # # Use this file as PDF background. # $conf['background_pdf'] = '@sysconfdir@/background.pdf' ; # # Enable Calendar # $conf['use_calendar'] = 1; # # Define default views with title and start timerange in seconds # # remarks: required escape on " with backslash # #$views[] = array('title' => 'One Hour', 'start' => (60*60) ); $views[] = array('title' => '4 Hours', 'start' => (60*60*4) ); $views[] = array('title' => '25 Hours', 'start' => (60*60*25) ); $views[] = array('title' => 'One Week', 'start' => (60*60*25*7) ); $views[] = array('title' => 'One Month', 'start' => (60*60*24*32) ); $views[] = array('title' => 'One Year', 'start' => (60*60*24*380) ); # # rrdcached support # Use only with rrdtool svn revision 1511+ # # $conf['RRD_DAEMON_OPTS'] = 'unix:/tmp/rrdcached.sock'; $conf['RRD_DAEMON_OPTS'] = ''; # A list of directories to search for templates # @datarootdir@/templates.dist is always the last directory to be searched for templates # # Add your own template directories here # First match wins! #$conf['template_dirs'][] = '/usr/local/check_mk/pnp-templates'; $conf['template_dirs'][] = '@datarootdir@/templates'; $conf['template_dirs'][] = '@datarootdir@/templates.dist'; # # Directory to search for special templates # $conf['special_template_dir'] = '@datarootdir@/templates.special'; # # Regex to detect mobile devices # This regex is evaluated against the USER_AGENT String # $conf['mobile_devices'] = 'iPhone|iPod|iPad|android'; ?> pnp4nagios-0.6.16/sample-config/pnp/background.pdf0000664000000000000000000007130711662503006020530 0ustar rootroot%PDF-1.3 % 4 0 obj << /Length 5 0 R /Filter /FlateDecode >> stream xuSnA Sج?PQ=O*%@ߙi*(Ixk{_5QHq6^}*E੭z_$m'KvqΩ͗l).x-\(Ĥ6*5)-nЎK#A !ώ"ł#x*^6'7MWfi:iiU,j"fxp MvmJ_9Z:h8Sz˨jԻJNmr,66 O%*KQgM]u|`@V1R}=B$5dxԦ>;`֮H/(XDu9.E t`&IW|7筑1e=Q.|JշDŽFZsl>W{ML endstream endobj 5 0 obj 466 endobj 2 0 obj << /Type /Page /Parent 3 0 R /Resources 6 0 R /Contents 4 0 R /MediaBox [0 0 595 842] >> endobj 6 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /ColorSpace << /Cs1 7 0 R >> /ExtGState << /Gs1 13 0 R >> /XObject << /Im1 11 0 R /Fm1 8 0 R >> >> endobj 8 0 obj << /Length 9 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [517 31 562 76] /Resources 10 0 R /Group << /S /Transparency /CS 14 0 R /I true /K false >> >> stream x+TT(T054W06T01Tp<ԢԂL")\}\#|! endstream endobj 9 0 obj 68 endobj 10 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im2 15 0 R >> >> endobj 15 0 obj << /Length 16 0 R /Type /XObject /Subtype /Image /Width 50 /Height 50 /Interpolate true /ColorSpace 14 0 R /SMask 17 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xgE`\P KX1 PPE) *EPI2hB, K`Q fATM}{.rLOO;==s̩QFR6j׮=w܃TR &^i瞫X h #Gd;~ E-^{h뮹ʉ;>|xĈ57 m~F}iܸifUժUk֬?$%W\qWb60aЩaÆcƌ1C?k0 n -Ztرȉaʕ˗\dC ߭[sI.ORb?믙i[ҢtI"?c$aUǵqT4y8kxQä ԣ>zG8믿Oq9QZ.]A~$Qmذᮻ۾+S.{|W>iӆSE'N:th[&3*ߟԃ>/$~Dvډ'f˖С×_~7ԫWen:߽{ _b@ cdöbŊ={~9,Gy'^x$ѣGà̙W^;wf ~anӧO'z+ٳ''O?C7oސ!C\[˗/yٳgo۶ Qc{7x(ITi=LRV-C ٿ?(PdɒVzu o=g}-[6_|X޼yYf Euq#h%͚5.r۾}{զMJ(q֯_?G^z)P}W_榛nBwp>q>`;ZT>wƍ4ʕ ']dIB.䒾}2kƔ'4~%)R5kH"ֆ֯_?^rZhAQL;G"!喔߭[;Oq0-[{n".\'Ljȑ :[SdzdY fS :x 4ر9cv߾}_|1:]1c;HnVDjwqRPّ|0尜QyWRf13oGs#= ꫯfbŊ>ҪU+J7'wb,ɕ+n: Ipڱcs{u^׍})w̅$?~mA7oP+}xrw>Ŋ`JDrڵ?iA'Ϧ3fزe NPPw|v$֐*W^.#KɓgҤI*} BPbC-0r4iޑE[ni׮…  êPS o`\SNM4 Ba Io%CFQ,JЀ$\ <裏\SAayB'9LJ;E!ȍfJʌn_.]ԩ9O68 %QJ bYq D) ݗ]vY%숷%:*adK7oެg)K 釻;X o90}TiQѪЗd9Up@ I5- 7EN@%*xč6ÝA%k71KZ2dIOzʉ\`؊UIY))$J&w_'@-򧷣\)_QwJJS0ᚼ&M?p> stream JFIF@ICC_PROFILE0appl mntrRGB XYZ   acspAPPLappl-appl dscmdescogXYZlwtptrXYZbXYZrTRCcprt8chad,gTRCbTRCmluc enUS&~esES&daDK.deDE,fiFI(frFU(*itIT(VnlNL(nbNO&ptBR&svSE&jaJPRkoKR@zhTWlzhCNruRU"plPL,Yleinen RGB-profiiliGenerisk RGB-profilProfil Gnrique RVBN, RGB 000000u( RGB r_icϏPerfil RGB GenricoAllgemeines RGB-Profilfn RGB cϏeNGenerel RGB-beskrivelseAlgemeen RGB-profiel| RGB \ |Profilo RGB GenericoGeneric RGB Profile1I89 ?@>D8;L RGBUniwersalny profil RGBdescGeneric RGB ProfileGeneric RGB ProfileXYZ Zus4XYZ RXYZ tM=XYZ (6curvtextCopyright 2007 Apple Inc., all rights reserved.sf32 B&l@ExifMM*igC    Cg" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?ҭEAxn)|!HH "1M,bVUW$։ 1,~-f>,_OQ@0!| _]}=E| _||Yۯ.d/u2gn?ᐾ Ϗ?{uG+r$#k=H{MGKՎ),L22  +C FNj_u='A]y4POϲ@ _||Yۯ.d/uP_i%%9F7k}Jz,OW|/``XڟWt;MW+BYpLZv]Wr+V?׻ _]_ş="w{VJ6G|iԄk"\[%͵6Tc,2V:|3xC>4YC5;v P48dUB'!G2gn?ᐾ Ϗ?{u[&?alj_^n]Zk<9v Zfe p#WS?_ş=B/>>,_c~\Gῇ/xã7olnqR*p2q_}xƾ&|Owe֥wurWefv…Q_d/t!|Kh?ಟ<1ᨼ=Y"ӴYͣ3)U$I$kO~?g ~߿>jR\EahqivL@ _||Yۯ.d/uD<(!|i a?Q&D5YXE) *+@xܟ!OOx_{ ;TŚa=y߃/gu kFeIo1_cpB/>>,G2gnzx-`hC$HU $JI+۲>bH#o(R]*I/--VeoV?=?m/Sëw md1O`gݝF95=PVb?Fۃ&|VⲚ8hbd:p:{.k+kkf-5heZ]9G˻ݕkk]'2gn?ᐾ Ϗ?{uנ776Oiwu"'(8V Ea_ڧg_w_gu^^XHeQɌ*FΟ _||Yۯ.d/u˟[?gqzmd>\ȯyW{| _||Yۯ.d/u|ty>+¸궿Ey}+g<ۏjJ  _]_ş=(d/t!|ᐾ Ϗ?{u _||Yۯ.>aB/>>,G2gnz8 N~4~,}T|!^N Bo/$FLbT~@~nqҀ?d/t!|ea^k@#",方C`~nkᐾ Ϗ?{u _||Yۯ.>aB/>>,G2gnz _]P־ 4|WlKkе+/4Z5hJIgk_V_q\P/??ogcԭ#To#C~W~@*?ZcSҩ+D5kaOJh( HrI>+aeumJR;#keg^+2yMwH5دͿ%%m ëבeM=wW|a9bNe*oШ px;2-?'t?[(|<? ?it_m' { G*E9#P{ G_s8?^_m~YLJ#H-2ّ>|. |.zEҐc)C*|p$+e?xR-J?;ScAع/2W?! ~.ǿOk6?-|).|:xෆOB~ϒMv4>AwHa8Io;g31|q/cx6vWu.Y-ʿ'j|?i 7w]İ7X"u_/ Yï Kc?a--Fy8{{NhK@ `.aUV@k6 uzUw%*$'vk 3MK?&=F%ė0 2?o__?,{+}vqbb3衏j[|E g |O u={Qw<+f>ܞa_wQˈE=aGfGxKgg0POiU?H+KN=?>+x ïUxg-]]IpyTA3:L_+Y֣V*-*ٵ_ ?\"cJ-?h['%E a YK_ĿH~+t^_>#v魓OB=Q =>qpU =WʥF\R1J)g+(2)4U*Xx JRoW&ov /C߾:؝zdg'dNWq_A("/ {> k^):6x͵ "v<$ck{BMUeuWFWB29W[EG._Cw~_mV źI-̗VyaΆXbb j ,ߴon ,2]Y( ?&)? pG?#/ ZL [[8#2;0fb$ 5re+jُ3_{$pGpwZyHg0f9T b @?K?/ ǿ ??G>|-Z,3_^j/lf[xy>W ҅-V*71_VǬC2ԴN;>}lw淣x\^1E-$ŅFelIσ|S?eWp,˵"Bp%hIbz]{ g|?'S ;I69cvJ<@쮲Pk/ z m~˾>ݾ:x/K3A}q,<3[(sv=*G<_}{=BN՗A.G#^\\ZƠnƀdX/7~?_4ύ?iW3nп? O\~Cρo BJ/xN %9V.e_e/N?kop0Y6v- lyE{!v xν =qŞm [X`F㍖4rk.~?mχ:/b&.lJU-op[ wurQօN?u)!|W?3بzF/a#,zrXJ?? 7_F?FWfw 9_kmoayuW~̿thX[dVY 2ybEzH*?y?+O.Oо*h^#fFrJa@i"Dݑ4S !?}0幱yf׉i.$$I m l@]|f̿Fox?Q hڭMJO~{.cmmirQ\ۂV ~ ࠿Gɾ_4'6M֍{7VSm̆hBG 0XW  _˪|;siuuᯊ$lPLIm %x$a%0!;?G| I5*{cuJK_HsRG$ qҩh OHկ5?*dO#VJv (>1L|7.x(mΧ%-N_5|=7SBXovZ5e{-/^|=#4I[P m#a~m9ҨfMШoux4uHukמ /i&ETY#pxe# §5uDif~Z?:6S{ O^{R#^&`+?/$cekvOmdamnFC6VQ 1J5Ol/!oz֍藰\ދ2y!{)nTQEYygF=Z¿_.Gy eOo] oKt[kɚ`X\h5;P.__Wox/Sg >o{Mͪ9xg#xjp:]ןiHKpsԩ= )\mQ']িĿ_>tUѯ..m͝V3FXc W wCSx?WkU yv) Nzh(ů*7|KO67YY[oPE<<EA_W^-|{%Ţf2Gὼ;8d_V+򺻹'61Eы8H:PӴZm?U,$ǙK,r`28 {_W4\N9.ӷ4aY7fpw=e 9̧֡ku]IЏ{/gG]<#7–I"\*I'i0: <㻏|wJV绍$?4PH@W}5}{]J91&WXc|E ,6rQsչIGK[.^TvmOكL? ੿cZ.yox2i-s$v>XFdF]Oi>__PtyŭFdNK-gl^[Ьܪ}|ѫ]KOW4_u[MѦTkߡgқ>YWZTnT/h-J^nWii:oғ qcNE^n7#wko~?o?NֿZ=23OicH'xRǟ !x >YK$=[$Ji@G+|F|bӼ[H<=oiiwVZH?1Rrk?̃U7ଟiԾ|/Wt<;Sezwyax!J7¿ڃįolkźL>N8  $F #2T)'S{o_xVǎ>(k7T:qeɌȎW<* $_PcZ_5gš|g Z49촉n$^cuigK~/~Pq | '-4t+u[=|Պ7pc>]Wl?o٫OAZï[֒4IE") V @?6+?a-sW[L.LVw6h9&gf?qUQ?'G:Z|eeMwI𮝤X#\I JH wvUPXZ^.eN| 5=[^#k(&W2O\ڿۓo9W \?dۏ:Mީ-χ+( 0M7ڴ_v7sycvs9~<d :!uu=՞yb֗ >RTM1؞V-~?`|%wV*h5m6đ#3G7Bᕃu! P_?QSoOxE> Ӵ?hipsE:49xH9  |z|au j^ /jhi6q̡_|vS? v"FXfHϫw15X&2J%x {6n)O&4kmbKt;tˇko K~ h1JSҍR/=N XӊW~ _"X#yfu P~}??ట|FqrD/$L$C ` 0|h!-*]^,`Riij>S /Kߴƞ&<;AN<#ey*֐[^7B)30Fs_3qேm7ZFeKW |ym^}#R . --IJ+c]Q>1B_?3ƿ> _wtj>e54nybI c,$Z߳/ٓo-+O*t`Ka' Fe,Z/]%wl1=s *~~k’~?|>.N.xV=9EdHp7?|c~_ekz_ ?ӳa-՛M}i ?umN˜>^m{T*>] #Hյ_H  @ld8?Wa|~~;f Ꮗ,R\^s5Ըl 6***v/J_HsR@'_ jU%};_1~ȟF1TQE~sV@JeN]k7y #vXJOڋᦟo4[M:#҅ϛnxxk_۷_6Dӭ<=vF>X`?wTVw1Ҥqȍԡ/|?K?W' ¯h~yL3GI`anӓjjxoXI0t.ymɁ>^.;Z?k.c%Tmб}CW3"R*<$|w5<(P?Sdw[O^,ՒI!IFWR,2A¬q_?!siLFS8UIQ7qPnu`ZI;&;2 _/10ʢ)M&ڻOC"2Y`_^r3>? ?v/F0dB ϭqgЃ_ +|,4'" /!?O1yALAoc?4 !O (?DOUPO'"k_?Pxi/ꤰGLHoj?3f? 8i8/a>:]տi_ӃڧIL|::5'C! 8O(?ChΨ~Ag5>AĞ>NoaI{ giqw'34.@Q2a?`sZC?sjG_iocG8z_s/'vGC'_ FlϏf|3W#__}^׷Vp0F A;Wc6 pS0>t%ӌ=rg7rW]O?wf8,N/BuŹ|FrQRvVI%mz<K9w cU~~ޯy=5GäI)?ر Xaɮ擏!_C/\Zo߷cVxOdĒ?3P[|.m,bG#?Əye :3yG<7[}nď GaGhǛ=_iYoq+w/aY"?$S,}+w[FeH"/z?1fNC![C/\^?H{앣:go~f"F 3RHbmm /=k]>r\Oo kn@H{Q8w?;؏P8"~{Hs/Ÿ 4 _/olP:+, 8fRS*ϊ?.׆?f]o5/;%Qn/c$rFԤk˨_ɶdRQʮ?{Uֺ#,h@#O_,i \0 ?IgK#sD3H3w??KχI B|<7?U-P03na'^hS?$g>>Ŀxc\MSQ/Qd*X9?ӟφ_9gχQ4MOP7dKq^ n<_(2B?*x:<ϓUo7,?N!W%\ܱז򽯵=|F:/iCNso;wm'qC]14$RǠkUƃ ֟ C=6 |Ո/'ȳv7N2&=Zǃ> V>sJaeOxc^'k)–'.hi r'MIt/x f e3JӔR$$4ӳ٧ esOp-մ$ɷ>g}gc9uq?)bn|2;D(+Qq6 mYgͦ$OHV=#=k7 Éh,DWxb`UR-.sa~׾xk}3SUU,3# ױ* 5g _ZſeVXo4777~Vxb:FF}k?B2V~op?:b*(TMvݟv}x>XLR9>f'vl܏_% Ӯ~ON|A5OFoھi[F4觎;{[} ̌0\xN!nmq,D Yӿj k?/ 5aPcbI-KDկVUrmmm[oV؟ٳgU+&:@k%9]]dC!G-9.?'N5_{U-N:YG4]b)KUGFF^"2ttVl8ukӠSGӧ6_8];WӧXOUxZZ7{jvݷJ?gΫVu??5_k6BzӍ/R?GytS'wVV^&Zǭs_@tZpsksbgΫRO!7?(Z9/N1տبM:qP<ح'=Zտ_qZ_3qaNu s'>tWWY)(N4PcU?Z?ٳgU)5_A5@imD?5LskjqN_CZu7|<7?U-~@*dea$F-RzX]o'TV>.v?W~| [yAIXC]>A5N WM|[#>0|.lxNu$Ž%0)mszvƏ; c1p$6qcEAoǤX QW?j{ I}7NWfIT#45A2wS4ˢsJ/U.W9o]|.gɀI'Xw[AzӚ_ݗv~;ޯx#°znib~ 5,J9ajsЋJ{ƛ~>"a2 }b% vG5;XІt[{N}t~ֿ_'lh:fsxO'Lվ4cA:{v:gOG?y3Y?⮙>e!C]3c:,3ں?Ơ Ǜ1qK'>g?FJ=i3aoLڗ?xL?=Lǒ]?>_3_.\[P9?Lٿt1^=9??LVN ]+Efmt+W'>g?L?B2VsZǙs_q1E赧?_1hsΙD?C |9>KGt}/tWA7?ʨҿ/Peg]3BZ_Ei-l}L=Zl}3>?Jѿ.?kSrPsΙv _EP~d<5bc:gZտ׼ m\P??֝gVN}t~?Тj폲>VOdgm'=Zտ_qZN}t~l?>߮`?y%u5a! w)k:NKZ?9?]gA{KҠa?LW֯\l}'LJ9zv]3Fēۊ__H*?e|‚v}`#H4P|@1xZ-Z)K[2MId|H9\ch_Y~5W H#zEK흡""³>,y~7~Lg8 ]q !}֊+r<.aEaS&jsR#3\Fe\$q_3t/&~7?;THo_f-26Z(T˿:?Ezw폢YXYYOEFH czE%퍢]/_I㗛NB8[Wt/&~7?;ER#C4EF?-퓡Y/O+I $=h,CBV~7?;UPi] <̇zh.h_Lov~%[Osqg݉Q@49͇O.Q!ş#iޭh_Lov(푢A6+|4L$yhnc藶vƨFPqiHQ@t/&~7?;U4?}^^>g?֊(6DgjcvVvƮDH czE?><|᧍@S!ş =ګ:?Emdhp56o2S ş_jK#Ch᧍TFɸ_j( :?EIc苨^5)$1D, -ퟡ:2³ ^-,[᧍#$\YQ@߶F%եi`#ߑ>r1=j6Dgh)X%S#|5Yx[z~%1ƿ g_z(;;eiei#dYd=jXl (b3*ϰQ@Gi],d}$C=5sGBgQ@llxىGϣ9oMKkUYNn,E\п,RH.u _4 NE_E'D_6V'qgH#zկm "ES?FovZ<}9, Mxw>T> o`x <: LF@f E}Ai^}i:}vNHEP'=II( endstream endobj 12 0 obj 20726 endobj 17 0 obj << /Length 18 0 R /Type /XObject /Subtype /Image /Width 50 /Height 50 /ColorSpace /DeviceGray /Interpolate true /BitsPerComponent 8 /Filter /FlateDecode >> stream x  o7@a 060ú endstream endobj 18 0 obj 34 endobj 13 0 obj << /Type /ExtGState /ca 0.9 >> endobj 20 0 obj << /Length 21 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xTkA6n"Zkx"IYhE6bk Ed3In6&*Ezd/JZE(ޫ(b-nL~7}ov r4 Ril|Bj A4%UN$As{z[V{wwҶ@G*q Y<ߡ)t9Nyx+=Y"|@5-MS%@H8qR>׋infObN~N>! ?F?aĆ=5`5_M'Tq. VJp8dasZHOLn}&wVQygE0  HPEaP@<14r?#{2u$jtbDA{6=Q<("qCA*Oy\V;噹sM^|vWGyz?W15s-_̗)UKuZ17ߟl;=..s7VgjHUO^gc)1&v!.K `m)m$``/]?[xF QT*d4o(/lșmSqens}nk~8X<R5 vz)Ӗ9R,bRPCRR%eKUbvؙn9BħJeRR~NցoE endstream endobj 21 0 obj 737 endobj 19 0 obj [ /ICCBased 20 0 R ] endobj 22 0 obj << /Length 23 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xTkA6n"Zkx"IYhE6bk Ed3In6&*Ezd/JZE(ޫ(b-nL~7}ov r4 Ril|Bj A4%UN$As{z[V{wwҶ@G*q Y<ߡ)t9Nyx+=Y"|@5-MS%@H8qR>׋infObN~N>! ?F?aĆ=5`5_M'Tq. VJp8dasZHOLn}&wVQygE0  HPEaP@<14r?#{2u$jtbDA{6=Q<("qCA*Oy\V;噹sM^|vWGyz?W15s-_̗)UKuZ17ߟl;=..s7VgjHUO^gc)1&v!.K `m)m$``/]?[xF QT*d4o(/lșmSqens}nk~8X<R5 vz)Ӗ9R,bRPCRR%eKUbvؙn9BħJeRR~NցoE endstream endobj 23 0 obj 737 endobj 14 0 obj [ /ICCBased 22 0 R ] endobj 24 0 obj << /Length 25 0 R /N 1 /Alternate /DeviceGray /Filter /FlateDecode >> stream xROHQ6Axw )vuYm[Ңgߺ3ӛ5œ]`鲙}v*b{a[QÓ'a?dy֭S{=5ڊ^-CT#hsM9s1F9 1w7;aYf ]%{w;ћ9 \Ir< X}I<>Uw(gRVzWOelπ~v{|u׶>UEP>,l%KTn)=J+vp,ZSk9xw"zmMWzmʨ)(ͳDf[xf8:罊ZIE?9Z*UVPog~~\?A< =ѯ tIsQIi!3NTc)[d@f endstream endobj 25 0 obj 704 endobj 7 0 obj [ /ICCBased 24 0 R ] endobj 3 0 obj << /Type /Pages /MediaBox [0 0 595 842] /Count 1 /Kids [ 2 0 R ] >> endobj 26 0 obj << /Type /Catalog /Pages 3 0 R /Version /1.4 >> endobj 27 0 obj (pnp-background) endobj 28 0 obj (Mac OS X 10.6.1 Quartz PDFContext) endobj 29 0 obj (\000J\000\000r\000g\000 \000L\000i\000n\000g\000e) endobj 30 0 obj (Pages) endobj 31 0 obj (D:20090920105103Z00'00') endobj 32 0 obj () endobj 33 0 obj [ ] endobj 1 0 obj << /Title 27 0 R /Author 29 0 R /Producer 28 0 R /Creator 30 0 R /CreationDate 31 0 R /ModDate 31 0 R /Keywords 32 0 R /AAPL:Keywords 33 0 R >> endobj xref 0 34 0000000000 65535 f 0000028386 00000 n 0000000581 00000 n 0000027978 00000 n 0000000022 00000 n 0000000562 00000 n 0000000685 00000 n 0000027942 00000 n 0000000844 00000 n 0000001126 00000 n 0000001144 00000 n 0000004077 00000 n 0000025008 00000 n 0000025273 00000 n 0000027077 00000 n 0000001235 00000 n 0000004056 00000 n 0000025030 00000 n 0000025254 00000 n 0000026180 00000 n 0000025320 00000 n 0000026160 00000 n 0000026217 00000 n 0000027057 00000 n 0000027114 00000 n 0000027922 00000 n 0000028061 00000 n 0000028125 00000 n 0000028158 00000 n 0000028210 00000 n 0000028281 00000 n 0000028305 00000 n 0000028347 00000 n 0000028366 00000 n trailer << /Size 34 /Root 26 0 R /Info 1 0 R /ID [ <61b7390461cd1e5a1df8c9d1018263e2> <61b7390461cd1e5a1df8c9d1018263e2> ] >> startxref 28545 %%EOF pnp4nagios-0.6.16/sample-config/pnp/pnp4nagios_release.in0000664000000000000000000000021511662503006022016 0ustar rootrootPKG_REL_DATE="@PKG_REL_DATE@" PKG_VERSION="@PKG_VERSION@" PKG_NAME="@PKG_NAME@" # # Configure Arguments # ./configure @ac_configure_args@ # pnp4nagios-0.6.16/sample-config/pnp/npcd.cfg-sample.in0000664000000000000000000001002511662503006021175 0ustar rootroot# NPCD.cfg - sample configuration file for PNPs NPCD # # 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 2 of the License, or # (at your option) any later version. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation; # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # Privilege Options user = @nagios_user@ group = @nagios_grp@ ######################### # # # Logging Options # # # ######################### # log_type - define if you want your logs to # 'syslog' or to a 'file' # # log_type = # #log_type = file log_type = syslog # log_file - define a path to your logfile # needed if 'log_type'='file' # # log_file = # log_file = @localstatedir@/npcd.log # max_logfile_size - defines the maximum filesize (bytes) # before the logfile will rotated. # # max_logfile_size = (default 10Mbyte) # max_logfile_size = 10485760 # log_level - how much should we log? # # log_level = # # 0 = No logging - except errors # 1 = Small logging - some few more output # 2 = More Logging (actual ALL logs) # -1 = DEBUG Mode - ALL Logging and slower processing # log_level = 0 ######################### # # # NEEDED OPTIONS # # # ######################### # perfdata_spool_dir - where we can find the # performance data files # # perfdata_spool_dir = # perfdata_spool_dir = @PERFDATA_SPOOL_DIR@/ # Execute following command for each found file # in 'perfdata_spool_dir' # # perfdata_file_run_cmd = # # Must be executable by user/group from above # # perfdata_file_run_cmd = # perfdata_file_run_cmd = @libexecdir@/@pp_pl_name@ # perfdata_file_run_cmd_args (optional) # # If you wish, you can apply more arguments to the # perfdata_file_run_cmd # # Hint: # NPCD will create a command line like this: # ' ' # perfdata_file_run_cmd_args = -b # identify_npcd (optional) # # If set to one (by default) npcd will append # '-n' to the perfdata_file_run_cmd # # identify_npcd = 0|1 (default: 1) identify_npcd = 1 # npcd_max_threads - define how many parallel threads we # should start npcd_max_threads = 5 # sleep_time - how many seconds npcd should wait between dirscans # # sleep_time = 15 (default) sleep_time = 15 # EXPERIMENTAL # # load_threshold - npcd won't start new threads # if your system load is above this threshold # # load_threshold = (default: 0.0) # # Hint: Do not use "," as decimal delimiter # # 07/15/2008: Every value above 0.0 will # enable this feature load_threshold = 0.0 # location of your pid file pid_file=/var/run/npcd.pid ######################### # # # NPCDMOD OPTIONS # # # ######################### # perfdata_file - where should the npcdmod.o # write the performance data # # must not be within the same directory as # perfdata_spool_dir # # perfdata_file = # perfdata_file = @localstatedir@/perfdata.dump # perfdata_spool_filename - declare the destination # filename for the spooled files # # This option allows you a customized filename. # Usefull if you own different nagios servers # which write their data to a shared storage. # # perfdata_spool_filename = # # Hint: # The final files will be moved to # 'perfdata_spool_dir/perfdata_spool_filename-TIMESTAMP' # # Example: # # perfdata_spool_filename = perfdata-NY # perfdata_spool_filename = perfdata-LA perfdata_spool_filename = perfdata # # perfdata_file_processing_interval # perfdata_file_processing_interval = 15 # We have to end with a newline pnp4nagios-0.6.16/sample-config/pnp/rra.cfg-sample0000664000000000000000000000121311662503006020427 0ustar rootroot# # Define the default RRA Step in seconds # More Infos on # http://oss.oetiker.ch/rrdtool/doc/rrdcreate.en.html # RRA_STEP=60 # # PNP default RRA config # # you will get 400kb of data per datasource # # 2880 entries with 1 minute step = 48 hours # RRA:AVERAGE:0.5:1:2880 # # 2880 entries with 5 minute step = 10 days # RRA:AVERAGE:0.5:5:2880 # # 4320 entries with 30 minute step = 90 days # RRA:AVERAGE:0.5:30:4320 # # 5840 entries with 360 minute step = 4 years # RRA:AVERAGE:0.5:360:5840 RRA:MAX:0.5:1:2880 RRA:MAX:0.5:5:2880 RRA:MAX:0.5:30:4320 RRA:MAX:0.5:360:5840 RRA:MIN:0.5:1:2880 RRA:MIN:0.5:5:2880 RRA:MIN:0.5:30:4320 RRA:MIN:0.5:360:5840 pnp4nagios-0.6.16/sample-config/pnp/background-letter.pdf0000664000000000000000000072007311662503006022026 0ustar rootroot%PDF-1.3 % 4 0 obj << /Length 5 0 R /Filter /FlateDecode >> stream xuS]1 |ϯ 7NDѪIqmA}NVZgɕtB=ngZt_])'&fJY`ipazgE>P=#V5Ķp<їR]/+ '_ Pm~ !0KZC@s+2gnEWbUGqZ"h,nnҸ9jtѭSJb4c:Lw:4zGC6ƪxN-`At$ɢN&u+Tdhahje1O O%sD 61rsd"Ǩ3얼}7O! N@fHdqPP5vHvh9I]!ɘLyHkQmv 鶞|ۣިNA(.-ڽe' endstream endobj 5 0 obj 469 endobj 2 0 obj << /Type /Page /Parent 3 0 R /Resources 6 0 R /Contents 4 0 R /MediaBox [0 0 612 792] >> endobj 6 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /ColorSpace << /Cs1 7 0 R >> /ExtGState << /Gs1 13 0 R >> /XObject << /Im1 11 0 R /Fm1 8 0 R >> >> endobj 8 0 obj << /Length 9 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [541 11 586 56] /Resources 10 0 R /Group << /S /Transparency /CS 14 0 R /I true /K false >> >> stream x+TT(T051T04T01Tp<ԢԂL")\}\#|!Dx endstream endobj 9 0 obj 68 endobj 10 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im2 15 0 R >> >> endobj 15 0 obj << /Length 16 0 R /Type /XObject /Subtype /Image /Width 50 /Height 50 /Interpolate true /ColorSpace 14 0 R /SMask 17 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xgE`\P KX1 PPE) *EPI2hB, K`Q fATM}{.rLOO;==s̩QFR6j׮=w܃TR &^i瞫X h #Gd;~ E-^{h뮹ʉ;>|xĈ57 m~F}iܸifUժUk֬?$%W\qWb60aЩaÆcƌ1C?k0 n -Ztرȉaʕ˗\dC ߭[sI.ORb?믙i[ҢtI"?c$aUǵqT4y8kxQä ԣ>zG8믿Oq9QZ.]A~$Qmذᮻ۾+S.{|W>iӆSE'N:th[&3*ߟԃ>/$~Dvډ'f˖С×_~7ԫWen:߽{ _b@ cdöbŊ={~9,Gy'^x$ѣGà̙W^;wf ~anӧO'z+ٳ''O?C7oސ!C\[˗/yٳgo۶ Qc{7x(ITi=LRV-C ٿ?(PdɒVzu o=g}-[6_|X޼yYf Euq#h%͚5.r۾}{զMJ(q֯_?G^z)P}W_榛nBwp>q>`;ZT>wƍ4ʕ ']dIB.䒾}2kƔ'4~%)R5kH"ֆ֯_?^rZhAQL;G"!喔߭[;Oq0-[{n".\'Ljȑ :[SdzdY fS :x 4ر9cv߾}_|1:]1c;HnVDjwqRPّ|0尜QyWRf13oGs#= ꫯfbŊ>ҪU+J7'wb,ɕ+n: Ipڱcs{u^׍})w̅$?~mA7oP+}xrw>Ŋ`JDrڵ?iA'Ϧ3fزe NPPw|v$֐*W^.#KɓgҤI*} BPbC-0r4iޑE[ni׮…  êPS o`\SNM4 Ba Io%CFQ,JЀ$\ <裏\SAayB'9LJ;E!ȍfJʌn_.]ԩ9O68 %QJ bYq D) ݗ]vY%숷%:*adK7oެg)K 釻;X o90}TiQѪЗd9Up@ I5- 7EN@%*xč6ÝA%k71KZ2dIOzʉ\`؊UIY))$J&w_'@-򧷣\)_QwJJS0ᚼ&M?p> stream JFIF,,CC] :" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?(jZ{miuחGoigioK=QF(|[][)/$ޏvX%tcc`$}Qu|s5>^x{Yex%K#HU}{n@d)#>J>1Φ"c:7VJzqyQ+5ב_7YI/o .' kl_/C}o/tiz^m")oKk{b7O6WmRX}O>DJ-_Af7;.+ Vr g@H>#v8>Xp']CKk>:)(gCJ3Z$ wg/I`?8>:)(j_G%+?:Կ&P`?8KWC?uMxRAgCJ??/._ !֥4]CKk>:)(gCJ3Z$ wg/I`?8>:)(j_G%+?:Կ&P`?8KWC?uMxRAgCJ??/._ !֥4]CKk>:)(gCJ3Z$ wg/I`?8>:)(j_G%+?:Կ&P`?8KWC?uMxRAgCJ??/._ !֥4]CKk>:)(gCJ3Z$ wg/I`?8>:)(j_G%+?:Կ&P`?8KWC?uMxRAgCJ??/._ !֥4]CKk>:)(gCJ3Z$ wg/I`?8>:)(j_G%+?:Կ&P`?8KWC?uMxRAgCJ??/._ !֥4]CKk>:)(gCJ3Z$ wg/I`?8>:)(j_G%+?:Կ&P`?8KWC?uMxRAgCJ??/._ !֥4]CKk>:)(gCJ3Z$ wg/I`?8>:)(j_G%+?:Կ&P`?8KWC?uMxRAgCJ??/._ !֥4]CKk>:)(gCJ3Z$ wg/I`?8>:)(j_G%+?:Կ&P`?8KWC?uMxRAgCJ??/._ !֥4]CKk>:)(gCJ3Z$ wg/I`?8>:)(j_G%+?:Կ&P`?8KWC?uMxRAgCJ??/._ !֥4]CKk>:)(gCJ3Z$ wg/I`?8>:)(j_G%+?:Կ&P`?8KWC?uMxRAgCJ??/._ !֥4]CKk>:)(gCJ3Z$ wg/I`?8>:)(j_G%+?:Կ&P`?8KWC?uMxRAgCJ??/._ !֥4]CKk>:)(gCJ3Z$ wg/I`?8>:)(j_G%+?:Կ&P`?8KWC?uMxRAgCJ??/._ !֥4]CKk>:)(gCJ3Z$ wg/I`?8>:)(j_G%+?:Կ&P`?8KWC?uMxRAgCJ??/._ !֥4]CKk>:)(gCJ3Z$ wg/I`?8>:)(j_G%+?:Կ&P`?8KWC?uMxRAgCJ??/._ !֥4]CKk>:)(gCJ3Z$ wg/I`?8>:)(j_G%+?:Կ&P`?8KWC?uMxRAgCJ??/._ !֥4]CKk>:)(gCJ3Z$ wg/I`?8>:)(j_G%+?:Կ&P`?8KWC?uMxRAgCJ??/._ !֥4]CKk>:)(gCJ3Z$ wg/I`?8>:)(j_G%+?:Կ&P`?8KWC?uMxRAgCJ??/._ !֥4]CKk>:)(gCJ3Z$ wg/I`?8>:)(j_G%+?:Կ&P`?8KWC?uMxRAgCJ??/._ !֥4]CKk>:)(gCJ3Z$ wg/I`?8>:)(j_G%+?:Կ&P`?8KWC?uMxRAgCJ??/._ !֥4]CKk>:)(gCJ3Z$ wg/I`?8>:)(j_G%+?:Կ&P`?8KWC?uMxRAgCJ??/._ !֥4]CKk>:)(gCJ3Z$ wg/I`?8>:)(j_G%+?:Կ&P`?8KWC?uMxRAgCJ??/._ !֥4]CKk>:)(gCJ3Z$ wg/I`?8>:)(j_G%+?:Կ&P`?8KWC?uMxRAgCJ??/._ !֥4]CKk>:)(gCJ3Z$ wg/I`?8>:)(j_G%+?:Կ&P`?8KWC?uMxRAgCJ??/._ !֥4]CKk>:)(gCJ3Z$ wg/I`?8>:)(j_G%+?:Կ&P`?8KWC?uMxRAgCJ??/._ !֥4]CKk>:)(gCJ3Z$ wg/I`?8>:)(j_G%+?:Կ&P`?8KWC?uMxRAgCJ??/._ !֥4]CKk>:)(gCJ3Z$ wg/I`?8>:)(j_G%+?:Կ&P`?8KWC?uMxRAgCJ??/._ !֥4]CKk>:)(gCJ3Z$ wg/I`?8>:)(j_G%+?:Կ&P`?8KWC?uMxRAgCJ??/._ !֥4]CKk>:)(gCJ3Z$ wg/I`?8>:)(j_G%+?:Կ&P`?8KWC?uMxRAgCJ??/._ !֥4]CKk>:)(gCJ3Z$ wg/I`?8>:)(j_G%+?:Կ&P`?8KWC?uMxRAgCJ??/._ !֥4]CKk>:)(gCJ3Z$ wg/I`?8>:)(j_G%+?:Կ&P`?8KWC?uMxRAgCJ??/._ !֥4]CKk>:)(gCJ3Z$ wg/I`?8>:)(j_G%+?:Կ&P`?8KWC?uMxRAgCJ??/._ !֥4]CKk>:)(gCJ3Z$ wg/I`?8>:)(j_G%+?:Կ&P`?8KWC?uMxRAgCJ??/._ !֥4]CKk>:)(gCJ3Z$ wg/I`?8>:)(j_G%+?:Կ&P`?8KWC?uMxRAgCJ??/._ !֥4]CKk>:)(gCJ3Z$ wg/I`?8>:)(j_G%+?:Կ&P`?8KWC?uMxRAgCJ??/._ !֥4]CKk>:)(gCJ3Z$ wg/I`?8>:)(j_G%+?:Կ&P`?8KWC?uMxRAgCJ??/._ !֥4]CKk>:)(gCJËƾ2ž&tZʒT.ʒJWw?7*˦|LkumR_(^^ ~_ 0~7ICʊ}Z5!gT>&~jE$c}7&;鉀]6T.9._ƚd|@ޕ{$tlz y &I`Co;sr>|Z|E6B[ ,AGBw?E,̶M. 0V?gIsjZj>yv-Ŗg{i:}ɭm9r@x[@W]A ,< >24_O*AaLybXjnD ޴QEWo{@v῅/x3׆jmzoP6\!Uͽrj8(ɣc/׉\y'wCt}C, Ư0,[ȷ^QOMnkZ57^n5mkV[ker ;Xෂ5yxmX_>[hU;_Gg*à"@Q—Z~q^QY-Ngty\Z0M!JoR Yh(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((啞iqaZ[_]YAեCqo:<3E"E~p~?1Ay_ Y4%[ ) '3>Y%dXtJ(]OUb!sEҟvOw3O] Wbft$1ݻ:"iԧ ~n|Yv6x0vQ1kHL$ZQI8?xW74?hS_ں*#%n-'ZWַBࣰ ]x7:o+Ni۩`bVbhʹPˈdBZh S>c,haZԧeD:u}?c]G*<'-?FʿuxwE4ZD;bOx[>uڗiPy-UϋuBb]x=".^eP&|ry5oED~%x4m+Ig}vNM"7EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPE7 U3О }w7~mhunX59<:nWpf2A4I|Y1;;!i,ƲFNҊRWxjuX4pjՔ`s|&CYV39`p4Z7uN}R^:q56ϪiL׶Hãʬ 6_lFnT?AR_`2¬#9eVM<8~de4x|5!e?wDΕO=GA+6z+2OO-~$ GKm?gJwDΕO=_eP1e7Z _:XCiO-?:W m?9u*jcj{+ &'[Oߥ6WZ^d%E7IUуUe$ W3WI}Oxx{[Դ[oTnmS\k ~žw3ܿo]O'¿ *mjW7[U +trQ Үtil-PwӃ<[쫁>ϫ<&K[VJXe>/:xNlg514:~/>վU&>^/'Ԯğxgc6{&|W{ne[\[wi<7VPsmsm*Ooso:,3G43F$R̒#+ S(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((wžiwšBm3]ޙvU4.aKILwV470*tR?׵j#Դ[PѯN[2k;8da} WL25WOţ|{A"2hqH8on;}727!4-F[Ym~,xJxFM֝h[ -\.<@Η]w]YG;mNI'; >ZŰ7ȥ7]F* Bbb:w~'Zӕ~LccԿuQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Gk6\۞V?g. {aM}G*vgm733I_z_9SuC|Q@_ / /cQ@? / /cQ@? / /cQ@? / /cQ@io05[aA FA ~xb>*@WN>KGBy<+Ez_~*A'_pǕ/LJ 7^< twYC~8Ҿ,Nh#k=~>R8$WQ@`iP1_! 4_F" ?7 }-1F?knwƏ|APvP(u\2_P>_mߣ|C-'6;h>i*^3!'twZxR|dc狾 fĺ>!]bG,$jf{%?%WwxI>1^~5-~~vzwu9-<=&U־wzii^3 I,/tV"MB4WC $T7ٿYCGோMUV=CMGZE=W݆4QEQEQE S{] Q kV(n?8QH>=R8f ( |9 ;ٿSIo?ϛ HCAg~HCAg~ HCAg~_Wn/G^O]vg4]NK״kœO['P{ۈ_\C~Nco7ãijݡůCyυkD񯂮q-76߅n[{Yu - u஗K"I\E#Z>=Y$x;`O;X\x RR45vZqm׎Rtk> )⺳' h')t7d`H( ( ( ( ?BonO? ֗3[4\T9аRI$zJ]@ ; ;5 ; ;5 zOګfMoW9?h/(#|Fڲ:YYI A _'[2|ՑwJ((+.mok?qz"~_Q5+DEUUYUPU`WQ?yǿZ+?#u_?#u_Ƣ6#u_?#u_Ƣ6#u_?#u_Ƣ6#u_?#u_Ƣ7%:lF &~VdҴt6t-mxY)ʜ9RIShDśRKbt_W5qnwZGaR|F4W! 4tS8v0+#( ?ХE.Q|p䍑!|s!VUe*AVPFO # #O^ +ψ[?'+>j_PQ|;_k¿wI/2$g/ <NW:&c/1_4/<1G}_ٷς;( -~%]x[r%{t;qP=~]&_FKJŝUa[mWg[ɶ4 3[~>ԕXֿ "j[ZhG@E|ٟC_/Eh k6 0ͨ?^)xGGM^ kMNmCMԯ>(((((((+'o. [/ՖkG"OŅX7Dix93\`*tx*<3<2',6Sae:oĸI j1VWO>M\ p q1Xex1Xk,׫*xl5*ؚԨϠm7~iPxZ OT"+#r |:m[nOc˅.wZ>ZR^zs-ԧ/5H"hTg\\]Oww U׿jST+NQj-CPUN־1_XNB;?v0χ32q|XFnߗ_MC Fh?gȳW⮳ir9YnuC.-+K9ZvX_}S_ \mZnEKR,GĕT(ѩ7[6I老8-Wg cBjK:h)Uħ|ڬ"7L_UOڇÿ>MSNOߋR\xgczj!NԼGwo%7)ihCZO_ց-3p8?g&~ 㿋;kXP`BЭJh 'IQn.. ( ( ( ( ( y?!m=?g[M$o_"D0$0 "x?Aqc1??wY?wYj(g?wY?bۧN|-> PO|6@u7 _,\]wŚ,:e" 2y-5{-wJ~6?~ @eW_ %u4;m|[Ŗ%eQMBo4MWL޿# ^0jVu?isGѾ,Es,%^Z"KGCDZ<1YjVzyk麍XCwe}ew \Z^Yۼ]ZA$sA#4.F쌬@-QEQEQEQEQEQE>\Z n[I浸s緕7QK+fFr)$?i}zOAg^:?i}?i}L2侼tkD-𙶫LUrI$5WL?j<[R k7((((((((((((((((((((((((Z'5RTD_~+UUUUP-'\|{ի?wY?wYj(+mR iC}j/'+˛A@~ͪ$TGP]8pۯ)'OhٮӮ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( t?(+.?nO-J5J $|r¾!  0f>r`P+J?b.v+x@:t<]#_aֿs_??/%~_xFíP`?&~1_GJ(((((((((((((((((((((((({_?~W۫(((((((((O|sO6|A|S%麾!We#Wz<&-Z5hn4JدCoH'Aԧ3^_x[\mCNRտz{~__ڧnW_]ؼW+z+%Ky]h$Ezm CE|$_ m?ٻGOX Y j=܍-|'K=_~&IR^ѵh8W. ( (?÷ )-~ֿ~ W57R[~@h((JG7q}ɾufEoJI$/oaqyH[[&/׳ߴO[+n<#Sx7\{D~jDh^$gԵ=d6y+O&__:[V|.{}>_؝g/54 {Hu QY鷷0jx3Xω jS(((+M?=~_.ʿ>#HW;( (>?fO8O<5__$̟pdxjҀ ( ( ?gO3Wugqg9V:( ( ( ( ( ( ( ( (?GT?_ ]A돨x{S{-3sP/;I&;8˧zs?|iek&=FyE?>HfӟLj4OPxlmeÿiH`%2G2Otk/ĺiד~ ?୾4P'=GRԿf?inB>'hZe5 kH[s7^&z$X-0 o/KAèiƕl[麞uo{cw ͬM:ڠ(((((+#<"7Iö2l?dojA"i0٨Qt+8g>x׋eG#Uʾ"1SђuԄ\zn+nfF;ѣM':][IP(xUy&҄ ybAKcQ_:MWSux K:[ybCpMNi[dy$y摥ib,YGfy$v,K1$W5]WRu=CZoM[U5-Fy.o/inIgy$س3Mg} +eIdh-`In&$ c10JXUjXl6 JuEyƕ(ҌVZN*qNQ"yVG F#ZRzB4iAԫZZ0J#)ԩ9F\M[ :g~t˽g ֯!Ҵ.&vH(Ԝجq\N>'u߅_ n_ ͺLViōBs_xkeEׄn0!qi^S~^&>UO<9+M[e+}7#b0IU){vnY_J%G!^l|ӟƯ֙wuo>E[E{e]ݯ| g{oxPK'ÚOGDêY(()q|/q構q;N2\rOazo)b>s2*Q(>YѩG!RN \P~^U?+K#Gm3Ú[Xj~1V3xg0ͮ O_DW6 UZϋuHeM;_Oy<f&woUx:Vxǎ^ ]S^;#}ވV ?Ob9k6vZmP֧ ~?M߳w%1*j>)N-o?Ƴ>?Conu5Tm'Cat'@t6JE`((((((~0 +~0 ((+?-!+ wI/ᯇ]y|o2_ t&< ,}B;>خru9㏄^?_?~(߉O' ɳ|7j60P $NS˚)aw?s#W d4/&~_ ƙcƜJoVna4]/VvW>"X\ůA GRu'eQEQEQEQEQE~Пۣgku?_t'ZQE3(oJ|%޿2gQUK_ٽQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEgqg9V+?j7 G|{؏^ּ%]}b?z|I:ΉGk/[Gso UE~3\_1Qq |9O/! lzOOa5^} >!u֝ cĠ((((((((((((((((((((((?nO-J5JOۓKp;@ҍR+?\Vi_us[?~Oc+Aǩ+5kNW53R?PQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE>s?&*{_?~Q@Q@u {GiD~=GhKɷϥ4 qt_:oo] [apb2!_ /ɴC>LtoD;Z?LtoD;ZAZ(.#b ? 㛯{Znwk7 'iz yҀ wvCd&x8_dPkd7QLt~Ǭ|=X4R0b r98 noſ LIiy&H|(t'ė$[VeZe [ ^6s?N =^]#Y9Dyml|k ~[{cW/}^xÚxI8ھ(( ^xwGO&|B_߳܍w5eaegztrC[~:c¿#k;?տck]ۻ%/-OcVLFD>%q$3_]c}eYZmݽX_Yť)qkwkq _'[2|ՑwJ((+(mG%vx'C]GG:\iCW΢-lLivCI1ѿ%keH_{߲WP ^!wFa_FE<%!#rp8G @q8ER~Th5RND d@bJz zLiL{/Mg)Q@2+ ~6܈ALv Ic~[kY<τ[#|X8[k/|Z񮅫\PD _> `4QB$ߵ Uiio;&K,!/Ws,Rj_/>!Y2 u_ I)m"x'ehRE,n$DfGGR ^׏#_T5*~Qº|1|G&bl/!"xQ}[z%Xchig?O~'wχh,"]Ywe}cyi-ΛhZΝqkx:5ZyIQEQEg.]@^OWiV^ 2_^vѴn/ÿ&|NmtO OK +^Al?Ww/`g+ZM;ka6ȵ7i Z7e??7`fX$)'PEPEPEPEPEmw~,bҼ=>mKTaR(c=A hcqL1, _b† RlF'^N a:ԔaNe9IE6ob1>B+K aε|F"HҡB*jSZYƝ:p()ߴ?ǯ |a4wϙa? +k2ۦ<:u+s;;]e͍A)o>3|CݵbXANH,-#>]1ĹX7?čKzeM]VkhVhԯ nvMzߥ_#xio*1%:9⥗etqxG~3Z4kS;?O5cG5I=L6QE!aEPEPE|O/7&Ӽ#iJR hp172Caiv0j:sk08</1p .#b(0X<%V/8|6F3^z*4iBU*TaI''upZ5q8N"(zZ֩(ӥF8ʥJaFRQM|JO'ğ~' iEHDY./o'h.KT'[ۘ JwnxO xu/$i7(i"ƾ=[y^ jhH|-g3[Z5ޥ6j8Q(׏n/5zpmFd _me{mCW3KENiZL7εH$Wl`i|dfƣMwᯆZv[/agk`I iίe}x/ ^MzX$Nn|eєytI/+* MlaX}>z,JQC#͆F5ⱱKap_I$fm|$¿ )>|si>W[m{ > -սΏ+_߰/:;g ~͟?"<8mu ~!s5]ŚBnn V~a;Gޓ:__S<?g7-Pfh|S]Co'E-RZAkko iҴO3(((((((+?_?J?_?J"j( (w?'ƫ j~>O#n~ /g(QW|-ovhYI5f,8(?N?S?JߴgP<xx;(.6jxFE+Ok2_$i+sMٟG/ߴ~ O¿>Ҽi|GFՠ$w6;VӮK4kԴ=jP;kmB/`G U#dѾ,/@6A}~fW㞽,6pi]]8Inf xcG NNz( ( ( ( (?OAg^:`/:PYt׿s (? ~_x>o_G3(oJ|%ހ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( t?(+.?nO-J5Js[?~gC%o'@·k?:kgDu9\$?=K@wQEQEQEQEQEQEQEQEQEQEQEQEQEWKV x <'CXŶ?dݕ#Wm&@" cًI'7u xf&:~ 3'Qϔ5\WW|/ 0#K|Y_92*T 4/i,55'M6뇩gpg Va&rdc'}GPm(`y-I(j}oqݼVҤ0qo4gtsA2,J$R M_:~>3rM[<+kbL}fijdܶ.ؑԕe'/p ^ ?gT28˰(F/[;xI8os9s+um|I[4趬ڳѵQE'QEQEQEQEQEQEQEQE>s?&*{_?~Q@Q@/&< Ke6g_@|?@EPEPEPEPw o*K߃7^oVfo]=>Z7DVx;g[+[5kZ6cV^h֑iizu-_Z̩5[][ʫ$3RWğ??Y۷^BPD[ß|f0 Xž9UcMyQ>Xz( ( m$+K#^kI븑S Xxw {? jL2ã$u?kn5]GOh"XxhfXUHHFWGF*C) @QEQEWzJ]_ݕ |G' Qw4QEQE} $̟pdxjҿ/H?> QEQEgqg9V+(me_eH_{߲WPEPEPEPEPT)3c">b?w<WNE"~zGu dj2^m73ź&S[k&mX߈4]_Ahޓ}eiy|ZMmq|C+oSl_hϏ!i?ا{q?߾4|ǭxQ@Q@kVcŸ>gMGğJ6"F1|\#kr1yXkTK4 cMHS`UHxmf\7 F t;w1?c?].nS(#p>?Sprĉdi uQ@Q@Q@Q@HPY $ I9$~ߵC|`K7NៃE嬤omLȎR}K--dkYdOgB?i-kz_(yx^?_|KM7^~6ڬUEQ#4חCciqϨjͮ\÷s 3ۋǿi|'|? #RExƫo,(TOam6M/Lyu_Y_R?~^:>g_꒿/)k[P m=I\򦃣Ho2v[Z_2h/*34;3eaW^ ;݈/|K<-_W.,|-uk,Mo\ѿ f G 8qkeXµbiۑ' .&1بS]?7c%_ V+'R+:yaEʕ^,Щ~f2* þWaiP??I E#SiqoLվ;|tt<)S2E)myi[^\\i^C~wO5x:/ >|{ۓ׊u˸- x[C?Ki[[h%'G2`K{s ?f umq>6?<[lZHFkxsWm#J"C((g)5/(繍t+U:pS:vnZH|1` s{ ".~!RYuw5χaq-汪\VSh]1[R֣QJĂxgqa_OFuET7`#R9djS~Ҕj ugFux/j'έ<(qr҄-HeԱs-*Wg*3i}So>4uh~+['m.&Iguk&嶗"zZE__۲y?"'h gBMg]l|I+oI\]Gg t|oI]V0qsF}^+pw#C8#q1Iq<# U#_^2VѯJpےxxcux[z<.NxLL1xLVΨp)SJUJ5iҫ jFTIndrG4q ,RIrF$ԕtu!ԕe A_QEQEQEQEٿZc%CٿZc%5Q@mo SeOoAav>|G$KoEyb# ]Ŧk8/F!goP_gs*|dhǯ&|&5ցƂwu<<_}S~03/yj6qokt.-`¿իk/(蟴O 4kR4*_V~ͮ|+eEΣ&⟅Mq\xqKk37hVGFdtu*JYH!A@  )X G #i(F`ണBx.lٻ0kcM07T^]7y}~4^ ]'i i|'S-
      0шsa5ݶNkk3?,VvmߔQEQEQEQE~Пۣgku?_t'ZQE3(oJ|%޿2gQUK_ٽQEQEQEQ_574gdM>T*ş6eľ0VV:WcS`r(J+zKmOZb\CE⏉Zs;Kl~vM#,7v$o jd|?0C?I&t+3#y c7//x^ӹO66\Vuiy w!PWS\|_jE3 5V(ģO𥏈-<3Nmcpe >0u}W\S=CXԮXΡI%绻kXIi$bI'9&?cS?d=wS7;>61wڼQ{l?no؟T+LeFL˰>N06[F#g_[E= x/G;lKO F~r6,Nw+6HB++~w[ߴ߅8_;-ݞ1_^$77RYaqyw|Z$l|?J@?J+س AB#7do Ɲm ψ#mqw^Y |OkA7.vڽ戺s Gu2((((yyi]_[[y{{y#|a4 ouzH }JEn/_VrZ._#*=]Z ~ 47fnl- QR#gQ+h@ﮊ`fC᥏kW6x@j bЯn!Bh/>"Hq,v}>4tf6 +4_'ge஧|i]w _^"e7 ּ ˡIe {W4nOW#(Ч>jSZ+2+o O!G~|?8X|0~-jχ.GxF+V0Dh.pgi፠x?( ( (0*Ÿ x_I 3|P~TCw2jWP|^4v) Go 2ƠEWFQmO:9|eVc3>@kE?nw~Z]7 SFY/W_oh>.k'H޴GCpXL\fQEQEQEQEx#OUD|\_Ί|E>%2q ƷxȚnC}jm]\DE{$/V?K im%|C9H5='H^,3KjhDLX* 㧆?f \¿ .q xO|OhБ!o#4f`H@?.sOKt|t9Bu'x+אbjݜeem0A_s?y>2\\yW^'Vm%Fiƪzu(no؞[a,|&? +݀RM̀vc$O?> |@xq,# ^$m^i(3ZPJJU Ar<9?ފ ߷O>^_?hZƏ~ӥ84Z2aYLYuoe;; OO_oPMߍ-?[03;ǿ }5Gn|c.ͰY + +<Z_oLo.ܤ '񟆼?yp|iM 3٭-o RPEæWu+D'mU."԰i{YEU/lYu k+d2\]O`dwH@Hr@59_m_wfQge~'-XUȟ~/`Nkğ:v|sj&G9y uMNY̻I(׿k?·Zx<7unH׾5|6 #CĶDFCn/ثYã0@|'tk\r:wª{O|^MO+_>]_W~Y e?2$O|iG-k?*3_ |3&!qH\-eIZd3C7߲Ļ'Ÿ~ϓks;ƥ?Ư9ujZ߇m g4LvZ:Y0}рjWW] ߳| #ƻ:gWG#2i>$g:ňy^$ҵcQEQEW%؝F_urn'hQP؇K!-+N?b.v+x@:t<]#_aֿs_??/%~_xFíP`?&~1_GJ(((((((((((((&ઞ&<+ ?ھ " 2ug#P$bnʘsJW㧇<;5ep>^꺶pHtA Jӷ>cB=#3<X2]}YI$D|c.(sywZ-]/c08ia*'K?Ɵڟ {i?_o!o=3zrq"IĨK ~d_?L`|}u{-XH=Z &_P|g~ZXY3,kefYM4G%$Ywԅ?g<>YĸUks}{ ꗲR1V۔[eQ_קhQEQEQEQEQEQEQEQEW۫`_9SuC|Q@4QEQEOd3/>zg! {Q@Q@Q@Q@k ;[~vVݥ?gR[%_apkvϒZ5!l4EGƾm|Dֹc>λ/Um{ZnK쮯n<$;`;~w7T_i/w7ryZubx|ۉDxw$%kh|EPEP_i_CUe> he_c抍I $(duuY]Ȋُ wlR-q͙|TW>e~?y~ݸ~EQESIo?ϛ(7k|3@Q@W2h:"txDa;? /hzMHn.k|?׋<- 4>(_ 2xR_޳zϩ|TtҴ?θvkOK]xN(/nt?kb￲/o:~_E'>(m<3~ K][úRu/ xCԼ3!-[J,诉?W_(?:AG.j ~%h~ḵ!ް],eOxzDMZ}@Q@ |G' QWzJ]@sEPEPПGog _VG+"d:ٓ WPEPEP_Gl~sjr?>=]|EPEPLI{P*q_&_ g(QEQEQEQES-A K?|{x{Dsgh+i1ZϨjޥ_HO%ĭ{diyhQ@Q@FßOK+,m0+:˥=!CֿZ{ˈ--ahFY(ay%f`k> xO_|6_ | ydo$𾕠Ŵ٬ &iq@EPEPEP^%A|m/ώ)Ӽ/4%IuɂmOL1$e{{;ynnnn%HmFiFXդYR4Vv`ll_t6Y GĒq~-i0iv. y>?Pz }c(GCGA^LEF*3Jxa*b+NGokxuaY̸h*}MJlͪӝ7(3ӒF'w<]]u uOxQ5Kx2\6BE GmgkX--!Ha<^/M|f7b5g_bjJ#RRZzӝZjJSRR?L6axJL% Xl68ҡЧThQSJ#N8EFRI +((#qƬQAfwf!UUA,Ā$_WҴ +SuJF4]>V5}R 7Jy/5 GPxl!Hෂ)%4f?G a~1UQfjآn~+k2ugXA3x?h6^?MUf_–ЯƚT[^.diwQ0藰$΄ZKԿfٷ7y?+Rŏ> ?ƣk7̦Dχto5xPh C/GП蒸7fXex;1}ׂtR7bJ<5HYJfi_j~Ϯ|Q[[)-#Te/헺g>-OS?kw~W\ Q@~k~mC94|@Kk:|khcRk^"lNN/ncn^o˫|Al$ǍtDg\xk0tzƩ:}j4I$I$I$I'Iֿojb? i**,W#:X.jr*9rTeF`?EjY'`dFPy%:y Q8取X8J8|f牼O/k|Wj> ׵YPu[n.e<R(,V x4plN'W1xUjN+V|F#ZnjՔ֭V:jJS)96 Zpj4l=*thaS(Ҋ*4iSQJ8F0N!Hkߎ)ctj|_e8Y4 k 5%UuoQ^o%1.[7:W׼A&ꚾw Y4W[Ŀ4J9"A?૿[ X r Nvhڳ[LmIybũ)G i~4OL_OTt%]?j G`bSYdȍ Ï|<Ȫ9;&ʔykjq4sV!Y/m[+>cƙ:em;CSEe|=|7wr7_I.|/~~߳ox?~|#_7[|OT!Mڕ=T4دu? ( ( ( ( x?Aqc1𒿡x?Aqc1?Ț(Ӌ i~|67I SLAWu6:ٯumoo薿^cO7?'xw? j Dž5x쵍[{[DwWnK3TQu;{MSMh, _ O_a׍?gωv~jGw<Ei+(o xK;-ڏzx E]5 WQ>7h <mi]M/xL{K⿆s7[5Lj|#{_ Eu "L*?k(ߎ<3x;]|QhzW/]TV}F5/v vW5>%Vx]L׾`@((( ?G{??kOAg^:(L2gQUK_ٽdſ)𖿳z((+'^״? hzljO>߇o_Vjzj[i^eחZY-ı$(,*%dO'+?/m1?dϦ t//;E > OZ{ϢV/լ)~^|'B5Oz4zχ#Š."q>k#k?h~:/rgzuFvQa"FLt4mm$KtPEbP nneXmmmWgH$ye8ՙ o_B+j ?`>[iĝG_.펡Z{k}H=BYP?gZtW24n#`ܡ/ßxI; (F6X@?z+*਷-ǿ?O?>/K9nb7 q ~IgY0Gʐ+x?U/p;NMhۯ?nOw֩O{4k4C]/+`xr%&"A ~Mo賵oh:|Gܯ޷MjSXր9(;߆?%χ&/|'z|s^}K״+JKG(hY^'to31}7?c)V S͏>~񥗆|%#^|#K+m5a}(i~i`$8(( Z럷wѮ~Z=(LzO5{_gZEϋ5Kkc?ug75WA=[.?\o ( ( ()?\?k$OKO߉7vW:?tFf|io&KkwiZMijٚ6B?+u/ڋiXo,<C[mWg[[{I5Km5;>YM ֻ˯roj~Wn4C⮰UaZn DuZ~~?Rߴo1)EmUӼ'{ Ώ ,Z74q#;ϫk &Ru;(߆ '|hÿT(DOß k5f)x٧x{vxC$]wW5 9YzڏǏ~ E^x. |_YN`faE_vew*{6eutv2N3Oo3mci#;ׁUCn-[B ?_4>Wc4?I3FGIb@`(?ig4_ڟk2{ҵ/x'XҼ15<3%^'o?QRYo`ߌG?W׉~xM'KEYy/ ߥχgዹdF}m AX=VD?q*oρ摦>5 OM:PGfk{Xu߆ڭ;d7,4O^$|%>ǁEC^W^4_s:-:蚾5^XY ͭ1 ?>#KɯGkS ucgB<<,h/٧|Gd~u/xSǶZUh&m RhVP1k>{];\]٫_'T?ǯ D~_"?}@EPEP_Gl~sjr?>=]|EPRN?h1?]]K)8> @utQEQERbTH2I'ZK;];Mӭn/ BK++H^yaGGTVai?pڛXUx߲Ջ^÷i#eV{-_1^__ls=F٥7[鴿~b럁g2?nf?gzD-ލqo7i,wxoW<^YjvDŽa:ڻnګW2[F3gw"&%| tFMz6 ֭pJ1Q@Q@?m HeԺ67^)y<ކd6=FǓxOv7+u |@OgMu M%Znud]y7kwB3kWpM/W/UFK4?\&K13DT]7ɶIO5l寋igg}>"o`W_?|&/.aP XvzXZ[ٽLv4qIE}EߵOk7*iqN)c,%ēoYa|Kh9t CR&96v6>poǃwƿ" 5I~!$\mjr\Iha(((+{՚_kGKR-hoGW,zo V<=sLo4_xKZQt_:?MS|_h.j^gï٤_]m/Ɵ4+)|b>(H)׏|EZ5=oY1D$+[X+xb8 (i~[O|J(Ew0_jV~"Ҥ@ |ZHJ혰e_B'࣋f^0qkqodm?WsNrFJ ܢωg Zl~6]F2h ~7^i:JRf?M4fբ@kƥj%;'i W ZǗ~2iDMG3wsJʱYԻWV EGY_ //"{#uVRU_h7IwryQ$ߊgAttZ4eH!|-qxokKgNS5JAa-+ >.5a?Vu}cG ?OI!9'I"7d9$2:A_?ԿC{_IK,ih7Oj7%͇ Km|S\-(+?N?Tغt?((C%o'_;_CZW:.0_rIzQ/]#_aֿs_??/%}EPEPEPEPEPEPEPEPEPEPEPEPEP_̯Ssx|5+cQp_.wq=^BIbI..!En'(aFYTEfck^?|S_܆>#z9 }cQ% p NHqո'SC:ie4r~(mJqvߊ42 &Yc4|1mxCQp_Ict؉  ޿3cᏌO6\^6XZ]٫Zަ` |:<Z 8-_\+~_d ׆m^L+?S֨Y((((((((+}NaYGMU)!>( ( ( x_MxP=Wm?τ~=Ί((}'EkgSӴ4Np2wOu,Q.'.09~$?-7Uk%c-h/ܣTVNj-/gvA$8وj+?#ox㯈iO+;ZE#}$w &LI.t{h~!9+N75{#Ks`Zg*Gaˤhdumw}^v7@?R/o#wLw5wg:u)4=I. nCiE[^T4˛lu<' EQEQEu>g#.v$E֛]6@'PEPEPvO%P>oW fK|ߵ߈QE>ؿF~յ2bV_z~]t+.[iE|uι+ ]/^.=G?-b-Znkx&k~/O~|VR[˭3֎Vľ iO&m}7RI_@?e_:IӼyCjC4z79r/xbY{ ÷:wti0[_}QUb((O IGįe Ԛƅ_ݰѾ|EiWK7xiMӬ_ I2 {P7CF"+:0dt`YYI *AP?5#  ;7'?le YýcY5oƜFpgVRO)Ӽ*J6/h+M?=~_.ʿ>#HW;( (>?fO8O<5__$̟pdxjҀ ( ( ?gO3Wugqg9V:( (>eH_{߲WWr2$_O=CWǀƨ((xg0xB5ƷL <[xjxg-OR+㟉S'7:P?d[ɤk' 1džQ>tF[iF}X#'|oŞ.״_ xW:Nx#,t?CmeuoYӴ'L{CQ[7q~w_6~%מ#OӼ9}$Ě߄<+*wXQ?n*a<v_-Z~_ 5J಺[ +6F;[58_~#IP.N*̿nq'ew]RD,SZXZo m,ՂoF|9EQEQE~gKڷ jZ_?h_xM.>0?hHEoݨ K$IdSuv_e/y?7/C|7d~ ]]#|MK^gtS<<6&+Oųh((ߌt/ O_+$?ODSk:4݈fY/Z(c춢hǙg9gc(>KL- B'-_%*46rbO+1e-\nec0~ EsU1uCBm.jjF y5' 5G u>xGP1ŶIw㋫YHH#!+#ȷ,DM[p?ƞ0 x_oQI\j+Op,0FYvV|[H P9'%e|W™MY]e9U*RRc2eׅ)}Z? x,/M,Èq14UHɨpх<2\pzRoRQEQEQEWW8_&ƚEݢn{5mF 㛈$Ɲv{zK; ~ 5+K+>9Қ7s—b{9|wS\ŧ" n'Ɲ׷ޣjuq{{q-ԯ=$7W3\\L,һ#'; L^Ư_X&yaj$Ѩ-Sk*81)dҎcAa^:2 RpUwj9:X< EV&m;* x <]_G|+ S]'|A[Zi-WV66v3jW? S|ǟ߶OYIpmRᦃtq\Ei?56VOxnwpXbB!8G_QW@7_~xħ,mO^ Hk![xԉ?jg?zcO,(+ :'ĿXuiWnbxV] Gah&ϓ)d{exSnV KDʶ[ek F*ۈgFVN-tKx:GƯ_ϩj-퓅$Pā R [h84_. <湖.'8oEգRg\h`'pPeye}*!ø C*5:孕|c#$bRFQvgfwfwv,31%YI$I$E6mwm{$%]7i}YPUaS+?->WƅsJoǎ>84Ci%qp,av;1cF0b(1c%I$JC)9IJMRnRwmmսYEU((((+?_?J?_?J"j( N/2QHxT_;_Q4i>o((3 E}bGgSO7x9~&B&-MZ >ŔqITm-C7|A%'_>+SW7į)ּkfռ=o_Mea7k{$\[5+9-fi?꿉/;'>Sٻf_ ;mI]̵ğ>O{]L-զ_xii#>45o $_{_]ۑ_SKN¾$o_K/Ÿ7],5I%,2$7>5"R~BPE3Ojo(wZhskRZIyx3–qMxǺ1I Xk% I⸾Mαg/-" CoLJM2|<-0~:>cgy"Av%%_{-ۭto i)}CZ/7?~M w+ð+=o㿏-,eχ< i?Xdς_|5g-t[ oM]"-MW2֤5?&$[[{Kl((P?aT?giBx q͸_4o.O5ui$[(jO>1`Sf xm}cվ4|m۽G^Ү;X'|;ЭϩCšD"Y6etIUՑ2:0*VR F ' +w}t)9|*thmtOޝ7ᾏp[i\cYtKx4?xº,S`璊(ԟ"~Rg?|~"i_ ~0Әl.R~=*+;TZ]?SFI"X|jzs'o[ώ_'MSX(~Ͼ5׮gk|E^|D.=n{fbZYG$}EPEP+xGᗂ_t x>|e?w+go.\.+oZ]ܤ@o *⟋7΍rj>$pSŵMSLYǟm?.3T'9$9?9v|2)?>8K\47zW_ SZo4ICq$ ɠ8״}F" ?͒ ( kwI-o_xxuaex;>9|o$\jvj[/y-};R?i7 UѼm_N@=xo ClxZCn ;'~_2asè=u[Il}Aƺ޿3I4PT0~߰|EnxcK2ڦȵxVQeRUuO뺽&!xD~(oPC∭ _)Mx _=TM9#Ѽ.^G|Kk߃k◅5Gs}k8wmZZ߉=>h,Xy`Ugh$W(+8Q?7WOW_)EC?((?>=]'\|{ի(7 ~?b?fN1O2RqDو|@ց:(@<=~7ԗxH_9$>,XtrږzE^x6 d1¬ZGFZV/$uO<92gC~ng*u~.-4_-Ǐt)ƺx|k6/[kcĞ)6utkCU/n ow`+/Y o[ᯀW?k{n>ݵ%Au{'Z,7Xb5ۡ|~|w.aSc?ufHo|aW / iEYFUKmEuCMү?7 ~?_j~ mBzm~ UVF |A4ka5TQ +h ?ykc|SZh-S F[[/{I?#N:\-ssj:Efh&'N<;izC:.aii:]6(,-8m@EQEx|G_ڽ< h.e +%~Puwh~U47=/?wŨծgj;8|jSjZ=vg;g:Um5.5(8| 5|S/_QⷀI4x#tnݪʠ4B4moKu.Uۻk| QToqo{o|>>hZ+AXk|-׵[yw:uɼOe3˭$!_~+~>!_ŏ%!ĩ{jE^)i-5+SVе:{#_oG.z 絞i9 q$SC,edXUxFWGPCj*(Q-A~7Gx+yͼx]u-t7^\H:-Ν߉oq_k+sIuk%]kAc5?{+9g 7)Ytx#^h?|υu ۏb$ /?io߶?_C{%ύu%Du %( zdž5G^<-;he+]wG-Td`(+G#~пKgx-RɼM+[aew'mw/^^k1 + ;;^=h|-/Z]ПDŽ|AkG??+KBuǐ4"\%YDi?1|A~/M_]~.o\~+ծMy%v]DftmtD( _AW|cj cO>"~%PF/Ԯ~|$}6fZO_j]ӵM6N5K/@?<'_*׃|=n.FƇj[`FJm n88i+6e߂?}2No,&xڬhO7Njuf3ۮ"s#~?~ @KKKmgT4ĺ\Gxڙ񇍵BnG?8m((vՅwWEsiwisCskum27<,NȬAE$_X5{d5ߍ_'06^k_0Cπ?Iqqk^m7ᗋ564x:NJ0&̓¯$x&8//ĶmcwE[_i]DvOei$76W6_xÞ<+O>xr/./:]D|k_m5Ooïj:/Z9/.X+<AnqQE},Ҕomudb6ɩOQQr$};a;ȕ?c/wҩW` p2MۛK,n[JKfSM+$I%Np',\*~X\}Kvc;/+mj(,(((((((({_?~W۫((}j;+/O흝ZZbokkko>"H"c5TEUPQ@B[տs'Q oVПz>#I_=@?]R\KSŽ??dUzǨ|m|)IOQрVWY AV+ =ީ^WR^{ˇ'/5ĒHd$gR(((+gþ׼_ ~ѵ?xΗxEԵw^`t}Iӭ#S {+ +h(!TW_A O?lOa⛈#d~,䷼$BxG%Xԭe #m3N_/uZPO[iJ_Ÿ ImasC|VH֍ktTҭmno} dvEs>m䷏(((;(7k|3_sO%P>oW f ( ?_׿_?j }^h+U?#᫾xTJi=Z2kk_Z<j~9ym.nf쮵/X=UE=W?G~?,l?dڳڦ.X4O/V[_d_|m Z~ZHa]:K~ʍQEGP[hy?7lQ9V[-{RDO No-Z%Ihw?ܯ o$ɟ ?kwJG 滊YuKTï"5 kqfF oJm/Ěj>m'o'?f3xd/گ]<9KJG$#E m3D2+%'WuKyP!e!*# 8 A@ _o${ e+_uvU&GRh/EPEQE''[2|ՑwJ#Nd/#UQEQEWQ?yǿZ+\?k9Ϗ|W@1EQE{K5=SӵQTum.OOOQӯ$m.(D[տs'WtPПo ?4[տs'WtPԿ~F|w_^>q|BWcT[}O=F Y۸fP0\j$cP7ssw _ g/bu\ZAexZώ<{EuMS)5-mtk9N"}EQEQEWG/~#Gwo|4P׍{;%Bɡ֦ؒG=wǣ#y,>9lOgq4|B9Ɓa'4cVb)W`YffbK31$1$I$IOw` c+38 Tr5zrX>I C)IΆ> *c1xs5 rV\s1RJRE;BEC QEQEW߶k__.5eVѾ;"7݀y E.Kٚq\݋K+_ x¾"񿌵OZ.뺔MiR"I Ư,IY_(g{㦡9J_3{^}ؾ7 zRIl֏,35t`2b1>)?>~5!i$j}QF*JWeq:qB$C:?*_㿎co^.o7ַ8dd,Vvl]G,bҴm6&4."Xk?ⅷOx=oe߂^)X~x3V|?s]\Yc(e"'[㏱VWxEG?%+}េ/ W[;T(/Ds[Ore/m2<䤣 l)4omQ{*skxO![㡇w:x ыM`WTjST/9?'ŋ.I<<ntF2?nIr"i6UHMWqg!qnƼMx*:UZ. 8, '>F_-4)GpMaG+$>@|W Kg?z-Տo|B5݄"p Wtym- ȵpW_m~#@h;<)h4xcG5hw-udu :wR.6VQaj`vS fܣS^驟e;N&|-4՛]aO`-:ݺc/?o3~I1o_~/dH}]YՑGnKQog,(}ae鶰Xmckkgeg [B$P[pƊW?qhg}V7 |_ۭDSrC [~m`<#y m"QEQEQEQEQEٿZc%CٿZc%5Q@E(?m x(_7A~QETVַ6W^YA5ݥ1ZZFmso2S^o{7)|r~*}MgkqoYopYK2ujwD-->7(dRxco[ujlWόzZ*i"Gx[⤮`J纎^XŽ"+:0dt`YYI *AL5' Hj?NCłPo@Q@|cşeOύwZ2εI]xc7:'|;ekz;_Ԡӭ%=#KI PAJj?&u6}PŅJ;ܩ NJ<;Iּ|$> d,}wڿeq㿴SWߓݻ'9UEG~ԟPi.uX~̟+I]SOC NᎅgYh|WnoO?hI?4\YٿQxbom߲_/ٳd*|:={'[Mw |K\=]'\|{ի(7 ~?b?fN1O2RqDو|@ց:(hѿmK?7g:?oVm(|\'hrL]cD ➨2% 1 f$$rI ('~kJ^Rj;C.%mu5cs[? v3[iЖh+f/%~^dl=@ۭN<Ծ-YLma?0-Ɖ!_,~p~ޟS_Gx֬P (~ |Yh;_ l~!xGa?}"ԼO`J0ȯDHcUQ*"( UP:((((o< ]WLpGWDhm&6%j#Lߎ5ǝ{|*.c]_$#WG\'/ZLZ)x#_-o"l}~ߵ {Z?~"~Ξ:vǕtL --%f z7xwZf\,is/PEPEP_<~_ڏ[?g/Au|o/#ᄢ[kOU4J)O{]ݞcxIg{gou,ie!s%G2WԕƳZj`TWŖ<kjSgھm}$kyfx$Fd`H8,UVL6; Z? \6.1*ʥ*gc0/tqX,M|&&*X5YQN^p E+ ( ( ( ( ( ( ( _9SuC|Q__=sn~ϟ?hF(((((((+/$ѬJUOѵ[kI|O{g!Hgk`%ƃo7/cĿt7K?qi#O2s:Otxm[_ԡ}N`G]79xJm?_ d+4O "Ou{'^t|6_mmeƣ]hx7L  Up Z((((;(7k|3_sO%P>oW f ( ?_׿_?j }^h(g>_ůW㞑H(Z/' :% .<7?dݚ^>CijV_| EC7궶M[6Ѯ5X$㏆w߷'˨ ?ʒ((s R6QmeO i5{>{z{M}G? MO&5u\zKo㯥cڻAI$>GFV!Wi^ d'|I{x~R׈XIK@_o${ e+_u^o *|% _y%Ƨ\C>/i>*BEK^LQvڥYkaGt>#HW;( (>?fO8O<5__$̟pdxjҀ ( ( ?gO3Wugqg9V:( ( ( ( ( ( ( (c!<|xiky73o k#m/M"sj?eӭ!Y)$Pd=|m+xSş>+Xs~ _PԮ*n ٙMKMvMOOӭ纏yƫ#׏4?̍ ̿ <{uBC{ [ÕtP"]ڍ˨x'X\vzCgA Z%@? mÿ&/;TO_Ɵ> {m$w6GyY-D&DEVRj^%?YEQEQER3*+;*fbUTeI 2x?o? )^[]S\ZͮZ>8S<'ȸ?rgEar ePZJO{<6lEVғ^/qUymę&8<%1fF)BV- 5zNu"CkM|/3zViW ;v=Z%4'NI[jV>>#[Uğ~+мo萉_xĺiVhK%1km{ඊYuW:뺍毭뚕ڍķzwR\^5Į<$ğ@  k(<!ݐY 3h>7A™!<|?=[yÐxT;3Zහ\>G9fu r3|B|EhFQ< jJ Q8K3n.8}nnt)[Ghڍ9:'[c:Go_|<S~~ Ǥk|I?hωv;ǟ P(o>٪RZ}'|Xυ%O ΋^Cpor$I#3#wwrYىffbY,I$k[YB/qẈ>bj7Qk{fN8o 2x*|ʴoO$᝼'o#A|%W?nߎ+\|>1Eoj1m%[m ?_O#b Dr<׾^ )|i'KUCs_ڵQEQEQEQEQEٿZc%CٿZc%5Q@E(?m x(_7A~QEQEW*G'hvQதUğ 7L |g:[wϋu?RW#ƞ^/4{EKYK[ YjM7:f\iZޝyum/@Y|5~ |*tv-A0/s⾝ao. z \N'3/4Ѧ]7t/X~Wઞ?Nؾͧkx_O᥄nj~~%e>~? X][o0=LwGYSeU2#{^*5/K<-i~|Virb!X[xž+$1(Y~Q_7= _Z89]V&?5G.0ڗ~*IHk勉>%g76 ߉_i$ ~B6," P0_?z7{dXr|?$|?0%_=>+οZ\Yb]>n7ijO¿ x-Pq~/@ _%|ub?ىng_J.%*Hh|'y+~˧i7WV>V/nc~, |vm$ G#kicB|IbYfbK1$I$I'O$?v^O~ (o,MϋÓX`et *Q Z9OV?~t/,>&xo@QčkP*)O4jn_Ey- ؍ H[>x%>C8( H#O SIЖ4E c ( ( ( ( (?$m?en avJ1F#?ᯋZŪ_; @TEXD_od[᷊ nu8/<qd:N1`65ejH D~_"?}_=Gj'j\ ( ( ?gO3Wugqg9V:(?2RqDو|@ց:?_If!Zk(?ਟ s|cѮ5o oo^'_j2 Mlv W6+#-džmB m(#~XiBeQ]F8>4YV=u*z>{gפ'ԥWF7?_ɢ;i?2$7=5>Mw™\>h"ռeb]ĤtHPG@Q@Q@Q@Q@Q@M|ElNKg|Y[T;Ia᩼EgZ8*%7 jDYl%W_8'?Kka~GW~i7np[Sl]#̄B !s,1zo|-^cϙax{RTﵿp`@yǚ/?~'i*|F1~4?|uİƳ -AV]'z4~fqx:EԼ?i芗*+O?O [_+x_MK\ͳi~џ  q1O+F{RTO[:x[\<3}V<=_:H4=kJS5'PL4&m"XMQ@7?fOg_$P_>;/5kXd2xoRӛUݙ^:9%X)*mvsF,Z~&:=+k4_u?O?Kf?qCq?<9v ,׺'OZɃ,v_koxbEI:p Ί(((?nO-J5JOۓKp;@ҍR+?\Vi_us[?~Oc+Aǩ+5kNW53R?PQEQEQEQEQEQEQEQEQEQEQEQEQU/ﭴ JAis}u)"C(ݎHQRp թ(8Ju'&B R1mIT!*8FSBNRcI%ndkYK|bDj[xѸ +k_ BR+g~IbObZ M޹Z'$jwI'̝qeI1#I,EHQK3$+X8>qqopy鵏_ /ɴC>mk Ÿc{9g"p%<)3> jxr /P7We exX6zox;GaqosXHX}Ե׭R2nq_إ(]? _2nfѼzPUEُ?/4~ Z|7k 𶑥;2,]j suq>닉F ((((((;(7k|3_sO%P>oW f ( ?_׿_?j }^h((+:S?a/h~?<0le?ڳ{6f-Njո%[ޭaxkkdEPEPПGog _VG+"d:ٓ WPEPEP_Gl~sjr?>=]|EPEP~/^t >.6?z>e/Lue>Zla[$?K02$_O=CWǀƨտ /ۋRI~_w^Ҧ5qI~9kL.F,>.< ,2:֕e1_~, o6>Q&irWz%ӿO~YTj߷/k(OߓNk Tznu !fN-Z79Gsh߲0j~^ 2IWcK#'PO^%( x nlgZDw %mR2 wᛈ/|mw,Gm?=>Y3ؘRƒ(mcޟh߱ r!iWv} xrˌExcMȼcO.v.^EQEQEQEQE6I$yet8ѤI"F ; 31@$1ߵƇ(y/H<1,jqw^l #]B;g$[?U_um/M6)x7E9K4ۘ S]RHfxdS$9E/8ol4xcJob)ԧÙ]~Vx޽ өSH>FQwfEWVEPEP]4y$u8՝*"(,*% b~ߴu- Sk %ˆ".nH!jQ密.Ӊ?ҧoq/}PK6@{y++$;vGH:Eݧ-".-u_n62!p B8=)W< S/ey$6&צR0 S#m:|,2gZNV*IiУ/|E)BUhxv~?-~? f.=NWC|a!WgO .KI.FY!?xGNx7/xCi~'|3x7-G߅3ZڦVOҴ+[H; In_&h?`-7wO;"o c/pKcr f]Vۘn4=R9dG8WEPE"$qww"\yrt[9\k|.b؅8yysܓ8 ַ+3ʻpf7WWI-5ksrfw6]I3|`hޮ3SVM:'+-D|/&$Ig&&O[-eacQgRM4Kqq,S6cF2m˿OW<|25TB5>6xI[|9d~׿gꆿ4Z?gi…:? 1l񦛸>R'8 ӳ((((((+?_?J?_?J"j( N/2QHxT_;_Q4i>o((((O/iZG k~񧄵HOx_zuƓhņ]Z\pZ)[k+as?1N~: }cZ+>ٛcT H(o1LskEφcK+k1 [6 sCo}dogCR?(> uxnƞ057A$m/|AYK/τaOkN[?lNZ={\xGo5/D/vpTbK {IfGff )EP_G`0G|bܯ#h߰w1PQ@7}Iy][j򻦓|%vVo?&$3 #b%I?3_ 3THJí~ Ue;6mwi۹,$aR?Z(4H-"Z\-qG3豳+k9cbD$n:F+5ZxÚtaJ,iXln'zQ@Q@Q@Q@Q@E!j!u)_YH-?'vVmJ`W5XW[vPwé8{'2ѵ^Rry=pp1iP_)ECz?OMb/QEQEgqg9V+(m Yy?!GیG.A8x8?_vicP4sx+f5拼>RWXh0q!\?@Q@i`;h7[vm~<ʟ6|dcQ^4{e{i :Ea+Di0J ( ( ( ( (?/=N_M83Sݽq3ڿѧ~Ւ̪QgVXK&OY,G^Y!L ?-@Q@F'QcX11i>&&dpgꁂAj rGO'cyg/ H˽O[ B9`ᘖ$QEa+ c¿bl9-H7xSB@qgoX#ӭ05e\K-?No]^IFeWWZZ^AygyַvPqkukqC=ͼO;42G,l¯+ JZA:[| ߳RK5,4O&OpEޭ|:5ôڋyEq=[V;/qm?z0@2)mEauh9dsyR.5m5y]ޅ_i?~4t+YЫD )⺳' h')t7d`M%?"K ƍCaVTq}ISʱ⯂ڴ,m^ +q6 u0|2>xWhLޝx×_ku TKoq 2=$ԴmuMSuk;-JI(OۓKp;@ҍRb?N?T ;_CZW~6~?\Vi_txFíP`?&~1_GJw~'Zӕ~LccԿuQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@xG?q$K2RBw >I+nь@bvw?ञ&u 6i}$6R]خwyQ} #­"Sk!Sui~[fN-Wscu?B$XN Þ;rbckK1;uү+=4եv>U|3 h̰j?wbt5{[Pc;4{<#ȫ'G?i ޼fX|%Ү U#J>:YԩJYs[[9~Vw,Vj݃?soî9TL^Wxyf'pObq}%$~E O۫B$?☊e4/ATLImԝ,-W_wG;D%~>1֧Z({k!dX+5m xGhRG,lRHN :e# 5JC/ :T(qg U+-*|/KU;h+8s?&*{_?~Q@Q@/&< Ke6g_@|?@EPEPEPEPEPEPEPEPEPEPvO%P>oW fK|ߵ߈QE>ؿF~յ2bVQEQEW@?4/ h~5m[J|cf|gb ֫?H8ihmTz]=KOJz+?6' }VS^kNch~>Gsx #o"X]? i?4?((((H?> _'[2|ՑwJ((+(me_((((((((+ƿh/|9߈omh4}M-QҴo-fEV+iĤyA1\IX\ ʳ 3֡0qn)P9F7\(vzY6Sϳ|#):q಼uqM<.vSVnɷ8.5'N3o-,$UMʉ_Yi4*3,-Գ5\$<$M3#,Hij1$ME_/f~#p;f)9PU_Jm&n8l uuRN\{+p\=Yj_S2&] *գMz?WUj{,%1:.$mR6j˩|Zi?i?+ ^o|gKDMr[V/V3\ {2kvkBC+Hz 7 CGƻɪ|5AE#X 6×F7G_]oxx(+ !x eWV'ы=2 WQ<'Д0~W}xm}7olH?*KG%涛A*ze7cǒߣsaǏ3l0U*s%^W˫ɧFu Q}xFSl>xC[MbA@ / Y>POٿᦣxSe_p^7972C~(e_ k_Hm~+L *n=[o [$%Wj/=?Ÿ ֲeve K~xgXc$kZWkIJȉ,q"""DEUUTQ@Q@%yo ~ڿ4,,S6N>U#9 N=zgO|'2_ڛVd0K * HZx`h+WN@4'| tea #/6*q|t(r?qP|m/3Æ㢊(>ɧf>.%YÛʤ|U/YO(4iuWExag%W?|W t:KKn<kZFtOwC50 ̫,\QE_M?߰[i;q#]|-fpv.T[HTvֻ C"tA[E5|B ];>a'Ŀa81k~ѭQN40R~~_)ECz?OMb/QEQEgqg9V+(mlٗQek_;o; jխ,]Cx~yWM9Z/~(((((![Ew)>~+}O wwC'Che⿧;񿂴ϵ音GLJY=^F:ŗ5"ۥKkgmȉPE|9>;>xu / BB }cŚݎ!D5|(o~!fӵxMi~x:]hU9+4O |#Dri# 6JIZDUKUT` ( ( ( (>2nH~/j*_? ȷ?l,q ;y%ÿm<[ۨCtd@F?(h29fOw?*$:? +?|mw EocgۛlD^6m=L{??s _اV4מ:Fm{d㟄5ƍx5-2-W qEAIVYI AyFοh-@/ -[;<6<xD.Huaj4RBL|q^@~:~ܟ[j_'bvWحҿd!kb JC5kNW53R?Wk?:kgD(((((((((((+ R|tOĒķ硅4}/J}'$c~,/< !j]2>$|Պ8bc?w`QSY p)^җ*Sϱ᪻ȱ4+ѕEo>'*PSN}M]/OQFoͨN-8ǭϚcUd⿋~1x4xw0LA^jqFq'g+@qbxg+_E,egW&Byni:}&^k pOkΟ]/丼Q}gjE);y}.3xg[( 9W?ge4#EPEP_ /ɴC>x_MxPEQEQEQEQEQEQEQEQEQESIo?ϛ(7k|3@Q@~c/}O/џmu>ؿF~մQEQEQE|d?no٣Eÿ~Я8Nf# QEQEgqg9V+(me_eH_{߲WPEPEPEPEPEPEPEPEP_T#y~rUOo,-<5hq>ujkumNWy%/nn&Yey?h,oj^-Df5/]F{fb8dhΎ5o ?(yൂkI.'!!FYFX(՞I(&Rc)I+I$MݒՍ'&)4mdZމ-[9xIOmrUI𶇩kXXY.,DK[XfhEwuS\?5yڧuO\Ԧ|ķqq#rIO5/u6_eo |?//mٖRokLENWԢO/2O&.8[yj`s#熎e[V/pXLldWO2LJGC5N#\ASTb 2< +KONIK Vb0J1Z4J(Т(( 9j^ix3↷}o7na|m{qkZePaOF|U.Eu$qEnӯ?mOؗ/?F[_gCѭR+;ZM iڵiDpx,>&q6\'XZr,V_CT14 !Vy~3zUKJ_Hq/p"˲Х5f RjaUjhCBq:JaptdgMkafKOhӥtP*X[Z|[Ռ,5+G$*3#_#xb?_}*mZD?-3T;φ^OGuf.§6{yۋҾ1"íWPȺ|7x ԤpF@*Ix{<[t1/gT+0y\tqTSٮl6/ CE}ؚN $є)roէӣ<*jgQX ïhҌKnTg#t=Tk:<#t_ZŒ =Z9GVKEյ;u_z>I1Q؅']O8Ң}'PfK SNt8te !\ C`ڕj5(UZm)ҜjAqꯡJu)I­9ӚIԌ$I;>jQEh@QEQEWTkfiTkfiDQE_eK/vӋ i~|6-O|*yoi7Šx>):Gӵ/0҅Ԛo,M ͆g1huFDiMUXlVr*(,xQEQEQEQEW_mٻduXV/Y"Kw/ _?io'W#v_{گW eIc hпڵffuy 7?m_ 3k_uI /·s2Cwri -2y#I$Ӵ[VuV$+˄~.`Jk IM# ) c W7C"ܸaxU&1'/kTړINAEP_A?eK$eحWCS߲fԾӳ{-ӆH#*(Z𮽭_Ěe/ hڌmi֏y6i%P8|jW+ |ISO A/lv>խuE"1E}glcgy ֳ(ǟ?i׺V#cgᏎ m.ڇ¯mx0Lxt+]5=&_#R]OO&(((?߷>c~m5o9 |Ro_OA] E7ğ{yfY"{ᵴ[R {kxy敖8a5i%FT($?w՗¿^%Z?e{{u}6Rt'jco/Q'Lû7?tiۯo#ih+8Q?7WOW_)EC?((?>=]'\|{ի(7 ~?b?fN1O2RqDو|@ց:( e A pA)yߟqhz3"Fb{_McƽmWW"nĖTUVG.@WOs_^gy:?7Z[,fl?{e'?Esm~_z^>#[x3ⴓHV?,|AԮc[χIu: #mck/]4WEqo,ssK7F{)h:-'4SO4QEQEQEQE~-x#'?%_~xſ|kc ЯCO$I-i󭭿sr[Ǚ%@}*<7 |=?0ÿii~iwX?ZZ;NNask YéYϣ@?o׋jo+#݋|uS_FM |{2]/D-#K",u( + ?4xs)h?K$h~7)5ֺ4Op,нιlB2(Ѽ%P@|SW/ @.|^խfq^@!xKĶLKo*BEGT4LugPt}"TuMF-?Mty. ˇn.g!Y]Qo8x\o?$,kDJ (_|]mڌ6`wHX\[[iw7VPmsmsOoso:4SA<2G43FH#2:$g-SDjٟUG ^$']9.lGt-~ĒYjV"(Fy"߀jZ]h?  ʹSq>XbZ/vx$^8co[,\7? +rYE_L/ <]+PQ7BQe oBVz~.յ-[|0\iiXopɧׯ{M  ?j QxF`ٝN[ilnuې1 ~q2xs( ( ( x_MxP=Wm?τ~=Ί((((((((((K|ߵ߈}?Ck__+(+ }^k e){3((((/#1' +[ybm_T,K1%$I$I *ҽ,qU1ƣV wG|KR'8:um\" M3Fp_M[H+?((+uO(%p[" O朠W/i@ cf` `Nw)O9\~xzw2s.c6kr֌'ǀ<ț}T>bK^z-.?#yү'O.U٫41/+ǟ|KYN_EK i cUbCbҔZFoj|q?c̨N8E9-Kh\~o fԔy8zw.Fe? } -`?-a_; kuIe/A]M&K+yY!+O|1 įًj'$;Hcu 갂?6$,H?ݟ׌LǬ' b!C`odmlt/3 K+ХqTTkI?䏦w 3o1+ qXXLK&aUksZL VnIVШ58&V/s }jWœ{O|8^+Omu-;T|/E: 챘!'%K'!~ o((((((-{KտGv})}SA3C-IyA>*=dWBŵ}nլwC|Ok&xþ!ҵ _umOG]Zk SHմئ4J{;e[y) _#xý'S?^* 6)"O=P0 52x^P[GkG\|Vw@Q@Q@L?j<[R k7# ~_x>o@Q@f-c5Y|f# mi[I^NWFe/;dW?_=K|S/ 0g_v;i Fy!t XGu?^`>¶("EP7Y#fGFWGF*C++)YHXA_1~~Ͽ>5_jO}:Gj0)lW/h pkú.7/"c4>GB]+NOAm]^d1~?;@x,%w1ijq|H5ԣ^㮉߳5EKap da@ڜ5a8Ҽ3ozyl+٣HƱ/ٿxme/k ] ( Y/4_X0|)ӑ7>4|}&nRK\x)&/1fvkD/kK2[w ӵ|Ccs>7ڴ!IY1 (2t/*'V?99x൏I3Q5=FP i7DlV<7U?w~'QOD3kDžUj[ c$s&c:Z]X_L-ռȪ?u#^~Wl~t:c&/:I(N-#~ Ӽ}\-Q@J*6| _ƙ|o/^miΑ\Ś7'Լ1]]-gľ +_l5~>5Hmn^8ӿW@4|Z^sjfyHѵ6xt_xoQ0ĚM!Aowf2TW~_zuޟh^~7忓ewnmAVS[ ]Zwo_[yPM6 ?K | {pntO?2-kwu_Kpbi֧*@TOtkFfcw_-|o$^33 Ck=ώ-<~xcB_׉ejڌfC-I<35 3[oŏh}i~Rψ2AF_mJh[fv?o*4> }οc0L$M}?xY47PIo5xt K_/F3]?uh/3ӒKc!Ts/o_ROhZx /wBQEQE٫_'T?ǯ D~_"?}@EPEP_Gl~sjr?>=]|EPRN?h1?]]K)8> @utQEW w'x[M3VƱŗi#'/xUε.ФK& KtX~Q@C៎~ |I/_0s}R?+P|F2iAV$OxC>ߤx:[k66|6լ4BviUZßrM3'ٴK]_7x:?MƸgEs-Fwp@nQX/q +W'91]Z\Mv@Q@Ho_> 'MƷO^)M"Gs&_iUʛlm 3િx:W~2_Jgjzw%ƫY,ouK= ScqHJ c#!p^}iAGu湚Eoĸ.!xRěfqZK _ggƟ?gů5xXW⏉xmCXֵ)H#Xt( ;G4mH;=2?~:COO=d|[jޯzč4EgX[G|6FZi:EgkkEG8՝ݕK; fb@UHd~woK4|ğ>2xKgV_;Kk06 hj%N'S'S o~?ÿsS(|,G xIZKKemN78P|]$NǩkWQۄH/5 +soc|?^hWkXHoɿG)p>uO Z''W!4Vi:n  -5|QtUB^W _)'W֎\ғY#y=xzGR̶6_a)M;Zi'$o⽋[/|-VMc~3ض,.o|wXũw ״c^gèhw}j3LWv7s dQEQETWV670Y5Ossq3$PAH4*#?scK;6 ^#]}Iqa Bn|U}iQG?E5Ɵ. Gɿ巊~~ʺwzğʝMz y$½]7&}_xKdD}.9K )_5-m5٧^o5I_V;WM񖹧Z'"| ;kR?熊(_~ x}ofowO>RB׍5-7O{wLR+=:y#$_ WǞ!|]/ |?|.lu b_ޡa?(|SYL_-CPuȅ͝a._Ꮒ >L kτ?|6=<3š  F@PTcQ@~:~ܟ[j_'bvWحҿd!kb JC5kNW53R?Wk?:kgD((((((((((()XY N4He )1nN0}b=>e}~`+{ [Q~6|_/?4zt:r?7z=b9KM? ~" u9peѫNyqfC\V'|,s嫞v6Tks_^\cV+~cڿg zC Dfj$nln6orh뿴΍?ž+]?  SECUS5w?.:+qWRY>YJeu~aSKT{r\+2HOITkԍ,uJF<jKM7A2>x pA^^ /?:{X(?^ ?.|HHok~ݤ.44@DLsY++ OG?hQHb mzԒ!So EH$ېkWbdgϪ_x=^"|i{>E/o*U_UE]GɴgKxsL|N?r.cZ7ɩ<8n9fv1oj`񟆿x ?eC ę#N˳:5#m6et$ (d?2 ( ( ( ( ( ( _9SuC|Q__=sn~ϟ?hF((_i?|%UOd3/>s((((((((((;(7k|3_sO%P>oW f ( ?_׿_?j }^h((((+_/T_,{,hƹM./ ό_j? ^\?[kϏ. *)!  i+??şi~x[_M_h>NsZ״`|)F+}Wƾ/.M֭i[]+H<1kwEPEPПGog _VG+"d:ٓ WPEPEP_Gl~sjr?>=]|EPEPLI{P*q_&_ g(QEQEQEQEQEQEQEQE~*TJ2OIνY#|VK密&P̗i% K6JٶqšJd5pZ~ҵ-:}o9?b9 (G,Q{+O8XAAW!I/<%7㜝۠QE~QEQEQEQEQEQEQEQEQEQEQEQEQEƺrK7V?,ruOOms'l}"<7qlym1K8pn{eg?BQm7Zm|IFKQOɳM],.G;zdu"R#|]u{e9G?֗!{ MƳo8r@SI b@R$c55^e<]mZ6=Qjv(gk6qկ"?p((~0 +~0 (+8/F!goP_E(?m xZ((((((࢟_)//Ufi>0g׾J oFלc+E}f×]3\VM~?eߏ~o|JQ9]LD'}T}x^w) Ou 2\i;H?݊9gpw %4xgS,tU:6Mwx,Ρyu*Bggnu Al㑨`E>HI!7X)HF*Ȍ#+L(&W-OL?j<[R k7([~*_>'[ǁe  5x Gi7LK;hj\YG@1Aol]8.,W 90X{Mޡuk2x}.n'm5=Io;??L٫ <>?a?x獮znf1 KD 61Uz'[xZXӴ D&)TM6YegB.P>|F"YmVڷ|O4>MiEP|xC??~"m/ƿ |[7Ė"kO]}:oˉ&T\@g/; OO>#j&>/$;=&C|6cO-?h!,5o? _mR1'ýz@J|K4wѦƍv#'?\ kxsH}k Oi O<,BW$FHaQ@ط=7 +帳? V;c6+Pt_Wi }KQφ,_.-D'[~ ilsGUuS;PȚfv~|IgM#x-z\ .nKߕPE)@:~DFhnO]CpmcIGZ(1_h?tokVGS7HA 2KRO<$0 4,8ZyƟq\[ӵ.;߅gx_Ȑ|HY%uWLW&/|N 5Yoy'Zz/5P~ |>}OLGHY]{Of.7@U jw|>˯x?z߅oWuP|ʭI[AȮrmoRJ~^Y'~ҿH+=GßZѲDqQ7<6#_W@{ QMVbCYXK."qϩ|/dsc W_Aۊ _xSG xW>;S/O~+W?d-|<Ѯhnm[7t!=uOOKdM_~:5 ?D|5i>摥ezaih6GgiZNaZvC EEH? [3? wJ~=lt_ xS?|o{H@Lt>Mr[[DHk*UMk_wwr6@Bc n01яS% 3''C|M!~|/ʹֿ/4+CxBfF?g4[!Ѿ6Pv((?k9Ϗ|W__Gl~sj>c( )'OhٮӮS ~?b?fN((d4rC4i,R,R"rFUtu%]e$A"/hM{[v<ٳ:t.ν>h)O]n Ծ,$Gz(lO@ٗfK)&Ҿ|d.缺4K+xQ%{r͓^Vw՟도??]$x+ NA.Oi3j΄2uZ䵝԰^5`*QEv~엟=lW7K{!xDt> #6PѮ蚂W;c 9>g(I>( ]ƟjV .neڡWBM, (ߗ?du$Of@sx\yv Č: EJFྟE5/la+ wǺWiN XkVڄd~`(~?~WH]J}Vj_>'hAB+=mk{$ n*(+ *I> j^Yx㧎,~lvjNayj宝iuچ_NVV-̱[$ȑD#Gw˿ڟn(ǂ!'[ owyHϦ][;#_xORž<5O_j5 Q@Q@Q@Q@տk]#Tƾ mWv |}WMڷxsN[}?ƞӭ~o=d4*ee"xkDѼMirG$2I ѼRHG"1WD`t`X@ ZC?k/ۛRG?>պ_tOy^jm[MÿYnQga7aMXڶx￴D~ǿu|(ty 8=kzf}ž) ZXӵ;z*+e b]{g4nfIGcaUS_tMRIZkv79@я¿: S W_ŻU8!Ged׃<9߳yvĒn3MϿ0G Y#(ZOQO3E?hm*HVCs\(Hh]q߲o!/%1OI'H9MHˌ9G KKmoEݷN1࿆wn_xOӂ|˳j{\e|D+/qg~(xS9Լ_Ś|QKjz#n.;۫xz(4MkĺikWfhzjW~=ΐZZ,QHߴ5k7&<]V$z.Z9RQmb3^ ^_[kOiQ^Znkfd:Ք~9EiqZ[C~>=),&x ?ZUxtMğ[/?!xo i^ ?h,tmG[{h|ɞ[ˆ^j:jޣyss.gO?gSZji~_M%Ԭjީtuw_n.]kQn.(+?N?Tغt?((C%o'_;_CZW:.0_rIzQ/]#_aֿs_??/%}EPEPEPEPEPEPEPEPEPEPEPEP_ۮx:)pag;.i2.ϲkI0 ~AR/ wҖM[c+Iœod$[ن|_/9T私(4OV\;ZWOFmѻ$C#$y+ڴcqY9q8+D%O|gdLl wZƧtudp ~g/?Iټ[n)pANҬ4ePHaVRru wZ6a>JU*jҫgo.x:P}i҃zݟs:Ǐq5,ci$be,lLT["_|tG^^ /?:{c*_>|80^)<7y"XNlRJG/|7(X߀_8~ >;~+hEXxqSbwJ.|!uoVHS-ͮsden^5 c+\!#O'jh3bmg:x )&u c:%JO,)yG{, Sc*p] [KL 㞷+k_ ;u\AY^bF 8o޺Wg_ID6gx)ѵ,xtBV+2,?_ux/1^•r"̰7xLږ}--k{co_?RC8ojZ2+5ɗT#^KQ_Y`QEQEQEQEQEQEc׏ !l/c |3u EՊx#oڨt ~5-Z]vw?I{iy-ŅE'ASMh*੿_?`:WB`O7OU |?_ tP?T/?+V߃?~xZY7?V帟L3/ENk[+K-7B'Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@)c?R~?x/w;x;!|Jem;?>'xƚ ٣[5M/[gW#SH |?_ tP?T/?+V EçE*}@ TS~thZ"Q}ǓbScg#xClo}ᐲFupm5o ;ȳwEQEQEQEQEQE|]mٿB]{ ^xoWXZ|;\O!a-KjwhZ5;SLմkٳZFud L׵[ %(KɿӦ0O EçE*TS~thZO(? *oЫGASMk>VpN>|l=#^])>i|Nn5k'ž-5FL`Qh좻Ig?Ҧ(((eί)ſ*s'e&Aliƺ߈]^bԬmK{Jo"IRII(? *oЫGASMk>*੿_?`:WBO7OU??>A?k.|ysS//Ě|KόY꿳Fz^umkM[y[QPEPEPEPEPEPEPEPEPI?jψocO-lw?6{(UTxV'w"GG9篙k!w?}!c82~g_G>%̥OmYbP^Znx8_EWaEPEPEPEPEPEPEPEPEPEPEPEPEP__T&$ <50"9s?Jux_u?s⇊c:Fs<1#N %s|/n?OGKS9k|3N*|Ir(|x(rr?)'Y((+ S|Y9>9?O5m3|1UkJ_~멪xVFOӥSk[O((((((((_ko/~1ߋ16ϯD𖟥]]?]&' LGoto4vL'ASMk>*੿_?`:WBO7OU?7 MC$e_h|񯊾#{E~|]A΃ψ xúVcI TnV+|_^sI⫙o|Qω/'αs6 y:eIJn*P&A Zh׈d|VGxOs| .,pڕg@>}#Vh^z=h=iZm)oguPYZ[֖Ehh@Q@̗O KqW/okV񇇼'߂Wzi [m6; X$`N\ *oЫ_E'ASMh*੿_?`:WBmW3!og C^/Ww 1 MOQǀxx_ i1k5]Oէ[ (((( :kzui:cizFX-ݭNOoq2HA3?#]^4^7Lq?ٿ_~ 4}I\j{Gi ?vCoS.~d]O%$m[+kk# YK|[KoⶑRG{vK3Җ1?2 Xe5Cqg_er2MΝ!r@ KK5bB{?|[&YPdW~8 wn.m#N?_ٛ YI~5jj<7<]]@Uko |*lj2];Y [ͽjA';v 2*k/L_+H!m 겮ZVSyFZ('4 xw^Vt:t]S}GQPi*9o{ N x⯈Oo}o?Z_6^:-JAJoqum] \Gm5ݟ'EQEQEQEWs~~~~|jy?#EK"kx;mj+ZyNimg钷4ie_b?[ ~/j:c;u=_QasG[3]H]|ub3Ji? ?| ԥ_?ׅ7̞%C2]KihWx(DCwmsy P_|V?n_wcs4w>2+B:XZMۋIЇgB<-2BO4R!G,RxH!2θ|<%iUog_xgEeq40H$* ]ӴKXNtSPqi=̇m%~!ouΊ$o K Q~~b! Wڣm-/2M˔1)#BSx~^j֌.?]Z[]zVՕŻmm3?JOZ_[Miu # Kop $J}xO¾,KOg%6ǩHukԞT޼g ~o>1$f\I$$:ײ7hO~e%>0^g'hH1nbO^o`|*ol?xcLde< dD8QUB"UPU`P~nG_Mο@h_ӡv ..<;7S, Fu>8c2cWvx~ֺ}].ufHaI;Wt70Y)]Hֺ?Q@_ I?e>Ԗgdsx&ј#u=OB!y-((+?N?Tغt?((C%o'_;_CZW:.0_rIzQ/]#_aֿs_??/%}EPEPEPEPEPEPEPEPEPEPEPE-fÞ|Cw7<KnI~䑏Z^|V"iajWVnЧF%RI>#)ILҍԨQZHQN:u*B"JJ+͟'9_KhO:=YNc>`FƲ )a\{yqrnﮮ/.=eC;15sqC2M3euWsa#1*?ękNr,|&H8ZeFJ rp Q>ᜇ Tr| FZukh7s67&~g,0cduOߌ?ueFJwυz5=S5~'76O(ɲXG%𶿇5i,LNx'wVڝ{gZ\Y]vkk^ odGCM%>7ׂg^_|Kxv0.!(>a( "_i2?o#%_?|?h_x-G:NI˝2Y?d4&l5 ;KG#/xR>v]tY5o-5}R=+FE+mqG\UaDŽ% 6mEn$7]Ώ+pC5Jr,8qVz,NqL-b!yQY|!Q}O C^+:崂(S((((((((((M /@ռW G4)uo> Ԭ}H5棩yhwZG/~&|^HPwXt<2yr*j:<א{6W*KiSw$֯C/xeb9n#k1R>8bqR))$+ zTjwd> RṞhbQ<^&vU%BHm)'E?Mm0q;<`QO :Ch| \uh:xX.,J'NF(#GC ֵexC';}"|UTixði_[w޾7y:+G7ਿ/$h2IPGn M/-#6*䙑oGy Ǟ ŘA!4?9E!$@H8߄ܣ<\7(KK?'gEߡ>Oż))<:|:ßu⟃4}_Ook%.~$(]cS5͗?W/m=~!G\?í{kA3H v"5Eo`B?O,[U('٭&u^ KUĿ 2B~Ӷ[SH4h_-Gs߀?ߋB;Z> $r'29?VqB]~/|q/> #Y7=7tc]u; E4y. SV.ӴXU湼k[xyR4Rr'e?j-xKVlix驪F-FKĚ@ڗI20QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQErn'hQW]~:~ܟ[j_!kb J؇K!-+N?u9\$?=K_.0_rIzQ>(((((((((((?l u?3{ \xr2 _ mLX8܏ k_쏀:FMr'Oյ";M,` #? T?l3U X|Kۓ0^]/;cgʬ𦛹g9/⿇K쒶&>Z鶚[doه_~пBdORYhkFK=2tn8RNGQ5oC\uf@x $QBcIƲ!#{ _ zTˎf29;i~L L5wxcҗ%\ gJmWW͌B7Wj&:(s??QWׂ| ^a #^^>ߙ\aD_oʯܿ,սO,>OT)`3LEY&Pcjˆ$?m^q:I^U1*uөӋ算GEW,hQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE|nMwO ޯ`.4+-z0e[u8/@&qw ?˯;xG^1=:It-BLt۴紽'.E+GgOxSC t1zU152 IJ#ҡ l0𫈣<- z9mEyKⶁu8f?vNJ>|F}j@?e/ A F4)ރ:Ʃ?N#[|o]iԗ`VSFb~=a1j9TPsfN.t& ]Vm/oK::jF8~&4hJ*iV| Igbcii?TƮL??p'7sǔƚ߆iM-A,=}O e[|;Ѿ|bd<57KOj^5|;t1}8* }RN`O WŹ_Qr쾦kM9*T[EJI}-|8\Wbi_ ùN7m1eUNfNY8Ŧ]33S¯_ۇ2h׍(FX%]2c lU .i_>⧉h,to IgR~Jd&Oa>ZP;{[KHeqAoo ,QI#UR ُYU*pz{|r9UOE}v+ >T״<9o챼IF=WQ~8V[k>5߈o!h%bӍk?[$J2.qnuيϬx,`9 xoþ ~_ NO# swVO+[P r6@e~0 O_oN^GXo<+^%|̓ !2n}xz4aWfMęږ_jEZi3vryQttdY /k+8A~xO{I-uo_<úo-<O49 O=8,Z>H)x [zx," %<06>ZP 1??2g-ZO.o<)^͖|dՉ?-l] |g?_sghum?/3c]a IuIǘB ƚ|(RJO%cۛ0mJ^F5#H,Ē 皗%]xń ͢$HdN57O3vI a/MCFs5ė>^IcAk Voo ,pi1F QF#EDP8 ' ex*x<.JJ4i)+-菆f\Xf&oy15I{ʤO+}wҥ~Q6xMa7i,hWm/|?Tp\snxSOۻI|[]Eᯍf^Vkg-套K'Fu/ "akc؍KTnM#8+̾5k\{feոF8V+T'#kįx|73|^Sd_`stqνU᱔Tغ5T9~7|ceø6(Y;|(|  exyߋmlht v' @I > U~ޞ U[_Og]'(`AzV}tRc(2de$(g'tMZ1R'EE(j4MjL?qkq/Ic?Ex4-|!7鴢O"I~,|\n߆:ƩuM{q>I#_GYIfASRk-1[,?Ey,'kWeV[Ibk8\-lBrR*skJVmgn+4Q8e*t)bxE:-BIƝ|7I'G_|~> Ҿ|#_ş珵/ kz|>!'lu[鶾!F hru-K^-|Fnm?پ+8B((((((((((((((((((((((((((((>bSд|O|:!f~ [hRw 1KnǁHїńE )EgYLnZ?|֣'ïn.H¾//nOYX/3?/[Gu/ºssKo[+^kI/.eZe{yZj:u͆asY^Zʓ]@msmծL| >,}4$ՙI(5 W~+Q7Y#fGFWGF*C++)YHXA_Џ6Ra7EDvv?iKmSƷ>F-|3BT>'[V6~`(l<0yh;7(x=|-Z(⻿9fЍ tamm^F/ ղmZxo.k&UF{|u5eRfm rPE;:[=Yjj23M?qF#f~iJ\cZGKuko xmNyk"ehZ@Z~E%FM*Fd?؁-?ߴw3winv7 >KtK,WŻP?!DoycR h?Էv< ?~ i ͧ? o4};\׋іK1~L Slkz~?^xɟKЋ^dXnOh*[IGҼ6b@aدac*O?Ý$wߥ]_^[_ZMzi}C д/O ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( t?(+.?nO-J5Js[?~gC%o'@·k?:kgDu9\$?=K@wQEQEQEQEQEQEQEQEQEQEQEW7[ľnѾ>åxķHջ=g+R p38pnOmkxۖ\9Ù}J񋫆E >S΢}M|+_J %O8')0y>j8$$ ߐ5<5:I`IxWIH;ONH wZ-.2&Nr羅 c%OR\ZW%Tp%cs-H=-V4:?=©T !i' z]MxM-}.~QEW| ^a>O/~0{uxÖ~0𧉼%l(7$ M@XkSEx^'e|%1n'YogI6iןgKTmgO \=Ε/kI׼#mc:GDw|=LM."PG?+&51Ȫ֭w=圱 kmΦ쫝YY|+9W~"fiC-^.ɽ 1mISgYV*o "ਤt?:(~Š(("_u wvHzC2^x56Ik )%d1x~XLw?> Kj;+?W//Ÿxo,^>_JkH((((((((((((((((((((((((((((((((g MdL~]oml<Nx37AI^[Ϩ\iq;Ǎ,u?x-xc)g&?Ghد>~ӿ Oo&asx =cM3K 'ڵƇ j [J? KE9hֿd(ۏ |XD o<\F/Xhz: bQ$o? a|p^ FO]/4äxsEOHws>go)IѮi|=Q͟^- i>",emw+ƻQW/QEQEQNDycYQ f$P $M6?UۆKQ)xԾ7-orP&^5|g..~w7oeeR ?g|L|s q+N/FoOtu8%X8f69# ƧnP~?U]|7M͏ih-m%U4_Yl.(x=Ⱦve/|C;;[ٿՏ ?W͔w&S+^[Kω]kl]GhoWWZd7]?S^_ x{~ƙkk~txg=B-'Ct{k=/I,U%(((((((((((((((((((((((((((((+?N?Tغt?((C%o'_;_CZW:.0_rIzQ/]#_aֿs_??/%}EPEPEPEPEPEPEPEPEPEPEP_S|Å|ݧiڥƙYZ2@H?-?x|yM|M$Hns;OMO[XGkb_!1s?[*vrUw0fxp^Ow*m)7>,9Op8yko%EњQEG=Oߌ?u{Q@T C sTZjVm7#8xO W5BQW1onE̿ao _F;@ד-H؏羿3t{,'Yb1vWu|0OVԫ57Ŀyu='3 ۇ1 F%fXRs<tq~VxЋ'$:47Ce O.ǖe6W}xo,Ex.ۿbIFH ?(/W_jLW{ÓRS^fﯲ-pL;6;Î jU'}.~tn8mk^8\Vyn!1K=20 KxH ]??ٙe&,?.a%6᝸v>_2o d7j_a6#֥[ + Ծx6*ʤ_ٕ)L -CgƩv49-h5Ň߆ZuXo{kId?$1 ɭes9~?MgOe{o[SǥF?o޴X&2#J((((((((((((((((((((((((((((((+?N?Tغt?((C%o'_;_CZW:.0_rIzQ/]#_aֿs_??/%}EPEPEPEPEPEPEPEPEPEPEP.߫P^ATȣ#8.$q#-_Se χ"}~i: A9l55_?oܒK^ɰUig5JEԢ'Г%[bԵ &_R}%O%%D񾙮MWo.(`Spl)&:^f^-G"Ւcc'<;=%oʌcdr+opgAԧ_1*˲|*awɘ/_i_J^iQFk'i{;F]x?~nH4oahڍn7[eК4FXt_On,5KMFu wL Fk.'?OBYL. A9<#w>h% UuKgW̾/xEqNkd8xeu1 GY:x()FF}ӿ7RYf&~<W|kj1*vP:,?+Y4xOK&0)gy~+1,3K˰ `aIa5%VS*_\ݿGO 8ǎjxy"ʱ|jelF6ʣf1aF>B'Q9W_G<fz<=s2$ OoЯ<fkHfCr 9} v{(*/_|]X_Boy7 ݓ'3~?%~?%|>o1_$ 2ߕy'?~7?*7'^Kjۧ|վ+%~ >q?g/Ɲ 5___9҆>H{c=qhCfM?+5,]?ϩO߿y@L4?/ zT??x#-[}W'1'[ bF^ GJ|G IEB'hG1DŽW aߕI_W'/= W<??P?Pg Kl//L#ăʿ+~~П Hਿq`<|HpqzWH"?[_I_O GH/ '=OoZ?hok /5¸?ֳ__&л?!z?-GBWůx;z!TCnW$$8@ ோ_(pГg>ڿޙ %¸ ~2o_[hR>?b;xAOX}ϯ'=#]l+?⠟H[cU_V+$o~>ЍS澏zG*?=Hp"wI*Ͽ!?"TxK(_Iy+Ӆ207CY$8_K_/khxK(T!CS+Go Hq][Gk_ih|oWZ.T#CS+?+WIǁ'?"?ߺ?_ |M KIK7Dg4_E'@>/l#yN}7Iρ'"3Csoi(3x[J/OKO'Asw H/L_݌*_|>NЛ;ċ2ܯzg?'τ|F2?6k֊?I?(yyy7z-~_$?%u.%u.ڊߤ?IߕI߁##wwoܟzo_'_ O_z)?QMNȿ\+GG߸ 'o$v&o)@}ϯ'=;_oßú)}%-%6Adwvo!ĞxB oݱ +n߸M|M|~QS"G!AĞxB <+~Ӿ5xwU[xOSxo"odKԮ.Kqas;]2eI?bT WܾLJ񿀸'8){X\7d*ա1aa^+BmҜ\BW?%7xSWù>cr6[S^wbS':0U\ΕE,>&RZMEW!EP_T} MjΠGqRt>}FU@?iU]/z^|bX~v%`j&p(py_EK78,Px |IíR|=;]Mt~+_; ٨_¿=`Ń ?f3!99c`ɳs#ʿ??m b)ˊ3 n-L0ypkXzPh:jO W^1Zi(/ |JΨK\Eea[ VkN'()Ҝ'$$?UOvGzHIU_?I~)_y}&.^KF;[NC\$E/ߵ' | )i`#0dռ!?~+GOn^2_;k~D,o$ISOߴo:g*xG?U_T}'?rW~V(%ě][##«LM'=[GE^ʊYw'_ט"~V?Q<K7o*6|uiɏLcE|L{<3Dk]O ~/QM}<>^`247i [~'3d~<5Dk\<5Dk\EOOww!ģx D~+~(AXs +PR<7Dg[`w}'^@%_#_G>zLJ?Y=G=cßFu,? )'? /دIߕf v-{%'rX9ғտbh3?JGFb^vΖVۥfZ][ ?f(?UM[͘\-ӳ><*\xu)ğ][gZz։DSUjfOW҃.l?R</?Vp?wKRf!{k9_ HI8 9?zD>1E=_J8C8WiYMgog~=sM} ?o8VWmz?q WJ q?/zD>14!p*z>_rh_ W~V)~W/wo/zD:1;u8?)?G҉ʦ8/|(W~Vo*ρm;#B<  Ó0E=J/9T|p&x~ox~׭*?`[ TysaW WLIS_W~V[ T^?J)}(ĦxD$)/?+~׭| \ct#I^7hJG7=/%^~&XLIS__@N߀WoI㜁)?!ä?Wy~_+'oCN'OyG][T2?A?)Ǻ*y>t?I!ħ}ͫ#?a?A?) u_RN?#H?S65o*>Fss>}1Ɏlrz?05E _tς< 2C_\}\ T^?*)(ě!sD&9RI^o&Oa+Q5>\}\(}%G !7Cg=vU?뚇?8_PJ%7Fσ|*ƾ^ωxSesXÇ?1uE/"_Dx vZ?>*~K>/zD:૚o?9邿"(JJ˄ >W 'ĪxD/HozD>15/!?p?Ț*vtp/B_v*ѿuo*ިACOV[9Q'0y1ֵ"z_w}(?b?_?-|zֵDOKZ?Z=/ ek>?vt/CVH8=k[)uw̵o2!EGN/ k'?_v~ֵ"WWRֵ"O7?ygn6~}ī F+U|ඎ=[199C?#3g~KQI}5n3<>c_E7=hx·3+Ѿ~ռYD{ÿU_#«SM~NI4["aIO\=uĮx F%VwSzs OU=EONoe.W|{V~>xlL{ Q@ D#:ztʪ(L0/@<ݟ/)"z?Z_tQៅ?/er~Ծ *wu&z%^ηe/n~*ᔾYz->??eqϿg=K[h|@UM~VQK''1G_8W %7osz~}RD9#?e| |5A'+o2ϞasWPD2׿K-{W}&?kr%7y_g3'cE?L<{+Ίo| ;`f+W=zğ&_L< kҊO{_N%7y_g?RCf߆>7 'qLPg/ '/'Yy?'}>kZü_癳GOWO?M<^"~\RIWEಋ%7yO?QxE ?|5DW?Uc=`_ y_M|"F੿2q8JH#Xu8+K_vs"Rƾ>/YG1g=7׉sIMD_]W(,&F,%7Y?fl?Zu/.Zu/._7I?;.;s7.|\w.o] ?7I/;_vķxF$7OߏGG=/?W=n?vʿ]KwnrOqqKDO4R~4/U!Y!O9_F8NA9._7?I;\Ke7ׇ9y_sƵ?",[G='o ?ſu$?q/?~;<>1mgx??EY-涿3Kw/ԾH?\|s6?",[G='oo,O¿3-O|OyrV/0|n_ ]}yg>7$ I4%:eӔ 5-CR7\ʬacRU ?_—Mg_׿B/|_Ʒüoǹ}%ZdpQRUQ|tߥWpOo;NLc]g}[OQ"9j:pro4}s[?~gC%o'_j·k?:kgDu9\$?=K@wQEQEQEQEQEQEQEQEQEQEQET)w_WlՌgX5T$w}F`݇p; ᓡ~vzFUg?]IgDR\ :kl|;}<)|1;."ڴ97ԓ_ٝAu ihV$Cũ G$N! _SoVŠ(?QWׂ| ^a袊+ y_>0yϭx^k f٤^xz1Xm_Sk࿅cE|8"ptYMat \dT >ΗgിRӫrd8Uy询^7p=OgXm)| G~WƆ_.[#ҼScXxOMHGQdžseV'BpxcЦe+okؾe>'Юl$Fiuo3leJ 浸K%| v'.k57g֏ ~e 9dY.p_<:edݏB(-?(((($(,II$xC~0_|K%طGռ᠎)5%]gRit ojr̍2>; n6ɕM1QRPXJGA48GaagωJ 7$.8ˉʡ͏ϳL&Y|P5 :J.++ jMZ|^?~9&úm"I$G޵dmL@~l?S|<ߊuM:KC'4}[T10z\710@sN$C1"sN+'Ya)1ఐ|#K -*JZ_Y0y}p4mܛzجDbjRRW~ K'<31!Jm__on-.,rDI%ɷ+hw3@[k K𾃢kDK-VVi-t.++(qO$ֽY7NOSs.7t3N=a88jK0ԡURZJ2s?犕3,yNTةe1yN6._*x:X¶&½XS T pcø?ix; _Gwl\x7秗f;F3?*+s/I2#_IN];u~V|?x# ?x# )~$˿/χ;oOiJϯ:ktWx`?L/_;2Ϟ/~w|=K [Zx}[liGS3!uş[̸+/gb*VHgk7=8S$~K0:~$?ue<sck~^¦S<L"?_G`]ZufN'<Lj? Sqj_Dz\HNb~?ڿHTv#R7Nϣ$_sNb}~SsZ<_ ~,Zт""5OaZHԀrÌE5⟴wω+^p;~]\?:?_3ÿ*/AK(+Gĸo.:+/O_xW~Vw|:ŸP~v??NW_POwc'SW?ߕv??GFß)g~pRY߄W'f~du|c Hòh3_k~~5~Rti~ WK/\<`|J4|)[ژXwj2Z~ͳu3R?D|l$?}$// _~@òh 3—Y^ES2ER?Gu5xi\}^X~pe7;+/)uee~_e.̵~GS>8uN?g;(E}_ ?1E?W0/k9 ?K; ?_TS_qw`t|ۀ.kŠ\aU yN qG;7^*"As_R_Ꞹ.1~O*[xA|5 _~ ð?h?Ea`~3|%‹e_Ooq%5?sl/h?? >,5 ]x|otV?]<׳Aiⵊ<5K^9BbvSkgqwӈOOPk  ߄ 2cHwOy~?'8~2s[+ONoß: ;?_o=W-G?o%8Q]Xs?-5C/:}O`+>~K|߯c?J+o'3G_%ǒ>"S=r|9yw: ?sa~_O 8_)N_1GK~î>;1" ;>2x_çx᝻x;{xRl/c$Z{"LQ>O/~0{_O xo+NW1G9C_?uK_Q8Ч*\??{/ bI돎;|&?)p_'E/?rn=a߁* j>. HCAҗm0o25EO Տ ONO4o=|,%G:o_ ??ſW_Oϣ x'#?`OWu|[Ѽax̚mOwyccm-twsΚ h VdhB[|mg*\? W_޷^g497!{~í6[̕o=|,%_S}EĿxC\W~V/Z|c?֟|3)nt()nWߕ'_EO3tO_P>;_S_ܷ8fmT_~V?qqI[O_P~;\ox_.l7jzݽ$7Svs^ A#4 $~d7:-$kHѷ#ij7ߕos;մ?C軼L$a( aj:O?snihBHѷ"ij8 y7#_)? ?|9˛?}"9L+&klOI!~O3?sOy9ek/ïĿek/ïĿܚ)ā}?KshxC̛̫W~V6Y|ZSaKE_SEKk[|]I~_N'_=ʿAv??3+8DtHCAҸ9"oCgZTU\]v:]+"TbHĻ& W| ^aā$y1C̣[aG__aG__**A>_Kg//?=X|Q+I_׭xS|=UQIlmįpoR-ҪU1(/nO'r*n'y6X X\ex%VQi-|%YSfSPeJ!PP qjRnNJ..L+| (+X5jNI ygcon0Q4v<#i\ J]' I'ZMWTԵIR//^\pH{ҥxE)sjYF #ќK,aum|H}Yùl&̱Y*SwRrKkF>( IŠ((8iڿ]k_!]q o:}8`zƭ$zYPQ~6Y`9khT<) ifWx8ÆqW|V.K7xm{lN7]kG'ú㜃mOXNKDtA(~f5H?}mZUoB6cnG)8`SQEQEI?RVcˣ-#[-'Q-M*Cr++縯^6 SRa-&\^z&ˡhhbq?/>=a^K8cO/8u|'M"oyxZ8Et5i|s;&GXRwe~|F7`2ƾ1ˌ7>=ac5G~/éKEC6f?悿g覾?Fcq韠 /#/s"$nϢWwG`(<09Ii?C^O_TP_F68ˍ\.<{Ya p3Kkҿ榏u.EJHу-kn![[wn_6=ic?_ߌ]o^-55x xG>*\tLJ5x*MLԚgo klaYR1]?M|uM} m)>3ӈ-o?OrW5I>je?KX&qщB3$+OKl檿[ "OVm+/Ѻg_MZP_~4W'ݦ<t:5_\mQ_\,gG:Rc:H{wƜwݸomݺYE/EGGw:Qem(Q?\lOͥ~O$_Fڷ&{?wc&.)/἟J<+Ͼ=l!0M! =[xZb}ʋs?7c V~iߧ!xE?EC>_(:ZV=x+.mc($_F֯&}@l~ V.>[CsE6yG:mdb.Ѳ& U]X-W~VtPv Rèn?ت)moጟۊoYEePH 2v#0ҤP/c q_P_E6KӍ|Bx,^?|E:>x38O cCu7ݟcV_f]Uç,_?~_P|_E6^5/WC:bԿ[覿`覾E|FŭM__EjA?'$|3@ @>?$ 8=ko9[kˍ_5?/Fx7 CmE6y\ύvo|Xo xg^?^Jԅ76y&q g&ݍG^kH&:_U=\]LA&/=g姇-wtZ6}sJ ϳCy>w1ywqhPum7uIN,k}o nV~}迟#<ݟ Ei$ddGp ǡRè.7o ҿ]?]]O?_yWdok.۷ߟv~Dèo@?s4è.omj)ui__>?k<}#!ݟ?=7lQ\/g_S_B/w[GżxM__s?ȟuE 6u_ xU֘~1^ُx? ,\D?=+6ֿgpyٔEx8Ro $E5?+&8p҃^r1 |`s~Sr%RZ_!m?)Ē}+>>7wpd)VRZ_!m?Kk榿[$FWN/b?ŸGKjտ枏u.EVzn$F GL5=Ⴥ?g:Bի g=H?}h  @>!$ 8=k?I mf~7){p1,Wng⧉q1Wծa./_vqɦxf_u[u%uy"# пͭa }#KGau:%F5OIQxG>ݟ f? e?~QUUaWē#M/_pq_cr e?/:?Yu#_W=ЯĶ.2+ |/Cd*<1x$wtq?>/%4[?_щͫHOId2, w?%tc\ߌo ߞ{ůA,w_v~RêEo?N?G:?VSɵE&?F_5Yg8_v4<᫇g/:VUɕxo w!NUP<3;ېV?hU߇U|cm:*Mj2:/>>?g|C"Ik$77gPEW7?f%{x/MzΟIџFO^%/7v.ߟw/u*7nhW7?fSh$F'ç?fuIο/ϻ?, #mE?.S(94Ѩ_Lώq3O!?~YëO GG~~% i @6O@ILE'_F5/x"I"f,J,?R}}s>5f5|[[o9uv{mAq>];E,8F%Hll=$w7QuiQLjb&m?;Oͯ2~x^_AswDn k2ởx+Ok>t_h" KdR|_ui7H߯??4UĠ}nӾ+;}}oL_qsg'oIO_%$Lm &:9=tSB6=?pg+Uߧ݃I?*9Z7:í>@-~QB!}p3dG;yo0OP>& 7G:Pixwgg/-#ko_fZoxW7%ܿޝ皾v뾷݇L?qv~D B? 7|Gj\xoϴE~(F%NL* w",'?>(/<&qY 998#?ƟM{](F45揷|8=?#g(eX$~}%C?2Tí O%̕~O%F,6}`u.: M?Ull+=><[ [{+h睽))}U:tUR-QȲ&9N_RM&ɇZ[DykW=ssY^mesel]Ngw ( Oߌ?u{x'ex:=(3X ⿅suwWP ۸ˬx~5u4DVtp@ 5]YUԫVRe`H $8"qGq {=kSr΍am2VGΑjzMiZe#tzsKKvp+<^1J?^"ЮnR{{U<ݤӪ(*g?#3,7ȼ3CBU!zU5|.II)%c9Nxlf,^,'tn; US-Js(((s#CcI{x $G:( ( ( ( Oߌ?u{x'ex:=((((? WׂxK|e?(((-$kJO|_-'AZg*Ь'AZg*Р(((_|tG^^ /?:{{((((<˯νq~t=zW;_ַXe} ?|O  M#AsOg7x=M졕9j%47Z.'&1YWsMs0xuQ[i ( ( ( τeUú:τeUú:( ( ( (<'>+?~_P|(((?M|u^^kH&:_U O bw?c]q ƻ(((+~ʕWW0+Vb((((>$h3;UΧ^^ #KGau:(((+~.)dƟUU?N{OF*Iÿ|#]p ;?PEPEPEP^9JOǯ|uuz<@EPEPEPEP|F<U^^Jc_V{QEQEQE?N{OF**ߋJ~'=zX]$O_L؋G(((y%O<-^^)JcO?XxZ=((((%O~#L5]vV_Fb[;J ، IV(q9Oo&W?j~֯"zi:4 1dy''#>㇅9Z:V>]4s<-Y<vQ^M&#\]_NN^/_i''^Ex/Oϗ/4;wZU [Gu{Aeǚ-Ƌ{xt:}. mF6KXx^ /?:{ ^/_i''G/Oϗ/4bep+u ( ( (Ş&|^7tmK\$nK-2[jy:Dc w3GXlW`XMyƝ>NU׭RMFRTa&F|=|^" J|N&,>(խ^N*pWsRE&&՟?S^!]*u"Ox8*ާm%fPAItkA,k0s;]ykNrX=;i3a˦٭h+mmgc';I{L9_" Me 'Ί?<3DO-&_xk 2G/}7?4+Z:(?{L9_" Me 'Ί.~.|+cҼ=:.~x Zi͓izlPini3Q&_xjNj[<3DO-&_xk 2G/}7?4+Z:(?{L9_" Me 'Ί^o/is 2G/}7?4+Z:(?{L9_" Me 'Ί^o/iqG,Gԯ<;tkUVJ3TSC:EE|(fO@](|j.SKw0|S.4ˠk~6kd?(ozߵwDW1i01Iaum$gIy~ONT>~8wM*V*cp'*Wd]R.}ߕlE:߶/q]guH _.-![FQ FF/SS!:X Pԋ\=zxW סRP7I?jU3~AIYjXdnOğ ͮ/?nڗ*ky7l?xRgCq\|CΉ ;RHԴLYT$1Ώd;?G_kO|({e=CqsjZ\Ěj:CqkK<-O? >((gŞ(:O7L6`=[tB&ӣdMpTGhQ@ Me '+ 3R+?x5|4 /<h,udcjl]:mvw .c'OeY'T_DO-&_xk 2G/}7?4+Z:(?{L9_" Me 'Ί^o/i!+ūh?YmÏZj-SLվfԾƒ}Ւll {_/}7?4+Z%oe} @ Me '^o/i:c}Snldo+MSRHM>Xƭ-I͝Iw6ؐ?^o/i|g{.&Bn/- ;8LKbdFkߋJ~'=zx~/X7ßmc Y֟-mYBn,!1]LPms1 $J5|sIEw?"GQ>^o/i>n^{&km໵hXّԞDO-w? ;?P|sIEDO-{&_xh2^Exg/}7?4+Z?{L9_"׹@ Me '?,~"|h[ּClxPş<=:͔V}.v7v*=̈́f5??4U/}7?4+Z?{L9_"׹@ Me '^o/i +h!̖ q\mUq .kտ{L9_"ՏTg|w5t&_xh2^Exg/}7?4+Z?{L9_"׹@ Me '^o/iճz}B/S8]N3Pkcq/F,8o#4ps4WO¯敜TN.q?'3 LJ8k<͔10d1I*y[-TVkTg>/D۵_ fCV"_1?S5CNo eu3'|S9 A~6 ^B#?ϤfQʟ<8K8exFT+ESoUR1m(~WY O\Ed9,ub+Wf=[cV) +&U,zκS$Z.!̒Go,E4I#*Gh؅DEU'ƿ43·4$!{-*HѲb:0TUbqAc!˱^Lj|LWʜk0_1i_ޥWW U[;玴_՟D?hg&J4q*IΖAn!|֛78i?c/'Ǐ iWjDžj]3Dӧ n<;GX r>T߯'A> N)GdMOIkM/eP]KZV\+"Ooop \_ pS,+Щ&gO7ͪemj\ћquiЕO<*ϳ .#g?ռ\a)U|e&4'eU,40ok:?ύ_<}|g'O<( ( ( (6|x~=(((( /|bW׆xK1+(((?P;Xs^^9Bbv=((((_|tG^^ /?:{{((((,,D%vms v5IkyݳsRWğ5; Z4 k)i)7G;I3&GO-[YEΊc#5<?n>=x3ÌgWhjFod~m!N6_ |Ud.$WWGE~1; ./AOLu/!~ƾ&3ȟrfL'Gyao ǫh-l8 xDZ[+zMZz]žZiCgeFQ4袀 ( ( ( ( OeY'Uu-^O袊(((7ٿ5%|KuP ( ( ( _G+5zUy#Q}V:ȓ?Jk7>[i ( ( ( τeUú:τeUú:( ( ( (<'>+?~_P|(((?M|u^^kH&:_U O bw?c]q ƻ(((+~ʕWW0+Vb((((>$h3;UΧ^^ #KGau:(((+~.)dƟUU?N{OF*Iÿ|#]p ;?PEPEPEP^9JOǯ|uuz<@EPEPEPEP|F<U^^Jc_V{QEQEQE?N{OF**ߋJ~'=zX]$O_L؋G(((y%O<-^^)JcO?XxZ=((((%O~#*63,(4eXnYW7/Wb^95}' Rj~ҍJrN<:re$~e`K}U|)է(WJST4,Ҋk_O iw?.|E +|e>wg<1 o|S__O ¼B?"EOp<D *Cho-,(|S_ w_O#`ʿiw?.|E ?ho-,+("/?]$7H2d=_O iw?.|E (|e>wg<1 o|S__O ¼B?"EOp<D *C Z>񦽨xƞ7j=݄7rIwy.EHSA_soǿweg> [;toK1^1 $FNYŽL閿ܿߋuO[g( [޶*1yw#e^u%:tY*g*VO=gwM,|8^)bn :XzQcy JiƥTthfxjqVEWYQEQE|i7&_'>R9[n#-ȉNOʃ_'/߱/x}7G/o F5r_y$I$I$y$$I_:+Q𛄩TGci_oe,[7wkr^/$_x> yIm~>Yl_D>"'= z`&iv$ F* 1"h2ŞG-AnwyƥmǷ'=_ Ck6P[D 08vTEUQ^Oiŵ)yo _+3 qOgJk;˼;NY"~CͮӒ]h]x(+>O/~0{u=( ( oo_MCcXwlXG1|Caa%k .>C"D ˜^ sB8&A?#cYdݗA@?e=*^GqczTשØ+kO<.Gҕoۉf*rP⼏7$O)S}=S<5&o൩g_ЇƇ4{]/od2P:͜' dѮ5՟%>o97$sAŇ|ۋo$ 縘S2#ä%㤟EK-Ɠk(? ((WYӴ۳oI}i<&ԣWTфz,*6_R4?_ "pGJW%VSƺ3Z1gOŏ^8g} ?7d>|+K,Uy9[Q㳩!G#.ϙ9[@'.~xڭ8N+U(NΎ7\RK=C?:YF!;U{{Q(k"pY(sUMiZ~i&kiZVe [Eiek Vc3A{mխq%7| "H/OV4.=Xř&u~ϟ ԟ +eYfeRCr_ ҴpX3ߞ18Ln[)źk'=.Ga僪+ӭh3j4tydpUܯg'+eI?|((((<]%?u._o(((+?h!Vk|NZC=((((?ύ_<}|g'((((wb/!E{xg {"΀ ( ( ( H'5u㟴''kNh袊(((+>O/~0{u=( ( ( (<^/%^^ / L{(((O|_*ߎF*=oдihBihB ( ( ( Oߌ?u{x'ex:=((((ΧZijv3Awk=!oZB|@EPEPEPEP~X? +翈^fXДQEQEQEWg=_ɯkҫ~3d_Dح4WS\IMu4QEQEQEW|',wױ׎|',wEQEQEQE?~_P|%v%{QEQEQE|WkEZ_G+5l;_1Kkw$'xcL5EPEPEP^;F?T[w_[{Q@Q@Q@Q@ #KGau:OZ?g/ Ns׽EPEPEP^{sIO'4oRB=$w7PL؋G]$O ( ( ( χR~=U c}%'> Y:( ( ( (<375:ψWg~"׫(((=$w7WW\S;?Ԩ&E}wU.g_?u@Q@Q@Q@x*>ajOTh| tQEQEQEQEx?*>;aOTg|w5tQEQEQEW%؝F_urn'hQP؇K!-+N?b.v+x@:t<]#_aֿs_?>xyo x_%te|:׋fu6qQ)".0_rIzQs-0ur/ p1:ΕHV4ѨVN>x>JiF-u`ܷOc1X eeb+aq4%NBtÞN|\Д+M?h,ÿy#o򾽾d{_}Lj4~?D~ W <Y7_^E ; ?~4?_h,ÿy#o򾽾?wD-iE5%! <Y7_G3GDGg}{}7. [#](k~K~֕|)<160aBXmNɭ \MLz_Sٞ&}.m_xX o%Ɓw;cQ"@?< ȱ~`<@rǀs5.|X~jW;4_~9ep"žf/=%K96bKtHr+ x:,q؟c$Qh*/q,dS-:*vm#oN;5PUcziy;6h1\+exx&w㢊+?ǀ((OۯĿ]khk_mАA@\q@6#ܯ*W>R]xsj 5;%CR8;3O<Q |L'1XT]*Tg8%'N]B7fR\S1՜8`ZpO!_,5ku*k{cw|z,lcšeᑉ22:* M55/T>S%5-oVl- NW18+ykorpWYwROg8UZ,Y5'ORQ3W鷝hʡ;0ˋY91Xji (O㰢(?QWׂ| ^a袊(+(?fo]E}GC Aa|4VPTCj=AjW/ Z~-u߲xZ. U!ִ˝9;A`cb0_NwlˉS=ɰJ3(k&ʆ"J.WIx MF*:6gʄ+[F9IJPi\SaxʜEyKu*~4VƴdlqN15Hh{>#<38a!Yӭb"PH t5R\Vcpc_ aBqFIԧ87I٭aa1rVJjӥZN9.(wL(1 C~ xǞdk魦f(Mϊ5|ha4v2iE]I_S]~iW[ۯMRe$Fk.t6ML0qIpLco{e[xj}._zgp)^SʰgriNYR I?pj.Q7tIJ|M1k<6U$j&w]M%\O3OO׾WY珿rEPEPEPEPxK0<]%?tQEQEQEW~C>'ح{^^)G b {]Q@Q@Q@Q@x?xIOQEQEQEQE53_C:wb/!E{QEQEQE㟴''kNk?hO"??N?EQEQEQEW| ^a>O/~0{tQEQEQEQEx'7_3J^/%^@Q@Q@Q@yo#_L7U?|U{0Pi? ?eVg? ?eVQEQEQE=Oߌ?u{Q@Q@Q@Q@K^++ vE{QEQEQE|WkEZ_G+5v>{A60VcxsE_[4QEQEQEW|-z>k=!oZB|@EPEPEPEP~X? +翈^fXДQEQEQEWg=_ɯkҫ~3d_Dح4WS\IMu4QEQEQEW|',wױ׎|',wEQEQEQE?~_P|%v%{QEQEQE|WkEZ_G+5l;_1Kkw$'xcL5EPEPEP^;F?T[w_[{Q@Q@Q@Q@ #KGau:OZ?g/ Ns׽EPEPEP^{sIO'4oRB=$w7PL؋G]$O ( ( ( χR~=U c}%'> Y:( ( ( (<375:ψWg~"׫(((=$w7WW\S;?Ԩ&E}wU.g_?u@Q@Q@Q@x*>ajOTh| tQEQEQEQEx?*>;aOTg|w5tQEQEQEW%؝F_urn'hQP؇K!-+N?b.v+x@:t<]#_aֿs_??/%~_xFíP`?&~1_GJ((((_|tG^^ /?:{{Cߎ<R3j:SriQom!?y)ⱼyxerh sqm W<=n=;±gu)*H e~Ai%׮Fs__/<^,~gSԩa-o/(Q֍)z؜$$-H'x68FP u.|3*U'jT1ibצڜ$EWEP7Ģwo Hs:8xbpFC.?.k?Ŀ~_|H$o95!9lw{֯yx4Խ5(pq}a,>SI-?ܿ2O2NIKάlO<.lƢz'}n~*5 |[&G B}GR3{C ˋ m?O/ ?0V1s^%Nh6vA2I1ts~<;|%?g,O ֗?b1RnVʿɿ>w_>x*<w\=BB^ܿumw{(C񀢊(?QWׂ| ^a袊((cl?_xlB؍J"lP+; ೧Bqb|+ỷEM#{YI1054I>Q|wK#Kna)Zѧq ᢼ)`3L=(&t _>SWø,2wL~JOc2$9饙 ~>3>1< Jeǃ/XG}*,PE0pT}_Jf'47|$6z'ܣOu}+ Ôxo۽_pj99qXH#WiCp7尧bs%jWTƗOgFxdA[Ȣ+\y-#QzO/H𮇨w2Gan%솺cYxǏ__yϊuC[3}BKon$gdG[kHK0¸T~N/cxCt/Ox84kg:瘵mz9/[ÛX_gch#),>Fۧ_kՅEW'( RpQfGS"oč=u"}"lt mtA|ãPG< !ޤ7E?zlCkXy֮I-,#$RcFfυ Ş2fkTJ|’ 5:#(]J51˲|yQ8~"{\Oc0яiG\Q:T7Z,N]Y%*qaEW^g/>O׾WY珿QEQEQEQEx[S\ ح@^@Q@Q@Q@x$3w׿5u⟴wω+^pEQEQEQEWY珿|l${Q@Q@Q@Q@_.?^>s /|bWEPEPEP^9Bbv潎s#CcI{Q@Q@Q@Q@x'ex:_|tG@EPEPEPEPxK|e? Y:χR~=U c((((>#^?a^s %{x/Mz΀ ( ( ( ߋJ~'=zzy%?QJ,|.g_?u\/&E}wTQEQEQEW|<@OVky%O<-@EPEPEPEP|C?V)k%O~O/~0{u=(>#Qi|xő3;KEl Z&2} w+;ynA$734l RF*F ,۟?oTYhh3ɹ߆ 5 2VpB\M_%?8S l.B<%)Ўqѫȱ[0aڌ)dXh/zosdC:=YqC fjQmrRIɴ?{?^'4^;}~fz僉dM:{DpP_[ˍѩխս\] խqoqȄKI?%\?>isC|E7oYrYb:;OI >*}C>3,O.>.-u'h.K `Ŷ[QTaG"Miӓe;VWgӄ}je*xLx#nR,_qEQEy* Oxz gH-Cx#.2:ןfXl*|dpV_̱Rp5LUy_Rٗ`ky-.lFapw =%eJVZ_Ŀ|P ]eI7*x֝䩌`>\5.4+O}brD%1T/S FާJ+ܓ-TWVVmiiWW3m,#HHB)f jzS 3{6_S;K?o:thr;$PB1__,π3጗2Cu9#_3jar;z{|M;]< x: 5L6UQsXl<1j`0TPZߴO{_ky?M9o!#Ti$"2IKPwr3˯|Y:Rd58Um"g*}5;J3ӗxrX3M#ܽ*q1WqM C"2ݜpFGշl2+%dfJO׾WY珿QEQEQEQEx[S\ ح@^@Q@Q@Q@x$3w׿5u⟴wω+^pEQEQEQEWY珿|l${Q@Q@Q@Q@_.?^>s /|bWEPEPEP^9Bbv潎s#CcI{Q@Q@Q@Q@x'ex:_|tG@EPEPEPEPxK|e? Y:χR~=U c((((>#^?a^s %{x/Mz΀ ( ( ( ߋJ~'=zzy%?QJ,|.g_?u\/&E}wTQEQEQEW|<@OVky%O<-@EPEPEPEP|C?V)k%O~I!IXF65/}7?4+Z(x㈰^y6Wn]7R >Eiۃǟk5~P^3YBY]LVAVG5*GgJL~8 /<᷈/űCSy?f8`Ta$V"O_p?.³h76n6 YQ7/X4xݛdVە$jVj]iڮ}wjZ}W3mwkuks76O,:I:m'i-fhxehR$EWGRYC:\υ!piUwapUyTxG3qIR1Gqj3TՃWg3N[5|%ZЦ4U\cARxLJMԣNZ[ym> FSI0GOiLv|FVh3\L27;p}qNC.KX2sbUfXZX-F,Fv+Q3|"(6e̳BW,^S WQJJ2IhWG?e(RwV=p9ݤ#$gO(o!¾]K!$ 81,OLPҋoߋySs,De Mjֱft5jOo2xÉ9HZTr|dfӓuoEJ?jvҵ]Gķ 5-^ڍ*{eURE&_xk[ -l|5/Zxštw)/ j|"q*(Qf^%SI8Uʾsb9Ut.F~^L+f\msǨJ(UVz\? mPh%ΗԔW|sIEDO-T{&_xh2@^g/>O՟^o/i΢soϊQ g?c(~|c1m?>1YO:+?}|6eό|S2=__ ?k>)G/5 ._o<sFNJ>åxwⅵI$B]Q<1mX ?aD0؁\y g?c(~|c1m?>1YO:+?}|6eό|S2=__ ?k>)G/5c|NZCm?>1YOo<i(kC÷V֫y&jewhP<+g!3]A 2ό|S2__ ?k>)@Ex/5oϊP^9 g?c(~|c1tWm?>1YO?}|6e{x?xIˢsoϊQ g?c(~|c1m?>1YO:+?}|6eό|S2=__ ?k>)G/5 wb/!E{|yߌ~{XatOV_ZiQTIZGb=?}|6e{ό|S2__ ?k>)@Ex/5oϊP^9 g?c(~|c1u㟴''kNh~|c12 [GHK_j-mV]2,%PORO?z{ Aȣ֊uV f#GRm?>1YO:+?}|6eό|S2=__ ?k>)G/5csoϊQ g?c(>O/~0{ձ g?c+>b&wKۏm>4xX6 $h ;M]'YtDZVRKH+?}|6eό|S2=__ ?k>)G/5csoϊQ g?c(~|c1m?>1YO? W1[ό'9t_~![+_uDžu%giqب&o__ ?k>)@Ex/5oϊP^9 g?c(~|c1tWm?>1YO?}|6e{yo#_L7՝ g?c+ξ/|i>eqyx#6č>hB'<'kcgIsys*LMj>>I /ttk6J|/"VH3# 2{oϊP^9 g?c(~|c1tWm?>1YO?}|6e{ό|S2__ ?k>)@^ /?:{__ ?k>)^3{t{/}?u(l~ZDm>k0N8&__ ?k>)G/5csoϊQ g?c(~|c1m?>1YO:+?}|6eό|S21 vE{|io^CWEx3|>mv.zuυu1閗6M|m9?}|6e{ό|S2__ ?k>)@Ex/5oϊP^9 g?c(~|c1u|WkEZ~|c1VU]'K[^j^񍅢6cnno<='𕵍&YKuyqokn(QP<9"`m/H`mÈ-'qx:6104ec9 l;Fe o__ ?k>)@Ex/5oϊP^9 g?c(~|c1tWm?>1YO?}|6e{x |p׬* g?c+ɾ|d|]5:bmDf~ Cr>}>ϲa-q`P(~|c1m?>1YO:+?}|6eό|S2=__ ?k>)G/5csoϊQ g?c(%oe} _2֭;i,7[𭝥4 èꛧFvbYm?>1YO:+?}|6eό|S2=__ ?k>)G/5csoϊQ g?c(~3d_굍 g?c+NeqⶼԼ Em&x{QO}}+k8L 7Mq4PȠo|bi]M|_|#kY|[xsD_'ۘtXʸ|ǹNɠHe\)@Ex/5oϊP^9 g?c(~|c1u 7tm?>1YO߆|廟!5W-5+J1RK Xc~孅լ}kEx/5oϊP^9 g?c(~|c1tWm?>1YO?}|6e{ό|S2__ ?k>)@?~_P|3(/Ek?}|6e{ό|S2__ ?k>)@Ex/5oϊP^9 g?c(~|c1u|WkEZ~|c1VU]'K[^j^񍅢6cnno<='𕵍&YKuyqokn(QPpw$'xcL5~^hg3uIQͯ&:6 C#ǩ~|c1tWm?>1YO?}|6e{ό|S2__ ?k>)@Ex/5oϊP׎0+V~|c1~3x NzH5+'[xV;i+vm`66Jό|S2__ ?k>)@Ex/5oϊP^9 g?c(~|c1tWm?>1YO?}|6ecH9gwN6WOsejeZonU5jndA1YO?}|6e{ό|S2__ ?k>)@Ex/5oϊPמ\S;?ԫ~|c1MRmN_گ+o6coh7CJ2En MMHIÿ|#]|w?.n|X.l|;Ow [(eF{Ko.yLKD~|c1tWm?>1YO?}|6e{ό|S2__ ?k>)@Ex/5oϊP׎|>]ό|S2?|eߌ[k>)Ձ[_^Ӧ7VN]ZL#QyAs<Z^9 g?c(~|c1tWm?>1YO?}|6e{ό|S2__ ?k>)@Ex/5oϊPo+߳?Zku玾1JDuqy~!܈|i; C}ڮ"Y-$!I&_`~|c1tWm?>1YO?}|6e{ό|S2__ ?k>)@Ex/5oϊPמ\S;?ԫ~|c1MRmN_گ+o6coh7CJ2En MMHIÿ|#]|w?.n|X.l|;Ow [(eF{Ko.yLKD~|c1tWm?>1YO?}|6e{ό|S2__ ?k>)@Ex/5oϊP׊|<@OVό|S2<c^qqkx:yK+?7vvMqum0J Ia wmC<^Q^9 g?c(~|c1tWm?>1YO?}|6e{ό|S2__ ?k>)@Ex/5oϊPTg|w5u>2x7MFEu7ÿWEm,+ ,:ls[B^8!xgoϊP^9 g?c(~|c1tWm?>1YO?}|6e{ό|S2__ ?k>)@_'bv~m?>1YOQ7mvQiO/~0{u=( (?I-<nPxC8, UMCkNC2󂿦O.//l~? UtjMW=_nuHxIl%\M?oxC-|#mNe|ܾ?%# ¯(ԑ_T}<*/x J@[h =N2'~W[sxڇt/mi"дO6MEgarG-S8 RNҞ/Zu%Ȳ<4[Fy5%'WF("B((_|tG^^ /?:{{(((̯*~722:}ġyѼW̌v_HСд0A5 gi!k:|Ew4 ~%Ӣ{&s.! WH^_<?Kq#br6ͲjK;ev\Iy&O8QWTT0I/ɖu?97utn%R[Iu_&Ǎ?O-#hĄmOHX|Mg.rK=#TvC}A>>wďBf[%@څhr!Qp_c4~*Ƶjʎx'fsg)tgTq*Mlm$ ɹBo/.5Z8\;0ci)Miaj7'o}1 Gč6uHwh5qb4W-׭b#29ѴF&dUmP_50&z^$5sU9kR[˦E,\^l"D5¨R,pM4QD$#8@]w!Qf!T@+(Utҍ\DjR+dž\〸kΛi+4ͱiKVզۧEӥ~Zh=e| #~/jڶ2]tdv4%BU\cfKO 4zVXT(q{Nٖ="Q:uFA'ޫ.xP_cT3~/<-khe88`Nh[O{7gzN]eywҋPQE ~0QE|l${x?xI'ح{^^)G b {]Q@Q@Q@Q@x?xIOQEQEQEQE53_C:wb/!E{QEQEQE㟴''kNk?hO"??N?EQEQEQEW| ^a>O/~0{tQEQEQEQEx'7_3J^/%^@Q@Q@Q@yo#_L7U?|U{0Pi? ?eVg? ?eVQEQEQE=Oߌ?u{Q@Q@Q@Q@K^++ vE{QEQEQE|WkEZ_G+5v>{A60VcxsE_[4QEQEQEW|-z>k=!oZB|@EPEPEPEP~X? +翈^fXДQEQEQEWg=_ɯkҫ~3d_Dح4WS\IMu4QEQEQEW|',wױ׎|',wEQEQEQE?~_P|%v%{QEQEQE|WkEZ_G+5l;_1Kkw$'xcL5EPEPEP^;F?T[w_[{Q@Q@Q@Q@ #KGau:OZ?g/ Ns׽EPEPEP^{sIO'4oRB=$w7PL؋G]$O ( ( ( χR~=U c}%'> Y:( ( ( (<375:ψWg~"׫(((=$w7WW\S;?Ԩ&E}wU.g_?u@Q@Q@Q@x*>ajOTh| tQEQEQEQEx?*>;aOTg|w5tQEQEQEW%؝F_urn'hQP؇K!-+N?b.v+x@:t<]#_aֿs_??/%~_xFíP`?&~1_GJ((((_|tG^^ /?:{{(([C k㿋 +Smva LV뀢URѢt2`M5,G w'nik? 5ƿ> Kyun J[WD_3,Ainժd{(jZYHsT᠚M*Y7Rc#)Z39%uV= Bi^Vm#vx OZkឡNYn<% o,o;՗TfcIF}?|^3:ټ5L|!&,aXfVa5ǚMDx™/~+>J|c絨Q2J4rҖ[֕"3E{ž!ʰ=s\GF1,)VԒMʦcS}.MU I9$%J23s-\ij%ͤpFĒʬNMpw_~Z&;Oxo)WaZ^@7% Tk^[^'n,ϖ+eJѯK ^:/v??8qwsqئ|:K0ʎ:8RkA} F_?? ƺ7A6gp9 |ELw:EM_#Ku+o#Ŀ%Z 4D+`Ī?C WʐoZ-~0"<6|x~=((((w?+|`>׵׊xK0(((|NZCS;k( ( ( ( ?>6|x~?ύ_<}|((((I >I (((+>O/~0{u=( ( ( (<o//WW@=׿E(((+~3d_U|WkEZ|9"`m/H`!h(((=!oZB|^^){B?? =((((#zc_BW~X? ((((5${_/ץWg=_ɯh7>[ioȓ?Jh(((O!X_;cO!X_;c(((("p ^^K_J(((+~3d_U|WkEZw$'xcL5IN,k(((w_[{x8Ro *( ( ( (<G?\uu?~_S{(((O|iޥ^^{sIO'4oR  ;?W Iÿ|#]QEQEQEz<^^9JOǯ|ttQEQEQEQExgo+߳?Zku~0EiWEPEPEP^{sIO'4oRB=$w7PL؋G]$O ( ( ( OTh| u??4U袊(((OTg|w5u4Uk(((OۓKp;@ҍRb?N?T ;_CZW~6~?\Vi_txFíP`?&~1_GJw~'Zӕ~LccԿuQ@Q@Q@Q@x'ex:_|tG@EPEPX$kmEz` ?T HmL*+j048\UlN#R|=xJj5i8ԥV qdMѭ[ Z#VtkЫN ԤRjSSVԡ:sg E$Mɇ > xMvHyJ[h%-Q)[{6DI/)#x?tb-,NV*jWȫUpeoi-+T_.Q:*|'îΛQSX|5ȵV2I-j[  .u}k |'>uVu !y iw.ʈf.~8WA5<-x.;5=H5ޜI16i֗cx8ŖC0Qs&~9O3O1 g>\-A8e^IjU\5lX\K2MGӦ~o Ź~Y88%*qX<6k˩˔mK S99}u xkoڋo{][- ~̈́=Gc8 7EIm۾+BSž?x&9݆ĺ8i5jUVc[;6]('uF2x9{^ՔQExȡEPEP^ /?:{{?QPEQEQEQE3QW|3:ޱBU]Xļ o&!2Ym-aK}6V-{@|+}oR ϡC[`;rK_ w*\n8l׵EPEPEP^)G b {]x$3w׿4tQEQEQEQE|l${x?xIO/~0{tQEQEQEQEx.߳{^_H|%{QEQEQEWg=_ɯkҫ~3d_sE_[5iClEPEPEP^){B?? S8k {]Q@Q@Q@Q@=F7`2ƾ#zc_BPEPEPEP^kH&:_UJ5${_/Co|bi]Mr'+xM6EPEPEP^9Cw^^9Cw@EPEPEPEPD;B'>+QEQEQEWg=_ɯkҫ~3d_IN,k;؝2Xc@Q@Q@Q@x8Ro *߆5|qoTQEQEQEQEx'ď-~'>$h3;UΧ^@Q@Q@Q@y%?QJ O|iޥ@>3wb/뺮w?"GQ>(((+>IcVx.s_87Ug袊(((ψWg~"׫>#^?a^s(((O|iޥ^^{sIO'4oR  ;?W Iÿ|#]QEQEQE??4U>Si' PEQEQEQE4Uk>!Si׵EPEPEP_'bv~%؝F@b.v+x@:lحҿdw~'Zӕ~LccԿv-]Y^> e|oVV d 2nC8gZ&d8$`m}EPEPEPEP^ /?:{{?QPEQEQEߴ7»ooDL^LxJaS7-ᵼt!տky'K{Y9hXI"Y$F_;?V]oO<76ȸ=fy>+VGuWdV$& ṱe-h? 3ye G*IejUUW <{|GT#u:9GFQwwepkGVQEQEQEW| ^a>O/~0{tQEQEQEQEeE4]_AcޗiR2!E pA 'ح{^^)G b {]Q@Q@Q@Q@x?xIOQEQEQEQE53_C:wb/!E{QEQEQE㟴''kNk?hO"??N?EQEQEQEW| ^a>O/~0{tQEQEQEQEx'7_3J^/%^@Q@Q@Q@yo#_L7U?|U{0Pi? ?eVg? ?eVQEQEQE=Oߌ?u{Q@Q@Q@Q@K^++ vE{QEQEQE|WkEZ_G+5v>{A60VcxsE_[4QEQEQEW|-z>k=!oZB|@EPEPEPEP~X? +翈^fXДQEQEQEWg=_ɯkҫ~3d_Dح4WS\IMu4QEQEQEW|',wױ׎|',wEQEQEQE?~_P|%v%{QEQEQE|WkEZ_G+5l;_1Kkw$'xcL5EPEPEP^;F?T[w_[{Q@Q@Q@Q@ #KGau:OZ?g/ Ns׽EPEPEP^{sIO'4oRB=$w7PL؋G]$O ( ( ( χR~=U c}%'> Y:( ( ( (<375:ψWg~"׫(((=$w7WW\S;?Ԩ&E}wU.g_?u@Q@Q@Q@x*>ajOTh| tQEQEQEQEx?*>;aOTg|w5tQEQEQEW%؝F_upO6ZSL?+}/Hb.v+x@:r i~7jzm-*Ve''34|n+K&X.-#hh)bvD`Uъ _G$&n(1\ bjfu}<6a\x쵷3\.aj\Bq)jcsk?e^viٯd~0,`5y.4 uMWQf2SNE,<>k/ (c2xWHQ-/(/ȭ^i\pL_gb8I>,d6RX%Ҋi&U<]*.##Ħe0+1WPo Ԥ3Oυ%y/x[E0}N,ne9dwnQ_%el,ry0^aadp,=<5hiR[C1,~71˛qjNY]RQ] QEQEW| ^a>O/~0{tQEQEQEQE=Oߌ?u{Q@Q@Q@Q@x?xIOQEQEQEQE._oOs/b{]QEQEQE⟴wω+^p׵׊~C>'ح{@EPEPEPEP^g/>O׾WY珿QEQEQEQExg {"μ3ƿ]ؽH|^@Q@Q@Q@x $G:H'4tQEQEQEQE=Oߌ?u{Q@Q@Q@Q@ / L{? WEPEPEP^[H_'/ zyo#_L7ZO4UYO4U@Q@Q@Q@x'ex:_|tG@EPEPEPEP@=׿E?]g^@Q@Q@Q@y#Q}V*?M|u@?^ X{A60VQEQEQE-^O>[gPPEQEQEQEo/_C,kJ7ٿ5%QEQEQE|WkEZ_G+5t>'+xM6-o|bi]MQEQEQE 7uu 7ttQEQEQEQExO.||W!++"p ^@Q@Q@Q@y#Q}V*?M|u@? ƻ?/%v4QEQEQEW0+Vba#W*V@EPEPEPEP|H9gwNG?\utQEQEQEW\S;?ԫЫ~.)dƟTcw?"GQ>~3wb/뺠(((s_87Ug>IcVx.=(((( %{x/Mzμ375:(((+~.)dƟUU?N{OF*Iÿ|#]p ;?PEPEPEP^)JcO?XxZS?Ɵ{]Q@Q@Q@Q@)JcOXxS?ƟM{]QEQEQE9F/|lJYǭe,lRx +tsG b$YÌnt>*[%gk̫X2<5eXnJf.2:ڭ,XbYI$rI'I4xǾ*)'Ú~˯By;Y?BhT͇Mdޑs}xO^.%a f 0_{[)gLn,OTO? V"l }7TaqjQuqI"#!]3>|-c k-gBOl,HBnb1ܠmf"ʌ⾘|_("h"㷇:dtۉ*&n "i#g^ȶks|#~>t_ÚoJBg4MFg2-͗!e!*# 8 A_ݝޟuqckqe{g4vwpKmukq eI`'VI"VPA aϊaoCmo/n*E\:sc iJ++~Q^[O?FVyz -ԟmˬMw"AVK7*LW2.QEQE=Oߌ?u{Q@Q@Q@Q@Tƍ.<cR]mJyn;y1 O俰gvq/#GğdkؼE[~Ab6jqG ;z_0m[WCNc+-Q#p隄vzOk_M?ZL홷g-ZƧgq)*RULFQe ~8K2IkSq9+B1p^_jv/ ެjo׊5[5༓sN4<.f2qrXz3˩.U*qQE QEQEQEW| ^a>O/~0{tQEQEQEQE=Oߌ?u{Q@Q@Q@Q@x?xIOQEQEQEQE._oOs/b{]QEQEQE⟴wω+^p׵׊~C>'ح{@EPEPEPEP^g/>O׾WY珿QEQEQEQExg {"μ3ƿ]ؽH|^@Q@Q@Q@x $G:H'4tQEQEQEQE=Oߌ?u{Q@Q@Q@Q@ / L{? WEPEPEP^[H_'/ zyo#_L7ZO4UYO4U@Q@Q@Q@x'ex:_|tG@EPEPEPEP@=׿E?]g^@Q@Q@Q@y#Q}V*?M|u@?^ X{A60VQEQEQE-^O>[gPPEQEQEQEo/_C,kJ7ٿ5%QEQEQE|WkEZ_G+5t>'+xM6-o|bi]MQEQEQE 7uu 7ttQEQEQEQExO.||W!++"p ^@Q@Q@Q@y#Q}V*?M|u@? ƻ?/%v4QEQEQEW0+Vba#W*V@EPEPEPEP|H9gwNG?\utQEQEQEW\S;?ԫЫ~.)dƟTcw?"GQ>~3wb/뺠(((s_87Ug>IcVx.=(((( %{x/Mzμ375:(((+~.)dƟUU?N{OF*Iÿ|#]p ;?PEPEPEP^)JcO?XxZS?Ɵ{]Q@Q@Q@Q@)JcOXxS?ƟM{]QEQHHPYUPK1 $OPO;C|ImNHt*(CKqs;+[KtwH-WD>CQe#wWX?)8Vؚfɱ.bG2E\)_?:NψnDGѼ3'&PԚ&1ɨ\ZHb@~>|i>5cúJϧWGw$0y/n3Du]Qk*4V1Lg/?>"X} ìclΆet:.Gh/I7?}⟉&𯄴/ W\,Dqjw+kak)C$v9 q'Y[C刻u"]뚳ד.<#P Y--Qqs8Gp0ƑE$qE*GhR8@TDP@UP)Q@Q@1|u<'֭<1㵉?[eDpZ1t`Qk G`ߓ_~|AQ/hvHkv4K jeCgp-QZCU[NOԬu 7VW\Ŵ$3FIdPv2:2:1WGRYYH*@*]?"E|JpFb֮;XUsT{xSJG#X_2 xin4KדwWgh1ʑږo<> d)Fï93i6a*[P_ʳR\(P$6Nz@c| W@G?SSQ W@G?SSUfH?-߳o;_l1Nqj j> j> P5‡(=֤Ѽq{b".Ii[ѥ"yn p.[s?M_Cj~(?))?))SWPG(ߊ?h( |7j?h( |7j?C?Q j> j> P5‡(?M_Cj~(?)) ּ_ ]#Z}7EyuN\n}6hd7O;xJљ$f=(ߊ?C?W-|_`NY^+-Wѭ_/b0*!*Jp8^jRxLV#):5B]qx=,U E 0ѭR,e X8t1T(F/ BhPZ1U)BQ?h( |7j?h( |7j?C?Q ⺎p?))?))SWPG(ߊ?h( |7j?h( |7j?C?Q j> j> P5‡(=֤Ѽq{b".Ii[ѥ"yn p.[s?M_Cj~(?))?))SWPG(ߊ?h( |7j?h( |7j?C?Q j> j> P5‡(?M_Cj~(?))E2u4o^ؿ˿k,v)ശirh,mc1A[¾\(KSWPG(ߊ?h( |7j?h( |7j?C?Q j> j> P5‡(?M_Cj~(?))?))SWPG(ߊ?h( |7j?h:|q{burĚM;Czo\[ζ)*1A‡(?M_C}C>5}C>5j~(SWP@5_EPOMG5_EPOMG(ߊ?C?P W@G?SSQ W@G?SSQ P5UQoUQo‡(?M_Cc~џou#7^:Ym[=&,FFR e)?~5_EPOMG(ߊ?C?P W@G?SSQ W@G?SSQ P5UQoUQo‡(?M_C}C>5}C>5j~(SWP@5_EPOMX:.W=c&D6^&Jt T|J1 SWPG(ߊ?h( |7j?h( |7j?C?Q j> j> P5‡(?M_Cj~(?))?))SWPG(ߊ?h( |7j?h:|q{burĚM;Czo\[ζ)*1A‡(?M_C}C>5}C>5j~(SWP@5_EPOMG5_EPOMG(ߊ?C?P W@G?SSQ W@G?SSQ P5UQoUQo‡(?M_Cb~_W9Z|t ^ q,cHKX%٫╣c,嶿h( |7j?C?Q j> j> P5‡(?M_Cj~(?))?))SWPG(ߊ?h( |7jh~&/;4}^k FM3A.'R[QLtRXk[?M_Cj~(?))?))SWPG(ߊ?h( |7j?h( |7j?C?Q j> j> P5‡(?M_Cj~(?))E2u4o^ؿ˿k,v)ശirh,mc1A[¾\(KSWPG(ߊ?h( |7j?h( |7j?C?Q j> j> P5‡(?M_Cj~(?))?))SWPG(ߊþ2:K^ϭj-^ =Z6$Qio0LcU1fmj> P5‡(?M_Cj~(?))?))SWPG(ߊ?h( |7j?h( |7j?C?Q j> 5OwtOB|{}{7Zfff]XV$TS" 4R JSWPG(ߊڛE_u(+í8".ٛ eI'&?))SWPG(ߊ?h( |7j?h( |7j?C?Q j> j> P5‡(?M_Cj~(?))F>3xy4o^Xu-?۵{KKiR6yC?Q j> j> P5‡(?M_Cj~(?))?))SWPG(ߊ?h( |7j?h( |7j?C?Q 0h׆SVBm;CV\U{hbffT"?))SWPG(ߊ?h( |7j?h( |7j?C?Q j> j> P5‡(?M_Cj~(?))?W8kN>ҵ:JK#K?Q٤IdY&xUZ7G(ߊ?C?P6ߵǫKx--"jeyC ,q&j*ffY$h( |7j?C?Q j> j> P5‡(?M_Cj~(?))?))SWPG(ߊ?h( |7jhύ:Wl6:iWOT7{=6(@XDgSWPG(ߊ?h( |7j?h( |7j?C?Q j> j> P5‡(?M_Cj~(?))?))SWPG(ߊ¿~2j߇G{˝kڿk&h:zZA/-#H_MWt^[w?M_Cj~(?))?))SWPG(ߊ?h( |7j?h( |7j?C?Q j> j> P5‡(_i:xJt+S}/@.F[;f&9gH9T9hj~(SWP@iug ;h,!WCmmAAG"vg e$?))SWPG(ߊ?h( |7j?h( |7j?C?Q j> j> P5‡(?M_Cj~(?))'L5kgm&h.ouY,,4Ǽq.anR8WǑ[?M_Cj~(?))?))SWPG(ߊ?h( |7j?h( |7j?C?Q j> j> P5‡(?M_Cj~(P2΁ ^k}NM>͉ӵ2ť #2Hr?))SWPG(ߊ?h( |7j?h( |7j?C?Q j> j> P5‡(?M_Cj~(?))?W8kN>ҵ:JK#K?Q٤IdY&xUZ7G(ߊ?C?PM?YiotKk +q}p!WC y`vf$}C>5j~(SWP@5_EPOMG5_EPOMG(ߊ?C?P W@G?SSQ W@G?SSQ P5UQoUQo‡(?M_C}C>5dߴƽ&YӼw{ksI5}fT47ڊi:R:I:DOlmFneiC?Q j> j> P5‡(?M_Cj~(?))?))SWPG(ߊ?h( |7j?h( |7j?C?Q 0.x_5}C>5j~(SWP@5_EPOMG5_EPOMG(ߊ?C?P W@G?SSQ W@G?SSQ P5UQoCV8^?5>KmND.l5 y-/-̰i1Oi#2C,rmѺ8 /‡(?M_CSӿiFai/t2OM+̖vP% i#,0DH(,&5_EPOMG(ߊ?C?P W@G?SSQ W@G?SSQ P5UQoUQo‡(?M_C}C>5}C>5j~(SWP@5_EPOMY6?ƽ3P[#֮WLYt=iM)æv$HV+#‡(?M_C}C>5}C>5j~(SWP@5_EPOMG5_EPOMG(ߊ?C?P W@G?SSQ W@G?SSQ P5UQoUQo‡(?M_CbW}SUujPЮMБM:}&HKHe7}.#Qd/I?))SWPG(ߊ?h( |7j?h( |7j?C?Q j> j> P5‡(?M_Cj~(?))L|rִGF<}wjzfj_.lo䵻gHTY6h$PģEP5‡( Zg5Gt#MkiV6u5}C>5j~(SWP@5_EPOMG5_EPOMG(ߊ?C?P W@G?SSQ W@G?SSQ P5UQoՏaF|i5-wX[+rt PӴm"YM)Y[*ۤHwVc?M_Cj~(?))?))SWPG(ߊ?h( |7j?h( |7j?C?Q j> j> P5‡(?M_Cj~(өZۍKW7i6s:E챤zRE)NeIQVR*5_EPOMG(ߊ?C?P W@G?SSQ W@G?SSQ P5?jңF500Lzop?ٖ!$C޼ğ>#x79VjsX6nWN3^{5_/ #s<`_#kW}EltK!ڇcbq}M~dҿ?e%^$%e[8 Bk{`ȇ1\+[ilC+j+" GCwBSaSX+|FTކӬnpN`) =_.MWX5]QXܩ= y>oK3Q@Q@ endstream endobj 12 0 obj 229815 endobj 17 0 obj << /Length 18 0 R /Type /XObject /Subtype /Image /Width 50 /Height 50 /ColorSpace /DeviceGray /Interpolate true /BitsPerComponent 8 /Filter /FlateDecode >> stream x  o7@a 060ú endstream endobj 18 0 obj 34 endobj 13 0 obj << /Type /ExtGState /ca 0.9 >> endobj 19 0 obj << /Length 20 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xTkPe:g >hndStCkWZ6!Hm\$~ًo:w> كo{ a"L"4M'S9'^qZ/USO^C+hMJ&G@Ӳylto߫c՚  5"Yi\t։15LsX g8ocግ#f45@ B:K@8i ΁'&.)@ry[:Vͦ#wQ?HBd(B acĪL"JitTy8;(Gx_^[%׎ŷQ麲uan7m QH^eOQu6Su 2%vX ^*l O—ޭˀq,>S%LdB1CZ$M9P 'w\/].r#E|!3>_oa۾d1Zӑz'=~V+cjJtO%mN |-bWO+ o ^ IH.;S]i_s9*p.7U^s.3u |^,<;c=ma>Vt.[՟Ϫ x# endstream endobj 20 0 obj 785 endobj 14 0 obj [ /ICCBased 19 0 R ] endobj 21 0 obj << /Length 22 0 R /N 1 /Alternate /DeviceGray /Filter /FlateDecode >> stream xTMLA~-KbO2'%BMBK-Z ĢFlta]g )x6 h4!ă'&~o0t{{2DkQATv|gšvj# x6;ة8c#Exg}5\gR2QD'ji'jZ]y࣋ӹQ`^; HRґ2EJ+"*Eޯ ;8p*kqGr`)GVK׀#˖;s++|EA&xKSj 0D,qϲ!cgn!!p7fK#VkwumW<0T2[3S;`$& Mʒ$EE&A:Jp jI0yX;TW|6:ݮmj:Yo8" -_ynCګ@;˛m[kG66H*crN=f؇"vkĀϦEguo=,n{wIOScVUUP;5kV /֨[Co5dփB ,ADM!pc[֥ himH&ŵ%m".h Xkd,Ćcq-N:d뽱tgr֩1sȁ;l /!+ʚ/bPϊ89)Ҏ+ JzR-B?~_ fU-{# y endstream endobj 22 0 obj 774 endobj 7 0 obj [ /ICCBased 21 0 R ] endobj 3 0 obj << /Type /Pages /MediaBox [0 0 612 792] /Count 1 /Kids [ 2 0 R ] >> endobj 23 0 obj << /Type /Catalog /Pages 3 0 R /Version /1.4 >> endobj 24 0 obj (pnp-background-letter ) endobj 25 0 obj (Mac OS X 10.7.2 Quartz PDFContext) endobj 26 0 obj (\000J\000\000r\000g\000 \000L\000i\000n\000g\000e) endobj 27 0 obj (Pages) endobj 28 0 obj (D:20111112163913Z00'00') endobj 29 0 obj () endobj 30 0 obj [ ] endobj 1 0 obj << /Title 24 0 R /Author 26 0 R /Producer 25 0 R /Creator 27 0 R /CreationDate 28 0 R /ModDate 28 0 R /Keywords 29 0 R /AAPL:Keywords 30 0 R >> endobj xref 0 31 0000000000 65535 f 0000236689 00000 n 0000000584 00000 n 0000236273 00000 n 0000000022 00000 n 0000000565 00000 n 0000000688 00000 n 0000236237 00000 n 0000000847 00000 n 0000001129 00000 n 0000001147 00000 n 0000004080 00000 n 0000234081 00000 n 0000234347 00000 n 0000235302 00000 n 0000001238 00000 n 0000004059 00000 n 0000234104 00000 n 0000234328 00000 n 0000234394 00000 n 0000235282 00000 n 0000235339 00000 n 0000236217 00000 n 0000236356 00000 n 0000236420 00000 n 0000236461 00000 n 0000236513 00000 n 0000236584 00000 n 0000236608 00000 n 0000236650 00000 n 0000236669 00000 n trailer << /Size 31 /Root 23 0 R /Info 1 0 R /ID [ <4c6f4bffd149d5c35fb820372c8d8d58> <4c6f4bffd149d5c35fb820372c8d8d58> ] >> startxref 236848 %%EOF pnp4nagios-0.6.16/sample-config/pnp/pages/0000775000000000000000000000000011662503006017005 5ustar rootrootpnp4nagios-0.6.16/sample-config/pnp/pages/web_traffic.cfg-sample0000664000000000000000000000071211662503006023220 0ustar rootroot# # Sample Page Config # # Global Section # use_regex [0|1] # page_name < your page title > # background_pdf define page { use_regex 1 page_name Webserver Traffic } # # Define the first Graph # define graph { host_name ^websrv # Every host starting with 'websrv' service_desc ^traffic # Every service starting with 'traffic' source 0 # OPTIONAL Show only the first image } pnp4nagios-0.6.16/sample-config/pnp/check_commands/0000775000000000000000000000000011662503006020644 5ustar rootrootpnp4nagios-0.6.16/sample-config/pnp/check_commands/check_nrpe.cfg-sample0000664000000000000000000000226311662503006024710 0ustar rootroot# # Adapt the Template if check_command should not be the PNP Template # # check_command check_nrpe!check_all_local_disks # ________0__________| | # ________1________________________| # # User ARG1 CUSTOM_TEMPLATE = 1 # # Change the RRD Datatype based on the check_command Name. # Defaults to GAUGE. # # Adjust the whole RRD Database # DATATYPE = COUNTER # # Adjust every single DS by using a List of Datatypes. # DATATYPE = GAUGE,GAUGE,COUNTER,COUNTER # Use the MIN value for newly created RRD Databases. # This value defaults to 0 # USE_MIN_ON_CREATE = 1 # # Use the MAX value for newly created RRD Databases. # This value defaults to 0 # USE_MAX_ON_CREATE = 1 # Use a single RRD Database per Service # This Option is only used while creating new RRD Databases # # RRD_STORAGE_TYPE = SINGLE # # Use multiple RRD Databases per Service # One RRD Database per Datasource. # RRD_STORAGE_TYPE = MULTIPLE # # RRD_STORAGE_TYPE = SINGLE # RRD Heartbeat in seconds # This Option is only used while creating new RRD Databases # Existing RRDs can be changed by "rrdtool tune" # More on http://oss.oetiker.ch/rrdtool/doc/rrdtune.en.html # # This value defaults to 8640 # RRD_HEARTBEAT = 305 pnp4nagios-0.6.16/sample-config/pnp/check_commands/check_all_local_disks.cfg-sample0000664000000000000000000000225211662503006027061 0ustar rootroot# # Adapt the Template if check_command should not be the PNP Template # # check_command check_nrpe!check_all_local_disks # ________0__________| | # ________1________________________| # # CUSTOM_TEMPLATE = 0,1 # # Change the RRD Datatype based on the check_command Name. # Defaults to GAUGE. # # Adjust the whole RRD Database # DATATYPE = COUNTER # # Adjust every single DS by using a List of Datatypes. # DATATYPE = GAUGE,GAUGE,COUNTER,COUNTER # Use the MIN value for newly created RRD Databases. # This value defaults to 0 # USE_MIN_ON_CREATE = 1 # # Use the MAX value for newly created RRD Databases. # This value defaults to 0 # USE_MAX_ON_CREATE = 1 # Use a single RRD Database per Service # This Option is only used while creating new RRD Databases # # RRD_STORAGE_TYPE = SINGLE # # Use multiple RRD Databases per Service # One RRD Database per Datasource. # RRD_STORAGE_TYPE = MULTIPLE # RRD_STORAGE_TYPE = MULTIPLE # RRD Heartbeat in seconds # This Option is only used while creating new RRD Databases # Existing RRDs can be changed by "rrdtool tune" # More on http://oss.oetiker.ch/rrdtool/doc/rrdtune.en.html # # This value defaults to 8640 # RRD_HEARTBEAT = 305 pnp4nagios-0.6.16/sample-config/pnp/check_commands/check_nwstat.cfg-sample0000664000000000000000000000237111662503006025264 0ustar rootroot# # Adapt the Template if check_command should not be the PNP Template # # check_command check_nwstat!LOAD5!80%!90% # ________0__________| | | | # ________1____________________| | | # ________2_________________________| | # ________3____________________________| # CUSTOM_TEMPLATE = 0,1 # # Change the RRD Datatype based on the check_command Name. # Defaults to GAUGE. # # Adjust the whole RRD Database # DATATYPE = COUNTER # # Adjust every single DS by using a List of Datatypes. # DATATYPE = GAUGE,GAUGE,COUNTER,COUNTER # Use the MIN value for newly created RRD Databases. # This value defaults to 0 # USE_MIN_ON_CREATE = 1 # # Use the MAX value for newly created RRD Databases. # This value defaults to 0 # USE_MAX_ON_CREATE = 1 # Use a single RRD Database per Service # This Option is only used while creating new RRD Databases # RRD_STORAGE_TYPE = SINGLE # # Use multiple RRD Databases per Service # One RRD Database per Datasource. # RRD_STORAGE_TYPE = MULTIPLE # # RRD_STORAGE_TYPE = SINGLE # RRD Heartbeat in seconds # This Option is only used while creating new RRD Databases # Existing RRDs can be changed by "rrdtool tune" # More on http://oss.oetiker.ch/rrdtool/doc/rrdtune.en.html # # This value defaults to 8640 # RRD_HEARTBEAT = 305 pnp4nagios-0.6.16/sample-config/Makefile.in0000664000000000000000000000630311662503006017160 0ustar rootrootprefix=@prefix@ SYSCONFDIR=@sysconfdir@ BINDIR=@bindir@ LIBEXECDIR=@libexecdir@ LIBDIR=@libdir@ CGIDIR=@sbindir@ HTMLDIR=@datadir@ INSTALL=@INSTALL@ INSTALL_OPTS=@INSTALL_OPTS@ PERFDATADIR=@PERFDATA_DIR@ DATAROOTDIR=@datarootdir@ PKG_NAME=@PKG_NAME@ PKG_VERSION=@PKG_VERSION@ HTTPD_CONF=@HTTPD_CONF@ CP=@CP@ all html: clean: -rm -f pnp/config.php -rm -f pnp/process_perfdata.cfg-sample -rm -f pnp/npcd.cfg-sample -rm -f misccommands.cfg-sample -rm -f nagios.cfg-sample -rm -f httpd.conf -rm -f pnp/pnp4nagios_release -rm -f lighttpd.pnp4nagios.conf -rm -f nginx.pnp4nagios.conf distclean: clean -rm -f Makefile devclean: distclean install: -rm -f $(DESTDIR)$(HTMLDIR)/conf/config.php $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(SYSCONFDIR) $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(SYSCONFDIR)/check_commands $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(SYSCONFDIR)/pages $(INSTALL) -m 644 $(INSTALL_OPTS) pnp/pnp4nagios_release $(DESTDIR)$(SYSCONFDIR) $(INSTALL) -m 644 $(INSTALL_OPTS) pnp/background.pdf $(DESTDIR)$(SYSCONFDIR) $(INSTALL) -m 644 $(INSTALL_OPTS) pnp/config.php $(DESTDIR)$(SYSCONFDIR)/config.php.$(PKG_VERSION); \ $(INSTALL) -m 644 $(INSTALL_OPTS) pnp/config.php $(DESTDIR)$(SYSCONFDIR); \ install-config: $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(SYSCONFDIR) $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(SYSCONFDIR)/check_commands $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(SYSCONFDIR)/pages $(INSTALL) -m 644 $(INSTALL_OPTS) pnp/config.php $(DESTDIR)$(SYSCONFDIR)/config.php.$(PKG_VERSION); \ $(INSTALL) -m 644 $(INSTALL_OPTS) pnp/config.php $(DESTDIR)$(SYSCONFDIR); \ if [ ! -e $(DESTDIR)$(SYSCONFDIR)/config_local.php ] ;then \ $(INSTALL) -m 644 $(INSTALL_OPTS) pnp/config.php $(DESTDIR)$(SYSCONFDIR)/config_local.php; \ fi if [ -e $(DESTDIR)$(SYSCONFDIR)/process_perfdata.cfg ] ;then \ $(INSTALL) -m 644 $(INSTALL_OPTS) pnp/process_perfdata.cfg-sample $(DESTDIR)$(SYSCONFDIR)/process_perfdata.cfg.$(PKG_VERSION); \ else\ $(INSTALL) -m 644 $(INSTALL_OPTS) pnp/process_perfdata.cfg-sample $(DESTDIR)$(SYSCONFDIR)/process_perfdata.cfg; \ fi if [ -e $(DESTDIR)$(SYSCONFDIR)/npcd.cfg ] ;then \ $(INSTALL) -m 644 $(INSTALL_OPTS) pnp/npcd.cfg-sample $(DESTDIR)$(SYSCONFDIR)/npcd.cfg.$(PKG_VERSION); \ else\ $(INSTALL) -m 644 $(INSTALL_OPTS) pnp/npcd.cfg-sample $(DESTDIR)$(SYSCONFDIR)/npcd.cfg; \ fi $(INSTALL) -m 644 $(INSTALL_OPTS) pnp/rra.cfg-sample $(DESTDIR)$(SYSCONFDIR) $(INSTALL) -m 644 $(INSTALL_OPTS) misccommands.cfg-sample $(DESTDIR)$(SYSCONFDIR) $(INSTALL) -m 644 $(INSTALL_OPTS) nagios.cfg-sample $(DESTDIR)$(SYSCONFDIR) $(INSTALL) -m 644 $(INSTALL_OPTS) pnp/check_commands/check_nwstat.cfg-sample $(DESTDIR)$(SYSCONFDIR)/check_commands $(INSTALL) -m 644 $(INSTALL_OPTS) pnp/check_commands/check_nrpe.cfg-sample $(DESTDIR)$(SYSCONFDIR)/check_commands $(INSTALL) -m 644 $(INSTALL_OPTS) pnp/check_commands/check_all_local_disks.cfg-sample $(DESTDIR)$(SYSCONFDIR)/check_commands $(INSTALL) -m 644 $(INSTALL_OPTS) pnp/pages/web_traffic.cfg-sample $(DESTDIR)$(SYSCONFDIR)/pages install-webconf: $(INSTALL) -m 755 -d $(DESTDIR)$(HTTPD_CONF) $(INSTALL) -m 644 httpd.conf $(DESTDIR)$(HTTPD_CONF)/$(PKG_NAME).conf pnp4nagios-0.6.16/sample-config/misccommands.cfg-sample.in0000664000000000000000000000227211662503006022136 0ustar rootroot# # definitions for PNP processing commands # # please uncomment the appropriate definitions and make sure # that there aren't duplicate entries in your config # # Synchronous mode # #define command { # command_name process-service-perfdata # command_line @PERL@ @libexecdir@/process_perfdata.pl #} # #define command { # command_name process-host-perfdata # command_line @PERL@ @libexecdir@/process_perfdata.pl -d HOSTPERFDATA #} # # Bulk mode # #define command{ # command_name process-service-perfdata-file # command_line @libexecdir@/process_perfdata.pl --bulk=@localstatedir@/service-perfdata #} #define command{ # command_name process-host-perfdata-file # command_line @libexecdir@/process_perfdata.pl --bulk=@localstatedir@/host-perfdata #} # # Bulk with NPCD mode # #define command{ # command_name process-service-perfdata-file # command_line /bin/mv @localstatedir@/service-perfdata @PERFDATA_SPOOL_DIR@/service-perfdata.$TIMET$ #} #define command{ # command_name process-host-perfdata-file # command_line /bin/mv @localstatedir@/host-perfdata @PERFDATA_SPOOL_DIR@/host-perfdata.$TIMET$ #} pnp4nagios-0.6.16/sample-config/lighttpd.pnp4nagios.conf.in0000664000000000000000000000110611662503006022263 0ustar rootroot# # Sample Lighttpd Config snippet. # Tested on Debian. # server.modules += ( "mod_auth" ) alias.url += ( "@BASE_URL@" => "@datarootdir@" ) $HTTP["url"] =~ "(^@BASE_URL@)" { auth.backend = "htpasswd" auth.backend.htpasswd.userfile = "/usr/local/nagios/etc/htpasswd.users" auth.require = ( "" => ( "method" => "basic", "realm" => "Nagios Access", "require" => "valid-user" ) ) } pnp4nagios-0.6.16/sample-config/nagios.cfg-sample.in0000664000000000000000000000315211662503006020737 0ustar rootroot# # definitions for PNP in nagios.cfg (icinga.cfg) # please make sure that you don't have duplicate entries # # Synchronous mode # process_performance_data=1 enable_environment_macros=1 # available since Nagios 3.x service_perfdata_command=process-service-perfdata host_perfdata_command=process-host-perfdata # NOT advisable prior to Nagios 3.0 # # Bulk / NPCD mode # process_performance_data=1 # *** the template definition differs from the one in the original nagios.cfg # service_perfdata_file=@localstatedir@/service-perfdata service_perfdata_file_template=DATATYPE::SERVICEPERFDATA\tTIMET::$TIMET$\tHOSTNAME::$HOSTNAME$\tSERVICEDESC::$SERVICEDESC$\tSERVICEPERFDATA::$SERVICEPERFDATA$\tSERVICECHECKCOMMAND::$SERVICECHECKCOMMAND$\tHOSTSTATE::$HOSTSTATE$\tHOSTSTATETYPE::$HOSTSTATETYPE$\tSERVICESTATE::$SERVICESTATE$\tSERVICESTATETYPE::$SERVICESTATETYPE$ service_perfdata_file_mode=a service_perfdata_file_processing_interval=15 service_perfdata_file_processing_command=process-service-perfdata-file # *** the template definition differs from the one in the original nagios.cfg # host_perfdata_file=@localstatedir@/host-perfdata host_perfdata_file_template=DATATYPE::HOSTPERFDATA\tTIMET::$TIMET$\tHOSTNAME::$HOSTNAME$\tHOSTPERFDATA::$HOSTPERFDATA$\tHOSTCHECKCOMMAND::$HOSTCHECKCOMMAND$\tHOSTSTATE::$HOSTSTATE$\tHOSTSTATETYPE::$HOSTSTATETYPE$ host_perfdata_file_mode=a host_perfdata_file_processing_interval=15 host_perfdata_file_processing_command=process-host-perfdata-file # # Module mode # event_broker_options=-1 # minimum 4+8=12 process_performance_data=1 broker_module=@libdir@/npcdmod.o config_file=@sysconfdir@/npcd.cfg pnp4nagios-0.6.16/sample-config/nginx.pnp4nagios.conf.in0000664000000000000000000000222411662503006021571 0ustar rootroot# SAMPLE CONFIG SNIPPETS FOR NGINX WEB SERVER # Contributed by Thomas Charbonnel # location @BASE_URL@ { # e.g. /usr/local/pnp4nagios/share; alias @datarootdir@; auth_basic "Nagios Access"; auth_basic_user_file /usr/local/nagios/etc/htpasswd.users; index index.php; # if we have e.g. /pnp4nagios/media/css/common.css # nginx will check # /usr/local/png4nagios/share/media/css/common/css # and return it if it's found # if it can't find a matching file even adding a trailing / # the request is handled to the @pnp4nagios location try_files $uri $uri/ @pnp4nagios; } location @pnp4nagios { # this implies the definition of some backend # e.g # upstream php { # server 127.0.0.1:9000; # } fastcgi_pass php; fastcgi_index index.php; # implies an external file, but this is common nginx practice include fastcgi_params; # this splits out the trailing path # eg index.php?host -> $fastcgi_path_info == 'host' fastcgi_split_path_info ^(.+\.php)(.*)$; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param SCRIPT_FILENAME @datarootdir@/index.php; } pnp4nagios-0.6.16/sample-config/httpd.conf.in0000664000000000000000000000155311662503006017514 0ustar rootroot# SAMPLE CONFIG SNIPPETS FOR APACHE WEB SERVER Alias @BASE_URL@ "@datarootdir@" AllowOverride None Order allow,deny Allow from all # # Use the same value as defined in nagios.conf # AuthName "Nagios Access" AuthType Basic AuthUserFile /usr/local/nagios/etc/htpasswd.users Require valid-user # Turn on URL rewriting RewriteEngine On Options FollowSymLinks # Installation directory RewriteBase @BASE_URL@/ # Protect application and system files from being viewed RewriteRule ^(application|modules|system) - [F,L] # Allow any files or directories that exist to be displayed directly RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # Rewrite all other URLs to index.php/URL RewriteRule .* index.php/$0 [PT,L] pnp4nagios-0.6.16/THANKS0000664000000000000000000000464211662503006013306 0ustar rootroot########################################### # PNP Thanks # ########################################### Olivier PLATHEY - For providing FPDF Sven Nierlein - For providing mod_gearman Michal Wojciechowski - For providing imgAreaSelect Hendrik Baecker - Testing, debugging and english Translation Olaf Reiss - Testing Andreas Koch - Testing Christian Mies - check_nwstat Templates, Testing Sebastian Schubert - Internal Design Stephan von Gehlen - Testing and Feedback Geoffrey Walton - Feedback and Translation Frank J. Heym - process_perfdata.pl Patch for check_nrpe Templates Rudolf Labuschagne - Testing PNP in distributed setups Sven Velt - Multigraph Layout Sonja Scholz - Documentation Andrea Gabellini - Matthias Flittener - Bugreport Ton Kersten - Dutch Language Matthias Flacke - check_multi development, npcd load patch Markus Dorfer - Christian Claus - Debugging 64bit Counter Herbert Straub Wolfgang Nieder - English translation, verify-script, nitpicking Max Schubert - Wolfgang Barth - Ethan Galstad - Patches and Feedback Jan Dreyer - Solaris debugging Jean-Marie Le Borgne - French Translation Steffen Waitz - ./configure Patch Lars Michelsen - Philipp Deneu - Thomas Stolle - Debugging and testing Benjamin Ritcey - Patches Franky Van Liedekerke - Testing Simon Meggle - Testing Mattias Ryrlén - Patches Nicolas Graziano - Patches Joe Precious - Testing Stefan Priebe - Patches Carlos de Nova - i18n Stefan Hoesl - Testing Trond Hasle Amundsen - Template check_openmanage Silvan Hunkirchen - Bugreport Petr Maizner - Bugreport Steve Finkelstein - Bugreport Mathias Kettner - xml write delay Yannig Parre - i18n fr_FR Laurent Freval - Patches and feedback Beau Gunderson - Patches and feedback Thomas Sesselmann - Patches and feedback Vladimir Bilik - Feedback Matthew Garrett - Thomas Charbonnel - nginx webserver config Richard Allen - Patches and feedback Falko Koglin - Patches Jochen Bern - Patches Mike Liebsch - Patches Joram Agten - Patches Juergen-Michael Radtke - Bugreport Robert Becht - Feedback ########################################### # NPCD Thanks # ########################################### Joerg Linge - for giving so much ideas what I have to do ;) Ethan Galstad - for many useful code to learn from Carsten Schlosser - for all the time I can disturb him to ask silly pointer questions My Girlfriend Katrin (without 'h') - for spending so much time without me pnp4nagios-0.6.16/helpers/0000775000000000000000000000000011662503006014027 5ustar rootrootpnp4nagios-0.6.16/helpers/w2h.pl.in0000775000000000000000000000755611662503006015511 0ustar rootroot#!@PERL@ ## @PKG_NAME@–@PKG_VERSION@ ## Copyright (c) 2010 http://www.pnp4nagios.org ( Wolfgang Nieder) ## ## 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 2 ## 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, write to the Free Software ## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. use strict; sub usage { print < is one of: de - german documentation en - english documentation es - spanish documentation folder structure + +-+- docs +--- de_DE HTML documents +--- en_US HTML documents +--- es_ES HTML documents ------------------------------------------------------------------ EOD } if ((! @ARGV) or ($ARGV[0] =~ /-h/)) { usage(); exit 1; } my %lang = (); my $base = 'http://docs.pnp4nagios.org'; my $tag = "pnp-0.6"; my @pg = (); my $out = 0; my $res = 0; $lang{de} = 'de_DE'; $lang{en} = 'en_US'; $lang{es} = 'es_ES'; # $lang{fr} = 'fr_FR'; mkdir ("docs") unless (-d "docs"); chdir ("docs") || die "shit"; mkdir ("_media") unless (-d "_media"); foreach my $lng (keys %lang) { next unless ($lng eq lc($ARGV[0])); @pg = (); push @pg, 'start'; mkdir ($lang{$lng}) unless (-d $lang{$lng}); chdir ($lang{$lng}) || return; my $lng2 = ($lng eq 'en' ? "" : $lng); my $page = 0; while ($page <= $#pg) { $pg[$page] =~ s/\?.*//; if ($pg[$page] =~ /(.*)\//) { `mkdir -p $1`; } unless (-f $pg[$page]) { my $url = "$base/$lng2/$tag/$pg[$page]"; $res = `wget -nv $url`; conv ($pg[$page],$lng) unless ($!); } $page++; } for my $page (0..$#pg) { unlink $pg[$page]; } chdir (".."); } chdir (".."); exit; sub conv { my $iFile = shift; my $lng = shift; my $oFile = "$iFile.html"; return unless (-f $iFile); open (IFILE, "$iFile") || die "Error opening $iFile, RC=$!"; open (OFILE, ">$oFile") || die "Error creating $oFile, RC=$!"; print OFILE "\n \n"; while () { if (/right_page/) { # skip header stuff $out = 1; next; } $out = 0 if (/stylefoot/); # finished next unless ($out); next if (/Read more.../); # line in doc_complete if (/a href=".*\/$tag\/(.*?)(#.*)?"/) { # might be a link my $ad = $1; ($ad) =~ s/\?.*//; next if ($ad =~ /=/); next if ($ad =~ /png/); push @pg,$ad; } # convert language specific characters to HTML entities s/ä/\ä/g; s/ö/\ö/g; s/ü/\ü/g; s/Ä/\Ä/g; s/Ö/\Ö/g; s/Ü/\Ü/g; s/ß/\ß/g; s/á/\á/g; s/é/\é/g; s/í/\í/g; s/ó/\ó/g; s/ú/\ú/g; s/è/\è/g; s/ô/\ô/g; s/ñ/\ñ/g; s/¿/\¿/g; s/–/--/g; s/—/-/g; s/“/"/g; s/”/"/g; s/„/"/g; s/→/→/g; s/…/…/g; # convert links s#(/_media)#..$1#g; if ((/href="/) and (! /http:/)) { if (/href="(.*?)"/) { s#/$lng/$tag/(.*?)(["|\#])#$1.html$2#g; } if (/img src="(.+?)(\?.*?)"/) { my $pic = $1; my $img = $1; ($img) =~ s/.*\///; chdir "../_media/"; $res = `wget $base/$pic` unless (-f $img); chdir "../$lang{$lng}"; $_ = ""; } } print OFILE "$_"; } close (IFILE); print OFILE " \n\n"; close (OFILE); } pnp4nagios-0.6.16/helpers/kohana-install.sh0000775000000000000000000000063311662503006017275 0ustar rootroot#!/bin/sh # # PNP4Nagios Helper Script # DIR=`dirname $0` cd $DIR/../lib/kohana for D in `find . -type d -printf "%P\n"`;do if [ "$D" != "" ];then echo -e "\t\$(INSTALL) -m 755 \$(INSTALL_OPTS) -d \$(DESTDIR)\$(LIBDIR)/kohana/$D" fi done for F in `find . -type f -printf "%P\n"`;do if [ "$F" != "" ];then echo -e "\t\$(INSTALL) -m 644 \$(INSTALL_OPTS) kohana/$F \$(DESTDIR)\$(LIBDIR)/kohana/$F" fi done