Subversion Repositories Applications.papyrus

Compare Revisions

No changes between revisions

Ignore whitespace Rev 2149 → Rev 2150

/trunk/papyrus/pap_verification.inc.php
84,7 → 84,10
 
/* +--Fin du code ----------------------------------------------------------------------------------------+
*
* $Log: not supported by cvs2svn $
* $Log: pap_verification.inc.php,v $
* Revision 1.9 2007-04-13 09:41:09 neiluj
* réparration cvs
*
* Revision 1.8 2006/04/28 12:41:49 florian
* corrections erreurs chemin
*
/trunk/papyrus/installation/papyrus_v0.24.sql
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/papyrus/pap_cache.inc.php
104,7 → 104,10
 
/* +--Fin du code ----------------------------------------------------------------------------------------+
*
* $Log: not supported by cvs2svn $
* $Log: pap_cache.inc.php,v $
* Revision 1.4 2007-04-13 09:41:09 neiluj
* réparration cvs
*
* Revision 1.3 2006/04/28 12:41:49 florian
* corrections erreurs chemin
*
/trunk/papyrus/pap_initialise_info.inc.php
1,699 → 1,699
<?php
//vim: set expandtab tabstop=4 shiftwidth=4:
// +------------------------------------------------------------------------------------------------------+
// | PHP version 4.1 |
// +------------------------------------------------------------------------------------------------------+
// | Copyright (C) 2003 Tela Botanica (accueil@tela-botanica.org) |
// +------------------------------------------------------------------------------------------------------+
// | |
// | This library is free software; you can redistribute it and/or |
// | modify it under the terms of the GNU Lesser General Public |
// | License as published by the Free Software Foundation; either |
// | version 2.1 of the License, or (at your option) any later version. |
// | |
// | This library is distributed in the hope that it will be useful, |
// | but WITHOUT ANY WARRANTY; without even the implied warranty of |
// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
// | Lesser General Public License for more details. |
// | |
// | You should have received a copy of the GNU Lesser General Public |
// | License along with this library; if not, write to the Free Software |
// | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
// | |
// +------------------------------------------------------------------------------------------------------+
// CVS : $Id: pap_initialise_info.inc.php,v 1.32 2007-10-23 13:45:33 ddelon Exp $
/**
*Initialisation de Papyrus : vérification et récupération de paramètres généraux.
*
* La page contient le code initialisant l'exécution du rendu d'une page par Papyrus.
* Nous y trouvons la recherche des informations disponibles sur :
* - le site présent sur le serveur demandé,
* - l'identification,
* - la langue,
* - le menu,
* - la page
* - l'application
*
*@package Papyrus
//Auteur original :
*@author Jean-Pascal MILCENT <jpm@tela-botanica.org>
//Autres auteurs :
*@author Alexandre GRANIER <alex@tela-botanica.org>
*@author Laurent COUDOUNEAU <laurent.coudouneau@ema.fr>
*@copyright Tela-Botanica 2000-2004
*@version $Revision: 1.32 $ $Date: 2007-10-23 13:45:33 $
// +------------------------------------------------------------------------------------------------------+
*/
 
// +------------------------------------------------------------------------------------------------------+
// | ENTÊTE du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
/** Inclusion de l'objet PEAR servant à négocier le language avec le navigateur client. */
require_once PAP_CHEMIN_API_PEAR.'HTTP.php';
/** Inclusion de la classe PEAR gérant les URL : Utilisé pour l'url demandée par le client.*/
require_once PAP_CHEMIN_API_PEAR.'Net/URL.php';
/** Inclusion de la bibliothèque de fonctions servant à l'initialisation des variables globales de Papyrus. */
require_once GEN_CHEMIN_BIBLIO.'pap_initialisation.fonct.php';
/** Inclusion de la classe Papyrus gérant les URL : Utilisé pour l'url demandée par le client.*/
require_once GEN_CHEMIN_BIBLIO_CLASSE.'pap_url.class.php';
/** Inclusion de la bibliothèque de fonctions servant au menu pour la réecriture d'url. */
require_once GEN_CHEMIN_BIBLIO.'pap_menu.fonct.php';
 
// +------------------------------------------------------------------------------------------------------+
// | CORPS du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
 
// Recherche de la présence de la valeur d'i18n dans l'url
if ( (isset($_GET[GEN_URL_CLE_I18N])) && (!empty($_GET[GEN_URL_CLE_I18N])) ) {
$_GEN_commun['i18n'] = $_GET[GEN_URL_CLE_I18N];
} else {
$_GEN_commun['i18n'] = GEN_I18N_ID_DEFAUT;
}
 
// +------------------------------------------------------------------------------------------------------+
// Gestion de la réecriture d'url et des url erreur 404
if ((defined('PAP_URL_REECRITURE') AND PAP_URL_REECRITURE == '1' && (! isset($_GET[GEN_URL_CLE_SITE]) || empty($_GET[GEN_URL_CLE_SITE])) && (! isset($_GET[GEN_URL_CLE_MENU]) || empty($_GET[GEN_URL_CLE_MENU]))) ) {
$tab_type_reecriture = array('MENU', 'SITE');
foreach ($tab_type_reecriture as $reecriture) {
if (PAP_URL_REECRITURE_SEP == '/') {
$masque_reecriture = '/^(\/.*?)'.constant('PAP_URL_REECRITURE_'.$reecriture).'\\'.PAP_URL_REECRITURE_SEP.'([^?]+?)(?:\?(.*)|)$/';
} else {
$masque_reecriture = '/^(\/.*?)'.constant('PAP_URL_REECRITURE_'.$reecriture).PAP_URL_REECRITURE_SEP.'([^?]+?)(?:\?(.*)|)$/';
}
if (preg_match($masque_reecriture, rawurldecode($_SERVER['REQUEST_URI']), $tab_raccourci)) {
$chemin_vers_papyrus = $tab_raccourci[1];
$raccourci = $tab_raccourci[2];
$parametres = '';
if (isset($tab_raccourci[3])) {
$parametres = $tab_raccourci[3];
}
if ($reecriture == 'SITE') {
/** Inclusion de la bibliothèque de fonctions servant au site pour la réecriture d'url. */
require_once GEN_CHEMIN_BIBLIO.'pap_site.fonct.php';
}
// Nous cherchons à savoir si le raccourci est entièrement numérique ou pas.
if (preg_match('/^[0-9]+$/', $raccourci)) {
// Nous vérifions si nous utilisons les codes numériques ou alphanumérique dans les url
if (constant('GEN_URL_ID_TYPE_'.$reecriture) != 'int') {
if ($reecriture == 'SITE') {
$_GET[constant('GEN_URL_CLE_'.$reecriture)] = call_user_func('GEN_retourner'.$reecriture.'CodeAlpha', $db, $raccourci, $_GEN_commun['i18n']);
} else {
$_GET[constant('GEN_URL_CLE_'.$reecriture)] = call_user_func('GEN_retourner'.$reecriture.'CodeAlpha', $db, $raccourci);
}
} else {
$_GET[constant('GEN_URL_CLE_'.$reecriture)] = $raccourci;
}
} else {
// Nous vérifions si nous utilisons les codes numériques ou alphanumérique dans les url
if (constant('GEN_URL_ID_TYPE_'.$reecriture) != 'int') {
$_GET[constant('GEN_URL_CLE_'.$reecriture)] = $raccourci;
} else {
if ($reecriture == 'SITE') {
$_GET[constant('GEN_URL_CLE_'.$reecriture)] = call_user_func('GEN_retourner'.$reecriture.'CodeNum', $db, $raccourci, $_GEN_commun['i18n']);
} else {
$_GET[constant('GEN_URL_CLE_'.$reecriture)] = call_user_func('GEN_retourner'.$reecriture.'CodeNum', $db, $raccourci);
}
}
}
}
}
}
 
// +------------------------------------------------------------------------------------------------------+
// Gestion des sites : disponibles sur le serveur courant.
// Liste des catégories de site à prendre en compte :
// Pas de site, ni de menu dans l'URL, recherche du site par défaut
$site_liste_id = '102, 103';// 102 = site "principal" et 103 = site "externe"
if ( (! isset($_GET[GEN_URL_CLE_SITE]) || empty($_GET[GEN_URL_CLE_SITE])) && (! isset($_GET[GEN_URL_CLE_MENU]) || empty($_GET[GEN_URL_CLE_MENU])) ) {
$requete = 'SELECT gen_site.*, GSR02.* '.
'FROM gen_site, gen_site_relation AS GSR01, gen_site_relation AS GSR02 '.
'WHERE GSR01.gsr_id_site_01 = GSR01.gsr_id_site_02 '.
'AND GSR01.gsr_id_valeur = 101 '.// 101 = site défaut
'AND GSR01.gsr_id_site_01 = gs_id_site '.
'AND GSR02.gsr_id_site_01 = GSR02.gsr_id_site_02 '.
'AND GSR02.gsr_id_valeur IN ('.$site_liste_id.') '.
'AND GSR02.gsr_id_site_01 = gs_id_site';
$resultat = $db->query($requete);
if (DB::isError($resultat)) {
die( BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete) );
}
// Aucun site trouvé
if ($resultat->numRows() == 0) {
// Appel à l'application Installateur si nécessaire
/** <br> Inclusion du programme Installateur de Papyrus.
* L'abscence de site oblige à relancer l'installation et le script sql qui régénérera la base de données.*/
include_once GEN_CHEMIN_APPLICATION.'installateur/installateur.php';
$_GEN_commun['sortie'] = afficherContenuCorps();
include_once GEN_CHEMIN_PAP.'pap_envoi.inc.php';
// Fin du programme Papyrus.
exit(0);
}
// Nous avons trouvé un site.
$_GEN_commun['info_site'] = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
$resultat->free();
if (GEN_URL_ID_TYPE_SITE == 'int') {
$_GEN_commun['url_site'] = $_GEN_commun['info_site']->gs_code_num;
} else {
$_GEN_commun['url_site'] = $_GEN_commun['info_site']->gs_code_alpha;
}
// Le code du menu est présent dans l'url mais pas celui du site
} else if ( (! isset($_GET[GEN_URL_CLE_SITE]) || empty($_GET[GEN_URL_CLE_SITE])) && (isset($_GET[GEN_URL_CLE_MENU]) || !empty($_GET[GEN_URL_CLE_MENU])) ) {
// Nous récupérons les infos du menu et du sites dans la variable globale de Papyrus.
$_GEN_commun['url_menu'] = $_GET[GEN_URL_CLE_MENU];
// Récupération des informations sur le menu demandé
$requete = 'SELECT * '.
'FROM gen_menu '.
'WHERE ';
$requete .= (GEN_URL_ID_TYPE_MENU == 'int')
? 'gm_code_num = '.$_GEN_commun['url_menu']
: 'gm_code_alpha = "'.$_GEN_commun['url_menu'].'"';
 
$resultat = $db->query($requete);
(DB::isError($resultat))
? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete))
: '';
$_GEN_commun['info_menu'] = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
$resultat->free();
if ($_GEN_commun['info_menu']->gm_ce_site != 0) {
// Récupération des infos du site
$requete = 'SELECT * '.
'FROM gen_site, gen_site_relation '.
'WHERE gsr_id_site_01 = gsr_id_site_02 '.
'AND gsr_id_valeur IN ('.$site_liste_id.') '.
'AND gsr_id_site_01 = gs_id_site '.
'AND gs_id_site = '. $_GEN_commun['info_menu']->gm_ce_site;
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
$_GEN_commun['info_site'] = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
$_GEN_commun['url_site'] = (GEN_URL_ID_TYPE_SITE == 'int')
? $_GEN_commun['info_site']->gs_code_num
: $_GEN_commun['info_site']->gs_code_alpha;
$resultat->free();
} else {
// Récupération des infos du site
$requete = 'SELECT * '.
'FROM gen_site, gen_site_relation '.
'WHERE gsr_id_site_01 = gsr_id_site_02 '.
'AND gsr_id_valeur = 101 '.
'AND gsr_id_site_01 = gs_id_site ';
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
$_GEN_commun['info_site'] = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
$_GEN_commun['url_site'] = (GEN_URL_ID_TYPE_SITE == 'int')
? $_GEN_commun['info_site']->gs_code_num
: $_GEN_commun['info_site']->gs_code_alpha;
$resultat->free();
}
} else {
// Récupération de la valeur identifiant le site depuis l'url
$_GEN_commun['url_site'] = $_GET[GEN_URL_CLE_SITE];
// Récupération des informations sur le site
// ATTENTION : pour fonctionner le site par dans la langue par défaut doit avoir une relation : id_site id_site id_valeur=1
$requete = 'SELECT * '.
'FROM gen_site, gen_site_relation '.
'WHERE gsr_id_site_01 = gsr_id_site_02 '.
'AND gsr_id_valeur IN ('.$site_liste_id.') '.
'AND gsr_id_site_01 = gs_id_site '.
'AND gs_ce_i18n = "'.GEN_I18N_ID_DEFAUT.'" '.
'AND ';
$requete .= (GEN_URL_ID_TYPE_SITE == 'int')
? 'gs_code_num = "'.$_GEN_commun['url_site'].'" '
: 'gs_code_alpha = "'.$_GEN_commun['url_site'].'" ';
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
$_GEN_commun['info_site'] = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
$resultat->free();
}
 
//Gestion de l'erreur aucun site trouvable.
if (! isset($_GEN_commun['info_site'])) {
// Appel à l'application Installateur si nécessaire
/** <br> Inclusion du programme Installateur de Papyrus.
* L'abscence de site oblige à relancer l'installation et le script sql qui régénérera la base de données.*/
include_once GEN_CHEMIN_APPLICATION.'installateur/installateur.php';
$_GEN_commun['sortie'] .= afficherContenuCorps();
include_once GEN_CHEMIN_PAP.'pap_envoi.inc.php';
// Fin du programme Papyrus.
exit(0);
} else if ($_GEN_commun['info_site']->gsr_id_valeur == 103) {
// Gestion de la redirection pour les sites "externes"
header('Location:'.$_GEN_commun['info_site']->gs_url);
exit(0);
}
 
// Nous récupérons des informations sur l'internationalisation
$requete = 'SELECT * '.
'FROM gen_i18n '.
'WHERE gi_id_i18n = "'.$_GEN_commun['i18n'].'"';
 
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
 
$_GEN_commun['info_i18n'] = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
$resultat->free();
 
 
// Récupération des informations sur la langue
$requete = 'SELECT * '.
'FROM gen_i18n_langue '.
'WHERE gil_id_langue = "'.$_GEN_commun['info_i18n']->gi_ce_langue.'"';
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
 
$_GEN_commun['info_i18n_langue'] = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
$resultat->free();
 
// Récupération des informations sur le pays
$requete = 'SELECT * '.
'FROM gen_i18n_pays '.
'WHERE gip_id_pays = "'.$_GEN_commun['info_i18n']->gi_ce_pays.'"';
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
 
$_GEN_commun['info_i18n_pays'] = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
$resultat->free();
 
// +------------------------------------------------------------------------------------------------------+
// Gestion des menus
//
// Nous vérifions le cas où le code du menu est introuvable dans l'url.
if ( (! isset($_GET[GEN_URL_CLE_MENU])) || (empty($_GET[GEN_URL_CLE_MENU])) ) {
// Recherche du premier menu du site courant:
$requete = 'SELECT gen_menu.* '.
'FROM gen_menu, gen_menu_relation '.
'WHERE gm_ce_site = '.$_GEN_commun['info_site']->gs_id_site.' '.
'AND gmr_id_menu_01 = gm_id_menu '.
'AND gmr_id_menu_01 = gmr_id_menu_02 '.
'AND gmr_id_valeur = 101 ';// 101 = menu par "defaut"
 
$resultat = $db->query($requete);
(DB::isError($resultat))
? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete))
: '';
// Nous avons trouvé un menu "défaut" pour le site courant.
$_GEN_commun['info_menu'] = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
$resultat->free();
 
if (isset($_GEN_commun['url_menu'])) {
// Stockage du code du menu demandée dans la variable globale de Papyrus.
if (GEN_URL_ID_TYPE_MENU == 'int') {
$_GEN_commun['url_menu'] = $_GEN_commun['info_menu']->gm_code_num;
} else {
$_GEN_commun['url_menu'] = $_GEN_commun['info_menu']->gm_code_alpha;
}
}
}
 
else
if (! isset($_GET['url_menu']) && empty($_GEN_commun['url_menu'])) {
// Le code du menu est présent dans l'url et il n'a pas encore été récupéré
// Nous le récupérons dans la variable globale de Papyrus.
$_GEN_commun['url_menu'] = $_GET[GEN_URL_CLE_MENU];
 
// Récupération des informations sur le menu demandé
$requete = 'SELECT * '.
'FROM gen_menu '.
'WHERE ';
$requete .= (GEN_URL_ID_TYPE_MENU == 'int')
? 'gm_code_num = '.$_GEN_commun['url_menu']
: 'gm_code_alpha = "'.$_GEN_commun['url_menu'].'"';
 
$resultat = $db->query($requete);
(DB::isError($resultat))
? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete))
: '';
 
$_GEN_commun['info_menu'] = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
$resultat->free();
}
 
// +------------------------------------------------------------------------------------------------------+
// Gestion des traductions
 
// Si le résultat de la négociation de l'internationalisation donne une langue différente
// de celle du site principal, nous récupérons les éventuelles valeurs traduite pour le site.
 
$id_langue = $GLOBALS['_GEN_commun']['i18n'];
 
if (isset($id_langue) && ($id_langue!='')) {
$langue_test=$id_langue;
} else {
$langue_test=GEN_I18N_ID_DEFAUT;
}
 
if ($langue_test!=GEN_I18N_ID_DEFAUT) {
// Récupération des informations sur la traduction du site
$requete = 'SELECT * '.
'FROM gen_site '.
'WHERE gs_ce_i18n = "'.$langue_test.'" '.
'AND gs_code_num = "'.$_GEN_commun['info_site']->gs_code_num.'"';
// 'WHERE gs_ce_i18n = "'.$_GEN_commun['i18n'].'" '.
// 'AND gs_code_alpha = "'.$_GEN_commun['info_site']->gs_code_alpha.'"';
 
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
 
// Nous créons l'entrée 'traduction_info_site' dans _GEN_commun que si nous avons bien trouvé une
// traduction pour le site. Il faut donc tester l'existence de cette entrée avant de l'utiliser.
if ($resultat->numRows() > 0) {
$_GEN_commun['traduction_info_site'] = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
}
$resultat->free();
}
 
// Si le résultat de la négociation de l'internationalisation donne une langue différente
// de celle du menu, nous récupérons les éventuelles valeurs traduite pour le menu.
 
//print_r($_GEN_commun);
 
if (isset($_GEN_commun['info_menu'])) { // Evite les warning si pas encore de menu cree pour ce site
 
if ($langue_test!=GEN_I18N_ID_DEFAUT) {
// Récupération des informations sur la traduction du menu
$requete = 'SELECT * '.
'FROM gen_menu '.
'WHERE gm_ce_i18n = "'.$langue_test.'" '.
'AND gm_code_num = "'.$_GEN_commun['info_menu']->gm_code_num.'"';
// 'WHERE gm_ce_i18n = "'.$_GEN_commun['i18n'].'" '.
// 'AND gm_code_alpha = "'.$_GEN_commun['info_menu']->gm_code_alpha.'"';
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
// Nous créons l'entrée 'traduction_info_menu' dans _GEN_commun que si nous avons bien trouvé une
// traduction pour le menu. Il faut donc tester l'existence de cette entrée avant de l'utiliser.
if ($resultat->numRows() > 0) {
$_GEN_commun['traduction_info_menu'] = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
}
$resultat->free();
}
}
// +------------------------------------------------------------------------------------------------------+
// Gestion de l'application du menu demandé.
 
// Recherche de la première application liée
if (isset($_GEN_commun['info_menu']->gm_id_menu)) {
$info_appli_menu = GEN_donnerIdPremiereApplicationLiee($_GEN_commun['info_menu']->gm_id_menu);
if (is_array($info_appli_menu)) {
$id_application = $info_appli_menu['gm_ce_application'];
$id_menu_actif = $info_appli_menu['gm_id_menu'];
 
// Si le menu n'a pas d'application lié, on recalcule l'objet $_GEN_commun['info_menu']
if ($id_menu_actif != $_GEN_commun['info_menu']->gm_id_menu) {
$requete = 'SELECT gen_menu.* '.
'FROM gen_menu '.
'WHERE gm_id_menu = '.$id_menu_actif;
 
$resultat = $db->query($requete);
(DB::isError($resultat))
? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete))
: '';
// Nous avons trouvé un menu "défaut" pour le site courant.
$_GEN_commun['info_menu'] = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
$resultat->free();
}
 
 
// Recherche des informations sur l'application liée
$requete_applicaton = 'SELECT * '.
'FROM gen_application '.
'WHERE gap_id_application = '.$id_application;
 
$resultat_applicaton = $db->query($requete_applicaton);
(DB::isError($resultat_applicaton))
? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_applicaton->getMessage(), $requete_applicaton))
: '';
 
$_GEN_commun['info_application'] = $resultat_applicaton->fetchRow(DB_FETCHMODE_OBJECT) ;
$resultat_applicaton->free();
} else {
// Gestion des erreurs sur la recherche de l'application liée.
// Finalement il a été décidé de ne pas afficher cette information sous la forme d'erreur.
//trigger_error('application du menu demandée introuvable', E_USER_NOTICE);
}
}
 
// +------------------------------------------------------------------------------------------------------+
// Gestion des arguments de l'application
 
if (isset($_GEN_commun['info_menu']->gm_application_arguments)) {
$arguments = explode(' ', $_GEN_commun['info_menu']->gm_application_arguments);
 
// Initialisaton de la variable globale $GS_ARGUMENTS
$_GEN_commun['info_application']->cache = false;
$_GEN_commun['info_application']->cache_duree = 0;
 
for ($i = 0; $i < count($arguments); $i++) {
$attr = explode('=', $arguments[$i]);
 
if ($attr[0] == 'cache_duree') {
$_GEN_commun['info_application']->cache_duree = $attr[1];
if ($_GEN_commun['info_application']->cache_duree > 0) {
$_GEN_commun['info_application']->cache = true;
}
} else if ($attr[0] != '') {
$_GEN_commun['info_application']->$attr[0] = (isset($attr[1]) ? $attr[1] : '');
}
}
}
 
// +------------------------------------------------------------------------------------------------------+
// Gestion des applettes
 
$requete = 'SELECT * '.
'FROM gen_application '.
'WHERE gap_bool_applette = 1 ';
$resultat = $_GEN_commun['pear_db']->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
 
$_GEN_commun['info_applette'] = array();
$i = 0;
while ($ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT)) {
$_GEN_commun['info_applette'][$i] = $ligne;
$i++;
}
$resultat->free();
 
// +------------------------------------------------------------------------------------------------------+
// Gestion de l'objet URL
 
$_GEN_commun['url'] = & new Pap_URL(PAP_URL);
if (isset($_GEN_commun['info_menu'])) {
$_GEN_commun['url']->setId($_GEN_commun['info_menu']->gm_id_menu);
}
 
if ( (isset($_GEN_commun['url_site'])) && (!empty($_GEN_commun['url_site'])) ) {
$_GEN_commun['url']->addQueryString(GEN_URL_CLE_SITE, $_GEN_commun['url_site']);
}
 
if ( (isset($_GEN_commun['url_menu'])) && (!empty($_GEN_commun['url_menu'])) ) {
$_GEN_commun['url']->addQueryString(GEN_URL_CLE_MENU, $_GEN_commun['url_menu']);
}
 
if ( (isset($_GET[GEN_URL_CLE_DATE])) && (!empty($_GET[GEN_URL_CLE_DATE])) ) {
$_GEN_commun['url_date'] = $_GET[GEN_URL_CLE_DATE];
$_GEN_commun['url']->addQueryString(GEN_URL_CLE_DATE, $_GEN_commun['url_date']);
}
 
if ( (isset($_GET[GEN_URL_CLE_FORMAT])) && (!empty($_GET[GEN_URL_CLE_FORMAT])) ) {
$_GEN_commun['url_format'] = $_GET[GEN_URL_CLE_FORMAT];
$_GEN_commun['url']->addQueryString(GEN_URL_CLE_FORMAT, $_GEN_commun['url_format']);
}
 
/* +--Fin du code ---------------------------------------------------------------------------------------+
* $Log: not supported by cvs2svn $
* Revision 1.31 2007-04-19 16:54:52 ddelon
* backport mulitlinguisme
*
* Revision 1.30 2007/04/19 15:34:35 neiluj
* préparration release (livraison) "Narmer" - v0.25
*
* Revision 1.29 2007/04/13 09:41:09 neiluj
* réparration cvs
*
* Revision 1.28 2006/12/01 15:41:21 ddelon
* erreur affichage
*
* Revision 1.27 2006/11/07 18:43:54 jp_milcent
* Modification des expressions régulières des permaliens.
*
* Revision 1.26 2006/10/18 10:18:05 jp_milcent
* Gestion des erreurs HTTP par Papyrus.
*
* Revision 1.25 2006/10/11 18:04:11 jp_milcent
* Gestion avancée de la réecriture d'URL.
*
* Revision 1.24 2006/03/02 10:49:49 ddelon
* Fusion branche multilinguisme dans branche principale
*
* Revision 1.23.2.2 2005/12/20 14:40:24 ddelon
* Fusion Head vers Livraison
*
* Revision 1.23.2.1 2005/12/01 23:31:57 ddelon
* Merge Head vers multilinguisme
*
* Revision 1.23 2005/09/22 14:02:49 ddelon
* nettoyage annuaire et php5
*
* Revision 1.22 2005/09/20 17:01:22 ddelon
* php5 et bugs divers
*
* Revision 1.21 2005/08/31 17:34:52 ddelon
* Integrateur Wikini et administration des Wikini
*
* Revision 1.20 2005/06/24 10:48:35 jpm
* Modification des chemins des fichiers pour fonctionnement avec API Pear locale.
*
* Revision 1.19 2005/04/14 13:52:37 jpm
* Utilisation de la classe Pap_URL.
*
* Revision 1.18 2005/02/28 11:20:42 jpm
* Modification des auteurs.
*
* Revision 1.17 2005/02/23 15:35:04 jpm
* L'erreur "pas d'application" a été supprimé une message dans le corps du texte fourni déjà cette information.
*
* Revision 1.16 2005/02/17 17:51:40 florian
* Correction bug monde sans menu ni appli
*
* Revision 1.15 2004/12/06 12:12:28 jpm
* Début de gestion des auth multiples.
*
* Revision 1.14 2004/11/15 17:14:09 jpm
* Gestion des url avec seulement le code d'un menu.
*
* Revision 1.13 2004/11/03 17:14:38 jpm
* Gestion des sites externes.
*
* Revision 1.12 2004/10/26 18:42:21 jpm
* Gestion des sites externes.
*
* Revision 1.11 2004/10/25 16:28:47 jpm
* Ajout de nouvelles balises Papyrus, ajout vérification mise à jour de Papyrus, meilleure gestion des sessions...
*
* Revision 1.10 2004/10/22 17:23:59 jpm
* Début amélioration de la gestion des erreurs et de l'installation.
*
* Revision 1.9 2004/10/15 18:29:19 jpm
* Modif pour gérer l'appli installateur de Papyrus.
*
* Revision 1.8 2004/09/23 14:30:53 jpm
* Correction bogue sur les menus.
*
* Revision 1.7 2004/09/23 10:46:46 jpm
* Amélioration de la gestion du menu actif quand un menu n'a pas d'application liée.
*
* Revision 1.6 2004/09/10 16:38:34 jpm
* Ajout de l'initialisation d'une variable stockant les infos de débogage.
*
* Revision 1.5 2004/06/30 07:35:16 jpm
* Correction d'un bogue du à une mauvaise gestion de la résolution des conflits entre fichier CVS.
*
* Revision 1.4 2004/06/30 07:25:37 jpm
* Ajout d'un commentaire.
*
* Revision 1.3 2004/06/18 15:52:45 alex
* Actualisation de la variable $_GEN_commun['info_menu'] lorsque un menu n'a pas d'application lié
*
* Revision 1.2 2004/06/17 07:03:01 jpm
* Correction d'un bogue concernant l'internationalisation par défaut quand la langue du navigateur ne correspond pas à celle du site.
*
* Revision 1.1 2004/06/16 08:13:20 jpm
* Changement de nom de Papyrus en Papyrus.
* Changement de l'arborescence.
*
* Revision 1.24 2004/05/05 14:33:37 jpm
* Gestion de l'indication de langue dans l'url.
* Utile que si on veut forcer la langue.
*
* Revision 1.23 2004/05/05 10:42:35 jpm
* Amélioration de la gestion de l'internationalisation.
*
* Revision 1.22 2004/05/04 16:17:05 jpm
* Légère amélioration du code (libération
 
de ressource).
*
* Revision 1.21 2004/05/03 11:21:58 jpm
* Fin de la gestion des applettes et suppression de l'info_menu_hierarchie de _GEN_commun.
*
* Revision 1.20 2004/04/30 16:17:27 jpm
* Ajout de la récupération d'une info sur la hiérarchie.
* Surement à supprimer car inutile.
*
* Revision 1.19 2004/04/28 12:04:31 jpm
* Changement du modèle de la base de données.
*
* Revision 1.18 2004/04/22 08:28:12 jpm
* Transformation de $GS_GLOBAL en $_GEN_commun.
*
* Revision 1.17 2004/04/09 16:43:32 jpm
* Suppression d'un blanc.
*
* Revision 1.16 2004/04/09 16:20:11 jpm
* Récupération de la création de l'objet URL.
* Gestion des tables i18n.
*
* Revision 1.15 2004/04/05 16:37:43 jpm
* Utilisation de la classe Pear HTTP pour la négociation du langage à utiliser pour le site.
*
* Revision 1.14 2004/04/02 16:29:30 jpm
* Déplacement dans le fichier gen_initialisation_pear.inc.php de la création des objets Pear Net_URL et Auth.
*
* Revision 1.13 2004/04/01 11:27:13 jpm
* Ajout et modification de commentaires pour PhpDocumentor.
*
* Revision 1.12 2004/03/31 16:50:04 jpm
* Prise en compte du nouveau modèle de Papyrus révision 1.9.
*
* Revision 1.11 2004/03/27 11:04:14 jpm
* Déplacement des fonctions de gestion d'erreur dans la bibliotheque de l'application Installateur.
* Modification des commentaires vis à vis du nouveau modèle.
* Changement et simplification des noms des variables globales.
* Suppression de l'attribution d'une configuration par défaut.
* Remplacement de variable par des constante provenant du fichier de configuration.
* Traduction en français de certaines variables et partie de code.
*
* Revision 1.10 2004/03/24 07:20:03 jpm
* Mise en forme requête sql.
*
* Revision 1.9 2004/03/23 17:06:56 jpm
* Ajout de commentaire dans l'entête.
* Mise en conformité avec la convention de codage.
*
* Revision 1.8 2004/03/23 16:31:54 jpm
* Ajout du code provenant de gen_noyau.inc.php.
* Ajout, formatage et traduction des commentaires.
*
* Revision 1.7 2004/03/22 18:35:32 jpm
* Traduction et ajout de commentaires.
* Amélioration de la conformité avec la convention de codage.
* Changement requête sql pour le nouveau modèle de Papyrus.
*
* Revision 1.6 2004/03/22 11:14:30 jpm
* Ajout de commentaires et mise en forme.
* Correction des requêtes sql pour mise en conformité avec le nouveau modèle de Papyrus et la convention de codage.
*
* Revision 1.5 2003/12/16 16:57:59 alex
* mise à jour pour compatibilité avec genesia
*
* Revision 1.4 2003/11/24 16:05:02 jpm
* Ajout de commentaires et début de mise en conformité
* avec la convention de codage.
*
*
* +--Fin du code ----------------------------------------------------------------------------------------+
*/
?>
<?php
//vim: set expandtab tabstop=4 shiftwidth=4:
// +------------------------------------------------------------------------------------------------------+
// | PHP version 4.1 |
// +------------------------------------------------------------------------------------------------------+
// | Copyright (C) 2003 Tela Botanica (accueil@tela-botanica.org) |
// +------------------------------------------------------------------------------------------------------+
// | |
// | This library is free software; you can redistribute it and/or |
// | modify it under the terms of the GNU Lesser General Public |
// | License as published by the Free Software Foundation; either |
// | version 2.1 of the License, or (at your option) any later version. |
// | |
// | This library is distributed in the hope that it will be useful, |
// | but WITHOUT ANY WARRANTY; without even the implied warranty of |
// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
// | Lesser General Public License for more details. |
// | |
// | You should have received a copy of the GNU Lesser General Public |
// | License along with this library; if not, write to the Free Software |
// | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
// | |
// +------------------------------------------------------------------------------------------------------+
// CVS : $Id: pap_initialise_info.inc.php,v 1.32 2007-10-23 13:45:33 ddelon Exp $
/**
*Initialisation de Papyrus : vérification et récupération de paramètres généraux.
*
* La page contient le code initialisant l'exécution du rendu d'une page par Papyrus.
* Nous y trouvons la recherche des informations disponibles sur :
* - le site présent sur le serveur demandé,
* - l'identification,
* - la langue,
* - le menu,
* - la page
* - l'application
*
*@package Papyrus
//Auteur original :
*@author Jean-Pascal MILCENT <jpm@tela-botanica.org>
//Autres auteurs :
*@author Alexandre GRANIER <alex@tela-botanica.org>
*@author Laurent COUDOUNEAU <laurent.coudouneau@ema.fr>
*@copyright Tela-Botanica 2000-2004
*@version $Revision: 1.32 $ $Date: 2007-10-23 13:45:33 $
// +------------------------------------------------------------------------------------------------------+
*/
 
// +------------------------------------------------------------------------------------------------------+
// | ENTÊTE du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
/** Inclusion de l'objet PEAR servant à négocier le language avec le navigateur client. */
require_once PAP_CHEMIN_API_PEAR.'HTTP.php';
/** Inclusion de la classe PEAR gérant les URL : Utilisé pour l'url demandée par le client.*/
require_once PAP_CHEMIN_API_PEAR.'Net/URL.php';
/** Inclusion de la bibliothèque de fonctions servant à l'initialisation des variables globales de Papyrus. */
require_once GEN_CHEMIN_BIBLIO.'pap_initialisation.fonct.php';
/** Inclusion de la classe Papyrus gérant les URL : Utilisé pour l'url demandée par le client.*/
require_once GEN_CHEMIN_BIBLIO_CLASSE.'pap_url.class.php';
/** Inclusion de la bibliothèque de fonctions servant au menu pour la réecriture d'url. */
require_once GEN_CHEMIN_BIBLIO.'pap_menu.fonct.php';
 
// +------------------------------------------------------------------------------------------------------+
// | CORPS du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
 
// Recherche de la présence de la valeur d'i18n dans l'url
if ( (isset($_GET[GEN_URL_CLE_I18N])) && (!empty($_GET[GEN_URL_CLE_I18N])) ) {
$_GEN_commun['i18n'] = $_GET[GEN_URL_CLE_I18N];
} else {
$_GEN_commun['i18n'] = GEN_I18N_ID_DEFAUT;
}
 
// +------------------------------------------------------------------------------------------------------+
// Gestion de la réecriture d'url et des url erreur 404
if ((defined('PAP_URL_REECRITURE') AND PAP_URL_REECRITURE == '1' && (! isset($_GET[GEN_URL_CLE_SITE]) || empty($_GET[GEN_URL_CLE_SITE])) && (! isset($_GET[GEN_URL_CLE_MENU]) || empty($_GET[GEN_URL_CLE_MENU]))) ) {
$tab_type_reecriture = array('MENU', 'SITE');
foreach ($tab_type_reecriture as $reecriture) {
if (PAP_URL_REECRITURE_SEP == '/') {
$masque_reecriture = '/^(\/.*?)'.constant('PAP_URL_REECRITURE_'.$reecriture).'\\'.PAP_URL_REECRITURE_SEP.'([^?]+?)(?:\?(.*)|)$/';
} else {
$masque_reecriture = '/^(\/.*?)'.constant('PAP_URL_REECRITURE_'.$reecriture).PAP_URL_REECRITURE_SEP.'([^?]+?)(?:\?(.*)|)$/';
}
if (preg_match($masque_reecriture, rawurldecode($_SERVER['REQUEST_URI']), $tab_raccourci)) {
$chemin_vers_papyrus = $tab_raccourci[1];
$raccourci = $tab_raccourci[2];
$parametres = '';
if (isset($tab_raccourci[3])) {
$parametres = $tab_raccourci[3];
}
if ($reecriture == 'SITE') {
/** Inclusion de la bibliothèque de fonctions servant au site pour la réecriture d'url. */
require_once GEN_CHEMIN_BIBLIO.'pap_site.fonct.php';
}
// Nous cherchons à savoir si le raccourci est entièrement numérique ou pas.
if (preg_match('/^[0-9]+$/', $raccourci)) {
// Nous vérifions si nous utilisons les codes numériques ou alphanumérique dans les url
if (constant('GEN_URL_ID_TYPE_'.$reecriture) != 'int') {
if ($reecriture == 'SITE') {
$_GET[constant('GEN_URL_CLE_'.$reecriture)] = call_user_func('GEN_retourner'.$reecriture.'CodeAlpha', $db, $raccourci, $_GEN_commun['i18n']);
} else {
$_GET[constant('GEN_URL_CLE_'.$reecriture)] = call_user_func('GEN_retourner'.$reecriture.'CodeAlpha', $db, $raccourci);
}
} else {
$_GET[constant('GEN_URL_CLE_'.$reecriture)] = $raccourci;
}
} else {
// Nous vérifions si nous utilisons les codes numériques ou alphanumérique dans les url
if (constant('GEN_URL_ID_TYPE_'.$reecriture) != 'int') {
$_GET[constant('GEN_URL_CLE_'.$reecriture)] = $raccourci;
} else {
if ($reecriture == 'SITE') {
$_GET[constant('GEN_URL_CLE_'.$reecriture)] = call_user_func('GEN_retourner'.$reecriture.'CodeNum', $db, $raccourci, $_GEN_commun['i18n']);
} else {
$_GET[constant('GEN_URL_CLE_'.$reecriture)] = call_user_func('GEN_retourner'.$reecriture.'CodeNum', $db, $raccourci);
}
}
}
}
}
}
 
// +------------------------------------------------------------------------------------------------------+
// Gestion des sites : disponibles sur le serveur courant.
// Liste des catégories de site à prendre en compte :
// Pas de site, ni de menu dans l'URL, recherche du site par défaut
$site_liste_id = '102, 103';// 102 = site "principal" et 103 = site "externe"
if ( (! isset($_GET[GEN_URL_CLE_SITE]) || empty($_GET[GEN_URL_CLE_SITE])) && (! isset($_GET[GEN_URL_CLE_MENU]) || empty($_GET[GEN_URL_CLE_MENU])) ) {
$requete = 'SELECT gen_site.*, GSR02.* '.
'FROM gen_site, gen_site_relation AS GSR01, gen_site_relation AS GSR02 '.
'WHERE GSR01.gsr_id_site_01 = GSR01.gsr_id_site_02 '.
'AND GSR01.gsr_id_valeur = 101 '.// 101 = site défaut
'AND GSR01.gsr_id_site_01 = gs_id_site '.
'AND GSR02.gsr_id_site_01 = GSR02.gsr_id_site_02 '.
'AND GSR02.gsr_id_valeur IN ('.$site_liste_id.') '.
'AND GSR02.gsr_id_site_01 = gs_id_site';
$resultat = $db->query($requete);
if (DB::isError($resultat)) {
die( BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete) );
}
// Aucun site trouvé
if ($resultat->numRows() == 0) {
// Appel à l'application Installateur si nécessaire
/** <br> Inclusion du programme Installateur de Papyrus.
* L'abscence de site oblige à relancer l'installation et le script sql qui régénérera la base de données.*/
include_once GEN_CHEMIN_APPLICATION.'installateur/installateur.php';
$_GEN_commun['sortie'] = afficherContenuCorps();
include_once GEN_CHEMIN_PAP.'pap_envoi.inc.php';
// Fin du programme Papyrus.
exit(0);
}
// Nous avons trouvé un site.
$_GEN_commun['info_site'] = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
$resultat->free();
if (GEN_URL_ID_TYPE_SITE == 'int') {
$_GEN_commun['url_site'] = $_GEN_commun['info_site']->gs_code_num;
} else {
$_GEN_commun['url_site'] = $_GEN_commun['info_site']->gs_code_alpha;
}
// Le code du menu est présent dans l'url mais pas celui du site
} else if ( (! isset($_GET[GEN_URL_CLE_SITE]) || empty($_GET[GEN_URL_CLE_SITE])) && (isset($_GET[GEN_URL_CLE_MENU]) || !empty($_GET[GEN_URL_CLE_MENU])) ) {
// Nous récupérons les infos du menu et du sites dans la variable globale de Papyrus.
$_GEN_commun['url_menu'] = $_GET[GEN_URL_CLE_MENU];
// Récupération des informations sur le menu demandé
$requete = 'SELECT * '.
'FROM gen_menu '.
'WHERE ';
$requete .= (GEN_URL_ID_TYPE_MENU == 'int')
? 'gm_code_num = '.$_GEN_commun['url_menu']
: 'gm_code_alpha = "'.$_GEN_commun['url_menu'].'"';
$resultat = $db->query($requete);
(DB::isError($resultat))
? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete))
: '';
$_GEN_commun['info_menu'] = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
$resultat->free();
if ($_GEN_commun['info_menu']->gm_ce_site != 0) {
// Récupération des infos du site
$requete = 'SELECT * '.
'FROM gen_site, gen_site_relation '.
'WHERE gsr_id_site_01 = gsr_id_site_02 '.
'AND gsr_id_valeur IN ('.$site_liste_id.') '.
'AND gsr_id_site_01 = gs_id_site '.
'AND gs_id_site = '. $_GEN_commun['info_menu']->gm_ce_site;
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
$_GEN_commun['info_site'] = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
$_GEN_commun['url_site'] = (GEN_URL_ID_TYPE_SITE == 'int')
? $_GEN_commun['info_site']->gs_code_num
: $_GEN_commun['info_site']->gs_code_alpha;
$resultat->free();
} else {
// Récupération des infos du site
$requete = 'SELECT * '.
'FROM gen_site, gen_site_relation '.
'WHERE gsr_id_site_01 = gsr_id_site_02 '.
'AND gsr_id_valeur = 101 '.
'AND gsr_id_site_01 = gs_id_site ';
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
$_GEN_commun['info_site'] = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
$_GEN_commun['url_site'] = (GEN_URL_ID_TYPE_SITE == 'int')
? $_GEN_commun['info_site']->gs_code_num
: $_GEN_commun['info_site']->gs_code_alpha;
$resultat->free();
}
} else {
// Récupération de la valeur identifiant le site depuis l'url
$_GEN_commun['url_site'] = $_GET[GEN_URL_CLE_SITE];
// Récupération des informations sur le site
// ATTENTION : pour fonctionner le site par dans la langue par défaut doit avoir une relation : id_site id_site id_valeur=1
$requete = 'SELECT * '.
'FROM gen_site, gen_site_relation '.
'WHERE gsr_id_site_01 = gsr_id_site_02 '.
'AND gsr_id_valeur IN ('.$site_liste_id.') '.
'AND gsr_id_site_01 = gs_id_site '.
'AND gs_ce_i18n = "'.GEN_I18N_ID_DEFAUT.'" '.
'AND ';
$requete .= (GEN_URL_ID_TYPE_SITE == 'int')
? 'gs_code_num = "'.$_GEN_commun['url_site'].'" '
: 'gs_code_alpha = "'.$_GEN_commun['url_site'].'" ';
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
$_GEN_commun['info_site'] = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
$resultat->free();
}
 
//Gestion de l'erreur aucun site trouvable.
if (! isset($_GEN_commun['info_site'])) {
// Appel à l'application Installateur si nécessaire
/** <br> Inclusion du programme Installateur de Papyrus.
* L'abscence de site oblige à relancer l'installation et le script sql qui régénérera la base de données.*/
include_once GEN_CHEMIN_APPLICATION.'installateur/installateur.php';
$_GEN_commun['sortie'] .= afficherContenuCorps();
include_once GEN_CHEMIN_PAP.'pap_envoi.inc.php';
// Fin du programme Papyrus.
exit(0);
} else if ($_GEN_commun['info_site']->gsr_id_valeur == 103) {
// Gestion de la redirection pour les sites "externes"
header('Location:'.$_GEN_commun['info_site']->gs_url);
exit(0);
}
 
// Nous récupérons des informations sur l'internationalisation
$requete = 'SELECT * '.
'FROM gen_i18n '.
'WHERE gi_id_i18n = "'.$_GEN_commun['i18n'].'"';
 
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
 
$_GEN_commun['info_i18n'] = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
$resultat->free();
 
 
// Récupération des informations sur la langue
$requete = 'SELECT * '.
'FROM gen_i18n_langue '.
'WHERE gil_id_langue = "'.$_GEN_commun['info_i18n']->gi_ce_langue.'"';
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
 
$_GEN_commun['info_i18n_langue'] = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
$resultat->free();
 
// Récupération des informations sur le pays
$requete = 'SELECT * '.
'FROM gen_i18n_pays '.
'WHERE gip_id_pays = "'.$_GEN_commun['info_i18n']->gi_ce_pays.'"';
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
 
$_GEN_commun['info_i18n_pays'] = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
$resultat->free();
 
// +------------------------------------------------------------------------------------------------------+
// Gestion des menus
//
// Nous vérifions le cas où le code du menu est introuvable dans l'url.
if ( (! isset($_GET[GEN_URL_CLE_MENU])) || (empty($_GET[GEN_URL_CLE_MENU])) ) {
// Recherche du premier menu du site courant:
$requete = 'SELECT gen_menu.* '.
'FROM gen_menu, gen_menu_relation '.
'WHERE gm_ce_site = '.$_GEN_commun['info_site']->gs_id_site.' '.
'AND gmr_id_menu_01 = gm_id_menu '.
'AND gmr_id_menu_01 = gmr_id_menu_02 '.
'AND gmr_id_valeur = 101 ';// 101 = menu par "defaut"
$resultat = $db->query($requete);
(DB::isError($resultat))
? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete))
: '';
// Nous avons trouvé un menu "défaut" pour le site courant.
$_GEN_commun['info_menu'] = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
$resultat->free();
 
if (isset($_GEN_commun['url_menu'])) {
// Stockage du code du menu demandée dans la variable globale de Papyrus.
if (GEN_URL_ID_TYPE_MENU == 'int') {
$_GEN_commun['url_menu'] = $_GEN_commun['info_menu']->gm_code_num;
} else {
$_GEN_commun['url_menu'] = $_GEN_commun['info_menu']->gm_code_alpha;
}
}
} else if (! isset($_GET['url_menu']) && empty($_GEN_commun['url_menu'])) {
// Le code du menu est présent dans l'url et il n'a pas encore été récupéré
// Nous le récupérons dans la variable globale de Papyrus.
$_GEN_commun['url_menu'] = $_GET[GEN_URL_CLE_MENU];
 
// Récupération des informations sur le menu demandé
$requete = 'SELECT * '.
'FROM gen_menu '.
'WHERE ';
$requete .= (GEN_URL_ID_TYPE_MENU == 'int')
? 'gm_code_num = '.$_GEN_commun['url_menu']
: 'gm_code_alpha = "'.$_GEN_commun['url_menu'].'"';
 
$resultat = $db->query($requete);
(DB::isError($resultat))
? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete))
: '';
 
$_GEN_commun['info_menu'] = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
$resultat->free();
}
 
// +------------------------------------------------------------------------------------------------------+
// Gestion des traductions
 
// Si le résultat de la négociation de l'internationalisation donne une langue différente
// de celle du site principal, nous récupérons les éventuelles valeurs traduite pour le site.
 
$id_langue = $GLOBALS['_GEN_commun']['i18n'];
 
if (isset($id_langue) && ($id_langue!='')) {
$langue_test=$id_langue;
} else {
$langue_test=GEN_I18N_ID_DEFAUT;
}
 
if ($langue_test!=GEN_I18N_ID_DEFAUT) {
// Récupération des informations sur la traduction du site
$requete = 'SELECT * '.
'FROM gen_site '.
'WHERE gs_ce_i18n = "'.$langue_test.'" '.
'AND gs_code_num = "'.$_GEN_commun['info_site']->gs_code_num.'"';
// 'WHERE gs_ce_i18n = "'.$_GEN_commun['i18n'].'" '.
// 'AND gs_code_alpha = "'.$_GEN_commun['info_site']->gs_code_alpha.'"';
 
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
 
// Nous créons l'entrée 'traduction_info_site' dans _GEN_commun que si nous avons bien trouvé une
// traduction pour le site. Il faut donc tester l'existence de cette entrée avant de l'utiliser.
if ($resultat->numRows() > 0) {
$_GEN_commun['traduction_info_site'] = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
}
$resultat->free();
}
 
// Si le résultat de la négociation de l'internationalisation donne une langue différente
// de celle du menu, nous récupérons les éventuelles valeurs traduite pour le menu.
 
//print_r($_GEN_commun);
 
if (isset($_GEN_commun['info_menu'])) { // Evite les warning si pas encore de menu cree pour ce site
 
if ($langue_test!=GEN_I18N_ID_DEFAUT) {
// Récupération des informations sur la traduction du menu
$requete = 'SELECT * '.
'FROM gen_menu '.
'WHERE gm_ce_i18n = "'.$langue_test.'" '.
'AND gm_code_num = "'.$_GEN_commun['info_menu']->gm_code_num.'"';
// 'WHERE gm_ce_i18n = "'.$_GEN_commun['i18n'].'" '.
// 'AND gm_code_alpha = "'.$_GEN_commun['info_menu']->gm_code_alpha.'"';
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
// Nous créons l'entrée 'traduction_info_menu' dans _GEN_commun que si nous avons bien trouvé une
// traduction pour le menu. Il faut donc tester l'existence de cette entrée avant de l'utiliser.
if ($resultat->numRows() > 0) {
$_GEN_commun['traduction_info_menu'] = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
}
$resultat->free();
}
}
// +------------------------------------------------------------------------------------------------------+
// Gestion de l'application du menu demandé.
 
// Recherche de la première application liée
if (isset($_GEN_commun['info_menu']->gm_id_menu)) {
 
$info_appli_menu = GEN_donnerIdPremiereApplicationLiee($_GEN_commun['info_menu']->gm_id_menu);
if (is_array($info_appli_menu)) {
$id_application = $info_appli_menu['gm_ce_application'];
$id_menu_actif = $info_appli_menu['gm_id_menu'];
 
// Si le menu n'a pas d'application lié, on recalcule l'objet $_GEN_commun['info_menu']
if ($id_menu_actif != $_GEN_commun['info_menu']->gm_id_menu) {
$requete = 'SELECT gen_menu.* '.
'FROM gen_menu '.
'WHERE gm_id_menu = '.$id_menu_actif;
 
$resultat = $db->query($requete);
(DB::isError($resultat))
? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete))
: '';
// Nous avons trouvé un menu "défaut" pour le site courant.
$_GEN_commun['info_menu'] = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
$resultat->free();
}
 
 
// Recherche des informations sur l'application liée
$requete_applicaton = 'SELECT * '.
'FROM gen_application '.
'WHERE gap_id_application = '.$id_application;
 
$resultat_applicaton = $db->query($requete_applicaton);
(DB::isError($resultat_applicaton))
? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_applicaton->getMessage(), $requete_applicaton))
: '';
 
$_GEN_commun['info_application'] = $resultat_applicaton->fetchRow(DB_FETCHMODE_OBJECT) ;
$resultat_applicaton->free();
} else {
// Gestion des erreurs sur la recherche de l'application liée.
// Finalement il a été décidé de ne pas afficher cette information sous la forme d'erreur.
//trigger_error('application du menu demandée introuvable', E_USER_NOTICE);
}
 
}
 
// +------------------------------------------------------------------------------------------------------+
// Gestion des arguments de l'application
 
if (isset($_GEN_commun['info_menu']->gm_application_arguments)) {
$arguments = explode(' ', $_GEN_commun['info_menu']->gm_application_arguments);
 
// Initialisaton de la variable globale $GS_ARGUMENTS
$_GEN_commun['info_application']->cache = false;
$_GEN_commun['info_application']->cache_duree = 0;
 
for ($i = 0; $i < count($arguments); $i++) {
$attr = explode('=', $arguments[$i]);
 
if ($attr[0] == 'cache_duree') {
$_GEN_commun['info_application']->cache_duree = $attr[1];
if ($_GEN_commun['info_application']->cache_duree > 0) {
$_GEN_commun['info_application']->cache = true;
}
} else if ($attr[0] != '') {
$_GEN_commun['info_application']->$attr[0] = (isset($attr[1]) ? $attr[1] : '');
}
}
}
 
// +------------------------------------------------------------------------------------------------------+
// Gestion des applettes
 
$requete = 'SELECT * '.
'FROM gen_application '.
'WHERE gap_bool_applette = 1 ';
$resultat = $_GEN_commun['pear_db']->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
 
$_GEN_commun['info_applette'] = array();
$i = 0;
while ($ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT)) {
$_GEN_commun['info_applette'][$i] = $ligne;
$i++;
}
$resultat->free();
 
// +------------------------------------------------------------------------------------------------------+
// Gestion de l'objet URL
 
$_GEN_commun['url'] = & new Pap_URL(PAP_URL);
if (isset($_GEN_commun['info_menu'])) {
$_GEN_commun['url']->setId($_GEN_commun['info_menu']->gm_id_menu);
}
 
if ( (isset($_GEN_commun['url_site'])) && (!empty($_GEN_commun['url_site'])) ) {
$_GEN_commun['url']->addQueryString(GEN_URL_CLE_SITE, $_GEN_commun['url_site']);
}
 
if ( (isset($_GEN_commun['url_menu'])) && (!empty($_GEN_commun['url_menu'])) ) {
$_GEN_commun['url']->addQueryString(GEN_URL_CLE_MENU, $_GEN_commun['url_menu']);
}
 
if ( (isset($_GET[GEN_URL_CLE_DATE])) && (!empty($_GET[GEN_URL_CLE_DATE])) ) {
$_GEN_commun['url_date'] = $_GET[GEN_URL_CLE_DATE];
$_GEN_commun['url']->addQueryString(GEN_URL_CLE_DATE, $_GEN_commun['url_date']);
}
 
if ( (isset($_GET[GEN_URL_CLE_FORMAT])) && (!empty($_GET[GEN_URL_CLE_FORMAT])) ) {
$_GEN_commun['url_format'] = $_GET[GEN_URL_CLE_FORMAT];
$_GEN_commun['url']->addQueryString(GEN_URL_CLE_FORMAT, $_GEN_commun['url_format']);
}
 
/* +--Fin du code ---------------------------------------------------------------------------------------+
* $Log: not supported by cvs2svn $
* Revision 1.31 2007-04-19 16:54:52 ddelon
* backport mulitlinguisme
*
* Revision 1.30 2007/04/19 15:34:35 neiluj
* préparration release (livraison) "Narmer" - v0.25
*
* Revision 1.29 2007/04/13 09:41:09 neiluj
* réparration cvs
*
* Revision 1.28 2006/12/01 15:41:21 ddelon
* erreur affichage
*
* Revision 1.27 2006/11/07 18:43:54 jp_milcent
* Modification des expressions régulières des permaliens.
*
* Revision 1.26 2006/10/18 10:18:05 jp_milcent
* Gestion des erreurs HTTP par Papyrus.
*
* Revision 1.25 2006/10/11 18:04:11 jp_milcent
* Gestion avancée de la réecriture d'URL.
*
* Revision 1.24 2006/03/02 10:49:49 ddelon
* Fusion branche multilinguisme dans branche principale
*
* Revision 1.23.2.2 2005/12/20 14:40:24 ddelon
* Fusion Head vers Livraison
*
* Revision 1.23.2.1 2005/12/01 23:31:57 ddelon
* Merge Head vers multilinguisme
*
* Revision 1.23 2005/09/22 14:02:49 ddelon
* nettoyage annuaire et php5
*
* Revision 1.22 2005/09/20 17:01:22 ddelon
* php5 et bugs divers
*
* Revision 1.21 2005/08/31 17:34:52 ddelon
* Integrateur Wikini et administration des Wikini
*
* Revision 1.20 2005/06/24 10:48:35 jpm
* Modification des chemins des fichiers pour fonctionnement avec API Pear locale.
*
* Revision 1.19 2005/04/14 13:52:37 jpm
* Utilisation de la classe Pap_URL.
*
* Revision 1.18 2005/02/28 11:20:42 jpm
* Modification des auteurs.
*
* Revision 1.17 2005/02/23 15:35:04 jpm
* L'erreur "pas d'application" a été supprimé une message dans le corps du texte fourni déjà cette information.
*
* Revision 1.16 2005/02/17 17:51:40 florian
* Correction bug monde sans menu ni appli
*
* Revision 1.15 2004/12/06 12:12:28 jpm
* Début de gestion des auth multiples.
*
* Revision 1.14 2004/11/15 17:14:09 jpm
* Gestion des url avec seulement le code d'un menu.
*
* Revision 1.13 2004/11/03 17:14:38 jpm
* Gestion des sites externes.
*
* Revision 1.12 2004/10/26 18:42:21 jpm
* Gestion des sites externes.
*
* Revision 1.11 2004/10/25 16:28:47 jpm
* Ajout de nouvelles balises Papyrus, ajout vérification mise à jour de Papyrus, meilleure gestion des sessions...
*
* Revision 1.10 2004/10/22 17:23:59 jpm
* Début amélioration de la gestion des erreurs et de l'installation.
*
* Revision 1.9 2004/10/15 18:29:19 jpm
* Modif pour gérer l'appli installateur de Papyrus.
*
* Revision 1.8 2004/09/23 14:30:53 jpm
* Correction bogue sur les menus.
*
* Revision 1.7 2004/09/23 10:46:46 jpm
* Amélioration de la gestion du menu actif quand un menu n'a pas d'application liée.
*
* Revision 1.6 2004/09/10 16:38:34 jpm
* Ajout de l'initialisation d'une variable stockant les infos de débogage.
*
* Revision 1.5 2004/06/30 07:35:16 jpm
* Correction d'un bogue du à une mauvaise gestion de la résolution des conflits entre fichier CVS.
*
* Revision 1.4 2004/06/30 07:25:37 jpm
* Ajout d'un commentaire.
*
* Revision 1.3 2004/06/18 15:52:45 alex
* Actualisation de la variable $_GEN_commun['info_menu'] lorsque un menu n'a pas d'application lié
*
* Revision 1.2 2004/06/17 07:03:01 jpm
* Correction d'un bogue concernant l'internationalisation par défaut quand la langue du navigateur ne correspond pas à celle du site.
*
* Revision 1.1 2004/06/16 08:13:20 jpm
* Changement de nom de Papyrus en Papyrus.
* Changement de l'arborescence.
*
* Revision 1.24 2004/05/05 14:33:37 jpm
* Gestion de l'indication de langue dans l'url.
* Utile que si on veut forcer la langue.
*
* Revision 1.23 2004/05/05 10:42:35 jpm
* Amélioration de la gestion de l'internationalisation.
*
* Revision 1.22 2004/05/04 16:17:05 jpm
* Légère amélioration du code (libération
 
de ressource).
*
* Revision 1.21 2004/05/03 11:21:58 jpm
* Fin de la gestion des applettes et suppression de l'info_menu_hierarchie de _GEN_commun.
*
* Revision 1.20 2004/04/30 16:17:27 jpm
* Ajout de la récupération d'une info sur la hiérarchie.
* Surement à supprimer car inutile.
*
* Revision 1.19 2004/04/28 12:04:31 jpm
* Changement du modèle de la base de données.
*
* Revision 1.18 2004/04/22 08:28:12 jpm
* Transformation de $GS_GLOBAL en $_GEN_commun.
*
* Revision 1.17 2004/04/09 16:43:32 jpm
* Suppression d'un blanc.
*
* Revision 1.16 2004/04/09 16:20:11 jpm
* Récupération de la création de l'objet URL.
* Gestion des tables i18n.
*
* Revision 1.15 2004/04/05 16:37:43 jpm
* Utilisation de la classe Pear HTTP pour la négociation du langage à utiliser pour le site.
*
* Revision 1.14 2004/04/02 16:29:30 jpm
* Déplacement dans le fichier gen_initialisation_pear.inc.php de la création des objets Pear Net_URL et Auth.
*
* Revision 1.13 2004/04/01 11:27:13 jpm
* Ajout et modification de commentaires pour PhpDocumentor.
*
* Revision 1.12 2004/03/31 16:50:04 jpm
* Prise en compte du nouveau modèle de Papyrus révision 1.9.
*
* Revision 1.11 2004/03/27 11:04:14 jpm
* Déplacement des fonctions de gestion d'erreur dans la bibliotheque de l'application Installateur.
* Modification des commentaires vis à vis du nouveau modèle.
* Changement et simplification des noms des variables globales.
* Suppression de l'attribution d'une configuration par défaut.
* Remplacement de variable par des constante provenant du fichier de configuration.
* Traduction en français de certaines variables et partie de code.
*
* Revision 1.10 2004/03/24 07:20:03 jpm
* Mise en forme requête sql.
*
* Revision 1.9 2004/03/23 17:06:56 jpm
* Ajout de commentaire dans l'entête.
* Mise en conformité avec la convention de codage.
*
* Revision 1.8 2004/03/23 16:31:54 jpm
* Ajout du code provenant de gen_noyau.inc.php.
* Ajout, formatage et traduction des commentaires.
*
* Revision 1.7 2004/03/22 18:35:32 jpm
* Traduction et ajout de commentaires.
* Amélioration de la conformité avec la convention de codage.
* Changement requête sql pour le nouveau modèle de Papyrus.
*
* Revision 1.6 2004/03/22 11:14:30 jpm
* Ajout de commentaires et mise en forme.
* Correction des requêtes sql pour mise en conformité avec le nouveau modèle de Papyrus et la convention de codage.
*
* Revision 1.5 2003/12/16 16:57:59 alex
* mise à jour pour compatibilité avec genesia
*
* Revision 1.4 2003/11/24 16:05:02 jpm
* Ajout de commentaires et début de mise en conformité
* avec la convention de codage.
*
*
* +--Fin du code ----------------------------------------------------------------------------------------+
*/
?>
/trunk/papyrus/pap_connecte_bdd.inc.php
60,7 → 60,10
 
/* +--Fin du code ----------------------------------------------------------------------------------------+
*
* $Log: not supported by cvs2svn $
* $Log: pap_connecte_bdd.inc.php,v $
* Revision 1.4 2007-04-13 09:41:09 neiluj
* réparration cvs
*
* Revision 1.3 2006/04/28 12:41:49 florian
* corrections erreurs chemin
*
/trunk/papyrus/applications/installateur/bibliotheque/instal_installation.fonct.php
331,7 → 331,10
}
/* +--Fin du code ---------------------------------------------------------------------------------------+
*
* $Log: not supported by cvs2svn $
* $Log: instal_installation.fonct.php,v $
* Revision 1.7 2007-01-04 17:06:03 alexandre_tb
* modif mineure
*
* Revision 1.6 2006/04/28 12:41:49 florian
* corrections erreurs chemin
*
/trunk/papyrus/applications/installateur/installateur.php
1,5 → 1,5
<?php
/*vim: set expandtab tabstop=4 shiftwidth=4: */
/*vim: set expandtab tabstop=4 shiftwidth=4: */
// +------------------------------------------------------------------------------------------------------+
// | PHP version 4.1 |
// +------------------------------------------------------------------------------------------------------+
19,48 → 19,59
// | License along with this library; if not, write to the Free Software |
// | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
// +------------------------------------------------------------------------------------------------------+
// CVS : $Id: installateur.php,v 1.17 2008-11-19 09:25:36 aperonnet Exp $
// CVS : $Id: installateur.php,v 1.16 2007-04-20 13:31:42 florian Exp $
/**
* Application Installateur de Papyrus.
*
* Application permettant de gérer l'installation et les erreurs liés à l'abscence de base de données,
* Application permettant de g�rer l'installation et les erreurs li�s � l'abscence de base de donn�es,
* d'extenssin PHP...
*
*@package Installateur
//Auteur original :
*@author Jean-Pascal MILCENT <jpm@tela-botanica.org>
*@author
'AND gm_ce_i18n = "'.GEN_I18N_ID_DEFAUT.'" ';
$resultat = $db->query($requete);
 
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
$ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
if ($langue_test!=GEN_I18N_ID_DEFAUT) {
return GEN_rechercheMenuIdentifiantVersionParDefaut($db,$ligne->gm_id_menu);
}
} Jean-Pascal MILCENT <jpm@tela-botanica.org>
//Autres auteurs :
*@author Aucun
*@copyright Tela-Botanica 2000-2004
*@version $Revision: 1.17 $ $Date: 2008-11-19 09:25:36 $
*@version $Revision: 1.16 $ $Date: 2007-04-20 13:31:42 $
// +------------------------------------------------------------------------------------------------------+
**/
 
// protection contre un accès direct ou à travers un site qui n'existe pas
if(GEN_VERSION == PAP_VERSION) {
header('location:papyrus.php');
exit;
}
 
 
// +------------------------------------------------------------------------------------------------------+
// | ENTÊTE du PROGRAMME |
// | ENT�TE du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
// Constante de l'application Installateur. On devrait créer un fichier de config et un de langue pour rendre l'appli portable...
// Constante de l'application Installateur. On devrait cr�er un fichier de config et un de langue pour rendre l'appli portable...
preg_match('/^(.*)papyrus.php/', $_SERVER['SCRIPT_FILENAME'], $instal_tab_txt);
define('INSTAL_CHEMIN_ABSOLU', $instal_tab_txt[1]);
/** Nom du dossier contenant l'application Installateur.*/
define('INSTAL_DOSSIER_APPLI', INSTAL_CHEMIN_ABSOLU.GEN_CHEMIN_APPLICATION.'installateur'.GEN_SEP);
/** Nom du dossier contenant la bibliothèque de code de l'application Installateur.*/
/** Nom du dossier contenant la biblioth�que de code de l'application Installateur.*/
define('INSTAL_DOSSIER_BIBLIO', INSTAL_DOSSIER_APPLI.'bibliotheque'.GEN_SEP);
/** Chemin vers le fichier de configuration de base de l'application Papyrus.*/
define('INSTAL_CHEMIN_CONFIG', GEN_CHEMIN_CONFIG.GEN_FICHIER_CONFIG);
/** Nom du fichier de configuration de Papyrus à créer.*/
/** Nom du fichier de configuration de Papyrus � cr�er.*/
define('INSTAL_FICHIER_CONFIG', GEN_FICHIER_CONFIG);
/** Chemin vers le fichier de configuration de base de l'application Papyrus.*/
define('INSTAL_CHEMIN_SQL', INSTAL_CHEMIN_ABSOLU.GEN_CHEMIN_INSTAL);
/** Nom de la constante stockant le numéro de la nouvelle version de l'application Papyrus.*/
/** Nom de la constante stockant le num�ro de la nouvelle version de l'application Papyrus.*/
define('INSTAL_VERSION_NOUVELLE_NOM', 'PAP_VERSION');
/** Numéro de la nouvelle version de l'application Papyrus.*/
/** Num�ro de la nouvelle version de l'application Papyrus.*/
define('INSTAL_VERSION_NOUVELLE', GEN_VERSION);
if (defined('PAP_VERSION')) {
define('INSTAL_VERSION_ANCIENNE', PAP_VERSION);
67,18 → 78,18
} else {
define('INSTAL_VERSION_ANCIENNE', '');
}
/** Nombre d'étapes totale de l'installation.*/
/** Nombre d'�tapes totale de l'installation.*/
define('INSTAL_NBRE_ETAPE', 3);
 
// Fichiers à inclure
// Fichiers � inclure
require_once INSTAL_DOSSIER_BIBLIO.'instal_installation.fonct.php';
 
// +------------------------------------------------------------------------------------------------------+
// | CORPS du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
function afficherContenuCorps()
function afficherContenuCorps()
{
// Entête XHTML des pages de l'installation de Papyrus
// Ent�tre XHTML des pages de l'installation de Papyrus
$sortie = '';
$sortie .= '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"'."\n";
$sortie .= '"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">'."\n";
89,8 → 100,8
$sortie .= ' </head>'."\n";
$sortie .= ' <body xml:lang="fr" lang="fr" >'."\n";
$sortie .= ' <div id="page">'."\n";
$sortie .= ' <div id="zone_bandeau">'."\n";
$sortie .= ' <div id="logo">'."\n";
$sortie .= ' <div id="zone_bandeau">'."\n";
$sortie .= ' <div id="logo">'."\n";
$sortie .= ' <img src="papyrus/applications/installateur/presentations/images/Logo_papyrus.jpg" alt="Logo Papyrus" />'."\n";
$sortie .= ' </div>'."\n";
$sortie .= ' <div id="site_nom">'."\n";
109,7 → 120,7
$sortie .= '<p class="zone_info">Vous &ecirc;tes sur le point d\'installer Papyrus '.INSTAL_VERSION_NOUVELLE.'.<br />'.
'Veuillez configurer votre Papyrus en remplissant les formulaires &eacute;tape par &eacute;tape.</p><br style="clear:both;">'."\n";
}
 
if(!isset($_GET['installation']) || ($_GET['installation'] == 'form_pref' || $_GET['installation'] == 'verif_pref')) {
include_once GEN_CHEMIN_APPLICATION.'installateur/instal_preference.inc.php';
} else if($_GET['installation'] == 'form_bdd' || $_GET['installation'] == 'verif_bdd') {
117,7 → 128,7
} else if($_GET['installation'] == 'form_fichier' || $_GET['installation'] == 'verif_fichier') {
include_once GEN_CHEMIN_APPLICATION.'installateur/instal_fichier.inc.php';
}
 
// Pied XHTML des pages de l'installation de Papyrus
$sortie .= ' </div>'."\n";
$sortie .= ' <div id="zone_pied">'."\n";
132,7 → 143,7
$sortie .= ' </div>'."\n";
$sortie .= ' </body>'."\n";
$sortie .= '</html>';
 
return $sortie;
}
 
143,30 → 154,30
 
/* +--Fin du code ----------------------------------------------------------------------------------------+
*
* $Log: not supported by cvs2svn $
* Revision 1.16 2007-04-20 13:31:42 florian
* remplacement des caracteres speciaux par des entite html
*
* Revision 1.15 2006/10/16 15:49:07 ddelon
* Refactorisation code mulitlinguisme et gestion menu invisibles
*
* Revision 1.14 2006/10/09 14:35:50 ddelon
* bug caractere invalide trainant dans fichier
*
* Revision 1.13 2006/10/05 15:17:29 florian
* changement presentation
*
* Revision 1.12 2006/10/05 15:11:17 florian
* changement presentation
*
* Revision 1.11 2006/10/05 14:41:53 florian
* changement presentation
*
* Revision 1.10 2005/09/23 14:20:23 florian
* nouvel habillage installateur, plus correction de quelques bugs
* $Log: installateur.php,v $
* Revision 1.16 2007-04-20 13:31:42 florian
* remplacement des caracteres speciaux par des entite html
*
* Revision 1.15 2006/10/16 15:49:07 ddelon
* Refactorisation code mulitlinguisme et gestion menu invisibles
*
* Revision 1.14 2006/10/09 14:35:50 ddelon
* bug caractere invalide trainant dans fichier
*
* Revision 1.13 2006/10/05 15:17:29 florian
* changement presentation
*
* Revision 1.12 2006/10/05 15:11:17 florian
* changement presentation
*
* Revision 1.11 2006/10/05 14:41:53 florian
* changement presentation
*
* Revision 1.10 2005/09/23 14:20:23 florian
* nouvel habillage installateur, plus correction de quelques bugs
*
* Revision 1.9 2004/10/27 11:43:32 jpm
* Correction bogues diff mise à jour / installation.
* Correction bogues diff mise � jour / installation.
*
* Revision 1.8 2004/10/25 10:22:48 jpm
* Correction de quelques bogues, ajouts d'explications pour l'utilisateur et modification des styles CSS.
181,7 → 192,7
* Transformation en fonction de l'appel de l'application.
*
* Revision 1.4 2004/10/19 15:59:18 jpm
* Ajout de la gestion des valeurs propre à Papyrus à insérer dans la base de données.
* Ajout de la gestion des valeurs propre � Papyrus � ins�rer dans la base de donn�es.
* Ajout des constantes FTP.
*
* Revision 1.3 2004/10/18 09:12:09 jpm
188,10 → 199,10
* Changement de nom d'un fichier.
*
* Revision 1.2 2004/10/15 18:28:59 jpm
* Début appli installateur de Papyrus.
* D�but appli installateur de Papyrus.
*
* Revision 1.1 2004/06/16 14:33:13 jpm
* Changement de nom de Papyrus en Papyrus.
* Changement de nom de G�n�sia en Papyrus.
* Changement de l'arborescence.
*
* Revision 1.6 2004/04/22 08:25:48 jpm
201,16 → 212,16
* Le code pour l'installation uniquement.
*
* Revision 1.4 2004/04/08 12:25:16 jpm
* Suppression de tous le code réalisant les vérifications. L'application Installateur ne fera qu'installer Papyrus et non vérifier son bon fonctionnement.
* Suppression de tous le code r�alisant les v�rifications. L'application Installateur ne fera qu'installer G�n�sia et non v�rifier son bon fonctionnement.
*
* Revision 1.3 2004/04/02 16:37:51 jpm
* Modification des commentaires.
*
* Revision 1.2 2004/03/31 16:57:16 jpm
* Ajout de la gestion des erreur de base de données, de la connexion à celle-ci et des extenssions php disponibles.
* Ajout de la gestion des erreur de base de donn�es, de la connexion � celle-ci et des extenssions php disponibles.
*
* Revision 1.1 2004/03/29 11:00:12 jpm
* Transfert d'un morceau de code gérant les erreurs et l'installation mais qui a actuellement aucun effet sur Papyrus.
* Transfert d'un morceau de code g�rant les erreurs et l'installation mais qui a actuellement aucun effet sur G�n�sia.
*
*
* +-- Fin du code ----------------------------------------------------------------------------------------+
/trunk/papyrus/applications/installateur/presentations/styles/installateur.css
32,7 → 32,7
form li {list-style-type:none;color:#000;}
form table, form td, form th {border:0}
form td:hover {background: transparent;}
label { display:block; font-weight:bold; margin-top:10px; padding-left:3px}
label {padding-right:10px;}
input {margin:2px;background:#EEEEE9;}
/*****************Listes********************************************************/
ul {padding:0;margin: 0 0 0 10px;}
/trunk/papyrus/applications/installateur/presentations/images/logo-xhtml11.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/papyrus/applications/installateur/presentations/images/picto.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/papyrus/applications/installateur/presentations/images/Bandeau_haut.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/papyrus/applications/installateur/presentations/images/logo-firefox.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/papyrus/applications/installateur/presentations/images/logo-css.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/papyrus/applications/installateur/presentations/images/Main_Erreur.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/papyrus/applications/installateur/instal_fichier.inc.php
51,7 → 51,7
**/
 
// +------------------------------------------------------------------------------------------------------+
// | ENTÊTE du PROGRAMME |
// | ENT�TE du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
// Numéro de l'étape d'installation :
$num_etape = 3;
358,7 → 358,10
 
/* +--Fin du code ----------------------------------------------------------------------------------------+
*
* $Log: not supported by cvs2svn $
* $Log: instal_fichier.inc.php,v $
* Revision 1.36 2007-08-28 14:37:11 jp_milcent
* Ajout des urls par défaut pour l'inscription et inscription_erreur.
*
* Revision 1.35 2007-06-26 12:08:18 jp_milcent
* Correction de l'encodage et de la création du htaccess.
*
/trunk/papyrus/applications/installateur/instal_base_de_donnees.inc.php
34,9 → 34,9
// +------------------------------------------------------------------------------------------------------+
// CVS : $Id: instal_base_de_donnees.inc.php,v 1.35 2007-08-28 14:37:11 jp_milcent Exp $
/**
* Page de création de la base de données de Papyrus.
* Page de cr�ation de la base de donn�es de Papyrus.
*
* Page permettant de créer la base de données de Papyrus.
* Page permettant de cr�er la base de donn�es de Papyrus.
*
*@package Installateur
//Auteur original :
52,7 → 52,7
**/
 
// +------------------------------------------------------------------------------------------------------+
// | ENTÊTE du PROGRAMME |
// | ENT�TE du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
// Numéro de l'étape d'installation :
$num_etape = 2;
83,11 → 83,11
// Affichage d'informations...
$sortie .= '<br /><h1>Etape n&deg;'.$num_etape.' sur '.INSTAL_NBRE_ETAPE.'.</h1>'."\n";
 
// Nous vérifions si nous sommes en phase de test du formulaire de config de la base de données
// Nous vérifions si nous sommes en phase de test du formulaire de config de la base de donn�es
$erreur = 0;
$sortie_verif = '';
if ($_GET['installation'] == 'verif_bdd') {
// Test de la configuration à la base de données
// Test de la configuration à la base de donn�es
$sortie_test .= ' <br /><h2>Test de la configuration de la base de donn&eacute;es</h2>'."\n";
$dblink = @mysql_connect($bdd['PAP_BDD_SERVEUR'], $bdd['PAP_BDD_UTILISATEUR'], $bdd['PAP_BDD_MOT_DE_PASSE']);
$erreur = testerConfig($sortie_test, 'Test connexion au serveur MySQL, recherche base de donn&eacute;es ...', @mysql_select_db($bdd['PAP_BDD_NOM'], $dblink),
291,7 → 291,10
 
/* +--Fin du code ----------------------------------------------------------------------------------------+
*
* $Log: not supported by cvs2svn $
* $Log: instal_base_de_donnees.inc.php,v $
* Revision 1.35 2007-08-28 14:37:11 jp_milcent
* Ajout des urls par défaut pour l'inscription et inscription_erreur.
*
* Revision 1.34 2007-06-26 12:08:18 jp_milcent
* Correction de l'encodage et de la création du htaccess.
*
368,13 → 371,13
* Corrections bogues erreurs noms de variables.
*
* Revision 1.9 2004/10/27 11:43:32 jpm
* Correction bogues diff mise à jour / installation.
* Correction bogues diff mise � jour / installation.
*
* Revision 1.8 2004/10/26 18:41:12 jpm
* Correction bogue pour la mise à jour.
* Correction bogue pour la mise � jour.
*
* Revision 1.7 2004/10/25 16:26:35 jpm
* Début gestion des mises à jours.
* D�but gestion des mises � jours.
*
* Revision 1.6 2004/10/25 10:22:48 jpm
* Correction de quelques bogues, ajouts d'explications pour l'utilisateur et modification des styles CSS.
389,11 → 392,11
* Transformation en fonction de l'appel de l'application.
*
* Revision 1.2 2004/10/19 15:59:18 jpm
* Ajout de la gestion des valeurs propre à Papyrus à insérer dans la base de données.
* Ajout de la gestion des valeurs propre � Papyrus � ins�rer dans la base de donn�es.
* Ajout des constantes FTP.
*
* Revision 1.1 2004/10/15 18:28:59 jpm
* Début appli installateur de Papyrus.
* D�but appli installateur de Papyrus.
*
*
* +-- Fin du code ----------------------------------------------------------------------------------------+
/trunk/papyrus/applications/installateur/instal_preference.inc.php
232,7 → 232,10
 
/* +--Fin du code ----------------------------------------------------------------------------------------+
*
* $Log: not supported by cvs2svn $
* $Log: instal_preference.inc.php,v $
* Revision 1.12 2006-10-06 15:23:00 florian
* amelioration graphique de l'installateur
*
* Revision 1.11 2006/10/05 15:14:18 alexandre_tb
* Mise en place du chemin par défaut
*
/trunk/papyrus/applications/admin_auth/bibliotheque/adau_auth.fonct.php
88,12 → 88,12
// Requete sur gen_site_auth_bdd
$requete = 'SELECT * FROM gen_site_auth_bdd WHERE gsab_id_auth_bdd = '.$ligne->gsa_ce_auth_bdd;
unset($ligne);
$resultat = $db->query($requete . ' -- ' . __FILE__ . ':' . __LINE__);
$resultat = $db->query($requete);
if (DB::isError($resultat)) {
trigger_error('Échec de la requete : '.$requete.'<br />'.$resultat->getMessage(), E_USER_WARNING);
return ;
}
 
$ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
$tableau_retour['dsn'] = $ligne->gsab_dsn;
$tableau_retour['nom_table'] = $ligne->gsab_nom_table;
117,7 → 117,7
.SQL_obtenirNouveauId($db, 'gen_site_auth', 'gsa_id_auth').', '
.requete_site_auth($valeur)
.', gsa_ce_auth_bdd = '.$id_auth_bdd;
$resultat = $db->query($requete . ' -- ' . __FILE__ . ':' . __LINE__);
$resultat = $db->query($requete);
if (DB::isError($resultat)) {
trigger_error('Échec de la requete : '.$requete.'<br />'.$resultat->getMessage(), E_USER_WARNING);
return ;
194,7 → 194,10
 
/* +--Fin du code ----------------------------------------------------------------------------------------+
*
* $Log: not supported by cvs2svn $
* $Log: adau_auth.fonct.php,v $
* Revision 1.2 2005-04-14 13:54:51 jpm
* Amélioration de l'interface et mise en conformité.
*
* Revision 1.1 2005/03/09 10:49:52 jpm
* Changement d'un nom de fichier.
*
/trunk/papyrus/applications/admin_auth/langues/adau_langue_fr.inc.php
70,7 → 70,10
 
/* +--Fin du code ----------------------------------------------------------------------------------------+
*
* $Log: not supported by cvs2svn $
* $Log: adau_langue_fr.inc.php,v $
* Revision 1.4 2006-10-06 10:40:51 florian
* harmonisation des messages d'erreur de l'authentification
*
* Revision 1.3 2005/04/14 13:54:51 jpm
* Amélioration de l'interface et mise en conformité.
*
/trunk/papyrus/applications/admin_auth/admin_auth.php
99,10 → 99,10
<fieldset>
<legend>Identifiez vous</legend>
<label for="username">Courriel : </label>
<input type="text" id="username" name="username" maxlength="80" tabindex="10" value="courriel" />
<input type="text" id="username" name="username" maxlength="80" tabindex="1" value="courriel" />
<label for="password">Mot de passe : </label>
<input type="password" id="password" name="password" maxlength="80" tabindex="20" value="mot de passe" />
<input type="submit" id="connexion" name="connexion" tabindex="30" value="ok" />
<input type="password" id="password" name="password" maxlength="80" tabindex="2" value="mot de passe" />
<input type="submit" id="connexion" name="connexion" tabindex="3" value="ok" />
</fieldset>
</form>';
return $res ;
147,7 → 147,7
'WHERE gsa_id_auth <> 0 '.
'AND gsa_ce_auth_bdd = gsab_id_auth_bdd';
$resultat = $db->query($requete . ' -- ' . __FILE__ . ':' . __LINE__);
$resultat = $db->query($requete);
if (DB::isError($resultat)) {
trigger_error('Échec de la requete : '.$requete.'<br />'.$resultat->getMessage(), E_USER_WARNING);
return ;
178,7 → 178,10
 
/* +--Fin du code ----------------------------------------------------------------------------------------+
*
* $Log: not supported by cvs2svn $
* $Log: admin_auth.php,v $
* Revision 1.6 2006-10-06 10:40:51 florian
* harmonisation des messages d'erreur de l'authentification
*
* Revision 1.5 2006/09/21 15:22:04 jp_milcent
* Nettoyage dans l'url de la querystring id_auth.
*
/trunk/papyrus/applications/admin_auth/configuration/adau_configuration.inc.php
74,7 → 74,10
 
/* +--Fin du code ----------------------------------------------------------------------------------------+
*
* $Log: not supported by cvs2svn $
* $Log: adau_configuration.inc.php,v $
* Revision 1.1 2004-12-06 11:31:42 alex
* version initiale
*
*
* +-- Fin du code ----------------------------------------------------------------------------------------+
*/
/trunk/papyrus/applications/plan/langues/plan_langue_en.inc.php
46,7 → 46,10
 
/* +--Fin du code ----------------------------------------------------------------------------------------+
*
* $Log: not supported by cvs2svn $
* $Log: plan_langue_en.inc.php,v $
* Revision 1.2 2006-03-02 10:49:49 ddelon
* Fusion branche multilinguisme dans branche principale
*
* Revision 1.1.2.1 2006/02/28 14:02:10 ddelon
* Finition multilinguisme
*
/trunk/papyrus/applications/plan/langues/plan_langue_fr.inc.php
46,7 → 46,10
 
/* +--Fin du code ----------------------------------------------------------------------------------------+
*
* $Log: not supported by cvs2svn $
* $Log: plan_langue_fr.inc.php,v $
* Revision 1.2 2006-03-02 10:49:49 ddelon
* Fusion branche multilinguisme dans branche principale
*
* Revision 1.1.2.1 2006/02/28 14:02:10 ddelon
* Finition multilinguisme
*
/trunk/papyrus/applications/plan/plan.php
166,7 → 166,10
 
/* +--Fin du code ----------------------------------------------------------------------------------------+
*
* $Log: not supported by cvs2svn $
* $Log: plan.php,v $
* Revision 1.7 2006-10-11 18:05:15 jp_milcent
* Ajout d'url sur les titres des sites
*
* Revision 1.6 2006/10/06 10:03:14 florian
* amelioration: affichage du plan des menus d'administration, dans le monde administration
*
/trunk/papyrus/applications/plan/configuration/plan_config.inc.php
60,7 → 60,10
 
/* +--Fin du code ----------------------------------------------------------------------------------------+
*
* $Log: not supported by cvs2svn $
* $Log: plan_config.inc.php,v $
* Revision 1.2 2006-03-02 10:49:49 ddelon
* Fusion branche multilinguisme dans branche principale
*
* Revision 1.1.2.1 2006/02/28 14:02:09 ddelon
* Finition multilinguisme
*
/trunk/papyrus/applications/admin_application/bibliotheque/adap_application.fonct.php
131,7 → 131,10
 
/* +--Fin du code ----------------------------------------------------------------------------------------+
*
* $Log: not supported by cvs2svn $
* $Log: adap_application.fonct.php,v $
* Revision 1.4 2006-12-01 10:39:14 alexandre_tb
* Suppression des références aux applettes
*
* Revision 1.3 2006/09/07 13:28:39 jp_milcent
* Mise en majuscule des termes SQL et trie des application par ordre alphabétique.
*
/trunk/papyrus/applications/admin_application/langues/adap_langue_fr.inc.php
58,7 → 58,10
 
/* +--Fin du code ----------------------------------------------------------------------------------------+
*
* $Log: not supported by cvs2svn $
* $Log: adap_langue_fr.inc.php,v $
* Revision 1.4 2006-12-01 10:39:14 alexandre_tb
* Suppression des références aux applettes
*
* Revision 1.3 2006/10/06 10:40:51 florian
* harmonisation des messages d'erreur de l'authentification
*
/trunk/papyrus/applications/admin_application/admin_application.php
102,10 → 102,10
<fieldset>
<legend>Identifiez vous</legend>
<label for="username">Courriel : </label>
<input type="text" id="username" name="username" maxlength="80" tabindex="10" value="courriel" />
<input type="text" id="username" name="username" maxlength="80" tabindex="1" value="courriel" />
<label for="password">Mot de passe : </label>
<input type="password" id="password" name="password" maxlength="80" tabindex="20" value="mot de passe" />
<input type="submit" id="connexion" name="connexion" tabindex="30" value="ok" />
<input type="password" id="password" name="password" maxlength="80" tabindex="2" value="mot de passe" />
<input type="submit" id="connexion" name="connexion" tabindex="3" value="ok" />
</fieldset>
</form>';
return $res ;
179,7 → 179,10
 
/* +--Fin du code ----------------------------------------------------------------------------------------+
*
* $Log: not supported by cvs2svn $
* $Log: admin_application.php,v $
* Revision 1.9 2007-08-28 14:02:06 jp_milcent
* Correction bogue des liens lors de la redirection.
*
* Revision 1.8 2007-03-20 14:17:36 alexandre_tb
* remplacement des varaibles $GLOBALS par $_REQUEST, pour que l appli fonctionne avec les register_globals à Off
*
/trunk/papyrus/applications/admin_application/configuration/adap_configuration.inc.php
73,7 → 73,10
 
/* +--Fin du code ----------------------------------------------------------------------------------------+
*
* $Log: not supported by cvs2svn $
* $Log: adap_configuration.inc.php,v $
* Revision 1.1 2004-12-13 18:07:33 alex
* version initiale
*
*
* +-- Fin du code ----------------------------------------------------------------------------------------+
*/
/trunk/papyrus/applications/admin_menu/configuration/adme_configuration.inc.php
121,7 → 121,10
 
/* +--Fin du code ----------------------------------------------------------------------------------------+
*
* $Log: not supported by cvs2svn $
* $Log: adme_configuration.inc.php,v $
* Revision 1.6 2006-06-28 12:53:34 ddelon
* Multilinguisme : menu par defaut
*
* Revision 1.5 2005/07/08 21:13:15 ddelon
* Gestion indentation menu
*
/trunk/papyrus/applications/admin_menu/bibliotheque/adme_general.fonct.php
1,398 → 1,419
<?php
/*vim: set expandtab tabstop=4 shiftwidth=4: */
// Copyright (C) 1999-2004 Tela Botanica (accueil@tela-botanica.org)
//
// Ce logiciel est un programme informatique servant à gérer du contenu et des
// applications web.
// Ce logiciel est régi par la licence CeCILL soumise au droit français et
// respectant les principes de diffusion des logiciels libres. Vous pouvez
// utiliser, modifier et/ou redistribuer ce programme sous les conditions
// de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
// sur le site "http://www.cecill.info".
 
// En contrepartie de l'accessibilité au code source et des droits de copie,
// de modification et de redistribution accordés par cette licence, il n'est
// offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
// seule une responsabilité restreinte pèse sur l'auteur du programme, le
// titulaire des droits patrimoniaux et les concédants successifs.
 
// A cet égard l'attention de l'utilisateur est attirée sur les risques
// associés au chargement, à l'utilisation, à la modification et/ou au
// développement et à la reproduction du logiciel par l'utilisateur étant
// donné sa spécificité de logiciel libre, qui peut le rendre complexe à
// manipuler et qui le réserve donc à des développeurs et des professionnels
// avertis possédant des connaissances informatiques approfondies. Les
// utilisateurs sont donc invités à charger et tester l'adéquation du
// logiciel à leurs besoins dans des conditions permettant d'assurer la
// sécurité de leurs systèmes et ou de leurs données et, plus généralement,
// à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
 
// Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
// pris connaissance de la licence CeCILL, et que vous en avez accepté les
// termes.
// ----
// CVS : $Id: adme_general.fonct.php,v 1.20 2007-10-24 14:43:02 ddelon Exp $
/**
* Contient l'affichage par défaut de l'appli quand aucune actin
*
* Ce fichier contient les fonctions d'affichage commune à toute l'application Admin Menu.
* Nous y trouvons, entre autre, la fonction d'affichage par défaut de l'appli.
*
*@package Admin_menu
*@subpackage Fonctions
//Auteur original :
*@author Jean-Pascal MILCENT <jpm@tela-botanica.org>
//Autres auteurs :
*@author Aucun
*@copyright Tela-Botanica 2000-2004
*@version $Revision: 1.20 $ $Date: 2007-10-24 14:43:02 $
// +------------------------------------------------------------------------------------------------------+
*/
 
// +------------------------------------------------------------------------------------------------------+
// | ENTETE du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
 
 
// +------------------------------------------------------------------------------------------------------+
// | LISTE de FONCTIONS |
// +------------------------------------------------------------------------------------------------------+
/** Fonction ADME_afficherFormPrincipal() - Affichage par défaut.
*
* Fournit l'affichage par défaut de l'application Admin Menus.
*
* @param object objet Pear de connection à la base de données.
* @param object objet Pear représentant l'url de base.
* @return string le XHTML par défaut de la page.
*/
function ADME_afficherFormPrincipal($objet_pear_db, $objet_pear_url, $adme_site_id, $adme_menu_id, $adme_action)
{
$db=$objet_pear_db;
$id_langue = $GLOBALS['_GEN_commun']['i18n']; //identifiant de la langue choisie
// Langue en cours : langue choisie ou langue par defaut (principale)
if (isset($id_langue) && ($id_langue!='')) {
$langue_test=$id_langue;
} else {
$langue_test=GEN_I18N_ID_DEFAUT;
}
 
//$langue_test=GEN_I18N_ID_DEFAUT;
//requete pour recuperer l'id du menu par defaut
$requete = 'SELECT gs_id_site '.
'FROM gen_site, gen_site_relation '.
'WHERE gsr_id_site_01 = gsr_id_site_02 '.
'AND gsr_id_site_01 = gs_id_site '.
'AND gsr_id_valeur=101 '.
'AND gs_ce_i18n = "'.$langue_test.'" ';
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '' ;
while ($ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT)) {
$id_site_par_defaut=$ligne->gs_id_site;
}
// Liste des sites principaux :
// Recherche de tous les sites langue en cours
$requete = 'SELECT * '.
'FROM gen_site, gen_site_relation '.
'WHERE gsr_id_site_01 = gsr_id_site_02 '.
'AND gsr_id_site_01 = gs_id_site '.
'AND gsr_id_valeur IN (102, 103) '.
'AND gs_ce_i18n = "'.$langue_test.'" '.
'ORDER BY gsr_ordre';
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '' ;
$liste_site=array();
while ($ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT)) {
if ($langue_test == GEN_I18N_ID_DEFAUT) {
$requete_est_traduction = 'SELECT gsr_id_site_01 '.
'FROM gen_site_relation '.
'WHERE '.$ligne->gs_id_site.' = gsr_id_site_02 ' .
'AND gsr_id_site_01 <> gsr_id_site_02 ' .
'AND gsr_id_valeur = 1 ';// 1 = "avoir traduction"
$resultat_est_traduction = $db->query($requete_est_traduction);
(DB::isError($resultat_est_traduction))
? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_est_traduction->getMessage(), $requete_est_traduction))
: '';
if ( $resultat_est_traduction->numRows() == 0 ) {
$liste_site[]=$ligne;
}
}
else {
$liste_site[]=$ligne;
}
}
$resultat->free();
// Si la langue en cours n'est pas la langue par défaut, recherche des sites ayant comme langue
// la langue par defaut, non traduits dans la langue en cours et n'etant pas des traductions
if ($langue_test != GEN_I18N_ID_DEFAUT) {
 
$requete = 'SELECT * '.
'FROM gen_site, gen_site_relation '.
'WHERE gsr_id_site_01 = gsr_id_site_02 '.
'AND gs_id_site = gsr_id_site_01 '.
'AND gsr_id_valeur IN (102, 103) '.
'AND gs_ce_i18n = "'.GEN_I18N_ID_DEFAUT.'" '.
'ORDER BY gs_code_num ASC';// 102 = site "principal" et 103 = site "externe"
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
// Recherche de tous les sites de la langue principale qui ne sont pas traduits dans la langue en cours
while ($ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT)) {
$requete_est_traduction = 'SELECT gsr_id_site_01 '.
'FROM gen_site_relation '.
'WHERE '.$ligne->gs_id_site.' = gsr_id_site_02 ' .
'AND gsr_id_site_01 <> gsr_id_site_02 ' .
'AND gsr_id_valeur = 1 ';// 1 = "avoir traduction"
$resultat_est_traduction = $db->query($requete_est_traduction);
(DB::isError($resultat_est_traduction))
? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_est_traduction->getMessage(), $requete_est_traduction))
: '';
if ( $resultat_est_traduction->numRows() == 0 ) {
if (isset($id_langue) && ($id_langue!='')) {
$langue_test=$id_langue;
} else {
$langue_test=GEN_I18N_ID_DEFAUT;
}
$requete_traduction = 'SELECT gsr_id_site_01 '.
'FROM gen_site_relation, gen_site '.
'WHERE '.$ligne->gs_id_site.' = gsr_id_site_01 ' .
'AND gsr_id_site_02 = gs_id_site '.
'AND gs_ce_i18n = "'.$langue_test.'" '.
'AND gsr_id_valeur = 1 ';// 1 = "avoir traduction"
$resultat_traduction = $db->query($requete_traduction);
(DB::isError($resultat_traduction))
? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_traduction->getMessage(), $requete_traduction))
: '';
if ( $resultat_traduction->numRows() == 0 ) {
$liste_site []=$ligne;
}
$resultat_traduction->free();
}
$resultat_est_traduction->free();
}
$resultat->free();
}
// Traduction d'un site principal uniquement :
$requete = 'SELECT * '.
'FROM gen_site_relation '.
'WHERE gsr_id_site_02 = '.$adme_site_id.' '.
'AND gsr_id_valeur =1 '; // 1 = "avoir traduction"
$resultat = $db->query($requete);
if (DB::isError($resultat)) {
die( BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete) );
}
if ( $resultat->numRows() == 0 ) {
$adme_site_id =$adme_site_id;
}
else {
$ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
$adme_site_id = $ligne->gsr_id_site_01;
}
$resultat->free();
//---------------------------------------------------------------------------------------------------------------
// Création du formulaire
// Notes : Quickform semble remplacer les & des &amp; à nouveau par des &amp; solution utiliser str_replace()...
$form =& new HTML_QuickForm('adme_form_sites', 'post', str_replace('&amp;', '&', $objet_pear_url->getUrl()));
$tab_index = 1000;
$squelette =& $form->defaultRenderer();
$squelette->setformTemplate("\n".'<form {attributes}>'."\n".'{content}'."\n"."\n".'</form>'."\n");
$squelette->setElementTemplate( '{label}'."\n".'{element}'."\n".
'<!-- BEGIN required --><span class="symbole_obligatoire">*</span><!-- END required -->'."\n".
'<!-- BEGIN error --><span class="erreur">{error}</span><!-- END error -->'."\n");
$partie_site_debut = '<fieldset>'."\n".
'<legend>'.ADME_LG_FORM_SITE_TITRE.'</legend>'."\n";
$form->addElement('html', $partie_site_debut);
$id = 'adme_site_id';
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++, 'onchange' => 'javascript:this.form.submit();');
$label = '<label for="'.$id.'">'.ADME_LG_FORM_SITE_CHOIX.'</label>';
$objet_select = new HTML_QuickForm_select($id, $label, '', $aso_attributs);
$aso_options = array();
//print $adme_site_id;
 
foreach ($liste_site as $ligne ) {
if (!isset($adme_site_id) || $adme_site_id == 0) {
$adme_site_id = $ligne->gs_id_site;
}
// print $ligne->gs_id_site;
if ($ligne->gs_id_site == $adme_site_id) {
$objet_select->addOption(htmlentities($ligne->gs_nom.' ('.$ligne->gs_code_alpha.')'), $ligne->gs_id_site, 'selected="selected"');
// Attribution du nom du site sur lequel on travaille pour le titre
$site_nom = $ligne->gs_nom;
} else {
$objet_select->addOption(htmlentities($ligne->gs_nom.' ('.$ligne->gs_code_alpha.')'), $ligne->gs_id_site);
}
}
$form->addElement($objet_select);
$form->addElement('submit', 'choisir_site', ADME_LG_FORM_SITE_VALIDER);
$partie_site_fin = "\n".'</fieldset>';
$form->addElement('html', $partie_site_fin);
// Instanciation des valeurs par défaut du formulaire
if (isset($id_site_par_defaut)) {
if (!isset($_GET['adme_site_id'])) {
$adme_site_id=$id_site_par_defaut;
} else {
$adme_site_id=$_GET['adme_site_id'];
}
}
$form->setDefaults(array('adme_site_id' => $adme_site_id));
$retour ='';
$retour .= '<h1>'.ADME_LG_MENU_TITRE.$site_nom.'</h1>'."\n";
$retour .= $form->toHTML()."\n";
//---------------------------------------------------------------------------------------------------------------
// Gestion des menus classiques
$retour .= '<p>'."\n";
$objet_pear_url_copie = $objet_pear_url;
$objet_pear_url_copie->addQueryString('adme_action', ADME_LG_ACTION_CLASSIQUE_AJOUTER);
$objet_pear_url_copie->addQueryString('adme_site_id', $adme_site_id);
$objet_pear_url_copie->addQueryString('adme_menu_id', 0);
$url_ajout_menu_classique_n1 = $objet_pear_url_copie->getURL();
//unset($url_ajout_menu_n1);
$retour .= '<a href="'.$url_ajout_menu_classique_n1.'" >'.
ADME_LG_MENU_CLASSIQUE_RACINE.'&nbsp;'.
'<img class="'.ADME_CLASS_IMG_ICONE.'" src="'.ADME_IMAGE_NOUVEAU.'" alt="+" />'.
'</a>'."\n";
$retour .= '</p>'."\n";
$retour .= ADME_afficherListeMenuClassique($objet_pear_db, $objet_pear_url, $adme_site_id, $adme_menu_id, $adme_action, 0);
//---------------------------------------------------------------------------------------------------------------
// Gestion des menus communs
$retour .= '<p>'."\n";
$objet_pear_url_copie = $objet_pear_url;
$objet_pear_url_copie->addQueryString('adme_action', ADME_LG_ACTION_COMMUN_AJOUTER);
$objet_pear_url_copie->addQueryString('adme_site_id', $adme_site_id);
$objet_pear_url_copie->addQueryString('adme_menu_id', 0);
$url_ajout_menu_commun_n1 = $objet_pear_url_copie->getURL();
//unset($url_ajout_menu_n1);
$retour .= '<a href="'.$url_ajout_menu_commun_n1.'">'.
ADME_LG_MENU_COMMUN_RACINE.'&nbsp;'.
'<img class="'.ADME_CLASS_IMG_ICONE.'" src="'.ADME_IMAGE_NOUVEAU.'" alt="+" />'.
'</a>'."\n";
$retour .= '</p>'."\n";
$retour .= ADME_afficherListeMenuCommun($objet_pear_db, $objet_pear_url, $adme_site_id, $adme_menu_id, $adme_action, 0);
return $retour;
}
// +------------------------------------------------------------------------------------------------------+
// | PIED du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
 
 
/* +--Fin du code ----------------------------------------------------------------------------------------+
*
* $Log: not supported by cvs2svn $
* Revision 1.19 2007-04-19 15:34:35 neiluj
* préparration release (livraison) "Narmer" - v0.25
*
* Revision 1.18 2006/10/16 15:49:07 ddelon
* Refactorisation code mulitlinguisme et gestion menu invisibles
*
* Revision 1.17 2006/10/06 13:38:45 florian
* ergonomie amélioree
*
* Revision 1.16 2006/04/28 12:41:49 florian
* corrections erreurs chemin
*
* Revision 1.15 2006/03/24 13:03:24 ddelon
* bug afficheur multilinguisme
*
* Revision 1.14 2006/03/23 20:24:59 ddelon
* *** empty log message ***
*
* Revision 1.13 2006/03/13 21:00:20 ddelon
* Suppression messages d'erreur multilinguisme
*
* Revision 1.12 2006/03/02 10:49:49 ddelon
* Fusion branche multilinguisme dans branche principale
*
* Revision 1.11.2.1 2006/02/28 14:02:11 ddelon
* Finition multilinguisme
*
* Revision 1.11 2005/07/18 16:14:32 ddelon
* css admin + menu communs
*
* Revision 1.10 2005/07/08 21:57:24 ddelon
* Copyright
*
* Revision 1.9 2005/05/12 16:51:37 alex
* Changement de l'odre d'apparition des sites dans l'administration des menus.
*
* Revision 1.8 2005/01/26 16:18:05 jpm
* Correction bogue 221 : mauvais réglage du titre.
*
* Revision 1.7 2004/11/24 11:31:51 jpm
* Ajout d'une contante de langue à la place d'un texte.
*
* Revision 1.6 2004/11/10 17:26:07 jpm
* Fin gestion de la traduction.
*
* Revision 1.5 2004/11/10 11:58:54 jpm
* Mise en place des constantes de traduction de l'appli.
*
* Revision 1.4 2004/11/09 17:48:35 jpm
* Gestion de différentes interfaces d'administration.
*
* Revision 1.3 2004/11/09 12:37:34 jpm
* Fin de gestion des menus et mise en conformité avec la convention de codage.
*
* Revision 1.2 2004/11/08 17:41:07 jpm
* Légères corrections : multisite, corrections SQL.
*
* Revision 1.1 2004/11/04 12:26:42 jpm
* Contient les fonctions d'affichage général de l'appli ADME.
*
*
* +-- Fin du code ----------------------------------------------------------------------------------------+
*/
<?php
/*vim: set expandtab tabstop=4 shiftwidth=4: */
// Copyright (C) 1999-2004 Tela Botanica (accueil@tela-botanica.org)
//
// Ce logiciel est un programme informatique servant à gérer du contenu et des
// applications web.
// Ce logiciel est régi par la licence CeCILL soumise au droit français et
// respectant les principes de diffusion des logiciels libres. Vous pouvez
// utiliser, modifier et/ou redistribuer ce programme sous les conditions
// de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
// sur le site "http://www.cecill.info".
 
// En contrepartie de l'accessibilité au code source et des droits de copie,
// de modification et de redistribution accordés par cette licence, il n'est
// offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
// seule une responsabilité restreinte pèse sur l'auteur du programme, le
// titulaire des droits patrimoniaux et les concédants successifs.
 
// A cet égard l'attention de l'utilisateur est attirée sur les risques
// associés au chargement, à l'utilisation, à la modification et/ou au
// développement et à la reproduction du logiciel par l'utilisateur étant
// donné sa spécificité de logiciel libre, qui peut le rendre complexe à
// manipuler et qui le réserve donc à des développeurs et des professionnels
// avertis possédant des connaissances informatiques approfondies. Les
// utilisateurs sont donc invités à charger et tester l'adéquation du
// logiciel à leurs besoins dans des conditions permettant d'assurer la
// sécurité de leurs systèmes et ou de leurs données et, plus généralement,
// à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
 
// Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
// pris connaissance de la licence CeCILL, et que vous en avez accepté les
// termes.
// ----
// CVS : $Id: adme_general.fonct.php,v 1.20 2007-10-24 14:43:02 ddelon Exp $
/**
* Contient l'affichage par défaut de l'appli quand aucune actin
*
* Ce fichier contient les fonctions d'affichage commune à toute l'application Admin Menu.
* Nous y trouvons, entre autre, la fonction d'affichage par défaut de l'appli.
*
*@package Admin_menu
*@subpackage Fonctions
//Auteur original :
*@author Jean-Pascal MILCENT <jpm@tela-botanica.org>
//Autres auteurs :
*@author Aucun
*@copyright Tela-Botanica 2000-2004
*@version $Revision: 1.20 $ $Date: 2007-10-24 14:43:02 $
// +------------------------------------------------------------------------------------------------------+
*/
 
// +------------------------------------------------------------------------------------------------------+
// | ENTETE du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
 
 
// +------------------------------------------------------------------------------------------------------+
// | LISTE de FONCTIONS |
// +------------------------------------------------------------------------------------------------------+
/** Fonction ADME_afficherFormPrincipal() - Affichage par défaut.
*
* Fournit l'affichage par défaut de l'application Admin Menus.
*
* @param object objet Pear de connection à la base de données.
* @param object objet Pear représentant l'url de base.
* @return string le XHTML par défaut de la page.
*/
function ADME_afficherFormPrincipal($objet_pear_db, $objet_pear_url, $adme_site_id, $adme_menu_id, $adme_action)
{
$db=$objet_pear_db;
$id_langue = $GLOBALS['_GEN_commun']['i18n']; //identifiant de la langue choisie
// Langue en cours : langue choisie ou langue par defaut (principale)
if (isset($id_langue) && ($id_langue!='')) {
$langue_test=$id_langue;
} else {
$langue_test=GEN_I18N_ID_DEFAUT;
}
 
//$langue_test=GEN_I18N_ID_DEFAUT;
//requete pour recuperer l'id du menu par defaut
$requete = 'SELECT gs_id_site '.
'FROM gen_site, gen_site_relation '.
'WHERE gsr_id_site_01 = gsr_id_site_02 '.
'AND gsr_id_site_01 = gs_id_site '.
'AND gsr_id_valeur=101 '.
'AND gs_ce_i18n = "'.$langue_test.'" ';
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '' ;
while ($ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT)) {
$id_site_par_defaut=$ligne->gs_id_site;
}
// Liste des sites principaux :
// Recherche de tous les sites langue en cours
$requete = 'SELECT * '.
'FROM gen_site, gen_site_relation '.
'WHERE gsr_id_site_01 = gsr_id_site_02 '.
'AND gsr_id_site_01 = gs_id_site '.
'AND gsr_id_valeur IN (102, 103) '.
'AND gs_ce_i18n = "'.$langue_test.'" '.
'ORDER BY gsr_ordre';
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '' ;
$liste_site=array();
while ($ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT)) {
if ($langue_test == GEN_I18N_ID_DEFAUT) {
$requete_est_traduction = 'SELECT gsr_id_site_01 '.
'FROM gen_site_relation '.
'WHERE '.$ligne->gs_id_site.' = gsr_id_site_02 ' .
'AND gsr_id_site_01 <> gsr_id_site_02 ' .
'AND gsr_id_valeur = 1 ';// 1 = "avoir traduction"
$resultat_est_traduction = $db->query($requete_est_traduction);
(DB::isError($resultat_est_traduction))
? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_est_traduction->getMessage(), $requete_est_traduction))
: '';
if ( $resultat_est_traduction->numRows() == 0 ) {
$liste_site[]=$ligne;
}
}
else {
$liste_site[]=$ligne;
}
}
$resultat->free();
// Si la langue en cours n'est pas la langue par défaut, recherche des sites ayant comme langue
// la langue par defaut, non traduits dans la langue en cours et n'etant pas des traductions
if ($langue_test != GEN_I18N_ID_DEFAUT) {
 
$requete = 'SELECT * '.
'FROM gen_site, gen_site_relation '.
'WHERE gsr_id_site_01 = gsr_id_site_02 '.
'AND gs_id_site = gsr_id_site_01 '.
'AND gsr_id_valeur IN (102, 103) '.
'AND gs_ce_i18n = "'.GEN_I18N_ID_DEFAUT.'" '.
'ORDER BY gs_code_num ASC';// 102 = site "principal" et 103 = site "externe"
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
// Recherche de tous les sites de la langue principale qui ne sont pas traduits dans la langue en cours
while ($ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT)) {
$requete_est_traduction = 'SELECT gsr_id_site_01 '.
'FROM gen_site_relation '.
'WHERE '.$ligne->gs_id_site.' = gsr_id_site_02 ' .
'AND gsr_id_site_01 <> gsr_id_site_02 ' .
'AND gsr_id_valeur = 1 ';// 1 = "avoir traduction"
$resultat_est_traduction = $db->query($requete_est_traduction);
(DB::isError($resultat_est_traduction))
? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_est_traduction->getMessage(), $requete_est_traduction))
: '';
if ( $resultat_est_traduction->numRows() == 0 ) {
if (isset($id_langue) && ($id_langue!='')) {
$langue_test=$id_langue;
} else {
$langue_test=GEN_I18N_ID_DEFAUT;
}
$requete_traduction = 'SELECT gsr_id_site_01 '.
'FROM gen_site_relation, gen_site '.
'WHERE '.$ligne->gs_id_site.' = gsr_id_site_01 ' .
'AND gsr_id_site_02 = gs_id_site '.
'AND gs_ce_i18n = "'.$langue_test.'" '.
'AND gsr_id_valeur = 1 ';// 1 = "avoir traduction"
$resultat_traduction = $db->query($requete_traduction);
(DB::isError($resultat_traduction))
? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_traduction->getMessage(), $requete_traduction))
: '';
if ( $resultat_traduction->numRows() == 0 ) {
$liste_site []=$ligne;
}
$resultat_traduction->free();
}
$resultat_est_traduction->free();
}
$resultat->free();
}
// Traduction d'un site principal uniquement :
$requete = 'SELECT * '.
'FROM gen_site_relation '.
'WHERE gsr_id_site_02 = '.$adme_site_id.' '.
'AND gsr_id_valeur =1 '; // 1 = "avoir traduction"
$resultat = $db->query($requete);
if (DB::isError($resultat)) {
die( BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete) );
}
if ( $resultat->numRows() == 0 ) {
$adme_site_id =$adme_site_id;
}
else {
$ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
$adme_site_id = $ligne->gsr_id_site_01;
}
$resultat->free();
//---------------------------------------------------------------------------------------------------------------
// Création du formulaire
// Notes : Quickform semble remplacer les & des &amp; à nouveau par des &amp; solution utiliser str_replace()...
$form =& new HTML_QuickForm('adme_form_sites', 'post', str_replace('&amp;', '&', $objet_pear_url->getUrl()));
$tab_index = 1000;
$squelette =& $form->defaultRenderer();
$squelette->setformTemplate("\n".'<form {attributes}>'."\n".'{content}'."\n"."\n".'</form>'."\n");
$squelette->setElementTemplate( '{label}'."\n".'{element}'."\n".
'<!-- BEGIN required --><span class="symbole_obligatoire">*</span><!-- END required -->'."\n".
'<!-- BEGIN error --><span class="erreur">{error}</span><!-- END error -->'."\n");
$partie_site_debut = '<fieldset>'."\n".
'<legend>'.ADME_LG_FORM_SITE_TITRE.'</legend>'."\n";
$form->addElement('html', $partie_site_debut);
$id = 'adme_site_id';
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++, 'onchange' => 'javascript:this.form.submit();');
$label = '<label for="'.$id.'">'.ADME_LG_FORM_SITE_CHOIX.'</label>';
$objet_select = new HTML_QuickForm_select($id, $label, '', $aso_attributs);
$aso_options = array();
//print $adme_site_id;
 
foreach ($liste_site as $ligne ) {
if (!isset($adme_site_id) || $adme_site_id == 0) {
$adme_site_id = $ligne->gs_id_site;
}
// print $ligne->gs_id_site;
if ($ligne->gs_id_site == $adme_site_id) {
$objet_select->addOption(htmlentities($ligne->gs_nom.' ('.$ligne->gs_code_alpha.')'), $ligne->gs_id_site, 'selected="selected"');
// Attribution du nom du site sur lequel on travaille pour le titre
$site_nom = $ligne->gs_nom;
} else {
$objet_select->addOption(htmlentities($ligne->gs_nom.' ('.$ligne->gs_code_alpha.')'), $ligne->gs_id_site);
}
}
$form->addElement($objet_select);
$form->addElement('submit', 'choisir_site', ADME_LG_FORM_SITE_VALIDER);
$partie_site_fin = "\n".'</fieldset>';
$form->addElement('html', $partie_site_fin);
// Instanciation des valeurs par défaut du formulaire
if (isset($id_site_par_defaut)) {
if (!isset($_GET['adme_site_id'])) {
$adme_site_id=$id_site_par_defaut;
} else {
$adme_site_id=$_GET['adme_site_id'];
}
}
$form->setDefaults(array('adme_site_id' => $adme_site_id));
$retour ='';
$retour .= '<h1>'.ADME_LG_MENU_TITRE.$site_nom.'</h1>'."\n";
$retour .= $form->toHTML()."\n";
//---------------------------------------------------------------------------------------------------------------
// Gestion des menus classiques
$objet_pear_url_copie = $objet_pear_url;
$retour .= '<p>'."\n";
$objet_pear_url_copie->addQueryString('adme_action', ADME_LG_ACTION_CLASSIQUE_AJOUTER);
$objet_pear_url_copie->addQueryString('adme_site_id', $adme_site_id);
$objet_pear_url_copie->addQueryString('adme_menu_id', 0);
$url_ajout_menu_classique_n1 = $objet_pear_url_copie->getURL();
//unset($url_ajout_menu_n1);
$retour .= '<a href="'.$url_ajout_menu_classique_n1.'" >'.
ADME_LG_MENU_CLASSIQUE_RACINE.'&nbsp;'.
'<img class="'.ADME_CLASS_IMG_ICONE.'" src="'.ADME_IMAGE_NOUVEAU.'" alt="+" />'.
'</a>'."\n";
$retour .= '</p>'."\n";
$objet_pear_url_copie_depl = $objet_pear_url;
$objet_pear_url_copie_depl->removeQueryString('adme_action');
$objet_pear_url_copie_depl->removeQueryString('adme_site_id');
$objet_pear_url_copie_depl->removeQueryString('adme_menu_id');
$objet_pear_url_copie_depl->addQueryString('adme_action', ADME_LG_ACTION_CLASSIQUE_DEPLACER_MENUS);
$url_deplacement_menu_commun = $objet_pear_url_copie_depl->getURL() ;
$retour .= '<form id="adme_form_menu_deplacement" name="adme_form_menu_deplacement" method="post" action="'.$url_deplacement_menu_commun.'" class="form_inv">' ;
$retour .= ADME_afficherListeMenuClassique($objet_pear_db, $objet_pear_url, $adme_site_id, $adme_menu_id, $adme_action, 0);
$retour .= '<fieldset class="fields_deplacer_menu">' ;
$retour .= '<legend> '.ADME_LG_MENU_DEPLACER.' </legend>' ;
$objet_select->setAttributes(array('name'=>'adme_id_site_arrivee', 'id'=> 'adme_id_site_arrivee', 'tabindex' => $tab_index++));
$retour .= $objet_select->toHtml() ;
$retour .= '<input type="hidden" name="adme_id_site_depart" id="adme_id_site_depart" value="'.$adme_site_id.'" />' ;
$retour .= '<input type="submit" value="deplacer" title="deplacer" />' ;
$retour .= '</fieldset>';
$retour .= '</form>' ;
//$objet_pear_url_copie_depl->removeQueryString('adme_action');
//---------------------------------------------------------------------------------------------------------------
// Gestion des menus communs
$retour .= '<p>'."\n";
$objet_pear_url_copie = $objet_pear_url;
$objet_pear_url_copie->addQueryString('adme_action', ADME_LG_ACTION_COMMUN_AJOUTER);
$objet_pear_url_copie->addQueryString('adme_site_id', $adme_site_id);
$objet_pear_url_copie->addQueryString('adme_menu_id', 0);
$url_ajout_menu_commun_n1 = $objet_pear_url_copie->getURL();
//unset($url_ajout_menu_n1);
$retour .= '<a href="'.$url_ajout_menu_commun_n1.'">'.
ADME_LG_MENU_COMMUN_RACINE.'&nbsp;'.
'<img class="'.ADME_CLASS_IMG_ICONE.'" src="'.ADME_IMAGE_NOUVEAU.'" alt="+" />'.
'</a>'."\n";
$retour .= '</p>'."\n";
$retour .= ADME_afficherListeMenuCommun($objet_pear_db, $objet_pear_url, $adme_site_id, $adme_menu_id, $adme_action, 0);
return $retour;
}
// +------------------------------------------------------------------------------------------------------+
// | PIED du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
 
 
/* +--Fin du code ----------------------------------------------------------------------------------------+
*
* $Log: not supported by cvs2svn $
* Revision 1.19 2007-04-19 15:34:35 neiluj
* préparration release (livraison) "Narmer" - v0.25
*
* Revision 1.18 2006/10/16 15:49:07 ddelon
* Refactorisation code mulitlinguisme et gestion menu invisibles
*
* Revision 1.17 2006/10/06 13:38:45 florian
* ergonomie amélioree
*
* Revision 1.16 2006/04/28 12:41:49 florian
* corrections erreurs chemin
*
* Revision 1.15 2006/03/24 13:03:24 ddelon
* bug afficheur multilinguisme
*
* Revision 1.14 2006/03/23 20:24:59 ddelon
* *** empty log message ***
*
* Revision 1.13 2006/03/13 21:00:20 ddelon
* Suppression messages d'erreur multilinguisme
*
* Revision 1.12 2006/03/02 10:49:49 ddelon
* Fusion branche multilinguisme dans branche principale
*
* Revision 1.11.2.1 2006/02/28 14:02:11 ddelon
* Finition multilinguisme
*
* Revision 1.11 2005/07/18 16:14:32 ddelon
* css admin + menu communs
*
* Revision 1.10 2005/07/08 21:57:24 ddelon
* Copyright
*
* Revision 1.9 2005/05/12 16:51:37 alex
* Changement de l'odre d'apparition des sites dans l'administration des menus.
*
* Revision 1.8 2005/01/26 16:18:05 jpm
* Correction bogue 221 : mauvais réglage du titre.
*
* Revision 1.7 2004/11/24 11:31:51 jpm
* Ajout d'une contante de langue à la place d'un texte.
*
* Revision 1.6 2004/11/10 17:26:07 jpm
* Fin gestion de la traduction.
*
* Revision 1.5 2004/11/10 11:58:54 jpm
* Mise en place des constantes de traduction de l'appli.
*
* Revision 1.4 2004/11/09 17:48:35 jpm
* Gestion de différentes interfaces d'administration.
*
* Revision 1.3 2004/11/09 12:37:34 jpm
* Fin de gestion des menus et mise en conformité avec la convention de codage.
*
* Revision 1.2 2004/11/08 17:41:07 jpm
* Légères corrections : multisite, corrections SQL.
*
* Revision 1.1 2004/11/04 12:26:42 jpm
* Contient les fonctions d'affichage général de l'appli ADME.
*
*
* +-- Fin du code ----------------------------------------------------------------------------------------+
*/
?>
/trunk/papyrus/applications/admin_menu/bibliotheque/adme_menu_classique.fonct.php
1,1999 → 1,2171
<?php
/*vim: set expandtab tabstop=4 shiftwidth=4: */
// Copyright (C) 1999-2004 Tela Botanica (accueil@tela-botanica.org)
//
// Ce logiciel est un programme informatique servant à gérer du contenu et des
// applications web.
// Ce logiciel est régi par la licence CeCILL soumise au droit français et
// respectant les principes de diffusion des logiciels libres. Vous pouvez
// utiliser, modifier et/ou redistribuer ce programme sous les conditions
// de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
// sur le site "http://www.cecill.info".
 
// En contrepartie de l'accessibilité au code source et des droits de copie,
// de modification et de redistribution accordés par cette licence, il n'est
// offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
// seule une responsabilité restreinte pèse sur l'auteur du programme, le
// titulaire des droits patrimoniaux et les concédants successifs.
 
// A cet égard l'attention de l'utilisateur est attirée sur les risques
// associés au chargement, à l'utilisation, à la modification et/ou au
// développement et à la reproduction du logiciel par l'utilisateur étant
// donné sa spécificité de logiciel libre, qui peut le rendre complexe à
// manipuler et qui le réserve donc à des développeurs et des professionnels
// avertis possédant des connaissances informatiques approfondies. Les
// utilisateurs sont donc invités à charger et tester l'adéquation du
// logiciel à leurs besoins dans des conditions permettant d'assurer la
// sécurité de leurs systèmes et ou de leurs données et, plus généralement,
// à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
 
// Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
// pris connaissance de la licence CeCILL, et que vous en avez accepté les
// termes.
// ----
// CVS : $Id: adme_menu_classique.fonct.php,v 1.42 2007-10-25 14:26:56 ddelon Exp $
/**
* Fonctions de gestion des menus classiques
*
* Permet de lister, d'ajouter, de modifier, et de déplacer des menus classiques.
* Par menus classiques nous entendons tous les menus devant paraitre dans l'arborescences
* des menus disponibles pour le site courant.
*
*@package Admin_menu
*@subpackage Fonctions
//Auteur original :
*@author Jean-Pascal MILCENT <jpm@tela-botanica.org>
//Autres auteurs :
*@author Alexandre GRANIER <alexandre@tela-botanica.org>
*@copyright Tela-Botanica 2000-2004
*@version $Revision: 1.42 $ $Date: 2007-10-25 14:26:56 $
// +------------------------------------------------------------------------------------------------------+
*/
 
// +------------------------------------------------------------------------------------------------------+
// | ENTÊTE du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
 
 
// +------------------------------------------------------------------------------------------------------+
// | LISTE de FONCTIONS |
// +------------------------------------------------------------------------------------------------------+
 
/** Fonction ADME_afficherListeMenuClassique () - Affiche un arbre de menu en xhtml
*
* Elle forme l'arbre des menus classiques à administrer.
* Ancien nom : deployer_menu().
*
* @param object objet Pear de connection à la base de données.
* @param object objet Pear représentant l'url de base.
* @param integer l'identifiant du menu à administrer.
* @param integer l'identifiant du menu sur lequel on agit.
* @param string le nom de l'action courante.
* @param integer l'identifiant du menu en cours de déploiement.
* @param boolean true indique que l'on a à faire au premier appel de cette fonction récursive.
* @return string le code XHTML constituant l'arbre des menus à administrer.
*/
function ADME_afficherListeMenuClassique($db, $url, $adme_site_id, $adme_menu_id, $adme_action, $id_menu_a_deployer, $bln_premier_appel = true)
{
 
// Initialisation des variables :
$retour = '';
// Est-ce que ces menus comporte des sous-menus ?
$requete_sous_menu = 'SELECT gm_id_menu '.
'FROM gen_menu, gen_menu_relation AS GMR01, gen_menu_relation AS GMR02 '.
'WHERE GMR01.gmr_id_menu_02 = '.$id_menu_a_deployer.' '.
'AND GMR01.gmr_id_menu_01 = gm_id_menu '.
'AND gm_ce_site = '.$adme_site_id.' '.
'AND GMR01.gmr_id_valeur = 1 '.// 1 = avoir "père"
'AND GMR02.gmr_id_menu_02 = gm_id_menu '.
'AND GMR02.gmr_id_menu_01 = GMR02.gmr_id_menu_02 '.
'AND GMR02.gmr_id_valeur = 100 '.// 100 = type "menu classique"
'ORDER BY GMR01.gmr_ordre ASC';
$resultat_sous_menu = $db->query($requete_sous_menu) ;
if (DB::isError($resultat_sous_menu)) {
die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_sous_menu->getMessage(), $requete_sous_menu));
}
// Gestion du stockage ou déstockage des menus ouverts
if (($adme_action == ADME_LG_ACTION_DEPLIER || $adme_action == ADME_LG_ACTION_CLASSIQUE_AJOUTER) && $id_menu_a_deployer != 0) {
$_SESSION['adme_menus_classiques_ouverts'][$adme_menu_id] = $adme_menu_id;
}
if ($adme_action == ADME_LG_ACTION_PLIER && $id_menu_a_deployer != 0) {
unset($_SESSION['adme_menus_classiques_ouverts'][$adme_menu_id]);
foreach ($_SESSION['adme_menus_classiques_ouverts'] as $val) {
if (GEN_etreAncetre($adme_menu_id, $val)) {
unset($_SESSION['adme_menus_classiques_ouverts'][$val]);
}
}
}
// Gestion affichage des menus
if ($resultat_sous_menu->numRows() > 0) {
// Ici, on sait qu'un menu a des sous menus, on commence par l'afficher:
if ($bln_premier_appel == false) {
$retour .= '<li>'."\n";
if (GEN_etreAncetre($id_menu_a_deployer, $adme_menu_id) ||
($id_menu_a_deployer == $adme_menu_id && $adme_action == ADME_LG_ACTION_DEPLIER) ||
isset($_SESSION['adme_menus_classiques_ouverts'][$id_menu_a_deployer])
){
// Affiche un -
$retour .= ADME_retournerXhtmlMenuClassique($db, $url, $adme_site_id, $id_menu_a_deployer, 1);
} else if ( !GEN_etreAncetre($id_menu_a_deployer, $adme_menu_id) ||
($id_menu_a_deployer == $adme_menu_id && $adme_action == ADME_LG_ACTION_PLIER) ||
!isset($_SESSION['adme_menus_classiques_ouverts'][$id_menu_a_deployer])
){
// Affiche un +
$retour .= ADME_retournerXhtmlMenuClassique($db, $url, $adme_site_id, $id_menu_a_deployer, 2);
}
}
if ($bln_premier_appel == true || GEN_etreAncetre($id_menu_a_deployer, $adme_menu_id) ||
($id_menu_a_deployer == $adme_menu_id && $adme_action == ADME_LG_ACTION_DEPLIER) ||
isset($_SESSION['adme_menus_classiques_ouverts'][$id_menu_a_deployer])
){
$retour .= '<ul class="menu_classique">'."\n";
while ($ligne_sous_menu = $resultat_sous_menu->fetchRow(DB_FETCHMODE_OBJECT)) {
$retour .= ADME_afficherListeMenuClassique($db, $url, $adme_site_id, $adme_menu_id, $adme_action, $ligne_sous_menu->gm_id_menu, false);
}
$retour .= '</ul>'."\n";
}
if ($bln_premier_appel == false) {
$retour .= '</li>'."\n";
}
} else if ($resultat_sous_menu->numRows() == 0 && $bln_premier_appel == false) {
$retour .= '<li>'."\n";
$retour .= ADME_retournerXhtmlMenuClassique($db, $url, $adme_site_id, $id_menu_a_deployer, 0);
$retour .= '</li>'."\n";
}
return $retour;
}
 
/** Fonction ADME_retournerXhtmlMenuClassique() - Effectue une sortie d'un menu en XHTML
*
* Retourne le XHTML d'une ligne de l'arbre des menus "classiques" permettant de l'administer.
* Ancien nom : menu_toHtml().
*
* @param object objet Pear de connection à la base de données.
* @param object objet Pear représentant l'url de base.
* @param integer l'identifiant du site à administrer.
* @param integer l'identifiant du menu à administrer.
* @param integer 0 indique que le menu ne possède pas de fils, 1 qu'il faut afficher un - et 2 un +.
* @return string une ligne de liste XHTML
*/
function ADME_retournerXhtmlMenuClassique($db, $url, $adme_site_id, $adme_menu_id, $int_deplier,$est_traduction=false,$menu_traduction_defaut=0)
{
//-------------------------------------------------------------------------------------------------------------------
// Initialisation des variables
 
//-------------------------------------------------------------------------------------------------------------------
// Récupération des infos concernant l'administrateur d'un menu
$requete = 'SELECT gen_menu.*, ga_prenom '.
'FROM gen_menu, gen_annuaire '.
'WHERE gm_id_menu = '.$adme_menu_id.' '.
'AND gm_ce_admin = ga_id_administrateur';
$resultat = $db->query($requete);
if (DB::isError($resultat)) {
die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete));
}
$ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
//-------------------------------------------------------------------------------------------------------------------
// Recupération des infos de l'appli du menu courant.
$ligne_app = GEN_retournerInfoAppliMenu($db, $adme_menu_id);
//-------------------------------------------------------------------------------------------------------------------
// XHTML image plier-déplier
$url->addQueryString('adme_site_id', $adme_site_id);
$url->addQueryString('adme_menu_id', $adme_menu_id);
$xhtml_pd = '';
if ($int_deplier != 0) {
if ($int_deplier == 1) {
// Afficher un -
$image_plier_deplier = ADME_IMAGE_MOINS;
$alt = ADME_LG_ACTION_PLIER_ALT;
$url->addQueryString('adme_action', ADME_LG_ACTION_PLIER);
$url_plier_deplier = $url->getURL();
} else if ($int_deplier == 2) {
// Afficher un +
$image_plier_deplier = ADME_IMAGE_PLUS;
$alt = ADME_LG_ACTION_DEPLIER_ALT;
$url->addQueryString('adme_action', ADME_LG_ACTION_DEPLIER);
$url_plier_deplier = $url->getURL();
}
$xhtml_pd = '<a href="'.$url_plier_deplier.'" title="'.$alt.'">'.
'<img class="'.ADME_CLASS_IMG_PD.'" src="'.$image_plier_deplier.'" alt="'.$alt.'" />'.
'</a>'.'&nbsp;'."\n";
}
//-------------------------------------------------------------------------------------------------------------------
// XHTML du nom du menu et de ses infos
$xhtml_info = htmlentities(empty($ligne->gm_nom) ? ADME_LG_PARENTHESE_OUVRANTE.$ligne->gm_nom.ADME_LG_PARENTHESE_FERMANTE : $ligne->gm_nom);
$xhtml_info .= '&nbsp;';
if (!isset($ligne_app->gap_nom)) {
$gap_nom='';
}
else {
$gap_nom=$ligne_app->gap_nom;
}
$xhtml_info .= ADME_LG_PARENTHESE_OUVRANTE.$gap_nom.'&nbsp;'.ADME_LG_SLASH.'&nbsp;'.$ligne->ga_prenom.ADME_LG_PARENTHESE_FERMANTE;
$xhtml_info .= '&nbsp;'."\n";
//-------------------------------------------------------------------------------------------------------------------
// XHTML actions
$url->removeQueryString('adme_action');
$url->addQueryString('adme_action', ADME_LG_ACTION_CLASSIQUE_MODIFIER);
$xhtml_action = '<a href="'.$url->getURL().'" title="'.ADME_LG_ACTION_CLASSIQUE_MODIFIER_TITLE.'">'.
'<img class="'.ADME_CLASS_IMG_ICONE.'" src="'.ADME_IMAGE_VOIR.'" alt="'.ADME_LG_ACTION_CLASSIQUE_MODIFIER_ALT.'" />'.
'</a>&nbsp;'."\n";
$url->removeQueryString('adme_action');
if (!$est_traduction) {
$url->addQueryString('adme_action', ADME_LG_ACTION_CLASSIQUE_MONTER);
$xhtml_action .= '<a href="'.$url->getURL().'" title="'.ADME_LG_ACTION_CLASSIQUE_MONTER_TITLE.'">'.
'<img class="'.ADME_CLASS_IMG_ICONE.'" src="'.ADME_IMAGE_FLECHE_HAUT.'" alt="'.ADME_LG_ACTION_CLASSIQUE_MONTER_ALT.'" />'.
'</a>&nbsp;'."\n";
$url->removeQueryString('adme_action');
$url->addQueryString('adme_action', ADME_LG_ACTION_CLASSIQUE_DESCENDRE);
$xhtml_action .= '<a href="'.$url->getURL().'" title="'.ADME_LG_ACTION_CLASSIQUE_DESCENDRE_TITLE.'">'.
'<img class="'.ADME_CLASS_IMG_ICONE.'" src="'.ADME_IMAGE_FLECHE_BAS.'" alt="'.ADME_LG_ACTION_CLASSIQUE_DESCENDRE_ALT.'" />'.
'</a>&nbsp;'."\n";
$url->addQueryString('adme_action',ADME_LG_ACTION_CLASSIQUE_DIMINUER);
$xhtml_action .= '<a href="'.$url->getURL().'" title="'.ADME_LG_ACTION_CLASSIQUE_DIMINUER_TITLE.'">'.
'<img class="'.ADME_CLASS_IMG_ICONE.'" src="'.ADME_IMAGE_FLECHE_GAUCHE.'" alt="'.ADME_LG_ACTION_CLASSIQUE_DIMINUER_ALT.'" />'.
'</a>&nbsp;'."\n";
$url->removeQueryString('adme_action');
$url->addQueryString('adme_action',ADME_LG_ACTION_CLASSIQUE_AUGMENTER);
$xhtml_action .= '<a href="'.$url->getURL().'" title="'.ADME_LG_ACTION_CLASSIQUE_AUGMENTER_TITLE.'">'.
'<img class="'.ADME_CLASS_IMG_ICONE.'" src="'.ADME_IMAGE_FLECHE_DROITE.'" alt="'.ADME_LG_ACTION_CLASSIQUE_AUGMENTER_ALT.'" />'.
'</a>&nbsp;'."\n";
}
$url->removeQueryString('adme_action');
if (!$est_traduction) {
$url->addQueryString('adme_action', ADME_LG_ACTION_CLASSIQUE_SUPPRIMER);
$xhtml_action .= '<a href="'.$url->getURL().'" title="'.ADME_LG_ACTION_CLASSIQUE_SUPPRIMER_TITLE.'" onclick="javascript:return confirm(\''.ADME_LG_ACTION_SUPPRIMER_CONFIRMATION.'\');">'.
'<img class="'.ADME_CLASS_IMG_ICONE.'" src="'.ADME_IMAGE_SUPPRIMER.'" alt="'.ADME_LG_ACTION_CLASSIQUE_SUPPRIMER_ALT.'" />'.
'</a>&nbsp;'."\n";
}
else {
$url->addQueryString('adme_action', ADME_LG_ACTION_CLASSIQUE_SUPPRIMER_TRADUCTION);
$xhtml_action .= '<a href="'.$url->getURL().'" title="'.ADME_LG_ACTION_CLASSIQUE_SUPPRIMER_TRADUCTION_TITLE.'" onclick="javascript:return confirm(\''.ADME_LG_ACTION_SUPPRIMER_CONFIRMATION.'\');">'.
'<img class="'.ADME_CLASS_IMG_ICONE.'" src="'.ADME_IMAGE_SUPPRIMER.'" alt="'.ADME_LG_ACTION_CLASSIQUE_SUPPRIMER_TRADUCTION_ALT.'" />'.
'</a>&nbsp;'."\n";
}
$url->removeQueryString('adme_action');
if (!$est_traduction) {
$url->addQueryString('adme_action', ADME_LG_ACTION_CLASSIQUE_AJOUTER);
$xhtml_action .= '<a href="'.$url->getURL().'" title="'.ADME_LG_ACTION_CLASSIQUE_AJOUTER_TITLE.'">'.
'<img class="'.ADME_CLASS_IMG_ICONE.'" src="'.ADME_IMAGE_NOUVEAU.'" alt="'.ADME_LG_ACTION_CLASSIQUE_AJOUTER_ALT.'" />'.
'</a>'.'&nbsp;'."\n";
}
$url->removeQueryString('adme_action');
// Si le menu à une application liée on regarde s'il y a une interface d'administration.
if (!isset($ligne_app->gap_id_application)) {
$gap_id_application=0;
}
else {
$gap_id_application=$ligne_app->gap_id_application;
}
if ($gap_id_application != 0 && GEN_verifierPresenceInterfaceAdmin($db, $gap_id_application)) {
$url->removeQueryString('adme_action');
$url->addQueryString('adme_action', ADME_LG_ACTION_ADMINISTRER);
$xhtml_action .= '<a href="'.$url->getURL().'" title="'.ADME_LG_ACTION_ADMINISTRER_TITLE.'">'.
'<img class="'.ADME_CLASS_IMG_ICONE.'" src="'.ADME_IMAGE_TEXTE.'" alt="'.ADME_LG_ACTION_ADMINISTRER_ALT.'" />'.
'</a>'.'&nbsp;'."\n";
}
if (!$est_traduction) {
$requete_traduction = 'SELECT gmr_id_menu_02, gm_ce_i18n '.
'FROM gen_menu_relation, gen_menu '.
'WHERE '.$adme_menu_id.' = gmr_id_menu_01 ' .
'AND gmr_id_menu_02 = gm_id_menu '.
'AND gmr_id_valeur = 2 ';// 2 = "avoir traduction"
$resultat_traduction = $db->query($requete_traduction);
(DB::isError($resultat_traduction)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_traduction->getMessage(), $requete_traduction))
: '';
$url->addQueryString('adme_action',ADME_LG_ACTION_CLASSIQUE_TRADUIRE);
$xhtml_action .= '<a href="'.$url->getURL().'" title="'.ADME_LG_ACTION_CLASSIQUE_TRADUIRE_TITLE.'">'.
ADME_LG_ACTION_CLASSIQUE_TRADUIRE_ALT.
'</a>&nbsp;'."\n";
 
// Restriction possible à une langue si pas traduit
 
if ($resultat_traduction->numRows() == 0 ) {
 
$requete_lang = 'SELECT * FROM gen_i18n ';
 
$resultat_lang = $db->query($requete_lang);
(DB::isError($resultat_lang)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_lang->getMessage(), $requete_lang)) : '';
$requete_restriction = 'SELECT gmr_id_menu_02 '.
'FROM gen_menu_relation '.
'WHERE '.$adme_menu_id.' = gmr_id_menu_01 ' .
'AND gmr_id_valeur = 106 ';// 106 restriction de menu
$resultat_restriction = $db->query($requete_restriction);
(DB::isError($resultat_restriction)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_restriction->getMessage(), $requete_restriction))
: '';
if ($resultat_restriction->numRows() == 0 ) {
$restriction=0;
}
else {
$restriction=1;
}
while ($ligne_lang = $resultat_lang->fetchRow(DB_FETCHMODE_OBJECT) ) {
if (($restriction) && ($ligne->gm_ce_i18n==$ligne_lang->gi_id_i18n)) {
$url->addQueryString('adme_action',ADME_LG_ACTION_CLASSIQUE_OUVRIR);
$url->addQueryString('zone',$ligne_lang->gi_id_i18n);
$xhtml_action .= '<i><b><a href="'.$url->getURL().'" title="'.ADME_LG_ACTION_CLASSIQUE_OUVRIR_TITLE.'">'.
$ligne_lang->gi_id_i18n.
'</a></b></i>&nbsp;'."\n";
}
else {
$url->addQueryString('adme_action',ADME_LG_ACTION_CLASSIQUE_LIMITER);
$url->addQueryString('zone',$ligne_lang->gi_id_i18n);
$xhtml_action .= '<a href="'.$url->getURL().'" title="'.ADME_LG_ACTION_CLASSIQUE_LIMITER_TITLE.'">'.
$ligne_lang->gi_id_i18n.
'</a>&nbsp;'."\n";
}
}
}
}
else {
if ($menu_traduction_defaut==$adme_menu_id) {
$xhtml_action .= '<img class="'.ADME_CLASS_IMG_ICONE.'" src="'.ADME_IMAGE_TRADUCTION_DEFAUT_AFFICHAGE.'" alt="'.ADME_LG_ACTION_CLASSIQUE_TRADUCTION_DEFAUT_ALT.'" />'.
'&nbsp;'."\n";
}
else {
$url->removeQueryString('adme_action');
$url->addQueryString('adme_action', ADME_LG_ACTION_CLASSIQUE_TRADUCTION_DEFAUT);
$xhtml_action .= '<a href="'.$url->getURL().'" title="'.ADME_LG_ACTION_CLASSIQUE_TRADUCTION_DEFAUT_TITLE.'">'.
'<img class="'.ADME_CLASS_IMG_ICONE.'" src="'.ADME_IMAGE_TRADUCTION_DEFAUT.'" alt="'.ADME_LG_ACTION_CLASSIQUE_TRADUCTION_DEFAUT_ALT.'" />'.
'</a>'.'&nbsp;'."\n";
}
}
$xhtml_traduction='';
// $id_langue = $GLOBALS['_GEN_commun']['i18n'];
$requete_traduction = 'SELECT gmr_id_menu_02, gm_ce_i18n '.
'FROM gen_menu_relation, gen_menu '.
'WHERE '.$adme_menu_id.' = gmr_id_menu_01 ' .
'AND gmr_id_menu_02 = gm_id_menu '.
'AND gmr_id_valeur = 2 ';// 2 = "avoir traduction"
$resultat_traduction = $db->query($requete_traduction);
(DB::isError($resultat_traduction)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_traduction->getMessage(), $requete_traduction))
: '';
if ($resultat_traduction->numRows() > 0 ) {
$requete_traduction_defaut = 'SELECT gmr_id_menu_02 '.
'FROM gen_menu_relation '.
'WHERE '.$adme_menu_id.' = gmr_id_menu_01 ' .
'AND gmr_id_valeur = 105 ';// 105 traduction par defaut
$resultat_traduction_defaut = $db->query($requete_traduction_defaut);
(DB::isError($resultat_traduction_defaut)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_traduction->getMessage(), $requete_traduction_defaut))
: '';
if ($resultat_traduction_defaut->numRows() == 0 ) {
$menu_traduction_defaut=0;
$xhtml_action .= '<img class="'.ADME_CLASS_IMG_ICONE.'" src="'.ADME_IMAGE_TRADUCTION_DEFAUT_AFFICHAGE.'" alt="'.ADME_LG_ACTION_CLASSIQUE_TRADUCTION_DEFAUT_ALT.'" />'.
'&nbsp;'."\n";
}
else {
$ligne_traduction_defaut = $resultat_traduction_defaut->fetchRow(DB_FETCHMODE_OBJECT);
$menu_traduction_defaut=$ligne_traduction_defaut->gmr_id_menu_02;
if ($menu_traduction_defaut!=$adme_menu_id) {
$url->removeQueryString('adme_action');
$url->addQueryString('adme_action', ADME_LG_ACTION_CLASSIQUE_TRADUCTION_DEFAUT);
$xhtml_action .= '<a href="'.$url->getURL().'" title="'.ADME_LG_ACTION_CLASSIQUE_TRADUCTION_DEFAUT_TITLE.'">'.
'<img class="'.ADME_CLASS_IMG_ICONE.'" src="'.ADME_IMAGE_TRADUCTION_DEFAUT.'" alt="'.ADME_LG_ACTION_CLASSIQUE_TRADUCTION_DEFAUT_ALT.'" />'.
'</a>'.'&nbsp;'."\n";
}
else {
$xhtml_action .= '<img class="'.ADME_CLASS_IMG_ICONE.'" src="'.ADME_IMAGE_TRADUCTION_DEFAUT_AFFICHAGE.'" alt="'.ADME_LG_ACTION_CLASSIQUE_TRADUCTION_DEFAUT_ALT.'" />'.
'&nbsp;'."\n";
}
}
while ($ligne_resultat = $resultat_traduction->fetchRow(DB_FETCHMODE_OBJECT)) {
$xhtml_traduction.="<br><em>".$ligne_resultat->gm_ce_i18n.":&nbsp;".ADME_retournerXhtmlMenuClassique($db, $url, $adme_site_id, $ligne_resultat->gmr_id_menu_02, 0,true,$menu_traduction_defaut)."</em>";
}
}
 
//-------------------------------------------------------------------------------------------------------------------
// Envoi du menu.
//-------------------------------------------------------------------------------------------------------------------
$retour = $xhtml_pd.$xhtml_info.$xhtml_action.$xhtml_traduction;
return $retour;
}
 
/** Fonction ADME_ajouterMenuClassique() - Ajoute un sous menu au menu courant
*
* Cette fonction permet d'ajouter un sous-menu de type "classique" au menu courant.
* Ancien nom : addMenu()
*
* @param object objet Pear de connection à la base de données.
* @param object objet Pear d'authentification.
* @param integer l'identifiant du site à administrer.
* @param integer l'identifiant du menu à administrer.
* @return void le menu classique est ajouté à la base de données.
*/
function ADME_ajouterMenuClassique($db, $auth, $adme_site_id, $adme_menu_id)
{
$url=$GLOBALS['_GEN_commun']['url'];
$url->removeQueryString('adme_action');
//----------------------------------------------------------------------------
// Récupération d'infos sur le site principal.
$objet_site = GEN_lireInfoSitePrincipal($db, $adme_site_id);
if ($objet_site == false) {
die('ERREUR Génésia Administrateur de Menus : impossible de lire les infos du site.<br />'.
'ID du site : '.$adme_site_id.'<br />'.
'Ligne n° : '. __LINE__ .'<br />'.
'Fichier n° : '. __FILE__ .'<br />');
}
$nouveau_id_menu = SQL_obtenirNouveauId($db, 'gen_menu', 'gm_id_menu');
$auteur = $auth->getAuthData('ga_prenom').' '.$auth->getAuthData('ga_nom');
//----------------------------------------------------------------------------
// Ajout du nouveau menu
$requete = 'INSERT INTO gen_menu '.
'SET gm_id_menu = '.$nouveau_id_menu.', '.
'gm_ce_site = '.$adme_site_id.', '.
'gm_ce_i18n = "'.$objet_site->gs_ce_i18n.'", '.
'gm_ce_application = 0, '.
'gm_code_num = '.$nouveau_id_menu.', '.
'gm_code_alpha = "menu_'.$nouveau_id_menu.'", '.
'gm_nom = "menu_'.$nouveau_id_menu.'", '.
'gm_titre = "menu_'.$nouveau_id_menu.'", '.
'gm_description_resume = "menu_'.$nouveau_id_menu.'", '.
'gm_auteur = "'.$auteur.'", '.
'gm_editeur = "'.$objet_site->gs_auteur.'", '.
'gm_date_creation = "'.date('Y-m-d H:i:s').'", '.
'gm_date_soumission = "'.date('Y-m-d H:i:s').'", '.
'gm_date_acceptation = "'.date('Y-m-d H:i:s').'", '.
'gm_date_publication = "'.date('Y-m-d H:i:s').'", '.
'gm_date_debut_validite = "'.date('Y-m-d H:i:s').'", '.
'gm_date_fin_validite = "0000-00-00 00:00:00", '.
'gm_date_copyright = "'.date('Y-00-00 00:00:00').'", '.
'gm_categorie = "menu", '.
'gm_ce_admin = '.$auth->getAuthData('ga_id_administrateur').' '
;
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
//----------------------------------------------------------------------------
// Ajout de la relation "père"
if (!isset($adme_menu_id) && empty($adme_menu_id)) {
$adme_menu_id = 0 ;// Identifiant du père
}
//----------------------------------------------------------------------------
// Récupération d'infos sur la hierarchie du menu
$requete = 'SELECT GMR01.gmr_ordre '.
'FROM gen_menu_relation AS GMR01, gen_menu_relation AS GMR02 '.
'WHERE GMR01.gmr_id_menu_02 = '.$adme_menu_id.' '.
'AND GMR01.gmr_id_valeur = 1 '.// 1 = avoir "père"
'AND GMR02.gmr_id_menu_01 = GMR01.gmr_id_menu_01 '.
'AND GMR02.gmr_id_menu_01 = GMR02.gmr_id_menu_02 '.
'AND GMR02.gmr_id_valeur = 100 '.// 100 = menu type "classique"
'ORDER BY GMR01.gmr_ordre DESC';
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
$ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
$nouveau_ordre_menu = $ligne->gmr_ordre + 1;
$resultat->free();
$requete = 'INSERT INTO gen_menu_relation '.
'SET gmr_id_menu_02 = '.$adme_menu_id.', '.
'gmr_id_menu_01 = '.$nouveau_id_menu.', '.
'gmr_id_valeur = 1, '.
'gmr_ordre = '.$nouveau_ordre_menu;
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
//----------------------------------------------------------------------------
// Ajout de la relation-type "menu classique"
// Récupération d'infos sur la hierarchie du menu
$requete = 'SELECT * '.
'FROM gen_menu_relation, gen_menu '.
'WHERE gmr_id_menu_02 = gmr_id_menu_01 '.
'AND gmr_id_valeur = 100 '.// 100 = type menu "classique"
'AND gmr_id_menu_01 = gm_id_menu '.
'AND gm_ce_site = '.$adme_site_id.' '.
'ORDER BY gmr_ordre DESC';
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
$ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
$nouveau_ordre_menu_classique = $ligne->gmr_ordre + 1;
$resultat->free();
$requete = 'INSERT INTO gen_menu_relation '.
'SET gmr_id_menu_01 = '.$nouveau_id_menu.', '.
'gmr_id_menu_02 = '.$nouveau_id_menu.', '.
'gmr_id_valeur = 100, '.
'gmr_ordre = '.$nouveau_ordre_menu_classique;
$result = $db->query($requete);
(DB::isError($result)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $result->getMessage(), $requete)) : '';
}
 
/** Fonction ADME_afficherFormMenuClassique() - Affiche le formulaire pour un menu classique
*
* Utilise HTML_QuickForm pour générer le formulaire.
* Ancien nom : showMenu()
*
* @param object objet Pear de connection à la base de données.
* @param object objet Pear représentant l'url de base.
* @param integer l'identifiant du site à administrer.
* @param integer l'identifiant du menu à administrer.
* @param array le tableau associatif des valeurs à afficher dans le formulaire.
* @return string le formulaire XHTML.
*/
function ADME_afficherFormMenuClassique($db, $url, $adme_site_id, $adme_menu_id, $aso_valeurs,$traduction=FALSE)
{
// Initialisation de variable
$url->addQueryString('adme_site_id', $adme_site_id);
$url->addQueryString('adme_menu_id', $adme_menu_id);
$script = 'function switchMenu(obj) {
var el = document.getElementById(obj);
if(el.style.display != "block")
{
el.style.display = "block";
}
else
{
el.style.display = "none";
}
}';
GEN_stockerCodeScript($script);
// Nous sommes toujours en modification car un menu est ajouté automatiquement!
// Récupération des informations du menu concerné.
if (!isset($aso_valeurs[ADME_LG_ACTION_CLASSIQUE_VERIFIER]) && !isset($aso_valeurs[ADME_LG_ACTION_CLASSIQUE_VERIFIER_TRADUCTION])) {
$aso_valeurs = GEN_lireInfoMenu($db, $adme_menu_id, DB_FETCHMODE_ASSOC);
if ($aso_valeurs === false) {
die('ERREUR Papyrus Administrateur de Menus : '.ADME_LG_ERREUR_INFO_MENU.'<br />'.
'Idenitifiant du menu n° : '. $adme_menu_id .'<br />'.
'Ligne n° : '. __LINE__ .'<br />'.
'Fichier n° : '. __FILE__ .'<br />');
}
// Requete pour récupérer les informations issues des relations du site à modifier
$ligne = GEN_lireInfoMenuRelation($db, $adme_menu_id, $id_valeur = 101);
$aso_valeurs['defaut'] = false;
if (isset($ligne) && !empty($ligne)) {
if ($ligne->gmr_id_valeur != false) {// 101 = site par défaut
$aso_valeurs['defaut'] = true;
}
}
}
// Titre de la page
if ($traduction) {
$retour = '<h1>'.ADME_LG_FORM_MENU_CLASSIQUE_TITRE_GENERAL_TRADUCTION.'</h1>'."\n";
}
else {
$retour = '<h1>'.ADME_LG_FORM_MENU_CLASSIQUE_TITRE_GENERAL.'</h1>'."\n";
}
 
$retour .= '<p class="adme_menu_id" >'.ADME_LG_FORM_MENU_ID.'<span id="adme_menu_id">'.$aso_valeurs['gm_id_menu'].'</span></p>'."\n";
// Création du formulaire
// Notes : Quickform semble remplacer les & des &amp; à nouveau par des &amp; solution utiliser str_replace()...
$form =& new HTML_QuickForm('form_menu_classique', 'post', str_replace('&amp;', '&', $url->getUrl()));
$tab_index = 1000;
$squelette =& $form->defaultRenderer();
$squelette->setFormTemplate("\n".'<form {attributes}>'."\n".'{content}'."\n".'</form>'."\n");
$squelette->setElementTemplate( '<p class="formulaire_element"><span class="form_label">'."\n".
'{label}'."\n".
'<!-- BEGIN required --><span style="color:red; width:5px; margin:0; padding:0;">*</span><!-- END required -->'."\n".
'</span>'."\n".'{element}'."\n".
'<!-- BEGIN error --><span class="erreur">{error}</span><!-- END error -->'."\n".
'</p>'."\n");
$squelette->setGroupElementTemplate('<p style="display:inline">{element}</p>', 'form_boutons');
$squelette->setRequiredNoteTemplate("\n".'<p class="symbole_obligatoire">*&nbsp;:&nbsp;{requiredNote}</p>'."\n");
//Note pour les erreurs javascript
$form->setJsWarnings('Erreur de saisie', 'Veuillez verifier vos informations saisies');
// Note de fin de formulaire
$form->setRequiredNote(ADME_LG_FORM_TXT_CHP_OBLIGATOIRE);
 
$partie_menu_debut = '<fieldset>'."\n".'<legend>'.ADME_LG_FORM_MENU_CLASSIQUE_TITRE_CONFIG.'</legend>'."\n";
$form->addElement('html', $partie_menu_debut);
$id = 'gm_code_alpha';
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++, 'size' => 35, 'maxlength' => 50);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_CODE_ALPHA.'</label>';
$form->addElement('text', $id, $label, $aso_attributs);
$form->addRule($id, ADME_LG_FORM_MENU_REGLE_CODE_ALPHA, 'required', '', 'client');
$id = 'gm_nom';
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++, 'size' => 35, 'maxlength' => 100);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_NOM.'</label>';
$form->addElement('text', $id, $label, $aso_attributs);
$form->addRule($id, ADME_LG_FORM_MENU_REGLE_NOM, 'required', '', 'client');
$form->applyFilter($id, 'trim');
$id = 'gm_description_resume';
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++, 'rows' => 2, 'cols' => 50);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_INFO_BULLE.'</label>';
$form->addElement('textarea', $id, $label, $aso_attributs);
$form->addRule($id, ADME_LG_FORM_MENU_REGLE_INFO_BULLE, 'required', '', 'client');
// Requête sur les applications
$requete = 'SELECT gap_id_application, gap_nom '.
'FROM gen_application '.
'WHERE gap_bool_applette = 0 '.
'ORDER BY gap_nom ASC';// Pour éviter d'afficher les applettes.
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
$aso_options = array();
while ($ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT)) {
$aso_options[$ligne->gap_id_application] = $ligne->gap_nom;
}
$resultat->free();
$id = 'gm_ce_application';
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_APPLI.'</label>';
$form->addElement('select', $id, $label, $aso_options, $aso_attributs);
if ($traduction) {
// Recherche liste des menu deja traduits
$requete = 'SELECT distinct gm_ce_i18n '.
'FROM gen_menu_relation, gen_menu '.
'WHERE gmr_id_menu_01 = ' . $adme_menu_id .' '.
'AND gm_id_menu = gmr_id_menu_02 '.
'AND gmr_id_valeur = 2 '; // 2 = "avoir traduction"
$resultat = $db->query($requete) ;
if (DB::isError($resultat)) {
die( BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete) );
}
$not_in_langue='';
if ( $resultat->numRows() == 0 ) {
$not_in_langue="gi_id_i18n not in('".$aso_valeurs['gm_ce_i18n']."')";
}
else {
while ($ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT)) {
$not_in_langue="'".$ligne->gm_ce_i18n."'".",".$not_in_langue;
$end="'".$ligne->gm_ce_i18n."'";
}
if ($not_in_langue) {
$not_in_langue="'".$aso_valeurs['gm_ce_i18n']."'".",".$not_in_langue;
$not_in_langue=' gi_id_i18n not in('.$not_in_langue.$end.')';
}
else {
$not_in_langue="gi_id_i18n not in('".$aso_valeurs['gm_ce_i18n']."')";
}
}
$resultat->free();
$requete = "SELECT * FROM gen_i18n where ".$not_in_langue;
/*$requete = 'SELECT * '.
'FROM gen_i18n ';*/
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
$aso_options = array();
while ($ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT) ) {
$aso_options[$ligne->gi_id_i18n] = $ligne->gi_id_i18n;
}
$resultat->free();
$id = 'gs_ce_i18n';
$aso_attributs = array('id' => $id, 'tabindex' => $tab_index++);
$label = '<label for="'.$id.'">'.'Langue : '.'</label>';
$form->addElement('select', $id, $label, $aso_options, $aso_attributs);
}
$id = 'gm_titre';
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++, 'size' => 35, 'maxlength' => 255);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_TITRE.'</label>';
$form->addElement('text', $id, $label, $aso_attributs);
$id = 'gm_mots_cles';
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++, 'rows' => 3, 'cols' => 50);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_MOT_CLE.'</label>';
$form->addElement('textarea', $id, $label, $aso_attributs);
$id = 'gm_description_libre';
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++, 'rows' => 3, 'cols' => 45);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_DESCRIPTION.'</label>';
$form->addElement('textarea', $id, $label, $aso_attributs);
$partie_menu_fin = "\n".'</fieldset>'."\n";
$form->addElement('html', $partie_menu_fin);
//Lien javascript pour cacher les options compliquées
$form->addElement('html', '<a href="#" onclick="switchMenu(\'config_avancee\');" title="'.ADME_VOIR_CONFIG_AVANCEE.'">'.ADME_VOIR_CONFIG_AVANCEE.'</a><br />'."\n");
//début de la div cachée pour les options compliquées-----------------------------------------------
$form->addElement('html', '<div id="config_avancee" style="display:none;">');
$partie_entete_debut = '<fieldset>'."\n".'<legend>'.ADME_CONFIG_AVANCEE.'</legend>'."\n";
$form->addElement('html', $partie_entete_debut);
$id = 'gm_code_num';
$aso_attributs = array('id'=>$id, 'tabindex' => $tab_index++, 'size' => 5, 'maxlength' => 100);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_CODE_NUM.'</label>';
$form->addElement('text', $id, $label, $aso_attributs);
$form->addRule($id, ADME_LG_FORM_MENU_REGLE_CODE_NUM, 'required', '', 'client');
$id = 'gm_raccourci_clavier';
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++, 'size' => 1, 'maxlength' => 1);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_RACCOURCI.'</label>';
$form->addElement('text', $id, $label, $aso_attributs);
$id = 'defaut';
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++);
if ($aso_valeurs[$id] === true) {
$aso_attributs['checked'] = 'checked';
}
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_DEFAUT.'</label>';
$form->addElement('checkbox', $id, $label, '', $aso_attributs);
$id = 'gm_fichier_squelette';
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++, 'size' => 35, 'maxlength' => 255);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_FICHIER_SQUELETTE.'</label>';
$form->addElement('text', $id, $label, $aso_attributs);
$id = 'gm_application_arguments';
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++, 'size' => 35, 'maxlength' => 255);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_APPLI_ARGUMENT.'</label>';
$form->addElement('text', $id, $label, $aso_attributs);
$id = 'gm_robot';
$aso_options = array( 'index,follow' => ADME_LG_FORM_MENU_INDEX_FOLLOW,
'index' => ADME_LG_FORM_MENU_INDEX,
'noindex' => ADME_LG_FORM_MENU_NOINDEX,
'noindex,nofollow' => ADME_LG_FORM_MENU_NOINDEX_NOFOLLOW,
'' => ADME_LG_FORM_MENU_INDEX_VIDE);
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_ROBOT.'</label>';
$form->addElement('select', $id, $label, $aso_options, $aso_attributs);
$id = 'gm_titre_alternatif';
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++, 'size' => 35, 'maxlength' => 255);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_TITRE_ALTERNATIF.'</label>';
$form->addElement('text', $id, $label, $aso_attributs);
$id = 'gm_description_table_matieres';
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++, 'rows' => 3, 'cols' => 45);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_TABLE_MATIERE.'</label>';
$form->addElement('textarea', $id, $label, $aso_attributs);
$id = 'gm_source';
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++, 'size' => 35, 'maxlength' => 255);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_SOURCE.'</label>';
$form->addElement('text', $id, $label, $aso_attributs);
$id = 'gm_auteur';
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++, 'size' => 35, 'maxlength' => 255);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_AUTEUR.'</label>';
$form->addElement('text', $id, $label, $aso_attributs);
$id = 'gm_contributeur';
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++, 'rows' => 2, 'cols' => 45);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_CONTRIBUTEUR.'</label>';
$form->addElement('textarea', $id, $label, $aso_attributs);
$id = 'gm_editeur';
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++, 'size' => 35, 'maxlength' => 65000);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_EDITEUR.'</label>';
$form->addElement('text', $id, $label, $aso_attributs);
$id = 'gm_date_creation';
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++, 'size' => 19, 'maxlength' => 19);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_DATE_CREATION.'</label>';
$form->addElement('text', $id, $label, $aso_attributs);
$id = 'gm_date_debut_validite';
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++, 'size' => 19, 'maxlength' => 19);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_DATE_VALIDITE_DEBUT.'</label>';
$form->addElement('text', $id, $label, $aso_attributs);
$id = 'gm_date_fin_validite';
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++, 'size' => 19, 'maxlength' => 19);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_DATE_VALIDITE_FIN.'</label>';
$form->addElement('text', $id, $label, $aso_attributs);
$id = 'gm_date_copyright';
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++, 'size' => 19, 'maxlength' => 19);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_DATE_COPYRIGHT.'</label>';
$form->addElement('text', $id, $label, $aso_attributs);
$id = 'gm_licence';
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++, 'size' => 35, 'maxlength' => 255);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_URL_LICENCE.'</label>';
$form->addElement('text', $id, $label, $aso_attributs);
$id = 'gm_categorie';
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++, 'size' => 35, 'maxlength' => 100);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_CATEGORIE.'</label>';
$form->addElement('text', $id, $label, $aso_attributs);
$id = 'gm_public';
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++, 'size' => 35, 'maxlength' => 255);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_PUBLIC.'</label>';
$form->addElement('text', $id, $label, $aso_attributs);
$id = 'gm_public_niveau';
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++, 'size' => 25, 'maxlength' => 45);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_PUBLIC_NIVEAU.'</label>';
$form->addElement('text', $id, $label, $aso_attributs);
$id = 'gm_ce_type_portee_spatiale';
$aso_options = array( '' => ADME_LG_FORM_MENU_ZG_VIDE,
'iso3166' => ADME_LG_FORM_MENU_ZG_ISO,
'Point' => ADME_LG_FORM_MENU_ZG_POINT,
'Box' => ADME_LG_FORM_MENU_ZG_DC,
'TGN' => ADME_LG_FORM_MENU_ZG_GTGN);
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_ZG_TYPE.'</label>';
$form->addElement('select', $id, $label, $aso_options, $aso_attributs);
$id = 'gm_portee_spatiale';
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++, 'size' => 35, 'maxlength' => 100);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_ZG_VALEUR.'</label>';
$form->addElement('text', $id, $label, $aso_attributs);
$id = 'gm_ce_type_portee_temporelle';
$aso_options = array( '' => ADME_LG_FORM_MENU_TMP_VIDE,
'W3CDTF' => ADME_LG_FORM_MENU_TMP_W3C,
'Period' => ADME_LG_FORM_MENU_TMP_DC);
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_TMP_TYPE.'</label>';
$form->addElement('select', $id, $label, $aso_options, $aso_attributs);
$id = 'gm_portee_temporelle';
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++, 'size' => 35, 'maxlength' => 100);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_TMP_VALEUR.'</label>';
$form->addElement('text', $id, $label, $aso_attributs);
// Requete pour connaitre les informations sur l'administrateur ayant fait la dernière modif
if (!isset($aso_valeurs[ADME_LG_ACTION_CLASSIQUE_VERIFIER]) && !isset($aso_valeurs[ADME_LG_ACTION_CLASSIQUE_VERIFIER_TRADUCTION])) {
$requete_admin = 'SELECT * '.
'FROM gen_annuaire '.
'WHERE ga_id_administrateur = '.$aso_valeurs['gm_ce_admin'];
$resultat_admin = $db->query($requete_admin);
if (DB::isError($resultat_admin)) {
die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_admin->getMessage(), $requete_admin));
}
$ligne_admin = $resultat_admin->fetchRow(DB_FETCHMODE_OBJECT);
$info_admin = '<p class="info">Dernière modification par '.$ligne_admin->ga_prenom.' '.$ligne_admin->ga_nom.'</p>';
$form->addElement('html', $info_admin);
}
//fin de la div cachée pour les options compliquées-------------------------------------------------
$form->addElement('html', "\n".'</fieldset>'."\n".'</div>');
$buttons[] = &HTML_QuickForm::createElement('link', 'annuler', ADME_LG_FORM_MENU_ANNULER,
str_replace ("&amp;", "&", $url->getURL()), ADME_LG_FORM_MENU_ANNULER); // Le preg_replace contourne un pb de QuickForm et Net_URL
// qui remplacent deux fois les & par des &amp;
//Bouton de validation du formulaire
if ($traduction) {
$buttons[] = &HTML_QuickForm::createElement('submit', ADME_LG_ACTION_CLASSIQUE_VERIFIER_TRADUCTION, ADME_LG_FORM_MENU_VALIDER);
$form->addElement('hidden', 'adme_site_id', $adme_site_id);
}
else {
$buttons[] = &HTML_QuickForm::createElement('submit', ADME_LG_ACTION_CLASSIQUE_VERIFIER, ADME_LG_FORM_MENU_VALIDER);
}
$form->addGroup($buttons, 'form_boutons', null, '&nbsp;');
$form->addElement('hidden', 'gm_id_menu', $aso_valeurs['gm_id_menu']);
// Instanciation avec les valeur par défaut
$form->setDefaults($aso_valeurs);
$retour .= $form->toHTML()."\n";
return $retour;
}
 
/** Fonction ADME_validerFormAjouterMenuClassique() - Valide les données issues du formulaire pour gen_menu.
*
* Cette fonction valide les données à ajouter dans la table gen_menu.
*
* @param PEAR::DB l'objet pear de connexion à la base de données.
* @param string le tableau contenant les valeurs du formulaire.
* @return string retourne les messages d'erreurs sinon rien.
*/
function ADME_validerFormAjouterMenuClassique($db, $aso_valeurs)
{
$message = '';
if ($aso_valeurs['gm_code_alpha'] == '') {
$message .= '<p class="pap_erreur">'.ADME_LG_FORM_MENU_REGLE_CODE_ALPHA.'</p>';
}
if ($aso_valeurs['gm_code_num'] == '') {
$message .= '<p class="pap_erreur">'.ADME_LG_FORM_MENU_REGLE_CODE_NUM.'</p>';
}
if ($aso_valeurs['gm_nom'] == '') {
$message .= '<p class="pap_erreur">'.ADME_LG_FORM_MENU_REGLE_NOM.'</p>';
}
if ($aso_valeurs['gm_description_resume'] == '') {
$message .= '<p class="pap_erreur">'.ADME_LG_FORM_MENU_REGLE_INFO_BULLE.'</p>';
}
return $message;
}
 
 
/** Fonction ADME_validerFormTraduireMenuClassique() - Valide les données issues du formulaire de traduction de menu
*
* Cette fonction valide les données à ajouter dans la table gen_menu.
*
* @param PEAR::DB l'objet pear de connexion à la base de données.
* @param string le tableau contenant les valeurs du formulaire.
* @return string retourne les messages d'erreurs sinon rien.
*/
function ADME_validerFormTraduireMenuClassique($db, $aso_valeurs)
{
$message = '';
if ($aso_valeurs['gm_code_alpha'] == '') {
$message .= '<p class="pap_erreur">'.ADME_LG_FORM_MENU_REGLE_CODE_ALPHA.'</p>';
}
if ($aso_valeurs['gm_code_num'] == '') {
$message .= '<p class="pap_erreur">'.ADME_LG_FORM_MENU_REGLE_CODE_NUM.'</p>';
}
if ($aso_valeurs['gm_nom'] == '') {
$message .= '<p class="pap_erreur">'.ADME_LG_FORM_MENU_REGLE_NOM.'</p>';
}
if ($aso_valeurs['gm_description_resume'] == '') {
$message .= '<p class="pap_erreur">'.ADME_LG_FORM_MENU_REGLE_INFO_BULLE.'</p>';
}
return $message;
}
 
 
 
/** Fonction ADME_modifierMenuClassique() - Met à jour les infos d'un menu classique
*
* Fonction modifiant un menu commun à Papyrus.
* Ancien nom : commitUpdateLevel()
*
* @param object objet Pear de connection à la base de données.
* @param object objet Pear représentant l'authentification.
* @param integer l'identifiant du menu à administrer.
* @param array le tableau des valeurs à modifier.
* @return void les changement sont fait dans la base de données.
*/
function ADME_modifierMenuClassique($db, $auth, $adme_menu_id, $aso_valeurs)
{
$requete = 'UPDATE gen_menu SET '.
'gm_ce_application = '.$aso_valeurs['gm_ce_application'].', '.
'gm_application_arguments = "'.$aso_valeurs['gm_application_arguments'].'", '.
'gm_fichier_squelette = "'.$aso_valeurs['gm_fichier_squelette'].'", '.
'gm_code_num = '.$aso_valeurs['gm_code_num'].', '.
'gm_code_alpha = "'.$aso_valeurs['gm_code_alpha'].'", '.
'gm_nom = "'.$aso_valeurs['gm_nom'].'", '.
'gm_raccourci_clavier = "'.$aso_valeurs['gm_raccourci_clavier'].'", '.
'gm_robot = "'.$aso_valeurs['gm_robot'].'", '.
'gm_titre = "'.$aso_valeurs['gm_titre'].'", '.
'gm_titre_alternatif = "'.$aso_valeurs['gm_titre_alternatif'].'", '.
'gm_mots_cles = "'.$aso_valeurs['gm_mots_cles'].'", '.
'gm_description_libre = "'.$aso_valeurs['gm_description_libre'].'", '.
'gm_description_resume = "'.$aso_valeurs['gm_description_resume'].'", '.
'gm_description_table_matieres = "'.$aso_valeurs['gm_description_table_matieres'].'", '.
'gm_source = "'.$aso_valeurs['gm_source'].'", '.
'gm_auteur = "'.$aso_valeurs['gm_auteur'].'", '.
'gm_contributeur = "'.$aso_valeurs['gm_contributeur'].'", '.
'gm_editeur = "'.$aso_valeurs['gm_editeur'].'", '.
'gm_date_creation = "'.$aso_valeurs['gm_date_creation'].'", '.
'gm_date_debut_validite = "'.$aso_valeurs['gm_date_debut_validite'].'", '.
'gm_date_fin_validite = "'.$aso_valeurs['gm_date_fin_validite'].'", '.
'gm_date_copyright = "'.$aso_valeurs['gm_date_copyright'].'", '.
'gm_licence = "'.$aso_valeurs['gm_licence'].'", '.
'gm_categorie = "'.$aso_valeurs['gm_categorie'].'", '.
'gm_public = "'.$aso_valeurs['gm_public'].'", '.
'gm_public_niveau = "'.$aso_valeurs['gm_public_niveau'].'", '.
'gm_ce_type_portee_spatiale = "'.$aso_valeurs['gm_ce_type_portee_spatiale'].'", '.
'gm_portee_spatiale = "'.$aso_valeurs['gm_portee_spatiale'].'", '.
'gm_ce_type_portee_temporelle = "'.$aso_valeurs['gm_ce_type_portee_temporelle'].'", '.
'gm_portee_temporelle = "'.$aso_valeurs['gm_portee_temporelle'].'", '.
'gm_ce_admin = "'.$auth->getAuthData('ga_id_administrateur').'" '.
'WHERE gm_id_menu = '.$adme_menu_id;
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
// Gestion de la relation menu par défaut
if (isset($aso_valeurs['defaut']) && $aso_valeurs['defaut'] == 1) {
$requete_id_menu_supr_defaut = 'SELECT GM01.gm_id_menu AS id_menu_supr_defaut '.
'FROM gen_menu AS GM01, gen_menu AS GM02, gen_menu_relation '.
'WHERE GM02.gm_id_menu = '.$adme_menu_id.' '.
'AND GM02.gm_ce_site = GM01.gm_ce_site '.
'AND GM01.gm_id_menu = gmr_id_menu_01 '.
'AND gmr_id_valeur = 101 ';// 101 = menu par "defaut"
$resultat_menu_supr_defaut = $db->query($requete_id_menu_supr_defaut);
if (DB::isError($resultat_menu_supr_defaut)) {
die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_menu_supr_defaut->getMessage(), $requete_id_menu_supr_defaut));
}
$ligne_menu_supr_defaut = $resultat_menu_supr_defaut->fetchRow(DB_FETCHMODE_OBJECT);
if ($resultat_menu_supr_defaut->numRows() > 0 ) {
$requete_supr_defaut = 'DELETE FROM gen_menu_relation '.
'WHERE gmr_id_menu_01 = gmr_id_menu_02 '.
'AND gmr_id_valeur = 101 '.// 101 = menu par "defaut"
'AND gmr_id_menu_01 = '.$ligne_menu_supr_defaut->id_menu_supr_defaut;
$resultat_supr_defaut = $db->query($requete_supr_defaut);
if (DB::isError($resultat_supr_defaut)) {
die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_supr_defaut->getMessage(), $requete_supr_defaut));
}
}
$resultat_menu_supr_defaut->free();
// Requete d'insertion de la relation menu par défaut
$requete = 'INSERT INTO gen_menu_relation '.
'SET gmr_id_menu_01 = '.$adme_menu_id.', '.
'gmr_id_menu_02 = '.$adme_menu_id.', '.
'gmr_id_valeur = 101, '.
'gmr_ordre = NULL ';
$resultat = $db->query($requete);
if (DB::isError($resultat)) {
die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete));
}
}
}
 
/** Fonction ADME_deplacerMenuClassique() - Permet de déplacer un menu dans la hiérarchie.
*
* Permet de déplacer un menu dans la hiérarchie des menus classiques.
* Ancien nom : moveMenu()
*
* @param mixed objet Pear DB de connexion à la base de données.
* @param integer identifiant du site administré.
* @param integer identifiant du menu à déplacer.
* @param boolean indique si on veut monter le menu (true) ou le descendre (false).
* @return void modifie la base de données.
*/
function ADME_deplacerMenuClassique($db, $adme_site_id, $adme_menu_id, $bln_monter)
{
//-------------------------------------------------------------------------------------------------------------------
// Récupération d'information sur le site de ce menu.
$objet_site = GEN_lireInfoSitePrincipal($db, $adme_site_id);
if ($objet_site == false) {
die('ERREUR Papyrus Administrateur de Menus : '.ADME_LG_ERREUR_INFO_SITE.'<br />'.
'Id du site : '. $adme_site_id .'<br />'.
'Ligne n° : '. __LINE__ .'<br />'.
'Fichier n° : '. __FILE__ .'<br />');
}
//-------------------------------------------------------------------------------------------------------------------
// Récupération d'informations sur les relations du menu courant.
$ligne_menu_courant_relation = GEN_lireInfoMenuRelation($db, $adme_menu_id, '1');
if ($ligne_menu_courant_relation == false) {
die('ERREUR Papyrus Administrateur de Menus : '.ADME_LG_ERREUR_INFO_MENU_RELATION.'<br />'.
'Identifiant menu : '. $adme_menu_id .'<br />'.
'Identifiant valeur relation : 1 <br />'.
'Ligne n° : '. __LINE__ .'<br />'.
'Fichier n° : '. __FILE__ .'<br />');
}
//-------------------------------------------------------------------------------------------------------------------
// Récupération de l'identifiant du menu pére
$id_pere = GEN_lireIdentifiantMenuPere($adme_menu_id);
if ($id_pere === false) {
die('ERREUR Papyrus Administrateur de Menus : '.ADME_LG_ERREUR_ID_MENU_PERE.'<br />'.
'Identifiant menu fils : '. $adme_menu_id .'<br />'.
'Ligne n° : '. __LINE__ .'<br />'.
'Fichier n° : '. __FILE__ .'<br />');
}
//-------------------------------------------------------------------------------------------------------------------
// Recherche d'information sur le menu précédent ou suivant le menu courant
$requete = 'SELECT GMR01.gmr_ordre AS nouvel_ordre, GMR01.gmr_id_menu_01 AS id_menu_remplace '.
'FROM gen_menu, gen_menu_relation AS GMR01, gen_menu_relation AS GMR02 '.
'WHERE GMR02.gmr_id_menu_01 = GMR01.gmr_id_menu_01 '.
'AND GMR01.gmr_id_menu_01 = gm_id_menu './/jonction avec la table GEN_MENU
'AND gm_ce_site = '.$objet_site->gs_id_site.' '.
'AND GMR02.gmr_id_valeur = 100 '.// 100 = menu type "classique"
'AND GMR01.gmr_id_menu_02 = '.$id_pere.' '.
'AND GMR01.gmr_id_valeur = 1 ';// 1 = relation menu "père"
if ($bln_monter) {
$requete .= 'AND GMR01.gmr_ordre < '.$ligne_menu_courant_relation->gmr_ordre.' '.
'ORDER BY GMR01.gmr_ordre DESC';
} else {
$requete .= 'AND GMR01.gmr_ordre > '.$ligne_menu_courant_relation->gmr_ordre.' '.
'ORDER BY GMR01.gmr_ordre ASC';
}
$resultat_menu = $db->query($requete);
(DB::isError($resultat_menu)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_menu->getMessage(), $requete)) : '';
$ligne_menu = $resultat_menu->fetchRow(DB_FETCHMODE_OBJECT);
$resultat_menu->free();
//-------------------------------------------------------------------------------------------------------------------
// Si la requete ne retourne rien nous ne faisons rien.
if (! $ligne_menu) {
return null;
}
//-------------------------------------------------------------------------------------------------------------------
// Mise à jour des relations du menu courant
$requete = 'UPDATE gen_menu_relation SET '.
'gmr_ordre = '.$ligne_menu->nouvel_ordre.' '.
'WHERE gmr_id_menu_01 = '.$ligne_menu_courant_relation->gmr_id_menu_01.' '.
'AND gmr_id_valeur = 1';// 1 = relation menu "père"
$resultat_update = $db->query($requete);
(DB::isError($resultat_update)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_update->getMessage(), $requete)) : '';
//-------------------------------------------------------------------------------------------------------------------
// Mise à jour des relations du menu précédent ou suivant
$requete = 'UPDATE gen_menu_relation SET '.
'gmr_ordre = '.$ligne_menu_courant_relation->gmr_ordre.' '.
'WHERE gmr_id_menu_01 = '.$ligne_menu->id_menu_remplace.' '.
'AND gmr_id_valeur = 1';// 1 = relation menu "père"
$resultat_update = $db->query($requete);
(DB::isError($resultat_update)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_update->getMessage(), $requete)) : '';
}
 
 
/** Fonction ADME_traduireMenuClassique() - Permet de traduire un menu classique
*
* Permet de traduire un menu classique
*
* @param mixed objet Pear DB de connexion à la base de données.
* @param integer identifiant du site administré.
* @param integer identifiant du menu à déplacer.
* @return void modifie la base de données.
*/
function ADME_traduireMenuClassique($db, $auth, $adme_menu_id, $aso_valeurs) {
 
// Récupération d'infos sur le site principal.
$objet_site = GEN_lireInfoSitePrincipal($db, $aso_valeurs['adme_site_id']);
if ($objet_site == false) {
die('ERREUR Génésia Administrateur de Menus : impossible de lire les infos du site.<br />'.
'ID du site : '.$aso_valeurs['adme_site_id'].'<br />'.
'Ligne n° : '. __LINE__ .'<br />'.
'Fichier n° : '. __FILE__ .'<br />');
}
$nouveau_id_menu = SQL_obtenirNouveauId($db, 'gen_menu', 'gm_id_menu');
$auteur = $auth->getAuthData('ga_prenom').' '.$auth->getAuthData('ga_nom');
$requete = 'INSERT INTO gen_menu '.
'SET gm_id_menu = '.$nouveau_id_menu.', '.
'gm_ce_site = '.$aso_valeurs['adme_site_id'].', '.
'gm_ce_i18n = "'.$aso_valeurs['gs_ce_i18n'].'", '.
'gm_ce_application = '.$aso_valeurs['gm_ce_application'].', '.
'gm_application_arguments = "'.$aso_valeurs['gm_application_arguments'].'", '.
'gm_fichier_squelette = "'.$aso_valeurs['gm_fichier_squelette'].'", '.
'gm_code_num = '.$aso_valeurs['gm_code_num'].', '.
'gm_code_alpha = "'.$aso_valeurs['gm_code_alpha'].'", '.
'gm_nom = "'.$aso_valeurs['gm_nom'].'", '.
'gm_raccourci_clavier = "'.$aso_valeurs['gm_raccourci_clavier'].'", '.
'gm_robot = "'.$aso_valeurs['gm_robot'].'", '.
'gm_titre = "'.$aso_valeurs['gm_titre'].'", '.
'gm_titre_alternatif = "'.$aso_valeurs['gm_titre_alternatif'].'", '.
'gm_mots_cles = "'.$aso_valeurs['gm_mots_cles'].'", '.
'gm_description_libre = "'.$aso_valeurs['gm_description_libre'].'", '.
'gm_description_resume = "'.$aso_valeurs['gm_description_resume'].'", '.
'gm_description_table_matieres = "'.$aso_valeurs['gm_description_table_matieres'].'", '.
'gm_source = "'.$aso_valeurs['gm_source'].'", '.
'gm_auteur = "'.$aso_valeurs['gm_auteur'].'", '.
'gm_contributeur = "'.$aso_valeurs['gm_contributeur'].'", '.
'gm_editeur = "'.$aso_valeurs['gm_editeur'].'", '.
'gm_date_creation = "'.$aso_valeurs['gm_date_creation'].'", '.
'gm_date_debut_validite = "'.$aso_valeurs['gm_date_debut_validite'].'", '.
'gm_date_fin_validite = "'.$aso_valeurs['gm_date_fin_validite'].'", '.
'gm_date_copyright = "'.$aso_valeurs['gm_date_copyright'].'", '.
'gm_licence = "'.$aso_valeurs['gm_licence'].'", '.
'gm_categorie = "'.$aso_valeurs['gm_categorie'].'", '.
'gm_public = "'.$aso_valeurs['gm_public'].'", '.
'gm_public_niveau = "'.$aso_valeurs['gm_public_niveau'].'", '.
'gm_ce_type_portee_spatiale = "'.$aso_valeurs['gm_ce_type_portee_spatiale'].'", '.
'gm_portee_spatiale = "'.$aso_valeurs['gm_portee_spatiale'].'", '.
'gm_ce_type_portee_temporelle = "'.$aso_valeurs['gm_ce_type_portee_temporelle'].'", '.
'gm_portee_temporelle = "'.$aso_valeurs['gm_portee_temporelle'].'", '.
'gm_ce_admin = "'.$auth->getAuthData('ga_id_administrateur').'" ';
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
//----------------------------------------------------------------------------
// Ajout de la relation traduction
if (!isset($adme_menu_id) && empty($adme_menu_id)) {
$adme_menu_id = 0 ;// Identifiant du père
}
//----------------------------------------------------------------------------
// Récupération d'infos sur la hierarchie du menu
$requete = 'SELECT GMR01.gmr_ordre '.
'FROM gen_menu_relation AS GMR01, gen_menu_relation AS GMR02 '.
'WHERE GMR01.gmr_id_menu_02 = '.$adme_menu_id.' '.
'AND GMR01.gmr_id_valeur = 1 '.// 1 = avoir "père"
'AND GMR02.gmr_id_menu_01 = GMR01.gmr_id_menu_01 '.
'AND GMR02.gmr_id_menu_01 = GMR02.gmr_id_menu_02 '.
'AND GMR02.gmr_id_valeur = 100 '.// 100 = menu type "classique"
'ORDER BY GMR01.gmr_ordre DESC';
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
$ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
$nouveau_ordre_menu = $ligne->gmr_ordre + 1;
$resultat->free();
// Traduction :
$requete = 'INSERT INTO gen_menu_relation '.
'SET gmr_id_menu_01 = '.$adme_menu_id.', '.
'gmr_id_menu_02 = '.$nouveau_id_menu.', '.
'gmr_id_valeur = 2, '. // Avoir traduction
'gmr_ordre = '.$nouveau_ordre_menu;
 
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
//----------------------------------------------------------------------------
// Ajout de la relation-type "menu classique"
// Récupération d'infos sur la hierarchie du menu
$requete = 'SELECT * '.
'FROM gen_menu_relation, gen_menu '.
'WHERE gmr_id_menu_02 = gmr_id_menu_01 '.
'AND gmr_id_valeur = 100 '.// 100 = type menu "classique"
'AND gmr_id_menu_01 = gm_id_menu '.
'AND gm_ce_site = '.$aso_valeurs['adme_site_id'].' '.
'ORDER BY gmr_ordre DESC';
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
$ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
$nouveau_ordre_menu_classique = $ligne->gmr_ordre + 1;
$resultat->free();
$requete = 'INSERT INTO gen_menu_relation '.
'SET gmr_id_menu_01 = '.$nouveau_id_menu.', '.
'gmr_id_menu_02 = '.$nouveau_id_menu.', '.
'gmr_id_valeur = 100, '.
'gmr_ordre = '.$nouveau_ordre_menu_classique;
$result = $db->query($requete);
(DB::isError($result)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $result->getMessage(), $requete)) : '';
}
 
/** Fonction ADME_indenterMenuClassique() - Permet d'augmenter ou diminuer l'indentation d'un menu dans la
* hierarchie
*
* Permet d'augmenter ou diminuer l'indentation d'un menu dans la hierarchie
*
* @param mixed objet Pear DB de connexion à la base de données.
* @param integer identifiant du site administré.
* @param integer identifiant du menu à déplacer.
* @param boolean indique si on veut diminuer (gauche) l'indentation (true) ou augmenter (droite) l'indentation (false).
* @return void modifie la base de données.
*/
function ADME_indenterMenuClassique($db, $adme_site_id, $adme_menu_id, $bln_diminuer) {
 
//-------------------------------------------------------------------------------------------------------------------
// Récupération d'information sur le site de ce menu.
$objet_site = GEN_lireInfoSitePrincipal($db, $adme_site_id);
if ($objet_site == false) {
die('ERREUR Papyrus Administrateur de Menus : '.ADME_LG_ERREUR_INFO_SITE.'<br />'.
'Id du site : '. $adme_site_id .'<br />'.
'Ligne n° : '. __LINE__ .'<br />'.
'Fichier n° : '. __FILE__ .'<br />');
}
//-------------------------------------------------------------------------------------------------------------------
// Récupération d'informations sur les relations du menu courant.
$ligne_menu_courant_relation = GEN_lireInfoMenuRelation($db, $adme_menu_id, '1');
if ($ligne_menu_courant_relation == false) {
die('ERREUR Papyrus Administrateur de Menus : '.ADME_LG_ERREUR_INFO_MENU_RELATION.'<br />'.
'Identifiant menu : '. $adme_menu_id .'<br />'.
'Identifiant valeur relation : 1 <br />'.
'Ligne n° : '. __LINE__ .'<br />'.
'Fichier n° : '. __FILE__ .'<br />');
}
//-------------------------------------------------------------------------------------------------------------------
// Récupération de l'identifiant du menu pére
$id_pere = GEN_lireIdentifiantMenuPere($adme_menu_id);
if ($id_pere === false) {
die('ERREUR Papyrus Administrateur de Menus : '.ADME_LG_ERREUR_ID_MENU_PERE.'<br />'.
'Identifiant menu fils : '. $adme_menu_id .'<br />'.
'Ligne n° : '. __LINE__ .'<br />'.
'Fichier n° : '. __FILE__ .'<br />');
}
if ($bln_diminuer) {
// Diminution d'un niveau
if ($id_pere) {
// Récupération de l'identifiant du menu grand pére, sera le nouveau pere
$id_grand_pere = GEN_lireIdentifiantMenuPere($id_pere);
if ($id_grand_pere === false) {
die('ERREUR Papyrus Administrateur de Menus : '.ADME_LG_ERREUR_ID_MENU_PERE.'<br />'.
'Identifiant menu fils : '. $adme_menu_id .'<br />'.
'Ligne n° : '. __LINE__ .'<br />'.
'Fichier n° : '. __FILE__ .'<br />');
}
// Récupération d'informations sur les relations du menu pere
$ligne_menu_pere_relation = GEN_lireInfoMenuRelation($db, $id_pere, '1');
if ($ligne_menu_pere_relation == false) {
die('ERREUR Papyrus Administrateur de Menus : '.ADME_LG_ERREUR_INFO_MENU_RELATION.'<br />'.
'Identifiant menu : '. $adme_menu_id .'<br />'.
'Identifiant valeur relation : 1 <br />'.
'Ligne n° : '. __LINE__ .'<br />'.
'Fichier n° : '. __FILE__ .'<br />');
}
//-------------------------------------------------------------------------------------------------------------------
// Recherche d'information sur le menu suivant le menu pere
//-------------------------------------------------------------------------------------------------------------------
$requete = 'SELECT GMR01.gmr_ordre AS nouvel_ordre, GMR01.gmr_id_menu_01 AS id_menu_remplace '.
'FROM gen_menu, gen_menu_relation AS GMR01, gen_menu_relation AS GMR02 '.
'WHERE GMR02.gmr_id_menu_01 = GMR01.gmr_id_menu_01 '.
'AND GMR01.gmr_id_menu_01 = gm_id_menu './/jonction avec la table GEN_MENU
'AND gm_ce_site = '.$objet_site->gs_id_site.' '.
'AND GMR02.gmr_id_valeur = 100 '.// 100 = menu type "classique"
'AND GMR01.gmr_id_menu_02 = '.$id_grand_pere.' '.
'AND GMR01.gmr_id_valeur = 1 '.// 1 = relation menu "père"
'AND GMR01.gmr_ordre > '.$ligne_menu_pere_relation->gmr_ordre.' '.
'ORDER BY GMR01.gmr_ordre DESC';
$resultat_menu = $db->query($requete);
(DB::isError($resultat_menu)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_menu->getMessage(), $requete)) : '';
$ligne_menu = $resultat_menu->fetchRow(DB_FETCHMODE_OBJECT);
$resultat_menu->free();
//-------------------------------------------------------------------------------------------------------------------
// Si la requete ne retourne rien nous ne faisons rien.
if (! $ligne_menu) {
$no=$ligne_menu_pere_relation->gmr_ordre+1;
}
else {
$no=$ligne_menu->nouvel_ordre+1;
}
// Mise à jour pere menu courant
$requete = 'UPDATE gen_menu_relation SET '.
'gmr_id_menu_02 = '.$id_grand_pere.' ,'.
'gmr_ordre = '.$no.' '.
'WHERE gmr_id_menu_01 = '.$ligne_menu_courant_relation->gmr_id_menu_01.' '.
'AND gmr_id_valeur = 1';// 1 = relation menu "père"
$resultat_update = $db->query($requete);
(DB::isError($resultat_update)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_update->getMessage(), $requete)) : '';
}
}
else {
 
$requete = 'SELECT GMR01.gmr_id_menu_01 '.
'FROM gen_menu, gen_menu_relation AS GMR01, gen_menu_relation AS GMR02 '.
'WHERE GMR02.gmr_id_menu_01 = GMR01.gmr_id_menu_01 '.
'AND GMR01.gmr_id_menu_01 = gm_id_menu './/jonction avec la table GEN_MENU
'AND gm_ce_site = '.$objet_site->gs_id_site.' '.
'AND GMR02.gmr_id_valeur = 100 '.// 100 = menu type "classique"
'AND GMR01.gmr_id_menu_02 = '.$id_pere.' '.
'AND GMR01.gmr_id_valeur = 1 '.// 1 = relation menu "père"
'AND GMR01.gmr_ordre < '.$ligne_menu_courant_relation->gmr_ordre.' '.
'ORDER BY GMR01.gmr_ordre DESC';
$resultat_menu = $db->query($requete);
(DB::isError($resultat_menu)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_menu->getMessage(), $requete)) : '';
 
$ligne_menu = $resultat_menu->fetchRow(DB_FETCHMODE_OBJECT);
$resultat_menu->free();
//-------------------------------------------------------------------------------------------------------------------
// Si la requete ne retourne rien nous ne faisons rien.
if (! $ligne_menu) {
return null;
}
//----------------------------------------------------------------------------
// Recherche dernier fils
$requete = 'SELECT GMR01.gmr_ordre '.
'FROM gen_menu_relation AS GMR01, gen_menu_relation AS GMR02 '.
'WHERE GMR01.gmr_id_menu_02 = '.$ligne_menu->gmr_id_menu_01.' '.
'AND GMR01.gmr_id_valeur = 1 '.// 1 = avoir "père"
'AND GMR02.gmr_id_menu_01 = GMR01.gmr_id_menu_01 '.
'AND GMR02.gmr_id_menu_01 = GMR02.gmr_id_menu_02 '.
'AND GMR02.gmr_id_valeur = 100 '.// 100 = menu type "classique"
'ORDER BY GMR01.gmr_ordre DESC';
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
 
$ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
$resultat->free();
 
if (isset($ligne)) {
$no = $ligne->gmr_ordre + 1;
}
else {
$no = 1;
}
// Mise à jour pere menu courant
$requete = 'UPDATE gen_menu_relation SET '.
'gmr_id_menu_02 = '.$ligne_menu->gmr_id_menu_01.' ,'.
'gmr_ordre = '.$no.' '.
'WHERE gmr_id_menu_01 = '.$ligne_menu_courant_relation->gmr_id_menu_01.' '.
'AND gmr_id_valeur = 1';// 1 = relation menu "père"
$resultat_update = $db->query($requete);
(DB::isError($resultat_update)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_update->getMessage(), $requete)) : '';
}
}
 
 
/** Fonction ADME_supprimerMenuClassique() - Supprime un menu classique.
*
* Supprime de la base de données de Papyrus toutes les traces du menu classiques
* passé en paramètre.
* Ancien nom : deleteMenu()
*
* @param mixed l'objet Pear DB de connexion à la base de données.
* @param integer l'identifiant du site du menu à supprimer
* @param integer l'identifiant du menu à supprimer
* @return void le menu classique est supprimé de la base de données.
*/
function ADME_supprimerMenuClassique($db, $adme_id_site, $id_menu_a_supprimer)
{
$code_menu = GEN_lireInfoMenu($db, $id_menu_a_supprimer, DB_FETCHMODE_ASSOC);
//----------------------------------------------------------------------------
// Y a t'il des sous_menus
$requete = 'SELECT COUNT(gm_id_menu) AS compte '.
'FROM gen_menu, gen_menu_relation '.
'WHERE gmr_id_menu_02 = '.$id_menu_a_supprimer.' '.
'AND gmr_id_valeur = 1 '.
'AND gmr_id_menu_01 = gm_id_menu ';
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
$ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
if ($ligne && ($ligne->compte > 0)) {
return ADME_LG_ERREUR_EXISTE_SOUS_MENU;
}
//-------------------------------------------------------------------------------------------------------------------
// Mise à jour de l'ordre des menus
$ligne_menu_supr_relation = GEN_lireInfoMenuRelation($db, $id_menu_a_supprimer, '1'); // 1 = relation "avoir père"
$requete = 'SELECT GMR01.gmr_id_menu_01, GMR01.gmr_ordre '.
'FROM gen_menu, gen_menu_relation AS GMR01, gen_menu_relation AS GMR02 '.
'WHERE GMR02.gmr_id_menu_01 = GMR01.gmr_id_menu_01 '.
'AND GMR01.gmr_id_menu_01 = gm_id_menu './/jonction avec la table GEN_MENU
'AND gm_ce_site = '.$adme_id_site.' '.// le site du menu!
'AND GMR02.gmr_id_valeur = 100 '.// 100 = menu type "classique"
'AND GMR01.gmr_id_menu_02 = '.$ligne_menu_supr_relation->gmr_id_menu_02.' '.
'AND GMR01.gmr_id_valeur = 1 '.// 1 = relation menu "père"
'AND GMR01.gmr_ordre > '.$ligne_menu_supr_relation->gmr_ordre.' '.
'ORDER BY GMR01.gmr_ordre ASC';
$resultat = $db->query($requete);
while ($ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT)) {
// Mise à jour des relations hiérarchiques du menu courant
$requete_maj = 'UPDATE gen_menu_relation SET '.
'gmr_ordre = '.($ligne->gmr_ordre - 1).' '.
'WHERE gmr_id_menu_01 = '.$ligne->gmr_id_menu_01.' '.
'AND gmr_id_valeur = 1';// 1 = relation menu "père"
$resultat_maj = $db->query($requete_maj);
(DB::isError($resultat_maj)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_maj->getMessage(), $requete_maj)) : '';
}
$resultat->free();
//----------------------------------------------------------------------------
// S'il n'y a plus de sous niveau, on supprime le menu
$requete = 'DELETE FROM gen_menu '.
'WHERE gm_id_menu = '.$id_menu_a_supprimer;
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
//----------------------------------------------------------------------------
// Puis on supprime les relations de ce menu
$requete = 'DELETE FROM gen_menu_relation '.
'WHERE gmr_id_menu_01 = '.$id_menu_a_supprimer;
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
// Suppression du contenu !!!!
$requete = 'DELETE FROM gen_menu_contenu '.
'WHERE gmc_ce_menu= '.$id_menu_a_supprimer.' ';
 
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
}
 
/** Fonction ADME_supprimerMenuClassiqueTraduction() - Supprime une traduction de menu classique.
*
* Supprime de la base de données de Papyrus toutes les traces du menu classiques
* passé en paramètre.
* Ancien nom : deleteMenu()
*
* @param mixed l'objet Pear DB de connexion à la base de données.
* @param integer l'identifiant du site du menu à supprimer
* @param integer l'identifiant du menu à supprimer
* @return void le menu classique est supprimé de la base de données.
*/
function ADME_supprimerMenuClassiqueTraduction($db, $adme_id_site, $id_menu_a_supprimer)
{
$code_menu = GEN_lireInfoMenu($db, $id_menu_a_supprimer, DB_FETCHMODE_ASSOC);
if ($code_menu === false) {
die('ERREUR Papyrus Administrateur de Menus : '.ADME_LG_ERREUR_INFO_MENU.'<br />'.
'Idenitifiant du menu n° : '. $id_menu_a_supprimer .'<br />'.
'Ligne n° : '. __LINE__ .'<br />'.
'Fichier n° : '. __FILE__ .'<br />');
}
$requete = 'DELETE FROM gen_menu '.
'WHERE gm_id_menu = '.$id_menu_a_supprimer;
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
//----------------------------------------------------------------------------
// Puis on supprime les relations de ce menu
$requete = 'DELETE FROM gen_menu_relation '.
'WHERE gmr_id_menu_01 = '.$id_menu_a_supprimer;
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
//----------------------------------------------------------------------------
// Puis on supprime les relations de ce menu
$requete = 'DELETE FROM gen_menu_relation '.
'WHERE gmr_id_menu_02 = '.$id_menu_a_supprimer;
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
// Suppression du contenu !!!!
$requete = 'DELETE FROM gen_menu_contenu '.
'WHERE gmc_ce_menu = '.$id_menu_a_supprimer.' ';
 
 
 
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
}
 
function ADME_verifier_traduction_possible($db, $url, $adme_site_id, $adme_menu_id) {
$aso_valeurs = GEN_lireInfoMenu($db, $adme_menu_id, DB_FETCHMODE_ASSOC);
if ($aso_valeurs === false) {
die('ERREUR Papyrus Administrateur de Menus : '.ADME_LG_ERREUR_INFO_MENU.'<br />'.
'Idenitifiant du menu n° : '. $adme_menu_id .'<br />'.
'Ligne n° : '. __LINE__ .'<br />'.
'Fichier n° : '. __FILE__ .'<br />');
}
// Recherche liste des menu deja traduits
$requete = 'SELECT distinct gm_ce_i18n '.
'FROM gen_menu_relation, gen_menu '.
'WHERE gmr_id_menu_01 = ' . $adme_menu_id .' '.
'AND gm_id_menu = gmr_id_menu_02 '.
'AND gmr_id_valeur = 2 '; // 2 = "avoir traduction"
$resultat = $db->query($requete) ;
if (DB::isError($resultat)) {
die( BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete) );
}
$not_in_langue='';
if ( $resultat->numRows() == 0 ) {
$not_in_langue="gi_id_i18n not in('".$aso_valeurs['gm_ce_i18n']."')";
}
else {
while ($ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT)) {
$not_in_langue="'".$ligne->gm_ce_i18n."'".",".$not_in_langue;
$end="'".$ligne->gm_ce_i18n."'";
}
if ($not_in_langue) {
$not_in_langue="'".$aso_valeurs['gm_ce_i18n']."'".",".$not_in_langue;
$not_in_langue=' gi_id_i18n not in('.$not_in_langue.$end.')';
}
else {
$not_in_langue="gi_id_i18n not in('".$aso_valeurs['gm_ce_i18n']."')";
}
}
$requete = "SELECT * FROM gen_i18n where ".$not_in_langue;
 
$resultat = $db->query($requete) ;
if (DB::isError($resultat)) {
die( BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete) );
}
$retour = $resultat->numRows();
$resultat->free();
$message='';
if ($retour == 0) {
$message = '<p class="pap_erreur">Plus de traduction possible pour ce menu </p>';
}
return $message;
}
 
 
 
/** Fonction ADME_selectionnerMenuClassiqueTraduction()() Selection un menu classique comme traduction par defaut
*
*
* @param mixed l'objet Pear DB de connexion à la base de données.
* @param integer l'identifiant du site du menu à supprimer
* @param integer l'identifiant du menu à supprimer
* @return void le menu classique est supprimé de la base de données.
*/
function ADME_selectionnerMenuClassiqueTraduction($db, $adme_id_site, $id_menu)
{
// 1 : Rechercher traduction parente : si presente on est dans une traduc. si absente on
// est dans un menu en version originale
$requete_origine_traduction = 'SELECT gmr_id_menu_01 '.
'FROM gen_menu_relation, gen_menu '.
'WHERE gmr_id_menu_02 = ' . $id_menu .' '.
'AND gmr_id_valeur = 2 '; // 2 = "avoir traduction"
$resultat_origine_traduction = $db->query($requete_origine_traduction) ;
if (DB::isError($resultat_origine_traduction)) {
die( BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete_origine_traduction) );
}
if ($resultat_origine_traduction->numRows() > 0) {
$ligne_origine_traduction = $resultat_origine_traduction->fetchRow(DB_FETCHMODE_OBJECT);
$id_menu_origine=$ligne_origine_traduction->gmr_id_menu_01;
}
else {
$id_menu_origine=$id_menu;
}
 
$requete_suppression = 'DELETE from gen_menu_relation '.
'WHERE gmr_id_menu_01 = ' . $id_menu_origine . ' ' .
'AND gmr_id_valeur=105 '; // 105 Traduction par defaut
 
$resultat_suppression = $db->query($requete_suppression);
(DB::isError($resultat_suppression)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_suppression->getMessage(), $requete_suppression)) : '';
 
$requete_insertion = 'INSERT into gen_menu_relation '.
' SET gmr_id_menu_01 = ' . $id_menu_origine . ', ' .
' gmr_id_menu_02 = ' . $id_menu . ', ' .
' gmr_id_valeur = 105' ;
 
$resultat_insertion = $db->query($requete_insertion);
(DB::isError($resultat_insertion)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_insertion->getMessage(), $requete_insertion)) : '';
 
 
}
 
/** Fonction ADME_limiterMenuClassique() (limiter) un menu classique à la langue selectionne
*
*
* @param mixed l'objet Pear DB de connexion à la base de données.
* @param integer l'identifiant du site du menu à supprimer
* @param integer l'identifiant du menu à supprimer
* @return void le menu classique est supprimé de la base de données.
*/
function ADME_limiterMenuClassique($db, $adme_id_site, $id_menu, $zone)
{
 
$requete_insertion = 'INSERT into gen_menu_relation '.
' SET gmr_id_menu_01 = ' . $id_menu . ', ' .
' gmr_id_menu_02 = ' . $id_menu . ', ' .
' gmr_id_valeur = 106' ;
 
$resultat_insertion = $db->query($requete_insertion);
 
 
 
$requete_mise_a_jour = 'UPDATE gen_menu SET '.
'gm_ce_i18n = "'.$zone.'" '.
'WHERE gm_id_menu = '.$id_menu;
$resultat_mise_a_jour = $db->query($requete_mise_a_jour);
(DB::isError($resultat_mise_a_jour)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_mise_a_jour->getMessage(), $requete_mise_a_jour)) : '';
 
}
 
/** Fonction ADME_ouvrirMenuClassique() Ouvrir un menu classique à toutes les langues (suite à une fermeture)
*
*
* @param mixed l'objet Pear DB de connexion à la base de données.
* @param integer l'identifiant du site du menu à supprimer
* @param integer l'identifiant du menu à supprimer
* @return void le menu classique est supprimé de la base de données.
*/
function ADME_ouvrirMenuClassique($db, $adme_id_site, $id_menu)
{
 
$requete_suppression = 'DELETE from gen_menu_relation '.
'WHERE gmr_id_menu_01 = ' . $id_menu . ' ' .
'AND gmr_id_valeur=106 '; // 106 fermeture du menu
 
$resultat_suppression = $db->query($requete_suppression);
 
 
$requete_mise_a_jour = 'UPDATE gen_menu SET '.
'gm_ce_i18n = "'.GEN_I18N_ID_DEFAUT.'" '.
'WHERE gm_id_menu = '.$id_menu;
$resultat_mise_a_jour = $db->query($requete_mise_a_jour);
(DB::isError($resultat_mise_a_jour)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_mise_a_jour->getMessage(), $requete_mise_a_jour)) : '';
 
}
 
 
 
// +------------------------------------------------------------------------------------------------------+
// | PIED du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
 
 
/* +--Fin du code ----------------------------------------------------------------------------------------+
*
* $Log: not supported by cvs2svn $
* Revision 1.41 2007-10-24 14:43:02 ddelon
* Gestion des menus reservés à une langue
*
* Revision 1.40 2007-07-03 14:35:11 florian
* correction bug maj non prise en charge
*
* Revision 1.39 2007-07-03 14:07:02 florian
* correction bug maj non prise en charge
*
* Revision 1.38 2007-06-26 14:18:53 florian
* amélioration des formulaires des différentes applis de l'interface d'administration afin de les simplifier
*
* Revision 1.37 2006/10/16 15:49:07 ddelon
* Refactorisation code mulitlinguisme et gestion menu invisibles
*
* Revision 1.36 2006/10/06 13:38:45 florian
* ergonomie amélioree
*
* Revision 1.35 2006/09/07 13:45:56 jp_milcent
* Trie par ordre alphabétique des appli.
*
* Revision 1.34 2006/06/29 23:04:01 ddelon
* Bug defaut traduction sur menu commun
*
* Revision 1.33 2006/06/29 18:58:57 ddelon
* Multilinguisme : menu par defaut pour les menu commun
*
* Revision 1.32 2006/06/28 12:53:34 ddelon
* Multilinguisme : menu par defaut
*
* Revision 1.31 2006/04/12 21:11:54 ddelon
* Multilinguisme menus communs
*
* Revision 1.30 2006/03/27 14:33:04 ddelon
* Gestion suppression de contenu menu afficheur
*
* Revision 1.29 2006/03/23 20:24:59 ddelon
* *** empty log message ***
*
* Revision 1.28 2006/03/15 09:30:50 florian
* suppression des echos, qui entrainaient des problemes d'affichages
*
* Revision 1.27 2006/03/13 21:00:20 ddelon
* Suppression messages d'erreur multilinguisme
*
* Revision 1.26 2006/03/10 11:02:36 alexandre_tb
* remplacement de l'image "Traduire" par un texte "traduire" vu qu'on a pas d'image pour la notion de traduire...
*
* Revision 1.25 2006/03/02 10:49:49 ddelon
* Fusion branche multilinguisme dans branche principale
*
* Revision 1.24.2.1 2006/02/28 14:02:11 ddelon
* Finition multilinguisme
*
* Revision 1.24 2005/09/23 13:58:07 ddelon
* Php5, Projet et Redirection
*
* Revision 1.23 2005/09/20 17:01:22 ddelon
* php5 et bugs divers
*
* Revision 1.22 2005/07/08 21:13:15 ddelon
* Gestion indentation menu
*
* Revision 1.21 2005/05/26 16:13:08 jpm
* Correction taille éditeur: passage en text
*
* Revision 1.19 2005/05/26 15:34:46 jpm
* Ajout d'un espace.
*
* Revision 1.18 2005/05/26 08:54:20 jpm
* Ajout info admin ayant fait la dernière modif.
*
* Revision 1.17 2005/04/19 16:47:16 jpm
* Gestion des dates de fin de validité des menus.
*
* Revision 1.16 2005/03/29 15:49:12 jpm
* Ajout de la date de création dans le formulaire des menus.
*
* Revision 1.15 2005/02/28 11:05:06 jpm
* Modification des auteurs.
*
* Revision 1.14 2004/12/01 16:47:28 jpm
* Ajout d'une boite javascript de confirmation de suppression d'un menu.
*
* Revision 1.13 2004/11/29 18:34:51 jpm
* Correction bogue checkbox.
*
* Revision 1.12 2004/11/15 16:51:12 jpm
* Correction bogue de mise à jour de l'ordre des menus.
*
* Revision 1.11 2004/11/10 19:41:14 jpm
* Correction bogue.
*
* Revision 1.10 2004/11/10 17:26:07 jpm
* Fin gestion de la traduction.
*
* Revision 1.9 2004/11/09 17:53:00 jpm
* Changement des noms des actions sur les menus classiques.
*
* Revision 1.8 2004/11/09 17:48:35 jpm
* Gestion de différentes interfaces d'administration.
*
* Revision 1.7 2004/11/09 12:37:34 jpm
* Fin de gestion des menus et mise en conformité avec la convention de codage.
*
* Revision 1.6 2004/11/08 17:40:07 jpm
* Gestion correcte de l'ouverture et fermeture des menus.
* Utilisation des sessions.
*
* Revision 1.5 2004/11/04 19:11:38 jpm
* Mise en conformité vis à vis de la convention de codage.
* Amélioration de la récursivité de la gestion de l'affichage des menus.
*
* Revision 1.4 2004/10/25 16:27:42 jpm
* Correction d'un bogue dans la gestion du déplacement des menus.
*
* Revision 1.3 2004/09/23 17:45:13 jpm
* Amélioration de la gestion des liens annuler et du selecteur de sites.
*
* Revision 1.2 2004/07/06 17:07:37 jpm
* Modification de la documentation pour une mailleur analyse par PhpDocumentor.
*
* Revision 1.1 2004/06/16 15:04:32 jpm
* Changement de nom de Génésia en Papyrus.
* Changement de l'arborescence.
*
* Revision 1.27 2004/05/10 12:13:03 jpm
* Modification des formulaires.
*
* Revision 1.26 2004/05/07 16:31:20 jpm
* Amélioration du formulaire d'un menu classique.
*
* Revision 1.25 2004/05/07 07:23:53 jpm
* Amélioration du code, des commentaires et correction de bogues.
*
*
* +-- Fin du code ----------------------------------------------------------------------------------------+
*/
<?php
/*vim: set expandtab tabstop=4 shiftwidth=4: */
// Copyright (C) 1999-2004 Tela Botanica (accueil@tela-botanica.org)
//
// Ce logiciel est un programme informatique servant à gérer du contenu et des
// applications web.
// Ce logiciel est régi par la licence CeCILL soumise au droit français et
// respectant les principes de diffusion des logiciels libres. Vous pouvez
// utiliser, modifier et/ou redistribuer ce programme sous les conditions
// de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
// sur le site "http://www.cecill.info".
 
// En contrepartie de l'accessibilité au code source et des droits de copie,
// de modification et de redistribution accordés par cette licence, il n'est
// offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
// seule une responsabilité restreinte pèse sur l'auteur du programme, le
// titulaire des droits patrimoniaux et les concédants successifs.
 
// A cet égard l'attention de l'utilisateur est attirée sur les risques
// associés au chargement, à l'utilisation, à la modification et/ou au
// développement et à la reproduction du logiciel par l'utilisateur étant
// donné sa spécificité de logiciel libre, qui peut le rendre complexe à
// manipuler et qui le réserve donc à des développeurs et des professionnels
// avertis possédant des connaissances informatiques approfondies. Les
// utilisateurs sont donc invités à charger et tester l'adéquation du
// logiciel à leurs besoins dans des conditions permettant d'assurer la
// sécurité de leurs systèmes et ou de leurs données et, plus généralement,
// à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
 
// Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
// pris connaissance de la licence CeCILL, et que vous en avez accepté les
// termes.
// ----
// CVS : $Id: adme_menu_classique.fonct.php,v 1.42 2007-10-25 14:26:56 ddelon Exp $
/**
* Fonctions de gestion des menus classiques
*
* Permet de lister, d'ajouter, de modifier, et de déplacer des menus classiques.
* Par menus classiques nous entendons tous les menus devant paraitre dans l'arborescences
* des menus disponibles pour le site courant.
*
*@package Admin_menu
*@subpackage Fonctions
//Auteur original :
*@author Jean-Pascal MILCENT <jpm@tela-botanica.org>
//Autres auteurs :
*@author Alexandre GRANIER <alexandre@tela-botanica.org>
*@copyright Tela-Botanica 2000-2004
*@version $Revision: 1.42 $ $Date: 2007-10-25 14:26:56 $
// +------------------------------------------------------------------------------------------------------+
*/
 
// +------------------------------------------------------------------------------------------------------+
// | ENTÊTE du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
 
 
// +------------------------------------------------------------------------------------------------------+
// | LISTE de FONCTIONS |
// +------------------------------------------------------------------------------------------------------+
 
/** Fonction ADME_afficherListeMenuClassique () - Affiche un arbre de menu en xhtml
*
* Elle forme l'arbre des menus classiques à administrer.
* Ancien nom : deployer_menu().
*
* @param object objet Pear de connection à la base de données.
* @param object objet Pear représentant l'url de base.
* @param integer l'identifiant du menu à administrer.
* @param integer l'identifiant du menu sur lequel on agit.
* @param string le nom de l'action courante.
* @param integer l'identifiant du menu en cours de déploiement.
* @param boolean true indique que l'on a à faire au premier appel de cette fonction récursive.
* @return string le code XHTML constituant l'arbre des menus à administrer.
*/
function ADME_afficherListeMenuClassique($db, $url, $adme_site_id, $adme_menu_id, $adme_action, $id_menu_a_deployer, $bln_premier_appel = true)
{
 
// Initialisation des variables :
$retour = '';
// Est-ce que ces menus comporte des sous-menus ?
$requete_sous_menu = 'SELECT gm_id_menu '.
'FROM gen_menu, gen_menu_relation AS GMR01, gen_menu_relation AS GMR02 '.
'WHERE GMR01.gmr_id_menu_02 = '.$id_menu_a_deployer.' '.
'AND GMR01.gmr_id_menu_01 = gm_id_menu '.
'AND gm_ce_site = '.$adme_site_id.' '.
'AND GMR01.gmr_id_valeur = 1 '.// 1 = avoir "père"
'AND GMR02.gmr_id_menu_02 = gm_id_menu '.
'AND GMR02.gmr_id_menu_01 = GMR02.gmr_id_menu_02 '.
'AND GMR02.gmr_id_valeur = 100 '.// 100 = type "menu classique"
'ORDER BY GMR01.gmr_ordre ASC';
$resultat_sous_menu = $db->query($requete_sous_menu) ;
if (DB::isError($resultat_sous_menu)) {
die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_sous_menu->getMessage(), $requete_sous_menu));
}
// Gestion du stockage ou déstockage des menus ouverts
if (($adme_action == ADME_LG_ACTION_DEPLIER || $adme_action == ADME_LG_ACTION_CLASSIQUE_AJOUTER) && $id_menu_a_deployer != 0) {
$_SESSION['adme_menus_classiques_ouverts'][$adme_menu_id] = $adme_menu_id;
}
if ($adme_action == ADME_LG_ACTION_PLIER && $id_menu_a_deployer != 0) {
unset($_SESSION['adme_menus_classiques_ouverts'][$adme_menu_id]);
foreach ($_SESSION['adme_menus_classiques_ouverts'] as $val) {
if (GEN_etreAncetre($adme_menu_id, $val)) {
unset($_SESSION['adme_menus_classiques_ouverts'][$val]);
}
}
}
// Gestion affichage des menus
if ($resultat_sous_menu->numRows() > 0) {
// Ici, on sait qu'un menu a des sous menus, on commence par l'afficher:
if ($bln_premier_appel == false) {
$retour .= '<li>'."\n";
if (GEN_etreAncetre($id_menu_a_deployer, $adme_menu_id) ||
($id_menu_a_deployer == $adme_menu_id && $adme_action == ADME_LG_ACTION_DEPLIER) ||
isset($_SESSION['adme_menus_classiques_ouverts'][$id_menu_a_deployer])
){
// Affiche un -
$retour .= ADME_retournerXhtmlMenuClassique($db, $url, $adme_site_id, $id_menu_a_deployer, 1);
} else if ( !GEN_etreAncetre($id_menu_a_deployer, $adme_menu_id) ||
($id_menu_a_deployer == $adme_menu_id && $adme_action == ADME_LG_ACTION_PLIER) ||
!isset($_SESSION['adme_menus_classiques_ouverts'][$id_menu_a_deployer])
){
// Affiche un +
$retour .= ADME_retournerXhtmlMenuClassique($db, $url, $adme_site_id, $id_menu_a_deployer, 2);
}
}
if ($bln_premier_appel == true || GEN_etreAncetre($id_menu_a_deployer, $adme_menu_id) ||
($id_menu_a_deployer == $adme_menu_id && $adme_action == ADME_LG_ACTION_DEPLIER) ||
isset($_SESSION['adme_menus_classiques_ouverts'][$id_menu_a_deployer])
){
$retour .= '<ul class="menu_classique">'."\n";
while ($ligne_sous_menu = $resultat_sous_menu->fetchRow(DB_FETCHMODE_OBJECT)) {
$retour .= ADME_afficherListeMenuClassique($db, $url, $adme_site_id, $adme_menu_id, $adme_action, $ligne_sous_menu->gm_id_menu, false);
}
$retour .= '</ul>'."\n";
}
if ($bln_premier_appel == false) {
$retour .= '</li>'."\n";
}
} else if ($resultat_sous_menu->numRows() == 0 && $bln_premier_appel == false) {
$retour .= '<li>'."\n";
$retour .= ADME_retournerXhtmlMenuClassique($db, $url, $adme_site_id, $id_menu_a_deployer, 0);
$retour .= '</li>'."\n";
}
return $retour;
}
 
/** Fonction ADME_retournerXhtmlMenuClassique() - Effectue une sortie d'un menu en XHTML
*
* Retourne le XHTML d'une ligne de l'arbre des menus "classiques" permettant de l'administer.
* Ancien nom : menu_toHtml().
*
* @param object objet Pear de connection à la base de données.
* @param object objet Pear représentant l'url de base.
* @param integer l'identifiant du site à administrer.
* @param integer l'identifiant du menu à administrer.
* @param integer 0 indique que le menu ne possède pas de fils, 1 qu'il faut afficher un - et 2 un +.
* @return string une ligne de liste XHTML
*/
function ADME_retournerXhtmlMenuClassique($db, $url, $adme_site_id, $adme_menu_id, $int_deplier,$est_traduction=false,$menu_traduction_defaut=0)
{
//-------------------------------------------------------------------------------------------------------------------
// Initialisation des variables
 
//-------------------------------------------------------------------------------------------------------------------
// Récupération des infos concernant l'administrateur d'un menu
$requete = 'SELECT gen_menu.*, ga_prenom '.
'FROM gen_menu, gen_annuaire '.
'WHERE gm_id_menu = '.$adme_menu_id.' '.
'AND gm_ce_admin = ga_id_administrateur';
$resultat = $db->query($requete);
if (DB::isError($resultat)) {
die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete));
}
$ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
//-------------------------------------------------------------------------------------------------------------------
// Recupération des infos de l'appli du menu courant.
$ligne_app = GEN_retournerInfoAppliMenu($db, $adme_menu_id);
//-------------------------------------------------------------------------------------------------------------------
// XHTML image plier-déplier
$url->addQueryString('adme_site_id', $adme_site_id);
$url->addQueryString('adme_menu_id', $adme_menu_id);
$xhtml_pd = '';
if(!$est_traduction) {
$xhtml_pd .= '<input type="checkbox" name="adme_id_menu_deplacement['.$adme_menu_id.']" id="adme_id_menu_deplacement" value="'.$adme_menu_id.'" /> ' ;
}
if ($int_deplier != 0) {
if ($int_deplier == 1) {
// Afficher un -
$image_plier_deplier = ADME_IMAGE_MOINS;
$alt = ADME_LG_ACTION_PLIER_ALT;
$url->addQueryString('adme_action', ADME_LG_ACTION_PLIER);
$url_plier_deplier = $url->getURL();
} else if ($int_deplier == 2) {
// Afficher un +
$image_plier_deplier = ADME_IMAGE_PLUS;
$alt = ADME_LG_ACTION_DEPLIER_ALT;
$url->addQueryString('adme_action', ADME_LG_ACTION_DEPLIER);
$url_plier_deplier = $url->getURL();
}
$xhtml_pd .= '<a href="'.$url_plier_deplier.'" title="'.$alt.'">'.
'<img class="'.ADME_CLASS_IMG_PD.'" src="'.$image_plier_deplier.'" alt="'.$alt.'" />'.
'</a>'.'&nbsp;'."\n";
}
//-------------------------------------------------------------------------------------------------------------------
// XHTML du nom du menu et de ses infos
$xhtml_info = htmlentities(empty($ligne->gm_nom) ? ADME_LG_PARENTHESE_OUVRANTE.$ligne->gm_nom.ADME_LG_PARENTHESE_FERMANTE : $ligne->gm_nom);
$xhtml_info .= '&nbsp;';
if (!isset($ligne_app->gap_nom)) {
$gap_nom='';
}
else {
$gap_nom=$ligne_app->gap_nom;
}
$xhtml_info .= ADME_LG_PARENTHESE_OUVRANTE.$gap_nom.'&nbsp;'.ADME_LG_SLASH.'&nbsp;'.$ligne->ga_prenom.ADME_LG_PARENTHESE_FERMANTE;
$xhtml_info .= '&nbsp;'."\n";
//-------------------------------------------------------------------------------------------------------------------
// XHTML actions
$url->removeQueryString('adme_action');
$url->addQueryString('adme_action', ADME_LG_ACTION_CLASSIQUE_MODIFIER);
$xhtml_action = '<a href="'.$url->getURL().'" title="'.ADME_LG_ACTION_CLASSIQUE_MODIFIER_TITLE.'">'.
'<img class="'.ADME_CLASS_IMG_ICONE.'" src="'.ADME_IMAGE_VOIR.'" alt="'.ADME_LG_ACTION_CLASSIQUE_MODIFIER_ALT.'" />'.
'</a>&nbsp;'."\n";
$url->removeQueryString('adme_action');
if (!$est_traduction) {
$url->addQueryString('adme_action', ADME_LG_ACTION_CLASSIQUE_MONTER);
$xhtml_action .= '<a href="'.$url->getURL().'" title="'.ADME_LG_ACTION_CLASSIQUE_MONTER_TITLE.'">'.
'<img class="'.ADME_CLASS_IMG_ICONE.'" src="'.ADME_IMAGE_FLECHE_HAUT.'" alt="'.ADME_LG_ACTION_CLASSIQUE_MONTER_ALT.'" />'.
'</a>&nbsp;'."\n";
$url->removeQueryString('adme_action');
$url->addQueryString('adme_action', ADME_LG_ACTION_CLASSIQUE_DESCENDRE);
$xhtml_action .= '<a href="'.$url->getURL().'" title="'.ADME_LG_ACTION_CLASSIQUE_DESCENDRE_TITLE.'">'.
'<img class="'.ADME_CLASS_IMG_ICONE.'" src="'.ADME_IMAGE_FLECHE_BAS.'" alt="'.ADME_LG_ACTION_CLASSIQUE_DESCENDRE_ALT.'" />'.
'</a>&nbsp;'."\n";
$url->addQueryString('adme_action',ADME_LG_ACTION_CLASSIQUE_DIMINUER);
$xhtml_action .= '<a href="'.$url->getURL().'" title="'.ADME_LG_ACTION_CLASSIQUE_DIMINUER_TITLE.'">'.
'<img class="'.ADME_CLASS_IMG_ICONE.'" src="'.ADME_IMAGE_FLECHE_GAUCHE.'" alt="'.ADME_LG_ACTION_CLASSIQUE_DIMINUER_ALT.'" />'.
'</a>&nbsp;'."\n";
$url->removeQueryString('adme_action');
$url->addQueryString('adme_action',ADME_LG_ACTION_CLASSIQUE_AUGMENTER);
$xhtml_action .= '<a href="'.$url->getURL().'" title="'.ADME_LG_ACTION_CLASSIQUE_AUGMENTER_TITLE.'">'.
'<img class="'.ADME_CLASS_IMG_ICONE.'" src="'.ADME_IMAGE_FLECHE_DROITE.'" alt="'.ADME_LG_ACTION_CLASSIQUE_AUGMENTER_ALT.'" />'.
'</a>&nbsp;'."\n";
}
$url->removeQueryString('adme_action');
if (!$est_traduction) {
$url->addQueryString('adme_action', ADME_LG_ACTION_CLASSIQUE_SUPPRIMER);
$xhtml_action .= '<a href="'.$url->getURL().'" title="'.ADME_LG_ACTION_CLASSIQUE_SUPPRIMER_TITLE.'" onclick="javascript:return confirm(\''.ADME_LG_ACTION_SUPPRIMER_CONFIRMATION.'\');">'.
'<img class="'.ADME_CLASS_IMG_ICONE.'" src="'.ADME_IMAGE_SUPPRIMER.'" alt="'.ADME_LG_ACTION_CLASSIQUE_SUPPRIMER_ALT.'" />'.
'</a>&nbsp;'."\n";
}
else {
$url->addQueryString('adme_action', ADME_LG_ACTION_CLASSIQUE_SUPPRIMER_TRADUCTION);
$xhtml_action .= '<a href="'.$url->getURL().'" title="'.ADME_LG_ACTION_CLASSIQUE_SUPPRIMER_TRADUCTION_TITLE.'" onclick="javascript:return confirm(\''.ADME_LG_ACTION_SUPPRIMER_CONFIRMATION.'\');">'.
'<img class="'.ADME_CLASS_IMG_ICONE.'" src="'.ADME_IMAGE_SUPPRIMER.'" alt="'.ADME_LG_ACTION_CLASSIQUE_SUPPRIMER_TRADUCTION_ALT.'" />'.
'</a>&nbsp;'."\n";
}
$url->removeQueryString('adme_action');
if (!$est_traduction) {
$url->addQueryString('adme_action', ADME_LG_ACTION_CLASSIQUE_AJOUTER);
$xhtml_action .= '<a href="'.$url->getURL().'" title="'.ADME_LG_ACTION_CLASSIQUE_AJOUTER_TITLE.'">'.
'<img class="'.ADME_CLASS_IMG_ICONE.'" src="'.ADME_IMAGE_NOUVEAU.'" alt="'.ADME_LG_ACTION_CLASSIQUE_AJOUTER_ALT.'" />'.
'</a>'.'&nbsp;'."\n";
}
$url->removeQueryString('adme_action');
// Si le menu à une application liée on regarde s'il y a une interface d'administration.
if (!isset($ligne_app->gap_id_application)) {
$gap_id_application=0;
}
else {
$gap_id_application=$ligne_app->gap_id_application;
}
if ($gap_id_application != 0 && GEN_verifierPresenceInterfaceAdmin($db, $gap_id_application)) {
$url->removeQueryString('adme_action');
$url->addQueryString('adme_action', ADME_LG_ACTION_ADMINISTRER);
$xhtml_action .= '<a href="'.$url->getURL().'" title="'.ADME_LG_ACTION_ADMINISTRER_TITLE.'">'.
'<img class="'.ADME_CLASS_IMG_ICONE.'" src="'.ADME_IMAGE_TEXTE.'" alt="'.ADME_LG_ACTION_ADMINISTRER_ALT.'" />'.
'</a>'.'&nbsp;'."\n";
}
if (!$est_traduction) {
$requete_traduction = 'SELECT gmr_id_menu_02, gm_ce_i18n '.
'FROM gen_menu_relation, gen_menu '.
'WHERE '.$adme_menu_id.' = gmr_id_menu_01 ' .
'AND gmr_id_menu_02 = gm_id_menu '.
'AND gmr_id_valeur = 2 ';// 2 = "avoir traduction"
$resultat_traduction = $db->query($requete_traduction);
(DB::isError($resultat_traduction)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_traduction->getMessage(), $requete_traduction))
: '';
$url->addQueryString('adme_action',ADME_LG_ACTION_CLASSIQUE_TRADUIRE);
$xhtml_action .= '<a href="'.$url->getURL().'" title="'.ADME_LG_ACTION_CLASSIQUE_TRADUIRE_TITLE.'">'.
ADME_LG_ACTION_CLASSIQUE_TRADUIRE_ALT.
'</a>&nbsp;'."\n";
 
// Restriction possible à une langue si pas traduit
 
if ($resultat_traduction->numRows() == 0 ) {
 
$requete_lang = 'SELECT * FROM gen_i18n ';
 
$resultat_lang = $db->query($requete_lang);
(DB::isError($resultat_lang)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_lang->getMessage(), $requete_lang)) : '';
$requete_restriction = 'SELECT gmr_id_menu_02 '.
'FROM gen_menu_relation '.
'WHERE '.$adme_menu_id.' = gmr_id_menu_01 ' .
'AND gmr_id_valeur = 106 ';// 106 restriction de menu
$resultat_restriction = $db->query($requete_restriction);
(DB::isError($resultat_restriction)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_restriction->getMessage(), $requete_restriction))
: '';
if ($resultat_restriction->numRows() == 0 ) {
$restriction=0;
}
else {
$restriction=1;
}
while ($ligne_lang = $resultat_lang->fetchRow(DB_FETCHMODE_OBJECT) ) {
if (($restriction) && ($ligne->gm_ce_i18n==$ligne_lang->gi_id_i18n)) {
$url->addQueryString('adme_action',ADME_LG_ACTION_CLASSIQUE_OUVRIR);
$url->addQueryString('zone',$ligne_lang->gi_id_i18n);
$xhtml_action .= '<i><b><a href="'.$url->getURL().'" title="'.ADME_LG_ACTION_CLASSIQUE_OUVRIR_TITLE.'">'.
$ligne_lang->gi_id_i18n.
'</a></b></i>&nbsp;'."\n";
}
else {
$url->addQueryString('adme_action',ADME_LG_ACTION_CLASSIQUE_LIMITER);
$url->addQueryString('zone',$ligne_lang->gi_id_i18n);
$xhtml_action .= '<a href="'.$url->getURL().'" title="'.ADME_LG_ACTION_CLASSIQUE_LIMITER_TITLE.'">'.
$ligne_lang->gi_id_i18n.
'</a>&nbsp;'."\n";
}
}
}
}
else {
if ($menu_traduction_defaut==$adme_menu_id) {
$xhtml_action .= '<img class="'.ADME_CLASS_IMG_ICONE.'" src="'.ADME_IMAGE_TRADUCTION_DEFAUT_AFFICHAGE.'" alt="'.ADME_LG_ACTION_CLASSIQUE_TRADUCTION_DEFAUT_ALT.'" />'.
'&nbsp;'."\n";
}
else {
$url->removeQueryString('adme_action');
$url->addQueryString('adme_action', ADME_LG_ACTION_CLASSIQUE_TRADUCTION_DEFAUT);
$xhtml_action .= '<a href="'.$url->getURL().'" title="'.ADME_LG_ACTION_CLASSIQUE_TRADUCTION_DEFAUT_TITLE.'">'.
'<img class="'.ADME_CLASS_IMG_ICONE.'" src="'.ADME_IMAGE_TRADUCTION_DEFAUT.'" alt="'.ADME_LG_ACTION_CLASSIQUE_TRADUCTION_DEFAUT_ALT.'" />'.
'</a>'.'&nbsp;'."\n";
}
}
$xhtml_traduction='';
// $id_langue = $GLOBALS['_GEN_commun']['i18n'];
$requete_traduction = 'SELECT gmr_id_menu_02, gm_ce_i18n '.
'FROM gen_menu_relation, gen_menu '.
'WHERE '.$adme_menu_id.' = gmr_id_menu_01 ' .
'AND gmr_id_menu_02 = gm_id_menu '.
'AND gmr_id_valeur = 2 ';// 2 = "avoir traduction"
$resultat_traduction = $db->query($requete_traduction);
(DB::isError($resultat_traduction)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_traduction->getMessage(), $requete_traduction))
: '';
if ($resultat_traduction->numRows() > 0 ) {
$requete_traduction_defaut = 'SELECT gmr_id_menu_02 '.
'FROM gen_menu_relation '.
'WHERE '.$adme_menu_id.' = gmr_id_menu_01 ' .
'AND gmr_id_valeur = 105 ';// 105 traduction par defaut
$resultat_traduction_defaut = $db->query($requete_traduction_defaut);
(DB::isError($resultat_traduction_defaut)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_traduction->getMessage(), $requete_traduction_defaut))
: '';
if ($resultat_traduction_defaut->numRows() == 0 ) {
$menu_traduction_defaut=0;
$xhtml_action .= '<img class="'.ADME_CLASS_IMG_ICONE.'" src="'.ADME_IMAGE_TRADUCTION_DEFAUT_AFFICHAGE.'" alt="'.ADME_LG_ACTION_CLASSIQUE_TRADUCTION_DEFAUT_ALT.'" />'.
'&nbsp;'."\n";
}
else {
$ligne_traduction_defaut = $resultat_traduction_defaut->fetchRow(DB_FETCHMODE_OBJECT);
$menu_traduction_defaut=$ligne_traduction_defaut->gmr_id_menu_02;
if ($menu_traduction_defaut!=$adme_menu_id) {
$url->removeQueryString('adme_action');
$url->addQueryString('adme_action', ADME_LG_ACTION_CLASSIQUE_TRADUCTION_DEFAUT);
$xhtml_action .= '<a href="'.$url->getURL().'" title="'.ADME_LG_ACTION_CLASSIQUE_TRADUCTION_DEFAUT_TITLE.'">'.
'<img class="'.ADME_CLASS_IMG_ICONE.'" src="'.ADME_IMAGE_TRADUCTION_DEFAUT.'" alt="'.ADME_LG_ACTION_CLASSIQUE_TRADUCTION_DEFAUT_ALT.'" />'.
'</a>'.'&nbsp;'."\n";
}
else {
$xhtml_action .= '<img class="'.ADME_CLASS_IMG_ICONE.'" src="'.ADME_IMAGE_TRADUCTION_DEFAUT_AFFICHAGE.'" alt="'.ADME_LG_ACTION_CLASSIQUE_TRADUCTION_DEFAUT_ALT.'" />'.
'&nbsp;'."\n";
}
}
while ($ligne_resultat = $resultat_traduction->fetchRow(DB_FETCHMODE_OBJECT)) {
$xhtml_traduction.="<br><em>".$ligne_resultat->gm_ce_i18n.":&nbsp;".ADME_retournerXhtmlMenuClassique($db, $url, $adme_site_id, $ligne_resultat->gmr_id_menu_02, 0,true,$menu_traduction_defaut)."</em>";
}
}
 
//-------------------------------------------------------------------------------------------------------------------
// Envoi du menu.
//-------------------------------------------------------------------------------------------------------------------
$retour = $xhtml_pd.$xhtml_info.$xhtml_action.$xhtml_traduction;
return $retour;
}
 
/** Fonction ADME_ajouterMenuClassique() - Ajoute un sous menu au menu courant
*
* Cette fonction permet d'ajouter un sous-menu de type "classique" au menu courant.
* Ancien nom : addMenu()
*
* @param object objet Pear de connection à la base de données.
* @param object objet Pear d'authentification.
* @param integer l'identifiant du site à administrer.
* @param integer l'identifiant du menu à administrer.
* @return void le menu classique est ajouté à la base de données.
*/
function ADME_ajouterMenuClassique($db, $auth, $adme_site_id, $adme_menu_id)
{
$url=$GLOBALS['_GEN_commun']['url'];
$url->removeQueryString('adme_action');
//----------------------------------------------------------------------------
// Récupération d'infos sur le site principal.
$objet_site = GEN_lireInfoSitePrincipal($db, $adme_site_id);
if ($objet_site == false) {
die('ERREUR Génésia Administrateur de Menus : impossible de lire les infos du site.<br />'.
'ID du site : '.$adme_site_id.'<br />'.
'Ligne n° : '. __LINE__ .'<br />'.
'Fichier n° : '. __FILE__ .'<br />');
}
$nouveau_id_menu = SQL_obtenirNouveauId($db, 'gen_menu', 'gm_id_menu');
$auteur = $auth->getAuthData('ga_prenom').' '.$auth->getAuthData('ga_nom');
//----------------------------------------------------------------------------
// Ajout du nouveau menu
$requete = 'INSERT INTO gen_menu '.
'SET gm_id_menu = '.$nouveau_id_menu.', '.
'gm_ce_site = '.$adme_site_id.', '.
'gm_ce_i18n = "'.$objet_site->gs_ce_i18n.'", '.
'gm_ce_application = 0, '.
'gm_code_num = '.$nouveau_id_menu.', '.
'gm_code_alpha = "menu_'.$nouveau_id_menu.'", '.
'gm_nom = "menu_'.$nouveau_id_menu.'", '.
'gm_titre = "menu_'.$nouveau_id_menu.'", '.
'gm_description_resume = "menu_'.$nouveau_id_menu.'", '.
'gm_auteur = "'.$auteur.'", '.
'gm_editeur = "'.$objet_site->gs_auteur.'", '.
'gm_date_creation = "'.date('Y-m-d H:i:s').'", '.
'gm_date_soumission = "'.date('Y-m-d H:i:s').'", '.
'gm_date_acceptation = "'.date('Y-m-d H:i:s').'", '.
'gm_date_publication = "'.date('Y-m-d H:i:s').'", '.
'gm_date_debut_validite = "'.date('Y-m-d H:i:s').'", '.
'gm_date_fin_validite = "0000-00-00 00:00:00", '.
'gm_date_copyright = "'.date('Y-00-00 00:00:00').'", '.
'gm_categorie = "menu", '.
'gm_ce_admin = '.$auth->getAuthData('ga_id_administrateur').' '
;
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
//----------------------------------------------------------------------------
// Ajout de la relation "père"
if (!isset($adme_menu_id) && empty($adme_menu_id)) {
$adme_menu_id = 0 ;// Identifiant du père
}
//----------------------------------------------------------------------------
// Récupération d'infos sur la hierarchie du menu
$requete = 'SELECT GMR01.gmr_ordre '.
'FROM gen_menu_relation AS GMR01, gen_menu_relation AS GMR02 '.
'WHERE GMR01.gmr_id_menu_02 = '.$adme_menu_id.' '.
'AND GMR01.gmr_id_valeur = 1 '.// 1 = avoir "père"
'AND GMR02.gmr_id_menu_01 = GMR01.gmr_id_menu_01 '.
'AND GMR02.gmr_id_menu_01 = GMR02.gmr_id_menu_02 '.
'AND GMR02.gmr_id_valeur = 100 '.// 100 = menu type "classique"
'ORDER BY GMR01.gmr_ordre DESC';
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
$ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
$nouveau_ordre_menu = $ligne->gmr_ordre + 1;
$resultat->free();
$requete = 'INSERT INTO gen_menu_relation '.
'SET gmr_id_menu_02 = '.$adme_menu_id.', '.
'gmr_id_menu_01 = '.$nouveau_id_menu.', '.
'gmr_id_valeur = 1, '.
'gmr_ordre = '.$nouveau_ordre_menu;
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
//----------------------------------------------------------------------------
// Ajout de la relation-type "menu classique"
// Récupération d'infos sur la hierarchie du menu
$requete = 'SELECT * '.
'FROM gen_menu_relation, gen_menu '.
'WHERE gmr_id_menu_02 = gmr_id_menu_01 '.
'AND gmr_id_valeur = 100 '.// 100 = type menu "classique"
'AND gmr_id_menu_01 = gm_id_menu '.
'AND gm_ce_site = '.$adme_site_id.' '.
'ORDER BY gmr_ordre DESC';
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
$ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
$nouveau_ordre_menu_classique = $ligne->gmr_ordre + 1;
$resultat->free();
$requete = 'INSERT INTO gen_menu_relation '.
'SET gmr_id_menu_01 = '.$nouveau_id_menu.', '.
'gmr_id_menu_02 = '.$nouveau_id_menu.', '.
'gmr_id_valeur = 100, '.
'gmr_ordre = '.$nouveau_ordre_menu_classique;
$result = $db->query($requete);
(DB::isError($result)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $result->getMessage(), $requete)) : '';
}
 
/** Fonction ADME_afficherFormMenuClassique() - Affiche le formulaire pour un menu classique
*
* Utilise HTML_QuickForm pour générer le formulaire.
* Ancien nom : showMenu()
*
* @param object objet Pear de connection à la base de données.
* @param object objet Pear représentant l'url de base.
* @param integer l'identifiant du site à administrer.
* @param integer l'identifiant du menu à administrer.
* @param array le tableau associatif des valeurs à afficher dans le formulaire.
* @return string le formulaire XHTML.
*/
function ADME_afficherFormMenuClassique($db, $url, $adme_site_id, $adme_menu_id, $aso_valeurs,$traduction=FALSE)
{
// Initialisation de variable
$url->addQueryString('adme_site_id', $adme_site_id);
$url->addQueryString('adme_menu_id', $adme_menu_id);
$script = 'function switchMenu(obj) {
var el = document.getElementById(obj);
if(el.style.display != "block")
{
el.style.display = "block";
}
else
{
el.style.display = "none";
}
}';
GEN_stockerCodeScript($script);
// Nous sommes toujours en modification car un menu est ajouté automatiquement!
// Récupération des informations du menu concerné.
if (!isset($aso_valeurs[ADME_LG_ACTION_CLASSIQUE_VERIFIER]) && !isset($aso_valeurs[ADME_LG_ACTION_CLASSIQUE_VERIFIER_TRADUCTION])) {
$aso_valeurs = GEN_lireInfoMenu($db, $adme_menu_id, DB_FETCHMODE_ASSOC);
if ($aso_valeurs === false) {
die('ERREUR Papyrus Administrateur de Menus : '.ADME_LG_ERREUR_INFO_MENU.'<br />'.
'Idenitifiant du menu n° : '. $adme_menu_id .'<br />'.
'Ligne n° : '. __LINE__ .'<br />'.
'Fichier n° : '. __FILE__ .'<br />');
}
// Requete pour récupérer les informations issues des relations du site à modifier
$ligne = GEN_lireInfoMenuRelation($db, $adme_menu_id, $id_valeur = 101);
$aso_valeurs['defaut'] = false;
if (isset($ligne) && !empty($ligne)) {
if ($ligne->gmr_id_valeur != false) {// 101 = site par défaut
$aso_valeurs['defaut'] = true;
}
}
}
// Titre de la page
if ($traduction) {
$retour = '<h1>'.ADME_LG_FORM_MENU_CLASSIQUE_TITRE_GENERAL_TRADUCTION.'</h1>'."\n";
}
else {
$retour = '<h1>'.ADME_LG_FORM_MENU_CLASSIQUE_TITRE_GENERAL.'</h1>'."\n";
}
 
$retour .= '<p class="adme_menu_id" >'.ADME_LG_FORM_MENU_ID.'<span id="adme_menu_id">'.$aso_valeurs['gm_id_menu'].'</span></p>'."\n";
// Création du formulaire
// Notes : Quickform semble remplacer les & des &amp; à nouveau par des &amp; solution utiliser str_replace()...
$form =& new HTML_QuickForm('form_menu_classique', 'post', str_replace('&amp;', '&', $url->getUrl()));
$tab_index = 1000;
$squelette =& $form->defaultRenderer();
$squelette->setFormTemplate("\n".'<form {attributes}>'."\n".'{content}'."\n".'</form>'."\n");
$squelette->setElementTemplate( '<p class="formulaire_element"><span class="form_label">'."\n".
'{label}'."\n".
'<!-- BEGIN required --><span style="color:red; width:5px; margin:0; padding:0;">*</span><!-- END required -->'."\n".
'</span>'."\n".'{element}'."\n".
'<!-- BEGIN error --><span class="erreur">{error}</span><!-- END error -->'."\n".
'</p>'."\n");
$squelette->setGroupElementTemplate('<p style="display:inline">{element}</p>', 'form_boutons');
$squelette->setRequiredNoteTemplate("\n".'<p class="symbole_obligatoire">*&nbsp;:&nbsp;{requiredNote}</p>'."\n");
//Note pour les erreurs javascript
$form->setJsWarnings('Erreur de saisie', 'Veuillez verifier vos informations saisies');
// Note de fin de formulaire
$form->setRequiredNote(ADME_LG_FORM_TXT_CHP_OBLIGATOIRE);
 
$partie_menu_debut = '<fieldset>'."\n".'<legend>'.ADME_LG_FORM_MENU_CLASSIQUE_TITRE_CONFIG.'</legend>'."\n";
$form->addElement('html', $partie_menu_debut);
$id = 'gm_code_alpha';
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++, 'size' => 35, 'maxlength' => 50);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_CODE_ALPHA.'</label>';
$form->addElement('text', $id, $label, $aso_attributs);
$form->addRule($id, ADME_LG_FORM_MENU_REGLE_CODE_ALPHA, 'required', '', 'client');
$id = 'gm_nom';
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++, 'size' => 35, 'maxlength' => 100);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_NOM.'</label>';
$form->addElement('text', $id, $label, $aso_attributs);
$form->addRule($id, ADME_LG_FORM_MENU_REGLE_NOM, 'required', '', 'client');
$form->applyFilter($id, 'trim');
$id = 'gm_description_resume';
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++, 'rows' => 2, 'cols' => 50);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_INFO_BULLE.'</label>';
$form->addElement('textarea', $id, $label, $aso_attributs);
$form->addRule($id, ADME_LG_FORM_MENU_REGLE_INFO_BULLE, 'required', '', 'client');
// Requête sur les applications
$requete = 'SELECT gap_id_application, gap_nom '.
'FROM gen_application '.
'WHERE gap_bool_applette = 0 '.
'ORDER BY gap_nom ASC';// Pour éviter d'afficher les applettes.
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
$aso_options = array();
while ($ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT)) {
$aso_options[$ligne->gap_id_application] = $ligne->gap_nom;
}
$resultat->free();
$id = 'gm_ce_application';
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_APPLI.'</label>';
$form->addElement('select', $id, $label, $aso_options, $aso_attributs);
if ($traduction) {
// Recherche liste des menu deja traduits
$requete = 'SELECT distinct gm_ce_i18n '.
'FROM gen_menu_relation, gen_menu '.
'WHERE gmr_id_menu_01 = ' . $adme_menu_id .' '.
'AND gm_id_menu = gmr_id_menu_02 '.
'AND gmr_id_valeur = 2 '; // 2 = "avoir traduction"
$resultat = $db->query($requete) ;
if (DB::isError($resultat)) {
die( BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete) );
}
$not_in_langue='';
if ( $resultat->numRows() == 0 ) {
$not_in_langue="gi_id_i18n not in('".$aso_valeurs['gm_ce_i18n']."')";
}
else {
while ($ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT)) {
$not_in_langue="'".$ligne->gm_ce_i18n."'".",".$not_in_langue;
$end="'".$ligne->gm_ce_i18n."'";
}
if ($not_in_langue) {
$not_in_langue="'".$aso_valeurs['gm_ce_i18n']."'".",".$not_in_langue;
$not_in_langue=' gi_id_i18n not in('.$not_in_langue.$end.')';
}
else {
$not_in_langue="gi_id_i18n not in('".$aso_valeurs['gm_ce_i18n']."')";
}
}
$resultat->free();
$requete = "SELECT * FROM gen_i18n where ".$not_in_langue;
/*$requete = 'SELECT * '.
'FROM gen_i18n ';*/
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
$aso_options = array();
while ($ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT) ) {
$aso_options[$ligne->gi_id_i18n] = $ligne->gi_id_i18n;
}
$resultat->free();
$id = 'gs_ce_i18n';
$aso_attributs = array('id' => $id, 'tabindex' => $tab_index++);
$label = '<label for="'.$id.'">'.'Langue : '.'</label>';
$form->addElement('select', $id, $label, $aso_options, $aso_attributs);
}
$id = 'gm_titre';
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++, 'size' => 35, 'maxlength' => 255);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_TITRE.'</label>';
$form->addElement('text', $id, $label, $aso_attributs);
$id = 'gm_mots_cles';
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++, 'rows' => 3, 'cols' => 50);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_MOT_CLE.'</label>';
$form->addElement('textarea', $id, $label, $aso_attributs);
$id = 'gm_description_libre';
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++, 'rows' => 3, 'cols' => 45);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_DESCRIPTION.'</label>';
$form->addElement('textarea', $id, $label, $aso_attributs);
$partie_menu_fin = "\n".'</fieldset>'."\n";
$form->addElement('html', $partie_menu_fin);
//Lien javascript pour cacher les options compliquées
$form->addElement('html', '<a href="#" onclick="switchMenu(\'config_avancee\');" title="'.ADME_VOIR_CONFIG_AVANCEE.'">'.ADME_VOIR_CONFIG_AVANCEE.'</a><br />'."\n");
//début de la div cachée pour les options compliquées-----------------------------------------------
$form->addElement('html', '<div id="config_avancee" style="display:none;">');
$partie_entete_debut = '<fieldset>'."\n".'<legend>'.ADME_CONFIG_AVANCEE.'</legend>'."\n";
$form->addElement('html', $partie_entete_debut);
$id = 'gm_code_num';
$aso_attributs = array('id'=>$id, 'tabindex' => $tab_index++, 'size' => 5, 'maxlength' => 100);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_CODE_NUM.'</label>';
$form->addElement('text', $id, $label, $aso_attributs);
$form->addRule($id, ADME_LG_FORM_MENU_REGLE_CODE_NUM, 'required', '', 'client');
$id = 'gm_raccourci_clavier';
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++, 'size' => 1, 'maxlength' => 1);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_RACCOURCI.'</label>';
$form->addElement('text', $id, $label, $aso_attributs);
$id = 'defaut';
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++);
if ($aso_valeurs[$id] === true) {
$aso_attributs['checked'] = 'checked';
}
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_DEFAUT.'</label>';
$form->addElement('checkbox', $id, $label, '', $aso_attributs);
$id = 'gm_fichier_squelette';
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++, 'size' => 35, 'maxlength' => 255);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_FICHIER_SQUELETTE.'</label>';
$form->addElement('text', $id, $label, $aso_attributs);
$id = 'gm_application_arguments';
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++, 'size' => 35, 'maxlength' => 255);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_APPLI_ARGUMENT.'</label>';
$form->addElement('text', $id, $label, $aso_attributs);
$id = 'gm_robot';
$aso_options = array( 'index,follow' => ADME_LG_FORM_MENU_INDEX_FOLLOW,
'index' => ADME_LG_FORM_MENU_INDEX,
'noindex' => ADME_LG_FORM_MENU_NOINDEX,
'noindex,nofollow' => ADME_LG_FORM_MENU_NOINDEX_NOFOLLOW,
'' => ADME_LG_FORM_MENU_INDEX_VIDE);
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_ROBOT.'</label>';
$form->addElement('select', $id, $label, $aso_options, $aso_attributs);
$id = 'gm_titre_alternatif';
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++, 'size' => 35, 'maxlength' => 255);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_TITRE_ALTERNATIF.'</label>';
$form->addElement('text', $id, $label, $aso_attributs);
$id = 'gm_description_table_matieres';
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++, 'rows' => 3, 'cols' => 45);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_TABLE_MATIERE.'</label>';
$form->addElement('textarea', $id, $label, $aso_attributs);
$id = 'gm_source';
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++, 'size' => 35, 'maxlength' => 255);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_SOURCE.'</label>';
$form->addElement('text', $id, $label, $aso_attributs);
$id = 'gm_auteur';
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++, 'size' => 35, 'maxlength' => 255);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_AUTEUR.'</label>';
$form->addElement('text', $id, $label, $aso_attributs);
$id = 'gm_contributeur';
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++, 'rows' => 2, 'cols' => 45);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_CONTRIBUTEUR.'</label>';
$form->addElement('textarea', $id, $label, $aso_attributs);
$id = 'gm_editeur';
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++, 'size' => 35, 'maxlength' => 65000);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_EDITEUR.'</label>';
$form->addElement('text', $id, $label, $aso_attributs);
$id = 'gm_date_creation';
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++, 'size' => 19, 'maxlength' => 19);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_DATE_CREATION.'</label>';
$form->addElement('text', $id, $label, $aso_attributs);
$id = 'gm_date_debut_validite';
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++, 'size' => 19, 'maxlength' => 19);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_DATE_VALIDITE_DEBUT.'</label>';
$form->addElement('text', $id, $label, $aso_attributs);
$id = 'gm_date_fin_validite';
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++, 'size' => 19, 'maxlength' => 19);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_DATE_VALIDITE_FIN.'</label>';
$form->addElement('text', $id, $label, $aso_attributs);
$id = 'gm_date_copyright';
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++, 'size' => 19, 'maxlength' => 19);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_DATE_COPYRIGHT.'</label>';
$form->addElement('text', $id, $label, $aso_attributs);
$id = 'gm_licence';
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++, 'size' => 35, 'maxlength' => 255);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_URL_LICENCE.'</label>';
$form->addElement('text', $id, $label, $aso_attributs);
$id = 'gm_categorie';
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++, 'size' => 35, 'maxlength' => 100);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_CATEGORIE.'</label>';
$form->addElement('text', $id, $label, $aso_attributs);
$id = 'gm_public';
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++, 'size' => 35, 'maxlength' => 255);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_PUBLIC.'</label>';
$form->addElement('text', $id, $label, $aso_attributs);
$id = 'gm_public_niveau';
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++, 'size' => 25, 'maxlength' => 45);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_PUBLIC_NIVEAU.'</label>';
$form->addElement('text', $id, $label, $aso_attributs);
$id = 'gm_ce_type_portee_spatiale';
$aso_options = array( '' => ADME_LG_FORM_MENU_ZG_VIDE,
'iso3166' => ADME_LG_FORM_MENU_ZG_ISO,
'Point' => ADME_LG_FORM_MENU_ZG_POINT,
'Box' => ADME_LG_FORM_MENU_ZG_DC,
'TGN' => ADME_LG_FORM_MENU_ZG_GTGN);
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_ZG_TYPE.'</label>';
$form->addElement('select', $id, $label, $aso_options, $aso_attributs);
$id = 'gm_portee_spatiale';
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++, 'size' => 35, 'maxlength' => 100);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_ZG_VALEUR.'</label>';
$form->addElement('text', $id, $label, $aso_attributs);
$id = 'gm_ce_type_portee_temporelle';
$aso_options = array( '' => ADME_LG_FORM_MENU_TMP_VIDE,
'W3CDTF' => ADME_LG_FORM_MENU_TMP_W3C,
'Period' => ADME_LG_FORM_MENU_TMP_DC);
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_TMP_TYPE.'</label>';
$form->addElement('select', $id, $label, $aso_options, $aso_attributs);
$id = 'gm_portee_temporelle';
$aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++, 'size' => 35, 'maxlength' => 100);
$label = '<label for="'.$id.'">'.ADME_LG_FORM_MENU_TMP_VALEUR.'</label>';
$form->addElement('text', $id, $label, $aso_attributs);
// Requete pour connaitre les informations sur l'administrateur ayant fait la dernière modif
if (!isset($aso_valeurs[ADME_LG_ACTION_CLASSIQUE_VERIFIER]) && !isset($aso_valeurs[ADME_LG_ACTION_CLASSIQUE_VERIFIER_TRADUCTION])) {
$requete_admin = 'SELECT * '.
'FROM gen_annuaire '.
'WHERE ga_id_administrateur = '.$aso_valeurs['gm_ce_admin'];
$resultat_admin = $db->query($requete_admin);
if (DB::isError($resultat_admin)) {
die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_admin->getMessage(), $requete_admin));
}
$ligne_admin = $resultat_admin->fetchRow(DB_FETCHMODE_OBJECT);
$info_admin = '<p class="info">Dernière modification par '.$ligne_admin->ga_prenom.' '.$ligne_admin->ga_nom.'</p>';
$form->addElement('html', $info_admin);
}
//fin de la div cachée pour les options compliquées-------------------------------------------------
$form->addElement('html', "\n".'</fieldset>'."\n".'</div>');
$buttons[] = &HTML_QuickForm::createElement('link', 'annuler', ADME_LG_FORM_MENU_ANNULER,
str_replace ("&amp;", "&", $url->getURL()), ADME_LG_FORM_MENU_ANNULER); // Le preg_replace contourne un pb de QuickForm et Net_URL
// qui remplacent deux fois les & par des &amp;
//Bouton de validation du formulaire
if ($traduction) {
$buttons[] = &HTML_QuickForm::createElement('submit', ADME_LG_ACTION_CLASSIQUE_VERIFIER_TRADUCTION, ADME_LG_FORM_MENU_VALIDER);
$form->addElement('hidden', 'adme_site_id', $adme_site_id);
}
else {
$buttons[] = &HTML_QuickForm::createElement('submit', ADME_LG_ACTION_CLASSIQUE_VERIFIER, ADME_LG_FORM_MENU_VALIDER);
}
$form->addGroup($buttons, 'form_boutons', null, '&nbsp;');
$form->addElement('hidden', 'gm_id_menu', $aso_valeurs['gm_id_menu']);
// Instanciation avec les valeur par défaut
$form->setDefaults($aso_valeurs);
$retour .= $form->toHTML()."\n";
return $retour;
}
 
/** Fonction ADME_validerFormAjouterMenuClassique() - Valide les données issues du formulaire pour gen_menu.
*
* Cette fonction valide les données à ajouter dans la table gen_menu.
*
* @param PEAR::DB l'objet pear de connexion à la base de données.
* @param string le tableau contenant les valeurs du formulaire.
* @return string retourne les messages d'erreurs sinon rien.
*/
function ADME_validerFormAjouterMenuClassique($db, $aso_valeurs)
{
$message = '';
if ($aso_valeurs['gm_code_alpha'] == '') {
$message .= '<p class="pap_erreur">'.ADME_LG_FORM_MENU_REGLE_CODE_ALPHA.'</p>';
}
if ($aso_valeurs['gm_code_num'] == '') {
$message .= '<p class="pap_erreur">'.ADME_LG_FORM_MENU_REGLE_CODE_NUM.'</p>';
}
if ($aso_valeurs['gm_nom'] == '') {
$message .= '<p class="pap_erreur">'.ADME_LG_FORM_MENU_REGLE_NOM.'</p>';
}
if ($aso_valeurs['gm_description_resume'] == '') {
$message .= '<p class="pap_erreur">'.ADME_LG_FORM_MENU_REGLE_INFO_BULLE.'</p>';
}
return $message;
}
 
 
/** Fonction ADME_validerFormTraduireMenuClassique() - Valide les données issues du formulaire de traduction de menu
*
* Cette fonction valide les données à ajouter dans la table gen_menu.
*
* @param PEAR::DB l'objet pear de connexion à la base de données.
* @param string le tableau contenant les valeurs du formulaire.
* @return string retourne les messages d'erreurs sinon rien.
*/
function ADME_validerFormTraduireMenuClassique($db, $aso_valeurs)
{
$message = '';
if ($aso_valeurs['gm_code_alpha'] == '') {
$message .= '<p class="pap_erreur">'.ADME_LG_FORM_MENU_REGLE_CODE_ALPHA.'</p>';
}
if ($aso_valeurs['gm_code_num'] == '') {
$message .= '<p class="pap_erreur">'.ADME_LG_FORM_MENU_REGLE_CODE_NUM.'</p>';
}
if ($aso_valeurs['gm_nom'] == '') {
$message .= '<p class="pap_erreur">'.ADME_LG_FORM_MENU_REGLE_NOM.'</p>';
}
if ($aso_valeurs['gm_description_resume'] == '') {
$message .= '<p class="pap_erreur">'.ADME_LG_FORM_MENU_REGLE_INFO_BULLE.'</p>';
}
return $message;
}
 
 
 
/** Fonction ADME_modifierMenuClassique() - Met à jour les infos d'un menu classique
*
* Fonction modifiant un menu commun à Papyrus.
* Ancien nom : commitUpdateLevel()
*
* @param object objet Pear de connection à la base de données.
* @param object objet Pear représentant l'authentification.
* @param integer l'identifiant du menu à administrer.
* @param array le tableau des valeurs à modifier.
* @return void les changement sont fait dans la base de données.
*/
function ADME_modifierMenuClassique($db, $auth, $adme_menu_id, $aso_valeurs)
{
$requete = 'UPDATE gen_menu SET '.
'gm_ce_application = '.$aso_valeurs['gm_ce_application'].', '.
'gm_application_arguments = "'.$aso_valeurs['gm_application_arguments'].'", '.
'gm_fichier_squelette = "'.$aso_valeurs['gm_fichier_squelette'].'", '.
'gm_code_num = '.$aso_valeurs['gm_code_num'].', '.
'gm_code_alpha = "'.$aso_valeurs['gm_code_alpha'].'", '.
'gm_nom = "'.$aso_valeurs['gm_nom'].'", '.
'gm_raccourci_clavier = "'.$aso_valeurs['gm_raccourci_clavier'].'", '.
'gm_robot = "'.$aso_valeurs['gm_robot'].'", '.
'gm_titre = "'.$aso_valeurs['gm_titre'].'", '.
'gm_titre_alternatif = "'.$aso_valeurs['gm_titre_alternatif'].'", '.
'gm_mots_cles = "'.$aso_valeurs['gm_mots_cles'].'", '.
'gm_description_libre = "'.$aso_valeurs['gm_description_libre'].'", '.
'gm_description_resume = "'.$aso_valeurs['gm_description_resume'].'", '.
'gm_description_table_matieres = "'.$aso_valeurs['gm_description_table_matieres'].'", '.
'gm_source = "'.$aso_valeurs['gm_source'].'", '.
'gm_auteur = "'.$aso_valeurs['gm_auteur'].'", '.
'gm_contributeur = "'.$aso_valeurs['gm_contributeur'].'", '.
'gm_editeur = "'.$aso_valeurs['gm_editeur'].'", '.
'gm_date_creation = "'.$aso_valeurs['gm_date_creation'].'", '.
'gm_date_debut_validite = "'.$aso_valeurs['gm_date_debut_validite'].'", '.
'gm_date_fin_validite = "'.$aso_valeurs['gm_date_fin_validite'].'", '.
'gm_date_copyright = "'.$aso_valeurs['gm_date_copyright'].'", '.
'gm_licence = "'.$aso_valeurs['gm_licence'].'", '.
'gm_categorie = "'.$aso_valeurs['gm_categorie'].'", '.
'gm_public = "'.$aso_valeurs['gm_public'].'", '.
'gm_public_niveau = "'.$aso_valeurs['gm_public_niveau'].'", '.
'gm_ce_type_portee_spatiale = "'.$aso_valeurs['gm_ce_type_portee_spatiale'].'", '.
'gm_portee_spatiale = "'.$aso_valeurs['gm_portee_spatiale'].'", '.
'gm_ce_type_portee_temporelle = "'.$aso_valeurs['gm_ce_type_portee_temporelle'].'", '.
'gm_portee_temporelle = "'.$aso_valeurs['gm_portee_temporelle'].'", '.
'gm_ce_admin = "'.$auth->getAuthData('ga_id_administrateur').'" '.
'WHERE gm_id_menu = '.$adme_menu_id;
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
// Gestion de la relation menu par défaut
if (isset($aso_valeurs['defaut']) && $aso_valeurs['defaut'] == 1) {
$requete_id_menu_supr_defaut = 'SELECT GM01.gm_id_menu AS id_menu_supr_defaut '.
'FROM gen_menu AS GM01, gen_menu AS GM02, gen_menu_relation '.
'WHERE GM02.gm_id_menu = '.$adme_menu_id.' '.
'AND GM02.gm_ce_site = GM01.gm_ce_site '.
'AND GM01.gm_id_menu = gmr_id_menu_01 '.
'AND gmr_id_valeur = 101 ';// 101 = menu par "defaut"
$resultat_menu_supr_defaut = $db->query($requete_id_menu_supr_defaut);
if (DB::isError($resultat_menu_supr_defaut)) {
die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_menu_supr_defaut->getMessage(), $requete_id_menu_supr_defaut));
}
$ligne_menu_supr_defaut = $resultat_menu_supr_defaut->fetchRow(DB_FETCHMODE_OBJECT);
if ($resultat_menu_supr_defaut->numRows() > 0 ) {
$requete_supr_defaut = 'DELETE FROM gen_menu_relation '.
'WHERE gmr_id_menu_01 = gmr_id_menu_02 '.
'AND gmr_id_valeur = 101 '.// 101 = menu par "defaut"
'AND gmr_id_menu_01 = '.$ligne_menu_supr_defaut->id_menu_supr_defaut;
$resultat_supr_defaut = $db->query($requete_supr_defaut);
if (DB::isError($resultat_supr_defaut)) {
die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_supr_defaut->getMessage(), $requete_supr_defaut));
}
}
$resultat_menu_supr_defaut->free();
// Requete d'insertion de la relation menu par défaut
$requete = 'INSERT INTO gen_menu_relation '.
'SET gmr_id_menu_01 = '.$adme_menu_id.', '.
'gmr_id_menu_02 = '.$adme_menu_id.', '.
'gmr_id_valeur = 101, '.
'gmr_ordre = NULL ';
$resultat = $db->query($requete);
if (DB::isError($resultat)) {
die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete));
}
}
}
 
/** Fonction ADME_deplacerMenuClassique() - Permet de déplacer un menu dans la hiérarchie.
*
* Permet de déplacer un menu dans la hiérarchie des menus classiques.
* Ancien nom : moveMenu()
*
* @param mixed objet Pear DB de connexion à la base de données.
* @param integer identifiant du site administré.
* @param integer identifiant du menu à déplacer.
* @param boolean indique si on veut monter le menu (true) ou le descendre (false).
* @return void modifie la base de données.
*/
function ADME_deplacerMenuClassique($db, $adme_site_id, $adme_menu_id, $bln_monter)
{
//-------------------------------------------------------------------------------------------------------------------
// Récupération d'information sur le site de ce menu.
$objet_site = GEN_lireInfoSitePrincipal($db, $adme_site_id);
if ($objet_site == false) {
die('ERREUR Papyrus Administrateur de Menus : '.ADME_LG_ERREUR_INFO_SITE.'<br />'.
'Id du site : '. $adme_site_id .'<br />'.
'Ligne n° : '. __LINE__ .'<br />'.
'Fichier n° : '. __FILE__ .'<br />');
}
//-------------------------------------------------------------------------------------------------------------------
// Récupération d'informations sur les relations du menu courant.
$ligne_menu_courant_relation = GEN_lireInfoMenuRelation($db, $adme_menu_id, '1');
if ($ligne_menu_courant_relation == false) {
die('ERREUR Papyrus Administrateur de Menus : '.ADME_LG_ERREUR_INFO_MENU_RELATION.'<br />'.
'Identifiant menu : '. $adme_menu_id .'<br />'.
'Identifiant valeur relation : 1 <br />'.
'Ligne n° : '. __LINE__ .'<br />'.
'Fichier n° : '. __FILE__ .'<br />');
}
//-------------------------------------------------------------------------------------------------------------------
// Récupération de l'identifiant du menu pére
$id_pere = GEN_lireIdentifiantMenuPere($adme_menu_id);
if ($id_pere === false) {
die('ERREUR Papyrus Administrateur de Menus : '.ADME_LG_ERREUR_ID_MENU_PERE.'<br />'.
'Identifiant menu fils : '. $adme_menu_id .'<br />'.
'Ligne n° : '. __LINE__ .'<br />'.
'Fichier n° : '. __FILE__ .'<br />');
}
//-------------------------------------------------------------------------------------------------------------------
// Recherche d'information sur le menu précédent ou suivant le menu courant
$requete = 'SELECT GMR01.gmr_ordre AS nouvel_ordre, GMR01.gmr_id_menu_01 AS id_menu_remplace '.
'FROM gen_menu, gen_menu_relation AS GMR01, gen_menu_relation AS GMR02 '.
'WHERE GMR02.gmr_id_menu_01 = GMR01.gmr_id_menu_01 '.
'AND GMR01.gmr_id_menu_01 = gm_id_menu './/jonction avec la table GEN_MENU
'AND gm_ce_site = '.$objet_site->gs_id_site.' '.
'AND GMR02.gmr_id_valeur = 100 '.// 100 = menu type "classique"
'AND GMR01.gmr_id_menu_02 = '.$id_pere.' '.
'AND GMR01.gmr_id_valeur = 1 ';// 1 = relation menu "père"
if ($bln_monter) {
$requete .= 'AND GMR01.gmr_ordre < '.$ligne_menu_courant_relation->gmr_ordre.' '.
'ORDER BY GMR01.gmr_ordre DESC';
} else {
$requete .= 'AND GMR01.gmr_ordre > '.$ligne_menu_courant_relation->gmr_ordre.' '.
'ORDER BY GMR01.gmr_ordre ASC';
}
$resultat_menu = $db->query($requete);
(DB::isError($resultat_menu)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_menu->getMessage(), $requete)) : '';
$ligne_menu = $resultat_menu->fetchRow(DB_FETCHMODE_OBJECT);
$resultat_menu->free();
//-------------------------------------------------------------------------------------------------------------------
// Si la requete ne retourne rien nous ne faisons rien.
if (! $ligne_menu) {
return null;
}
//-------------------------------------------------------------------------------------------------------------------
// Mise à jour des relations du menu courant
$requete = 'UPDATE gen_menu_relation SET '.
'gmr_ordre = '.$ligne_menu->nouvel_ordre.' '.
'WHERE gmr_id_menu_01 = '.$ligne_menu_courant_relation->gmr_id_menu_01.' '.
'AND gmr_id_valeur = 1';// 1 = relation menu "père"
$resultat_update = $db->query($requete);
(DB::isError($resultat_update)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_update->getMessage(), $requete)) : '';
//-------------------------------------------------------------------------------------------------------------------
// Mise à jour des relations du menu précédent ou suivant
$requete = 'UPDATE gen_menu_relation SET '.
'gmr_ordre = '.$ligne_menu_courant_relation->gmr_ordre.' '.
'WHERE gmr_id_menu_01 = '.$ligne_menu->id_menu_remplace.' '.
'AND gmr_id_valeur = 1';// 1 = relation menu "père"
$resultat_update = $db->query($requete);
(DB::isError($resultat_update)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_update->getMessage(), $requete)) : '';
}
 
 
/** Fonction ADME_deplacerMenuClassiqueVersSite() - Permet de deplacer des menus classique vers un autre site principal
*
* Permet de traduire un menu classique
*
* @param mixed objet Pear DB de connexion à la base de données.
* @param integer identifiant du site de départ.
* @param integer identifiant du site d'arrivée.
* @param mixed identifiant des menus à déplacer.
* @return
*/
function ADME_deplacerMenuClassiqueVersSite($db,$id_site_depart,$id_site_arrivee,$id_menu_a_deplacer) {
// initialisation de l'ordre pour les noeuds à déplacer
$ordre_max = 0 ;
$id_menu_pour_ordre = reset($id_menu_a_deplacer) ;
// on récupère l'ordre maximum des différents sites pour ajouter les menus déplacés à la fin
// TODO: rajouter un group by par le type de relation
$requete_ordre_menu = 'SELECT MAX(gmr_ordre) as ordre_max '.
'FROM gen_menu_relation '.
'LEFT JOIN gen_menu '.
'ON (gen_menu_relation.gmr_id_menu_01 = gen_menu.gm_id_menu '.
'AND gen_menu.gm_ce_site = '.$id_site_arrivee.') '.
'WHERE gmr_id_valeur = 1 '.
'AND gmr_id_menu_02 = 0 ';
$resultat_ordre_menu = $db->query($requete_ordre_menu);
(DB::isError($resultat_ordre_menu)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_update->getMessage(), $requete_ordre_menu)) : '';
$ligne = $resultat_ordre_menu->fetchRow(DB_FETCHMODE_ORDERED) ;
$ordre_max = $ligne[0];
$fp = fopen('dump.html','a+');
fwrite($fp,'<pre>'.(print_r($id_menu_a_deplacer,true)).'</pre>');
fclose($fp);
while(count($id_menu_a_deplacer) != 0) {
$ordre_max++ ;
// on extrait et supprime ce premier élément
$id_menu_en_cours = array_shift($id_menu_a_deplacer) ;
// on déplace le menu dans le nouveau site
$requete_deplacement = 'UPDATE gen_menu '.
'SET gm_ce_site = '.$id_site_arrivee.' '.
'WHERE gm_id_menu = '.$id_menu_en_cours.' ' ;
$resultat_deplacement = $db->query($requete_deplacement);
(DB::isError($resultat_deplacement)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_update->getMessage(), $requete_deplacement)) : '';
// on lui affecte un ordre dans le nouveau site et un père de 0
$requete_deplacement = 'UPDATE gen_menu_relation '.
'SET gmr_ordre = '.$ordre_max.', '.
'gmr_id_menu_02 = 0 '.
'WHERE gmr_id_menu_01 = '.$id_menu_en_cours.' '.
'AND gmr_id_valeur = 1' ;
$resultat_deplacement = $db->query($requete_deplacement);
(DB::isError($resultat_deplacement)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_update->getMessage(), $requete_deplacement)) : '';
$fp = fopen('dump.html','a+');
fwrite($fp,'id_menu_a_deplacer avant : '.(print_r($id_menu_a_deplacer,true)));
// on fait la différence entre le tableaux des menus à deplacer et le résultat du déplacement des fils pour ne pas déplacer
// deux fois des mêmes menus
$id_fils_deplaces = array() ;
ADME_deplacerFilsEtTraductionsMenuClassique($db,$id_site_arrivee,$id_menu_en_cours,$id_fils_deplaces);
$id_menu_a_deplacer = array_diff($id_menu_a_deplacer, $id_fils_deplaces) ;
fwrite($fp,'id_fils_deplaces : '.(print_r($id_fils_deplaces,true)));
fwrite($fp,'id_menu_a_deplacer après : '.(print_r($id_menu_a_deplacer,true)));
fclose($fp);
}
}
 
/** Fonction ADME_deplacerFilsMenuClassique() - Permet de traduire un menu classique
*
* Permet de traduire un menu classique
*
* @param mixed objet Pear DB de connexion à la base de données.
* @param integer identifiant du site d'arrivee.
* @param integer identifiant du menu pere.
* @param integer identifiant de la relation (père ou traduction).
* @param mixed le tableau contenant tous les fils déjà déplacés (attention c'est une référence)
* @return mixed un tableau contenant les id des fils deplaces.
*/
function ADME_deplacerFilsEtTraductionsMenuClassique($db, $id_site_arrivee, $id_menu_pere, &$tableau_fils) {
// Récupération d'infos sur le site principal d'arrivée.
$objet_site_arrivee = GEN_lireInfoSitePrincipal($db, $id_site_arrivee);
if ($objet_site_arrivee == false) {
return ('ERREUR Papyrus Administrateur de Menus : impossible de lire les infos du site d\'arrivée.<br />'.
'ID du site : '.$id_site_arrivee.'<br />'.
'Ligne n° : '. __LINE__ .'<br />'.
'Fichier n° : '. __FILE__ .'<br />');
}
// on fait la requete qui selectionne tous les enfants du père passé en paramètre
$requete_fils = 'SELECT gmr_id_menu_01 '.
'FROM gen_menu_relation '.
'WHERE gmr_id_menu_02 = '.$id_menu_pere.' '.
'AND gmr_id_valeur = 1 '.
'ORDER BY gmr_ordre' ;
$resultat_fils = $db->query($requete_fils);
(DB::isError($resultat_fils)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_fils->getMessage(), $requete_fils)) : '';
$id_fils_tab = array();
$i = 0 ;
$id_fils_string = '' ;
// pour chacun des fils
while($id_fils = $resultat_fils->fetchRow(DB_FETCHMODE_ORDERED)) {
// on ajoute son id au tableau
$id_fils_tab[$i] = $id_fils[0] ;
$i++;
$tableau_fils[] = $id_fils[0] ;
// on concatère l'id du fils pour la requete de déplacement des fils
$id_fils_string .= $id_fils[0].',' ;
}
$id_fils_string = rtrim($id_fils_string,',');
if($id_fils_string != '') {
// on déplace tous les fils
$requete_deplacement = 'UPDATE gen_menu SET '.
'gm_ce_site = '.$id_site_arrivee.' '.
'WHERE gm_id_menu IN ('.$id_fils_string.') ';
$resultat_deplacement = $db->query($requete_deplacement);
(DB::isError($resultat_deplacement)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_deplacement->getMessage(), $requete_deplacement)) : '';
}
// pour chacun des fils
foreach($id_fils_tab as $id_fils_en_cours) {
// et on rajoute le tableau de ses fils à la suite en relançant la fonction récursivement
ADME_deplacerFilsEtTraductionsMenuClassique($db,$id_site_arrivee,$id_fils_en_cours,$tableau_fils) ;
 
}
// on déplace toutes les traductions
$requete_deplacement_traductions = 'UPDATE gen_menu '.
'SET gm_ce_site = '.$id_site_arrivee.' '.
'WHERE gm_id_menu IN ( '.
'SELECT gmr_id_menu_01 '.
'FROM gen_menu_relation '.
'WHERE gmr_id_menu_02 = '.$id_menu_pere.' '.
'AND gmr_id_valeur = 2) ' ;
$resultat_deplacement_traductions = $db->query($requete_deplacement_traductions);
(DB::isError($resultat_deplacement_traductions)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_deplacement_traductions->getMessage(), $requete_deplacement_traductions)) : '';
 
}
 
 
/** Fonction ADME_traduireMenuClassique() - Permet de traduire un menu classique
*
* Permet de traduire un menu classique
*
* @param mixed objet Pear DB de connexion à la base de données.
* @param integer identifiant du site administré.
* @param integer identifiant du menu à déplacer.
* @return void modifie la base de données.
*/
function ADME_traduireMenuClassique($db, $auth, $adme_menu_id, $aso_valeurs) {
 
// Récupération d'infos sur le site principal.
$objet_site = GEN_lireInfoSitePrincipal($db, $aso_valeurs['adme_site_id']);
if ($objet_site == false) {
die('ERREUR Génésia Administrateur de Menus : impossible de lire les infos du site.<br />'.
'ID du site : '.$aso_valeurs['adme_site_id'].'<br />'.
'Ligne n° : '. __LINE__ .'<br />'.
'Fichier n° : '. __FILE__ .'<br />');
}
$nouveau_id_menu = SQL_obtenirNouveauId($db, 'gen_menu', 'gm_id_menu');
$auteur = $auth->getAuthData('ga_prenom').' '.$auth->getAuthData('ga_nom');
$requete = 'INSERT INTO gen_menu '.
'SET gm_id_menu = '.$nouveau_id_menu.', '.
'gm_ce_site = '.$aso_valeurs['adme_site_id'].', '.
'gm_ce_i18n = "'.$aso_valeurs['gs_ce_i18n'].'", '.
'gm_ce_application = '.$aso_valeurs['gm_ce_application'].', '.
'gm_application_arguments = "'.$aso_valeurs['gm_application_arguments'].'", '.
'gm_fichier_squelette = "'.$aso_valeurs['gm_fichier_squelette'].'", '.
'gm_code_num = '.$aso_valeurs['gm_code_num'].', '.
'gm_code_alpha = "'.$aso_valeurs['gm_code_alpha'].'", '.
'gm_nom = "'.$aso_valeurs['gm_nom'].'", '.
'gm_raccourci_clavier = "'.$aso_valeurs['gm_raccourci_clavier'].'", '.
'gm_robot = "'.$aso_valeurs['gm_robot'].'", '.
'gm_titre = "'.$aso_valeurs['gm_titre'].'", '.
'gm_titre_alternatif = "'.$aso_valeurs['gm_titre_alternatif'].'", '.
'gm_mots_cles = "'.$aso_valeurs['gm_mots_cles'].'", '.
'gm_description_libre = "'.$aso_valeurs['gm_description_libre'].'", '.
'gm_description_resume = "'.$aso_valeurs['gm_description_resume'].'", '.
'gm_description_table_matieres = "'.$aso_valeurs['gm_description_table_matieres'].'", '.
'gm_source = "'.$aso_valeurs['gm_source'].'", '.
'gm_auteur = "'.$aso_valeurs['gm_auteur'].'", '.
'gm_contributeur = "'.$aso_valeurs['gm_contributeur'].'", '.
'gm_editeur = "'.$aso_valeurs['gm_editeur'].'", '.
'gm_date_creation = "'.$aso_valeurs['gm_date_creation'].'", '.
'gm_date_debut_validite = "'.$aso_valeurs['gm_date_debut_validite'].'", '.
'gm_date_fin_validite = "'.$aso_valeurs['gm_date_fin_validite'].'", '.
'gm_date_copyright = "'.$aso_valeurs['gm_date_copyright'].'", '.
'gm_licence = "'.$aso_valeurs['gm_licence'].'", '.
'gm_categorie = "'.$aso_valeurs['gm_categorie'].'", '.
'gm_public = "'.$aso_valeurs['gm_public'].'", '.
'gm_public_niveau = "'.$aso_valeurs['gm_public_niveau'].'", '.
'gm_ce_type_portee_spatiale = "'.$aso_valeurs['gm_ce_type_portee_spatiale'].'", '.
'gm_portee_spatiale = "'.$aso_valeurs['gm_portee_spatiale'].'", '.
'gm_ce_type_portee_temporelle = "'.$aso_valeurs['gm_ce_type_portee_temporelle'].'", '.
'gm_portee_temporelle = "'.$aso_valeurs['gm_portee_temporelle'].'", '.
'gm_ce_admin = "'.$auth->getAuthData('ga_id_administrateur').'" ';
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
//----------------------------------------------------------------------------
// Ajout de la relation traduction
if (!isset($adme_menu_id) && empty($adme_menu_id)) {
$adme_menu_id = 0 ;// Identifiant du père
}
//----------------------------------------------------------------------------
// Récupération d'infos sur la hierarchie du menu
$requete = 'SELECT GMR01.gmr_ordre '.
'FROM gen_menu_relation AS GMR01, gen_menu_relation AS GMR02 '.
'WHERE GMR01.gmr_id_menu_02 = '.$adme_menu_id.' '.
'AND GMR01.gmr_id_valeur = 1 '.// 1 = avoir "père"
'AND GMR02.gmr_id_menu_01 = GMR01.gmr_id_menu_01 '.
'AND GMR02.gmr_id_menu_01 = GMR02.gmr_id_menu_02 '.
'AND GMR02.gmr_id_valeur = 100 '.// 100 = menu type "classique"
'ORDER BY GMR01.gmr_ordre DESC';
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
$ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
$nouveau_ordre_menu = $ligne->gmr_ordre + 1;
$resultat->free();
// Traduction :
$requete = 'INSERT INTO gen_menu_relation '.
'SET gmr_id_menu_01 = '.$adme_menu_id.', '.
'gmr_id_menu_02 = '.$nouveau_id_menu.', '.
'gmr_id_valeur = 2, '. // Avoir traduction
'gmr_ordre = '.$nouveau_ordre_menu;
 
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
//----------------------------------------------------------------------------
// Ajout de la relation-type "menu classique"
// Récupération d'infos sur la hierarchie du menu
$requete = 'SELECT * '.
'FROM gen_menu_relation, gen_menu '.
'WHERE gmr_id_menu_02 = gmr_id_menu_01 '.
'AND gmr_id_valeur = 100 '.// 100 = type menu "classique"
'AND gmr_id_menu_01 = gm_id_menu '.
'AND gm_ce_site = '.$aso_valeurs['adme_site_id'].' '.
'ORDER BY gmr_ordre DESC';
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
$ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
$nouveau_ordre_menu_classique = $ligne->gmr_ordre + 1;
$resultat->free();
$requete = 'INSERT INTO gen_menu_relation '.
'SET gmr_id_menu_01 = '.$nouveau_id_menu.', '.
'gmr_id_menu_02 = '.$nouveau_id_menu.', '.
'gmr_id_valeur = 100, '.
'gmr_ordre = '.$nouveau_ordre_menu_classique;
$result = $db->query($requete);
(DB::isError($result)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $result->getMessage(), $requete)) : '';
}
 
/** Fonction ADME_indenterMenuClassique() - Permet d'augmenter ou diminuer l'indentation d'un menu dans la
* hierarchie
*
* Permet d'augmenter ou diminuer l'indentation d'un menu dans la hierarchie
*
* @param mixed objet Pear DB de connexion à la base de données.
* @param integer identifiant du site administré.
* @param integer identifiant du menu à déplacer.
* @param boolean indique si on veut diminuer (gauche) l'indentation (true) ou augmenter (droite) l'indentation (false).
* @return void modifie la base de données.
*/
function ADME_indenterMenuClassique($db, $adme_site_id, $adme_menu_id, $bln_diminuer) {
 
//-------------------------------------------------------------------------------------------------------------------
// Récupération d'information sur le site de ce menu.
$objet_site = GEN_lireInfoSitePrincipal($db, $adme_site_id);
if ($objet_site == false) {
die('ERREUR Papyrus Administrateur de Menus : '.ADME_LG_ERREUR_INFO_SITE.'<br />'.
'Id du site : '. $adme_site_id .'<br />'.
'Ligne n° : '. __LINE__ .'<br />'.
'Fichier n° : '. __FILE__ .'<br />');
}
//-------------------------------------------------------------------------------------------------------------------
// Récupération d'informations sur les relations du menu courant.
$ligne_menu_courant_relation = GEN_lireInfoMenuRelation($db, $adme_menu_id, '1');
if ($ligne_menu_courant_relation == false) {
die('ERREUR Papyrus Administrateur de Menus : '.ADME_LG_ERREUR_INFO_MENU_RELATION.'<br />'.
'Identifiant menu : '. $adme_menu_id .'<br />'.
'Identifiant valeur relation : 1 <br />'.
'Ligne n° : '. __LINE__ .'<br />'.
'Fichier n° : '. __FILE__ .'<br />');
}
//-------------------------------------------------------------------------------------------------------------------
// Récupération de l'identifiant du menu pére
$id_pere = GEN_lireIdentifiantMenuPere($adme_menu_id);
if ($id_pere === false) {
die('ERREUR Papyrus Administrateur de Menus : '.ADME_LG_ERREUR_ID_MENU_PERE.'<br />'.
'Identifiant menu fils : '. $adme_menu_id .'<br />'.
'Ligne n° : '. __LINE__ .'<br />'.
'Fichier n° : '. __FILE__ .'<br />');
}
if ($bln_diminuer) {
// Diminution d'un niveau
if ($id_pere) {
// Récupération de l'identifiant du menu grand pére, sera le nouveau pere
$id_grand_pere = GEN_lireIdentifiantMenuPere($id_pere);
if ($id_grand_pere === false) {
die('ERREUR Papyrus Administrateur de Menus : '.ADME_LG_ERREUR_ID_MENU_PERE.'<br />'.
'Identifiant menu fils : '. $adme_menu_id .'<br />'.
'Ligne n° : '. __LINE__ .'<br />'.
'Fichier n° : '. __FILE__ .'<br />');
}
// Récupération d'informations sur les relations du menu pere
$ligne_menu_pere_relation = GEN_lireInfoMenuRelation($db, $id_pere, '1');
if ($ligne_menu_pere_relation == false) {
die('ERREUR Papyrus Administrateur de Menus : '.ADME_LG_ERREUR_INFO_MENU_RELATION.'<br />'.
'Identifiant menu : '. $adme_menu_id .'<br />'.
'Identifiant valeur relation : 1 <br />'.
'Ligne n° : '. __LINE__ .'<br />'.
'Fichier n° : '. __FILE__ .'<br />');
}
//-------------------------------------------------------------------------------------------------------------------
// Recherche d'information sur le menu suivant le menu pere
//-------------------------------------------------------------------------------------------------------------------
$requete = 'SELECT GMR01.gmr_ordre AS nouvel_ordre, GMR01.gmr_id_menu_01 AS id_menu_remplace '.
'FROM gen_menu, gen_menu_relation AS GMR01, gen_menu_relation AS GMR02 '.
'WHERE GMR02.gmr_id_menu_01 = GMR01.gmr_id_menu_01 '.
'AND GMR01.gmr_id_menu_01 = gm_id_menu './/jonction avec la table GEN_MENU
'AND gm_ce_site = '.$objet_site->gs_id_site.' '.
'AND GMR02.gmr_id_valeur = 100 '.// 100 = menu type "classique"
'AND GMR01.gmr_id_menu_02 = '.$id_grand_pere.' '.
'AND GMR01.gmr_id_valeur = 1 '.// 1 = relation menu "père"
'AND GMR01.gmr_ordre > '.$ligne_menu_pere_relation->gmr_ordre.' '.
'ORDER BY GMR01.gmr_ordre DESC';
$resultat_menu = $db->query($requete);
(DB::isError($resultat_menu)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_menu->getMessage(), $requete)) : '';
$ligne_menu = $resultat_menu->fetchRow(DB_FETCHMODE_OBJECT);
$resultat_menu->free();
//-------------------------------------------------------------------------------------------------------------------
// Si la requete ne retourne rien nous ne faisons rien.
if (! $ligne_menu) {
$no=$ligne_menu_pere_relation->gmr_ordre+1;
}
else {
$no=$ligne_menu->nouvel_ordre+1;
}
// Mise à jour pere menu courant
$requete = 'UPDATE gen_menu_relation SET '.
'gmr_id_menu_02 = '.$id_grand_pere.' ,'.
'gmr_ordre = '.$no.' '.
'WHERE gmr_id_menu_01 = '.$ligne_menu_courant_relation->gmr_id_menu_01.' '.
'AND gmr_id_valeur = 1';// 1 = relation menu "père"
$resultat_update = $db->query($requete);
(DB::isError($resultat_update)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_update->getMessage(), $requete)) : '';
}
}
else {
 
$requete = 'SELECT GMR01.gmr_id_menu_01 '.
'FROM gen_menu, gen_menu_relation AS GMR01, gen_menu_relation AS GMR02 '.
'WHERE GMR02.gmr_id_menu_01 = GMR01.gmr_id_menu_01 '.
'AND GMR01.gmr_id_menu_01 = gm_id_menu './/jonction avec la table GEN_MENU
'AND gm_ce_site = '.$objet_site->gs_id_site.' '.
'AND GMR02.gmr_id_valeur = 100 '.// 100 = menu type "classique"
'AND GMR01.gmr_id_menu_02 = '.$id_pere.' '.
'AND GMR01.gmr_id_valeur = 1 '.// 1 = relation menu "père"
'AND GMR01.gmr_ordre < '.$ligne_menu_courant_relation->gmr_ordre.' '.
'ORDER BY GMR01.gmr_ordre DESC';
$resultat_menu = $db->query($requete);
(DB::isError($resultat_menu)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_menu->getMessage(), $requete)) : '';
 
$ligne_menu = $resultat_menu->fetchRow(DB_FETCHMODE_OBJECT);
$resultat_menu->free();
//-------------------------------------------------------------------------------------------------------------------
// Si la requete ne retourne rien nous ne faisons rien.
if (! $ligne_menu) {
return null;
}
//----------------------------------------------------------------------------
// Recherche dernier fils
$requete = 'SELECT GMR01.gmr_ordre '.
'FROM gen_menu_relation AS GMR01, gen_menu_relation AS GMR02 '.
'WHERE GMR01.gmr_id_menu_02 = '.$ligne_menu->gmr_id_menu_01.' '.
'AND GMR01.gmr_id_valeur = 1 '.// 1 = avoir "père"
'AND GMR02.gmr_id_menu_01 = GMR01.gmr_id_menu_01 '.
'AND GMR02.gmr_id_menu_01 = GMR02.gmr_id_menu_02 '.
'AND GMR02.gmr_id_valeur = 100 '.// 100 = menu type "classique"
'ORDER BY GMR01.gmr_ordre DESC';
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
 
$ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
$resultat->free();
 
if (isset($ligne)) {
$no = $ligne->gmr_ordre + 1;
}
else {
$no = 1;
}
// Mise à jour pere menu courant
$requete = 'UPDATE gen_menu_relation SET '.
'gmr_id_menu_02 = '.$ligne_menu->gmr_id_menu_01.' ,'.
'gmr_ordre = '.$no.' '.
'WHERE gmr_id_menu_01 = '.$ligne_menu_courant_relation->gmr_id_menu_01.' '.
'AND gmr_id_valeur = 1';// 1 = relation menu "père"
$resultat_update = $db->query($requete);
(DB::isError($resultat_update)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_update->getMessage(), $requete)) : '';
}
}
 
 
/** Fonction ADME_supprimerMenuClassique() - Supprime un menu classique.
*
* Supprime de la base de données de Papyrus toutes les traces du menu classiques
* passé en paramètre.
* Ancien nom : deleteMenu()
*
* @param mixed l'objet Pear DB de connexion à la base de données.
* @param integer l'identifiant du site du menu à supprimer
* @param integer l'identifiant du menu à supprimer
* @return void le menu classique est supprimé de la base de données.
*/
function ADME_supprimerMenuClassique($db, $adme_id_site, $id_menu_a_supprimer)
{
$code_menu = GEN_lireInfoMenu($db, $id_menu_a_supprimer, DB_FETCHMODE_ASSOC);
//----------------------------------------------------------------------------
// Y a t'il des sous_menus
$requete = 'SELECT COUNT(gm_id_menu) AS compte '.
'FROM gen_menu, gen_menu_relation '.
'WHERE gmr_id_menu_02 = '.$id_menu_a_supprimer.' '.
'AND gmr_id_valeur = 1 '.
'AND gmr_id_menu_01 = gm_id_menu ';
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
$ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
if ($ligne && ($ligne->compte > 0)) {
return ADME_LG_ERREUR_EXISTE_SOUS_MENU;
}
//-------------------------------------------------------------------------------------------------------------------
// Mise à jour de l'ordre des menus
$ligne_menu_supr_relation = GEN_lireInfoMenuRelation($db, $id_menu_a_supprimer, '1'); // 1 = relation "avoir père"
$requete = 'SELECT GMR01.gmr_id_menu_01, GMR01.gmr_ordre '.
'FROM gen_menu, gen_menu_relation AS GMR01, gen_menu_relation AS GMR02 '.
'WHERE GMR02.gmr_id_menu_01 = GMR01.gmr_id_menu_01 '.
'AND GMR01.gmr_id_menu_01 = gm_id_menu './/jonction avec la table GEN_MENU
'AND gm_ce_site = '.$adme_id_site.' '.// le site du menu!
'AND GMR02.gmr_id_valeur = 100 '.// 100 = menu type "classique"
'AND GMR01.gmr_id_menu_02 = '.$ligne_menu_supr_relation->gmr_id_menu_02.' '.
'AND GMR01.gmr_id_valeur = 1 '.// 1 = relation menu "père"
'AND GMR01.gmr_ordre > '.$ligne_menu_supr_relation->gmr_ordre.' '.
'ORDER BY GMR01.gmr_ordre ASC';
$resultat = $db->query($requete);
while ($ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT)) {
// Mise à jour des relations hiérarchiques du menu courant
$requete_maj = 'UPDATE gen_menu_relation SET '.
'gmr_ordre = '.($ligne->gmr_ordre - 1).' '.
'WHERE gmr_id_menu_01 = '.$ligne->gmr_id_menu_01.' '.
'AND gmr_id_valeur = 1';// 1 = relation menu "père"
$resultat_maj = $db->query($requete_maj);
(DB::isError($resultat_maj)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_maj->getMessage(), $requete_maj)) : '';
}
$resultat->free();
//----------------------------------------------------------------------------
// S'il n'y a plus de sous niveau, on supprime le menu
$requete = 'DELETE FROM gen_menu '.
'WHERE gm_id_menu = '.$id_menu_a_supprimer;
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
//----------------------------------------------------------------------------
// Puis on supprime les relations de ce menu
$requete = 'DELETE FROM gen_menu_relation '.
'WHERE gmr_id_menu_01 = '.$id_menu_a_supprimer;
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
// Suppression du contenu !!!!
$requete = 'DELETE FROM gen_menu_contenu '.
'WHERE gmc_ce_menu= '.$id_menu_a_supprimer.' ';
 
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
}
 
/** Fonction ADME_supprimerMenuClassiqueTraduction() - Supprime une traduction de menu classique.
*
* Supprime de la base de données de Papyrus toutes les traces du menu classiques
* passé en paramètre.
* Ancien nom : deleteMenu()
*
* @param mixed l'objet Pear DB de connexion à la base de données.
* @param integer l'identifiant du site du menu à supprimer
* @param integer l'identifiant du menu à supprimer
* @return void le menu classique est supprimé de la base de données.
*/
function ADME_supprimerMenuClassiqueTraduction($db, $adme_id_site, $id_menu_a_supprimer)
{
$code_menu = GEN_lireInfoMenu($db, $id_menu_a_supprimer, DB_FETCHMODE_ASSOC);
if ($code_menu === false) {
die('ERREUR Papyrus Administrateur de Menus : '.ADME_LG_ERREUR_INFO_MENU.'<br />'.
'Idenitifiant du menu n° : '. $id_menu_a_supprimer .'<br />'.
'Ligne n° : '. __LINE__ .'<br />'.
'Fichier n° : '. __FILE__ .'<br />');
}
$requete = 'DELETE FROM gen_menu '.
'WHERE gm_id_menu = '.$id_menu_a_supprimer;
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
//----------------------------------------------------------------------------
// Puis on supprime les relations de ce menu
$requete = 'DELETE FROM gen_menu_relation '.
'WHERE gmr_id_menu_01 = '.$id_menu_a_supprimer;
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
//----------------------------------------------------------------------------
// Puis on supprime les relations de ce menu
$requete = 'DELETE FROM gen_menu_relation '.
'WHERE gmr_id_menu_02 = '.$id_menu_a_supprimer;
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
// Suppression du contenu !!!!
$requete = 'DELETE FROM gen_menu_contenu '.
'WHERE gmc_ce_menu = '.$id_menu_a_supprimer.' ';
 
 
 
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
}
 
function ADME_verifier_traduction_possible($db, $url, $adme_site_id, $adme_menu_id) {
$aso_valeurs = GEN_lireInfoMenu($db, $adme_menu_id, DB_FETCHMODE_ASSOC);
if ($aso_valeurs === false) {
die('ERREUR Papyrus Administrateur de Menus : '.ADME_LG_ERREUR_INFO_MENU.'<br />'.
'Idenitifiant du menu n° : '. $adme_menu_id .'<br />'.
'Ligne n° : '. __LINE__ .'<br />'.
'Fichier n° : '. __FILE__ .'<br />');
}
// Recherche liste des menu deja traduits
$requete = 'SELECT distinct gm_ce_i18n '.
'FROM gen_menu_relation, gen_menu '.
'WHERE gmr_id_menu_01 = ' . $adme_menu_id .' '.
'AND gm_id_menu = gmr_id_menu_02 '.
'AND gmr_id_valeur = 2 '; // 2 = "avoir traduction"
$resultat = $db->query($requete) ;
if (DB::isError($resultat)) {
die( BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete) );
}
$not_in_langue='';
if ( $resultat->numRows() == 0 ) {
$not_in_langue="gi_id_i18n not in('".$aso_valeurs['gm_ce_i18n']."')";
}
else {
while ($ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT)) {
$not_in_langue="'".$ligne->gm_ce_i18n."'".",".$not_in_langue;
$end="'".$ligne->gm_ce_i18n."'";
}
if ($not_in_langue) {
$not_in_langue="'".$aso_valeurs['gm_ce_i18n']."'".",".$not_in_langue;
$not_in_langue=' gi_id_i18n not in('.$not_in_langue.$end.')';
}
else {
$not_in_langue="gi_id_i18n not in('".$aso_valeurs['gm_ce_i18n']."')";
}
}
$requete = "SELECT * FROM gen_i18n where ".$not_in_langue;
 
$resultat = $db->query($requete) ;
if (DB::isError($resultat)) {
die( BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete) );
}
$retour = $resultat->numRows();
$resultat->free();
$message='';
if ($retour == 0) {
$message = '<p class="pap_erreur">Plus de traduction possible pour ce menu </p>';
}
return $message;
}
 
 
 
/** Fonction ADME_selectionnerMenuClassiqueTraduction()() Selection un menu classique comme traduction par defaut
*
*
* @param mixed l'objet Pear DB de connexion à la base de données.
* @param integer l'identifiant du site du menu à supprimer
* @param integer l'identifiant du menu à supprimer
* @return void le menu classique est supprimé de la base de données.
*/
function ADME_selectionnerMenuClassiqueTraduction($db, $adme_id_site, $id_menu)
{
// 1 : Rechercher traduction parente : si presente on est dans une traduc. si absente on
// est dans un menu en version originale
$requete_origine_traduction = 'SELECT gmr_id_menu_01 '.
'FROM gen_menu_relation, gen_menu '.
'WHERE gmr_id_menu_02 = ' . $id_menu .' '.
'AND gmr_id_valeur = 2 '; // 2 = "avoir traduction"
$resultat_origine_traduction = $db->query($requete_origine_traduction) ;
if (DB::isError($resultat_origine_traduction)) {
die( BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete_origine_traduction) );
}
if ($resultat_origine_traduction->numRows() > 0) {
$ligne_origine_traduction = $resultat_origine_traduction->fetchRow(DB_FETCHMODE_OBJECT);
$id_menu_origine=$ligne_origine_traduction->gmr_id_menu_01;
}
else {
$id_menu_origine=$id_menu;
}
 
$requete_suppression = 'DELETE from gen_menu_relation '.
'WHERE gmr_id_menu_01 = ' . $id_menu_origine . ' ' .
'AND gmr_id_valeur=105 '; // 105 Traduction par defaut
 
$resultat_suppression = $db->query($requete_suppression);
(DB::isError($resultat_suppression)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_suppression->getMessage(), $requete_suppression)) : '';
 
$requete_insertion = 'INSERT into gen_menu_relation '.
' SET gmr_id_menu_01 = ' . $id_menu_origine . ', ' .
' gmr_id_menu_02 = ' . $id_menu . ', ' .
' gmr_id_valeur = 105' ;
 
$resultat_insertion = $db->query($requete_insertion);
(DB::isError($resultat_insertion)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_insertion->getMessage(), $requete_insertion)) : '';
 
 
}
 
/** Fonction ADME_limiterMenuClassique() (limiter) un menu classique à la langue selectionne
*
*
* @param mixed l'objet Pear DB de connexion à la base de données.
* @param integer l'identifiant du site du menu à supprimer
* @param integer l'identifiant du menu à supprimer
* @return void le menu classique est supprimé de la base de données.
*/
function ADME_limiterMenuClassique($db, $adme_id_site, $id_menu, $zone)
{
 
$requete_insertion = 'INSERT into gen_menu_relation '.
' SET gmr_id_menu_01 = ' . $id_menu . ', ' .
' gmr_id_menu_02 = ' . $id_menu . ', ' .
' gmr_id_valeur = 106' ;
 
$resultat_insertion = $db->query($requete_insertion);
 
 
 
$requete_mise_a_jour = 'UPDATE gen_menu SET '.
'gm_ce_i18n = "'.$zone.'" '.
'WHERE gm_id_menu = '.$id_menu;
$resultat_mise_a_jour = $db->query($requete_mise_a_jour);
(DB::isError($resultat_mise_a_jour)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_mise_a_jour->getMessage(), $requete_mise_a_jour)) : '';
 
}
 
/** Fonction ADME_ouvrirMenuClassique() Ouvrir un menu classique à toutes les langues (suite à une fermeture)
*
*
* @param mixed l'objet Pear DB de connexion à la base de données.
* @param integer l'identifiant du site du menu à supprimer
* @param integer l'identifiant du menu à supprimer
* @return void le menu classique est supprimé de la base de données.
*/
function ADME_ouvrirMenuClassique($db, $adme_id_site, $id_menu)
{
 
$requete_suppression = 'DELETE from gen_menu_relation '.
'WHERE gmr_id_menu_01 = ' . $id_menu . ' ' .
'AND gmr_id_valeur=106 '; // 106 fermeture du menu
 
$resultat_suppression = $db->query($requete_suppression);
 
 
$requete_mise_a_jour = 'UPDATE gen_menu SET '.
'gm_ce_i18n = "'.GEN_I18N_ID_DEFAUT.'" '.
'WHERE gm_id_menu = '.$id_menu;
$resultat_mise_a_jour = $db->query($requete_mise_a_jour);
(DB::isError($resultat_mise_a_jour)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_mise_a_jour->getMessage(), $requete_mise_a_jour)) : '';
 
}
 
 
 
// +------------------------------------------------------------------------------------------------------+
// | PIED du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
 
 
/* +--Fin du code ----------------------------------------------------------------------------------------+
*
* $Log: not supported by cvs2svn $
* Revision 1.41 2007-10-24 14:43:02 ddelon
* Gestion des menus reservés à une langue
*
* Revision 1.40 2007-07-03 14:35:11 florian
* correction bug maj non prise en charge
*
* Revision 1.39 2007-07-03 14:07:02 florian
* correction bug maj non prise en charge
*
* Revision 1.38 2007-06-26 14:18:53 florian
* amélioration des formulaires des différentes applis de l'interface d'administration afin de les simplifier
*
* Revision 1.37 2006/10/16 15:49:07 ddelon
* Refactorisation code mulitlinguisme et gestion menu invisibles
*
* Revision 1.36 2006/10/06 13:38:45 florian
* ergonomie amélioree
*
* Revision 1.35 2006/09/07 13:45:56 jp_milcent
* Trie par ordre alphabétique des appli.
*
* Revision 1.34 2006/06/29 23:04:01 ddelon
* Bug defaut traduction sur menu commun
*
* Revision 1.33 2006/06/29 18:58:57 ddelon
* Multilinguisme : menu par defaut pour les menu commun
*
* Revision 1.32 2006/06/28 12:53:34 ddelon
* Multilinguisme : menu par defaut
*
* Revision 1.31 2006/04/12 21:11:54 ddelon
* Multilinguisme menus communs
*
* Revision 1.30 2006/03/27 14:33:04 ddelon
* Gestion suppression de contenu menu afficheur
*
* Revision 1.29 2006/03/23 20:24:59 ddelon
* *** empty log message ***
*
* Revision 1.28 2006/03/15 09:30:50 florian
* suppression des echos, qui entrainaient des problemes d'affichages
*
* Revision 1.27 2006/03/13 21:00:20 ddelon
* Suppression messages d'erreur multilinguisme
*
* Revision 1.26 2006/03/10 11:02:36 alexandre_tb
* remplacement de l'image "Traduire" par un texte "traduire" vu qu'on a pas d'image pour la notion de traduire...
*
* Revision 1.25 2006/03/02 10:49:49 ddelon
* Fusion branche multilinguisme dans branche principale
*
* Revision 1.24.2.1 2006/02/28 14:02:11 ddelon
* Finition multilinguisme
*
* Revision 1.24 2005/09/23 13:58:07 ddelon
* Php5, Projet et Redirection
*
* Revision 1.23 2005/09/20 17:01:22 ddelon
* php5 et bugs divers
*
* Revision 1.22 2005/07/08 21:13:15 ddelon
* Gestion indentation menu
*
* Revision 1.21 2005/05/26 16:13:08 jpm
* Correction taille éditeur: passage en text
*
* Revision 1.19 2005/05/26 15:34:46 jpm
* Ajout d'un espace.
*
* Revision 1.18 2005/05/26 08:54:20 jpm
* Ajout info admin ayant fait la dernière modif.
*
* Revision 1.17 2005/04/19 16:47:16 jpm
* Gestion des dates de fin de validité des menus.
*
* Revision 1.16 2005/03/29 15:49:12 jpm
* Ajout de la date de création dans le formulaire des menus.
*
* Revision 1.15 2005/02/28 11:05:06 jpm
* Modification des auteurs.
*
* Revision 1.14 2004/12/01 16:47:28 jpm
* Ajout d'une boite javascript de confirmation de suppression d'un menu.
*
* Revision 1.13 2004/11/29 18:34:51 jpm
* Correction bogue checkbox.
*
* Revision 1.12 2004/11/15 16:51:12 jpm
* Correction bogue de mise à jour de l'ordre des menus.
*
* Revision 1.11 2004/11/10 19:41:14 jpm
* Correction bogue.
*
* Revision 1.10 2004/11/10 17:26:07 jpm
* Fin gestion de la traduction.
*
* Revision 1.9 2004/11/09 17:53:00 jpm
* Changement des noms des actions sur les menus classiques.
*
* Revision 1.8 2004/11/09 17:48:35 jpm
* Gestion de différentes interfaces d'administration.
*
* Revision 1.7 2004/11/09 12:37:34 jpm
* Fin de gestion des menus et mise en conformité avec la convention de codage.
*
* Revision 1.6 2004/11/08 17:40:07 jpm
* Gestion correcte de l'ouverture et fermeture des menus.
* Utilisation des sessions.
*
* Revision 1.5 2004/11/04 19:11:38 jpm
* Mise en conformité vis à vis de la convention de codage.
* Amélioration de la récursivité de la gestion de l'affichage des menus.
*
* Revision 1.4 2004/10/25 16:27:42 jpm
* Correction d'un bogue dans la gestion du déplacement des menus.
*
* Revision 1.3 2004/09/23 17:45:13 jpm
* Amélioration de la gestion des liens annuler et du selecteur de sites.
*
* Revision 1.2 2004/07/06 17:07:37 jpm
* Modification de la documentation pour une mailleur analyse par PhpDocumentor.
*
* Revision 1.1 2004/06/16 15:04:32 jpm
* Changement de nom de Génésia en Papyrus.
* Changement de l'arborescence.
*
* Revision 1.27 2004/05/10 12:13:03 jpm
* Modification des formulaires.
*
* Revision 1.26 2004/05/07 16:31:20 jpm
* Amélioration du formulaire d'un menu classique.
*
* Revision 1.25 2004/05/07 07:23:53 jpm
* Amélioration du code, des commentaires et correction de bogues.
*
*
* +-- Fin du code ----------------------------------------------------------------------------------------+
*/
?>
/trunk/papyrus/applications/admin_menu/bibliotheque/adme_menu_commun.fonct.php
1547,12 → 1547,15
 
/* +--Fin du code ----------------------------------------------------------------------------------------+
*
* $Log: not supported by cvs2svn $
* $Log: adme_menu_commun.fonct.php,v $
* Revision 1.28 2007-10-24 14:43:02 ddelon
* Gestion des menus reservés à une langue
*
* Revision 1.27 2006-10-16 15:49:07 ddelon
* Refactorisation code mulitlinguisme et gestion menu invisibles
*
* Revision 1.26 2006/10/06 13:38:45 florian
* ergonomie amélioree
* ergonomie amélioree
*
* Revision 1.25 2006/09/20 12:09:16 ddelon
* bug suppression contenu du menu commun
/trunk/papyrus/applications/admin_menu/langues/adme_langue_es.inc.php
257,7 → 257,10
 
/* +--Fin du code ----------------------------------------------------------------------------------------+
*
* $Log: not supported by cvs2svn $
* $Log: adme_langue_es.inc.php,v $
* Revision 1.3 2006-09-27 10:02:08 alexandre_tb
* Ajout de constante de traduction
*
* Revision 1.2 2006/09/27 09:20:28 alexandre_tb
* Ajout de constante de traduction
*
/trunk/papyrus/applications/admin_menu/langues/adme_langue_fr.inc.php
1,337 → 1,343
<?php
/*vim: set expandtab tabstop=4 shiftwidth=4: */
// Copyright (C) 1999-2004 Tela Botanica (accueil@tela-botanica.org)
//
// Ce logiciel est un programme informatique servant à gérer du contenu et des
// applications web.
// Ce logiciel est régi par la licence CeCILL soumise au droit français et
// respectant les principes de diffusion des logiciels libres. Vous pouvez
// utiliser, modifier et/ou redistribuer ce programme sous les conditions
// de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
// sur le site "http://www.cecill.info".
 
// En contrepartie de l'accessibilité au code source et des droits de copie,
// de modification et de redistribution accordés par cette licence, il n'est
// offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
// seule une responsabilité restreinte pèse sur l'auteur du programme, le
// titulaire des droits patrimoniaux et les concédants successifs.
 
// A cet égard l'attention de l'utilisateur est attirée sur les risques
// associés au chargement, à l'utilisation, à la modification et/ou au
// développement et à la reproduction du logiciel par l'utilisateur étant
// donné sa spécificité de logiciel libre, qui peut le rendre complexe à
// manipuler et qui le réserve donc à des développeurs et des professionnels
// avertis possédant des connaissances informatiques approfondies. Les
// utilisateurs sont donc invités à charger et tester l'adéquation du
// logiciel à leurs besoins dans des conditions permettant d'assurer la
// sécurité de leurs systèmes et ou de leurs données et, plus généralement,
// à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
 
// Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
// pris connaissance de la licence CeCILL, et que vous en avez accepté les
// termes.
// ----
// CVS : $Id: adme_langue_fr.inc.php,v 1.19 2007-10-25 14:26:56 ddelon Exp $
/**
* Gestion des langues de l'application ADME
*
* Contient les constantes pour la langue française de l'application ADME.
*
*@package Admin_menu
*@subpackage Langues
//Auteur original :
*@author Jean-Pascal MILCENT <jpm@tela-botanica.org>
//Autres auteurs :
*@author Aucun
*@copyright Tela-Botanica 2000-2004
*@version $Revision: 1.19 $ $Date: 2007-10-25 14:26:56 $
// +------------------------------------------------------------------------------------------------------+
*/
 
// +------------------------------------------------------------------------------------------------------+
// | ENTETE du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
 
 
 
// +------------------------------------------------------------------------------------------------------+
// | CORPS du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
define ('ADME_IDENTIFIEZ_VOUS','Veuillez vous identifier pour acc&egrave;der &agrave; ce menu.');
// Le formulaire de sélection du site dont les menus doivent être administrer :
define('ADME_LG_FORM_SITE_TITRE', 'Listes des sites');
define('ADME_LG_FORM_SITE_CHOIX', 'Choix du site à administrer : ');
define('ADME_LG_FORM_SITE_VALIDER', 'OK');
// Les titres de l'arborescence des menus à administrer:
define('ADME_LG_MENU_TITRE', 'Configuration des menus du site : ');
define('ADME_LG_MENU_CLASSIQUE_RACINE', 'Ajouter un menu classique');
define('ADME_LG_MENU_COMMUN_RACINE', 'Ajouter un menu commun');
 
// Les actions des menus classiques:
define('ADME_LG_ACTION_CLASSIQUE_MODIFIER', 'menu_classique_modifier');
define('ADME_LG_ACTION_CLASSIQUE_MODIFIER_ACTION', 'menu_classique_modifier_action');
define('ADME_LG_ACTION_CLASSIQUE_MODIFIER_ALT', 'Modifier');
define('ADME_LG_ACTION_CLASSIQUE_MODIFIER_TITLE', 'Modifier ce menu');
 
define('ADME_LG_ACTION_CLASSIQUE_MONTER', 'menu_classique_monter');
define('ADME_LG_ACTION_CLASSIQUE_MONTER_ALT', 'Monter');
define('ADME_LG_ACTION_CLASSIQUE_MONTER_TITLE', 'Monter ce menu');
 
define('ADME_LG_ACTION_CLASSIQUE_DESCENDRE', 'menu_classique_descendre');
define('ADME_LG_ACTION_CLASSIQUE_DESCENDRE_ALT', 'Descendre');
define('ADME_LG_ACTION_CLASSIQUE_DESCENDRE_TITLE', 'Descendre ce menu');
 
define('ADME_LG_ACTION_CLASSIQUE_DIMINUER', 'menu_classique_diminuer');
define('ADME_LG_ACTION_CLASSIQUE_DIMINUER_ALT', 'Diminuer');
define('ADME_LG_ACTION_CLASSIQUE_DIMINUER_TITLE', 'Diminuer d\'un niveau ce menu');
 
define('ADME_LG_ACTION_CLASSIQUE_AUGMENTER', 'menu_classique_augmenter');
define('ADME_LG_ACTION_CLASSIQUE_AUGMENTER_ALT', 'Augmenter');
define('ADME_LG_ACTION_CLASSIQUE_AUGMENTER_TITLE', 'Augmenter d\'un niveau ce menu');
 
define('ADME_LG_ACTION_CLASSIQUE_TRADUIRE', 'menu_classique_traduire');
define('ADME_LG_ACTION_CLASSIQUE_TRADUIRE_ACTION', 'menu_classique_traduire_action');
define('ADME_LG_ACTION_CLASSIQUE_TRADUIRE_ALT', 'Traduire');
define('ADME_LG_ACTION_CLASSIQUE_TRADUIRE_TITLE', 'Traduire ce menu');
 
define('ADME_LG_ACTION_CLASSIQUE_SUPPRIMER', 'menu_classique_supprimer');
define('ADME_LG_ACTION_CLASSIQUE_SUPPRIMER_ALT', 'Supprimer');
define('ADME_LG_ACTION_CLASSIQUE_SUPPRIMER_TITLE', 'Supprimer ce menu');
 
define('ADME_LG_ACTION_CLASSIQUE_SUPPRIMER_TRADUCTION', 'menu_classique_supprimer_traduction');
define('ADME_LG_ACTION_CLASSIQUE_SUPPRIMER_TRADUCTION_ALT', 'Supprimer');
define('ADME_LG_ACTION_CLASSIQUE_SUPPRIMER_TRADUCTION_TITLE', 'Supprimer ce menu');
 
define('ADME_LG_ACTION_CLASSIQUE_AJOUTER', 'menu_classique_ajouter');
define('ADME_LG_ACTION_CLASSIQUE_AJOUTER_ALT', 'Ajouter');
define('ADME_LG_ACTION_CLASSIQUE_AJOUTER_TITLE', 'Ajouter ce menu');
 
define('ADME_LG_ACTION_CLASSIQUE_VERIFIER', 'menu_classique_verifier');
define('ADME_LG_ACTION_CLASSIQUE_VERIFIER_TRADUCTION', 'menu_classique_verifier_traduction');
 
 
define('ADME_LG_ACTION_CLASSIQUE_TRADUCTION_DEFAUT', 'menu_classique_traduction_defaut');
define('ADME_LG_ACTION_CLASSIQUE_TRADUCTION_DEFAUT_ALT', 'Choisir ce menu comme traduction par défaut');
define('ADME_LG_ACTION_CLASSIQUE_TRADUCTION_DEFAUT_TITLE', 'Choisir ce menu comme traduction par défaut');
 
define ('ADME_LG_ACTION_CLASSIQUE_LIMITER', 'menu_classique_limiter');
define ('ADME_LG_ACTION_CLASSIQUE_LIMITER_TITLE', 'Restreindre le menu &agrave cette langue');
define ('ADME_LG_ACTION_CLASSIQUE_OUVRIR', 'menu_classique_ouvrir');
define ('ADME_LG_ACTION_CLASSIQUE_OUVRIR_TITLE', 'Faire apparaitre ce menu dans toutes les langues');
 
define('ADME_LG_ACTION_COMMUN_TRADUCTION_DEFAUT', 'menu_classique_traduction_defaut');
define('ADME_LG_ACTION_COMMUN_TRADUCTION_DEFAUT_ALT', 'Choisir ce menu comme traduction par défaut');
define('ADME_LG_ACTION_COMMUN_TRADUCTION_DEFAUT_TITLE', 'Choisir ce menu comme traduction par défaut');
 
 
// Les actions des menus communs:
define('ADME_LG_ACTION_COMMUN_MODIFIER', 'menu_commun_modifier');
define('ADME_LG_ACTION_COMMUN_MODIFIER_ALT', 'Modifier');
define('ADME_LG_ACTION_COMMUN_MODIFIER_ACTION', 'menu_commun_modifier_action');
define('ADME_LG_ACTION_COMMUN_MODIFIER_TITLE', 'Modifier ce menu');
 
define('ADME_LG_ACTION_COMMUN_MONTER', 'menu_commun_monter');
define('ADME_LG_ACTION_COMMUN_MONTER_ALT', 'Monter');
define('ADME_LG_ACTION_COMMUN_MONTER_TITLE', 'Monter ce menu');
 
define('ADME_LG_ACTION_COMMUN_DESCENDRE', 'menu_commun_descendre');
define('ADME_LG_ACTION_COMMUN_DESCENDRE_ALT', 'Descendre');
define('ADME_LG_ACTION_COMMUN_DESCENDRE_TITLE', 'Descendre ce menu');
 
define('ADME_LG_ACTION_COMMUN_DIMINUER', 'menu_commun_diminuer');
define('ADME_LG_ACTION_COMMUN_DIMINUER_ALT', 'Diminuer');
define('ADME_LG_ACTION_COMMUN_DIMINUER_TITLE', 'Diminuer d\'un niveau ce menu');
 
define('ADME_LG_ACTION_COMMUN_AUGMENTER', 'menu_commun_augmenter');
define('ADME_LG_ACTION_COMMUN_AUGMENTER_ALT', 'Augmenter');
define('ADME_LG_ACTION_COMMUN_AUGMENTER_TITLE', 'Augmenter d\'un niveau ce menu');
 
define('ADME_LG_ACTION_COMMUN_TRADUIRE', 'menu_commun_traduire');
define('ADME_LG_ACTION_COMMUN_TRADUIRE_ACTION', 'menu_commun_traduire_action');
define('ADME_LG_ACTION_COMMUN_TRADUIRE_ALT', 'Traduire');
define('ADME_LG_ACTION_COMMUN_TRADUIRE_TITLE', 'Traduire ce menu');
 
define('ADME_LG_ACTION_COMMUN_SUPPRIMER', 'menu_commun_supprimer');
define('ADME_LG_ACTION_COMMUN_SUPPRIMER_ALT', 'Supprimer');
define('ADME_LG_ACTION_COMMUN_SUPPRIMER_TITLE', 'Supprimer ce menu');
 
define('ADME_LG_ACTION_COMMUN_SUPPRIMER_TRADUCTION', 'menu_commun_supprimer_traduction');
define('ADME_LG_ACTION_COMMUN_SUPPRIMER_TRADUCTION_ALT', 'Supprimer');
define('ADME_LG_ACTION_COMMUN_SUPPRIMER_TRADUCTION_TITLE', 'Supprimer ce menu');
 
 
define('ADME_LG_ACTION_COMMUN_AJOUTER', 'menu_commun_ajouter');
define('ADME_LG_ACTION_COMMUN_AJOUTER_ALT', 'Ajouter');
define('ADME_LG_ACTION_COMMUN_AJOUTER_TITLE', 'Ajouter ce menu');
 
define('ADME_LG_ACTION_COMMUN_VERIFIER', 'menu_commun_verifier');
define ('ADME_LG_ACTION_COMMUN_VERIFIER_TRADUCTION','menu_commun_verifier_traduction');
 
 
// Les actions générales:
define('ADME_LG_ACTION_ADMINISTRER', 'administrer');
define('ADME_LG_ACTION_ADMINISTRER_ALT', 'Administrer');
define('ADME_LG_ACTION_ADMINISTRER_TITLE', 'Administrer l\'application de ce menu');
 
define('ADME_LG_ACTION_PLIER', 'adme_menu_fermer');
define('ADME_LG_ACTION_PLIER_ALT', 'Plier');
 
define('ADME_LG_ACTION_DEPLIER', 'adme_menu_ouvrir');
define('ADME_LG_ACTION_DEPLIER_ALT', 'Déplier');
 
define('ADME_LG_ACTION_SUPPRIMER_CONFIRMATION', 'Êtes vous sûr de vouloir supprimer ce menu?');
 
// Les erreurs:
define('ADME_LG_ERREUR_INFO_MENU', 'impossible de lire les infos du menu.');
define('ADME_LG_ERREUR_INFO_SITE', 'impossible de lire les infos du site.');
define('ADME_LG_ERREUR_INFO_MENU_RELATION', 'impossible de lire les infos sur les relations du menu.');
define('ADME_LG_ERREUR_ID_MENU_PERE', 'impossible de lire identifiant du menu père.');
define('ADME_LG_ERREUR_CODE_NUM', "La valeur %s pour le champ \"Code numérique\" existe déjà.");
define('ADME_LG_ERREUR_CODE_ALPHA', "La valeur %s pour le champ \"Code alphanumérique\" existe déjà.");
define('ADME_LG_ERREUR_EXISTE_SOUS_MENU', 'Ce menu contient encore des sous menus. Veuillez commencez par supprimer ces sous menus.');
 
// Le formulaire de modification d'un menu :
define('ADME_LG_FORM_MENU_CLASSIQUE_TITRE_GENERAL', 'Modification menu');
define('ADME_LG_FORM_MENU_COMMUN_TITRE_GENERAL', 'Modification menu commun');
 
define('ADME_LG_FORM_MENU_CLASSIQUE_TITRE_GENERAL_TRADUCTION', 'Traduction menu');
define('ADME_LG_FORM_MENU_COMMUN_TITRE_GENERAL_TRADUCTION', 'Traduction menu commun');
 
define('ADME_LG_FORM_MENU_CLASSIQUE_TITRE_CONFIG', 'Configuration du menu');
define('ADME_LG_FORM_MENU_COMMUN_TITRE_CONFIG', 'Configuration du menu commun');
define('ADME_LG_FORM_MENU_ID', 'Identifiant de ce menu : ');
define('ADME_LG_FORM_MENU_CODE_NUM', 'Code numérique du menu');
define('ADME_LG_FORM_MENU_REGLE_CODE_NUM', 'Un code numérique est requis pour le menu !');
define('ADME_LG_FORM_MENU_CODE_ALPHA', 'Code alphanumérique du menu');
define('ADME_LG_FORM_MENU_REGLE_CODE_ALPHA', 'Un code alphanumérique est requis pour le menu !');
define('ADME_LG_FORM_MENU_NOM', 'Nom du menu');
define('ADME_LG_FORM_MENU_REGLE_NOM', 'Un nom est requis pour le menu !');
define('ADME_LG_FORM_MENU_RACCOURCI', 'Raccourci clavier');
define('ADME_LG_FORM_MENU_DEFAUT', 'En faire le menu par défaut');
define('ADME_LG_FORM_MENU_FICHIER_SQUELETTE', 'Fichier squelette');
define('ADME_LG_FORM_MENU_INFO_BULLE', 'Contenu info-bulle');
define('ADME_LG_FORM_MENU_REGLE_INFO_BULLE', 'Une description courte pour l\'info-bulle est requise pour ce menu !');
define('ADME_LG_FORM_MENU_APPLI', 'Application');
define('ADME_LG_FORM_MENU_APPLI_ARGUMENT', 'Arguments de l\'application');
 
define('ADME_LG_FORM_MENU_CLASSIQUE_TITRE_ENTETE', 'Entête des pages du menu');
define('ADME_LG_FORM_MENU_COMMUN_TITRE_ENTETE', 'Entête des pages du menu commun');
define('ADME_LG_FORM_MENU_ROBOT', 'Indexation par robots');
define('ADME_LG_FORM_MENU_INDEX_FOLLOW', 'Indexer cette page et les suivantes');
define('ADME_LG_FORM_MENU_INDEX', 'Indexer seulement cette page');
define('ADME_LG_FORM_MENU_NOINDEX_NOFOLLOW', 'Ne pas indexer cette page et les suivantes');
define('ADME_LG_FORM_MENU_NOINDEX', 'Ne pas indexer cette page');
define('ADME_LG_FORM_MENU_INDEX_VIDE', 'Aucune');
define('ADME_LG_FORM_MENU_TITRE', 'Titre de la page');
define('ADME_LG_FORM_MENU_TITRE_ALTERNATIF', 'Titre alternatif de la page');
define('ADME_LG_FORM_MENU_MOT_CLE', 'Mots-clés');
define('ADME_LG_FORM_MENU_DESCRIPTION', 'Description du contenu');
define('ADME_LG_FORM_MENU_TABLE_MATIERE', 'Table des matières');
define('ADME_LG_FORM_MENU_SOURCE', 'Source');
define('ADME_LG_FORM_MENU_AUTEUR', 'Auteur');
define('ADME_LG_FORM_MENU_CONTRIBUTEUR', 'Contributeur');
define('ADME_LG_FORM_MENU_EDITEUR', 'Éditeur');
define('ADME_LG_FORM_MENU_DATE_CREATION', 'Date de création');
define('ADME_LG_FORM_MENU_DATE_VALIDITE_DEBUT', 'Date de début de validité');
define('ADME_LG_FORM_MENU_DATE_VALIDITE_FIN', 'Date de fin de validité');
define('ADME_LG_FORM_MENU_DATE_COPYRIGHT', 'Année pour le copyright');
define('ADME_LG_FORM_MENU_URL_LICENCE', 'URL de la licence');
define('ADME_LG_FORM_MENU_CATEGORIE', 'Catégorie');
define('ADME_LG_FORM_MENU_PUBLIC', 'Public pour la page');
define('ADME_LG_FORM_MENU_PUBLIC_NIVEAU', 'Niveau du public pour la page');
define('ADME_LG_FORM_MENU_ZG_TYPE', 'Type de portée spatiale');
define('ADME_LG_FORM_MENU_ZG_VALEUR', 'Portée spatiale de la page');
define('ADME_LG_FORM_MENU_ZG_VIDE', 'Aucun');
define('ADME_LG_FORM_MENU_ZG_ISO', 'Code de pays sur deux lettres (iso3166)');
define('ADME_LG_FORM_MENU_ZG_DC', 'Représentation des régions géographiques du Dublin Core');
define('ADME_LG_FORM_MENU_ZG_POINT', 'Point géographique');
define('ADME_LG_FORM_MENU_ZG_GTGN', 'Noms issus du Getty Thesaurus of Geographic Names');
define('ADME_LG_FORM_MENU_TMP_TYPE', 'Type de portée temporelle');
define('ADME_LG_FORM_MENU_TMP_VALEUR', 'Portée temporelle de la page');
define('ADME_LG_FORM_MENU_TMP_VIDE', 'Aucun');
define('ADME_LG_FORM_MENU_TMP_W3C', 'Codage des dates et heures du W3C');
define('ADME_LG_FORM_MENU_TMP_DC', 'Représentation des intervalles de temps du Dublin Core');
 
define('ADME_LG_FORM_MENU_VALIDER', 'Enregistrer');
define('ADME_LG_FORM_MENU_ANNULER', 'Annuler');
define('ADME_LG_FORM_TXT_CHP_OBLIGATOIRE', 'Indique les champs obligatoires');
define('ADME_LG_FORM_SYMBOLE_CHP_OBLIGATOIRE', '*');
define ('ADME_VOIR_CONFIG_AVANCEE', 'Afficher/Cacher la configuration avanc&eacute;e');
define ('ADME_CONFIG_AVANCEE', 'Configuration avanc&eacute;e');
 
 
// Charactère spéciaux:
define('ADME_LG_PARENTHESE_OUVRANTE', '(');
define('ADME_LG_PARENTHESE_FERMANTE', ')');
define('ADME_LG_SLASH', '/');
// +------------------------------------------------------------------------------------------------------+
// | PIED du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
 
 
/* +--Fin du code ----------------------------------------------------------------------------------------+
*
* $Log: not supported by cvs2svn $
* Revision 1.18 2007-10-25 10:08:55 alexandre_tb
* nouvelle constante multilinguisme
*
* Revision 1.17 2007-06-26 14:18:53 florian
* amélioration des formulaires des différentes applis de l'interface d'administration afin de les simplifier
*
* Revision 1.16 2006/10/06 10:40:51 florian
* harmonisation des messages d'erreur de l'authentification
*
* Revision 1.15 2006/06/29 18:58:57 ddelon
* Multilinguisme : menu par defaut pour les menu commun
*
* Revision 1.14 2006/06/28 12:53:34 ddelon
* Multilinguisme : menu par defaut
*
* Revision 1.13 2006/05/10 16:02:49 ddelon
* Finition multilinguise et schizo flo
*
* Revision 1.12 2006/05/10 15:01:57 florian
* ajout de constantes, pour éviter les warnings
*
* Revision 1.11 2006/04/12 21:11:54 ddelon
* Multilinguisme menus communs
*
* Revision 1.10 2006/03/23 20:24:58 ddelon
* *** empty log message ***
*
* Revision 1.9 2006/03/13 21:00:20 ddelon
* Suppression messages d'erreur multilinguisme
*
* Revision 1.8 2006/03/02 10:49:49 ddelon
* Fusion branche multilinguisme dans branche principale
*
* Revision 1.7.2.1 2006/02/28 14:02:10 ddelon
* Finition multilinguisme
*
* Revision 1.7 2005/07/18 16:14:32 ddelon
* css admin + menu communs
*
* Revision 1.6 2005/07/08 21:13:15 ddelon
* Gestion indentation menu
*
* Revision 1.5 2005/05/26 15:45:09 jpm
* Ajout d'une majuscule accentuée.
*
* Revision 1.4 2005/03/29 15:49:31 jpm
* Ajout de la constante pour la date de création dans le formulaire des menus.
*
* Revision 1.3 2004/12/01 16:47:07 jpm
* Ajout d'un texte pour la boite javascript de confirmation de suppression de menu.
*
* Revision 1.2 2004/11/10 17:26:12 jpm
* Fin gestion de la traduction.
*
* Revision 1.1 2004/11/10 11:58:31 jpm
* Début de la traduction de l'appli.
*
*
* +-- Fin du code ----------------------------------------------------------------------------------------+
*/
<?php
/*vim: set expandtab tabstop=4 shiftwidth=4: */
// Copyright (C) 1999-2004 Tela Botanica (accueil@tela-botanica.org)
//
// Ce logiciel est un programme informatique servant à gérer du contenu et des
// applications web.
// Ce logiciel est régi par la licence CeCILL soumise au droit français et
// respectant les principes de diffusion des logiciels libres. Vous pouvez
// utiliser, modifier et/ou redistribuer ce programme sous les conditions
// de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
// sur le site "http://www.cecill.info".
 
// En contrepartie de l'accessibilité au code source et des droits de copie,
// de modification et de redistribution accordés par cette licence, il n'est
// offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
// seule une responsabilité restreinte pèse sur l'auteur du programme, le
// titulaire des droits patrimoniaux et les concédants successifs.
 
// A cet égard l'attention de l'utilisateur est attirée sur les risques
// associés au chargement, à l'utilisation, à la modification et/ou au
// développement et à la reproduction du logiciel par l'utilisateur étant
// donné sa spécificité de logiciel libre, qui peut le rendre complexe à
// manipuler et qui le réserve donc à des développeurs et des professionnels
// avertis possédant des connaissances informatiques approfondies. Les
// utilisateurs sont donc invités à charger et tester l'adéquation du
// logiciel à leurs besoins dans des conditions permettant d'assurer la
// sécurité de leurs systèmes et ou de leurs données et, plus généralement,
// à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
 
// Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
// pris connaissance de la licence CeCILL, et que vous en avez accepté les
// termes.
// ----
// CVS : $Id: adme_langue_fr.inc.php,v 1.19 2007-10-25 14:26:56 ddelon Exp $
/**
* Gestion des langues de l'application ADME
*
* Contient les constantes pour la langue française de l'application ADME.
*
*@package Admin_menu
*@subpackage Langues
//Auteur original :
*@author Jean-Pascal MILCENT <jpm@tela-botanica.org>
//Autres auteurs :
*@author Aucun
*@copyright Tela-Botanica 2000-2004
*@version $Revision: 1.19 $ $Date: 2007-10-25 14:26:56 $
// +------------------------------------------------------------------------------------------------------+
*/
 
// +------------------------------------------------------------------------------------------------------+
// | ENTETE du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
 
 
 
// +------------------------------------------------------------------------------------------------------+
// | CORPS du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
define ('ADME_IDENTIFIEZ_VOUS','Veuillez vous identifier pour acc&egrave;der &agrave; ce menu.');
// Le formulaire de sélection du site dont les menus doivent être administrer :
define('ADME_LG_FORM_SITE_TITRE', 'Listes des sites');
define('ADME_LG_FORM_SITE_CHOIX', 'Choix du site à administrer : ');
define('ADME_LG_FORM_SITE_VALIDER', 'OK');
// Les titres de l'arborescence des menus à administrer:
define('ADME_LG_MENU_TITRE', 'Configuration des menus du site : ');
define('ADME_LG_MENU_CLASSIQUE_RACINE', 'Ajouter un menu classique');
define('ADME_LG_MENU_COMMUN_RACINE', 'Ajouter un menu commun');
 
// Les actions des menus classiques:
define('ADME_LG_ACTION_CLASSIQUE_DEPLACER_MENUS', 'menu_classique_deplacer');
define('ADME_LG_MENU_DEPLACER', 'Deplacer les menus sélectionnés vers :');
 
define('ADME_LG_ACTION_CLASSIQUE_MODIFIER', 'menu_classique_modifier');
define('ADME_LG_ACTION_CLASSIQUE_MODIFIER_ACTION', 'menu_classique_modifier_action');
define('ADME_LG_ACTION_CLASSIQUE_MODIFIER_ALT', 'Modifier');
define('ADME_LG_ACTION_CLASSIQUE_MODIFIER_TITLE', 'Modifier ce menu');
 
define('ADME_LG_ACTION_CLASSIQUE_MONTER', 'menu_classique_monter');
define('ADME_LG_ACTION_CLASSIQUE_MONTER_ALT', 'Monter');
define('ADME_LG_ACTION_CLASSIQUE_MONTER_TITLE', 'Monter ce menu');
 
define('ADME_LG_ACTION_CLASSIQUE_DESCENDRE', 'menu_classique_descendre');
define('ADME_LG_ACTION_CLASSIQUE_DESCENDRE_ALT', 'Descendre');
define('ADME_LG_ACTION_CLASSIQUE_DESCENDRE_TITLE', 'Descendre ce menu');
 
define('ADME_LG_ACTION_CLASSIQUE_DIMINUER', 'menu_classique_diminuer');
define('ADME_LG_ACTION_CLASSIQUE_DIMINUER_ALT', 'Diminuer');
define('ADME_LG_ACTION_CLASSIQUE_DIMINUER_TITLE', 'Diminuer d\'un niveau ce menu');
 
define('ADME_LG_ACTION_CLASSIQUE_AUGMENTER', 'menu_classique_augmenter');
define('ADME_LG_ACTION_CLASSIQUE_AUGMENTER_ALT', 'Augmenter');
define('ADME_LG_ACTION_CLASSIQUE_AUGMENTER_TITLE', 'Augmenter d\'un niveau ce menu');
 
define('ADME_LG_ACTION_CLASSIQUE_TRADUIRE', 'menu_classique_traduire');
define('ADME_LG_ACTION_CLASSIQUE_TRADUIRE_ACTION', 'menu_classique_traduire_action');
define('ADME_LG_ACTION_CLASSIQUE_TRADUIRE_ALT', 'Traduire');
define('ADME_LG_ACTION_CLASSIQUE_TRADUIRE_TITLE', 'Traduire ce menu');
 
define('ADME_LG_ACTION_CLASSIQUE_SUPPRIMER', 'menu_classique_supprimer');
define('ADME_LG_ACTION_CLASSIQUE_SUPPRIMER_ALT', 'Supprimer');
define('ADME_LG_ACTION_CLASSIQUE_SUPPRIMER_TITLE', 'Supprimer ce menu');
 
define('ADME_LG_ACTION_CLASSIQUE_SUPPRIMER_TRADUCTION', 'menu_classique_supprimer_traduction');
define('ADME_LG_ACTION_CLASSIQUE_SUPPRIMER_TRADUCTION_ALT', 'Supprimer');
define('ADME_LG_ACTION_CLASSIQUE_SUPPRIMER_TRADUCTION_TITLE', 'Supprimer ce menu');
 
define('ADME_LG_ACTION_CLASSIQUE_AJOUTER', 'menu_classique_ajouter');
define('ADME_LG_ACTION_CLASSIQUE_AJOUTER_ALT', 'Ajouter');
define('ADME_LG_ACTION_CLASSIQUE_AJOUTER_TITLE', 'Ajouter ce menu');
 
define('ADME_LG_ACTION_CLASSIQUE_VERIFIER', 'menu_classique_verifier');
define('ADME_LG_ACTION_CLASSIQUE_VERIFIER_TRADUCTION', 'menu_classique_verifier_traduction');
 
 
define('ADME_LG_ACTION_CLASSIQUE_TRADUCTION_DEFAUT', 'menu_classique_traduction_defaut');
define('ADME_LG_ACTION_CLASSIQUE_TRADUCTION_DEFAUT_ALT', 'Choisir ce menu comme traduction par défaut');
define('ADME_LG_ACTION_CLASSIQUE_TRADUCTION_DEFAUT_TITLE', 'Choisir ce menu comme traduction par défaut');
 
define ('ADME_LG_ACTION_CLASSIQUE_LIMITER', 'menu_classique_limiter');
define ('ADME_LG_ACTION_CLASSIQUE_LIMITER_TITLE', 'Restreindre le menu &agrave cette langue');
define ('ADME_LG_ACTION_CLASSIQUE_OUVRIR', 'menu_classique_ouvrir');
define ('ADME_LG_ACTION_CLASSIQUE_OUVRIR_TITLE', 'Faire apparaitre ce menu dans toutes les langues');
 
define('ADME_LG_ACTION_COMMUN_TRADUCTION_DEFAUT', 'menu_classique_traduction_defaut');
define('ADME_LG_ACTION_COMMUN_TRADUCTION_DEFAUT_ALT', 'Choisir ce menu comme traduction par défaut');
define('ADME_LG_ACTION_COMMUN_TRADUCTION_DEFAUT_TITLE', 'Choisir ce menu comme traduction par défaut');
 
 
// Les actions des menus communs:
define('ADME_LG_ACTION_COMMUN_MODIFIER', 'menu_commun_modifier');
define('ADME_LG_ACTION_COMMUN_MODIFIER_ALT', 'Modifier');
define('ADME_LG_ACTION_COMMUN_MODIFIER_ACTION', 'menu_commun_modifier_action');
define('ADME_LG_ACTION_COMMUN_MODIFIER_TITLE', 'Modifier ce menu');
 
define('ADME_LG_ACTION_COMMUN_MONTER', 'menu_commun_monter');
define('ADME_LG_ACTION_COMMUN_MONTER_ALT', 'Monter');
define('ADME_LG_ACTION_COMMUN_MONTER_TITLE', 'Monter ce menu');
 
define('ADME_LG_ACTION_COMMUN_DESCENDRE', 'menu_commun_descendre');
define('ADME_LG_ACTION_COMMUN_DESCENDRE_ALT', 'Descendre');
define('ADME_LG_ACTION_COMMUN_DESCENDRE_TITLE', 'Descendre ce menu');
 
define('ADME_LG_ACTION_COMMUN_DIMINUER', 'menu_commun_diminuer');
define('ADME_LG_ACTION_COMMUN_DIMINUER_ALT', 'Diminuer');
define('ADME_LG_ACTION_COMMUN_DIMINUER_TITLE', 'Diminuer d\'un niveau ce menu');
 
define('ADME_LG_ACTION_COMMUN_AUGMENTER', 'menu_commun_augmenter');
define('ADME_LG_ACTION_COMMUN_AUGMENTER_ALT', 'Augmenter');
define('ADME_LG_ACTION_COMMUN_AUGMENTER_TITLE', 'Augmenter d\'un niveau ce menu');
 
define('ADME_LG_ACTION_COMMUN_TRADUIRE', 'menu_commun_traduire');
define('ADME_LG_ACTION_COMMUN_TRADUIRE_ACTION', 'menu_commun_traduire_action');
define('ADME_LG_ACTION_COMMUN_TRADUIRE_ALT', 'Traduire');
define('ADME_LG_ACTION_COMMUN_TRADUIRE_TITLE', 'Traduire ce menu');
 
define('ADME_LG_ACTION_COMMUN_SUPPRIMER', 'menu_commun_supprimer');
define('ADME_LG_ACTION_COMMUN_SUPPRIMER_ALT', 'Supprimer');
define('ADME_LG_ACTION_COMMUN_SUPPRIMER_TITLE', 'Supprimer ce menu');
 
define('ADME_LG_ACTION_COMMUN_SUPPRIMER_TRADUCTION', 'menu_commun_supprimer_traduction');
define('ADME_LG_ACTION_COMMUN_SUPPRIMER_TRADUCTION_ALT', 'Supprimer');
define('ADME_LG_ACTION_COMMUN_SUPPRIMER_TRADUCTION_TITLE', 'Supprimer ce menu');
 
 
define('ADME_LG_ACTION_COMMUN_AJOUTER', 'menu_commun_ajouter');
define('ADME_LG_ACTION_COMMUN_AJOUTER_ALT', 'Ajouter');
define('ADME_LG_ACTION_COMMUN_AJOUTER_TITLE', 'Ajouter ce menu');
 
define('ADME_LG_ACTION_COMMUN_VERIFIER', 'menu_commun_verifier');
define ('ADME_LG_ACTION_COMMUN_VERIFIER_TRADUCTION','menu_commun_verifier_traduction');
 
 
// Les actions générales:
define('ADME_LG_ACTION_ADMINISTRER', 'administrer');
define('ADME_LG_ACTION_ADMINISTRER_ALT', 'Administrer');
define('ADME_LG_ACTION_ADMINISTRER_TITLE', 'Administrer l\'application de ce menu');
 
define('ADME_LG_ACTION_PLIER', 'adme_menu_fermer');
define('ADME_LG_ACTION_PLIER_ALT', 'Plier');
 
define('ADME_LG_ACTION_DEPLIER', 'adme_menu_ouvrir');
define('ADME_LG_ACTION_DEPLIER_ALT', 'Déplier');
 
define('ADME_LG_ACTION_SUPPRIMER_CONFIRMATION', 'Êtes vous sûr de vouloir supprimer ce menu?');
 
// Les erreurs:
define('ADME_LG_ERREUR_INFO_MENU', 'impossible de lire les infos du menu.');
define('ADME_LG_ERREUR_INFO_SITE', 'impossible de lire les infos du site.');
define('ADME_LG_ERREUR_INFO_MENU_RELATION', 'impossible de lire les infos sur les relations du menu.');
define('ADME_LG_ERREUR_ID_MENU_PERE', 'impossible de lire identifiant du menu père.');
define('ADME_LG_ERREUR_CODE_NUM', "La valeur %s pour le champ \"Code numérique\" existe déjà.");
define('ADME_LG_ERREUR_CODE_ALPHA', "La valeur %s pour le champ \"Code alphanumérique\" existe déjà.");
define('ADME_LG_ERREUR_EXISTE_SOUS_MENU', 'Ce menu contient encore des sous menus. Veuillez commencez par supprimer ces sous menus.');
 
// Le formulaire de modification d'un menu :
define('ADME_LG_FORM_MENU_CLASSIQUE_TITRE_GENERAL', 'Modification menu');
define('ADME_LG_FORM_MENU_COMMUN_TITRE_GENERAL', 'Modification menu commun');
 
define('ADME_LG_FORM_MENU_CLASSIQUE_TITRE_GENERAL_TRADUCTION', 'Traduction menu');
define('ADME_LG_FORM_MENU_COMMUN_TITRE_GENERAL_TRADUCTION', 'Traduction menu commun');
 
define('ADME_LG_FORM_MENU_CLASSIQUE_TITRE_CONFIG', 'Configuration du menu');
define('ADME_LG_FORM_MENU_COMMUN_TITRE_CONFIG', 'Configuration du menu commun');
define('ADME_LG_FORM_MENU_ID', 'Identifiant de ce menu : ');
define('ADME_LG_FORM_MENU_CODE_NUM', 'Code numérique du menu');
define('ADME_LG_FORM_MENU_REGLE_CODE_NUM', 'Un code numérique est requis pour le menu !');
define('ADME_LG_FORM_MENU_CODE_ALPHA', 'Code alphanumérique du menu');
define('ADME_LG_FORM_MENU_REGLE_CODE_ALPHA', 'Un code alphanumérique est requis pour le menu !');
define('ADME_LG_FORM_MENU_NOM', 'Nom du menu');
define('ADME_LG_FORM_MENU_REGLE_NOM', 'Un nom est requis pour le menu !');
define('ADME_LG_FORM_MENU_RACCOURCI', 'Raccourci clavier');
define('ADME_LG_FORM_MENU_DEFAUT', 'En faire le menu par défaut');
define('ADME_LG_FORM_MENU_FICHIER_SQUELETTE', 'Fichier squelette');
define('ADME_LG_FORM_MENU_INFO_BULLE', 'Contenu info-bulle');
define('ADME_LG_FORM_MENU_REGLE_INFO_BULLE', 'Une description courte pour l\'info-bulle est requise pour ce menu !');
define('ADME_LG_FORM_MENU_APPLI', 'Application');
define('ADME_LG_FORM_MENU_APPLI_ARGUMENT', 'Arguments de l\'application');
 
define('ADME_LG_FORM_MENU_CLASSIQUE_TITRE_ENTETE', 'Entête des pages du menu');
define('ADME_LG_FORM_MENU_COMMUN_TITRE_ENTETE', 'Entête des pages du menu commun');
define('ADME_LG_FORM_MENU_ROBOT', 'Indexation par robots');
define('ADME_LG_FORM_MENU_INDEX_FOLLOW', 'Indexer cette page et les suivantes');
define('ADME_LG_FORM_MENU_INDEX', 'Indexer seulement cette page');
define('ADME_LG_FORM_MENU_NOINDEX_NOFOLLOW', 'Ne pas indexer cette page et les suivantes');
define('ADME_LG_FORM_MENU_NOINDEX', 'Ne pas indexer cette page');
define('ADME_LG_FORM_MENU_INDEX_VIDE', 'Aucune');
define('ADME_LG_FORM_MENU_TITRE', 'Titre de la page');
define('ADME_LG_FORM_MENU_TITRE_ALTERNATIF', 'Titre alternatif de la page');
define('ADME_LG_FORM_MENU_MOT_CLE', 'Mots-clés');
define('ADME_LG_FORM_MENU_DESCRIPTION', 'Description du contenu');
define('ADME_LG_FORM_MENU_TABLE_MATIERE', 'Table des matières');
define('ADME_LG_FORM_MENU_SOURCE', 'Source');
define('ADME_LG_FORM_MENU_AUTEUR', 'Auteur');
define('ADME_LG_FORM_MENU_CONTRIBUTEUR', 'Contributeur');
define('ADME_LG_FORM_MENU_EDITEUR', 'Éditeur');
define('ADME_LG_FORM_MENU_DATE_CREATION', 'Date de création');
define('ADME_LG_FORM_MENU_DATE_VALIDITE_DEBUT', 'Date de début de validité');
define('ADME_LG_FORM_MENU_DATE_VALIDITE_FIN', 'Date de fin de validité');
define('ADME_LG_FORM_MENU_DATE_COPYRIGHT', 'Année pour le copyright');
define('ADME_LG_FORM_MENU_URL_LICENCE', 'URL de la licence');
define('ADME_LG_FORM_MENU_CATEGORIE', 'Catégorie');
define('ADME_LG_FORM_MENU_PUBLIC', 'Public pour la page');
define('ADME_LG_FORM_MENU_PUBLIC_NIVEAU', 'Niveau du public pour la page');
define('ADME_LG_FORM_MENU_ZG_TYPE', 'Type de portée spatiale');
define('ADME_LG_FORM_MENU_ZG_VALEUR', 'Portée spatiale de la page');
define('ADME_LG_FORM_MENU_ZG_VIDE', 'Aucun');
define('ADME_LG_FORM_MENU_ZG_ISO', 'Code de pays sur deux lettres (iso3166)');
define('ADME_LG_FORM_MENU_ZG_DC', 'Représentation des régions géographiques du Dublin Core');
define('ADME_LG_FORM_MENU_ZG_POINT', 'Point géographique');
define('ADME_LG_FORM_MENU_ZG_GTGN', 'Noms issus du Getty Thesaurus of Geographic Names');
define('ADME_LG_FORM_MENU_TMP_TYPE', 'Type de portée temporelle');
define('ADME_LG_FORM_MENU_TMP_VALEUR', 'Portée temporelle de la page');
define('ADME_LG_FORM_MENU_TMP_VIDE', 'Aucun');
define('ADME_LG_FORM_MENU_TMP_W3C', 'Codage des dates et heures du W3C');
define('ADME_LG_FORM_MENU_TMP_DC', 'Représentation des intervalles de temps du Dublin Core');
 
define('ADME_LG_FORM_MENU_VALIDER', 'Enregistrer');
define('ADME_LG_FORM_MENU_ANNULER', 'Annuler');
define('ADME_LG_FORM_TXT_CHP_OBLIGATOIRE', 'Indique les champs obligatoires');
define('ADME_LG_FORM_SYMBOLE_CHP_OBLIGATOIRE', '*');
define ('ADME_VOIR_CONFIG_AVANCEE', 'Afficher/Cacher la configuration avanc&eacute;e');
define ('ADME_CONFIG_AVANCEE', 'Configuration avanc&eacute;e');
 
 
// Charactère spéciaux:
define('ADME_LG_PARENTHESE_OUVRANTE', '(');
define('ADME_LG_PARENTHESE_FERMANTE', ')');
define('ADME_LG_SLASH', '/');
// +------------------------------------------------------------------------------------------------------+
// | PIED du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
 
 
/* +--Fin du code ----------------------------------------------------------------------------------------+
*
* $Log: adme_langue_fr.inc.php,v $
* Revision 1.19 2007-10-25 14:26:56 ddelon
* Multilinguisme : présentation restriction à une langue
*
* Revision 1.18 2007-10-25 10:08:55 alexandre_tb
* nouvelle constante multilinguisme
*
* Revision 1.17 2007-06-26 14:18:53 florian
* amélioration des formulaires des différentes applis de l'interface d'administration afin de les simplifier
*
* Revision 1.16 2006/10/06 10:40:51 florian
* harmonisation des messages d'erreur de l'authentification
*
* Revision 1.15 2006/06/29 18:58:57 ddelon
* Multilinguisme : menu par defaut pour les menu commun
*
* Revision 1.14 2006/06/28 12:53:34 ddelon
* Multilinguisme : menu par defaut
*
* Revision 1.13 2006/05/10 16:02:49 ddelon
* Finition multilinguise et schizo flo
*
* Revision 1.12 2006/05/10 15:01:57 florian
* ajout de constantes, pour éviter les warnings
*
* Revision 1.11 2006/04/12 21:11:54 ddelon
* Multilinguisme menus communs
*
* Revision 1.10 2006/03/23 20:24:58 ddelon
* *** empty log message ***
*
* Revision 1.9 2006/03/13 21:00:20 ddelon
* Suppression messages d'erreur multilinguisme
*
* Revision 1.8 2006/03/02 10:49:49 ddelon
* Fusion branche multilinguisme dans branche principale
*
* Revision 1.7.2.1 2006/02/28 14:02:10 ddelon
* Finition multilinguisme
*
* Revision 1.7 2005/07/18 16:14:32 ddelon
* css admin + menu communs
*
* Revision 1.6 2005/07/08 21:13:15 ddelon
* Gestion indentation menu
*
* Revision 1.5 2005/05/26 15:45:09 jpm
* Ajout d'une majuscule accentuée.
*
* Revision 1.4 2005/03/29 15:49:31 jpm
* Ajout de la constante pour la date de création dans le formulaire des menus.
*
* Revision 1.3 2004/12/01 16:47:07 jpm
* Ajout d'un texte pour la boite javascript de confirmation de suppression de menu.
*
* Revision 1.2 2004/11/10 17:26:12 jpm
* Fin gestion de la traduction.
*
* Revision 1.1 2004/11/10 11:58:31 jpm
* Début de la traduction de l'appli.
*
*
* +-- Fin du code ----------------------------------------------------------------------------------------+
*/
?>
/trunk/papyrus/applications/admin_menu/langues/adme_langue_en.inc.php
265,7 → 265,10
 
/* +--Fin du code ----------------------------------------------------------------------------------------+
*
* $Log: not supported by cvs2svn $
* $Log: adme_langue_en.inc.php,v $
* Revision 1.3 2007-10-25 14:26:56 ddelon
* Multilinguisme : présentation restriction à une langue
*
* Revision 1.2 2007-10-23 14:10:00 ddelon
* Ajout traductions manquantes pour l'anglais
*
/trunk/papyrus/applications/admin_menu/presentations/styles/adme_standard.css
56,7 → 56,10
 
/* +--Fin des CSS ----------------------------------------------------------------------------------------+
*
* $Log: not supported by cvs2svn $
* $Log: adme_standard.css,v $
* Revision 1.3 2006-10-06 13:38:45 florian
* ergonomie amélioree
*
* Revision 1.2 2005/02/28 11:05:55 jpm
* Modification de la licence.
*
/trunk/papyrus/applications/admin_menu/admin_menu.php
1,618 → 1,638
<?php
/*vim: set expandtab tabstop=4 shiftwidth=4: */
// Copyright (C) 1999-2004 Tela Botanica (accueil@tela-botanica.org)
//
// Ce logiciel est un programme informatique servant à gérer du contenu et des
// applications web.
// Ce logiciel est régi par la licence CeCILL soumise au droit français et
// respectant les principes de diffusion des logiciels libres. Vous pouvez
// utiliser, modifier et/ou redistribuer ce programme sous les conditions
// de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
// sur le site "http://www.cecill.info".
 
// En contrepartie de l'accessibilité au code source et des droits de copie,
// de modification et de redistribution accordés par cette licence, il n'est
// offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
// seule une responsabilité restreinte pèse sur l'auteur du programme, le
// titulaire des droits patrimoniaux et les concédants successifs.
 
// A cet égard l'attention de l'utilisateur est attirée sur les risques
// associés au chargement, à l'utilisation, à la modification et/ou au
// développement et à la reproduction du logiciel par l'utilisateur étant
// donné sa spécificité de logiciel libre, qui peut le rendre complexe à
// manipuler et qui le réserve donc à des développeurs et des professionnels
// avertis possédant des connaissances informatiques approfondies. Les
// utilisateurs sont donc invités à charger et tester l'adéquation du
// logiciel à leurs besoins dans des conditions permettant d'assurer la
// sécurité de leurs systèmes et ou de leurs données et, plus généralement,
// à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
 
// Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
// pris connaissance de la licence CeCILL, et que vous en avez accepté les
// termes.
// ----
// CVS : $Id: admin_menu.php,v 1.29 2007-10-25 10:10:23 alexandre_tb Exp $
/**
* Application gérant les menus de Papyrus
*
* Cette application permet de gérer les menus classiques, les menus communs
* et les liaison d'une application à un menu.
*
*@package Admin_menu
//Auteur original :
*@author Jean-Pascal MILCENT <jpm@tela-botanica.org>
//Autres auteurs :
*@author Alexandre GRANIER <alexandre@tela-botanica.org>
*@author Laurent COUDOUNEAU <lc@gsite.org>
*@copyright Tela-Botanica 2000-2004
*@version $Revision: 1.29 $ $Date: 2007-10-25 10:10:23 $
// +------------------------------------------------------------------------------------------------------+
*/
 
// +------------------------------------------------------------------------------------------------------+
// | ENTETE du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
/** Inclusion du fichier de configuration de cette application.*/
require_once GEN_CHEMIN_PAP.'applications/admin_menu/configuration/adme_configuration.inc.php';
 
//Utilisation de la bibliotheque PEAR NET_URL
 
/** Inclusion de la bibliotheque PEAR de conception de formulaire.*/
require_once ADME_CHEMIN_BIBLIOTHEQUE_PEAR.'HTML/QuickForm.php';
require_once ADME_CHEMIN_BIBLIOTHEQUE_PEAR.'HTML/QuickForm/select.php';
 
/** Inclusion de l'API de fonctions gerant les erreurs sql.*/
require_once ADME_CHEMIN_BIBLIOTHEQUE_API.'debogage/BOG_sql.fonct.php';
 
/** Inclusion des fonctions de manipulation du sql.
* Permet la recuperation d'un nouvel identifiant d'une table.*/
require_once ADME_CHEMIN_BIBLIOTHEQUE_API.'sql/SQL_manipulation.fonct.php';
 
/** <BR> Inclusion de la bibliotheque de fonctions concernant les tables "gen_site..." de Papyrus.*/
require_once ADME_CHEMIN_BIBLIOTHEQUE_GEN.'pap_site.fonct.php';
 
/** <BR> Inclusion de la bibliotheque de fonctions concernant les tables "gen_menu..." de Papyrus.*/
require_once ADME_CHEMIN_BIBLIOTHEQUE_GEN.'pap_menu.fonct.php';
 
/** <BR> Inclusion de la bibliotheque de fonctions concernant les tables "gen_applications..." de Papyrus.*/
require_once ADME_CHEMIN_BIBLIOTHEQUE_GEN.'pap_application.fonct.php';
 
/** <BR> Inclusion de la bibliotheque de fonctions concernant l'affichage commun.*/
require_once ADME_CHEMIN_BIBLIOTHEQUE_ADME.'adme_general.fonct.php';//ok
 
/** <BR> Inclusion de la bibliotheque de fonctions concernant la gestion des menus classiques.*/
require_once ADME_CHEMIN_BIBLIOTHEQUE_ADME.'adme_menu_classique.fonct.php';//ok
 
/** <BR> Inclusion de la bibliotheque de fonctions concernant la gestion des menus communs.*/
require_once ADME_CHEMIN_BIBLIOTHEQUE_ADME.'adme_menu_commun.fonct.php';//ok
 
/** <BR> Inclusion de la bibliotheque de fonctions concernant la gestion de la redaction de contenu.*/
//require_once ADME_CHEMIN_BIBLIOTHEQUE_ADME.'adme_contenu.fonct.php';//ok
 
// Inclusion des fichiers de traduction de l'appli ADME dePapyrus
if (file_exists(ADME_CHEMIN_LANGUE.'adme_langue_'.$GLOBALS['_GEN_commun']['i18n'].'.inc.php')) {
/** Inclusion du fichier de traduction suite a la transaction avec le navigateur.*/
require_once ADME_CHEMIN_LANGUE.'adme_langue_'.$GLOBALS['_GEN_commun']['i18n'].'.inc.php';
} else {
/** Inclusion du fichier de traduction par defaut.*/
require_once ADME_CHEMIN_LANGUE.'adme_langue_'.ADME_I18N_DEFAUT.'.inc.php';
}
 
// Stockage des styles de l'application
GEN_stockerStyleExterne('adme_standard', ADME_CHEMIN_STYLE.'adme_standard.css');
 
// +------------------------------------------------------------------------------------------------------+
// | CORPS du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
 
function afficherContenuCorps()
{
 
//-------------------------------------------------------------------------------------------------------------------
// Initialisation des variables
$sortie_xhtml = '';
$objet_pear_auth = $GLOBALS['_GEN_commun']['pear_auth'];
$objet_pear_db = $GLOBALS['_GEN_commun']['pear_db'];
$objet_pear_url = $GLOBALS['_GEN_commun']['url'];
$copie_objet_pear_url = (PHP_VERSION < 5) ? $objet_pear_url : clone($objet_pear_url);
$url_site = $GLOBALS['_GEN_commun']['url_site'];
if (isset($GLOBALS['_GEN_commun']['url_menu'])) {
$url_menu = $GLOBALS['_GEN_commun']['url_menu'];
}
if (isset($_POST['adme_site_id'])) {
$_GET['adme_site_id'] = $_POST['adme_site_id'];
} else {
$_GET['adme_site_id'] = (!isset($_GET['adme_site_id'])) ? 1 : $_GET['adme_site_id'];
}
$_GET['adme_menu_id'] = (!isset($_GET['adme_menu_id'])) ? 0 : $_GET['adme_menu_id'];
$_GET['adme_action'] = (!isset($_GET['adme_action'])) ? '' : $_GET['adme_action'];
//-------------------------------------------------------------------------------------------------------------------
// Authentification
if ($objet_pear_auth->getAuth()) {
//---------------------------------------------------------------------------------------------------------------
// GESTION DES MENUS CLASSIQUES
// Ajouter un menu classique
if (isset($_GET['adme_action']) && $_GET['adme_action'] == ADME_LG_ACTION_CLASSIQUE_AJOUTER) {
$message = ADME_ajouterMenuClassique($objet_pear_db, $objet_pear_auth, $_GET['adme_site_id'], $_GET['adme_menu_id']);
$copie_objet_pear_url->addQueryString('adme_site_id',$_GET['adme_site_id']);
header("Location: ".str_replace('&amp;', '&', $copie_objet_pear_url->getUrl()));
exit;
}
// Formulaire de mise à jour du menu
if (isset($_GET['adme_action']) && $_GET['adme_action'] == ADME_LG_ACTION_CLASSIQUE_MODIFIER) {
$copie_objet_pear_url->addQueryString('adme_site_id',$_GET['adme_site_id']);
$copie_objet_pear_url->addQueryString('adme_menu_id',$_GET['adme_menu_id']);
$copie_objet_pear_url->addQueryString('adme_action',ADME_LG_ACTION_CLASSIQUE_MODIFIER_ACTION);
header("Location: ".str_replace('&amp;', '&', $copie_objet_pear_url->getUrl()));
exit;
}
if (isset($_GET['adme_action']) && $_GET['adme_action'] == ADME_LG_ACTION_CLASSIQUE_MODIFIER_ACTION) {
$sortie_xhtml .= ADME_afficherFormMenuClassique($objet_pear_db, $objet_pear_url, $_GET['adme_site_id'], $_GET['adme_menu_id'], $_POST);
return $sortie_xhtml;
}
//var_dump($_POST);
if (isset($_POST['form_boutons'][ADME_LG_ACTION_CLASSIQUE_VERIFIER])) {
// Nous cherchons a enregistrer une modification de menu
$message = ADME_validerFormAjouterMenuClassique($objet_pear_db, $_POST);
if (!empty($message)) {
// Les donnees ne sont pas valide. Nous retournons le formulaires avec les messages d'erreurs.
$sortie_xhtml .= $message;
$sortie_xhtml .= ADME_afficherFormMenuClassique($objet_pear_db, $objet_pear_url, $_GET['adme_site_id'], $_GET['adme_menu_id'], $_POST);
return $sortie_xhtml;
} else {
// Les donnees sont valide. Nous les enregistrons et retournons au formulaire de depart.
$message = ADME_modifierMenuClassique($objet_pear_db, $objet_pear_auth, $_GET['adme_menu_id'], $_POST);
}
}
// Deplacer le menu vers le haut
if (isset($_GET['adme_action']) && $_GET['adme_action'] == ADME_LG_ACTION_CLASSIQUE_MONTER) {
ADME_deplacerMenuClassique($objet_pear_db, $_GET['adme_site_id'], $_GET['adme_menu_id'], true);
}
// Deplacer le menu vers le bas
if (isset($_GET['adme_action']) && $_GET['adme_action'] == ADME_LG_ACTION_CLASSIQUE_DESCENDRE) {
ADME_deplacerMenuClassique($objet_pear_db, $_GET['adme_site_id'], $_GET['adme_menu_id'], false);
}
// Deplacer le menu vers la gauche (diminuer d'un niveau)
if (isset($_GET['adme_action']) && $_GET['adme_action'] == ADME_LG_ACTION_CLASSIQUE_DIMINUER) {
ADME_indenterMenuClassique($objet_pear_db, $_GET['adme_site_id'], $_GET['adme_menu_id'], true);
}
// Deplacer le menu vers la droite (augmenter d'un niveau)
if (isset($_GET['adme_action']) && $_GET['adme_action'] == ADME_LG_ACTION_CLASSIQUE_AUGMENTER) {
ADME_indenterMenuClassique($objet_pear_db, $_GET['adme_site_id'], $_GET['adme_menu_id'], false);
}
// Traduire le menu
if (isset($_GET['adme_action']) && $_GET['adme_action'] == ADME_LG_ACTION_CLASSIQUE_TRADUIRE) {
$message='';
$message = ADME_verifier_traduction_possible($objet_pear_db, $objet_pear_url, $_GET['adme_site_id'], $_GET['adme_menu_id'], $_POST);
if ((!empty($message))) {
// Pas de traduction possible !
$sortie_xhtml .= $message;
$sortie_xhtml .= ADME_afficherFormPrincipal($objet_pear_db, $objet_pear_url, $_GET['adme_site_id'], $_GET['adme_menu_id'], $_GET['adme_action']);
return $sortie_xhtml;
}
else {
// Les données sont valide. Nous affichons le formulaire de traduction
$copie_objet_pear_url->addQueryString('adme_site_id',$_GET['adme_site_id']);
$copie_objet_pear_url->addQueryString('adme_menu_id',$_GET['adme_menu_id']);
$copie_objet_pear_url->addQueryString('adme_action',ADME_LG_ACTION_CLASSIQUE_TRADUIRE_ACTION);
header("Location: ".str_replace('&amp;', '&', $copie_objet_pear_url->getUrl()));
exit;
}
}
if (isset($_GET['adme_action']) && $_GET['adme_action'] == ADME_LG_ACTION_CLASSIQUE_TRADUIRE_ACTION) {
$sortie_xhtml .= ADME_afficherFormMenuClassique($objet_pear_db, $objet_pear_url, $_GET['adme_site_id'], $_GET['adme_menu_id'], $_POST,TRUE);
return $sortie_xhtml;
}
if (isset($_POST['form_boutons'][ADME_LG_ACTION_CLASSIQUE_VERIFIER_TRADUCTION])) {
// Nous cherchons a enregistrer une traduction de menu
$message = ADME_validerFormTraduireMenuClassique($objet_pear_db, $_POST);
if (!empty($message)) {
// Les donnees ne sont pas valide. Nous retournons le formulaires avec les messages d'erreurs.
$sortie_xhtml .= $message;
$sortie_xhtml .= ADME_afficherFormMenuClassique($objet_pear_db, $objet_pear_url, $_GET['adme_menu_id'], $_POST);
return $sortie_xhtml;
} else {
// Les donnees sont valide. Nous les enregistrons et retournons au formulaire de depart.
$message = ADME_traduireMenuClassique($objet_pear_db, $objet_pear_auth, $_GET['adme_menu_id'], $_POST);
}
}
// Supprimer le menu
if (isset($_GET['adme_action']) && $_GET['adme_action'] == ADME_LG_ACTION_CLASSIQUE_SUPPRIMER) {
// Recuperation du menu de remplacement pour eviter de fermer l'arborescence
if (GEN_donnerDernierFreres($_GET['adme_menu_id']) == false) {
$adme_menu_id_remplacement = GEN_lireIdentifiantMenuPere($_GET['adme_menu_id']);;
} else {
$adme_menu_id_remplacement = GEN_donnerDernierFreres($_GET['adme_menu_id']);
}
// Suppression du menu classique
$message = ADME_supprimerMenuClassique($objet_pear_db, $_GET['adme_site_id'], $_GET['adme_menu_id']);
// Remplacement de l'id du menu courant par le remplacant.
$_GET['adme_menu_id'] = $adme_menu_id_remplacement;
$copie_objet_pear_url->addQueryString('adme_site_id',$_GET['adme_site_id']);
header("Location: ".str_replace('&amp;', '&', $copie_objet_pear_url->getUrl()));
exit;
}
// Supprimer le menu traduit
if (isset($_GET['adme_action']) && $_GET['adme_action'] == ADME_LG_ACTION_CLASSIQUE_SUPPRIMER_TRADUCTION) {
// Suppression du menu classique
$message = ADME_supprimerMenuClassiqueTraduction($objet_pear_db, $_GET['adme_site_id'], $_GET['adme_menu_id']);
$copie_objet_pear_url->addQueryString('adme_site_id',$_GET['adme_site_id']);
header("Location: ".str_replace('&amp;', '&', $copie_objet_pear_url->getUrl()));
exit;
}
// Selectionner le menu comme traduction par defaut :
if (isset($_GET['adme_action']) && $_GET['adme_action'] == ADME_LG_ACTION_CLASSIQUE_TRADUCTION_DEFAUT) {
$message = ADME_selectionnerMenuClassiqueTraduction($objet_pear_db, $_GET['adme_site_id'], $_GET['adme_menu_id']);
$copie_objet_pear_url->addQueryString('adme_site_id',$_GET['adme_site_id']);
header("Location: ".str_replace('&amp;', '&', $copie_objet_pear_url->getUrl()));
exit;
}
// Restreindre le menu a la langue selectionne
if (isset($_GET['adme_action']) && $_GET['adme_action'] == ADME_LG_ACTION_CLASSIQUE_LIMITER) {
$message = ADME_limiterMenuClassique($objet_pear_db, $_GET['adme_site_id'], $_GET['adme_menu_id'],$_GET['zone']);
$copie_objet_pear_url->addQueryString('adme_site_id',$_GET['adme_site_id'],$_GET['zone']);
header("Location: ".str_replace('&amp;', '&', $copie_objet_pear_url->getUrl()));
exit;
}
 
// Ouvrir le menu suite a une restriction
if (isset($_GET['adme_action']) && $_GET['adme_action'] == ADME_LG_ACTION_CLASSIQUE_OUVRIR) {
$message = ADME_ouvrirMenuClassique($objet_pear_db, $_GET['adme_site_id'], $_GET['adme_menu_id']);
$copie_objet_pear_url->addQueryString('adme_site_id',$_GET['adme_site_id']);
header("Location: ".str_replace('&amp;', '&', $copie_objet_pear_url->getUrl()));
exit;
}
//---------------------------------------------------------------------------------------------------------------
// GESTION DES MENUS COMMUNS
// Ajout un menu commun
if (isset($_GET['adme_action']) && $_GET['adme_action'] == ADME_LG_ACTION_COMMUN_AJOUTER) {
$message = ADME_ajouterMenuCommun($objet_pear_db, $objet_pear_auth, $_GET['adme_site_id'], $_GET['adme_menu_id']);
$copie_objet_pear_url->addQueryString('adme_site_id',$_GET['adme_site_id']);
header("Location: ".str_replace('&amp;', '&', $copie_objet_pear_url->getUrl()));
exit;
}
// Formulaire de mise a jour du menu commun.
if (isset($_GET['adme_action']) && $_GET['adme_action'] == ADME_LG_ACTION_COMMUN_MODIFIER) {
$copie_objet_pear_url->addQueryString('adme_site_id',$_GET['adme_site_id']);
$copie_objet_pear_url->addQueryString('adme_menu_id',$_GET['adme_menu_id']);
$copie_objet_pear_url->addQueryString('adme_action',ADME_LG_ACTION_COMMUN_MODIFIER_ACTION);
header("Location: ".str_replace('&amp;', '&', $copie_objet_pear_url->getUrl()));
exit;
}
if (isset($_GET['adme_action']) && $_GET['adme_action'] == ADME_LG_ACTION_COMMUN_MODIFIER_ACTION) {
$sortie_xhtml .= ADME_afficherFormMenuClassique($objet_pear_db, $objet_pear_url, $_GET['adme_site_id'], $_GET['adme_menu_id'], $_POST);
return $sortie_xhtml;
}
if (isset($_POST[ADME_LG_ACTION_COMMUN_VERIFIER])) {
// Nous cherchons a enregistrer une modification de menu
$message = ADME_validerFormAjouterMenuCommun($objet_pear_db, $_POST);
if (!empty($message)) {
// Les donnees ne sont pas valide. Nous retournons le formulaires avec les messages d'erreurs.
$sortie_xhtml .= $message;
$sortie_xhtml .= ADME_afficherFormMenuCommun($objet_pear_db, $objet_pear_url, $_GET['adme_site_id'], $_GET['adme_menu_id'], $_POST);
return $sortie_xhtml;
} else {
// Les donnees sont valide. Nous les enregistrons et retournons au formulaire de depart.
$message = ADME_modifierMenuCommun($objet_pear_db, $objet_pear_auth, $_GET['adme_menu_id'], $_POST);
}
}
// Deplace vers le haut de la hierarchie un menu commun
if (isset($_GET['adme_action']) && $_GET['adme_action'] == ADME_LG_ACTION_COMMUN_MONTER) {
ADME_deplacerMenuCommun($objet_pear_db, $_GET['adme_site_id'], $_GET['adme_menu_id'], true);
}
// Deplace vers le bas de la hierarchie un menu commun
if (isset($_GET['adme_action']) && $_GET['adme_action'] == ADME_LG_ACTION_COMMUN_DESCENDRE) {
ADME_deplacerMenuCommun($objet_pear_db, $_GET['adme_site_id'], $_GET['adme_menu_id'], false);
}
 
// Deplacer le menu vers la gauche (diminuer d'un niveau)
if (isset($_GET['adme_action']) && $_GET['adme_action'] == ADME_LG_ACTION_COMMUN_DIMINUER) {
ADME_indenterMenuCommun($objet_pear_db, $_GET['adme_site_id'], $_GET['adme_menu_id'], true);
}
// Deplacer le menu vers la droite (augmenter d'un niveau)
if (isset($_GET['adme_action']) && $_GET['adme_action'] == ADME_LG_ACTION_COMMUN_AUGMENTER) {
ADME_indenterMenuCommun($objet_pear_db, $_GET['adme_site_id'], $_GET['adme_menu_id'], false);
}
// Traduire le menu
if (isset($_GET['adme_action']) && $_GET['adme_action'] == ADME_LG_ACTION_COMMUN_TRADUIRE) {
$message='';
$message = ADME_verifier_traduction_possible($objet_pear_db, $objet_pear_url, $_GET['adme_site_id'], $_GET['adme_menu_id'], $_POST);
if ((!empty($message))) {
// Pas de traduction possible !
$sortie_xhtml .= $message;
$sortie_xhtml .= ADME_afficherFormPrincipal($objet_pear_db, $objet_pear_url, $_GET['adme_site_id'], $_GET['adme_menu_id'], $_GET['adme_action']);
return $sortie_xhtml;
}
else {
// Les données sont valide. Nous affichons le formulaire de traduction
$copie_objet_pear_url->addQueryString('adme_site_id',$_GET['adme_site_id']);
$copie_objet_pear_url->addQueryString('adme_menu_id',$_GET['adme_menu_id']);
$copie_objet_pear_url->addQueryString('adme_action',ADME_LG_ACTION_COMMUN_TRADUIRE_ACTION);
header("Location: ".str_replace('&amp;', '&', $copie_objet_pear_url->getUrl()));
exit;
}
}
if (isset($_GET['adme_action']) && $_GET['adme_action'] == ADME_LG_ACTION_COMMUN_TRADUIRE_ACTION) {
$sortie_xhtml .= ADME_afficherFormMenuCommun($objet_pear_db, $objet_pear_url, $_GET['adme_site_id'], $_GET['adme_menu_id'], $_POST,TRUE);
return $sortie_xhtml;
}
if (isset($_POST[ADME_LG_ACTION_COMMUN_VERIFIER_TRADUCTION])) {
// Nous cherchons à enregistrer une traduction de menu
$message = ADME_validerFormTraduireMenuCommun($objet_pear_db, $_POST);
if (!empty($message)) {
// Les données ne sont pas valide. Nous retournons le formulaires avec les messages d'erreurs.
$sortie_xhtml .= $message;
$sortie_xhtml .= ADME_afficherFormMenuCommun($objet_pear_db, $objet_pear_url, $_GET['adme_menu_id'], $_POST);
return $sortie_xhtml;
} else {
// Les données sont valide. Nous les enregistrons et retournons au formulaire de départ.
$message = ADME_traduireMenuCommun($objet_pear_db, $objet_pear_auth, $_GET['adme_menu_id'], $_POST);
}
}
// Supprime définitivement un menu commun
if (isset($_GET['adme_action']) && $_GET['adme_action'] == ADME_LG_ACTION_COMMUN_SUPPRIMER) {
// Récupération du menu de remplacement pour éviter de fermer l'arborescence
if (GEN_donnerDernierFreres($_GET['adme_menu_id']) == false) {
$adme_menu_id_remplacement = GEN_lireIdentifiantMenuPere($_GET['adme_menu_id']);;
} else {
$adme_menu_id_remplacement = GEN_donnerDernierFreres($_GET['adme_menu_id']);
}
// Suppression du menu commun
ADME_supprimerMenuCommun($objet_pear_db, $_GET['adme_menu_id']);
// Remplacement de l'id du menu courant par le remplaçant.
$_GET['adme_menu_id'] = $adme_menu_id_remplacement;
$copie_objet_pear_url->addQueryString('adme_site_id',$_GET['adme_site_id']);
header("Location: ".str_replace('&amp;', '&', $copie_objet_pear_url->getUrl()));
exit;
}
// Supprimer le menu traduit
if (isset($_GET['adme_action']) && $_GET['adme_action'] == ADME_LG_ACTION_COMMUN_SUPPRIMER_TRADUCTION) {
// Suppression du menu commun
$message = ADME_supprimerMenuCommunTraduction($objet_pear_db, $_GET['adme_site_id'], $_GET['adme_menu_id']);
$copie_objet_pear_url->addQueryString('adme_site_id',$_GET['adme_site_id']);
header("Location: ".str_replace('&amp;', '&', $copie_objet_pear_url->getUrl()));
exit;
}
if (isset($_GET['adme_action']) && $_GET['adme_action'] == ADME_LG_ACTION_COMMUN_TRADUCTION_DEFAUT) {
$message = ADME_selectionnerMenuCommunTraduction($objet_pear_db, $_GET['adme_site_id'], $_GET['adme_menu_id']);
$copie_objet_pear_url->addQueryString('adme_site_id',$_GET['adme_site_id']);
header("Location: ".str_replace('&amp;', '&', $copie_objet_pear_url->getUrl()));
exit;
}
//---------------------------------------------------------------------------------------------------------------
// GESTION DES INTERFACES D'ADMINISTRATION
// Appel de l'application d'administration
if (isset($_GET['adme_action']) && $_GET['adme_action'] == ADME_LG_ACTION_ADMINISTRER) {
$id_appli = GEN_retournerIdAppliMenu($objet_pear_db, $_GET['adme_menu_id']);
$chemin_admin = GEN_retournerCheminInterfaceAdmin($objet_pear_db, $id_appli);
$nom_admin = GEN_retournerNomInterfaceAdmin($objet_pear_db, $id_appli);
if ($chemin_admin !== false) {
include_once $chemin_admin;
$objet_admin = new $nom_admin;
if (method_exists($objet_admin, 'afficherContenuCorps')) {
$retour_admin = $objet_admin->afficherContenuCorps();
}
if ($retour_admin !== false) {
return $retour_admin;
}
}
}
//---------------------------------------------------------------------------------------------------------------
// Affichage des messages si nécessaire
if (! empty($message)) {
$sortie_xhtml .= "\n".'<p class="pap_erreur">'.$message.'</p>';
}
//---------------------------------------------------------------------------------------------------------------
// Affichage formulaire principal et retour du XHTML!
$sortie_xhtml .= ADME_afficherFormPrincipal($objet_pear_db, $objet_pear_url, $_GET['adme_site_id'], $_GET['adme_menu_id'], $_GET['adme_action']);
return $sortie_xhtml;
// Fin de l'authentification
} else {
// Pas d'authentification nous affichons un message!
$res='';
$res .= '<p class="zone_alert">'.ADME_IDENTIFIEZ_VOUS.'</p>'."\n" ;
$res .= '<form id="form_connexion" style="clear:both;" class="form_identification" action="' ;
$res .= $objet_pear_url->getURL();
$res .= '" method="post">
<fieldset>
<legend>Identifiez vous</legend>
<label for="username">Courriel : </label>
<input type="text" id="username" name="username" maxlength="80" tabindex="10" value="courriel" />
<label for="password">Mot de passe : </label>
<input type="password" id="password" name="password" maxlength="80" tabindex="20" value="mot de passe" />
<input type="submit" id="connexion" name="connexion" tabindex="30" value="ok" />
</fieldset>
</form>';
return $res ;
}
}// Fin de la fonction afficherContenuCorps()
 
// +------------------------------------------------------------------------------------------------------+
// | PIED du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
 
 
 
/* +--Fin du code ----------------------------------------------------------------------------------------+
*
* $Log: not supported by cvs2svn $
* Revision 1.28 2007-10-24 14:43:01 ddelon
* Gestion des menus reservés à une langue
*
* Revision 1.27 2007-07-04 14:59:13 florian
* correction bug maj non prise en charge
*
* Revision 1.26 2007/04/19 15:34:35 neiluj
* préparration release (livraison) "Narmer" - v0.25
*
* Revision 1.25 2006/10/06 10:40:51 florian
* harmonisation des messages d'erreur de l'authentification
*
* Revision 1.24 2006/06/29 19:13:26 ddelon
* Bug defaut traduction sur menu commun
*
* Revision 1.23 2006/06/29 18:58:57 ddelon
* Multilinguisme : menu par defaut pour les menu commun
*
* Revision 1.22 2006/06/28 12:53:34 ddelon
* Multilinguisme : menu par defaut
*
* Revision 1.21 2006/04/12 21:11:54 ddelon
* Multilinguisme menus communs
*
* Revision 1.20 2006/03/23 20:24:58 ddelon
* *** empty log message ***
*
* Revision 1.19 2006/03/02 10:49:49 ddelon
* Fusion branche multilinguisme dans branche principale
*
* Revision 1.18.2.2 2006/02/28 14:02:08 ddelon
* Finition multilinguisme
*
* Revision 1.18.2.1 2005/12/27 15:56:00 ddelon
* Fusion Head vers multilinguisme (wikini double clic)
*
* Revision 1.18 2005/09/23 15:27:17 florian
* correction de bugs
*
* Revision 1.17 2005/07/18 16:14:32 ddelon
* css admin + menu communs
*
* Revision 1.16 2005/07/08 21:13:15 ddelon
* Gestion indentation menu
*
* Revision 1.15 2005/02/28 11:04:25 jpm
* Modification des auteurs.
*
* Revision 1.14 2005/02/28 10:31:41 jpm
* Changement de nom de dossier.
*
* Revision 1.13 2004/11/16 13:01:41 jpm
* Ajout d'un commentaire.
*
* Revision 1.12 2004/11/15 16:51:08 jpm
* Correction bogue de mise à jour de l'ordre des menus.
*
* Revision 1.11 2004/11/10 17:26:18 jpm
* Fin gestion de la traduction.
*
* Revision 1.10 2004/11/10 11:58:58 jpm
* Mise en place des constantes de traduction de l'appli.
*
* Revision 1.9 2004/11/09 17:53:03 jpm
* Changement des noms des actions sur les menus classiques.
*
* Revision 1.8 2004/11/09 17:49:11 jpm
* Mise en conformité et gestion de différentes interfaces d'administration.
*
* Revision 1.7 2004/10/25 16:28:02 jpm
* Correction convention de codage.
*
* Revision 1.6 2004/09/23 17:45:19 jpm
* Amélioration de la gestion des liens annuler et du selecteur de sites.
*
* Revision 1.5 2004/09/23 16:49:24 jpm
* Correction d'une erreur dans l'url de l'ajout de menu commun.
*
* Revision 1.4 2004/07/06 17:24:54 jpm
* Suppression d'inclusions de fichiers inutiles.
*
* Revision 1.3 2004/07/06 17:07:28 jpm
* Modification de la documentation pour une mailleur analyse par PhpDocumentor.
*
* Revision 1.2 2004/06/16 15:06:30 jpm
* Suppression fichier inutile.
*
* Revision 1.1 2004/06/16 15:04:39 jpm
* Changement de nom de Papyrus en Papyrus.
* Changement de l'arborescence.
*
* Revision 1.26 2004/05/10 14:32:21 jpm
* Changement du titre.
*
* Revision 1.25 2004/05/10 12:13:23 jpm
* Ajout de la sélection des sites.
*
* Revision 1.24 2004/05/07 16:33:05 jpm
* Intégration de constantes.
*
* Revision 1.23 2004/05/07 07:23:53 jpm
* Amélioration du code, des commentaires et correction de bogues.
*
* Revision 1.22 2004/05/05 06:45:44 jpm
* Suppression de l'appel de la fonction générant le "vous êtes ici" dans la fonction affichant l'entête de l'application.
*
* Revision 1.21 2004/05/04 16:27:33 jpm
* Réduction de code pour la fonction afficherContenuTete().
*
* Revision 1.20 2004/05/03 11:23:26 jpm
* Début mise en conformité des commentaires.
*
*
* +-- Fin du code ----------------------------------------------------------------------------------------+
*/
?>
<?php
/*vim: set expandtab tabstop=4 shiftwidth=4: */
// Copyright (C) 1999-2004 Tela Botanica (accueil@tela-botanica.org)
//
// Ce logiciel est un programme informatique servant à gérer du contenu et des
// applications web.
// Ce logiciel est régi par la licence CeCILL soumise au droit français et
// respectant les principes de diffusion des logiciels libres. Vous pouvez
// utiliser, modifier et/ou redistribuer ce programme sous les conditions
// de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
// sur le site "http://www.cecill.info".
 
// En contrepartie de l'accessibilité au code source et des droits de copie,
// de modification et de redistribution accordés par cette licence, il n'est
// offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
// seule une responsabilité restreinte pèse sur l'auteur du programme, le
// titulaire des droits patrimoniaux et les concédants successifs.
 
// A cet égard l'attention de l'utilisateur est attirée sur les risques
// associés au chargement, à l'utilisation, à la modification et/ou au
// développement et à la reproduction du logiciel par l'utilisateur étant
// donné sa spécificité de logiciel libre, qui peut le rendre complexe à
// manipuler et qui le réserve donc à des développeurs et des professionnels
// avertis possédant des connaissances informatiques approfondies. Les
// utilisateurs sont donc invités à charger et tester l'adéquation du
// logiciel à leurs besoins dans des conditions permettant d'assurer la
// sécurité de leurs systèmes et ou de leurs données et, plus généralement,
// à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
 
// Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
// pris connaissance de la licence CeCILL, et que vous en avez accepté les
// termes.
// ----
// CVS : $Id: admin_menu.php,v 1.29 2007-10-25 10:10:23 alexandre_tb Exp $
/**
* Application gérant les menus de Papyrus
*
* Cette application permet de gérer les menus classiques, les menus communs
* et les liaison d'une application à un menu.
*
*@package Admin_menu
//Auteur original :
*@author Jean-Pascal MILCENT <jpm@tela-botanica.org>
//Autres auteurs :
*@author Alexandre GRANIER <alexandre@tela-botanica.org>
*@author Laurent COUDOUNEAU <lc@gsite.org>
*@copyright Tela-Botanica 2000-2004
*@version $Revision: 1.29 $ $Date: 2007-10-25 10:10:23 $
// +------------------------------------------------------------------------------------------------------+
*/
 
// +------------------------------------------------------------------------------------------------------+
// | ENTETE du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
/** Inclusion du fichier de configuration de cette application.*/
require_once GEN_CHEMIN_PAP.'applications/admin_menu/configuration/adme_configuration.inc.php';
 
//Utilisation de la bibliotheque PEAR NET_URL
 
/** Inclusion de la bibliotheque PEAR de conception de formulaire.*/
require_once ADME_CHEMIN_BIBLIOTHEQUE_PEAR.'HTML/QuickForm.php';
require_once ADME_CHEMIN_BIBLIOTHEQUE_PEAR.'HTML/QuickForm/select.php';
 
/** Inclusion de l'API de fonctions gerant les erreurs sql.*/
require_once ADME_CHEMIN_BIBLIOTHEQUE_API.'debogage/BOG_sql.fonct.php';
 
/** Inclusion des fonctions de manipulation du sql.
* Permet la recuperation d'un nouvel identifiant d'une table.*/
require_once ADME_CHEMIN_BIBLIOTHEQUE_API.'sql/SQL_manipulation.fonct.php';
 
/** <BR> Inclusion de la bibliotheque de fonctions concernant les tables "gen_site..." de Papyrus.*/
require_once ADME_CHEMIN_BIBLIOTHEQUE_GEN.'pap_site.fonct.php';
 
/** <BR> Inclusion de la bibliotheque de fonctions concernant les tables "gen_menu..." de Papyrus.*/
require_once ADME_CHEMIN_BIBLIOTHEQUE_GEN.'pap_menu.fonct.php';
 
/** <BR> Inclusion de la bibliotheque de fonctions concernant les tables "gen_applications..." de Papyrus.*/
require_once ADME_CHEMIN_BIBLIOTHEQUE_GEN.'pap_application.fonct.php';
 
/** <BR> Inclusion de la bibliotheque de fonctions concernant l'affichage commun.*/
require_once ADME_CHEMIN_BIBLIOTHEQUE_ADME.'adme_general.fonct.php';//ok
 
/** <BR> Inclusion de la bibliotheque de fonctions concernant la gestion des menus classiques.*/
require_once ADME_CHEMIN_BIBLIOTHEQUE_ADME.'adme_menu_classique.fonct.php';//ok
 
/** <BR> Inclusion de la bibliotheque de fonctions concernant la gestion des menus communs.*/
require_once ADME_CHEMIN_BIBLIOTHEQUE_ADME.'adme_menu_commun.fonct.php';//ok
 
/** <BR> Inclusion de la bibliotheque de fonctions concernant la gestion de la redaction de contenu.*/
//require_once ADME_CHEMIN_BIBLIOTHEQUE_ADME.'adme_contenu.fonct.php';//ok
 
// Inclusion des fichiers de traduction de l'appli ADME dePapyrus
if (file_exists(ADME_CHEMIN_LANGUE.'adme_langue_'.$GLOBALS['_GEN_commun']['i18n'].'.inc.php')) {
/** Inclusion du fichier de traduction suite a la transaction avec le navigateur.*/
require_once ADME_CHEMIN_LANGUE.'adme_langue_'.$GLOBALS['_GEN_commun']['i18n'].'.inc.php';
} else {
/** Inclusion du fichier de traduction par defaut.*/
require_once ADME_CHEMIN_LANGUE.'adme_langue_'.ADME_I18N_DEFAUT.'.inc.php';
}
 
// Stockage des styles de l'application
GEN_stockerStyleExterne('adme_standard', ADME_CHEMIN_STYLE.'adme_standard.css');
 
// +------------------------------------------------------------------------------------------------------+
// | CORPS du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
 
function afficherContenuCorps()
{
 
//-------------------------------------------------------------------------------------------------------------------
// Initialisation des variables
$sortie_xhtml = '';
$objet_pear_auth = $GLOBALS['_GEN_commun']['pear_auth'];
$objet_pear_db = $GLOBALS['_GEN_commun']['pear_db'];
$objet_pear_url = $GLOBALS['_GEN_commun']['url'];
$copie_objet_pear_url = (PHP_VERSION < 5) ? $objet_pear_url : clone($objet_pear_url);
$url_site = $GLOBALS['_GEN_commun']['url_site'];
if (isset($GLOBALS['_GEN_commun']['url_menu'])) {
$url_menu = $GLOBALS['_GEN_commun']['url_menu'];
}
if (isset($_POST['adme_site_id'])) {
$_GET['adme_site_id'] = $_POST['adme_site_id'];
} else {
$_GET['adme_site_id'] = (!isset($_GET['adme_site_id'])) ? 1 : $_GET['adme_site_id'];
}
$_GET['adme_menu_id'] = (!isset($_GET['adme_menu_id'])) ? 0 : $_GET['adme_menu_id'];
$_GET['adme_action'] = (!isset($_GET['adme_action'])) ? '' : $_GET['adme_action'];
//-------------------------------------------------------------------------------------------------------------------
// Authentification
if ($objet_pear_auth->getAuth()) {
// quelques fois ces variables de session sont utilisées sans avoir été initialisées
// ce qui peut provoquer des warnings et des bugs mineurs
if(!isset($_SESSION['adme_menus_classiques_ouverts'])) {
$_SESSION['adme_menus_classiques_ouverts'] = array();
}
if(!isset($_SESSION['adme_menus_communs_ouverts'])) {
$_SESSION['adme_menus_communs_ouverts'] = array();
}
//---------------------------------------------------------------------------------------------------------------
// GESTION DES MENUS CLASSIQUES
// Ajouter un menu classique
if (isset($_GET['adme_action']) && $_GET['adme_action'] == ADME_LG_ACTION_CLASSIQUE_AJOUTER) {
$message = ADME_ajouterMenuClassique($objet_pear_db, $objet_pear_auth, $_GET['adme_site_id'], $_GET['adme_menu_id']);
$copie_objet_pear_url->addQueryString('adme_site_id',$_GET['adme_site_id']);
header("Location: ".str_replace('&amp;', '&', $copie_objet_pear_url->getUrl()));
exit;
}
// Formulaire de mise à jour du menu
if (isset($_GET['adme_action']) && $_GET['adme_action'] == ADME_LG_ACTION_CLASSIQUE_MODIFIER) {
$copie_objet_pear_url->addQueryString('adme_site_id',$_GET['adme_site_id']);
$copie_objet_pear_url->addQueryString('adme_menu_id',$_GET['adme_menu_id']);
$copie_objet_pear_url->addQueryString('adme_action',ADME_LG_ACTION_CLASSIQUE_MODIFIER_ACTION);
header("Location: ".str_replace('&amp;', '&', $copie_objet_pear_url->getUrl()));
exit;
}
if (isset($_GET['adme_action']) && $_GET['adme_action'] == ADME_LG_ACTION_CLASSIQUE_MODIFIER_ACTION) {
$sortie_xhtml .= ADME_afficherFormMenuClassique($objet_pear_db, $objet_pear_url, $_GET['adme_site_id'], $_GET['adme_menu_id'], $_POST);
return $sortie_xhtml;
}
//var_dump($_POST);
if (isset($_POST['form_boutons'][ADME_LG_ACTION_CLASSIQUE_VERIFIER])) {
// Nous cherchons a enregistrer une modification de menu
$message = ADME_validerFormAjouterMenuClassique($objet_pear_db, $_POST);
if (!empty($message)) {
// Les donnees ne sont pas valide. Nous retournons le formulaires avec les messages d'erreurs.
$sortie_xhtml .= $message;
$sortie_xhtml .= ADME_afficherFormMenuClassique($objet_pear_db, $objet_pear_url, $_GET['adme_site_id'], $_GET['adme_menu_id'], $_POST);
return $sortie_xhtml;
} else {
// Les donnees sont valide. Nous les enregistrons et retournons au formulaire de depart.
$message = ADME_modifierMenuClassique($objet_pear_db, $objet_pear_auth, $_GET['adme_menu_id'], $_POST);
}
}
// Deplacer le menu vers le haut
if (isset($_GET['adme_action']) && $_GET['adme_action'] == ADME_LG_ACTION_CLASSIQUE_MONTER) {
ADME_deplacerMenuClassique($objet_pear_db, $_GET['adme_site_id'], $_GET['adme_menu_id'], true);
}
// Deplacer le menu vers le bas
if (isset($_GET['adme_action']) && $_GET['adme_action'] == ADME_LG_ACTION_CLASSIQUE_DESCENDRE) {
ADME_deplacerMenuClassique($objet_pear_db, $_GET['adme_site_id'], $_GET['adme_menu_id'], false);
}
// Deplacer le menu vers la gauche (diminuer d'un niveau)
if (isset($_GET['adme_action']) && $_GET['adme_action'] == ADME_LG_ACTION_CLASSIQUE_DIMINUER) {
ADME_indenterMenuClassique($objet_pear_db, $_GET['adme_site_id'], $_GET['adme_menu_id'], true);
}
// Deplacer le menu vers la droite (augmenter d'un niveau)
if (isset($_GET['adme_action']) && $_GET['adme_action'] == ADME_LG_ACTION_CLASSIQUE_AUGMENTER) {
ADME_indenterMenuClassique($objet_pear_db, $_GET['adme_site_id'], $_GET['adme_menu_id'], false);
}
// Deplacer le menu vers un autre site
if (isset($_GET['adme_action']) && $_GET['adme_action'] == ADME_LG_ACTION_CLASSIQUE_DEPLACER_MENUS) {
if(isset($_POST['adme_id_site_depart']) && isset($_POST['adme_id_site_arrivee']) && isset($_POST['adme_id_menu_deplacement'])) {
ADME_deplacerMenuClassiqueVersSite($objet_pear_db, $_POST['adme_id_site_depart'], $_POST['adme_id_site_arrivee'],$_POST['adme_id_menu_deplacement']);
}
}
// Traduire le menu
if (isset($_GET['adme_action']) && $_GET['adme_action'] == ADME_LG_ACTION_CLASSIQUE_TRADUIRE) {
$message='';
$message = ADME_verifier_traduction_possible($objet_pear_db, $objet_pear_url, $_GET['adme_site_id'], $_GET['adme_menu_id'], $_POST);
if ((!empty($message))) {
// Pas de traduction possible !
$sortie_xhtml .= $message;
$sortie_xhtml .= ADME_afficherFormPrincipal($objet_pear_db, $objet_pear_url, $_GET['adme_site_id'], $_GET['adme_menu_id'], $_GET['adme_action']);
return $sortie_xhtml;
}
else {
// Les données sont valide. Nous affichons le formulaire de traduction
$copie_objet_pear_url->addQueryString('adme_site_id',$_GET['adme_site_id']);
$copie_objet_pear_url->addQueryString('adme_menu_id',$_GET['adme_menu_id']);
$copie_objet_pear_url->addQueryString('adme_action',ADME_LG_ACTION_CLASSIQUE_TRADUIRE_ACTION);
header("Location: ".str_replace('&amp;', '&', $copie_objet_pear_url->getUrl()));
exit;
}
}
if (isset($_GET['adme_action']) && $_GET['adme_action'] == ADME_LG_ACTION_CLASSIQUE_TRADUIRE_ACTION) {
$sortie_xhtml .= ADME_afficherFormMenuClassique($objet_pear_db, $objet_pear_url, $_GET['adme_site_id'], $_GET['adme_menu_id'], $_POST,TRUE);
return $sortie_xhtml;
}
if (isset($_POST['form_boutons'][ADME_LG_ACTION_CLASSIQUE_VERIFIER_TRADUCTION])) {
// Nous cherchons a enregistrer une traduction de menu
$message = ADME_validerFormTraduireMenuClassique($objet_pear_db, $_POST);
if (!empty($message)) {
// Les donnees ne sont pas valide. Nous retournons le formulaires avec les messages d'erreurs.
$sortie_xhtml .= $message;
$sortie_xhtml .= ADME_afficherFormMenuClassique($objet_pear_db, $objet_pear_url, $_GET['adme_menu_id'], $_POST);
return $sortie_xhtml;
} else {
// Les donnees sont valide. Nous les enregistrons et retournons au formulaire de depart.
$message = ADME_traduireMenuClassique($objet_pear_db, $objet_pear_auth, $_GET['adme_menu_id'], $_POST);
}
}
// Supprimer le menu
if (isset($_GET['adme_action']) && $_GET['adme_action'] == ADME_LG_ACTION_CLASSIQUE_SUPPRIMER) {
// Recuperation du menu de remplacement pour eviter de fermer l'arborescence
if (GEN_donnerDernierFreres($_GET['adme_menu_id']) == false) {
$adme_menu_id_remplacement = GEN_lireIdentifiantMenuPere($_GET['adme_menu_id']);;
} else {
$adme_menu_id_remplacement = GEN_donnerDernierFreres($_GET['adme_menu_id']);
}
// Suppression du menu classique
$message = ADME_supprimerMenuClassique($objet_pear_db, $_GET['adme_site_id'], $_GET['adme_menu_id']);
// Remplacement de l'id du menu courant par le remplacant.
$_GET['adme_menu_id'] = $adme_menu_id_remplacement;
$copie_objet_pear_url->addQueryString('adme_site_id',$_GET['adme_site_id']);
header("Location: ".str_replace('&amp;', '&', $copie_objet_pear_url->getUrl()));
exit;
}
// Supprimer le menu traduit
if (isset($_GET['adme_action']) && $_GET['adme_action'] == ADME_LG_ACTION_CLASSIQUE_SUPPRIMER_TRADUCTION) {
// Suppression du menu classique
$message = ADME_supprimerMenuClassiqueTraduction($objet_pear_db, $_GET['adme_site_id'], $_GET['adme_menu_id']);
$copie_objet_pear_url->addQueryString('adme_site_id',$_GET['adme_site_id']);
header("Location: ".str_replace('&amp;', '&', $copie_objet_pear_url->getUrl()));
exit;
}
// Selectionner le menu comme traduction par defaut :
if (isset($_GET['adme_action']) && $_GET['adme_action'] == ADME_LG_ACTION_CLASSIQUE_TRADUCTION_DEFAUT) {
$message = ADME_selectionnerMenuClassiqueTraduction($objet_pear_db, $_GET['adme_site_id'], $_GET['adme_menu_id']);
$copie_objet_pear_url->addQueryString('adme_site_id',$_GET['adme_site_id']);
header("Location: ".str_replace('&amp;', '&', $copie_objet_pear_url->getUrl()));
exit;
}
// Restreindre le menu a la langue selectionne
if (isset($_GET['adme_action']) && $_GET['adme_action'] == ADME_LG_ACTION_CLASSIQUE_LIMITER) {
$message = ADME_limiterMenuClassique($objet_pear_db, $_GET['adme_site_id'], $_GET['adme_menu_id'],$_GET['zone']);
$copie_objet_pear_url->addQueryString('adme_site_id',$_GET['adme_site_id'],$_GET['zone']);
header("Location: ".str_replace('&amp;', '&', $copie_objet_pear_url->getUrl()));
exit;
}
 
// Ouvrir le menu suite a une restriction
if (isset($_GET['adme_action']) && $_GET['adme_action'] == ADME_LG_ACTION_CLASSIQUE_OUVRIR) {
$message = ADME_ouvrirMenuClassique($objet_pear_db, $_GET['adme_site_id'], $_GET['adme_menu_id']);
$copie_objet_pear_url->addQueryString('adme_site_id',$_GET['adme_site_id']);
header("Location: ".str_replace('&amp;', '&', $copie_objet_pear_url->getUrl()));
exit;
}
//---------------------------------------------------------------------------------------------------------------
// GESTION DES MENUS COMMUNS
// Ajout un menu commun
if (isset($_GET['adme_action']) && $_GET['adme_action'] == ADME_LG_ACTION_COMMUN_AJOUTER) {
$message = ADME_ajouterMenuCommun($objet_pear_db, $objet_pear_auth, $_GET['adme_site_id'], $_GET['adme_menu_id']);
$copie_objet_pear_url->addQueryString('adme_site_id',$_GET['adme_site_id']);
header("Location: ".str_replace('&amp;', '&', $copie_objet_pear_url->getUrl()));
exit;
}
// Formulaire de mise a jour du menu commun.
if (isset($_GET['adme_action']) && $_GET['adme_action'] == ADME_LG_ACTION_COMMUN_MODIFIER) {
$copie_objet_pear_url->addQueryString('adme_site_id',$_GET['adme_site_id']);
$copie_objet_pear_url->addQueryString('adme_menu_id',$_GET['adme_menu_id']);
$copie_objet_pear_url->addQueryString('adme_action',ADME_LG_ACTION_COMMUN_MODIFIER_ACTION);
header("Location: ".str_replace('&amp;', '&', $copie_objet_pear_url->getUrl()));
exit;
}
if (isset($_GET['adme_action']) && $_GET['adme_action'] == ADME_LG_ACTION_COMMUN_MODIFIER_ACTION) {
$sortie_xhtml .= ADME_afficherFormMenuClassique($objet_pear_db, $objet_pear_url, $_GET['adme_site_id'], $_GET['adme_menu_id'], $_POST);
return $sortie_xhtml;
}
if (isset($_POST[ADME_LG_ACTION_COMMUN_VERIFIER])) {
// Nous cherchons a enregistrer une modification de menu
$message = ADME_validerFormAjouterMenuCommun($objet_pear_db, $_POST);
if (!empty($message)) {
// Les donnees ne sont pas valide. Nous retournons le formulaires avec les messages d'erreurs.
$sortie_xhtml .= $message;
$sortie_xhtml .= ADME_afficherFormMenuCommun($objet_pear_db, $objet_pear_url, $_GET['adme_site_id'], $_GET['adme_menu_id'], $_POST);
return $sortie_xhtml;
} else {
// Les donnees sont valide. Nous les enregistrons et retournons au formulaire de depart.
$message = ADME_modifierMenuCommun($objet_pear_db, $objet_pear_auth, $_GET['adme_menu_id'], $_POST);
}
}
// Deplace vers le haut de la hierarchie un menu commun
if (isset($_GET['adme_action']) && $_GET['adme_action'] == ADME_LG_ACTION_COMMUN_MONTER) {
ADME_deplacerMenuCommun($objet_pear_db, $_GET['adme_site_id'], $_GET['adme_menu_id'], true);
}
// Deplace vers le bas de la hierarchie un menu commun
if (isset($_GET['adme_action']) && $_GET['adme_action'] == ADME_LG_ACTION_COMMUN_DESCENDRE) {
ADME_deplacerMenuCommun($objet_pear_db, $_GET['adme_site_id'], $_GET['adme_menu_id'], false);
}
 
// Deplacer le menu vers la gauche (diminuer d'un niveau)
if (isset($_GET['adme_action']) && $_GET['adme_action'] == ADME_LG_ACTION_COMMUN_DIMINUER) {
ADME_indenterMenuCommun($objet_pear_db, $_GET['adme_site_id'], $_GET['adme_menu_id'], true);
}
// Deplacer le menu vers la droite (augmenter d'un niveau)
if (isset($_GET['adme_action']) && $_GET['adme_action'] == ADME_LG_ACTION_COMMUN_AUGMENTER) {
ADME_indenterMenuCommun($objet_pear_db, $_GET['adme_site_id'], $_GET['adme_menu_id'], false);
}
// Traduire le menu
if (isset($_GET['adme_action']) && $_GET['adme_action'] == ADME_LG_ACTION_COMMUN_TRADUIRE) {
$message='';
$message = ADME_verifier_traduction_possible($objet_pear_db, $objet_pear_url, $_GET['adme_site_id'], $_GET['adme_menu_id'], $_POST);
if ((!empty($message))) {
// Pas de traduction possible !
$sortie_xhtml .= $message;
$sortie_xhtml .= ADME_afficherFormPrincipal($objet_pear_db, $objet_pear_url, $_GET['adme_site_id'], $_GET['adme_menu_id'], $_GET['adme_action']);
return $sortie_xhtml;
}
else {
// Les données sont valide. Nous affichons le formulaire de traduction
$copie_objet_pear_url->addQueryString('adme_site_id',$_GET['adme_site_id']);
$copie_objet_pear_url->addQueryString('adme_menu_id',$_GET['adme_menu_id']);
$copie_objet_pear_url->addQueryString('adme_action',ADME_LG_ACTION_COMMUN_TRADUIRE_ACTION);
header("Location: ".str_replace('&amp;', '&', $copie_objet_pear_url->getUrl()));
exit;
}
}
if (isset($_GET['adme_action']) && $_GET['adme_action'] == ADME_LG_ACTION_COMMUN_TRADUIRE_ACTION) {
$sortie_xhtml .= ADME_afficherFormMenuCommun($objet_pear_db, $objet_pear_url, $_GET['adme_site_id'], $_GET['adme_menu_id'], $_POST,TRUE);
return $sortie_xhtml;
}
if (isset($_POST[ADME_LG_ACTION_COMMUN_VERIFIER_TRADUCTION])) {
// Nous cherchons à enregistrer une traduction de menu
$message = ADME_validerFormTraduireMenuCommun($objet_pear_db, $_POST);
if (!empty($message)) {
// Les données ne sont pas valide. Nous retournons le formulaires avec les messages d'erreurs.
$sortie_xhtml .= $message;
$sortie_xhtml .= ADME_afficherFormMenuCommun($objet_pear_db, $objet_pear_url, $_GET['adme_menu_id'], $_POST);
return $sortie_xhtml;
} else {
// Les données sont valide. Nous les enregistrons et retournons au formulaire de départ.
$message = ADME_traduireMenuCommun($objet_pear_db, $objet_pear_auth, $_GET['adme_menu_id'], $_POST);
}
}
// Supprime définitivement un menu commun
if (isset($_GET['adme_action']) && $_GET['adme_action'] == ADME_LG_ACTION_COMMUN_SUPPRIMER) {
// Récupération du menu de remplacement pour éviter de fermer l'arborescence
if (GEN_donnerDernierFreres($_GET['adme_menu_id']) == false) {
$adme_menu_id_remplacement = GEN_lireIdentifiantMenuPere($_GET['adme_menu_id']);;
} else {
$adme_menu_id_remplacement = GEN_donnerDernierFreres($_GET['adme_menu_id']);
}
// Suppression du menu commun
ADME_supprimerMenuCommun($objet_pear_db, $_GET['adme_menu_id']);
// Remplacement de l'id du menu courant par le remplaçant.
$_GET['adme_menu_id'] = $adme_menu_id_remplacement;
$copie_objet_pear_url->addQueryString('adme_site_id',$_GET['adme_site_id']);
header("Location: ".str_replace('&amp;', '&', $copie_objet_pear_url->getUrl()));
exit;
}
// Supprimer le menu traduit
if (isset($_GET['adme_action']) && $_GET['adme_action'] == ADME_LG_ACTION_COMMUN_SUPPRIMER_TRADUCTION) {
// Suppression du menu commun
$message = ADME_supprimerMenuCommunTraduction($objet_pear_db, $_GET['adme_site_id'], $_GET['adme_menu_id']);
$copie_objet_pear_url->addQueryString('adme_site_id',$_GET['adme_site_id']);
header("Location: ".str_replace('&amp;', '&', $copie_objet_pear_url->getUrl()));
exit;
}
if (isset($_GET['adme_action']) && $_GET['adme_action'] == ADME_LG_ACTION_COMMUN_TRADUCTION_DEFAUT) {
$message = ADME_selectionnerMenuCommunTraduction($objet_pear_db, $_GET['adme_site_id'], $_GET['adme_menu_id']);
$copie_objet_pear_url->addQueryString('adme_site_id',$_GET['adme_site_id']);
header("Location: ".str_replace('&amp;', '&', $copie_objet_pear_url->getUrl()));
exit;
}
//---------------------------------------------------------------------------------------------------------------
// GESTION DES INTERFACES D'ADMINISTRATION
// Appel de l'application d'administration
if (isset($_GET['adme_action']) && $_GET['adme_action'] == ADME_LG_ACTION_ADMINISTRER) {
$id_appli = GEN_retournerIdAppliMenu($objet_pear_db, $_GET['adme_menu_id']);
$chemin_admin = GEN_retournerCheminInterfaceAdmin($objet_pear_db, $id_appli);
$nom_admin = GEN_retournerNomInterfaceAdmin($objet_pear_db, $id_appli);
if ($chemin_admin !== false) {
include_once $chemin_admin;
$objet_admin = new $nom_admin;
if (method_exists($objet_admin, 'afficherContenuCorps')) {
$retour_admin = $objet_admin->afficherContenuCorps();
}
if ($retour_admin !== false) {
return $retour_admin;
}
}
}
//---------------------------------------------------------------------------------------------------------------
// Affichage des messages si nécessaire
if (! empty($message)) {
$sortie_xhtml .= "\n".'<p class="pap_erreur">'.$message.'</p>';
}
//---------------------------------------------------------------------------------------------------------------
// Affichage formulaire principal et retour du XHTML!
$sortie_xhtml .= ADME_afficherFormPrincipal($objet_pear_db, $objet_pear_url, $_GET['adme_site_id'], $_GET['adme_menu_id'], $_GET['adme_action']);
return $sortie_xhtml;
// Fin de l'authentification
} else {
// Pas d'authentification nous affichons un message!
$res='';
$res .= '<p class="zone_alert">'.ADME_IDENTIFIEZ_VOUS.'</p>'."\n" ;
$res .= '<form id="form_connexion" style="clear:both;" class="form_identification" action="' ;
$res .= $objet_pear_url->getURL();
$res .= '" method="post">
<fieldset>
<legend>Identifiez vous</legend>
<label for="username">Courriel : </label>
<input type="text" id="username" name="username" maxlength="80" tabindex="1" value="courriel" />
<label for="password">Mot de passe : </label>
<input type="password" id="password" name="password" maxlength="80" tabindex="2" value="mot de passe" />
<input type="submit" id="connexion" name="connexion" tabindex="3" value="ok" />
</fieldset>
</form>';
return $res ;
}
}// Fin de la fonction afficherContenuCorps()
 
// +------------------------------------------------------------------------------------------------------+
// | PIED du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
 
 
 
/* +--Fin du code ----------------------------------------------------------------------------------------+
*
* $Log: not supported by cvs2svn $
* Revision 1.28 2007-10-24 14:43:01 ddelon
* Gestion des menus reservés à une langue
*
* Revision 1.27 2007-07-04 14:59:13 florian
* correction bug maj non prise en charge
*
* Revision 1.26 2007/04/19 15:34:35 neiluj
* préparration release (livraison) "Narmer" - v0.25
*
* Revision 1.25 2006/10/06 10:40:51 florian
* harmonisation des messages d'erreur de l'authentification
*
* Revision 1.24 2006/06/29 19:13:26 ddelon
* Bug defaut traduction sur menu commun
*
* Revision 1.23 2006/06/29 18:58:57 ddelon
* Multilinguisme : menu par defaut pour les menu commun
*
* Revision 1.22 2006/06/28 12:53:34 ddelon
* Multilinguisme : menu par defaut
*
* Revision 1.21 2006/04/12 21:11:54 ddelon
* Multilinguisme menus communs
*
* Revision 1.20 2006/03/23 20:24:58 ddelon
* *** empty log message ***
*
* Revision 1.19 2006/03/02 10:49:49 ddelon
* Fusion branche multilinguisme dans branche principale
*
* Revision 1.18.2.2 2006/02/28 14:02:08 ddelon
* Finition multilinguisme
*
* Revision 1.18.2.1 2005/12/27 15:56:00 ddelon
* Fusion Head vers multilinguisme (wikini double clic)
*
* Revision 1.18 2005/09/23 15:27:17 florian
* correction de bugs
*
* Revision 1.17 2005/07/18 16:14:32 ddelon
* css admin + menu communs
*
* Revision 1.16 2005/07/08 21:13:15 ddelon
* Gestion indentation menu
*
* Revision 1.15 2005/02/28 11:04:25 jpm
* Modification des auteurs.
*
* Revision 1.14 2005/02/28 10:31:41 jpm
* Changement de nom de dossier.
*
* Revision 1.13 2004/11/16 13:01:41 jpm
* Ajout d'un commentaire.
*
* Revision 1.12 2004/11/15 16:51:08 jpm
* Correction bogue de mise à jour de l'ordre des menus.
*
* Revision 1.11 2004/11/10 17:26:18 jpm
* Fin gestion de la traduction.
*
* Revision 1.10 2004/11/10 11:58:58 jpm
* Mise en place des constantes de traduction de l'appli.
*
* Revision 1.9 2004/11/09 17:53:03 jpm
* Changement des noms des actions sur les menus classiques.
*
* Revision 1.8 2004/11/09 17:49:11 jpm
* Mise en conformité et gestion de différentes interfaces d'administration.
*
* Revision 1.7 2004/10/25 16:28:02 jpm
* Correction convention de codage.
*
* Revision 1.6 2004/09/23 17:45:19 jpm
* Amélioration de la gestion des liens annuler et du selecteur de sites.
*
* Revision 1.5 2004/09/23 16:49:24 jpm
* Correction d'une erreur dans l'url de l'ajout de menu commun.
*
* Revision 1.4 2004/07/06 17:24:54 jpm
* Suppression d'inclusions de fichiers inutiles.
*
* Revision 1.3 2004/07/06 17:07:28 jpm
* Modification de la documentation pour une mailleur analyse par PhpDocumentor.
*
* Revision 1.2 2004/06/16 15:06:30 jpm
* Suppression fichier inutile.
*
* Revision 1.1 2004/06/16 15:04:39 jpm
* Changement de nom de Papyrus en Papyrus.
* Changement de l'arborescence.
*
* Revision 1.26 2004/05/10 14:32:21 jpm
* Changement du titre.
*
* Revision 1.25 2004/05/10 12:13:23 jpm
* Ajout de la sélection des sites.
*
* Revision 1.24 2004/05/07 16:33:05 jpm
* Intégration de constantes.
*
* Revision 1.23 2004/05/07 07:23:53 jpm
* Amélioration du code, des commentaires et correction de bogues.
*
* Revision 1.22 2004/05/05 06:45:44 jpm
* Suppression de l'appel de la fonction générant le "vous êtes ici" dans la fonction affichant l'entête de l'application.
*
* Revision 1.21 2004/05/04 16:27:33 jpm
* Réduction de code pour la fonction afficherContenuTete().
*
* Revision 1.20 2004/05/03 11:23:26 jpm
* Début mise en conformité des commentaires.
*
*
* +-- Fin du code ----------------------------------------------------------------------------------------+
*/
?>
/trunk/papyrus/applications/admin_site/bibliotheque/adsi_affichage.fonct.php
68,7 → 68,10
 
// +- Fin du code source --------------------------------------------------------------------------------+
/*
* $Log: not supported by cvs2svn $
* $Log: adsi_affichage.fonct.php,v $
* Revision 1.5 2005-02-28 11:07:00 jpm
* Modification des auteurs.
*
* Revision 1.4 2005/02/28 10:59:07 jpm
* Modification des commentaires et copyright.
*
/trunk/papyrus/applications/admin_site/langues/adsi_langue_en.inc.php
46,7 → 46,10
 
/* +--Fin du code ----------------------------------------------------------------------------------------+
*
* $Log: not supported by cvs2svn $
* $Log: adsi_langue_en.inc.php,v $
* Revision 1.2 2006-03-02 10:49:49 ddelon
* Fusion branche multilinguisme dans branche principale
*
* Revision 1.1.2.1 2006/02/28 14:02:10 ddelon
* Finition multilinguisme
*
/trunk/papyrus/applications/admin_site/langues/adsi_langue_fr.inc.php
46,7 → 46,10
 
/* +--Fin du code ----------------------------------------------------------------------------------------+
*
* $Log: not supported by cvs2svn $
* $Log: adsi_langue_fr.inc.php,v $
* Revision 1.3 2006-10-06 10:40:51 florian
* harmonisation des messages d'erreur de l'authentification
*
* Revision 1.2 2006/03/02 10:49:49 ddelon
* Fusion branche multilinguisme dans branche principale
*
/trunk/papyrus/applications/admin_site/admin_site.php
315,10 → 315,10
<fieldset>
<legend>Identifiez vous</legend>
<label for="username">Courriel : </label>
<input type="text" id="username" name="username" maxlength="80" tabindex="10" value="courriel" />
<input type="text" id="username" name="username" maxlength="80" tabindex="1" value="courriel" />
<label for="password">Mot de passe : </label>
<input type="password" id="password" name="password" maxlength="80" tabindex="20" value="mot de passe" />
<input type="submit" id="connexion" name="connexion" tabindex="30" value="ok" />
<input type="password" id="password" name="password" maxlength="80" tabindex="2" value="mot de passe" />
<input type="submit" id="connexion" name="connexion" tabindex="3" value="ok" />
</fieldset>
</form>';
return $res ;
326,7 → 326,10
}//Fin de la fonction afficherContenuCorps().
 
/* +--Fin du code ---------------------------------------------------------------------------------------+
* $Log: not supported by cvs2svn $
* $Log: admin_site.php,v $
* Revision 1.12 2006-10-06 10:40:51 florian
* harmonisation des messages d'erreur de l'authentification
*
* Revision 1.11 2006/03/15 23:35:25 ddelon
* Gestion site
*
/trunk/papyrus/applications/admin_site/configuration/adsi_configuration.inc.php
64,7 → 64,10
define ('ADSI_I18N_DEFAUT', 'fr');
/* +--Fin du code ----------------------------------------------------------------------------------------+
*
* $Log: not supported by cvs2svn $
* $Log: adsi_configuration.inc.php,v $
* Revision 1.5 2006-03-22 13:18:00 alexandre_tb
* ajout de la constante ADSI_I18N_DEFAUT
*
* Revision 1.4 2006/03/02 10:49:49 ddelon
* Fusion branche multilinguisme dans branche principale
*
/trunk/papyrus/applications/afficheur/afficheur.admin.php
1,129 → 1,129
<?php
/*vim: set expandtab tabstop=4 shiftwidth=4: */
// +------------------------------------------------------------------------------------------------------+
// | PHP version 4.1 |
// +------------------------------------------------------------------------------------------------------+
// | Copyright (C) 2004 Tela Botanica (accueil@tela-botanica.org) |
// +------------------------------------------------------------------------------------------------------+
// | This library is free software; you can redistribute it and/or |
// | modify it under the terms of the GNU Lesser General Public |
// | License as published by the Free Software Foundation; either |
// | version 2.1 of the License, or (at your option) any later version. |
// | |
// | This library is distributed in the hope that it will be useful, |
// | but WITHOUT ANY WARRANTY; without even the implied warranty of |
// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
// | Lesser General Public License for more details. |
// | |
// | You should have received a copy of the GNU Lesser General Public |
// | License along with this library; if not, write to the Free Software |
// | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
// +------------------------------------------------------------------------------------------------------+
// CVS : $Id: afficheur.admin.php,v 1.24 2007-06-26 15:38:39 jp_milcent Exp $
/**
* Gestion de la rédaction du contenu pour Papyrus.
*
* Contient les fonctions nécessaires à la gestion du contenu de Papyrus.
*
*@package Afficheur
*@subpackage Administration
//Auteur original :
*@author Jean-Pascal MILCENT <jpm@tela-botanica.org>
//Autres auteurs :
*@author Aucun
*@copyright Tela-Botanica 2000-2004
*@version $Revision: 1.24 $ $Date: 2007-06-26 15:38:39 $
// +------------------------------------------------------------------------------------------------------+
*/
 
// +------------------------------------------------------------------------------------------------------+
// | ENTÊTE du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
// Nous indiquons à Papyrus de ne pas chercher de balises d'applettes dans le contenu généré par l'appli
$GLOBALS['_PAPYRUS_']['applette']['analyse'] = false;
 
// +------------------------------------------------------------------------------------------------------+
// | CLASSE |
// +------------------------------------------------------------------------------------------------------+
class Afficheur_Admin {
var $objet_pear_auth;
var $objet_pear_db;
var $objet_pear_url;
var $sortie_xhtml;
/** Fonction redigerContenu() - Affiche le formulaire de rédaction
*
*
* @return string Le HTML
*/
function afficherContenuCorps()
{
/** Inclusion du fichier de configuration de cette application.*/
require_once GEN_CHEMIN_PAP.'applications'.GEN_SEP.'afficheur'.GEN_SEP.'configuration'.GEN_SEP.'affi_configuration.inc.php';
//-------------------------------------------------------------------------------------------------------------------
// Stockage des styles de l'application
GEN_stockerStyleExterne('afficheur', AFFI_CHEMIN_STYLE.'afficheur.css');
//-------------------------------------------------------------------------------------------------------------------
// Initialisation des attributs
$this->objet_pear_auth = $GLOBALS['_GEN_commun']['pear_auth'];
$this->objet_pear_db = $GLOBALS['_GEN_commun']['pear_db'];
$this->objet_pear_url = $GLOBALS['_GEN_commun']['url'];
$this->sortie_xhtml = '';
//-------------------------------------------------------------------------------------------------------------------
// Gestion de l'interface
if (isset($_POST['afficheur_annuler'])) {
return false;
} else if (isset($_POST['afficheur_enregistrer_quitter'])) {
// Mise à jour du contenu
$this->_ajouterContenu($this->objet_pear_db, $this->objet_pear_url, $this->objet_pear_auth, $_GET['adme_menu_id'], $_POST);
return false;
} else if (isset($_POST['afficheur_enregistrer_rester'])) {
// Mise à jour du contenu
$this->_ajouterContenu($this->objet_pear_db, $this->objet_pear_url, $this->objet_pear_auth, $_GET['adme_menu_id'], $_POST);
$this->sortie_xhtml .= $this->_redigerContenu($this->objet_pear_db, $this->objet_pear_url, $_GET['adme_site_id'], $_GET['adme_menu_id'], $_GET['adme_action']);
} else if (isset($_POST['afficheur_historique'])) {
// Réediter une version archivée
$this->sortie_xhtml .= $this->_reediterContenu($this->objet_pear_db, $this->objet_pear_url, $_GET['adme_site_id'], $_GET['adme_menu_id'], $_GET['adme_action']);
} else {
if (isset($_GET['adme_version'])) {
// Nous avons demandés la réedition d'une version archivées
$this->sortie_xhtml .= $this->_redigerContenu($this->objet_pear_db, $this->objet_pear_url, $_GET['adme_site_id'], $_GET['adme_menu_id'], $_GET['adme_action'], $_GET['adme_version']);
} else {
// Nous affichons le dernier contenu
$this->sortie_xhtml .= $this->_redigerContenu($this->objet_pear_db, $this->objet_pear_url, $_GET['adme_site_id'], $_GET['adme_menu_id'], $_GET['adme_action']);
}
}
return $this->sortie_xhtml;
}
function _redigerContenu($db, $url, $adme_site_id, $adme_menu_id, $adme_action, $adme_contenu_id = '')
<?php
/*vim: set expandtab tabstop=4 shiftwidth=4: */
// +------------------------------------------------------------------------------------------------------+
// | PHP version 4.1 |
// +------------------------------------------------------------------------------------------------------+
// | Copyright (C) 2004 Tela Botanica (accueil@tela-botanica.org) |
// +------------------------------------------------------------------------------------------------------+
// | This library is free software; you can redistribute it and/or |
// | modify it under the terms of the GNU Lesser General Public |
// | License as published by the Free Software Foundation; either |
// | version 2.1 of the License, or (at your option) any later version. |
// | |
// | This library is distributed in the hope that it will be useful, |
// | but WITHOUT ANY WARRANTY; without even the implied warranty of |
// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
// | Lesser General Public License for more details. |
// | |
// | You should have received a copy of the GNU Lesser General Public |
// | License along with this library; if not, write to the Free Software |
// | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
// +------------------------------------------------------------------------------------------------------+
// CVS : $Id: afficheur.admin.php,v 1.24 2007-06-26 15:38:39 jp_milcent Exp $
/**
* Gestion de la rédaction du contenu pour Papyrus.
*
* Contient les fonctions nécessaires à la gestion du contenu de Papyrus.
*
*@package Afficheur
*@subpackage Administration
//Auteur original :
*@author Jean-Pascal MILCENT <jpm@tela-botanica.org>
//Autres auteurs :
*@author Aucun
*@copyright Tela-Botanica 2000-2004
*@version $Revision: 1.24 $ $Date: 2007-06-26 15:38:39 $
// +------------------------------------------------------------------------------------------------------+
*/
 
// +------------------------------------------------------------------------------------------------------+
// | ENTÊTE du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
// Nous indiquons à Papyrus de ne pas chercher de balises d'applettes dans le contenu généré par l'appli
$GLOBALS['_PAPYRUS_']['applette']['analyse'] = false;
 
// +------------------------------------------------------------------------------------------------------+
// | CLASSE |
// +------------------------------------------------------------------------------------------------------+
class Afficheur_Admin {
var $objet_pear_auth;
var $objet_pear_db;
var $objet_pear_url;
var $sortie_xhtml;
/** Fonction redigerContenu() - Affiche le formulaire de rédaction
*
*
* @return string Le HTML
*/
function afficherContenuCorps()
{
/** Inclusion du fichier de configuration de cette application.*/
require_once GEN_CHEMIN_PAP.'applications'.GEN_SEP.'afficheur'.GEN_SEP.'configuration'.GEN_SEP.'affi_configuration.inc.php';
//-------------------------------------------------------------------------------------------------------------------
// Stockage des styles de l'application
GEN_stockerStyleExterne('afficheur', AFFI_CHEMIN_STYLE.'afficheur.css');
//-------------------------------------------------------------------------------------------------------------------
// Initialisation des attributs
$this->objet_pear_auth = $GLOBALS['_GEN_commun']['pear_auth'];
$this->objet_pear_db = $GLOBALS['_GEN_commun']['pear_db'];
$this->objet_pear_url = $GLOBALS['_GEN_commun']['url'];
$this->sortie_xhtml = '';
//-------------------------------------------------------------------------------------------------------------------
// Gestion de l'interface
if (isset($_POST['afficheur_annuler'])) {
return false;
} else if (isset($_POST['afficheur_enregistrer_quitter'])) {
// Mise à jour du contenu
$this->_ajouterContenu($this->objet_pear_db, $this->objet_pear_url, $this->objet_pear_auth, $_GET['adme_menu_id'], $_POST);
return false;
} else if (isset($_POST['afficheur_enregistrer_rester'])) {
// Mise à jour du contenu
$this->_ajouterContenu($this->objet_pear_db, $this->objet_pear_url, $this->objet_pear_auth, $_GET['adme_menu_id'], $_POST);
$this->sortie_xhtml .= $this->_redigerContenu($this->objet_pear_db, $this->objet_pear_url, $_GET['adme_site_id'], $_GET['adme_menu_id'], $_GET['adme_action']);
} else if (isset($_POST['afficheur_historique'])) {
// Réediter une version archivée
$this->sortie_xhtml .= $this->_reediterContenu($this->objet_pear_db, $this->objet_pear_url, $_GET['adme_site_id'], $_GET['adme_menu_id'], $_GET['adme_action']);
} else {
if (isset($_GET['adme_version'])) {
// Nous avons demandés la réedition d'une version archivées
$this->sortie_xhtml .= $this->_redigerContenu($this->objet_pear_db, $this->objet_pear_url, $_GET['adme_site_id'], $_GET['adme_menu_id'], $_GET['adme_action'], $_GET['adme_version']);
} else {
// Nous affichons le dernier contenu
$this->sortie_xhtml .= $this->_redigerContenu($this->objet_pear_db, $this->objet_pear_url, $_GET['adme_site_id'], $_GET['adme_menu_id'], $_GET['adme_action']);
}
}
return $this->sortie_xhtml;
}
function _redigerContenu($db, $url, $adme_site_id, $adme_menu_id, $adme_action, $adme_contenu_id = '')
{
//-------------------------------------------------------------------------------------------------------------------
// Initialisation de variable
$contenu = '';
$donnees = array();
$contenu = '';
$donnees = array();
$url->addQueryString('adme_site_id', $adme_site_id);
$url->addQueryString('adme_menu_id', $adme_menu_id);
$url->addQueryString('adme_action', $adme_action);
if ($adme_contenu_id != '') {
// Nous réeditons une version archivée
$ligne_dernier_contenu = GEN_rechercheContenuIdentifiant($db, $adme_contenu_id, DB_FETCHMODE_ASSOC);
$donnees['reedition_info'] = $ligne_dernier_contenu['gmc_date_modification'];
if ($adme_contenu_id != '') {
// Nous réeditons une version archivée
$ligne_dernier_contenu = GEN_rechercheContenuIdentifiant($db, $adme_contenu_id, DB_FETCHMODE_ASSOC);
$donnees['reedition_info'] = $ligne_dernier_contenu['gmc_date_modification'];
} else {
// Nous affichons la dernière version du contenu
$ligne_dernier_contenu = GEN_rechercheContenu($db, $adme_menu_id, DB_FETCHMODE_ASSOC);
// Nous affichons la dernière version du contenu
$ligne_dernier_contenu = GEN_rechercheContenu($db, $adme_menu_id, DB_FETCHMODE_ASSOC);
}
 
 
//-------------------------------------------------------------------------------------------------------------------
// Récupération des données
// Récupération des données
$donnees['form_url'] = $url->getUrl();
// Gestion de FckEditor
// Gestion de FckEditor
$donnees['fck_editor'] = '';
if ($GLOBALS['_AFFI_']['fckeditor']['utilisation']) {
/** Inclusion du fichier de FCKeditor*/
148,46 → 148,46
$donnees['fck_editor'] = $fckeditor->CreateHtml();
}
}
 
// Identifiant du menu
 
// Identifiant du menu
$donnees['gmc_ce_menu'] = $adme_menu_id;
// Type de contenu
// Par défaut c'est du XHTML (donc 1)
$donnees['gmc_ce_type_contenu'] = 1;
// Type de contenu
// Par défaut c'est du XHTML (donc 1)
$donnees['gmc_ce_type_contenu'] = 1;
if (isset($ligne_dernier_contenu['gmc_ce_type_contenu'])) {
$donnees['gmc_ce_type_contenu'] = $ligne_dernier_contenu['gmc_ce_type_contenu'];
$donnees['gmc_ce_type_contenu'] = $ligne_dernier_contenu['gmc_ce_type_contenu'];
}
$squelette = AFFI_CHEMIN_SQUELETTE.'formulaire.tpl.html';
$squelette = AFFI_CHEMIN_SQUELETTE.'formulaire.tpl.html';
return $this->_genererContenu($squelette, $donnees);
}
function _reediterContenu($db, $url, $adme_site_id, $adme_menu_id, $adme_action)
{
//-------------------------------------------------------------------------------------------------------------------
// Initialisation de variable
$contenu = '';
$donnees = array();
$url->addQueryString('adme_site_id', $adme_site_id);
$url->addQueryString('adme_menu_id', $adme_menu_id);
$url->addQueryString('adme_action', $adme_action);
$donnees['archives'] = GEN_lireContenuMenuHistorique(&$db, $adme_menu_id);
foreach ($donnees['archives'] as $cle => $archive) {
$url->addQueryString('adme_version', $archive->gmc_id_contenu);
$donnees['archives'][$cle]->url = $url->getURL();
$url->removeQueryString('adme_version');
}
// print_r($donnees['archives']);
 
$squelette = AFFI_CHEMIN_SQUELETTE.'historique.tpl.html';
return $this->_genererContenu($squelette, $donnees);
}
function _reediterContenu($db, $url, $adme_site_id, $adme_menu_id, $adme_action)
{
//-------------------------------------------------------------------------------------------------------------------
// Initialisation de variable
$contenu = '';
$donnees = array();
$url->addQueryString('adme_site_id', $adme_site_id);
$url->addQueryString('adme_menu_id', $adme_menu_id);
$url->addQueryString('adme_action', $adme_action);
$donnees['archives'] = GEN_lireContenuMenuHistorique(&$db, $adme_menu_id);
foreach ($donnees['archives'] as $cle => $archive) {
$url->addQueryString('adme_version', $archive->gmc_id_contenu);
$donnees['archives'][$cle]->url = $url->getURL();
$url->removeQueryString('adme_version');
}
// print_r($donnees['archives']);
 
$squelette = AFFI_CHEMIN_SQUELETTE.'historique.tpl.html';
return $this->_genererContenu($squelette, $donnees);
}
/** Méthode ajouterContenu() - Enregistre les infos du formulaire de saisie d'un menu
*
*
224,18 → 224,10
//-------------------------------------------------------------------------------------------------------------------
// Obtention d'un nouvel identifiant de contenu
$nouveau_id_contenu = SQL_obtenirNouveauId($db, 'gen_menu_contenu', 'gmc_id_contenu');
// FCK Editor remplace les " par des &quot; qui sont mal interprétés.
// Remplacement des &quot;
$tab_valeur['gmc_contenu'] = str_replace('&quot;', '\"', $tab_valeur['gmc_contenu']);
// Pour l'enregistrement dans la BDD, les caractères spéciaux doivent être précédés de \ ou doublés
// La fonction magic_quote (< php 6) échappe automatiquement ces caractères.
// Ce n'est donc pas la peine de faire un traitement sur la chaine si l'option est activée
if (get_magic_quotes_gpc() == 0) {
$tab_valeur['gmc_contenu'] = $db->escapeSimple($tab_valeur['gmc_contenu']);
}
// remplacement des guillemets doubles pour les appels aux applettes de Papyrus
$tab_valeur['gmc_contenu'] = str_replace('&quot;', '\"', $tab_valeur['gmc_contenu']);
//-------------------------------------------------------------------------------------------------------------------
// Ajout du nouveau contenu pour ce menu
$requete = 'INSERT INTO gen_menu_contenu SET '.
250,129 → 242,133
'gmc_bool_dernier = 1';
$result = $db->query($requete);
(DB::isError($result)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $result->getMessage(), $requete)) : '';
}
function _genererContenu($squelette, $donnees)
{
//+------------------------------------------------------------------------------------------------------------+
// Extrait les variables et les ajoutes à l'espace de noms local
// Gestion des squelettes
extract($donnees);
// Démarre le buffer
ob_start();
// Inclusion du fichier
include($squelette);
// Récupérer le contenu du buffer
$contenu = ob_get_contents();
// Arrête et détruit le buffer
ob_end_clean();
return $contenu;
}
}// Fin de la classe
 
// +------------------------------------------------------------------------------------------------------+
// | PIED du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
 
 
/* +--Fin du code ----------------------------------------------------------------------------------------+
*
* $Log: not supported by cvs2svn $
* Revision 1.23 2007-06-26 13:30:48 jp_milcent
* Suppression de l'utilisation de Quickform.
* Utilisation de squellette PHP.
*
* Revision 1.22 2007-01-03 11:28:34 ddelon
* correction bug multilinguisme (portage bug livraison)
*
* Revision 1.21 2006/12/01 16:59:45 florian
* Ajout d'une variable parametrant la recherche de balise d'applette dans le contenu généré par l'appli.
*
* Revision 1.20 2006/12/01 11:23:23 ddelon
* Suppression mode wiki afficheur
*
* Revision 1.19 2006/10/16 15:49:07 ddelon
* Refactorisation code mulitlinguisme et gestion menu invisibles
*
* Revision 1.18 2006/04/28 12:41:49 florian
* corrections erreurs chemin
*
* Revision 1.17 2006/03/27 13:42:32 ddelon
* the last but not the least
*
* Revision 1.16 2006/03/27 11:21:49 ddelon
* Still some pb
*
* Revision 1.15 2006/03/27 10:14:43 ddelon
* Still some pb
*
* Revision 1.11 2006/03/13 22:27:23 ddelon
* bug afficheur multilinguisme
*
* Revision 1.10 2006/03/13 22:12:20 ddelon
* bug afficheur multilinguisme
*
* Revision 1.9 2006/03/13 21:00:20 ddelon
* Suppression messages d'erreur multilinguisme
*
* Revision 1.8 2006/03/02 10:49:49 ddelon
* Fusion branche multilinguisme dans branche principale
*
* Revision 1.7.2.1 2006/02/28 14:02:11 ddelon
* Finition multilinguisme
*
* Revision 1.7 2005/07/18 08:53:14 ddelon
* Configuration Fcsk et menage
*
* Revision 1.6 2005/07/15 17:10:08 ddelon
* Configuration Fcsk et menage
*
* Revision 1.5 2005/06/03 18:39:30 jpm
* Ajout de la barre d'outil Papyrus FCKeditor.
*
* Revision 1.4 2005/05/31 13:43:57 jpm
* Ajout d'un bouton pour remplacer les entités html.
*
* Revision 1.3 2005/04/25 13:56:31 jpm
* Ajout de styles.
*
* Revision 1.2 2005/02/28 10:34:15 jpm
* Changement de nom Genesia en Papyrus.
*
* Revision 1.1 2004/11/09 17:53:49 jpm
* Interface d'administration de l'application afficheur.
*
* Revision 1.4 2004/11/08 17:40:33 jpm
* Mise en conformité avec la convention de codage.
* Légères corrections.
*
* Revision 1.3 2004/09/23 17:45:13 jpm
* Amélioration de la gestion des liens annuler et du selecteur de sites.
*
* Revision 1.2 2004/07/06 17:07:37 jpm
* Modification de la documentation pour une mailleur analyse par PhpDocumentor.
*
* Revision 1.1 2004/06/16 15:04:32 jpm
* Changement de nom de Génésia en Papyrus.
* Changement de l'arborescence.
*
* Revision 1.5 2004/05/07 16:32:27 jpm
* Modification des commentaires.
*
* Revision 1.4 2004/05/07 07:23:53 jpm
* Amélioration du code, des commentaires et correction de bogues.
*
* Revision 1.3 2004/05/04 16:27:55 jpm
* Amélioration gestion du déplacement des menus.
*
* Revision 1.2 2004/05/03 14:51:59 jpm
* Normalisation du nom d'une fonction et ajout de la gestion d'une erreur.
*
* Revision 1.1 2004/04/30 16:21:30 jpm
* Ajout de la rédaction de contenu.
*
*
* +-- Fin du code ----------------------------------------------------------------------------------------+
*/
}
function _genererContenu($squelette, $donnees)
{
//+------------------------------------------------------------------------------------------------------------+
// Extrait les variables et les ajoutes à l'espace de noms local
// Gestion des squelettes
extract($donnees);
// Démarre le buffer
ob_start();
// Inclusion du fichier
include($squelette);
// Récupérer le contenu du buffer
$contenu = ob_get_contents();
// Arrête et détruit le buffer
ob_end_clean();
return $contenu;
}
}// Fin de la classe
 
// +------------------------------------------------------------------------------------------------------+
// | PIED du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
 
 
/* +--Fin du code ----------------------------------------------------------------------------------------+
*
* $Log: afficheur.admin.php,v $
* Revision 1.24 2007-06-26 15:38:39 jp_milcent
* Ajout de la gestion de l'historique du contenu.
* Réédition possible des versions archivées du contenu.
*
* Revision 1.23 2007-06-26 13:30:48 jp_milcent
* Suppression de l'utilisation de Quickform.
* Utilisation de squellette PHP.
*
* Revision 1.22 2007-01-03 11:28:34 ddelon
* correction bug multilinguisme (portage bug livraison)
*
* Revision 1.21 2006/12/01 16:59:45 florian
* Ajout d'une variable parametrant la recherche de balise d'applette dans le contenu généré par l'appli.
*
* Revision 1.20 2006/12/01 11:23:23 ddelon
* Suppression mode wiki afficheur
*
* Revision 1.19 2006/10/16 15:49:07 ddelon
* Refactorisation code mulitlinguisme et gestion menu invisibles
*
* Revision 1.18 2006/04/28 12:41:49 florian
* corrections erreurs chemin
*
* Revision 1.17 2006/03/27 13:42:32 ddelon
* the last but not the least
*
* Revision 1.16 2006/03/27 11:21:49 ddelon
* Still some pb
*
* Revision 1.15 2006/03/27 10:14:43 ddelon
* Still some pb
*
* Revision 1.11 2006/03/13 22:27:23 ddelon
* bug afficheur multilinguisme
*
* Revision 1.10 2006/03/13 22:12:20 ddelon
* bug afficheur multilinguisme
*
* Revision 1.9 2006/03/13 21:00:20 ddelon
* Suppression messages d'erreur multilinguisme
*
* Revision 1.8 2006/03/02 10:49:49 ddelon
* Fusion branche multilinguisme dans branche principale
*
* Revision 1.7.2.1 2006/02/28 14:02:11 ddelon
* Finition multilinguisme
*
* Revision 1.7 2005/07/18 08:53:14 ddelon
* Configuration Fcsk et menage
*
* Revision 1.6 2005/07/15 17:10:08 ddelon
* Configuration Fcsk et menage
*
* Revision 1.5 2005/06/03 18:39:30 jpm
* Ajout de la barre d'outil Papyrus FCKeditor.
*
* Revision 1.4 2005/05/31 13:43:57 jpm
* Ajout d'un bouton pour remplacer les entités html.
*
* Revision 1.3 2005/04/25 13:56:31 jpm
* Ajout de styles.
*
* Revision 1.2 2005/02/28 10:34:15 jpm
* Changement de nom Genesia en Papyrus.
*
* Revision 1.1 2004/11/09 17:53:49 jpm
* Interface d'administration de l'application afficheur.
*
* Revision 1.4 2004/11/08 17:40:33 jpm
* Mise en conformité avec la convention de codage.
* Légères corrections.
*
* Revision 1.3 2004/09/23 17:45:13 jpm
* Amélioration de la gestion des liens annuler et du selecteur de sites.
*
* Revision 1.2 2004/07/06 17:07:37 jpm
* Modification de la documentation pour une mailleur analyse par PhpDocumentor.
*
* Revision 1.1 2004/06/16 15:04:32 jpm
* Changement de nom de Génésia en Papyrus.
* Changement de l'arborescence.
*
* Revision 1.5 2004/05/07 16:32:27 jpm
* Modification des commentaires.
*
* Revision 1.4 2004/05/07 07:23:53 jpm
* Amélioration du code, des commentaires et correction de bogues.
*
* Revision 1.3 2004/05/04 16:27:55 jpm
* Amélioration gestion du déplacement des menus.
*
* Revision 1.2 2004/05/03 14:51:59 jpm
* Normalisation du nom d'une fonction et ajout de la gestion d'une erreur.
*
* Revision 1.1 2004/04/30 16:21:30 jpm
* Ajout de la rédaction de contenu.
*
*
* +-- Fin du code ----------------------------------------------------------------------------------------+
*/
?>
/trunk/papyrus/applications/afficheur/squelettes/afficheur.css
44,7 → 44,11
 
/* +--Fin des CSS ----------------------------------------------------------------------------------------+
*
* $Log: not supported by cvs2svn $
* $Log: afficheur.css,v $
* Revision 1.1 2007-06-26 13:30:48 jp_milcent
* Suppression de l'utilisation de Quickform.
* Utilisation de squellette PHP.
*
* Revision 1.1 2005-04-25 13:56:08 jpm
* Ajout du style pour l'afficheur.
*
/trunk/papyrus/applications/afficheur/afficheur.php
1,400 → 1,400
<?php
/*vim: set expandtab tabstop=4 shiftwidth=4: */
// +------------------------------------------------------------------------------------------------------+
// | PHP version 4.1 |
// +------------------------------------------------------------------------------------------------------+
// | Copyright (C) 2004 Tela Botanica (accueil@tela-botanica.org) |
// +------------------------------------------------------------------------------------------------------+
// | This library is free software; you can redistribute it and/or |
// | modify it under the terms of the GNU Lesser General Public |
// | License as published by the Free Software Foundation; either |
// | version 2.1 of the License, or (at your option) any later version. |
// | |
// | This library is distributed in the hope that it will be useful, |
// | but WITHOUT ANY WARRANTY; without even the implied warranty of |
// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
// | Lesser General Public License for more details. |
// | |
// | You should have received a copy of the GNU Lesser General Public |
// | License along with this library; if not, write to the Free Software |
// | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
// +------------------------------------------------------------------------------------------------------+
// CVS : $Id: afficheur.php,v 1.14 2007-06-26 15:38:39 jp_milcent Exp $
/**
* Application réalisant l'affichage du contenu stocké dans Papyrus.
*
* Récupère le dernier contenu lié à un menu et le retourne.
*
*@package Afficheur
//Auteur original :
*@author Jean-Pascal MILCENT <jpm@tela-botanica.org>
//Autres auteurs :
*@author Alexandre GRANIER <alexandrel@tela-botanica.org>
*@copyright Tela-Botanica 2000-2004
*@version $Revision: 1.14 $ $Date: 2007-06-26 15:38:39 $
// +------------------------------------------------------------------------------------------------------+
*/
 
// +------------------------------------------------------------------------------------------------------+
// | ENTÊTE du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
/** Inclusion du fichier de configuration de cette application.*/
require_once GEN_CHEMIN_PAP.'applications/afficheur/configuration/affi_configuration.inc.php';
// Inclusion de la bibliothèque PEAR Text_Wiki réalisées par Papyrus.
 
// +------------------------------------------------------------------------------------------------------+
// | CORPS du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
/** Fonction afficherContenuTete() - Fonction appelé par le gestionnaire Papyrus.
*
* Elle retourne l'entête de l'application..
*
* @return string du code XHTML correspondant à la zone d'entête de l'application.
*/
function afficherContenuTete()
{
return '';
}
 
function afficherContenuCorps() {
// si moteur de recherche est actif (paramètre "search") on ne poursuit pas la construction du corps de page
// cf: papyrus/applettes/google/google.php
if(isset($_GET['r'])) return '';
 
$retour = '';
$db = $GLOBALS['_AFFICHEUR']['objet_pear_db'];
$id_or = GEN_rechercheMenuCode($db, GEN_rechercheMenuIdentifiant($db, $GLOBALS['_AFFICHEUR']['menu_courant_id']));
 
$ligne_contenu = GEN_rechercheContenu($db, $id_or);
$contenu = $ligne_contenu->gmc_contenu;
// Inclusion de la bibliothèque Text_Wiki_Papyrus effectuées par Papyrus précédement
// Les actions Text_Wiki_Papyrus sont gérées par Papyrus
// Nous regardons si nous avons à faire à un texte sous format Wikini ou XHTML
if (($ligne_contenu->gmc_ce_type_contenu == 1)||(substr($ligne_contenu->gmc_ce_type_contenu,-1)== 1)) {
$retour = $contenu;
} elseif (($ligne_contenu->gmc_ce_type_contenu == 2) || (substr($ligne_contenu->gmc_ce_type_contenu,-1)== 2)){
include_once AFFI_CHEMIN_BIBLIOTHEQUE_API.'text/wiki_wikini/Wikini.class.php';
// Création d'un objet Text_Wikini :
$wikini =& new Text_Wikini();
// Pour éviter de remplacer les caractères spéciaux du XHTML:
$wikini->setFormatConf('Xhtml', 'translate', false);
// Configuration de la règle Freelink :
$wikini->setRenderConf('Xhtml', 'freelink', 'pages', null);
$wikini->setRenderConf('Xhtml', 'freelink', 'view_url', AFFI_URL_PAPYRUS);
// Configuration de la règle Interwiki :
$wikini->setRenderConf('Xhtml', 'interwiki', 'sites', $GLOBALS['_AFFICHEUR']['interwiki_sites']);
// Application des règles de Wikini :
$retour = $wikini->transform($contenu, 'Xhtml');
}
// +---------------------------------------------------------------------------------------------------------------+
// Nous regardons si nous voulons surligner ou pas des mots
if (isset($_GET['var_recherche'])) {
$tab_mots = explode(' ', rawurldecode($_GET['var_recherche']));
foreach ($tab_mots as $mot) {
if (strlen($mot) >= 2) {
$regexp = '/(>[^<]*)('.$mot.'\b)/Uis';
$retour = preg_replace($regexp, '$1<span class="surlignage">$2</span>', $retour);
}
}
}
//----------------------------------------------------------------------------
// Renvoie du contenu de la page
return $retour;
}
 
 
/** Fonction afficherContenuCorps() - Fonction appelé par le gestionnaire Papyrus.
*
* Elle retourne le contenu stocké dans Papyrus pour le menu courant demandé.
*
* @return string du code XHTML correspondant au contenu du menu demandé.
*/
function afficherContenuCorpsOld()
{
//----------------------------------------------------------------------------
// Initialisation des variable
$retour = '';
$id_langue = $GLOBALS['_GEN_commun']['i18n'];
if (isset($id_langue) && ($id_langue!='')) {
$langue_test=$id_langue;
} else {
$langue_test=GEN_I18N_ID_DEFAUT;
}
 
//-------------------------------------------------------------------------------------------------------------------
// Récupération des informations du contenu concerné.
$ligne_menu = GEN_lireInfoMenu($GLOBALS['_AFFICHEUR']['objet_pear_db'], $GLOBALS['_AFFICHEUR']['menu_courant_id'], DB_FETCHMODE_ASSOC);
if ($ligne_menu == false) {
die('ERREUR Papyrus Administrateur de Menus: impossible de lire les infos du menu.<br />'.
'Idenitifiant du menu n° : '. $GLOBALS['_AFFICHEUR']['objet_pear_db'] .'<br />'.
'Ligne n° : '. __LINE__ .'<br />'.
'Fichier n° : '. __FILE__ .'<br />');
}
 
// Comment ca marche ?
// Historiquement, le code menu est associé au contenu
// Depuis le passage au multilinguisme : ce comportement est conservé mais :
// Tout nouveau contenu, contient également l'information code gm_id_menu, enfoui dans le
// type contenu.
// Récupération identifiant du menu en cours
$requete = 'SELECT gm_id_menu, gm_code_num '.
'FROM gen_menu '.
'WHERE gm_code_num = '.$ligne_menu['gm_code_num'].' '.
'AND gm_ce_i18n = "'.$langue_test.'" ';
 
$resultat = $GLOBALS['_AFFICHEUR']['objet_pear_db']->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
if ( $resultat->numRows() > 0 ) {
$ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
}
else {
// Recherche defaut :
 
$requete = 'SELECT gm_id_menu, gm_code_num '.
'FROM gen_menu '.
'WHERE gm_code_num = '.$ligne_menu['gm_code_num'].' ';
'AND gm_ce_i18n = "'.GEN_I18N_ID_DEFAUT.'" ';
 
$resultat = $GLOBALS['_AFFICHEUR']['objet_pear_db']->query($requete);
 
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
$ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
if ($langue_test!=GEN_I18N_ID_DEFAUT) {
$requete_defaut = 'SELECT gmr_id_menu_02 as gm_id_menu , ' . $ligne->gm_code_num . ' as gm_code_num '.
'FROM gen_menu_relation '.
'WHERE '.$ligne->gm_id_menu. ' = gmr_id_menu_01 ' .
'AND gmr_id_valeur = 105 ';// 105 Traduction par defaut
$resultat_defaut = $GLOBALS['_AFFICHEUR']['objet_pear_db']->query($requete_defaut);
(DB::isError($resultat_defaut)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_defaut->getMessage(), $requete_defaut))
: '';
if ($resultat_defaut->numRows() > 0) {
$ligne=$resultat_defaut->fetchRow(DB_FETCHMODE_OBJECT);
}
}
}
 
// Cas historique : ce menu n'a jamais été traduit.
$requete = 'SELECT gmc_contenu , gmc_ce_type_contenu '.
'FROM gen_menu_contenu '.
'WHERE gmc_ce_menu = '.$ligne->gm_id_menu.' '.
'AND gmc_ce_type_contenu in (1,2) '.
'AND gmc_bool_dernier = 1';
$resultat = $GLOBALS['_AFFICHEUR']['objet_pear_db']->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
// Rien trouvé ? : Migration multilinguisme ou pas encore de contenu
if ( $resultat->numRows() == 0 ) {
// Migration multilinguisme
$requete = 'SELECT gmc_contenu , gmc_ce_type_contenu '.
'FROM gen_menu_contenu '.
'WHERE gmc_ce_menu = '.$ligne_menu['gm_code_num'].' '.
'AND truncate((gmc_ce_type_contenu/10),0) = '. $ligne->gm_id_menu . ' '.
'AND gmc_bool_dernier = 1';
$resultat = $GLOBALS['_AFFICHEUR']['objet_pear_db']->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
// Pas de contenu, tentative de recuperation du contenu se
if ( $resultat->numRows() == 0 ) {
$requete = 'SELECT gmr_id_menu_02 as gm_id_menu , ' . $ligne->gm_code_num . ' as gm_code_num '.
'FROM gen_menu_relation '.
'WHERE '.$ligne->gm_id_menu. ' = gmr_id_menu_01 ' .
'AND gmr_id_valeur = 105 ';// 105 Traduction par defaut
$resultat = $GLOBALS['_AFFICHEUR']['objet_pear_db']->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete))
: '';
 
$requete = 'SELECT gmc_contenu , gmc_ce_type_contenu '.
'FROM gen_menu_contenu, gen_menu_relation '.
'WHERE truncate((gmc_ce_type_contenu/10),0) = gmr_id_menu_01 '.
'AND '.$ligne->gm_id_menu.' = gmr_id_menu_02 '.
'AND gmr_id_valeur = 2 '.
'AND gmc_bool_dernier = 1';
 
$resultat = $GLOBALS['_AFFICHEUR']['objet_pear_db']->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
 
/*
$requete = 'SELECT gmr_id_menu_02 as gm_id_menu , ' . $ligne->gm_code_num . ' as gm_code_num '.
'FROM gen_menu_relation '.
'WHERE '.$ligne->gm_id_menu. ' = gmr_id_menu_01 ' .
'AND gmr_id_valeur = 105 ';// 105 Traduction par defaut
$resultat = $GLOBALS['_AFFICHEUR']['objet_pear_db']->query($requete);
print_r ($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete))
: '';
*/
}
// Toujours rien ?
if ( $resultat->numRows() == 0 ) {
$requete = 'SELECT gmc_contenu , gmc_ce_type_contenu '.
'FROM gen_menu_contenu '.
'WHERE gmc_ce_menu = '.$ligne->gm_code_num.' '.
'AND gmc_ce_type_contenu in (1,2) '.
'AND gmc_bool_dernier = 1';
$resultat = $GLOBALS['_AFFICHEUR']['objet_pear_db']->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
}
}
$ligne_contenu = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
$contenu = $ligne_contenu->gmc_contenu;
// Inclusion de la bibliothèque Text_Wiki_Papyrus effectuées par Papyrus précédement
// Les actions Text_Wiki_Papyrus sont gérées par Papyrus
// Nous regardons si nous avons à faire à un texte sous format Wikini ou XHTML
if (($ligne_contenu->gmc_ce_type_contenu == 1)||(substr($ligne_contenu->gmc_ce_type_contenu,-1)== 1)) {
$retour = $contenu;
} elseif (($ligne_contenu->gmc_ce_type_contenu == 2) || (substr($ligne_contenu->gmc_ce_type_contenu,-1)== 2)){
include_once AFFI_CHEMIN_BIBLIOTHEQUE_API.'text/wiki_wikini/Wikini.class.php';
// Création d'un objet Text_Wikini :
$wikini =& new Text_Wikini();
// Pour éviter de remplacer les caractères spéciaux du XHTML:
$wikini->setFormatConf('Xhtml', 'translate', false);
// Configuration de la règle Freelink :
$wikini->setRenderConf('Xhtml', 'freelink', 'pages', null);
$wikini->setRenderConf('Xhtml', 'freelink', 'view_url', AFFI_URL_PAPYRUS);
// Configuration de la règle Interwiki :
$wikini->setRenderConf('Xhtml', 'interwiki', 'sites', $GLOBALS['_AFFICHEUR']['interwiki_sites']);
// Application des règles de Wikini :
$retour = $wikini->transform($contenu, 'Xhtml');
}
 
// +---------------------------------------------------------------------------------------------------------------+
// Nous regardons si nous voulons surligner ou pas des mots
if (isset($_GET['var_recherche'])) {
$tab_mots = explode(' ', rawurldecode($_GET['var_recherche']));
foreach ($tab_mots as $mot) {
if (strlen($mot) >= 2) {
$regexp = '/(>[^<]*)('.$mot.'\b)/Uis';
$retour = preg_replace($regexp, '$1<span class="surlignage">$2</span>', $retour);
}
}
}
 
//----------------------------------------------------------------------------
// Renvoie du contenu de la page
return $retour;
}
// +------------------------------------------------------------------------------------------------------+
// | LISTE de FONCTIONS |
// +------------------------------------------------------------------------------------------------------+
 
 
 
// +------------------------------------------------------------------------------------------------------+
// | PIED du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
 
 
 
/* +--Fin du code ----------------------------------------------------------------------------------------+
*
* $Log: not supported by cvs2svn $
* Revision 1.13 2006-11-21 18:52:20 jp_milcent
* Ajout de la possibilité de surligner des mots.
*
* Revision 1.12 2006/11/21 15:50:05 jp_milcent
* Ajout du surlignage des mots passé dans la query string via la variable var_recherche.
*
* Revision 1.11 2006/10/16 15:49:07 ddelon
* Refactorisation code mulitlinguisme et gestion menu invisibles
*
* Revision 1.10 2006/06/29 15:12:26 ddelon
* Multilinguisme : contenu par defaut
*
* Revision 1.9 2006/03/27 10:50:24 ddelon
* Still some pb
*
* Revision 1.7 2006/03/13 21:00:20 ddelon
* Suppression messages d'erreur multilinguisme
*
* Revision 1.6 2006/03/02 10:49:49 ddelon
* Fusion branche multilinguisme dans branche principale
*
* Revision 1.5.2.3 2006/03/02 00:22:23 ddelon
* bug afficheur multilinguisme
*
* Revision 1.5.2.2 2006/03/01 23:51:07 ddelon
* bug afficheur multilinguisme
*
* Revision 1.5.2.1 2006/02/28 14:02:11 ddelon
* Finition multilinguisme
*
* Revision 1.5 2005/04/21 16:46:17 jpm
* Gestion via Papyrus du XHTML.
*
* Revision 1.4 2005/02/22 18:25:13 jpm
* Déplacement d'un message d'alerte en cas d'erreur sql.
*
* Revision 1.3 2004/12/07 12:24:30 jpm
* Changement chemin d'accés à l'api Text/Wiki...
*
* Revision 1.2 2004/11/26 13:10:05 jpm
* Utilisation des actions Papyrus et implémentation de la syntaxe Wikini.
*
* Revision 1.1 2004/06/16 14:35:26 jpm
* Changement de nom de Génésia en Papyrus.
* Changement de l'arborescence.
*
* Revision 1.12 2004/05/05 11:35:12 jpm
* Amélioration de la gestion de l'internationalisation.
*
* Revision 1.11 2004/05/05 06:45:40 jpm
* Suppression de l'appel de la fonction générant le "vous êtes ici" dans la fonction affichant l'entête de l'application.
*
* Revision 1.10 2004/05/04 16:28:22 jpm
* Réduction de code pour la fonction afficherContenuTete().
*
*
* +-- Fin du code ----------------------------------------------------------------------------------------+
*/
<?php
/*vim: set expandtab tabstop=4 shiftwidth=4: */
// +------------------------------------------------------------------------------------------------------+
// | PHP version 4.1 |
// +------------------------------------------------------------------------------------------------------+
// | Copyright (C) 2004 Tela Botanica (accueil@tela-botanica.org) |
// +------------------------------------------------------------------------------------------------------+
// | This library is free software; you can redistribute it and/or |
// | modify it under the terms of the GNU Lesser General Public |
// | License as published by the Free Software Foundation; either |
// | version 2.1 of the License, or (at your option) any later version. |
// | |
// | This library is distributed in the hope that it will be useful, |
// | but WITHOUT ANY WARRANTY; without even the implied warranty of |
// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
// | Lesser General Public License for more details. |
// | |
// | You should have received a copy of the GNU Lesser General Public |
// | License along with this library; if not, write to the Free Software |
// | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
// +------------------------------------------------------------------------------------------------------+
// CVS : $Id: afficheur.php,v 1.14 2007-06-26 15:38:39 jp_milcent Exp $
/**
* Application réalisant l'affichage du contenu stocké dans Papyrus.
*
* Récupère le dernier contenu lié à un menu et le retourne.
*
*@package Afficheur
//Auteur original :
*@author Jean-Pascal MILCENT <jpm@tela-botanica.org>
//Autres auteurs :
*@author Alexandre GRANIER <alexandrel@tela-botanica.org>
*@copyright Tela-Botanica 2000-2004
*@version $Revision: 1.14 $ $Date: 2007-06-26 15:38:39 $
// +------------------------------------------------------------------------------------------------------+
*/
 
// +------------------------------------------------------------------------------------------------------+
// | ENTÊTE du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
/** Inclusion du fichier de configuration de cette application.*/
require_once GEN_CHEMIN_PAP.'applications/afficheur/configuration/affi_configuration.inc.php';
// Inclusion de la bibliothèque PEAR Text_Wiki réalisées par Papyrus.
 
// +------------------------------------------------------------------------------------------------------+
// | CORPS du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
/** Fonction afficherContenuTete() - Fonction appelé par le gestionnaire Papyrus.
*
* Elle retourne l'entête de l'application..
*
* @return string du code XHTML correspondant à la zone d'entête de l'application.
*/
function afficherContenuTete()
{
return '';
}
 
function afficherContenuCorps() {
$retour = '';
$db = $GLOBALS['_AFFICHEUR']['objet_pear_db'];
$id_or = GEN_rechercheMenuCode($db, GEN_rechercheMenuIdentifiant($db, $GLOBALS['_AFFICHEUR']['menu_courant_id']));
 
$ligne_contenu = GEN_rechercheContenu($db, $id_or);
$contenu = $ligne_contenu->gmc_contenu;
// Inclusion de la bibliothèque Text_Wiki_Papyrus effectuées par Papyrus précédement
// Les actions Text_Wiki_Papyrus sont gérées par Papyrus
// Nous regardons si nous avons à faire à un texte sous format Wikini ou XHTML
if (($ligne_contenu->gmc_ce_type_contenu == 1)||(substr($ligne_contenu->gmc_ce_type_contenu,-1)== 1)) {
$retour = $contenu;
} elseif (($ligne_contenu->gmc_ce_type_contenu == 2) || (substr($ligne_contenu->gmc_ce_type_contenu,-1)== 2)){
include_once AFFI_CHEMIN_BIBLIOTHEQUE_API.'text/wiki_wikini/Wikini.class.php';
// Création d'un objet Text_Wikini :
$wikini =& new Text_Wikini();
// Pour éviter de remplacer les caractères spéciaux du XHTML:
$wikini->setFormatConf('Xhtml', 'translate', false);
// Configuration de la règle Freelink :
$wikini->setRenderConf('Xhtml', 'freelink', 'pages', null);
$wikini->setRenderConf('Xhtml', 'freelink', 'view_url', AFFI_URL_PAPYRUS);
// Configuration de la règle Interwiki :
$wikini->setRenderConf('Xhtml', 'interwiki', 'sites', $GLOBALS['_AFFICHEUR']['interwiki_sites']);
// Application des règles de Wikini :
$retour = $wikini->transform($contenu, 'Xhtml');
}
// +---------------------------------------------------------------------------------------------------------------+
// Nous regardons si nous voulons surligner ou pas des mots
if (isset($_GET['var_recherche'])) {
$tab_mots = explode(' ', rawurldecode($_GET['var_recherche']));
foreach ($tab_mots as $mot) {
if (strlen($mot) >= 2) {
$regexp = '/(>[^<]*)('.$mot.'\b)/Uis';
$retour = preg_replace($regexp, '$1<span class="surlignage">$2</span>', $retour);
}
}
}
//----------------------------------------------------------------------------
// Renvoie du contenu de la page
return $retour;
}
 
 
/** Fonction afficherContenuCorps() - Fonction appelé par le gestionnaire Papyrus.
*
* Elle retourne le contenu stocké dans Papyrus pour le menu courant demandé.
*
* @return string du code XHTML correspondant au contenu du menu demandé.
*/
function afficherContenuCorpsOld()
{
//----------------------------------------------------------------------------
// Initialisation des variable
$retour = '';
$id_langue = $GLOBALS['_GEN_commun']['i18n'];
if (isset($id_langue) && ($id_langue!='')) {
$langue_test=$id_langue;
} else {
$langue_test=GEN_I18N_ID_DEFAUT;
}
 
//-------------------------------------------------------------------------------------------------------------------
// Récupération des informations du contenu concerné.
$ligne_menu = GEN_lireInfoMenu($GLOBALS['_AFFICHEUR']['objet_pear_db'], $GLOBALS['_AFFICHEUR']['menu_courant_id'], DB_FETCHMODE_ASSOC);
if ($ligne_menu == false) {
die('ERREUR Papyrus Administrateur de Menus: impossible de lire les infos du menu.<br />'.
'Idenitifiant du menu n° : '. $GLOBALS['_AFFICHEUR']['objet_pear_db'] .'<br />'.
'Ligne n° : '. __LINE__ .'<br />'.
'Fichier n° : '. __FILE__ .'<br />');
}
 
// Comment ca marche ?
// Historiquement, le code menu est associé au contenu
// Depuis le passage au multilinguisme : ce comportement est conservé mais :
// Tout nouveau contenu, contient également l'information code gm_id_menu, enfoui dans le
// type contenu.
// Récupération identifiant du menu en cours
$requete = 'SELECT gm_id_menu, gm_code_num '.
'FROM gen_menu '.
'WHERE gm_code_num = '.$ligne_menu['gm_code_num'].' '.
'AND gm_ce_i18n = "'.$langue_test.'" ';
 
$resultat = $GLOBALS['_AFFICHEUR']['objet_pear_db']->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
if ( $resultat->numRows() > 0 ) {
$ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
}
else {
// Recherche defaut :
 
$requete = 'SELECT gm_id_menu, gm_code_num '.
'FROM gen_menu '.
'WHERE gm_code_num = '.$ligne_menu['gm_code_num'].' ';
'AND gm_ce_i18n = "'.GEN_I18N_ID_DEFAUT.'" ';
 
$resultat = $GLOBALS['_AFFICHEUR']['objet_pear_db']->query($requete);
 
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
$ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
if ($langue_test!=GEN_I18N_ID_DEFAUT) {
$requete_defaut = 'SELECT gmr_id_menu_02 as gm_id_menu , ' . $ligne->gm_code_num . ' as gm_code_num '.
'FROM gen_menu_relation '.
'WHERE '.$ligne->gm_id_menu. ' = gmr_id_menu_01 ' .
'AND gmr_id_valeur = 105 ';// 105 Traduction par defaut
$resultat_defaut = $GLOBALS['_AFFICHEUR']['objet_pear_db']->query($requete_defaut);
(DB::isError($resultat_defaut)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_defaut->getMessage(), $requete_defaut))
: '';
if ($resultat_defaut->numRows() > 0) {
$ligne=$resultat_defaut->fetchRow(DB_FETCHMODE_OBJECT);
}
}
}
 
// Cas historique : ce menu n'a jamais été traduit.
$requete = 'SELECT gmc_contenu , gmc_ce_type_contenu '.
'FROM gen_menu_contenu '.
'WHERE gmc_ce_menu = '.$ligne->gm_id_menu.' '.
'AND gmc_ce_type_contenu in (1,2) '.
'AND gmc_bool_dernier = 1';
$resultat = $GLOBALS['_AFFICHEUR']['objet_pear_db']->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
// Rien trouvé ? : Migration multilinguisme ou pas encore de contenu
if ( $resultat->numRows() == 0 ) {
// Migration multilinguisme
$requete = 'SELECT gmc_contenu , gmc_ce_type_contenu '.
'FROM gen_menu_contenu '.
'WHERE gmc_ce_menu = '.$ligne_menu['gm_code_num'].' '.
'AND truncate((gmc_ce_type_contenu/10),0) = '. $ligne->gm_id_menu . ' '.
'AND gmc_bool_dernier = 1';
$resultat = $GLOBALS['_AFFICHEUR']['objet_pear_db']->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
// Pas de contenu, tentative de recuperation du contenu se
if ( $resultat->numRows() == 0 ) {
$requete = 'SELECT gmr_id_menu_02 as gm_id_menu , ' . $ligne->gm_code_num . ' as gm_code_num '.
'FROM gen_menu_relation '.
'WHERE '.$ligne->gm_id_menu. ' = gmr_id_menu_01 ' .
'AND gmr_id_valeur = 105 ';// 105 Traduction par defaut
$resultat = $GLOBALS['_AFFICHEUR']['objet_pear_db']->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete))
: '';
 
$requete = 'SELECT gmc_contenu , gmc_ce_type_contenu '.
'FROM gen_menu_contenu, gen_menu_relation '.
'WHERE truncate((gmc_ce_type_contenu/10),0) = gmr_id_menu_01 '.
'AND '.$ligne->gm_id_menu.' = gmr_id_menu_02 '.
'AND gmr_id_valeur = 2 '.
'AND gmc_bool_dernier = 1';
 
$resultat = $GLOBALS['_AFFICHEUR']['objet_pear_db']->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
 
/*
$requete = 'SELECT gmr_id_menu_02 as gm_id_menu , ' . $ligne->gm_code_num . ' as gm_code_num '.
'FROM gen_menu_relation '.
'WHERE '.$ligne->gm_id_menu. ' = gmr_id_menu_01 ' .
'AND gmr_id_valeur = 105 ';// 105 Traduction par defaut
$resultat = $GLOBALS['_AFFICHEUR']['objet_pear_db']->query($requete);
print_r ($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete))
: '';
*/
}
// Toujours rien ?
if ( $resultat->numRows() == 0 ) {
$requete = 'SELECT gmc_contenu , gmc_ce_type_contenu '.
'FROM gen_menu_contenu '.
'WHERE gmc_ce_menu = '.$ligne->gm_code_num.' '.
'AND gmc_ce_type_contenu in (1,2) '.
'AND gmc_bool_dernier = 1';
$resultat = $GLOBALS['_AFFICHEUR']['objet_pear_db']->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
}
}
$ligne_contenu = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
$contenu = $ligne_contenu->gmc_contenu;
// Inclusion de la bibliothèque Text_Wiki_Papyrus effectuées par Papyrus précédement
// Les actions Text_Wiki_Papyrus sont gérées par Papyrus
// Nous regardons si nous avons à faire à un texte sous format Wikini ou XHTML
if (($ligne_contenu->gmc_ce_type_contenu == 1)||(substr($ligne_contenu->gmc_ce_type_contenu,-1)== 1)) {
$retour = $contenu;
} elseif (($ligne_contenu->gmc_ce_type_contenu == 2) || (substr($ligne_contenu->gmc_ce_type_contenu,-1)== 2)){
include_once AFFI_CHEMIN_BIBLIOTHEQUE_API.'text/wiki_wikini/Wikini.class.php';
// Création d'un objet Text_Wikini :
$wikini =& new Text_Wikini();
// Pour éviter de remplacer les caractères spéciaux du XHTML:
$wikini->setFormatConf('Xhtml', 'translate', false);
// Configuration de la règle Freelink :
$wikini->setRenderConf('Xhtml', 'freelink', 'pages', null);
$wikini->setRenderConf('Xhtml', 'freelink', 'view_url', AFFI_URL_PAPYRUS);
// Configuration de la règle Interwiki :
$wikini->setRenderConf('Xhtml', 'interwiki', 'sites', $GLOBALS['_AFFICHEUR']['interwiki_sites']);
// Application des règles de Wikini :
$retour = $wikini->transform($contenu, 'Xhtml');
}
 
// +---------------------------------------------------------------------------------------------------------------+
// Nous regardons si nous voulons surligner ou pas des mots
if (isset($_GET['var_recherche'])) {
$tab_mots = explode(' ', rawurldecode($_GET['var_recherche']));
foreach ($tab_mots as $mot) {
if (strlen($mot) >= 2) {
$regexp = '/(>[^<]*)('.$mot.'\b)/Uis';
$retour = preg_replace($regexp, '$1<span class="surlignage">$2</span>', $retour);
}
}
}
 
//----------------------------------------------------------------------------
// Renvoie du contenu de la page
return $retour;
}
// +------------------------------------------------------------------------------------------------------+
// | LISTE de FONCTIONS |
// +------------------------------------------------------------------------------------------------------+
 
 
 
// +------------------------------------------------------------------------------------------------------+
// | PIED du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
 
 
 
/* +--Fin du code ----------------------------------------------------------------------------------------+
*
* $Log: afficheur.php,v $
* Revision 1.14 2007-06-26 15:38:39 jp_milcent
* Ajout de la gestion de l'historique du contenu.
* Réédition possible des versions archivées du contenu.
*
* Revision 1.13 2006-11-21 18:52:20 jp_milcent
* Ajout de la possibilité de surligner des mots.
*
* Revision 1.12 2006/11/21 15:50:05 jp_milcent
* Ajout du surlignage des mots passé dans la query string via la variable var_recherche.
*
* Revision 1.11 2006/10/16 15:49:07 ddelon
* Refactorisation code mulitlinguisme et gestion menu invisibles
*
* Revision 1.10 2006/06/29 15:12:26 ddelon
* Multilinguisme : contenu par defaut
*
* Revision 1.9 2006/03/27 10:50:24 ddelon
* Still some pb
*
* Revision 1.7 2006/03/13 21:00:20 ddelon
* Suppression messages d'erreur multilinguisme
*
* Revision 1.6 2006/03/02 10:49:49 ddelon
* Fusion branche multilinguisme dans branche principale
*
* Revision 1.5.2.3 2006/03/02 00:22:23 ddelon
* bug afficheur multilinguisme
*
* Revision 1.5.2.2 2006/03/01 23:51:07 ddelon
* bug afficheur multilinguisme
*
* Revision 1.5.2.1 2006/02/28 14:02:11 ddelon
* Finition multilinguisme
*
* Revision 1.5 2005/04/21 16:46:17 jpm
* Gestion via Papyrus du XHTML.
*
* Revision 1.4 2005/02/22 18:25:13 jpm
* Déplacement d'un message d'alerte en cas d'erreur sql.
*
* Revision 1.3 2004/12/07 12:24:30 jpm
* Changement chemin d'accés à l'api Text/Wiki...
*
* Revision 1.2 2004/11/26 13:10:05 jpm
* Utilisation des actions Papyrus et implémentation de la syntaxe Wikini.
*
* Revision 1.1 2004/06/16 14:35:26 jpm
* Changement de nom de Génésia en Papyrus.
* Changement de l'arborescence.
*
* Revision 1.12 2004/05/05 11:35:12 jpm
* Amélioration de la gestion de l'internationalisation.
*
* Revision 1.11 2004/05/05 06:45:40 jpm
* Suppression de l'appel de la fonction générant le "vous êtes ici" dans la fonction affichant l'entête de l'application.
*
* Revision 1.10 2004/05/04 16:28:22 jpm
* Réduction de code pour la fonction afficherContenuTete().
*
*
* +-- Fin du code ----------------------------------------------------------------------------------------+
*/
?>
/trunk/papyrus/applications/afficheur/configuration/affi_fckconfig.js
62,9 → 62,9
FCKConfig.DefaultLanguage = 'fr' ;
FCKConfig.ContentLangDirection = 'ltr' ;
 
FCKConfig.ProcessHTMLEntities = true ;
FCKConfig.IncludeLatinEntities = true ;
FCKConfig.IncludeGreekEntities = true ;
FCKConfig.ProcessHTMLEntities = false ;
FCKConfig.IncludeLatinEntities = false ;
FCKConfig.IncludeGreekEntities = false ;
 
FCKConfig.ProcessNumericEntities = false ;
 
/trunk/papyrus/applications/afficheur/configuration/affi_configuration.inc.php
106,7 → 106,11
 
/* +--Fin du code ----------------------------------------------------------------------------------------+
*
* $Log: not supported by cvs2svn $
* $Log: affi_configuration.inc.php,v $
* Revision 1.14 2007-06-26 13:30:48 jp_milcent
* Suppression de l'utilisation de Quickform.
* Utilisation de squellette PHP.
*
* Revision 1.13 2006-04-28 12:41:49 florian
* corrections erreurs chemin
*
/trunk/papyrus/applications/admin_administrateur/autoload.inc.php
1,33 → 1,28
<?php
/**
* Fichier autoload contenant la fonction de chargement automatique des classes
* et l'appel au fichier de configuration de base.
* Ce fichier doit être inclut en premier dans toute application
*/
 
if(!defined('CHEMIN_APPLI')) {
define('CHEMIN_APPLI',dirname(__FILE__).DIRECTORY_SEPARATOR) ;
}
 
require_once('configuration/config.inc.php');
require_once('configuration/config_chemin.inc.php');
/**
* La fonction __autoload() charge dynamiquement les classes trouvées dans le code.
*
* Cette fonction est appelée par php5 quand il trouve une instanciation de classe dans le code.
*
*@param string le nom de la classe appelée.
*@return void le fichier contenant la classe doit être inclu par la fonction.
*/
function __autoload($classe)
{
$dossiers_classes = array(CHEMIN_BIBLIO.DIRECTORY_SEPARATOR,DOSSIER_CONTROLEURS.DIRECTORY_SEPARATOR,DOSSIER_MODELES.DIRECTORY_SEPARATOR) ;
foreach ($dossiers_classes as $chemin) {
if (file_exists($fichier_a_tester = $chemin.$classe.'.php')) {
require_once $fichier_a_tester;
return null;
}
}
}
<?php
 
if(!defined('CHEMIN_APPLI')) {
define('CHEMIN_APPLI',dirname(__FILE__).DIRECTORY_SEPARATOR) ;
}
 
require_once('configuration/config.inc.php');
require_once('configuration/config_chemin.inc.php');
/**
* La fonction __autoload() charge dynamiquement les classes trouvées dans le code.
*
* Cette fonction est appelée par php5 quand il trouve une instanciation de classe dans le code.
*
*@param string le nom de la classe appelée.
*@return void le fichier contenant la classe doit être inclu par la fonction.
*/
function __autoload($classe)
{
$dossiers_classes = array(CHEMIN_BIBLIO.DIRECTORY_SEPARATOR,DOSSIER_CONTROLEURS.DIRECTORY_SEPARATOR,DOSSIER_MODELES.DIRECTORY_SEPARATOR) ;
foreach ($dossiers_classes as $chemin) {
if (file_exists($fichier_a_tester = $chemin.$classe.'.php')) {
require_once $fichier_a_tester;
return null;
}
}
}
?>
/trunk/papyrus/applications/admin_administrateur/configuration/config_chemin.inc.php
1,10 → 1,10
<?php
// Définition des chemins de fichiers.
 
define('CHEMIN_BIBLIO',CHEMIN_APPLI.'bibliotheque');
/** Constante stockant le chemin vers le dossier modèles.*/
define('DOSSIER_CONTROLEURS', CHEMIN_APPLI.'controleurs');
define('DOSSIER_MODELES', CHEMIN_APPLI.'modeles');
define('DOSSIER_SQUELETTES', CHEMIN_APPLI.'squelettes');
 
<?php
// Définition des chemins de fichiers.
 
define('CHEMIN_BIBLIO',CHEMIN_APPLI.'bibliotheque');
/** Constante stockant le chemin vers le dossier modèles.*/
define('DOSSIER_CONTROLEURS', CHEMIN_APPLI.'controleurs');
define('DOSSIER_MODELES', CHEMIN_APPLI.'modeles');
define('DOSSIER_SQUELETTES', CHEMIN_APPLI.'squelettes');
 
?>
/trunk/papyrus/applications/admin_administrateur/modeles/ListeAdmin.php
1,250 → 1,250
<?php
 
/**
* Modèle d'accès à la base de données des administrateurs
* de papyrus
*/
class listeAdmin extends Modele {
var $config = array() ;
/**
* Charge la liste complète des administrateurs
* return array un tableau contenant des objets d'informations sur les administrateurs
* @return array un tableau d'objets contenant la liste des administrateurs
*/
function chargerAdmin() {
$query = 'SELECT * FROM gen_annuaire ORDER BY ga_id_administrateur' ;
$res = $this->requete($query) ;
$admin = array() ;
foreach ($res->fetchAll() as $ligne)
{
if($ligne['ga_id_administrateur'] != 0) {
$admin[] = $ligne ;
}
}
return $admin ;
}
/**
* Charge les informations liées à un administrateur
* grâce à son id
* @param int l'identifiant de l'administrateur.
* @return object un object contenant les informations de l'administrateur demandé
*/
function loadDetailsAdmin($id) {
$query = 'SELECT * FROM gen_annuaire where ga_id_administrateur="'.$id.'"' ;
$res = $this->requete($query) ;
$admin = array() ;
foreach ($res->fetchAll() as $ligne) {
$admin = $ligne ;
}
return $admin ;
}
/**
* Modifie les informations liées à un administrateur dans la base de données
* Si le mot de passe n'est pas renseigné, il n'est pas changé
* @param int identifiant de l'admiistrateur
* @param string nom
* @param string prenom
* @param string le mail
* @param string le code de langue
* @param string le mot de passe (optionnel)
* @param string la confirmation du mot de passe (optionnel)
* @return array un tableau contenant les erreurs s'il y en a, vide sinon
*/
function modifDetailsAdmin($id,$nom,$prenom,$mail,$lang,$pass='',$pass_conf='') {
$res = array() ;
$nb_admin = 0 ;
if(!$this->validerMail($mail)) {
$res['mail'] = 'Adresse mail invalide' ;
}
$query_verif_mail = 'SELECT COUNT(*) AS nb_admin FROM gen_annuaire WHERE ga_mail = '.$this->proteger($mail).' AND ga_id_administrateur !='.$id ;
if($res_nb = $this->requete($query_verif_mail)) {
$ligne = $res_nb->fetch();
$nb_admin = $ligne['nb_admin'] ;
} else {
$res['bdd'] = 'Erreur dans la base de données' ;
return $res ;
}
if($nb_admin != 0) {
$res['mail'] = 'Cet email est déjà utilisé par un autre utilisateur' ;
}
$query = 'UPDATE gen_annuaire SET ga_ce_i18n='.$this->proteger($lang).', ga_nom='.$this->proteger($nom).',ga_prenom='.
$this->proteger($prenom).',ga_mail='.$this->proteger($mail) ;
// si on a entré quelque chose dans les deux champs de mot de passe
if($pass != '' || $pass_conf != '') {
// on vérifie si les deux concordent
if($pass == $pass_conf) {
// si oui, on les modifie
$query .= ',ga_mot_de_passe='.$this->proteger(md5($pass)) ;
} else {
// si non, on notifiera l'utilisateur
$res['pass'] = 'mot de passe invalide' ;
}
}
 
$query .= ' WHERE ga_id_administrateur='.$id ;
if(count($res) != 0) {
return $res ;
}
if($req_maj = $this->requete($query)) {
} else {
$res['bdd'] = 'Erreur de la requête dans la base de données' ;
}
return $res ;
}
/**
* Supprime un administrateur ayant un id donnée
* @param int l'identifiant de l'administrateur
* @return array un tableau contenant les erreurs s'il y en a, vide sinon
*/
function suppAdmin($id) {
$nb_admin = 0 ;
$res = '' ;
$query_verif = 'SELECT COUNT(*) AS nb_admin FROM gen_annuaire' ;
if($res_nb = $this->requete($query_verif)) {
$ligne = $res_nb->fetch();
$nb_admin = $ligne['nb_admin'] ;
} else {
$res = 'Erreur dans la base de données' ;
return $res ;
}
if($nb_admin == 2) {
$res = 'Impossible de supprimer le dernier administrateur' ;
return $res ;
}
$query = 'DELETE FROM gen_annuaire WHERE ga_id_administrateur='.$id ;
if($res_supp = $this->requete($query)) {
return $res ;
} else {
$res = 'Erreur dans la base de données' ;
return $res ;
}
}
/**
* Ajoute un administrateur dans la base de données
* @param string nom
* @param string prenom
* @param string le mail
* @param string le code de langue
* @param string le mot de passe
* @param string la confirmation du mot de passe
* @return array un tableau contenant les erreurs s'il y en a, vide sinon
*/
function ajoutAdmin($nom,$prenom,$mail,$lang,$pass,$pass_conf) {
$nouvel_id = 0 ;
$nb_admin = 0 ;
$res = array() ;
if(!$this->validerMail($mail)) {
$res['mail'] = 'adresse mail invalide' ;
}
$query_verif_mail = 'SELECT COUNT(*) AS nb_admin FROM gen_annuaire WHERE ga_mail = '.$this->proteger($mail) ;
if($res_nb = $this->requete($query_verif_mail)) {
$ligne = $res_nb->fetch() ;
$nb_admin = $ligne['nb_admin'] ;
} else {
$res['bdd'] = 'Erreur dans la base de données' ;
return $res ;
}
if($nb_admin != 0) {
$res['mail'] = 'Cet email est déjà utilisé par un autre utilisateur' ;
}
if($pass != '' || $pass_conf != '') {
// on vérifie si les deux concordent
if($pass == $pass_conf) {
} else {
// si non, on notifiera l'utilisateur
$res['pass'] = 'mot de passe invalide' ;
}
}
$query = 'SELECT MAX(ga_id_administrateur) as nouvel_id FROM gen_annuaire' ;
if($res_requete_id = $this->requete($query)) {
$ligne = $res_requete_id->fetch() ;
$nouvel_id = $ligne['nouvel_id'] + 1 ;
} else {
return $res ;
}
$query = 'INSERT INTO gen_annuaire VALUES ('.$nouvel_id.','.$this->proteger($lang).','.
$this->proteger($nom).','.$this->proteger($prenom).','.$this->proteger(md5($pass)).','.
$this->proteger($mail).')' ;
if(count($res) != 0) {
return $res ;
}
if($res_ajout = $this->requete($query)) {
} else {
$res['bdd'] = 'Erreur de la requête dans la base de données' ;
}
return $res ;
}
/**
* Fonction qui prend une chaine en paramètre et renvoie vrai
* si elle constitue un email syntaxiquement valide, faux sinon.
* @param string le mail à valider
* @return bool true si le mail est valide, false sinon
*/
function validerMail($mail) {
$atom = '[-a-z0-9!#$%&\'*+\\/=?^_`{|}~]'; // caractères autorisés avant l'arobase
$domain = '([a-z0-9]([-a-z0-9]*[a-z0-9]+)?)'; // caractères autorisés après l'arobase (nom de domaine)
$regex = '/^' . $atom . '+' . // Une ou plusieurs fois les caractères autorisés avant l'arobase
'(\.' . $atom . '+)*' . // Suivis par zéro point ou plus
// séparés par des caractères autorisés avant l'arobase
'@' . // Suivis d'un arobase
'(' . $domain . '{1,63}\.)+' . // Suivis par 1 à 63 caractères autorisés pour le nom de domaine
// séparés par des points
$domain . '{2,63}$/i'; // Suivi de 2 à 63 caractères autorisés pour le nom de domaine
// test de l'adresse e-mail
if (preg_match($regex, $mail)) {
return true ;
} else {
return false ;
}
}
 
}
<?php
 
/**
* Modèle d'accès à la base de données des administrateurs
* de papyrus
*/
class listeAdmin extends Modele {
var $config = array() ;
/**
* Charge la liste complète des administrateurs
* return array un tableau contenant des objets d'informations sur les administrateurs
* @return array un tableau d'objets contenant la liste des administrateurs
*/
function chargerAdmin() {
$query = 'SELECT * FROM gen_annuaire ORDER BY ga_id_administrateur' ;
$res = $this->requete($query) ;
$admin = array() ;
foreach ($res->fetchAll() as $ligne)
{
if($ligne['ga_id_administrateur'] != 0) {
$admin[] = $ligne ;
}
}
return $admin ;
}
/**
* Charge les informations liées à un administrateur
* grâce à son id
* @param int l'identifiant de l'administrateur.
* @return object un object contenant les informations de l'administrateur demandé
*/
function loadDetailsAdmin($id) {
$query = 'SELECT * FROM gen_annuaire where ga_id_administrateur="'.$id.'"' ;
$res = $this->requete($query) ;
$admin = array() ;
foreach ($res->fetchAll() as $ligne) {
$admin = $ligne ;
}
return $admin ;
}
/**
* Modifie les informations liées à un administrateur dans la base de données
* Si le mot de passe n'est pas renseigné, il n'est pas changé
* @param int identifiant de l'admiistrateur
* @param string nom
* @param string prenom
* @param string le mail
* @param string le code de langue
* @param string le mot de passe (optionnel)
* @param string la confirmation du mot de passe (optionnel)
* @return array un tableau contenant les erreurs s'il y en a, vide sinon
*/
function modifDetailsAdmin($id,$nom,$prenom,$mail,$lang,$pass='',$pass_conf='') {
$res = array() ;
$nb_admin = 0 ;
if(!$this->validerMail($mail)) {
$res['mail'] = 'Adresse mail invalide' ;
}
$query_verif_mail = 'SELECT COUNT(*) AS nb_admin FROM gen_annuaire WHERE ga_mail = '.$this->proteger($mail).' AND ga_id_administrateur !='.$id ;
if($res_nb = $this->requete($query_verif_mail)) {
$ligne = $res_nb->fetch();
$nb_admin = $ligne['nb_admin'] ;
} else {
$res['bdd'] = 'Erreur dans la base de données' ;
return $res ;
}
if($nb_admin != 0) {
$res['mail'] = 'Cet email est déjà utilisé par un autre utilisateur' ;
}
$query = 'UPDATE gen_annuaire SET ga_ce_i18n='.$this->proteger($lang).', ga_nom='.$this->proteger($nom).',ga_prenom='.
$this->proteger($prenom).',ga_mail='.$this->proteger($mail) ;
// si on a entré quelque chose dans les deux champs de mot de passe
if($pass != '' || $pass_conf != '') {
// on vérifie si les deux concordent
if($pass == $pass_conf) {
// si oui, on les modifie
$query .= ',ga_mot_de_passe='.$this->proteger(md5($pass)) ;
} else {
// si non, on notifiera l'utilisateur
$res['pass'] = 'mot de passe invalide' ;
}
}
 
$query .= ' WHERE ga_id_administrateur='.$id ;
if(count($res) != 0) {
return $res ;
}
if($req_maj = $this->requete($query)) {
} else {
$res['bdd'] = 'Erreur de la requête dans la base de données' ;
}
return $res ;
}
/**
* Supprime un administrateur ayant un id donnée
* @param int l'identifiant de l'administrateur
* @return array un tableau contenant les erreurs s'il y en a, vide sinon
*/
function suppAdmin($id) {
$nb_admin = 0 ;
$res = '' ;
$query_verif = 'SELECT COUNT(*) AS nb_admin FROM gen_annuaire' ;
if($res_nb = $this->requete($query_verif)) {
$ligne = $res_nb->fetch();
$nb_admin = $ligne['nb_admin'] ;
} else {
$res = 'Erreur dans la base de données' ;
return $res ;
}
if($nb_admin == 2) {
$res = 'Impossible de supprimer le dernier administrateur' ;
return $res ;
}
$query = 'DELETE FROM gen_annuaire WHERE ga_id_administrateur='.$id ;
if($res_supp = $this->requete($query)) {
return $res ;
} else {
$res = 'Erreur dans la base de données' ;
return $res ;
}
}
/**
* Ajoute un administrateur dans la base de données
* @param string nom
* @param string prenom
* @param string le mail
* @param string le code de langue
* @param string le mot de passe
* @param string la confirmation du mot de passe
* @return array un tableau contenant les erreurs s'il y en a, vide sinon
*/
function ajoutAdmin($nom,$prenom,$mail,$lang,$pass,$pass_conf) {
$nouvel_id = 0 ;
$nb_admin = 0 ;
$res = array() ;
if(!$this->validerMail($mail)) {
$res['mail'] = 'adresse mail invalide' ;
}
$query_verif_mail = 'SELECT COUNT(*) AS nb_admin FROM gen_annuaire WHERE ga_mail = '.$this->proteger($mail) ;
if($res_nb = $this->requete($query_verif_mail)) {
$ligne = $res_nb->fetch() ;
$nb_admin = $ligne['nb_admin'] ;
} else {
$res['bdd'] = 'Erreur dans la base de données' ;
return $res ;
}
if($nb_admin != 0) {
$res['mail'] = 'Cet email est déjà utilisé par un autre utilisateur' ;
}
if($pass != '' || $pass_conf != '') {
// on vérifie si les deux concordent
if($pass == $pass_conf) {
} else {
// si non, on notifiera l'utilisateur
$res['pass'] = 'mot de passe invalide' ;
}
}
$query = 'SELECT MAX(ga_id_administrateur) as nouvel_id FROM gen_annuaire' ;
if($res_requete_id = $this->requete($query)) {
$ligne = $res_requete_id->fetch() ;
$nouvel_id = $ligne['nouvel_id'] + 1 ;
} else {
return $res ;
}
$query = 'INSERT INTO gen_annuaire VALUES ('.$nouvel_id.','.$this->proteger($lang).','.
$this->proteger($nom).','.$this->proteger($prenom).','.$this->proteger(md5($pass)).','.
$this->proteger($mail).')' ;
if(count($res) != 0) {
return $res ;
}
if($res_ajout = $this->requete($query)) {
} else {
$res['bdd'] = 'Erreur de la requête dans la base de données' ;
}
return $res ;
}
/**
* Fonction qui prend une chaine en paramètre et renvoie vrai
* si elle constitue un email syntaxiquement valide, faux sinon.
* @param string le mail à valider
* @return bool true si le mail est valide, false sinon
*/
function validerMail($mail) {
$atom = '[-a-z0-9!#$%&\'*+\\/=?^_`{|}~]'; // caractères autorisés avant l'arobase
$domain = '([a-z0-9]([-a-z0-9]*[a-z0-9]+)?)'; // caractères autorisés après l'arobase (nom de domaine)
$regex = '/^' . $atom . '+' . // Une ou plusieurs fois les caractères autorisés avant l'arobase
'(\.' . $atom . '+)*' . // Suivis par zéro point ou plus
// séparés par des caractères autorisés avant l'arobase
'@' . // Suivis d'un arobase
'(' . $domain . '{1,63}\.)+' . // Suivis par 1 à 63 caractères autorisés pour le nom de domaine
// séparés par des points
$domain . '{2,63}$/i'; // Suivi de 2 à 63 caractères autorisés pour le nom de domaine
// test de l'adresse e-mail
if (preg_match($regex, $mail)) {
return true ;
} else {
return false ;
}
}
 
}
?>
/trunk/papyrus/applications/admin_administrateur/admin_administrateur.php
1,94 → 1,94
<?php
// On inclut l'autoload avant toute chose
require_once('autoload.inc.php');
 
/**
* Fonction d'affichage de Papyrus, pour le corps de page
*/
function afficherContenuCorps() {
// si l'utilisateur est authentifié
if(VAR_IDENT) {
// on renvoie la vue principale de l'application
$methode = '' ;
if(isset($_GET['m'])) {
$methode = $_GET['m'] ;
}
$controlleur = new AdminAdministrateur();
switch($methode) {
case 'ajout_admin':
return $controlleur->ajoutAdmin();
break;
case 'ajout_admin_va':
$nom = $_POST['admin_nom'] ;
$prenom = $_POST['admin_prenom'] ;
$mail = $_POST['admin_mail'] ;
$lang = $_POST['admin_lang'] ;
$pass = $_POST['admin_pass'] ;
$pass_conf = $_POST['admin_pass_confirm'] ;
return $controlleur->ajoutAdminVa($nom,$prenom,$mail,$lang,$pass,$pass_conf);
break;
case 'modif_admin':
$id = $_GET['id_admin'];
return $controlleur->modifAdmin($id);
break;
case 'modif_admin_va':
$id = $_GET['id_admin'];
$nom = $_POST['admin_nom'];
$prenom = $_POST['admin_prenom'];
$mail = $_POST['admin_mail'];
$lang = $_POST['admin_lang'];
$pass = $_POST['admin_pass'];
$pass_conf = $_POST['admin_pass_confirm'];
return $controlleur->modifAdminVa($id,$nom,$prenom,$mail,$lang,$pass,$pass_conf);
break;
case 'suppr_admin':
$id = $_GET['id_admin'];
return $controlleur->supprAdmin($id);
break;
default:
return $controlleur->chargerAdmin();
break;
}
} else {
// sinon on lui demande de s'identifier
$controlleur = new AdminAdministrateur() ;
return $controlleur->demanderIdent() ;
}
}
 
function afficherContenuTete() {
$controlleur = new AdminAdministrateur();
return $controlleur->adminTete();
}
 
function afficherContenuPied() {
$controlleur = new AdminAdministrateur();
return $controlleur->adminPied();
}
 
 
if(!defined('PAP_VERSION')) {
echo afficherContenuTete();
echo afficherContenuCorps();
echo afficherContenuPied();
}
/*
* afficherContenuTete()
* afficherContenuNavigation()
* afficherContenuMenu()
* afficherContenuPied()
*
*/
 
<?php
require_once('autoload.inc.php');
 
/**
* Fonction d'affichage de Papyrus, pour le corps de page
*/
function afficherContenuCorps() {
// si l'utilisateur est authentifié
if(VAR_IDENT) {
// on renvoie la vue principale de l'application
$methode = '' ;
if(isset($_GET['m'])) {
$methode = $_GET['m'] ;
}
$controlleur = new AdminAdministrateur();
switch($methode) {
case 'ajout_admin':
return $controlleur->ajoutAdmin();
break;
case 'ajout_admin_va':
$nom = $_POST['admin_nom'] ;
$prenom = $_POST['admin_prenom'] ;
$mail = $_POST['admin_mail'] ;
$lang = $_POST['admin_lang'] ;
$pass = $_POST['admin_pass'] ;
$pass_conf = $_POST['admin_pass_confirm'] ;
return $controlleur->ajoutAdminVa($nom,$prenom,$mail,$lang,$pass,$pass_conf);
break;
case 'modif_admin':
$id = $_GET['id_admin'];
return $controlleur->modifAdmin($id);
break;
case 'modif_admin_va':
$id = $_GET['id_admin'];
$nom = $_POST['admin_nom'];
$prenom = $_POST['admin_prenom'];
$mail = $_POST['admin_mail'];
$lang = $_POST['admin_lang'];
$pass = $_POST['admin_pass'];
$pass_conf = $_POST['admin_pass_confirm'];
return $controlleur->modifAdminVa($id,$nom,$prenom,$mail,$lang,$pass,$pass_conf);
break;
case 'suppr_admin':
$id = $_GET['id_admin'];
return $controlleur->supprAdmin($id);
break;
default:
return $controlleur->chargerAdmin();
break;
}
} else {
// sinon on lui demande de s'identifier
$controlleur = new AdminAdministrateur() ;
return $controlleur->demanderIdent() ;
}
}
 
function afficherContenuTete() {
$controlleur = new AdminAdministrateur();
return $controlleur->adminTete();
}
 
function afficherContenuPied() {
$controlleur = new AdminAdministrateur();
return $controlleur->adminPied();
}
 
 
if(!defined('PAP_VERSION')) {
echo afficherContenuTete();
echo afficherContenuCorps();
echo afficherContenuPied();
}
/*
* afficherContenuTete()
* afficherContenuNavigation()
* afficherContenuMenu()
* afficherContenuPied()
*
*/
 
?>
/trunk/papyrus/applications/admin_administrateur/bibliotheque/Registre.php
1,56 → 1,56
<?php
 
class Registre {
 
private $aso_stock = array();
private static $registre;
 
public function __construct()
{
}
 
public static function getInstance()
{
if (self::$registre instanceof Registre) {
return self::$registre;
}
self::$registre = new Registre;
return self::$registre;
}
function set($intitule, $objet)
{
if (is_array($objet) && isset($this->aso_stock[$intitule])) {
$this->aso_stock[$intitule] = array_merge((array)$this->aso_stock[$intitule], (array)$objet);
$message = "Le tableau $intitule présent dans le registre a été fusionné avec un nouveau tableau de même intitulé !";
trigger_error($message, E_USER_WARNING);
} else {
$this->aso_stock[$intitule] = $objet;
}
}
 
function get($intitule)
{
if (isset($this->aso_stock[$intitule])) {
return $this->aso_stock[$intitule];
}
return null;
}
function detruire($intitule)
{
if (isset($this->aso_stock[$intitule])) {
unset($this->aso_stock[$intitule]);
}
}
public function etrePresent($intitule)
{
if(isset($this->aso_stock[$intitule])){
return true;
}
return false;
}
}
<?php
 
class Registre {
 
private $aso_stock = array();
private static $registre;
 
public function __construct()
{
}
 
public static function getInstance()
{
if (self::$registre instanceof Registre) {
return self::$registre;
}
self::$registre = new Registre;
return self::$registre;
}
function set($intitule, $objet)
{
if (is_array($objet) && isset($this->aso_stock[$intitule])) {
$this->aso_stock[$intitule] = array_merge((array)$this->aso_stock[$intitule], (array)$objet);
$message = "Le tableau $intitule présent dans le registre a été fusionné avec un nouveau tableau de même intitulé !";
trigger_error($message, E_USER_WARNING);
} else {
$this->aso_stock[$intitule] = $objet;
}
}
 
function get($intitule)
{
if (isset($this->aso_stock[$intitule])) {
return $this->aso_stock[$intitule];
}
return null;
}
function detruire($intitule)
{
if (isset($this->aso_stock[$intitule])) {
unset($this->aso_stock[$intitule]);
}
}
public function etrePresent($intitule)
{
if(isset($this->aso_stock[$intitule])){
return true;
}
return false;
}
}
?>
/trunk/papyrus/applications/admin_administrateur/bibliotheque/Chronometre.php
1,185 → 1,185
<?php
/*vim: set expandtab tabstop=4 shiftwidth=4: */
// +------------------------------------------------------------------------------------------------------+
// | PHP version 5.0.4 |
// +------------------------------------------------------------------------------------------------------+
// | Copyright (C) 2005 Tela Botanica (accueil@tela-botanica.org) |
// +------------------------------------------------------------------------------------------------------+
// | This file is part of eFlore-Debogage. |
// | |
// | Foobar 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. |
// | |
// | Foobar 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 Foobar; if not, write to the Free Software |
// | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
// +------------------------------------------------------------------------------------------------------+
// CVS : $Id: Chronometre.class.php,v 1.1 2007-01-12 13:16:09 jp_milcent Exp $
/**
* Classe permettant de mesurer le temps d'execution d'un script.
*
* Contient des méthodes permettant d'évaluer la vitesse d'exécution d'un script.
*
*@package eFlore
*@subpackage Debogage
//Auteur original :
*@author Jean-Pascal MILCENT <jpm@tela-botanica.org>
//Autres auteurs :
*@author aucun
*@copyright Tela-Botanica 2000-2005
*@version $Revision: 1.1 $ $Date: 2007-01-12 13:16:09 $
// +------------------------------------------------------------------------------------------------------+
*/
 
// +------------------------------------------------------------------------------------------------------+
// | ENTETE du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
 
 
// +------------------------------------------------------------------------------------------------------+
// | CORPS du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
/**Classe Chronometre() - Permet de stocker et d'afficher les temps d'éxécution de script.
*
* Cette classe permet de réaliser un ensemble de mesure de temps prises à
* différents endroits d'un script. Ces mesures peuvent ensuite être affichées au
* sein d'un tableau XHTML.
*
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
*/
class Chronometre
{
/*** Attributs : ***/
private $temps = array();
/*** Constructeur : ***/
public function __construct() {
$this->setTemps(array('depart' => microtime()));
}
/*** Accesseurs : ***/
public function getTemps($cle = NULL) {
if (!is_null($cle)) {
return $this->temps[$cle];
} else {
return $this->temps;
}
}
public function setTemps($moment = array()) {
array_push($this->temps, $moment);
}
/*** Méthodes : ***/
/**Méthode afficherChrono() - Permet d'afficher les temps d'éxécution de différentes parties d'un script.
*
* Cette fonction permet d'afficher un ensemble de mesure de temps prises à différents endroits d'un script.
* Ces mesures sont affichées au sein d'un tableau XHTML dont on peut controler l'indentation des balises.
* Pour un site en production, il suffit d'ajouter un style #chrono {display:none;} dans la css. De cette façon,
* le tableau ne s'affichera pas. Le webmaster lui pourra rajouter sa propre feuille de style affichant le tableau.
* Le développeur initial de cette fonction est Loic d'Anterroches. Elle a été modifiée par Jean-Pascal Milcent.
* Elle utilise une variable gobale : $_CHRONO_
*
* @author Loic d'Anterroches
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @param int l'indentation de base pour le code html du tableau.
* @param int le pas d'indentation pour le code html du tableau.
* @return string la chaine XHTML de mesure des temps.
*/
function afficherChrono($indentation_origine = 8, $indentation = 4) {
// Création du chrono de fin
$GLOBALS['_SCRIPT_']['chrono']->setTemps(array('fin' => microtime()));
 
// Début création de l'affichage
$sortie = str_repeat(' ', $indentation_origine).
'<table id="chrono" lang="fr" summary="Résultat du chronométrage du programme affichant la page actuelle.">'."\n";
$sortie .= str_repeat(' ', ($indentation_origine + ($indentation * 1))).
'<caption>Chronométrage</caption>'."\n";
$sortie .= str_repeat(' ', ($indentation_origine + ($indentation * 1))).
'<thead>'."\n";
$sortie .= str_repeat(' ', ($indentation_origine + ($indentation * 2))).
'<tr><th>Action</th><th>Temps écoulé (en s.)</th><th>Cumul du temps écoulé (en s.)</th></tr>'."\n";
$sortie .= str_repeat(' ', ($indentation_origine + ($indentation * 1))).
'</thead>'."\n";
$tbody = str_repeat(' ', ($indentation_origine + ($indentation * 1))).
'<tbody>'."\n";
$total_tps_ecoule = 0;
// Récupération de la première mesure
$tab_depart =& $this->getTemps(0);
list($usec, $sec) = explode(' ', $tab_depart['depart']);
// Ce temps correspond à tps_fin
$tps_debut = ((float)$usec + (float)$sec);
foreach ($this->getTemps() as $tab_temps) {
foreach ($tab_temps as $cle => $valeur) {
list($usec, $sec) = explode(' ', $valeur);
$tps_fin = ((float)$usec + (float)$sec);
$tps_ecoule = abs($tps_fin - $tps_debut);
$total_tps_ecoule += $tps_ecoule;
$tbody .= str_repeat(' ', ($indentation_origine + ($indentation * 2))).
'<tr>'.
'<th>'.$cle.'</th>'.
'<td>'.number_format($tps_ecoule, 3, ',', ' ').'</td>'.
'<td>'.number_format($total_tps_ecoule, 3, ',', ' ').'</td>'.
'</tr>'."\n";
$tps_debut = $tps_fin;
}
}
$tbody .= str_repeat(' ', ($indentation_origine + ($indentation * 1))).
'</tbody>'."\n";
$sortie .= str_repeat(' ', ($indentation_origine + ($indentation * 1))).
'<tfoot>'."\n";
$sortie .= str_repeat(' ', ($indentation_origine + ($indentation * 2))).
'<tr>'.
'<th>'.'Total du temps écoulé (en s.)'.'</th>'.
'<td colspan="2">'.number_format($total_tps_ecoule,3, ',', ' ').'</td>'.
'</tr>'."\n";
$sortie .= str_repeat(' ', ($indentation_origine + ($indentation * 1))).
'</tfoot>'."\n";
$sortie .= $tbody;
$sortie .= str_repeat(' ', $indentation_origine).
'</table>'."\n";
return $sortie;
}
 
}
 
/* +--Fin du code ----------------------------------------------------------------------------------------+
*
* $Log: Chronometre.class.php,v $
* Revision 1.1 2007-01-12 13:16:09 jp_milcent
* Déplacement des classes de débogage et d'optimisation dans le dossier noyau.
*
* Revision 1.1 2005/08/04 15:51:45 jp_milcent
* Implémentation de la gestion via DAO.
* Fin page d'accueil.
* Fin formulaire recherche taxonomique.
*
* Revision 1.2 2005/08/03 15:52:31 jp_milcent
* Fin gestion des résultats recherche nomenclaturale.
* Début gestion formulaire taxonomique.
*
* Revision 1.1 2005/08/02 16:19:33 jp_milcent
* Amélioration des requetes de recherche de noms.
*
*
* +-- Fin du code ----------------------------------------------------------------------------------------+
*/
<?php
/*vim: set expandtab tabstop=4 shiftwidth=4: */
// +------------------------------------------------------------------------------------------------------+
// | PHP version 5.0.4 |
// +------------------------------------------------------------------------------------------------------+
// | Copyright (C) 2005 Tela Botanica (accueil@tela-botanica.org) |
// +------------------------------------------------------------------------------------------------------+
// | This file is part of eFlore-Debogage. |
// | |
// | Foobar 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. |
// | |
// | Foobar 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 Foobar; if not, write to the Free Software |
// | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
// +------------------------------------------------------------------------------------------------------+
// CVS : $Id: Chronometre.class.php,v 1.1 2007-01-12 13:16:09 jp_milcent Exp $
/**
* Classe permettant de mesurer le temps d'execution d'un script.
*
* Contient des méthodes permettant d'évaluer la vitesse d'exécution d'un script.
*
*@package eFlore
*@subpackage Debogage
//Auteur original :
*@author Jean-Pascal MILCENT <jpm@tela-botanica.org>
//Autres auteurs :
*@author aucun
*@copyright Tela-Botanica 2000-2005
*@version $Revision: 1.1 $ $Date: 2007-01-12 13:16:09 $
// +------------------------------------------------------------------------------------------------------+
*/
 
// +------------------------------------------------------------------------------------------------------+
// | ENTETE du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
 
 
// +------------------------------------------------------------------------------------------------------+
// | CORPS du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
/**Classe Chronometre() - Permet de stocker et d'afficher les temps d'éxécution de script.
*
* Cette classe permet de réaliser un ensemble de mesure de temps prises à
* différents endroits d'un script. Ces mesures peuvent ensuite être affichées au
* sein d'un tableau XHTML.
*
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
*/
class Chronometre
{
/*** Attributs : ***/
private $temps = array();
/*** Constructeur : ***/
public function __construct() {
$this->setTemps(array('depart' => microtime()));
}
/*** Accesseurs : ***/
public function getTemps($cle = NULL) {
if (!is_null($cle)) {
return $this->temps[$cle];
} else {
return $this->temps;
}
}
public function setTemps($moment = array()) {
array_push($this->temps, $moment);
}
/*** Méthodes : ***/
/**Méthode afficherChrono() - Permet d'afficher les temps d'éxécution de différentes parties d'un script.
*
* Cette fonction permet d'afficher un ensemble de mesure de temps prises à différents endroits d'un script.
* Ces mesures sont affichées au sein d'un tableau XHTML dont on peut controler l'indentation des balises.
* Pour un site en production, il suffit d'ajouter un style #chrono {display:none;} dans la css. De cette façon,
* le tableau ne s'affichera pas. Le webmaster lui pourra rajouter sa propre feuille de style affichant le tableau.
* Le développeur initial de cette fonction est Loic d'Anterroches. Elle a été modifiée par Jean-Pascal Milcent.
* Elle utilise une variable gobale : $_CHRONO_
*
* @author Loic d'Anterroches
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @param int l'indentation de base pour le code html du tableau.
* @param int le pas d'indentation pour le code html du tableau.
* @return string la chaine XHTML de mesure des temps.
*/
function afficherChrono($indentation_origine = 8, $indentation = 4) {
// Création du chrono de fin
$GLOBALS['_SCRIPT_']['chrono']->setTemps(array('fin' => microtime()));
 
// Début création de l'affichage
$sortie = str_repeat(' ', $indentation_origine).
'<table id="chrono" lang="fr" summary="Résultat du chronométrage du programme affichant la page actuelle.">'."\n";
$sortie .= str_repeat(' ', ($indentation_origine + ($indentation * 1))).
'<caption>Chronométrage</caption>'."\n";
$sortie .= str_repeat(' ', ($indentation_origine + ($indentation * 1))).
'<thead>'."\n";
$sortie .= str_repeat(' ', ($indentation_origine + ($indentation * 2))).
'<tr><th>Action</th><th>Temps écoulé (en s.)</th><th>Cumul du temps écoulé (en s.)</th></tr>'."\n";
$sortie .= str_repeat(' ', ($indentation_origine + ($indentation * 1))).
'</thead>'."\n";
$tbody = str_repeat(' ', ($indentation_origine + ($indentation * 1))).
'<tbody>'."\n";
$total_tps_ecoule = 0;
// Récupération de la première mesure
$tab_depart =& $this->getTemps(0);
list($usec, $sec) = explode(' ', $tab_depart['depart']);
// Ce temps correspond à tps_fin
$tps_debut = ((float)$usec + (float)$sec);
foreach ($this->getTemps() as $tab_temps) {
foreach ($tab_temps as $cle => $valeur) {
list($usec, $sec) = explode(' ', $valeur);
$tps_fin = ((float)$usec + (float)$sec);
$tps_ecoule = abs($tps_fin - $tps_debut);
$total_tps_ecoule += $tps_ecoule;
$tbody .= str_repeat(' ', ($indentation_origine + ($indentation * 2))).
'<tr>'.
'<th>'.$cle.'</th>'.
'<td>'.number_format($tps_ecoule, 3, ',', ' ').'</td>'.
'<td>'.number_format($total_tps_ecoule, 3, ',', ' ').'</td>'.
'</tr>'."\n";
$tps_debut = $tps_fin;
}
}
$tbody .= str_repeat(' ', ($indentation_origine + ($indentation * 1))).
'</tbody>'."\n";
$sortie .= str_repeat(' ', ($indentation_origine + ($indentation * 1))).
'<tfoot>'."\n";
$sortie .= str_repeat(' ', ($indentation_origine + ($indentation * 2))).
'<tr>'.
'<th>'.'Total du temps écoulé (en s.)'.'</th>'.
'<td colspan="2">'.number_format($total_tps_ecoule,3, ',', ' ').'</td>'.
'</tr>'."\n";
$sortie .= str_repeat(' ', ($indentation_origine + ($indentation * 1))).
'</tfoot>'."\n";
$sortie .= $tbody;
$sortie .= str_repeat(' ', $indentation_origine).
'</table>'."\n";
return $sortie;
}
 
}
 
/* +--Fin du code ----------------------------------------------------------------------------------------+
*
* $Log: Chronometre.class.php,v $
* Revision 1.1 2007-01-12 13:16:09 jp_milcent
* Déplacement des classes de débogage et d'optimisation dans le dossier noyau.
*
* Revision 1.1 2005/08/04 15:51:45 jp_milcent
* Implémentation de la gestion via DAO.
* Fin page d'accueil.
* Fin formulaire recherche taxonomique.
*
* Revision 1.2 2005/08/03 15:52:31 jp_milcent
* Fin gestion des résultats recherche nomenclaturale.
* Début gestion formulaire taxonomique.
*
* Revision 1.1 2005/08/02 16:19:33 jp_milcent
* Amélioration des requetes de recherche de noms.
*
*
* +-- Fin du code ----------------------------------------------------------------------------------------+
*/
?>
/trunk/papyrus/applications/admin_administrateur/bibliotheque/Modele.php
1,78 → 1,81
<?php
 
abstract class Modele {
 
private $registre;
private $gestionnaire_erreur;
private $dsn;
private $type;
private $hote;
private $bdd_nom;
private $utilisateur;
private $pass ;
private $connexion = null;
 
/**
* Constructeur par défaut, appelé à l'initialisation
*/
final public function __construct() {
$this->registre = Registre::getInstance() ;
$this->gestionnaire_erreur = GestionnaireErreur::getInstance() ;
$this->type = $this->registre->get('bdd_type');
$this->hote = $this->registre->get('bdd_hote');
$this->bdd_nom = $this->registre->get('bdd_nom');
$this->utilisateur = $this->registre->get('bdd_utilisateur');
$this->pass = $this->registre->get('bdd_pass');
$this->dsn = $this->type.':dbname='.$this->bdd_nom.';host='.$this->hote;
}
/**
* Fonction qui appelle la bonne fonction de requete suivant le type de bdd.
*
* @param string la requete à effectuer
* @return PDOStatement un objet contenant le résultat de la requête
*/
final protected function requete($requete) {
// on ne se connecte que lors du premier appel à une requete
if($this->connexion == null) {
$this->connecter();
}
return $this->connexion->query($requete);
}
/**
* Connection à la base de données en utilisant les informations fournies par
* le fichier de configuration.
* private et final car n'a pas vocation a être appelée par l'utilisateur.
*
* @throws PDOException une exception dans le cas ou là connexion échoue
*/
final private function connecter() {
try {
$this->connexion = new PDO($this->dsn,$this->utilisateur,$this->pass);
} catch (PDOException $e) {
 
}
}
final protected function proteger($chaine) {
// Connection lors du premier appel à une requete
if($this->connexion == null) {
$this->connecter();
}
return $this->connexion->quote($chaine);
}
/**
* Destructeur de classe, se contente de fermer explicitement la connexion
*/
final public function __destruct() {
if($this->connexion != null) {
$this->connexion = null ;
}
}
}
<?php
 
abstract class Modele {
 
private $registre;
private $gestionnaire_erreur;
private $dsn;
private $type;
private $hote;
private $bdd_nom;
private $utilisateur;
private $pass ;
private $connexion = null;
 
/**
* Constructeur par défaut, appelé à l'initialisation
*/
final public function __construct() {
$this->registre = Registre::getInstance() ;
$this->gestionnaire_erreur = GestionnaireErreur::getInstance() ;
$this->type = $this->registre->get('bdd_type');
$this->hote = $this->registre->get('bdd_hote');
$this->bdd_nom = $this->registre->get('bdd_nom');
$this->utilisateur = $this->registre->get('bdd_utilisateur');
$this->pass = $this->registre->get('bdd_pass');
$this->dsn = $this->type.':dbname='.$this->bdd_nom.';host='.$this->hote;
}
/**
* Fonction qui appelle la bonne fonction de requete suivant le type de bdd
* @param string la requete à effectuer
* @return PDOStatement un objet contenant le résultat de la requête
*/
final protected function requete($requete) {
// on ne se connecte que lors du premier appel à une requete
if($this->connexion == null) {
$this->connecter();
}
return $this->connexion->query($requete);
}
/**
* Connecte à la base de données en utilisant les informations fournies par
* le fichier de configuration, private et final car n'a pas vocation a être appelée
* par l'utilisateur
* @throws PDOException une exception dans le cas ou là connexion échoue
*/
final private function connecter() {
try {
$this->connexion = new PDO($this->dsn,$this->utilisateur,$this->pass);
} catch (PDOException $e) {
 
}
}
final protected function proteger($chaine) {
// on ne se connecte que lors du premier appel à une requete
if($this->connexion == null) {
$this->connecter();
}
return $this->connexion->quote($chaine);
}
/**
* Destructeur de classe, se contente de fermer explicitement la connexion
*/
final public function __destruct() {
if($this->connexion != null) {
$this->connexion = null ;
}
}
}
?>
/trunk/papyrus/applications/admin_administrateur/bibliotheque/Net_URL.php
1,490 → 1,490
<?php
// +-----------------------------------------------------------------------+
// | Copyright (c) 2002-2004, Richard Heyes |
// | All rights reserved. |
// | |
// | Redistribution and use in source and binary forms, with or without |
// | modification, are permitted provided that the following conditions |
// | are met: |
// | |
// | o Redistributions of source code must retain the above copyright |
// | notice, this list of conditions and the following disclaimer. |
// | o Redistributions in binary form must reproduce the above copyright |
// | notice, this list of conditions and the following disclaimer in the |
// | documentation and/or other materials provided with the distribution.|
// | o The names of the authors may not be used to endorse or promote |
// | products derived from this software without specific prior written |
// | permission. |
// | |
// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
// | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
// | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
// | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
// | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
// | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
// | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
// | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
// | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
// | |
// +-----------------------------------------------------------------------+
// | Author: Richard Heyes <richard at php net> |
// +-----------------------------------------------------------------------+
//
// $Id: URL.php,v 1.3 2007-11-19 14:06:54 alexandre_tb Exp $
//
// Net_URL Class
 
 
class Net_URL
{
var $options = array('encode_query_keys' => false);
/**
* Full url
* @var string
*/
var $url;
 
/**
* Protocol
* @var string
*/
var $protocol;
 
/**
* Username
* @var string
*/
var $username;
 
/**
* Password
* @var string
*/
var $password;
 
/**
* Host
* @var string
*/
var $host;
 
/**
* Port
* @var integer
*/
var $port;
 
/**
* Path
* @var string
*/
var $path;
 
/**
* Query string
* @var array
*/
var $querystring;
 
/**
* Anchor
* @var string
*/
var $anchor;
 
/**
* Whether to use []
* @var bool
*/
var $useBrackets;
 
/**
* PHP4 Constructor
*
* @see __construct()
*/
function Net_URL($url = null, $useBrackets = true)
{
$this->__construct($url, $useBrackets);
}
 
/**
* PHP5 Constructor
*
* Parses the given url and stores the various parts
* Defaults are used in certain cases
*
* @param string $url Optional URL
* @param bool $useBrackets Whether to use square brackets when
* multiple querystrings with the same name
* exist
*/
function __construct($url = null, $useBrackets = true)
{
$this->url = $url;
$this->useBrackets = $useBrackets;
 
$this->initialize();
}
 
function initialize()
{
$HTTP_SERVER_VARS = !empty($_SERVER) ? $_SERVER : $GLOBALS['HTTP_SERVER_VARS'];
 
$this->user = '';
$this->pass = '';
$this->host = '';
$this->port = 80;
$this->path = '';
$this->querystring = array();
$this->anchor = '';
 
// Only use defaults if not an absolute URL given
if (!preg_match('/^[a-z0-9]+:\/\//i', $this->url)) {
$this->protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on' ? 'https' : 'http');
 
/**
* Figure out host/port
*/
if (!empty($HTTP_SERVER_VARS['HTTP_HOST']) &&
preg_match('/^(.*)(:([0-9]+))?$/U', $HTTP_SERVER_VARS['HTTP_HOST'], $matches))
{
$host = $matches[1];
if (!empty($matches[3])) {
$port = $matches[3];
} else {
$port = $this->getStandardPort($this->protocol);
}
}
 
$this->user = '';
$this->pass = '';
$this->host = !empty($host) ? $host : (isset($HTTP_SERVER_VARS['SERVER_NAME']) ? $HTTP_SERVER_VARS['SERVER_NAME'] : 'localhost');
$this->port = !empty($port) ? $port : (isset($HTTP_SERVER_VARS['SERVER_PORT']) ? $HTTP_SERVER_VARS['SERVER_PORT'] : $this->getStandardPort($this->protocol));
$this->path = !empty($HTTP_SERVER_VARS['PHP_SELF']) ? $HTTP_SERVER_VARS['PHP_SELF'] : '/';
$this->querystring = isset($HTTP_SERVER_VARS['QUERY_STRING']) ? $this->_parseRawQuerystring($HTTP_SERVER_VARS['QUERY_STRING']) : null;
$this->anchor = '';
}
 
// Parse the url and store the various parts
if (!empty($this->url)) {
$urlinfo = parse_url($this->url);
 
// Default querystring
$this->querystring = array();
 
foreach ($urlinfo as $key => $value) {
switch ($key) {
case 'scheme':
$this->protocol = $value;
$this->port = $this->getStandardPort($value);
break;
 
case 'user':
case 'pass':
case 'host':
case 'port':
$this->$key = $value;
break;
 
case 'path':
if ($value{0} == '/') {
$this->path = $value;
} else {
$path = dirname($this->path) == DIRECTORY_SEPARATOR ? '' : dirname($this->path);
$this->path = sprintf('%s/%s', $path, $value);
}
break;
 
case 'query':
$this->querystring = $this->_parseRawQueryString($value);
break;
 
case 'fragment':
$this->anchor = $value;
break;
}
}
}
}
/**
* Returns full url
*
* @return string Full url
* @access public
*/
function getURL()
{
$querystring = $this->getQueryString();
 
$this->url = $this->protocol . '://'
. $this->user . (!empty($this->pass) ? ':' : '')
. $this->pass . (!empty($this->user) ? '@' : '')
. $this->host . ($this->port == $this->getStandardPort($this->protocol) ? '' : ':' . $this->port)
. $this->path
. (!empty($querystring) ? '?' . $querystring : '')
. (!empty($this->anchor) ? '#' . $this->anchor : '');
 
return $this->url;
}
 
/**
* Adds or updates a querystring item (URL parameter).
* Automatically encodes parameters with rawurlencode() if $preencoded
* is false.
* You can pass an array to $value, it gets mapped via [] in the URL if
* $this->useBrackets is activated.
*
* @param string $name Name of item
* @param string $value Value of item
* @param bool $preencoded Whether value is urlencoded or not, default = not
* @access public
*/
function addQueryString($name, $value, $preencoded = false)
{
if ($this->getOption('encode_query_keys')) {
$name = rawurlencode($name);
}
 
if ($preencoded) {
$this->querystring[$name] = $value;
} else {
$this->querystring[$name] = is_array($value) ? array_map('rawurlencode', $value): rawurlencode($value);
}
}
 
/**
* Removes a querystring item
*
* @param string $name Name of item
* @access public
*/
function removeQueryString($name)
{
if ($this->getOption('encode_query_keys')) {
$name = rawurlencode($name);
}
 
if (isset($this->querystring[$name])) {
unset($this->querystring[$name]);
}
}
 
/**
* Sets the querystring to literally what you supply
*
* @param string $querystring The querystring data. Should be of the format foo=bar&x=y etc
* @access public
*/
function addRawQueryString($querystring)
{
$this->querystring = $this->_parseRawQueryString($querystring);
}
 
/**
* Returns flat querystring
*
* @return string Querystring
* @access public
*/
function getQueryString()
{
if (!empty($this->querystring)) {
foreach ($this->querystring as $name => $value) {
// Encode var name
$name = rawurlencode($name);
 
if (is_array($value)) {
foreach ($value as $k => $v) {
$querystring[] = $this->useBrackets ? sprintf('%s[%s]=%s', $name, $k, $v) : ($name . '=' . $v);
}
} elseif (!is_null($value)) {
$querystring[] = $name . '=' . $value;
} else {
$querystring[] = $name;
}
}
$querystring = implode(ini_get('arg_separator.output'), $querystring);
} else {
$querystring = '';
}
 
return $querystring;
}
 
/**
* Parses raw querystring and returns an array of it
*
* @param string $querystring The querystring to parse
* @return array An array of the querystring data
* @access private
*/
function _parseRawQuerystring($querystring)
{
$parts = preg_split('/[' . preg_quote(ini_get('arg_separator.input'), '/') . ']/', $querystring, -1, PREG_SPLIT_NO_EMPTY);
$return = array();
 
foreach ($parts as $part) {
if (strpos($part, '=') !== false) {
$value = substr($part, strpos($part, '=') + 1);
$key = substr($part, 0, strpos($part, '='));
} else {
$value = null;
$key = $part;
}
 
if (!$this->getOption('encode_query_keys')) {
$key = rawurldecode($key);
}
 
if (preg_match('#^(.*)\[([0-9a-z_-]*)\]#i', $key, $matches)) {
$key = $matches[1];
$idx = $matches[2];
 
// Ensure is an array
if (empty($return[$key]) || !is_array($return[$key])) {
$return[$key] = array();
}
 
// Add data
if ($idx === '') {
$return[$key][] = $value;
} else {
$return[$key][$idx] = $value;
}
} elseif (!$this->useBrackets AND !empty($return[$key])) {
$return[$key] = (array)$return[$key];
$return[$key][] = $value;
} else {
$return[$key] = $value;
}
}
 
return $return;
}
 
/**
* Resolves //, ../ and ./ from a path and returns
* the result. Eg:
*
* /foo/bar/../boo.php => /foo/boo.php
* /foo/bar/../../boo.php => /boo.php
* /foo/bar/.././/boo.php => /foo/boo.php
*
* This method can also be called statically.
*
* @param string $path URL path to resolve
* @return string The result
*/
function resolvePath($path)
{
$path = explode('/', str_replace('//', '/', $path));
 
for ($i=0; $i<count($path); $i++) {
if ($path[$i] == '.') {
unset($path[$i]);
$path = array_values($path);
$i--;
 
} elseif ($path[$i] == '..' AND ($i > 1 OR ($i == 1 AND $path[0] != '') ) ) {
unset($path[$i]);
unset($path[$i-1]);
$path = array_values($path);
$i -= 2;
 
} elseif ($path[$i] == '..' AND $i == 1 AND $path[0] == '') {
unset($path[$i]);
$path = array_values($path);
$i--;
 
} else {
continue;
}
}
 
return implode('/', $path);
}
 
/**
* Returns the standard port number for a protocol
*
* @param string $scheme The protocol to lookup
* @return integer Port number or NULL if no scheme matches
*
* @author Philippe Jausions <Philippe.Jausions@11abacus.com>
*/
function getStandardPort($scheme)
{
switch (strtolower($scheme)) {
case 'http': return 80;
case 'https': return 443;
case 'ftp': return 21;
case 'imap': return 143;
case 'imaps': return 993;
case 'pop3': return 110;
case 'pop3s': return 995;
default: return null;
}
}
 
/**
* Forces the URL to a particular protocol
*
* @param string $protocol Protocol to force the URL to
* @param integer $port Optional port (standard port is used by default)
*/
function setProtocol($protocol, $port = null)
{
$this->protocol = $protocol;
$this->port = is_null($port) ? $this->getStandardPort($protocol) : $port;
}
 
/**
* Set an option
*
* This function set an option
* to be used thorough the script.
*
* @access public
* @param string $optionName The optionname to set
* @param string $value The value of this option.
*/
function setOption($optionName, $value)
{
if (!array_key_exists($optionName, $this->options)) {
return false;
}
 
$this->options[$optionName] = $value;
$this->initialize();
}
 
/**
* Get an option
*
* This function gets an option
* from the $this->options array
* and return it's value.
*
* @access public
* @param string $opionName The name of the option to retrieve
* @see $this->options
*/
function getOption($optionName)
{
if (!isset($this->options[$optionName])) {
return false;
}
 
return $this->options[$optionName];
}
function __toString() {
return $this->url ;
}
 
}
?>
<?php
// +-----------------------------------------------------------------------+
// | Copyright (c) 2002-2004, Richard Heyes |
// | All rights reserved. |
// | |
// | Redistribution and use in source and binary forms, with or without |
// | modification, are permitted provided that the following conditions |
// | are met: |
// | |
// | o Redistributions of source code must retain the above copyright |
// | notice, this list of conditions and the following disclaimer. |
// | o Redistributions in binary form must reproduce the above copyright |
// | notice, this list of conditions and the following disclaimer in the |
// | documentation and/or other materials provided with the distribution.|
// | o The names of the authors may not be used to endorse or promote |
// | products derived from this software without specific prior written |
// | permission. |
// | |
// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
// | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
// | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
// | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
// | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
// | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
// | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
// | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
// | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
// | |
// +-----------------------------------------------------------------------+
// | Author: Richard Heyes <richard at php net> |
// +-----------------------------------------------------------------------+
//
// $Id: URL.php,v 1.3 2007-11-19 14:06:54 alexandre_tb Exp $
//
// Net_URL Class
 
 
class Net_URL
{
var $options = array('encode_query_keys' => false);
/**
* Full url
* @var string
*/
var $url;
 
/**
* Protocol
* @var string
*/
var $protocol;
 
/**
* Username
* @var string
*/
var $username;
 
/**
* Password
* @var string
*/
var $password;
 
/**
* Host
* @var string
*/
var $host;
 
/**
* Port
* @var integer
*/
var $port;
 
/**
* Path
* @var string
*/
var $path;
 
/**
* Query string
* @var array
*/
var $querystring;
 
/**
* Anchor
* @var string
*/
var $anchor;
 
/**
* Whether to use []
* @var bool
*/
var $useBrackets;
 
/**
* PHP4 Constructor
*
* @see __construct()
*/
function Net_URL($url = null, $useBrackets = true)
{
$this->__construct($url, $useBrackets);
}
 
/**
* PHP5 Constructor
*
* Parses the given url and stores the various parts
* Defaults are used in certain cases
*
* @param string $url Optional URL
* @param bool $useBrackets Whether to use square brackets when
* multiple querystrings with the same name
* exist
*/
function __construct($url = null, $useBrackets = true)
{
$this->url = $url;
$this->useBrackets = $useBrackets;
 
$this->initialize();
}
 
function initialize()
{
$HTTP_SERVER_VARS = !empty($_SERVER) ? $_SERVER : $GLOBALS['HTTP_SERVER_VARS'];
 
$this->user = '';
$this->pass = '';
$this->host = '';
$this->port = 80;
$this->path = '';
$this->querystring = array();
$this->anchor = '';
 
// Only use defaults if not an absolute URL given
if (!preg_match('/^[a-z0-9]+:\/\//i', $this->url)) {
$this->protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on' ? 'https' : 'http');
 
/**
* Figure out host/port
*/
if (!empty($HTTP_SERVER_VARS['HTTP_HOST']) &&
preg_match('/^(.*)(:([0-9]+))?$/U', $HTTP_SERVER_VARS['HTTP_HOST'], $matches))
{
$host = $matches[1];
if (!empty($matches[3])) {
$port = $matches[3];
} else {
$port = $this->getStandardPort($this->protocol);
}
}
 
$this->user = '';
$this->pass = '';
$this->host = !empty($host) ? $host : (isset($HTTP_SERVER_VARS['SERVER_NAME']) ? $HTTP_SERVER_VARS['SERVER_NAME'] : 'localhost');
$this->port = !empty($port) ? $port : (isset($HTTP_SERVER_VARS['SERVER_PORT']) ? $HTTP_SERVER_VARS['SERVER_PORT'] : $this->getStandardPort($this->protocol));
$this->path = !empty($HTTP_SERVER_VARS['PHP_SELF']) ? $HTTP_SERVER_VARS['PHP_SELF'] : '/';
$this->querystring = isset($HTTP_SERVER_VARS['QUERY_STRING']) ? $this->_parseRawQuerystring($HTTP_SERVER_VARS['QUERY_STRING']) : null;
$this->anchor = '';
}
 
// Parse the url and store the various parts
if (!empty($this->url)) {
$urlinfo = parse_url($this->url);
 
// Default querystring
$this->querystring = array();
 
foreach ($urlinfo as $key => $value) {
switch ($key) {
case 'scheme':
$this->protocol = $value;
$this->port = $this->getStandardPort($value);
break;
 
case 'user':
case 'pass':
case 'host':
case 'port':
$this->$key = $value;
break;
 
case 'path':
if ($value{0} == '/') {
$this->path = $value;
} else {
$path = dirname($this->path) == DIRECTORY_SEPARATOR ? '' : dirname($this->path);
$this->path = sprintf('%s/%s', $path, $value);
}
break;
 
case 'query':
$this->querystring = $this->_parseRawQueryString($value);
break;
 
case 'fragment':
$this->anchor = $value;
break;
}
}
}
}
/**
* Returns full url
*
* @return string Full url
* @access public
*/
function getURL()
{
$querystring = $this->getQueryString();
 
$this->url = $this->protocol . '://'
. $this->user . (!empty($this->pass) ? ':' : '')
. $this->pass . (!empty($this->user) ? '@' : '')
. $this->host . ($this->port == $this->getStandardPort($this->protocol) ? '' : ':' . $this->port)
. $this->path
. (!empty($querystring) ? '?' . $querystring : '')
. (!empty($this->anchor) ? '#' . $this->anchor : '');
 
return $this->url;
}
 
/**
* Adds or updates a querystring item (URL parameter).
* Automatically encodes parameters with rawurlencode() if $preencoded
* is false.
* You can pass an array to $value, it gets mapped via [] in the URL if
* $this->useBrackets is activated.
*
* @param string $name Name of item
* @param string $value Value of item
* @param bool $preencoded Whether value is urlencoded or not, default = not
* @access public
*/
function addQueryString($name, $value, $preencoded = false)
{
if ($this->getOption('encode_query_keys')) {
$name = rawurlencode($name);
}
 
if ($preencoded) {
$this->querystring[$name] = $value;
} else {
$this->querystring[$name] = is_array($value) ? array_map('rawurlencode', $value): rawurlencode($value);
}
}
 
/**
* Removes a querystring item
*
* @param string $name Name of item
* @access public
*/
function removeQueryString($name)
{
if ($this->getOption('encode_query_keys')) {
$name = rawurlencode($name);
}
 
if (isset($this->querystring[$name])) {
unset($this->querystring[$name]);
}
}
 
/**
* Sets the querystring to literally what you supply
*
* @param string $querystring The querystring data. Should be of the format foo=bar&x=y etc
* @access public
*/
function addRawQueryString($querystring)
{
$this->querystring = $this->_parseRawQueryString($querystring);
}
 
/**
* Returns flat querystring
*
* @return string Querystring
* @access public
*/
function getQueryString()
{
if (!empty($this->querystring)) {
foreach ($this->querystring as $name => $value) {
// Encode var name
$name = rawurlencode($name);
 
if (is_array($value)) {
foreach ($value as $k => $v) {
$querystring[] = $this->useBrackets ? sprintf('%s[%s]=%s', $name, $k, $v) : ($name . '=' . $v);
}
} elseif (!is_null($value)) {
$querystring[] = $name . '=' . $value;
} else {
$querystring[] = $name;
}
}
$querystring = implode(ini_get('arg_separator.output'), $querystring);
} else {
$querystring = '';
}
 
return $querystring;
}
 
/**
* Parses raw querystring and returns an array of it
*
* @param string $querystring The querystring to parse
* @return array An array of the querystring data
* @access private
*/
function _parseRawQuerystring($querystring)
{
$parts = preg_split('/[' . preg_quote(ini_get('arg_separator.input'), '/') . ']/', $querystring, -1, PREG_SPLIT_NO_EMPTY);
$return = array();
 
foreach ($parts as $part) {
if (strpos($part, '=') !== false) {
$value = substr($part, strpos($part, '=') + 1);
$key = substr($part, 0, strpos($part, '='));
} else {
$value = null;
$key = $part;
}
 
if (!$this->getOption('encode_query_keys')) {
$key = rawurldecode($key);
}
 
if (preg_match('#^(.*)\[([0-9a-z_-]*)\]#i', $key, $matches)) {
$key = $matches[1];
$idx = $matches[2];
 
// Ensure is an array
if (empty($return[$key]) || !is_array($return[$key])) {
$return[$key] = array();
}
 
// Add data
if ($idx === '') {
$return[$key][] = $value;
} else {
$return[$key][$idx] = $value;
}
} elseif (!$this->useBrackets AND !empty($return[$key])) {
$return[$key] = (array)$return[$key];
$return[$key][] = $value;
} else {
$return[$key] = $value;
}
}
 
return $return;
}
 
/**
* Resolves //, ../ and ./ from a path and returns
* the result. Eg:
*
* /foo/bar/../boo.php => /foo/boo.php
* /foo/bar/../../boo.php => /boo.php
* /foo/bar/.././/boo.php => /foo/boo.php
*
* This method can also be called statically.
*
* @param string $path URL path to resolve
* @return string The result
*/
function resolvePath($path)
{
$path = explode('/', str_replace('//', '/', $path));
 
for ($i=0; $i<count($path); $i++) {
if ($path[$i] == '.') {
unset($path[$i]);
$path = array_values($path);
$i--;
 
} elseif ($path[$i] == '..' AND ($i > 1 OR ($i == 1 AND $path[0] != '') ) ) {
unset($path[$i]);
unset($path[$i-1]);
$path = array_values($path);
$i -= 2;
 
} elseif ($path[$i] == '..' AND $i == 1 AND $path[0] == '') {
unset($path[$i]);
$path = array_values($path);
$i--;
 
} else {
continue;
}
}
 
return implode('/', $path);
}
 
/**
* Returns the standard port number for a protocol
*
* @param string $scheme The protocol to lookup
* @return integer Port number or NULL if no scheme matches
*
* @author Philippe Jausions <Philippe.Jausions@11abacus.com>
*/
function getStandardPort($scheme)
{
switch (strtolower($scheme)) {
case 'http': return 80;
case 'https': return 443;
case 'ftp': return 21;
case 'imap': return 143;
case 'imaps': return 993;
case 'pop3': return 110;
case 'pop3s': return 995;
default: return null;
}
}
 
/**
* Forces the URL to a particular protocol
*
* @param string $protocol Protocol to force the URL to
* @param integer $port Optional port (standard port is used by default)
*/
function setProtocol($protocol, $port = null)
{
$this->protocol = $protocol;
$this->port = is_null($port) ? $this->getStandardPort($protocol) : $port;
}
 
/**
* Set an option
*
* This function set an option
* to be used thorough the script.
*
* @access public
* @param string $optionName The optionname to set
* @param string $value The value of this option.
*/
function setOption($optionName, $value)
{
if (!array_key_exists($optionName, $this->options)) {
return false;
}
 
$this->options[$optionName] = $value;
$this->initialize();
}
 
/**
* Get an option
*
* This function gets an option
* from the $this->options array
* and return it's value.
*
* @access public
* @param string $opionName The name of the option to retrieve
* @see $this->options
*/
function getOption($optionName)
{
if (!isset($this->options[$optionName])) {
return false;
}
 
return $this->options[$optionName];
}
function __toString() {
return $this->url ;
}
 
}
?>
/trunk/papyrus/applications/admin_administrateur/bibliotheque/Controleur.php
1,97 → 1,97
<?php
/**
* Classe controlleur, coeur d'une application, c'est normalement la seule classe d'une application
* qui devrait être appelée de l'extérieur.
*/
abstract class Controleur {
 
private $registre;
private $gestionnaire_erreur;
/**
* Constructeur par défaut
*/
final public function __construct() {
$this->registre = Registre::getInstance() ;
$this->registre->set('chemin_config',CHEMIN_APPLI.'configuration'.DIRECTORY_SEPARATOR);
$this->registre->set('base_chemin_modele',DOSSIER_MODELES.DIRECTORY_SEPARATOR);
$this->registre->set('base_chemin_squelette',DOSSIER_SQUELETTES.DIRECTORY_SEPARATOR);
$this->registre->set('base_chemin_controleur',DOSSIER_CONTROLEURS.DIRECTORY_SEPARATOR);
$this->registre->set('bdd_type',BDD_PROTOCOLE) ;
$this->registre->set('bdd_hote',BDD_SERVEUR) ;
$this->registre->set('bdd_nom',BDD_NOM_PRINCIPALE) ;
$this->registre->set('bdd_utilisateur',BDD_UTILISATEUR) ;
$this->registre->set('bdd_pass',BDD_MOT_DE_PASSE) ;
$this->gestionnaire_erreur = GestionnaireErreur::getInstance();
}
/**
* Charge un modele donné et le rend disponible sous la forme $this->nom_modele
* @param $nom_modele le nom du modèle à charger
*/
final protected function chargerModele($nom_modele) {
 
$chemin_modele = ($this->registre->get('base_chemin_modele')).$nom_modele.'.php';
if(!file_exists($chemin_modele)) {
return false ;
}
include_once($chemin_modele) ;
if(!class_exists($nom_modele)) {
return false ;
}
$this->$nom_modele = new $nom_modele ;
}
/**
* Fonction prenant en paramètre le nom d'un squelette et un tableau associatif de données, en extrait les variables, charge le squelette
* et cree une variable de classe contenant les deux combinés.
* @param String le nom du squelette
* @param Array un tableau associatif contenant les variables a injecter dans la vue
*
*/
final protected function chargerVue($nom_squelette,$donnees) {
$chemin_squelette = ($this->registre->get('base_chemin_squelette')).$nom_squelette.'.tpl.html';
if(!file_exists($chemin_squelette)) {
return false ;
}
$donnees['base_url'] = $this->registre->get('base_url_application') ;
// on extrait les variables du tableau de données
extract($donnees);
// et on enclenche la bufferisation de sortie
ob_start();
// si les tags courts sont désactivés
if ((bool) @ini_get('short_open_tag') === FALSE)
{
// on remplace les tags par la syntaxe classique avec echo
echo eval('?>'.preg_replace("/;*\s*\?>/", "; ?>", str_replace('<?=', '<?php echo ', file_get_contents($chemin_squelette))));
} else {
// sinon, on se contente d'inclure le squelette
include($chemin_squelette);
}
// on récupère le buffer et on le vide
$buffer = ob_get_contents();
@ob_end_clean();
// enfin on renvoie le contenu
$this->$nom_squelette = $buffer;
return $nom_squelette;
}
}
<?php
/**
* Classe controlleur, coeur d'une application, c'est normalement la seule classe d'une application
* qui devrait être appelée de l'extérieur.
*/
abstract class Controleur {
 
private $registre;
private $gestionnaire_erreur;
/**
* Constructeur par défaut
*/
final public function __construct() {
$this->registre = Registre::getInstance() ;
$this->registre->set('chemin_config',CHEMIN_APPLI.'configuration'.DIRECTORY_SEPARATOR);
$this->registre->set('base_chemin_modele',DOSSIER_MODELES.DIRECTORY_SEPARATOR);
$this->registre->set('base_chemin_squelette',DOSSIER_SQUELETTES.DIRECTORY_SEPARATOR);
$this->registre->set('base_chemin_controleur',DOSSIER_CONTROLEURS.DIRECTORY_SEPARATOR);
$this->registre->set('bdd_type',BDD_PROTOCOLE) ;
$this->registre->set('bdd_hote',BDD_SERVEUR) ;
$this->registre->set('bdd_nom',BDD_NOM_PRINCIPALE) ;
$this->registre->set('bdd_utilisateur',BDD_UTILISATEUR) ;
$this->registre->set('bdd_pass',BDD_MOT_DE_PASSE) ;
$this->gestionnaire_erreur = GestionnaireErreur::getInstance();
}
/**
* Charge un modele donné et le rend disponible sous la forme $this->nom_modele
* @param $nom_modele le nom du modèle à charger
*/
final protected function chargerModele($nom_modele) {
 
$chemin_modele = ($this->registre->get('base_chemin_modele')).$nom_modele.'.php';
if(!file_exists($chemin_modele)) {
return false ;
}
include_once($chemin_modele) ;
if(!class_exists($nom_modele)) {
return false ;
}
$this->$nom_modele = new $nom_modele ;
}
/**
* Fonction prenant en paramètre le nom d'un squelette et un tableau associatif de données, en extrait les variables, charge le squelette
* et cree une variable de classe contenant les deux combinés.
* @param String le nom du squelette
* @param Array un tableau associatif contenant les variables a injecter dans la vue
*
*/
final protected function chargerVue($nom_squelette,$donnees) {
$chemin_squelette = ($this->registre->get('base_chemin_squelette')).$nom_squelette.'.tpl.html';
if(!file_exists($chemin_squelette)) {
return false ;
}
$donnees['base_url'] = $this->registre->get('base_url_application') ;
// on extrait les variables du tableau de données
extract($donnees);
// et on enclenche la bufferisation de sortie
ob_start();
// si les tags courts sont désactivés
if ((bool) @ini_get('short_open_tag') === FALSE)
{
// on remplace les tags par la syntaxe classique avec echo
echo eval('?>'.preg_replace("/;*\s*\?>/", "; ?>", str_replace('<?=', '<?php echo ', file_get_contents($chemin_squelette))));
} else {
// sinon, on se contente d'inclure le squelette
include($chemin_squelette);
}
// on récupère le buffer et on le vide
$buffer = ob_get_contents();
@ob_end_clean();
// enfin on renvoie le contenu
$this->$nom_squelette = $buffer;
return $nom_squelette;
}
}
?>
/trunk/papyrus/applications/admin_administrateur/bibliotheque/GestionnaireErreur.php
1,369 → 1,369
<?php
/*vim: set expandtab tabstop=4 shiftwidth=4: */
// +------------------------------------------------------------------------------------------------------+
// | PHP version 5.0.4 |
// +------------------------------------------------------------------------------------------------------+
// | Copyright (C) 2005 Tela Botanica (accueil@tela-botanica.org) |
// +------------------------------------------------------------------------------------------------------+
// | This file is part of eFlore-Debogage. |
// | |
// | Foobar 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. |
// | |
// | Foobar 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 Foobar; if not, write to the Free Software |
// | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
// +------------------------------------------------------------------------------------------------------+
// CVS : $Id: GestionnaireErreur.class.php,v 1.6 2007-07-09 18:54:43 jp_milcent Exp $
/**
* Classe de gestion des erreurs.
*
*
*
*@package eFlore
*@subpackage Debogage
//Auteur original :
*@author Jean-Pascal MILCENT <jpm@tela-botanica.org>
//Autres auteurs :
*@author aucun
*@copyright Tela-Botanica 2000-2005
*@version $Revision: 1.6 $ $Date: 2007-07-09 18:54:43 $
// +------------------------------------------------------------------------------------------------------+
*/
 
// +------------------------------------------------------------------------------------------------------+
// | ENTETE du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
 
 
// +------------------------------------------------------------------------------------------------------+
// | CORPS du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
 
 
/**
* Classe GestionnaireErreur
*
* Gérer les erreurs PHP et SQL.
*/
class GestionnaireErreur
{
/*** Attributes: ***/
 
/**
* Permet de savoir si on utilise PHP en ligne de commande dans une console (PHP-CLI) ou en mode module de serveur.
* @access private
*/
private $mode;
 
/**
* Contient la liste des erreurs.
* @access private
*/
private $erreurs;
 
/**
* Permet de savoir si on veut faire apparaître ou pas le contexte de l'erreur,
* c'est à dire le contenu des variables.
* @access private
*/
private $contexte;
/**
* Contient le niveau d'erreur courant. Celui que l'on donne à la fonction
* error_reporting().
* @access private
*/
private $niveau_erreur_courant;
/**
* Le gestionnaire d'erreur est un singleton
*/
private static $gestionnaire_erreurs;
/*** Constructeur: ***/
/**
* Construit le gestionnaire d'erreur.
*
* @return void
* @access public
*/
private function __construct( $contexte = false )
{
$this->mode = php_sapi_name();
$this->erreurs = array();
$this->setContexte($contexte);
$this->niveau_erreur_courant = 2048 ;
set_error_handler(array(&$this, 'gererErreur'));
}
/**
* Fonction d'accès au singleton
* @return GestionnaireErreur le gestionnaire d'erreurs courant
*/
public static function getInstance()
{
if (self::$gestionnaire_erreurs instanceof GestionnaireErreur) {
return self::$gestionnaire_erreurs;
}
self::$gestionnaire_erreurs = new GestionnaireErreur ;
return self::$gestionnaire_erreurs;
}
/*** Accesseurs: ***/
/**
* Récupère le tableau des erreurs.
*
* @return array
* @access public
*/
public function getErreur( ) {
return $this->erreurs;
}
 
/**
* Ajoute une erreur à la liste.
*
* @param array une_erreur
* @return void
* @access public
*/
public function setErreur( $une_erreur ) {
$this->erreurs[] = $une_erreur;
}
 
/**
* Récupère la valeur du contexte.
*
* @return boolean
* @access public
*/
public function getContexte( ) {
return $this->contexte;
}
 
/**
* Définit si oui ou non le contexte sera affiché.
*
* @param boolean un_contexte
* @return void
* @access public
*/
public function setContexte( $un_contexte ) {
$this->contexte = $un_contexte;
}
/**
* Récupère le niveau d'erreur courrant.
*
* @return int le niveau d'erreur courrant.
* @access public
*/
public function getNiveauErreurCourant( ) {
return (int)$this->niveau_erreur_courant;
}
 
/**
* Définit le niveau d'erreur courrant.
*
* @param int un niveau d'erreur.
* @return void
* @access public
*/
public function setNiveauErreurCourant( $niveau = 2048 ) {
$this->niveau_erreur_courant = $niveau;
}
/**
* Définit le niveau d'erreur courrant (synonyme fonction precedente)
*
* @param int un niveau d'erreur.
* @return void
* @access public
*/
public function setActive ($niveau) {
$this->niveau_erreur_courant = $niveau;
}
/*** Méthodes : ***/
/**
*
* @param int niveau
* @param string message
* @param string fichier
* @param int ligne
* @param boolean contexte
* @return void
* @access public
*/
public function gererErreur($niveau, $message, $fichier, $ligne, $contexte)
{
$aso_erreur = array();
// Nous vérifions si nous affichons ou pas l'erreur en fonction du niveau demandé
if ( $niveau <= $this->getNiveauErreurCourant() ) {
$aso_erreur['niveau'] = $niveau;
switch ($niveau) {
case E_USER_NOTICE :
if (is_array($message) || is_object($message)) {
$aso_erreur['message'] = print_r($message, true);
} else {
$aso_erreur['message'] = $message;
}
break;
default:
$aso_erreur['message'] = $message;
}
$aso_erreur['fichier'] = $fichier;
$aso_erreur['ligne'] = $ligne;
if ($this->getContexte()) {
$aso_erreur['contexte'] = $contexte;
}
$this->setErreur($aso_erreur);
}
// Si nous avons à faire à une erreur et non à un warning ou une notice, nous arrêtons l'exécution du script
switch ($niveau) {
case E_ERROR :
case E_USER_ERROR :
die($this->retournerErreur());
break;
}
}
 
/**
* Retourne l'erreur PHP formatée en XHTML.
*
* @return string
* @access public
*/
public function retournerErreur()
{
$retour = '';
foreach($this->getErreur() as $aso_erreur) {
if ('<!-- BEGIN sql -->' == substr($aso_erreur['message'], 0, 18)) {
$retour .= $aso_erreur['message'];
continue;
}
 
switch ($this->mode) {
case 'cli' :
if ($aso_erreur['niveau'] == E_USER_NOTICE) {
$retour .= $aso_erreur['message']."\n";
$retour .= 'Fichier : '.$aso_erreur['fichier']."\n";
$retour .= 'Ligne : '.$aso_erreur['ligne']."\n";
} else if ($aso_erreur['niveau'] <= 512) {
$retour .= 'INFO : Niveau '.$aso_erreur['niveau']."\n";
} else {
$retour .= 'ERREUR : Niveau '.$aso_erreur['niveau']."\n";
}
$retour .= 'Niveau : '.$aso_erreur['niveau']."\n";
$retour .= 'Message : '.$aso_erreur['message']."\n";
$retour .= 'Fichier : '.$aso_erreur['fichier']."\n";
$retour .= 'Ligne : '.$aso_erreur['ligne']."\n";
if ($this->getContexte()) {
$retour .= 'Contexte : '."\n".print_r($aso_erreur['contexte'], true)."\n";
}
break;
default:
if ($aso_erreur['niveau'] == E_USER_NOTICE) {
$retour .= '<pre class="debogage">'."\n";
$retour .= htmlentities($aso_erreur['message'])."\n";
$retour .= '<span class="debogage_fichier">'.'Fichier : '.$aso_erreur['fichier'].'</span>'."\n";
$retour .= '<span class="debogage_ligne">'.'Ligne : '.$aso_erreur['ligne'].'</span>'."\n";
$retour .= '</pre>'."\n";
continue;
} else if ($aso_erreur['niveau'] <= 512) {
$retour .= '<p class="information">'."\n";
$retour .= '<strong>INFO : Niveau '.$aso_erreur['niveau'].'</strong><br />'."\n";
} else {
$retour .= '<p class="attention">'."\n";
$retour .= '<strong>ERREUR : Niveau '.$aso_erreur['niveau'].'</strong><br />'."\n";
}
$retour .= '<strong>Niveau : </strong>'.$aso_erreur['niveau'].'<br />'."\n";
$retour .= '<strong>Message : </strong>'.$aso_erreur['message'].'<br />'."\n";
$retour .= '<strong>Fichier : </strong>'.$aso_erreur['fichier'].'<br />'."\n";
$retour .= '<strong>Ligne : </strong>'.$aso_erreur['ligne'].'<br />'."\n";
if ($this->getContexte()) {
$retour .= '<pre>'."\n";
$retour .= '<stong>Contexte : </stong>'."\n".print_r($aso_erreur['contexte'], true)."\n";
$retour .= '</pre>'."\n";
}
$retour .= '</p>'."\n";
}
}
return $retour;
}
 
/**
* Retourne l'erreur SQL formatée en XHTML.
*
* @param string fichier
* @param int ligne
* @param string message
* @param string requete
* @param string autres
* @return string
* @static
* @access public
*/
public static function retournerErreurSql( $fichier, $methode, $message, $requete = null, $autres = null )
{
$retour = '';
switch (php_sapi_name()) {
case 'cli' :
$retour .= 'ERREUR SQL '."\n";
$retour .= 'Fichier : '.$fichier."\n";
$retour .= 'Méthode : '.$methode."\n";
$retour .= 'Message : '.$message."\n";
if (!is_null($requete)) {
$retour .= 'Requete : '."\n";
$retour .= $requete."\n";
}
if (!is_null($autres)) {
$retour .= 'Autres infos : '."\n";
$retour .= $autres."\n";
}
break;
default:
$retour .= '<!-- BEGIN sql -->';
$retour .= '<div id="zone_erreur">'."\n";
$retour .= '<h1 > ERREUR SQL </h1><br />'."\n";
$retour .= '<dl>'."\n";
$retour .= '<dt> Fichier : </dt> ';
$retour .= '<dd> '.$fichier.'</dd>'."\n";
$retour .= '<dt> Méthode : </dt> ';
$retour .= '<dd> '.$methode.'</dd>'."\n";
$retour .= '<dt> Message erreur : </dt> ';
$retour .= '<dd> '.$message.'</dd>'."\n";
if (!is_null($requete)) {
$retour .= '<dt> Requete : </dt> ';
$retour .= '<dd> '.$requete.' </dd>'."\n";
}
if (!is_null($autres)) {
$retour .= '<dt> Autres infos : </dt> ';
$retour .= '<dd> '.$autres.' </dd>'."\n";
}
$retour .= '</dl>'."\n";
$retour .= '</div>'."\n";
$retour .= '<!-- END sql -->'."\n";
}
return $retour;
}
}
<?php
/*vim: set expandtab tabstop=4 shiftwidth=4: */
// +------------------------------------------------------------------------------------------------------+
// | PHP version 5.0.4 |
// +------------------------------------------------------------------------------------------------------+
// | Copyright (C) 2005 Tela Botanica (accueil@tela-botanica.org) |
// +------------------------------------------------------------------------------------------------------+
// | This file is part of eFlore-Debogage. |
// | |
// | Foobar 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. |
// | |
// | Foobar 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 Foobar; if not, write to the Free Software |
// | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
// +------------------------------------------------------------------------------------------------------+
// CVS : $Id: GestionnaireErreur.class.php,v 1.6 2007-07-09 18:54:43 jp_milcent Exp $
/**
* Classe de gestion des erreurs.
*
*
*
*@package eFlore
*@subpackage Debogage
//Auteur original :
*@author Jean-Pascal MILCENT <jpm@tela-botanica.org>
//Autres auteurs :
*@author aucun
*@copyright Tela-Botanica 2000-2005
*@version $Revision: 1.6 $ $Date: 2007-07-09 18:54:43 $
// +------------------------------------------------------------------------------------------------------+
*/
 
// +------------------------------------------------------------------------------------------------------+
// | ENTETE du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
 
 
// +------------------------------------------------------------------------------------------------------+
// | CORPS du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
 
 
/**
* Classe GestionnaireErreur
*
* Gérer les erreurs PHP et SQL.
*/
class GestionnaireErreur
{
/*** Attributes: ***/
 
/**
* Permet de savoir si on utilise PHP en ligne de commande dans une console (PHP-CLI) ou en mode module de serveur.
* @access private
*/
private $mode;
 
/**
* Contient la liste des erreurs.
* @access private
*/
private $erreurs;
 
/**
* Permet de savoir si on veut faire apparaître ou pas le contexte de l'erreur,
* c'est à dire le contenu des variables.
* @access private
*/
private $contexte;
/**
* Contient le niveau d'erreur courant. Celui que l'on donne à la fonction
* error_reporting().
* @access private
*/
private $niveau_erreur_courant;
/**
* Le gestionnaire d'erreur est un singleton
*/
private static $gestionnaire_erreurs;
/*** Constructeur: ***/
/**
* Construit le gestionnaire d'erreur.
*
* @return void
* @access public
*/
private function __construct( $contexte = false )
{
$this->mode = php_sapi_name();
$this->erreurs = array();
$this->setContexte($contexte);
$this->niveau_erreur_courant = 2048 ;
set_error_handler(array(&$this, 'gererErreur'));
}
/**
* Fonction d'accès au singleton
* @return GestionnaireErreur le gestionnaire d'erreurs courant
*/
public static function getInstance()
{
if (self::$gestionnaire_erreurs instanceof GestionnaireErreur) {
return self::$gestionnaire_erreurs;
}
self::$gestionnaire_erreurs = new GestionnaireErreur ;
return self::$gestionnaire_erreurs;
}
/*** Accesseurs: ***/
/**
* Récupère le tableau des erreurs.
*
* @return array
* @access public
*/
public function getErreur( ) {
return $this->erreurs;
}
 
/**
* Ajoute une erreur à la liste.
*
* @param array une_erreur
* @return void
* @access public
*/
public function setErreur( $une_erreur ) {
$this->erreurs[] = $une_erreur;
}
 
/**
* Récupère la valeur du contexte.
*
* @return boolean
* @access public
*/
public function getContexte( ) {
return $this->contexte;
}
 
/**
* Définit si oui ou non le contexte sera affiché.
*
* @param boolean un_contexte
* @return void
* @access public
*/
public function setContexte( $un_contexte ) {
$this->contexte = $un_contexte;
}
/**
* Récupère le niveau d'erreur courrant.
*
* @return int le niveau d'erreur courrant.
* @access public
*/
public function getNiveauErreurCourant( ) {
return (int)$this->niveau_erreur_courant;
}
 
/**
* Définit le niveau d'erreur courrant.
*
* @param int un niveau d'erreur.
* @return void
* @access public
*/
public function setNiveauErreurCourant( $niveau = 2048 ) {
$this->niveau_erreur_courant = $niveau;
}
/**
* Définit le niveau d'erreur courrant (synonyme fonction precedente)
*
* @param int un niveau d'erreur.
* @return void
* @access public
*/
public function setActive ($niveau) {
$this->niveau_erreur_courant = $niveau;
}
/*** Méthodes : ***/
/**
*
* @param int niveau
* @param string message
* @param string fichier
* @param int ligne
* @param boolean contexte
* @return void
* @access public
*/
public function gererErreur($niveau, $message, $fichier, $ligne, $contexte)
{
$aso_erreur = array();
// Nous vérifions si nous affichons ou pas l'erreur en fonction du niveau demandé
if ( $niveau <= $this->getNiveauErreurCourant() ) {
$aso_erreur['niveau'] = $niveau;
switch ($niveau) {
case E_USER_NOTICE :
if (is_array($message) || is_object($message)) {
$aso_erreur['message'] = print_r($message, true);
} else {
$aso_erreur['message'] = $message;
}
break;
default:
$aso_erreur['message'] = $message;
}
$aso_erreur['fichier'] = $fichier;
$aso_erreur['ligne'] = $ligne;
if ($this->getContexte()) {
$aso_erreur['contexte'] = $contexte;
}
$this->setErreur($aso_erreur);
}
// Si nous avons à faire à une erreur et non à un warning ou une notice, nous arrêtons l'exécution du script
switch ($niveau) {
case E_ERROR :
case E_USER_ERROR :
die($this->retournerErreur());
break;
}
}
 
/**
* Retourne l'erreur PHP formatée en XHTML.
*
* @return string
* @access public
*/
public function retournerErreur()
{
$retour = '';
foreach($this->getErreur() as $aso_erreur) {
if ('<!-- BEGIN sql -->' == substr($aso_erreur['message'], 0, 18)) {
$retour .= $aso_erreur['message'];
continue;
}
 
switch ($this->mode) {
case 'cli' :
if ($aso_erreur['niveau'] == E_USER_NOTICE) {
$retour .= $aso_erreur['message']."\n";
$retour .= 'Fichier : '.$aso_erreur['fichier']."\n";
$retour .= 'Ligne : '.$aso_erreur['ligne']."\n";
} else if ($aso_erreur['niveau'] <= 512) {
$retour .= 'INFO : Niveau '.$aso_erreur['niveau']."\n";
} else {
$retour .= 'ERREUR : Niveau '.$aso_erreur['niveau']."\n";
}
$retour .= 'Niveau : '.$aso_erreur['niveau']."\n";
$retour .= 'Message : '.$aso_erreur['message']."\n";
$retour .= 'Fichier : '.$aso_erreur['fichier']."\n";
$retour .= 'Ligne : '.$aso_erreur['ligne']."\n";
if ($this->getContexte()) {
$retour .= 'Contexte : '."\n".print_r($aso_erreur['contexte'], true)."\n";
}
break;
default:
if ($aso_erreur['niveau'] == E_USER_NOTICE) {
$retour .= '<pre class="debogage">'."\n";
$retour .= htmlentities($aso_erreur['message'])."\n";
$retour .= '<span class="debogage_fichier">'.'Fichier : '.$aso_erreur['fichier'].'</span>'."\n";
$retour .= '<span class="debogage_ligne">'.'Ligne : '.$aso_erreur['ligne'].'</span>'."\n";
$retour .= '</pre>'."\n";
continue;
} else if ($aso_erreur['niveau'] <= 512) {
$retour .= '<p class="information">'."\n";
$retour .= '<strong>INFO : Niveau '.$aso_erreur['niveau'].'</strong><br />'."\n";
} else {
$retour .= '<p class="attention">'."\n";
$retour .= '<strong>ERREUR : Niveau '.$aso_erreur['niveau'].'</strong><br />'."\n";
}
$retour .= '<strong>Niveau : </strong>'.$aso_erreur['niveau'].'<br />'."\n";
$retour .= '<strong>Message : </strong>'.$aso_erreur['message'].'<br />'."\n";
$retour .= '<strong>Fichier : </strong>'.$aso_erreur['fichier'].'<br />'."\n";
$retour .= '<strong>Ligne : </strong>'.$aso_erreur['ligne'].'<br />'."\n";
if ($this->getContexte()) {
$retour .= '<pre>'."\n";
$retour .= '<stong>Contexte : </stong>'."\n".print_r($aso_erreur['contexte'], true)."\n";
$retour .= '</pre>'."\n";
}
$retour .= '</p>'."\n";
}
}
return $retour;
}
 
/**
* Retourne l'erreur SQL formatée en XHTML.
*
* @param string fichier
* @param int ligne
* @param string message
* @param string requete
* @param string autres
* @return string
* @static
* @access public
*/
public static function retournerErreurSql( $fichier, $methode, $message, $requete = null, $autres = null )
{
$retour = '';
switch (php_sapi_name()) {
case 'cli' :
$retour .= 'ERREUR SQL '."\n";
$retour .= 'Fichier : '.$fichier."\n";
$retour .= 'Méthode : '.$methode."\n";
$retour .= 'Message : '.$message."\n";
if (!is_null($requete)) {
$retour .= 'Requete : '."\n";
$retour .= $requete."\n";
}
if (!is_null($autres)) {
$retour .= 'Autres infos : '."\n";
$retour .= $autres."\n";
}
break;
default:
$retour .= '<!-- BEGIN sql -->';
$retour .= '<div id="zone_erreur">'."\n";
$retour .= '<h1 > ERREUR SQL </h1><br />'."\n";
$retour .= '<dl>'."\n";
$retour .= '<dt> Fichier : </dt> ';
$retour .= '<dd> '.$fichier.'</dd>'."\n";
$retour .= '<dt> Méthode : </dt> ';
$retour .= '<dd> '.$methode.'</dd>'."\n";
$retour .= '<dt> Message erreur : </dt> ';
$retour .= '<dd> '.$message.'</dd>'."\n";
if (!is_null($requete)) {
$retour .= '<dt> Requete : </dt> ';
$retour .= '<dd> '.$requete.' </dd>'."\n";
}
if (!is_null($autres)) {
$retour .= '<dt> Autres infos : </dt> ';
$retour .= '<dd> '.$autres.' </dd>'."\n";
}
$retour .= '</dl>'."\n";
$retour .= '</div>'."\n";
$retour .= '<!-- END sql -->'."\n";
}
return $retour;
}
}
?>
/trunk/papyrus/applications/admin_administrateur/index.php
1,9 → 1,9
<?php
/*
* Created on 19 mars 2009
*
* To change the template for this generated file go to
* Window - Preferences - PHPeclipse - PHP - Code Templates
*/
header('Location: admin_administrateur.php');
?>
<?php
/*
* Created on 19 mars 2009
*
* To change the template for this generated file go to
* Window - Preferences - PHPeclipse - PHP - Code Templates
*/
header('Location: admin_administrateur.php');
?>
/trunk/papyrus/applications/admin_administrateur/squelettes/ajout_admin.tpl.html
1,31 → 1,31
<h2> Ajout d'un administrateur</h2>
<form id="modif_admin" action="<?=$base_url.'?&m=ajout_admin_va'?>" method="post">
<fieldset>
<?php if (isset($erreurs['champs'])): ?>
<span class="symbole_obligatoire"> <?=$erreurs['champs'] ?> </span>
<?php endif; ?>
<label for="admin_nom">Nom : </label>
<input type="text" id="admin_nom" name="admin_nom" maxlength="80" tabindex="1" value="<?=$admin['ga_nom'] ?>" />
<label for="admin_prenom">Prénom : </label>
<input type="text" id="admin_prenom" name="admin_prenom" maxlength="80" tabindex="2" value="<?=$admin['ga_prenom'] ?>" />
<label for="admin_mail">Mail : </label>
<input type="text" id="admin_mail" name="admin_mail" maxlength="120" tabindex="3" value="<?=$admin['ga_mail'] ?>" />
<?php if (isset($erreurs['mail'])): ?>
<span class="symbole_obligatoire"> <?=$erreurs['mail'] ?> </span>
<?php endif; ?>
<label for="admin_lang">Langue : </label>
<select id="admin_lang" name="admin_lang" tabindex="4">
<option <?=($admin['ga_ce_i18n'] == "fr-FR") ? 'selected="selected"' : '';?> value="fr-FR"> Français </option>
<option <?=($admin['ga_ce_i18n'] == "en-EN") ? 'selected="selected"' : '';?> value="en-EN"> Anglais </option>
</select>
<label for="password">Mot de passe : </label>
<input type="password" id="admin_pass" name="admin_pass" maxlength="80" tabindex="5" value="<?='' ?>" />
<label for="password_confirm">Confirmez le mot de passe : </label>
<input type="password" id="admin_pass_confirm" name="admin_pass_confirm" maxlength="80" tabindex="6" value="<?='' ?>" />
<?php if (isset($erreurs['pass'])): ?>
<span class="symbole_obligatoire"> <?=$erreurs['pass'] ?> </span>
<?php endif; ?>
</fieldset>
<input type="submit" id="valider_ajout_admin" name="valider_ajout_admin" tabindex="7" value="Ajouter" />
<a href="<?= $base_url.'?m=liste_admin' ?>"> annuler </a>
<h2> Ajout d'un administrateur</h2>
<form id="modif_admin" action="<?=$base_url.'?&m=ajout_admin_va'?>" method="post">
<fieldset>
<?php if (isset($erreurs['champs'])): ?>
<span class="symbole_obligatoire"> <?=$erreurs['champs'] ?> </span>
<?php endif; ?> <br />
<label for="admin_nom">Nom : </label>
<input type="text" id="admin_nom" name="admin_nom" maxlength="80" tabindex="1" value="<?=$admin['ga_nom'] ?>" /> <br />
<label for="admin_prenom">Prénom : </label>
<input type="text" id="admin_prenom" name="admin_prenom" maxlength="80" tabindex="2" value="<?=$admin['ga_prenom'] ?>" /> <br />
<label for="admin_mail">Mail : </label>
<input type="text" id="admin_mail" name="admin_mail" maxlength="120" tabindex="3" value="<?=$admin['ga_mail'] ?>" />
<?php if (isset($erreurs['mail'])): ?>
<span class="symbole_obligatoire"> <?=$erreurs['mail'] ?> </span>
<?php endif; ?> <br />
<label for="admin_lang">Langue : </label>
<select id="admin_lang" name="admin_lang" tabindex="4">
<option <?=($admin['ga_ce_i18n'] == "fr-FR") ? 'selected="selected"' : '';?> value="fr-FR"> Français </option>
<option <?=($admin['ga_ce_i18n'] == "en-EN") ? 'selected="selected"' : '';?> value="en-EN"> Anglais </option>
</select> <br />
<label for="password">Mot de passe : </label>
<input type="password" id="admin_pass" name="admin_pass" maxlength="80" tabindex="5" value="<?='' ?>" /> <br />
<label for="password_confirm">Confirmez le mot de passe : </label>
<input type="password" id="admin_pass_confirm" name="admin_pass_confirm" maxlength="80" tabindex="6" value="<?='' ?>" />
<?php if (isset($erreurs['pass'])): ?>
<span class="symbole_obligatoire"> <?=$erreurs['pass'] ?> </span>
<?php endif; ?> <br />
</fieldset>
<input type="submit" id="valider_ajout_admin" name="valider_ajout_admin" tabindex="7" value="Ajouter" />
<a href="<?= $base_url.'?m=liste_admin' ?>"> annuler </a>
</form>
/trunk/papyrus/applications/admin_administrateur/squelettes/ident_admin.tpl.html
1,11 → 1,11
<p class="zone_alert">Identifiez-vous</p>
<form id="form_connexion" style="clear:both;" class="form_identification" action="<?=$base_url ?>" method="post">
<fieldset>
<legend>Identifiez vous</legend>
<label for="username">Courriel : </label>
<input type="text" id="username" name="username" maxlength="80" tabindex="1" value="courriel" />
<label for="password">Mot de passe : </label>
<input type="password" id="password" name="password" maxlength="80" tabindex="2" value="mot de passe" />
<input type="submit" id="connexion" name="connexion" tabindex="3" value="ok" />
</fieldset>
<p class="zone_alert">Identifiez-vous</p>
<form id="form_connexion" style="clear:both;" class="form_identification" action="<?=$base_url ?>" method="post">
<fieldset>
<legend>Identifiez vous</legend>
<label for="username">Courriel : </label>
<input type="text" id="username" name="username" maxlength="80" tabindex="1" value="courriel" />
<label for="password">Mot de passe : </label>
<input type="password" id="password" name="password" maxlength="80" tabindex="2" value="mot de passe" />
<input type="submit" id="connexion" name="connexion" tabindex="3" value="ok" />
</fieldset>
</form>
/trunk/papyrus/applications/admin_administrateur/squelettes/modif_admin.tpl.html
1,28 → 1,28
<h2> Modification d'un administrateur</h2>
<form id="modif_admin" action="<?=$base_url.'?m=modif_admin_va&id_admin='.$admin['ga_id_administrateur'] ?>" method="post">
<fieldset>
<label for="admin_nom">Nom : </label>
<input type="text" id="admin_nom" name="admin_nom" maxlength="80" tabindex="1" value="<?=$admin['ga_nom'] ?>" />
<label for="admin_prenom">Prénom : </label>
<input type="text" id="admin_prenom" name="admin_prenom" maxlength="80" tabindex="2" value="<?=$admin['ga_prenom'] ?>" />
<label for="admin_mail">Mail : </label>
<input type="text" id="admin_mail" name="admin_mail" maxlength="120" tabindex="3" value="<?=$admin['ga_mail'] ?>" />
<?php if (isset($erreurs['mail'])): ?>
<span class="symbole_obligatoire"> <?=$erreurs['mail'] ?> </span>
<?php endif; ?>
<label for="admin_lang">Langue : </label>
<select id="admin_lang" name="admin_lang" tabindex="4">
<option <?=($admin['ga_ce_i18n'] == "fr-FR") ? 'selected="selected"' : '';?> value="fr-FR"> Français </option>
<option <?=($admin['ga_ce_i18n'] == "en-EN") ? 'selected="selected"' : '';?> value="en-EN"> Anglais </option>
</select>
<label for="password">Mot de passe : </label>
<input type="password" id="admin_pass" name="admin_pass" maxlength="80" tabindex="5" value="<?='' ?>" />
<label for="password_confirm">Confirmez le mot de passe : </label>
<input type="password" id="admin_pass_confirm" name="admin_pass_confirm" maxlength="80" tabindex="6" value="<?='' ?>" />
<?php if (isset($erreurs['pass'])): ?>
<span class="symbole_obligatoire"> <?=$erreurs['pass'] ?> </span>
<?php endif; ?>
</fieldset>
<input type="submit" id="valider_modif_admin" name="valider_modif_admin" tabindex="7" value="Modifier" />
<a href="<?=$base_url.'?m=liste_admin' ?>"> annuler </a>
<h2> Modification d'un administrateur</h2>
<form id="modif_admin" action="<?=$base_url.'?m=modif_admin_va&id_admin='.$admin['ga_id_administrateur'] ?>" method="post">
<fieldset>
<label for="admin_nom">Nom : </label>
<input type="text" id="admin_nom" name="admin_nom" maxlength="80" tabindex="1" value="<?=$admin['ga_nom'] ?>" /> <br />
<label for="admin_prenom">Prénom : </label>
<input type="text" id="admin_prenom" name="admin_prenom" maxlength="80" tabindex="2" value="<?=$admin['ga_prenom'] ?>" /> <br />
<label for="admin_mail">Mail : </label>
<input type="text" id="admin_mail" name="admin_mail" maxlength="120" tabindex="3" value="<?=$admin['ga_mail'] ?>" />
<?php if (isset($erreurs['mail'])): ?>
<span class="symbole_obligatoire"> <?=$erreurs['mail'] ?> </span>
<?php endif; ?> <br />
<label for="admin_lang">Langue : </label>
<select id="admin_lang" name="admin_lang" tabindex="4">
<option <?=($admin['ga_ce_i18n'] == "fr-FR") ? 'selected="selected"' : '';?> value="fr-FR"> Français </option>
<option <?=($admin['ga_ce_i18n'] == "en-EN") ? 'selected="selected"' : '';?> value="en-EN"> Anglais </option>
</select> <br />
<label for="password">Mot de passe : </label>
<input type="password" id="admin_pass" name="admin_pass" maxlength="80" tabindex="5" value="<?='' ?>" /> <br />
<label for="password_confirm">Confirmez le mot de passe : </label>
<input type="password" id="admin_pass_confirm" name="admin_pass_confirm" maxlength="80" tabindex="6" value="<?='' ?>" /> <br />
<?php if (isset($erreurs['pass'])): ?>
<span class="symbole_obligatoire"> <?=$erreurs['pass'] ?> </span>
<?php endif; ?>
</fieldset>
<input type="submit" id="valider_modif_admin" name="valider_modif_admin" tabindex="7" value="Modifier" />
<a href="<?=$base_url.'?m=liste_admin' ?>"> annuler </a>
</form>
/trunk/papyrus/applications/admin_administrateur/squelettes/liste_admin.tpl.html
1,14 → 1,14
<h2> Liste des administrateurs</h2>
<table class="liste_admin">
<th> Identifiant d'admin </th> <th> Nom </th> <th> Prénom </th> <th> Langue </th> <th> </th> <th> </th>
<?php foreach ($admin as $element) : ?>
<tr><td><?=$element['ga_id_administrateur'] ?></td><td><?=$element['ga_nom'] ?></td><td><?=$element['ga_prenom'] ?></td><td><?=$element['ga_ce_i18n'] ?></td><td><a href=<?=$base_url.'?m=modif_admin&id_admin='.$element['ga_id_administrateur'] ?>>Modifier</a></td><td><a href=<?=$base_url.'?m=suppr_admin&id_admin='.$element['ga_id_administrateur'] ?>>Supprimer</a></td></tr>
<?php endforeach; ?>
</table>
<?php if (isset($erreurs['supp'])): ?>
<span class="symbole_obligatoire"> <?=$erreurs['supp'] ?> </span>
<?php endif; ?>
<p>
<a href="<?=$base_url.'?&m=ajout_admin' ?>"> Ajouter un administrateur </a>
<h2> Liste des administrateurs</h2>
<table class="table_cadre">
<th> Identifiant d'admin </th> <th> Nom </th> <th> Prénom </th> <th> Langue </th> <th> </th> <th> </th>
<?php foreach ($admin as $element) : ?>
<tr><td><?=$element['ga_id_administrateur'] ?></td><td><?=$element['ga_nom'] ?></td><td><?=$element['ga_prenom'] ?></td><td><?=$element['ga_ce_i18n'] ?></td><td><a href=<?=$base_url.'?m=modif_admin&id_admin='.$element['ga_id_administrateur'] ?>>Modifier</a></td><td><a href=<?=$base_url.'?m=suppr_admin&id_admin='.$element['ga_id_administrateur'] ?>>Supprimer</a></td></tr>
<?php endforeach; ?>
</table>
<?php if (isset($erreurs['supp'])): ?>
<span class="symbole_obligatoire"> <?=$erreurs['supp'] ?> </span>
<?php endif; ?>
<p>
<a href="<?=$base_url.'?&m=ajout_admin' ?>"> Ajouter un administrateur </a>
</p>
/trunk/papyrus/applications/admin_administrateur/controleurs/AdminAdministrateur.php
1,177 → 1,177
<?php
 
/**
* Classe controleur pour l'application administration des administrateurs
*/
class AdminAdministrateur extends Controleur {
/**
* Fonction d'affichage par défaut, elle appelle la liste des administrateurs
*/
function index() {
$this->charger_admin() ;
}
/**
* Charge la liste des administrateurs et l'envoie à la vue
* @param array un tableau contenant les erreurs à afficher s'il y en a
*/
function chargerAdmin($erreurs = array()) {
 
$this->chargerModele('ListeAdmin');
$data['erreurs'] = $erreurs;
$data['admin'] = $this->ListeAdmin->chargerAdmin();
$this->chargerVue('liste_admin',$data);
 
return $this->liste_admin;
}
/**
* Charge les détails d'un administrateur demandé et l'envoi à la
* vue qui permet de les modifier
*/
function modifAdmin($id) {
$this->chargerModele('ListeAdmin');
$data['admin'] = $this->ListeAdmin->loadDetailsAdmin($id);
$this->chargerVue('modif_admin',$data);
return $this->modif_admin;
}
/**
* Fonction appelée lors de la validation du formulaire de modification
* des détails d'un administrateurs. Elle modifie les détails dans la base
* de données. S'il y a une erreur et rappelle la formulaire et notifie l'erreur,
* sinon elle charge la liste des administrateurs
*/
function modifAdminVa($id,$nom,$prenom,$mail,$lang,$pass,$pass_conf) {
$this->chargerModele('ListeAdmin') ;
$res = $this->ListeAdmin->modifDetailsAdmin($id,$nom,$prenom,$mail,$lang,$pass,$pass_conf) ;
if(count($res) == 0) {
return $this->chargerAdmin() ;
} else {
 
$admin['ga_id_administrateur'] = $id ;
$admin['ga_nom'] = $nom ;
$admin['ga_prenom'] = $prenom ;
$admin['ga_mail'] = $mail ;
$admin['ga_ce_i18n'] = $lang ;
$data['admin'] = $admin ;
$data['erreurs'] = $res ;
$this->chargerVue('modif_admin',$data);
return $this->modif_admin;
}
}
/**
* Supprime un administrateur dans la base de données,
* renvoie la liste des administrateurs, en affichant des erreurs
* s'il y en a.
*
*/
function supprAdmin() {
$id = $_GET['id_admin'] ;
$this->chargerModele('ListeAdmin') ;
$res = $this->ListeAdmin->suppAdmin($id) ;
if($res == '') {
return $this->chargerAdmin() ;
} else {
$erreurs['supp'] = $res ;
return $this->chargerAdmin($erreurs) ;
}
}
/**
* Appelle la vue contenant le formulaire d'ajout d'un administrateur
*/
function ajoutAdmin() {
$admin['ga_id_administrateur'] = '';
$admin['ga_nom'] = '';
$admin['ga_prenom'] = '';
$admin['ga_mail'] = '';
$admin['ga_ce_i18n'] = '';
$data['admin'] = $admin;
$this->chargerVue('ajout_admin',$data);
return $this->ajout_admin;
}
/**
* Fonction appelée lors de la validation du formulaire d'ajout d'un administrateur.
* Elle ajoute celui-ci les dans la base de données
* S'il y a une erreur et rappelle la formulaire et notifie l'erreur,
* sinon elle charge la liste des administrateurs
*/
function ajoutAdminVa($nom,$prenom,$mail,$lang,$pass,$pass_conf) {
if(empty($nom) || empty($prenom) || empty($mail) || empty($pass) || empty($pass_conf)) {
$res = array('champs' => 'Tous les champs sont obligatoires') ;
$data['erreurs'] = $res ;
$admin['ga_nom'] = $nom ;
$admin['ga_prenom'] = $prenom ;
$admin['ga_mail'] = $mail ;
$admin['ga_ce_i18n'] = $lang ;
$data['admin'] = $admin ;
$this->chargerVue('ajout_admin',$data);
return $this->ajout_admin;
}
$this->chargerModele('ListeAdmin') ;
$res = $this->ListeAdmin->ajoutAdmin($nom,$prenom,$mail,$lang,$pass,$pass_conf) ;
if(count($res) == 0) {
return $this->chargerAdmin() ;
} else {
$admin['ga_nom'] = $nom ;
$admin['ga_prenom'] = $prenom ;
$admin['ga_mail'] = $mail ;
$admin['ga_ce_i18n'] = $lang ;
$data['admin'] = $admin ;
$data['erreurs'] = $res ;
$this->chargerVue('ajout_admin',$data);
return $this->ajout_admin;
}
}
/** Apelle le formulaire d'identification (dans le cas où l'utilisateur n'est pas identifié)
*/
function demanderIdent() {
$this->chargerVue('ident_admin',null) ;
return $this->ident_admin;
}
/**
* Renvoie la tête de page de l'application
*/
function adminTete() {
$tete = '<h1>Gestion des administrateurs de Papyrus</h1>';
return $tete;
}
/**
* Renvoie le pied de page de l'application
*/
function adminPied() {
 
$pied = '';
 
return $pied ;
}
}
 
?>
<?php
 
/**
* Classe controleur pour l'application administration des administrateurs
*/
class AdminAdministrateur extends Controleur {
/**
* Fonction d'affichage par défaut, elle appelle la liste des administrateurs
*/
function index() {
$this->charger_admin() ;
}
/**
* Charge la liste des administrateurs et l'envoie à la vue
* @param array un tableau contenant les erreurs à afficher s'il y en a
*/
function chargerAdmin($erreurs = array()) {
 
$this->chargerModele('ListeAdmin');
$data['erreurs'] = $erreurs;
$data['admin'] = $this->ListeAdmin->chargerAdmin();
$this->chargerVue('liste_admin',$data);
 
return $this->liste_admin;
}
/**
* Charge les détails d'un administrateur demandé et l'envoi à la
* vue qui permet de les modifier
*/
function modifAdmin($id) {
$this->chargerModele('ListeAdmin');
$data['admin'] = $this->ListeAdmin->loadDetailsAdmin($id);
$this->chargerVue('modif_admin',$data);
return $this->modif_admin;
}
/**
* Fonction appelée lors de la validation du formulaire de modification
* des détails d'un administrateurs. Elle modifie les détails dans la base
* de données. S'il y a une erreur et rappelle la formulaire et notifie l'erreur,
* sinon elle charge la liste des administrateurs
*/
function modifAdminVa($id,$nom,$prenom,$mail,$lang,$pass,$pass_conf) {
$this->chargerModele('ListeAdmin') ;
$res = $this->ListeAdmin->modifDetailsAdmin($id,$nom,$prenom,$mail,$lang,$pass,$pass_conf) ;
if(count($res) == 0) {
return $this->chargerAdmin() ;
} else {
 
$admin['ga_id_administrateur'] = $id ;
$admin['ga_nom'] = $nom ;
$admin['ga_prenom'] = $prenom ;
$admin['ga_mail'] = $mail ;
$admin['ga_ce_i18n'] = $lang ;
$data['admin'] = $admin ;
$data['erreurs'] = $res ;
$this->chargerVue('modif_admin',$data);
return $this->modif_admin;
}
}
/**
* Supprime un administrateur dans la base de données,
* renvoie la liste des administrateurs, en affichant des erreurs
* s'il y en a.
*
*/
function supprAdmin() {
$id = $_GET['id_admin'] ;
$this->chargerModele('ListeAdmin') ;
$res = $this->ListeAdmin->suppAdmin($id) ;
if($res == '') {
return $this->chargerAdmin() ;
} else {
$erreurs['supp'] = $res ;
return $this->chargerAdmin($erreurs) ;
}
}
/**
* Appelle la vue contenant le formulaire d'ajout d'un administrateur
*/
function ajoutAdmin() {
$admin['ga_id_administrateur'] = '';
$admin['ga_nom'] = '';
$admin['ga_prenom'] = '';
$admin['ga_mail'] = '';
$admin['ga_ce_i18n'] = '';
$data['admin'] = $admin;
$this->chargerVue('ajout_admin',$data);
return $this->ajout_admin;
}
/**
* Fonction appelée lors de la validation du formulaire d'ajout d'un administrateur.
* Elle ajoute celui-ci les dans la base de données
* S'il y a une erreur et rappelle la formulaire et notifie l'erreur,
* sinon elle charge la liste des administrateurs
*/
function ajoutAdminVa($nom,$prenom,$mail,$lang,$pass,$pass_conf) {
if(empty($nom) || empty($prenom) || empty($mail) || empty($pass) || empty($pass_conf)) {
$res = array('champs' => 'Tous les champs sont obligatoires') ;
$data['erreurs'] = $res ;
$admin['ga_nom'] = $nom ;
$admin['ga_prenom'] = $prenom ;
$admin['ga_mail'] = $mail ;
$admin['ga_ce_i18n'] = $lang ;
$data['admin'] = $admin ;
$this->chargerVue('ajout_admin',$data);
return $this->ajout_admin;
}
$this->chargerModele('ListeAdmin') ;
$res = $this->ListeAdmin->ajoutAdmin($nom,$prenom,$mail,$lang,$pass,$pass_conf) ;
if(count($res) == 0) {
return $this->chargerAdmin() ;
} else {
$admin['ga_nom'] = $nom ;
$admin['ga_prenom'] = $prenom ;
$admin['ga_mail'] = $mail ;
$admin['ga_ce_i18n'] = $lang ;
$data['admin'] = $admin ;
$data['erreurs'] = $res ;
$this->chargerVue('ajout_admin',$data);
return $this->ajout_admin;
}
}
/** Apelle le formulaire d'identification (dans le cas où l'utilisateur n'est pas identifié)
*/
function demanderIdent() {
$this->chargerVue('ident_admin',null) ;
return $this->ident_admin;
}
/**
* Renvoie la tête de page de l'application
*/
function adminTete() {
$tete = '<h1>Gestion des administrateurs de Papyrus</h1>';
return $tete;
}
/**
* Renvoie le pied de page de l'application
*/
function adminPied() {
 
$pied = '';
 
return $pied ;
}
}
 
?>
/trunk/papyrus/configuration/pap_config_avancee.inc.php
1,328 → 1,335
<?php
 
//vim: set expandtab tabstop=4 shiftwidth=4:
// +------------------------------------------------------------------------------------------------------+
// | PHP version 4.1 |
// +------------------------------------------------------------------------------------------------------+
// | Copyright (C) 2003 Tela Botanica (accueil@tela-botanica.org) |
// +------------------------------------------------------------------------------------------------------+
// | |
// | This library is free software; you can redistribute it and/or |
// | modify it under the terms of the GNU Lesser General Public |
// | License as published by the Free Software Foundation; either |
// | version 2.1 of the License, or (at your option) any later version. |
// | |
// | This library is distributed in the hope that it will be useful, |
// | but WITHOUT ANY WARRANTY; without even the implied warranty of |
// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
// | Lesser General Public License for more details. |
// | |
// | You should have received a copy of the GNU Lesser General Public |
// | License along with this library; if not, write to the Free Software |
// | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
// | |
// +------------------------------------------------------------------------------------------------------+
// CVS : $Id: pap_config_avancee.inc.php,v 1.31 2007-08-28 14:13:40 jp_milcent Exp $
/**
* Page de configuration avancée de Papyrus
*
* La page contient différents paramètre permettant de configurer, le chronométrage, le débogage, les url...
*
*@package Papyrus
*@subpackage Configuration
//Auteur original :
*@author Jean-Pascal MILCENT <jpm@tela-botanica.org>
//Autres auteurs :
*@author Alexandre GRANIER <alex@tela-botanica.org>
*@author Laurent COUDOUNEAU <laurent.coudouneau@ema.fr>
*@copyright Tela-Botanica 2000-2004
*@version $Revision: 1.31 $ $Date: 2007-08-28 14:13:40 $
// +------------------------------------------------------------------------------------------------------+
*/
 
// +------------------------------------------------------------------------------------------------------+
// | ENTÊTE du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
 
//test au cas ou il s'agirai d'une nouvelle installation ou si le fichier de conf n'existe pas
if (file_exists('papyrus/configuration/pap_config.inc.php') ) {include_once 'papyrus/configuration/pap_config.inc.php';}
if (!defined("PAP_CHEMIN_RACINE")) define('PAP_CHEMIN_RACINE','');
// +------------------------------------------------------------------------------------------------------+
// Paramétrage du mode d'écriture des fichiers sur le serveur
/** Booléen permetant de savoir si on utilise ou pas le ftp. */
define('GEN_FTP_UTILISE', true) ;//ini_get('safe_mode')
 
// +------------------------------------------------------------------------------------------------------+
// | CORPS du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
 
// +------------------------------------------------------------------------------------------------------+
// Paramétrage de la version : NE PAS MODIFIER MANUELLEMENT!
/** Constante stockant la version de Papyrus.*/
define('GEN_VERSION', '0.25');
 
// +------------------------------------------------------------------------------------------------------+
// Paramétrage du débogage.
/** Constante stockant une valeur booléen permettant de savoir si on veut déboguer le code (true) ou pas (false).*/
define('GEN_DEBOGAGE', true);// true ou false
/** Constante permettant de savoir sous quelle forme le débogage va avoir lieu.*/
define('PAP_DEBOGAGE_TYPE', 'FIREBUG');// HTML ou FIREBUG
/** Constante stockant une valeur correspondant au niveau d'erreur à employer pour le code PHP
* de Papyrus et de ses applications.*/
define('GEN_DEBOGAGE_NIVEAU', E_ALL);// Voir le manuel de PHP pour les différents niveaux disponibles.
/** Constante permettant de savoir si on veut afficher le contexte des variables d'une erreur
* pour le code PHP de Papyrus et de ses applications.*/
define('GEN_DEBOGAGE_CONTEXTE', false);// true or false
/** Constante permettant de savoir la langue pour le débogage du code PHP de Papyrus et de ses
* applications.*/
define('GEN_DEBOGAGE_I18N', 'fr');
 
// +------------------------------------------------------------------------------------------------------+
// Paramétrage de l'identification : Auth
$tps = time()+3600*24*30;
/** Constante stockant la durée pendant laquelle on mémorise l'identification via un cookie.*/
define('PAP_AUTH_SESSION_DUREE', (int)$tps);// Mettre 0 pour "dàconnecter en fin de session" sinon utiliser la variable $tps
/** Constante stockant si oui (true) ou non (false) on met en place la sécurité avancée pour l'identification.*/
define('PAP_AUTH_SECURITE_AVANCEE', true);
/** Constante stockant le préfixe pour les noms des sessions Papyrus.*/
define('PAP_AUTH_SESSION_PREFIXE', 'pap-');
 
// +------------------------------------------------------------------------------------------------------+
// Paramétrage du nom du champ servant à identifier un site dans l'url
/** Type du code d'un site passé dans l'url.*/
define('GEN_URL_ID_TYPE_SITE', 'int');// string ou int
/** Type du code d'un menu passé dans l'url.*/
define('GEN_URL_ID_TYPE_MENU', 'int');// string ou int
/** Type du code d'un site pour les urls raccourcies.*/
define('GEN_URL_RACCOURCI_ID_TYPE_SITE', 'string');// string ou int
/** Type du code d'un menu pour les urls raccourcies.*/
define('GEN_URL_RACCOURCI_ID_TYPE_MENU', 'string');// string ou int
 
// +------------------------------------------------------------------------------------------------------+
// Paramétrage des clés de l'url
// Redéfini le séparateur utilisé lorsque PHP génère des URLs pour séparer les arguments. (compatible XHTML strict)
ini_set('arg_separator.output', '&amp;');
/** Nom de la variable passée dans l'url et contenant l'identifiant d'un site.*/
define('GEN_URL_CLE_SITE', 'site');
/** Nom de la variable passée dans l'url et contenant l'identifiant d'un menu.*/
define('GEN_URL_CLE_MENU', 'menu');
/** Nom de la variable passée dans l'url et contenant l'identifiant d'une internationalisation.*/
define('GEN_URL_CLE_I18N', 'langue');
/** Nom de la variable passée dans l'url et contenant une date.*/
define('GEN_URL_CLE_DATE', 'date');
/** Nom de la variable passée dans l'url et contenant un format.*/
define('GEN_URL_CLE_FORMAT', 'format');
 
// +------------------------------------------------------------------------------------------------------+
// Paramétrage des langues
/** Identifiant de l'I18N par défaut de Papyrus. */
define('GEN_I18N_ID_DEFAUT', 'fr');
 
// +------------------------------------------------------------------------------------------------------+
// Noms des sites
/** Nom du site par défaut d'administration de Papyrus.*/
define('GEN_SITE_DEFAUT', 'admin');
 
// +------------------------------------------------------------------------------------------------------+
// Paramétrage réecriture d'URL et erreur HTTP
/** Mot signalant une réecriture d'url présent à la base de l'url. */
define('PAP_URL_REECRITURE_MENU', 'page');
/** Mot signalant une réecriture d'url présent à la base de l'url. */
define('PAP_URL_REECRITURE_SITE', 'site');
/** Caractère séparant les informations constituant le permalien Papyrus. */
// Si vous utilisez "/", vous devrez indiquer le chemin depuis la racine pour les chemins présent dans les squelettes.
// Exemple : "/sites/commun..." et non "sites/commun..."
define('PAP_URL_REECRITURE_SEP', ':');
 
// +------------------------------------------------------------------------------------------------------+
/** Séparateur dans les chemins d'accès aux fichiers.*/
define('GEN_SEP', '/');
/** Chemin relatif par rapport au fichier papyrus.php vers le dossier contenant les fichiers des api.*/
define('GEN_CHEMIN_API', PAP_CHEMIN_RACINE.'api'.GEN_SEP);
/** Chemin relatif par rapport au fichier papyrus.php vers le dossier contenant les fichiers des api.*/
define('PAP_CHEMIN_API_PEAR', GEN_CHEMIN_API.'pear'.GEN_SEP);
/** Chemin relatif par rapport au fichier papyrus.php vers le dossier contenant le reste de l'application Papyrus.*/
define('GEN_CHEMIN_PAP', 'papyrus'.GEN_SEP);
/** Chemin relatif par rapport au fichier papyrus.php vers le dossier contenant les applications clientes.*/
define('GEN_CHEMIN_CLIENT', 'client'.GEN_SEP);
/** Chemin relatif par rapport au fichier papyrus.php vers le dossier contenant les fichiers des sites.*/
define('GEN_CHEMIN_SITES', 'sites'.GEN_SEP);
/** Chemin relatif par rapport au fichier papyrus.php vers le dossier contenant les fichiers de configuration de Papyrus.*/
define('GEN_CHEMIN_CONFIG', GEN_CHEMIN_PAP.'configuration'.GEN_SEP);
/** Chemin relatif par rapport au fichier papyrus.php vers le dossier contenant les fichiers sql d'installation de Papyrus.*/
define('GEN_CHEMIN_INSTAL', GEN_CHEMIN_PAP.'installation'.GEN_SEP);
/** Chemin relatif par rapport au fichier papyrus.php vers le dossier contenant les applications internes à Papyrus.*/
define('GEN_CHEMIN_APPLICATION', GEN_CHEMIN_PAP.'applications'.GEN_SEP);
/** Chemin relatif par rapport au fichier papyrus.php vers le dossier contenant les applettes.*/
define('GEN_CHEMIN_APPLETTE', GEN_CHEMIN_PAP.'applettes'.GEN_SEP);
/** Chemin relatif par rapport au fichier papyrus.php vers le dossier contenant la bibliothèque de codes de Papyrus.*/
define('GEN_CHEMIN_BIBLIO', GEN_CHEMIN_PAP.'bibliotheque'.GEN_SEP.'fonctions'.GEN_SEP);
/** Chemin relatif par rapport au fichier papyrus.php vers le dossier contenant la bibliothèque de codes de Papyrus.*/
define('GEN_CHEMIN_BIBLIO_CLASSE', GEN_CHEMIN_PAP.'bibliotheque'.GEN_SEP.'classes'.GEN_SEP);
/** Chemin relatif par rapport au fichier papyrus.php vers le dossier contenant les traductions de Papyrus.*/
define('GEN_CHEMIN_LANGUE', GEN_CHEMIN_PAP.'langues'.GEN_SEP);
/** Chemin vers le dossier Commun des sites.*/
define('GEN_CHEMIN_COMMUN', GEN_CHEMIN_SITES.'commun'.GEN_SEP);
/** Chemin vers le dossier contenant des fichiers temporaires.*/
define('GEN_CHEMIN_TMP', 'tmp');
 
// +------------------------------------------------------------------------------------------------------+
// Nom des dossiers d'un site présent dans le dossier de langue.
/** Nom du dossier contenant les squelettes d'un site donné.*/
define('GEN_DOSSIER_SQUELETTE', 'squelettes');
/** Nom du dossier contenant les feuilles de styles d'un site donné.*/
define('GEN_DOSSIER_STYLE', 'styles');
/** Nom du dossier contenant les scripts côté client d'un site donné.*/
define('GEN_DOSSIER_SCRIPT', 'scripts');
/** Nom du dossier contenant les images d'un site donné.*/
define('GEN_DOSSIER_IMAGE', 'images');
/** Nom du dossier contenant les documents d'un site donné.*/
define('GEN_DOSSIER_DOC', 'documents');
/** Nom du dossier contenant des dossiers et fichiers communs à plusieurs langues.*/
define('GEN_DOSSIER_GENERIQUE', 'generique');
 
// +------------------------------------------------------------------------------------------------------+
// Nom des fichiers par défaut d'un site présent dans le dossier de langue.
/** Nom du fichier de configuration principal de Papyrus.*/
define('GEN_FICHIER_CONFIG', 'pap_config.inc.php');
/** Nom du fichier squelette par défaut d'un site donné.*/
define('GEN_FICHIER_SQUELETTE', 'defaut.html');
/** Nom du fichier de styles par défaut d'un site donné.*/
define('GEN_FICHIER_STYLE', 'defaut.css');
/** Chemin relatif par rapport au fichier papyrus.php vers le dossier contenant les fichiers des wikini*/
define('GEN_CHEMIN_WIKINI', 'wikini'.GEN_SEP);
 
 
// +------------------------------------------------------------------------------------------------------+
// Nom des styles de Papyrus.
/** Style erreur.*/
define('GEN_CSS_ERREUR', 'pap_erreur');
// +------------------------------------------------------------------------------------------------------+
//Gestion des actions Papyrus
 
/** Les sites correspodant aux liens interwiki. */
$GLOBALS['_PAPYRUS_']['interwiki_sites'] = array(
'Papyrus' => 'http://'.$_SERVER['HTTP_HOST'].'/'.$_SERVER['PHP_SELF'].'?menu=%s',
'Weflore' => 'http://wiki.tela-botanica.org/eflore/wakka.php?wiki=%s',
'Wikipedia' => 'http://fr.wikipedia.org/wiki/%s',
'Wikipedia_fr' => 'http://fr.wikipedia.org/wiki/%s'
);
 
/** Les sites correspodant à l'action inclure. */
$GLOBALS['_PAPYRUS_']['inclure_sites'] = array(
'Papyrus' => array('preg' => '/<!-- start contenu -->(.*)<!-- end contenu -->/Umsi', 'url' => 'http://'.$_SERVER['HTTP_HOST'].'/'.$_SERVER['PHP_SELF'].'?menu=%s'),
'Wikipedia' => array('preg' => '/<!-- start content -->(.*)<!-- end content -->/Umsi', 'url' => 'http://fr.wikipedia.org/wiki/%s'),
'Wikipedia_fr' => array('preg' => '/<!-- start content -->(.*)<!-- end content -->/Umsi', 'url' => 'http://fr.wikipedia.org/wiki/%s'),
'Wikipedia_en' => array('preg' => '/<!-- start content -->(.*)<!-- end content -->/Umsi', 'url' => 'http://en.wikipedia.org/wiki/%s'),
'Wikini_eFlore' => array('preg' => '/<div class="page">(.*)<\/div>.*<div class="commentsheader">/Umsi', 'url' => 'http://www.tela-botanica.org/wikini/eflore/wakka.php?wiki=%s'),
'Wikini_isff' => array('preg' => '/<div class="page">(.*)<\/div>.*<div class="commentsheader">/Umsi', 'url' => 'http://www.tela-botanica.org/wikini/isff/wakka.php?wiki=%s')
);
/* +--Fin du code ---------------------------------------------------------------------------------------+
* $Log: not supported by cvs2svn $
* Revision 1.30 2007-04-19 16:54:24 neiluj
* changement de version
*
* Revision 1.29 2007/03/01 11:07:19 jp_milcent
* Gestion de la constante définissant le type de débogage.
*
* Revision 1.28 2006/12/14 15:01:05 jp_milcent
* Utilisation d'un système permettant de mémoriser les idenitifications.
* Passage à Auth 1.4.3 et DB 1.7.6.
*
* Revision 1.27 2006/11/20 17:48:33 jp_milcent
* Mise à 0 de PAP_AUTH_SESSION_DUREE pour garder la compatibilité avec les anciennes installations.
*
* Revision 1.26 2006/11/20 17:29:04 jp_milcent
* Ajout d'une constante permettant de gérer la durée des session de Papyrus.
*
* Revision 1.25 2006/10/26 16:29:52 jp_milcent
* Correction erreur redirection en boucle.
*
* Revision 1.24 2006/10/18 10:18:04 jp_milcent
* Gestion des erreurs HTTP par Papyrus.
*
* Revision 1.23 2006/10/11 18:04:11 jp_milcent
* Gestion avancée de la réecriture d'URL.
*
* Revision 1.22 2006/10/05 13:17:47 ddelon
* Changement Version Papyrus : 0.21 --> 0.24
*
* Revision 1.21 2006/09/13 12:31:18 florian
* ménage: fichier de config Papyrus, fichiers temporaires
*
* Revision 1.20 2006/04/28 12:41:49 florian
* corrections erreurs chemin
*
* Revision 1.19 2006/03/13 21:00:20 ddelon
* Suppression messages d'erreur multilinguisme
*
* Revision 1.18 2006/03/02 10:49:49 ddelon
* Fusion branche multilinguisme dans branche principale
*
* Revision 1.17.2.1 2005/12/01 23:31:57 ddelon
* Merge Head vers multilinguisme
*
* Revision 1.14 2005/04/18 16:40:39 jpm
* Ajout de constantes pour contrôler les permaliens.
*
* Revision 1.12 2005/04/06 13:22:58 jpm
* Ajout du chemin vers l'API PEAR présente dans le dossier api.
*
* Revision 1.11 2005/02/28 11:12:24 jpm
* Modification des auteurs.
*
* Revision 1.10 2005/02/17 17:56:33 jpm
* Changement de version de 0.2 à 0.21.
*
* Revision 1.9 2004/10/25 16:26:19 jpm
* Changement de la valeur de la variable GEN_VERSION.
*
* Revision 1.8 2004/10/22 17:22:41 jpm
* Modification du au changement de place de l'inclusion de ce fichier dans Papyrus.
*
* Revision 1.7 2004/10/21 18:16:18 jpm
* Ajout de contantes pour le débogage et corrections de commentaires.
*
* Revision 1.6 2004/10/19 16:00:23 jpm
* Extraction de constante pour ajout dans le fichier de conf géré par l'installateur de Papyrus.
* Ajout de nouvelles constantes.
*
* Revision 1.4 2004/10/14 16:37:04 jpm
* Correction.
*
* Revision 1.3 2004/09/13 17:09:25 jpm
* Redéfini le séparateur utilisé lorsque PHP génère des URLs pour séparer les arguments. (compatible XHTML strict)
*
* Revision 1.2 2004/06/16 15:06:45 jpm
* Ajout de constantes de chemin.
*
* Revision 1.1 2004/06/15 15:19:56 jpm
* Changement de nom et d'arborescence de Genesia en Papyrus.
*
* Revision 1.10 2004/05/06 11:14:56 jpm
* Ajout de nouvelles constantes.
*
* Revision 1.8 2004/04/01 11:26:27 jpm
* Ajout et modification de commentaires pour PhpDocumentor.
*
* Revision 1.7 2004/03/31 16:55:44 jpm
* Ajout de constant gérant l'url.
*
* Revision 1.6 2004/03/27 11:09:21 jpm
* Transformation de variable en constante.
*
* Revision 1.5 2004/03/22 10:58:59 jpm
* Ajout de commentaires.
*
* Revision 1.4 2003/12/16 16:57:59 alex
* mise à jour pour compatibilité avec genesia
*
* Revision 1.3 2003/12/05 14:35:41 alex
* en cours
*
* Revision 1.2 2003/11/24 15:19:52 jpm
* Mise en conformité avec la convention de codage.
*
* +--Fin du code ----------------------------------------------------------------------------------------+
*/
?>
<?php
 
//vim: set expandtab tabstop=4 shiftwidth=4:
// +------------------------------------------------------------------------------------------------------+
// | PHP version 4.1 |
// +------------------------------------------------------------------------------------------------------+
// | Copyright (C) 2003 Tela Botanica (accueil@tela-botanica.org) |
// +------------------------------------------------------------------------------------------------------+
// | |
// | This library is free software; you can redistribute it and/or |
// | modify it under the terms of the GNU Lesser General Public |
// | License as published by the Free Software Foundation; either |
// | version 2.1 of the License, or (at your option) any later version. |
// | |
// | This library is distributed in the hope that it will be useful, |
// | but WITHOUT ANY WARRANTY; without even the implied warranty of |
// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
// | Lesser General Public License for more details. |
// | |
// | You should have received a copy of the GNU Lesser General Public |
// | License along with this library; if not, write to the Free Software |
// | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
// | |
// +------------------------------------------------------------------------------------------------------+
// CVS : $Id: pap_config_avancee.inc.php,v 1.31 2007-08-28 14:13:40 jp_milcent Exp $
/**
* Page de configuration avanc�e de Papyrus
*
* La page contient diff�rents param�tre permettant de configurer, le chronom�trage, le d�bogage, les url...
*
*@package Papyrus
*@subpackage Configuration
//Auteur original :
*@author Jean-Pascal MILCENT <jpm@tela-botanica.org>
//Autres auteurs :
*@author Alexandre GRANIER <alex@tela-botanica.org>
*@author Laurent COUDOUNEAU <laurent.coudouneau@ema.fr>
*@copyright Tela-Botanica 2000-2004
*@version $Revision: 1.31 $ $Date: 2007-08-28 14:13:40 $
// +------------------------------------------------------------------------------------------------------+
*/
 
// +------------------------------------------------------------------------------------------------------+
// | ENT�TE du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
 
//test au cas ou il s'agirai d'une nouvelle installation ou si le fichier de conf n'existe pas
if (file_exists('papyrus/configuration/pap_config.inc.php') ) {include_once 'papyrus/configuration/pap_config.inc.php';}
if (!defined("PAP_CHEMIN_RACINE")) define('PAP_CHEMIN_RACINE','');
// +------------------------------------------------------------------------------------------------------+
// Param�trage du mode d'�criture des fichiers sur le serveur
/** Bool�en permetant de savoir si on utilise ou pas le ftp. */
define('GEN_FTP_UTILISE', true) ;//ini_get('safe_mode')
 
// +------------------------------------------------------------------------------------------------------+
// | CORPS du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
 
// +------------------------------------------------------------------------------------------------------+
// Param�trage de la version : NE PAS MODIFIER MANUELLEMENT!
/** Constante stockant la version de Papyrus.*/
define('GEN_VERSION', '0.25');
 
// +------------------------------------------------------------------------------------------------------+
// Param�trage du d�bogage.
/** Constante stockant une valeur bool�en permettant de savoir si on veut d�boguer le code (true) ou pas (false).*/
define('GEN_DEBOGAGE', true);// true ou false
/** Constante permettant de savoir sous quelle forme le d�bogage va avoir lieu.*/
define('PAP_DEBOGAGE_TYPE', 'FIREBUG');// HTML ou FIREBUG
/** Constante stockant une valeur correspondant au niveau d'erreur � employer pour le code PHP
* de Papyrus et de ses applications.*/
define('GEN_DEBOGAGE_NIVEAU', E_ALL);// Voir le manuel de PHP pour les diff�rents niveaux disponibles.
/** Constante permettant de savoir si on veut afficher le contexte des variables d'une erreur
* pour le code PHP de Papyrus et de ses applications.*/
define('GEN_DEBOGAGE_CONTEXTE', false);// true or false
/** Constante permettant de savoir la langue pour le d�bogage du code PHP de Papyrus et de ses
* applications.*/
define('GEN_DEBOGAGE_I18N', 'fr');
 
// +------------------------------------------------------------------------------------------------------+
// Param�trage de l'identification : Auth
$tps = time()+3600*24*30;
/** Constante stockant la dur�e pendant laquelle on m�morise l'identification via un cookie.*/
define('PAP_AUTH_SESSION_DUREE', (int)$tps);// Mettre 0 pour "d�connecter en fin de session" sinon utiliser la variable $tps
/** Constante stockant si oui (true) ou non (false) on met en place la s�curit� avanc�e pour l'identification.*/
define('PAP_AUTH_SECURITE_AVANCEE', false);
/** Constante stockant le pr�fixe pour les noms des sessions Papyrus.*/
define('PAP_AUTH_SESSION_PREFIXE', 'pap-');
 
// +------------------------------------------------------------------------------------------------------+
// Param�trage du nom du champ servant � identifier un site dans l'url
/** Type du code d'un site pass� dans l'url.*/
define('GEN_URL_ID_TYPE_SITE', 'int');// string ou int
/** Type du code d'un menu pass� dans l'url.*/
define('GEN_URL_ID_TYPE_MENU', 'int');// string ou int
/** Type du code d'un site pour les urls raccourcies.*/
define('GEN_URL_RACCOURCI_ID_TYPE_SITE', 'string');// string ou int
/** Type du code d'un menu pour les urls raccourcies.*/
define('GEN_URL_RACCOURCI_ID_TYPE_MENU', 'string');// string ou int
 
// +------------------------------------------------------------------------------------------------------+
// Param�trage des cl�s de l'url
// Red�fini le s�parateur utilis� lorsque PHP g�n�re des URLs pour s�parer les arguments. (compatible XHTML strict)
ini_set('arg_separator.output', '&amp;');
/** Nom de la variable pass�e dans l'url et contenant l'identifiant d'un site.*/
define('GEN_URL_CLE_SITE', 'site');
/** Nom de la variable pass�e dans l'url et contenant l'identifiant d'un menu.*/
define('GEN_URL_CLE_MENU', 'menu');
/** Nom de la variable pass�e dans l'url et contenant l'identifiant d'une internationalisation.*/
define('GEN_URL_CLE_I18N', 'langue');
/** Nom de la variable pass�e dans l'url et contenant une date.*/
define('GEN_URL_CLE_DATE', 'date');
/** Nom de la variable pass�e dans l'url et contenant un format.*/
define('GEN_URL_CLE_FORMAT', 'format');
 
// +------------------------------------------------------------------------------------------------------+
// Param�trage des langues
/** Identifiant de l'I18N par d�faut de Papyrus. */
define('GEN_I18N_ID_DEFAUT', 'fr');
 
// +------------------------------------------------------------------------------------------------------+
// Noms des sites
/** Nom du site par d�faut d'administration de Papyrus.*/
define('GEN_SITE_DEFAUT', 'admin');
 
// +------------------------------------------------------------------------------------------------------+
// Param�trage r�ecriture d'URL et erreur HTTP
/** Mot signalant une r�ecriture d'url pr�sent � la base de l'url. */
define('PAP_URL_REECRITURE_MENU', 'page');
/** Mot signalant une r�ecriture d'url pr�sent � la base de l'url. */
define('PAP_URL_REECRITURE_SITE', 'site');
/** Caract�re s�parant les informations constituant le permalien Papyrus. */
// Si vous utilisez "/", vous devrez indiquer le chemin depuis la racine pour les chemins pr�sent dans les squelettes.
// Exemple : "/sites/commun..." et non "sites/commun..."
define('PAP_URL_REECRITURE_SEP', ':');
/** Chemin et nom du fichier affichant une erreur HTTP.*/
define('PAP_FICHIER_ERREUR_HTTP', PAP_CHEMIN_RACINE.'sites/commun/%s/http_erreurs/erreur%s.php');
/** URL absolue du fichier affichant une erreur HTTP.*/
define('PAP_URL_ERREUR_HTTP', '/sites/commun/%s/http_erreurs/erreur%s.php?url=%s');
 
// +------------------------------------------------------------------------------------------------------+
/** S�parateur dans les chemins d'acc�s aux fichiers.*/
define('GEN_SEP', '/');
/** Chemin relatif par rapport au fichier papyrus.php vers le dossier contenant les fichiers des api.*/
define('GEN_CHEMIN_API', PAP_CHEMIN_RACINE.'api'.GEN_SEP);
/** Chemin relatif par rapport au fichier papyrus.php vers le dossier contenant les fichiers des api.*/
define('PAP_CHEMIN_API_PEAR', GEN_CHEMIN_API.'pear'.GEN_SEP);
/** Chemin relatif par rapport au fichier papyrus.php vers le dossier contenant le reste de l'application Papyrus.*/
define('GEN_CHEMIN_PAP', 'papyrus'.GEN_SEP);
/** Chemin relatif par rapport au fichier papyrus.php vers le dossier contenant les applications clientes.*/
define('GEN_CHEMIN_CLIENT', 'client'.GEN_SEP);
/** Chemin relatif par rapport au fichier papyrus.php vers le dossier contenant les fichiers des sites.*/
define('GEN_CHEMIN_SITES', 'sites'.GEN_SEP);
/** Chemin relatif par rapport au fichier papyrus.php vers le dossier contenant les fichiers de configuration de Papyrus.*/
define('GEN_CHEMIN_CONFIG', GEN_CHEMIN_PAP.'configuration'.GEN_SEP);
/** Chemin relatif par rapport au fichier papyrus.php vers le dossier contenant les fichiers sql d'installation de Papyrus.*/
define('GEN_CHEMIN_INSTAL', GEN_CHEMIN_PAP.'installation'.GEN_SEP);
/** Chemin relatif par rapport au fichier papyrus.php vers le dossier contenant les applications internes � Papyrus.*/
define('GEN_CHEMIN_APPLICATION', GEN_CHEMIN_PAP.'applications'.GEN_SEP);
/** Chemin relatif par rapport au fichier papyrus.php vers le dossier contenant les applettes.*/
define('GEN_CHEMIN_APPLETTE', GEN_CHEMIN_PAP.'applettes'.GEN_SEP);
/** Chemin relatif par rapport au fichier papyrus.php vers le dossier contenant la biblioth�que de codes de Papyrus.*/
define('GEN_CHEMIN_BIBLIO', GEN_CHEMIN_PAP.'bibliotheque'.GEN_SEP.'fonctions'.GEN_SEP);
/** Chemin relatif par rapport au fichier papyrus.php vers le dossier contenant la biblioth�que de codes de Papyrus.*/
define('GEN_CHEMIN_BIBLIO_CLASSE', GEN_CHEMIN_PAP.'bibliotheque'.GEN_SEP.'classes'.GEN_SEP);
/** Chemin relatif par rapport au fichier papyrus.php vers le dossier contenant les traductions de Papyrus.*/
define('GEN_CHEMIN_LANGUE', GEN_CHEMIN_PAP.'langues'.GEN_SEP);
/** Chemin vers le dossier Commun des sites.*/
define('GEN_CHEMIN_COMMUN', GEN_CHEMIN_SITES.'commun'.GEN_SEP);
/** Chemin vers le dossier contenant des fichiers temporaires.*/
define('GEN_CHEMIN_TMP', 'tmp');
 
// +------------------------------------------------------------------------------------------------------+
// Nom des dossiers d'un site pr�sent dans le dossier de langue.
/** Nom du dossier contenant les squelettes d'un site donn�.*/
define('GEN_DOSSIER_SQUELETTE', 'squelettes');
/** Nom du dossier contenant les feuilles de styles d'un site donn�.*/
define('GEN_DOSSIER_STYLE', 'styles');
/** Nom du dossier contenant les scripts c�t� client d'un site donn�.*/
define('GEN_DOSSIER_SCRIPT', 'scripts');
/** Nom du dossier contenant les images d'un site donn�.*/
define('GEN_DOSSIER_IMAGE', 'images');
/** Nom du dossier contenant les documents d'un site donn�.*/
define('GEN_DOSSIER_DOC', 'documents');
/** Nom du dossier contenant des dossiers et fichiers communs � plusieurs langues.*/
define('GEN_DOSSIER_GENERIQUE', 'generique');
 
// +------------------------------------------------------------------------------------------------------+
// Nom des fichiers par d�faut d'un site pr�sent dans le dossier de langue.
/** Nom du fichier de configuration principal de Papyrus.*/
define('GEN_FICHIER_CONFIG', 'pap_config.inc.php');
/** Nom du fichier squelette par d�faut d'un site donn�.*/
define('GEN_FICHIER_SQUELETTE', 'defaut.html');
/** Nom du fichier de styles par d�faut d'un site donn�.*/
define('GEN_FICHIER_STYLE', 'defaut.css');
/** Chemin relatif par rapport au fichier papyrus.php vers le dossier contenant les fichiers des wikini*/
define('GEN_CHEMIN_WIKINI', 'wikini'.GEN_SEP);
 
 
// +------------------------------------------------------------------------------------------------------+
// Nom des styles de Papyrus.
/** Style erreur.*/
define('GEN_CSS_ERREUR', 'pap_erreur');
// +------------------------------------------------------------------------------------------------------+
//Gestion des actions Papyrus
 
/** Les sites correspodant aux liens interwiki. */
$GLOBALS['_PAPYRUS_']['interwiki_sites'] = array(
'Papyrus' => 'http://'.$_SERVER['HTTP_HOST'].'/'.$_SERVER['PHP_SELF'].'?menu=%s',
'Weflore' => 'http://wiki.tela-botanica.org/eflore/wakka.php?wiki=%s',
'Wikipedia' => 'http://fr.wikipedia.org/wiki/%s',
'Wikipedia_fr' => 'http://fr.wikipedia.org/wiki/%s'
);
 
/** Les sites correspodant � l'action inclure. */
$GLOBALS['_PAPYRUS_']['inclure_sites'] = array(
'Papyrus' => array('preg' => '/<!-- start contenu -->(.*)<!-- end contenu -->/Umsi', 'url' => 'http://'.$_SERVER['HTTP_HOST'].'/'.$_SERVER['PHP_SELF'].'?menu=%s'),
'Wikipedia' => array('preg' => '/<!-- start content -->(.*)<!-- end content -->/Umsi', 'url' => 'http://fr.wikipedia.org/wiki/%s'),
'Wikipedia_fr' => array('preg' => '/<!-- start content -->(.*)<!-- end content -->/Umsi', 'url' => 'http://fr.wikipedia.org/wiki/%s'),
'Wikipedia_en' => array('preg' => '/<!-- start content -->(.*)<!-- end content -->/Umsi', 'url' => 'http://en.wikipedia.org/wiki/%s'),
'Wikini_eFlore' => array('preg' => '/<div class="page">(.*)<\/div>.*<div class="commentsheader">/Umsi', 'url' => 'http://www.tela-botanica.org/wikini/eflore/wakka.php?wiki=%s'),
'Wikini_isff' => array('preg' => '/<div class="page">(.*)<\/div>.*<div class="commentsheader">/Umsi', 'url' => 'http://www.tela-botanica.org/wikini/isff/wakka.php?wiki=%s')
);
/* +--Fin du code ---------------------------------------------------------------------------------------+
* $Log: pap_config_avancee.inc.php,v $
* Revision 1.31 2007-08-28 14:13:40 jp_milcent
* Modifications pour permettre à l'applette Inclure de fonctionner!
*
* Revision 1.30 2007-04-19 16:54:24 neiluj
* changement de version
*
* Revision 1.29 2007/03/01 11:07:19 jp_milcent
* Gestion de la constante d�finissant le type de d�bogage.
*
* Revision 1.28 2006/12/14 15:01:05 jp_milcent
* Utilisation d'un syst�me permettant de m�moriser les idenitifications.
* Passage � Auth 1.4.3 et DB 1.7.6.
*
* Revision 1.27 2006/11/20 17:48:33 jp_milcent
* Mise � 0 de PAP_AUTH_SESSION_DUREE pour garder la compatibilit� avec les anciennes installations.
*
* Revision 1.26 2006/11/20 17:29:04 jp_milcent
* Ajout d'une constante permettant de g�rer la dur�e des session de Papyrus.
*
* Revision 1.25 2006/10/26 16:29:52 jp_milcent
* Correction erreur redirection en boucle.
*
* Revision 1.24 2006/10/18 10:18:04 jp_milcent
* Gestion des erreurs HTTP par Papyrus.
*
* Revision 1.23 2006/10/11 18:04:11 jp_milcent
* Gestion avanc�e de la r�ecriture d'URL.
*
* Revision 1.22 2006/10/05 13:17:47 ddelon
* Changement Version Papyrus : 0.21 --> 0.24
*
* Revision 1.21 2006/09/13 12:31:18 florian
* ménage: fichier de config Papyrus, fichiers temporaires
*
* Revision 1.20 2006/04/28 12:41:49 florian
* corrections erreurs chemin
*
* Revision 1.19 2006/03/13 21:00:20 ddelon
* Suppression messages d'erreur multilinguisme
*
* Revision 1.18 2006/03/02 10:49:49 ddelon
* Fusion branche multilinguisme dans branche principale
*
* Revision 1.17.2.1 2005/12/01 23:31:57 ddelon
* Merge Head vers multilinguisme
*
* Revision 1.14 2005/04/18 16:40:39 jpm
* Ajout de constantes pour contr�ler les permaliens.
*
* Revision 1.12 2005/04/06 13:22:58 jpm
* Ajout du chemin vers l'API PEAR pr�sente dans le dossier api.
*
* Revision 1.11 2005/02/28 11:12:24 jpm
* Modification des auteurs.
*
* Revision 1.10 2005/02/17 17:56:33 jpm
* Changement de version de 0.2 � 0.21.
*
* Revision 1.9 2004/10/25 16:26:19 jpm
* Changement de la valeur de la variable GEN_VERSION.
*
* Revision 1.8 2004/10/22 17:22:41 jpm
* Modification du au changement de place de l'inclusion de ce fichier dans Papyrus.
*
* Revision 1.7 2004/10/21 18:16:18 jpm
* Ajout de contantes pour le d�bogage et corrections de commentaires.
*
* Revision 1.6 2004/10/19 16:00:23 jpm
* Extraction de constante pour ajout dans le fichier de conf g�r� par l'installateur de Papyrus.
* Ajout de nouvelles constantes.
*
* Revision 1.4 2004/10/14 16:37:04 jpm
* Correction.
*
* Revision 1.3 2004/09/13 17:09:25 jpm
* Red�fini le s�parateur utilis� lorsque PHP g�n�re des URLs pour s�parer les arguments. (compatible XHTML strict)
*
* Revision 1.2 2004/06/16 15:06:45 jpm
* Ajout de constantes de chemin.
*
* Revision 1.1 2004/06/15 15:19:56 jpm
* Changement de nom et d'arborescence de Genesia en Papyrus.
*
* Revision 1.10 2004/05/06 11:14:56 jpm
* Ajout de nouvelles constantes.
*
* Revision 1.8 2004/04/01 11:26:27 jpm
* Ajout et modification de commentaires pour PhpDocumentor.
*
* Revision 1.7 2004/03/31 16:55:44 jpm
* Ajout de constant g�rant l'url.
*
* Revision 1.6 2004/03/27 11:09:21 jpm
* Transformation de variable en constante.
*
* Revision 1.5 2004/03/22 10:58:59 jpm
* Ajout de commentaires.
*
* Revision 1.4 2003/12/16 16:57:59 alex
* mise à jour pour compatibilité avec genesia
*
* Revision 1.3 2003/12/05 14:35:41 alex
* en cours
*
* Revision 1.2 2003/11/24 15:19:52 jpm
* Mise en conformit� avec la convention de codage.
*
* +--Fin du code ----------------------------------------------------------------------------------------+
*/
?>
/trunk/papyrus/documentation/bdd_papyrus.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/papyrus/documentation/modele/images/modele_papyrus_general.png
8,11 → 8,11
®Á5¸æ­É®TÀÔ5@!„B!„B!„Ðݲ\Q•NÓ+;„B!„z-WTe—ïµq[¸×d×8÷;›v5±ë@!„ÐâQ¤R)„Å!„B!„(ËU·®Ý(³QÉqS$IJ¼J)©R;'Ëôü0v]n”Ú=Õ5($ ¥¤ s]^º;Ô°…UU¨¤„Ä®ÖÈIJ
-Çb¼˜ (–ãj_0̼Y3ð‘ž4™7³³ìr6Û{ï3µÚ¸úª@„°ïH T:û^}f•Ì{»Cö÷l³odÁÃ^ØcD!„BÝ»J¦}ÊävËüÑP¶qìz.ýÞ{]ː:Ûï\–C1‰S¥¤H’Ð$!‚’‚¤ J€ä´åô²ó?.„B-iú øÄ/ª8ÃË&¶’‘%!6|›öY¹eS[ ç°Î8ûý,·×Õꘅ+ÃßáAŀ4"LèÙ%óia¡ÂÎMÍ/ì1"„B!„îM
-…âÆ?ËM!‹ÐB ]’BWˆi­JJBD’™›–jÆ2B!„î ÊT*%‚}Î9(VèlM™áç*†c9Ž:ä ämM\v3zÍfó\fCšåö†-ú²ÛÌÖ ýBt¿µÄø‡¿ÍOÎgî¦;öB#B!„Bè^–Êl ,•*%IRâUªä¾PrßEîš*Ù5¹c]—Þ÷ŽõÜ»¦@I‘$¡”Tº”ü,—¾4j b‚È„&Dœ *ðˆÐ}k¹¢*•J)ŠôÓìt ¸×Üãk e_KÓ®&vÝmÍ3So’¼4½ï÷>ý›6]Þûä¦(%h›¹ð>òE(v•¦v«¥¼¿÷ß0ò_„ù8¡*Í“a]©í¥"Ás1Q"PÁèžÝlx’œQçR,ú:"Ä P•¬~‹Q·zn_ H,è;Mì/üË¬}¿ SôÆú²fð«!À¬Ò˜¶TK¦â ‘uæ†ÍLÁ°c}þ0e°5d.WÄþì3FÛv¶tØÞ|é*Ü.«‰¥¦FÖOð…b—À®Ö_I¡3™£Hõ~8<<̋ B©YË\èhxr›¹þÔB!„B·e¹¢êÚ?F;
+Çb¼˜ (–ãj_0̼Y3ð‘ž4™7³³ìr6Û{ï3µÚ¸úª@„°ïH T:û^}f•Ì{»Cö÷l³odÁÃ^ØcD!„BÝ»J¦}ÊävËüÑP¶qìz.ýÞ{]ː:Ûï\–C1‰S¥¤H’Ð$!‚’‚¤ J€ä´åô²ó?.„B-iú øÄ/ª8ÃË&¶’‘%!6|›öY¹eS[ ç°Î8ûý,·×Õꘅ+ÃßáAŀ4"LèÙ%óia¡ÂÎMÍ/ì1"„B!„îM
+…âÆ?ËM!‹ÐB ]’BWˆi­JJBD’™›–jÆ2B!„î ÊT*%‚}Î9(VèlM™áç*†c9Ž:ä ämM\v3zÍfó\fCšåö†-ú²ÛÌÖ ýBt¿µÄø‡¿ÍOÎgî¦;öB#B!„Bè^–Êl ,•*%IRâUªä¾PrßEîš*Ù5¹c]—Þ÷ŽõÜ»¦@I‘$¡”Tº”ü,—¾4j b‚È„&Dœ *ðˆÐ}k¹¢*•J)ŠôÓìt ¸×Üãk e_KÓ®&vÝmÍ3So’¼4½ï÷>ý›6]Þûä¦(%h›¹ð>òE(v•¦v«¥¼¿÷ß0ò_„ù8¡*Í“a]©í¥"Ás1Q"PÁèžÝlx’œQçR,ú:"Ä P•¬~‹Q·zn_ H,è;Mì/üË¬}¿ SôÆú²fð«!À¬Ò˜¶TK¦â ‘uæ†ÍLÁ°c}þ0e°5d.WÄþì3FÛv¶tØÞ|é*Ü.«‰¥¦FÖOð…b—À®Ö_I¡3™£Hõ~8<<̋ B©YË\èhxr›¹þÔB!„B·e¹¢êÚ?F;
ôp$¨ëŽÚžçx‰ã„ãG^*°ÝöS™‰dO6b¶ݧ–+ªn]+wÇR¹b·uqnwRŠ¹÷r”î½|w¦w
-bäthð(e۝Þ>r2¦ÛlbW2ÅÂæ^äBGÃÀ„ŠãΜz8E¶¿kóþÞgڗ_>v|0–äL¿52 ‡O?clMšgr%kØbÈ['}
+bäthð(e۝Þ>r2¦ÛlbW2ÅÂæ^äBGÃÀ„ŠãΜz8E¶¿kóþÞgڗ_>v|0–äL¿52 ‡O?clMšgr%kØbÈ['}
ž“Œ;Mœš&q!t<œ}i®?5„B!„ÐmJ¥RÂU~±£@~ê?6<ω "Œ^"R‚ÀöSprÛ´ívžšJƒ´ÐýžK™‡Â-,HØûƒÕ;=ßeÕ
³5½×2ŠQ« Þ?Hnr“¹Ð0Y‘@³‘!7 ŽUÂðßÄì‹Æ× ì
@@ -38,7 +38,7 @@
-T¹ÝËÌñ°¸½S™Ý—WUõGGMªüÖ¹“½C™Ã/}ìå¸3½S ¤H’P“Ÿ–³\øVШˆ "šq2È×G±Ú*F‘7šÝ¿¤b¢ZíÈ<%×þ£ŽšG!„BhQ0À
+T¹ÝËÌñ°¸½S™Ý—WUõGGMªüÖ¹“½C™Ã/}ìå¸3½S ¤H’P“Ÿ–³\øVШˆ "šq2È×G±Ú*F‘7šÝ¿¤b¢ZíÈ<%×þ£ŽšG!„BhQ0À
W3…(cŸZë>‘<êÞ¬aãW†]{\ÃãRº$Žo‡Þ§jð½kUS$ð‰£ë õèß}PõhMïß4©h R°æ G¶„NI¡æ±ºß)Ó:66ìÛfï;ÿs”£fÕxšã md-•žð¡LÔÂû&"UÚmM=§\[õâX¸½É‹§›Ù&ºs¼_‰¡1ɸF-$@J>. $™É$ƒ&–LXRrù¿¶µìkiÚÕÄ®ÃjEè>³\QUêSMÂç;M ®;j{žã%"Œ~\Œy©ÀvÛO IR'¬ÎýNüàEY dƂ+
ì
@@ -57,13 +57,13 @@
v+À’îÝ60$ìu6š6IIJóŒ©?`
N½Óà(ЩÇzlPØ?}ãâ¬}ƒü¢‘`ћÜÇȘØuFb+)ÍJUìI@Ä¸D–(é™c˕»I?bµ1TŒn¤®-v!„B!ô@™>…,tþ¾Óõ®Ú].ó˄É{XöýÙÇUsw.S¯P(Nýó–eÅ´l…|}pé¿o{jòð§ëkvDnÜr'ãì×n:ÊÉâPú©ø­mùS}ªUâå©Êù÷”W¨j_hè=æÕNNÃ+_·¿åò5ÏLùëô|hO÷2ó”Î<Ÿóën†õOù#1/ȗ‡›Zƒb„R™¶·ôÿɕîï3Ô؆³m¨Öô‹1k‰õvÖúMÔPrzaœBݧ`…«|z9vz_g2­ÊübŠ?¹7Ç®Eª¯²sÌæ¹Óñ »&ö‹Üó•$&¡ˆL(^"ñ„LD €P¦³emf÷øWN!‹re¿1*S©”ÂbǃB!„B2i\®¶$qµºÂßڀx\ŠþUU¨öNý¡ÞÒÚ¢©¸­¾÷2î%
-jÿ³lveûQ^óföi`oZU+]ißtåf«=ßü˜•Qz÷4n2râ·N€›‘M5›`k›ÿs7§¢¢ßÛßrêyŠ?m›e`óéÀ·ÃbˆLˆuú—¤­ÙèD̵â·jøþGPÿ¦wð=Mzª"³Pl}ç1“v‡O83ÛȺ(
+jÿ³lveûQ^óföi`oZU+]ißtåf«=ßü˜•Qz÷4n2râ·N€›‘M5›`k›ÿs7§¢¢ßÛßrêyŠ?m›e`óéÀ·ÃbˆLˆuú—¤­ÙèD̵â·jøþGPÿ¦wð=Mzª"³Pl}ç1“v‡O83ÛȺ(
ÀN.0y/@Ŝ ,@P聒½Ò¯À4=B!„B-¸¼ÑôÂUÁÙælØ
óôÿWc\ ª¨ ïѦ7+0"þjçҚ®Ô„ ƒ[9q
g¦ŠEˆ±ÎåÚö³7RFf£éçÕ)ˆ!º¦SC ó®¥5=×þOf—¤Ûë\ú˜75!€o5ãÛw>ÛfV±õ``èÎQÙXäJPºöêD÷£éŸ±²{o£÷xp,sŒÝ󡓙ãJb̺\;Pð¥‹×Î::CçB_-dñ”ê÷_)}É»aÐ}
´·~<ûEª^oê<dn|®9Ý`䘫ùw¾‘±¸J­ihïõî1”ˆ!›üÀÖþi ö‹¤^»¹å=KÙà ÷2!vÚ½'Cñè~ÓÐ{Ì£gèt/ý‘S^s³´ól˹z—Ê#œÉtáÕ1îÕýü‰ú‚ûæ%¸sŸæ¶ý@_ì҂éYÒ;yÙÎѱîjåžLŽ€ÿo¡tîulx{u]Gìñ=`% JGáørÌ5ڔû"£qþlUÍnÈä¼:…è§Nõ‹îÌú
3Þ¡xJ÷‹zxLÕ¦_®¨ºuíÆvËì³é)’f‰RÎeÖã䬷Ā'Ý©€a1?Ô'”@’„RRóX^º;Ô°…UU¨¤„Ä®Öșêf@+!wÙý"ƒiz„B¡E”•1üok²y{Ν«w¾ï?Ö¯_¯/X›>z¸þñ·…Þ@¯i=+|r48†Ç¥T*rT±ôñ¶çíÏsÂ߆WÚ¼•Ò¯j“NÓsGê7tÄ=½æ§9áû`óÇH‚”M_¤ÿVÎÖÁì,Þ–žï òUºMu­½«­¶Öȍ;–?¼ñ/Y G饏{®Ý²±tÁ}K§é³mê9dÞýÉ óÀ̒²~ÙRUßhh;õ -öDÃM\ú5G^<=l¯º—>ÚÚÿÏ[Ö™ë
@@ -74,7 +74,7 @@
€»mØxÈYvßbrÚ,E÷~ ë
߄X·Wµ¦;[Ç9ò‰ZŸ¨©ªªªªªI@ìˆ#»×©ÞJeýëFï›L£¡€©U)Á?($ IDAT—óz±Ôêmg2“º©*ÕluåÔ¹g§1\Ν¾òÕ!ãcU®¯Hï7×Bé=,aÃÃaw“‘^ô
-Îcy䊠ª I’ D"K‘ÆEIi\Ì[^¼O„B!T”(‰Ðú6ñüÑS¢Z£®‚?M¥à¥+“óN‘¤Æw:Ä ÂàïMŽW´Ñü|r›UTàûœÖ.ËìP¨ºB £ÿ—M3ߺøÍÅ®À­µ]Îøw^<Wõ¾ÄÌv_2>\þ`f Y[C%å8m?ÊZ³ëÛ?ŽiZ/Nuy­ݗ ¯eLÃ;md<nÏ󼺧iÚ \1Ö¸0¢Ï¹ÔQÌ|;µâÙ÷ÄX÷Ä6x­_øÚoÑM–yçG¹•îåôŽÅÖg$ã T—¡ûNÞ¥PB€$\µ¹:\ÑK®ÈwQù1&'¶Áëù¿øòõÁN—Û&ßgPä`4 Sï¾à±dñ§ëKXqúIŽì×ÒL}ö©ø­M¡P0«;óšfcØjÞœÚ@¾v6Ù´B¡`XκߛíefH3Ïíü:…›a½frNr~ȲYKÓ
+Îcy䊠ª I’ D"K‘ÆEIi\Ì[^¼O„B!T”(‰Ðú6ñüÑS¢Z£®‚?M¥à¥+“óN‘¤Æw:Ä ÂàïMŽW´Ñü|r›UTàûœÖ.ËìP¨ºB £ÿ—M3ߺøÍÅ®À­µ]Îøw^<Wõ¾ÄÌv_2>\þ`f Y[C%å8m?ÊZ³ëÛ?ŽiZ/Nuy­ݗ ¯eLÃ;md<nÏ󼺧iÚ \1Ö¸0¢Ï¹ÔQÌ|;µâÙ÷ÄX÷Ä6x­_øÚoÑM–yçG¹•îåôŽÅÖg$ã T—¡ûNÞ¥PB€$\µ¹:\ÑK®ÈwQù1&'¶Áëù¿øòõÁN—Û&ßgPä`4 Sï¾à±dñ§ëKXqúIŽì×ÒL}ö©ø­M¡P0«;óšfcØjÞœÚ@¾v6Ù´B¡`XκߛíefH3Ïíü:…›a½frNr~ȲYKÓ
Íè_´…'{”/YžÕÒKŠeL}Sg6*»FÎm
¡YË&ç§WæNÎâ+ÞÔÆsضx±Ä‚-Ï%Œ94;‡m1àyšuÌ{ÀI ³›Íe9“8PJŠ$ M"()HÊ HN_F!„B÷žÈ7‘ªG«:Þï(5O’çÍLõ¦@¯q='^
@@ -81,7 +81,7 @@
YájÑ2&yÜût^©ó¦kÓ_
vÙYJ ü¡Ñy’•¯Íܛ~ÄÞ r_wTo÷gæA-¶/Å€ýXØ½Ó ] 9^,RÑÚômíºÇß®IR×^È$µå«î Dú[5SQ±6s¥Ãw ä:]_ ‰œ;¬'»ݤÝïÞß USÑoƒíövõóv¶Ìß·Ó©¹’
-ÇIº áoÍÃD}þE6<În`¨5Ð*¶«­n$I¹_3B‚÷°¨ŸéÖÒÅÖ‰‡©Js±˜ÓµJB÷i\®¶$qµºÂßڀx\ŠþUU¨ön—iimÑTÌ-‹pû„ÿÔ¿é|/óDUhJo¿ ¸—<*¨q\²UÚ ý(¯y³?û4°7H­ª•®´‡oº 9s\{¾ùѤʜ%q<êÝÓ¸Éȉß:nF6Õl‚­mþÏݜŠŠ~lË©ç)þ´m–Í§Sß‹q š^n|j¿Ý}±ÏÌ$_›¥ÞÐ.^vÄX§IÚÚqñ˜NÄ\;,z«†?a€Îc&íŸp¦|„©Tʹ¿ðgè!7õÅP¡PÜøç\¦EÝ]¡KRè
+ÇIº áoÍÃD}þE6<În`¨5Ð*¶«­n$I¹_3B‚÷°¨ŸéÖÒÅÖ‰‡©Js±˜ÓµJB÷i\®¶$qµºÂßڀx\ŠþUU¨ön—iimÑTÌ-‹pû„ÿÔ¿é|/óDUhJo¿ ¸—<*¨q\²UÚ ý(¯y³?û4°7H­ª•®´‡oº 9s\{¾ùѤʜ%q<êÝÓ¸Éȉß:nF6Õl‚­mþÏݜŠŠ~lË©ç)þ´m–Í§Sß‹q š^n|j¿Ý}±ÏÌ$_›¥ÞÐ.^vÄX§IÚÚqñ˜NÄ\;,z«†?a€Îc&íŸp¦|„©Tʹ¿ðgè!7õÅP¡PÜøç\¦EÝ]¡KRè
Nš;ÿÇ&KÓ&Gœ¨ªumÿy±Äü±S­½î%ÖÎÝuŽqR½ÞäúÜÝü\s©Šôb†y›­î‰.)Iiž1Ez‹5ÐöŽæñ–‘ÞkµÙ5…÷]¦ÿ²«ÉñVÝáÿ ÕMîWà©ÂÉ‰HëÛ­ÅÒôÚ]xkƒú™~v² üðÛ^Jݔž»5«cŸæñ‡ 2æ4•“Ïb >ï|ËÕlòÆD¥®6íê>ûaù¯Ö·Ó©u+×|”Â鐱M†M¹§R)`Œ£Aõ€«¦m *Ô¦íöHÀ E×t„ÛZô'…У¥µÅÙælØ
@@ -96,8 +96,8 @@
ïÖÖ}e–ùNYð.­r\üWJŸÎ/†Ëëºÿ>j­¤ þ±*òÆÅèA=̘@©>µ¬¦Ó{Ýø¿Säb¶B¡èN«“A¤`¶9s8óë@K+šFo9§_ה¯‹ñqÞ··Þ·‹?¸2k'DߜΎ>Ý®î¡?;³;Ȃ{i7;¸¾¼ å™MŸJ¥DÒkIμ—¡#]GƒcqI½¶¶å=SëŽöÑÑ’’÷w.ÿÃqºçÍÛô*ª­ñ=Áw;ƒßÇUj­ÝÓòòÔe.2}FMY:÷¸ÞqÖ»Çö»¾1 4Ϙ=‡Û8
€?Óçútpä§1”z•ÆÖê±oa t¤³ëhæ¦×{FǎökÿB„©xž1µlÓ)hC)3q¦ÓâÖjµÐüԆÍÇÎú6ª€Ä;8‘@¥{Þì>ؒ²¦æñî g`·“¼Ü?Ôª©©y¼ãO-¿óÆÆaó.wçÓ¼£Ã72&Q•ÕMïø\Û9àÏøœŸø§ŽkŸÛ¶E­ÕnÈtwâ¬o­ª¦æqOä¢IEåö[û‚Ù}Еî·ÄI&s™d5}*féµü0L’2¥¤çôè<7®a@<!II’‚ ¶ŸšÊÔo?I@eB!„ÐbK§Aš%ñr”Y½u¥£—EíjL¡“B¡ÈOy/BI’Žvp¼å8ÿ¿ç‹í’HïUö©j ` û4›’¦Y+@c$!!LrÖc´ï)á9‰ô¯Ïéeí´^ŠQçÜÊÏÍø˾h›Kr&^Á¹|¡ö¥5¡›`,Wý¦ SõÜR
º÷[ȑæðÍNªÛ«ZÓ­Ÿì4ò‰ZŸ¨iÍnzÄ3qNËþß}¿ÛÔhh´\¦V¥_\vNPo©Õ«Þò½È€ªRÍæÖ®QN“yv
-#ÀeOþ„þ.f¨5Ð+nÓvÌÕUåp€|u¨þ¹m±•æÞo®YtÓ¯)9 cs:uAÎlF¿Ê]K)éô?ḣù“{Oÿ‘‹þwÌ»{²¯÷Zü¢Æ<{1tªVÚfšzÛ»÷›]ûù¢{;Õó–µ`Ëé´ÀvDòœ8{>Ø«‰-¯PJšJÆëí=üJËÐÿžÿ1|¶s»ªëÿY€ÿÌÖøñpӇéxL¾Ý=ٖ§ÅC…_iÏë+ûoæY˜p4€Þo.úŸf)%ío²âšþ¿œ¿ø—^Ýx ¤’€¾Ý>ó;ÏkšôSßIè]<ÿŸMçŽ8ê?:Ž½öóEÏNæðÛVÂ×ý¿®iÇe·RJzôçÉîÖ³év(%•×¯&¨oð•=ÉŎz–§¢„;ÔòÃðäÏz¶þ¯ h*U’DB‰ ‘$)4@`ç)€§H¦Ô¾’š[M*„B!„Ð=`asôP6G_`l)B÷3Q õmâù£’E7ÓU@ð')ûTºÊ}Õ=3J/=]„–¢iJ CâäzqȾ·|µ¨Í**ð}N/—‚³>Ž9·)óþΏ|9Ê0=ã_¾¨hÖÖPI9ŽDۏòƃS©ªöcšÖ‹©I·®õBb¸ór¡AË˜†wÚÈx ݞçyuO“7÷u1Ö¸0¢Ï¹DQÌ|;µâÙ÷ ‰m2lŠfw""Pj€ ±î‰mðZ¿ðµ??GÉ8(Õe#,}Gz˜M¥ésÿ{vu›õ[ŸÕ2•ŒæYKßäü IÑùßñÁCNM5ËVk]‡É/ÁÀxæmk<ÜaXÅÅß°A2^¶o×±6ý*–[cp´Ißu IJ=ô—/‡Û5+YFÍjÖiÒíÌ/ž²ÊœÚ/Hî¾6}5ËVë]}™ @w¸×ö²Q³2“µ}ÔÄVÐܳNhékÓWOo¶ÈqV²ß¹ždt_ãã²áQ”¦Z‹K±_>.ÆI’ÉD<°½jyr=~î#„B-.ü>†BwYä›È†§6t¼ßPj†9Ï;›Lõþ¯"Âu1zÎo1OK ;LÎpŒç;~íP?ÝÍÑ4çy^ÝüŠ3>Úµ£yà\ù|±{Ÿ.ðJ÷tX„ÈW¾zó¤é‹µI«Ø®¶fË~þªÀÇ®uêgºµÅÇÒöcay„X¨ù•YÜû%óîÜÅ^lk׍´Õ”ç…LòZ¾êJ¤­uªÚ;ÍÚ̕”ï@¨pÊ©!üփ̅VíVçÐ×þrthÀ]ghW?ßa/>ÓÆíwj®¤ÂñÉ!Ë M+©mvw”øÂsOõV7k&êÎÙðp8û/Û‰‡©J,v‡æO©P(Òµé!§¬Ç9‰tWçTù¨®¤,KÃ`Óc5¹MD¤ßƒ†Ê¢7Åä½I+&׫L­#’Ȩ(JéÚÝÅK€b'/A“ˆ'玺º )O‚˜
-}ZÎã\:`Y™dÅfH †•ÓŠÍùôg ´J«±ÉãVMåž’$d2 O’Dœì7¶Ê±„̪è1?Ì5dîNËw¿èLhëg¼i#'O€0.Š IÈ)nSì!„BÝ{Äë¢ï³ËVÇqå·F!TDáK¡Jøòó/Ç.©YµªRES…ÿ6׿:¥´·7Õ5þ"Uo4u\Æ©ÑñC»ÀjЎ%@÷›¦³'2ëíÁ0o³Õ뫤$¥{¡áìÿº
+#ÀeOþ„þ.f¨5Ð+nÓvÌÕUåp€|u¨þ¹m±•æÞo®YtÓ¯)9 cs:uAÎlF¿Ê]K)éô?ḣù“{Oÿ‘‹þwÌ»{²¯÷Zü¢Æ<{1tªVÚfšzÛ»÷›]ûù¢{;Õó–µ`Ëé´ÀvDòœ8{>Ø«‰-¯PJšJÆëí=üJËÐÿžÿ1|¶s»ªëÿY€ÿÌÖøñpӇéxL¾Ý=ٖ§ÅC…_iÏë+ûoæY˜p4€Þo.úŸf)%ío²âšþ¿œ¿ø—^Ýx ¤’€¾Ý>ó;ÏkšôSßIè]<ÿŸMçŽ8ê?:Ž½öóEÏNæðÛVÂ×ý¿®iÇe·RJzôçÉîÖ³év(%•×¯&¨oð•=ÉŎz–§¢„;ÔòÃðäÏz¶þ¯ h*U’DB‰ ‘$)4@`ç)€§H¦Ô¾’š[M*„B!„Ð=`asôP6G_`l)B÷3Q õmâù£’E7ÓU@ð')ûTºÊ}Õ=3J/=]„–¢iJ CâäzqȾ·|µ¨Í**ð}N/—‚³>Ž9·)óþΏ|9Ê0=ã_¾¨hÖÖPI9ŽDۏòƃS©ªöcšÖ‹©I·®õBb¸ór¡AË˜†wÚÈx ݞçyuO“7÷u1Ö¸0¢Ï¹DQÌ|;µâÙ÷ ‰m2lŠfw""Pj€ ±î‰mðZ¿ðµ??GÉ8(Õe#,}Gz˜M¥ésÿ{vu›õ[ŸÕ2•ŒæYKßäü IÑùßñÁCNM5ËVk]‡É/ÁÀxæmk<ÜaXÅÅß°A2^¶o×±6ý*–[cp´Ißu IJ=ô—/‡Û5+YFÍjÖiÒíÌ/ž²ÊœÚ/Hî¾6}5ËVë]}™ @w¸×ö²Q³2“µ}ÔÄVÐܳNhékÓWOo¶ÈqV²ß¹ždt_ãã²áQ”¦Z‹K±_>.ÆI’ÉD<°½jyr=~î#„B-.ü>†BwYä›È†§6t¼ßPj†9Ï;›Lõþ¯"Âu1zÎo1OK ;LÎpŒç;~íP?ÝÍÑ4çy^ÝüŠ3>Úµ£yà\ù|±{Ÿ.ðJ÷tX„ÈW¾zó¤é‹µI«Ø®¶fË~þªÀÇ®uêgºµÅÇÒöcay„X¨ù•YÜû%óîÜÅ^lk׍´Õ”ç…LòZ¾êJ¤­uªÚ;ÍÚ̕”ï@¨pÊ©!üփ̅VíVçÐ×þrthÀ]ghW?ßa/>ÓÆíwj®¤ÂñÉ!Ë M+©mvw”øÂsOõV7k&êÎÙðp8û/Û‰‡©J,v‡æO©P(Òµé!§¬Ç9‰tWçTù¨®¤,KÃ`Óc5¹MD¤ßƒ†Ê¢7Åä½I+&׫L­#’Ȩ(JéÚÝÅK€b'/A“ˆ'玺º )O‚˜
+}ZÎã\:`Y™dÅfH †•ÓŠÍùôg ´J«±ÉãVMåž’$d2 O’Dœì7¶Ê±„̪è1?Ì5dîNËw¿èLhëg¼i#'O€0.Š IÈ)nSì!„BÝ{Äë¢ï³ËVÇqå·F!TDáK¡Jøòó/Ç.©YµªRES…ÿ6׿:¥´·7Õ5þ"Uo4u\Æ©ÑñC»ÀjЎ%@÷›¦³'2ëíÁ0o³Õ뫤$¥{¡áìÿº
¡<Ù^Ó®-fs‹º
ëÆÌSyl8ý*¥ÒÀÅÑÑɬ´»Äs+Ë':ó³–J€ æJÈxt*†¡¾¡½íÄyÏFÒS@|9œŽ'4FÒgã¨Ðˆ§š¹ý eö`C HÏïJ¤P&Hezj¹ã¤P·£5︲»ç6E))¦"Û/dûÕT̪ŽÊp‡Z~˜žM¡1A7‰ZÖs2€”a\´Dd)n“PRSÆÎ\F!„B÷Y”}Ÿù¸uzßÉAÛv+Ç͸_~¡Ífê¿y/û–>Ö\úvþt}͎ȍ[BýÚMG9YJ?¿µ-ªOµªC¼<•ðÊ/ÃR¡ª}¡¡÷˜W;YìX¾nËåÿj8>NTêjÓN§çC{º—™Ç›7Mâ¼;…›aýSþHÌ 2?Ô¼»=ð·¢TÕ¾ØÐëËn&»woëú,H(µyŸÇÿž%½Ö®ÑZ¿‰æU!úNK¥RÎýå3_Ý/ØJV»F˨VÍrÕ™ƒ42àƒ—;£2eUÄl Òe_5ìñò{¼ùûМ{ Tt0ùtÙÏÛ~ÛSëm)Û,wÌ[¦WXʶÉn±‡Fì³  þ]_ý»SurR“íä}¶gŸæÆPÀ2}Þ«Æ~æhGí»‘Ô»z µÓ™5xO„fü
@@ -109,18 +109,18 @@
ÀäèNYð%òå¾É
2ïø.nDB†*çgÑðž©ÙSÕÕ79"ž[Íy>oé«ipÀàëáp,Ó&§Ñž$˵Í!Ñf,3[êü;1丠‘Ó•Ä¡s¹‘¿Ï¶vuU9:ÀÙ=Òð—kÆu wê}ݦ=_Ì̓nî=ÛB³£P(̯λ8gZ=ï:zÒÏ֛4‚×²Õ æW͖­–ŠÝoÖcû‹”±/ϸ
ʾyOÏbôÉWdÓô °ÂU>½6vz_g2­Ê|Gr=nŽ]‹.Ø;‰HÁš'×þ1:Ëíït<-®Ø/rÏW’˜†"2¡x‰Ä2%B@™~̖µ™Ýã_-ûZšv5±ëð¯„B¡E°\Q•ý»«ó°—y¤ºöåz @ˆ€(Çþ'ç†=­-ì#ªß ´·~<ûEª^oê<dn|.Sd&rÌÕü;ßÈX\¥Ö4´÷z÷JĐ.c‚àÒß6z¢£~oWlt/4õ¼%¦ôÕ².•G8“É5xuŒ{u?¢Ä˾*}ÏÙ¿·mªiÌÝÌÂ2iâˆ}¹¾oô–ÌÑéŠ7'7ËW35 øÓõ5¯ ©›‘pWwÆ( ¾Ü˜§®ÜKíIM2»d©kô–ý‘iÑó—yU5Ç,)_ôf^Bô}ý%7?`L¿¢_¶”k?Õû¦…"B_[ëÜf1æ™W,­¹ø¯”~€Ì»–>L݌¤[ 5pεC‘w§®
w/b[àmPª¾ü§d}¶}…]Ù~5ojc;pï¥éBåš_ŽfŸ£G¨¥B¡¸‘º–~’sç…ìÞÛè=ËÌÉc÷|èdJTõ*DŒY—k
–:ùûˆAÍpÕ·šÓ¬Õ0ª·Éë* øÓT
-çÙ ‘þ½³mcõ›ª–J”º¡õ”w3›m?:Âmí-äݧP(Zöµ,vÝ.ù¦ìý¸ÇX«Ó¯ÒÀ¸ÀQ”EMûÞvZßws®üþ÷¤ìåOqĦ%0=I/“ȍíÌ`Û»ºª3Û)c çyZíØ€‘ÉAè‚/(‘/÷M~ʼ㻸= ªœŸEÃ{¦fXUWsÜä‡*·šó|ÞÒWÓà€Á×-Â3áX¦MN£5<I–k›C¢Í8›™VçÕ)ˆ!Ǎœþ¬.~~˜'Ýܺp$¹-Ìè® tŽ¾éO½M™™NJµ©Tʹ¿ü[è!4Uô&ï:$!@®Ú\®è%Wä;‡(‰ü3ژ—™w¸Ìfƒ™wÁÌ£å¡õôEý×B‰mRÎ+Û\å6¨P(Ø-ÓÆ°dOWä]íÌ[u
+çÙ ‘þ½³mcõ›ª–J”º¡õ”w3›m?:Âmí-äݧP(Zöµ,vÝ.ù¦ìý¸ÇX«Ó¯ÒÀ¸ÀQ”EMûÞvZßws®üþ÷¤ìåOqĦ%0=I/“ȍíÌ`Û»ºª3Û)c çyZíØ€‘ÉAè‚/(‘/÷M~ʼ㻸= ªœŸEÃ{¦fXUWsÜä‡*·šó|ÞÒWÓà€Á×-Â3áX¦MN£5<I–k›C¢Í8›™VçÕ)ˆ!Ǎœþ¬.~~˜'Ýܺp$¹-Ìè® tŽ¾éO½M™™NJµ©Tʹ¿ü[è!4Uô&ï:$!@®Ú\®è%Wä;‡(‰ü3ژ—™w¸Ìfƒ™wÁÌ£å¡õôEý×B‰mRÎ+Û\å6¨P(Ø-ÓÆ°dOWä]íÌ[u
Eý"º‹GAçLl-ó{-ÚG…BA3¬a«m(ç¶ÐûÎé^¤lgy÷p[÷•…e¬B!„WÁïc4M³+Yím‰=D|ðrgôª˜J¥øo‡LPe
{¼¼(§&äÈÞÙ$÷µû#©TÊVh”:½Â’{tyOó-Ó§R)á멊7Æ^òGjߍ¤džžódÚiݱp³ÀÔe3÷ÍÆv;êÚíüñžœ#ÒzO‡E9•’Åði¯vj
@@ -127,22 +127,22 @@
4ÚÕ'R©›‚ÿ=Knc=Çù–v „ÿŸ½÷mâÊúÿÏTIå‰`å‰òD´ÊDM…§€j·¬g©g©ì‚>Ä©1ÛIÚÕ‡~Tâ´Ú&yªnœ®Jª¶6Õ·Ä ¥$H‡G´vWí³Z§‚ÅAekW°òDK•‰b¬%b¬Éß?Æ;¶Çv~s^òö{Ͻ3‰¯gÎ=ïs?éתUú
k\R8Lž¶Ù‡Äˎ²êÞĬ Èj‡($A
ã-ì?@|êçXúð”ÊÀ@‘Ž¨X”ZêažÇÞ¼³™^‹×AAä.@ÁRž›Dç;ÜGýWãjM•é›ëƒTÌx:BÄZÎå4qî? é¹®[º§ nˆÌ!rƒì«<wz1i
Ú'´ô
-:çN݁XÜ´Z-T¯ž÷í–=ã$m€ÐŒ(Îãiå@}ô9+K…OɑُVÀøÌNùzðàD|ä˜C¯e­Þql$v¾_N\[‘CCÝ{íñ‰Þàuˆô¹Õ«ûä_Ð'vèXW]YYYYY9>‘mr«ãWn¤~9þsm`7µð€ªU—€g*Óég©Õ·|ÌA¤®ÐÐih*RŽEv
+:çN݁XÜ´Z-T¯ž÷í–=ã$m€ÐŒ(Îãiå@}ô9+K…OɑُVÀøÌNùzðàD|ä˜C¯e­Þql$v¾_N\[‘CCÝ{íñ‰Þàuˆô¹Õ«ûä_Ð'vèXW]YYYYY9>‘mr«ãWn¤~9þsm`7µÃ°€ªU—€g*Óég©Õ·|ÌA¤®ÐÐih*RŽEv
54]cpž˜ú®M^í1Ÿ­É¬Ÿ›4ퟵÓÉnt@û°ËP#› 5£¡s¡.–¡išÑ¯×å[7ËÛoî1“Œý­¢–(ÈÆяLC¯´Ãê@8:™F4Ø 0n¹ÞÊ4
´€V¶Z®_½®®ÿ;èéNþo MÅë«
ÏÎyPWÕǯbzzAAAE‚\¤$oiÆÇ;SR<$I2«ÃF“q—M·F§­ÑêÖèr†Ò€ëõC&óà·!~ZŸ´4úӏ¶™ìÁÇ]¶½Ø¦y®!HÆõ‚¦u‹=áy.Ü»½u蔲C#gåRÆõ‚Æhí
@@ -151,9 +151,9 @@
@@ -166,7 +166,7 @@
²ô{G{6ƒõùj‚ Xc‹jkÏèGF Utý õÅX"֜
”SÅh×hóøèP.„,˜%*‰
@@ -173,7 +173,7 @@
éúØξ¡VZö8m› ÜËNv’¶ì͈FÍ+_a€ÐŒh¦H0Uåˆî_(ì._ûÊò¢#z²Øpuu…†Î^ jÕ%Ð?!8j( G"á‘÷”U¶h ó–® žwëvvX¦½‰S² ÓÊ¢„øÄÒL ȽÎ]q…Ë¥ùëd
@@ -190,7 +190,7 @@
ë*c ®ÝÜüKnçû®çªÚªËg®y×SâL¨ãíŽâÝôÀ¾îí<@õþ#V¸*@Û¯ŸÊ(9rå†u $Œžëjïîjn˜¸W¯Ò6îlŸ<ÓÂþŠ(Ü6 R•JÂcÝÊ´â@·x.whœÙ:°èær_±âxÇ:-˜›>}`âuÑýa¿±V§B WyF¥²hHÏÛvë{NFû@¹³œ{…+-ÎîúÞ&£í
-§_>ÿE3€8­¦&óJjª&×Lëûƒ1¨iŸ<íH«aôõ¨¡Ú¶[N[ó·Í8ÄÔ0®“í«»ìB í{­87®©»> IDATo ã-ú-~€L'½R9µÞÉ|O„cöÄ?ßrþJH>úæÿY_Ø>‚(#Oeù’Þˆ‚èùÜìÕz¾ðr\¤` %C$²8d%Î($ âN˜‰RZ˜_-´‡%)³üQ8ÛBUãH¯SP˜#NíMFzIE3Ö=n¹—ì«‘}j‹ë´85è|ÝL‘IÑÖ?y –©âAAA$’$éU4»šÍ㣀А6;—…D"Áõ™–…@­“éw¹9^L$r¼Z8‡¤a—›ÄĬúҝò铬ûDP Qsʑç‰D"=6Ó=Æ% ïz
+§_>ÿE3€8­¦&óJjª&×Lëûƒ1¨iŸ<íH«aôõ¨¡Ú¶[N[ó·Í8ÄÔ0®“í«»ìB í{­87®©»> IDATo ã-ú-~€L'½R9µÞÉ|O„cöÄ?ßrþJH>úæÿY_Ø>‚(#Oeù’Þˆ‚èùÜìÕz¾ðr\¤` %C$²8d%Î($ âN˜‰RZ˜_-´‡%)³üQ8ÛBUãH¯SP˜#NíMFzIE3Ö=n¹—ì«‘}j‹ë´85è|ÝL‘IÑÖ?y –©âAAA$’$éU4»šÍ㣀А6;—…D"Áõ™–…@­“éw¹9^L$r¼Z8‡¤a—›ÄĬúҝò铬ûDP Qsʑç‰D"=6Ó=Æ% ïz
È–œ®ºô&ÍÀqVÈh•ÓN")?ûrÖñ™—›‰„p9ìùS Y
œ˜(Ø6{<@²rïºnw43yŽÒiæ,ï?ʵwë²+ßG`îävàÜëä–êïY?éתUú
&"ðÓ8œ=¥Q[w¿kç/çvgùöÙ¤”,ŒÎ<xÚ#}$W ÷…ƒ¥I¢”Ôo²¥‹Í
@@ -200,7 +200,7 @@
ZžPi
s<½Þ }BK¯ é
:[½ˆÅM«S>YõjSúQ9YI[ 4#Š3ÁxZ9PFÛ.«ÒXrV–
@@ -212,18 +212,18 @@
@¤`Û¤í.ÐX¡
-ö%wܞ·Ôv]ð¼[·ðÃ2í•$?ž)ÑþؼXjõêÿöy6Ñ ©iÒW ÓÒr-²ÓâÔ@¤Š€ÈuHžc<Ëtyʓ¡âAAA‡t}ÞaÆOGtro-(Ç©É:fù‘ø–—f’A» šUC‰A˜è
+ö%wܞ·Ôv]ð¼[·Ã°Ã2í•$?ž)ÑþؼXjõêÿöy6Ñ ©iÒW ÓÒr-²ÓâÔ@¤Š€ÈuHžc<Ëtyʓ¡âAAA‡t}ÞaÆOGtro-(Ç©É:fù‘ø–—f’A» šUC‰A˜è
;~ŽU=kr wR¾lßN°؉ÐýWóȱd¹ÍäZZÌúÊØM•î·M#϶˜³²TØ°®7vS¥ýM£/##qæ¹0£5[šëÚ¦âê*]ç_αóZ»ž«j«.œ¹æ]O)YgBowï¦öuoçª÷E¥!jûõS%I!É£çºÚ»»š&®ÆÕ«´;Û'Ï´°¿"
-mo O‹¥@ëÛcMûó—ªxAAAäáàÎïo<ú÷т£Rt¦—νòpÞ½ÃÔŒðÀG­[†´¯,`ëTänAÒ¶ö
+mo O‹Â¥@ëÛcMûó—ªxAAAäáàÎïo<ú÷т£Rt¦—νòpÞ½ÃÔŒðÀG­[†´¯,`ëTänAÒ¶ö
-Nϛډ¿¶åü§ s€2œ»8Z_j5ÕU?ùԎv·vg_ø›¹Ý—Ò©u+3~(w
+Nϛډ¿¶åü§ s€2œ»8Z_j5ÕU?ùԎv·vg_ø›Â¹Ý—Ò©u+3~(w
AîeÆO'·÷”W¼§÷f‰”Þꯑ{áR˜ªaÑ0|I`kòyHm¹Hûè®A2Hí #ç¦_ÊzK_÷3âw´4 ´™Ì‘M¾ð~#ºéï:]ZŠöOÚ“iHñ²»ÒÄ PvOƒó>‚ ‚ òPQ¤›^zJ€Ú¿Dƒ¯Ê»"K–…Å¢] eüAÐ/‡ÀV¦á& +‚ÝôÈýHžoнÉ]Iš KÝ5H©Üô·ÄÜâäB¨î¹,]³“M‘*AAA;†i›Mv†Ä/ ÙGÏ_
SŠ·J”v0¡€~ùƂ¤A2ÖÐAÓ­µY0d} ÓÝÜë༏ ‚ ‚ ŠÌåtÆ[ôF³ãD¤˜F”Öé{_ç¿©
-ă_ZnãðY´àÜç渻ô!‚Ük<‚Ký<KÉ«•“b2m!‚ ‚ ‚ÜûP:™†Š¬xÿà‘¢¦H?'ÞÖq!ȝ&åÞ$;4MDÏçf­Öó…—ãî§>·‚ ¼Ó
+ă_ZnãðY´àÜçæ¸Â»ô!‚Ük<‚Ký<KÉ«•“b2m!‚ ‚ ‚ÜûP:™†Š¬xÿà‘¢¦H?'ÞÖq!ȝ&åÞ$;4MDÏçf­Öó…—ãî§>·‚ ¼Ó
“”È9ß°²QAP4cÙåà®ÏkHotΫ>íç99Ç©9Iц­-¾Kbzó¥$£3ž–>$%›ò` ÅnMÒAAA¹‹ÈûLfs •¦Öa+C¹ÇCJû¡ªAî
›i]¥ù÷>î˜Y*ëì®ïm2Ú®pÙù¨}05퓧å挾Þ5TÛöaËi«T¦©b˜Òq†]ãëø¤<8#š)ÅÌÉÅ i¡6ä>å‘<Ký·U.”Oí"‘¶2–ª|‹–˸f¢”ÎX| íaIÊ,ζAÕ8Òëdîu»œ2lµ…ÓÄ8âtÐÞd¤W’TǺÇ-÷’}ʙҡÅv
@@ -232,7 +232,7 @@
-Æ^l™œ•Ý&ƒç²Ö÷Ãää>ÝeáE·\¿·±ßÚ{äÈkZňág~ßkÚ라29òYÓ~[ä¾'—éû>è+ö2]Ÿº ¶U™¾8²Ê7§in¨ž€7þ]‡õ‹ù©o®æ7yžçy>VBњÔEÞ¶²,ZVþÒÿêôYúfóžs£!J¤’Þ!ÿ£Ü¹so¾m)•‹¢”q=§i{cÆç‚Ðy?ÿêÍäœ"×ö)[(0TÚ?w¥vaMÓÚSøN¶¬î°€÷U ÿ8i“Ѳ†õñr¶5 ´‹ÙuuQ‚hû^+ê(î›QMzºèR üíeO¶X 2cÞ¬5Ôfn'«TN­w2ߓŎ¹÷H$ö=öÂõAA…r¢R~/?ÜÉ^㣮%&•®À-Ĺ×iÙmWJ@ È=«aLëõîÏ=Ì&“JCÇ~
+Æ^l™œ•Ý&ƒç²Ö÷Ãää>ÝeáE·\¿·±ßÚ{äÈkZňág~ßkÚ라29òYÓ~[ä¾'—éû>è+ö2]Ÿº ¶U™¾8²Ê7§in¨ž€7þ]‡õ‹ù©o®æ7yžçy>VBњÔEÞ¶²,ZVþÒÿêôYúfóžs£!J¤’Þ!ÿ£Ü¹so¾m)•‹¢”q=§i{cÆç‚Ðy?ÿêÍäœ"×ö)[(0TÚ?w¥vaMÓÚSøN¶¬î°€÷U ÿ8i“Ѳ†õñr¶5 ´‹ÙuuQ‚hû^+ê(î›QMzºèR üíeO¶X 2cÞ¬5Ôfn'«TN­w2ߓŎ¹÷H$ö=öÂõAA…r¢R~/?ÜÉ^㣮%&•®À-Ĺ×iÙmWJ@ È=«aLëõîÏ=Ì&“JCÇ~
I’°íñrËYA®œ](˂æ$EI”J’¢¤q%éãÆØù”È(ÒׯZµKVÍpm‹«tε´ëåªñžþ|—°D –ºjûj¢ë³æôƒ”¶+z1ª[–π̢:…ð§vͦ®dù2]_ÿ=÷󿇹uã@,N×Ò
@@ -241,7 +241,7 @@
Ù#N«"I >9TðÙÞPŒaÏY™\Æ€7eÙ ¬B.èìÀ,º©õœp<ïý“©m ^Ì2"9ðR•{{oFÓÞíýU[²‡ÒðÂ?º·}Éß|ìÃ<a¦"äp#.vHÅÙ¼×ÁÜhˆ)7}ú̈́$
|îáƂÂÕ)þ|0rÈ£WS’\({׎Î@“ßײQO¯ õ­ÞáyëÎ“Nƒ–aÖ]߸¦¾ïàoÑ6° ɂšÌz†”$E¾!‡¾†¦kôŽcÁøÏCÉyMQDº^ю½å‘wûcq×Ësù|„@ïD¼ùÿÒ<ÏÇJ¬ºeÐûgyV‚V¶ºrŽêuuýßAOwê|ãyÏn L#N[r\l§CSñú*õ¼nfϟZ*+Ÿ6öŒ~l˜åµÏ֚~ç¼ñKâƕhKMÈüëùÊ@]U¿ŠééïWpÞGAyØxÄÏ1=óOxžò:¹ôïP…ó
-¶MFݝ¶F«[£ËJ®?֙̃߆øi!|jÐÒèO?Úf²#w!Øöb›æ¹>† × šÖ-ö`„ç¹pïöÖ¡Sêv“CÉU¹”é{NӺźÄó—BöÆ6Íoú˜\cË=€›ñm¦:÷×!ašç/§¥Œ9¥4ÑSw)õ’&<ːOû³»º¾eðë`øüÖÛRO÷Oè|1ç8Ê8ânô·wË%É欃_׸ÐXÀñºÑò­&w¿‘ófÕªfÃò¥)Myx$÷]Îm– ݪÑ˲ IRô”ªþh%ŒÏh®{¯=>Ѽ‘>·zuŸ~îKúÄ뒞ññˆh“[¿rCV\&þsm`7µð )ÕñLež¥Vßòu2SPJ§CÓ4Mk*Rm‘DâÀ¤¶ñ²Ïøde×·ñ3“ÏìÉK_JǂÎf#Y
+¶MFݝ¶F«[£ËJ®?֙̃߆øi!|jÐÒèO?Úf²#w!Øöb›æ¹>† × šÖ-ö`„ç¹pïöÖ¡Sêv“CÉU¹”é{NӺźÄó—BöÆ6Íoú˜\cË=€›ñm¦:÷×!ašç/§¥Œ9¥4ÑSw)õ’&<ːOû³»º¾eðë`øüÖÛRO÷Oè|1ç8Ê8ânô·wË%É欃_׸ÐXÀñºÑò­&w¿‘ófÕªfÃò¥)Myx$÷]Îm– ݪÑ˲ IRô”ªþh%ŒÏh®{¯=>Ѽ‘>·zuŸ~îKúÄ뒞ññˆh“[¿rCV\&þsm`7µÃ° )ÕñLež¥Vßòu2SPJ§CÓ4Mk*Rm‘DâÀ¤¶ñ²Ïøde×·ñ3“ÏìÉK_JǂÎf#Y
ä
@@ -252,8 +252,8 @@
ë¶ÁïŽð§-:Zn!rƒŽ½éqñ¢ÔP©<ÉÍ)(™·(Š ‚ ‚ Èý‚ï-3YJ˜OóJûuåCäoX¤íÇHŠ6lmñ¥?›ÌòÎ7, MA® ÍÍ]E¥_X¬Íü›ÉHç(=ëfxêÓO_Êo“H$‚¯2÷Zr IDAT°4Œ'¸ìŒù¨jE»I’ô*š]ÍæñÑ@hÈ›áËB"‘àÎúLËB Nm•jØåæ11+†¾t§œÅ$ã
b"1+†¾öèó«mrV&Y÷‰  &¢<æ”]V‰D"•È^yú]nŽ‰„À…¯²É~²vÉ63°Ñs†–³]û½’)qšóîïb—Ïk˜1ÇYa^ËYÇg^nZL$Âå°çO-d)pb"g¿ÜY¯q®ß¥ IÉæ}Êà }CGÊMŸq3q{åBÅ15“cÇ眅Pʸ^Э]¡K<9ìÞUWgêNö£¬€ÎnÝx§Ù?£rý6éÔ/;ý±xg‡V®CÒ-*Ï[
»©¤%ë·óRßw°[í¾Ó!îRØ7äl0tk^豚A–Òic…*8•¼&üw­cqc Ê/ Õtog«åýAî2ÏE‚]Û4¿écIÅr‰øTPUјäÈ= Îû‚ ‚ ÏtÛ>ô·'}h¥úŠˆœùIÖ=®êÜïûñbttØ¥»x‰­öòI_¹g‹¾wL흜œ<wr ŠóÔéÃBo­M%'¸ä——îszêyX({åá¼{‡©5ဏZ· i_qäm€ rÛy$ßRÿí” d×sUmÕ喳BÁB ›?h) 6¬«¬¬~ÆÑúBÇ¥ò<
- `wº >¡yÎEϝÚØÛn•¦Ù:ñ°çMíÄ_ÛrÆoª”o(ù‹£õ¥¡VS]õ“Oíhwkwö…¿É§„Zz§Ö­Ìø¡¤Z“?øD¡.ý@£~—ðEWõã•Õ¿¶Œ¯°…¤?„R9p‡Æ™­Š{—#‚ ‚ r/¿ ºªºÞl|05íÑӃÖͶ†Ñ×[Ü_r»ªâmۓŠ^ûÿN9NºÌµ,MÓl­Ùí‰ýÔ¼~§mʤûè%ÐS %pZ!Lð^e)¡iú½£=›Áú|5A¬±Eµµgô##*ºþ…úb,+¡@¨¸‰+'ÅAÙ9OÀµÄ$”•¹ç8yOÔ¼r!N×hÑ&5?…–òç# !(N{ËVnèÞۊȻË×¥„B·ë
+ `wº >¡yÎEϝÚØÛn•¦Ù:ñ°çMíÄ_ÛrÆoª”o(ù‹£õ¥¡VS]õ“Oíhwkwö…¿É§„Zz§Ö­Ìø¡¤Z“?øD¡.ý@£~—ðEWõã•Õ¿¶Œ¯°…¤?„R9p‡Æ™­Š{—#‚ ‚ r/¿ ºªÂºÞl|05íÑӃÖͶ†Ñ×[Ü_r»ªâmۓŠ^ûÿN9NºÌµ,MÓl­Ùí‰ýÔ¼~§mʤûè%ÐS %pZ!Lð^e)¡iú½£=›Áú|5A¬±Eµµgô##*ºþ…úb,+¡@¨¸‰+'ÅAÙ9OÀµÄ$”•¹ç8yOÔ¼r!N×hÑ&5?…–òç# !(N{ËVnèÞۊȻË×¥„B·ë
@@ -261,7 +261,7 @@
@@ -269,8 +269,8 @@
-ÍååÏe'ӓþ‘ ˆÁq¯¡ØwBy†QT0}Ð;ß-žûk[\¥s®¥]/W÷ôçkyKÑÿ·û<õ“ç+`x¿ñŽõŽ â¥;i)R_o4l4ê6[œG9…©mq´w´k—å[ª"Mù…åÊ酷›;ÐWÎsÜö¡¿=8éÛ ¨Ìb^r©aªíûyŽîCœvwü1MI4¯­ë̏ыQéuî›#ډ¡:ã\ˆÊõP]u] Ä0xr4þñȶÈ!»~»§øÓYL§žíã`VhпašÎ]œŒ½ê±~½Õ+ÕáÿÆkþk`48*½FŽ™ò—;›, 9‚ ‚ ‚ ÷#ù=õ˜ëAŠÇ¸!3…÷=Nú¿q“)t!â¿Ä"×Å8/ðçDŽ/ýÆ5ZU®&áýæ—Þk?82yeÒ»·ÉÝhO?jÜÇÂѐO÷óPÜûbp»¾ÿB•÷Lt2<jœñ7å>¡÷ÛzÆlû&''}{­CÍ©pr¶±ƒ«j9wqròßaç﨎íFEŽÿûšw=%uä™ÖùÎD'㦒@ݺւ—¾+à8ºñŸk¯©{[Œò€j§·±ßÚ{äÈkÚ<ÍÉeú¾ú
+ÍååÏe'ӓþ‘ ˆÁq¯¡ØwBy†QT0}Ð;ß-žûk[\¥s®¥]/W÷ôçkyKÑÿ·û<õ“ç+`x¿ñŽõŽ â¥;i)R_o4l4ê6[œG9…©mq´w´k—å[ª"Mù…åÊ酷›;ÐWÎsÜö¡¿=8éÛ ¨Ìb^r©aªíûyŽîCœvwü1MI4¯­ë̏ыQéuî›#ډ¡:ã\ˆÊõP]u] Ä0xr4þñȶÈ!»~»§øÓYL§žíã`VhпašÎ]œŒ½ê±~½Õ+ÕáÿÆkþk`48*½FŽ™ò—;›, 9‚ ‚ ‚ ÷#ù=õ˜ëAŠÇ¸!3…÷=Nú¿q“)t!â¿Ä"×Å8/ðçDŽ/ýÆ5ZU®&áýæ—Þk?82yeÒ»·ÉÝhO?jÜÇÂѐO÷óPÜûbp»¾ÿB•÷Lt2<jœñ7å>¡÷ÛzÆlû&''}{­CÍ©pr¶±ƒ«j9wqròßaç﨎íFEŽÿûšw=%uä™ÖùÎD'㦒@ݺւ—¾+à8ºñŸk¯©{[Œò€j§·±ßÚ{äÈkÚ<ÍÉeú¾ú
û)Ì2Tкgu:Ž}‚…ÒymÍ©>œ‹äO[+ŸJ$’£Cvbˆü`YåŽÉ_4ä£åGdç†påm»¬9f¤HêXÔ»qÎø)k¥q(‘Hˆ¡ñµZϐܩ®jc¯t
)Ïɬ@>Z~îF‚•œ(³<ñhå‘+7¬Ê>"‚ ÚÃלZ
Ò5
@@ -280,7 +280,7 @@
JkAA6ŠO{Hi
,ڟ~;lf“ó³cê1ŽA.JÀð„Öú„–;:<ñu€;:lÐÐÚ'´ô
š® 3|ôˆÅM«ÕòGõjSúQÙ×LÒV͈âL0žV”QÉG§bñƧӌ¯‘“ôL¤k»Q_k0l0ÚŒg·•:zJŽí~´Æg
£]£¥Ô9–uËàÿgïþcÚ*÷ǁ¿)¦gÙnz0=d³vÓØN”;#ÅÝÜ]¾£s‰ýdýä®ÌOeF)÷æ^Ê5nÅg»›(Ýòqƒ%se7»¶Þè]ýÄI1óRçڛÍô·pš±ì4w„s"$ýþÑҖÒßÀ`ÛûBÚóãyž(íû<ï÷ãùw$q7òӼǞh“ ”’¤T îD}vÞmzs^à+U½L:t1¥ñ=ñ[«Ô¶hßuúG|¾óÞ6/<—\«€Ð/‰«œÓ£F{˜¢£Æ¶#ÞYÌé¹y޶ʞ쉝Óý— ¢s4ÙÜD?LX¯Þ¡¢ÖäÃfÕì×6–mÿWäÐoqIa´ê$Þ3<q·RÎèžV{;Ù3Ì]ô9Õ2J¶VÊE¸…k«vvy›=nã65]A«·\Có®CÚÎÚ4
@@ -288,10 +288,10 @@
íhpœñqçÿÊ٘h|–Ì‚(
 pA_w«ø¹8LxJ(cìÏ˵‹ÿ*Ç] 8öÖÕéºK™Ú¥RʀéSŸ0\ÐÛ¶ÃUÔék;˜ynxœe¯²ìU6ð½×ºW»ëxÄ~ÖÂ5›'"vu*G’´±©\ê<ÿÊP¢ÍÄWi¡}ÛËU}­PÕ¥Ìôl.U/Âÿ(›d˜~ÞuÈeNZªÑ/"'ªQBîÆcˆY˜jTT_…Sý±Cïõ݆à!‡lã¡DiîL¢Ó7¦“©§ÿ¹Õ¿jÑ´Pµ2 8Ãé?}­ÚøE¼ÌQZ¼<ù/±S€ Œ$ٝpÍ­}¬Òò•ØaÂû±9þ{SFûF|¶V-YdcqzÅð÷vöí1¦ˆË!÷"|ÝG!„º¥ÍãNäÂÞ3[†¿ÎñðcÑù¢Ë?Î}Âånjjm£õL0çÑIŏZ^$È7È5OjT*•j³Š*§2Æè@ý®÷twmokCåCë š†,É`Ž{4ÊjuÃ؆æsÞøÔI“Çgx8ب®¬|l‹G¢;÷%sÓêßûúßRÙÞh¨¬¬Ô2 j¯SŸ{¿Õ¶{˚ M³Eñ¦»~ƒ´ò=ì}¶ª½:^Ùäñé%¾†'*+«·8‚
-C˜òw¾Ý™ñ”ög6U?V]ýXõ&MãP:}!dx˜€‘·RykZ]ûž·ãÿhÏL´™ø*líÙ4ªncøÿ‚ª?f.U´T½ ´H™—AÂ×ÞŸë[ŸZF2UŒ¢F¡Ø¬È¦×¬#ÏDrñc¥æhbñÄ*ÂäÀš‡ZBÓQ†Ì¿P*±`͇´e]çµ0ÃV‡~‰2ñ± þ§ÕY[XêWÕ¶oBÆZ&1°´…;’ígo<íQ¤ÞM.dQ@_Ùcn†
+C˜òw¾Ý™ñ”ög6U?V]ýXõ&MãP:}!dx˜€‘·RykZ]ûž·ãÿhÏL´™ø*líÙ4ªncøÿ‚ª?f.U´T½ ´H™—AÂ×ÞŸë[ŸZF2UŒ¢F¡Ø¬È¦×¬#ÏDrñc¥æhbñÄ*ÂäÀš‡ZBÓQ†Ì¿P*±`͇´e]çµ0ÃV‡~‰2ñ± þ§ÕY[XêWÕ¶oBÆZ&1°´…;’ígo<íQ¤ÞM.dQ@_Ùcn†
2øÎ(ݳE:rm?ùɾ>8_ˆ#¶ºlϕiKM†–S3°6C÷Urò~l YûÄ´‰Îxnr¥Ž’;¥ËËÏÓ&:öCä5UJ÷ðþi^¥0èûL´0ÎÝk6]žŽ2áÌÛc—FαæklÚûKÈ"„B¡ûRî•0S—Ì¸ü`ƍ9,<~á‚ °P>Zåîî%dS%êd‰Ñ€ÐɪšôŠø‡eþ’qýsÁ(ï+öÏ¡`¸¥IÄä%َ˜Kù:©x[¤i:Ç¥Hû;õ[tº¡~í“ ÿ£§­9=]ˆùÔLÏrÖ×æ҅
-N¹z©Sî Ú߬”Kß{ºMÝòç{â1ôìÓiS¹Ôc]p߶ˆòáí´oė8@S«!etoWÃجÔöª¦Xç½üׇ”$@¶í †}Òò¦Ü#G!„BÝoV$—˜‡P^ë‰JHùEMd–܁-±®Wª÷ÔšE]ÖʝOºèhéòлFAsAoûŽAÅ+yZœh4jޟumt?K½ÉP"c9ӅòJMùɽ1¦¸´ ì©FûZTÎQaiMåH&å;ˆãògíôÜÏ¥ØL"RšŒ­¥½2\_æoÓÕU?¶©¥áØs(ðeÖ¨„ÅtjØɌ‹/Öĝ ‚8^§©Ký ´!ÿÌRýHeõ3ú±
+N¹z©Sî Ú߬”Kß{ºMÝòç{â1ôìÓiS¹Ôc]p߶ˆòáí´oė8@S«!etoWÃجÔöª¦Xç½üׇ”$@¶í †}Òò¦Ü#G!„BÝoV$—˜‡P^ë‰JHùEMd–܁-±®Wª÷ÔšE]ÖʝOºèhéòлFAsAoûŽAÅ+yZœh4jޟumt?K½ÉP"c9ӅòJMùɽ1¦¸´ ì©FûZTÎQaiMåH&å;ˆãògíôÜÏ¥ØL"RšŒ­¥½2\_æoÓÕU?¶©¥Ã¡Øs(ðeÖ¨„ÅtjØɌ‹/Öĝ ‚8^§©Ký ´!ÿÌRýHeõ3ú±
ÚږzfB!„Ð<,ÑUJÒ|ØÅN
@@ -304,7 +304,7 @@
ǾΝÒåÞnýT§/fähYáë>B!„º?i·jWz-×ïÞêð¹µ ÂÜóÌλ'°½•)bé­&ËOüpδ]Źm IDATüÊYW½^ÿ'o¡ã( }hSVÇ7=¶ÅÉ*OûO'v‰K:Õ²i»Î)è¹Êú‚·‘㹋#üß=ÚÍ
-iJõ•„À‘Æÿ0ÒqôÜč ×ÁfGÓ¼‚±Ú¸~o äw«®6ÌRv«û.U¹.„&ÃÚ)Oƒ6k\âW\OS °Ê¦N¶Ê8zebâç€íUªswþ¨Ýjç¤Ê}!4ÖI¼uOÄkú“kՇÞ?TÈÒãu‰ßv>+n)Ý]­™7)³ÆPè%™Ìç@êÕŽc/ùº›û¯Øc»†> *÷Q£l!Å>eð¯C‹i¡ÕCFyH¿ßt¡åËîY.eŒýYyû›C067 sz"âçoͽ lû¿Â&¿ß«©4øö&—Úȑà³ØŠl%uššU$\ï™’N8-tÐýžŽ5µè 8aÞªÕÔ¦¯ïšm;f!„B!„B˧í yÏ ò¾Ý½ÖK9ƒ*T­L}ã¼µ†’±F£V8çšÊ6€nà¤×𚁮QjԆ½þ{ÇúgØÎ(SȌʼí@æúìT­Lΰ`ž¥A_«–ýÞíÜ^h5ùÔ•rF÷´ÚqÜÉl×Iåtäßöä ¦œ–­•rŽ*§ lÞ¹]ÞfOȸ•z›Á5ä©|n0±×vÖ¦© û—ö5•-܌™¾íoã'nĶӶ¡æda3YIù°”Ú¨Ž=«ê§U zòœ2÷ým|tÚª$€¶žòõ>X90Ùo¨ dÌ
+iJõ•„À‘Æÿ0ÒqôÜč ×ÁfGÓ¼‚±Ú¸~o äw«®6ÌRv«û.U¹.„&ÃÚ)Oƒ6k\âW\OS °Ê¦N¶Ê8zebâç€íUªswþ¨Ýjç¤Ê}!4ÖI¼uOÄkú“kՇÞ?TÈÒãu‰ßv>+n)Ý]­™7)³ÆPè%™Ìç@êÕŽc/ùº›û¯Øc»†> *÷Q£l!Å>eð¯C‹i¡ÕCFyH¿ßt¡åËîY.eŒýYyû›C067 sz"âçoͽ lû¿Â&¿ß«©4øö&—Úȑà³ØŠl%uššU$\ï™’N8-tÐýžŽ5µè 8aÞªÕÔ¦¯ïšm;f!„B!„B˧í yÏ ò¾Ý½ÖK9ƒ*T­L}ã¼µ†’±F£V8çšÊ6€nà¤×𚁮QjԆ½þ{ÇúgØÎ(SȌʼí@æúìT­Lΰ`ž¥A_«–ýÞíÜ^h5ùÔ•rF÷´ÚqÜÉl×Iåtäßöä ¦œ–­•rŽ*§ lÞ¹]ÞfOȸ•z›Á5ä©|n0±×vÖ¦© û—ö5•-܌™¾íoã'nĶӶ¡æda3YIù°”Ú¨Ž=«ê§U zòœ2÷ým|tÚª$€¶žòõ>X90Ùo¨ dÌ
¾œÅäõƒnÅuGõVÃÀß}«¬Äk}C«ÿJßM*½ o{fWlo`ÄkÞ­•mîЬËÕfíçd8墾ëTî4»ÏûÙ«÷ ­AÓ-¾ÇD—Z¹ dr™¶V£J%\ôkäSÅ05Œb³‚’eÈ÷W­Ï¿#‰»‘ŸæUûI„V„ÉPJIRªw¢F<ï6½YЬvX¥¶Eû®Ó?âó÷žø°9ïäZ%„~I¶§G/Œö”㐮Çë‚uï:,áÜÔ-â’Ìë¨æwºÄ›ñÀ‘\áB¯ e1IA¿u­~d¼JKòw²#>þf˜»è sªeT,]háb­]ÞfÛ¸MMWÐêm×м됶³6‚a×Ú¿´‡¿ëä
@@ -338,26 +338,26 @@
-÷?IÁ,ïøƒÙy&½ÇŒÍf$•‹YŽ6—©Ù{r¨ËÔìª8+H%dQß͟…µ) <‰ˆ Š¼8+…™¼|>››Sÿòi˜¤ñï-…XŒ^³M«P©9©‚¡@o>æ´½b`jîåp–í -ÿA%éê®ïm֚n°é+GR4C“rXøôÊ«&Ó\~÷k}òŽ‰óÖø¾F]¯‡ª}÷þ¼!÷¹i»˜Æ~¶ãhu7€€÷¶§Tñëü˜Q½ó0ý(ÛvêióéåZ¬VÚ9®]Ï¥ )œŸ¹Xv‰/BDž«‚îdÑxþN]üœÉ³Ÿ=ÓH”ÑüüÃüû•$՘¸Ëo$‚ª±¦C¤YGivš·““>s³–® ‚ hưߑèeá³$LºÒ~d¥u
+÷?IÁ,ïøƒÙy&½ÇŒÍf$•‹YŽ6—©Ù{r¨ËÔìª8+H%dQß͟…µ) <‰ˆ Š¼8+…™¼|>››Sÿòi˜¤ñï-…XŒ^³M«P©9©‚¡@o>æ´½b`jîåp–í -ÿA%éê®ïm֚n°é+GR4C“rXøôÊ«&Ó\~÷k}òŽ‰óÖø¾F]¯‡ª}÷þ¼!÷¹i»˜Æ~¶ãhu7€€÷¶§Tñëü˜Q½Ã³0ý(ÛvêióéåZ¬VÚ9®]Ï¥ )œŸ¹Xv‰/BDž«‚îdÑxþN]üœÉ³Ÿ=ÓH”ÑüüÃüû•$՘¸Ëo$‚ª±¦C¤YGivš·““>s³–® ‚ hưߑèeá³$LºÒ~d¥u
¾Ñ—ØëyS?À+<çF½§k%Þ]ºÎÄé¶ýžÖÜWFm/KûþÇ°°Ùä×løŎ£ºwúGý£§ß×ýC 7K&‚ž¡+è¿0Úÿ$C{“zÌÐl–¯ž%l‡Zx›+þ ,ÉPc»
ÿ>p^E¹,9QÊOñâ¬@R
çîN
}Tî[ÔêNJ}Êà_‡ÓBQîºKbèŽI½Iýïx҅ò&戳 ª’-I_K£Œ±?+osÆâ“ÐÎ鉈Ÿ¿5÷Z °íÿ
›ü~¯¦Ò|<àۛ\ 5GnŽë5=÷k;÷i¼MF¡Ô<-®W¶šnSR§&™59¡}œ`NÿQU·wÈ4å؎‰B«Jléð•B!„Ð
HTüø:"ªJ)RU 0$Î
&öÚÎÚ4$cÿÒ¾¦²…›1ÓÀ·ýmüčØvÚ64ÀœÌ:“5WãeÞßkÍ_3+*ß
±q¤|Ø?JmT3$€úiˆž<§Ìðm¶*I ­§|½VLö*H ó‚
ä’Úáu›^Ӛ~˪
)ôB:YòO[*‘ÌÎ;F`{+«{wÉÌç@›rÞ?PÈOt±›ƒa±uqñCYU½xÓ`É(BË遌׮ï@ºPî¢7ÔºxvO¼èÀšwk)’ HJ³Û̦420æÒ0”ò]ì®ãŒMý0E”‘û]웺†&‚¢•æ£ñ알‰BiÉDÙ2€t‡›"“½õI7ìm¤âïiØ´‹R•íqÚþrÕXO_Ö§Rss„öÏÇ-·Î{ì
KèJHµ6W %uZXBÀ~Msk€0/ë"ם¹¶&
-!„B¡U QÍCµFƓwa|$¶—’©`4šø9öuùœçsˆ<1Ð C@dAa?:à÷ûûèzÿûEv6K‘µŠl=Þ-uTp¨KRIæ.ª´€B7ü¹ë¯ý“ D¦€»á¦Èˆ›6¿¸M¶Ûh¥%bô‰ïw˜úyq hUU°'‡Æ¿ð²'‡4rZñ¨‚® érDýQ·1ؕmÔ¥îÕÏMy$iø§aÊ'¦lJkÚk€,r78jløKäœÿ4SÄß4IO-»µêZf«ÖüÉXÞbޔ˜›þ`%ŒMÞcœr¯»ccDÿkþCçÈÊåt
+!„B¡U QÍCµFƓwa|$¶—’©`4šø9öuùœçsˆ<1Ð C@dAa?:à÷ûûèzÿûEv6K‘µŠl=Þ-uTp¨KRIæ.ª´€B7ü¹ë¯ý“ D¦€»á¦Èˆ›6¿¸M¶Ûh¥%bô‰ïw˜úyq hUU°'‡Æ¿ð²'‡4rZñ¨‚® érDýQ·1ؕmÔ¥îÕÏMy$iø§aÊ'¦lJkÚk€,r78jløKäœÿ4SÄß4IO-»µêZf«ÖüÉXÞbޔ˜›þ`%ŒMÞcœr¯»ccDÿkþCçÈÊåt
£Ø¬ dòýUkÁóïHânä'oêÞDhE˜¥”$¥Jp'Ê»ónӛY'¤çhœûʺÅä9qáœ&ËB©™ ¬RÛ¢}×éñùÎ{O|؜÷ r­B¿$ÛÓ£F{Š¹2ÐãuÁ¿ºw–pnêˆú_¬rìîM›®;ò—œóM³YG5¿Ó%ތGŸäÏæ>!ŸÙ0Hä‹k¢Xì e“¼ÞDDâeÙӅ
@@ -367,7 +367,7 @@
W¯‰–òCﵘ?£…I7€ÀÚ>rX÷HJ{ÎÑ´é¿» <><β‘y¯*ò†ÐºûÙR½•³0©6ÒâMÖsÌÚ÷½ ˜÷Ü Ræ7•K}aÑD—r"F û¤åM%ŸŽÐR‘‘á•WšGŽ89DnTðßù4rZQ•+]¨?=£'¦ŸŸ.Ô⟅b
?ÅÓåt¶=¨ßõž–˜º[Z®GªžÒY‡,#šdØÚ½ åø¨~ÛzîT|»ÉãcÆFuedVªz¡ùÜ7Y§'fk<xÈž{u•‰¢ìõ_Nx·ÑÙÚÙûlU{õzï…[®§ÕçÞo5îÞÒ~S¬z²ÞrÐ]qKå#zsåx~bnx¢72+UüºÉ=WèX˜òw¾ÝYx˜”o¸º>¡zÿUÐlû3›Ò¶œ¸1m¨ TúB£–ŽnKkÃøMQ¶AÑ´§câ‚Qù+"ÿ¹ Òd‰ÃN¦í ªÒ—Id1;ûó‡ÐòHL' ö²»ž¨œ·Š¬ „¯‡=#>×·>µŒdªEB±Y‘1L¯YG0ž‰­ñnÄX©9F…Iך‡v%þ¨„Ɂ5µ„¦£ A̋#gbü€–x°:qp¬ÍÐ/Q¦,½‘Ô»©·c§D£QXêWÕ¶oBÆZ&1žø‘o< †
;™±clÞ.Ô¿?×µ•««\³^m`:O;êéÜÛ!ž(”u¹s„B!„î,Ò|ØÅN
@@ -383,7 +383,7 @@
2bŸ2øסŴ€Ð=)5R1z„Z)‚ 2¾
-ÛÉó«æá ïeK³´UÓ,a­ÆeùÚÁ ¦¹ÊŒ °æ§§dR®‘¿ÉzŽ[w©«O„& %¬Ýšs¥£$iýð‡ºMÿSç~e¢±‚g³6(kšø°‘šRçn!„B¡¥WL™ŠÀ,˜»¶÷mT9%—Ë3.ÁÚÙåmö„Œ[i ·\CžÊçc»¤2©TVAÓ/YnÝ0Qżû6i:2m£€¦î³ÞJí`îS
+ÛÉó«æá ïeK³´UÓ,a­ÆeùÚÁ ¦¹ÊŒ °æ§§dR®‘¿ÉzŽ[w©«O„& %¬Ýšs¥£$iýð‡ºMÿSç~e¢±‚g³6(kšø°‘šRçn!„B¡¥WL™ŠÀ,˜»Â¶÷mT9%—Ë3.ÁÚÙåmö„Œ[i ·\CžÊçc»¤2©TVAÓ/YnÝ0Qżû6i:2m£€¦î³ÞJí`îS
ÆèBèÎ#æ*e.z“£ç¤
†Ú©7s²W—¬úí M¹Z£èË­õÿÉï%îrߚ¥ӓLåU S“òÅÐ w©kµ–#ÞÓ¯ÊÚw8 xy†AÑñ®«âÅ(c_ôÜç™l#Tîuw=-ϙ€ûÊÜöy¸ßw‚*Ëß B!„B‹—¡†Fˆ¢(Ί=ÝÐþ?íҔ0i¼Q·1–mŒˆT†¼'‚GÍJšV×ë¿‹5¤¯#bӓ)ÍnÖå8¸¨î„)Ÿ°)17ýÁJ›*jtʽýo¬…Ÿ"+—Ó)¨Ø)ªV&¾ñx¾,ÉX£Ñh4žèÏ.œ¾1MøÏ­þ}T‹¦%¶+(“¥TQ¡$ ˆã‹k-1L^=Î}sn¥‡€B÷µd˜>õ¿cßñ£TB¦R‚# —Ãã
@@ -401,9 +401,9 @@
-B¡å“xô@îãB!„Bè.’ðÜŒp×Lâ¬hé´Dnsâm>þàoò‹ï«£³C±6ת¤y(äDîªßñfCPœw@£zû¸q40ºàÖÎxê4–za^´Ë ÜþݼjÔÝÇXžžÄÝ¡7=ÒGk#?u§EŸí.‡®„b_£_žPŒÖimñ}·ýuÕu^‰fàìp(pùÄû¦à1³z·³ð•Ò)€s·^;ìg{~¬ŸêôÙG’ÚBZw¡+!¿·yá)ÜÖêÝ͎Qç^MÞöÑB˜ŒBÅp+:9–E݅p Y„BݟҖå®qæ.sóNPn´úFô–Þ¸ÇÈT1Úz-ýðÊ|&]kÚU`t’3*wxÄðõHòÞM¬ñÖ/ÑX³À9×T¶G£¹æõg3°•nŸ²ðcs“Ð9çšÊ¶ÏoM7R$€À’¿ª6ù'¼šJéû—}{•±Ã‚8}cZ_‘¼!\³®©îÎàÚÉ´‹fî SòQ­ë•ÝÿŸ½ómâJ÷þ3+g5ƒà•òDt•‰š6a÷‡§EÅYV­SÐ%HiW³]]œ¶*q¨–$]õâP-qZ•ÆT·ÄT[p*Q®hí^µ7fU6‚ÅA¥«Re¢m•±HÄX—ˆ],åýÎíØ㱝ð|„}æÌsžsìŒÏ<óœï¼>c¢åÎ͐y5
+B¡å“xô@îãB!„Bè.’ðÜŒp×Lâ¬hé´Dnsâm>þàoò‹ï«£³C±6ת¤y(äDîªßñfCPœw@£zû¸q40ºàÖÎxê4–za^´Ë ÜþݼjÔÝÇXžžÄÝ¡7=ÒGk#?u§EŸí.‡®„b_£_žPŒÖimñ}·ýuÕu^‰fàìp(pùÄû¦à1³z·³ð•Ò)€s·^;ìg{~¬ŸêôÙG’ÚBZw¡+!¿·yá)ÜÖêÝ͎Qç^MÞöÑB˜ŒBÅp+:9–E݅p Y„BݟҖå®qæ.sóNPn´úFô–Þ¸ÇÈT1Úz-ýðÊ|&]kÚU`t’3*wxÄðõHòÞM¬ñÖ/ÑX³À9×T¶G£¹æõg3°•nŸ²ðcs“Ð9çšÊ¶ÏoM7R$€À’¿ª6ù'¼šJéû—}{•±Ã‚8}cZ_‘¼!\³®©îÎàÚÉ´‹fî SòQ­ë•ÝÿŸ½ómâJ÷þ3+g5ƒà•òDt•‰š6a÷‡§EÅYV­SÐ%HiW³]]œ¶*q¨–$]õâP-qZ•ÆT·ÄT[p*Q®hí^µ7fU6‚ÅA¥«Re¢m•±HÄX—ˆ],åýÎíØ㱝ð|„}æÌsžsìŒÏ<óœï¼>c¢åÎ͐y5
BªtŠB°àøiÊ9&šrçșäšK‘:”ˆÑ7ýç%w“!u4¯}$¸…ìaä\Dÿ´ön{ òÀ‘š»þJyv(L
@@ -417,7 +417,7 @@
ªê1 Ï9-}YâÏï¶ ‚ "©à¼¼èMÏñct•V­7D"àÑÀ­ã7Ÿ'§^VÃ1¡vÂ}æÔ1QFž³§‡TÉ«ÞxKp¾RÇÐQF¶ÙÂB҈¬Xd²ò
Š •“M{G|F–ÖíÃ\µ™\W)Š€†ß¬´\æ¸-rŽ]&š"Š6îJ‹9y´ ’9 áìêY7n¤+dºods oÙ¹ãi±ÅÀ¾ ñàüyÌíˆ]îœG:ý⺑‰ó«AõøÓA_]}¹gȚ³ÒAA¹ï‘ 1Úޔzßï…xÞsõË!ðC:ûi6hu‹ǵžÓAŽç}ÿanÙ®+Iôf‹š¸œaö»@ 'Ë#ˆ/-6ŸÅØW‘-GG;?æLïZSåïE´m—RQñ›}0=ì¼*×ótãŸÛ¥©„Ò ÕûŒ¦§iNBqœ1lR˜;—ù6
Dӟ¬âøÄ£ ÒäV˜k¡ú‡Õ+ ¡“{ζ×x2=Ìc‘#‚ H‚t˜>ó×±þ9søJ$p• Dnˆ/𗇅ϦG´²¹'y5Àô.ß ûõ¿ôך²Ó·eQPoôî2x&õþ c£CfU°fc3@^±Hï.Cϕ
ÜÃíþ× ùm< È#‚ ‚ HŠð…ð£O<zàíoóXèýó–~s÷ë0?)ŒžõZêgãéq©Á\ãþ2,LòüÏ%¯0v½¡Ø^ë>ây>üµ§®~Áaú†ÖGÔµ»:ÂW9.îØU§~¤5•/È¹å½kïԏ´×¦ÉÔÌ\üÙˆIímé;&Š±Õ¯"=ûòäÛfÜ'ZOúèómºÿ¹0wuÔßïª5vjž9`g
@@ -450,28 +450,28 @@
G¹ç@‘GAAcôhÕ¤aãøa.žÕ€¨UIî¿8øŸååSüïÚ²$¬¾Î{ÚS…?é0° A4£³ %
Ýí.8&p è“þÑfý¬´”µ†5Ë檷»n£q°¯MEéEžçyž©hFC8bSQ~îJ¨³±GûBoâÐÀшîÕ •h_ÕE>È-ϵœå¡q§Ì}ÙU¹½Ku›.ËN>ûÈRÃô´ÒŸ‚ r›HçóŠÞˆ7Ğ£nãV“Vo€µ¬ëS¯ãE+ûТÉÞÇb(èI¦”áÒqû.;ëæEû¬r"ˆœã‡ì%“ÅÈ)
Õ&­Ä6ow[GJV!,àÆ|Å"u{üíÇéݛBÄÍíhþ"zbì]VØà’EA¹­¬$Ê/R7©·¯®ÏL”à¥
ºZ­‚žqÁYEÅ:gfœ òžeåÍ΀9[àÞ<©ÙmÜm™ô@Dv[ΩXÆs‹s-+xØþMØ^ÍÀWƒÞ5š6÷gèÞä±wYI”'®0Kñ… ‚<üŠ“é9~Œ®Òªõ†@`4Ø u|à.IÃQAë0WÛ$‹’Ä
xLÆs«Oúíu†œüŽb]½Å·ü=ÚwÆe¬b˜*£ëL_ô-©Ê擽F-CQ´ùÕÖb÷¥)©wÊøQ+CSº­Nhè5V¥ü‰*£²V£kg…ûàÏ;àa™ü˜¾Ñ±‰ ÆBM»?
º¡€²‡ÜŨHé—P1ßÒ%N¾U‚ ‚ ‹Â] ®Í³Q
-4k5ÆMF½^¯DŸ+IŸ°?xª³º«©¶|Íʺ}ýö€b‡Þor5Õ¬\S^×hÿÛ¥‚òö@ÈúP¤ÎP^þÛG*óà7‰B‹*T»±¼¼òQwD럚O§òà6jFj7–—o¬a¬¡¯
-« ú_«QWi¨YÛ8t¬0 þµÉµëÑe¿&ŒÚ×ü[֒忱äŸ;ex+Ô÷†ÞõJmyy¹e߀ýL:n^ØNß`…á‹®¦ÀëµË~M_êiìO/ÀÝódEKery´8n{³­ÈÁL {Å×þX±âï-O¬¯üme濁ä}–.4vɦ•:šj×ÿ¶²vW §±N\VEœ›E¦ά;ؑKÛç6 îãv‡5·|ޖmÞPu<Xó'¯²ý»Ë¼‚á£A¤ˆ™™x !#%ùð¿ðsAï?G¨uZá|Ȩ¡µZ¶ŠÕoÒÓ«³×‡RÑwífjcqÒ»lÍqÒ·lMCæoA_\¿YGSAÌÑ×Ër‹ NÈüËV>ŸU¹u즋¥ø³ÞŽÞàù”X$›¨œû‹˜Õtâ­¾š¬¬
+4k5ÆMF½^¯DŸ+IŸÂ°?xª³º«©¶|Íʺ}ýö€b‡Þor5Õ¬\S^×hÿÛ¥‚òö@ÈúP¤ÎP^þÛG*óà7‰B‹*T»±¼¼òQwD럚O§òà6jFj7–—o¬a¬¡¯
+« ú_«QWi¨YÛ8t¬0 þµÉµëÑe¿&ŒÚ×ü[֒忱äŸ;ex+Ô÷†ÞõJmyy¹e߀ýL:n^ØNß`…á‹®¦ÀëµË~M_êiìO/ÀÝódEKery´8n{³­ÈÁL {Å×þX±âï-O¬¯üme濁ä}–.4vɦ•:šj×ÿ¶²vW §±N\VEœ›E¦ά;ؑKÛç6 îãv‡5·|ޖmÞPu<Xó'¯²ý»Ë¼‚á£A¤ˆ™™x !#%ùð¿ðsAï?G¨uZá|Ȩ¡µZ¶ŠÕoÒÓ«³×‡RÑwífjcqÒ»lÍqÒ·lMCæoA_\¿YGSAÌÑ×Ër‹ NÈüËV>ŸU¹u즋¥ø³ÞŽÃžàù”X$›¨œû‹˜Õtâ­Ÿš¬¬
›uá-}\ÿœ©d1Ÿæ’"±SÓËMÌÜíAAÅgÎíÃ$qó¢@Jr:›TFþìòp¿‡Ó×[´Éé“pŶrsdFå=á§Ô)îƒ6>÷"ï^¹1”,šÖՔéÛë6&û.iᖕí§pìuÜùۖ;|+xáZ
ÐÀÜ~"‚Üg¤~’äEoŽ¦j£å1½x9lÔÐlż4@Vë°%‹ʉEÊjA*·[¤«óÓ|,HI½Ë¢$íÅy bR9ôñ³.Žkùg¬ûÙm¦xÓ©Þt ·I- Áñ9++c?`¹þ6¹‘æoÙìÐþû=Û÷Mïø§»_âAA¤(ûaü$3÷VÔQ%-ï›S?¸ƒMØ,ՙ¼Aç²Ù
GsµÑþœiþŽ «uXˆ’Å
@@ -481,12 +481,12 @@
Õ_Ykê.b~‚ ‚ HqÌN¥„›a{ Ø }©õo'”ã°Ïq¸„h­wff¡ª ‹bd~ƃg <‡˜K ãs[;…dB±Öð±Ñù»åXX'w_¶pËÅØ_ZÌë
Fk]þƒ®rS Bªç>·ÜF÷n?ÁsAýÓÚÂõAE… ˆ¤Ö7$Âô·CÃñ’ó¾‡\E"¹+"‚ ‚< dÞ>ÈÎ¥K`ç֗Ýé*oŽ‘œc‚,}îÊmË"^Á¼;tðîP¨¾Ö
-³Ô</\K‘s Ó#‚ÜyR?IiÑ-š;™ IDATÔpDû \Y‰ ‚ Èm宄Â1þŽ È¢°ˆëéQ+K»GÂù~ñ… ‚ïå#ŸF!E2
+³Ô</\K‘s Ó#‚ÜyR?IiÑ-š;™ IDATÔpDû \Y‰ ‚ Èm宄Â1þŽ È¢°ˆëéQ+K»GÂù~ñ… ‚ïå#ŸF!E2
Z‡KJ¬PÙՅ°¤º‰ ‚ ‚  ¤à>äâ8®pUAÓÓ%I`!‚ ‹C*8ÿ+åzEC9û¸IqffFà9ﻎ¤Æ÷
-cðl0ß9´Ö;“ÊEò«x]]K«›‚ ‚ r_“›‡$
+cðl0ß9´Ö;“ÊEò«x]]K«›‚ ‚ r_“›‡$
¢ç¨G˲¾£~Q#õAø&ÅE4x#Êá֜Âð^E×¥Þ
mAÐUs^g§2­ ;ì£ùLâdÈÑhbVSAÐ kÝëNµ’;þâ¤/kQéü…!ƒÖž´yÕoyZG•Ä
ìh÷žq±jrôb óu‡#¹Ó¶"›O£ž]Sÿ(À-¡Öð|lǁKŸØ¨éHÇ.‹ÁªåNZ€ÿ;¯y¶Ï÷VR˛\ž|‘¯Üù‰Y·ËÃ)ïyºÅ÷HMî)ü—ÎÊ흍îKžW í#YÜÉ+Ø<.\‚ Ȉ
0A;IæQîÝÑ}V‚ b‚ ™¸¹,¯:òÉ7ßÄ¢û½SµÞð°¦x–$-Êó¦Ãú¶‹Õ.B¤Þuȵp#÷ el–×`d6 ÷bÒoÌîH)r-ÿŒÚÃá ±Üq|4´G—:USÁ²«“_ ¶Ší=Óz¬²À¾—,üS½ü'I›¬Vg|\Z©k
@@ -496,11 +496,11 @@
[­¾+B¦ñL#
N\›ðjt×ÏJŠ£þ¡Ë|È7qmbð£Æ#öšÑâfÁÞ]†ž+¾ c£C¦é@­É•(ôLêýÆ&F‡Ìª`ÍÆf%yšV0ÒUßcí:qâÚúÃæèß[’Zêâ¨ãr¬ã}SÉ̵ ÔrC÷_»sëÐz—~¹dû"™ãÕù1§;­ÁèÙÔ¾Ø ú·íRô˜7c¦›Šò³pWB=Úz„áhšÊþΰU,=7oX³,sn¼lMCfÍù4
esê·µc¶§`¶Z}òÍý‰C$€š$Õ«f[Çõkv…n¦¹%4ÿ×ø‰k.ãj
xÙOùDᥛNŒód¨ë×åÞÉ>kþ;™¦TŸôÛ§Ø^-,s\<ÓÜg-°v¡ò[¯Ø•´M XÇ>Ù=¨Þ´µû<°Ó)òî@Lº´sVYHvKÝÿÎð<*«~y[×;ë»ÉLðf]å3*Í©Qsêt ¨¹S&}£cfuzª/Å•ºÙ§óm´?*5U¨ç½%xÞq8Ó¿Ü=tØp‹×>Vm|Ñyé+ĸž×MuOìy_ÞrPWl‘¦Üىó¹-fõ‹Î6›§÷›1~¯®n³C¸2Gv)Ÿ}¤ç
@@ -515,13 +515,13 @@
*MnûsZ,„þa5À
Cè䞳í5žÌ屏är›®`‹sáZbܜ¸.òBâß͉ë‰2%“BâßÍk×ÿrKžOü»>1‘ø—[RŒq²ø¢ìô'ñ¶°?“EøÃѯIAœ
ú#ð|1v
-û“()hçÚõ‚þ\Ÿ˜(ÆÎÍkEø3Q”‚þÌùFñÉ^ܼ–ün$Çp"ùÍT®ϟ²ُZ‡Z×÷œ™Ø¸nÿ\p|)Ø?ç÷®ï9s½5pý^ÿcGî:*‚ ®ÏLd•Ö?gîùÔ'¬ÓA+Ý¥iIøaDø<`yҘ_Ñï4obøËÁ–ú9yͦwyop”‰sÎFK­‰å‡ §-‡šD{ûýõO²üå@ó®´Aï.ƒ¬þ } ðî}–šÍâÏބbcûÉ!ÿ3,ÞóèöûË3:
+û“()hçÚõ‚þ\Ÿ˜(ÆÎÍkEø3Q”‚þÌùFñÉ^ܼ–ün$Çp"ùÍT®ϟ²ُZ‡Z×÷œ™Ø¸nÿ\p|)Ø?ç÷®ï9s½5pý^ÿcGî:*‚ ®ÏLd•Ö?gîùÔ'¬ÓA+Ý¥iIøaDø<`yҘ_Ñï4obøËÁ–ú9yͦwyop”‰sÎFK­‰å‡ §-‡šD{ûýõO²üå@ó®´Aï.ƒ¬þ } ðî}–šÍâÏބbcûÉ!ÿ3,ÞóèöûË3:
ÆsM¾@X¿– ¼S×`¯u5ñùœÉ7
XÎ%ƒkVX×À`ϲõ¡^ãŠ<K´ïøŸ¨ó_½u  Sç Y¶>tÃU¤}AäŽAQ»–…­f’ÑH7$†aôèsånôþyË£æ:ó@Ÿi+|hn $Ä¥sëÌPãc ÿ³R"ÎܶÙÞg4ÍÛ¾:XRp¿Òܵ»ËØÞg4&k‡¯ËΐÂÀ;»Ÿ1â¤?¯Ù¦‹6B=doT;L/µTìô&÷AÍw.É€ý“ëcì§`Ëöü‰Ã"çúÀ—G÷Ú;õë߬‰“¿KµÅŸ]˜t¢-}óE1¶úU-ž}ÁŽÓu2&2n9­'}]¿©ÑíˆvïmÔiÈыN{§æ™iåÉ|>. ÑúUd(*%šàÿÑ<,i†žËȑ0V)5ÓÕ^;']/š`šóì³hžêÖQùÊ@Š†ÈU2™=™-³ÍÝ·3Ðbl¨Ÿð'TqòÙGbž êŸÎ’Å,Z^ð\mº]‚%éÕýá5ß×êÕ@ªÈØ´›†/‘*â‰ÿ!ó5‚Ì‚ ÏwåEotÖü¸Á}ÜÃ>g&5Lì‡QîÓ~ã*F½œ,UÃ\gjŒlïW½ËÊwó·L~mÁŽîáú3cö­ 0ŒÍ&XnêÈ/¸<¯bc¶$dI+fP¬«·ø–¿GO¥,Ÿé;²¦¿eOT6Ÿì5ji0¿Ú
äΗƒÒ …/Ñë ‰DÃãz©ƒ½´cÇÖìæĎt¾Kéê–àø¨•¡)f« «u ×ø5ÇaEgrF£8e̒>;P¼pí¬h~gÄ~ØȟwÀÃ2™CYbŽ¤j>qÀ‚tCe¹‹P‘Ò/!þü{A{zErŽù«±SëÒå¡#¶Ú7‡O„/YªòþQ5:Þúc{ÖaWpÈ6•ï
{ÜÜwVýÂ,Šuõ³7t’-̏lÓùŒäº¤ÛžÙ[Ô¹uû=uûӂ-336Y› …¼î®0d5õs¹B3ºýá™ýòg=ü¦£ûd0§ÿòç¦|[H£úN;·±{Àpxtæ°\ÛÌV{pDfÁn¾rèù”kýVŸ[žÙ¢¼{³d*c‚’§ùì#²Ü±+ؼ/\K…"%bå³@çZŠ¶E©Š{
@@ -532,8 +532,8 @@
-ÇÃæÝFÇ̌(Nú–­irﱶŸý³M'NºÑL‚ ”(žýVçсñ)©b“¹ãp}óææ¤{"ç°Ù<§Ï&„{?éK$]†Ø-ŽG%u…Þþö çKº¬Êúß5öõ{ tvӉ·fäsÕ^Í9?^áºïq:}®8jolîÿïᨫ·Ù¼s±9ýJt_ù>!ÓxðÍÖÝ?>%UlÚÒq¨×ÛôèpÜ|ýÛÆek¾ÿ[k]«{<úg›|'ÝÙm哼Ÿz†“ù–uFä}yFCށìO¹”Ï.ßè¥lŠœsYeçïX°‘ÍíTn¯O\»i]MÍ9¤"õO™Ûßí³Ìª@f9ì?ìè:êù.*©ÈŠuzë«Nç+¦âÝHvZ®#ù<4w”o?Òûíuû†Ô²Ѭ ®m.: ÊâØëhz¹‰Ù°hþ ÈÂÉú­Iÿ)Mú–­i¸þ3´f×<jxÿ{ß+:;¾ló¸ebĕy± îÓÕvGö~e
+ÇÃæÝFÇ̌(Nú–­irﱶŸý³M'NºÑL‚ ”(žýVçсñ)©b“¹ãp}óææ¤{"ç°Ù<§Ï&„{?éK$]†Ø-ŽG%u…Þþö çKº¬Êúß5öõ{ tvӉ·fäsÕ^Í9?^áºïq:}®8jolîÿïᨫ·Ù¼s±9ýJt_ù>!ÓxðÍÖÝ?>%UlÚÒq¨×ÛôèpÜ|ýÛÆek¾ÿ[k]«{<úg›|'ÝÙm哼Ÿz†“ù–uFä}yFCށìO¹”Ï.ßè¥lŠœsYeçïX°‘ÍíTn¯O\»i]MÍ9¤"õO™Ûßí³Ìª@f9ì?ìè:êù.*©ÈŠuzë«Nç+¦âÝHvZ®#ù<4w”o?Òûíuû†Ô²Ѭ ®m.: ÊâØëhz¹‰Ù°hþ ÈÂÉú­Iÿ)Mú–­i¸þ3´f×<jxÿ{ß+:;¾ló¸ebĕy± îÓÕvGö~e
xACæAjîJÀìš,Ù0=À­ÙŠŽœ¾Þ¢M~ …+¶•›#3B¨øxâ]çrAŠÃôÈD9LŸ8Ä}f­l ]ã
_^qÔø›G¹uõ®}vý:Fšâ;{.BìòÙE Ó´ïÚÊtþ`è;Ò®_ÇÀwì Í3n®¸ ç©!†éAî0¦G{ Ó/qVåÿ*.LÛp¾ã²¼áВPþ›Ê¾o¿7«ï„²Sf[w²]dIÁÇ ¶{Ôö ËÅ$~J⦄èÑçeêí<•ÜHö³ÝxACæA*NRĦ ¨áˆ ‚ÜA؝Þï2uf§0ܑ·¥ ]êhíìhªŸ’Ôkµõ/·N\°éþŸÌR•ùPȾ#0
­Í‰£¤ZcÚfê/~/À;ÄJ¢<õúNnðˆ%X²dKðöA˜|ƒ ÷
@@ -543,7 +543,7 @@
≄zÔ½AJ:›~aY'¢ëµÝîO³ŽöÞ¿:è2€!ÓöŽàÙ ì9KKQÑՅpWº¹´Æ¹`Z
²4y3ó }ÞVå7'ŠÐ-â‘ý¢­r-f׬;æϒræú³¤œIúPÁìã’_/{%ظ•Q/WǦcL•VŒK "!”
-ìw.GÕm㟻۔.£§{ÚÞˆü#WU4¾ár¾h€Ùdö–'•$ HÒ|r¨o-I¼û/Þχ£èŸ2·¿ÛnÈ¥!UéüwîKãïÈ㐚‡µ¶¶^ûVFŠ*7¶$» Æή7´Œ}¯Ó%ÛÚrrÐ󈺲r}·÷ÀÀ÷ðQµFkëìm•ë…TĪ™.)°X¦Š±³ˆ¦–r露Hª¨’þ·2«HµZF¹)àcBlš„[1(#ӑú§2EofNZð‚†Ìƒt6}J›~aPŽÃ>ÇáœâF…À7­õÎÌxÜô"¡èêB¸+Ý\Zc‹ ‚Ü%(fq&ˆKm‰ï’ògI9K̟’œ¡æûZ½H›–bÓã%2Á)™¯oß.…ÈÒGDÏq»ÁàùÌgÛieÙE{f\”Z‰,¢g–›æwÝü×é¤ÔTCáýºG߉äžnþöº-³©©gÃv"ç|ÓÑ:ù%Fª5úgÌí‡zëªÒۀå;7ûÐruõïû>qëRE7B†'¼áˆ;£’¨£–Š¹#“]n×ê¬F˜œ„ ‹A*`Ê·5íþÏf-¯t¥Žì©õ@½7àTƒà9ØÜ`Ž…zg¹öM²æ IDAT\Gü}k!ðAssksǎPޖ$îùÖc­îS'ªY~¤ÿy[ƒmç;{ûq´ü7•}.%Äg¯Y¼-îÞޙjQÖrퟺÔ϶ú?ª×¨`øóŽæ?Yìc¡¬&RH•Õtµ÷ó×BàÃææ×­­ÛdzQdºËÔtiM•d'Q¹øÿ½ç$ЮRG¦$^"…i^Š“P$Ä%xá|ڐ̣OfÅî€ 9¤f}EäA!‚ Èçv¯
+ìw.GÕm㟻۔.£§{ÚÞˆü#WU4¾ár¾h€Ùdö–'•$ HÒ|r¨o-I¼û/Þχ£èŸ2·¿ÛnÈ¥!UéüwîKãïÈ㐚‡µ¶¶^ûVFŠ*7¶$» Æή7´Œ}¯Ó%ÛÚrrÐ󈺲r}·÷ÀÀ÷ðQµFkëìm•ë…TĪ™.)°X¦Š±³ˆ¦–r露Hª¨’þ·2«HµZF¹)àcBlš„[1(#ӑú§2EofNZð‚†Ìƒt6}J›~aPŽÃ>ÇáœâF…À7­õÎÌxÜô"¡èêB¸+Ý\Zc‹ ‚Ü%(fq&ˆKm‰ï’ògI9K̟’œ¡æûZ½H›–bÓã%2Á)™¯oß.…ÈÒGDÏq»ÁàùÌgÛieÙE{f\”Z‰,¢g–›æwÝü×é¤ÔTCáýºG߉äžnþöº-³©©gÃv"ç|ÓÑ:ù%Fª5úgÌí‡zëªÒۀå;7ûÐruõïû>qëRE7B†'¼áˆ;£’¨£–Š¹#“]n×ê¬F˜œ„ ‹A*`Ê·5íþÏf-¯t¥Žì©õ@½7àTƒà9ØÜ`Ž…zg¹öM²æ IDAT\Gü}k!ðAssksǎPޖ$îùÖc­îS'ªY~¤ÿy[ƒmç;{ûq´ü7•}.%Äg¯Y¼-îÞޙjQÖrퟺÔ϶ú?ª×¨`øóŽæ?Yìc¡¬&RH•Õtµ÷ó×BàÃææ×­­ÛdzQdºËÔtiM•d'Q¹øÿ½ç$ЮRG¦$^"…i^Š“P$Ä%xá|ڐ̣OfÅî€ 9¤f}EäA!‚ Èçv¯
@@ -554,20 +554,20 @@
n Nûn÷gÁè4èŸmìû¤×@SP´NŽþUëéòºí.þìâü-4:Þúc{Vç]Á!ÛÔ¼Œ©H€dŒmôC‡æ¹ô#ZïáNv3óŒ|åà|Nãøp4¼_7OÉ 0Õ/‡áq°>–|+Ž'Ž’j=\c’ðÅÈw»Vþ: ~ h]Y€û§¯¦¾Öøã˜V6<¾\+ÓbEÞä{ˆóµ»ÚÚOõ>ƀ T~1œë’ g¾%Uä<dU½Yt;ÅÝÓÔ–M¬›~*ÆOS1I”æŠÛä{ ó"•Î¨”uû4áöÈ8ÞˆÿÏÞùÇ6qe}ÿÌ*Tž(<ò @‹®2TØÐ
s䇀»Aéƒ÷j/ Œó°¾æ©fî–ð
t=&uOôÖà€S–ÃE9:ñ5ꡏ4›öªM ÅT€ÞPêåDeb€ô%5Ý%­êJl&nˆÙë@³|Ž`”I·4ÂÛþßT9W½bžˆ+kùI'€u!F¤H‹Pîu@—½µÞá%›k­Ÿ˜†u]Â^ÃIsتÿýñèŒHö´ºï˜‡y…JÄ}:Kk}Û$/^'kùè<5÷îÝô´¤CµuØw½w3a8é¡[-öú:3-'£­Eòóo6š÷k;¢¼dsuë›îêïµ[Ÿ5Ž]½m:k瞓­¼ds­õ˜É·«C°Ó(´uqȱ¹ØkÑÃ. sº´ˆ¦Eô&8Æv}%W‹dëÄáÛQ&
ûûr4šz˜`-­‰ÖÑ{qläz¸°(·¨uô¢,mT?ÏŽXQn
D¦÷M=Ê®xž@bþГ ý[¨q;ÅNñÌ$OGùè/Ÿ‡ssõ©_9?J¢é—sð+@,««U<€çÿ* AURÔJ¶YFˆ³<B+*À÷c4á1þ<+é0Ígd® ~ /»ªž—×Þã
-ŠÞàrðLpq?û„äKŠkÅ¢QÎÙF¿÷A6k£ÿ‰Qñ\ðZX–ÛGŸ‡N¿Ç½¶®þLg uS{ÔûResCWûˆ=µÃö”bl%Ñøf{ó‡{„-IDŠÉe‡™”I
+ŠÞàrðLpq?û„äKŠkÅ¢QÎÙF¿÷A6k£ÿ‰Qñ\ðZX–ÛGŸ‡N¿Ç½¶®þLg uS{ÔûResCWûˆ=µÃö”bl%Ñøf{ó‡{„-IDŠÉe‡™”I
 ï÷öüvkÕ6Æ~ؤØHò“´ï”­çšDôÊ_7 )OšºÕ¢@„OÊ{Î>­Ö>@Âs!/ÏÙîq~ê›äŒJÍ+&Ç{"Ûµ4lØ°Jޟu×õǔ+Kïç¯g(4ïˆX e†Ý‰§•.¢†#Ø/
ODg‰ºç Y¿—
@@ -577,15 +577,15 @@
ôòÛþ:ó$_¹Ec½ho~¾9«5“/@uOuEgD²ßé¼Á^¡œ›
-« åÓß^/ÙG¸ÏÐNõnˆ‘¬RŽD÷:ÂF¦Dü  è,‰^îK¾O-G,R¯~ p'בòò<>zö»`§-t‹Åbô5¯¦"âøje‹“f¸X,ÆÒAÛ^¹P‹ÅòÈxàrç…ËÅb8›”‘O«h<ê¦'¸X,FxÛŒ‰UÎéöqÊÞïg¹Xlš ]r«O>eÕêL­žÙUÛ56­VV;±l$ýì+å¶O<BçÙ[!×_ø
+« åÓß^/ÙG¸ÏÐNõnˆ‘¬RŽD÷:ÂF¦Dü  è,‰^îK¾O-G,R¯~ p'בòò<>zö»`§-t‹Åbô5¯¦"âøje‹“f¸X,ÆÒAÛ^¹P‹ÅòÈxàrç…ËÅb8›”‘O«h<ê¦'¸X,FxÛŒ‰UÎéöqÊÞïg¹Xlš ]r«O>eÕêL­žÙUÛ56­VV;±l$ýì+å¶O<BçÙ[!×_ø
 ¹XÁºYN.O´®è0џ¦‹çäú˜YË{>¥[;ŠÏ’‹x` üKôB ˆûFRôæWÑp÷gˆ«1º@.*"ò$«øc.mǹ! üäpV“¸H^–ÓñL–·/9{LP’Â#þ¸E1Óf§é®o¢CXPZ]ß6ñ–ÎÌ&e"ðñ©ƒ×èÏ>¨˜3Ö\Än$™fôÏ[dùÜ¢ Ø¯«žØcyUm1KBÄR-¶B ï|,Ã0l&]n1õ ɑKQ¾»2E¤²`€Ÿá¸è0PóÄÉ´ ‚L€jõìT÷Ìk¥0ì¿Í~i¢D ¶ë=.)mUV(Åqã\qJÄêŠÙΈ5m#Q–‹DёŽ¦:
ÆÁ6gNÕø ¤ÜÄCGÂGËÕSŸp¤**`x OÇ7¹±aa¯H¬€ë££d|➠OSëÒï(xÙk¥S†‹Êâo@$ŠoŠÊDqãÙsۧ㋂n5ü¤bBŒ¶±£ýìPïÓ$öŸÇ§íe¯¶F»›ƒ?ó—¦Ä?T“3lxšrœtý§F÷’ú§Q½Yl#ÅÛ)F膝Â÷œé·P@t
-˜É(3…GyŽ˜#n“ë=šÀFƒòý¡N~áùªYååΡ÷Ôù« 5ä_‰vŸC¾×iº\Š¿ãd£Ýá -z—ˆûIÖ¥-‹[’uíQ~ìïÛ-‡€gnùô»õž³ž¢æA‘Äe9‡è€ á¸E¥P(òøèAÐpì¨îjª“®]¥=Üo°¦†,y÷A%¯R֍¬kô7Ì©¡šìM5«ÖJµí¾„ø£Å?Ø(©{J*}ªn„4¾´¬T~ÞÕä{­®ü1Lµ·§±ßšËªÉ0<Ö*¥Ò'¶úÊ4ƒ_[…B}Y î)©´j«3,óÏ 
+˜É(3…GyŽ˜#n“ë=šÀFƒòý¡N~áùªYååΡ÷Ôù« 5ä_‰vŸC¾×iº\Š¿ãd£Ýá -z—ˆûIÖ¥-‹[’uíQ~ìïÛ-‡€gnùô»õž³ž¢æA‘Äe9‡è€ á¸E¥P(òøèAÐpì¨îjª“®]¥=Üo°¦†,y÷A%¯R֍¬kô7Ì©¡šìM5«ÖJµí¾„ø£Å?Ø(©{J*}ªn„4¾´¬T~ÞÕä{­®ü1Lµ·§±ßšËªÉ0<Ö*¥Ò'¶úÊ4ƒ_[…B}Y î)©´j«3,óÏ 
yú¨è0FþV¼cȺ×ü즪'ªR_\Ú®M*í@˜8uÔðx–‡XÕÑÀç]߇æ­òªMÊËÇ>ÝGƒþ#é ]ów#Y{È|fj>7f÷÷%òÀ¨ß҉#uêœg@ –&©>záýòQ¿IýìöÕ{÷ \±“løŠ¯yÿ캷2²ó9±¾ÅcØíj¯×6öü*QÇʖbC‹=8Æ0?‡l-ñÆ&e©-Y›º‚?3ÌÏAë^«øév² `†Î?Ãà 0?í‡lÀ
-ÇÃñµNìwƄ†#¨ZœtKú2¨‚£ge¶Z‚¶cæ’*í—öˆ+¾1{+8eï÷Ϲ(æ*Ì«ð8[Ï‹Y3˳´›­z1{µíڃ™]+¶ñrHLfïÁNg,–v‚q3ç&”ëÌ –h±b™“é£Xn1õ ÉêϽ買֛#¼ds­õÓ°®KØk<íeYô¿?ɞV÷}ٝigDo¬}ü¡ŽzõqDŠt}­ ƒü ÏÏ$*HïnhÖÕE¦@ö;çx#?ÃAÕ÷¦Î²_Ûå%›«Mm½Õß×o}Ö8t€ñuÙÉ7FZÏVÇ뗑çßљ[ëÛ&yñ:YKOYÆñٚ^‚ú0 ·³¤:yEo‚cl×QrµH¶N¾e¢ÀDÙHx.
+ÇÃñµNìwƄ†#¨ZœtKú2¨‚£ge¶Z‚¶cæ’*í—öˆ+Ÿ1{+8eï÷Ϲ(æ*Ì«ð8[Ï‹Y3˳´›­z1{µíڃ™]+¶ñrHLfïÁNg,–v‚q3ç&”ëÌ –h±b™“é£Xn1õ ÉêϽ買֛#¼ds­õÓ°®KØk<íeYô¿?ɞV÷}ٝigDo¬}ü¡ŽzõqDŠt}­ ƒü ÏÏ$*HïnhÖÕE¦@ö;çx#?ÃAÕ÷¦Î²_Ûå%›«Mm½Õß×o}Ö8t€ñuÙÉ7FZÏVÇ뗑çßљ[ëÛ&yñ:YKOYÆñٚ^‚ú0 ·³¤:yEo‚cl×QrµH¶N¾e¢ÀDÙHx.
àAÈ[Pî‰Þ 'Äyჲ!ßPzîYâÁr?Ÿµs‰+ä!:enµò3¼µÍ¸fžD¢¡Câ
1AÞïß]k[«¬â~LÈaaç¹W IqDþ_›ñ‚Þµ;]²XÙ68º.êÛô¬yô§Q¡\T?«Ž«?hÄ)(›Øp´ö y°Rg?îUl$ùÛA×–—äUçÿ5ªŸþÊYwî.v2älÙS£¦ØkqO‚«A¯îO®Lbn>6‡ùô•µÜvZ#op1_‹9- hí&b”aVÀU4ñP‘ËG/°¬<õ Gjø‚G´£=ð›°Éþh…
ŬΠn=îÎ\35þ¯ÑÄ{bµ&u3+iˆÄU*ä¶O<¶¼EE4ª}¶à¾tKê¿ØƒIÎm¯&*Db‘Xc”$ŸO”¯Ú¯fö¥–”XÍbÙyà¢7tz¾bØ *€Bp,™âx6
@@ -592,12 +592,12 @@
ùë¦í¢6PŽ‹­'«:,¬ß|EÆ)âóìˆQ¹ËþÎUN<c§®à~Ö¨FÓ¦D!¡óÅIÀ"—†#."k·×檅d±èä÷Ñ ,O=†aº?ê’Û—†SSÇè^ ÌJ—¥îºù÷œÐl‡‡ôó.[D ,瑶*J0™%â‘$ë*av‚ué×ïÖPTºï@<@Ðj¸ OùÚz¨þûh`oâÚÅÉñòWTн"Ô߲ʕàßMÕýc æ­Ÿ~|4¾ÜxüØñîcœõ]Ö¸Ï(*‰ q.ߒ÷SۇýáÛÑÊ-Û1ݞ盃ÁÓÖæ·]#c±DÖØÑëlQ}Ánü«søû1D•¦£nËÎ|Wl ‹¹{Ž;þ6¾•l®m}K_ðCemH8ۉϛØÄqê»J÷õ¸ç¢7úՇ¬—¾ˆ×ÉLïymTêñù›Vð¶^jwٙK‹óµoþt¬õ§ö4¼Ý?dœ,)ä¢L ކþf‘¼˜œ!.æVò;Y°l/J, ”¸.
@À*L*\\R‰kÍ¢—Àòp­"æÁØø*LšUë +Â×éþ"¡tßby’zõKõÑ3"E€ÞrÊeŐ©ü[KHyåxNb>8#ñIŽqù¢üç¯ÏÆBr´ù›ˆ)ô«¤–3¡@K2¼16±g¯žùƒ9·IÉäªgøUòæbå†Kj´HAdK÷Hã—ãê' êü;Šš–Wؔ§ %/MÐjñäQɊÿèɾoGº:š3P¥Î'fZ¯žçù¾³̯™‡¾Êف(ß»1éçoÔôàòQŸõ˜E¾?LlTÙM; œœ
[,áI^T&"/¶Ç—¢|ߖ”V6϶’“JP½z¡yéå-ÞÖ„þ÷¶Ñ‹Å†«‹WKÈ̕[Dµ¸ zÆXÛpÊ‹Ù€c\åÒæu`Ί¨»¬ëíš=ª=ú „y è2,£€[˜ byñ›Ä»ô…‡ÀN°öœ4]xXR<X÷\l–ûP‚@¤"øܳÞÑÒxä}ôYqs:?pÚþj³±šZN7xôé9s’Ø +”a€0À0H$ð¤Ìò±“¹•}I±÷“üqÃ0J¡u_v%î)ÁÓV%EbFrÓñ€Pˆa˜g‚ËÓ ÃÜ#í3†aÄãrkÿìƒG[ÔŽa8¡j°Ð\òxç»òq[kyè vå†x£–“ñèrn“õN§9¦‹ÞHš
-n‹iдØ
@@ -620,8 +620,8 @@
\¹Ód¹ü–1 sxT!?Ì<2Á£©Y¡èîé%goºü ŸXåòd5 ËÎ=Õ¹ÊiA.3„_
-cgZƏ¢,gæÜ×$•µ!þRVk[£7âk™…4ŒÁÓ6uµ’’ɵ{-ƒö±4ûóf¥PR£BF»‚îvÏð”hÐe•S$õ¤º××:vÁ,E<c§®˜‹íÉC º,SV€X"VW«ôO+¸A•„ *)j%Û,#ÄY¡ç§¤\*x…OC‚oZ¾ qÒظZd>ê8E«?HÆ0v|–µ]Oäø¹7Þ Sö›Ù>Ãmbܱ]ÒÓäLÝφmWF”[
-G€–Úhq‚È8U+9Ž_¹èÏüâuÆ|åËO(±°¿oÏ-bòë°¨JJ¶Y–ÇGpùGÓ3‚ŒL¿ì[î£K œ4µ®ö9Kýnq·œ>IëróÑ#¥‘pÎgWÓ½¨éùÔÃn”Ê¿ËñS<ûãû™Oÿœ*·†#Ó;0¨ÙB27üf9u¯úÆí‘3´­Q_§¦˜á¬+4³0ߊÚœçë9CÛöêkÔ${͚õ0wƒÒïÕ^ça}ÍSÍÜ­Ӄ]ºSW_uµ
+cgZƏ¢,gæÜ×$•µ!þRVk[£7âk™…4ŒÁÓ6uµ’’ɵ{-ƒö±4ûóf¥PR£BF»‚îvÏð”hÐe•S$õ¤º××:vÁ,E<c§®˜‹íÉC º,SV€X"VW«ôO+¸A•„ *)j%Û,#ÄY¡ç§¤\*x…OC‚oZ¾ qÒظZd>ê8E«?HÆ0v|–µ]Oäø¹7Þ Sö›Ù>Ãmbܱ]ÒÓäLÝφmWF”[
+G€–Úhq‚È8U+9Ž_¹èÏüâuÆ|åËO(±°¿oÏ-bòë°¨JJ¶Y–ÇGpùGÓ3‚ŒL¿ì[î£K œ4µ®ö9Kýnq·œ>IëróÑ#¥‘pÎgWÓ½¨éùÔÃn”Ê¿ËñS<ûãû™Oÿœ*·†#Ó;0¨ÙB27üf9u¯úÆí‘3´­Q_§¦˜á¬+4³0ߊÚœçë9CÛöêkÔ${͚õ0wƒÒïÕ^ça}ÍSÍÜ­Ӄ]ºSW_uµ
hA7~Nû_¦@Ђìñ&öºùe¯‚ ËxªÍ=áHéD'#ÌLü¬ò“´ó`a-ÈÄûúµåyº]J£‚d܁¯Ñ[Å­qÁæß÷(þÿP¾(OªÃþ9•Oë\}êÇñ<å hA6 À‘,öˆG ÃÒfþbÿ‰%ÆmÌÍàÀÇæpþ@6l©;ȐQ>üš><ÑøŒ¾7áI“:-&ô¸_…I…oæ2ôѧÏėAãˍǏï>ÆYßeûŒ¢2‘˜çRõ~`jû°?|;Z¹Ec;¦Ûó|³`PrԀ¯|mýèÙNíÁ®ð$(^hêpæ÷Â'¢#=GߎJ6׶¾U`-³ù•µ!ú‚ÝøWçð÷c<ˆ*7*LGݖT E®6%·Ù6¯ßRO[›ßvŒEÄYcG¯³E¹ãÑ4ÇtQ¥…æLBʵ\S+ë:{ %·~BÚÔûhæÔ»A<Ï©÷ù4*L½Ï.ýÎ=õ³SéAtF<¤ý¨q§ÖQšj¬ñwy’$›Äj"«kÉñfíVV3ЫÞB±ßûšç()Û/5>M&•”KfÕýœ¤y—…:m%±5™%¿ë¦ò¸ºÒàhûǞº7ÐÞ¡Øô†vdF4þB<–»e÷Eù¾¶¤”Nu«Í®Ã~ëm)ÃYO×okä»#݇åQ蚯ÃÔ!ÙÞi*äyYH£‚ rÁ&ì¯+jÌ­^2:ÜüÆpãEOþr@BÉKaðƒîÅÃMÛmÔ>…ÿ*þP Ãt,ùWCi¶@Ïs<fp‹FÆ8õ»ùë –ÕáC{ü…ËŽz=èw–-zdð\ð>ÈKòÑ<Õ¿&h8:ϸ¨5" ý1DÚ¯ZM
@@ -629,7 +629,7 @@
¾FŸvÌè@-]VÊ%)‹£#ŠœËöfˆØPÊø0t“•oXvÂ/hÞ±@’n‹_CÃ1«öY¦êb&¹*ªg|©åIyÇ"ŠGÿ•ùËW½”Ö\ëè½ÎŠì–a>êö¤$wË«}¾>¼Nç8f×+r(s4V^5øï˜ze¾r¤yŸ¹ÿšh‹(¤èÞ-‡†º:K Há%
òIÀ3)X‘ŸÎs¼2›¼£ 9úŸ¤Fâõ«×;3¢îÓ,É#¨9ÍÖ=U¯ö1—Ý©>zŽvÛÞO]nÏ s•ÇAZ:‹8€3\(Â9̲&f±ÛB,¿|Ð]xdqஞçù¾³̯™³
@@ -653,20 +653,20 @@
wf:)dZZÏsA_ÐV5ïÜcR¥üƒ‡ä5§(Žõ
_sCü,å*¼BÙý^wþ†:ý—´ÎpNï~yS2õkËS7ÅëìMÜõGfÀ´.qÉå&
-²²‘Éè¢ö ±ìPoS/ÏyäšD{3”ÿ¶ºÉ¢Û4↻Ëõœpªv¨e
+²Â²‘Éè¢ö ±ìPoS/ÏyäšD{3”ÿ¶ºÉ¢Û4↻Ëõœpªv¨e
%¬£ìŸº-¯¨ÇÇSßÚÖ*«X*‘(;“*©¼¸=§^rˆ¡Ê|…qoKžØŽS´ì@_bsà O´¾:úsGà®5ՋO­øn°¦ªv·»/Ú)±(tÍ×ñšEI‹è Å
-—ÒhqÉÁ£uŸÞ«£’©`½ºÞ¸mÜUK’0~˜Ét‰<ò%†%d!Cå<B‘T¥\¹SçúÄ©¡H²BŠDûi†|F%‹™(C¬&ÒVj¶µû}£Æm$; žŸôù~a—@,‰×äNë_L’¡àub£RDU>£Þ—«'Óló?Æú~±«Öà¤}ÀM}Ê…×ïÙä8¶³®Ç¤î‰^C®)I|žf`¼èPÉÐü¥Þ®/x¼Ã't˜r|é8¹vÍY-Ýú‹£¦$¤Ñ{Ñ/U÷@®rœÊ•Z)ýó­Q}¤Ù´Wmú]|žÀÞШFœœw•‰fæÃÑ]Òª®ÄfâK•½.4Ë«æ˜(“œÅS…÷Gø¦J1,qe-?éHœÏ´œÖÃÔÙå6£Ëñõ(sH®}ÞÂ~7gB.ûi<ØyGÄ#Àow@üzH¥Rí¹|l¸°Ñߤ¬’Î0‰@ ˆ¬œz_&>úEQzD<t¤úè‘Œ"vë-§\ôÍÅQ¿±¿o—//ýü:³È=_A9ž“ø$
+—ÒhqÉÁ£uŸÞ«£’©`½ºÞ¸mÜUK’0~˜Ét‰<ò%†%d!Cå<B‘T¥\¹SçúÄ©¡H²BŠDûi†|F%‹™(C¬&ÒVj¶µû}£Æm$; žŸôù~a—@,‰×äNë_L’¡àub£RDU>£Þ—«'Óló?Æú~±«Öà¤}ÀM}Ê…×ïÙä8¶³®Ç¤î‰^C®)I|žf`¼èPÉÐü¥Þ®/x¼Ã't˜r|é8¹vÍY-Ýú‹£¦$¤Ñ{Ñ/U÷@®rœÊ•Z)ýó­Q}¤Ù´Wmú]|žÀÞШFœœw•‰fæÃÑ]Òª®ÄfâK•½.4Ë«æ˜(“œÅS…÷Gø¦J1,qe-?éHœÏ´œÖÃÔÙå6£Ëñõ(sH®}ÞÂ~7gB.ûi<ØyGÄ#Àow@üzH¥Rí¹|l¸°Ñߤ¬’Î0‰@ ˆ¬œz_&>úEQzD<t¤úè‘Œ"vë-§\ôÍÅQ¿±¿o—//ýü:³È=_A9ž“ø$
8Æå‹ò¯Ïúû8ÚüMÄ4àQT€å̜e»’JŠÚ)«µŽ‹­ÑÂ.Ï^=ó;Gð´M]­¤drí^Ë` }ìÍ~¶¸^•Ô(°~ó™]1›eĨTkmÒãJ,Ý#ûÔORòjýùw-ñÏN<c§®˜‹í!ñpQ²-*Ùný@˜öߤh†|F%[/#אäj2SMÑå5“RñƸOpù¨¿/|Ò"'Ie­¾ÿŠ’…“SakƒZY­RmS[NŒäï 7à’ëiµ©Å n*ŸÕS~L
-#SyÌ̯ÑLªWgYF‡D‡ñ5ñÜ¥(¯Û’r–6ÇÏR®òù"oñ¶nŒê?ùJñj ™!ô™¨—AÏXüê†S¶X,‹Åî÷® ç¹Kðï;½ˆ=ª=®0ÔÅ>Ê(àÇ2‹3-§õ0uWû×AS5iûrPüsúh°ûÄ¢pÎÿ&ÿqHÁ@OªDз‰Åb½ Í&¤¾@ ¦rµ…@ ²‚fâÄò$õê×sæ$±A&V(Ãa€aHàI™åcç¢()cæ™È'|œGj9«B1†a"äG‚ÙE–]Õ$ùb2ÐÁ© ¨ojg²6š&©œì9G[ÔŽa8¡j°$’Y=Ñ>C¥i.çÒDÖÓEo$«‡»{DëZ´³k*éÿ5ó"…ýIÒñråHgOž3–¢V̙?³~Ҕº“YGUTä3 ¤F‹“HæèKQÞ´1îʧ^ÖDo»;‘„ñ¼x°£úe>X*æãÏù­±D¬ªÕ(^6§€¨VQë)j%Û,#ÄY¦üàû1¹*:úó¬ß4œ‘¹.øi†ñüUcÞ%q-WïQq‡Ëþ¾ów ÉÀ;+=ϱ^ÓA ^!€Ñÿ$œÁ÷®_½ÞI垓,®Q~r8gŠÇ={Ëà&Ü ¬ÀkÅ¢)géûx8®òèô{à›Žú3—±çï}©ÒÙЕvÏþ0ïÕ5+‰Æ7ÛùÉø§¤ "3ù+b&e’ÌâyYV¬¬Tζ\j¯qÝLù¬9ì#‹KÒMŸywœÕp”¹Îyhz‘µ
+#SyÌ̯ÑLªWgYF‡D‡ñ5ñÜ¥(¯Û’r–6ÇÏR®òù"oñ¶nŒê?ùJñj ™!ô™¨—AÏXüê†S¶X,‹Åî÷® ç¹Kðï;½ˆ=ª=®0ÔÅ>Ê(àÇ2‹3-§õ0uWû×AS5iûrPüsúh°ûÄ¢pÎÿ&ÿqHÁ@OªDз‰Åb½ Í&¤¾@ ¦rµ…@ ²‚fâÄò$õê×sæ$±A&V(Ãa€aHàI™åcç¢()cæ™È'|œGj9«B1†a"äG‚ÙE–]Õ$ùb2ÐÁ© ¨ojg²6š&©œì9G[ÔŽa8¡j°$’Y=Ñ>C¥i.çÒDÖÓEo$«‡»{DëZ´³k*éÿ5ó"…ýIÒñråHgOž3–¢V̙?³~Ҕº“YGUTä3 ¤F‹“HæèKQÞ´1îʧ^ÖDo»;‘„ñ¼x°£úe>X*æãÏù­±D¬ªÕ(^6§€¨VQë)j%Û,#ÄY¦üàû1¹*:úó¬ß4œ‘¹.øi†ñüUcÞ%q-WïQq‡Ëþ¾ów ÉÀ;+=ϱ^ÓA ^!€Ñÿ$œÁ÷®_½ÞI垓,®Q~r8gŠÇ={Ëà&Ü ¬ÀkÅ¢)géûx8®òèô{à›Žú3—±çï}©ÒÙЕvÏþ0ïÕ5+‰Æ7ÛùÉø§¤ "3ù+b&e’ÌâyYV¬¬Tζ\j¯qÝLù¬9ì#‹KÒMŸywœÕp”¹Îyhz‘µ
Žh‡é(2óF‘6ú‚[A²s[ ’ã„6±É^3bFl˜3šž‡w%¡Úñ7°4ªÉ58†aI9­dþ;2ÏLiÂ݀RW"ãnzõÛäø
L8ÐÑd6û§Û%Í»,0ÃС®†æþKbXA9¶KÔkð&ÃÜ
MˆX ¿Éõև*kÕªjÅN½ýS7#Þ¤4#öXÎɀ’;Çæ¢@½äCÄ|eÎÙî8EËt&6S4çÔu\ýaô§QáuýË>ÙXzöÚ}7XSUã/S¹/†~è{Ï>eQ6¸ hJi4.ìh˜fë”/…©Æë?<âá¥!~«cþÉHþÐ;^ƒg5ùËm§5úùô@ ‹2Ÿ&ÚšðFÞYAØ˹„Ò<£ôŸqÑÃv2ÂÜ„O¹”bB\!b¢LfüM[»¿Ñç5îP’kHåƒg )2PRVî´ÞùåNQŠ1¸d(xÝßo•S$IRÊg©Kæ>»JFQOª_:¢ßt$<Õg½¦F­’‘eo¿M¹$7(mgüí~÷G<ãAÄrƒúœÖµI¼ÈFәfÌÿŒô^´«6ä•ýboäÿÌÌìiќu¨d$Žš­I#95‘qÇ+²áÃ.à§/Ê; Y×ßô’a˜h™AQ]ï&ƒ:›åUÒYªžªéù?èìHžv>oŒToht<…ÑPJÌ{©öGøÚâ$’sÝ Å•µü$zZy(ñÖâ+0íe¦”x>Ž¶Ô kqp‚Tí6zSCq§ûA=E†ákHm“5mª/ë á×hnr8HÖIT[T
…B±Y‘)IŸ@yľ£º«©Nºv•öp¿iÀ
- À©¡šìM5«ÖJµí¾ö¿_—ã+•ƒï5Ù¶–?†©­²ƒÞÚu"éoóå·7ù†ÇÃZ¥TúÄV_™fðk«P¨/ Ô=%•Vmu†eÞàù|Ÿ%W£+•Ÿw5ù^«+ SííiìO®°iy®Ò\_–TƒpÃóò*eÝȺƀÏÊ·½¯+ìûë¤R©þð€ébܝ’«¸©`ÛmójW¾ßÓþt±âïæg7U=Q•ú¾3¸<0zÝ(ã­Mu›ž¨ªk0ÓÃøU¥¨ˆºà¢ä„¨a75rjAQDô©j·!³¼dËFw zÆ_óß³ƒêöˆE!qÇÁàNlæ¦8k8ÖÆ5€á0>綿b 6,T¿â~‚aÉ,IYá&<åkëçõØVÐæÂqo#ÍSVvdö™œq•K›?¿s/¾h”£ñÿª2Çý*©è½-ò\ãnÙÊ«ºbÓxvSfÞÂ|aJìeöUòŽÁ;15‘­nڙ)©Q`ýx•cýÀÑÖòªžñÿpä
+ À©¡šìM5«ÖJµí¾ö¿_—ã+•ƒï5Ù¶–?†©­²ƒÞÚu"éoóå·7ù†ÇÃZ¥TúÄV_™fðk«P¨/ Ô=%•Vmu†eÞàù|Ÿ%W£+•Ÿw5ù^«+ SííiìO®°iy®Ò\_–TƒpÃóò*eÝȺƀÏÊ·½¯+ìûë¤R©þð€ébܝ’«¸©`ÛmójW¾ßÓþt±âïæg7U=Q•ú¾3¸<0zÝ(ã­Mu›ž¨ªk0ÓÃøU¥¨ˆºà¢ä„¨a75rjAQDô©j·!³¼dËFw zÆ_óß³ƒêöˆE!qÇÁàNlæ¦8k8ÖÆ5€á0>綿b 6,T¿â~‚aÉ,IYá&<åkëçõØVÐæÂqo#ÍSVvdö™œq•K›?¿s/¾h”£ñÿª2Çý*©è½-ò\ãnÙÊ«ºbÓxvSfÞÂ|aJìeöUòŽÁ;15‘­nڙ)©Q`ýx•cýÀÑÖòªžñÿpä
Áž­ü glš×ÂõúPÂf‚\å "pÛèÿgïüc›¸ïÿÿºÉ©î¢0ù"¨|rQ©°[*l j̊gLÃ.՗"§ˆ³~4œ¶*1LkœV]œN‡j4¦ú¬1h€ƒ8L´6ÓúÁLc8ŠƒÚήF•‹J•‹šˆ³JĝKþþqþq¶ïlÇIH ÷öûîý~½ïì¼ßï{½ßïç‹5, )Ýò±ï³·íi#Ö=¸ÛTÔðo„Q‰(%t%¤~áajŽd—‘+Ñá°U„=;ðûÇIæP”
@@ -676,10 +676,10 @@
¤34îÜDÌúKd)ÓSšpm“ë€M»–à¾{ۏþ;÷ݨ™ÀÀ³°OOéÔÕâÌXØývûà„…‰
Â\N;À»ƒ
-Ó>㬔óå…:B¤t!óÉ)ST,²0Â:,+aGl•Ù¾/9Xg'Ãí¿ìÓþ&¹4ã¢û‘ÊêêŸ"ä&sð[8dÁÇÅcäJ”á@ð/9ENYú)‹ýw³$˜Ç Šˆ ¸‹èL¼¢sê…æàÝç]º'p¤3íóQç]º5ÉàöcÉ'Xy›/Ox—‚¬ºlᕔõzÛ6Ã<+)¥ Ôr¾Bq.Ò"Ëض%gxµ£v—77cA£¹’Êä¡çUí/Û÷iúvØÞÔ¡úù!²°ß­ &rW·v¤Ë˜Fû‘ìÙ;®@ŒëڟyÃkÓJÔs@"lŒàyÓrƇ_Û¯Ùa÷_ S·#þAW£¾[õb­˜¯d.FK2v½¥lîˆL²Ìí`ûï†[Žf4‹K”0–Yjà+’kòLW²†F¡£Vl…Æ':Ǔ¢ýôX癮œß¥+xÕDÏ¿×V¡Þ‡Øô
+Ó>㬔óå…:B¤t!óÉ)ST,²0Â:,+aGl•Ù¾/9Xg'Ãí¿ìÓþ&¹4ã¢û‘ÊêêŸ"ä&sð[8dÁÇÅcäJ”á@ð/9ENYú)‹ýw³$˜Ç Šˆ ¸‹èL¼¢sê…æàÝç]º'p¤3íóQç]º5ÉàöcÉ'Xy›/Ox—‚¬ºlᕔõzÛ6Ã<+)¥ Ôr¾Bq.Ò"Ëض%gxµ£v—77cA£¹’Êä¡çUí/Û÷iúvØÞÔ¡úù!²°ß­ &rW·v¤Ë˜Fû‘ìÙ;®@ŒëڟyÃkÓJÔs@"lŒàyÓrƇ_Û¯Ùa÷_ S·#þAW£¾[õb­˜¯d.FK2v½¥lîˆL²Ìí`ûï†[Žf4‹K”0–Yjà+’kòLW²†F¡£Vl…Æ':Ǔ¢ýôX癮œß¥+xÕDÏ¿×V¡Þ‡Øô
tL“HdVÍÏb0溃W{¶ƒeK‚ ƒÝÑsUH£˜¨%W0E¸äY‡y)d ÚzÄè
'½•·ŽÞO¨¦³ö¸‰—9Ã`Uß¼ŸH.*œ¡‘ÇjNýp¿ ò
@@ -695,7 +695,7 @@
ô3gu?«©{Î<²Êæ$Ré@!wX@Fš¹< ÊÈÈ<’Ìã|šrfâs(k>ƒ<á-OxËÈÌ3˜ýˆšd‰CSÞÃv)©«4¸Ú›@÷À6ÊÌ i ßFV”†caKs™‡
@@ -710,7 +710,7 @@
vMÑmþÈQƒì¦—q¨q"0n+g¥$ìw‘f¾’uB !;#ddd4ˆ¢ÜÅ?ä ïyDî—sy®‘‘‘yÀ,nã,7³
-y}ÛÿÞt·eB:K–ŸBvÓ˔A&„l:i.»l¤41”hx±A*—,㸘‹°£²àc)Ⱦ3Iä ŠsŒd(…áPfÂL2®ÃnYIYFFF¦lŽ}Ô§V¢º•ŒEᛸqY¬ZÁ¹ßµÓwÄÝýþÃ6^…Ôš¼W<i¿Sø„CG‚à„Æv4¹„:ï2hI¬A*0rÞõi±{†q¾f"V`†é¶[Ì ǐ
+y}ÛÿÞt·eB:K–ŸBvÓ˔A&„l:i.»l¤41”hx±A*—,㸘‹°£²àc)Ⱦ3Iä ŠsŒd(…áPfÂL2®ÃnYIYFFF¦lŽ}Ô§V¢º•ŒEᛸqY¬ZÁ¹ßµÓwÄÝýþÃ6^…Ôš¼W<i¿Sø„CG‚à„Æv4¹„:ï2hI¬A*0rÞõi±{†q¾f"V`†é¶[Ì ǐ
>±È JÔhŽMú#†a°ógiåØ­AÃ:Aü c°Ô.Æ÷¾•¿-Ä:ƒû¥T†:ëÔRé¶Ù"©k*Q0Gûº¿óɘéeI¡ÈÙÒ~z¬óLWÎ8Ò¼ê?RÖ6M
¢(:/OÀ/ò„÷|!O`/gX†õœôëԞ³>Š*²ttV ³&^âYÔdzʅ¡Î›
@@ -744,21 +744,21 @@
ó¿Ï¢zñ’O˲±‰3Í+ )=ï ­û£Áè÷±ÚFçc«ÞžH°>j3÷›à”µZÛ{§œ¯j xÐj=486ÅÕ®opì÷¶mŽÓD"°”Ýjõœ¿‹£Ú_´ ztxV¢úçMý' ¥l¤Œúß·v‹qµ®£M;ŸK6/¶zòèµ±¦ëw}›pa»:+·•çm‹ó“¡±)®v½Ñq¤©}K²pÑÊÜý²¥òñWÝ{-]ÇƦAû«¶SgÜ|÷!eT¤ÁôSŽMxï±, X9¢{§Nýp?9åy/âèìöžŒMqÊÕê¦=ýÝVÍOŠMÎ+Òo²¤òiÞzh¯¦]q*rD'Ì(u™¢éá74­ñÈQ}ÎÉ9%è¾sÍІÇë&v DŽY
”ŸÎ»4™y'=vÍôÂÆ7©áؐÔp¤†£Tô¬w¾4gËÃw¼/ÓF þXYÓþÙÝûɍ¥,…ý´ÎêkÐþÖayؾ㬬ëMÌ°àÛAvpvú¢-}”‰:«5ݗî& x êe&ˆÕ9Y&+að€Î|YûârºpÏÜóÖU¡ d=Ž9GYYäQ”EqÓ/}W—ÌÒoó5m$¹8Ħ9P‘¨¸8äÿ°ÖÈãžÒÉqÓÏ×|ÙsÏXÒwn"Š"ՇÎó´7<<núGv’~†ÑWWÇvôœ{/¡1´n€Ð(5I?—É{yžo™ÕúÍý=¸ô~1‚­U3×Bz®®U“kHíz-ïj‚!È@ÚÀNz+oåóôe¯ãˆ'x-­¤LB±1?‚ §ÄJceõK9'wŽÞw‘X¾þäÂ^ÈvÓ OF„LÈ÷ÚÁœ’EO.±äI®þ˜@ßÕ4^lc¢É¿÷ðtÞÉ:µª>q/$r÷î1žw7wœT³“>¯¨ì½oÏQg®×)ßñ{¶‰L÷
-ëY®ÑÜ£ì¿iËÎèê¦þ#.³V¢Çd)¤²îҏ ÊBéMwóÀY^­}ô<KÍS/ùˆ7“z#í£z(m“Yüf™¯¬Õ[¢ &$™AFŒeÕz°´»úÙ/ìS–U˜á˻ּUós/¹pù<Ë¡A“YÒ-íODϗ†£”6"ÌAƑ:ï2hI¬A*0rÞõ)yb‹RR’” ö(Uf)õ‘Å%Œf‹?sÛcú˜óŸÉzƖE–ÉÐAfÞ ßfP.ôTŒšâÂ_S¡¯©ð×ÑÐ×TÎûÅ®éC†° ¢¸Ãl?î¡nÏú®º–é(çâ ­UÎ¥²M?
+ëY®ÑÜ£ì¿iËÎèê¦þ#.³V¢Çd)¤²îҏ ÊBéMwóÀY^­}ô<KÍS/ùˆ7“z#í£z(m“Yüf™¯¬Õ[¢ &$™AFŒeÕz°´»úÙ/ìS–U˜á˻ּUós/¹pù<Ë¡A“YÒ-íODϗ†£”6"ÌAƑ:ï2hI¬A*0rÞõ)yb‹RR’” ö(Uf)õ‘Å%Œf‹?sÛcú˜óŸÉzƖE–ÉÐAfÞ ßfP.ôTŒšâÂ_S¡¯©ð×ÑÐ×TÎûÅ®éC†° ¢¸Ãl?î¡nÏú®º–é(çâ ­UÎ¥²M?
TýÏ«o ¥ø=9‡|Ú*°ŸÌêUµ$¹&ùÒ՛ú/tÆn%7;óÃ'œ†z©Ö˜^µ_
Ië Î±óIUèpŒÜ^¯¯×ó/]êiG*ßä"¯u”Zs™Gš¬ñs(UJC½Þ¼QËÞ
t4Øþò z·sþ«(ó¶Î•7UB+{ÇPuŠúÐçXrÑòed慌›>GÃ1üU4p›
Ӂt%{›ú,½§NýF-YfiõIã6ê=wÔþ/ÇÇ¿ôkïxô¿ÌŒ;{_ê:ºÿîÀe¯ÕÀ'䬟%}+ÝÇ)í{™{îÙT¿Ò¼ãÄ1¯`:$65A§ ¾
^ÒVeýÌ1.º¯©¬®þ)Bn2ïd
ÿà_ ¥ ׯ¤l¬×Û¶´ÏhÕkÔÚg´ÄJBJIyÐhò~¦'™Èe¯¹)KIÙ}1ÌLÒ%åb¸ÞÒ½Üè>¢i:ü¹Ç”.-¥ž¾MÓw"7»1)+)ýåP”¦©Hosûàå"~ê£=¥¨¯B¿HózÊB*ÈCÏ«Ú_¶‡oÓôí°½©CõóCda§K¹J>ÐuukGºLi´ÿI§6{Ljq]û3~Œ°6­D=‚âE6-g|øµýšvÿ•0u;ât5ê»U/öUž‹Q^¼˜Oÿ«}˜S9·¡áPú˜’èíj7¿ï¥îÐT4ähnTýü“Lç‘北-üºøҟΖÚjú¹ ;xµg;X¶Ô!¢1XÑ=Wÿd˜U LԂHÎ,h!‹h C‰†浚Kš®@¿ëUwñóÄ8Öâêt-DÉ¥”Ë`ÞQf¡Q¤µé…hT¤q“Î}ғ£á¨¬Bé/=¶¿+ص¾@±Õâ
-ÔlLu]péWadÿßû+kZé;Q,Ö«ýÐpӅQÛVÂ꿬1 `ª«á›øZ?ÖÔmÒÈÍ<ôÿuìæ}§Ây&ÔûXwrÀ"¥?3ôÿuìÔ|% א—<¼!õgü6ÞÏ.Yf õÉ¢;þ1q.mèÂÀÑÇwÒ36þnÏôëÕ8_”#%‚`ý»Õ<°ËÉÒî@Œ»¹+%FÄ{ǸC¿%hš…E[µ¿÷QËáävøvM]V1
+ÔlLu]péWadÿßû+kZé;Q,Ö«ýÐpӅQÛVÂ꿬1 `ª«á›øZ?ÖÔmÒÈÍ<ôÿuìæ}§Ây&ÔûXwrÀ"¥?3ôÿuìÔ|% א—<¼!õgü6ÞÏ.Yf õÉ¢;þ1q.mèÂÀÑÇwÒ36þnÏôëÕ8_”#%‚`ý»Õ<°ËÉÒî@Œ»¹+%FÄ{ǸC¿%hš…E[µ¿÷QËáävøvM]V1
µ$_f1‰tÔI«ŸzÞ*\æò4WP%‘̱,mb6ïƒÑ©Trqã¦P gAÏzχ-ç–=óD1›ü(…R`î‰G/”Š‹hßô_kW£3¡ …¹DB/€t@Å4":feg)MÓ~Õÿë¹9dÅQ.t²cg³ÁžÒ½p‰€…ÊEŽÐÈœ÷ÈbG)|$ÉyÍ:÷”2"` Z­Ò+ôE•”uoÏ)lÝm­¼’òcXoÀÈ«j3·mî˜à”µÚ®¿Ü,esîÐgq¾ÖØÁ _pµoIŽŸmeµ6>ÛË«'ûìð'›t5¼þò¥úú÷€E¯á%Œ/I¶Ì{Ÿ¯í¨«^ÏZHd^¢ZÚŸ­‰²~»5ô—",;Þÿ»ýRá
@@ -792,7 +792,7 @@
ñš¨dηPzÆòr 3¢
-j­V“®Ó^û+ò ‰ˆ Èc…â&."óX±‰ÿÛo=oöì sÒuû/îဍž~®cô?£|:Z›l²ú¯ÿÛ¨T ½ê‚¥LOiµM®£~íZ‚û>ì9lISwî»Qsj©‡dÞìCÌTĽ·u³dn$Gtžf³a0蕾ú¨#š§Ï*šî<aÔ4{è‹Öܳ‹&>,ó¨ (.ï(k8Ê,s”E— i.óM08¶ %ÊÆ&†/gb¯Q—Ñ8iÜQYwéùŒÑ+t}ƒÑXÔחƒW‚ú'ÍÅ bhFë קߴ]ë9¤n$«f|E—>4{CÀ]Ž¢µÚ¦­$¦úÛáàå nYX /ðr@·ÇÌ| äÝTåÖ3žßȹ3OÁºK_BÅr)ìUŸß\9ù÷¥üë½Â€z¥2:ÅÑÊLÓ\àC!ÎÁîspz'ì>'$‹Bœ“Ç=sgîð¼WŽ˜‰—BèÎL`™)NÜÎ%¯È“Z
+j­V“®Ó^û+ò ‰ˆ Èc…â&."óX±‰ÿÛo=oöì sÒuû/îဍž~®cô?£|:Z›l²ú¯ÿÛ¨T ½ê‚¥LOiµM®£~íZ‚û>ì9lISwî»Qsj©‡dÞìCÌTĽ·u³dn$Gtžf³a0蕾ú¨#š§Ï*šî<aÔ4{è‹Öܳ‹&>,ó¨ (.ï(k8Ê,s”E— i.óM08¶ %ÊÆ&†/gb¯Q—Ñ8iÜQYwéùŒÑ+t}ƒÑXÔחƒW‚ú'ÍÅ bhFë קߴ]ë9¤n$«f|E—>4{CÀ]Ž¢µÚ¦­$¦úÛáàå nYX /ðr@·ÇÌ| äÝTåÖ3žßȹ3OÁºK_BÅr)ìUŸß\9ù÷¥üë½Â€z¥2:ÅÑÊLÓ\àC!ÎÁîspz'ì>'$‹Bœ“Ç=sgîð¼WŽ˜‰—BèÎL`™)NÜÎ%¯È“Z
šÜÚ@ªpÅpiؚîòÙàglÐáUZ…ë¶aš¢RÝ«ªAK(1P`äZu~§;[BŸ «ÕM»š,»ŒÚÕü4œ>T–!¬i‡ÑÜ Á«0ň•JaÆü¥ï€…îÌ£5ÁêÿáUת¢±è÷45ÁLL£\œË·Ùu*ó^½) IWoEêU€[îVc{(Jð’,ƒêݳ֝‘#l+n?ÿœà'ï­òäýÒ#Lö}vûoKU™íù…mýd%e™¥ÉÜTªbxïüÒ÷Ñ ¿ ¾“Çð5j¥Vˆ €JëÔöÜôñ՟þÃ6^…Ôš¼W<éÒÂ':’@'4¶£É]Ôy—AKbR‘ëô®O‹µØ3Œó5±C0L·Ýf‰8†Tð‰…ƆÀΟU›o0¡½\›qM8×àº?„y}ê¬SC`H¦Ûf‹¤Ë›!©«KëÏð¤?
@@ -801,12 +801,12 @@
†g´¶˜VAð5YS˹=Až2;²·ˆU‚ 8AZö¹ÓVò/-ß/VžQ¡þ2{Ûo~AƒU È
S°, ç¾»ëۄk»;c·ìÉU÷‚ÝßÆ\¯'wcÓÁÈhدý~·2[C³½:aÅøûÞ óLøþw~£ìµ&óbUºC*|—xz‚>î_û-gg7W½óñʬ¦fà^p"¶ÕiW KÓ4MÓ1N¨Ð"y 65A§ ¾
øÞI:­Ðªä©ôE×e–™† E$ˆ—iܤsŸôÛŒ¨Šˆ}¡NêWÊ*”ŽÑùAöw[£Ö ¶Z|Cš-É
Ç@u5|_«ãqu›´À
@@ -814,13 +814,13 @@
£¸)²£Î°ToM]oúcz &žÚ5uYE(Tç"ɵ›ƒ\[­怲¶›r”ïJFf‰~ºÌH¡¥=222ö}ö¶=mĺ7™AßIÎÏ3_‡F8ÃÖú”2{˜æ8>Pjô¢/Œ’ÆMj 8êëá…Zw ÖB&5NhA`Uq²ÎË:索ÔÆz5ç"7‚#Ó¤u‡®|C
±ËAjý @À ßÿugç[ ñÃ~à› —=’229tbdÏøhƒƒÀÓÍFœ‡†„!d% ¾X E½ZÂ&=é£oH*)ÓÃQ*zÖûÀ””¤T—tég.AŠV^xÂ\®ÔûÑ1í`R*XÚSYÓþÙÝû&`)ì§u¶ðxP_ƒ~ðïÐ^TõØ;ÎʺÞÄ ¾dg§/f‚^0Qgµ¦ûÒ݄Ë;é«||gfØP–Q`‚X“e‚ÀRŽÊº¾ñÿ²|lp–rV>åNÌÐàYƒ{Þºš.3T:èqÌ9Ê>\ºÌþ±e‰€±ôÝôYMý ÐßӁ+Aï#ØZ5s-¤WáêZ5¹†Ô®×â«r¿A A~¸Ÿö\³“ÞÊÇ[ù¿ú²×qļÅ×ê­û\¶í$ÐW¼öƒžè‡*Pâ lèt Àøœeü•Õ/åœÀ'æœÙ9zß% Oø§þƒ®ñt µ›p =3êÛJäþ½ òÙÝûÎ֐èÕå”/ü(ÕlæW©ðE ßÛµ¸í½ Î)A´L鶚Å+*m‘»Îìu“|ƒœ_ùu¸ÇxÞÝÜqRÍÇÍ(uÉ¢é¥ÜŸ…ƒ_U¶<4™¹»¦—¡Jj8zNšwIRŽ"#ó0±p‹Ž “HÁÖÖâ#¡ËŽTIèÔôÅþz›‘½<8?ÄÅW‘ÆízAF–KNÎséĂ«¼ÓçgeáÑo7•ᡳQ jÕMÛubssIšSà†Mdèó@(¨’ÐmÒSAïé eW=_`΂züƒB#—AÁàâ,jВ¡á@ô
- + }ƒŽú4$zg ÛµR‚3…W¾©)±¼\Œ¨ãâlοá1¦÷bŒX‰ªW+£ßÇèÐ1f"@8à#Ç&emŠý+3Úö´-vdd–²~~n+yFg5Ó)TR¦¢QRîßßIˆ­©÷¶íÿp0ú}¬v½Ñy¤©uKÒé>áh×326¡T©[ºÜ{õPÌ㌯HŠ ÿ>êÈœ<Ã8m­îÓÁ‰8hÑ2p£Ãxéá}ŽË_O(W«mø-d– >×ÙàÄ4hÕ2p¢_‡']0§ÂçÜMí±Ý—"ïëDk"Ußû¶î“kßØaì(ì6’ªC±Ò"ËMÿl©I¿÷m¥
+ + }ƒŽú4$zg ÛµR‚3…W¾©)±¼\Œ¨ãâlοá1¦÷bŒX‰ªW+£ßÇèÐ1f"@8à#Ç&emŠý+3Úö´-vdd–²~~n+yFg5Ó)TR¦¢QRîßßIˆ­©÷¶íÿp0ú}¬v½Ñy¤©uKÒé>áh×326¡T©[ºÜ{õPÌ㌯HŠ ÿ>êÈœ<Ã8m­îÓÁ‰8hÑ2p£Ãxéá}ŽË_O(W«mø-d– >×ÙàÄ4hÕ2p¢_‡']0§ÂçÜMí±Ý—"ïëDk"Ußû¶î“kßØaì(ì6’ªC±Ò"ËMÿl©I¿÷mÂ¥
”ò³4ÅtvŠµñ®°è¡>tõ^SªÔß:8TëZG„vÕ6öôÁ^H‘‘Bf;>sŒfõ˜¸Ú1ú‹²J2·²ŒòúË)è*í¡¾"µ ™ã·@0Æõ° ÇqÁ:}©tHé2‡ß.s¿²ŒL!*@©Rêõ€ï_!½
.fÄö½Aÿ…°v5øдÓjp¶P9¹<`ñ_ €v0o~¶½“T$ïmê³õžª¯—nFÄꟘvöPýƒþ¦çIúV ½¹C2{ u(pË
î›uO¤
”\Ƶ.mÕQëgTp ÝÇ)mŸ?}Ô³/¨~åhß³qÇ÷{'û3þÁ© :žüƹ)ÊýFJ
@@ -829,12 +829,12 @@
‰˜ý}?ÛP÷í:`Ó®%¸)*pÜÙwCÅφÎ+‚ ;nZ‰†&8Q¾Œ›¡+›ÊÎ.#³(¤Ý
-ɘÒ˄åvPHî’EðœPÚ"µllÅO‘‘‘‘‘Yª?*×/¸›^8óºÀJÊe!ª§ RÒÂ\R:Èõgü¶ME¦fóëoz7ØtaÔ¶•‚°ú/k ƒEk^H‹y¶ªÐΗ\Æúw«x`—“¥ÝwsWʟÎ{ǸC¿%hš…E[µ¿÷QËáäú‡RÈÀÍ&ý³ÌQXæb:M*Vd¹FEô—gÏíöžcÚ=‡®1ÌÐêõúWœ7ÿn€Õ÷¦Áô\+Kû$Óà!Ôe^¬MÀ2%"²q
+ɘÒ˄åvPHî’EðœPÚ"µllÅO‘‘‘‘‘Yª?*×/¸›^8óºÀJÊe!ª§ RÒÂ\R:Èõgü¶ME¦fóëoz7ØtaÔ¶•‚°ú/k ƒEk^H‹y¶ªÐΗ\Æúw«x`—“¥ÝwsWʟÎ{ǸC¿%hš…E[µ¿÷QËáäú‡RÈÀÍ&ý³ÌQXæb:M*Vd¹FEô—gÏíöžcÚ=‡®1ÌÐêõúWœ7ÿn€Õ÷¦Áô\+Kû$Óà!Ôe^¬MÀ2%"²q
Õj•^¡g¦b%!å£ÝÛÁs
!˜n›-’’>FÄ7)©ƒ ¾÷­|Ä:ƒûétê¼Ë %±
áL|ô,3ÁͶOÓJʚçdì]_žJʱéJÊM;?P5ï’ús<ad%¦§ùÈ2.ýá܁XITyš‡w¾½Ó‘ÿÑÌÔ²zï&ì쏙e cZÉ9û0ÓN¶S®«_-l>ão?G)OƅÛOÈÖ;q[£=01`º—éwZ)®§»ß±gyQÒݘ¤¢ÉL½·å›D¶M¦ÐF“õ—'™š{àՋôM{¢ž¥ì¦‰J÷ldÃlåQU—1#í»ñô‹‡»ÖU“7@ð4írûL Ó»B˜dè¿á Göþ,¥Û…ƒáú–Õn+Uà-–±º%-‹å£G
pÓÜ;à½ámMšãvj„¦^c]ä….)–µ<Â#§ËŒž –8³ùä'ú;v‚v[¹@ *uÂÝýÍlf‚ hYð¥ÅáÍÒ´•>ýl`S£ëµøâÕ/V/domn‹ynÿ[FÎ֛-í±ÄµéçIÃÌ×#‹„å+ˊÒzҐ3:ÕÐ5Y'“ôûîˆ×É#1ò-2àÒÆî3•DÌ(49I7ÿ#x5&y½ç“'÷Гzþ´á³\ŒáÛM-½ÅS¨µ@Ǟ”šZdyõ.³ô'r$U—§U,ÛzÌô=o×x7™é8;–tܖ“nãŒX""ÖÓV˜f‚á8Ž 1ÖO
@@ -842,8 +842,8 @@
q7}ŠmZÃ$+…Ü8‡ã¸l½,ÛúPË;՛UjUorÁüènªOr7« Äy>E›ö7KžïÊgb~K¶yWÕÑSû<Aÿènª‹‰B2¡)à8–„Ð/Þî£F`&!âß Np°‹I:;õ¸éýKƒá
@@ -850,12 +850,12 @@
-ÒpD<ZÌRÏñQÔmœKAä_K×IYŽ…)0Ã۝Ï_”®“â«3øèýŸ¨_yîéíSmÂ點æÚæ‚ÛõWîéZ®Úç ú®»©.oS,%­m•üOǝ^XÈy/4ï©S¦Ýǝû{{.{¯– ÝQïÑ)MõT}¶×Ém u}ۃm=ª©ÚØĎØ+‘w}ؕ^_,3ËJ>Ñ}AyöÐ~Ž’uǯ®¶#òÕ>½¯çεÚÇ,ñ!÷ƒôTtUwŸ²î&÷Y˜à4¦…YñàÄ=O®àمBè=:¢áB؍áHÔ;ækz¹[öZ|§ÈCÒ@]/dqÓ/)<_{D›òpÓ#³&E™’ë,Cn¹™©´ÍÒ`Ç<Ž/!Ç1wÇI]½Þ8íôOl M#=†$þî±7±§èG¨@ bÄbÕc׊¥V‚@ D"¿›“Hù‰þŽ ÝV.¤JpwGÿGJÈ¥oÈ´‚,øÆgß©Ek ±`´¹-æýÖ¶=[o¶¸Ûæ¶?ˆTŠ(#B!˜C[Ðü¡Y¼Z,‘H2Nþµ¶yêÝ.Ýv9¾—o×:{ _l訽ާ߭Àq\¾C纞wLÒï»ãq¥Žã„|‹ ¸áؗªË‰c˜Xu¨%R>ã>O2Mv9Lò
+ÒpD<ZÌRÏñQÔmœKAä_K×IYŽ…)0Ã۝Ï_”®“â«3øèýŸ¨_yîéíSmÂ點æÚæ‚ÛõWîéZ®Úç ú®»©.oS,%­m•üOǝ^XÈy/4ï©S¦Ýǝû{{.{¯– ÝQïÑ)MõT}¶×Ém u}ۃm=ª©ÚØĎØ+‘w}ؕ^_,3ËJ>Ñ}AyöÐ~Ž’uǯ®¶#òÕ>½¯çεÚÇ,ñ!÷ƒôTtUwŸ²î&÷Y˜à4¦…YñàÄ=O®àمBè=:¢áB؍áHÔ;ækz¹[öZ|§ÈCÒ@]/dqÓ/)<_{D›òpÓ#³&E™’ë,Cn¹™©´ÍÒ`Ç<Ž/!Ç1wÇI]½Þ8íôOl M#=†$þî±7±§èG¨@ bÄbÕc׊¥V‚@ D"¿›“Hù‰þŽ ÝV.¤JpwGÿGJÈ¥oÈ´‚,øÆgß©Ek ±`´¹-æýÖ¶=[o¶¸Ûæ¶?ˆTŠ(#B!˜C[Ðü¡Y¼Z,‘H2Nþµ¶yêÝ.Ýv9¾—o×:{ _l訽ާ߭Àq\¾C纞wLÒï»ãq¥Žã„|‹ ¸áؗªË‰c˜Xu¨%R>ã>O2Mv9Lò
t´Ç»ÇM=þ¡Ñ†ü=ñï
-G^}Ŕq\:’‘ˆ9d6zŽH·q>È ¸] ÇqS\G;4¿Ù,LHœ‚'Ä©ÖÅݸ¢u…»éo„¸ÚM ¦Öço
+G^}Ŕq\:’‘ˆ9d6zŽH·q>È ¸] ÇqS\G;4¿Ù,LHœ‚'Ä©ÖÅݸ¢u…»éo„¸ÚM ¦Öço
0¼§7ñH“>Ê2¬í‚Ø@Ú®8)j.ãXs,cN%vÌ9WùHø* ]×Q5V,Pß,èh亀øŽI3H©` y_¾Ýœ¸m¬óözB°RN%µÅjp ¯6ço„¿'ã^9©Oî>+ŒŽžž”zQh×¼rö –ü!«¥‘—ðÈkJV Jl÷ó(‚‡¸›Ý"⊃¥Ë<aýÒ ×eB ´¾ÍY>²@vMY ¸ÿŠ} ýRx³j‘°÷n‚©ÝùnÉRReƒò˜Í7àõÞô\ü¨ž¿zž}æîDÞ`%Rúo̓ýðηw:r9z1\W¿ZØ|Æß~ŽRžŒ'=n? [ïÄmöÀĀé^¦ø•âúwÚ¸û] Ìò¢¤»1i
@@ -863,7 +863,7 @@
p’þ¸wÀ« ¨TDÞpA¯puV¢ùKº¤ýIï΍±WŸžÓÝy#r–HÂɹ*Ù©c+·*‘R-1D|ôŠíJR&§„$!áœÍ¼O›˜—¥`Ì'̹+-I¸)•åž¡/1NˆØ1 $§ÀI§­½º³^©ÿJ]匮ރ¥/¿bo¨}
-Ö¯n¹¡²þ¤È´:«þž0žæ[$+‹ºì™A|— uœx‹™¸…yr™Çù Xb7HÁ@äOæ‰è"øâúâ±—ˆV‹0af_°ü˜çj{egcM铫ÔGú^#@V…~äïz{ޒ™_¯)--ÕíÕ_Ïûùy¥¼ïÃFsÝæOõFò°«z­°ôé¬ÓYû¼RþEg£û͚Oû»ëq?­ÞíÕyk6–––o¶H—ïj¤œðµ¾Ýš­!é pÒç-øô„ÁÀÛV¡¤1–»5BÇ[äðߛ3ƶa¸oĊ;?÷WûšTUåx¶¡ÅJèò•îLNe6jwƒç¢·úZ¸á*EUâ+V“:7HìÖ¦ÚB,G24…á ‰ógÝΊ+H‘L €DHÃÇV:KL½ë¤^ú”X 2µý¦-fÍwÞ('p@ Æ¥úO¼±¶rjÑø>3k0A1&ß¡÷Ç´SXÊP§c&VÔ(6Wy.œÇu‘nã”Öã_L2¦×Õ¸cò:Àx%{ž^½¡®™•2+Š1bƒÂü9iÊ9±ÝVs›I¯V²C®–gBê]løv«åO’æ—ÛÀù¿êÐڃ®×3Ï£óáÁÿ©A²#>Ëlô=äëI¯iÚ!1|ꟑqDž {(by ÜªäùvQÎó¥ùçB
+Ö¯n¹¡²þ¤È´:«þž0žæ[$+‹ºì™A|— uœx‹™¸…yr™Çù Xb7HÁ@äOæ‰è"øâúâ±—ˆV‹0af_°ü˜çj{egcM铫ÔGú^#@V…~äïz{ޒ™_¯)--ÕíÕ_Ïûùy¥¼ïÃFsÝæOõFò°«z­°ôé¬ÓYû¼RþEg£û͚Oû»ëq?­ÞíÕyk6–––o¶H—ïj¤œðµ¾Ýš­!é pÒç-øô„ÁÀÛV¡¤1–»5BÇ[äðߛ3ƶa¸oĊ;?÷WûšTUåx¶¡ÅJèò•îLNe6jwƒç¢·úZ¸á*EUâ+V“:7HìÖ¦ÚB,G24…á ‰ógÝΊ+H‘L €DHÃÇV:KL½ë¤^ú”X 2µý¦-fÍwÞ('p@ Æ¥úO¼±¶rjÑø>3k0A1&ß¡÷Ç´SXÊP§c&VÔ(6Wy.œÇu‘nã”Öã_L2¦×Õ¸cò:Àx%{ž^½¡®™•2+Š1bƒÂü9iÊ9±ÝVs›I¯V²C®–gBê]løv«åO’æ—ÛÀù¿êÐڃ®×3Ï£óáÁÿ©A²#>Ëlô=äëI¯iÚ!1|ꟑqDž {(by ÜªäùvQÎó¥ùçB
@@ -871,16 +871,16 @@
»ò©T›™Y)‡Ãô͸óZé X:uñµô˜/ÌRXÆ…Iíc¸ÂzÙC§%É´m¬o³iTÖ®§.uGÞËOûÃiÄ6ê¾Dµ´Ë²
wkN÷\
JËW–Ðwí 0I7ÿ#Øsݬ¨Àñ
üރñµ¥’2‚˜˜%*Ëõ–³åípî×Ð/XèóQ›)UláVI›ò•q,¨ÑAÉž£Užµ•¼+ „ˆ·*•©‹d‘ÐäÜ"jÿ'«ªx.Õ&è>֍¸Þ¤"i«fw^d‹Ç£ØçÅc2p¤!§'Rù hvgr^sf,Ÿbªâ1}ðù+!·Î͝àÁóµG´I‘-µ±¼Iò—â2DÓöK½Ø:’¹åUHp²ŒÄ×àøj<=€ÀâzÖÅý¶¢u*&ò\4ž6H_ˆ×)tGÌúùäiü+_r¹|¬2K¹ZœcNàFˆ»˜
@@ -891,7 +891,7 @@
"Ê·çɉñ)˜…4š.(9É4mkntôÉJ’NTwˆ ©¬Xµê÷b‹Æ37Ž„&ˆƒßG9}ô³YŸ(ÛJF^ Б×”ÜÛåMÊïh ¯µðKdf’±lõÒP½S«?¤×íUIÍö IDAT&‡í›ýYäT¯éõ‡ôúCzýkZ²ˆ²ŸÉ5­8û³\<˟M+vœeyu0l7„DÎ#ʲÌztA,0 #ÖªJ…~‡R¶^FV²õ²Œ¡ô`y§Ú¡RÛ¿öÑcŒÿ†]S;í°žâö¨ª¬_ú˜1š™ú9To€¢~ð6¿Ü,yт]ÏKšv|÷húžÏPÛ,y¡‹à)υù-Yï®ë5/MÓ¾¯mêX·‹ ˋ¥Öè»GÓ#~ëÁª*U{êµaŠ MDZì$Ðo{£˜IÀ„èÏ{ÙɈ¸_Ò53»z°Ô\-üÅÄÊ>k­»¥}ÁŒÔ®zƒy]¹ W¸ºà5£‘žäÕsRـb{–ü]ƯçPÃÌ×ãjŒÁ[­³RWÌG91ÆD²Ùœdšþ6Üsݬ qœ›{í¦×pžÂl-æØýiAòªUª.[$ŽabÕ¡–¸‘¬b‘˜e9pÔ,mu‡8ËÞiÆÓ9Ì5¾Ó4*ÒÊJ ó/ØfMÒòÒiÊ7VuíñŸ›ãýq{üC£ ù.—…6š"(éy»Æ»Élݙ¼àc’&Ÿ«T½j~øßðÃ߆t>õb_"¡É9i2"ˆÂˆ
‰H§¾pÐ%
-Š͘ĕ¢"°YCò.h*å¢w]¶8ˆVKð™#¶(þØh² $KÛԟÒ.-MÓ\(4M E¸ýQS°†0Ú<í+Ê=㠌ìò2š\:"Ìc»àÐìVÒãF<ŽðË/"ÌÇMÐ{Ê4øj‹vu¼œ¾í²}=\û†^š}‰…óFq(u ¯> “OäÛ:7<©­go?"ú«¥•1“d:Óôm
+Š͘ĕ¢"°YCò.h*å¢w]¶8ˆVKð™#¶(þØh² $KÛԟÒ.-MÓ\(4M E¸ýQS°†0Ú<í+Ê=㠌ìò2š\:"Ìc»àÐìVÒãF<ŽðË/"ÌÇMÐ{Ê4øj‹vu¼œ¾í²}=\û†^š}‰…óFq(u ¯> “OäÛ:7<©­go?"ú«¥•1“d:Óôm
æ«V™Ù®«_-l>ão?G)OÆcCÚOÈÖ;ñ큉Ó½LËVŠëßiãîGc0ˋ’îƤg
@@ -903,18 +903,18 @@
$49·$ÞVkw¨|?Ü÷(/@`œåh†¾;À|îV®'…EdýŸ¨_yo ålßèo£ÎõÖÚ¼VÞ¤Ó¹¿·í¼÷áÃ=Dº¨sͪRØFH×÷££ß»d#6ÅËñ¹$óYÎõýèOî÷©=Šã‹Û÷ðპ×DÝúšH¬DÞõaWzCb™YVÂ龈.h?GÉޏ÷ÙvÄC¾jÙûz.x֞ )º¤§¡~ð¶×w“û,Ì@p
Óbµˆ
-"Ç·çɉ+ÜSòVÒ(@ôPt¶Fc8]\Žùš^õõ»C\àH`ŪU¿[4žé Ålå@’>/8@ ò€b¼~7øÜFó^Ý¥ÿS/yÍgþ{4Ã0ôåýÜî¤r'DɓyµŸÍG©ß ³­^G !P:byÀ¿‚6çyža9Ô[-.Êê©È‘™_£‹BlXƒÅ:PÙú³J±4š³Öpä´Ûʇïs"I™j_Gÿ‡JÀ„xõ‹ÕÙ¶bÚURGƯîügŽWn.d[1øw1W´¹-ÒýVýÍB¼ºgëÍ·?w½GE:–JÕ¹õ‚Ø¡JðпüÔ%‡b5.*Ò!:]D«µÍSïÒmÅß®uöºK·eþÏò£ºlQbPjŽ=“tó?‚W3+Ö`¸ùzÏ'Oî¡'õ‘˜qÃg-¸÷›:[z-Š§°¤m# G3ž]˜eYsÔ{M,mu‡¸;{§CPOç0×õNÓ4ie%­ hOÊ#_6I˓ÌI®úãK­¹IÀ²O‹öø‡T¢ø$rG²%ϦQGk,Kv;N2¶¿ geºúO+#ǐ|®RñªéÎWJQÝo*Õl`igÖr•Us÷­¹•¯–7ž›ÙV2w=D2bR£\k¶_òY+‹uoé=÷ܸfc8–ˆIY¥áu¹õøÅ
+"Ç·çɉ+ÜSòVÒ(@ôPt¶Fc8]\Žùš^õõ»C\àH`ŪU¿[4žé Ålå@’>/8@ ò€b¼~7øÜFó^Ý¥ÿS/yÍgþ{4Ã0ôåýÜî¤r'DɓyµŸÍG©ß ³­^G !P:byÀ¿‚6çyža9Ô[-.Êê©È‘™_£‹BlXƒÅ:PÙú³J±4š³Öpä´Ûʇïs"I™j_Gÿ‡JÀ„xõ‹ÕÙ¶bÚURGƯîügŽWn.d[1øw1W´¹-ÒýVýÍB¼ºgëÍ·?w½GE:–JÕ¹õ‚Ø¡JðпüÔ%‡b5.*Ò!:]D«µÍSïÒmÅß®uöºK·eþÏò£ºlQbPjŽ=“tó?‚W3+Ö`¸ùzÏ'Oî¡'õ‘˜qÃg-¸÷›:[z-Š§°¤m# G3ž]˜eYsÔ{M,mu‡¸;{§CPOç0×õNÓ4ie%­ hOÊ#_6I˓ÌI®úãK­¹IÀ²O‹öø‡T¢ø$rG²%ϦQGk,Kv;N2¶¿ geºúO+#ǐ|®RñªéÎWJQÝo*Õl`igÖr•Us÷­¹•¯–7ž›ÙV2w=D2bR£\k¶_òY+‹uoé=÷ܸfc8–ˆIY¥áu¹õøÅ
ÀÅmÂwLºù/ü%ªï¸6ˆS†^’—ºè¯ãÁ±Ãe¯'>=ðñØVƒ¯ò®ë oò4Â߀q¯üv_ Q°“•b+ülü÷ғRí·~’þŸgæ|t—xÈø7L/4Ÿ0kˆ,§zýôä¦ÌÎ3LýFN¨üëwÿÜÌ{v5†´fž£ÓcFO y –&KíçC̱¿F¢7Ē§0= ¡É¹&iy1ˆ$"e¥B󜌽ëSHÄDATäzR,ÊpØe%àþW|Z;ô _þ÷•HÀ9­ñMKKæà)Ãuõ«…Ígüíç(åÉx"âöS²õNlµÚÃј0ÝË$Þ±R\ÿNw?¢ ƒY^”t7&%w`¦Þ[ƒòM¹E6
m$Eœšþj’©Ù¸^½Hß´'úèYÊn:‘¨tÏF6ÌVe*E’œ=G +f䣏ÕDê7ČHõǍ³Ýg¬òj¥b»R¶Sc¾d§Fæì¹·¥µ…œ‹AŲAÞÚ7ôóÐÐÏC?}k€Èû¡Ÿ‡zÖeþÿ¯UwJ/×Ú<2Të]±ÿ'êÞû"çõ ³ÉÙ[F鈯Ž¢ïù¬‡k\’Óy•¦.{²Ä\°DTªZßnõM 4”ˆÂñÜä{€M<Ï#2,ápx®\Ï ¼F¥+¥,‘?׌@
-ñ˜½Y”uabž‡Æ#ʻφk U%HV
+ñ˜½Y”uabž‡Ã†#ʻφk U%HV
¹qÇqÙzYºÜMË;՛UjUorÁüènªwÏY?Š‰®ç%M» Äy#´©±YòBÁŸo#–2ìÌ¢{mí²gßVN G_Š:µÙ³;Ä]lGOc¸®vu³í¨ÇxMÁD‚R¿ö²³óé*éî`בz©Dè¿ín×·K^ìÐçJŸ0›FkW ½A.ÒýMÓ'é߁{¼±
ŠJ&Â;Ûj§„æW•0Aَj$/tI1€låÀ½ÂÕµü=PnU¢8ˆ‚aǜݟf^Ū{LjçÿG^$ûé<®”æ?èBÑô9Ërp[Ë»0D|ôŠíJR&§„$!áœÍ¼OKTÌÁc¿ù„9w¥Ç
>Ñ–amlÄÒvÅIQs<-,b9aǜ¹¡LζK³'±Ÿ±tUcÅõMf¸×qv­@ Y ®©Å8“|è|G¤˜8î×cn끸")]ž …•bÅn½<^óê•øL ˆqB{Äk%}ÒßÂ…q¯œÔ§ì#{ϖhœ:«H´!&í‘r=)õŽb–d|NÃ0 _‹K×Iy|ôàsØ`§É?„Ãaê¶KUâ‘,f6òô{ÃӁX…¤˜Lj½æeØp˜e¼—㏻‰õ³m›#vf¥<Ó7ãŠ7JÅÒ©‹£¥Ç|a–Â2î&M´á
@@ -921,7 +921,7 @@
±1Aú¶±¾Í¦QY»žºÔy/?í§ù
ß®÷ Ráp8<N»ÎÆ£Œ³•@÷%ª¥]–õÐ-6«¥±—ðÈk>J`ž,§” ]”GˆÈ˜›lƒ|ôˆt¨¯í¦LöX¿éƒ¦2žd¼_:­'ͦL¦fÛÅÄ¿4}`òç3Àä5À&~kÿÜþåkŽHüsÕîPù~¸ïQ^€À8ËÑ }w€ùÜ­\O
-֖Åð¢~彁–³}£¿:OÔ[k§=¿¬óŸ;U'œ£¿ö}Vÿ‰¾*ÿ=RŸaíÿôù\² £Jýá¬*…m„t}?:ú½K6bS¼lå/ω½NÞýC™óÛ¡Q¿rÂ]£4KIk[©2ݝŸGGÿí7¿*n­Sf­ †ƒÓeßÃÿ<èyMÔ©‹W¶É\ߍúûUEžªÑôõX‰¼ëî|B:<Nî›Ví• ª5úË.Ñp·æ´qÏ¥ Å÷jÇH6zϤ‡òÊC’>íÍß2b¦,Lülii©š÷ aÎü­yååÒ¦Ywê E$å•$–(·*—ˆ "å㼖ôÿ³Ÿ¿K‹7²²T}×Å=P’2‚¨ ˆ
+֖Åð¢~彁–³}£¿:OÔ[k§=¿¬óŸ;U'œ£¿ö}Vÿ‰¾*ÿ=RŸaíÿôù\² £Jýá¬*…m„t}?:ú½K6bS¼lå/ω½NÞýC™óÛ¡Q¿rÂ]£4KIk[©2ݝŸGGÿí7¿*n­Sf­ †ƒÓeßÃÿ<èyMÔ©‹W¶É\ߍúûUEžªÑôõX‰¼ëî|B:<Nî›Ví• ª5úË.Ñp·æ´qÏ¥ Å÷jÇH6zϤ‡òÊC’>íÍß2b¦,Lülii©š÷ aÎü­yååÒ¦Ywê E$å•$–(·*—ˆ "å㼖ôÿ³Ÿ¿K‹7²²T}×Å=P’2‚¨ ˆ
B*Sº]À¼¼rX®ÿUz%-C7íڝ
@@ -932,7 +932,7 @@
ó­ò¬­L, „ˆ•ŠJEä%ß­/Þb&n5çÛCÄ< ?Ñß±´ÛʁT©îîèÿ(C<Ð
²àCë!
-R—Wk·f w‘°\O ~Že'|ÉåðMd-ÏÙ;áå6±RP €ácR^©PlUÎ òV¨\ºÂ RùÙӗ¼'J`p"ÿ½Ïô «e]Hór†"Ä^;´½•Û÷Îc$#ˆ¢ÜՊà†ó4‹@,'ÐH OЁʟÄcŌ³põß\ a£žšš¶€ËGS‘}À3î N~m¬KÓ4MÓ¡"1.‰ÞÅì×Íp¡yÅïŊZÓi›/yõŸíˆ‡|Õ²÷õ\ð¬=AïaϓÓ7¼«^yÓÑæ¾<ÌgOÐyõXû¹3‹Þ$j8v É­ IDAT ®áHdV¿qÔKŸ B¦¶ßŒÊŒDÄL¨+&)Ž Š1ù}lq¨ —x‹ó¸.bß ´þ#+§®™•2+Š1bƒÂü9…ÓÜf&Óëj\Œ Š1ùNÉ1´ÖkfùSbA1¦>⤮™å¸@ ãRÃÙ駖2Ô)Ř@€‰ujÚd¶~Fv06=˜*zéáJL€Ez˜ï®Å-dé@ °:Õ[@ ~JjtDgV² ©N׆îÆ7tu ׌ÍÆfö,{Ë;ºùb‘ òHÃ61lü¬1ñK1iúyHVÂû3LSP£}ɤ æžMý)纜 ï qx%,ä¹t#º“yu‘…ŒçXÞ`†ÓNj,ƒØK"bÒÎBjÞ0DÞ`„ÖwV•»ÞL¨>ëã|[t–߸çÚ£áÑȋ:òZ%äÖB²ø¤{ê³ùèóqôž2ÙG’F¶ôm—é¸ÕÏjàüQìMüVÐiwÌ`¥lN#¸¿KJ‹ïÎK*æœ$]‹A$)+šçdì]ŸB"&Ê¢‚ דbQ†¤p²pÿ+î‚ý≾›¤}S¤íš‡¢içªæ]ÒüEobOÝì˜ä%V"g¼Ü Òìå9›À„RpM?õ°ŒKØ,%U6(Ù|^ïMÏŏêù*g³\"€¡ÿÆ\ï|{§cNWà@‡Ç ߵ﹐¿4ølHŠ 8•ŸÝ© IfÓ1?³{‚@ –
+R—Wk·f w‘°\O ~Že'|ÉåðMd-ÏÙ;áå6±RP €ácR^©PlUÎ òV¨\ºÂ RùÙӗ¼'J`p"ÿ½Ïô «e]Hór†"Ä^;´½•Û÷Îc$#ˆ¢ÜՊà†ó4‹@,'ÐH OЁʟÄcŌ³põß\ a£žšš¶€ËGS‘}À3î N~m¬KÓ4MÓ¡"1.‰ÞÅì×Íp¡yÅïŊZÓi›/yõŸíˆ‡|Õ²÷õ\ð¬=AïaϓÓ7¼«^yÓÑæ¾<ÌgOÐyõXû¹3‹Þ$j8v É­ IDAT ®áHdV¿qÔKŸ B¦¶ßŒÊŒDÄL¨+&)Ž Š1ù}lq¨ —x‹ó¸.bß ´þ#+§®™•2+Š1bƒÂü9…ÓÜf&Óëj\Œ Š1ùNÉ1´ÖkfùSbA1¦>⤮™å¸@ ãRÃÙ駖2Ô)Ř@€‰ujÚd¶~Fv06=˜*zéáJL€Ez˜ï®Å-dé@ °:Õ[@ ~JjtDgV² ©N׆îÆ7tu ׌ÍÆfö,{Ë;ºùb‘ òHÃ61lü¬1ñK1iúyHVÂû3LSP£}ɤ æžMý)纜 ï qx%,ä¹t#º“yu‘…ŒçXÞ`†ÓNj,ƒØK"bÒÎBjÞ0DÞ`„ÖwV•»ÞL¨>ëã|[t–߸çÚ£áÑȋ:òZ%äÖB²ø¤{ê³ùèóqôž2ÙG’F¶ôm—é¸ÕÏjàüQìMüVÐiwÌ`¥lN#¸¿KJ‹ïÎK*æœ$]‹A$)+šçdì]ŸB"&Ê¢‚ דbQ†¤p²pÿ+î‚ý≾›¤}S¤íš‡¢içªæ]ÒüEobOÝì˜ä%V"g¼Ü Òìå9›À„RpM?õ°ŒKØ,%U6(Ù|^ïMÏŏêù*g³\"€¡ÿÆ\ï|{§cNWà@‡Ç ߵ﹐¿4ølHŠ 8•ŸÝ© IfÓ1?³{‚@ –
@@ -939,15 +939,15 @@
к±<âLœ€À™¸T²hµð¡ÿÈŅÜžUûóÙÄãÉï2^^#Žž 6jÀËÜÒw½s6¹HÑpLOÖÚÚæ©w»tÛåø\¾]ëìMŠÊ4_7+H‚Ø ´|e ÞjÍgé«¡k özŸ~·ÇqùëúôÀ“ôûîxF)ã8!ß"Ë°q’iúÛ°Ëa’Wàx…ÜtÙËýê°çº|>kÁŘt» Zz-Š
-gf„õÿ@I7H11.݂K·(XÚ×}ÆÎ<ǫb7¯2%gÆ0 [‹á€ð%·÷9l°Óä?]¨Êü QT]~ÐJLMå¿8 –»’ÚŸuŽI­×¼2Ãd)Ͻ
+gf„õÿ@I7H11.݂K·(XÚ×}ÆÎ<ǫb7¯2%gÆ0 [‹á€ð%·÷9l°Óä?]¨Êü QT]~ÐJLMå¿8 –»’ÚŸuŽI­×¼2Ãd)Ͻ
-I7Bכ’Ñÿ5Dnbó[ªž¬ªz²ªJºÝ»nXó˜»h– Ö&dë.Œ†#ÕŸë)ÄanyS6°¯ÞvÙË0Œïk»:.
+I7Bכ’Ñÿ5Dnbó[ªž¬ªz²ªJºÝ»nXó˜»h– Ö&dë.Œ†#ÕŸë)ÄanyS6°¯ÞvÙË0Œïk»:.
™E`‚“<@NýÄ9“E&2«¹™•vdâ©å³'9µ#;:eÃj÷¤ÀúBt [dd¯#udO`?–%.JBÐíE'q½]ºßèºæ£ïø]ý–zE§hw—>_w>•&êK[]qGÿ½K‡}oHq!ÙÝѪùÀAßeè€×ÔX/z¾'¶`éN.8Ü®÷”M^§T¼¨”íÕX.8è,1¨sÓÖÞ&™ë(ÔB•Ø£q¿ö‚ƒzÙ*„ ázÒÅé<CK^ïŠ}̶ÄÒzãǑŸG"·þz^2Ú_ òÀW[Uë)Q8® Žø<ÿ‘>pÆ(oœ…²Ó\*°7j”ýf€)¶^þr€jºõó؈×)ê•k£yßõ_€óÆÈ-·uøúo¢çn>«Òä´p‘—=0㲎X5pŒËvÆá äqÔÎ9?¢hÁ ”lÚ/ |agrvé¤ÿÑD„¼–ÓNÿ†eYæ.íýÂá¤g7)2O!¥„²R0pÊÙËÞ¥=Ÿ÷ Ö+–%„ì|ìÚ Ú]U†I•:Áþ®Á?ç\¬À´©cØ3øtìyÉ*Z#t¸­–CÖ3$rºÉbuw,=D±‘ØðÎuÏs\Sßpùoiª³÷Œx‚Ó ßËÀEBͅJRíÎ;®Xàœ¡ì7„b¯Ö|Âš(9b×͂Å4Åò)œ”k‡#z )‹™LC ;”o}ç:©ù3'=΅Ãaö®ßþ¾/š›)¤”0žˆîåXÆuÖY‹¬ì§9&µ¿)}Çæh œ }Ó©,d˜v,I¿VˆÕMìë~$W®ùk8€ëUÐ*¢jŒW=-g“¿ëí{Sf9\/‹5ÇôWf@ُ<Wi¨ªÐÜd!»~â|È(™ÕÎ|ÌJ;2ñÔrۓƒÜڑÒW­ÀŠž³ÆºR³Ùà á[ Å­ŸëJ}­ªÚª'·4·Ù$¯öøÿšý|*-H_’PŽ¸­ì禪Mâªg5Ãô¾„éNΟÄùq½âE¥D&gŠØ¯1ž±Ówf-Sk9n)\þu‘JXÜK)ës"÷ñÆcw‡ø®7gîðÈ˧¬Œç’¦Q‹*)ª:ú'¯Q[¯´…nG#§9i˜ç­¾³feœ’HՇŒW½£iõ蚛S¥Àz ×%ܯ½C“‚«v“”"©­Ê>wÛèåhHcÏpӕóÊ­”´Fs鏲#Ñs'vX¨ë†B-œE˜q
@@ -955,11 +955,11 @@
µ¾:voÌy¼ÉÖ0ë@R¾”º†ô'\ccc®ãÚþ–Ì%t7ôj»ÏŸMŽF¹}\æº12æT•xj·µFò8å½ßW:oŒŒù•“îz¥…ã¢Ë<;’v6•Â~Wâúnlì;—ì®]ñR|ét÷¡Ž³Þ‡ï÷½*ìÖE§âåòžzÒ­"dY9¯û2ºÔ ó -ûcÜþK,CAfú{ogS¯ä+;œ†–´¹-T5›xà±²ÄõòeHÌ9—JN¤¯G›§øMÌGύûZ_ꕽfŽ÷@¼AS.Éx«Wòº4ði|aA
K6ß*˜1]…9•™˜ŠÑ„Òô®Éô®ÉôæBÌS^ԁ@ ˆìänxxí¦—ð—^Íg¹c&á}/WÚ»S:êCš‘wŸf›ÿ³Ù‘ ÝF<¥f`V±ëò°ˆf !…Søµ*ždËe º¯Ö±¯{V+]³"?>ØÅ7kwUNðBQ¥ê•®Á”€ ȺÝuَZÊ!©âˆC,n«ôMmÖî]ˆêN¢Œó%q’¸TD©vÈmçìÔ•@D†~òÓúëIa¹€ 1é"Zíž&÷ˆn' ä‹Zç€[¼+óo6ƞ¡†+#úI IëŠG¬ÌPBÍE—>âjŸb[ÿ2zë¡YŠi¾èí~TìïÓ
-ùÖ¿Œž¿gQlÀHˀƒºe{Š1ü-x)–óJßÉÇ0Súˆx”ê¢U!!@õztÍxÀqÊx,ã-Š[_‘Ô³ÃA3ÇØÜ!þÖA*º‡õtò=¿'†­¬¼½ûÀöcydg«´*©˜Ñ%܇ËOž}µÏ?¢ƇLø;ry>•öù–Êd±ã)Öþ¡ÑØuZöjÏà‰¸úQUNCXYÇOØ
-ž<W0 ˱ØKXOɇ{ìÎa™F–kn—JB¸?RNv˜m`Æ)ðûᱩ±,(w*єĜáƝ½ŸfÖнm*P ~A
+ùÖ¿Œž¿gQlÀHˀƒºe{Š1ü-x)–óJßÉÇ0Súˆx”ê¢U!!@õztÍxÀqÊx,ã-Š[_‘Ô³ÃA3ÇØÜ!þÖA*º‡õtò=¿'†­¬¼½ûÀöcydg«´*©˜Ñ%܇ËOž}µÏ?¢ƇLø;ry>•öù–Êd±ã)Öþ¡ÑØuZöjÏà‰¸úQUNCXYÇOØ
+ž<W0 ˱ØKXOɇ{ìÎa™F–kn—JB¸?RNv˜m`Æ)ðûᱩ±,(w*єĜáƝ½ŸfÖнm*P ~A
-¿ÍC¬.¨ƒŽ®IµÊœ+à'.õŽÜ2µušZêG'xáFIëmc7tÒßDqF·ÚZ#{B‘r¯v°ßÙc×mé2p ó[wYÇês´ÚnjUåD@ ËÍ#+´™ˆ@d„¨Îªgi5RB\hJA(*kšgdÜmŸBDP•UMIž’ W[VîŸB±¡_f§N(¸PÂîÜùñr)Œü;¾xñ֍[]q"»f”F8Ö¥#óŸH Î5nÜ Òò96ÕpR×´^`8åï<C+?Ž«"Îb¥ç:¢éí~"¢ƒ[w‹z[»‘ÀÌׇåO 3›Ì\+Q cš¦Øúmàwç™kŽ˜§ê„Û/QG3ý…G¸Qß;„Q6Öøµݧl¶Oâ¾9-X¨ˆµŠwÈËNåφ@¬z"aíåuJŋJÙ^å‚ƒ¾»`ÛÚÛ$s}õ# øíºËtzº¼ýêÈÏ##?üxÃ
+¿ÍC¬.¨ƒŽ®IµÊœ+à'.õŽÜ2µušZêG'xáFIëmc7tÒßDqF·ÚZ#{B‘r¯v°ßÙc×mé2p ó[wYÇês´ÚnjUåD@ ËÍ#+´™ˆ@d„¨Îªgi5RB\hJA(*kšgdÜmŸBDP•UMIž’ W[VîŸB±¡_f§N(¸PÂîÜùñr)Œü;¾xñ֍[]q"»f”F8Ö¥#óŸH Î5nÜ Òò96ÕpR×´^`8åï<C+?Ž«"Îb¥ç:¢éí~"¢ƒ[w‹z[»‘ÀÌׇåO 3›Ì\+Q cš¦Øúmàwç™kŽ˜§ê„Û/QG3ý…G¸Qß;„Q6Öøµݧl¶Oâ¾9-X¨ˆµŠwÈËNåφ@¬z"aíåuJŋJÙ^å‚ƒ¾»`ÛÚÛ$s}õ# øíºËtzº¼ýêÈÏ##?üxÃ
1¹|ôÖI͟ÍDç¾ë·¿¯ÃKŽc•±ØÝ˸ÎZ"ccÊ~:+†ô_˜£q€t’\>úE3#ýB!r\MùˆRÒSÿ>˜vñ«–ØcuôÑ2éÇqj#¥ªÑ:ÿ€'IRö”,]î&‚õíºí*µj Où4ÅþànmÊãdOÇò¦lû¾z[_Ãs󃻵1_ ¥”u·H©59»õ¤€ø°Ùø9ɍ»§¬»E­ûŒÎÏL”€µníê#Þîà$‰Ó(J©žçD­ûŒÔY Œ¹Å z¾‡Ê­ ÀіOœYto £S¶å-õð´`셨S»À%–qtÿµÝ›j¥ûƒ=G›¤"ÿ¦»Sß)Úݕ·ý:ŸJÖ ¼A>RóÖ!^4¸‡ôÅÝ܊XޔÕ6Ú¼}dh¨õ­¡¦+ÎX>è¬oÈm႐ҞŽ‡ÍÄ¥¦wã~Š£"oY¥„r¯F¹7)MÿŽ)µääíB)¸ðXLxÄ
@@ -1001,7 +1001,7 @@
Ï5ϤD†ð ŒÝfápxi,LL‘í” õk“’˜6}pm)Jy5åïx.•è;[ê›#Ž¦!E¼íâz´
2˜ËàGkµ‰™Ãá0Ê·U{ÌTÕ1
@@ -1008,9 +1008,9 @@
(>P·‘›¯­¢zU¡¹Ï+‚Ô
BÎÖ±¶k\›i8"Š–y
Afcu D¢Q.byIY™ H܁@H•@ +ˆ¼Ë¿½ª³!âyÏêÿ€âðÑ#Ö,% ¢™›MÐu»ë²•K?qìjŽ—¤óX ÌG2H @,Å°27,Z¢(¥ X³Ó6 ÷ÑGXe’ì8k?ׯٯ¢(j¹mA D~
-¿ô²£ó¡öq8¿ºí•ínj³Ú³’ÛÖc¸.ádQ—=;¬“ïs¤.î!vX¨ë¸‡Õ)WóbŽD&óÆ\F±¹½‹Rø r„ô×ÖÒیXq$Þf«©åƒX‰ÄžuäÎǎ³–m4M/¾I@¬`Š10#WÀßTA\TÔ™„ìYöpÑÌsØþ…–ãü4σ€å¹PˆM°¡„&ؔíEÿÝ­rÇO[=ÕÄGqï¹ÓDµD(“C ÁV‰ñs7³cÅõ±^ú8a%S;®ÙcÊwÖ$§H ÃRª?é$bæçrÛãûÌHmÀ±R\¾Gï0“ÊÑÆF%cN(4—/=ôe‹RFá¥VŠS[–/hàƝ‰_tì#Žãp`S…æ&ٺݯÜJbF<.5õÓ)ùçŒìuWÛ!õ¾ ƒä‹6ëoE†—:Àù_êÐÆ#®Ù×Îæ($þO¢=¦ØGBfgî2#¾¾ôœæ="ã§(`Õ²1Ï{ ±xĦ/ …„úŒ°
+¿ô²£ó¡öq8¿ºí•ínj³Ú³’ÛÖc¸.ádQ—=;¬“ïs¤.î!vX¨ë¸‡Õ)WóbŽD&óÆ\F±¹½‹Rø r„ô×ÖÒیXq$Þf«©åƒX‰ÄžuäÎǎ³–m4M/¾I@¬`Š10#WÀßTA\TÔ™„ìYöpÑÌsØþ…–ãü4σ€å¹PˆM°¡„&ؔíEÿÝ­rÇO[=ÕÄGqï¹ÓDµD(“C ÁV‰ñs7³cÅõ±^ú8a%S;®ÙcÊwÖ$§H ÃRª?é$bæçrÛãûÌHmÀ±R\¾Gï0“ÊÑÆF%cN(4—/=ôe‹RFá¥VŠS[–/hàƝ‰_tì#Žãp`S…æ&ٺݯÜJbF<.5õÓ)ùçŒìuWÛ!õ¾ ƒä‹6ëoE†—:Àù_êÐÆ#®Ã™×Îæ($þO¢=¦ØGBfgî2#¾¾ôœæ="ã§(`Õ²1Ï{ ±xĦ/ …„úŒ°
3k/8ÿöÿìVwŽÝ»úYÓI}­¿`ºúçø»Äç’ûk•ÑV±M¥°ß•¸¾ûÎ%»kW¼d˝žŽ–6´Ó•º[?ýÓoùÑޘ«{Ïq\úç}çŽèrãù¢ïá¿î÷½&ìÖEÅËå=õzžYèò8ù´k?Ï0ñKÑ%í՜0¸´zryás’Séë©úJ^—>(¼d±4â©_}¯-ĹyÐ-„(J0 Ëx;.ª†#,‚ŒãœÕ—’9ŸuÞ³£^¶
@@ -1039,7 +1039,7 @@
˜ùèkâü"‰XÛõ‘Ìc× ¥áijŒRAþPP0p;¡ÀfV› º‘tùwx†‡·nÜêÊâ£\ ׌~=ǺôosëBf<#Éë]¡Ÿ:½³›õíÎÒ7€|—k>मi½ÀpÊßy†V~ŸÒù§€¤ýVüŠŒõÁäùN¦p눦·;ø‰ˆb nÝ-êm±%îgæëÃò§óÏa™k¥I:’üÄÏë«Äb±¸JÚ
,”†#ÕŸëÉî0cyS6°¯ÞvÙË0Œïk»:.
h±,øÌِå¬hÕÐá¶ZÙrç9Ýd±º;–ÆDFÐè¢ÅsmÁ&"ˆÙ‚~€k“ØôãìŽ%
ÇÕ'žûŒèÏÕÒ#‚ˆBNäen
@@ -1049,7 +1049,7 @@
 `Š‡Ò\ÛáˤMŸÎ*“úMŠ¹…@ ŠôX.N–«‹@ ý×1Ÿ|óÖr«7F¸mkîp“n«BB2a_¿ä×¼ \qL±L1ñÈþx+ft¹r‚“ú¶õ&Íé HJ#¢/éXÛ>z€‘ ^ë³B·¥í€!ȋžª3}¦jèŽì՝u1Gš—N†¦’g”çÿړ·´¹a8Ïí< <Ƀ@öBÃù¶Xü4ÏOÌJô&ožBfp£rŠª~šËøß7Êv"× $…_CL˜ υ<L "«5Äm²ÿG¬XA EÀE‹r§E°D – ô\›ÄÝô†Í¹E+?>ØÅ7kwUNðBQ¥ê•®Á”€ ȺÝuَbÚ
iÆ]·þ–¯››-‹[W¶3â‚vñ¦vÉ G_“æ-$ÛåBÄèp[¥‡lúkI$¥pºÉbuçYܺ‡ÃÆ£s¹€baYÆV̸ì¼Øáý}4
@@ -1072,7 +1072,7 @@
”…òÐH禈áy[ñ¬ dÕ
-®ÞeC‹~ç§êÏYN`G ÃÜãCú§H,=cYBò™t'š#×,tBýàñ>é#‡ô‰5ôÿvðR•}3áØW;ÞÛWèؒ±¹Ž/'¬·¥î”SÖÐõj])TY¥éaשŽ÷õ‰o>ÊCÂØá‰8–MÿÎϗ(ð"@,3"S料òÖ.kdšá§Ùp8øg€*oLµ¨‹[Å>p©™~çkMÁôåýôê½ôfÓÕÀdè»í}O£¦’Ùˆä „;®¤½Ìôœ¦©ýâ¿)Þiießýº~W¿>KM 6jÓ$§ýu^‰Æýùh(ðÓÙ÷ÌÁÓõ~WéŠURiÜ%.n5Ë×>¶3:C9š +€´ø5 SÈ4;tª}Fÿ È4äc$YOROPrYŽ¥<UëÀóϤ >rÓߺÏø£”ë‚—f˜¡?ê:v+K zƒK•0"~\°#æ×,ø:%„þ#›g¯~wµ—Ìçäh¥¶Uû{—Ìç»ì=û§–œ¹ø©±â
+®ÞeC‹~ç§êÏYN`G ÃÜãCú§H,=cYBò™t'š#×,tBýàñ>é#‡ô‰5ôÿvðR•}3áØW;ÞÛWèؒ±¹Ž/'¬·¥î”SÖÐõj])TY¥éaשŽ÷õ‰o>ÊCÂØá‰8–MÿÎϗ(ð"@,3"S料òÖ.kdšá§Ùp8øg€*oLµ¨‹[Å>p©™~çkMÁôåýôê½ôfÓÕÀdè»í}O£¦’Ùˆä „;®¤½Ìôœ¦©Ã½â¿)Þiießýº~W¿>KM 6jÓ$§ýu^‰Æýùh(ðÓÙ÷ÌÁÓõ~WéŠURiÜ%.n5Ë×>¶3:C9š +€´ø5 SÈ4;tª}Fÿ È4äc$YOROPrYŽ¥<UëÀóϤ >rÓߺÏø£”ë‚—f˜¡?ê:v+K zƒK•0"~\°#æ×,ø:%„þ#›g¯~wµ—Ìçäh¥¶Uû{—Ìç»ì=û§–œ¹ø©±â
́^ïü½gï'Á¹‰Áû_¨uî?šÑxcü~ÉÇzyË[ÝüT|ú”Báháň†A¢ÈN.K²ê1ÀzµïÜ¡Kݍ®)ǚGþ*Å;^¶x/{‹g€„åÃ0͙ԙ™S.ŠŠIÍïÝC
@@ -1082,7 +1082,7 @@
Tüò`0U=Œ±¾yU± pŒ³j‹»ë®X‚q®ýÇ=‘y;Ÿ»äÂòW9è³eÙ"¢Àr‘UXø&“óó¿\›@vþœ¥•ô´B
€:àªB|wM½ÉŽá¨mОTq×ü…œ¬­(†#ˆÓۅ7¥´’÷’y ì8?Ñ!Q„©¥ZÚq*ÐsšÖ¾ŸœÑóAêºš”5Ù3c¶¹f¤ÅRÄÏ)úڜ©ûÙ møʸzkñ+•Všfñ>Û´e/¼|–¹ìNµÑs´Ûv,u^<'̗^\jÐ ±LÐn×.µ
°ÈZ22(XºÃö÷ìòj¹B¡Èi«*ì$W
@@ -1098,7 +1098,7 @@
²çÖê>Ð4fA֒ùFâó9ÉÍUcļRºKrqËÀrIJÏÇE¾3™vSŒ6›@—41wä@x¸T0™·°S&šÌ‹@¤‚:àªBüpxHLJnY>¸åÄ}—‹Åb,C»ß·È…/ÿõš|6zSîX~ÑÀI£`Î+û¥³cÀlôK
6…@ r°ÈZ’z‚*`£¸ælÕµû‚ 0AoûîAê%Û¢éˆ(œ0wV{œtæÒµ.nÈF( zm@ DY}pà yBÃ;䒼/$Ùù+¨X% ¸R‘ Á„¼^9¿•õhú6X­pÛña ö˜M)suïØÌ¿·–.&5?ý™ÓdÀúßeHÀ0¬ù¿šKϟ©Û
@@ -1117,7 +1117,7 @@
ûÌ%%dUºò{[²‹0_Ùêv÷´8¯ºiŠÊ_ r¾ï!ˆUÅbŽK¡10ÄJå^lRø±À¿EH¡¶£EÔWâJî 7Í»tþ‚ž´ 8Íñ Ë\c¿ðhŸ ¤ {n*“úþ0Ö9pqòÎäбg³%u¯ö}¦ßùGT·›R¾‹RnAý)Îým äQ…µ¶|ÙÜûÕ}?Ô}š Œjg<‚d|úø{dz3ËUvÕ:ÞôeܖÑsšV½<:×/õ²To›ùð€;eà!2fÐ?øzZú¨—ìX8
mfÚ8ÈzRtdÞûðÚÔùhkޛš³’J†O•‡ãNøƒåˆQØæîú۟ïS½ÿHöDøà‘&lmUÕÏ1ò)ƒ÷W8¨ÃÊàGI‡Xm,‰Õ¯¬J¹iÎùAŸ¶A¥~Œ‚)†”J
-Üõ¦…–m©_|g¸eÄêó±+ä3—"!»:²ž$³^u}Ûÿ\u½ª..ÿÁg1ï hìÈLj¹ã½ì]jˆÕ ꀫ“¤™>õUF© uO©½Ÿ¸è1;f®ù‚§]j™\¶NÊDÈZ½ª«ÛÛâ1íTõNãÐpڊXöÏíŠ$7k_;ÂWº˜’¿*· ÓÌù{s²þ}¶ý/ýŸÛ5Ajû°Ûö
+Üõ¦…–m©_|g¸eÄêó±+ä3—"!»:²ž$³^u}Ûÿ\u½ª..ÿÁg1ï hìÈLj¹ã½ì]jˆÕ ꀫ“¤™>õUF© uO©½Ÿ¸è1;f®ù‚§]j™\¶NÊDÈZ½ª«ÛÛâ1íTõNãÐpڊXöÏíŠ$7k_;ÂWº˜’¿*· Ã“Ìù{s²þ}¶ý/ýŸÛ5Ajû°Ûö
€“–7,¹
àŽ—¨±7\À1NO„wìK ±Þ£|Ûo †a"£j}7(kWÖÕ$¨ÛÒØ÷7èíI6 _ðXú¡ÉBþä¾J+ ó;jeMáú£©¦f»³wô„à>C=Ù {Ù>ûŸØ읐©Þ¯ºµP:ÈjwðS(<ý²}±#Ëߘo1—‚ø°’IÕÕLáŸãðý%p”„wþÁR–“”Ž&—ËZ<QŽck„ÄRÚÐìZ‰¯Á°58¹Ycÿ‚ÕpéŸ"1 “?ª´ÒÔ.䊗G1äc'Êç3—&¡â6z×OÎ6uj:òÉKe‘ï © ×ĪE¸ác¦9“:tÍ)ñR;…”û§¼{Ȍ@@ ¥óPî‰Ð<F£èO‡'¾òҟkõEl ˆj²V¯òFxݦ¤ X¶)ÍLoØÿ|Å #øgJý8/·`2ÿ#øù¹Ÿ’äZó!ca±ª·;ù‰£¾iwÊ6W¯§û?´@ז¸e||‚§:ÄRçï̊ Åþ}¯ÿ°¼UÓ
oIÀÎÔÍР6}·•ÈªD
@@ -1127,15 +1127,15 @@
ëÎ94ãrÝáN!½lµ (†|ìäó™Ë–¡§<eVG—Éeÿ6Ôý$¯6³UW°OÞüßæR±Ê(Û8ž¸e±ã&µVo»,˜;Žœ²¼£òD¥^¾Ù÷…¡LˆåŽj;U<XP\$Íô¯28Ž“ºy—Võ„Šª§TO¨rN¥Ç[;uz÷7~æ.¸ä64{R÷vè,¾ Mÿàëx¾CñËã¥dÄ¥$˜Ïø¸ûÀ½í»‡Ró[Ró?ç r©
8éxNѾÛâ 2 8º¿}𒠀£íÇò†¿ïîQwë=3RǯâFmî–Ýá»»’Ý'LÍÕR×y¢G¥LW4ž’_éR\öÓ7#ƒö&Mâ¹^3Q¤iæRisµÔŽÏ aþÖ>Æ+l»ߘOü.#Žv·ÞqÓ·:è³îoR<s\‰çMàÃ>iusaÍ‹úbG –nšã
-È2ÍDÁwaHÞ )ÅIN|Üd8É@tYµsìˆå—œ}fý'FƟ¡œÿû UÊ0G+µ­öoCz
+È2ÍDÁwaHÞ )ÅIN|Üd8É@tYµsìˆå—œ}fý'FƟ¡œÿû UÊ0G+µ­öoCz
d/QmÑ_§¬@1œ0µTwtœ
§ií`¦]àX<ð:ǸÖÖ´ÛnpÖú,ëå-ou· XÌqÇs
K›ÓòMòÁ*øØ9Jö±+¿Ò>vÒÃg™?æº,óøÌ¥I(†ê1ÀzµïÜ¡šÝ®}÷L¢†‹î“‡aXçï:³F‘y¹3TvC@ ©Ì㸔ñBŒãþ|b± ¹—Aä£
«‰Åbâ<Bñ|¡”òÀ¥@çï:Û¶ùŸþS…ÕˆÛËíÀQ
5RvøÝVËgww¤ðѝ¿3k±Ÿosxj{F¹éë{ÃØ÷åĽÿÄäkÒÔßòª=íÇ~¾íПGí/i"7½»MÃ7'„ÃÉ«GÛ?Ê7x8¡yüM¢‘ÉYV¿çnÙ×nì:{g6u(Ý°÷?sž¾ Ïn4ŽZ[•xÏa}ʍð«ÎãGZ”
@@ -1147,12 +1147,12 @@
‡-óꖌ(HÑ%y‹Y2¸h¸¤Øéœ[ȗ%W ¨K®À<è0pÀA\”Ã%¸`’+}{ü&#[‡óQž)˳8€ÀÓ·˜Ò¯.ÍøWô” ?qóU©—ƒ’ͺ+S½2;ï2íÈ)$,m­9Ä
íö¸ÉØ{Ù»Ð)ªíÔÜFßó8É@1g¸™!YR‘A)>v…}ææ$>yóøž]…Õ‹éI³)è[±Ú(ú|Ä72ò„†wÐ%N0̪ -![.†Ý»Sò˜Äââý1â½É랐Efxžgùø²—< ÍØ^Pëê)DŔՑñ㽈û{—u}2hØ£#ɹNÒA b¢Ú_·SüJ_„¢ŠúØõ™›£—ރ$ž4¨±È”kgF*#äùíðêßËÙ`1),žŠ”^)¢3ÅZRRÄtÂGù¤%Tm¬9ëÿI'+86SPB%
„t²4™‘ðpºc2*UL}ŠÂBŸ…â:ÌA)H¤|”—J¤Bê·¿g(ðh<Ô8 IDATì Ïñ8ϳ =¥9þ.4E{ŠHѦ€N™€xâª6֜ýGH'“¦^½IJ“6õjêêú³zJ¾ëŠxj¶´ßûWâÍ'z|ÄS£î¸—Úq¤Òxº²ýÞdÞ'ž/¯õŠPbë•(­ü“[„e¢^9wùvä’Ý({NÇr®O\äfµë³!Ó>#IÎçò†¿3kØ0?S¨
-,ò#V4¿5ί´² /èëöûïÍ2ò”øÂþ#ÊÆÓ$Çƃð²ß›ªž=ÖËÞ°ŠyÄùSqÖÉ~ÕÒÆ©LÄàîúz^·º¿ ÇÃXZ²7»Í+«¦}ê§Ýþ 35wõöí¢pz@Sg÷Ê6eƒF0SJãwME±V<‹é•ƒ@ @<¸ÔÔÔ4ü9ä;wj**ÄÛ¦núËÄ|ªµŠá‹‡3.jA.Z¾„C¿=D¬Ãy Ôl¬ëÿG>sya rÙ
+,ò#V4¿5ί´² /èëöûïÍ2ò”øÂþ#ÊÆÓ$Çƃð²ß›ªž=ÖËÞ°ŠyÄùSqÖÉ~ÕÒÆ©LÄàîúz^·º¿ ÇÃXZ²7»Í+«¦}ê§Ýþ 35wõöí¢pz@Sg÷Ê6eƒF0SJãwME±V<‹é•ƒ@ @<¸ÔÔÔ4ü9ä;wj**ÄÛ¦núËÄ|ªµŠá‹‡3.jA.Z¾„C¿=D¬Ãy Ôl¬ëÿG>sya rÙ
ÔÔ¥ÕÅKŠµCºU‹r|F| I!M
@@ -1166,7 +1166,7 @@
¿Ð9³§@Ö՛Ö7¥¾ÖÝ=…NDüâ4$/Îß
z{’'‹/ØÂýÐd
@@ -1180,7 +1180,7 @@
ëàR7nû’²‰Ž“3½s¿àNÚ¼ \&ê•èfî9‹YŽäœB=ÿ<”{¢Á)dڍáIwͯQÈÉZ’¬'©'(¹Lž]µ<ÿL¦EnzS÷ŠñO¸»nPJKmú¢ù©±ùÕ¹‚çâR%Œ$æñqìˆùµ9µuÃQKøï43t2,ë|Bÿ‰%˜½úÝÕ^ŽVj[µ¿wùÇ|¾ËÞ³ÊÚ5û ò¦–jiÇ©@ÏiZû~2®\ÏAªëj²îÉ~˜³ÝÈ5„µ^ÞòV7?%øøãŽç}mÎÔýlÐ6|e\½U–£l:•V
-bµ‘ú|'k•ê›]—|¾›tx†÷Ý»‚´\¥–Êd8É"§ËZ>'³‚äð¨Ë㔆¦æjèø?Zd›zµr)€L*•m Ô/ZïݹÕ³ÊÜÔî³®?šjj¶±;{GO$'<äsG˖¡§<eºF—Éeÿ6Ôý$¯6³U—­»Z»@ –9©7jûá†á­×ì¼âi5aj½¿”ك ¦]Ý{õ-}&àÛÿ_«ûR€b†f aføJjŒ²‘(ðQ¢ÀÜôۏ؀‚T¢ëg~>
+bµ‘ú|'k•ê›]—|¾›tx†÷Ý»‚´\¥–Êd8É"§ËZ>'³‚äð¨Ë㔆¦æjèø?Zd›zµr)€L*•m Ô/ZïݹÕ³ÊÜÔî³®?šjj¶±;{GO$'<äsG˖¡§<eºF—Éeÿ6Ôý$¯6³U—­»Z»@ –9©7jûá†á­Ã—ì¼âi5aj½¿”ك ¦]Ý{õ-}&àÛÿ_«ûR€b†f aføJjŒ²‘(ðQ¢ÀÜôۏ؀‚T¢ëg~>
ÌM_W›'G]•bû­Êc2º¾ñ3aÆy¨ýÕÄt·<ÊXێúo2ÌM¿õ€Uöd7!É#}5áü†5œ¢‡àž é?öÏ°÷f$8Á…#,ÏG
p_
Q€û|áí}ë@=¥2lñ Þg=`Uü²—äí8y;âa¾:ò"¨*vçÜAoÇqòR× 1ïÒªžPQõ”ê UΩôàxkÇ NïþÆÏÜe—܆æ´þÓ¡³ø‚4ýƒ¯ãùÅ/“%dÄ¥$˜Ïø¸ûÀ½í»‡Ró[Ró?ç r©
@@ -1189,21 +1189,21 @@
òì׎l ŃÞHˆóo7;;÷>®ÞÖþî¥C:/FÜ¢j´<©èÑlk¿ÆðQÎ80¤•Œå«1ó$äÙ·š¯êkêêô¯õ/÷7(¤Ûž6ñRª¿«ÙÓÛZWWg8âj>‘t€nêú‘MU ÀQdWJ:þŠÚõf붧Ûßnù¸3^02B©³û ½¹iÛó­A…ndД}*g±Ðæ^<û¯‚5|D#<õˆ,x;œˆøo2ÁÛ\˜axŽŽN
-QŽ‡h±í¦hO)ûºÍ×\ ;ۓ»§¤^½}³ßc/t"Ò/Nò ;~q®SŸÍê)B‘Ô^ ¹zJáFs¿,íhnÚö|{P¡s4óQŽüíÙã•ÎÎÖmO7¶÷&;NZú»æ‹„+¨,lËâH[©ê­ŒŽœ
+QŽ‡h±í¦hO)ûºÍ×\ ;ۓ»§¤^½}³ßc/t"Ò/Nò ;~q®SŸÍê)B‘Ô^ ¹zJáFs¿,íhnÚö|{P¡s4óQŽüíÙã•ÎÎÖmO7¶÷&;NZú»Ã¦‹„+¨,lËâH[©ê­ŒŽœ
‹ÅX` 
«Éèã8.Ž°3,QMÈ«å9môCÇÌ=oGjŸÔÙNèZ5–XŒãî­}xï¨ó±{`bT¿n;{Î)X1 K‹…’Qoþ‚#ï˜:ŽNDøÚ'uö“Í{ŸnÅbBþŸþÜ©ïtND@õ붡sN2½¢dm1™\.E¢RÕ¯Zú]ê‰JÑS¨Eh¥ÔôÀûêÇ;Çû'gM¢E;¥
ê™fǙ~í£8x™LÇ'¦øÚ­;¬Çî¶mcQÇ å<¨Œs0íÇ~¾MñÌYær|6½·…Ô_ÒrLÚäµÀ;êÇ{ÙYŽ^›Ýæ\[û¸(Ÿc|–×­Ã_…gx™¢V÷’ÙñžE˜4—}¾DÝæR©ï²]r6p"-šmö3ß8oØ/]›€u
£¤¿±oÌ ÷ցz
wËéQtº‘@ JÅ#
DSÔINý{ïy‰¹§­©Up’¶ŽiJ]ÇÅìñÑ&“^]#¸¬]üÖ*&6m9*8™øû‹Ê9FRð¨»xΰ^}ñ½6Óþmq§´‘׶Õl4p̘ßVüÍX·7{'GÿÔfhkìó²ZU÷Ÿ¯
«”ƒ9w]ýwL sW 'y‘êšöiw[½—ò„«E̙…À…zÊÒօX%,f$½älú ïø2ÉsG(xÓ/Ôy&/ZZl‹ó´@}xiáh·òC_®d!_çvR60>ŠÌô9@³ˆUÎB8ÉÍ·Ž¹©Ì£ŽþL¯<$åî®vßÞÒÝÔò¹£ÍÝÑ­°ü%=ˆÕ€d¦pÉûƒ@<h,è[ê)Ä¢±ÐÁ*ÄîüÐ<õjÜrbˆ¾ËÅb1–¡Ýï'FíÖk
-˜Úå”;–5¡]´ÝBj ýƒ“Fÿ@©‹f°cÀlô‘“¼Ï÷5‰_®9[uí¾  ¬m>H½d›ç‹û,s+`9äU½Ý»Ôª,=8aî¬ö8é"ë5 îh9mè%J¨Xþ’ƒ>hb™ƒnԈÂ^̨§ +±;—ôX`äõÊÊ
-*ëÑ<8˜ÔÇF{ùVã³u '¹ÞÑ÷´âÞyñB+ìQ·ã¹¥k˅]5»¨_}¥§É
+˜Úå”;–5¡]´ÝBj ýƒ“Fÿ@©‹f°cÀlô‘“¼Ï÷5‰_®9[uí¾  ¬m>H½d›ç‹û,s+`9äU½Ý»Ôª,=8aî¬ö8é"ë5 îh9mè%J¨Xþ’ƒ>hb™ƒnԈÂ^̨§ +±;—ôX`äõÊÊ
+*ëÑ<8˜ÔÇF{ùVã³u '¹ÞÑ÷´âÞyñB+ìQ·ã¹¥k˅]5»¨_}¥Â§É
@@ -1218,13 +1218,13 @@
®Þe$žö%¾‰©t>Ñïž7ƒlû§çº3¬vïèÈ M%â$R™°øÈ¢Øe÷ÈU.æò÷g”È—¶]
-‰K¥X´€¥ãä<¨|:çKGý%[Xáþ²š»sî 7}Ÿ Èë)™J„ÿÏÞùÇ6q¤ÿÙ*©¼T^D7¢U6jNØT›rjœR§œ» /1Ô˜rjœöÕaéÄ¡ºÆ驍ӪÄé©Ô¦Rƒ®àTN´v«öbNGã ZT®ö©TÙ¨ ¬ˆµŽ(k]"ùýÎí8»ëùæ#+ŠgggžYï33ûì<Ï@`d2Ø$·|ädnò?Øój¸Hÿžû1~‚µ½¦#W㎫vƒlF"c¥‰D±253p@A(ӛ\Ûª Õ;Añ
+‰K¥X´€¥ãä<¨|:çKGý%[Xáþ²š»sî 7}Ÿ Èë)™J„ÿÏÞùÇ6q¤ÿÙ*©¼T^D7¢U6jNØT›rjœR§œ» /1Ô˜rjœöÕaéġºÆ驍ӪÄé©Ô¦Rƒ®àTN´v«öbNGã ZT®ö©TÙ¨ ¬ˆµŽ(k]"ùýÎí8»ëùæ#+ŠgggžYï33ûì<Ï@`d2Ø$·|ädnò?Øój¸Hÿžû1~‚µ½¦#W㎫vƒlF"c¥‰D±253p@A(ӛ\Ûª Õ;Añ
ªH¬Ž¶4hÃpBÝ`¡3šïò¨)Bñf0»ªº‘€¯o‘“·ËË,õ“åžÊˆŠ:©™…¡N
@, ‰ðªíõr—Þþ¹›ÐÅÉéYµ`®WK–Eñ±¥^pH!b¾<í7m?IËv¤¾öòI¯‰þҞeÅól½¬­ªõ—¨Ý†C?~ß>iQâ¬ZL¥ÓÝi™2²ß÷ Ÿþ3ÚDzðݺö/ÀseøªÏ1ôÞ^ãÅdۑ;-´ Åʂ\K*6(¸“`9ïuRՔbƒ‚\Ëãë:®{á/ƒ-'úGozŽ6:ë§Ö?r¡-èÔõŒÞíÿ¤ñ¸©6Äp´¢¾•®4^ýytôאýe¢µ¡€Mì ø®foÇ é˜wttÔ{ÔÐ۔k¹e5rç~½çٚ\f9ෝ Žÿ÷^Ï«ÒNc^Ò
)*Œæ¦Çz•·zë¦Æh|•ªëý®|*íð{bߵζÐsﺲiï櫝÷ý‘I0­OM/9†a†‰–¤L’ã\ˆÞ0SÐ×íÝò—‰C}Ÿ†å ™…ü "üq_î|óÏbiŠîSÎý¯ÐpЫŒôÖjl3ëšÉÒWœ™’Y¤-H_f²tôeɒ~­†aXÊx_¿SÛý¹‡Ý €j*vŸ‹ÅØÿ ±_øôO«%Á@R„Žë^ø ÓÓׯ}’d®ùÍõæÌ£š·?DNÒ¶F}†bóòp7¨º#Zï•aJÂt7éê4vvÈânP¹Àà½ÒCã<¢¯ÝÜÌÝt •Àq†aç~½§/ǹõ-Ñ
:¾ÏÅ–¹6È~áÓ<!v’ãsƒ-wƒÊuGé½2<Жøk77Qˆˆi¡å»TÝ×+=W†GCš1_Æ.î?ÛYßmè<}úU¹H¶™efù؊™._(¯Ó±°k¡´+WŌ_&_!´Ÿ¤•o§/—ë°_þ²”o›b‘™oú=[ÙÁÈ$4=š½ Šª¦ˆ©©`–ÃlÙºi«“Š©t†;­/ ®ÃÊÖ¬y£¶êý79àb!Ho´µJcé r§E hŠ•e õ˜ãCGÖJ¬L”«À÷ŸôÃoôò¿ &8)w÷Ó ãyGkÞ­H†òÐìÓ¼é
@@ -1235,20 +1235,20 @@
†¹´Ô›eÏtQ}VRN¡ª ‰·o’S´ÏÍîÚrNeDDEÔ –i'…@ –>ÓÆ÷9u’ˇ¹ò¬r#-´|^/=qÿ° §7þleæ{Rå fvŒBùvKl¤3pÂ]N醮ÔbóàGhݜ´ŒAøÓô6B‚NcD´\‘ìñP_£2~•Œ•”å‹&[›þ±Š¬4ËS­” ìM¼ðrÊêòÇ"}þûÉõáTœXVeDòõTCklb‰ÃßQ—À—¾$V2R&]+Åÿ©ÞôŸk¯élª«X·Fw¤×ÔgàÔÀ‡Mö¦Ú5ë*tm¾¶¿]Uà«Uýï7Ù¶”=Œ©­òCÞíë%éóUõV çu¥ýµºŠŠ
vý:nyñ
-k(àî¸ËÖíãi&Gógã-ó˜=}®°ÓÊÊ6ÁxÿÉèv¨€¾äªzÖüÓ8§ù åxøÏWɎ-’ÞaÏÎäuÓ8ýê@èhr´âWYEsÇÏãÖjža.ó:¸wha¾M/Þgö5ŠvÇ踉ä=7ýû])YŠY7‘8p´»ûlÌzd*V!ÂÊ6þ4Wà !pÊ?êR:®®ýÈÀ†SÛç:˳Å'ø÷]Ëa ˆ•Í¬â^|t±¥@ ¯i&€¡™CÊHª’2M{]´²^/OöðìuãšgÃq60o®@„žgW$ã\³9ˆ4P†r\óã=#)8E›¿YÒijú²d™ïLJ”:§Íôk°
+k(àî¸ËÖíãi&Gógã-ó˜=}®°ÓÊÊ6ÁxÿÉèv¨€¾äªzÖüÓ8§ù åxøÏWɎ-’ÞaÏÎäuÓ8ýê@èhr´âWYEsÇÏãÖjža.ó:¸wha¾M/Þgö5ŠvÇ踉ä=7ýû])YŠY7‘8p´»ûlÌzd*V!ÂÊ6þ4Wà !pÊ?êR:®®ýÈÀ†SÛç:˳Å'ø÷]Ëa ˆ•Í¬â^|t±¥@ ¯i&€¡™CÊHª’2M{]´²^/OöðìuãšgÃq60o®@„žgW$ã\³9ˆ4P†r\óã=#)8E›¿YÒijú²d™ïLJ”:§Íôk°
þŽ8µPZØF/¤áK­§Ïê$‰à30wÃÏRk¦ËEÎeÄ蘿xá™¸s@ߢƒÿÆîÇH’T>¡z|W³å½èé¾͓ûo_s£e0)ÌL_Ž;·“ör£§ÓDJؾ÷öYΒÜ/Übl9ð·ûKêè/~óncß/#"Sðõ–÷¢ŽÞžú§)æß¾æËP4ù▿|aœÛIÛd½ç+%a¯Õ9#&6 ÅÙâðÿÔôŒ"úK ûˆ¡ûˑ{ÿ‹¥Ó›y?(”§ÌëV ÃÃ÷L!"dÖeäÏÆÑø#
û…Æ§Èð·ÎZCwÒLÏÑö<B[²‡Ž©7¾ÁÀdttœM8s7íeµ¦ß[€¾>sŽ>¯ã±˜³ž²5S³6 x¬žoé:ܨIBßûÚM­Ì“ÌE+ï͐ši̦R‰G}£n%ÀúñuuÚ·OÛ_ÖÀí:¢wE[˜K–ĽQ{Šºè!£ƒ:Uò¨s{òžg‡ Z)Ç8…n4>"+d¦_Öð`Ø1–X%¶|0xDU{–ê÷9Ôr’ ûÍZ]x§7t\#xbšÝÀ*'Hߨ©¨8½ÜMg…–a¯‹í¨·Ðfz@š‚˜Gæ[_–& °
6¥Î%†å˜ÁäX
-®9÷µùȔ†ï$ö¨¼L°L„±ð+ß¾ºØ¢ V8ijYkuÒ\ѝ”OÖâ^†/ÄÒðìç+dëeêuN'9՛þs%¦ö¦º} '¹>ë ºà]dM¾m4ÖmîLxVyƒ=pM5ÿ©îøb•Oií½Ö¾ßŠmýªz+Ð3Ø^«3ߍU>©µ^°7?Û,V~.ytªŠ„—^ÿ¿¬°úßo26l1'ýüÛ¯m©xLÏ1ÓâZ&Üly³ñ”9åcë¿rϳ•ÈSHþl85ða“¾©Ö‰I+•I§ã)ÿY!3½âüi‹ì™Ó©À ƒo8%²&Ãô7+¯Ë7v˜9ÐÍ,!Ó³õ՟,²6k‘±˜TV©}¥«ÿýÜ7Ãl*5졚OҐ0ÓšaŸÃpÄZÕ6«dÚMÁ¾díª·úÛFtµeQ‰¬±õ\ÊFIwZÁû!1ÏÎف@,†Õÿ_ÑqA)í“Ðý¦9¹ٓZ9ãÔï|q‹à¥þÿêõ{
+®9÷µùȔ†ï$ö¨¼L°L„±ð+ß¾ºØ¢ V8ijYkuÒ\ѝ”OÖâ^†/ÄÒðìç+dëeêuN'9՛þs%¦ö¦º} '¹>ë ºà]dM¾m4ÖmîLxVyƒ=pM5ÿ©îøb•Oií½Ö¾ßŠmýªz+Ð3Ø^«3ߍU>©µ^°7?Û,V~.ytªŠ„—^ÿ¿¬°úßo26l1'ýüۯm©xLÏ1ÓâZ&Üly³ñ”9åcë¿rϳ•ÈSHþl85ða“¾©Ö‰I+•I§ã)ÿY!3½âüi‹ì™Ó©À ƒo8%²&Ãô7+¯Ë7v˜9ÐÍ,!Ó³õ՟,²6k‘±˜TV©}¥«ÿýÜ7Ãl*5졚OҐ0ÓšaŸÃpÄZÕ6«dÚMÁ¾díª·úÛFtµeQ‰¬±õ\ÊFIwZÁû!1ÏÎف@,†Õÿ_ÑqA)í“Ðý¦9¹ٓZ9ãÔï|q‹à¥þÿêõ{
…C  .ãˆåÈìLDÁ°7BDµ¢ˆC7XEµØtb^gHS‹Âüé˒eRêœ6Ó úË Q–f'…ÌÄÎl&îźÁrôuÕæRáÚˆâ˜WwZ4>"ÈL¿¬AÆGĊ™éˆ•Á|¯‚M©óCH«ˆYRœ–é‹D±,˜Íø®::б ÏVa¦Ð%{:>LÛèÙ°㧬jó ÊZ
-µÑ ˆï/B9ˆE§Íç°ï/ÒíúD£Ýákɀ¦¾±ÄA5bÅ0¯73ÒbŐRç’Å•@ ÄÒ·óXŽñ#äîx¼ø€$óWàœ †X,pÊ<*îÜí'‚Šy‹&‡@ – ¹7`C,7Ø;¬ëT¯~–¢¨Å–Xº MA –5¥þÃ0læaökÿÀIÓôŠ„@ æôj@ Ë䩆@ ˆ˹N¹¨Mr×YM/D8# Ã<w¸¨h^¡Ïë°R’˜–<¬À‰ôvîì÷F ÈêiÁâ²ÝWê=¦P†o"w'`iԐå8†aI;SµÌ¼tÜO–¹©¸Já~@%7Mo"§À³ Yœý5c8AÞñäL7Ɂäs¹Àš2ó—]ÈÓ³XÁw;wëߦÀK1l5¡k²¥j§O¨3Ë änñôv·/$sx£æä!‘ÊæUÃç}؛ȝeqÈ,çE(î*­àî)U6ŒBœ…œL ˤ±ÄÉ꨹û\÷§NÕvz‡F¹KoÿÜMßDäõ‚C
+µÑ ˆï/B9ˆE§Íç°ï/ÒíúD£Ýákɀ¦¾±ÄA5bÅ0¯73ÒbŐRç’Å•@ ÄÒ·óXŽñ#äîx¼ø€$óWàœ †X,pÊ<*îÜí'‚Šy‹&‡@ – ¹7`C,7Ø;¬ëT¯~–¢¨Å–Xº MA –5¥þÃ0læaökÿÀIÓôŠ„@ æôj@ Ë䩆@ ˆ˹N¹¨Mr×YM/D8# Ã<w¸¨h^¡Ïë°R’˜–<¬À‰ôvîì÷F ÈêiÁâ²ÝWê=¦P†o"w'`iԐå8†aI;SµÌ¼tÜO–¹©¸Já~@%7Mo"§À³ Yœý5c8AÞñäL7Ɂäs¹Àš2ó—]ÈÓ³XÁw;wëߦÀK1l5¡k²¥j§O¨3Ë änñôv·/$sx£æä!‘ÊæUÃç}؛ȝeqÈ,çE(î*­àî)U6ŒBœ…œL ˤ±ÄÉ꨹û\÷§NÕvz‡F¹KoÿÜMßDäõ‚C
WïÐȕ*XOÙ?w[^6PÎÙ6³-­-òUó蒌=Œ»=®/_r^ϙ‚ÍÓE ^pH¡Ê|™qoKÿ^í'iùÁÓ©¯=…U½:}®ãÊOZiR$önÈy`_­†b¿·$»'ØÓæ¾`§¤’Ð÷¾ö?YT´„>oÌS°b*MvOiÏwæF°ï#3ß`Lx¯ ËƂ{5{ÛF]ÛI‘tÛgZEƒ‹ù*_Ébe€Ü`ñ ÇѲ+ƒL» ‘Sè-']ö— T5šÌ䢔r<-3ꃡ©e¹ŒË}ùº<™£Í?DLÁ _]a9
@@ -1278,7 +1278,7 @@
<ßTRœª¤äÕrùr^3½z5FùFÝے%0ƒÆ
ÛÖ(Ú£ã&’÷Ü´œEWJ–bÖ_Ǔ¯½'Xõº
-ÉÁÓþw¦™ 8ÚÝ}6f=2åƅ°²?Ç©zb6Â1βÇlñ þX,‡-h|D V*)ý½ø¨P†ÌÁ/ÅZ£¶­dþãNŽÖýF¬¬·1)7±[A×–ã_ÇÎý:¬'qpí$-wµ§µ¨* v$è|³¹7b`ÃvÈc0ͧ| Ã$öÑñôª)ŽÆQÄ&c™«ÐuXÊðš& íÿ'l—öºhe½^žìáÙëÆ5φãl`ND,ã\³9`0·Êq͏÷Œ¹VÍüÍ:¦¬T–ïݾ‚™ïLJ”:ç0ÓÌJà žëLQô‰ Ìr‘sù‚º§¢Afzâ‡gX瀾EÿŒÝ‘$)²Ä&ø®fË{ÑÓ}=š')öß¾æFË`$2+3=€½†ì„úþϬ$0¶&]´0—,YùÍômÿÈ#÷BÇÔß``2::Î&VÍp7íeµž¾=ž¹€E_ŽŸ9GŸ×ñXÌYOٚ©ºØ€â±Zx¾¥ëp£B& }ïk7µ2Ov0­¼ÍOÉ9›JM$õº•0õÚà€ÚÀ§®QëÇ×Õiß>mYc´ëˆÞma.YÓ€2Th¥3-f™éˆ•JÂFÇëây-ÔYfúTÿ\蓝w?µ/lýޖ9"šª‰>™#±FŠ(Ål¿fÚÐCXÙƁÿÆÕ«ó2Óç,ðÿ'»ø¨'t,¹ðˆùV¯8¬‰þÛ¼bÍôy<¢ª=Kõûj9Ʉýf­.¼Ó:žív€XŽXåé5åŸ!¸›Î
+ÉÁÓþw¦™ 8ÚÝ}6f=2åƅ°²?Ç©zb6Â1βÇlñ þX,‡-h|D V*)ý½ø¨P†ÌÁ/ÅZ£¶­dþãNŽÖýF¬¬·1)7±[A×–ã_ÇÎý:¬'qpí$-wµ§µ¨* v$è|³¹7b`ÃvÈc0ͧ| Ã$öÑñôª)ŽÆQÄ&c™«ÐuXÊðš& íÿ'l—öºhe½^žìáÙëÆ5φãl`ND,ã\³9`0·Êq͏÷Œ¹VÍüÍ:¦¬T–ïݾ‚™ïLJ”:ç0ÓÌJà žëLQô‰ Ìr‘sù‚º§¢Afzâ‡gX瀾EÿŒÝ‘$)²Ä&ø®fË{ÑÓ}=š')öß¾æFË`$2+3=€½†ì„úþϬ$0¶&]´0—,YùÍômÿÈ#÷BÇÔß``2::Î&VÍp7íeµž¾=ž¹€E_ŽŸ9GŸ×ñXÌYOٚ©ºØ€â±Zx¾¥ëp£B& }ïk7µ2Ov0­¼ÍOÉ9›JM$õº•0õÚà€ÚÀ§®QëÇ×Õiß>mYc´ëˆÞma.YÓ€2Th¥3-f™éˆ•JÂFÇëây-ÔYfúTÿ\蓝w?µ/lýޖ9"šª‰>™#±FŠ(Ål¿fÚÐCXÙƁÿÆÕ«ó2Óç,ðÿ'»ø¨'t,¹ðˆùV¯8¬‰þÛ¼bÍôy<¢ª=Kõûj9Ʉýf­.¼Ó:žív€XŽXåé5åŸ!¸›Î
vXüý²¡ºÍ›ë†HCà›¶¥Ež­È³@ r²Ñ§þæŒ~C¬Æ`ïckt—¦yŽñÕ
ïNZS4>Òr¦-ëqÂîðN͕«$îû¸Ô¢7\ÇÕ«!Or–ª·Lô©ôå;âW¿»’£zæƒêè@Ç.0<[…a˜Bc”ìéø°HË#6`ïç>1ç´ùöýs¼òàD£Ýák›Û2—s¨)Y řÐݾ¤XȘÒéUYË
@@ -1290,11 +1290,11 @@
/(ŠÇv1·äõ͆‰\gü”²ç»˜oÓ¶¥îØà›Š-ï…gž®ýñžwÁóªF"sSo¡8Úö†¥÷¼?|+*‘Ê”Ïiێ:tÕxJ¡s³­’Ö<ßØó™S‘Š|? ú­;ÎôäxYˆ›©°Ùé&¹Âp%”ÿ~ËKœùÛ1nÑ5%³Û\ŠäÒ2ù‹ëè󺪆à½q†È¨7xXQ{’âXoâ+û½qÍoOHïHôØ©ê¦4C¡¸;ö?YÝßF’‚ZÌuf»Š«4?-æì¯íí<å‹Idõ¯;ÜoéÅӗ¯vÏ÷֏)u.I%a–uwr,ç:å¢6©\g=s®áó>ì%Ècð[ÌFÎ¥ÝÆÔ]ô/Žf'ŏÇ-‡çrß]±¼hz¥i±E@ –(ÈF@¬
-zMoÚ%…¹ìûÈŽe7Š7Ýö™VÑàb¾2æsY)V¤¦Ì†"´l–P/8¤Pe¾Ì¸·¥/{ûIZ~ðtêkß!Ÿäñšè/íûÖLk˜BÝÖVÕž6÷;%•„¾÷µÿÉ¢¢%ôù|u¤˜JóÓâà»uí_Þ+ò±à^Í^ã¶Q×vR$}™jwbìÕ‰ìYË
+zMoÚ%…¹ìûÈŽe7Š7Ýö™VÑàb¾2æsY)V¤¦Ì†"´l–P/8¤Pe¾Ì¸·¥/{ûIZ~ðtêkß!Ÿäñšè/íûÖLk˜BÝÖVÕž6÷;%•„¾÷µÿÉ¢¢%ôù|u¤˜JóÓâà»uí_Þ+ò±à^Í^ã¶Q×vR$}™jwbìÕ‰ìYË
-„iÿyÏÜj¸åˆ¥ém»bžõe^̚ÙȹÄÛ8çfzhêNÍNÒï Y†¾Ë;;¡ÈRÀ0læ #ùæ)5;I,T¹t}`9þu,5;97ëP¢_ë+iK÷k;Éð»!»29CJôk揳ž(xÓÙï-Š·ä³é¿æûu@ 搡Kaå6ùbK@ ˆâVÓó:‘¯`®óˋLÓDÒò¸]#Wª`0L‡Ïºí/¨êyôøŸï§ì|ÊÏznkßÞÙE_½M'b Î\0Ë»4X¤"ï~j_Ø0ú½-󘩚è“9˜KñsyðÞ´•UuÆ'8֏WÙ86¹g2;dTìöÄ"·¢ÓxÒ@Mà¶aN³üdçÕÇ}Ñ5e‰¯¦Ï©es¾šÜÛHó˜•2%«`\eÍ_Þ×8GãT™‚£~u…äýŸBÕe*”geŽY˜¯L©£lضFÑÞ/®!òXM_T¥yj±†À©oF][ U՞4²a“H:,Oí^€`)u~ˆ÷pæ[8@"§ˆ=zËI}cÎâ[ُ덱"ikß~¢QóK!ARÕUMQ•2Hþ_M‘S®²J*•HUS)ïïÿÓd-×܆]jE5¥Ú®w~A¨Œ™úRe ›uHU£s\h‰^kOcýæËò”ž2ª4:Ûùì%ÿBéÄV;uÙìg‹¼P@ Ä
+„iÿyÏÜj¸åˆ¥ém»bžõe^̚ÙȹÄÛ8çfzhêNÍNÒï Y†¾Ë;;¡ÈRÀ0læ #ùæ)5;I,T¹t}`9þu,5;97ëP¢_ë+iK÷k;Éð»!»29CJôk揳ž(xÓÙï-Š·ä³é¿æûu@ 搡Kaå6ùbK@ ˆâVÓó:‘¯`®óˋLÓDÒò¸]#Wª`0L‡Ïºí/¨êyôøŸï§ì|ÊÏznkßÞÙE_½M'b Î\0Ë»4X¤"ï~j_Ø0ú½-󘩚è“9˜KñsyðÞ´•UuÆ'8֏WÙ86¹g2;dTìöÄ"·¢ÓxÒ@Mà¶aN³üdçÕÇ}Ñ5e‰¯¦Ï©es¾šÜÛHó˜•2%«`\eÍ_Þ×8GãT™‚£~u…äýŸBÕe*”geŽY˜¯L©£lضFÑÞ/®!òXM_T¥yj±†À©oF][ U՞4²a“H:,Oí^€`)u~ˆ÷pæ[8@"§ˆ=zËI}cÎâ[ُ덱"ikß~¢QóK!ARÕUMQ•2Hþ_M‘S®²J*•HUS)ïïÿÓd-×܆]jE5¥Ú®w~A¨Œ™úRe ›uHU£s\h‰^kOcýæËò”ž2ª4:Ûùì%ÿBéÄV;uÙìg‹¼P@ Ä
&±Ú,Ÿðë)ý¼Ë„˜kºO ªåR¥* ™ 6É-9™›üo ¼˜†QJû’+u‡?³ª(Ã0‚T˜Ž‰ôy»FIá¥VŠS›Ôö/ò²xpw<†Ñgm
@@ -1302,8 +1302,8 @@
q­¨o¥+Wý5d™hmÐä/›æ¦Çz•·zë4ÉçS§Víº)÷þ8:ú£WyÓ¥þ]Ú
-h±•æ¯ÅB?¸PúŠÑî¹%¥Î%¼‡î<å¢vj%22úŸýy¯z-™Ðpb-‘µgik›¿Ñ7lÜF¹ÃàéóU<ۛ:j¿`W—ã”ãGYÅ>fÂBæÜòt‚mþûÈéۉI{Ÿ›úœI$^·)p mgW¸ïôò…“Æúµfó?ï.2ô‘Eº¡CCwG@<(¦"¾ró?#çR­¸Ðs|Ý^f”h~ͯi댨F³h£ø¹‰®Üaèlés¨Å@{°:ÒïيoBþb‹ä,pv²q¿Æô{Z™Ï ÐÖJӖwI‰€ovRՙúšÒþs YQ5­ˆÙ¹Pº_kšƒÙ‰@xë*@Ì +ZqÊH±SE1µÊ« IDATi@ ˆ\܋®Á*0 ›•P/ºÜ)õãò(ø?ïÃ7ÈÙ˵Œ”WÊÉr’\K Â?ëِ~“nÐôàŠaÿië1‹âµ0±Am<l7í"pr,li°„ïÆ$%rÆzUqR1qÒ°/8Æi 8-½\Á1.òB[ɳä±P¼-Ÿúßن/ä» LºVFÎ|0'j¤%Ð=ÂÚª À)[<nƒ©PÚ9΀iQ­ï³®¿ÔîSïÓßñ@8¿©)oJ¨‚^™ QS2nxÀ¾PŒ£p1UªY›­ܘ˜âÈ2î%ªH*R~n,ØX6í}çÐÊÅ*S¾Ýû´9pß&érJ7t¥^»?²@ëæªÖTÖOÍðA2¬ B5ÒpE8K–Ø5*é[^×Nfè)—a°*²Òü´—( |já|, «”"éIv‹’z3íM{ ¨——ÓŸ÷|å§?ïSËHùãb®ÍÖð4ÓG/Žåz¹6¥ éۅИR’äá
+h±•æ¯ÅB?¸PúŠÑî¹%¥Î%¼‡î<å¢vj%22úŸýy¯z-™Ðpb-‘µgik›¿Ñ7lÜF¹ÃàéóU<ۛ:j¿`W—ã”ãGYÅ>fÂBæÜòt‚mþûÈéۉI{Ÿ›úœI$^·)p mgW¸ïôò…“Æúµfó?ï.2ô‘Eº¡CCwG@<(¦"¾ró?#çR­¸Ðs|Ý^f”h~ͯi댨F³h£ø¹‰®Üaèlés¨Å@{°:ÒïيoBþb‹ä,pv²q¿Æô{Z™Ï ÐÖJӖwI‰€ovRՙúšÒþs YQ5­ˆÙ¹Pº_kšƒÙ‰@xë*@Ì +ZqÊH±SE1µÊ« IDATi@ ˆ\܋®Á*0 ›•P/ºÜ)õãò(ø?ïÃ7ÈÙ˵Œ”WÊÉr’\K Â?ëِ~“nÐôàŠaÿië1‹âµ0±Am<l7í"pr,li°„ïÆ$%rÆzUqR1qÒ°/8Æi 8-½\Á1.òB[ɳä±P¼-Ÿúßن/ä» LºVFÎ|0'j¤%Ð=ÂÚª À)[<nƒ©PÚ9΀iQ­ï³®¿ÔîSïÓßñ@8¿©)oJ¨‚^™ QS2nxÀ¾PŒ£p1UªY›­ܘ˜âÈ2î%ªH*R~n,ØX6í}çÐÊÅ*S¾Ýû´9pß&érJ7t¥^»?²@ëæªÖTÖOÍðA2¬ B5ÒpE8K–Ø5*é[^×Nfè)—a°*²Òü´—( |já|, «”"éIv‹’z3íM{ ¨——ÓŸ÷|å§?ïSËHùãb®ÍÖð4ÓG/Žåz¹6¥ éۅИR’äá
Ë·©må#nhí
kŽ¥·åœ)^qñ•Ãß×$¾òÒ³i£ø¹ùtmE7!±gù#¦Pð¶lˆê—Û£*…t­ŒÌ€H4jjv’l eK,`íÉ}.œ»=ž^÷òß{=‰}ê}‰C‹;;Y²¹ Đ٦:ée²« €$€\ƒU$>‰¯ó‘’xρ@ ˈ™kꑍ~…P
R™TS£Ö?¥ä®Õ2‚ª¤¨jJþ„œòlå§\¾ÿDS_£¿$÷?„ &8)w÷Ó ãyGkÞ­H†òÐìÓ¼é
@@ -1319,7 +1319,7 @@
&5øá„î€ t»;+w9ˆŒVð®ET47ƒôlÚXÔ¹sӄü«.¶›› š ‚—•dh^ImA ˆù&ÓR/d£¿M|X`Ÿœ"ßFñ^„å²õ2õ“j¥R©|B93 o
՛þsí5MuëÖèŽôšú¬œø°ÉÞT»f]…®Í×ö·«
ߊV>¥µÓîS[âqŽ»ã)[·wÀyÀÐvbd ”¿o:}Æ©À0 ›‰§nÚb4ºÎ_ŒNJ”Ï7öôºTÄ´Dù3õŽÏz4¢ñãL5ÔñË#õW’;¬†>Qoüƒ]¿Ž'‚:‰ˆWPE¢å„LÍ½_FAZ³Ëèþ›âkþ49gÓFs3«Ëü?!y<Ÿ}rVÎ/3%LV…„O`ÝJtþÍ<‹·ޗاo';¬û!kK»û¼oänLº^^ÿJ‹£Ý¨x£¹¸ø¹<·1ÂÊ6&jP4—œSež(ÔLÞôà!žɞÐqõLr‚aXËë-M¯4‘›x<`bÃ;¥Y¾°ÀÀ‚7*Q)@,; 1 C±n–5k°
@@ -1328,12 +1328,12 @@
…2^(ÄópÂIå°ÅòÇ|ß
-ÕÿÑTygÈ@ @  @Iê¿|žÄrð–×[[
+ÕÿÑTygÈ@ @  @Iê¿|žÄrð–×[[
-ƒa˜ç't”»ãYôx#EË@Ÿ×a¥d–G]ð°'t©¯ì÷F Èêi;Ìgo”·šPï1…2w¼°4jÈrÃ0‚¤ ‡©Zf^ϙòW)ܨä¦d™7¼úm
+ƒa˜ç't”»ãYôx#EË@Ÿ×a¥d–G]ð°'t©¯ì÷F Èêi;Ìgo”·šPï1…2w¼°4jÈrÃ0‚¤ ‡©Zf^ϙòW)ܨä¦d™7¼úm
¼ÃVº&[ªvú„:³ BîO7Ɂ9Úp^—Ã.º¦,E(qÕ^â2wâ
VùTÙ
ØOxB7–e™›tà ·‡–T]ŽBîèl&#ÄÍj•\CÿÈvd\H{=z7€@ –/¨[a$ìê¹RÅHä±Go9é¢o ÿb)¥OË|‡úR ãòEc¯Ë§¾Óæ"¦>rXN…2O•URTuò£ªÑ9.´D¯µ'yöë™gÁÏlš%Wèö[úm#oöçµÃ}‘•ë7_–Û•p·ºÇ$ý.«‚"©Mš_ËÈys"Wx0JíªQרÕ&B<Øj§.›ó•|i€4åAÀ~Ô®(ŒºBUØ!£J£³g•méj¼pZ³‰RÔèϽ­ì;Ð'žžSårjñoe  áEÞ^ˆù©î¬U@ ËB®×¬÷ç±L¥„ñu“ª.žw9?rºÏúØUrËk¢D줂
Éޘƒ¸7ÁÚ$@ ˎLE÷©Dµ\ªT…ƒ “Á&¹å#'#°ŽÐûIñ(a¥Ô¹/¹R¥?³ª(Ã0‚T˜Ž''ôy»FIá¥VŠS›Ôö/
@@ -1340,10 +1340,10 @@
°x?±På8VŠ«v¦»…
ä­&XÛk:’À±R\µËds,
ô¼kL4Ü¤qþ3’yÅÜCÝV
µ.ºŸaß³£]Ÿçæ®ìWõٓ{A–¾u43+µÁm(ãíK†öz>Ž^[ÈÍw8 {Ɔ×üÌñÁ”¸MìÚ 3/z1ØÓÒ¯{ÚÀŽÏÄ¡õŽôoEt5­ž›7mۜ:míæmM©kS(ÀèGýÁä°Br«ÕyØ&<殆Úï7<—ü!ïñ‘ÃõÄæòòÿ 臬Ë\îtÐÔG>X¸ö­bKÉÒrÊú^õZL¾Ëº±¦§3\ö™÷Šë»óc?Lÿèïð¿Ódz#âñ‡ææ®<§êwÔç.h°ÙرräûÉéð9ó¬¿~~ö灀ëóÐÜ¿®<7_œ;(§淙@x24føm¨>eš‡Ü²îµäK#ã0ÞRM^
@@ -1355,7 +1355,7 @@
-ÎÇ
¡YN˜ÚA“òÓ²ßæBûZxç¨ÍŽùoÅÙK®”S…ÊS6€}båsÖ0û^K¾4‹a“—B*õ¹1?ú–@™!GzR‰š|ÑÄæœ}Ò¡…ÛîÒE?ú*ýlÔ¤¡twåjá–ô·Ñ‚ÅïWÍʝ¨)sC©÷±ðÔR™åm*~ø%Ý®€‰YÉt9ro[x.`×äW»¸4¼ÖÁOõo@D¢é
@@ -1366,15 +1366,15 @@
V]ò{Ñ^þH$Á%7@ëÇxËï
¼kkÇÚÿ´^+pA!TBg#†]:©¥+Ù÷<úBhÝQųڵ@K²”žéЋÆÚ/èÓ~IG1‘@»¥!òÄXø˜¹´5DkG·NMù§…LAœwÙ«µ0ìE×Ò³Z0½ ØRJ¥ôaz|irZ­&¿Ü£`Åæ|[þ7Ó¦ù¿.x÷Yڂ˜H í©!ÝÓ%8£!T’rtTø½Q¹7+–‰»ìõk:ÖEŒ!„Ðrãæ¥bޕëû÷õÄ´ðÇ#ü-_
ÆèB­¢¥¼ŒGÎõîÛ#UAèÍvåžÞsïÞb#6BBèFÑ\‹…®k]~ûYoþõ
-$GÓ˹_ØçýÌ?umñ¬&7‚槺g²O&ÎFlåú¡¬‹ÎOŸv¶¸¤6\>¹ªô¯„qK)ÊÈyLP©pÑAý³Lôl f4ywѪ¡°-çÌHkŽ¦G¡å#ÆèK8µŽE¡¥Ãs鰴к尗Âêj} 3 _bõÕ%û½|ƒp±¥ [Óª4ùåM/6ç…0ýFšÈS0S®'¦û÷c˜!„JNøʔH$ÄómI²ÅÐB-ÎM¿`ðm$¦Gh½[Q° az˜ÿyÙw¸™
+$GÓ˹_ØçýÌ?umñ¬&7‚槺g²O&ÎFlåú¡¬‹ÎOŸv¶¸¤6\>¹ªô¯„qK)ÊÈyLP©pÑAý³Lôl f4ywѪ¡°-çÌHkŽ¦G¡å#ÆèK8µŽE¡¥Ãs鰴к尗Âêj} 3 _bõÕ%û½|ƒp±¥ [Óª4ùåM/6ç…0ýFšÈS0S®'¦û÷c˜!„JNøʔH$ÄómI²ÅÐB-ÎM¿`ðm$¦Gh½[Q° az˜ÿyÙw¸™
C­Š®·;˜‹,†éB¨„Ľ𴄑úÜsÓ#„’ÃôÀJÞ5¡eµ¬Ñ=l)­ŒӋÍY!&µîo]¦ÂB«cô!TZi1z˜SQ!„BhY±WYߧCÖ=šÆ¨ $ [
-*ºi¯¢¢3žXJubI$Îå¼óe·­¯…B!´ò¤bô!]¼ÍOqÌ»ÌKÙ!„ÚÒ>m¹\ÿG^cÙô˜Ù°Ûêþl0zyíöÄttvèÊ
+*ºi¯¢¢3žXJubI$ÎÃ¥¼óe·­¯…B!´ò¤bô!]¼ÍOqÌ»ÌKÙ!„ÚÒ>m¹\ÿG^cÙô˜Ù°Ûêþl0zyíöÄttvèÊ
@@ -1383,18 +1383,18 @@
nCoÿ[28ØóqÔðÚÂV¾ÃÝ30¼æàgŽ^]Æ®Í0ó¢ƒ=-ýº§=ìøLZïH5LWÓâDÕMÛ6)6okJ]³˜BF?ŠèêrŽ€QœºL³9ÒºƒúÈ£¹s^k–5à¶FZJÃGÜà·áÉИaf¨ÖìÊ,+Mß³£]Ÿçæ®ìWõٓùx-&ßeÝØÓÓ?Œ.ûL/Ì?î>Ώý0ý£¿ÃÿN“鍈Çš›»>ðœªßQŸ» ÁfcÿÅʑï'§Ãç̳þúùéSœ®ÏCsÿº>ðÜ|r
-™*(ÃÁ ¿K›mÛ &U§&w%û¿™³6í#C‰D¸0¹ùžÞS绍${•UoUp¡‰ˆz‡‘&¢gº«Ì}âÜ3c¤ÍáúTØÐ{w¹úóɑÇæ«qƦ5åý.|^_ÿM#uqŒw³¶ýü¿ɸ Êëþ0i«P@ÃÝZþ¹ó᷍5
+™*(ÃÁ ¿K›mÛ &U§&w%û¿™³6í#C‰D¸0¹ùžÞS绍${•UoUp¡‰ˆz‡‘&¢gº«Ì}âÜ3c¤ÍáúTØÐ{w¹úóɑÇæ«qƦ5åý.|^_ÿM#uqŒw³¶ýü¿ɸ Êëþ0i«P@ÃÝZþ¹ó᷍5
¬Ð ‡'­Õ¤°Õõ'ԛÒW1ž´¨b¸|Ì_¥oKÖ³¸Bô$Ñ:9ç¤rÝD—cÇ6—?9—HÉ¥ƒ›·íK$RéÉ­÷æ*o‚“uÅÃADÇ¡Žeš+cÕ[Šð²Š-Ex½&ç´ôŒ2At„¯»ujH}WÜdˆÛµ)ùŒlÞÖ4ýïµ ‚ðLÏ9(RØöè¯sÎ;HÈxGeq“%o/?!¶b6àýŒq°e¯@ÎSAî
¤fp³vŸPù!wžf5™õRDY€'–RœX–µ! ÄæŒ“Þ I2;~óV !„ZaB¸GÎg"ÆèBhÕáo‡F¦»t¶»tÑÏF§¾
D?5i(Ý]:j+EUP'
-ÄxË•øTµÒ|Dê''"ǝzŠ2ÖY‡¾‹ ©Ôl¤»Ùl¬1™v™M¤gW¬31¾ñþ”jì´äXYdx­ƒŸê ހÈQ¯jÇQqìgè}'tÞW¥ÕjµZíÄ,D>j·¾2'þpNüëúÀAõ>Ó>uJ¾™ô 8¬5FûWÉÑxª
+ÄxË•øTµÃ’|Dê''"ǝzŠ2ÖY‡¾‹ ©Ôl¤»Ùl¬1™v™M¤gW¬31¾ñþ”jì´äXYdx­ƒŸê ހÈQ¯jÇQqìgè}'tÞW¥ÕjµZíÄ,D>j·¾2'þpNüëúÀAõ>Ó>uJ¾™ô 8¬5FûWÉÑxª
-ò)y‚Úì8`“ª@î”S…ÊS¶ÔÊKɝgîH¡eá‰eé'–•üjq~A!„ЭÀ¼«È+ÙåDê1FB•Ä¢Å&PiTæ“õAw!dÒ¨éJš®¦u;ujU–Q†2ðÿŸÆ~IÞon2¡¸Îw2e˜‘×-íOé“Sy˜÷™_ñ…ƃÁ³ï¶WaþÚxZJJ9z!¥ÿôËɇ¤ì-ÊöÂ=GÍoÛÄôžw"ºÎóbðjnzfÇ]—²Å涨[^î⯠8žG5ý­ÞÔålÄ5ú݄1%(¥ØBA£€™xÞ]¥ëTJï/ÉÉ£_TÛí¹ÒñPhòÖ|MYրÛi)â¤%ÜÕA0–|wV²L# ùŒ€¾ð|å©ÔÀ;Ÿ';æxÁ)¹ö’OiA¯\RåsŸ@
+ò)y‚Úì8`“ª@î”S…ÊS¶ÔÊKɝgîH¡eá‰eé'–•üjq~A!„ЭÀ¼«È+ÙåDê1FB•Ä¢Å&PiTæ“õAw!dÒ¨éJš®¦u;ujU–Q†2ðÿŸÆ~IÞon2¡¸Îw2e˜‘×-íOé“Sy˜÷™_ñ…ƃÁ³ï¶WaþÚxZJJ9z!¥ÿôËɇ¤ì-ÊöÂ=GÍoÛÄôžw"ºÎóbðjnzfÇ]—²Å涨[^î⯠8žG5ý­ÞÔålÄ5ú݄1%(¥ØBA£€™xÞ]¥ëTJï/ÉÉ£_TÛí¹ÒñPhòÖ|MYրÛi)â¤%ÜÕA0–|wV²L# ùŒ€¾ð|å©ÔÀ;Ÿ';æxÁ)¹ö’OiA¯\RåsŸ@
- O,ëâÄ"6gMŠ´’<ؙ„BhuåŽÔcŒ!„Z&$IÒÛiKÉñ„Ù°Ó «Öv²ÏËuC–†ÁoBÌU6|fÐÚ8ފóM–ZïW!ö*Ã\žŸÜ ÎÆâÀów˜H°§µ؛2ª¤¤ÀñI» L$ÐöÔHÚ
-îC†Ñ§ê½'ƒ ľñ54¦DÙ¸¨ûˆäÔÕ]=†‰®ÿ¬Òó‡ä|Üe·?Æwu.ÌÚGRöÆ
+îC†Ñ§ê½'ƒ ľñ54¦DÙ¸¨ûˆäÔÕ]=†‰®ÿ¬Òó‡ä|Üe·?Æwu.ÌÚGRöÆ
¥ïÅ@ö,R&"·}>¢þ®S¿Ç9v6½rכz4ö:¨<q½¥ÚX¡ Îð¹ó÷!ÃPs{ø*Ç^
@@ -1405,7 +1405,7 @@
ñ]ŠBh‰òÆnV~ &öC#„Piá©~è;Ü¿ÚU@¨dºÞî`.²¦Gh][±0½b™
@vá „B!„ÖŒ‰o­û[W»
•Ì2ÅèB+† ˆŽC+S–¿Ç „BèV80ìÒI-]•éŒ±G!„Vžê׌i"$A™ç4ö*ëûtȺÇBÓôªÔ
@@ -1423,7 +1423,7 @@
ìÍäB§ÅŒD£ƒí·kõPÒsªI{Õ´=å F&îkn:“%@Lªh á©¾ÊÝuJní©=|TŒ¨ÏÌò9*)¹§›hÏ£³­;t‰a.‡½jk-=K
-Ò¸FŸª÷ž 2 úÆ×и(LŸ½þ\Ô}Ä-•aWa¢«Á?«ôü!Ù]Á]vûc|WçÂ4ž$eo¬Pú^ dÏ"åζÏGÔßuê÷8ÇΆ¢—ÂcCîzSæÑ^•g¿—Rhc…28ÃçÎ܇ CÍíá«{)ÐöÒx˱ÆÜéÀÏ•ù­?bsÆÑô¨xµAiO—#åÜ·ç–kB¡bǃâO„B’ûˆ;šgf„ZHÐlטî7 ÃNCæ”ô"ã+ážš¾Özí¶ò†‡£ÝJ’>÷n«»µ¶|›¶¡Ëßõ—óz`‹ñô[­îæ6ßN˜Zºu/ŒÕmWjï´
+Ò¸FŸª÷ž 2 úÆ×и(LŸ½þ\Ô}Ä-•aWa¢«Á?«ôü!Ù]Á]vûc|WçÂ4ž$eo¬Pú^ dÏ"åζÏGÔßuê÷8ÇΆ¢—ÂcCîzSæÑ^•g¿—Rhc…28ÃçÎ܇ CÍíá«{)ÐöÒx˱ÆÜéÀÏ•ù­?bsÆÑô¨xµAiO—#åÜ·ç–kB¡bǃâO„B’ûˆ;šgf„ZHÐlטî7 ÃNCæ”ô"ã+ážš¾Özí¶ò†‡£ÝJ’>÷n«»µ¶|›¶¡Ëßõ—óz`‹ñô[­îæ6ßN˜Zºu/ŒÕmWjï´
F­öîü
@@ -1461,7 +1461,7 @@
KêÓ¬Lt…æóÛ÷á´|”
&ƒ%ªBË.‘H8cÜ­!ØuŠÐ„}º!„PVŠD"!Ìy‚
"g&wAI‚,Ë©!"5þž©Ç=BɄ·DC¡µ
»NB!„ÐZ$Fp4=J—©Ç=B-…÷=/āeyžgc¬÷˜wµk„B·
@@ -1470,18 +1470,18 @@
B!´,::;œ]Ζ= ßá>ÖÝËÚ÷ÛclL˜gù¸¸ó¯´RòVfMÕ¶8]=u}-fǕ¨qËâjŠVpW5@W§÷‹k*izk–.Š±ÿ25Óg]ÉeÕ´±Î
¥‡®žºã-æPæ0s5EWÓt5MW&{(…?jþ¾,šJZL¤«iš¦„t¡‡ròì m·I_Më¬Þ/£*ùöæQ1o©mÓk<§:bz’ËØ@ûw:wj¥¹Áu2’Vq©tõCnú»öÀò^‡B¡[—IÀIoB¡eAUPúzŽç ΃Ð÷f]Mëwè©
cßON‡ÏYÚûÚò·…"È2ãÑ·ŽæÝz#üÿtÚ¾ÈӃ’¦iÛæÔIÔÕ^€™88¶‹‘<Ža†ab
5¥QæÙb×f˜yыÁž–~ÝÓaÑèGýA]A•L£;¨|0š=„Ö€eê:•ÓC)¥ènTY…f똉^Ò–ØC™™öP–ŽD!„²ÂIoB¡å± èJ:6ƒ88»fÜo¹ÕjF›²¬ÛÙhñOÚwQ@=fõk 5çBçÕ;Œ4 `|ȼ_NáΣ㍧&Q@Qö±S­y(×åÎÇùa¥&©Ç\}£Ó$Xv@oSf –Ï=&Zj%€J©Tm¥¨ÝÝׯ8ÔÙœÖ|>æH†ìe–›lÛ_§ÎϹô$P®Ïƒ}·k¯4æ:
Mv³«%WŸbA=”>m½í ëà^ɛ]ejÚ¶9õ©ê.{ɑ­‡2 PSš|Û€ÐCOžùkQï ‹{(‡–ÜCÙ<
@@ -1488,7 +1488,7 @@
üÔÒ²@h•”¤ë
ì¡ÌTp7ªœB%:&m[IÈ×Kš{(3äî¡D!„Z
È2sËâ®S¥B²[.ã-é]§
ê¡Ìt&Æ7¦w旻P±c2év-LÌ&—æê%]ý±Ž1ëã.ù›¨*4T
µÐ­8ßC)¬CÒ®ä‰{z ÿ¶0üÿ³÷þ1m\YÃÿ™
@@ -1500,24 +1500,24 @@
X†l2€Mš‘wíõoxÐ6ØØ#îÝ[dʇy•Ñü¯÷uµýÕZ¥Ri<6dù,Ÿ¹9KG‹–S$séOöƚ²‡”†6O۟ÇT$Àá§+š+ˌßj›ÒÄâñK|µ»”ÊÊǝAÖí?kûyW£ç÷µ$´/÷4 dMb Îø[ßh]Ôy¨^l{¢ÐÔ
ÍO=ZùHeò64%*_hÌÌJ¶ÆÚG©¬­oæ¦É+ÞäOŒËÐ IDAT|<YÛ¦AÊæ“ð˜ö1㧷Îm
œÔ¦+€^,A$Aâ®ÍôHVÐL ²(2›éà3µ‘Êf ÿ1Mͧ̈ǡei>èmÖ‚{݁“º»¤*rßbc)Ú3i)8F2âu§RÏ W³&¡&¢åõ´¼ «t"1VÀC‰,4Ó#‚ H‚y3= )É4ºpA
§ŒPÖý¾Ü§ .‹™¾ŒPÆvæßýœ ¡½{%€÷Ãët" )4Ó#‚ H‚2B{BYâš÷‚ ‚Ì38œ}=RY×T•ªˆ†k‚ªj%L*)é&Ò³R,{ ®Ç³.!"s&™R ¨<¿dÍñKÒAÓ³•Ӓ\Q¡©ãÒ»Ù腠©L5ñÐØ¿¢šMËß)„6Cõ²ÓrÑZDÛ¾»ÃXv•îgb>Ý{­‚ ‚¬:¸×
‚ ‚ +Gq6zÈk£Ï\AÖ¤õÄ 7%F£Qçúß³RÙCØþhr›Ú‹nˆɘü}úâÚîîó›¶bºAAî:%˜›ÉAø8‚ «™Ä«a«$'Ú(déܓÿ#¼FuÏÝóP"‚ ‚,…Ä&½AAÖ<«9'†0% œvé†)N‚ RéSºó„fA˜$I"‚ó¤óž(† ÷9ÑhÔz´˜D‚ ²¾Á¤7‚ r·ÑuÊÅ2Ìà)Ïq÷ZE@Äà”˜T ªÈŽ
-‘s›öhH’ 6QÚzKàV1½pâ”î,(ôU‘”!ñQøÆLUµ`í>"…M”vßÄ)ŸµAGo& ‚ hÆtԙè%íÔ@œLqÃ×)ÜòiXK\f–ñ±°*_Ž±J’ÚAPU®Œ§ÀÑI–擾üòï2˞á=öÕ¡=“üï“úkÌ+&¹¾w“¹\J"kûq»åˆh9*˜™Í¯˜­­Vã>#ÜÉßAAAV€ð)Éfo@d•³’ÓT!}¥\RÅ[¢óƒ]µF÷+­±ZÝßm_C–ú–Övc</Íï<R”T0hös;ÍcÉзFk+¢æy‡Â͗$i?ͱ¯u$>ñȶUG~nO±>;®üú)Ûƾ<ËN Ôèìñc·ü5•5Þmÿg—BϾk ž¶jê]…+VL§®z£n nÙÏ6>gôÆìš$KHé.ôSÈïmHoÂÑYùb{ƒsÌuX›Wþš ýÖ4úï¨ïåøË(9H¯¯ænß8Ÿ·Sdý!I@„¿n¶uØ?Øüß6 ›àVÒRŸî&„LžÂEK[Â)$«D½Çž|4¡›ÿMUºï ÃU2¹ 2)ÌÈu1ª¶RA­Ýgv_“ÈÖvQÎÑDgYÜx©åëÛiŠ ‚ È"q+ˆIo")#”±»— º¸ÜЂ «ñ–è|¿GW­Ölcašgd2£‚t½a5½egØ5ýÆ~<n©Æ͚= Í¢‚ûBDºù®…*ºí¤­K٠Й.'¥ŒãiEó‘!Ÿ Bç]žˆôùël¼‚È5¶øý^­ÒúqÀwxÞ`˜ÍqGSÅ8>ké«l°ÀàËFþWþL\&ê´OJeª&¯`Ö’a¸¨NAð6_fE5•{|¨'íÌe2³&ÉÒºËHÌFßø¿cÎFM¬$—üµËÜҝ™ÙYl}dAD²‡52᯷H³’­ÕæûÆ ’GÿÈ7Ê)z…þa’= Ë(x8ã¶1çtQ áÿ×j6ºö¥^§4­#¡CˆÏ£O5‡~
+‘s›öhH’ 6QÚzKàV1½pâ”î,(ôU‘”!ñQøÆLUµ`í>"…M”vßÄ)ŸµAGo& ‚ hÆtԙè%íÔ@œLqÃ×)ÜòiXK\f–ñ±°*_Ž±J’ÚAPU®Œ§ÀÑI–擾üòï2˞á=öÕ¡=“üï“úkÌ+&¹¾w“¹\J"kûq»åˆh9*˜™Í¯˜­­Vã>#ÜÉßAAAV€ð)Éfo@d•³’ÓT!}¥\RÅ[¢óƒ]µF÷+­±ZÝßm_C–ú–Övc</Íï<R”T0hös;ÍcÉзFk+¢æy‡Â͗$i?ͱ¯u$>ñȶUG~nO±>;®üú)Ûƾ<ËN Ôèìñc·ü5•5Þmÿg—BϾk ž¶jê]…+VL§®z£n nÙÏ6>gôÆìš$KHé.ôSÈïmHoÂÑYùb{ƒsÌuX›Wþš ýÖ4úï¨ïåøË(9H¯¯ænß8Ÿ·Sdý!I@„¿n¶uØ?Øüß6 ›àVÒRŸî&„LžÂEK[Â)$«D½Çž|4¡›ÿMUºï ÃU2¹ 2)ÌÈu1ª¶RA­Ýgv_“ÈÖvQÎÑDgYÜx©åëÛiŠ ‚ È"q+ˆIo")#”±»— º¸ÜЂ «ñ–è|¿GW­Ölcašgd2£‚t½a5½egØ5ýÆ~<n©Æ͚= Í¢‚ûBDºù®…*ºí¤­K٠Й.'¥ŒãiEó‘!Ÿ Bç]žˆôùël¼‚È5¶øý^­ÒúqÀwxÞ`˜ÍqGSÅ8>ké«l°ÀàËFþWþL\&ê´OJeª&¯`Ö’a¸¨NAð6_fE5•{|¨'íÌe2³&ÉÒºËHÌFßø¿cÎFM¬$—üµËÜҝ™ÙYl}dAD²‡52᯷H³’­ÕæûÆ ’GÿÈ7Ê)z…þa’= Ë(x8ã¶1çtQ áÿ×j6ºö¥^§4­#¡CˆÏ£O5‡~
eŠô&óNÓW5yåßçÑòz˽ÖAAV˜ô)žh4šüðcJARXzr ;Cùo,SNŒ¾zX¹LSNÃDþ1ß\P€È–HÎ?Zùë™Wªt¿g‰2jCÿEWBnØ®S3d)A”’ÌN­ý¯ùBòèM$A’šÌ~!©"‰ÒXaj8g
f¤ˆ­ƒox©!"D¤Ù•sä؏ÛUËf¥_fi1ÚÚw÷5èüéaàÍT1LÃT( ¾_ÅÐs^4E“(dª†¡cåîßé|Š–ÐÅ~Ó ZU£Ùmtþ•;\!5×%dgk›rHSmp|Öù®=~Lð6_fís®MaܬÑ:‡ƒ)Šg+§ž´3—›½B¦QX(9ƒ†[SÇ=á4ÙèóÈGAÉÄhúD²/€#²ÊY®äBЪÙcº‘œ¿7j_,:'Fò%U¿¯.øÝ8÷Õ|ãƒ~aFý%âáEö9,)N0Aà¤áù?Ž¶ôLޘ<Þଛ[ZMäTu­\…yì§ÉÉì¿¥Zëu¹Õè¯×ô\­¼š \ÒÍxjuöX¡kJí¾š \җxkv5å=œ#¾î¡7ö—m 6”)›Oñg}óyº^j;ã»}ûfï!y—9®-¹QÓýnwº JmWo”ÌŸÇ­ùí§9õ[óËʹŽzÙß:@ý–E
÷õ'åˆL‡ù9¸«¾ö†ö%€0ž…Æ4
SÅPsæ¤ýmHN_°á¡ýÉ5‹é`èTPõÚÜK9LJ}MüpÞ>•`¡„ z&'ñç¾èª|±K…éUŠœlò×
·y†ÞLkö˜‡ôñ¤â’Ì;`S14M3š'Õ MäêøŽÐô—‰ÞÏìZ–¦}¨¿ó:VèèÔTÑt•¦óœOúe ?-?ò¢°¾Ø®x¾m,
ÆÚ~#;¨kOҟshYš$)ýk-óڒŒõ˜5“$Òñ;zÌ"ïôD$ǁ¹d ‚·kBjüošçùH‰I½ºÞ™ÿB›T•Ê9*wÕôü:Úõ‰£RÎLͽÐd¡@’ù¦ØNÂÒî
ïÛ}g¿ùêj9ÑÄ,K`ÓòûÂCŸô³r™oZ¢ŸÔ²ÛXz3M—ÓPšZÝ‘z·Ï›håÛõ@Ò3Ak½58-ÉJdtZx
@@ -1525,8 +1525,8 @@
å²æSöӜî=S¢¼ýý Û:6¯ôd/̌v^ËôÀ&ªámÒt,h‘t<§èit&‚C—Ç5å7èÛ)(J <oÊ9>³a(É°üàB yPo“lÒøξÐVãJÖ0‹üµÂ=¹ôãýÆýB)H’$ÍJíÐüûæŒ)Èbx#’>Õu:"É£Æ,~꒦#ù}ŽÊ¤*ä=쳪hZ³Û8p9’­bÌSûh"òûA%ŒÏ,ZCÕawËöˆñ׋X\^® “ b.FªZ^=ñí$Ó9?µæm çoÜNLÈÑÝì}:¨=;”îÚ\4‹rš&‘|(æ4íürDþsîm!òAA’I<Œ`Ò¤H–+%t¶úEç†FY%$Éla´{ôºÃõ5[Ūw¨3†Ò€ã»ô†þ¯üü”¸Ðo¬óÄÌ
-}—$üOŽÊwxÿ,ëör<?øõÍ/ªY~ðËè”íð·íû?.(w\vÈÞç+œõ])úŽ¾ŸsuîlärŽ:MïøL‡ ‚ A3=²|•ºˆú‚ k[ÚÇ´jµZ½CM•Smô yÓ{¾½º«±VùP™á؀eÈ¿Þ¤y·Ñ^ÿø† mƒ=âÞ½E¦|8W}‹ÇgÚ4h”ÊG÷”èG¾¶Å
+}—$üOŽÊwxÿ,ëör<?øõÍ/ªY~ðËè”íð·íû?.(w\vÈÞç+œõ])úŽ¾ŸsuîlärŽ:MïøL‡ ‚ A3=²|•ºˆú‚ k[ÚÇ´jµZ½CM•Smô yÓ{¾½º«±VùP™á؀eÈ¿Þ¤y·Ñ^ÿø† mƒ=âÞ½E¦|8W}‹ÇgÚ4h”ÊG÷”èG¾¶Å
MLKém'ꚞmÊÝÐÒbìè›Kò
@@ -1539,13 +1539,13 @@
í¦JŠyf.dJ\Ú%•´žä¦Äh4*ð\ÿ{V*»ýˆbû£YȳŽër A’!“¿OŸ»Îî>¿ikÖ_`!–"MüûŽFçר_:ºa.ݘ‚÷Ã÷¥@QYW
‰±(×i2E{@ÑuZKqm®o§)‚ ‚ kˆÄÃFÓ#ErOhñ)AÜð</äŒ~Ó¼IåO`-áéÈò)…ÜGPUªÜTUy~y%,Q>‚Ü?¬˜ë4™¢= è:-‚¥¸6ÑizY™gº{s†n‚ ÈR@3=²r؏ۗöò(‚ H–%9æÄ@â@ó‚ +LÑ®Mtš"‚ ²Ú(‰â²H
Y/qQ´¾Ñʲ0$ƕ ²<‘0 ¦ç·)Ý0—.¨)1£”àúxÀ¸OÏ0˖µAÖ7±@Ëè
šýÜNóX`2tÅ­»ã©Ñڊèe;_³On'k²„”îB?…üކô&ü•/¶78Ç\‡µyå#÷
s1™Ù:EYÉä‹Í‰ÑóqUÅÊ՚ @`
-|gƒY)bëà^jˆi¶à´KÆ~Ü®*j‘¦DÃÌQ½‚ûBDr¿kQ14ÃjÛNÚ"?äœý²±^¯ÙÇ'—“5YBZwLÃlMý.c6úÆÿs½ªÉ/ÿ>fežéîIºTÌъ ‚,…’{­‚ güâüS·î]lÇ{ы%«¿Dý̜ cŽº½úžO…í*¨b¤[¢4# ÿþê1>­•%ÙvNžÿ#ß;4¢Œæ¿ó6×ÅôAäTu­Šÿê2S2É÷qóþzUÌc©ïzy¨÷œï|…ÌóŽa¿Y×ÙÀ€S¯uIuîïûà:_6hÍðãïòÛû$ß÷“·]þz¿öbã Ç¯Þ"ó¼cØo©µ7ò@nÔt¿ÛÞ¥¶«7ž4Îy0Ð~šS÷¸G]G½ìoG@ý–E:ÝÚ?å0mŽ5"Óa~6>Ò4ç<ÒþäFóИfû`ªæÝ$ûڐã܋é`èTP5ú%Úªu"%ò³¡ 7­Gã‡Ä)Ó¯{ԯ̟,ûš*X?oªrè¶î‰F£Ö£Ö¥HHLƒ«í|õ”¨Ÿa) XW´Vˆh8ÐpòÄÉî¢íÁ|È,+‘É)y¶ç!÷{–Ö÷‚¿D*Ówž¨;ølSÌG„c¨Ûu¤k<,é_;ëx†3ëÿ9,W°æ®óöÆ\“AçoÜ6n&ß6·8ü%¢Ø±»åŒyuO4¤Ô.þúüz˜q(z#4½?ØûšQ&ñ}=ò퍉†gýç^µz¾oa-ïº;˜[Q3ݤ¨?QÑX9ѐٝ¯¾µ=p8{œxŠó5”î|5Éé|]L§1çë\d}öñ9'«?mö^ ¡â6z׏ΗˆÊ&AA$"â>’‘2By3:™ãèÊ ‘C%YëŒ_ ¦[{‘5ôüÿîu^ô2{õ2ùG€ûd@[N«ŸP«ÕjÕ6U"Aj EÊ? õ?—À_4)ŸˆF£¢<Hm×Ä,&Ü[¥®+÷ôKDKঝ¥ Ùs‡'TƬ<‰òÉGéR Â1yÛB“±¶Ýÿ¼mÝJBv#N
+|gƒY)bëà^jˆi¶à´KÆ~Ü®*j‘¦DÃÌQ½‚ûBDr¿kQ14ÃjÛNÚ"?äœý²±^¯ÙÇ'—“5YBZwLÃlMý.c6úÆÿs½ªÉ/ÿ>fežéîIºTÌъ ‚,…’{­‚ güâüS·î]lÇ{ы%«¿Dý̜ cŽº½úžO…í*¨b¤[¢4# ÿþê1>­•%ÙvNžÿ#ß;4¢Œæ¿ó6×ÅôAäTu­Šÿê2S2É÷qóþzUÌc©ïzy¨÷œï|…ÌóŽa¿Y×ÙÀ€S¯uIuîïûà:_6hÍðãïòÛû$ß÷“·]þz¿öbã Ç¯Þ"ó¼cØo©µ7ò@nÔt¿ÛÞ¥¶«7ž4Îy0Ð~šS÷¸G]G½ìoG@ý–E:ÝÚ?å0mŽ5"Óa~6>Ò4ç<ÒþäFóИfû`ªæÝ$ûڐã܋é`èTP5ú%Úªu"%ò³¡ 7­Gã‡Ä)Ó¯{ԯ̟,ûš*X?oªrè¶î‰F£Ö£Ö¥HHLƒ«í|õ”¨Ÿa) XW´Vˆh8ÐpòÄÉî¢íÁ|È,+‘É)y¶ç!÷{–Ö÷‚¿D*Ówž¨;ølSÌG„c¨Ûu¤k<,é_;ëx†3ëÿ9,W°æ®óöÆ\“AçoÜ6n&ß6·8ü%¢Ø±»åŒyuO4¤Ô.þúüz˜q(z#4½?ØûšQ&ñ}=ò퍉†gýç^µz¾oa-ïº;˜[Q3ݤ¨?QÑX9ѐٝ¯¾µ=p8{œxŠó5”î|5Éé|]L§1çë\d}öñ9'«?mö^ ¡â6z׏ΗˆÊ&AA$"â>’‘2By3:™ãèÊ ‘C%YëŒ_ ¦[{‘5ôüÿîu^ô2{õ2ùG€ûd@[N«ŸP«ÕjÕ6U"Aj EÊ? õ?—À_4)ŸˆF£¢<Hm×Ä,&Ü[¥®+÷ôKDKঝ¥ Ùs‡'TƬ<‰òÉGéR Â1yÛB“±¶Ýÿ¼mÝJBv#N
šé $õfõpœ¹Ñì8é¸pÁ`}#|öÌYÍc¦‚´ 'pÒðè|ïPoÜuÚÐ<:I˜é+žïði¾ízô×]Š':ã®Ín.*æújbÖvæ”áñŽ°c ·îi†ÿÎÓTß<>#åØ8dšŸ…«ö²]­ñ%òÏoLÆlëA°;zÏÙÕ1Çm7Ÿ¦DÎþÁ õXº_MÔlÚ ï Ŝ¯Šz¾Æ¸£ÔƐC{G'µâuû†‡[ÏÞ¸óƒ¦ÌÌÒ4ç<bôluÎcÓòíh4Û[Ù«gWL§ 9:rWÓ¹ÇøQCe}µx=5MPŠ„t=—*‚ ºÿÜÖnî‘@~é¯]8ÿe“?CDËë-wûb‘|W–ñ–¦Àûœõ3JÀùAY,‰k&½AŠgÅRB'J
@@ -1560,7 +1560,7 @@
ò-‰(øÌÜ_Î×\ã“Íɺ@BÁÐ/8{(šµûut⦳2‘‚ycÎÈÍƔ:¡¡ÝTI֟ezý":EA ™AAî"$IÒ[hÕvU=ø\ðBgຍF¹oÜú~«c‡tÇ\ܔF¹q¯yÊ{]ùÁ=F£ÑäôóOŒ¤Ê9ìÄhT|çì ™¡~¶¶yM7i¢Ñ(qÞH­àD>5¯êMTäȅ½$tK–OÒZç9/KŒF£Ïõ¿gM¤No›Ðm)ªÛ-Ü'=I
-è/Äh4zKp÷Ùb½kN¢i$šô|µ´«³Ñýš'V\ÈdI”ÀçŸ}Nm¤´B^.'e™MrY]§Ëæ|½¯«í¯Ö*•Jã±!ËgYÍå…c÷]ª+ñÖÔÔzKô—|ydÞoÎ×ã“Íɚ"¡pÌý¾êYoÍïúsËGVžç…œ±òš7)]á‹Ú
+è/Äh4zKp÷Ùb½kN¢i$šô|µ´«³Ñýš'V\ÈdI”ÀçŸ}Nm¤´B^.'e™MrY]§Ëæ|½¯«í¯Ö*•Jã±!ËgYÍå…c÷]ª+ñÖÔÔzKô—|ydÞoÎ×ã“Íɚ"¡pÌý¾êYoÍïúsËGVžç…œ±òš7)]á‹Ú
nxh?Tÿ9ä{yyV;óîcjÿ2i.jœŸAÅ’¸fa4=‚ Èj$ïg4Ç/u¼¦g+ ‚Pé̲}—þ”õ÷ MDü·²5BòÐæqØ_v毗‰¾»ÃÓ¶¼ú ²D2¿ÞQ
LÃî`sØè¾sÔ7ù‚<ðAoӋìKè‡[K´¥¥ÜãÌ·¨xÝéQ´d´¡(¡hù÷3+óêUrjØ‹wÑht¹lô æRÞ«\JAY+M‹gI\·×3,Á,I¾Ÿ[ÐdՂ’k¥DÓ#«áZ€ªRÑ0pMPUá¼½B’¾zU ÐÆ}Å¬ä ÈÝcpxVäÕ«ÌïÓÜe‚¸\áNAµN’@ÀÊ\HÊåíɛU;šSi6ÿz>²’2HÎ.>°úTZ6}`õ©Tˆ>°Ü*Í”€4+ÉJdEìoxÕÛ°‡–o”Gf"t+ÎJP"ƒY K y¿G_†Žû4Ó¯uîÉ!‚¬¾ŒPÆvV›‹}]õޓ£™¾@ÐuŠäu¾æu²í¾-Pþ} šéA$AâšU˜z™ ée» ¯Â÷W›J«MX*‘ÅîË7ƒ¬D™‘"3á%Y܂Ò,$ïG£QëQë"•BÖދ^´¼ ‚d#Åà’nYÓ%˜*aÙ!]§÷9y-ìymèK±Ñ"ÿþ$æÓ]™Ž`e®—¾¾´ìg ‚Ü?¬œ™ûÿ5@&Í? π0ÍA À\ý‚} ûBu‡0%¸>0îÓ3̲¥CEÕ :›W†Úgk1ZA$7‰y2ñ®ê
@@ -1574,22 +1574,22 @@
Û5U4A­²ö’µJ×V¢.òݼ¨`wlËa·Dpk–djûNÚq b¼£'ÇYC‰ @ëªùó ÛGÉ)Öú)¤Þ˜K@‚¢:…À‡VÅÞ9cî&m4¥JDúÀ%ßÖ°QÝÝÓK—ÆkI±UIæèÜ«°~8o‘AÒIù íßÓâ›t?³ø5]DÎðˆÊ9.k;éþñ§Ð¥!‡zÖû¼ªr_T›í¥ŠâeF.8“?Šœõ .ý¹/É6úS¿(Ä[¢óý]µZ³…iž‘ÉŒ
„ünõ/µI‰YºêzL]gϾÂ@½Æ5¥v_ M.éK¼5»šæ«½<ÔvÆwûöÍÞCò.s¼;§^ëºÎº¿ŸœüÞ­¾îÒþڙ¨oï“ÜßOþèiñ¼¿_ûvÐáñß¾}³÷y¥6VÜ¨é~·;]OJmWo”ÌŸÇÍdí§9õ[ó ºŽzÙß:@ý–E
-3{a3‘Ãé›Û˛×|9n³ÝA»@BÄmô®šäòU뾁)ヱ-‘Jñn—‹w#‚ HvX©uÉ) ùëk/\AŠ†›ǁ†§iF
+3{a3‘Ãé›Û˛×|9n³ÝA»@BÄmô®šäòU뾁)ヱ-‘Jñn—‹w#‚ HvX©uÉ) ùëk/\AŠ†›ǁ†§iF
LƒÇ-4ðÎcƞoµâõþB‚HΕ”>Ù
^»ð‡œMþ='–!m<òP@¯ÅûUAdµ‘¸k}`%#¥Y1±y>´iŸÒ(®ÔèMý—û•WÆI¼³Í¬Q©”•*C£Í‰T(®úÁÓô¢Vùp¥ê)Cçp YZÊ&L{”Wr_Øk5*e¥Ê𲍛{«˜ûÂeÔë*++••*ͯÎ/¸âôÉ}vٶŎÒj³
U*Dβ«ÛYÔ_맜n;%„g"I’$Aš•Á œŸ×àÀyLzƒ¤¤†%„FºÈRÂp‘Ϫ– ‘ë<bŒE’­Ýgv_Ký?ʸZÑ2¬†VJªv›¼× —V' .©% Ýƚ¶±Ü'C_x¹O†´
šÝÆқiºœ†4#²7"é·Ï‡Ë·ëçvIz&h«×iªµÚgtÖSã©-3‘0ߐ´ ü3ñÕWÄm
-âŒOx4Vþ ÆgâÍ«ËSãýÅÿ±›ÉbI+Ý0‹\hCýV‹4Ñå»Án§|{·f.ó¯ÿ+´îªT*•J¥r|‚§š­Î߸M𯛽¯Qµ¨jy ¸©?$cµÆüEüAZ^® “P”Ï{‘%`ƒpGðú€ÜL1¬¦íŒ-òCW|¯»u(m_I½W&½I6z€¤‰ÅÝ}Æ+ä-ÎÿófrÒïqcm[ÐÈe£‡[Þð,X¶$ùGxžçùH E+æ»9^ª(Z¦|K‹zv.ïÍÞúƒäøÏ~֌÷äymô€1õ…ÁT¨4/Ô¹.ø|?sáÉ÷KØä(µF&—óî¤Öomó6xÜæ=z3­ÙcÒ'µ~ÔBS¤jO'´ 9´U4IRú×Z@
+âŒOx4Vþ ÆgâÍ«ËSãýÅÿ±›ÉbI+Ý0‹\hCýV‹4Ñå»Án§|{·f.ó¯ÿ+´îªT*•J¥r|‚§š­Î߸M𯛽¯Qµ¨jy ¸Â©?$cµÆüEüAZ^® “P”Ï{‘%`ƒpGðú€ÜL1¬¦íŒ-òCW|¯»u(m_I½W&½I6z€¤‰ÅÝ}Æ+ä-ÎÿófrÒïqcm[ÐÈe£‡[Þð,X¶$ùGxžçùH E+æ»9^ª(Z¦|K‹zv.ïÍÞúƒäøÏ~֌÷äymô€1õ…ÁT¨4/Ô¹.ø|?sáÉ÷KØä(µF&—óî¤Öomó6xÜæ=z3­ÙcÒ'µ~ÔBS¤jO'´ 9´U4IRú×Z@
çRâŽÐô—‰ÞÏìZ–¦}¨¿ó:VèèÔTÑt•¦óœOúe ÏO.ÖÛÏ·B¡ÀXÛoduí‰Cús-›Ðv"¯(ûgv-Ë0;uŽ/áË­üÈ­põ9·¥Á aÈ\ÕH&“HÇKìè1ˆ¼Ó‘æV¼]RãÓ<ÏGJLêÐõÎ|ªŸ&U|ÒV*••»jzþíóߗ”öå&ÓM&
$½šPl§aiwÒ»>9¾yÅni:ƒ0EBºžÉ®èV³Ëþu¨í Éðlê¨f“,ދÞü•A$‰»ýMz#+!cÿIsÓ㖞³?úÇúÿP7ðjOâ¨çˆÑ5Åö{FƼç«K¼ûõ­‰æö£žÆ÷ܓ?ÙÈN¶4%¤¥od €éÃH÷¹‘Kž^&ì14¸$®öw]Ü£ûëK?úF:È»,¦¢õÉvv9¶EÒ*‘³
@@ -1606,7 +1606,7 @@
edV¦þφ‘¯m‰ÂÚ]]‘Yû«:·?õ=ŒÅb÷]_nªÝÕyõo.ù²ÚÄósúǸú7#ç¬Ég‘WálÕbŽÛ,ééAuÈ¿\ñ«³y·v4‹á¿2Ýqký½­Iï ÏHrE…þP÷È»ù¿Ê¥tjÚÇ4æ@Ÿ†r|Üéqf_†ÑK‘P8æ~_ÿC•5¿ëô™rÈ¿çĖ½×Z ‚ Ȫcåîé) ùëñ@³à‡¦Ú"ŽÿíÞÍÒáŸGm‡m£Ó‘ɆÀU¯qÉ\oš2ièƒæ®¿*Bß»@ùpeï÷?Æ䥈§rWs¬~Fbä5œ}ÏBßs¤É#³†Ì ”<ßqnÄüÃOø]o7ŸüáC¡ð©Eëƒ É8¿¼Ýv?‘‰ GøˆDD æ‚èï”ܑ 4×~tØh=jm<ÔHï\ô}9²†XT*ƒÜÆ
@@ -1626,7 +1626,7 @@
öfœ¨Ê÷C“"~“ÕV­ÛþüEÓ?
-}66z9ò³Ç¸ÈrÓ#böO: 7şÍÆzÄ£ü†–,ÊÏp™†E/ ybêeš`Vp¨àr|ìý‰±wYÿG½–½&Š¢E+bÁ˜×hú?“”9\
+}66z9ò³Ç¸ÃˆrÓ#böO: 7şÍÆzģü†–,ÊÏp™†E/ ybêeš`Vp¨àr|ìý‰±wYÿG½–½&Š¢E+bÁ˜×hú?“”9\
w4¶dÅgˆe
@@ -1637,7 +1637,7 @@
ªºõÖtNB÷‡&K1.<©ÛKÖÇSÒÿE¿Ìë€֒áXÎÿ_CQÁü ²Ô/° ×&†aäNOæQÁÍ;ª“˜¿a!×͉až‘U†£Ý¯Z´†áiØk Ýä2j›]ž×{*t¦ÅE=ÜÙ弧’s$ªü¹W˜ÏÜxf;-,QˆÈ´Ç2@ æ€éôÑ ¶…lVfÏ1óðÌ-?Á€ó°3x.(#<â›ç ‹• ­-ˆý+ÒF¿RWôcË3WRæO,e£7Ô5:=À $èÄ'ÏKVªjéf¿Á¤÷õ%s³âåK`és±ƒSAèŒUyËßî?48Gã?­´ÇF"†råÛßEN›f²®w˽ª²krœ€à^ÊÁ;™Ï¦M3l½VÛqéþ¤‘k›u%KêØ^éæØÀƒ(öӚû?N¦öÚáîúWmpLNríZUÙ=ò#G¦Êi÷ª'}“ãé»´ÀÝCœqCÐÊØp‰ƒÒ,È$kÚÃ=à|ïtwô›5ôWÑàgk›“DéȖ™·¾ÔL©¹oÈ¿7ý¿›¾² }.Þò3ÇÐ÷C©
Ê
@@ -1645,14 +1645,14 @@
ÂÜ»ÔÎ?Ç¡TÐýa@ñ›%¶ÑWëô›4p¡”J‹÷¿î¤(¦~ùÑÞQ{ºÑ(²n ©*Šª¢¨
-\‚Œþo›í‚ÈㄾíRjýûwW½ ,‡ïٜžºe®‘ú~h(~)ݒ£ÍOj}ƒÊöS¡ï¾êïóê&"/j+ƒÌ´yE²m1Kó½Z—ೕ-Ï¿ô>Kr–†±Hcn“éà‘ƒ†‚òW*¹¿÷É'£Ò±HRÿ )rë/Ðïœ/Ø)B”nxùm¯ßeŠ}“ߤ£‰ϰ̍ö¯aãSe†UT ~Êüâ­§/Ü kôÕ§£ð€£µõmt…íú÷##ÿŽ{~M´5 jâ9͇¾ù.Ü~gŸá̈́7{øð~ÏoUÝöºTŸÉà¿¥ }=2òuHwËoø¥8Ž€óÿ¾|V2º-ö¦q_ç€ýdhdd$tÌÚÛìôþ»ºÐÕ¡‘x¿I©ÙÖRPOã ¦'Š…t·{ëRÇÔùrñí¿é2 ŽÜ¹ô~ã){Mœ“(”Ö_­?þöñ\5G·š·ý-=¼vœ¡uœ>/ÿáˆæ×^ÐýÑΏždx“÷F™)èo¢Ýš—¼ìÀè4ç˜H¨*Š˜²íÛ°*ÓÁ¼jþ̚¥t
+\‚Œþo›í‚ÈㄾíRjýûwW½ ,‡ïٜžºe®‘ú~h(~)ݒ£ÍOj}ƒÊöS¡ï¾êïóê&"/j+ƒÌ´yE²m1Kó½Z—ೕ-Ï¿ô>Kr–†±Hcn“éà‘ƒ†‚òW*¹¿÷É'£Ò±HRÿ )rë/Ðïœ/Ø)B”nxùm¯ßeŠ}“ߤ£‰ϰ̍ö¯aãSe†UT ~Êüâ­§/Ü kôÕ§£ð€£µõmt…íú÷##ÿŽ{~M´5 jâ9͇¾ù.Ü~gŸá̈́7{øð~ÏoUÝöºTŸÉà¿¥ }=2òuHwËoø¥8Ž€óÿ¾|V2º-ö¦q_ç€ýdhdd$tÌÚÛìôþ»ºÐÕ¡‘x¿I©ÙÖRPOã ¦'Š…t·{ëRÇÔùrñí¿é2 ŽÜ¹ô~ã){Mœ“(”Ö_­?þöñ\5G·š·ý-=¼vœ¡uœ>/ÿáˆæ×^ÐýÑΏždx“÷F™)èo¢Ýš—¼ìÀè4ç˜H¨*Š˜²íÛ°*ÓÁ¼jþ̚¥t
Ð÷AB{(;¬ÏC«Ö–7½•ðF<€¯·8[S‡¸»±–_vë~;=jiîbÅqú½nJ©_GÂpþ5×.«Ó(xßÎb]§²\¡R¤œˆkp O93
ö™Òpuìz¤×¥¥H’¤ôÏê€.Ø»óýV’Àµ;ÝÐÚç5T‘8N˜µ?
0Î8þo´ç¢ÇPE’UÏŞÑ:y«ÙœÇê/^²ï5$©ße ]¬Og[>õºõU$Y¥wŸ‹ò·{…ÒÜ{.z ŠÚjô~îý²Ïw¾J•R©ZOêw»îß¹ŸÍE
-óh‚SÎ#N1EpïKš#~à_8É{÷OåÁ`#]Ã|ó‘ Ã$VÝjèzkú¾×¢­,Ÿ¢r[M÷?¡³Ã$åó^ҞøÐHCñ ëL©öŽòµª¬ŽìW‡†â×Û_P:LQùã¬ÿO¶òòíìÎÎþ“ÓVUE-ï‘óa#V*™Êio}âÆ ý>¸á1vŒ¸ 3œæcq®Sá
+óh‚SÎ#N1EpïKš#~à_8É{÷OåÁ`#]Ã|ó‘ Ã$VÝjèzkú¾×¢­,Ÿ¢r[M÷?¡³Ã$åó^ҞøÐHCñ ëL©öŽòµª¬ŽìW‡†â×Û_P:LQùã¬ÿO¶òòíìÎÎþ“ÓVUE-ï‘óa#V*™ÃŠio}âÆ ý>¸á1vŒ¸ 3œæcq®Sá
•"Рïþ¦"xuh$Þo §Ü“%ø8 *Gfׁ¾ö£ÞïyYÕe+ÝÈ(âgÍßo}·µëìÙßjòT“r¦æÒ òÿl³~RÜbˆ,ÿ(QåxûFáñKùA“
‚T+ ´€â½§E!å=͕œ¥aæÖèôg]•{ºxP[wk³ä,ŠwVŽ3@ ˆG…3ÓgÛи¿ñÔ©$œë-Öö²M©Pª(ě‹Æ³ä 君ʂ"¹f_ŒÖæKà à‘¬(xd‰ç1'õóÄýɑԋ&õZ%šË?Y° ›4ÖMúã¾áÏ"ôÇ}5©Ù¤!דä:2w#–H’7mž6°ª6 Ö^œK¸Œújƒa‡ÑùÁ œÎÕƒ)•c€âÆb ä7Ç×[ 6&kçØËI¾þé =Ÿ2MɌò[Ácå08V@Ú´¤uJ‰óŵC‘³‰ÓN-Iêk-½_&¥
KÓD÷ÇV~¸+úÇ}ªÍÇõkÒå±÷œÐ¶-mƒÄ¡Õù;'þs¿çÑdh ªU
@@ -1670,7 +1670,7 @@
*9–„ p¶zÞöëµZ;K†t<ːm äNk°/\þ|¯pÔsÑcXPÞϽ«Ê›˜q')&$çñú‹Cö$¤-t1Rnì-ÐF´#\Ý»NlÖ§ÿõÏê€çSxœmùtøúC·Ò}.ÚõXyànu=^lðȖFû¯hœÐ2©¦'åJ…
@,x¤²Kø(|KÄÛ@‹¶r†…ú||:x¤y‚G|ف󹒳4Ì
r\§Ö©›á´ëtàJ-„X.µC5džœo\öuÛ`èÇÉ©›0»–Ðò,èhÊ[YšLþހœj»\êú~V\!«ßYª—Ig$ØP·ï£ÎÚfjÔóbEKCWû 'S‰wònß-Å¢ñ÷í-ï¤Íô3¼§¥!á=-J²n“
`>zî`ùžÿþû¶ª©s] ïìää¤ó°¬'ßåÈZ¬2î?ŠyT²tJí†@ –* —ôF$£Kð<ÏOðàøo‡h^ÈùãYĖÌ@jÍ~~ä¯Í—R
@@ -1679,7 +1679,7 @@
å(Øoj;uç”ÀoeͼE:âh­±ÉóÅP šJ•¯ú8œGa<R+1xdqÁ0láç%‹{“A џŽãøFœ¤lôëõÃnwüH:M
@@ -1689,20 +1689,20 @@
:‘2¡Ï R{E.cɒmh`CeÍïñÓÖ<òr@ a1'–„ÅKz±«±ò'Ê;ÿØ yu‘L¢Kæ !¹f?/ò×æK*\êJü\RÁ#[~WLðHrÆ¥QWQ8€¥7ÔýÄöÊŒçˆ]·™äïÑá3îîkj€DÁ¶"H-½/‰üÁ#ÅJ&wûzö‡†}õ#¡T²ˆ%<2¹ôV€zŽy,‡œ³[{KäJD·cV;: –(rÔÜð5µ‡É°× !™Dı§WóRŒ1D8io]çòќ½¤»6wËV·f1p#KŠyrÊr…J!êD,ÒÇ)Ï+.Sª¾ù¨ß|ԟQ͖Ý2Q?«œ~óT“º†R§œÂ}ÍZb,*§ÀgÖý~ÐýþŒ2š›,ض(ïiõ¤Ê¥¼§Y’‹Ð°ŒŒ°ÓîàEñήì<Ÿ(X{é399‰ü+bi²pIoć+üíâ߈ՄšT«Ö©p‰@xÉT ºd¾yÖìçAþÚü<
—¶_í+Áögä&wülK哕™¯¾ÔÆ}¸6:tݦá]Íu[ž¬¬kpÐjëÈÕH…RFÛò,½/©¥÷%K¶¢Õ‘šßòËGdÒöz›œDRb–èõwîëó•†i6åÞÎþwR•Ù„“ ö`”™+ùyä$&ˆÚjç@WÄLÚÃ^ρ‚+"Ä9Ýèñ†ÛgÓ;²M, È¡;[ʦ^y¸ák2µD @*L¯æ¥"²M")pÒÞº.ì“N“Ÿ”÷Ô&æ=¥ä‚ò@,<؂9 EJǁ¦™Q†T“T%5]Žõúi]½E“^ÓÇ~c[û|b’rwƒ«6ì[€gÂb;’RxÞ\ŠpŒoí¶h*APiX×ãƯïçNg/9¿üÅÅyØÙür3¹µôµ±yÈüÊüVÓŒô £luDÅ¢h™ ^I ã˲F|¤C öfœ¨Ò–Ð0~“ÕVÍvô™×Q ‘bðJ¸#íÆòÔ£’Ì’Ô`º+ŸÅcçyµÉ÷qxø¯RW˜^²{ßvÊÙ»›MX×j{E]ÿϤ~¬¾çDÈ,ɧÃÈ%g£;rí‘ Žh0ô•RÖËúvPªÞ¸õqñ§•ÙH–#þHEÓ¯€ÁBtêž5 1ï{'lŒŒœß-ÚvÁÑîם½"‰ÛI¥J­{ÁÔ~ÌkžÊàŠa˜RU˱3~‰¾­„ãÛäù;-b™“y;á
-A†GJ^z_nbØoÄ—f#YŽüÅb¾ç¬¹fú‘‘¥Š$¤/$¡±° Y;‰°,=ÚW©mAfúÒ €D×jYƒÌô2Ó#–螌X"̟÷´dÉ2åÏ+c°5Óg9ñ2¬5:â~–,ÚvÁÑæ'µ±ŠútrÚÛ1ÿ ç©¿óçÿ=d!qH™¶<#§“Ár4þS-?Á/93ý|ž‹p…ÀyÄÙüG‡üfz´wXj³Ö…Kzƒa˜ø2 ˆ|6zN€+ÉÜ%ó%/՟õùEå.XÁÌßÒûÙH–#ÿÑ¡¼¼ÜüI¾ BEØè"ÍúJmá=DZ"‘œì!Ä#Lɖô‚6ôÙØèåÈGÌ~trÕfú1ªnº°î6h«(}­Å÷Wú`ïhèê4ÿ?µï­Aá#óO§r³ü}.Žy=—Ì+ì9æÑ.%÷@ËO–Éî<¤ïr“““,CNL­9]cÈ]nIh“ä_"š¯!i,r]§„8e6•Ö¶öt,ÏÌÙH–#¥’ù{OíR599=@͕|ã:%SªSbe#úmgﲞ>šžÕ^@ ˆ%…qK
+A†GJ^z_nbØoÄ—f#YŽüÅb¾ç¬¹fú‘‘¥Š$¤/$¡±° Y;‰°,=ÚW©mAfúÒ €D×jYƒÌô2Ó#–螌X"̟÷´dÉ2åÏ+c°5Óg9ñ2¬5:â~–,ÚvÁÑæ'µ±ŠútrÚÛ1ÿ ç©¿óçÿ=d!qH™¶<#§“Ár4þS-?Á/93ý|ž‹p…ÀyÄÙüG‡üfz´wXj³Ö…Kzƒa˜ø2 ˆ|6zN€+ÉÜ%ó%/՟õùEå.XÁÌßÒûÙH–#ÿÑ¡¼¼ÜüI¾ BEØè"ÍúJmá=DZ"‘œì!Ä#Lɖô‚6ôÙØèåÈGÌ~trÕfú1ªnº°î6h«(}­Å÷Wú`ïhèê4ÿ?µï­Aá#óO§r³ü}.Žy=—Ì+ì9æÑ.%÷@ËO–Éî<¤ïr“““,CNL­9]cÈ]nIh“ä_"š¯!i,r]§„8e6•Ö¶öt,ÏÌÙH–#¥’ù{OíR599=@͕|ã:%SªSbe#úmgﲞ>šžÕ^@ ˆ%…qK
~ùú—Ò)€¿Áb읶ì37c¾Wë|Fûq¶Nÿb‚j¼þýÈP4¨èÖ[Ó ÁÌú}ôVÛõøÈÐՐq<\cH‚¹?4YŠÑ|e€ž{¹d-³Öª.@I.Ëù?ðk(*øŸYY–úiGæx¡ªK†Lç+†aäÎ .Glì¨V4+©ùr±†á¡<í~Õ¢}œÀ0 'HÃ^[(#~9OÛ9ñïJ•ðãfHÎU¨òç^=`>sãe˜íT´°|Ä‘ò
L}ͪυìf=…篶(ç’%€J©T­'õ»]÷ïÜG)qÄç'‹õ@å9汿ÊÙ³¶—m¶ßڜmNË^Ë2šV"˔Ô?ë㼖ôÑ?_'ƒ@,12‡Ô”Þ°Ó¨Ñ饆"öZœgüôÍ%m’›Ó³Œò>§¿:Q”cüá$ßùÚÔFjíøjÔÞÔ­çGñ̦ê
Eý®¾ê‡nËûùgxϋ¾†®,ËÅÀ;ÙÓüq§nⲇ¦_%ÿªˆÇ.!þ»­ÇWk`èGamÒÃëW¯çƴˬ¶ç"É8›Ðø/Dh† þÉäØ£M%½™ï‡n(™…3ÓgÝ
â›5ì—QƒšÐTh¨*J÷´ŽXŸýÇ1¬çÎCëԍŽ»Xµ¡)%¹pó'îñJ…’|ïû8œÀÊVRï3ïÃR2…úyn¼ã_UÞÒÿŸIåںϚÙDú/ö'ýö7gT]]=ù
¹÷ó¬ÿÇGîn€#ÊVµ=tÎ ¨·TëUùw‘"CRÆ•Ú©ø#2øÞ
@@ -1724,12 +1724,12 @@
GåÚÈÕûÁg‰¢·yœŸ]%Sî^™«ŠSh_ ¶@t}%•‰ãg[²JÒ9ñeìZ)Ù6‡,ÿnËt¥çU§Ï R{E.cɒmh`CeÍïñÓÖ<ò%prd-V.jÍ@ bnQ`S›,-
·4ΰª;LNêC'9Á¸L}Âóšnûž:_oOýsóm¸¥¡™~‚ßgªñ\ìo|†Ì·²I‚]vRÉö½Õäü„äî†8Úó^Pþ 5H²åwÅ’$gœ¼ºŠÂ,½¡î'¶Wî`<GìºÍ$Ÿqw_S$
}66z9òÉÉIçá9ؓyQÈÍSlô˜+ÎLÍjotÜy2è<™S¼Æ»0“Ð&'KI–RrÃGœ²ÆN—h
aØk?ÈÐïAT¯Éz`ä´¸è•É.·k´Ñb‹ÄʈLY瑍@ sÈÂ%½Éš@{ŽyœG€gnÙø ,{-ÁsÁ<É"@ D p¸î|†FN)ÏÇ篭ÔãäbëµhŒþo›í‚Å¿7Ûk¢o»4ô2\2¼ågŽ¡ï‡RåʊôBUïÕïLªŒ¼E
@@ -1739,18 +1739,18 @@
U›z؛6Èùž0Ÿ¹+÷t4¾Ûï?h( Ö8;Ñ}
@ Ä
¹ñDê
-¥ˆËŽ—q GŸ¹Å Åz²ZH•ÃT¼Lny–䂤môþï}~ù@ ˆ%ˆVM™žÕG>òÓQöÞ(s#š8ã׫Õj%“d`<»~[{¤1²íԓëIýNk°Ï”yÔù~+IàڝnhíóªH'L‡ZÏûL1Î8þo´ç¢ÇPE’UÏŞÑ:˜©®«Ï…ìf=…;Ô_¼dßk IR¿ËºXŸ)C¨ãl˧á^·¾Š$«ôîsQþvo µC,N9ÈzîÅ×ûß5õ0µÃjO|h$ƒ¡h3@öb|Žî*Ï @[hÑV
-õ+·Õtÿ:;җ½w”¯­P¡bªŠZþž6ˆ\Œ;Œ‹­b9ÃÉx~q2(,g¡”‘#dN”™›Ë"G™ù?âÒ5Kx?ø£Zó<J–ç’I>yM&!yÍz¿Ø¿À¥…`×]´¤7ä:R»YËñL€ó8_ï:ûáYíf-¹NdÍiþxã &‰“´»ÑRg¤˜³ÒüQ*¢ôÝ£¦ÐÕ!JÉt7›ëŒvЙ/"æ@_Ϲèù
+¥ˆËŽ—q GŸ¹Å Åz²ZH•ÃT¼Lny–䂤môþï}~ù@ ˆ%ˆVM™žÕG>òÓQöÞ(s#š8ã׫Õj%“d`<»~[{¤1²íԓëIýNk°Ï”yÔù~+IàڝnhíóªH'L‡ZÏûL1Î8þo´ç¢ÇPE’UÏŞÑ:˜©®«Ï…ìf=…;Ô_¼dßk IR¿ËºXŸ)C¨ãl˧á^·¾Š$«ôîsQþvo µC,N9ÈzîÅ×ûß5õ0µÃjO|h$ƒ¡h3@öb|Žî*Ï @[hÑV
+õ+·Õtÿ:;җ½w”¯­P¡bªŠZþž6ˆ\Œ;Œ‹­b9ÃÉx~q2(,g¡”‘#dN”™›Ë"G™ù?âÒ5Kx?ø£Zó<J–ç’I>yM&!yÍz¿Ø¿À¥…`×]´¤7ä:R»YËñL€ó8_ï:ûáYíf-¹NdÍiþxã &‰“´»ÑRg¤˜Â³ÒüQ*¢ôÝ£¦ÐÕ!JÉt7›ëŒvЙ/"æ@_Ϲèù
ïÿ8ILm@ÖÕdëæAmݝ-gþâqæН¸(þy´@ ˆ%Œµ¼
-0lÒ$&ðq¾YÃ~5¨IM…†\O’ëÈܽ£"I¾gó´]XµÙÐ+|Tg<BQ2Û¦àÆb d¿Ä×[ 6ƙ LiA—“üÙ§3º~jF×B5n,ÊlY5#Xgp ¬ëåê“B{0Ôúaù¥{è¢Üé·jšÌ]JT«Ð=̺«À)÷ä¤8Æ¿ª¼¥@[˜‘ô룦ÉÐd¹€Ô,[ðó˜3æ0Ï'±Œ™(d
+0lÒ$&ðq¾YÃ~5¨IM…†\O’ëÈܽ£"I¾gó´]XµÙÐ+|Tg<BQ2Û¦àÆb d¿Ä×[ 6ƙ LiA—“üÙ§3º~jF×B5n,ÊlY5#Xgp ¬ëåê“B{0Ôúaù¥{è¢Üé·jšÌ]JT«Ð=̺«À)÷ä¤8Æ¿ª¼¥@[˜‘ô룦ÉÐd¹€Ô,[ðó˜3æ0Ï'±Œ™(d
²Ò‘ËÊa"§¯ÂB
@@ -1765,7 +1765,7 @@
-ìá(m³ÕmëJN(5?¯MíØčÅÚ^o“o¦í+Áöˆ®¯d،?ےUröÎCëzpmt身µÃÕ\7|WmÔÔ¿Ü:rÕ¦ý)V¸m¸rÚúiÝKµœ¡A'²îA&ô™Aj¯ÈŽVˆEmˆ@/Ë'Ç2+GJ!9 ¥LaMx…Œ‹#fkæ'8~ʟ¨ìùZ†¡_ž2¢g”ÙÅÁÿ:H* ‰Zvÿ#ð (î=3‘oYÛ äù %?Áò‹eÙR–}„ g¦Ï5@ìj¬ü‰òÎ?væ×%<‹Ãä¤>t’Œû€CýÜq9¶n¹Q*8å}AݲÇ|ßE)Yß+-½£vŸ¼ˆ˜,FÇxXç‹í_I€ýèç%Cò‡ˆcOpúŠ—ÉA*^¦4Éän_Ïþ°ð¯~$”ÊŠ³\ãq¦¾œì M¿',ë^R}@ ˆ¥ ŽãøFœ¤lôëõÃnwüˆ/õ‘ýƪtÎÈÌ'šÌ÷øzKá%†¸Öw!êË)Îjh{3`{3ããäÿgïüc›¸²Å¦J*‚'O*(c56?„M©³TÅYªÅnÑC¤Æ,OÄÙV_l¨Šª§ÕnPÁiµÔ½ƒp(6+ŠÝUûbžÊâT¥8¨?ì
+ìá(m³ÕmëJN(5?¯MíØčÅÚ^o“o¦í+Áöˆ®¯d،?ےUröÎCëzpmt身µÃÕ\7|WmÔÔ¿Ü:rÕ¦ý)V¸m¸rÚúiÝKµœ¡A'²îA&ô™Aj¯ÈŽVˆEmˆ@/Ë'Ç2+GJ!9 ¥LaMx…Œ‹#fkæ'8~ʟ¨ìùZ†¡_ž2¢g”ÙÅÁÿ:H* ‰Zvÿ#ð (î=3‘oYÛ äù %?Áò‹eÙR–}„ g¦Ï5@ìj¬ü‰òÎ?væ×%<‹Ãä¤>t’Œû€CýÜq9¶n¹Q*8å}AݲÇ|ßE)Yß+-½£vŸ¼ˆ˜,FÇxXç‹í_I€ýèç%Cò‡ˆcOpúŠ—ÉA*^¦4Éän_Ïþ°Ã°¯~$”ÊŠ³\ãq¦¾œì M¿',ë^R}@ ˆ¥ ŽãøFœ¤lôëõÃnwüˆ/õ‘ýƪtÎÈÌ'šÌ÷øzKá%†¸Öw!êË)Îjh{3`{3ããäÿgïüc›¸²Å¦J*‚'O*(c56?„M©³TÅYªÅnÑC¤Æ,OÄÙV_l¨Šª§ÕnPÁiµÔ½ƒp(6+ŠÝUûbžÊâT¥8¨?ì
ªL´T«DŒU"f´Dò÷;ŽÛ±CÂýȊâ;sÏ=smÏÜ{î¹çèsž8eëó§Ef,¨I>ÍãX¯³Öä¹ÆE2ë'në'ieôÄ^Ìus­©È’…òN½ºŽºŠª—¯¼çmú®ô¨Ÿñh‰Åb̝B9 –wÑ¢#=
@@ -1780,7 +1780,7 @@
òt”g"L”ð<U[ç¶%üè«É`œ×M—ùkµ>5cMæ%WUGIWJ Øè?˓ţó—©PrQù@ ˆyn>ê¦ïr±XŒehׇ%Ù耐ºby@6úJÀ)]𤺼ºO‘@Ì)RÃZXŽ 4>«Û #j éíٓ»4ÆYó?#î£fiIÖÉ,ÇÜü/>Ïhš¡:Ö¥|–¡ú³Æ#E[Ôn%âÔ3˜Nv(êÒëNk[SE~¬WÿšJº¤„µ@äýâ²÷˜Aº„$D¤t•´>/*£Ñ×8•¶ˆ•uUË,ПY@ԢᅘÐNy(ă@Z'
G¢á_:ÂFÆü8?6Y°ýìäÿå³Üe®R‹Åfy¸¢Èʉâðµ.~‡î%Ʉ?K×µT€ ȍ/oÌ8¹läü2wèðÙe;†²üeN¶Øì¾Ð£\Š|@ 1íõ²ò*Êꑛâ‘à¿ê—o?ÈE2Dɕ(¤nò-Ô5xøqŽ‹ð럓¤Ö
òϒ§¬M„æÆÓ¤åƒLII
-2²9ÛãÕB…øqNPUBRÖ<j$•Ì)DU—¦?Îóãy›D;[;™1¢BšäîÀ‰‹R.I;?ٟ)à±pgk'A"¤\`–’¸íµº¶¿úm­óÈ`Ã_lcƒȼ®bÝ[JL›J>£T!ñOªè_ŽÇughõóËó‘1`FYv ø1Æ Ü&ÿ_D
+2²9ÛãÕB…øqNPUBRÖ<j$•Ì)DU—¦?Îóãy›D;[;™1¢BšäîÀ‰‹R.I;?ٟ)à±pgk'A"¤\`–’¸íµº¶¿úm­óÈ`Ã_lcƒȼ®bÝ[JL›J>£T!ñOªè_ŽÇughõóËó‘1`FYv ø1Æ Ü&ÿ_D
I×ö™K![¸ù¨Û|4«x‘ÒşQFH]±X9QMÊ®ˆ˜vpJ<Y¦)|ãÉ ,¿¿L%’K‘_!ñ Ó%jæãAa63A´@
ƒc"s”6€‹ª|! ƒîùÄ[nx ~T ”À¡¡ ;þ¦²\Îñª4iåAäl«Ž$T–ύ3.*“t%“çç¤Ps㌦¥³ãü5Ýó$ăç\È#$O¦\Tâm56·wœ¿Ö›ÒVR±l%íú¨²›ÅOŽ
@@ -1789,7 +1789,7 @@
^i®–Õ'‹a¹Ð|ÏBúµ`Fn²åTÞÕBa‹tZ[œ–Äɍ¶Ò…Öà~@!͘–r2<­÷ RYà~±>A<¨6¨ŠŸ„@äçâ/êϽö=r›iÛ
-Óé𿢆÷äɒŒO0©@yŸQÑWQ!¥È‰À8Ùƒìö8ŽòÒ%Âð/Ñðp4ø3þ…‹0 ÏñÀñÀ €ãa€ãa¼Øÿˆ’C5 f&HE2kmÛa›y?ðÌ}üçaÞgvŸwJ$‹@<LWªkÈäÿÜ]÷‚g¶]«¤/ªè—ýª’[Î)v–s] @@Ö샻Ïõw(7©¤rE Lû/ºÍÒQKɦ—Çc¥€a؅_h—´ÿ½”vñj̱®+§7Š+Ã2ô(\Ô·âãЭ¡x± Ž"«ÓªÇ稭ž!çV*SyŽV<#á_¿úD?:¦ZñVøÚ=F¹¨d!5çf2|0d“'FÃÌí çc£ñãÔÞc¯›eïI™ÏÓ¬Bˆ)ó9-SžÙ…Í}åAÉÜIìë
+Óé𿢆÷äɒŒO0©@yŸQÑWQ!¥È‰À8كìö8ŽòÒ%Âð/Ñðp4ø3þ…‹0 ÏñÀñÀ €ãa€ãa¼Øÿˆ’C5 f&HE2kmÛa›y?ðÌ}üçaÞgvŸwJ$‹@<LWªkÈäÿÜ]÷‚g¶]«¤/ªè—ýª’[Î)v–s] @@Ö샻Ïõw(7©¤rE Lû/ºÍÒQKɦ—Çc¥€a؅_h—´ÿ½”vñj̱®+§7Š+Ã2ô(\Ô·âãЭ¡x± Ž"«ÓªÇ稭ž!çV*SyŽV<#á_¿úD?:¦ZñVøÚ=F¹¨d!5çf2|0d“'FÃÌí çc£ñãÔÞc¯›eïI™ÏÓ¬Bˆ)ó9-SžÙ…Í}åAÉÜIìë
Óeþš$G­3›>chÈó<ÏÜ1Xº,M¯ñ<e£=LSuÔ#µÔçG–2x-:õî×lûȧòx7ÌÈpÿ!$;jJ#õRÈéŠ~„ùr2z`²»‚dk…³««¿»ç]EäpÛHcÜD\xŽ¶¾cî»èÿEò—Õ‡íšz<©@¾º™‡
~ßÒ{Ú!Kæø½P¼à
@@ -1797,19 +1797,19 @@
R™î›2_ºàÉÙ
-&Žÿ“\iN."Ώ˜©=b~Ósæ$Q/Êa "¬’š?vØÛMd.Ÿzöú¿DëÖ¨­G›v¼Ô¿Gaf÷qîíŒðê=gíhíþžÁŸ#B‘Tß}ÁÖZ$Rð³¶Ã1ùï[ϞŸp4áhó띟]‰‚°á5½ëï6
+&Žÿ“\iN."Ώ˜©=b~Ósæ$Q/Êa "¬’š?vØÛMd.Ÿzöú¿DëÖ¨­G›v¼Ô¿Gaf÷qîíŒðê=gíhíþžÁŸ#B‘Tß}ÁÖZ$Rð³¶Ã1ùï[ϞŸp4áhó띟]‰‚°á5½ëï6
/X^ ÷A}çqOø—¨håFÓ{ÚÉY«a‡ãSd ähé=mW8±€mËjÔ_ y7ôE›þ¯Ž†yÔ-—ºÌ¯Q^MÉ·8ž¨ÛôՈ{QùŽù¯é¢X³ÅÆ\É4Q‘›ö?xŒ¯têÂ6÷›šè’ÝÞ7r÷v!7‹6OFË!äNæNâJ3δn™‡‚*Êw…˜ø¯ú夳­âqÅ}19ûæl{w8Îù†Gy¡¨NýºÁþ™˜¢÷*ÖÕÈúrºñ[,sÍòÑ0]:̅kAÌ(ƒi*ɱÓÌyÓg`j7™;Ì-[A¶Ü
|ÔÒÅêwé£l´x|¨Ê°¶?©¬ŠÖ ¥ e_T‰”é ª£¨\>þÞ7U‘iäª5q¬žRlÔB=alöh¯ê
²Ÿù´/*U9Ò¹…Ži^}Ÿéõô«×ÌM¿±É˜zÔv’|7Â~Û½â•mÊ«­n_P¾Dà;¤Ùfh´µñҜàÜ_…ÈqÚºS»^E²×-àP+|“÷;´u§Fù
-žð3ÆmÍ*3—7ã.Ç¥ÔÀ*Ž|p¤¨†…éò»âFݧZ×öÌɅá¼×öÌZíQç\äìP¡P!ùðœËúJ2¹J÷ÈÂÍ@fúr‰Åbæ}ÈSH‚›ºÍG+AH]±˜kšô™eæµ ³ÅS3ÖRæL»
+žð3ÆmÍ*3—7ã.Ç¥ÔÀ*Ž|p¤¨†…éò»âFݧZ×öÌɅá¼×öÌZíQç\äìP¡P!ùðœËúJ2¹J÷ÈÂÍ@fúr‰Åbæ}ÈSH‚›ºÍG+AH]±˜kšô™eæµ ³ÅS3ÖRæL»
Z¶·;倳bõ»ô‚*æ[8ð~h-%0 £ä×Ug\Z<ý©UFâX5®ØlK™Ì/ä>¨ $W©ÿ)EÿxE Ã\ƒnÍ:
I¿íõôÌKÛÍÐ9فE¯]¾Çkz6ªÙ2m‹mç†Mç;2,Ü6ÿ5ïQe9⪉’Ðq³h³%y„;™;ÌP°7£F¾r˜ðŽÉ.ϐ\”„ÞùcÒF_X>@ â!Qêu
-½ò_úU%™’ƒUÛº G½###Þú¾Ö©&»wz:N<¸×»KØ­W{Ÿ€ ÿ¾LïP+w¤ÞïFF¾óÊï8•¯LÆIïnêÑuŸ=û焧†í$ïýnäGŸÉ÷Ñ6åÁ°Ý|ðà^=†Fˆû³Ðuú·FFþ²ý‰hoVÇ%šs¯KóÊ.Ôn–Î0‡—.¿›ÿW»îÓ¼®49ÙöÌ,¢ÞpßÒäÀšc†a˜hAŠEê@t4ÂL@èl鑾žÈxî9–í©hã¡t,|ܓ]ž-9CC6eÖDÞ-ÙÒ̓H÷Z¦—M>ùQó~p3ï/@ÌU |Vª{VJŸó î§Ïy”"Rú¬”\L’µdvf,”W/Ÿ´Ø
+½ò_úU%™’ƒUÛº G½###Þú¾Ö©&»wz:N<¸×»KØ­W{Ÿ€ ÿ¾LïP+w¤ÞïFF¾óÊï8•¯LÆIïnêÑuŸ=û焧†í$ïýnäGŸÉ÷Ñ6åÁ°Ý|ðà^=†Fˆû³Ðuú·FFþ²ý‰hoVÇ%šs¯KóÊ.Ôn–Î0‡—.¿›ÿW»îÓ¼®49ÙöÌ,¢ÞpßÒäÀšc†a˜hAŠEê@t4ÂL@èl鑾žÈxî9–í©hã¡t,|ܓ]ž-9CC6eÖDÞ-ÙÒ̓H÷Z¦—M>ùQó~p3ï/@ÌU |Vª{VJŸó î§Ïy”"Rú¬”\L’µdvf,”W/Ÿ´Ø
—§™éE)~ET_üB$Óá‹uâ9n,˜^®€àXÞò¢M\‰òMkR”_™Pž ð+’اÅ08–Q'Ç–f•¢A©Ü 2ŸœÚåM²Ý^Óò¨ökö!j» :ޖW"$'a¨·šWQS[½@ÌSTT³­bþà8êp|è°þÕj9`1ì.¾q
@Ì'’ÆùY zÕ@ÕQѱ(Œƒ¹#bûÀFÔ"‘(gþØö‹oH¿r“Îíñ‰_šŒTe»dS.Æ(ûöâÌC3Y,Œ—ùÈ@Ó¥!Ã&HRï½ä«r‡¾Ê‰ú¼])%@½Ç]™Á
@@ -1831,7 +1831,7 @@
‹©ÓÒÚ8<Ê —H›v™F¾ÑËþ +^7 \0™ÙU·•j;Eƒ¼üÛ}jÚڛ]^¶d½+àzF²þMW褮€üéâ^l$þ *A%¨dޗ$Wæ€X„À¶e5ê/†.,OCà˜¾ñ³ÁÚú¼ mç†M·:2Ûü×ô£“eŠ÷ 'U8špóí÷+Ú}[Š›éKž|…[£"¥xÏÜtìèð‘>»RJ2a¿qKŸôuï#W 1«à¤ÁTkqМ¡ ÛwÇá™\x!D¦q¬
-´vÏàÏ¡Hªï¾`k•qwÝ žÙ–l=õ-}Ѧÿ«cà‡auË冃.ók…BÚbvá×Ú¾û ¾ó¸'üKT´r£é=má / †agƒMmÑ×ûCùªäC¾Çkº(Öl±1W¦gpêS˜‚T ÞT¡ãfÑæÉEBîdî$.3µF¾r°n™‡‚dð8ƒ–ls‚AÊÌÿ‘Rƒ‰sü®=L3†‘T•oÐìsÒò&­tb­é{}ÍKá(ñçŠxràGÍê@<üQyèãªïîé³FޕK.,?Nܛ¾uW+¹
+´vÏàÏ¡Hªï¾`k•qwÝ žÙ–l=õ-}Ѧÿ«cà‡auË冃.ók…BÚbvá×ÚŸû ¾ó¸'üKT´r£é=má / †agƒMmÑ×ûCùªäC¾Çkº(Öl±1W¦gpêS˜‚T ÞT¡ãfÑæÉEBîdî$.3µF¾r°n™‡‚dð8ƒ–ls‚AÊÌÿ‘Rƒ‰sü®=L3†‘T•oÐìsÒò&­tb­é{}ÍKá(ñçŠxràGÍê@<üQyèãªïîé³FޕK.,?Nܛ¾uW+¹
-Œ"ˆâß&9\N>ý‡µšCŒ÷»~ÕÒüÊû~ì¿ïý'6‘
›c˜ÉµØxäÉÝ­‡‡ ±@ü“,H´X¡ðɤÜcŒ³CÛ}EÆÝMXĒË1%2îS„³íÝá8ç兢:õëûf¢û>ÖÕÈúrºñ[,Óůf¬¡'
@@ -1847,23 +1847,23 @@
-½”·´6®xNÒØl¤Eº‘oüÙOåúÈÿ…åÑMAƒ’…#Ä#…c9ç'µJêüÔMÓ3½Ÿ˜»ëž®ý݆¹ïrÓ"j®< ˃Tó= éŽa¹É–Z7Ùî
+½”·´6®xNÒØl¤Eº‘oüÙOåúÈÿ…åÑMAƒ’…#Ä#…c9ç'µJêüÔMÓ3½Ÿ˜»ëž®ý݆¹ïrÓ"j®< ˃Tó= éŽa¹É–Z7Ùî
ŋuYváqcz«gȹ5±1b²‡9ZñŒ„ýrèMüPè˜jÅ[ák÷墒…Ôœ›ÉðÁMž´3·ƒžÆR?böºYöž”ù\ÿ{ìñļÏüH§<Ƈ™EꛛÌÖh¹ð6·V¦™CŠHªŽÊg ö9iy“Všøù°ßëk^
ÇØ@¥#f
˜[TäbÃ0‚¤tûÉV²û$»CÊk4ÕÇ$_ÿñ1I‘íÌBÔ;s^ó¹¯ÆôÇÅåÏ1Ðr"@ Ä´:šåîs='6z@ ¥ˆ­Zó)'}»"w6ÄôCT=EÕSTÿ×',ãttn<Ù¢
-fõqÊëÙ>ñªëÀ…4¦+jG¿rÑT„քõ¿–&môì ^¡ÒX/fs#ÖÙ¨¯~©Ì@ÚÀY™U¡©¢Rªª£¤+¥lô7;Ôm0LØ߶¥Oúú2¦"fœ4˜j}ºÌ]q܇Odš6zDNf.6}ÆC+:eî˜øqÞÒn \×ÏG"ÑÐO!áB!A>…S»Iº°œosj¾¯D˜O;A£ØÆï²Ýø¤ çiçÝz¥…ý~Ê÷JêU»$Ư׆ÉÅÕÎS´tÏÙä[Ï^Ÿàنèϝû–Ô±¦ý›Õ„†ìhȱ{ÇzÅ^7Ü®—¬‡­®K6J(]÷u¾eVÐúb©žå4
+fõqÊëÙ>ñªëÀ…4¦+jG¿rÑT„քõ¿–&môì ^¡ÒX/fs#ÖÙ¨¯~©Ì@ÚÀY™U¡©¢Rªª£¤+¥lô7;Ôm0LØ߶¥Oúú2¦"fœ4˜j}ºÌ]q܇Odš6zDNf.6}ÆC+:eî˜øqÞÒn \×ÏG"ÑÐO!áB!A>…S»Iº°œosjŸ¯D˜O;A£ØÆï²Ýø¤ çiçÝz¥…ý~Ê÷JêU»$Ư׆ÉÅÕÎS´tÏÙä[Ï^Ÿàنèϝû–Ô±¦ý›Õ„†ìhȱ{ÇzÅ^7Ü®—¬‡­®K6J(]÷u¾eVÐúb©žå4
-ʋâjVôDÔÞo†(ÓÓªiTÙØAsi¥\Q%WݽÓÓ{>p¡Nà;¤Ù¦WY[hÀ*Ž|p¤”Ë)@—ßí7ê>Õº¶gæ6œ÷ڞY«=*𜋜*4, $žaYŸ´øyÒ=²p³™~ö˜;–YĬ=ZŽý'–ôUÏé‚Y€ìóUéYKt¥Œ`ÝKȞŠ˜¿°·CD}9†ÐmVVÌ[óämjւÞ@´lo9v,Êg9ÄêwéU!!ÌçßïýÐ [J`FÉ5®«ÎøF¹xlúS«ŒÄ±j\±Ù*¶k$Å}PH®R9þ/RTßdEBîdî0CÁÞ´ÄJ¾Ú>r³p,s²«G¸¼5YÑ5èÖ¬£0 #–Ê,}‰­µù"í¨6Eoš“Û_ÂGzKvkˆ„mšþ§‘Èm«HûöºÁ®žBW âI38ãåaË'­iúJ-C·†ä ‹^wٍÆ}L&òäï˜ð1É–&¡6zçI}aùsØŠ@ ñ$j—‘‰(õ:…ÿŒ“°£æf |Ê©…&ÊdGÝlïð·ø¼úM
-r1©Ø¤s{Ô©G͟˜H—m²€ÉcW֓8N¨÷˜€/>§°ûlJ)E­RÙ¿°G¿í¤9€‡Œñÿ"½—lÊz’¬WÚ.õFþedæ//ÊC¶íý—lJ)IR
+ʋâjVôDÔÞo†(ÓÓªiTÙØAsi¥\Q%WݽÓÓ{>p¡Nà;¤Ù¦WY[hÀ*Ž|p¤”Ë)@—ßí7ê>Õº¶gæ6œ÷ڞY«=*𜋜*4, $žaYŸ´øyÒ=²p³™~ö˜;–YĬ=ZŽý'–ôUÏé‚Y€ìóUéYKt¥Œ`ÝKȞŠ˜¿°·CD}9†ÐmVVÌ[óämjւÞ@´lo9v,Êg9ÄêwéU!!ÌçßïýÐ [J`FÉ5®«ÎøF¹xlúS«ŒÄ±j\±Ù*¶k$Å}PH®R9þ/RTßdEBîdî0CÁ޴ÄJ¾Ú>r³p,s²«G¸¼5YÑ5èÖ¬£0 #–Ê,}‰­µù"í¨6Eoš“Û_ÂGzKvkˆ„mšþ§‘Èm«HûöºÁ®žBW âI38ãåaË'­iúJ-C·†ä ‹^wٍÆ}L&òäï˜ð1É–&¡6zçI}aùsØŠ@ ñ$j—‘‰(õ:…ÿŒ“°£æf |Ê©…&ÊdGÝlïð·ø¼úM
+r1©Ø¤s{Ô©G͟˜H—m²€ÉcW֓8N¨÷˜€/>§°ûlJ)E­RÙ¿°G¿í¤9€‡Œñÿ"½—lÊz’¬WÚ.õFþedæ//ÊC¶íý—lJ)IR
ŽzGFF¼‡u}­•ðþÀÏ;Ûj` jÄÆÌÙÀ¤&Ý;=§ÜëÝ%ìÖ«òør›|!¯¿œ°æwž¢å™TϹÏ/ý“ä1𑓮”€ìÑÑ3ý} ³¥Gúº€ˆŒCkÖؔª§ˆ‰çÓ¶g¤Æ|ÏX
@@ -1882,18 +1882,18 @@
KÛo$­âFzalÀz;ײÄ"¢åÝ~4é·¿,êiMKü͆­ž¯kŠGT,·Ñ “‚ý“ÇÇd
^*òg…‹ó»¯t¬w¦jˆ|X@ 8ˆ–ˆ”k”r¹\¾RNÔ9mô 8à¿ÐÙÐÝÚ(~¦F³¿Ïà±T0´O£®{I&Q4.i ø“d³¿¿E4ظZ,^Ý8Hê_˜ —Åà 薆5
rÅrDˆ0ôÀ×´î/6Jú¤ì+eõ²->>òKŠiŽõb5¯ÞûO,nØáç±1+?#×Ò8fa'œÐçqÛå{4ÀÑøI Á¿R,øàÇÀîD¾Ã&¯;Ö’îØCÜ[)#of>7L^EØZ#ëì¿S…ìlïËiX?.±r¬¿hÿ( Ü:Ä©²ï²©J³³Åmô­ÿsÃѪHÍ+¿dfàYð‘|lÍjШ‚Ë—. )Ö
ñ<Žð…ýY¼»@§Lø¤ôûKò
-Q¼è}[n{£Q,k÷{ —¦a»¥-p­©Ê߸Z"Q4ú«Ô×Edö‘í²?,zÑNNÌÞqD­ºôO×ÛÒásÞ¥pAJòUByãÖµÕÁ6õzÉs+v˜Ò]GB__‡¬¤Ñ “ý“ÏǤt/• ô®@øý›®Âòç h9@ bZÈks©žxà¦c‡º-fâ!\ú¤¯—š\ñ$€“S­ÏA±qw>‘ Ùè3˜à0³2«BS¹yƒí°­Ø{:9ùqT(PԒ0†ŸáúpÒ*Þñ¾™¹“{áÇû¡A¶”À0Œ’k\WÉï†aŽ‹6ÅR«Æ5ûÜôE›¢žÄ0Œ eæ“!Ȋ»’ú–¾hSÉ)¼êqj•ÒöY1SÌCÖú††\„c8®xMdS
+Q¼è}[n{£Q,k÷{ —¦a»¥-p­©Ê߸Z"Q4ú«Ô×Edö‘í²?,zÑNNÌÞqD­ºôO×ÛÒásÞ¥pAJòUByãÖµÕÁ6õzÉs+v˜Ò]GB__‡¬¤Ñ “ý“ÏǤt/• ô®@øý›®Âòç h9@ bZÈks©žxà¦c‡º-fâ!\ú¤¯—š\ñ$€“S­ÏA±qw>‘ Ùè3˜à0³2«BS¹yƒí°­Ø{:9ùqT(PԒ0†ŸáúpÒ*Þñ¾™¹“{áÇû¡A¶”À0Œ’k\WÉï†aŽ‹6ÅR«Æ5ûÜôE›¢žÄ0Œ eæ“!Ȋ»’ú–¾hSÉ)¼êqj•ÒöY1SÌCÖú††\„c8®xMdS
võÒ¸JßtÅ/[>iMÓWjº5$_Xø¢¡‚F!tÜ,Ú<aÊËß?`Ý,2e K“P ½óÇT}ùˆ
-ëjd}9Ýø-–Ì8U93Ö"í’íd諅¼Ä(a_H·ô1˜†Ì0zqÔ¶Ã6í3•ç³šjĬPƗ¡€qÎóËø2¤>¡èpÈ}¤[»œ¢ª€cyG£®ÛŒr»¶ik AfþLBÇ4+Þaz=½ê5$sÓol1Œ&<Ð1 «{µ+pÚÄ~Û½â•nÑó­î>«|‰ÀwH³í㘠U'ßr4¾@"úc—÷C=!àgŒÛÞ¾B–z×VÊQ{OZ(ÓÓªqFMì Ùµ•²€Î}Ø@ãدíùVÉÝ)dÏ)µ‚ýÞV³z½µJxùב¸mÃ0éʖÞó6y]üꘄ¶y£VpŠE „'‡üÛ)Ð8Û
+ëjd}9Ýø-–Ì8U93Ö"í’íd諅¼Ä(a_H·ô1˜†Ì0zqÔ¶Ã6í3•ç³šjĬPƗ¡€qÎóËø2¤>¡èpÈ}¤[»œ¢ª€cyG£®ÛŒr»¶ik AfþLBÇ4+Þaz=½ê5$sÓol1Œ&<Ð1 «{µ+pÚÄ~Û½â•nÑó­î>«|‰ÀwH³í㘠U'ßr4¾@"úc—÷C=!àgŒÛÞŸB–z×VÊQ{OZ(ÓÓªqFMì Ùµ•²€Î}Ø@ãدíùVÉÝ)dÏ)µ‚ýÞV³z½µJxùב¸mÃ0éʖÞó6y]üꘄ¶y£VpŠE „'‡üÛ)Ð8Û
ÁýŠõŸRý>»RJ2a¿Q­ oö†Ž©™~Žc‘¤oĐo°Ü‡XÍ°ßçvP*EBa
»Km€eéˆgÒüš,.ÝLÿ˜_ÿ—žÁs.©På‰uJé³Rªž’¯‘‹3¿”8†õ¦Ø¾¹»®ÏìHšé“VïœYó›é¹ê2v†GyA•€\Š{Îù
@@ -1906,18 +1906,18 @@
ò•ri½T¾RN֒9CCÛßÝاָ¾ 2wÙЗ¶©==³!†Óîa<AúÄ×~œŽÏsÜC`ÎV ° ¢ì/‹Ú¶˜a†¡CÝÍm}W„PMÙ_©t–àm†¹rì^¿^ÝYQjŽE
ÓJac³%x›¦ÃAK³F¸ÒT$ù
ãþõoº
ËGT‹Åf&€ZÎèì]¶ï”S½]KQÓöÈD _P
Y1G(l£O‚âÔ#ˆ9KF
-Yî>×sܡܤ’ʁ0í¿è6ÿIG-§ifÒĉÚ?’Ì1gö\ þ5±ÅÞÙ@G)þçd[ˆ§üæGµ0a;`GCŽÝ;<Uìu3Àý B¼¶vØþ_%„®û:ßêd_¶Óõ+¾mvàÚrpn&ÃC69ÌgzqóÀÙ/.(k£Æ—¹woø÷¥n½å´d'Â'e¯›eïI™Ïõ•w*b™É²3J!;7™›_†¼IΓ˫ylôìsÒò&­4ñóa¿××¼Ž±rE<npŒ£fu€»ë*z¦n1®úîž>˵¿t åɟ(6}’ä=á©Y\òåXÎyÂ)¥(÷ '3ïvžf;&Ûý¤ŒŠ†‘›Ò“/O¨< ËtTÁ0 Ã4ß³íÂaž2Þåhë^­l)aNÊ­zïm.U|u§êoL†çì·Ìò"®1)’³$êÙ½ÌçV¼Ó —@ ó—mô€|êÄcwŸë9‘°Ñ3)El՚O9éÛóm’ š²¿(òíõ$ 8Æé‹ò]oOxäq´ñۈÁã–/ó™PjUQEÕ'^Šý’)z³3~ȽSËüÎ<mU5((©L³ÓÜèþG›Ÿ-M«²ÖoüZ·Ñ€õ>õi¯nƒŒ’*{ûT‡zRåø÷¯÷/iH-!ÖÙ¨¯¥jˆ@ æ#q#@ÆÛGZrí«keêZ=ñ*ÀMÇu[ ÌÄ×ôI_·¬€˜?à¤ÁTësÐEŒ‡Ü‡OdÊiC/QBÙò呼“ÌZÐî>çø¸GÕ PýN©m»ŽØ查~J˜ÚM҅Óðüo»þbŽžT´÷ݺ5ôã7vˆÿ?tk¨wybÈkÿæÇdáЭ¡¡P¢&Gkž“9Ǽ?Þºæ±ËÇý¯Ê$nfòW·nú¡_œ•÷­WM.$8›µª¾É'
+Yî>×sܡܤ’ʁ0í¿è6ÿIG-§ifÒĉÚ?’Ì1gö\ þ5±ÅÞÙ@G)þçd[ˆ§üæGµ0a;`GCŽÝ;<Uìu3Àý B¼¶vØþ_%„®û:ßêd_¶Óõ+¾mvàÚrpn&ÃC69ÌgzqóÀÙ/.(k£Æ—¹woø÷¥n½å´d'Â'e¯›eïI™Ïõ•w*b™É²3J!;7™›_†¼IΓ˫ylôìsÒò&­4ñóa¿××¼Ž±rE<npŒ£fu€»ë*z¦n1®úîž>˵¿t åɟ(6}’ä=á©Y\òåXÎyÂ)¥(÷ '3ïvžf;&Ûý¤ŒŠ†‘›Ò“/O¨< ËtTÁ0 Ã4ß³íÂaž2Þåhë^­l)aNÊ­zïm.U|u§êoL†çì·Ìò"®1)’³$êÙ½ÌçV¼Ó —@ ó—mô€|êÄcwŸë9‘°Ñ3)El՚O9éÛóm’ š²¿(òíõ$ 8Æé‹ò]oOxäq´ñۈÁã–/ó™PjUQEÕ'^Šý’)z³3~ȽSËüÎ<mU5((©L³ÓÜèþG›Ÿ-M«²ÖoüZ·Ñ€õ>õi¯nƒŒ’*{ûT‡zRåø÷¯÷/iH-!ÖÙ¨¯¥jˆ@ æ#q#@ÆÛGZrí«keêZ=ñ*ÀMÇu[ ÌÄ×ôI_·¬€˜?à¤ÁTësÐEŒ‡Ü‡OdÊiC/QBÙò呼“ÌZÐî>çø¸GÕ PýN©m»ŽØ查~J˜ÚM҅Óðüo»þbŽžT´÷ݺ5ôã7vˆÿ?tk¨wybÈkÿæÇdáЭ¡¡P¢&Gkž“9Ǽ?Þºæ±ËÇý¯Ê$nfòW·nú¡_œ•÷­WM.$8›µª¾É'
s;èØÛÎ
‚¤î®¨úÌ~ÕQÔâëÞ7U‘iäª5q¬žRlÔB=alöh¯ê
@@ -1929,19 +1929,19 @@
Cðª
 ҰD
¾hñ|;.ßD›ßpw7R.¶c,!
5ßöUîïlrü`?´HT&ù«
ÕjÓç1¯/y¹‚L@Q?‡v
Z8 xîÿ±PpXOšûÜâô÷6œCÿç|·žã¸Éé0pÇKšQ Ž/íÜ!VdD "-wÎLŸøªOU¨Ôûê}¾ŸØÉÑ÷ˤ#ÈŒZ&—saæ’Û¶µ{=nÓSjr©~ÊèZ4P¶~jÕÐõ¨Öö…mòë6.¥yœ9¾ùãýŸZ54IRj됳û2ZèìVW‘d•ºûcŸøË 3K6W\1ìõv¨(’$)õLtØgé©ÿô‚¹NC’¤z¯Éýi}b#Ëû­$«žê€Ö!›¦ŠÄqBw¤ÄÉÔtÛ4´Ta|¡_ÊrܒZ9‚´Ãoéi—”µ?šH äk˜_TG`{” äh ͪJ©~åö}ÿ†®ÎØ¿opR¬©Ã2WԈÓiÂǧJNÒ0Ñ ¨Íä°~j\ÔïN>½™ä#ă@vK=²Ñ#ˆ{‰b+äÚjáqF¸â×(ª‚¢ª(zMÈÓøp1¥àù1,m†ò®žjx©
\ oQßpÕJä¬ÂISc¹¬åt ó «=áÞùfn•¬â³ý03Ò}=ÝëÏz¢ñ•vq:궂Ûö(úšE³åƒÝC_©Ë=¤/´SPÁ¤ôJ²^M—'mÎóÑ
Ѽô8AjêLî„Yê,m“Ëך:s Ñ÷¶OM› ÂӚy“ËÍ´*›ko‚äT‰*GêÙîón¼3½ëË-±éûú³hjtÌ3Fÿ ÕjKáþ,θï‰T²Ìyd*p/,€x·ù¨%êÀú5>´½<ÚEek
]IPòûÕÍçA—×ßvø0¸<1xÿÓö†ž¤©‘7û
@@ -1957,11 +1957,11 @@
.m÷)s4‚
Å蝗Ò
 Ãìç­êÍVŒë¹ØóVu‰aAª,Há%q“=oÕ2^ŒaÅ8õ¨ÆúÏ\•9¾ûE=¹Çp\½Ïäç
-ðŠ§»|´òßö<òÇÅãM®Ánf“Ìó7ý^6"pI6´ø¦Àâ%•Šÿ¯Ë}ÊDÈD߇-^ D„l–zgÕ2©stP2®¯Iï·òcgÕF×I3 œý¸¡ï[p#›Y&§ÂюÒÊÄ0ŒÞÖØÿ±•©ˆÖç"›ñ!c€
+ðŠ§»|´òßö<òÇÅãM®Ánf“Ìó7ý^6"pI6´ø¦Àâ%•Šÿ¯Ë}ÊDÈD߇-^ D„l–zgÕ2©stP2®¯Iï·òcgÕF×I3 œý¸¡ï[p#›Y&§ÂюÒÊÄ0ŒÞÖØÿ±•©ˆÖç"›ñ!c€
8ð^¬,n¦؎’Ê©Žô_Kß6m&"Ź@ÈP…€
-ǚB³–Å~¥K2Ó œµ¤Òž:“$9UÃèCLÃ"…í+?wLeŸ1ñW'àÍ _= $¤{Âoî‰ü-ê“Ã]ûÀ¸»Ã0•Ö$«ë~K ¸Œ¬ÙS“T™Ó$JÆ0 Ãüyg^!ˆœ´{lÖCiƒ[æf Ñj󴯆ä|ä#@ I}­ˆü‘lô™Òš¥Â-꧌âýÏÍ>—ö<;{39"å=ñ
+ǚB³–Å~¥K2Ó œµ¤Òž:“$9UÃèCLÃ"…í+?wLeŸ1ñW'àÍ _= $¤{Âoî‰ü-ê“Ã]ûÀ¸»Ã0•Ö$«ë~K ¸Œ¬ÙS“T™Ó$JÆ0 Ãüyg^!ˆœ´{lÖCiƒ[æf Ñj󴯆ä|ä#@ I}­ˆü‘lô™Òš¥Â-꧌âýÏÍ>—ö<;{39"å=ñ
ƒXA
]g
@@ -1970,7 +1970,7 @@
“Óòïñƒ•¬†äèfË¿Ç¥å±wìü hb-“xûB ˆÜ,ø1“Z«ï>̧A[Ý'ϼÌ+Öûþi(¸stËB Ö&跉@,¢ä
-Ü aâÞm>jÁKUúU²ŸÍŽ^íZF„X¦Ìø..¯ ¾í<ða^C—ÌàýOWØz’‚ô¼ÙWˆ°õDã+íâôPtKQ“óËÓn~Š©ÅK’Ìl‘¬Wû>>|±}§ãz±fÈË×s¬ «xÀh?ÕÊ]åѪ±A±éDC\¦_[w¼Jg
+Ü aâÞm>jÁKUúU²ŸÍŽ^íZF„X¦Ìø..¯ ¾í<ða^C—ÌàýOWØz’‚ô¼ÙWˆ°õDã+íâôPtKQ“óËÓn~Š©ÅK’Ìl‘¬Wû>>|±}§ãz±fÈË×s¬ «xÀh?ÕÊ]åѪ±A±éDC\¦_[w¼Jg
ûêk->?…§iˆaXÎÛQڐ›üïøpÐP§£(*m+±Ú`(Îç½
x¸J¤yB ÀþÂú¿÷‹·E’$™m QN¤Íàè?¡Ýñ·ðÙ¡~ícÿ½§¹Ñ229)…OIß‰ÏßÛ~ì·;ÿ}Øú¬&ü“·e¿iè§q©Üæý¡é÷ªðO¾¾ãƾÏÆ"ª§Á^CvÏ×»Þï d¼ýÅZû¤™¿Úa¯!­L®3)ã‡þvÐò )L¹³œ‡Ü
@@ -1979,21 +1979,21 @@
³”Å.ٖ‘rb ënûÔ¿súƒvX÷Á¦6Ï×Aä̞zÛ6M¬GÁú⁞=¢LQÿ’Íù—Ø*3­2^hPê`Ä=‹÷’Ŧ¿Cà Ø¤Ðiøž,'3Ùè@ýª÷\‘¹³©öà/áŠÇuÝC#š¼3l¯WÖÓÔòçÚwÿK¬x\gìú]s´üÂM¦†-ÓbÅc5'Ý5Wv(2œ+“$³ÇǚLzµ2</cþÐxá«©°v{Ox^Fÿ¾ÞíïÏÔ<–&3Ó3þ¶—ÛRÍôYP½èj?Mô|Î] åw$•Äâòã*_h´£µ³£©v|Z”o¢ëŸo¸lR%DûÈØ6\ÿ=ë¨æ3,0…›Ø3cT]šóY°d“ÓçÜX¹óOÎÀ€1‹|D*ÒpåÎ¥EÜs ™s@$‚ž " ©)d ö¦O"½ ØSÈ
·…¾÷욧´4£öYïy—å9#µùî[êWÉLo9nizݪÊlxO´k笼4æX¢¤R睐2€žÀ¹#Ãþ¿ª£›Žj²ešþOD²b'yòÓûáƒCEíü7€Û~µrÔµ[ÿ»ž’Ëßx:ÿÜÉï±±çMŸ™¾N{Éà‰€•!À°gŸ±žm«'æ9G»¡oÌÀ_·€ÿ„fç;„û ›bÆ@{ Ú3á¨!€ÿÆ¢ú Í}nZ¡3{ÿ€ÒÞ+ ²«DÚõ^s _2»±û,So c?þª©lw0ÂûVZGÄZGàìeÛ}”3wÕ 7àÚïn™ÈäÇÿò%g—yÓ'O!{wõ@ @ ˆUE¸-ôŽÙè9MuË{½Ûª­֓K0»/©rnŠ)ۓ
ÏÑ!©@àž°Øõ҂±O`[¾4¹˜R°|Hlª¨ ¨ªØG]­·}Ú¾ÒÝå:dà~oóЭ­VS´JÈrÁ×>þf/ŸŸVu
»Gњֆ¾LÉ9åGYq…ûƒß ü-ˆL k@ ‘'wrè¸Ô¾ú> ªh9£F@¡€GiË;vîFz¯|÷)³j3aÅ蝗R†ÙÏ[՛ ¬×s±ç­ê*Ã0‚TYiEI°ç­Z†Â‹1¬§ÕXÿŸ$ð¿o¡6àX1®Þk܎¦sÌ¥¡Õ«~€9¾ûE=IàX1®Þgòó8ªIro<(!¨†XÐ^ה©SÇàÀCe†oøÄÊ °–-cNh,ÒzTý†aÄfUÇ`Lsaʕö¡{»>|%Þ<ØÛ'ÛtXOÄÞÕÙµˆ2Æú(i{¦b¬+k³"€<ÚUËgãï/
-£JСk!¦4›‰‚:…À{Åޅ9ë5‘H,R³ÀsCï8ä[šöbX4o9RÏè¿8$aÝ{–÷r\ĚE»K{·U@$£>9ܵŒ»+1 SiM²º®á·VåßčXü·s7_A!ˆL´{lÖCé#¿çd Ñj󴯆ä|ä#’FSț@ D^ é[±²XOZ—窕Ä[Vý^ÿjÐsõo "ÇsWFøz´ÛhY‘,µmà]ýÓ¯´\˜¸9á:Ùh¯_ÊÖ: º¿›øÁÓêyó€æDÐæñÏÎÞêAÞg®Í¦ÀªêÛØ
+£JСk!¦4›‰‚:…À{Åޅ9ë5‘H,R³ÀsCï8ä[šöbX4o9RÏè¿8$aÝ{–÷r\ĚE»K{·U@$£>9ܵŒ»+1 SiM²º®á·VåßčXü·s7_A!ˆL´{lÖCé#¿çd Ñj󴯆ä|ä#’FSț@ D^ é[±²XOZ—窕Ä[Vý^ÿjÐsõo "ÇsWFøz´ÛhY‘,µmà]ýÓ¯´\˜¸9á:Ùh¯_ÊÖ: º¿›øÁÓêyó€æDÐæñÏÎÞêAÞg®Í¦ÀªêÛØ
-ÄZ¤ S¢k@ 蹀@ ²i7ÏØôyf.MÛ0çíhQä_\ÿöÚ/y©½:™‚ ÿ`?Ԕ“Ìã Ã0ª-ª¤z—’B«s—ŒÊ݃Qi†Ù&fÍ$ýÞûó¬e3žé“ŽÃ?$¶ª)€½ØQ©í‰D"цÒy¦œ%†f#†5]¾åˆZÒçx|]Ùèl$fŽÃÖ)Ïޜ5n^RýÕ-ÇûVÕN 7ì çÒvštòcßåal2AWÉÆ¿FÈbÀ0¬5pËJù)€ïEUí—õÛ-pöeËè,2¼+«íý.d,—€þa¥øÂhà”Ò‹ç!Cmuë×H&k†aýNŸtÞJUsLÏÂ:PáXShÖ²x;0ÅON³Ž£zû¤™¿Ú!ð§g#‘X2Ù)gÉƃñßg-©´G„û6¼R xÄ÷
+ÄZ¤ S¢k@ 蹀@ ²i7ÏØôyf.MÛ0çíhQä_\ÿöÚ/y©½:™‚ ÿ`?Ԕ“Ìã Ã0ª-ª¤z—’B«s—ŒÊ݃Qi†Ù&fÍ$ýÞûó¬e3žé“ŽÃ?$¶ª)€½ØQ©í‰D"цÒy¦œ%†f#†5]¾åˆZÒçx|]Ùèl$fŽÃÖ)Ïޜ5n^RýÕ-ÇûVÕN 7ì çÒvštòcßåal2AWÉÆ¿FÈbÀ0¬5pËJù)€ïEUí—õÛ-pöeËè,2¼+«íý.d,—€þa¥øÂhà”Ò‹ç!Cmuë×H&k†aýNŸtÞJUsLÏÂ:PáXShÖ²x;0ÅON³Ž£zû¤™¿Ú!ð§g#‘X2Ù)gÉƃñßg-©´G„û6¼R xÄ÷
[Tˆ§Õ’_aŠ@³…sœó£!|+ÍíÓ(Hº‚&7d9™Øû·Ê¥MùVÀ ´©(Š×¤Òøâg'g‚–KpZ”ÉÈÅ.fÒ\¾Áp0
-Ž€®"ց0ã)YdS›ãÜöL…ñ¨FŒÖöíÛXD¶N“fü‹51€Fˆ«©._¡óz«xºÙw»[Ök—o핼&ýïX m{e›Tõt œŠ%?\4ms›w¼¶ó æ aÊDµ¼“‚%é¼U«åq;ö’ /W‰)d‹âÿÁ;Š@Iÿî9Þ÷mPS­Á7Ô¢ýƒŽ¥ —© x{Á¡^ B)W±ˆq|I§X Dß÷#‘†aÈQ@ Vi„Œ‚Þ
+Ž€®"ց0ã)YdS›ãÜöL…ñ¨FŒÖöíÛXD¶N“fü‹51€Fˆ«©._¡óz«xºÙw»[Ök—o핼&ýïX m{e›Tõt œŠ%?\4ms›w¼¶ó æ aÊDµ¼“‚%é¼U«åq;ö’ /W‰)d‹âÿÁ;Š@Iÿî9Þ÷mPS­Á7Ô¢ýƒŽ¥ —© x{Á¡^ B)W±ˆq|I§X Dß÷#‘†aÈQ@ Vi„Œ‚Þ
-ÿä-@dV¥=¨}Õáñù.yϾ՘¸SŠÁ"L9@]šlOÇKUúUώ^í¢p¨î±L~ÛÂr®w'åýOSùwš¶ W\¨R4Éœ45–ËZN:Ï°ÚSF©¼óÍ Ý6?Œ‰~˜龞îBYO4¾Ò.NG#Æà¶=Š¾¦Eqrù`÷Ð×cêÇäiÚ.¦ÐNAQ“ó »ÄàNÍ΀ÔHäA¦À©¹ÌþS,Q,ûO¯|“).p~Š95| @ɵd£—þJ^zˆÕƒŸâí'­,‹ß .ÈL@ @ V¥R©ÿ$›¹º²ìâmRWªš—¯ ŽãÔ&JW­1ïÕ2ÛºŠf¶1i]éÀöJÍ NïüÒÏMñ‹NC½gù
-À<žQ„9à‚¾Î¦ˆÅ”°è,¾ Ë^õµü±E±ÇF¦jULÙö(´ÆÿuŽ»°Þ¹S×µ ã›ÍrQ{¨¥âgrìNΈI]ô>©hÞoñ_ç¸ë~K}‹â÷½TöÇk=iÍ´³½“k×{fd¶?Ä 7¬ž°ØޏöŽ“¦úr™ãx†‰„ÌƏ]Ä×mª:‹û’Ÿ½pZk5Š=]f2WФetZ_.óM.œ¥õš¦M²fk€åØ«¾–ú¾ŠºØ±[_bZSÝÛüòHã»õ’qÒ'+¯âÞ!ÑFYêWœÔÉ*§4E¹N;¸ÛRÏj>—«j>B0 #ŸZô¨’òŸû_U¥Mo«¿˯ž ®JÂv5D³Íã©©3¹f³´M._OhêâÙãnûÔ´yñ *<m¢ˆär3­òeÉ͛ 9UA¢Ê‘zö€û¼/ÆLïúrË_
+ÿä-@dV¥=¨}Õáñù.yϾ՘¸SŠÁ"L9@]šlOÇKUúUώ^í¢p¨î±L~ÛÂr®w'åýOSùwš¶ W\¨R4Éœ45–ËZN:Ï°ÚSF©¼óÍ Ý6?Œ‰~˜龞îBYO4¾Ò.NG#Æà¶=Š¾¦Eqrù`÷Ð×cêÇäiÚ.¦ÐNAQ“ó »ÄàNÍ΀ÔHäA¦À©¹ÌþS,Q,ûO¯|“).p~Š95| @ɵd£—þJ^zˆÕƒŸâí'­,‹ß .ÈL@ @ V¥R©ÿ$›¹º²ìâmRWªš—¯ ŽãÔ&JW­1ïÕ2ÛºŠf¶1i]éÀöJÍ NïüÒÏMñ‹NC½gù
+À<žQ„9à‚¾Î¦ˆÅ”°è,¾ Ë^õµü±E±ÇF¦jULÙö(´ÆÿuŽ»°Þ¹S×µ ã›ÍrQ{¨¥âgrìNΈI]ô>©hÞoñ_ç¸ë~K}‹â÷½TöÇk=iÍ´³½“k×{fd¶?Ä 7¬ž°ØޏöŽ“¦úr™ãx†‰„ÌƏ]Ä×mª:‹û’Ÿ½pZk5Š=]f2WФetZ_.óM.œ¥õš¦M²fk€åØ«¾–ú¾ŠºØ±[_bZSÝÛüòHã»õ’qÒ'+¯âÞ!ÑFYêWœÔÉ*§4E¹N;¸ÛRÏj>—«j>B0 #ŸZô¨’òŸû_U¥Mo«¿˯ž ®JÂv5D³Íã©©3¹f³´M._OhêâÙãnûÔ´yñ *<m¢ˆär3­òeÉ͛ 9UA¢Ê‘zö€û¼/ÆLïúrË_
¢ßC×Bý[c+íl—
C×B¡À…XKÕ?¬²ÉÚßuÿp-4<dcæ½O«*]\\áŒmïýâ,=>¸SŸHp4´ƒñdòÜu¿ýhmpñÄz¦òît†GrÕ ’“4ô{Ó,¹ã>ï®ÜßÙhuÖ䔏(id‹RÈ"2’=d¦]«
@@ -2009,9 +2009,9 @@
ç(Q6çh ‹‚Âßæ¯í<¨9h˜r@Pj™–Ú"
-ÄñÔâTÉY4lÿÊo®&ዠ΍;´'½¯&Ä½É ©D"˱™ê@Š{2"Ù¯». -þ@ ˆ»ˆôPnŨ• T²K±$ò·Ô#ýÊS r…\S£ƒyðwÕª‚¢ª(zMÈӘ­™Rðü–ÉÃ?y îYœ‰}X•ö õ«³šaÊYò‘'KC\¦7/è Þmyí¢½Ï ¡_#TljAð¤©Ìÿ9Î?O;Î{€½ä¨Ü­ª™Téªã¥ª¥IÎL—×åÜX{àîÚ&jÔÿtEsCOû˜5Q‰‘7û
+ÄñÔâTÉY4lÿÊo®&ዠ΍;´'½¯&Ä½É ©D"˱™ê@Š{2"Ù¯». -þ@ ˆ»ˆôPnŨ• T²K±$ò·Ô#ýÊS r…\S£ƒyðwÕª‚¢ª(zMÈӘ­™Rðü–ÉÃ?y îYœ‰}X•ö õ«³šaÊYò‘'KC\¦7/è Þmyí¢½Ï ¡_#TljAð¤©Ìÿ9Î?O;Î{€½ä¨Ü­ª™Téªã¥ª¥IÎL—×åÜX{àîÚ&jÔÿtEsCOû˜5Q‰‘7û
IêËe¾É¼Ó<¦CœôÉÊëSË “Lî³÷?£hѐ®‡Lò+2Ó#@ ˆû:¨GiÇ'.–½Ë 4…)×ê+1 sMe´$_rW^
8†aIÙ¥^R!õôÖ)Üö©isLæu·a—
@@ -2018,7 +2018,7 @@
E¾ÚíJeå{vûÏeS§†ßj²6í,Û¨Ô·{Úÿ>šäJøɊ–Ê2Ã7|ÉŒ¿íå¶|T/ºÚ—ç®-¿{¤òáÊÄÏPôqƒ«|¡Q-v4Õ>òpemC «0N\öVÈòh›z&dñ <Æ:jì̲œ Ø3cT1µ¼`É&§¯zÞ»óO O· ò—
š²M J!‹ÈHÁ)d³f!µ>J!‹@ (ŒE ú„ÛBß{vÍSZšQû‚¬÷¼Ëòœ‘Ú|×ÒÌ.u¨¼$,Ç-M¯[ӆˆ‚%äÖËYyi̱DI¥Î;!¥7=sG†ýE¶uT“-ӔøÓÈð"šõq•l—ÐÉczðÓûáƒCEíü7€Û~µrÔµ[ÿ»ž’Ëßx:ÿÜÉï±±çMI‡%õôÒ)€c/<°2Ìñš²²p]×¹×MøL°£Áà{´ŸýؾC”aªÃõ—˜‘EVJ«%²”óßXT¡¹ÏM+r¾ïE°;ž60én°ªÜo¬i3Ê"ýʒñš”æ83ØèÀ?è`™zûùðWMe»ƒÞ·Ò:"îg/ÛK0nÀµßÝ2‘ÉÏõåKÎ.©ÜùgÁZFJ!‹¼éwëIkæE>@ Ċ‘l£?³Ñs2š"ê –3öúýýÆzr f÷%UÎM1e{Rá9:$œÃ»^Zpؖo'ÍC.¦,›**(ª*öQWëmŸ¶†¯Ä⸸ßÛütk«Õ­Ò²\ðµÿ£ÙËç§UAïmùš¶2¿ôÌÈ.8:TI=ªí÷´ŽŸo‰Ö
-Ž„©}՚jMô£^07d*'ž°R_·ä«ùýÈ]Ir†ÈŸTŸzd£¿s/|²pÅ~P×ì rÑÀ5ƒô³ÝY î%pÒÜZî±j;nØ=ŠÖ´6ôeJÎ)±" 3=âÎÑör›Ùé@ w”¾ˆ*ZΨƒA€P(àQÚòŽ»‘~ñ¨û”Yµ™À0ŒbôÎKÉb…a˜ý¼U½™ÀŠqý1{Þª®"1 #H•e V”„ë„)*“|Tkÿ¿ÉøŽ9¾ûE=IàX1®Þgòó±³ÿƒ5n~×·¨òzã•cZ9Ç\ŠP½ê‡… 0ÑÀ/ì'Ý*NJqõ^s ºRÇàÀC±Hñˆ1kiÐ8†á„¦Á"½ÈG…럠0 #6«:cs™âöèÞ®_‰7ööÉ6Ž¦ö_-¢Œ±>Jڞ©ëʚm¯HK ´|6Þñ~SâN‚î] 1¥ÙO9,£S¼gQì]ˆQÊôöõ“ ¶3q^”B {Ã"YM‚Àó‹CÙd*€î½
+Ž„©}՚jMô£^07d*'ž°R_·ä«ùýÈ]Ir†ÈŸTŸzd£¿s/|²pÅ~P×ì rÑÀ5ƒô³ÝY î%pÒÜZî±j;nØ=ŠÖ´6ôeJÎ)±" 3=âÎÑör›Ùé@ w”¾ˆ*ZΨƒA€P(àQÚòŽ»‘~ñ¨û”Yµ™À0ŒbôÎKÉb…a˜ý¼U½™ÀŠqý1{Þª®"1 #H•e V”„ë„)*“|Tkÿ¿ÉøŽ9¾ûE=IàX1®Þgòó±³ÿƒ5n~×·¨òzã•cZ9Ç\ŠP½ê‡… 0ÑÀ/ì'Ý*NJqõ^s ºRÇàÀC±Hñˆ1kiÐ8†á„¦Á"½ÈG…럠0 #6«:cs™âöèÞ®_‰7ööÉ6Ž¦ö_-¢Œ±>Jڞ©ëʚm¯HK ´|6Þñ~SâN‚î] 1¥ÙO9,£S¼gQì]ˆQÊôöõ“ ¶3q^”B {Ã"YM‚Àó‹CÙd*€î½
Ë{9®Ä
@@ -2032,23 +2032,23 @@
°7,ê¶Ê¥MùÖE®gŠ¢øw*/~z.†ÅúÇdn‹Éf|"À#’/ø:%ŒÍઐ÷lpÀ¢"Iuaðë°T9ž+•ÐšÇ\¼uéU‘*ã¤2… fü‹*o0$V®.Ïû8€y½Uïñ݆`¯]¾µWr™ô¿c€¶í•J¥R©TŽÍ@ðt‹ÔêÜÍÙ¸›ånõ!jÕò"pL&kn¨V›>ÙCåå
ZξJÜg× QèW–ß Û."Ù¯Ä_T4^M$IðGX.ÚólTf¦N@ ˆ¼(¹B®­Ög„+~‚ *(ªŠ¢·Ñ„<S
ô44^Ìa§nÑY|A–½êkùc‹âÉ^jÁð>9³Øy¸˜ê}RѼßâ¿Îq×ý–úÅï{©ìñŽÖzҚig{'3Ö®÷ÌÈlˆµ…VOXlo‹GÏÇIS}¹Ìq<ƒ0!m€ñcñu›ªÎâ¾äg¯܃ÖZM§bO—™Ì1‘°œNëËe¾ÉØYâþÝ<"*º÷’¾Ÿô\Nö´7N8Ùôu4Ô*~ß«Â3–G'}²òúìšßǬ)OA‚qp7¸¿?ÏúÞg¿ é‚}lúu)D¼àøÐA=J;>q±ìý7)ž¥<ìy=VLòs‹
ýÇT8¡—6ùoL†UÝIb±žÐԙ 9i…)Ÿ¥QKnÀ1 #HÊxÌ.õ’ªRjFôÂ:…Û>5mŽÉ¼î6ìRáŶžÐ7uK½³šDíÌ^n¦U>”k÷A™é@ ÄŠM
G?>Öe/ïþ@gXŠæ÷èn™”B‘‘ìébÊ0eô‹ôӒ¦W¯dø«az׊ÅÕA @ܯdLÐ'yíev÷:X¦Þ@ÇâáðWMe»ƒÞ·¢
®:y¦{EdBàìeÛ}Ñ`A+‹q®ýî–)×R€û˜;œ605…l²‘´ÐKچ÷S
-YÈûépÖ‹®ÉÛBßi»¦FK3j€ ²ÁOœÖgTÕ=oýHÌXžç.²e¦ƒ[pBç%ÊæÏnÍê @`ñßVšý^RöƾêLb…Ý%•=‘9\uT‹há>7K{ù`w™ªó­ˆ–H×6é‡\P§À{ñÊn÷€Àv”TöMü*D'ª¶»äa{dŽGáxiX’)‘©4Þ´÷cšU”BVBJ![”³*‘ɂ/=¶ï@ @ ‘†¥7ºeäåŠý`»‡ôØ44ɽ-ûégÝ+­ b­ƒ“æÖò;+˜39N„pÃîQ´:`=†a­/µÞm-Ö"QO¸;éw/–À}gèûp€¨¢åŒ:À@¡€GiË;v[[+¹9͔³û”¹íÍÁà/áŠÇtÝo×ÜÝ=Q†Ù†zG{Æ&Eݑ³¶]¬áxßØO“rmê9gmR%Ù£7ÙóVÓ_í#ߏ‹ «ØʘO8-û2Nd‘ƒaØYÿ9{}søÙ êLM$toׇÕéFìí“m:³Ñ°ÿjeŒõQÒ÷LEmWÎìW^$ˆFZ>ï5%î$èŽÐ5£¼4cëD
+YÈûépÖ‹®ÉÛBßi»¦FK3j€ ²ÁOœÖgTÕ=oýHÌXžç.²e¦ƒ[pBç%ÊæÏnÍê @`ñßVšý^RöƾêLb…Ý%•=‘9\uT‹há>7K{ù`w™ªó­ˆ–H×6é‡\P§À{ñÊn÷€Àv”TöMü*D'ª¶»äa{dŽGáxiX’)‘©4Þ´÷cšU”BVBJ![”³*‘ɂ/=¶ï@ @ ‘†¥7ºeäåŠý`»‡ôØ44ɽ-ûégÝ+­ b­ƒ“æÖò;+˜39N„pÃîQ´:`=†a­/µÞm-Ö"QO¸;éw/–À}gèûp€¨¢åŒ:À@¡€GiË;v[[+¹9͔³û”¹íÍÁà/áŠÇtÝo×ÜÝ=Q†Ù†zG{Æ&Eݑ³¶]¬áxßØO“rmê9gmR%Ù£7ÙóVÓ_í#ߏ‹ «ØʘO8-û2Nd‘ƒaØYÿ9{}søÙ êLM$toׇÕéFìí“m:³Ñ°ÿjeŒõQÒ÷LEmWÎìW^$ˆFZ>ï5%î$èŽÐ5£¼4cëD
êïY{<ëK™Þ¾~i1™8/JÕ¼a‘¬&Aàùy‚X—”©º÷*,ïü¯¦±à#î?PЁ@ ˆ£>9ܵŒ»+1 SiM²º®á·´ù4äƒÆäص øïxlY\FÖ쩹ӽÞ_´{lÖCöÜõ–Â@£Õæi_Y™ˆì$E^Ë}%1¥¼Ç¨$mÉ=MâuR¿Wç¿ô\g}ÁۂÈñܕþŸí6ZV”&ÞZà]ýÓ¯´\˜¸9á:Ùh¯_ Ì: º¿›øÁÓêyó€æDÐæñÏÎÞêAÞg®Í¦ÀªêÛØ
jÊIy©Œ s©iTÚÚ½ži äSFאG¹{PÚky¿•$pò©n€žÖ!›f3º#­Ðu²€+†ý£ÄVuôšW?Á€XxîôêÝæ'RF¿8e9ž6å n{–®=î€gºÎî ‹£Ï,xñóޞq±÷¿IŽã ÈȔ¶õü-h<óÐoVU.S¤8ÐI[âà™ÏõB:y|
D {*UÍËìtpRlªXœÔ}ŽwüÍbé`žï~[ 0ÇяWkžëýB a¶ïÏZýï
œ+c9È+jÄi;@ît,ˆ{—ø»$2Å"2âÐ!ˆåS†)g'n宗G 6q^Ì^!­¿I2ó–&y)“S“<”¹Ç48/ʊd0Ký^ò¢·ñ)R^*τÉ*Zˆ®c¼¿[÷ÈL@ÜE2ƦG w›;ü|”bþBÞ±ésÔÎÒ°à,讕'÷™"ñš„9à~á<—¼ÎoÇð­4ÿµO£ è
-šª¢˜ÇbCòÏÇ°þ›³RflaÊY²ñ`d!àŒtÝ&~—.Ô,Áj¸KNËIGpZ”ÉÈÍøÐGž,k²½IüíäóSŠÆ£þODöšªöó&>³æûÿªÞñÚØ¢ª¥Õ‘Û¾4boóŽ×v¶|H S.(.iÍZOˆªÕò¿¸{Éì±é í4y¯píß} ¸©Þö¶ÕÀdøi ,VRyá?íúlå÷k¦™h4ô®Eºÿ?@±é‘GgÚ¸ï"»!ˆµN®Ìswíø3!MR¹5Á ý.ß²"YxF Ï@˜e1 >ˆóø@ ÄZ §y ß`Hªªa‹
+šª¢˜ÇbCòÏÇ°þ›³RflaÊY²ñ`d!àŒtÝ&~—.Ô,Áj¸KNËIGpZ”ÉÈÍøÐGž,k²½IüíäóSŠÆ£þODöšªöó&>³æûÿªÞñÚØ¢ª¥Õ‘Û¾4boóŽ×v¶|H S.(.iÍZOˆªÕò¿¸{Éì±é í4y¯píß} ¸©Þö¶ÕÀdøi ,VRyá?íúlå÷k¦™h4ô®Eºÿ?@±é‘GgÚ¸ï"»!ˆµN®Ìswíø3!MR¹5Á ý.ß²"YxF Ï@˜e1 >ˆóø@ ÄZ §y ß`Hªªa‹
Ý ?HD>,ºÞŠA®k«5"€ëß>‚ *(ªŠ¢·Ñ„<ÍkS
-žҙ>üS᫦Äé‘Ø7UiZ¿
+žҙ>üS᫦Äé‘Ø7UiZ¿
âA  S@@–aÊè'º¹%©3£Äýÿ: 灛³Ó¢ÿ{Ö÷=ëÿ>èûžMúŽ£Ä„Ÿâ­§ì,ËÞmEÄ݄ã8^ÈVAý*¡ÍégÂó“Óá•S*÷q=^Œé/q”kɃ
@@ -2060,21 +2060,21 @@
óÁA¸Î^2)ùëa÷޶ъþ\"zâÙNGÞ
-;u‰“<w%4ú~gçûãé–ùsvíï5ÜWI)dôˆ—åxdù™üꖫLíÛôE,ÓçúÓ[¶zjTåâÎX$Ë{ÿKuz½7üžAÚÊ}cÖî7ÆþÙYô‡¼(Ƌÿ*–ü:[h:`P+޾ܫMï–û @‘÷;™Àž?ýihÄÃêšÍšÄχ¿h­~*烋í#Rç®Þ®-~yËZÒxᆵØT€{Ô¦O'yN¨ˆ£t"‡£ÇãATêûàBˆ ȝԟI^\‚¸ñS )dä^ ðÏXà{Ñô¨26#Š"/&F†‰âü8¦Ôzõä®A¸) ~”ˆÑs
+;u‰“<w%4ú~gçûãé–ùsvíï5ÜWI)dôˆ—åxdù™üꖫLíÛôE,ÓçúÓ[¶zjTåâÎX$Ë{ÿKuz½7üžAÚÊ}cÖî7ÆþÙYô‡¼(Ƌÿ*–ü:[h:`P+޾ܫMï–û @‘÷;™Àž?ýihÄÃêšÍšÄχ¿h­~*烋í#Rç®Þ®-~yËZÒxᆵØT€{Ô¦O'yN¨ˆ£t"‡£ÇãATêûàBˆ ȝԟI^\‚¸ñS )dä^ ðÏXà{Ñô¨26#Š"/&F†‰âü8¦Ôzõä®A¸) ~”ˆÑs
OˆÕڎo-®[Ûù¨-
ÔöÃéAU-ÃÌG™zÆõyבº^;èüV#ÌÇèù «þ9?@öaê 'ó-Yª'2µ†€]U›¾ž<±1U<lmüíøñÐys®Rö<ŸLu]îÉÚì ŒY¯§Êô¿·1:ང”‡ÿ@Àð–Ëÿ\gQǖÔxöϝ¢Bç|Œî®m섽žÒëÞÛäÎ§øÎÝÖã§ý.ƒ†æ"ÎçF4Ïû–Ü1¤$mëªq¸YÁÆ,f<]¸êö«º†ï»=’E2V³rEo–Tè-E%©Ýf \Mm-0S²ì|Å"Y¦hƼ·Ÿ-qŽäm¸”K2FŸü‹ê7‚,œ™XñE‹.âL¬ð¢3ÅìÜ1OŠ.E=™‹.E=)əÅøÝcžÌĤ=–¼>rŽÓ¨@àgDA$E)N?'(`.gAe%ýåôàÇG¨zR§DÆ@¥‚Ç4ö÷ÝÜUùK¾wlÒ­5£k>ãI>/á>éÔ¯§ˆJ²i¿—=éÔ×ÓAP´Ö~$\Ø%‚ †'¼†Ò¾ö¤Ó¨cÈJ‚¨$™Ç Î/æ%8fùþ—›è5$A’úÖŸ¿P`í-FŠ$’2´ØY GÑ%ýc–²6‹ ÑÈz2ìAyhz{JBÄ­£˜_F[’MŠ$*%›)ët‡ó<¸ _N9>lO/¢4ŽÉ˓ºÕ…Ž#åó|@е»v¢o°Ð®
€DÂðvÕö”„¥ópW¹ÉÐPn¥þí*ûE¾+
PxA¬®SÆøBvî”'ŗ
¨®«òz2']ŠzR’3‹ñºÇ<©iÏD£¥­s3ø'¯_§Eç✠~² >ÛŸµeü)Žƒ‘z¹‹hÞn
ñ‘þjmï©q#¾V¦íJ–eÁ¡S×g?mZ"—ˆLe·Ü}éç´B¾-r_’~Lœú~Ž'gVÊ
»áy‚bµ=᪒)J‘\U}þV<!R?Ë«ÔǺeYKföXøQÝxãç8•G,‚ ˆ¡ð¤I™z#ÆüuڎDñ¢ºñЅIKš6¨Å—·ßуl¦Ê
@@ -2089,13 +2089,13 @@
Ä©Òv]ÑõZ×âڜ8“mmܚøÎŒ³V“A%†<n6Øî}Y›o7rèÙڎ–ž gúObüÝì¸0¹Þ®›ëv²ìÀ?bcÿYb–ŽÅ1®Q@`JLÓǾ÷Ãj´ÞûnDÓ}>|P/}”Þô_õ‰ÿ}‘h±½øNr¿ƒ1ú\VP˜>Kè ˆ?Ü0¯%…k‰ÂÀAsÓ9_ø|¡Id2Zl1€
ŠV¥öŠ]rs
€ÎÓcVԘŒT¡ù˜7'2-' km0׸ Æ5KàRZšÇÂ1z ŒÔ#Èý
z˜ã#ãþÞWlë=ÂU§?&ïN)J‘´µ¹¦Ós à8YHcàÞC“‚ÈòæߐX\¡·m]¢hÃf«=:‘Ü$΂<…Ÿç ÜÞ¶KPZŒ^uêäÞeOø–“a C¹'Bù¢“m¥Owo>vܲUKÕPš­æãGæüÍñö?G½ïÙ5µ4]«uöŠ?úG¯'ÆD÷¦@A_²Â\´D5“§9ˆP>Üe˜Ï#ç8Ö£˜f6œ#=± psEaŽ·ÿ9ê<Ö£˜¦×iG\]Ï+aŽëý6æ<Ò£¯¥éZ½ãHÂx)G±=€,
-Nž·jDG{ã#ê[:Y•eúl wjŠ®×ýkD÷¦¥ øá­à—&ÿ»›µuè·Øß÷7ÿéTàu=ŒÿÖ­Pµ[2…wú^ÓLý¹³¤ù’‚ ÷ É'Ç”B¶0_©ú~­r· ُjPVÀà/}"™~)™Æ­é¡ô½Nüt+™gƒ=çk’Bÿóó1³LšôÖ¯¸,ËI„ÝP¡j(ðªõv\€rbô©G¤,Ä9AZNÇĆÚÔG¨m¶ò±q`ˆ:õCuê‡êÔu[ 4ÿäk¨™Ÿž?—a-wÉj·ë%fâ~èÿˆ5¼™z<6®N¥ &b|ar‘öOÚ:Ëó&>6‘4
+Nž·jDG{ã#ê[:Y•eúl wjŠ®×ýkD÷¦¥ øá­à—&ÿ»›µuè·Øß÷7ÿéTàu=ŒÿÖ­Pµ[2…wú^ÓLý¹³¤ù’‚ ÷ É'Ç”B¶0_©ú~­r· ُjPVÀà/}"™~)™Æ­é¡ô½Nüt+™gƒ=çk’Bÿóó1³LšôÖ¯¸,ËI„ÝP¡j(ðªõv\€rbô©G¤,Ä9AZNÇĆÚÔG¨m¶ò±q`ˆ:õCuê‡êÔu[ 4ÿäk¨™Ÿž?—a-wÉj·ë%fâ~èÿˆ5¼™z<6®N¥ &b|ar‘öOÚ:Ëó&>6‘4
âu?è”%9„Rê 8FI¿>p¼ìïµ@`$1Íê¼Fæ5U¥÷@>#B,(zS¾‘ÂB7ü ÙöQØü FˆÍw=Æ͐1Q2Åmò­#r÷A’$¹Ž¤¥<ybôñÀŽþð·ô‘¿heB49ý†9}=+Ž&KÖÆö@*e½:&çH {и|¡Ö}2èÎi¨éuOÓë)Ëñ¸UÖY›ÅŸ
@@ -2110,7 +2110,7 @@
sÀÏð¢(ò1Þ}ؽÜ!‚ ÷!Yɖ„›‚ûýAãVƒ~£†QÀð!§¥ÛNã˜z€®î.Íê²óЫRIæf¡t¢鶞4{vfÿ³ôݧ&_@ˆùùeçäåDŠxEmbŒ¶ëì%“2ͱ
´m?±Ù‰a(š¡„k*`ê³ÿ•ªZ†Y+óþÀ÷AU×ô™þĶzF¿Í õTg˨ùŒ¥pݬML=ãú¼ëH]/€€t~«t‰÷ü„Uÿœ ;HŸ¯œzÂÉ|Kx«1W &Óra%¤}ûÿ;ïn×· ‚ ÈróÀʑ#¸Ÿ–8iÁ’ñiÍօ?™Tj
@@ -2131,7 +2131,7 @@
”µÛÄën€ìó¹–³<¤Òþ§ÝVëo“Ü~mÓSvþbƝO>û‚ ‚,;”2ÍAd¹“ã pÌ‚Ü£dÿx+ uwëáÃ1Çyë‹VE…BI)ó½5–ÕȚk/¯!‡äÄ|ï[VÉ2ý˜Ñý×há£Ho1¸WKéRCêúë)ýB…TÊT3?œrdäû'ÇÙºYúéQš ×Xaé¼ÅB»ˆ
Õú»ñzâZ ª€è\á
ÿ3ܓ”2´dUX(i ¼“¡Œxýìdÿw
@@ -2143,13 +2143,13 @@
ÔîpQiQžN“=aًÁÎßÌ«
-Ì«„®pÜÕ°{ï–-¦ÞB1rÙٗ]á¸+!{s 2IoËt€T0`;f‹:žó¦¶ ¬ó`‰a%iW9ÒW2é‚`ñi~t×mµ  _aCãþ—æoT¥Ô•!Gš ô#Ê¥䞤r~)Àwî6SG0ÂH'ÃÍóeLBV,$mëªñ»úH#\uûU]V9e›Û´\Ô>‚ ‚ ËΨ%‚,˜EœÎo9¶0”{"”oˆ'J È=Šü·¾üüKj5¥¢UÊ%)—Ë
+Ì«„®pÜÕ°{ï–-¦ÞB1rÙٗ]á¸+!{s 2IoËt€T0`;f‹:žó¦¶ ¬ó`‰a%iW9ÒW2é‚`ñi~t×mµ  _aCãþ—æoT¥Ô•!Gš ô#Ê¥䞤r~)Àwî6SG0ÂH'ÃÍóeLBV,$mëªñ»úH#\uûU]V9e›Û´\Ô>‚ ‚ ËΨ%‚,˜EœÎo9¶0”{"”oˆ'J È=Šü·¾üüKj5¥¢UÊ%)—Ë
j¤Ïµ—Õ(Œþ÷Á¡×tΗÕjµùÀ¨íóâÑç¬Ùý¶7u±ïEÛ`FÚUYUòÔ òN¹2YýS–œÂ—íþW«V†=ƒ­#©ÎDi‚\
Kà-‚Ü»èŽõíËSuAhVÅξ±?ɳ-ÁG,DB7Km}FH½íém¥—#KGßåÜ#3§¡Ž´:]þž¥°\Š}AA–…ä“#%æEV дA(HI=H)d³âq²…¥ [UJÅbâL¤PŽSdQI?Q¤˜vŠå¢­¢™Z&ߐÆЈ‡Õ5›5”ô‘¿h­~*çƒKæl°Ÿ5i÷*$‘¸Ó²Œœ»zSPR(Z–µ¤ñ|à ‚èz­«ýÅvú1jÁM ²`ª 5ž–‘e¿¦êµ ¨¾Âkë ]2l¹Dûw¼>"‚ H:É»V½A
#Y*©e4j
Éý•SýçÐXpLZN}j*\ÞÌd.ÇsAYá$ŸQôYL8ŽS(i*ÿ­¾þuŠ³ÂóÑë±Eõ A2œ  6ýò‚š‚ ÈRCD*‹ÒMað#·á£F§ç†³ý¨Çù¼…©¿‡¯D΃Îâ;-±…G%ãzRÕùÊ(LÌBç<þ˜øåkó÷–Ûù¨-
ÔöÃÁ½©9[ªZ†Y›xRbê×ç]GêzìàÝcæ~åâŽ%l2­á ±ZÛà­ÆRæn-¨Qàßjƒã3Šiƒ®zÈßUµ¡À ‘ñóZƒ¡!{òY¾rê 'ó-YÀsI›¾„£BA•ŠÞ …(w$ Z­núŒ-°).Qh××i;ÊjAîՄšZZª µ´`Iá’jBÛ“‹£9° ‰ê·UqY¸SÞâ~œÂ ÷7ƒ¡ê5J>•
@@ -2161,21 +2161,21 @@
Dn
"Çsߍó_øjó±Èt‡›ž}c¼ëȩ韦½[ÝÍé.GD߅éKþ.ÿ»» oE\þЭ[7†^RÚ 9!°Úæn¶Özþòôôaç Tw‹1¹Ñø7O†|ºGÓNhùʳnÑ^¬õžœgüFg¾æA€?Üð>‘1ÔÙm2x®j|¦§/øtW=†ß¸“›öŒö ÞºucèEå€Õ(xŒ̓–ãÇ_ÒîÞ|íöá½çšÎwvr:<fªlٔ÷“{ý „7ÿŸÓAïôOÓ§>l=lÛ"½!Wë½}(×JçÔ­­_&Þ@ôeuo¦Á³? yÁº7mbôÈpÚu<v=ÊÍÃ^ ö¶jžwðãÑ9h_Ÿ=%™©g¨ù¸ù®«Òß"W=¸+}υ4
-0úQD»/1 €\k¶ï·HëµPÇou/%®zþ˜ÙßHTUWÿÁ<a\
+0úQD»/1 €\k¶ï·HëµPÇou/%®zþ˜ÙßHTUWÿÁ<a\
—€fŸ6òÁhn×!‚ ’KòɑˆÇã<Üó²ŒÈQM¨oħ l½c1‚
-@vs´µµFÑùQ¸÷(k|ǒ,ï}7¢é>ŸrbzfÆû¯È™[Cµþ®G¼.]VH×ÓªÁvwúv>Ò?úí„þJ™º™,´QPU@t.Ù |ã¦]ðÂqîÌ°Y—š‰"°ÃýÓ5ß©b¾òsQ¨PõAAH{rÄÑôȹŸ–8iYºÍÖە¼G$3‹ð°í;ÐDVMg¸|c“ !°ý¯˜¥Aâ$EvZ}óR¡×µ„MCÄ $ä\X‹•³’Ôn³¤‡&‹´(°ÎW,’eŠfÌ{ûÙüi6µ*Æô„>ð±‡ò×£ÜwÁÈQ^I)W+¸—›.µ»'Ðê÷YŸÑÓkiý3ï¨Üh»Y¾ã§†>w44Í蝣Ãý/Ñ2»å@ÒÖæèü á÷íʍ}I1ççNƒ†a3º¾vE¿íæf­øFúõõ4]¯ïÿ4(þ82\@5^Ö«Y®ó¯Ñ¡Ï†zš®78?Šþ½“›?jÓ§.ƒ†&IÊ´¯KfZAŠÔÍ>rÆ~@V˜t=¯?àsûc¢k÷ü‰— L‰íÿMs«°èVÃÀ#ÉjÚÄð=µZ]·iËàß¡¯7õŸ ~?‡Â“ÓiL†‡RÛÚèHTÜV›Ԙå=°ªÕ›ùgúÆÞ3ÌršÇL/8oý¿õÓ¤µ>Ôô˶Bå ¬Ý&^/OžAe$ëêL’$³Ž15lۍºGušzîQìPzpýnۈ©iø›wŸ67ûÁ¡9>6¢(³ÀE‚½íH^R;Mö`„e/;Ó©zòP2¼œ¯<’q=­êxÎŒphé9­,Ü\tFÌ°PÉzRÕñœ=t…㮄ì͝ª_bò°,ø“äë^RÁ€íXP˜.èxÎ[FӕŒëi•Ñâ]ḫa÷Þ-[L½Eƒô‰~˜w™¶¸¿
+@vs´µµFÑùQ¸÷(k|ǒ,ï}7¢é>ŸrbzfÆû¯È™[Cµþ®G¼.]VH×ÓªÁvwúv>Ò?úí„þJ™º™,´QPU@t.Ù |ã¦]ðÂqîÌ°Y—š‰"°ÃýÓ5ß©b¾òsQ¨PõAAH{rÄÑôȹŸ–8iYºÍÖە¼G$3‹ð°í;ÐDVMg¸|c“ !°ý¯˜¥Aâ$EvZ}óR¡×µ„MCÄ $ä\X‹•³’Ôn³¤‡&‹´(°ÎW,’eŠfÌ{ûÙüi6µ*Æô„>ð±‡ò×£ÜwÁÈQ^I)W+¸—›.µ»'Ðê÷YŸÑÓkiý3ï¨Üh»Y¾ã§†>w44Í蝣Ãý/Ñ2»å@ÒÖæèü á÷íʍ}I1ççNƒ†a3º¾vE¿íæf­øFúõõ4]¯ïÿ4(þ82\@5^Ö«Y®ó¯Ñ¡Ï†zš®78?Šþ½“›?jÓ§.ƒ†&IÊ´¯KfZAŠÔÍ>rÆ~@V˜t=¯?àsûc¢k÷ü‰— L‰íÿMs«°èVÃÀ#ÉjÚÄð=µZ]·iËàß¡¯7õŸ ~?‡Â“ÓiL†‡RÛÚèHTÜV›Ԙå=°ªÕ›ùgúÆÞ3ÌršÇL/8oý¿õÓ¤µ>Ôô˶Bå ¬Ý&^/OžAe$ëêL’$³Ž15lۍºGušzîQìPzpýnۈ©iø›wŸ67ûÁ¡9>6¢(³ÀE‚½íH^R;Mö`„e/;Ó©zòP2¼œ¯<’q=­êxÎŒphé9­,Ü\tFÌ°PÉzRÕñœ=t…㮄ì͝ª_bò°,ø“äë^RÁ€íXP˜.èxÎ[FӕŒëi•Ñâ]ḫa÷Þ-[L½Eƒô‰~˜w™¶¸¿
ñ×8îjšN‹À:æ}÷ßÓ«›èiòÏ(\¿NÜxWþ˜ØÓ­IîCÒÖæ…ç@ž;Ï´1
*jšóùŒ¯±AD Ó#…À[(I’õsØõ®¿+8íÛZRD8mÚ uO(zû.]žuéæÏj뼜úîSRVÌKg]L’9´‘XhB΂-J$r^
-úLŠ@Ó/çGjnQ봃=ú.]¾ä;Ò¯Œ¸µŒÉ1hÙçEÕH¸ ?Ó¿$zöi‚† ûPÄøž5Yž«0Px*}‰^ݎ¤ÀmÍå/œÂSøä>‡Õ:•áN§{TGÕP²1zп8ÑÛ0ÐÞ¨~°ºéÀˆmÔpÛgÚ5úSo·;[6W­" ­Í+¾mëê‡ÌÒFߋ`1hëôëZOR/Só•gaó-ë#MzµzÃf…éÔßšÛûdmgݼ¢Ú<öÀ©VÕDã&µzSãm ~]RZײŽ1IÞî]£ÿr ÝÿjcÕ*°g°uÄ!ÓD~lþ ¹"ظI­®ÛìŽh|¡…÷OõɌý©ÝÙ¾¥úAuS¿çÎKáfa&ÔýÛî|Õµ/º@œR=éJJ«ÿÖ­Pµ[23Êô½¦™ús§ì‹}R‘Š­e8yl[e¨ô¥nÃ#m]n͋‡Â_ïÛiÔ²“™8šx-ÁŒ€8µÅ°%} Œ“~ÿ™£î!uÝ/Íkm!é{˜¯Ø£ÌÎRïÇA‘À²H!
+úLŠ@Ó/çGjnQ봃=ú.]¾ä;Ò¯Œ¸µŒÉ1hÙçEÕH¸ ?Ó¿$zöi‚† ûPÄøž5Yž«0Px*}‰^ݎ¤ÀmÍå/œÂSøä>‡Õ:•áN§{TGÕP²1zп8ÑÛ0ÐÞ¨~°ºéÀˆmÔpÛgÚ5úSo·;[6W­" ­Í+¾mëê‡ÌÒFߋ`1hëôëZOR/Só•gaó-ë#MzµzÃf…éÔßšÛûdmgݼ¢Ú<öÀ©VÕDã&µzSãm ~]RZײŽ1IÞî]£ÿr ÝÿjcÕ*°g°uÄ!ÓD~lþ ¹"ظI­®ÛìŽh|¡…÷OõɌý©ÝÙ¾¥úAuS¿çÎKáfa&ÔýÛî|Õµ/º@œR=éJJ«ÿÖ­Pµ[23Êô½¦™ús§ì‹}R‘Š­e8yl[e¨Ã´¥nÃ#m]n͋‡Â_ïÛiÔ²“™8šx-ÁŒ€8µÅ°%} Œ“~ÿ™£î!uÝ/Íkm!é{˜¯Ø£ÌÎRïÇA‘À²H!
ÓÖŒ:•bnܪ6ÉIûÆUuÉL§ﳿqÚý^Þ±oé+ð¾ªê]cáž-zύ³Te¢Û¥Œs \®z°mòVœ©`‰Uu“?Çç‡
@@ -2204,25 +2204,25 @@
f
ÏgÞÝå+€þí*ûwݼFÙÿ&‚ ‚ ²Üb9"ÝâBÛ)jw©,/–Ïê‡ê†.¤&-BY>—åðÜÊíä£÷˜ÃPÔç
ø>éÖ)üï6í²û[Ù¬Z°øÎÑÀ¹˜·lê®&îšmÇ4!¼ùÿ ô|:æ{šá¾õl~n‹íÅ8|Ô´«uøšŸd¸ïü-y«—àC!­„Œ>Ég\­?ôö¡\(S·ú°õK6°›€Þ£¬nЗÜêÙмp
toÚÄ£ÝÃ×\–ùž]rs‰ÿ»xu¿2¨yÞÀGç }}¶Oú”‹]V蓅4
-0úQD;’ø‘kÍöý kµPÇou/%ÊéýÄ_' öñfÏÿgïícÛ(³Åÿ3+·òTíOž*E ªŒÕ¢Ú„Ý‚ˆ»EÔYÐÅYªm\"gùŠ8tuë”ÄAœ‹öÆÑ: …¸èn“¢ÛM‚Têôª¬ÍŠnÝ+zã ²qÑʎh•±Ú¨3ÚF™µäßãL{ü’—¾Ÿ,güÌóœç<ÏLì™3Ï9gxÀúY¢ ûŒñ†ax+¡=‚ ‚ ·!óbÓ³“e  d¦G›@r
+0úQD;’ø‘kÍöý kµPÇou/%ÊéýÄ_' öñfÏÿgïícÛ(³Åÿ3+·òTíOž*E ªŒÕ¢Ú„Ý‚ˆ»EÔYÐÅYªm\"gùŠ8tuë”ÄAœ‹öÆÑ: …¸èn“¢ÛM‚Têôª¬ÍŠnÝ+zã ²qÑʎh•±Ú¨3ÚF™µäßãL{ü’—¾Ÿ,güÌóœç<ÏLì™3Ï9gxÀúY¢ ûŒñ†ax+¡=‚ ‚ ·!óbÓ³“e  d¦G›@r
ðÙ|Ký Çäõ™£vŒüXÌF/Saœú¼²H% ™A¹UÌûá ðaÿ™0ó¬M­¥ùcÉO‡,U´i«Éd27ó²˜ÖQ¤æDBzΞqèž’¤Ñ;9㢳qÕü<ã~€„â¹ßsQˆÉ®ɕkäpç\Øÿ)ëÚë ¢-vÕg ò$綛ÉdƒÔ_g‰•ºË3Žu$AÍg¯ö?VòÂOˆ‘«6ws=g&¸+µŽª£HõÑDàéÙ!Ÿvè¬C™L&o\s¯s%t(«¤BlúâK %²ÇX{²^HzÖ¿J×:ö¯ŒY
-υ‰µµ¾K8ªÔP÷ N|y,ö¾—r«´Çb ûFRjuõ— U$«-A}±„M3÷hGäCzcKv~×)€‘$š3n:g¤×¹þwÝî®æ—ÿâ&à:kyÒnyÙÛõ{+ðɞ?Z»O›6P´\:^¬o•ÞŸn¯Û|‚ 0{‚ ‚Èȱéç½ӂü
+υ‰µµ¾K8ªÔP÷ N|y,ö¾—r«´Çb ûFRjuõ— U$«-A}±„M3÷hGäCzcKv~×)€‘$š3n:g¤×¹þwÝî®Ã¦—ÿâ&à:kyÒnyÙÛõ{+ðɞ?Z»O›6P´\:^¬o•ÞŸn¯Û|‚ 0{‚ ‚Èȱéç½ӂü
ÇCòÓá‰/ÂÉO‡-ZÚ°Á@¯£é*
 Ç^80¿R¥^X<Ÿ»‘JlôZê¥ÛƼXR¢dä«@A[Î
‹•gI§@¥-«9‚ ‚ ·*b6"A“?'¤RρÑú##Ž­PÛí‡G7פ9÷ßS§~r3j =õۆ§„ú*¬»,(°¾ì„ÊG3ôé0kHÚ7Ô¡7·³i'­Ö¿ü›fƒ‘V6@úô¢õQ ͹ÿžêý.Û¯çp/}œ…4Ûù5ß7Wè=üH+›vJ:”Ô²N‚(’L ŽO’Ž'Cµ6žâã)Ž~Z²Â‹j5ÀóÝÎ-¿W©ÜF/Q6N½\.
-ÒÊKAä–C’$s?c«íµxM¤iÚô‰ª¢
+ÒÊKAä–C’$s?c«íµxM¤iÚô‰ª¢
¿ÛäþŒ®˶˒wÛ¶ùNŒ4n‹zڻϴmg­¨¯þ †=jiÈZI5®#ß þB¸ug RJVHM‹0ëCÝ.Q_Hú>
¸_W~€ÑÑiÚüFÝxZ=ù›¬Q[¸è ñâ@û\t~’vÖWµö¿ö¯S‘“ŸÀq4н~›qWêÀkF­:öM¨ÓÕ©}ªËE—y`°”Në«Ô‘”(uÁþ_˨¨y–ŽŒFä
¿ZۜÔ¾ëUÃæ®V,æ¤:'Ý.eûiÄýGO‹ÍŸš5ÚjÛKN½Wþè/¥SÇ.¦å“$˜(`ÇAœØfٖ[9“ÉeM„z¯{ô°Zk{Þv@ÑrH~2ÎìZȹqS ¢íÕ¶[­‚ ‚Üv̙¥Ö:y5}QÏëݚõåþéÞ\?<ùsÒ¬N¿m,‘ ³æ}!~.É<dTÏϪ*ò!ý#­²´B¤
@@ -2242,7 +2242,7 @@
ý‹˜"Díڊ„Ï„oµ
‚ ‚ÜXrí³¶]õñoǓ'‡á›°rÓÂè%>Ä
¹œ5jÉ/ºõ;»EÐ:ž3æÉ)&?—›´¨AAî4˜ !g••`/²îwã.0nòFFíž.Îù’“©f¬;¬ôô-Ó·„+U÷í¾ ÖI‚¸yasû"¢£sG÷äجcfá'¡„ÂÁ™¦¸còoî>×FjXÛ˞q”n[¸K¸è]¥ïÎ\¸0©÷
ºCAA;ùªõWòÏvþïº
@@ -2256,9 +2256,9 @@
ù$‘Ÿ¸` –`É¢Kn\3¹ë!I’¹Ÿ§mjZ+^iš6=d¢ª(Å»›Þ7wl±Õنû¬2ܹPKãrX½I¦÷)mËNwà/FÍù÷´ ¥\þLïSZ«ÃèvÑjnøÝ&÷g´p%XTHšãÓ Š‚pø ‘ž×=À]ß«¦-;kýC}õO0ì¹PKÃÍ0Ó+(¯N±ˆ(&5-Â:²h[5®#ß þB¸ug ¨†BÒ÷Q ÂÛ+ )ë)ýæ?tVX?5‘Lòóh72$€}(س~‹~;ë{ÝeÚD‹SÉÐ'ޞo´ñ²mÈIŸP_¥Ž¤D]üAN9ÄTD]U_X¾8Éôsþ¾çC­–Ýõ“AéØ“ ‚ HYT²Í«Ðâ+@E1-vuBë[G¾)&%̋}ùn¡s†rÙ’¤MÑiÁ
…’ pÁy•×Ù :-ÔQe®Nóâ@¾g)3½’{f™ÞKû~Êþ˜¹…ãÓàXeÛ.ãÞ`Û!ÊþŒ7q¢Òåêš*-]érÖ1Ó»‘‚¬c¦¶•®¥L[˜›þ×ÿö¶&K“ýJn¤c&r;2{£Ë;Í;C•éZ¹#˜™¼
-Ëå~T(Qpe¶äòl‚ŽÍæ$¸:9Y¢DÊXBN¶$]\ŸÜ’²rf._Ób%ªUêJFZ~ƤUEŠi±ôŒIŠU4ÒJflòª¤XّŠi±’cZь]á¤çÍå5TUtLËΘT"lsgÔå«bZT«ÔÒÑÓâÌ嫐P͞™Åë¬Úv|ѬÖðÓ|[誐A¥v}Α*ÒâÞÐUH¹ÄSA€íýZ‹ÊÂMst]ÌFæ·ÂÇT®ÎæÚ¦K|õV›wØ3j©ÔÔ[W(’t:ëÌ:>­6ý¦ñÔW¹°ö‘n>­6üº>¨rŽ5æSï5;¶´N‰Õîðìîøv‹n½]`#}¢û§¶uJ¬~Ôæ9áky²|¶Õ4"Å:ù,:ÀÞ'ª[õkÃg¯£Šµý[wsëkþ?±z«Í7ä~\y°Ât´ýöÊÍô`Üè8Duÿ“/_ õñÍy%Ù¼¤1’ó´uzšk'¦DÍý†ú—Ú&Ï:ÿQ¾m¤zî^ϱ‹iù$ ¦Å?¬M~2ÎìR8Ç-Ù9¼O¿íƒ±ÎòA)†l“/šBV‚¦éà‰à–Ç·ôþ¹×ô°É´ÕD®Q¸t°¬!˜Ðä\’¥Q§Îr8“ÉHYkä áÊàªûš3’Ä*ýß®ÎHFp ºß>íïq+õ²ÁWj›ø%Ã_M/%üñ?¸¶XÆ$e„…õž›bH1Õ\O+õ9ª
+Ëå~T(Qpe¶äòl‚ŽÍæ$¸:9Y¢DÊXBN¶$]\ŸÜ’²rf._Ób%ªUêJFZ~ƤUEŠi±ôŒIŠU4ÒJflòª¤XّŠi±’cZь]á¤çÍå5TUtLËΘT"lsgÔå«bZT«ÔÒÑÓâÌ嫐P͞™Åë¬Úv|ѬÖðÓ|[誐A¥v}Α*ÒâÞÐUH¹ÄSA€íýZ‹ÊÂMst]ÌFæ·ÂÇT®ÎæÚ¦K|õV›wØ3j©ÔÔ[W(’t:ëÌ:>­6ý¦ñÔW¹°ö‘n>­6üº>¨rŽ5æSï5;¶´N‰Õîðìîøv‹n½]`#}¢Ã»§¶uJ¬~Ôæ9áky²|¶Õ4"Å:ù,:ÀÞ'ª[õkÃg¯£Šµý[wsëkþ?±z«Í7ä~\y°Ât´ýöÊÍô`Üè8Duÿ“/_ õñÍy%Ù¼¤1’ó´uzšk'¦DÍý†ú—Ú&Ï:ÿQ¾m¤zî^ϱ‹iù$ ¦Å?¬M~2ÎìR8Ç-Ù9¼O¿íƒ±ÃŽòA)†l“/šBV‚¦éà‰à–Ç·ôþ¹×ô°É´ÕD®Q¸t°¬!˜Ðä\’¥Q§Îr8“ÉHYkä áÊàªûš3’Ä*ýß®ÎHFp ºß>íïq+õ²ÁWj›ø%Ã_M/%üñ?¸¶XÆ$e„…õž›bH1Õ\O+õ9ª
Ñoâ†ÇÌ$(·ÍKæÃÅÝk=¥]ÿÓ€À…õ÷՚ßë
-µu.%…l`Ó2aŸ÷åî ¿n¬=ÏlIÝf{\u_“Ԑ^Ax~žq-)͑ÕzoæúR³†Þ³Ü¸¥—¹_ÊÇnùœ+I†¼,«é1…ìM@ñ7AE¨æ@ýVFL?-‚–Q«@LCá{°™ÆÕôR9E‰®Ïn¿Ëˆõ'MõvCöûÞ¹öÉx†‹,·Ž²0Ö¿ö‘ˆpepÑëHëwW«æ—.¹´ü\0…,‚ ‚ä2—B¶t½èÙè–Ç·tý©  T€œÞ7w ÙêOFÙ+\ìô ½~ž—e«Í‰'“ßGZŸiÕ>q€!ç$#q–MƺZ†Nk`sà mËNwô<˞ºë[µ¿>PÂF/ã{Õ4¼³Ö<²lôd]}9Ïåë=5-ÌùrFϳìŘï¶m¶Î&䬟¦pØx¸%×OSHúö/ 1¬ä˜j[ˆcæùy/)Ž }(h¸ä×ow ~‰OFGÃÞ=VûIm%m(p̬|D… ãämË-1¢å÷N‚THô< ÓÀNñÉ)1z.9—Œž‹GÎ%ó¶oZº¹ËY1û*Á·þ&[K$ÎH—ëC†YAn$íj«
+µu.%…l`Ó2aŸ÷åî ¿n¬=ÏlIÝf{\u_“Ԑ^Ax~žq-)͑ÕzoæúR³†Þ³Ü¸¥—¹_ÊÇnùœ+I†¼,«é1…ìM@ñ7AE¨æ@ýVFL?-‚–Q«@LCá{°™ÆÕôR9E‰®Ïn¿Ëˆõ'MõvCöûÞ¹öÉx†‹,·Ž²0Ö¿ö‘ˆpepÑëHëwW«æ—.¹´ü\0…,‚ ‚ä2—B¶t½èÙè–Ç·tý©  T€œÞ7w ÙêOFÙ+\ìô ½~ž—e«Í‰'“ßGZŸiÕ>q€!ç$#q–MƺZ†Nk`sà mËNwô<˞ºë[µ¿>PÂF/ã{Õ4¼³Ö<²lôd]}9Ïåë=5-ÌùrFϳìŘï¶m¶Î&䬟¦pØx¸%×OSHúö/ 1¬ä˜j[ˆcæùy/)Ž }(h¸ä×ow ~‰OFGÃÞ=VûIm%m(p̬|D… ãämË-1¢å÷N‚THô< ÓÀNñÉ)1z.9—Œž‹GÎ%ó¶oZº¹ËY1û*Á·þ&[K$ÎH—ëC†YAn$íj«
u)ÍýÒ¸iAo@úÊZ
@@ -2290,7 +2290,7 @@
J
E’ÕÔB­¡j)ýœÊƒ
OgŸ
@@ -2301,7 +2301,7 @@
-Ö¼yȕPâˆt¿8Üq$23sµï%M·3d™\m>ðށ²ó]á€ø펒éF Ù}ߪùÑÛýש4¸æVà
+Ö¼yȕPâˆt¿8Üq$23sµï%M·3d™\m>ðށ²ó]á€ø펒éF Ù}ߪùÑÛýש4¸æVà
ÖhÕ[w@³4ç¸\iŠúävQù0+yݛÒfç3ÿ=:ÁÙ?NÆyÑp¿&~‰OðÑ lü’bYQAAPƒ B@!]nA)‡u{©ì/·$ÉfAA¤sxrì
r,¼„ÿÿÅochzµ:–⇒,ý˜Å´Õd2™ŒŒrfB‰:ŠÔœH ÎڈÙ3ݓC™LF
@@ -2308,20 +2308,20 @@
…,G<ØÁUº¦É_24päʵrDx.ìÿ”u½l%Vêæ*_ ¬ºo÷ä/z~_s\Wb#W®›É%›íu–X©¸<ã(K„ æb²ÛבâáDð9:öŽyÛ_빸§ôÚQï䌋&¥í?ϸ˜i&“‘„΀ã>’:š<=;½§:ëteåsG‘Ýֈ
zMWÑP`7óbߦ¹ÌxšM6€!ù£œ•¤MÑiÁ
Žu%çc–Ž}†Ú×á9wû¸õè\ZÎbCXhGڜùf
Ù«-5•·V/X`Ӎ ‚,ÒB¨ùïDäEÙ_S0’«bBåËæÕïbjÿgp=‚ ‚ G%/Š”³Ê¬VcÙaƒ4DŽ¨ SÍ0ÃCJ£°€Ë´B?òòBrþB8wïàÁ‘]Ž=F5I‚‚\Öà+pA÷Û§ý=.\äµÛ`\]ԀDª‹
-Iü’a²Ï„è7qCÅV(þ.þíݑ¸µWŸš[j¡0•q))hµ”f`‡F=ü-ïxzvzυJ™“¦8?﹌Ö&ßW‰ÁFΪO‹J+¦ÏRƘGW80x_íî¿v-M Ù÷ÛꖆîŽq_®r£ô,Fتñ͎–š¤OZ¤–g •¶°xA’M4k̑£{u;·õ?Õ¹qv¬EäßPdK·¼2è*AdÚßhg^r1䍱ÓŽËëåß+MþOCS¢F[m{ÁÕûž›*æ)U.îXkT~B9ö¯ŒœZ¸è[µ¾Ýð›½#!ÿ\×"֝žðé°bóÅu„ ‚ ÈmHøL¸ÄUß¼{^Èü’‘W¡±ç£ÃµÆ+ÎØ]Xßz<93kýÏí´¬"‚ ‚ ÷,òõ‰r
-Y I’¹Ÿ±<m³îu™26L™—Ò@ï›;†luƒ'£ì.vzÐ^?ÏòÛjsGâÉä÷‘ÖgZµO`H’é}JÛ²Ó‰³l2ÖÝÐ2tZ+˜Oh[vº£çYö|Ô]ߪýõ¦„§ˆÞ§´V‡'zže/Æü{·m³u–5A¥fî‘TÝ^-Ôíì®~®7ׄ¤0„EuT†"3à{Õ4¼³Ö<²lôd]}Efzåù‘Š‚pØx¤³Ùr ôT^âÁ…’¾ý H KRÖSþúP[g…õSÉäùy/)6°}(h¸ä×ow ~‰OFGÃÞ=VûIm%mÈIÀP_¥Ž¤*¾TWBLEÔUõ…å‹“L?çï{^ÛjÙ-µbò%p!ϽCÙcM®³çÕI ï T‹ùÞZøyEº? $¯™L†c“ƒï/ØF”a0S„\Ó9ù€;“ÉÄNúçu±ÆR¡¾òŽA¹˜½`àƝfk÷x¼Âv ­ ‚ Rš¢fz´÷k-ZL&“é!UE)ÚèÀüVøXgMws­î¾µu¯¹†=³ÝÁ—Àa1ê͵ã÷7ž
+Iü’a²Ï„è7qCÅV(þ.þíݑ¸µWŸš[j¡0•q))hµ”f`‡F=ü-ïxzvzυJ™“¦8?﹌Ö&ßW‰ÁFΪO‹J+¦ÏRƘGW80x_íî¿v-M Ù÷ÛꖆîŽq_®r£ô,Fتñ͎–š¤OZ¤–g •¶°xA’M4k̑£{u;·õ?Õ¹qv¬EäßPdK·¼2è*AdÚßhg^r1䍱ÓŽËëåß+MþOCS¢F[m{ÁÕûž›*æ)U.îXkT~B9ö¯ŒœZ¸è[µ¾Ýð›½#!ÿ\×"֝žðé°bóÅu„ ‚ ÈmHøL¸ÄUß¼{^Èü’‘W¡±ç£ÃµÆ+ÎØ]Xßz<93kýÏí´¬"‚ ‚ ÷,òõ‰r
+Y I’¹Ÿ±<m³îu™26L™—Ò@ï›;†luƒ'£ì.vzÐ^?ÏòÛjsGâÉä÷‘ÖgZµO`H’é}JÛ²Ó‰³l2ÖÝÐ2tZ+˜Oh[vº£çYö|Ô]ߪýõ¦„§ˆÞ§´V‡'zže/Æü{·m³u–5A¥fî‘TÝ^-Ôíì®~®7ׄ¤0„EuT†"3à{Õ4¼³Ö<²lôd]}Efzåù‘Š‚pØx¤³Ùr ôT^âÁ…’¾ý H KRÖSþúP[g…õSÉäùy/)6°}(h¸ä×ow ~‰OFGÃÞ=VûIm%mÈIÀP_¥Ž¤*¾TWBLEÔUõ…å‹“L?çï{^ÛjÙ-µbò%p!ϽCÙcM®³çÕI ï T‹ùÞZøyEº? $¯™L†c“ƒï/ØF”a0S„\Ó9ù€;“ÉÄNúçu±ÆR¡¾òŽA¹˜½`àƝfk÷x¼Âv ­ ‚ Rš¢fz´÷k-ZL&“é!UE)ÚèÀüVøXgMws­î¾µu¯¹†=³ÝÁ—Àa1ê͵ã÷7ž
Áè±ÒBö>Qݪ_kÿ&›pÏõ'AtõÌK=Tl ê¨gÀü‘¾WM¾=µ:Îþú°ëD¥vp…ùYc>õ^³¯a˪•„¥Ñcx%¸ã~µn½½pJèSa:ÚþFû‚†lÜèت)_Z߬PŸû¾"ÆHbÌi=͵›Ô×6´&µŽÉ³ájum Õs p»˜ñO–ç6ä'ãÌ.Gaù¢%;#5éð¶? –– ,Ër%Sfšß¢¬e\s\jŠ_DïøˆA–…d*‚ È2A™úًl"Úwƒê#‚ ‚”¦H
-Ù\fí³Ñ@t¨?iª·²öî{çÚ'ã.²èŒ…·äguƽj)À ,!é"rw °þµD¤`G‹ñŽ´~wÕIç¯Y^ºäÒòeܯ¹1ßà½@îwx‘X«‹¡XˆÕ²™Ð
+Ù\fí³Ñ@t¨?iª·²öî{çÚ'ã.²èŒ…·äguƽj)À ,!é"rw °þµD¤`G‹Ã±Ž´~wÕIç¯Y^ºäÒòeܯ¹1ßà½@îwx‘X«‹¡XˆÕ²™Ð
Ü4'Š"Çsþƒþ¥(† ÷ ˜A¤,•§U¼Ñ[èÝ_a}E ˜BAAb”K!›K%¡ ¾õ7u„èP¯Å@³ñpëÎ!à Á%)xK¸Î±)Ö½7lúÓØ­V¹] iW[•ÇŸ\‹J< \ô‡´mƒJ6ô%J.+_B²é,Z>r‘kµ0¾Í¢±O
Ãö3ŽÒmóv1™Þm‡õn.ÜúµA0ͦêwšw†òOòbåÔc>æk2Ì9ËçvFAn¾ý>û>÷¢T"‚ ‚TÄò½AAn-W3“Ò‹VzݸÃöòii󗪩 ñùƃyÏ»œó%§Z¥ÖPšb‹ƒï»¤€$Œ©nðL¿ô¨€$Iؽ~­ý›lTÿqŸùŠXAÖ½H÷™7ÒAP´Ñ]ÎOE«xÇ)uD?lõÿoªt«\"{”i.h•w#eþϨ%ù™×H“Ä
@@ -2334,31 +2334,31 @@
;)µùkëî«[H E}¤]Ý/÷«V‡Þ­Ûí´z“@®6xï@ÙÃ]á@¿®Öñ™}ðù\ì¾oUîG͆^î¼ ®…SipÝ/k.°, ¢hm¹¶ÀO¥Øt6Ž8•ô¿Òcx¡Wú8|(n*i¡ ûŒñ†axkIŽV‚ ÷2ÖíVéöV‘²oÈuö¼:‰áIUñ –õ;-¡‚ ‚ ÷8sÁ ä‹
}Üy'̟=`¿ðêwv6þy¤¯¥Œüe… ˆ¶Wۚ_j¦Æ
-Ðx›ts(üMë`~Ü<px`˓[|Ý>Ãƚ­5ä…ûÞ:ŠÔœH nÏJ`Ï8tOI¿[yßK½“3.:»}àç÷$ä|;•PO’ãp-u4xz¶£Óu¨’†’öu¤x8|ŽŽ½cÞö×z.–+ìà*]Óä/8råÚ±™ŒQîu–X©¸<ã(ã¾ü讳ÄJÝ\_W«îÛ=ùKÆqYlP²òyÓxìòŒ]#’+×ÈßZ\Øÿ)ëÚ[S›Ì’§ò´GoíV<Ç.ÏØ5¼¢>ô
+Ðx›ts(üMë`~Ü<px`˓[|Ý>Ãƚ­5ä…ûÞ:ŠÔœH nÏJ`Ï8tOI¿[yßK½“3.:»}àç÷$ä|;•PO’ãp-u4xz¶£Óu¨’†’öu¤x8|ŽŽ½cÞö×z.–+ìà*]Óä/8råÚ±™ŒQîu–X©¸<ã(ã¾ü讳ÄJÝ\_W«îÛ=ùKÆqYlP²òyÓxìòŒ]#’+×ÈßZ\Øÿ)ëÚ[S›Ì’§ò´GoíV<Ç.ÏØ5¼¢>ô
VsÅ²Ýê>4^R‚²>Òǚª…žù÷Û6ñög¼å«Î¢©ÒÒ9Hvv j4*è™à²z2ÞL&“Édf&ûÊ·€c—g22ÿºÚ·j²4I»â"0KLú£b@œ(¶óæ§=D¹ëÑétuŸ•ºÏ]€ ÜlÖ[–¬‚ ‚ ÷"*9ï|nÖ{ášàÿ ÇZc2o0À˨Õv-Ùÿ†Ûñ'c¸K×Ô#åÀ$~…’Kk(!Ùè›ÿkÌßl./Aîj8ž€ö7ÄÞ?÷Bºh5ÓjýÈË+Íù á¤Ïzø[ÞñôlGçB jnØ×Å¿½;C¢öêSs«ó¯ŽìŠòA0ªIRe€Ä/&ë%D¿‰––Ž\m€ÀA^½ÆÕäâEªä„:Š ºß>íÏe´6ù¾J Ö0ÒpV}ZTZ1}–2Æ<ºÂÁûjwÿµkibȾßV·4twŒûr•ý g1ÂÖPov´|5ÓkU*~bWD:*mùj‚ÜÛ¬%t²÷TrÈß&% ݽ#|&¬O–#ˬ$^ÍB±OJ”ï¸AA
Ø+˜Oh[vº£çYö|Ô]ߪýõfÅ"$Óû”¶e§;gÙd¬»¡eè´ÒŸQ„ëÀÆ#Íà®çÏCi}J!$}ûð›BRÖSþúP[g…õSÉäùy/égÒ>4\òë·;?ÄÎ'££aï«ý¤¶’¶
-‘Ä…f½ènª{ü±êº†VVë;®R±ï,¤zú‚c3rhNÙC#Ì&‡ÒÚb¾SG¡ÙB'ÿ‹B!tQ(!+@ø¯ð§>+CӕêØx²ŸåèufãSF£ÑhXiȪbªTî/1½ìRuoZ”ªÏåv;gkeúîF=ÀܽU<d¥‚{Ó½½­Øœûf•ªÃ"~ù—+ñˊ<»‡4MË«@¥íù&Êí2ø&šùïgŒ”å/8¿\»\XoP6r6žç>h4r”€ÛÀŽ²Ü8Gki¦ŠQ*ˆí÷³Æz»~*oÕ÷ÍKž§øÈëlùØ6õ”àŠ{kE¿bç[òDDJvTÇ2Òòݍf:÷µ–EIrÿ‘}`(•c•FçS©”ôI!gžyÿn&êúfHÿfŽE!„Pn…JȪ@ÿ¤Y¿É>g×Ù–£×™õ+õô2š^JÏXÉ_îO©˜^V©ºüÕçfSRN™>ٝ«XÆ!ç/¸—¿s/Ö§ä/â7;rV3Wu|uÖҞ¯5?w[>ˆÞáÔË,–ç
+‘Ä…f½ènª{ü±êº†VVë;®R±ï,¤zú‚c3rhNÙC#Ì&‡ÒÚb¾SG¡ÙB'ÿ‹B!tQ(!+@ø¯ð§>+CӕêØx²ŸåèufãSF£ÑhXiȪbªTî/1½ìRuoZ”ªÏåv;gkeúîF=ÀܽU<d¥‚{Ó½½­Øœûf•ªÃ"~ù—+ñˊ<»‡4MË«@¥íù&Êí2ø&šùïgŒ”å/8¿\»\XoP6r6žç>h4r”€ÛÀŽ²Ü8Gki¦ŠQ*ˆí÷³Æz»~*oÕ÷ÍKž§øÈëlùØ6õ”àŠ{kE¿bç[òDDJvTÇ2Òòݍf:÷µ–EIrÿ‘}`(•c•FçS©”ôI!gžyÿn&êúfHÿfŽE!„Pn…JȪ@ÿ¤Y¿É>g×Ù–£×™õ+õô2š^JÏXÉ_îO©˜^V©ºüÕçfSRN™>ٝ«XÆ!ç/¸—¿s/Ö§ä/â7;rV3Wu|uÖҞ¯5?w[>ˆÞáÔË,–ç
Ü\‚î¬
`ªýj}ž1z€‹¾­Ö–Hœ.nÙد­„÷œ»ä6Ï]‰¹v„ïÏ1U:úõ igÛҐ¯pξ܄+¾¶MiŒ!„Pò½üoÎ9õ7Rc҃Nz܅%8FB¡b(ŒeV€F«1o°Â$DN¨Z3SÅ05Œ~µžÒä˜À•¿Ü_Žbz«T]·J©>—»Þ]·æP¦ïÎÕÌÓÛò
îIÅúÊ>Rñúp‘[Îö ñ+)²q¥`±)r|‡nãzÿ–Í5SNJEѯAõ¿+;Å6c}ºßkM¿<iÕs>û¦iÐîg­ôםö¯§Ôÿ®Þ¾É~ï:„îµU–ø®­eÁ°¬¥ßŸÀ©@*•rí*J!ô
î¶mþ(d \)ù¦.õ¼ãê?Žÿ’Tk´Æ¬{{l53>Sðß6/yú fåþòt‰¦sATjý³õ=‡{-+
f³A–õÁmóG¡¶È˜g-\+1ÀÚ3D«ê½‚ÆU´øKÔ¿ßõŠ¡úä?öŒË݁!õÊÚäϝ‘›nóâé½{Î_²jH’ìÁ?:lO·\Þ¬_Å4—<ãã„é‹muý8£4·üéU6{Œ^‚#õ!„º/ȗv
Io$$h—kÍOšFcž1zÈ[ée—ª+½ú\Î ¥–é»kõçå3{[Z›¾èj
-ý¡nÑÄy[wcÿô\,â7›R¿²#7÷Ej'Ãëߗ?þ¼ÃÙY0 BèN+oŒpŒ!TqŒUÅ^™g
+ý¡nÑÄy[wcÿô\,â7›R¿²#7÷Ej'Ãëߗ?þ¼ÃÙY0 BèN+oŒpŒ!TqŒUÅ^™g
-'ógà,¦9ðn©’òÞpç\°rOβTŏÑKðò!„B ßü Ӑ®ì5!•Jñ۷ߕ®¿ºØ>žK\JߗR`Z\x÷’‚+\©T*öµ/³xlI‡0/½Eó‚dуÖòöÝp0êPþT3—ÈÅÄGónö¹ò>ªÿQÁ¬¯ˆ„›B÷g>Ó‹ùE‹ñU»÷X{¥œ‘zâáùJž¯8÷D[{›¾’„©šÒôIyaI2ÏCy”0¯ôh`¼õ܌Ÿrç!VÿÖôýj5 gìÛsþR⧄ô¸ðÕQýhÿzËTbâ›ÑõÕëÃ*sßé¡DìÒÑ?9ã‡\¦ñ+§QƒÝÒï¸Íי^‰3~KDšán“#%û§ýmïPdHz ·æ_î9lµ—ÒsÀw!„PqZ¾ÔîùÖ×ÐU`;ªV£‚îÑt.’ñH[nõʛD?q@ûéáø‘ ˆÖ*¯=yõ–üa‡ý6hË}[DsãûNöˆ»Ãæì9ƒIlŠŸ‚yoB!´ð©ˆ©ì~ÄTUY„~î\¿²#ÿ>rOÒµC)Ÿ²”&[¥R)‚ –:üÀvHcôæ-z£‰Pë
+'ógà,¦9ðn©’òÞpç\°rOβTŏÑKðò!„B ßü Ӑ®ì5!•Jñ۷ߕ®¿ºØ>žK\JߗR`Z\x÷’‚+\©T*öµ/³xlI‡0/½Eó‚dуÖòöÝp0êPþT3—ÈÅÄGónö¹ò>ªÿQÁ¬¯ˆ„›B÷g>Ó‹ùE‹ñU»÷X{¥œ‘zâáùJž¯8÷D[{›¾’„©šÒôIyaI2ÏCy”0¯ôh`¼õ܌Ÿrç!VÿÖôýj5 gìÛsþR⧄ô¸ðÕQýhÿzËTbâ›ÑõÕëÃ*sßé¡DìÒÑ?9ã‡\¦ñ+§QƒÝÒï¸Íי^‰3~KDšán“#%û§ýmïPdHz ·æ_î9lµ—ÒsÀw!„PqZ¾ÔîùÖ×ÐU`;ªV£‚îÑt.’ñH[nõʛD?q@ûéáø‘ ˆÖ*¯=yõ–üa‡ý6hË}[DsãûNöˆ»Ãæì9ƒIlŠŸ‚yoB!´ð©ˆ©ì~ÄTUY„~î\¿²#ÿ>rOÒµC)Ÿ²”&[¥R)‚ –:üÀvHcôæ-z£‰Pë
ì®C~ïk¦†¹×½»ÿx÷¦‡3kÊ çv~T0=Ïh[wÀÈÔ$tÎJŠ_¼=Uî[ªI†Í:בXdÇôûª¶Ša¦’35LÏ鶃՝.l³sÏöp‡Ó1½Á¼N\bh óÍù2-ÈÊjøpë9½`¤@ø¥{xB=æwÓ@÷†Ú=Ö
@@ -2371,7 +2371,7 @@
õílUó…ŸÆÆþó¾Nµ7XržÏ<ý‘tmè8¹uëFïš®æô7Fd¥iߟöÍ>pÊè5VŠÍ_¤/!:±Æ÷§¢¨š„Ç~élìÖ¿ÖÀOBÓ¬¤
@@ -2378,7 +2378,7 @@
YïÌ6ŠÔœNôM>sgºçû¥S‘õØ3vËI§Ÿïûç-×
RéÔeɌc_FŠÁWéئõGêù¸[Š o p}‹t[Çþ¢'^ráV*=¹ï6G<¬;zõ–CùÌîämŽxX7ÝÖµÀ¢G6ý;åx„¤Ž'/N„3%û$d“WoÙ5"ùð’£òϑûŽqÎõё8µÊ$Uácϸ«-]9ÏçÉ«·ìšdÎþÐ@D[ì†WOy’ ²ÝP÷u½ÀzηH×zá_S•Zø0±¤nßw ÇR5ØӉo^ˆí7Aο2*íÉXÂ^CJ{ÝøwŠRøSNDo,aÕL÷ˆÉPµ¡%ÝÏò0DS▋Îø)ßæýº\{ßØüÔEÀmÎü¼Ýü¦gÏëH²Ý°t1 \@q9œwQµ/%;‚ ˆ¶·ÛîÜ[:Bè~q¯.ÀˆÙׁ9/üpŒ!„B÷ùÒN¥´Ef*aXÎxõ¹^w0+îï+Bâá1Ô>Æÿ¯½ù”Ý¿);i£©}0ñ†B2ôøÓ­‰ŸÒruUúƒ}ÏùKVMÆy'´
¬í1C´ªÞ{ h\E‹¿Dýû]¯ªOþ3aŸ¡PÜwæ*þzÌ·cëz Ûþ"Áß`·ôOßÝÏ]Ž|ÒŸ58çrÏa«¡ÁÏ}Ù\ÌiA2iLç^÷ân+iŒÊÊS/ç±~•8¹jzyä@sÝ;ÃG£ìÊ9[[Ž¶ýԑµÚj¾^Ô[“éÎƒ7|œ¾ß<´;lþ '´±5ÿ^eµK€8 éL#‰Ù™FšJZN̎<ó•
"{^Ðv7eޒ|Ü3pnĔñ•†’r­
@@ -2393,14 +2393,14 @@
S­ÙüœÅõÙÈì}¥<.O
-X#JM¥Í.W^k•z.»ÏfØl[•´¿ä)~ÍR-Ag/r¾mî}`æTÜÔ¿nô¾Em5o•Ve•à+–Ú[xþ¤$¥9õó~C4U°Ø>Ü8ଋäêmïêñU?çèû<»ÌF‡Þíû×%ä§î&TuŠߛS»ù3¤#ohîû2»ÌF¾4oPþ\1õÈã¢o«µ%瀋‡[6öë_+áý­4·yîJ̵#l|ϝjÝçHÚÙ¶4ä+˜‰¯DÂ_HÛVü=Be’>=d½|– }3”ç´„Ï[ÏfáUB!„ÐNæʝôf~Ëýå¨Â—«Æ]©eëËëQ+o¾ÊG¼><—Ý‹±'€tn>2DŽ!dï+U¾†®¬¡ˆáºË –§_yJ,µ‡ ”Ô¥¿b³Gêç}Œ^ÆléÛóجyǔIC$q¡Y/º›ê¬º®¡•Õ:Æ·«Šª ›fìlÿ[Üø~)é2æÒnþL#¤!’¸àÔ'ӑ]I½³„ŽÍbÚ;´çUp<_M„ÁÒ¬Þ´gèϖ»ÍTd;aܯ{ô!U IDATñø“MÁ7§ï Õô†6ÌoCè¾Öêñn˗ˆ¯ ½=¡Žù‰z@ÜHI8éñà,Ñ?ǔ}Þf_/¢J!„B 8½yªÜh«Å›"MÓyR ÷¼»a­Õfèµ<Éð?„ZgTºkµº˜Ã.z’ól›ªÂéwO݌š÷moéwú¦ÊÖ1‡Ý4pž¦eë¼o×n¬óõ÷Ö?Ãp?„Z¦ͨ•—ü9Ò½;]+OJä2>!Â2R.èrÒj~àí®´p-XòùSŠ£fÀy8â}͜ü9ܺ1PÚî °ÞO®Ý2ËHÊ2è«ü÷En?>ʲÉßhkÀÞì~tmõsœw·Ó¸Š¯³¡Cžîoµñ‚ûæ0«_Á*y`©=T¶©±%„Ž ˆT*Uö}Ö,~ù%¹Ìž¹Ê=ÌΓ½Øàù4àùtÆ2V˜?+lv£Œ;•rÏ^>—vó!i³ïxXqœr±Á} à>0½@þP*‡-u‰ëãô’þÚû?j/;NyKÂgÂEîµÄЯ´\.ïîô—ܹ%‹ª·AÌçï¡ó,[ê^7Rc]»Êúâ!„PN™E•6†Š¤/u{„B¡‚rÓO!9žä'xz)§Üö:;?éÿ’¬zÊêùغÕìJ¥)½ïo‡£ãàèÛtô¸/¢A`]ÍÍþSg’“jão{ûý&
-@ˆ9[úÿ:œMí«Í}ÿϛf¹ÿ=‡ç³ÑëbՓV÷Çõ-Ï·H‡ÞÛܼ¯ôºXõä÷ޞ¾¦µÓV 8k™çFëÏ߬£2; ¶¾çp¯eE¾ÆˆŒ¬Í3Ò+Ä ~Ðܺ¯4)V=eõ¨ßütKîìÏ
+X#JM¥Í.W^k•z.»ÏfØl[•´¿ä)~ÍR-Ag/r¾mî}`æTÜÔ¿nô¾Em5o•Ve•à+–Ú[xþ¤$¥9õó~C4U°Ø>Ü8ଋäêmïêñU?çèû<»ÌF‡Ãžíû×%ä§î&TuŠߛS»ù3¤#ohîû2»ÌF¾4oPþ\1õÈã¢o«µ%瀋‡[6öë_+áý­4·yîJ̵#l|ϝjÝçHÚÙ¶4ä+˜‰¯DÂ_HÛVü=Be’>=d½|– }3”ç´„Ï[ÏfáUB!„ÐNæʝôf~Ëýå¨Â—«Æ]©eëËëQ+o¾ÊG¼><—Ý‹±'€tn>2DŽ!dï+U¾†®¬¡ˆáºË –§_yJ,µ‡ ”Ô¥¿b³Gêç}Œ^ÆléÛóجyǔIC$q¡Y/º›ê¬º®¡•Õ:Æ·«Šª ›fìlÿ[Üø~)é2æÒnþL#¤!’¸àÔ'ӑ]I½³„ŽÍbÚ;´çUp<_M„ÁÒ¬Þ´gèϖ»ÍTd;aܯ{ô!U IDATñø“MÁ7§ï Õô†6ÌoCè¾Öêñn˗ˆ¯ ½=¡Žù‰z@ÜHI8éñà,Ñ?ǔ}Þf_/¢J!„B 8½yªÜh«Å›"MÓyR ÷¼»a­Õfèµ<Éð?„ZgTºkµº˜Ã.z’ól›ªÂéwO݌š÷moéwú¦ÊÖ1‡Ý4pž¦eë¼o×n¬óõ÷Ö?Ãp?„Z¦ͨ•—ü9Ò½;]+OJä2>!Â2R.èrÒj~àí®´p-XòùSŠ£fÀy8â}͜ü9ܺ1PÚî °ÞO®Ý2ËHÊ2è«ü÷En?>ʲÉßhkÀÞì~tmõsœw·Ó¸Š¯³¡Cžîoµñ‚ûæ0«_Á*y`©=T¶©±%„Ž ˆT*Uö}Ö,~ù%¹Ìž¹Ê=ÌΓ½Øàù4àùtÆ2V˜?+lv£Œ;•rÏ^>—vó!i³ïxXqœr±Á} à>0½@þP*‡-u‰ëãô’þÚû?j/;NyKÂgÂEîµÄЯ´\.ïîô—ܹ%‹ª·AÌçï¡ó,[ê^7Rc]»Êúâ!„PN™E•6†Š¤/u{„B¡‚rÓO!9žä'xz)§Üö:;?éÿ’¬zÊêùغÕìJ¥)½ïo‡£ãàèÛtô¸/¢A`]ÍÍþSg’“jão{ûý&
+@ˆ9[úÿ:œMí«Í}ÿϛf¹ÿ=‡ç³ÑëbՓV÷Çõ-Ï·H‡ÞÛܼ¯ôºXõä÷ޞ¾¦µÃ“V 8k™çFëÏ߬£2; ¶¾çp¯eE¾ÆˆŒ¬Í3Ò+Ä ~Ðܺ¯4)V=eõ¨ßütKîìÏ
»+eF&r妗׺×Q]ÿH“ÞzöNçÄ¿s·uö
^5Ëõõo´õt6þƒÆòòì;»? ĈEK­GvZTGc›2w,)7}t§aëdoì€yvâ'2^ø¹é³z+=)o÷{•Ïô>åÚU췌¡âuìoã¾ç17=Bå”?7ýýuáŠB¡„|‰R`˜`Nåþ°
-’ͽ_©¥öd¡•õîõÚßr)}w§?í,!teï[ü0=wÈ3¬³\øWJža=ïîU»9žÝÕöz`à=B))¾„ì]¦,!‹B¡¼ä±µ"jzæ/ô'¹èÛÚ¢C=f=ÍÅíûõ¯•ž@ýª‘´³m©ÛÇ
+’ͽ_©¥öd¡•õîõÚßr)}w§?í,!teï[ü0=wÈ3¬³\øWJža=ïîU»9žÝÕöz`à=B))¾„ì]¦,!‹B¡¼ä±µ"jzæ/ô'¹èÛÚ¢C=f=ÍÅíûõ¯•ž@ýª‘´³m©ÛÇ
β’ïK¥öúpŒþþ×þN;ó†“!ï͏rð›Á²÷•ræ³%¥ïK¥ÊÿFªl÷ªÝœ k¦S½ã<2„B!„B¡<’Gæ2ç]©Ü_IUørº›¥ù° à6—|Xjoa*ø¾1;Ázb`¥R£Ï™½ÔFB!„Ð(|6|¯»€B!Ty˜ë¡y
ó‹ã«vï±>öʂ©¿ßµµ·é+çZÕÔ>˜ø)‘ø)qé|HÏ?%zW帢ÿ¿öæS9îpøÃF±9ƒò’ØÛÀuMà´«ø {âo°[ú=òöÜå¨og]\œÄsØjoðqÜh¡ÀDç!„Bh!(õ¾É_wQ%„BÝä1yUÎÕÒ½ùE‹ÞhâÔz†»ëßûšƒ©aîb?å¼{½…7*ˆ¢
]çUÖ´xæ
@@ -2414,7 +2414,7 @@
fB!„B¿fÐy†é—:é‰üéC¾SùÎ-úfHÿ¦E!„"yL>wnzPy¥>Éq}ÇÈUzþ\Ĭ¥õUzzM/¥aÖ¸y8)ö®ÒÈ/5«¬ýòKyø›¤[£‚"bÆr ,Î ðÁ/³@tB°QùŠ¬flïØ-DsƱ(,ÏÎ$Å£OfÝêôÑ àñE3²ÐŒL€c€µjÆmµKs܅ ))μ0ì¶}FÙ_ò$NgÏ/f¶ôôw¼mœKœâ"0
¿nÙT ˆ£ÅmŠB!„B…ÝwE•B!ô@yHþÂƌæ
Þ!„Bh!‘Çäs—’$™åŒµÖì|Ùb\mÔ×荫9§Ò@Ï»ú­¶¾¯£Ü5>v¦Ï^Ê\ÛjuEâ,û}¤õ¥Ví3û€dz^жltEâÇƺZúÏh ‚Ù÷Œ¶e£+z™ã.G]õ­Úg÷1
od®Ìà/ôР§¬øà}Û8°±Îw*Âq\ôk¿M>º
@@ -2423,13 +2423,13 @@
Õ¦º‘千a—´ÐŠ8VÄm&î±µ!•uð7¸ÂƒÚ‘º'tº'êFhGä+WÁ|‹t<Ÿ ¥ëÁ*Å)#>˜þé}ÛèÝ^§Óé컜§§ʝ¡ˆ]©{B§«^ë‹ëƒÑ“Åœ­È8ÂD´ýöòš˜Í°=Ðñ”¦ðvóı‰9TTºyöгÉ1·~!„B!„B!„ÐýA¡„l¦ÛSO”'žGûý¬±Þ®OçÃá¿o^ò|<ÅGrE&ó-y""å&ÊϱŒ´|w£™¾³iA´½Ý†%dB!„B!„Zhä1ù¼³é%S<.ú¶Z["q¸x¸ec¿þ5ϼtýj´³miÈÇ
-7Ÿ\»\xeŒB!´„ÐÝ»QìÖÅMg'Å"ã©UêÂÀdqኞmUdç¹{€'PÁ=:9º7  qRT«Ôe<_´=Üø"­©Ô$'’t^˜A¥†I UùÜû2…FB¡üä1ùù™MP‘òÑŽÑÏ/)7ý½îB!„Ђ@Òó|©¹ð5.ð.ðîÁ‚ïá»G–û\³ Ô*urBLN@’Õé|'!ó9B!„Š‡Ãô!„B¡_?¬ÙƒÐ¼ˆ^æÔâ$pדãÀ_gA05‰~Æs¼e!„*šŠ ˆ©1 bö•+÷é·o²2 s/º‡B!„BóD(zËâ¦3 “ÅF$UÅÍ{žïœ-Eöpž»xÜ£˜£{“*&RE–ú|ägNSIŠ“¢j^ä“"$@f>Ç[{B¡‚ä1ù|ü^ðñ3kLþæ-†ù•~~ â.5E„Z³AàÙ }k¨Ö’'¯Þ²/#af½4µ>%IJW©5Æg­û{ìSiþ‚È "?—׋Ù,ýÔ v#úžaí‡ñÙý·~w#¸†Rê¡Àtn6w_
+7Ÿ\»\xeŒB!´„ÐÝ»QìÖÅMg'Å"ã©UêÂÀdqኞmUdç¹{€'PÁ=:9º7  qRT«Ôe<_´=Üø"­©Ô$'’t^˜A¥†I UùÜû2…FB¡üä1ùù™MP‘òÑŽÑÏ/)7ý½îB!„Ђ@Òó|©¹ð5.ð.ðîÁ‚ïá»G–û\³ Ô*urBLN@’Õé|'!ó9B!„Š‡Ãô!„B¡_?¬ÙƒÐ¼ˆ^æÔâ$pדãÀ_gA05‰~Æs¼e!„*šŠ ˆ©1 bö•+÷é·o²2 s/º‡B!„BóD(zËâ¦3 “ÅF$UÅÍ{žïœ-Eöpž»xÜ£˜£{“*&RE–ú|ägNSIŠ“¢j^ä“"$@f>Ç[{B¡‚ä1ù|ü^ðñ3kLþæ-†ù•~~ â.5E„Z³AàÙ }k¨Ö’'¯Þ²/#af½4µ>%IJW©5Æg­û{ìSiþ‚È "?—׋Ù,ýÔ v#úžaí‡ñÙý·~w#¸†Rê¡Àtn6w_
îœÊl#°¦GªÅ׿8ªiÏ0÷ÉBó!•J¹vå«Ù‹B!ô)zP¸ÈáÔRŽßtQъݰØÎo÷OàœÍï ÌÙ½I åU¥<ǓŒÔ*µ8)â*5L
 ˜œù!„BES¦n
ݟùÌ/ZôF,g¼Çú\¯;˜¿Â‘zâáìí;+yÆÇ Nzª9uý˜]ö§çü%«&£?äUüu6tijÙT}41æXQzçóvÃÔ>˜xC!züéÖÄO i¹ºŠÊÓC’¶ýÙúøÖ_³-#Àßh‰kêÇþl£&Lù"„B!tGqãjÑ%dB¹„H†­«5É Qy1ý!RÔ³ž#„B¨XªT*Å3s5fŽÑsj=CÝuÈï}ÍÁÔ`ö›9iúÖ÷áˆóc³ô’û»K½Ê+þК¹¶Ša¾6W15Œ©Ö¢™–>ÇHÉÓ¥ tƒ¢
-ÌѽITjqRT«Ô%=ïÿ–ÓkAà'DA$E‘Ÿ:.õìñÖ^„B¨ yLþ¡œ«»¤jô£)­Öè]Ÿø¸+\Î]‚û†AŒÑÖwÖ/åE®‚`Ox 4IT¦—1ùf»Û¼g»^L$izµ9*Ý'°® EI™\lÁK BDßHÀ¶Ž!‚Zap÷³@’$l~t‰ý[~: ER@!ϾÒÑÉ}É|™µ*“éNöˆ[~Ú6P_è8YÿäN^ì,ãËùíF&ÏWƒšÑ–¶únk÷P93ýÑüQú=D!„z‰ª¢ óù(2àìžÈÝÞñ_;èJ²¤î‰ ꪫC‚Ô‡ÿµƒ©$ç·{ŠI±˜Ç]8sùùÿ#žÿx§»§i÷’žsþ7-׊"ˆ“jqRm†›áÄÖÿ‚ô5CÑßI „BHi˜¾þekôûxè2ˆßDŽç.óŸ‡,«õ9§ ÄØ^ùïᶃƒcWÇ{}õ3¾0·ìçzñD4hü¥¿Îâ•ö5˜º¿¯
+ÌѽITjqRT«Ô%=ïÿ–ÓkAà'DA$E‘Ÿ:.õìñÖ^„B¨ yLþ¡œ«»¤jô£)­Öè]Ÿø¸+\Î]‚û†AŒÑÖwÖ/åE®‚`Ox 4IT¦—1ùf»Û¼g»^L$izµ9*Ý'°® EI™\lÁK BDßHÀ¶Ž!‚Zap÷³@’$l~t‰ý[~: ER@!ϾÒÑÉ}É|™µ*“éNöˆ[~Ú6P_è8YÿäN^ì,ãËùíF&ÏWƒšÑ–¶únk÷P93ýÑüQú=D!„z‰ª¢ óù(2àìžÈÝÞñ_;èJ²¤î‰ ꪫC‚Ô‡ÿµƒ©$ç·{ŠI±˜Ç]8sùùÿ#žÿx§»§i÷’žsþ7-׊"ˆ“jqRm†›áÄÖÿ‚ô5CÑßI „BHi˜¾þekôûxè2ˆßDŽç.óŸ‡,«õ9§ ÄØ^ùïᶃƒcWÇ{}õ3¾0·ìçzñD4hü¥¿Îâ•ö5˜º¿¯
˜µ´~¥ž^FÓKi¨ÈÞ<œ­«4òKͪÃôruV’v@tB&"bÆr ,Îa":cãevic¥c(#HíÒ|ßçK—§‰?¬€‘ (fߒßO'œ ï›?°ÏÞ@³TKg ”ËÛ
@@ -2437,13 +2437,13 @@
o¶¶Ë»{w…šöÇ~ºàÝ¢îþƒ#3`öcrÜæìf—;‚ß ]Š z¶hº~?}½íøKrßñÁ¡P/3²5ú3—÷
Âk'¦æÑK÷ßcÒ„B¨D
JêFJ=ô;ÌÃ*Ë؟m@Õ4¶ûêê͍WYÓâÒâ#„B!4ïäìg’⾪é—PU 0 N
BrXXÿXuæ^QêÀ<ëþÚ<ÉIÔɑΦN6 jÐÚ;Z5é iõR;@{|B0O-OÔXÚG’<¥QC:éÔœÈ'‡ÅŒPin~@3ïÚÞÅ&E5­Íêdz÷©#`©œê|åˆO´†ÌyŒEoöá7ü^,~ºúü\8Ç+N
®ð ÛØR÷„. šÚW›#ÿ¯À_ôy ²ã™ªÖê%áó7ë()`Ý]ÉIµþÙú`´7ߞ‹M_t5µþ¡îÀŠUOY½ýÓ%g…‰hû;íy†éÍã՝ú²o#•´>ýx֒£Wo9–‘3V©ÔÆg­'Ï'ì+r\À™?ˆ|¡uu}ÔÚÕ<.ªÔU«ŒŽ?z¶gtÍߍ<röÐrÎÕrb´ç»(5õ{bÙ;TdIÅÍë)µ 4/‚h{»í^÷!„BhA+•0<
-Ž§Ò/…Ñai­Zc€ ‰þœ$Ä`™åŠ¦Šc©“œ­±³ãøPïS4ˆÉPõÓ·Þ\ꗒ ^€¾’„‰ˍJ­’Z™NzCU œ,ÒH}2ìþ(âél®khï8>ԓ«9y÷&Òcýb2œîC)'p¾<hN÷ŠItÃO[?‹ÙŸd€äpדÜ™©ž¨Ô0  Räòs„B-ï0=I’är’”Æè Úï‡W=±Ý>é%ÿ}3h¦ó«˜wøؾY¡o؛½Ðà;™µižþ•$óvr™]~éf§7ÎPy_Û{~Û{þŒÍšgo“3ɸS)wÎøy’‰çÏ3žµÖ¶ÓkÛ9ûPŠíFzƒ\¢ØW}©T։'܌ùJg!„B¡;*•JqWÒ5Q½oÕÖmÛjùÿömÐÓã?»wL%íTÑ{žÑØwxýï9´jqà“֮ϵ‰ïüŠA•LòÉI'E˜n4êÿÀü$HCªî¦®ªýN¸înÍS´*"döòTôžg4­M]G÷:i5ïßí¸îð(4G©¸ 4äŒOi\M]ÚýN8ß.—b[èAåûš&-«´µ«6)²ãIn’IA1=Yþ¶àvÏB!TA7Rc@DîñÓBc.ú¶v„èPYOsñpëÆ~ýkŠ¹bB!„Bèî“3„0oöö@—·ms븨]½Áý©s¸¾KZë8`w»ì/HNªõOYŽ~µ¯˜€ÙTÌÑwë]ÛmIQ»ºÖÙÞ[ûÃæµO7ÇÂv8ºZêëÆ'ÀøB}ð@³¼“¼\ÿl}à@£<3é8 ŽÃn—{«u}rR­ÖztÀ j8ùncëTsmïöÕþ`[ûts"êo|JÛi^;|z¨gµ&#ÂQvWçfËzÔÆßÔö7–z ºï’Àܝ€ çx•ÝDGù®/“ôRµ~¹&¬LæÔ IDATþK’K—äǓ
+Ž§Ò/…Ñai­Zc€ ‰þœ$Ä`™åŠ¦Šc©“œ­±³ãøPïS4ˆÉPõÓ·Þ\ꗒ ^€¾’„‰ˍJ­’Z™NzCU œ,ÒH}2ìþ(âél®khï8>ԓ«9y÷&Òcýb2œîC)'p¾<hN÷ŠItÃO[?‹ÙŸd€äpדÜ™©ž¨Ô0  Räòs„B-ï0=I’är’”Æè Úï‡W=±Ý>é%ÿ}3h¦ó«˜wøؾY¡o؛½Ðà;™µižþ•$óvr™]~éf§7ÎPy_Û{~Û{þŒÍšgo“3ɸS)wÎøy’‰çÏ3žµÖ¶ÓkÛ9ûPŠíFzƒ\¢ØW}©T։'܌ùJg!„B¡;*•JqWÒ5Q½oÕÖmÛjùÿömÐÓã?»wL%íTÑ{žÑØwxýï9´jqà“֮ϵ‰ïüŠA•LòÉI'E˜n4êÿÀü$HCªî¦®ªýN¸înÍS´*"döòTôžg4­M]G÷:i5ïßí¸îð(4G©¸ 4äŒOi\M]ÚýN8ß.—b[èAåûš&-«´µ«6)²ãIn’IA1=Yþ¶àvÏB!TA7Rc@DîñÓBc.ú¶v„èPYOsñpëÆ~ýkŠ¹bB!„Bèî“3„0oöö@—·ms븨]½Áý©s¸¾KZë8`w»ì/HNªõOYŽ~µ¯˜€ÙTÌÑwë]ÛmIQ»ºÖÙÞ[ûÃæµO7ÇÂv8ºZêëÆ'ÀøB}ð@³¼“¼\ÿl}à@£<3é8 ŽÃn—{«u}rR­ÖztÀ j8ùncëTsmïöÕþ`[ûts"êo|JÛi^;|z¨gµ&#ÂQvWçfËzÔÆßÔö7–z ºï’Àܝ€ çx•ÝDGù®/“ôRµ~¹&¬LæÔ IDATþK’K—äǓ
?Œ „ByÈcòó5LZ p˜!„B–ºúßÕßë^ ôøߦG!„ò“ÇäU©TŠ
å=G!„B¡ûZà”<_^ánàR”sã¯ÒÝÆs¾ ¡…ɵËu¯»€B-hò˜üC÷¶¡;Š ˆ{Ý„B¡ˆt}`¯ ©TŠçؾý%Ñ¥ïK)PLι؜{,^i9B!„z0¦ç¯ñÞý>–eïNoB!„BèNÀ»‡B!„Ђõ<Ùvö¬[üGü̽ÿD€e¹»Þ7”M¸Èüy® Üm#+ÛY.sainO?-3‚ö”¨ ùÛ3FwHÊ&¿ä¿m&‚ªñdnCdYL™79c7§7®E\zIE3Ž]>¹•Ù‡yÞæÒ(܌˜ôÎtÌËAûs²‚ S¶&Ü:{МƒÒ÷å_îÔ"™M „B¡»Å÷±Ï·ßçùû=·s‡ó^w¡_¼µ!„*Hþs©RÚB¸)tæ3¿hÑM°œñës½î`VÐw«‡¨€¶ö6}% ›?
@@ -2454,10 +2454,10 @@
S
¬«ÁB‘ARæ[èҎ ˆ¾‘€™¡ ïE§cR$Q!ÅLï=ì614AmpˆÀ¬ëݬd2¾S^Ó
-Š¨ m»ì)¯©&½¯ëàԐ®BCyúY8¦±>h–N,½ÆâûÛxfÌÀ5ZLÀæG—d'½ÉuzÙS^‹‘!+¢‚d֘½Ÿ³@’éöoùú#sÛ:† j…ÁÝÏÎ>‡™¬×'/Nïß×­^¾ÃF¥¿
+Š¨ m»ì)¯©&½¯ëàԐ®BCyúY8¦Â±>h–N,½ÆâûÛxfÌÀ5ZLÀæG—d'½ÉuzÙS^‹‘!+¢‚d֘½Ÿ³@’éöoùú#sÛ:† j…ÁÝÏÎ>‡™¬×'/Nïß×­^¾ÃF¥¿
@@ -2465,16 +2465,16 @@
B2®Ý9s “=¯é‡wû@à|¡¤Ø³…I¯áÃ]£bÓÑÇ%Uc%t}8}aÚb¨ÖM©~b}÷ßaOçô÷£7–ːˆõN¯+·ÑþqqÃTr¡©³Äûÿ§Y§[Ë¿¸gèc‹tÞôOÕZ_÷ÞúwêÖÕDsMÔöôÖ|Ë@SµA¼~ϑA!„º/dOìUAã–Æ’îùæ7šÕ*µ†Ò(UïÊy÷0üÿìÝLWº?þg"ˆ<(YyD+©2(T7‰:N»*f[%涺1mô Î"§½
¼ë ¢¦‰ÌøÐ…N4$Ï:{s2–ô¯[Ý/qLˆˆ¸2m¹Çæþ`Xˌu_$*2i‹t|
]ÑÌ=\â D¡( )¢z£ßü ¾å«h÷åQߎĝÊçý~g­™Í'¶Xhqû¢c}¾Û™÷Çå Ùþe÷_ĶԨJwÈñýãQ¡T0l5ðEüüÆŸÎðÄj\Ú§Š³Ëù4í\K
-`ýržÐ¯Íç‰þ­ÉöÉâÖN›óÐ-Wê""ºí»CöÉ,½¸6’Çñ:MŽs‰hÁä.Í}}ôö~ã½9%¿.ÓϦ§|Òê´æ2“õI½0é8a³ ”
+`ýržÐ¯Íç‰þ­ÉöÉâÖN›óÐ-Wê""ºí»CöÉ,½¸6’Çñ:MŽs‰hÁä.Í}}ôö~ã½9%¿.ÓϦ§|Òê´æ2“õI½0é8a³ ”
ÎÜÇÑnšh¿žî3빚ך£?Æ=e»vé:kgD
-ÊA¤—OÂf!2¡;ähs¾åäŠ8N7Neyz8ë«iž*ÎeÑOÓ.)€öËzBwÞu›/½mé}Þ¼¨Vç>të¯%"º3«*Õ§Èq.-ö‘ÜE£·«D†4=˲ÂFÁRf²ï1KÛ$±T”¶Ii§ÒQ×k»{-•=_”ñpðBµjV6¹Áâð‡dùª¿á©ÝcKÄ
+ÊA¤—OÂf!2¡;ähs¾åäŠ8N7Neyz8ë«iž*ÎeÑOÓ.)€öËzBwÞu›/½mé}Þ¼¨Vç>të¯%"º3«*Õ§Èq.-ö‘ÜE£·«D†4=˲ÂFÁRf²ï1KÛ$±T”¶Ii§ÒQ×k»{-•=_”ñpðBµjV6¹Áâð‡dùª¿á©ÝcKÄ
hH»
@@ -2487,19 +2487,19 @@
Ã0‡kÖòÛӔ«X=
×n¾ýN•çƒAv½X᳇ý–´ÃqùÄ0L×ð-»À¥vå,ãRÕù[xRÚk+û¨Q¹8k,"šõ7£*;ßõ̯{“Ú>u›ˆ‚Xú¿}4;#œöïP†aº.gÑÎú|u¥KDjÐôÀNyk•ó»´•þ({Oµw~C‘+âd9wN<D¤†=…‰Ñí<ñŽöH³~ÏôgrÚýá!›Þ¢Uý:9Ž8ðÇ@ɜ|Æ¢73ò§_Y\q°ÔûC
²Î6zÙ·Y³€sçÉôHîÒàÑ[€U‚!¢[±QÊ0»dÁTçË\g¼#?FµºÍ–gí]o9¸|¢Û~óÞ߅ …¿ ²zÓüW̸~Éßc¿–8án¨ráyE¾¸¸ZLÙ¹´½AÛ¦û•¦Çlz€¸ôOO‘<"+c
-òIØ,h‹´ÜºŒ q]qhöòÞ.“È+!_ÃÞ^ñÙþŸ/HøÕby{cQ‹KVíÂRòìñGo{~9zX”™ÙôÈå¬HÍÇ•«aL`€U®ÑWýŸªåŽ`µðœó`6=@NÉÙô3KÈ*Wù΀_%üZ pwE>–.|=ȕ–pbðzØPúëþMKÈd—,Ì8Sô_œ÷ÖÒrôDôkÏÑÀ­Yîî;L¥€_¬5ÉÕ&V•ðxØyÜ%Ëòr°!ېSòë³é`5Rêû#·°]tâ‘ee¹Ãù™Èç*™|><5kgàˆå*“oÃßÔ1 Õ¶§¶aæXϙöك·g¨ã~G™/f†áxÁvĕ…aϸšÚ›:Ã]Ú tÛoí³/Q5°s²êóÅJŽeXŽ·ý·'ç~»hðß&€ŸÒô°òÍI
+òIØ,h‹´ÜºŒ q]qhöòÞ.“È+!_ÃÞ^ñÙþŸ/HøÕby{cQ‹KVíÂRòìñGo{~9zX”™ÙôÈå¬HÍÇ•«aL`€U®ÑWýŸªåŽ`µðœó`6=@NÉÙô3KÈ*Wù΀_%üZ pwE>–.|=ȕ–pbðzØPúëþMKÈd—,Ì8Sô_œ÷ÖÒrôDôkÏÑÀ­Yîî;L¥€_¬5ÉÕ&V•ðxØyÜ%Ëòr°!ېSòë³é`5Rêû#·°]tâ‘ee¹Ãù™Èç*™|><5kgàˆå*“oÃßÔ1 Õ¶§¶aæXϙöك·g¨ã~G™/f†áxÁvĕ…aϸšÚ›:Ã]Ú tÛoí³/Q5°s²ÃªóÅJŽeXŽ·ý·'ç~»hðß&€ŸÒô°òÍI
­çoÅÌ\ºsÇ=öÏ,°¤A)ìcKÚÕ°/1âPa¯—(:öÏHêRfŽ¾u?ÊQð˜±üT]8dϲŸˆLÛ>¬š±€ë]sqÔ¬å·ãV¤ÇßÀlzX]:?:ɕŠZÉ"
[KÙøY·~Šq.a˜îà°E;ó/hÄ[b¨OĹ´A‰ ,S;<éàgý{`ÎPÃý…OOÆblâhOÁ†±X,ÓþÄYŠ³ ÄSe‚»À0LãáF½È"Y˜³é`•É#ÓѶE”Ïô|á“Ïô™t¼¸Eä‹y¾ˆ§y¹f_$jÙªM¾ÕnµLo²üD¨¥Úl,3™7;N ¥ž•¬¨Îò6"
^»´;?Po)/yð¡.ñ`Gð˖œAÞÍ ¶}ÂЩÜåãÿy¾ùq¥\_Ph´ Mg]»ùìû‰H>5$ì³eèàÞcb±X˜”åà>šµ„lªéÉï™rôDèuËR•ULÔà _­+|" û3µ_à:®p—TÅU¸Ã¯)toيYó··êr=
@@ -2509,7 +2509,7 @@
˜µÌٛ“Öbv!—"rÁ¥¨v~º[Uv|Ó¤ëòwmʸyšù‡Â?ÊޏÚ÷KNÚ6->Ȭa›ÎŒ‘ñ>ôۆákÃñýšÍ\–YÞzémËC(ïv´²˜%"w9¤­}»’›0fïV9¤é`åc&Y÷&5G¯iD#«ã”Ûù¬M(–7ÎûÍyÌyŸ/Píÿѹþ8dÇ«üÍ¡ÙêŒþ½!µn³ §Ï¼' ¥‚±Ì,F…ú½.ېã‡ÁñGD¤Žëâce
Qt`ñÞFÙ"\oôõÖ^hÞ/oiîÙ¸èÈ`UBÑXùR'öt‚åQ£ë#·°Ç¢Ññ‘ïƒò™^S¯]§Q"
@@ -2536,10 +2536,10 @@
ŠÞÀʗ:±·ó£“\©¨•Œ!¢Ñét´]t¼ëR2Ì©ï?n7l↤ʞ‹îdoò9§YØ|†Ég…í&çg2M×f‘?i7ð,“Ï÷؃9ËÌL…Û_¬ä׳ ËŸ© „»#WzÍÛy†a¸M†–^yVcŽeòãÕä5ºÎ9›8&Ÿ­<â‘Ï9¥<Ã0opœ &ÛÄ+É0 Ó3ä©|T˜ÓùüÂ2q–wª"Wòô…„::5%rôDòŸ¢ɹïúý桶ÎlWš§!ÒƇjø|¤åƒÚԃœØ2|mXZ—ëv-}P
¬|³rÐydÚ"Ú¶ˆò™¾‘/|ò™>“Ž·ˆ|1Ïñ4/kì‹D-[µÉ·Ú­–éM–ŸµT›e&Óãflj¡Ô³’µÑYÞFD‰Œ…oÔ 4¥=qfû¡Äï²¢¹³ûãJÎ2_«'¢¡‰ÄQ]ÞLK!̓³Ìï<;éÆèÈQÿm
@@ -2561,7 +2561,7 @@
FUu"0{¿5ÞO¦ý ¸ò¥œåBÔ ”è¡&a­žˆ†&2¿ØöK`8Ô߸5b}ª}þ!á÷=DÔ|Xº›NÒ
EIÈ[XÓ<¢# ìV¤é`å›5©9Ÿ´:­¹Ìd}DR¯L:NØ,¥‚¸Mä´i¦ýJëÈû}$ù6òƒ/±¥ÊóóëîÀ€ßÑwúíšÔ³zƓU×{ˆÈ É1a|N{ã:–]g "ÏÌ~2ïÏ}–p– ‰G2üSlÚäàåÁ6!c$‹m¿4m>ýoëþæ®àzÿ:ÑåÑ؝…õ{gŒòtw¬Hk°ö:¬6,Ë
-…•¯ôÚûZˆ4DDëçߪuVï,X˘jZėûwoÔè°ÆÏê?H6“¡ÄX1´±æ¼Ï‘¾ëç_bmO$Úû½öøN‡ï|n¨b‡^¿£bˆ·ù¿tdߟÒÎ~!v¯ßšç¯Ø¡×—ìt…ÄþÀÙøþCmn()´~ž³©½:hzµiAW±†=͏hs·»GØö C§Tn^>5$ì³Ý]\°1Dt+6ºÜaÜG³–M5=—<SŽžˆ½nYª²Š‰z8á«u…O„ba¦öi×ý%Ëð¯îB–‹ª¸
+…•¯ôÚûZˆ4DDëçߪuVï,X˘jZėûwoÔè°ÆÏê?H6“¡ÄX1´±æ¼Ï‘¾ëç_bmO$Úû½öøN‡ï|n¨b‡^¿£bˆ·ù¿tdߟÒÎ~!v¯ßšç¯Ø¡×—ìt…ÄþÀÙøþCmn()´~ž³©½:hzµiAW±†=͏hs·»GØö C§Tn^>5$ì³Ý]\°1Dt+6ºÜaÜG³–M5=—<SŽžˆ½nYª²Š‰z8á«u…O„ba¦öi×ý%Ëð¯îB–‹ª¸
wøãE²³³æooÕñ÷¸ÎÏ/Ã0‡±„,@ÉßQ×àW.X½ò§_Y\q°ÔûC
)!_ýÞ^ñم..
@@ -2577,15 +2577,15 @@
4ž<?zsÔs¬ÆUåHPeCU“¼¹nðÚèè?‚Î縦jsò,óq¥ÛôKÿì­0gB¾¤~²÷ßSmtKý—‡Gƒ—,y¾òõD¤ª*ýÇ-Ï£\êv¦öÙUžP{þôKc½åæöœ2û’ƒ;ÿã¨å˜gôæèùjÞ³—ÇÿӐ) v±ã­ŽùÝp’SZ­û<ñπÖS²ô†#yÔ}Ä'>×EDÒöèØɞ”
5û~"_2„ÞïKÿ)À/CD·b£ËÀ}TÈègêÞ¨äù›ÏuÑ'ì±ht|äû |¦×TÄKH’$¶(Ö¹•«ýt¸çq>þV¹hÓ?ыňÔÀPˆÛjX""ùBK‰ùh,SÇ=öŸ½9i-f‰HUz
ŠY"šÙž
-gjŸ>Ü9÷l80<Øô’:VbcÌ<Ôöé ý#KsÅÜbÈó¿h¨øªJ•ÛUÅU oüW̸žˆˆÂ>¦°¢ãÛa[‘†ˆ*ÔG_ 7RÚYÞyº³Áak)?ëÖO1.ÇÅ0LwpØ¢ùwN4â-1Ô'~º–6(‘ej‡'|ʕN…Ýt8ÚNJ;ú?p°D4¥˜ž°š^ho{ÎL¹ó棌ªâɸ?þa)΂WLûXÃπa˜Æ͵kùí¨¹^òwÔ5X{V—<2mm[DùLßÈ>ùLŸINj[D¾˜ç‹xš—ŸõE¢–­Úä[íVËô&ËO„ZªÍÆ2“éq³ãÄPêYÖéä2Ëۈ(0‘¥ŒÌRúÉÒ¿:á=”œó½VODC‡_lû¹ۈ(U³_Èì+6 ûN‡N: <oÜmíý:²ä0¤7£#Gý·)ÔáÒníHäè‰ï:ˆ¨iG‰^¯×ëõC:ѐ<ëìÍÉXÒ¿nu¿Ä0 "âÊ´yä›ûaYˌu_$
+gjŸ>Ü9÷l80<Øô’:VbcÌ<Ôöé ý#KsÅÜbÈó¿h¨øªJ•ÛUÅU oüW̸žˆˆÂ>¦°¢ãÛa[‘†ˆ*ÔG_ 7RÚYÞyº³Áak)?ëÖO1.ÇÅ0LwpØ¢ùwN4â-1Ô'~º–6(‘ej‡'|ʕN…Ýt8ÚNJ;ú?p°D4¥˜ž°š^ho{ÎL¹ó棌ªâɸ?þa)΂WLûXÃπa˜Æ͵kùí¨¹^òwÔ5X{V—<2mm[DùLßÈ>ùLŸINj[D¾˜ç‹xš—ŸõE¢–­Úä[íVËô&ËO„ZªÍÆ2“éq³ãÄPêYÖéä2Ëۈ(0‘¥ŒÌRúÉÒ¿:á=”œó½VODC‡_lû¹ۈ(U³_Èì+6 ûN‡N: <oÜmíý:²ä0¤7£#Gý·)ÔáÒníHäè‰ï:ˆ¨iG‰^¯×ëõC:ѐ<ëìÍÉXÒ¿nu¿Ä0 "âÊ´yä›ûaYˌu_$
"i‹t|
]ÑÌÏÆ%
-À¸ŽÍ~!³L);¢ûœOVÏ[ö‚êÃ`ùºš"MÉ`ë)Ù|ܖÜßú§Ø48Ó×h7M ´_O÷ϒõ\ÍkÍÑã•aØ®]ºÎZWêñp¨½ïë!ãÃÚ4çζÔAI—Gcw’7'\±c?=wZ¹Øc•øäªÜÓ~̝҅?1Óþ„;c”§Ë9,/¤é`å›3±—eYa£`)3Ù÷˜¥m’X*JÛ¤´S鉨ëµÝ½–Êž¯Êx8x¡ÇZåM¸ŽÜ¡hTU§H ù[k[ˆ(<•8Ø`qøC²|ÕßðTƒî±ŽlÙæ%õ“­ÿ|¡k—Îlk \W”AסòrKkòøØD”ælgmŸ‰#5€]]|~Ž ™}ÉÑý–rׁð¸¢Ü˜®Ç’% UvËXß¿¹Uj®ôNhºþ-‘ÔVo8½‘hs“˜lÃòuUE÷+¾ô]¤¬I`ûØÃ}ÝdØç运¯û{¦VÝ®6;Ÿã–ÜÍ UEÿXâsQþV?Õµïáýþ䋈X-´¹Þúf|C‘Cþ–ê
+À¸ŽÍ~!³L);¢ûœOVÏ[ö‚êÃ`ùºš"MÉ`ë)Ù|ܖÜßú§Ø48Ó×h7M ´_O÷ϒõ\ÍkÍÑã•aØ®]ºÎZWêñp¨½ïë!ãÃÚ4çζÔAI—Gcw’7'\±c?=wZ¹Øc•øäªÜÓ~̝҅?1Óþ„;c”§Ë9,/¤é`å›3±—eYa£`)3Ù÷˜¥m’X*JÛ¤´S鉨ëµÝ½–Êž¯Êx8x¡ÇZåM¸ŽÜ¡hTU§H ù[k[ˆ(<•8Ø`qøC²|ÕßðTƒî±ŽlÙæ%õ“­ÿ|¡k—Îlk \W”AסòrKkòøØD”ælgmŸ‰#5€]]|~Ž ™}ÉÑý–rׁð¸¢Ü˜®Ç’% UvËXß¿¹Uj®ôNhºþ-‘ÔVo8½‘hs“˜lÃòuUE÷+¾ô]¤¬I`ûØÃ}ÝdØç运¯û{¦VÝ®6;Ÿã–ÜÍ UEÿXâsQþV?Õµïáýþ䋈X-´¹Þúf|C‘Cþ–ê
úÊfoóÿ ÆÓʙÂP'M¯6eŠÄp°‹¢#ºÇº’Õÿ^uitµsŠÚ·Gþܐ¶ö«™É­g¼viw~ ÞR^òàC]âÁŽà—-9oÈÝ jÛ' Jü»B9¢èH¹©<õEDę‡½]áOZJЗüÖ:TlÄ?÷Lû‰ˆH>5$ì³Ñr@¶ §ä×%–€•#>ýä\ïŒë»R ×-KUV1Q'|µ®ð‰P,ìÏÔ>¾ÂêÝæÎÔϽê~9TÅU¸Ã/toيYó··êr=
p?` Y€œf–]îH{ó§_Y\q°ÔûC
@@ -2593,14 +2593,14 @@
¦`da<v©í²=QÂ0ŒÁ\§Ù×véms–ö¬†ß½k÷œáÉ p{ýdÙo-!`¸ÍÞ.çó®Üíãd³ËÛ|oû\8drJ~]2±X,LÊòFp_%(øÅ
_Ž¿¿<-Žô–›‰c·å%å¾<Sϧ—†ƒß~Ë:å0V»ØR%rW[ͽíDDSá
T¹áÇ쁀Ϥw|ôšYýU·YŠÙø¶P*t}Úx²¤•ÈADžç­Êﺔ}
Ž“Á,—–ºòQan“¡¥WžsÉDø°Å($:´¿çŸ@*Ë;U‘+yúN„::5Ur‰T¸ü熨Frnç»~¿y¨­3ÛÍÊÓiãC5|>ÒòAmêANl¾6,­Ë~¿é.¥àûݞ–ÄþuRGg7ŸŸx½¥<M|Û‰òe<©áðìyú™öQûãýàܽ°xk°ö:üÿíÝH›wÀñÏSlÉ#ݑˆ–$t£‘v4Y¯,n;Öx+m<MoƒšR˜iwTíý1ݍUÝØTŽuǪvŒ3;XkˍêàNìfvÜh×5ŽƱrÉXSÖÃH;Œ¬âf!÷GҘZ§ý‘»ú~‘?ž|ò}¾ÏçùF>ù>ß/°¢Tîr/„}#‘ð5-E¿ŽýÕçÜbÕÝ(Yf
@@ -2608,9 +2608,9 @@
ÃVZV1º¾êŒ?çî©Ëê'wÿu¾€» P±Õl.}̶û“ñžÜP_ZäþglÞq¶öËHønjÛÇíÕ¾—*
Ñ 1ÊôdC™À
½Ëw
/trunk/papyrus/pap_initialise_auth.inc.php
1,306 → 1,313
<?php
//vim: set expandtab tabstop=4 shiftwidth=4:
// +------------------------------------------------------------------------------------------------------+
// | PHP version 4.1 |
// +------------------------------------------------------------------------------------------------------+
// | Copyright (C) 2003 Tela Botanica (accueil@tela-botanica.org) |
// +------------------------------------------------------------------------------------------------------+
// | |
// | This library is free software; you can redistribute it and/or |
// | modify it under the terms of the GNU Lesser General Public |
// | License as published by the Free Software Foundation; either |
// | version 2.1 of the License, or (at your option) any later version. |
// | |
// | This library is distributed in the hope that it will be useful, |
// | but WITHOUT ANY WARRANTY; without even the implied warranty of |
// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
// | Lesser General Public License for more details. |
// | |
// | You should have received a copy of the GNU Lesser General Public |
// | License along with this library; if not, write to the Free Software |
// | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
// | |
// +------------------------------------------------------------------------------------------------------+
// CVS : $Id: pap_initialise_auth.inc.php,v 1.26 2007-07-24 13:28:54 jp_milcent Exp $
/**
* Initialisation de l'authentification.
*
* Suite à la recherche des informations depuis la base de données nous initialisons
* l'authentification des utilisateurs si le site l'utilise.
* La page contient le code initialisant l'objet PEAR créé par Net_URL contenant l'url
* courante demandée par l'utilisateur.
* Nous initialisons aussi l'identification de l'utilisateur et le démarage de la session.
*
*@package Papyrus
//Auteur original :
*@author Alexandre GRANIER <alex@tela-botanica.org>
//Autres auteurs :
*@author Jean-Pascal MILCENT <jpm@tela-botanica.org>
*@copyright Tela-Botanica 2000-2004
*@version $Revision: 1.26 $ $Date: 2007-07-24 13:28:54 $
// +------------------------------------------------------------------------------------------------------+
*/
 
// +------------------------------------------------------------------------------------------------------+
// | ENTÊTE du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
 
/** <br> Inclusion de l'authentification de PEAR.*/
include_once PAP_CHEMIN_API_PEAR.'Auth.php';
 
/** Inclusion de la bibliothèque de fonctions d'identification.
* Contient entre autre la fonction founissant le formulaire d'identification pour Auth de Pear.
* Cette inclusion n'a lieu que si le site utilise l'identification.
*/
include_once GEN_CHEMIN_PAP.'bibliotheque/fonctions/pap_identification.fonct.php' ;
include_once GEN_CHEMIN_PAP.'bibliotheque/fonctions/pap_site.fonct.php' ;
 
// +------------------------------------------------------------------------------------------------------+
// | CORPS du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
 
// +------------------------------------------------------------------------------------------------------+
// Gestion de l'identification des utilisateurs et des sessions
 
 
// +------------------------------------------------------------------------------------------------------+
// Récupération des informations d'identification pour le site courant
 
// Récupération des informations sur le site
$requete_auth = 'SELECT gen_site_auth.*, gs_id_site '.
'FROM gen_site_auth, gen_site '.
'WHERE gs_ce_auth <> 0 '.
'AND gs_ce_auth = gsa_id_auth';
 
$resultat_auth = $db->query($requete_auth);
(DB::isError($resultat_auth))
? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_auth->getMessage(), $requete_auth))
: '';
 
while ($ligne_auth = $resultat_auth->fetchRow(DB_FETCHMODE_OBJECT)) {
// Ajout des valeurs communes aux différents type d'auth
$GLOBALS['_PAPYRUS_']['auth'][$ligne_auth->gsa_id_auth]['gsa_nom'] = $ligne_auth->gsa_nom;
$GLOBALS['_PAPYRUS_']['auth'][$ligne_auth->gsa_id_auth]['gsa_abreviation'] = $ligne_auth->gsa_abreviation;
$GLOBALS['_PAPYRUS_']['auth'][$ligne_auth->gsa_id_auth]['gsa_ce_type_auth'] = $ligne_auth->gsa_ce_type_auth;
 
 
if ($ligne_auth->gsa_id_auth == $GLOBALS['_GEN_commun']['info_site']->gs_ce_auth) {
$GLOBALS['_GEN_commun']['info_auth'] = $ligne_auth;
}
 
if ($ligne_auth->gsa_ce_auth_bdd != 0) {
//Identification via une base de donnée :
$requete_auth_bdd = 'SELECT * '.
'FROM gen_site_auth_bdd '.
'WHERE gsab_id_auth_bdd = '.$ligne_auth->gsa_ce_auth_bdd;
 
$resultat_auth_bdd = $db->query($requete_auth_bdd);
(DB::isError($resultat_auth_bdd))
? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_auth_bdd->getMessage(), $requete_auth_bdd))
: '';
$tab_auth_bdd = $resultat_auth_bdd->fetchRow(DB_FETCHMODE_OBJECT) ;
if ($ligne_auth->gsa_id_auth == $GLOBALS['_GEN_commun']['info_site']->gs_ce_auth) {
$GLOBALS['_GEN_commun']['info_auth_bdd'] = $tab_auth_bdd ;
// Gestion des arguments de l'authentification
if (isset($GLOBALS['_GEN_commun']['info_auth_bdd']->gsab_parametres)) {
$arguments = explode(' ', $GLOBALS['_GEN_commun']['info_auth_bdd']->gsab_parametres);
for ($i = 0; $i < count($arguments); $i++) {
$attr = explode('=', $arguments[$i]);
if ($attr[0] != '') {
$cle = array_shift($attr);
$valeur = '';
if (count($attr) == 1) {
$valeur = $attr[0];
} else if (count($attr) > 1) {
$valeur = implode('=', $attr);
}
$GLOBALS['_GEN_commun']['info_auth_bdd']->$cle = $valeur;
}
}
}
}
 
$GLOBALS['_PAPYRUS_']['auth'][$ligne_auth->gsa_id_auth] = array_merge((array)$GLOBALS['_PAPYRUS_']['auth'][$ligne_auth->gsa_id_auth], (array) $tab_auth_bdd);
$resultat_auth_bdd->free();
} else if ($ligne_auth->gsa_ce_auth_ldap != 0) {
//Identification via LDAP :
$requete_auth_ldap = 'SELECT * '.
'FROM gen_site_auth_ldap '.
'WHERE gsal_id_auth_ldap = '.$ligne_auth->gsa_ce_auth_ldap;
 
$resultat_auth_ldap = $db->query($requete_auth_ldap);
(DB::isError($resultat_auth_ldap))
? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_auth_ldap->getMessage(), $requete_auth_ldap))
: '';
$tab_auth_ldap = $resultat_auth_ldap->fetchRow(DB_FETCHMODE_OBJECT);
if ($ligne_auth->gsa_id_auth == $_GEN_commun['info_site']->gs_ce_auth) {
$GLOBALS['_GEN_commun']['info_auth_ldap'] = $tab_auth_ldap;
}
$GLOBALS['_PAPYRUS_']['auth'][$ligne_auth->gsa_id_auth] = array_merge((array) $GLOBALS['_PAPYRUS_']['auth'][$ligne_auth->gsa_id_auth], (array) $tab_auth_ldap);
$resultat_auth_ldap->free();
} else {
die('ERREUR Papyrus : impossible de trouver les information authentification. <br />'.
'Identifiant auth : '.$ligne_auth->gs_ce_auth.'<br />'.
'Ligne n° : '. __LINE__ .'<br />'.
'Fichier : '. __FILE__ );
}
 
// On teste le type d'authentification
$tab_type_site = GEN_retournerTableauTypeSiteExterne($db);
$types_site = '';
foreach ($tab_type_site as $val) {
$types_site .= $val['id'].', ';
}
$types_site = substr($types_site, 0, -2);
$requete = 'SELECT gsr_id_valeur '.
'FROM gen_site_relation '.
'WHERE gsr_id_site_01 = '.$ligne_auth->gs_id_site.' '.
'AND gsr_id_site_01 = gsr_id_site_02 '.
'AND gsr_id_valeur IN ('.$types_site.')';
$type_site_externe = $db->getOne($requete);
(DB::isError($type_site_externe))
? die(BOG_afficherErreurSql(__FILE__, __LINE__, $type_site_externe->getMessage(), $requete))
: '';
// Type du site de l'authentification
if ($type_site_externe != '') {
$GLOBALS['_PAPYRUS_']['auth'][$ligne_auth->gsa_id_auth]['type_site_externe'] = $type_site_externe;
}
}
$resultat_auth->free();
 
// +------------------------------------------------------------------------------------------------------+
// Définition du nom de la session
session_name(PAP_AUTH_SESSION_PREFIXE.$GLOBALS['_GEN_commun']['info_auth']->gsa_abreviation);
 
// +------------------------------------------------------------------------------------------------------+
// Nour regardons à quel type d'identification nous avons à faire:
$auth_courante = $GLOBALS['_PAPYRUS_']['auth'][$GLOBALS['_GEN_commun']['info_site']->gs_ce_auth] ;
if ($auth_courante['gsa_ce_type_auth'] == 1) {
// Authentification via une base de données
$GLOBALS['_PAPYRUS_']['auth']['param_bdd'] = array ('dsn' => $auth_courante['gsab_dsn'],
'table' => $auth_courante['gsab_nom_table'],
'usernamecol' => $auth_courante['gsab_nom_champ_login'],
'passwordcol' => $auth_courante['gsab_nom_champ_mdp'],
'cryptType' => $auth_courante['gsab_cryptage_mdp'],
'db_fields' => '*');
// L'authentification courrante
$GLOBALS['_GEN_commun']['pear_auth'] = new Auth('DB', $GLOBALS['_PAPYRUS_']['auth']['param_bdd'], 'GEN_afficherInfoIdentification', 1);
 
} else if ($auth_courante['gsa_ce_type_auth'] == 2) {
// Authentification via LDAP
$GLOBALS['_PAPYRUS_']['auth']['param_ldap'] = array ( 'host' => $auth_courante['gsal_serveur'],
'port' => $auth_courante['gsal_port'],
'basedn' => $auth_courante['gsal_base_dn'],
'userattr' => $auth_courante['gsal_uid']);
$GLOBALS['_GEN_commun']['pear_auth'] = new Auth('LDAP', $GLOBALS['_PAPYRUS_']['auth']['param_ldap'], 'GEN_afficherInfoIdentification', 1);
} else {
die('ERREUR Papyrus : type identification introuvable. <br />'.
'Type identification : '.$auth_courante['gsa_ce_type_auth'].'<br />'.
'Ligne n° : '. __LINE__ . '<br />'.
'Fichier : '. __FILE__ . '<br />');
}
 
// +------------------------------------------------------------------------------------------------------+
// Nous allouons le niveau de sécurité
$GLOBALS['_GEN_commun']['pear_auth']->setAdvancedSecurity(PAP_AUTH_SECURITE_AVANCEE);
 
// +------------------------------------------------------------------------------------------------------+
// Démarage de la session
$GLOBALS['_GEN_commun']['pear_auth']->start();
 
/* +--Fin du code ---------------------------------------------------------------------------------------+
* $Log: not supported by cvs2svn $
* Revision 1.25 2007-04-13 09:41:09 neiluj
* réparration cvs
*
* Revision 1.24 2006/12/14 15:25:22 jp_milcent
* Correction de la gestion des noms de session pour fonctionner avec Auth 1.4.3.
*
* Revision 1.23 2006/12/14 15:01:05 jp_milcent
* Utilisation d'un système permettant de mémoriser les idenitifications.
* Passage à Auth 1.4.3 et DB 1.7.6.
*
* Revision 1.22 2006/11/20 17:29:42 jp_milcent
* Suppression du code de gestion de l'identification Spip et Wikini car non fonctionnel et finalement géré dans les appli tierces.
*
* Revision 1.21 2006/04/28 12:41:49 florian
* corrections erreurs chemin
*
* Revision 1.20 2006/03/15 09:30:50 florian
* suppression des echos, qui entrainaient des problemes d'affichages
*
* Revision 1.19 2005/09/20 17:01:22 ddelon
* php5 et bugs divers
*
* Revision 1.18 2005/07/07 09:15:36 alexandre_tb
* mise en place de la co-authentification Wikini - papyrus.
* - ajout d'une requete pour récupérer le mot de passe
*
* Revision 1.17 2005/04/27 15:06:21 alex
* ajout de l'authentification wiki.
*
* Revision 1.16 2005/03/25 13:08:20 jpm
* Déplacement de la gestion des arguments de l'authentification.
*
* Revision 1.15 2005/03/24 15:04:26 alex
* ajout d'un appel à session_set_cookie_params pour allonger la durée de la session
*
* Revision 1.14 2005/03/15 14:20:01 jpm
* Gestion des arguments de l'identification courante.
*
* Revision 1.13 2005/02/22 18:27:24 jpm
* Changement de nom de variables.
*
* Revision 1.12 2004/12/15 15:24:45 alex
* suppression d'un notice
*
* Revision 1.11 2004/12/13 18:06:52 alex
* authentification spip presque parfaite
*
* Revision 1.10 2004/12/07 19:13:51 alex
* authentification spip
*
* Revision 1.7 2004/12/07 10:26:27 jpm
* Correction for en foreach.
*
* Revision 1.6 2004/12/06 12:42:02 alex
* en cours
*
* Revision 1.5 2004/12/06 12:12:28 jpm
* Début de gestion des auth multiples.
*
* Revision 1.4 2004/10/25 16:28:47 jpm
* Ajout de nouvelles balises Papyrus, ajout vérification mise à jour de Papyrus, meilleure gestion des sessions...
*
* Revision 1.3 2004/10/15 18:29:19 jpm
* Modif pour gérer l'appli installateur de Papyrus.
*
* Revision 1.2 2004/06/30 07:23:36 jpm
* Ajout d'un commentaire.
*
* Revision 1.1 2004/06/16 08:12:01 jpm
* Changement de nom de Génésia en Papyrus.
* Changement de l'arborescence.
*
* Revision 1.6 2004/05/01 11:40:21 jpm
* Suppression de code intégré dans le fichier de l'applette Identification.
*
* Revision 1.5 2004/04/28 12:04:31 jpm
* Changement du modèle de la base de données.
*
* Revision 1.4 2004/04/22 08:29:11 jpm
* Transformation de $GS_GLOBAL en $_GEN_commun.
*
* Revision 1.3 2004/04/09 16:20:33 jpm
* Gestion de l'authentification uniquement.
* Gestion des tables i18n.
*
* Revision 1.2 2004/04/02 16:29:58 jpm
* Ajout de la gestion de la déconnexion et reconnexion.
*
* Revision 1.1 2004/04/02 08:54:58 jpm
* Création du fichier qui contient l'initialisation des objets Pear, hormis la base de données.
*
* +--Fin du code ----------------------------------------------------------------------------------------+
*/
?>
<?php
//vim: set expandtab tabstop=4 shiftwidth=4:
// +------------------------------------------------------------------------------------------------------+
// | PHP version 4.1 |
// +------------------------------------------------------------------------------------------------------+
// | Copyright (C) 2003 Tela Botanica (accueil@tela-botanica.org) |
// +------------------------------------------------------------------------------------------------------+
// | |
// | This library is free software; you can redistribute it and/or |
// | modify it under the terms of the GNU Lesser General Public |
// | License as published by the Free Software Foundation; either |
// | version 2.1 of the License, or (at your option) any later version. |
// | |
// | This library is distributed in the hope that it will be useful, |
// | but WITHOUT ANY WARRANTY; without even the implied warranty of |
// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
// | Lesser General Public License for more details. |
// | |
// | You should have received a copy of the GNU Lesser General Public |
// | License along with this library; if not, write to the Free Software |
// | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
// | |
// +------------------------------------------------------------------------------------------------------+
// CVS : $Id: pap_initialise_auth.inc.php,v 1.26 2007-07-24 13:28:54 jp_milcent Exp $
/**
* Initialisation de l'authentification.
*
* Suite à la recherche des informations depuis la base de données nous initialisons
* l'authentification des utilisateurs si le site l'utilise.
* La page contient le code initialisant l'objet PEAR créé par Net_URL contenant l'url
* courante demandée par l'utilisateur.
* Nous initialisons aussi l'identification de l'utilisateur et le démarage de la session.
*
*@package Papyrus
//Auteur original :
*@author Alexandre GRANIER <alex@tela-botanica.org>
//Autres auteurs :
*@author Jean-Pascal MILCENT <jpm@tela-botanica.org>
*@copyright Tela-Botanica 2000-2004
*@version $Revision: 1.26 $ $Date: 2007-07-24 13:28:54 $
// +------------------------------------------------------------------------------------------------------+
*/
 
// +------------------------------------------------------------------------------------------------------+
// | ENTÊTE du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
 
/** <br> Inclusion de l'authentification de PEAR.*/
include_once PAP_CHEMIN_API_PEAR.'Auth.php';
 
/** Inclusion de la bibliothèque de fonctions d'identification.
* Contient entre autre la fonction founissant le formulaire d'identification pour Auth de Pear.
* Cette inclusion n'a lieu que si le site utilise l'identification.
*/
include_once GEN_CHEMIN_PAP.'bibliotheque/fonctions/pap_identification.fonct.php' ;
include_once GEN_CHEMIN_PAP.'bibliotheque/fonctions/pap_site.fonct.php' ;
 
// +------------------------------------------------------------------------------------------------------+
// | CORPS du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
 
// +------------------------------------------------------------------------------------------------------+
// Gestion de l'identification des utilisateurs et des sessions
 
 
// +------------------------------------------------------------------------------------------------------+
// Récupération des informations d'identification pour le site courant
 
// Récupération des informations sur le site
$requete_auth = 'SELECT gen_site_auth.*, gs_id_site '.
'FROM gen_site_auth, gen_site '.
'WHERE gs_ce_auth <> 0 '.
'AND gs_ce_auth = gsa_id_auth';
 
$resultat_auth = $db->query($requete_auth);
(DB::isError($resultat_auth))
? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_auth->getMessage(), $requete_auth))
: '';
 
while ($ligne_auth = $resultat_auth->fetchRow(DB_FETCHMODE_OBJECT)) {
// Ajout des valeurs communes aux différents type d'auth
$GLOBALS['_PAPYRUS_']['auth'][$ligne_auth->gsa_id_auth]['gsa_nom'] = $ligne_auth->gsa_nom;
$GLOBALS['_PAPYRUS_']['auth'][$ligne_auth->gsa_id_auth]['gsa_abreviation'] = $ligne_auth->gsa_abreviation;
$GLOBALS['_PAPYRUS_']['auth'][$ligne_auth->gsa_id_auth]['gsa_ce_type_auth'] = $ligne_auth->gsa_ce_type_auth;
if ($ligne_auth->gsa_id_auth == $GLOBALS['_GEN_commun']['info_site']->gs_ce_auth) {
$GLOBALS['_GEN_commun']['info_auth'] = $ligne_auth;
}
if ($ligne_auth->gsa_ce_auth_bdd != 0) {
//Identification via une base de donnée :
$requete_auth_bdd = 'SELECT * '.
'FROM gen_site_auth_bdd '.
'WHERE gsab_id_auth_bdd = '.$ligne_auth->gsa_ce_auth_bdd;
$resultat_auth_bdd = $db->query($requete_auth_bdd);
(DB::isError($resultat_auth_bdd))
? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_auth_bdd->getMessage(), $requete_auth_bdd))
: '';
$tab_auth_bdd = $resultat_auth_bdd->fetchRow(DB_FETCHMODE_OBJECT) ;
if ($ligne_auth->gsa_id_auth == $GLOBALS['_GEN_commun']['info_site']->gs_ce_auth) {
$GLOBALS['_GEN_commun']['info_auth_bdd'] = $tab_auth_bdd ;
// Gestion des arguments de l'authentification
if (isset($GLOBALS['_GEN_commun']['info_auth_bdd']->gsab_parametres)) {
$arguments = explode(' ', $GLOBALS['_GEN_commun']['info_auth_bdd']->gsab_parametres);
for ($i = 0; $i < count($arguments); $i++) {
$attr = explode('=', $arguments[$i]);
if ($attr[0] != '') {
$cle = array_shift($attr);
$valeur = '';
if (count($attr) == 1) {
$valeur = $attr[0];
} else if (count($attr) > 1) {
$valeur = implode('=', $attr);
}
$GLOBALS['_GEN_commun']['info_auth_bdd']->$cle = $valeur;
}
}
}
}
$GLOBALS['_PAPYRUS_']['auth'][$ligne_auth->gsa_id_auth] = array_merge((array)$GLOBALS['_PAPYRUS_']['auth'][$ligne_auth->gsa_id_auth], (array) $tab_auth_bdd);
$resultat_auth_bdd->free();
} else if ($ligne_auth->gsa_ce_auth_ldap != 0) {
//Identification via LDAP :
$requete_auth_ldap = 'SELECT * '.
'FROM gen_site_auth_ldap '.
'WHERE gsal_id_auth_ldap = '.$ligne_auth->gsa_ce_auth_ldap;
$resultat_auth_ldap = $db->query($requete_auth_ldap);
(DB::isError($resultat_auth_ldap))
? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_auth_ldap->getMessage(), $requete_auth_ldap))
: '';
$tab_auth_ldap = $resultat_auth_ldap->fetchRow(DB_FETCHMODE_OBJECT);
if ($ligne_auth->gsa_id_auth == $_GEN_commun['info_site']->gs_ce_auth) {
$GLOBALS['_GEN_commun']['info_auth_ldap'] = $tab_auth_ldap;
}
$GLOBALS['_PAPYRUS_']['auth'][$ligne_auth->gsa_id_auth] = array_merge((array) $GLOBALS['_PAPYRUS_']['auth'][$ligne_auth->gsa_id_auth], (array) $tab_auth_ldap);
$resultat_auth_ldap->free();
} else {
die('ERREUR Papyrus : impossible de trouver les information authentification. <br />'.
'Identifiant auth : '.$ligne_auth->gs_ce_auth.'<br />'.
'Ligne n° : '. __LINE__ .'<br />'.
'Fichier : '. __FILE__ );
}
// On teste le type d'authentification
$tab_type_site = GEN_retournerTableauTypeSiteExterne($db);
$types_site = '';
foreach ($tab_type_site as $val) {
$types_site .= $val['id'].', ';
}
$types_site = substr($types_site, 0, -2);
$requete = 'SELECT gsr_id_valeur '.
'FROM gen_site_relation '.
'WHERE gsr_id_site_01 = '.$ligne_auth->gs_id_site.' '.
'AND gsr_id_site_01 = gsr_id_site_02 '.
'AND gsr_id_valeur IN ('.$types_site.')';
$type_site_externe = $db->getOne($requete);
(DB::isError($type_site_externe))
? die(BOG_afficherErreurSql(__FILE__, __LINE__, $type_site_externe->getMessage(), $requete))
: '';
// Type du site de l'authentification
if ($type_site_externe != '') {
$GLOBALS['_PAPYRUS_']['auth'][$ligne_auth->gsa_id_auth]['type_site_externe'] = $type_site_externe;
}
}
$resultat_auth->free();
 
// +------------------------------------------------------------------------------------------------------+
// Définition du nom de la session
session_name(PAP_AUTH_SESSION_PREFIXE.$GLOBALS['_GEN_commun']['info_auth']->gsa_abreviation);
 
// +------------------------------------------------------------------------------------------------------+
// Nour regardons à quel type d'identification nous avons à faire:
$auth_courante = $GLOBALS['_PAPYRUS_']['auth'][$GLOBALS['_GEN_commun']['info_site']->gs_ce_auth] ;
if ($auth_courante['gsa_ce_type_auth'] == 1) {
// Authentification via une base de données
$GLOBALS['_PAPYRUS_']['auth']['param_bdd'] = array ('dsn' => $auth_courante['gsab_dsn'],
'table' => $auth_courante['gsab_nom_table'],
'usernamecol' => $auth_courante['gsab_nom_champ_login'],
'passwordcol' => $auth_courante['gsab_nom_champ_mdp'],
'cryptType' => $auth_courante['gsab_cryptage_mdp'],
'db_fields' => '*');
// L'authentification courrante
$GLOBALS['_GEN_commun']['pear_auth'] = new Auth('DB', $GLOBALS['_PAPYRUS_']['auth']['param_bdd'], 'GEN_afficherInfoIdentification', 1);
} else if ($auth_courante['gsa_ce_type_auth'] == 2) {
// Authentification via LDAP
$GLOBALS['_PAPYRUS_']['auth']['param_ldap'] = array ( 'host' => $auth_courante['gsal_serveur'],
'port' => $auth_courante['gsal_port'],
'basedn' => $auth_courante['gsal_base_dn'],
'userattr' => $auth_courante['gsal_uid']);
$GLOBALS['_GEN_commun']['pear_auth'] = new Auth('LDAP', $GLOBALS['_PAPYRUS_']['auth']['param_ldap'], 'GEN_afficherInfoIdentification', 1);
} else {
die('ERREUR Papyrus : type identification introuvable. <br />'.
'Type identification : '.$auth_courante['gsa_ce_type_auth'].'<br />'.
'Ligne n° : '. __LINE__ . '<br />'.
'Fichier : '. __FILE__ . '<br />');
}
 
// +------------------------------------------------------------------------------------------------------+
// Nous allouons le niveau de sécurité
$GLOBALS['_GEN_commun']['pear_auth']->setAdvancedSecurity(PAP_AUTH_SECURITE_AVANCEE);
 
// +------------------------------------------------------------------------------------------------------+
// Démarage de la session
$GLOBALS['_GEN_commun']['pear_auth']->start();
 
// stockage de l'utilisateur ayant déclenché la session pour pouvoir compter les sessions papyrus actives
$utilisateur = posix_getpwuid(posix_geteuid());
$_SESSION['papyrus_stat'] = $utilisateur['name'];
 
/* +--Fin du code ---------------------------------------------------------------------------------------+
* $Log: pap_initialise_auth.inc.php,v $
* Revision 1.26 2007-07-24 13:28:54 jp_milcent
* Appel du bon fichier Auth.php.
*
* Revision 1.25 2007-04-13 09:41:09 neiluj
* réparration cvs
*
* Revision 1.24 2006/12/14 15:25:22 jp_milcent
* Correction de la gestion des noms de session pour fonctionner avec Auth 1.4.3.
*
* Revision 1.23 2006/12/14 15:01:05 jp_milcent
* Utilisation d'un système permettant de mémoriser les idenitifications.
* Passage à Auth 1.4.3 et DB 1.7.6.
*
* Revision 1.22 2006/11/20 17:29:42 jp_milcent
* Suppression du code de gestion de l'identification Spip et Wikini car non fonctionnel et finalement géré dans les appli tierces.
*
* Revision 1.21 2006/04/28 12:41:49 florian
* corrections erreurs chemin
*
* Revision 1.20 2006/03/15 09:30:50 florian
* suppression des echos, qui entrainaient des problemes d'affichages
*
* Revision 1.19 2005/09/20 17:01:22 ddelon
* php5 et bugs divers
*
* Revision 1.18 2005/07/07 09:15:36 alexandre_tb
* mise en place de la co-authentification Wikini - papyrus.
* - ajout d'une requete pour récupérer le mot de passe
*
* Revision 1.17 2005/04/27 15:06:21 alex
* ajout de l'authentification wiki.
*
* Revision 1.16 2005/03/25 13:08:20 jpm
* Déplacement de la gestion des arguments de l'authentification.
*
* Revision 1.15 2005/03/24 15:04:26 alex
* ajout d'un appel à session_set_cookie_params pour allonger la durée de la session
*
* Revision 1.14 2005/03/15 14:20:01 jpm
* Gestion des arguments de l'identification courante.
*
* Revision 1.13 2005/02/22 18:27:24 jpm
* Changement de nom de variables.
*
* Revision 1.12 2004/12/15 15:24:45 alex
* suppression d'un notice
*
* Revision 1.11 2004/12/13 18:06:52 alex
* authentification spip presque parfaite
*
* Revision 1.10 2004/12/07 19:13:51 alex
* authentification spip
*
* Revision 1.7 2004/12/07 10:26:27 jpm
* Correction for en foreach.
*
* Revision 1.6 2004/12/06 12:42:02 alex
* en cours
*
* Revision 1.5 2004/12/06 12:12:28 jpm
* Début de gestion des auth multiples.
*
* Revision 1.4 2004/10/25 16:28:47 jpm
* Ajout de nouvelles balises Papyrus, ajout vérification mise à jour de Papyrus, meilleure gestion des sessions...
*
* Revision 1.3 2004/10/15 18:29:19 jpm
* Modif pour gérer l'appli installateur de Papyrus.
*
* Revision 1.2 2004/06/30 07:23:36 jpm
* Ajout d'un commentaire.
*
* Revision 1.1 2004/06/16 08:12:01 jpm
* Changement de nom de Génésia en Papyrus.
* Changement de l'arborescence.
*
* Revision 1.6 2004/05/01 11:40:21 jpm
* Suppression de code intégré dans le fichier de l'applette Identification.
*
* Revision 1.5 2004/04/28 12:04:31 jpm
* Changement du modèle de la base de données.
*
* Revision 1.4 2004/04/22 08:29:11 jpm
* Transformation de $GS_GLOBAL en $_GEN_commun.
*
* Revision 1.3 2004/04/09 16:20:33 jpm
* Gestion de l'authentification uniquement.
* Gestion des tables i18n.
*
* Revision 1.2 2004/04/02 16:29:58 jpm
* Ajout de la gestion de la déconnexion et reconnexion.
*
* Revision 1.1 2004/04/02 08:54:58 jpm
* Création du fichier qui contient l'initialisation des objets Pear, hormis la base de données.
*
* +--Fin du code ----------------------------------------------------------------------------------------+
*/
?>
/trunk/papyrus/pap_rendu.inc.php
1,761 → 1,766
<?php
/*vim: set expandtab tabstop=4 shiftwidth=4: */
// Copyright (C) 1999-2004 Tela Botanica (accueil@tela-botanica.org)
//
// Ce logiciel est un programme informatique servant à gérer du contenu et des
// applications web.
// Ce logiciel est régi par la licence CeCILL soumise au droit français et
// respectant les principes de diffusion des logiciels libres. Vous pouvez
// utiliser, modifier et/ou redistribuer ce programme sous les conditions
// de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
// sur le site "http://www.cecill.info".
 
// En contrepartie de l'accessibilité au code source et des droits de copie,
// de modification et de redistribution accordés par cette licence, il n'est
// offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
// seule une responsabilité restreinte pèse sur l'auteur du programme, le
// titulaire des droits patrimoniaux et les concédants successifs.
 
// A cet égard l'attention de l'utilisateur est attirée sur les risques
// associés au chargement, à l'utilisation, à la modification et/ou au
// développement et à la reproduction du logiciel par l'utilisateur étant
// donné sa spécificité de logiciel libre, qui peut le rendre complexe à
// manipuler et qui le réserve donc à des développeurs et des professionnels
// avertis possédant des connaissances informatiques approfondies. Les
// utilisateurs sont donc invités à charger et tester l'adéquation du
// logiciel à leurs besoins dans des conditions permettant d'assurer la
// sécurité de leurs systèmes et ou de leurs données et, plus généralement,
// à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
 
// Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
// pris connaissance de la licence CeCILL, et que vous en avez accepté les
// termes.
// ----
// CVS : $Id: pap_rendu.inc.php,v 1.44 2008-11-14 23:47:37 ddelon Exp $
/**
* Rendu : programme traitant l'url demandée et retournant la page compressé au navigateur.
*
* Ce programme contient la partie collectant les informations sur la page demandée par le navigateur client.
* Elle vérifie que la page ne soit pas déjà présente en cache et la renvoie si elle est disponible.
* Elle recherche ensuite l'application liée à la page demandée. Elle exécute cette application et récupère le
* contenu XHTML à afficher, le stocke en cache, le compresse et le renvoi au navigateur client.
*
*@package Papyrus
//Auteur original :
*@author Jean-Pascal MILCENT <jpm@tela-botanica.org>
//Autres auteurs :
*@author Alexandre GRANIER <alexandre@tela-botanica.org>
*@author Laurent COUDOUNEAU <laurent.coudouneau@ema.fr>
*@copyright Tela-Botanica 2000-2004
*@version $Revision: 1.44 $ $Date: 2008-11-14 23:47:37 $
// +------------------------------------------------------------------------------------------------------+
*/
 
// TODO : revoir les initialisation en l'absence de menu par defaut
 
// +------------------------------------------------------------------------------------------------------+
// | ENTÊTE du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
 
/** Inclusion de la bibliothèque de fonctions servant à l'insertion de meta informations pour une page donnée.*/
include_once GEN_CHEMIN_BIBLIO.'pap_meta.fonct.php';
 
/** Inclusion de la bibliothèque de fonctions servant à l'insertion de styles pour une page donnée.*/
include_once GEN_CHEMIN_BIBLIO.'pap_style.fonct.php';
 
/** Inclusion de la bibliothèque de fonctions servant à l'insertion de scripts pour une page donnée.*/
include_once GEN_CHEMIN_BIBLIO.'pap_script.fonct.php';
 
/** Inclusion de la classe servant au rendu de Papyrus.*/
include_once GEN_CHEMIN_BIBLIO_CLASSE.'pap_rendu.class.php';
 
// +------------------------------------------------------------------------------------------------------+
// | CORPS du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
 
// Recherche du squelette de la page demandée.
 
 
// Ouverture du squelette
if (empty($GLOBALS['_GEN_commun']['info_menu']->gm_fichier_squelette)) {
if (isset($GLOBALS['_GEN_commun']['traduction_info_site'])) {
$GLOBALS['_PAPYRUS_']['general']['chemin_squelette'] = $GLOBALS['_GEN_commun']['traduction_info_site']->gs_fichier_squelette;
} else {
$GLOBALS['_PAPYRUS_']['general']['chemin_squelette'] = $GLOBALS['_GEN_commun']['info_site']->gs_fichier_squelette;
}
} else {
if (isset($GLOBALS['_GEN_commun']['traduction_info_menu'])) {
$GLOBALS['_PAPYRUS_']['general']['chemin_squelette'] = $GLOBALS['_GEN_commun']['traduction_info_menu']->gm_fichier_squelette;
} else {
$GLOBALS['_PAPYRUS_']['general']['chemin_squelette'] = $GLOBALS['_GEN_commun']['info_menu']->gm_fichier_squelette;
}
}
 
// Si l'information concernant le chemin est réellement un chemin
/*
* Test du chemin du squelette - modifié
* Teste à présent la présence du squelette dans la lanque par défaut si il n'est pas trouvé dans la langue en cours.
* */
if (! file_exists($GLOBALS['_PAPYRUS_']['general']['chemin_squelette'])) {
if (file_exists(GEN_CHEMIN_SITES.$GLOBALS['_GEN_commun']['info_site']->gs_code_alpha.'/'.
$GLOBALS['_GEN_commun']['i18n'].'/'.GEN_DOSSIER_SQUELETTE.
'/'.$GLOBALS['_PAPYRUS_']['general']['chemin_squelette'])) {
// Le fichier de la locale courante existe
$GLOBALS['_PAPYRUS_']['general']['chemin_test'] = GEN_CHEMIN_SITES.$GLOBALS['_GEN_commun']['info_site']->gs_code_alpha.'/'.
$GLOBALS['_GEN_commun']['i18n'].'/'.GEN_DOSSIER_SQUELETTE.
'/'.$GLOBALS['_PAPYRUS_']['general']['chemin_squelette'];
} elseif (file_exists(GEN_CHEMIN_SITES.
$GLOBALS['_GEN_commun']['info_site']->gs_code_alpha.'/'.GEN_I18N_ID_DEFAUT.
'/'.GEN_DOSSIER_SQUELETTE.'/'.$GLOBALS['_PAPYRUS_']['general']['chemin_squelette'])) {
// Le fichier par défaut existe
$GLOBALS['_PAPYRUS_']['general']['chemin_test'] = GEN_CHEMIN_SITES.$GLOBALS['_GEN_commun']['info_site']->gs_code_alpha.'/'.
GEN_I18N_ID_DEFAUT.'/'.GEN_DOSSIER_SQUELETTE.
'/'.$GLOBALS['_PAPYRUS_']['general']['chemin_squelette'];
} else {
//Aucun des deux fichiers n'existe.
die('ERREUR Papyrus : Impossible de trouver de fichier de squelette. <br />'.
'Chemin fichier squelette : '.$GLOBALS['_PAPYRUS_']['general']['chemin_squelette'].' <br />'.
'Ligne n° : '. __LINE__ .'<br />'.
'Fichier : '. __FILE__ );
}
}
 
$GLOBALS['_PAPYRUS_']['general']['chemin_squelette'] = $GLOBALS['_PAPYRUS_']['general']['chemin_test'];
 
// Lecture du fichier de squelette XHTML en PHP 4.3
 
 
 
 
// +------------------------------------------------------------------------------------------------------+
// Gestion des traductions
 
// Si le r<E9>sultat de la n<E9>gociation de l'internationalisation donne une langue diff<E9>rente
// de celle du site principal, nous r<E9>cup<E9>rons les <E9>ventuelles valeurs traduite pour le site.
 
 
$id_langue = $GLOBALS['_GEN_commun']['i18n'];
 
if (isset($id_langue) && ($id_langue!='')) {
$langue_test=$id_langue;
} else {
$langue_test=GEN_I18N_ID_DEFAUT;
}
 
$requete = 'SELECT * '.
'FROM gen_site '.
'WHERE gs_ce_i18n = "'.$langue_test.'" '.
// 'WHERE gs_ce_i18n = "'.$_GEN_commun['i18n'].'" '.
'AND gs_code_num = "'.$GLOBALS['_GEN_commun']['info_site']->gs_code_num.'"';
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
 
// Nous cr<E9><E9>ons l'entr<E9>e 'traduction_info_site' dans _GEN_commun que si nous avons bien trouv<E9> une
// traduction pour le site. Il faut donc tester l'existence de cette entr<E9>e avant de l'utiliser.
 
 
if ($resultat->numRows() > 0) {
$GLOBALS['_GEN_commun']['traduction_info_site'] = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
}
$resultat->free();
 
// Si le r<E9>sultat de la n<E9>gociation de l'internationalisation donne une langue diff<E9>rente
// de celle du menu, nous r<E9>cup<E9>rons les <E9>ventuelles valeurs traduite pour le menu.
 
// si pas d'application, $GLOBALS['_GEN_commun']['info_menu'] => NULL
// donc on test pour prévenir d'une erreur en bas de page :
// trying to get property of non-object element.
// --julien
if(isset($GLOBALS['_GEN_commun']['info_menu']))
{
// R<E9>cup<E9>ration des informations sur la traduction du menu
$requete = 'SELECT * '.
'FROM gen_menu '.
'WHERE gm_ce_i18n = "'.$langue_test.'" '.
// 'WHERE gm_ce_i18n = "'.$_GEN_commun['i18n'].'" '.
'AND gm_code_num = "'.$GLOBALS['_GEN_commun']['info_menu']->gm_code_num.'"';
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
// Nous cr<E9><E9>ons l'entr<E9>e 'traduction_info_menu' dans _GEN_commun que si nous avons bien trouv<E9> une
// traduction pour le menu. Il faut donc tester l'existence de cette entr<E9>e avant de l'utiliser.
if ($resultat->numRows() > 0) {
$_GEN_commun['traduction_info_menu'] = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
}
$resultat->free();
}
 
 
if (isset($GLOBALS['_GEN_commun']['traduction_info_site'])) {
$type_site='traduction_info_site';
}
else {
$type_site='info_site';
}
 
if (isset($GLOBALS['_GEN_commun']['traduction_info_menu'])) {
$type_menu='traduction_info_menu';
}
else {
$type_menu='info_menu';
}
 
 
$GLOBALS['_PAPYRUS_']['general']['contenu_squelette'] = file_get_contents($GLOBALS['_PAPYRUS_']['general']['chemin_squelette']);
 
// +------------------------------------------------------------------------------------------------------+
// Recherche des informations pour la complétion de l'entête du squelette de la page demandée.
 
if (isset($GLOBALS['_GEN_commun'][$type_menu])) {
// Construction du titre.
if (! empty($GLOBALS['_GEN_commun'][$type_menu]->gm_titre)) {
$GLOBALS['_PAPYRUS_']['page']['titre'] = htmlentities($GLOBALS['_GEN_commun'][$type_menu]->gm_titre);
} else if (! empty($GLOBALS['_GEN_commun']['info_menu']->gm_titre_alternatif)) {
$GLOBALS['_PAPYRUS_']['page']['titre'] = htmlentities($GLOBALS['_GEN_commun'][$type_menu]->gm_titre_alternatif);
} else {
$GLOBALS['_PAPYRUS_']['page']['titre'] = htmlentities($GLOBALS['_GEN_commun'][$type_menu]->gm_nom);
}
}
else {
$GLOBALS['_PAPYRUS_']['page']['titre']='';
}
$GLOBALS['_PAPYRUS_']['rendu']['TITRE_PAGE'] = $GLOBALS['_PAPYRUS_']['page']['titre'];
 
// Construction des infos sur le site
$GLOBALS['_PAPYRUS_']['page']['nom_site'] = htmlentities($GLOBALS['_GEN_commun'][$type_site]->gs_nom);
$GLOBALS['_PAPYRUS_']['rendu']['SITE_NOM'] = $GLOBALS['_PAPYRUS_']['page']['nom_site'];
$GLOBALS['_PAPYRUS_']['page']['langue_site'] = htmlentities($GLOBALS['_GEN_commun']['i18n']);
$GLOBALS['_PAPYRUS_']['rendu']['SITE_LANGUE'] = $GLOBALS['_PAPYRUS_']['page']['langue_site'];
$GLOBALS['_PAPYRUS_']['page']['code_alpha_site'] = htmlentities($GLOBALS['_GEN_commun'][$type_site]->gs_code_alpha);
$GLOBALS['_PAPYRUS_']['rendu']['SITE_CODE_ALPHA'] = $GLOBALS['_PAPYRUS_']['page']['code_alpha_site'];
 
// Construction des infos sur le menu pour générer les balises
$GLOBALS['_PAPYRUS_']['rendu']['INFO_MENU_ID'] = htmlentities($GLOBALS['_GEN_commun'][$type_menu]->gm_id_menu);
$GLOBALS['_PAPYRUS_']['rendu']['INFO_MENU_CODE_ALPHA'] = htmlentities($GLOBALS['_GEN_commun'][$type_menu]->gm_code_alpha);
$GLOBALS['_PAPYRUS_']['rendu']['INFO_MENU_CODE_NUM'] = htmlentities($GLOBALS['_GEN_commun'][$type_menu]->gm_code_num);
 
 
// Tag special PAPYRUS_PAGE_URL utilise dans le multilinguisme
$une_url =new Pap_URL(PAP_URL);
$une_url->setId($GLOBALS['_GEN_commun']['info_menu']->gm_code_num);
$GLOBALS['_PAPYRUS_']['rendu']['PAGE_URL'] = $une_url->getUrl();
// Suppression langue si presente
$GLOBALS['_PAPYRUS_']['rendu']['PAGE_URL'] = preg_replace("/\?langue=[a-z][a-z]/","",$GLOBALS['_PAPYRUS_']['rendu']['PAGE_URL']);
 
 
 
// Construction des Meta "http-equiv".
$_GEN_commun['meta_http_equiv'] = array();
$GLOBALS['_PAPYRUS_']['page']['jeu_de_caracteres'] = htmlentities(strtoupper($_GEN_commun['info_i18n']->gi_jeu_de_caracteres));
$GLOBALS['_PAPYRUS_']['rendu']['SITE_JEU_DE_CARACTERES'] = $GLOBALS['_PAPYRUS_']['page']['jeu_de_caracteres'];
$GLOBALS['_PAPYRUS_']['page']['langue'] = htmlentities($GLOBALS['_GEN_commun']['info_i18n_langue']->gil_id_langue);
$GLOBALS['_PAPYRUS_']['rendu']['SITE_LANGUE'] = $GLOBALS['_PAPYRUS_']['page']['langue'];
GEN_stockerMetaHttpEquiv('Content-Type', 'text/html; charset='.$GLOBALS['_PAPYRUS_']['page']['jeu_de_caracteres']);
GEN_stockerMetaHttpEquiv('Content-style-type', 'text/css');
GEN_stockerMetaHttpEquiv('Content-script-type', 'text/javascript');
GEN_stockerMetaHttpEquiv('Content-language', $GLOBALS['_PAPYRUS_']['page']['langue']);
 
// Construction des Meta "name".
$GLOBALS['_GEN_commun']['meta_name'] = array();
if (isset($GLOBALS['_GEN_commun'][$type_menu])) {
$GLOBALS['_PAPYRUS_']['page']['robot'] = htmlentities($GLOBALS['_GEN_commun'][$type_menu]->gm_robot);
$GLOBALS['_PAPYRUS_']['page']['auteur'] = htmlentities($GLOBALS['_GEN_commun'][$type_menu]->gm_auteur);
}
else {
$GLOBALS['_PAPYRUS_']['page']['robot'] = '';
$GLOBALS['_PAPYRUS_']['page']['auteur'] = '';
}
if (empty($GLOBALS['_PAPYRUS_']['page']['auteur'])) {
$GLOBALS['_PAPYRUS_']['page']['auteur'] = htmlentities($GLOBALS['_GEN_commun'][$type_site]->gs_auteur);
}
if (isset($GLOBALS['_GEN_commun']['info_menu'])) {
$GLOBALS['_PAPYRUS_']['page']['mots_cles'] = htmlentities($GLOBALS['_GEN_commun'][$type_menu]->gm_mots_cles);
}
if (empty($GLOBALS['_PAPYRUS_']['page']['mots_cles'])) {
$GLOBALS['_PAPYRUS_']['page']['mots_cles'] = htmlentities($GLOBALS['_GEN_commun'][$type_site]->gs_mots_cles);
}
if (isset($GLOBALS['_GEN_commun']['info_menu'])) {
$GLOBALS['_PAPYRUS_']['page']['description_libre'] = htmlentities($GLOBALS['_GEN_commun'][$type_menu]->gm_description_libre);
}
if (empty($GLOBALS['_PAPYRUS_']['page']['description_libre'])) {
$GLOBALS['_PAPYRUS_']['page']['description_libre'] = htmlentities($GLOBALS['_GEN_commun'][$type_site]->gs_description);
}
 
 
GEN_stockerMetaName('revisit-after', '15 days');
GEN_stockerMetaName('robots', $GLOBALS['_PAPYRUS_']['page']['robot']);
GEN_stockerMetaName('author', $GLOBALS['_PAPYRUS_']['page']['auteur']);
GEN_stockerMetaName('keywords', $GLOBALS['_PAPYRUS_']['page']['mots_cles']);
GEN_stockerMetaName('description', $GLOBALS['_PAPYRUS_']['page']['description_libre']);
 
// Construction des Meta Meta "name" du Dublin Core.
 
if (isset($GLOBALS['_GEN_commun']['info_menu'])) {
$GLOBALS['_PAPYRUS_']['page']['titre_alternatif'] = htmlentities($GLOBALS['_GEN_commun'][$type_menu]->gm_titre_alternatif);
$GLOBALS['_PAPYRUS_']['page']['auteur'] = htmlentities($GLOBALS['_GEN_commun'][$type_menu]->gm_auteur);
$GLOBALS['_PAPYRUS_']['page']['description_resume'] = htmlentities($GLOBALS['_GEN_commun'][$type_menu]->gm_description_resume);
$GLOBALS['_PAPYRUS_']['page']['description_table_matieres'] = htmlentities($GLOBALS['_GEN_commun'][$type_menu]->gm_description_table_matieres);
$GLOBALS['_PAPYRUS_']['page']['publieur'] = htmlentities($GLOBALS['_GEN_commun'][$type_menu]->gm_editeur);
$GLOBALS['_PAPYRUS_']['page']['contributeur'] = htmlentities($GLOBALS['_GEN_commun'][$type_menu]->gm_contributeur);
$GLOBALS['_PAPYRUS_']['page']['date_creation'] = htmlentities($GLOBALS['_GEN_commun'][$type_menu]->gm_date_creation);
$GLOBALS['_PAPYRUS_']['page']['date_soumission'] = htmlentities($GLOBALS['_GEN_commun'][$type_menu]->gm_date_soumission);
$GLOBALS['_PAPYRUS_']['page']['date_acceptation'] = htmlentities($GLOBALS['_GEN_commun'][$type_menu]->gm_date_acceptation);
$GLOBALS['_PAPYRUS_']['page']['periode_validite'] = htmlentities($GLOBALS['_GEN_commun'][$type_menu]->gm_date_debut_validite);
$GLOBALS['_PAPYRUS_']['page']['date_copyright'] = htmlentities($GLOBALS['_GEN_commun'][$type_menu]->gm_date_copyright);
$GLOBALS['_PAPYRUS_']['page']['source'] = htmlentities($GLOBALS['_GEN_commun'][$type_menu]->gm_source);
}
else {
$GLOBALS['_PAPYRUS_']['page']['titre_alternatif'] = '';
$GLOBALS['_PAPYRUS_']['page']['auteur'] = '';
$GLOBALS['_PAPYRUS_']['page']['description_resume'] = '';
$GLOBALS['_PAPYRUS_']['page']['description_table_matieres'] = '';
$GLOBALS['_PAPYRUS_']['page']['publieur'] = '';
$GLOBALS['_PAPYRUS_']['page']['contributeur'] = '';
$GLOBALS['_PAPYRUS_']['page']['date_creation'] = '';
$GLOBALS['_PAPYRUS_']['page']['date_soumission'] = '';
$GLOBALS['_PAPYRUS_']['page']['date_acceptation'] = '';
$GLOBALS['_PAPYRUS_']['page']['periode_validite'] = '';
$GLOBALS['_PAPYRUS_']['page']['date_copyright'] = '';
$GLOBALS['_PAPYRUS_']['page']['source'] = '';
}
 
if ((isset($GLOBALS['_GEN_commun']['info_i18n_pays'])) && ($GLOBALS['_GEN_commun']['info_i18n_pays']->gip_id_pays != '')) {
$GLOBALS['_PAPYRUS_']['page']['langue_rfc_3066'] = $GLOBALS['_PAPYRUS_']['page']['langue'].'-'.htmlentities($GLOBALS['_GEN_commun']['info_i18n_pays']->gip_id_pays);
} else {
$GLOBALS['_PAPYRUS_']['page']['langue_rfc_3066'] = $GLOBALS['_PAPYRUS_']['page']['langue'];
}
if (isset($GLOBALS['_GEN_commun']['info_menu'])) {
$GLOBALS['_PAPYRUS_']['page']['type_portee_spatiale'] = htmlentities($GLOBALS['_GEN_commun'][$type_menu]->gm_ce_type_portee_spatiale);
$GLOBALS['_PAPYRUS_']['page']['portee_spatiale'] = htmlentities($GLOBALS['_GEN_commun'][$type_menu]->gm_portee_spatiale);
$GLOBALS['_PAPYRUS_']['page']['type_portee_temporelle'] = htmlentities($GLOBALS['_GEN_commun'][$type_menu]->gm_ce_type_portee_temporelle);
$GLOBALS['_PAPYRUS_']['page']['portee_temporelle'] = htmlentities($GLOBALS['_GEN_commun'][$type_menu]->gm_portee_temporelle);
$GLOBALS['_PAPYRUS_']['page']['licence'] = htmlentities($GLOBALS['_GEN_commun'][$type_menu]->gm_licence);
$GLOBALS['_PAPYRUS_']['page']['public'] = htmlentities($GLOBALS['_GEN_commun'][$type_menu]->gm_public);
$GLOBALS['_PAPYRUS_']['page']['public_niveau'] = htmlentities($GLOBALS['_GEN_commun'][$type_menu]->gm_public_niveau);
}
else {
$GLOBALS['_PAPYRUS_']['page']['type_portee_spatiale'] = '';
$GLOBALS['_PAPYRUS_']['page']['portee_spatiale'] = '';
$GLOBALS['_PAPYRUS_']['page']['type_portee_temporelle'] = '';
$GLOBALS['_PAPYRUS_']['page']['portee_temporelle'] = '';
$GLOBALS['_PAPYRUS_']['page']['licence'] = '';
$GLOBALS['_PAPYRUS_']['page']['public'] = '';
$GLOBALS['_PAPYRUS_']['page']['public_niveau'] = '';
}
 
GEN_stockerMetaNameDC('DC.Title', $GLOBALS['_PAPYRUS_']['page']['titre'], $GLOBALS['_PAPYRUS_']['page']['langue']);
GEN_stockerMetaNameDC('DC.Title.alternative', $GLOBALS['_PAPYRUS_']['page']['titre_alternatif'], $GLOBALS['_PAPYRUS_']['page']['langue']);
GEN_stockerMetaNameDC('DC.Creator', $GLOBALS['_PAPYRUS_']['page']['auteur']);
GEN_stockerMetaNameDC('DC.Subject', $GLOBALS['_PAPYRUS_']['page']['mots_cles'], $GLOBALS['_PAPYRUS_']['page']['langue']);
GEN_stockerMetaNameDC('DC.Description', $GLOBALS['_PAPYRUS_']['page']['description_libre'], $GLOBALS['_PAPYRUS_']['page']['langue']);
GEN_stockerMetaNameDC('DC.Description.abstract', $GLOBALS['_PAPYRUS_']['page']['description_resume'], $GLOBALS['_PAPYRUS_']['page']['langue']);
GEN_stockerMetaNameDC('DC.Description.tableOfContents', $GLOBALS['_PAPYRUS_']['page']['description_table_matieres'], $GLOBALS['_PAPYRUS_']['page']['langue']);
GEN_stockerMetaNameDC('DC.Publisher', $GLOBALS['_PAPYRUS_']['page']['publieur']);
GEN_stockerMetaNameDC('DC.Contributor', $GLOBALS['_PAPYRUS_']['page']['contributeur']);
GEN_stockerMetaNameDC('DC.Date.created', $GLOBALS['_PAPYRUS_']['page']['date_creation'], '', 'W3CDTF');
GEN_stockerMetaNameDC('DC.Date.valid', $GLOBALS['_PAPYRUS_']['page']['periode_validite'], '', 'W3CDTF');
//Ajouter la gestion des dates valid et available en utilisant les dates de la table gen_page_contenu.
GEN_stockerMetaNameDC('DC.Date.dateSubmitted', $GLOBALS['_PAPYRUS_']['page']['date_soumission'], '', 'W3CDTF');
GEN_stockerMetaNameDC('DC.Date.dateCopyrighted', $GLOBALS['_PAPYRUS_']['page']['date_copyright'], '', 'W3CDTF');
GEN_stockerMetaNameDC('DC.Date.dateAccepted', $GLOBALS['_PAPYRUS_']['page']['date_acceptation'], '', 'W3CDTF');
GEN_stockerMetaNameDC('DC.Source', $GLOBALS['_PAPYRUS_']['page']['source'], '', 'URI');
GEN_stockerMetaNameDC('DC.Language', $GLOBALS['_PAPYRUS_']['page']['langue_rfc_3066'], '', 'RFC3066');
GEN_stockerMetaNameDC('DC.Coverage.spatial', $GLOBALS['_PAPYRUS_']['page']['portee_spatiale'], '', $GLOBALS['_PAPYRUS_']['page']['type_portee_spatiale']);
GEN_stockerMetaNameDC('DC.Coverage.temporal', $GLOBALS['_PAPYRUS_']['page']['portee_temporelle'], '', $GLOBALS['_PAPYRUS_']['page']['type_portee_temporelle']);
GEN_stockerMetaNameDC('DC.Rights', $GLOBALS['_PAPYRUS_']['page']['licence'], '', 'URI');
GEN_stockerMetaNameDC('DC.Audience', $GLOBALS['_PAPYRUS_']['page']['public']);
GEN_stockerMetaNameDC('DC.Audience.educationLevel', $GLOBALS['_PAPYRUS_']['page']['public_niveau']);
 
// Construction des CSS
// Déclaration des constantes contenant les CSS à afficher sur la page.
$GLOBALS['_GEN_commun']['style_type'] = 'text/css';
$GLOBALS['_GEN_commun']['style_integree'] = '';
$GLOBALS['_GEN_commun']['style_externe'] = array();
 
// Construction du Javascript
// Déclaration des constantes contenant le Javascript à afficher sur la page.
$GLOBALS['_GEN_commun']['script_type'] = 'text/javascript';
$GLOBALS['_GEN_commun']['script_code'] = '';
$GLOBALS['_GEN_commun']['script_fonction'] = array();
$GLOBALS['_GEN_commun']['script_fichier'] = array();
 
// +------------------------------------------------------------------------------------------------------+
// Gestion de l'espace de nom pour les balise Papyrus
$GLOBALS['_GEN_commun']['balise_prefixe'] = 'PAPYRUS_';
$GLOBALS['_GEN_commun']['balise_prefixe_client'] = 'CLIENT_';
 
// +------------------------------------------------------------------------------------------------------+
// Gestion des inclusions des fichiers d'applettes présentes dans le squelette
// TODO : Supprimer des fichiers du coeur de Papyrus, précédent ce fichier, la variable : $_GEN_commun['info_applette']
$GLOBALS['_PAPYRUS_']['info_applette'] = array();
$PapRendu = new Pap_Rendu();
$PapRendu->parserBaliseApplette($GLOBALS['_PAPYRUS_']['general']['contenu_squelette']);
 
// +------------------------------------------------------------------------------------------------------+
// Gestion de l'intégration de l'application liée au menu
 
// Une fois les applettes appelées et exécutées nous appelons l'application qui peut avoir
// besoins des infos des applettes (c'est le cas, pour l'applette IDENTIFICATION).
$GLOBALS['_PAPYRUS_']['general']['application_chemin'] = '';
if (isset($GLOBALS['_GEN_commun']['info_application']->gap_chemin)) {
$GLOBALS['_PAPYRUS_']['general']['application_chemin'] = $GLOBALS['_GEN_commun']['info_application']->gap_chemin;
}
 
// Affichage contenu si identifié (parametre : lecture = + )
 
$lecture = 0;
if ((isset($GLOBALS['_GEN_commun']['info_application']->lecture)) && ($GLOBALS['_GEN_commun']['info_application']->lecture=="+")) {
if ($GLOBALS['_GEN_commun']['pear_auth']->getAuth()) {
$lecture=1;
}
}
// Emplacement pour traiter les futurs cas :
else {
$lecture=1;
}
 
if (!$lecture) {
function afficherContenuCorps()
{
return '<p class="pap_erreur">'.'Pas autorisé, veuillez vous identifier.'.'</p>';
}
}
 
// $application_chemin contient le chemin de l'application
// Si $application_chemin est vide, on défini putFrame comme ne retournant rien.
 
if (empty($GLOBALS['_PAPYRUS_']['general']['application_chemin']) ) {
function afficherContenuCorps()
{
return '<p class="pap_erreur">'.'Pas d\'application.'.'</p>';
}
} else {
if (file_exists($GLOBALS['_PAPYRUS_']['general']['application_chemin'])) {
if (!function_exists('afficherContenuCorps')) {
include_once($GLOBALS['_PAPYRUS_']['general']['application_chemin']);
}
} else {
die('ERREUR Papyrus : application impossible à charger. <br />'.
'Chemin application : '.$GLOBALS['_PAPYRUS_']['general']['application_chemin'].' <br />'.
'Ligne n° : '. __LINE__ .'<br />'.
'Fichier : '. __FILE__ );
}
}
 
 
// +------------------------------------------------------------------------------------------------------+
// Recherche des informations provenant de l'application pour la complétion du squelette
 
// Contenu navigation
// Appel de la fonction afficherContenuNavigation() si elle existe.
$GLOBALS['_PAPYRUS_']['rendu']['CONTENU_NAVIGATION'] = (function_exists('afficherContenuNavigation') ? afficherContenuNavigation() : '<!-- '.'Aucune navigation'.' -->');
 
// Contenu tête
// Appel de la fonction afficherContenuTete() si elle existe.
$GLOBALS['_PAPYRUS_']['rendu']['CONTENU_TETE'] = (function_exists('afficherContenuTete') ? afficherContenuTete() : '<!-- '.'Aucun contenu tête'.' -->');
 
// Contenu corps
// Appel de la fonction afficherContenuCorps().
if (function_exists('afficherContenuCorps') ) {
$GLOBALS['_PAPYRUS_']['rendu']['CONTENU_CORPS'] = afficherContenuCorps();
} else {
$GLOBALS['_PAPYRUS_']['rendu']['CONTENU_CORPS'] =
'ERREUR Papyrus : fonction afficherContenuCorps() introuvable dans l\'application demandée. <br />'.
'Ligne n° : '. __LINE__ .'<br />'.
'Fichier : '. __FILE__;
}
 
// Appel de la fonction afficherContenuMenu() si elle existe.
if (isset($GLOBALS['_PAPYRUS_']['rendu']['CONTENU_MENU'])) {
$GLOBALS['_PAPYRUS_']['rendu']['CONTENU_MENU'] .= (function_exists('afficherContenuMenu') ? afficherContenuMenu() : '<!-- '.'Aucun menu pour cette application'.' -->');
}
else {
$GLOBALS['_PAPYRUS_']['rendu']['CONTENU_MENU'] = (function_exists('afficherContenuMenu') ? afficherContenuMenu() : '<!-- '.'Aucun menu pour cette application'.' -->');
}
 
// Contenu pied
// Appel de la fonction afficherContenuPied() si elle existe.
$GLOBALS['_PAPYRUS_']['rendu']['CONTENU_PIED'] = (function_exists('afficherContenuPied') ? afficherContenuPied() : '<!-- '.'Aucun contenu pied'.' -->');
 
// Compilation du contenu de l'application
$GLOBALS['_PAPYRUS_']['general']['contenu_application'] = $GLOBALS['_PAPYRUS_']['rendu']['CONTENU_NAVIGATION'].
$GLOBALS['_PAPYRUS_']['rendu']['CONTENU_TETE'].
$GLOBALS['_PAPYRUS_']['rendu']['CONTENU_CORPS'].
$GLOBALS['_PAPYRUS_']['rendu']['CONTENU_MENU'].
$GLOBALS['_PAPYRUS_']['rendu']['CONTENU_PIED'];
 
// +------------------------------------------------------------------------------------------------------+
// Continuation recherche d'info provenant de Papyrus pour la complétion du squelette
 
// Une fois l'application appelé est exécuté nous affichons le contenu de l'entête qui a pu
// être modifié par l'application.
$GLOBALS['_PAPYRUS_']['rendu']['META_HTTP_EQUIV'] = GEN_afficherMeta('http-equiv');
$GLOBALS['_PAPYRUS_']['rendu']['META_PROPERTY'] = GEN_afficherMeta('property');
$GLOBALS['_PAPYRUS_']['rendu']['META_NAME'] = GEN_afficherMeta('name');
$GLOBALS['_PAPYRUS_']['rendu']['META_NAME_DC'] = GEN_afficherMeta('dc');
// Nous récupérons tout les styles CSS pour l'afficher dans l'entête de la page.
$GLOBALS['_PAPYRUS_']['rendu']['STYLES'] = GEN_afficherStyle();
// Nous récupérons tout le Javascript pour l'afficher dans l'entête de la page.
$GLOBALS['_PAPYRUS_']['rendu']['SCRIPTS'] = GEN_afficherScript();
$GLOBALS['_PAPYRUS_']['rendu']['VERSION'] = PAP_VERSION;
 
// +------------------------------------------------------------------------------------------------------+
// Remplacement des balises des applettes de Papyrus et des Clients dans le squelette avant les appli
$PapRendu->remplacerBaliseApplette();
 
// +------------------------------------------------------------------------------------------------------+
// Gestion des inclusions des fichiers d'applettes présentes dans le contenu généré par l'application
if (!isset($GLOBALS['_PAPYRUS_']['applette']['analyse']) || $GLOBALS['_PAPYRUS_']['applette']['analyse'] == true) {
// Puisque l'application autorise l'analyse, nous l'effectuons:
$PapRendu->parserBaliseApplette($GLOBALS['_PAPYRUS_']['general']['contenu_application'], true);
}
 
// +------------------------------------------------------------------------------------------------------+
// Remplacement des balises Papyrus dans le squelette, le contenu généré par l'appli est remplacé.
foreach ($GLOBALS['_PAPYRUS_']['rendu'] as $GLOBALS['_PAPYRUS_']['tmp']['cle'] => $GLOBALS['_PAPYRUS_']['tmp']['val']) {
$GLOBALS['_PAPYRUS_']['general']['contenu_squelette'] =
str_replace( '<!-- '.$_GEN_commun['balise_prefixe'].$GLOBALS['_PAPYRUS_']['tmp']['cle'].' -->',
$GLOBALS['_PAPYRUS_']['tmp']['val'],
$GLOBALS['_PAPYRUS_']['general']['contenu_squelette']);
}
 
// +------------------------------------------------------------------------------------------------------+
// Remplacement des balises des applettes de Papyrus et des Clients dans le contenu de l'application si nécessaire
if ($PapRendu->getBoolBaliseAppli()) {
$PapRendu->remplacerBaliseApplette();
}
 
// +------------------------------------------------------------------------------------------------------+
// Stokage du squelette dans un variable globale après avoir remplacer les balises Papyrus.
$GLOBALS['_GEN_commun']['sortie'] = $GLOBALS['_PAPYRUS_']['general']['contenu_squelette'];
 
/* +--Fin du code ---------------------------------------------------------------------------------------+
*
* $Log: not supported by cvs2svn $
* Revision 1.42 2007-11-29 10:53:48 jp_milcent
* Correction du bogue nom de balise identique à une applette.
*
* Revision 1.41 2007-11-27 14:02:55 alexandre_tb
* Fusion avec la livraison AHA : 27 novembre 2007
*
* Revision 1.40.4.1 2007-11-27 14:01:10 alexandre_tb
* Ajout de balise Papyrus concernant le menu.
*
* Revision 1.40 2007/04/20 14:08:24 neiluj
* correction bug
*
* Revision 1.39 2007/04/19 16:54:52 ddelon
* backport mulitlinguisme
*
* Revision 1.38 2007/04/19 15:34:35 neiluj
* préparration release (livraison) "Narmer" - v0.25
*
* Revision 1.37 2007/04/13 09:41:09 neiluj
* réparration cvs
*
* Revision 1.36 2006/12/13 17:17:41 jp_milcent
* Suppression de l'analyse par Text_Wiki.
*
* Revision 1.35 2006/12/12 17:15:57 jp_milcent
* Correction bogue : mauvais ordre pour parser les balises.
*
* Revision 1.34 2006/12/12 13:56:33 jp_milcent
* Modification de l'ordre de remplacement des balises pour permettre aux apllettes d'interagir sur le contenu de l'application.
*
* Revision 1.33 2006/12/08 15:59:17 jp_milcent
* Suppression de code inutile.
*
* Revision 1.32 2006/12/01 17:05:34 florian
* Correction bogue d'opérateur.
*
* Revision 1.31 2006/12/01 16:59:45 florian
* Ajout d'une variable parametrant la recherche de balise d'applette dans le contenu généré par l'appli.
*
* Revision 1.30 2006/12/01 16:41:04 florian
* Début gestion de l'appel des applettes dans le squelette comme dans le contenu généré par l'application.
*
* Revision 1.29 2006/04/20 09:45:30 alexandre_tb
* ligne 92, remplacement de gs_fichier_squelette par gm_fichier_squelette, car on appelle le squelette du menu (s'il existe) et non du site.
* Posait un pb lors de l'affichage de squelettes (de menu) des traductions de menu
*
* Revision 1.28 2006/03/13 21:00:20 ddelon
* Suppression messages d'erreur multilinguisme
*
* Revision 1.27 2006/03/02 13:45:27 ddelon
* Balise url page
*
* Revision 1.26 2006/03/02 10:49:49 ddelon
* Fusion branche multilinguisme dans branche principale
*
* Revision 1.25 2005/12/09 15:07:07 florian
* suppression de debogage.css, pour optimiser les performances (c'est intégré dans la feuille de style par défaut dorénavant)
*
* Revision 1.24.2.6 2006/03/01 22:28:15 ddelon
* Balise url page
*
* Revision 1.24.2.5 2006/03/01 22:09:49 ddelon
* Balise url page
*
* Revision 1.24.2.4 2006/02/28 15:54:07 ddelon
* Integration branche principale
*
* Revision 1.24.2.3 2006/02/28 14:02:09 ddelon
* Finition multilinguisme
*
* Revision 1.24.2.2 2006/01/19 21:26:20 ddelon
* Multilinguisme site + bug ftp
*
* Revision 1.24.2.1 2005/12/20 14:40:24 ddelon
* Fusion Head vers Livraison
*
* Revision 1.25 2005/12/09 15:07:07 florian
* suppression de debogage.css, pour optimiser les performances (c'est intégré dans la feuille de style par défaut dorénavant)
*
* Revision 1.24 2005/10/21 22:22:16 ddelon
* projet wikini : fiche synthese
*
* Revision 1.23 2005/10/20 13:12:18 ddelon
* Gestion protection menu
*
* Revision 1.22 2005/10/20 10:28:25 ddelon
* Wikini complet dans l'intégrateur Wikini
*
* Revision 1.21 2005/10/17 13:41:34 ddelon
* Projet Wikini
*
* Revision 1.20 2005/10/17 10:52:00 jp_milcent
* Mise en majuscule du jeu de caractère, conformément à la recommandation.
*
* Revision 1.19 2005/10/12 17:20:33 ddelon
* Reorganisation calendrier + applette
*
* Revision 1.18 2005/09/22 14:02:49 ddelon
* nettoyage annuaire et php5
*
* Revision 1.17 2005/09/20 17:01:22 ddelon
* php5 et bugs divers
*
* Revision 1.16 2005/07/12 09:13:15 alexandre_tb
* Déplacement de l'appel de la fonction afficherContenuMenu APRES l'appel de afficherContenuCorps.
* Le menu d'une application étant calculé après les opérations de l'application.
*
* Revision 1.15 2005/07/08 21:13:15 ddelon
* Gestion indentation menu
*
* Revision 1.14 2005/05/11 14:31:45 jpm
* Ajout de la fonction afficherContenuMenu() pour les applications.
*
* Revision 1.13 2005/04/21 16:46:39 jpm
* Gestion via Papyrus du XHTML de Text_Wiki_Papyrus.
*
* Revision 1.12 2005/03/02 11:04:36 jpm
* Modification de l'utilisation d'une variable globale.
*
* Revision 1.11 2005/02/28 11:20:42 jpm
* Modification des auteurs.
*
* Revision 1.10 2005/01/26 16:20:46 jpm
* Correction bogue meta : auteurs et mots-clés mélangés.
*
* Revision 1.9 2004/12/06 19:39:40 jpm
* Correction langue DC.
*
* Revision 1.8 2004/11/26 19:02:07 jpm
* Comptabilisation du nombre d'appel de chaque applette dans le squelette.
*
* Revision 1.7 2004/11/24 18:33:29 jpm
* Encapsulation des variables dans le tableau global _PAPYRUS_.
*
* Revision 1.6 2004/11/15 17:40:21 jpm
* Gestion d'un espace de nom pour les balises Papyrus.
*
* Revision 1.5 2004/10/26 18:42:54 jpm
* Gestion de la fonction de navigation pour les appli Papyrus.
*
* Revision 1.4 2004/10/25 16:28:47 jpm
* Ajout de nouvelles balises Papyrus, ajout vérification mise à jour de Papyrus, meilleure gestion des sessions...
*
* Revision 1.3 2004/10/22 17:23:35 jpm
* Amélioration de la gestion de l'erreur si pas d'appli.
*
* Revision 1.2 2004/06/17 08:04:44 jpm
* Changement de constante pour les chemin d'accès à la biblio de code de Papyrus.
*
* Revision 1.1 2004/06/16 08:13:58 jpm
* Changement de nom de Papyrus en Papyrus.
* Changement de l'arborescence.
*
* Revision 1.32 2004/05/10 12:24:55 jpm
* Amélioration de la recherche des fichiers de squelette.
*
* Revision 1.31 2004/05/05 10:42:35 jpm
* Amélioration de la gestion de l'internationalisation.
*
* Revision 1.30 2004/05/05 08:25:37 jpm
* Modification de la façon d'ajouter la feuille de style de débogage pour qu'elle soit prise en compte par défaut.
*
* Revision 1.29 2004/05/03 14:12:04 jpm
* Suppression du fichier bibliothèque de fonctions sur gen_menu.
*
* Revision 1.28 2004/05/03 11:21:58 jpm
* Fin de la gestion des applettes et suppression de l'info_menu_hierarchie de _GEN_commun.
*
* Revision 1.27 2004/05/01 17:22:55 jpm
* Appel de la bibliothèque de fonctions concernant les menus.
*
* Revision 1.26 2004/05/01 16:19:36 jpm
* Suppression du code ayant pu être transformé en applettes (menu multi-niveaux, menu unique, menu commun, identification, sélecteur de sites).
*
* Revision 1.25 2004/05/01 11:39:38 jpm
* Déplacement du code gérant les applettes et du code de récupération du contenu du fichier squelette.
*
* Revision 1.24 2004/04/28 12:04:31 jpm
* Changement du modèle de la base de données.
*
* Revision 1.23 2004/04/22 08:30:47 jpm
* Transformation de $GS_GLOBAL en $_GEN_commun.
*
* Revision 1.22 2004/04/21 07:55:02 jpm
* Ajout de la feuille de style de débogage si le débogage de Papyrus est activé.
*
* Revision 1.19 2004/04/09 16:20:54 jpm
* Extraction de la gestion du cache et de l'envoi.
* Gestion des tables i18n.
*
* Revision 1.18 2004/04/08 12:29:48 jpm
* Début amélioration de la gestion du cache et de la compression des pages de Papyrus.
*
* Revision 1.17 2004/04/05 16:38:04 jpm
* Utilisation des nouvelles fonctions gérant l'insertion du Javascript.
*
* Revision 1.16 2004/04/02 16:30:56 jpm
* Gestion de la balise Papyrus IDENTIFICATION permettant l'envoie d'un formulaire de login.
*
* Revision 1.15 2004/04/01 11:27:13 jpm
* Ajout et modification de commentaires pour PhpDocumentor.
*
* Revision 1.14 2004/03/31 16:50:10 jpm
* Prise en compte du nouveau modèle de Papyrus révision 1.9.
*
* Revision 1.13 2004/03/27 11:07:45 jpm
* Modification des commentaires vis à vis du nouveau modèle.
* Mise en conformité avec la convention de codage.
* Amélioration du code.
*
* Revision 1.12 2004/03/23 17:06:44 jpm
* Ajout de commentaire dans l'entête.
* Mise en conformité avec la convention de codage.
*
* +-- Fin du code ----------------------------------------------------------------------------------------+
*/
?>
<?php
/*vim: set expandtab tabstop=4 shiftwidth=4: */
// Copyright (C) 1999-2004 Tela Botanica (accueil@tela-botanica.org)
//
// Ce logiciel est un programme informatique servant � g�rer du contenu et des
// applications web.
// Ce logiciel est r�gi par la licence CeCILL soumise au droit fran�ais et
// respectant les principes de diffusion des logiciels libres. Vous pouvez
// utiliser, modifier et/ou redistribuer ce programme sous les conditions
// de la licence CeCILL telle que diffus�e par le CEA, le CNRS et l'INRIA
// sur le site "http://www.cecill.info".
 
// En contrepartie de l'accessibilit� au code source et des droits de copie,
// de modification et de redistribution accord�s par cette licence, il n'est
// offert aux utilisateurs qu'une garantie limit�e. Pour les m�mes raisons,
// seule une responsabilit� restreinte p�se sur l'auteur du programme, le
// titulaire des droits patrimoniaux et les conc�dants successifs.
 
// A cet �gard l'attention de l'utilisateur est attir�e sur les risques
// associ�s au chargement, � l'utilisation, � la modification et/ou au
// d�veloppement et � la reproduction du logiciel par l'utilisateur �tant
// donn� sa sp�cificit� de logiciel libre, qui peut le rendre complexe �
// manipuler et qui le r�serve donc � des d�veloppeurs et des professionnels
// avertis poss�dant des connaissances informatiques approfondies. Les
// utilisateurs sont donc invit�s � charger et tester l'ad�quation du
// logiciel � leurs besoins dans des conditions permettant d'assurer la
// s�curit� de leurs syst�mes et ou de leurs donn�es et, plus g�n�ralement,
// � l'utiliser et l'exploiter dans les m�mes conditions de s�curit�.
 
// Le fait que vous puissiez acc�der � cet en-t�te signifie que vous avez
// pris connaissance de la licence CeCILL, et que vous en avez accept� les
// termes.
// ----
// CVS : $Id: pap_rendu.inc.php,v 1.43 2008-03-17 18:33:46 jp_milcent Exp $
/**
* Rendu : programme traitant l'url demand�e et retournant la page compress� au navigateur.
*
* Ce programme contient la partie collectant les informations sur la page demand�e par le navigateur client.
* Elle v�rifie que la page ne soit pas d�j� pr�sente en cache et la renvoie si elle est disponible.
* Elle recherche ensuite l'application li�e � la page demand�e. Elle ex�cute cette application et r�cup�re le
* contenu XHTML � afficher, le stocke en cache, le compresse et le renvoi au navigateur client.
*
*@package Papyrus
//Auteur original :
*@author Jean-Pascal MILCENT <jpm@tela-botanica.org>
//Autres auteurs :
*@author Alexandre GRANIER <alexandre@tela-botanica.org>
*@author Laurent COUDOUNEAU <laurent.coudouneau@ema.fr>
*@copyright Tela-Botanica 2000-2004
*@version $Revision: 1.43 $ $Date: 2008-03-17 18:33:46 $
// +------------------------------------------------------------------------------------------------------+
*/
 
// TODO : revoir les initialisation en l'absence de menu par defaut
 
// +------------------------------------------------------------------------------------------------------+
// | ENT�TE du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
 
/** Inclusion de la biblioth�que de fonctions servant � l'insertion de meta informations pour une page donn�e.*/
include_once GEN_CHEMIN_BIBLIO.'pap_meta.fonct.php';
 
/** Inclusion de la biblioth�que de fonctions servant � l'insertion de styles pour une page donn�e.*/
include_once GEN_CHEMIN_BIBLIO.'pap_style.fonct.php';
 
/** Inclusion de la biblioth�que de fonctions servant � l'insertion de scripts pour une page donn�e.*/
include_once GEN_CHEMIN_BIBLIO.'pap_script.fonct.php';
 
/** Inclusion de la classe servant au rendu de Papyrus.*/
include_once GEN_CHEMIN_BIBLIO_CLASSE.'pap_rendu.class.php';
 
// +------------------------------------------------------------------------------------------------------+
// | CORPS du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
 
// Recherche du squelette de la page demand�e.
 
// Ouverture du squelette
if (empty($GLOBALS['_GEN_commun']['info_menu']->gm_fichier_squelette)) {
if (isset($GLOBALS['_GEN_commun']['traduction_info_site'])) {
$GLOBALS['_PAPYRUS_']['general']['chemin_squelette'] = $GLOBALS['_GEN_commun']['traduction_info_site']->gs_fichier_squelette;
} else {
$GLOBALS['_PAPYRUS_']['general']['chemin_squelette'] = $GLOBALS['_GEN_commun']['info_site']->gs_fichier_squelette;
}
} else {
if (isset($GLOBALS['_GEN_commun']['traduction_info_menu'])) {
$GLOBALS['_PAPYRUS_']['general']['chemin_squelette'] = $GLOBALS['_GEN_commun']['traduction_info_menu']->gm_fichier_squelette;
} else {
$GLOBALS['_PAPYRUS_']['general']['chemin_squelette'] = $GLOBALS['_GEN_commun']['info_menu']->gm_fichier_squelette;
}
}
 
// Si l'information concernant le chemin est r�ellement un chemin
if (! file_exists($GLOBALS['_PAPYRUS_']['general']['chemin_squelette'])) {
//Si ce n'est qu'un nom de fichier squelette
$GLOBALS['_PAPYRUS_']['general']['chemin_test'] = GEN_CHEMIN_SITES.
$GLOBALS['_GEN_commun']['info_site']->gs_code_alpha.'/'.
$GLOBALS['_GEN_commun']['i18n'].'/'.GEN_DOSSIER_SQUELETTE.'/'.$GLOBALS['_PAPYRUS_']['general']['chemin_squelette'];
if (! file_exists($GLOBALS['_PAPYRUS_']['general']['chemin_test'])) {
die('ERREUR Papyrus : Impossible de trouver de fichier de squelette. <br />'.
'Chemin fichier squelette : '.$GLOBALS['_PAPYRUS_']['general']['chemin_squelette'].' <br />'.
'Ligne n� : '. __LINE__ .'<br />'.
'Fichier : '. __FILE__ );
} else {
$GLOBALS['_PAPYRUS_']['general']['chemin_squelette'] = $GLOBALS['_PAPYRUS_']['general']['chemin_test'];
}
}
 
// +------------------------------------------------------------------------------------------------------+
// R�cup�ration du contenu du fichier de squelette de la page demand�e.
/*
// Lecture du fichier de squelette XHTML en PHP 4.1.2
$tab_fichier_squelette = file($chemin_squelette);
$contenu_squelette = '';
for ($i = 0; $i < count($tab_fichier_squelette); $i++) {
$contenu_squelette .= $tab_fichier_squelette[$i];
}
*/
// Lecture du fichier de squelette XHTML en PHP 4.3
 
// +------------------------------------------------------------------------------------------------------+
// Gestion des traductions
 
// Si le r<E9>sultat de la n<E9>gociation de l'internationalisation donne une langue diff<E9>rente
// de celle du site principal, nous r<E9>cup<E9>rons les <E9>ventuelles valeurs traduite pour le site.
 
 
$id_langue = $GLOBALS['_GEN_commun']['i18n'];
 
if (isset($id_langue) && ($id_langue!='')) {
$langue_test=$id_langue;
} else {
$langue_test=GEN_I18N_ID_DEFAUT;
}
 
$requete = 'SELECT * '.
'FROM gen_site '.
'WHERE gs_ce_i18n = "'.$langue_test.'" '.
// 'WHERE gs_ce_i18n = "'.$_GEN_commun['i18n'].'" '.
'AND gs_code_num = "'.$GLOBALS['_GEN_commun']['info_site']->gs_code_num.'"';
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
 
// Nous cr<E9><E9>ons l'entr<E9>e 'traduction_info_site' dans _GEN_commun que si nous avons bien trouv<E9> une
// traduction pour le site. Il faut donc tester l'existence de cette entr<E9>e avant de l'utiliser.
 
 
if ($resultat->numRows() > 0) {
$GLOBALS['_GEN_commun']['traduction_info_site'] = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
}
$resultat->free();
 
// Si le r<E9>sultat de la n<E9>gociation de l'internationalisation donne une langue diff<E9>rente
// de celle du menu, nous r<E9>cup<E9>rons les <E9>ventuelles valeurs traduite pour le menu.
 
// si pas d'application, $GLOBALS['_GEN_commun']['info_menu'] => NULL
// donc on test pour prévenir d'une erreur en bas de page :
// trying to get property of non-object element.
// --julien
if(isset($GLOBALS['_GEN_commun']['info_menu']))
{
// R<E9>cup<E9>ration des informations sur la traduction du menu
$requete = 'SELECT * '.
'FROM gen_menu '.
'WHERE gm_ce_i18n = "'.$langue_test.'" '.
// 'WHERE gm_ce_i18n = "'.$_GEN_commun['i18n'].'" '.
'AND gm_code_num = "'.$GLOBALS['_GEN_commun']['info_menu']->gm_code_num.'"';
$resultat = $db->query($requete);
(DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
// Nous cr<E9><E9>ons l'entr<E9>e 'traduction_info_menu' dans _GEN_commun que si nous avons bien trouv<E9> une
// traduction pour le menu. Il faut donc tester l'existence de cette entr<E9>e avant de l'utiliser.
if ($resultat->numRows() > 0) {
$_GEN_commun['traduction_info_menu'] = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
}
$resultat->free();
}
 
 
if (isset($GLOBALS['_GEN_commun']['traduction_info_site'])) {
$type_site='traduction_info_site';
}
else {
$type_site='info_site';
}
 
if (isset($GLOBALS['_GEN_commun']['traduction_info_menu'])) {
$type_menu='traduction_info_menu';
}
else {
$type_menu='info_menu';
}
 
 
$GLOBALS['_PAPYRUS_']['general']['contenu_squelette'] = file_get_contents($GLOBALS['_PAPYRUS_']['general']['chemin_squelette']);
 
// +------------------------------------------------------------------------------------------------------+
// Recherche des informations pour la compl�tion de l'ent�te du squelette de la page demand�e.
 
if (isset($GLOBALS['_GEN_commun'][$type_menu])) {
// Construction du titre.
if (! empty($GLOBALS['_GEN_commun'][$type_menu]->gm_titre)) {
$GLOBALS['_PAPYRUS_']['page']['titre'] = htmlentities($GLOBALS['_GEN_commun'][$type_menu]->gm_titre);
} else if (! empty($GLOBALS['_GEN_commun']['info_menu']->gm_titre_alternatif)) {
$GLOBALS['_PAPYRUS_']['page']['titre'] = htmlentities($GLOBALS['_GEN_commun'][$type_menu]->gm_titre_alternatif);
} else {
$GLOBALS['_PAPYRUS_']['page']['titre'] = htmlentities($GLOBALS['_GEN_commun'][$type_menu]->gm_nom);
}
}
else {
$GLOBALS['_PAPYRUS_']['page']['titre']='';
}
$GLOBALS['_PAPYRUS_']['rendu']['TITRE_PAGE'] = $GLOBALS['_PAPYRUS_']['page']['titre'];
 
// Construction des infos sur le site
$GLOBALS['_PAPYRUS_']['page']['nom_site'] = htmlentities($GLOBALS['_GEN_commun'][$type_site]->gs_nom);
$GLOBALS['_PAPYRUS_']['rendu']['SITE_NOM'] = $GLOBALS['_PAPYRUS_']['page']['nom_site'];
$GLOBALS['_PAPYRUS_']['page']['langue_site'] = htmlentities($GLOBALS['_GEN_commun']['i18n']);
$GLOBALS['_PAPYRUS_']['rendu']['SITE_LANGUE'] = $GLOBALS['_PAPYRUS_']['page']['langue_site'];
$GLOBALS['_PAPYRUS_']['page']['code_alpha_site'] = htmlentities($GLOBALS['_GEN_commun'][$type_site]->gs_code_alpha);
$GLOBALS['_PAPYRUS_']['rendu']['SITE_CODE_ALPHA'] = $GLOBALS['_PAPYRUS_']['page']['code_alpha_site'];
 
// Construction des infos sur le menu pour générer les balises
$GLOBALS['_PAPYRUS_']['rendu']['INFO_MENU_ID'] = htmlentities($GLOBALS['_GEN_commun'][$type_menu]->gm_id_menu);
$GLOBALS['_PAPYRUS_']['rendu']['INFO_MENU_CODE_ALPHA'] = htmlentities($GLOBALS['_GEN_commun'][$type_menu]->gm_code_alpha);
$GLOBALS['_PAPYRUS_']['rendu']['INFO_MENU_CODE_NUM'] = htmlentities($GLOBALS['_GEN_commun'][$type_menu]->gm_code_num);
 
//Construction des infos sur le contexte d'affichage de la page
$une_url = new Net_URL();
$une_url->addQueryString("site",$GLOBALS['_GEN_commun']['url_site']);
$une_url->removeQueryString("langue");
$GLOBALS['_PAPYRUS_']['rendu']['PAGE_URL'] = $une_url->getUrl();
 
 
// Construction des Meta "http-equiv".
$_GEN_commun['meta_http_equiv'] = array();
$GLOBALS['_PAPYRUS_']['page']['jeu_de_caracteres'] = htmlentities(strtoupper($_GEN_commun['info_i18n']->gi_jeu_de_caracteres));
$GLOBALS['_PAPYRUS_']['rendu']['SITE_JEU_DE_CARACTERES'] = $GLOBALS['_PAPYRUS_']['page']['jeu_de_caracteres'];
$GLOBALS['_PAPYRUS_']['page']['langue'] = htmlentities($GLOBALS['_GEN_commun']['info_i18n_langue']->gil_id_langue);
$GLOBALS['_PAPYRUS_']['rendu']['SITE_LANGUE'] = $GLOBALS['_PAPYRUS_']['page']['langue'];
GEN_stockerMetaHttpEquiv('Content-Type', 'text/html; charset='.$GLOBALS['_PAPYRUS_']['page']['jeu_de_caracteres']);
GEN_stockerMetaHttpEquiv('Content-style-type', 'text/css');
GEN_stockerMetaHttpEquiv('Content-script-type', 'text/javascript');
GEN_stockerMetaHttpEquiv('Content-language', $GLOBALS['_PAPYRUS_']['page']['langue']);
 
// Construction des Meta "name".
$GLOBALS['_GEN_commun']['meta_name'] = array();
if (isset($GLOBALS['_GEN_commun'][$type_menu])) {
$GLOBALS['_PAPYRUS_']['page']['robot'] = htmlentities($GLOBALS['_GEN_commun'][$type_menu]->gm_robot);
$GLOBALS['_PAPYRUS_']['page']['auteur'] = htmlentities($GLOBALS['_GEN_commun'][$type_menu]->gm_auteur);
}
else {
$GLOBALS['_PAPYRUS_']['page']['robot'] = '';
$GLOBALS['_PAPYRUS_']['page']['auteur'] = '';
}
if (empty($GLOBALS['_PAPYRUS_']['page']['auteur'])) {
$GLOBALS['_PAPYRUS_']['page']['auteur'] = htmlentities($GLOBALS['_GEN_commun'][$type_site]->gs_auteur);
}
if (isset($GLOBALS['_GEN_commun']['info_menu'])) {
$GLOBALS['_PAPYRUS_']['page']['mots_cles'] = htmlentities($GLOBALS['_GEN_commun'][$type_menu]->gm_mots_cles);
}
if (empty($GLOBALS['_PAPYRUS_']['page']['mots_cles'])) {
$GLOBALS['_PAPYRUS_']['page']['mots_cles'] = htmlentities($GLOBALS['_GEN_commun'][$type_site]->gs_mots_cles);
}
if (isset($GLOBALS['_GEN_commun']['info_menu'])) {
$GLOBALS['_PAPYRUS_']['page']['description_libre'] = htmlentities($GLOBALS['_GEN_commun'][$type_menu]->gm_description_libre);
}
if (empty($GLOBALS['_PAPYRUS_']['page']['description_libre'])) {
$GLOBALS['_PAPYRUS_']['page']['description_libre'] = htmlentities($GLOBALS['_GEN_commun'][$type_site]->gs_description);
}
 
 
GEN_stockerMetaName('revisit-after', '15 days');
GEN_stockerMetaName('robots', $GLOBALS['_PAPYRUS_']['page']['robot']);
// la meta "author" est récupérée par Facebook alors on préfère s'en débarrasser
GEN_stockerMetaName('author', 'Tela Botanica');
GEN_stockerMetaName('real-author', $GLOBALS['_PAPYRUS_']['page']['auteur']);
GEN_stockerMetaName('keywords', $GLOBALS['_PAPYRUS_']['page']['mots_cles']);
GEN_stockerMetaName('description', $GLOBALS['_PAPYRUS_']['page']['description_libre']);
 
// Meta OpenGraph par défaut
GEN_stockerMetaProperty('og:type', 'website');
//GEN_stockerMetaProperty('og:title', 'eFlore');
GEN_stockerMetaProperty('og:site_name', 'Tela Botanica');
//GEN_stockerMetaProperty('og:description', 'eFlore, la flore &eacute;lectronique collaborative en ligne');
GEN_stockerMetaProperty('og:image', 'http://resources.tela-botanica.org/tb/img/256x256/carre_englobant.png');
GEN_stockerMetaProperty('og:image:type', 'image/png');
GEN_stockerMetaProperty('og:image:width', '256');
GEN_stockerMetaProperty('og:image:height', '256');
GEN_stockerMetaProperty('og:locale', 'fr_FR');
 
// Construction des Meta Meta "name" du Dublin Core.
 
if (isset($GLOBALS['_GEN_commun']['info_menu'])) {
$GLOBALS['_PAPYRUS_']['page']['titre_alternatif'] = htmlentities($GLOBALS['_GEN_commun'][$type_menu]->gm_titre_alternatif);
$GLOBALS['_PAPYRUS_']['page']['auteur'] = htmlentities($GLOBALS['_GEN_commun'][$type_menu]->gm_auteur);
$GLOBALS['_PAPYRUS_']['page']['description_resume'] = htmlentities($GLOBALS['_GEN_commun'][$type_menu]->gm_description_resume);
$GLOBALS['_PAPYRUS_']['page']['description_table_matieres'] = htmlentities($GLOBALS['_GEN_commun'][$type_menu]->gm_description_table_matieres);
$GLOBALS['_PAPYRUS_']['page']['publieur'] = htmlentities($GLOBALS['_GEN_commun'][$type_menu]->gm_editeur);
$GLOBALS['_PAPYRUS_']['page']['contributeur'] = htmlentities($GLOBALS['_GEN_commun'][$type_menu]->gm_contributeur);
$GLOBALS['_PAPYRUS_']['page']['date_creation'] = htmlentities($GLOBALS['_GEN_commun'][$type_menu]->gm_date_creation);
$GLOBALS['_PAPYRUS_']['page']['date_soumission'] = htmlentities($GLOBALS['_GEN_commun'][$type_menu]->gm_date_soumission);
$GLOBALS['_PAPYRUS_']['page']['date_acceptation'] = htmlentities($GLOBALS['_GEN_commun'][$type_menu]->gm_date_acceptation);
$GLOBALS['_PAPYRUS_']['page']['periode_validite'] = htmlentities($GLOBALS['_GEN_commun'][$type_menu]->gm_date_debut_validite);
$GLOBALS['_PAPYRUS_']['page']['date_copyright'] = htmlentities($GLOBALS['_GEN_commun'][$type_menu]->gm_date_copyright);
$GLOBALS['_PAPYRUS_']['page']['source'] = htmlentities($GLOBALS['_GEN_commun'][$type_menu]->gm_source);
}
else {
$GLOBALS['_PAPYRUS_']['page']['titre_alternatif'] = '';
$GLOBALS['_PAPYRUS_']['page']['auteur'] = '';
$GLOBALS['_PAPYRUS_']['page']['description_resume'] = '';
$GLOBALS['_PAPYRUS_']['page']['description_table_matieres'] = '';
$GLOBALS['_PAPYRUS_']['page']['publieur'] = '';
$GLOBALS['_PAPYRUS_']['page']['contributeur'] = '';
$GLOBALS['_PAPYRUS_']['page']['date_creation'] = '';
$GLOBALS['_PAPYRUS_']['page']['date_soumission'] = '';
$GLOBALS['_PAPYRUS_']['page']['date_acceptation'] = '';
$GLOBALS['_PAPYRUS_']['page']['periode_validite'] = '';
$GLOBALS['_PAPYRUS_']['page']['date_copyright'] = '';
$GLOBALS['_PAPYRUS_']['page']['source'] = '';
}
 
if ((isset($GLOBALS['_GEN_commun']['info_i18n_pays'])) && ($GLOBALS['_GEN_commun']['info_i18n_pays']->gip_id_pays != '')) {
$GLOBALS['_PAPYRUS_']['page']['langue_rfc_3066'] = $GLOBALS['_PAPYRUS_']['page']['langue'].'-'.htmlentities($GLOBALS['_GEN_commun']['info_i18n_pays']->gip_id_pays);
} else {
$GLOBALS['_PAPYRUS_']['page']['langue_rfc_3066'] = $GLOBALS['_PAPYRUS_']['page']['langue'];
}
if (isset($GLOBALS['_GEN_commun']['info_menu'])) {
$GLOBALS['_PAPYRUS_']['page']['type_portee_spatiale'] = htmlentities($GLOBALS['_GEN_commun'][$type_menu]->gm_ce_type_portee_spatiale);
$GLOBALS['_PAPYRUS_']['page']['portee_spatiale'] = htmlentities($GLOBALS['_GEN_commun'][$type_menu]->gm_portee_spatiale);
$GLOBALS['_PAPYRUS_']['page']['type_portee_temporelle'] = htmlentities($GLOBALS['_GEN_commun'][$type_menu]->gm_ce_type_portee_temporelle);
$GLOBALS['_PAPYRUS_']['page']['portee_temporelle'] = htmlentities($GLOBALS['_GEN_commun'][$type_menu]->gm_portee_temporelle);
$GLOBALS['_PAPYRUS_']['page']['licence'] = htmlentities($GLOBALS['_GEN_commun'][$type_menu]->gm_licence);
$GLOBALS['_PAPYRUS_']['page']['public'] = htmlentities($GLOBALS['_GEN_commun'][$type_menu]->gm_public);
$GLOBALS['_PAPYRUS_']['page']['public_niveau'] = htmlentities($GLOBALS['_GEN_commun'][$type_menu]->gm_public_niveau);
}
else {
$GLOBALS['_PAPYRUS_']['page']['type_portee_spatiale'] = '';
$GLOBALS['_PAPYRUS_']['page']['portee_spatiale'] = '';
$GLOBALS['_PAPYRUS_']['page']['type_portee_temporelle'] = '';
$GLOBALS['_PAPYRUS_']['page']['portee_temporelle'] = '';
$GLOBALS['_PAPYRUS_']['page']['licence'] = '';
$GLOBALS['_PAPYRUS_']['page']['public'] = '';
$GLOBALS['_PAPYRUS_']['page']['public_niveau'] = '';
}
 
GEN_stockerMetaNameDC('DC.Title', $GLOBALS['_PAPYRUS_']['page']['titre'], $GLOBALS['_PAPYRUS_']['page']['langue']);
GEN_stockerMetaNameDC('DC.Title.alternative', $GLOBALS['_PAPYRUS_']['page']['titre_alternatif'], $GLOBALS['_PAPYRUS_']['page']['langue']);
GEN_stockerMetaNameDC('DC.Creator', $GLOBALS['_PAPYRUS_']['page']['auteur']);
GEN_stockerMetaNameDC('DC.Subject', $GLOBALS['_PAPYRUS_']['page']['mots_cles'], $GLOBALS['_PAPYRUS_']['page']['langue']);
GEN_stockerMetaNameDC('DC.Description', $GLOBALS['_PAPYRUS_']['page']['description_libre'], $GLOBALS['_PAPYRUS_']['page']['langue']);
GEN_stockerMetaNameDC('DC.Description.abstract', $GLOBALS['_PAPYRUS_']['page']['description_resume'], $GLOBALS['_PAPYRUS_']['page']['langue']);
GEN_stockerMetaNameDC('DC.Description.tableOfContents', $GLOBALS['_PAPYRUS_']['page']['description_table_matieres'], $GLOBALS['_PAPYRUS_']['page']['langue']);
GEN_stockerMetaNameDC('DC.Publisher', $GLOBALS['_PAPYRUS_']['page']['publieur']);
GEN_stockerMetaNameDC('DC.Contributor', $GLOBALS['_PAPYRUS_']['page']['contributeur']);
GEN_stockerMetaNameDC('DC.Date.created', $GLOBALS['_PAPYRUS_']['page']['date_creation'], '', 'W3CDTF');
GEN_stockerMetaNameDC('DC.Date.valid', $GLOBALS['_PAPYRUS_']['page']['periode_validite'], '', 'W3CDTF');
//Ajouter la gestion des dates valid et available en utilisant les dates de la table gen_page_contenu.
GEN_stockerMetaNameDC('DC.Date.dateSubmitted', $GLOBALS['_PAPYRUS_']['page']['date_soumission'], '', 'W3CDTF');
GEN_stockerMetaNameDC('DC.Date.dateCopyrighted', $GLOBALS['_PAPYRUS_']['page']['date_copyright'], '', 'W3CDTF');
GEN_stockerMetaNameDC('DC.Date.dateAccepted', $GLOBALS['_PAPYRUS_']['page']['date_acceptation'], '', 'W3CDTF');
GEN_stockerMetaNameDC('DC.Source', $GLOBALS['_PAPYRUS_']['page']['source'], '', 'URI');
GEN_stockerMetaNameDC('DC.Language', $GLOBALS['_PAPYRUS_']['page']['langue_rfc_3066'], '', 'RFC3066');
GEN_stockerMetaNameDC('DC.Coverage.spatial', $GLOBALS['_PAPYRUS_']['page']['portee_spatiale'], '', $GLOBALS['_PAPYRUS_']['page']['type_portee_spatiale']);
GEN_stockerMetaNameDC('DC.Coverage.temporal', $GLOBALS['_PAPYRUS_']['page']['portee_temporelle'], '', $GLOBALS['_PAPYRUS_']['page']['type_portee_temporelle']);
GEN_stockerMetaNameDC('DC.Rights', $GLOBALS['_PAPYRUS_']['page']['licence'], '', 'URI');
GEN_stockerMetaNameDC('DC.Audience', $GLOBALS['_PAPYRUS_']['page']['public']);
GEN_stockerMetaNameDC('DC.Audience.educationLevel', $GLOBALS['_PAPYRUS_']['page']['public_niveau']);
 
// Construction des CSS
// D�claration des constantes contenant les CSS � afficher sur la page.
$GLOBALS['_GEN_commun']['style_type'] = 'text/css';
$GLOBALS['_GEN_commun']['style_integree'] = '';
$GLOBALS['_GEN_commun']['style_externe'] = array();
 
// Construction du Javascript
// D�claration des constantes contenant le Javascript � afficher sur la page.
$GLOBALS['_GEN_commun']['script_type'] = 'text/javascript';
$GLOBALS['_GEN_commun']['script_code'] = '';
$GLOBALS['_GEN_commun']['script_fonction'] = array();
$GLOBALS['_GEN_commun']['script_fichier'] = array();
 
// +------------------------------------------------------------------------------------------------------+
// Gestion de l'espace de nom pour les balise Papyrus
$GLOBALS['_GEN_commun']['balise_prefixe'] = 'PAPYRUS_';
$GLOBALS['_GEN_commun']['balise_prefixe_client'] = 'CLIENT_';
 
// +------------------------------------------------------------------------------------------------------+
// Gestion des inclusions des fichiers d'applettes pr�sentes dans le squelette
// TODO : Supprimer des fichiers du coeur de Papyrus, pr�c�dent ce fichier, la variable : $_GEN_commun['info_applette']
$GLOBALS['_PAPYRUS_']['info_applette'] = array();
$PapRendu = new Pap_Rendu();
$PapRendu->parserBaliseApplette($GLOBALS['_PAPYRUS_']['general']['contenu_squelette']);
 
// +------------------------------------------------------------------------------------------------------+
// Gestion de l'int�gration de l'application li�e au menu
 
// Une fois les applettes appel�es et execut�es nous appelons l'application qui peut avoir
// besoins des infos des applettes (c'est le cas, pour l'applette IDENTIFICATION).
$GLOBALS['_PAPYRUS_']['general']['application_chemin'] = '';
if (isset($GLOBALS['_GEN_commun']['info_application']->gap_chemin)) {
$GLOBALS['_PAPYRUS_']['general']['application_chemin'] = $GLOBALS['_GEN_commun']['info_application']->gap_chemin;
}
 
// Affichage contenu si identifi� (parametre : lecture = + )
 
$lecture = 0;
if ((isset($GLOBALS['_GEN_commun']['info_application']->lecture)) && ($GLOBALS['_GEN_commun']['info_application']->lecture=="+")) {
if ($GLOBALS['_GEN_commun']['pear_auth']->getAuth()) {
$lecture=1;
}
}
// Emplacement pour traiter les futurs cas :
else {
$lecture=1;
}
 
if (!$lecture) {
function afficherContenuCorps()
{
return '<p class="pap_erreur">'.'Pas autoris�, veuillez vous identifier.'.'</p>';
}
}
 
// $application_chemin contient le chemin de l'application
// Si $application_chemin est vide, on d�fini putFrame comme ne retournant rien.
 
if (empty($GLOBALS['_PAPYRUS_']['general']['application_chemin']) ) {
function afficherContenuCorps()
{
return '<p class="pap_erreur">'.'Pas d\'application.'.'</p>';
}
} else {
if (file_exists($GLOBALS['_PAPYRUS_']['general']['application_chemin'])) {
if (!function_exists('afficherContenuCorps')) {
include_once($GLOBALS['_PAPYRUS_']['general']['application_chemin']);
}
} else {
die('ERREUR Papyrus : application impossible � charger. <br />'.
'Chemin application : '.$GLOBALS['_PAPYRUS_']['general']['application_chemin'].' <br />'.
'Ligne n� : '. __LINE__ .'<br />'.
'Fichier : '. __FILE__ );
}
}
 
 
// +------------------------------------------------------------------------------------------------------+
// Recherche des informations provenant de l'application pour la compl�tion du squelette
 
// Contenu navigation
// Appel de la fonction afficherContenuNavigation() si elle existe.
$GLOBALS['_PAPYRUS_']['rendu']['CONTENU_NAVIGATION'] = (function_exists('afficherContenuNavigation') ? afficherContenuNavigation() : '<!-- '.'Aucune navigation'.' -->');
 
// Contenu t�te
// Appel de la fonction afficherContenuTete() si elle existe.
$GLOBALS['_PAPYRUS_']['rendu']['CONTENU_TETE'] = (function_exists('afficherContenuTete') ? afficherContenuTete() : '<!-- '.'Aucun contenu t�te'.' -->');
 
// Contenu corps
// Appel de la fonction afficherContenuCorps().
if (function_exists('afficherContenuCorps') ) {
$GLOBALS['_PAPYRUS_']['rendu']['CONTENU_CORPS'] = afficherContenuCorps();
} else {
$GLOBALS['_PAPYRUS_']['rendu']['CONTENU_CORPS'] =
'ERREUR Papyrus : fonction afficherContenuCorps() introuvable dans l\'application demand�e. <br />'.
'Ligne n� : '. __LINE__ .'<br />'.
'Fichier : '. __FILE__;
}
 
// Appel de la fonction afficherContenuMenu() si elle existe.
if (isset($GLOBALS['_PAPYRUS_']['rendu']['CONTENU_MENU'])) {
$GLOBALS['_PAPYRUS_']['rendu']['CONTENU_MENU'] .= (function_exists('afficherContenuMenu') ? afficherContenuMenu() : '<!-- '.'Aucun menu pour cette application'.' -->');
}
else {
$GLOBALS['_PAPYRUS_']['rendu']['CONTENU_MENU'] = (function_exists('afficherContenuMenu') ? afficherContenuMenu() : '<!-- '.'Aucun menu pour cette application'.' -->');
}
 
// Contenu pied
// Appel de la fonction afficherContenuPied() si elle existe.
$GLOBALS['_PAPYRUS_']['rendu']['CONTENU_PIED'] = (function_exists('afficherContenuPied') ? afficherContenuPied() : '<!-- '.'Aucun contenu pied'.' -->');
 
// Compilation du contenu de l'application
$GLOBALS['_PAPYRUS_']['general']['contenu_application'] = $GLOBALS['_PAPYRUS_']['rendu']['CONTENU_NAVIGATION'].
$GLOBALS['_PAPYRUS_']['rendu']['CONTENU_TETE'].
$GLOBALS['_PAPYRUS_']['rendu']['CONTENU_CORPS'].
$GLOBALS['_PAPYRUS_']['rendu']['CONTENU_MENU'].
$GLOBALS['_PAPYRUS_']['rendu']['CONTENU_PIED'];
 
// +------------------------------------------------------------------------------------------------------+
// Continuation recherche d'info provenant de Papyrus pour la completion du squelette
 
// +------------------------------------------------------------------------------------------------------+
// Remplacement des balises des applettes de Papyrus et des Clients dans le squelette avant les appli
$PapRendu->remplacerBaliseApplette();
 
// +------------------------------------------------------------------------------------------------------+
// Gestion des inclusions des fichiers d'applettes presentes dans le contenu genere par l'application
if (!isset($GLOBALS['_PAPYRUS_']['applette']['analyse']) || $GLOBALS['_PAPYRUS_']['applette']['analyse'] == true) {
// Puisque l'application autorise l'analyse, nous l'effectuons:
$PapRendu->parserBaliseApplette($GLOBALS['_PAPYRUS_']['general']['contenu_application'], true);
}
 
// Une fois l'application appel� est execut� nous affichons le contenu de l'ent�te qui a pu
// �tre modifi� par l'application.
$GLOBALS['_PAPYRUS_']['rendu']['META_HTTP_EQUIV'] = GEN_afficherMeta('http-equiv');
$GLOBALS['_PAPYRUS_']['rendu']['META_PROPERTY'] = GEN_afficherMeta('property');
/*if ($_SERVER['REMOTE_ADDR'] == '162.38.234.16') {
echo "coucou Debugger<br/>";
print_r($GLOBALS['_PAPYRUS_']['rendu']['META_PROPERTY']);
exit;
}*/
$GLOBALS['_PAPYRUS_']['rendu']['META_NAME'] = GEN_afficherMeta('name');
$GLOBALS['_PAPYRUS_']['rendu']['META_NAME_DC'] = GEN_afficherMeta('dc');
// Nous r�cup�rons tout les styles CSS pour l'afficher dans l'ent�te de la page.
$GLOBALS['_PAPYRUS_']['rendu']['STYLES'] = GEN_afficherStyle();
// Nous r�cup�rons tout le Javascript pour l'afficher dans l'ent�te de la page.
$GLOBALS['_PAPYRUS_']['rendu']['SCRIPTS'] = GEN_afficherScript();
$GLOBALS['_PAPYRUS_']['rendu']['VERSION'] = PAP_VERSION;
 
// +------------------------------------------------------------------------------------------------------+
// Remplacement des balises Papyrus dans le squelette, le contenu g�n�r� par l'appli est remplac�.
foreach ($GLOBALS['_PAPYRUS_']['rendu'] as $GLOBALS['_PAPYRUS_']['tmp']['cle'] => $GLOBALS['_PAPYRUS_']['tmp']['val']) {
$GLOBALS['_PAPYRUS_']['general']['contenu_squelette'] =
str_replace( '<!-- '.$_GEN_commun['balise_prefixe'].$GLOBALS['_PAPYRUS_']['tmp']['cle'].' -->',
$GLOBALS['_PAPYRUS_']['tmp']['val'],
$GLOBALS['_PAPYRUS_']['general']['contenu_squelette']);
}
 
// +------------------------------------------------------------------------------------------------------+
// Remplacement des balises des applettes de Papyrus et des Clients dans le contenu de l'application si n�cessaire
if ($PapRendu->getBoolBaliseAppli()) {
$PapRendu->remplacerBaliseApplette();
}
 
// +------------------------------------------------------------------------------------------------------+
// Stokage du squelette dans un variable globale apr�s avoir remplacer les balises Papyrus.
$GLOBALS['_GEN_commun']['sortie'] = $GLOBALS['_PAPYRUS_']['general']['contenu_squelette'];
 
/* +--Fin du code ---------------------------------------------------------------------------------------+
*
* $Log: pap_rendu.inc.php,v $
* Revision 1.43 2008-03-17 18:33:46 jp_milcent
* Maintenant les applettes peuvent incorporer des styles et du javascript...
*
* Revision 1.42 2007-11-29 10:53:48 jp_milcent
* Correction du bogue nom de balise identique à une applette.
*
* Revision 1.41 2007-11-27 14:02:55 alexandre_tb
* Fusion avec la livraison AHA : 27 novembre 2007
*
* Revision 1.40.4.1 2007-11-27 14:01:10 alexandre_tb
* Ajout de balise Papyrus concernant le menu.
*
* Revision 1.40 2007/04/20 14:08:24 neiluj
* correction bug
*
* Revision 1.39 2007/04/19 16:54:52 ddelon
* backport mulitlinguisme
*
* Revision 1.38 2007/04/19 15:34:35 neiluj
* préparration release (livraison) "Narmer" - v0.25
*
* Revision 1.37 2007/04/13 09:41:09 neiluj
* réparration cvs
*
* Revision 1.36 2006/12/13 17:17:41 jp_milcent
* Suppression de l'analyse par Text_Wiki.
*
* Revision 1.35 2006/12/12 17:15:57 jp_milcent
* Correction bogue : mauvais ordre pour parser les balises.
*
* Revision 1.34 2006/12/12 13:56:33 jp_milcent
* Modification de l'ordre de remplacement des balises pour permettre aux apllettes d'int�ragir sur le contenu de l'application.
*
* Revision 1.33 2006/12/08 15:59:17 jp_milcent
* Suppression de code inutile.
*
* Revision 1.32 2006/12/01 17:05:34 florian
* Correction bogue d'op�rateur.
*
* Revision 1.31 2006/12/01 16:59:45 florian
* Ajout d'une variable parametrant la recherche de balise d'applette dans le contenu g�n�r� par l'appli.
*
* Revision 1.30 2006/12/01 16:41:04 florian
* D�but gestion de l'appel des applettes dans le squelette comme dans le contenu g�n�r� par l'application.
*
* Revision 1.29 2006/04/20 09:45:30 alexandre_tb
* ligne 92, remplacement de gs_fichier_squelette par gm_fichier_squelette, car on appelle le squelette du menu (s'il existe) et non du site.
* Posait un pb lors de l'affichage de squelettes (de menu) des traductions de menu
*
* Revision 1.28 2006/03/13 21:00:20 ddelon
* Suppression messages d'erreur multilinguisme
*
* Revision 1.27 2006/03/02 13:45:27 ddelon
* Balise url page
*
* Revision 1.26 2006/03/02 10:49:49 ddelon
* Fusion branche multilinguisme dans branche principale
*
* Revision 1.25 2005/12/09 15:07:07 florian
* suppression de debogage.css, pour optimiser les performances (c'est intégré dans la feuille de style par défaut dorénavant)
*
* Revision 1.24.2.6 2006/03/01 22:28:15 ddelon
* Balise url page
*
* Revision 1.24.2.5 2006/03/01 22:09:49 ddelon
* Balise url page
*
* Revision 1.24.2.4 2006/02/28 15:54:07 ddelon
* Integration branche principale
*
* Revision 1.24.2.3 2006/02/28 14:02:09 ddelon
* Finition multilinguisme
*
* Revision 1.24.2.2 2006/01/19 21:26:20 ddelon
* Multilinguisme site + bug ftp
*
* Revision 1.24.2.1 2005/12/20 14:40:24 ddelon
* Fusion Head vers Livraison
*
* Revision 1.25 2005/12/09 15:07:07 florian
* suppression de debogage.css, pour optimiser les performances (c'est intégré dans la feuille de style par défaut dorénavant)
*
* Revision 1.24 2005/10/21 22:22:16 ddelon
* projet wikini : fiche synthese
*
* Revision 1.23 2005/10/20 13:12:18 ddelon
* Gestion protection menu
*
* Revision 1.22 2005/10/20 10:28:25 ddelon
* Wikini complet dans l'int�grateur Wikini
*
* Revision 1.21 2005/10/17 13:41:34 ddelon
* Projet Wikini
*
* Revision 1.20 2005/10/17 10:52:00 jp_milcent
* Mise en majuscule du jeu de caract�re, conform�ment � la recommandation.
*
* Revision 1.19 2005/10/12 17:20:33 ddelon
* Reorganisation calendrier + applette
*
* Revision 1.18 2005/09/22 14:02:49 ddelon
* nettoyage annuaire et php5
*
* Revision 1.17 2005/09/20 17:01:22 ddelon
* php5 et bugs divers
*
* Revision 1.16 2005/07/12 09:13:15 alexandre_tb
* d�placement de l'appel de la fonction afficherContenuMenu APRES l'appel de afficherContenuCorps.
* Le menu d'une application �tant calcul� apr�s les op�rations de l'application.
*
* Revision 1.15 2005/07/08 21:13:15 ddelon
* Gestion indentation menu
*
* Revision 1.14 2005/05/11 14:31:45 jpm
* Ajout de la fonction afficherContenuMenu() pour les applications.
*
* Revision 1.13 2005/04/21 16:46:39 jpm
* Gestion via Papyrus du XHTML de Text_Wiki_Papyrus.
*
* Revision 1.12 2005/03/02 11:04:36 jpm
* Modification de l'utilisation d'une variable globale.
*
* Revision 1.11 2005/02/28 11:20:42 jpm
* Modification des auteurs.
*
* Revision 1.10 2005/01/26 16:20:46 jpm
* Correction bogue meta : auteurs et mots-cl�s m�lang�s.
*
* Revision 1.9 2004/12/06 19:39:40 jpm
* Correction langue DC.
*
* Revision 1.8 2004/11/26 19:02:07 jpm
* Comptabilisation du nombre d'appel de chaque applette dans le squelette.
*
* Revision 1.7 2004/11/24 18:33:29 jpm
* Encapsulation des variables dans le tableau global _PAPYRUS_.
*
* Revision 1.6 2004/11/15 17:40:21 jpm
* Gestion d'un espace de nom pour les balises Papyrus.
*
* Revision 1.5 2004/10/26 18:42:54 jpm
* Gestion de la fonction de navigation pour les appli Papyrus.
*
* Revision 1.4 2004/10/25 16:28:47 jpm
* Ajout de nouvelles balises Papyrus, ajout v�rification mise � jour de Papyrus, meilleure gestion des sessions...
*
* Revision 1.3 2004/10/22 17:23:35 jpm
* Am�lioration de la gestion de l'erreur si pas d'appli.
*
* Revision 1.2 2004/06/17 08:04:44 jpm
* Changement de constante pour les chemin d'acc�s � la biblio de code de Papyrus.
*
* Revision 1.1 2004/06/16 08:13:58 jpm
* Changement de nom de G�n�sia en Papyrus.
* Changement de l'arborescence.
*
* Revision 1.32 2004/05/10 12:24:55 jpm
* Am�lioration de la recherche des fichiers de squelette.
*
* Revision 1.31 2004/05/05 10:42:35 jpm
* Am�lioration de la gestion de l'internationalisation.
*
* Revision 1.30 2004/05/05 08:25:37 jpm
* Modification de la fa�on d'ajouter la feuille de style de d�bogage pour qu'elle soit prise en compte par d�faut.
*
* Revision 1.29 2004/05/03 14:12:04 jpm
* Suppression du fichier biblioth�quie de fonctions sur gen_menu.
*
* Revision 1.28 2004/05/03 11:21:58 jpm
* Fin de la gestion des applettes et suppression de l'info_menu_hierarchie de _GEN_commun.
*
* Revision 1.27 2004/05/01 17:22:55 jpm
* Appel de la biblioth�que de fonctions concernant les menus.
*
* Revision 1.26 2004/05/01 16:19:36 jpm
* Suppression du code ayant pu �tre transform� en applettes (menu multi-niveaux, menu unique, menu commun, identification, s�lecteur de sites).
*
* Revision 1.25 2004/05/01 11:39:38 jpm
* D�placement du code g�rant les applettes et du code de r�cup�ration du contenu du fichier squelette.
*
* Revision 1.24 2004/04/28 12:04:31 jpm
* Changement du mod�le de la base de donn�es.
*
* Revision 1.23 2004/04/22 08:30:47 jpm
* Transformation de $GS_GLOBAL en $_GEN_commun.
*
* Revision 1.22 2004/04/21 07:55:02 jpm
* Ajout de la feuille de style de d�bogage si le d�bogage de G�n�sia est activ�.
*
* Revision 1.19 2004/04/09 16:20:54 jpm
* Extraction de la gestion du cache et de l'envoi.
* Gestion des tables i18n.
*
* Revision 1.18 2004/04/08 12:29:48 jpm
* D�but am�lioration de la gestion du cache et de la compression des pages de G�n�sia.
*
* Revision 1.17 2004/04/05 16:38:04 jpm
* Utilisation des nouvelles fonctions g�rant l'insertion du Javascript.
*
* Revision 1.16 2004/04/02 16:30:56 jpm
* Gestion de la balise G�n�sia IDENTIFICATION permettant l'envoie d'un formulaire de login.
*
* Revision 1.15 2004/04/01 11:27:13 jpm
* Ajout et modification de commentaires pour PhpDocumentor.
*
* Revision 1.14 2004/03/31 16:50:10 jpm
* Prise en compte du nouveau mod�le de G�n�sia r�vision 1.9.
*
* Revision 1.13 2004/03/27 11:07:45 jpm
* Modification des commentaires vis � vis du nouveau mod�le.
* Mise en conformit� avec la convention de codage.
* Am�lioration du code.
*
* Revision 1.12 2004/03/23 17:06:44 jpm
* Ajout de commentaire dans l'ent�te.
* Mise en conformit� avec la convention de codage.
*
* +-- Fin du code ----------------------------------------------------------------------------------------+
*/
?>
/trunk/papyrus/langues/pap_langue_fr.inc.php
61,8 → 61,11
 
/* +--Fin du code ----------------------------------------------------------------------------------------+
*
* $Log: not supported by cvs2svn $
* $Log: pap_langue_fr.inc.php,v $
* Revision 1.1 2004-10-21 18:16:50 jpm
* Ajout des premiers fichiers de traduction de l'application Papyrus.
*
*
* +-- Fin du code ----------------------------------------------------------------------------------------+
*/
?>
/trunk/papyrus/langues/pap_langue_fr-FR.inc.php
57,8 → 57,11
 
/* +--Fin du code ----------------------------------------------------------------------------------------+
*
* $Log: not supported by cvs2svn $
* $Log: pap_langue_fr-FR.inc.php,v $
* Revision 1.1 2004-10-21 18:16:50 jpm
* Ajout des premiers fichiers de traduction de l'application Papyrus.
*
*
* +-- Fin du code ----------------------------------------------------------------------------------------+
*/
?>
/trunk/papyrus/pap_envoi.inc.php
55,9 → 55,12
 
/* +--Fin du code ----------------------------------------------------------------------------------------+
*
* $Log: not supported by cvs2svn $
* $Log: pap_envoi.inc.php,v $
* Revision 1.11 2007-06-25 15:44:32 jp_milcent
* Traduction des commentaires et mise en forme du code.
*
* Revision 1.10 2007-04-13 09:41:09 neiluj
* réparration cvs
* réparration cvs
*
* Revision 1.9 2006/06/08 09:00:06 ddelon
* Bug affichage wikini