web/lib/Zend/Cache/Backend/Xcache.php
author Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
Wed, 06 Apr 2011 18:31:22 +0200
changeset 112 5cdcce3fb8bf
parent 68 ecaf28ffe26e
child 207 621fa6caec0c
permissions -rw-r--r--
Added tag V00.34 for changeset 79408abc13a4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
     1
<?php
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
     2
/**
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
     3
 * Zend Framework
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
     4
 *
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
     5
 * LICENSE
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
     6
 *
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
     7
 * This source file is subject to the new BSD license that is bundled
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
     8
 * with this package in the file LICENSE.txt.
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
     9
 * It is also available through the world-wide-web at this URL:
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    10
 * http://framework.zend.com/license/new-bsd
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    11
 * If you did not receive a copy of the license and are unable to
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    12
 * obtain it through the world-wide-web, please send an email
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    13
 * to license@zend.com so we can send you a copy immediately.
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    14
 *
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    15
 * @category   Zend
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    16
 * @package    Zend_Cache
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    17
 * @subpackage Zend_Cache_Backend
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    18
 * @copyright  Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    19
 * @license    http://framework.zend.com/license/new-bsd     New BSD License
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    20
 * @version    $Id: Xcache.php 23345 2010-11-15 16:31:14Z mabe $
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    21
 */
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    22
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    23
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    24
/**
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    25
 * @see Zend_Cache_Backend_Interface
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    26
 */
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    27
require_once 'Zend/Cache/Backend/Interface.php';
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    28
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    29
/**
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    30
 * @see Zend_Cache_Backend
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    31
 */
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    32
require_once 'Zend/Cache/Backend.php';
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    33
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    34
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    35
/**
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    36
 * @package    Zend_Cache
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    37
 * @subpackage Zend_Cache_Backend
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    38
 * @copyright  Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    39
 * @license    http://framework.zend.com/license/new-bsd     New BSD License
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    40
 */
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    41
class Zend_Cache_Backend_Xcache extends Zend_Cache_Backend implements Zend_Cache_Backend_Interface
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    42
{
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    43
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    44
    /**
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    45
     * Log message
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    46
     */
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    47
    const TAGS_UNSUPPORTED_BY_CLEAN_OF_XCACHE_BACKEND = 'Zend_Cache_Backend_Xcache::clean() : tags are unsupported by the Xcache backend';
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    48
    const TAGS_UNSUPPORTED_BY_SAVE_OF_XCACHE_BACKEND =  'Zend_Cache_Backend_Xcache::save() : tags are unsupported by the Xcache backend';
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    49
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    50
    /**
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    51
     * Available options
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    52
     *
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    53
     * =====> (string) user :
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    54
     * xcache.admin.user (necessary for the clean() method)
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    55
     *
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    56
     * =====> (string) password :
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    57
     * xcache.admin.pass (clear, not MD5) (necessary for the clean() method)
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    58
     *
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    59
     * @var array available options
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    60
     */
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    61
    protected $_options = array(
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    62
        'user' => null,
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    63
        'password' => null
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    64
    );
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    65
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    66
    /**
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    67
     * Constructor
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    68
     *
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    69
     * @param  array $options associative array of options
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    70
     * @throws Zend_Cache_Exception
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    71
     * @return void
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    72
     */
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    73
    public function __construct(array $options = array())
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    74
    {
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    75
        if (!extension_loaded('xcache')) {
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    76
            Zend_Cache::throwException('The xcache extension must be loaded for using this backend !');
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    77
        }
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    78
        parent::__construct($options);
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    79
    }
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    80
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    81
    /**
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    82
     * Test if a cache is available for the given id and (if yes) return it (false else)
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    83
     *
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    84
     * WARNING $doNotTestCacheValidity=true is unsupported by the Xcache backend
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    85
     *
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    86
     * @param  string  $id                     cache id
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    87
     * @param  boolean $doNotTestCacheValidity if set to true, the cache validity won't be tested
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    88
     * @return string cached datas (or false)
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    89
     */
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    90
    public function load($id, $doNotTestCacheValidity = false)
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    91
    {
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    92
        if ($doNotTestCacheValidity) {
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    93
            $this->_log("Zend_Cache_Backend_Xcache::load() : \$doNotTestCacheValidity=true is unsupported by the Xcache backend");
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    94
        }
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    95
        $tmp = xcache_get($id);
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    96
        if (is_array($tmp)) {
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    97
            return $tmp[0];
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    98
        }
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    99
        return false;
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   100
    }
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   101
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   102
    /**
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   103
     * Test if a cache is available or not (for the given id)
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   104
     *
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   105
     * @param  string $id cache id
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   106
     * @return mixed false (a cache is not available) or "last modified" timestamp (int) of the available cache record
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   107
     */
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   108
    public function test($id)
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   109
    {
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   110
        if (xcache_isset($id)) {
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   111
            $tmp = xcache_get($id);
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   112
            if (is_array($tmp)) {
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   113
                return $tmp[1];
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   114
            }
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   115
        }
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   116
        return false;
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   117
    }
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   118
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   119
    /**
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   120
     * Save some string datas into a cache record
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   121
     *
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   122
     * Note : $data is always "string" (serialization is done by the
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   123
     * core not by the backend)
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   124
     *
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   125
     * @param string $data datas to cache
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   126
     * @param string $id cache id
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   127
     * @param array $tags array of strings, the cache record will be tagged by each string entry
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   128
     * @param int $specificLifetime if != false, set a specific lifetime for this cache record (null => infinite lifetime)
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   129
     * @return boolean true if no problem
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   130
     */
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   131
    public function save($data, $id, $tags = array(), $specificLifetime = false)
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   132
    {
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   133
        $lifetime = $this->getLifetime($specificLifetime);
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   134
        $result = xcache_set($id, array($data, time()), $lifetime);
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   135
        if (count($tags) > 0) {
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   136
            $this->_log(self::TAGS_UNSUPPORTED_BY_SAVE_OF_XCACHE_BACKEND);
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   137
        }
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   138
        return $result;
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   139
    }
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   140
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   141
    /**
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   142
     * Remove a cache record
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   143
     *
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   144
     * @param  string $id cache id
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   145
     * @return boolean true if no problem
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   146
     */
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   147
    public function remove($id)
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   148
    {
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   149
        return xcache_unset($id);
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   150
    }
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   151
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   152
    /**
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   153
     * Clean some cache records
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   154
     *
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   155
     * Available modes are :
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   156
     * 'all' (default)  => remove all cache entries ($tags is not used)
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   157
     * 'old'            => unsupported
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   158
     * 'matchingTag'    => unsupported
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   159
     * 'notMatchingTag' => unsupported
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   160
     * 'matchingAnyTag' => unsupported
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   161
     *
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   162
     * @param  string $mode clean mode
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   163
     * @param  array  $tags array of tags
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   164
     * @throws Zend_Cache_Exception
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   165
     * @return boolean true if no problem
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   166
     */
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   167
    public function clean($mode = Zend_Cache::CLEANING_MODE_ALL, $tags = array())
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   168
    {
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   169
        switch ($mode) {
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   170
            case Zend_Cache::CLEANING_MODE_ALL:
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   171
                // Necessary because xcache_clear_cache() need basic authentification
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   172
                $backup = array();
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   173
                if (isset($_SERVER['PHP_AUTH_USER'])) {
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   174
                    $backup['PHP_AUTH_USER'] = $_SERVER['PHP_AUTH_USER'];
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   175
                }
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   176
                if (isset($_SERVER['PHP_AUTH_PW'])) {
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   177
                    $backup['PHP_AUTH_PW'] = $_SERVER['PHP_AUTH_PW'];
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   178
                }
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   179
                if ($this->_options['user']) {
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   180
                    $_SERVER['PHP_AUTH_USER'] = $this->_options['user'];
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   181
                }
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   182
                if ($this->_options['password']) {
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   183
                    $_SERVER['PHP_AUTH_PW'] = $this->_options['password'];
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   184
                }
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   185
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   186
                $cnt = xcache_count(XC_TYPE_VAR);
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   187
                for ($i=0; $i < $cnt; $i++) {
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   188
                    xcache_clear_cache(XC_TYPE_VAR, $i);
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   189
                }
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   190
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   191
                if (isset($backup['PHP_AUTH_USER'])) {
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   192
                    $_SERVER['PHP_AUTH_USER'] = $backup['PHP_AUTH_USER'];
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   193
                    $_SERVER['PHP_AUTH_PW'] = $backup['PHP_AUTH_PW'];
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   194
                }
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   195
                return true;
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   196
                break;
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   197
            case Zend_Cache::CLEANING_MODE_OLD:
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   198
                $this->_log("Zend_Cache_Backend_Xcache::clean() : CLEANING_MODE_OLD is unsupported by the Xcache backend");
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   199
                break;
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   200
            case Zend_Cache::CLEANING_MODE_MATCHING_TAG:
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   201
            case Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG:
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   202
            case Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG:
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   203
                $this->_log(self::TAGS_UNSUPPORTED_BY_CLEAN_OF_XCACHE_BACKEND);
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   204
                break;
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   205
            default:
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   206
                Zend_Cache::throwException('Invalid mode for clean() method');
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   207
                break;
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   208
        }
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   209
    }
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   210
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   211
    /**
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   212
     * Return true if the automatic cleaning is available for the backend
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   213
     *
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   214
     * @return boolean
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   215
     */
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   216
    public function isAutomaticCleaningAvailable()
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   217
    {
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   218
        return false;
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   219
    }
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   220
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   221
}
a-`P0ڂ=I"QL@DQ@RPAEET P ¢* JMALԑ-="uCDע]HvPY=a8gXG=4֛r{pPdVֈo;D\5FQjjn2G#[y.ctQqhV*+7%}#r]Ayk0r»a YVW7GQƈ}rK*A_(P(h2CzaeL%L%z5G^MJ56 1r G2抵Fuc׭> H ]O%ލl̵Q^R/ҼZԥU/椲Qe(YK%򌏤jXXX]>gÿ@iBX^BO_J=7ǥ֣2{^CHRfpU#\%/ {>: "ds H嵜|.$V%Arm.QN Y$opf7\&#7$fzCXSLiJQDXS2\>Cm@b %G-vG iAa!8DX"(ArDc6H ch^({L^Q i9dffgf4a 0//XL$ QM4etueFFFFIdj25Qѡt. 0Eq]5gV/!e@ %]QGhjU](܋,'ꌌQÅK\$X$E TyϏ3̇x.f-ЋԹT{hb/H/Qy&PDzHEҠ+X,`lJ BmBXUTy##FqQ/8  p5*7p+ ++T 9rٸ4 @GU5(!.`c[K@<~,Kb}|ihU25bFXBDR D*Qy+Xe"ցU, y=q h "8(z]3xdXXXXXXX\FQ5ZGå4\ZB !@;gDt6Ɠ $zU<Ơ3e,p̥`#XhiH~P+8S'4rUΩS$y D\' ad ]B[+x̥ % ۑ5FҕGŪF)Ӥt5'Dcm7WR,>|fZQKΪADPAU^DmXXX&FFFFCTu莨1F"22#)?F$HP̰,(PbVeIc<:)}X-zϼW^T$K(ZZg?a ju`tsA7f4N(1QpDG A򢠳dZd:aGqr`R/2 e%RY27ZFFQqj5EuV/(}Wo#@ OlUP*Z uC v?\ X*H)+ vv>I Y+IqrY e(Ժ'쌌dB,/ÙD7@ QxH@PPQ+A+qq yc#C+?WHsCuw4t+=ƠoӦ P끔d`,dZٓ[;ZZ(`%&@%m_QP/V_XAiI  ,`챊fWEѱI;Cv_ԋw%+^ @3PGƌʎ:[yQ2Qn(7n7s۾we;Q8#q8Fq7QƸhמK#^;p`o/h-~D-F/ѐ޳j*FZ`W\7v}PXQ Y,d2G>`X_9{"} x-ݠn'\#zX\&b,Y6^;A”A/8/T^%β#Z򑢷fK+%wcq|`ڨbZٻyH1\(%J JUk}]]ʇۡҦs^C3hRtF dauD.1U(>=`JLts{KOO Y}#rs]ѱp)8Χ!p!yOU_HȠk,= kfU: ᬯUpҚG%UIdzh 331GL䌅UL-́N-,EN ʇD41 qEڒBST:u8RRQPTM1fQ&1M$0ADLCd,A͛.Tj2RYFQVR,,,.HW"iQ0" ,X1 FFFFFFFQG*j8$҉t,,# ``2220ddj5V#SUj FC(ʪ{F]+Tjƣ 5 p _;ƭQ uB[USsv#Q2###$2222]?ǚK 3WN~ _ 1%GTzPlE2b5|˜Es)d XS6@KfGW1j?-#*2<9oVQԫK|}#~" s@G(K4Hoj'h (&.yՏDW28Tx Aie}/,޾^-Dyg0X<[%[^ E`_H,g,Rk7krЀT֨wᐎQ\f V~<=I `YLU4 ^@YuI2AmR=vҕs_YE˵:=R]!7`vQ4Ԡ VGEA<ԗUx0a/QeFd2 A QL)E C*Tk'TRN5壺)[qmv#$M}["^5xl5), ,(|ÂC ֞"5ae`dd`ʌJo! q919 $U,ZYF2hJ5jUЈt/ D8Oe-J0e*jJ^]迻Pϭ`ö󊩞BeN ֞Fnd$h5?O jN&Tp%qP#@OIHs H FqTVKv'"lA#E=A>Y|l羹z' :McAJKᝆ0CKB#1u>"7<$,ٌqj !5J"gtQ[w)IM;&e:+٭–3N.i/GQBJ$ K#wI֦p8 wSK:fag##>tWҨ㿖Z8vMTׄf<CWUƏ)G5}tiZ%uqnK-ѕe.jeGxGZF"A`X5nQ5+.D&Ya T8F%gdqGt$2KQn=c#.c(MƣH;GFh5Gt8p9vKp.PB$UeFT̐Z5RdUIz`@ ĬJ,BFYT&`Q2AjITg“%;={;WPLqh85Ǥdq%ecqlbqsG9cq#qFGsGj:FG1h\ `yRYd1#3GÇK &H<`UB !y;{, Ev /HqGq:B=Y[xUfBE`XXXXXX_/g35csؽ -  8GZ%2D/7aC 0+#(A P!`B 5TֹqdUNCJVFP7FFF@ʌƅV(0J0?]էv2CO&-TV9``/!y thX, 系U 4,U9L>7rIQ,,,,,,,,,,,,-XXXXXX]:@+e d>]ZU;Xrv_̑mVP"o 9F8QL3G P/,9_3gp_GP\[Je˵FW03<# dd`K*xWUFGy<saK:t/@\}=4zёqFF`yxy܌0uvFQj5GH!H_K-V J"f(L }D04 Ѡ@X SzCHk,3,0-ksv,Ӗ9a,".9b  QZ5F(jF ,%& ,FF#Q-驪Buh-Dc벍||5%Π^}LKEDkZqʺl諽%Թ1VXD`"X/x/h|},!x'Lsr!W 2+.`\q:_*H x-sv4]VIPE^ KaFD >G<N3$L^%8[V!շᯝǬ1C蜐P3h)-\ ͖LT9ܳeagdȽ}570A΢c&i9u0 ME6^ݸ}mDh8W͖YTGWV"8#OpfP,dvLkH8P-. ؘ_XnՖWu_zQ e N9߬CMI!/aKH@Z3&^4o6fG&$Ú8̣7qn֔n*5FFF*2QRYFQFRYTe%{(Y6XBمa{w8V FR[.ܵdt#G1jg+0]lGK~ԢbVA!v"l"W.Ò")* Z-XIR[,Xy hIn8FQKUVTjUZY tdd5qSj2F22rqd8t#VfC(5QW=dtC:F̝3a [4YfRVd9&%($ĝ5r1IqWfߏh*0]:I"B(ߣkⰗ,;ޗ~2-nIQ Zp0{ GxvF{r9dn;F2 ֫Zvc#Tj25Fdj;]{,Dž%Q/G,qqF5Txwa>xZC^2`H!LzC_dȚ>R7(P aaD4r6$Pgƾ7}x-h`fCŅoi1fK

9^Mcˆtޘ:H3kĎ[ #vlKW8sEZa,M/-_o1xA`X+$Q2 y!yHfeB300b!a H TخHR2&p00ANCxXEzYGqK5QіFA?U '4|}e陕J0ǢE>1Jw9]g^\UQ1%D t'םCH V_ K*2*V#QĪP*9+T}<FFFFFFFFFK Ѐ)4IEH dbĺ_záuk"LV] /<Յc.ּC]&Ϟ8Z7kNlq~9\WHn:FTx~3ڌ£)~m"VFFFFQV2Gjdj25w!(`CSI0 FC)/:0}y>5-5wxǴYң\<cҽCP_J)H'kH24FTdKeiYUVd. I_"+_Kڨ_j7^~lK뤾7K%*]+X *!y)AI0JV J7ľ`oInouи2ؠf dDXX\޳9ŠZƂ0Hb!{Ņ XX #/=n_RYQVUdd`0b/P? $"B$.(̌Uߊ;B*/pY{۝Gvla 4lkH{BzHMCz<{Gc FF(dj28ov3p/=bdf REeVBfZ0dg+ӭv+%vvjJVbPڱce33γ .0O|DNO"PP_XXXXXX_7y :h +ѯCm]_ @ ?L!`$;.p~gv Zou4/ = rMA뾣lA(vwv-{5 P7 B1]bdv3)ܴ-AH i|GYe`VwxfY/?dMd 0 yQ  aw ޻zh k(zТ۩."( ;u(G7ppAAa7>@!h@M UUZ4[7hkth d5[+lP&Snt(b; =^t[1{'s̐(hT} mZ 턜J`]jmz:-h .Z-Z&ƂP[ 2 `AV{9֕ܩ$th:|3l6ڪ*Vp+y֪1X'0ֱ[$٭l=6ul%4@L 2mLiM4 MB#A1STe41@=@ zO"=Ah=G PhzFOA3S*xCjzzID d6=@ѣ ALOHhɩ==$'Mh2hL_.xX "wDBzK0ɓb6܄ Z9,3>ؽ1%T^U`BAH 14̊BagՅ 0B ac* C?k]h=9Z :x__Hhz| [ÔF^u^"NNh9ȹ+V`f㵺tu NP|`X?0|.ti?Xc N4@"D`BwEg|_V8RM%8="KH陚,Vy\>5wBtts'IlbCl~U硡;?G7Oq@oBw2Mhi.x[>_܊>,a%;`ECilS=i .9"QO !r4h(W@dX䋡*boNω3}۟0rnW;/ 'n^ 'QH%eFGZ {xmsy}GCTg&ENG(K8OdaNԄMzXU :y-+l*Yd<ܪ+O{m@Q)yE003O֌Mqn~VOٝ38ϥ @E` 8ŽULAsMG<%xçނ~b8wt;?: C{&{9K:Cw.S=Guc/p kɦ]]XP6ZFۨZox1b5/>m ¿nB?wut$lKw߆ɞ_hbLqy0 )v# яQ5rX(DBkju1$uI! dwv*k`,/_WΤр5:r;$8çˋaV&7-񊗇d:>=L,(O:"zsVIH| t!.v"_Q%30 *Ķ_>녾A6)gDuT힢"`B~3 >~ fS>[tn:w_b͹IӖ]wLٛly߱F(4UN[<6.f;'Oh݉xGfڎi2ǯ6g)fO.Al{44g[.E|6/5k0U7Ͻ96iy PK_ 4Q`u,JLr*1Oj, 3,m_ms<+M $^p2kN>B+q0u*̽'m3ir=t(seN@v@eeNP8_ȊV1 g3C#5Vu%0R8V~AgnUWmIݺ\ǭ,j+ v w07ȽJ[/p]&9|ž7WȂf/wwwLk3:v!< g!4eۜ3jL|xuf@2p83T7P) [8ɹl۟MMEmgvdw\C PPX?fsND)!#^>DnQ-uA3>լSK&åEDmkNzr,rawg2f;0r0ŰzsbAp =-qpO=֢Hmu{~oF\.mN! rg&]^KQ8]r"v 钝9&e0; 7\;w*_8N%8Ci8!95ŖxxpIYOYb#U#U2Emv\6  sh~}5G0i͸f+k0]q1[1n@>?MǡI{ošnj h=tsy'NM5-tvn[q1)8FO G{-5JWoMӨgRiW!1q[|c3N]5*8QA]G}$'3]R1Exm̴Ja36}/9zDloq '}7Gk@'=#8qzbZ*Bo:wĪdUg =}&=٤}N\4Kd{7LġuxYMqՈ4a5TJaCm-6%`vZ|ƹfDۚW+om?#3q${]ֲ62g.!B_SH3Y*?z3jGhRH$"qnݞ~Q1bd8Jd{#j+pH7Y&IŽ}дݰq%zqdfb)GEME eD 鋤QK7C<\Ma0NRI(iH9yC) Wq&r*osv&A6M\ZEh9"ۚ?bg-u^ApT{vNE| `Hϒ3CKXQj BHbl=:6nm\1,7JϚH43/Fũ9' 騤3vg[(S|ѓ[,O`v5[eLJσ9ҞQ|g~JvVu#n]~7BQgiY՝voaxfz^Z.87K& ҄ԄX >$FFf߈gX70\IW8sY/Hn"2?FKa_ Z}Jn ݓhB-ΎrV7x?^j7t4*E=z{y#~na({Zr9t Gfs0u=<:\RX=C|tυfYwMcSO/Yyvc\~Azq;(ߠz)ȍE {D q < uʈaNbȎN߯fZQ @a3.D٫yX_NSĢ4E`Xvy+G3'Iwq3wG~h|}q~j:X<%/Ǹc%c#q1Z;FGH?Dn8Hg7`ȨxJj0Rcȡؘ`C?*1/y2=$'A%u{J%xA_ uC^5hi9q6<~3ݽ- aco)sy UG"}FTiĔ^K"mrHs_f%ِH1de0ÿ:C6 K|j"D %ARu1]Rzrx^_5_^/Mku`8wICw(Nsn;綼IATOz&K==w=u1C}=LP]-n> 58 s|Q3Ty>MWN2n']lz|gM`N4R%|0!-'qavy{L]S80=ux~p|?`!>te>|7Q?9p9?8}q:9:1q3V]Ǡ:=F18x 7:ǤqGuc=#!2QFe Q8QW2 9#x !Ҏ20 v0J.M##ƍP`!%0`ҎQ5 F Nу#CQ#!yуct0nC`5TqCcn67QJ45UxG:ü8PQFQR["Ѹ܎sGHQj8(5"cGJ=hF]hd(;G0%E>FQJp8GڣC`8#n9)/(V52>#=#CQ<###9x#I`dh`Gj(jf`412>1jdd*5F"=5GH2#Qsd|Qd:|Q/ t#258ƣqd;G 4=GAp:0n%~a>=ちd0{8hGÁ`: x 4<`b.F hp: Cwa`wGA9cGut:}p81vHuja`CC`<ǰGp0vF=1p>-GA4::XǔwQ|cQ><98sG2<#c>q<:Ft8>q5Q7qG4sGx5G1:Ǿ:Ǭ{#Q5FFG28uj7dduQj8Ǥdlj=#qFxƣ<#:G2*5<8Q7vფ{/,4:KB77y a :F:9[gqnAM^A ?H,C}K?ZsE}Y֮fFӓ c٭f c5{6-gJK)O .X\ab@LqItj*Z;zݹ .P#nO&@I8pDӌZ H`ɰ`bÐMA.1+,JƂ'#ag:W$,&&@H`-k+#:dqƨGnKteFQdd5#(FG1FGѨƣxGXGvc#;njqn(j>QYe#{G4t(dn;q`:A: GF84=FƆ C{~8p?:ƣc|xhr;Ccc80xCt1649A4<6:Q|u:QGZ=2Z5u#qcqn#Q2#5QGvX/>qnjdxGjKxhw :Q#ޏ;DŽ|7XѪ2KQ5G#:n*\J#%Kj;FvQsqGX*QsTKK^yd4Q<Н]Dd9FQVFFU)R>V(222K#uR_(csFGDa/KUK_߫1#e2?7q=U:4~h27pQV U%.#UF(F ^vGsh27~$eQމ*^BWHj*̤eFe/{q,l~ϳ i "'FdBكh(@CZ:%9#G!4os_.@ Y7[9jB=F Z(򌍿8##########FF#Q򣛭G64]R]n>7x_]=:ǜn7ƨxnzs #Q Gh<H8#qG8#}֏Qﮏ<#xFG^151G1cG1Gj#sGXQ.FsFF<'IsFFFFFFFGJ*G~sFGpj59Qj9G8[FGj2>;##ˏtʣz8zQdddddd7AA@7vUr5i 8v|QUj25MUj:ƣ17F##~,1Q~HS"`+/Q5zv?D}Qdda,qUTn9##Q\ύj2?4sq(? 5Gʏj?#L!x<#QFyљFYIs:GHF#Q:tzT|(|G(Ѿ򍍊#q*9Gm~U:GʹŸddddu+(/sT~Z Q/.HѨj>>j; 0` 0`׷I7Q}t7sG9c: R^0~^ 0` 0` ?UG?cPz47Hv7R[wl^9.C(}/|Xb wb, .vOD2^Nrf<]B HI9YY$$Y /Z1㍻*$kH?'aJH8YyŖ60J clRDyLb%,2/pTe *n0Qδ쥧:Tt%`tTQ?UjQEeFB.ѡ`5TL22k|9勜c*}P8"Qdn5 7Q(j8 !n79(YņJ̇)EXHK!Y z%"EIޫ'у#FQW~\O}T|yåu}Qǔ{Qdd#QQ2=񑑃Qj:i 0`]2O>o"_XĤI&dYUGn|}#^.J[zp#=>Ba/ +\u>nw^pEtCv=# eQ/}}yR=TU@\&)TL1IJ$O( fWdpب0E[5UJʊ0h <fR( @¸X\a\,,0dd^"ʎzP Ey#^JRґ!~RH ECfBWh8b Ժk ,ettn9CP47G5 ^)W[PM})-J3Q1F H{- h8F F :FFFQZ}c0` 0{zA/t 0` 0`G{:GAsT}#x0` 0` 8 iYZ1CwP_D-V220e`L3AQJQQ T@>@^_t0d`~`440`J•ZH^>=$O0w$ FF ,5ߕo{_0L4,w{ކdBA$DUʇ+ "=/Q<]%G2FR.0`+.D!:j=q67clK/5})ֹ8պeQl(c 0y hr9YY_1G㤪IG>ނ$'tbP-,u ĠDY>H4Q c:rD BȰ, v~#פM)8n757^(#BE,[¶-R{G} 0w+TqVR ^? 8co{dhh,bF5I,K *:Ψ## W~vNJ.Xy?#EqOe|U\0`/jʎ /tkDgos4jۃX ^dqll`heJV+Hn2d:{qIZdu'ꯔU< YQjʌ#",gHj3K/{,7f%CCZ@X\,V +)X%fTw-թqpD՞ٴ*fRdߡ6x̙ c2V=a+L ! 2T6֙+NzNJT=HFM9c fEte+{4dj EN h6 bj:6LiFăa$aօ݅7r5GAn8Qtm̗%:̘7cAvа\Hp9#hn7QV:qFFQWZ).F 2k1jF#*<:,#(|sV/گXV 0` 0` 0` 0` 0` 0` 0` 0` 0` 0=6 E{í^uku` 0` 0` cJV2"A>> Q t C(QZQO:bs1H `~ѹQBsMz4/FFFRYFQa,(YFFTjR\*z"!7`JUkC`ڼ+kxU]0l{ڹIF./GJ2]Ǩ 4QA]uFDxF2BMYļc%W[8ի$)r<-ǺS0>>9VVaIx8ε 1*O ft㉚* y%2#j=\dP j4&o!$1~~<㸱m_2sne6jQ*0>D6Ǖ|6ƥm i,7Pcc1f`czШ|FfFꍤ>1.nXd\ "%&Fg=#0` 0`u:I]JEqơq*n*^_eұ]'?^FF o!x!Z8JgCbFTO#=qj5qңGTYѐS(GYEjd(9~M}={jBBE<}¿_)UD-Mte^Z(pD_]aѪ[Fq^yug^0h=[! %:=4ϋa1اn" h4 a#ݨܖFFƆFHxC*.WL2|ԚZBDX@X+p-i{2U / [OX$E7 (i*{ {ꏽCXX+؄4h߽t.Ezc"t+°/FTqt~n8w#xGj9cǜ8#H_-YcQ'.xF:Gs8lhvcsG1Gj<#8GCtuG*0՝=Ơn 7@],$Cb=c<̤{)釩meZHگVc Tb<}g+*@:(B},m r~4VF8/%z+{邰t-bX-FI$#fzwiC r- ,⤅u*d`VQ##(dtUQmH.U)}e[}q>ۉyGQzU|C]>A}*ԯR-& KK^r>_Mpþ`hEH+ȋP[;`[ LT^*+YE |FʺƙG}ݾ}ם3C4 8" '4IvW9ehzb##uGOcЂs; H,`j9QԖF)X5G%W+8H#Y`Y10QV#r^qq(GhUW">Nr?hwz+S}`ꌣ(,%%~dj2R2;TIRf*/旾c/p"^ v)5ů0e44CC*5K\ · @!M,G파:.~hnb0de5JTB?8)|XDžTQt8^y.m%41A*z_-"REʪ?*,I`0B:WTE#.Bcm?RK}Q~/H.11(ʪ|#QY20~ߕQeER?]_K!%ʌ>`]S +/xTXģ@IUFBe !<LJ"#da/\}o}*)_.PD@F+J8*!Tn'DÄ\]( &X2FFQn d#qQs5}~#kY{a:/r|%x,#$0` @, հ/2dtELBBG⥕10FݝB4I[?xd8R̸w4י$ll!3K09ΔyFHmj4 ǭQl{Rʏ(ҌE]+#tj?|q" J,4 !:mh~WgpviHal2rIi ޅVJ\QDY%@_3i|I{P=0|΍~:C,"K"YV#ddKQ#jzeie|a:y]0Y^QP@ƨj-|x-u|`}ZwaӤt" h<3yN^UxqG_K /j"f%%b"}kW#_Fn7\G挌j0j5FQvUڣ+Y1G x8I.`"D,4TTW0֐Wj],{wpyHz75ؾS:=^wI_\l !y$ %G%ddVIEVGFQjѺ;֎#|n:1s%0hh{qp40htc5ȻAoe$xqq9-FуCCt xFsF##Q;H%S}*9tQ^s?R1JFIUK#!TEeG /HQWG飧z h $Z FFen9;b't fcsb T2|(5Q9GeCC!p2;Q2[]#5h#QdqPhb.Á֍xn(Gj2ڌ|4:֬F 骷f]otX+`/H޽АbWc=c##w-1 /L($0 eQ7vve5] |S(%KT|RY}#>txsQ2*:N!dxW4{$22jFFj2 `5*B@.¹0*W7w 4*5wKtP;  B:J%Xd IIC>@XP[ ©%! k¿*r =G8QKQ/iƤ̏GXixMA}H<}`dVF|d2e Qu(QZJWUxXDYQIeR=$:RD?<=emgǀu^8|k kO&Dڙ`jQj"d7-Gr0r97G/;qa.GA#GVT|xH˞Ǭ`ķ}WhE[ZC]HW*fYfO8d`,dTs}Pi54L+ ,|R]cS2X{E?IuVT|;MzQ%KdXQʌGz;d|#צ1~ZŇ#c#R׵5<*\Ux^-A(抹sU O:B"SJ"f$@&A6@!#\5ġ")n~.AWh: H++O 43 tfVM=MwA c5iZj2ی!dJ5-1J5$5j[+r.ج$HR vl-w~ ~ׂRqVVV@\"±**dw0lb.QGxj5x5b̬ZŒ]c(1J "\ FF5#n7G1:K2QXUCp_XX(MiM@w[" ;0$EI/xvT5##C FF $`^BHH g!cu Pw ^v*7ad %,,eHL<\I.n!Uш1^=] ކyQ5F)MJO^(8 A"BuFP}jJePWp9z33MFAUVj>G6t[ԱdHsچd1=a\ʎ]p>iOOl 0y.BHDG?IS' /~5cq:H:Q7%c?mG*2IdbD\ ?j<AF S݈?͇Gy%5G_􎢯?TJ?52?KJ/iKTb,"Q-u纁K}/|~ hJ_L<>pU_' =r7(UT>#Hr|Sה#ﴩC#)Iu^3_e X49CB 1G5jsFUnQ*XK)^v]qiM@~W+feƆktqETb20l`GoFGPcFJ5FQ? twZ]+ҏkY|) abC I!`"z* 22Cn1F# b0b227F#(wjr;'¯FF _G=2FGㆿo\RBFB$#`I)Ѭbݿ!VHԢuKFCC#G1q- eE}wh(].GVTdĹ}XXE#g__I%T*H) ,"DAapV>eaFTe%|~$~a#(}J%z6L(KWҥ_;Z0u(t{/}^,>eUWM}(eIdj=܋q09^_3jB*I!ٟDSL_0LdK `QાFӪצqUx(F~ڎ}HQ35 Lb_ ,/RX>H0deZ;xnjddlF V(j224Fv9$43-%J@|2ǢßOGy3txQhC,T-;)= HK "k+BqH(\vTE@#@%GP:VLQU[~J!-"~"b'3E ~ ;7|AP#쑺Pu:Y_.m` vΩ߅ ߵ5.w=,|}  տ[f+NYV,\`CjKdzy1]h<`n3 cSꊇfnecRqD-s ]yyܝ:؎M]yL|@m(*݁g|jsx1Mou1fyBE!Tబ=S0Mŭ*}XHZ@L*\B^*Ѿmq }ߝQG6|`4L;x18>v\P|=fL-5&}:i5Rfi^n3*7C*KTeG20%ʎhn2H0dt35{L;Nj^*p.lfMiU>GHK#$282F%Ma#w81xpj2Gk>ڦvϱ95]Ƞ@\IMQ4P*VR[_2jXB,BD  % `\BX `/D;,߷,4Qzv|(Ide|qFIsGXddjqƇar95FFQd}q@q*{X󤷔dƌ.Z , QG(ם/N<| Ttq7aPJP %^WáP|̐!5+y;H_ p^J *;A]pr r6/qw6ԗ7}#FU>.hABfCX*Dg+2xu|0н5hzçb^pZ}YFRZz:}M_qUsmAhZ n/%@" [̝+G1j5FBжN ^.X! %-BpZW]ݘ#F32!Qkb%Tj2KQ5Q,0eFEyǎG)$fo<="Fd;,2U]k%Rt11B)xB Uʼ%2檷;FFG>j#!,Wm>>]zo&(=G15OF ¹j2-%5e61vz *q^+U8IȮi&b`r#`9|wdR bL:0?N,5WL$~uFX ;AM;_>G38wodn86jZQҗcFI  $(H3|䅪6^cŬ<*$Ęt .l67YQX25IXCPFY UQe#$YFZ7q/kʣufMfEhb &Eeq|us#7F@t_zn8;z!]UM%&bG~oŌl2-a md!ACzGC=[ 'X-5'ꌒ=h~`/p"N\P:i(:RIt[19!{1`D{O"B)$+,)h (BCD %0JZO G1\&sd#+qGƌl{oU'IR,} _eF~+h{0+^B?(6֏ùx@=TGH@ YQ``Y`T@XK(n /_j?˽zfK25JB_Y-2HSO!@TNrC#FUdX>6-6`r~ -X{zJ2<s5CGj60rb(K#(d TL,,,/ai;BhC+ J', 8JmP:89<#ƨdFQtӍOxqTM\ŶHTe 2Hٟ0 ~<~2`Eaaaaaaaaaaaahᴻ<ߐ]o/@X!nh]D!hH"GQJ[Ѩj5IjjWAeaU `UUiq*FR2C M$ДTwˏY^捇IƀXaZURfEϷ\ [B/4"hȝbf/3F*nʳ(fqLLY3& S5 -fk*memBLBYI|^3A.`"AZ@X`3Uk5,Aw : G#p;cs.]ƙ@(K*,ctGq9dqt^:ѪKKn*(4n(>Wi%/Fd2s猐@@]U^T8+ >-wwT =|=P} ʡIaśHDC4PT܁ʢ&E3U1P? o2FniK4JcʡLGTz*uHjذFI$/tP& 7;(QcRe5 Iz}E9si lzbv膦MSODzD*~4=COARS H44 24L&F 0D MғG&i 3 ;H H DBLy;ǰG>lny (BPc`P/KKI 2jjQgOv#%4b#AlawY%]UZJNejz#@ |t㍯fY;4@ ʅ'U^tC9$Qe֖|xMh䫑\Tk;;@{ dH !9i 6sR{.T+؅,kZ҈橴d L'.3E瓕R8O{IO(g@@|{ 1 ?2 7qm 0#gG)իɪF#&SV9ծ'CfDaV]^ 9T0eյAVUW?HoVl$r ݫtv{uzX7VQ$] jdUsj,msY36gQzYH4m&u>3y Ejzkk &dx$ ч(vce@WT\E0T~_{g6ۆYͶnt?Rcw@pW~elm |NozZp mmmvl&QooМ$F1awqaz4mf=f>Q٫] gwgWNw}rjLNp.-EM s|JeWb¦Ml5s9 4myͶ$ o'>x'9djGI?|b@{Qmea!"rp1&9 BhdHJ1H$F}<WU[AKZnm׋ޅn$C'F`-O4mѳX^%ʝb56']BA\N4