web/Zend/Validate/File/Crc32.php
author Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
Wed, 12 Jan 2011 13:25:01 +0100
changeset 10 eb885a117aa0
parent 0 4eba9c11703f
permissions -rw-r--r--
Added tag enmi2010 for changeset 93e647fb0fdb
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_Validate
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    17
 * @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
    18
 * @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
    19
 * @version   $Id: Crc32.php 22668 2010-07-25 14:50:46Z thomas $
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    20
 */
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
 * @see Zend_Validate_File_Hash
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
require_once 'Zend/Validate/File/Hash.php';
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
/**
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    28
 * Validator for the crc32 hash of given files
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
 * @category  Zend
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    31
 * @package   Zend_Validate
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    32
 * @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
    33
 * @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
    34
 */
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    35
class Zend_Validate_File_Crc32 extends Zend_Validate_File_Hash
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    36
{
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    37
    /**
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    38
     * @const string Error constants
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    39
     */
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    40
    const DOES_NOT_MATCH = 'fileCrc32DoesNotMatch';
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    41
    const NOT_DETECTED   = 'fileCrc32NotDetected';
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    42
    const NOT_FOUND      = 'fileCrc32NotFound';
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
     * @var array Error message templates
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
    protected $_messageTemplates = array(
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    48
        self::DOES_NOT_MATCH => "File '%value%' does not match the given crc32 hashes",
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    49
        self::NOT_DETECTED   => "A crc32 hash could not be evaluated for the given file",
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    50
        self::NOT_FOUND      => "File '%value%' is not readable or does not exist",
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    51
    );
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
    /**
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    54
     * Hash of the file
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
     * @var string
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    57
     */
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    58
    protected $_hash;
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    59
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
     * Sets validator options
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    62
     *
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    63
     * @param  string|array|Zend_Config $options
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    64
     * @return void
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
    public function __construct($options)
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    67
    {
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    68
        if ($options instanceof Zend_Config) {
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    69
            $options = $options->toArray();
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    70
        } elseif (is_scalar($options)) {
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    71
            $options = array('hash1' => $options);
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    72
        } elseif (!is_array($options)) {
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    73
            require_once 'Zend/Validate/Exception.php';
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    74
            throw new Zend_Validate_Exception('Invalid options to validator provided');
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    75
        }
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    76
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    77
        $this->setCrc32($options);
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    78
    }
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
     * Returns all set crc32 hashes
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    82
     *
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    83
     * @return array
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    84
     */
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    85
    public function getCrc32()
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    86
    {
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    87
        return $this->getHash();
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    88
    }
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
    /**
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    91
     * Sets the crc32 hash for one or multiple files
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    92
     *
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    93
     * @param  string|array $options
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    94
     * @return Zend_Validate_File_Hash Provides a fluent interface
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    95
     */
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    96
    public function setHash($options)
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    97
    {
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    98
        if (!is_array($options)) {
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    99
            $options = array($options);
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
        $options['algorithm'] = 'crc32';
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   103
        parent::setHash($options);
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   104
        return $this;
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   105
    }
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   106
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
     * Sets the crc32 hash for one or multiple files
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
     * @param  string|array $options
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   111
     * @return Zend_Validate_File_Hash Provides a fluent interface
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   112
     */
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   113
    public function setCrc32($options)
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
        $this->setHash($options);
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   116
        return $this;
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
     * Adds the crc32 hash for one or multiple files
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
     * @param  string|array $options
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   123
     * @return Zend_Validate_File_Hash Provides a fluent interface
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
    public function addHash($options)
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   126
    {
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   127
        if (!is_array($options)) {
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   128
            $options = array($options);
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   129
        }
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
        $options['algorithm'] = 'crc32';
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   132
        parent::addHash($options);
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   133
        return $this;
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   134
    }
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   135
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   136
    /**
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   137
     * Adds the crc32 hash for one or multiple files
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   138
     *
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   139
     * @param  string|array $options
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   140
     * @return Zend_Validate_File_Hash Provides a fluent interface
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
    public function addCrc32($options)
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
        $this->addHash($options);
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   145
        return $this;
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
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
     * Defined by Zend_Validate_Interface
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
     * Returns true if and only if the given file confirms the set hash
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
     * @param  string $value Filename to check for hash
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   154
     * @param  array  $file  File data from Zend_File_Transfer
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   155
     * @return boolean
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   156
     */
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   157
    public function isValid($value, $file = null)
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   158
    {
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   159
        // Is file readable ?
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   160
        require_once 'Zend/Loader.php';
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   161
        if (!Zend_Loader::isReadable($value)) {
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   162
            return $this->_throw($file, self::NOT_FOUND);
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   163
        }
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   164
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   165
        $hashes = array_unique(array_keys($this->_hash));
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   166
        $filehash = hash_file('crc32', $value);
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   167
        if ($filehash === false) {
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   168
            return $this->_throw($file, self::NOT_DETECTED);
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   169
        }
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   170
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   171
        foreach($hashes as $hash) {
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   172
            if ($filehash === $hash) {
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   173
                return true;
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   174
            }
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
4eba9c11703f first import
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   177
        return $this->_throw($file, self::DOES_NOT_MATCH);
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
}
" FFFFFGkƏJtDi_X-D1b` HmVI*^Q9Po4U.)jݼeFIa,,]#(2?K]NcF ڣIj?,ŀVj0n4CQU*T,ң>?"fPH8 xN ZkeW20deJ_:K(YU#o FIj2? w|Ͼ_%ddFR(cй  ~kz+QZ###########cQQub/$$΁ D" D HX@ BaA *ĪW *~ThG?`SY@x&X >ah(_'HAU GeK2DH@{;nWG$`||E{!gJQK*@! HU&TW4e{/(\\FF+է]#ꌌ^eo/JV@u=}CP%璧}|:,Fee)G](22rK좯I/hIj7q22?!ddj5E+US!zF(,Q1R~(^Xk{ WyHsv k7<{ -^=0Db `ٶ\/L&(*;kX Ѻ9n7#9n u #wIu;OjG,xGZ59-FQCuԗZc7Q2Xv@B }z8,(hdF #-ж2lapt C:мb$LX:\GEqo"WxqFd\YF5Qs##ʆCCr8n8GΑ⎴tTvcQdqPhb.FʎK:ڌtvdr|/sTgHd`0dfQVUxgۢj4HCӴTOhؐ^!|Fȩȫr̨JeY#uP_ePYW'>qW Q2*:eJq#>,5F#^FdE|~Q +]WjWp+B.8=Ǥ@=FϺ10WGGIŖi#7YU1f+0, 7.W; 8P]Zqօ/)-FH#qj7#w[nkʉZG?;nmQ8Xi, Jf"WeO","ʌK2KʏGuJ/t1k=]pQ玧Cq9]+h444C(j"2EfG1p0p8F7GtqKtF9=ک*%|20dn$Ғ˙Jv~I+y5e,-UY05he*d.l'xOGc_@//`G]bfItJ>=("xz/g ȲʌIzK8dddvr0drJZo8||fFLp- +NH֬d Cu5E\Hϒ$?f;`7Tzc{s6|Qy80\i> &⵷v&] "nViS9oͿn Y1;8KIR$)Ja@Dа6n"04"Q+E iWAr-HgR%|w"* W|!QaVb0j>5QjŅEYjKR^1sF 0b,Ej25Qcq^pl F!S2cb,EdjQ:tsE[%X:QiBN4\(kLUqg{ІV.jHG.aixY'TbSz=)8'"'XayMqహXax .0,,HAq[/ u b@y6IҏhtzZʏCaaa]$@P*Y%0K, #2 afRY֖ d%U}tb2*bΞ;Z"LO'qy"wN"HU >t\p+^\^\^\ҸXX[\p\+[\%u`[nX]Bk p/ ^zwqNE.`4MIxMgO\żxC]Q4lNގqUu4{ġC}j92SZ(4D a^ɺct8[%bh%PP H~jVjUnUjߚ].w0R+u%jKtU:*\- "Oʥ@RVNCA2v$BMO~8ͨ$_g,]#q5sGDj:F#nKUFW_QeG O;GaTJ+32/`2芯lcCCQCQ#e>* $f4IBQ)2aaR0`5(DE!AN6TUZC`3AH) C)VB1!*b'JKB8AKHSR)J"('B#*=2#`0`0da&5Fg߾,' v(PQݕ.P 21wƌFQX~tXL .aU(zH+꾤s~ GG)_EǿDj8ߍ 餾Lq>D^{[6 ;4_l%Lr$@.j,;.+++ "%dn5%Z2㎑n5%Z1ʣvQVUGQ=[rVTdY_G|(,d`]hh6FFH<]t%L22),*ᑃ#(doԌYEd˵KlHz>W4qUv(Q٩W1|%WuګZ@|eId8z_eUo8dK21|~ _h0MDް4{Z *J" X.9i+M~K8@9PSPCG]UY229sFqno)\F2cCpqj7tw\G^\^oYqRZG*+^7-WEU BȖ ,`K(ǡmG y7Ⴚ*Kҏ:9j^Tj @Gð_3- +*KΤGB^bJb5#QVpyy n=Z1=uݝKKF'jK_Ueea פ^ADRί`^B^r񚮑7>~1Qo)͉ HW ̪<29 pI%(XB JʉJv>]X` 7qq||#########\/Q8?sAS}e}ގrE;90r"\ )8bafk S̙\ђ (*cZ'npɌfkhEFBFʌeFHQXXX\ lapXXX2220` T~QԩQz4J]aa`XXXX!`XX0hhh`jdU2TFQj24. raWсvHaaaaaap,",H7eZ%ڣ2v#(ݟǏzQRʖ E#Q\J/e,GҢ=hB[ }PV)4"*&0BN0ns#$2#$GG>}?u .돮222220X,~}P[9uW֡ZU IR>OO'߀~6Nta 7r,5|####5j6/?oNAqDʹ2H:h : zM%+#x~QSB~ OHz=B_321K}5J "dxokvvϕiF#|de+cR2E Zb^+9ʪGKQ2rKQ29nB$.]b)H\!p Ee%V1 NKYHұ \FȪP:Ѿ۵9Vԓ EWdDtdi$(m&s̒C?\la8`EBmH1B7Qs_rB.bfA;ձXD3:wF ]MLB*ߞ b4ᕶgGaZtc(+-=7Fm3aLS$Wn FkV>5V3Fͧybe#hG>UGv덩¡ꏙe'hb2%i3WeŸY+2Ǎc<k`stfwC*Kn7[%2Όe%ʎ(n2H,, w[8T %y3xP@]`⎑t$2KQhxG\Q7dvhs9{TxǤsAljȰ48I5P3U[+v8)^EEڣ*Je)2 '    ,,)UfBђ Qnvw]5tIq $pYF:282F%Mƣ`a9`xF822tc#gZ2ZxQ;Q$kP4/ncd`J^yp8k!;XT~x&\'ZjJ FFFFFFFFFG7zޏͱ/B4d@\1w0/p.XP!iSQU!UXdeFQS븫dUHj* 0 j8ytzŜ#/lX#` % = +p |cÊs]|=#f=.`X, FFFFFFFFFFFD,,,,,,,,,,,,E_U# VA7 .ԝ`FRJP7l5.~& 2FbFozeQ%ݟ>1񌌎{w8=p=?)Gj2Q10b7F#R,xz{y]cQj5FQt%-Z"#+?O좭J٣@"vAK_:0ưG1:{)  HXDa\ \,(, F,yU ڪ&\ d==!=4`1~22d!E`CKȺ0KgUyWzK*? E]Kƣ$ B B =={AK0v,hA,N!ŽȤc`pp%W)T aXsL+.H x§D:r^@N HC=q fQG\}}'?:?D=PD83!ԙIB >giJ=1U-2> ,22QC#K( }7Uz^(aZX,JtL}qj8].+uSS%2T%ލ 2\Br\j̶j> GUEe.c9){G]焲FI^ 9gKGՕ&d*B/߇@b @*tKdX'{UW8]!Txc(Y2"ABfHǟ3kw6j8*{G㲦*5}xꌌ_ogB_xFZ}EGT<+ZX3$6A0W^ [*mDȗGӤc&qR` U8JZ:H% `VF P_֏FG0F7z%ASmR# /h<8G "yz􆷮pDA% c#ZV`\=q ,"~DQ!$HB Q~1ҫ#$` 2a-}22q7%#|ww.&_y{A I,-TH, Tb Q`.<ޞjdE=`haaaaaaaaa`ȅ+AxIx [ȞHwfFo%,tRH#l,]usHԸ[ ^"p"FNOfrYQR*ʬ 4bVKeFP8b/^~c,iXeZXFqMZLK阔EgQZڙc'hPGNa @#'t&#U>ҒAS`9VoHRT7*K̬u#FG%ri1&CI7KDLk9d Z!+~q͜V z @>C(+$k6{}v?بB [_PVwwv}7{ %I;izkޙ(" xo-Tgs^X3>d^Kx"@E3f"6bփ!Z45s{Nמ[k2UәR!Q+hFmׇx)Jg;kdwב4T=$DwkddɣI]`4lXdT2jL*  rögwS`M1llʻMfiC)@]͋yLJy;t̀y5'^} n`wy*l; e![kAl6o>< )h T?)?OQ=OQ 4 M$#@Ii=H(h2 hh DLҞTޤOz(4$A4LbdBbF{IQЙhhhMR"&A2Tɓ&TOE?T4yzPiP$H 4h& dO*mMzl?ş"ŤP- fdϋ_GM@@ ,7lG]۾ٞݾ*b RYY$UUZQjpp\D@cԒI?VFr{Og#"7IX^`Jjmj"raͱ1lWLi F=H7`ĽLJ4mcw8*M^ [KnU6 Q/ƿ$!ʉccq_;kn&!]5䎳s8OB􈐰.>>a㈍7-kio~Xd}!@;ݙ7gSn D{݇-s=FW8'K5& mbF=''m(?F{Ln_ >r'{<g ]pN%+bYP$2 SซȚvGF^u=m@̉M Z>tG=4Q0ꊕ@$\vJMb"n;\ubZfo0x" ~(m֞v  @A`.Sr6+Bʃc{̚c-։,]3漌4Q*Xvod&o#!oA PUkb! *Q`3 @'ɽ] o`{'hٚOGSf3)\zLBLޜفf#>V!=I t ߩ/4Z8c@}WBcPaݖ.a\tOU۲3+ m(L>1߄¨%mC?N}ǎs@9 ׿hiEU⤷ʭx&vIu| GhW\j Buj驎%o! H<D@HDAv'VYϯNwr܊TUh*!P u3@:@D,DPA?zP@D۴IgV$Dj{!~HiE| Q/e!dzV2xsi7RI&ijC/ʶ^d=ҢL_r$qw}avbb,wGv{;KVf4kniMZ"I 4UR#-ؐLm"ԕoAI/BDRZDv,3~lŦ |bԆ꭮rNf{|@ 5]-(SH'ù@Xe 礁(n`dh ).~8be3Ӝ.?bxz}?px58[tk _,Kb{?u[+V߻̻7'1ۺ%};6ZM6\syg0̥0{XbgξF衛55qeo“`WM8u9fڊC-MjSuEdL&fZu3{B͸+5_n&՜5|=TiA܄L :U9ҐGͿ)Q4 ŵ}8Ċ=Y@y.^nvߩBYC-t7t>28^lӾsy6(A?~O oj~#1ξЗ;#%;NA7j Oz,=:4?!'כlɋ&П/YrtݭrCHJ;D$H?yL ,g@Z4jN Qw*{@K3M ~Fg|"^YA5` l!:ML?u=%6=,GUzIKPDS}/,Sxwo9s&A{_G8B7g>S$1 ^>UQ[mZtktʆ6{F:*<ચu,TьWxfΉ+?b1gkj46,f{k>8XK0I8Ivi:Zmim5A]>UL&n 0gr$޳0׾yH?z|S.D ZhbIQ tzoOyU8xL]yKOŠT\/]Bp 7x>v.;|Q?* Aϫj,rS<11)Qq1 0 c8ZΜYލF{FHLf .ns#?eon¸`r} C'_(DACCqDws!?(cZR|'iJW26:dy:n%E V6$t7ؑq1MMz+ɘv\w|ͳDa+|MI WXI ^J3g1+7$hگʑce\.9z5ܲ< ,DDsCu 13 +iYUxc- GBNB}#e{1i5˖LٛeH"bdXr960&_t~0hrẻ2oP-CrzG}Aytێ$ow ?8oKa`=GNz;1,L H,`sA,u*d6 bY7zN L9jZs8et],=$p6T.>߼~,@ wl׺9 qp8,X\1se0lٖ {oYg<}X>c%{vv5{I,s2l3͈&üߣ{-sF8g3Lǩms\&B_\a&n&$7A{KZhk<3d7˻m񳩵凅o} Gό-.iEcFqhvv/ RsF{R7E g8R~9`Sn}ɹ揞.Ż^ɑ9ﻆ=3*s7?:ӛMLϯyәRG1seV-C}еvwLoM2=<3"tcC|JA3%O^hxf=69 lbT̤VqSrgiv\O#"6c"Q%Ia[֍پM^1WhXF#Zێ* d6yFVruqʮ;ιx\n2bxY"v+۪+9ת>$GYB~O$XKwϗ:'<9/pڹvֲQC9@6*p/.Cm193ǧZV-0c:nf'ӳR8t$l;垫;+?~53<֛Ku/9R8<0a4Ǧ)@ΰJ6h\);OܤN >$i&gIPr@9*{z+~U.͗yuk=8oso'=ؑr$I>DYHW$Fsʐ;D7-Y9d]}SwrrcªF4$$r ľϗZ4᳧k,Sy\Iky(OKsɌ]K *眍 I5#k)}7JCi Q_tEepî!o3LਈgAD+W{KZ-'毜!"Qŧ"z+I}u4E$/)bY=^X|>N71oV-ǥQG .e#K fnyxwWA^ (5DGi5ędBRQZS"BŞ/H ~c~sd`FLu bBP3=r=0k3,GEwiˍ&qi`q/X?FyƣFQv}27##xFQMFEC2TQ=*{l^|W{yqZ(V! G_G۔=^[cӔ![2F?vtz_8hyr~TW-VczӄTV6 lc[|x8N8PFeA%".#/]Yc 55-LEq?g dž%;Ecqhp OZV@ D=f*'ׯo B3 }nL~\E!OF;~_-^:|>2WۿkV=XIwFt5~;;Rv{2_|+l~Ix hLX[!o ^^]eDZ<2aFwk4$0.w(RAO9"=3`tdSKyo"x[t1nލDCv {v hUBYCbI=˂óBWЯl:m1];`yI.$vxp")@iwf1s9eխ{ڽ՚Qq.*Sմ;Bˬxݣ_o؍4ED sxVz:8mǍC/]E=ď^ddGӚ3,jy\ƚ=2?,u/mwMwfq1FMQsㅵ(;¯Μ҂'Hl|l-$(yl螚<dbd])aw!^{B>Ȭs3JCsQ[oo0:w|.f XHWINIcM7 18;e F0A 3L8#Y&+NH¢.a#M #pch)Uck<5XKLg;UOа02-a,&VE9)TAԞ?7^L8U#w{:{7g鄫|X*?ƿA_4WY5zy|!I[a |/wX"ENJl5[I_`LpՉ#:4M?Ze+͆Nu)Ur+rX\aQƫS\otq\&.P^lI:6cqVn 619;O뷌"<+9BM)125BTuv 4\aˁ.ʙQyۙ½>޶?oͽN ,7"pFzA~ဿ`Xdd~XNyQ쌣jUG_oQGZ:G8(2>#Fǀ4;:r81}Q=#:DŽzGq%GzGގltǠ:!=#s]8!qFQʣTsGkƎ(挢Hv7 tddy=%d`q#Qڎs"Iv5 2222$^ҏHѨ8*v0zFG1jGʏ820nH5wΆr:CFcccq}sF4y֎týѺ:H=h>G\2]a7q G4jFTdj7(jH22:QȻTxGHg^^.(}QtFFG= =GHFFG>s5FFG1p7D/XGecQa F򌌌!x##ddwFF#Tej;FFGq2IdddeG$ѸcQ9Ѹ:QsR[twG0uF*(<##dj<(u5F222KƎ!ߏ^&+/+6q찮3PX?% wщ⊮-w\e" _GYxU+SVm_b+k]_+qܴiY"0;eCC1MITb|Tm`rQ-.q/rg&DuL/\DցIhf2w)VitT IaiHoå8v3}Y``}O{J 'T?灣{`z B8GX:n62(TsntnhʣtnYT%*>h5G tFTR&` uߦejƌ5Fj ee;Q֏GJ9Q:GURY eFƌƣ5Q@]K.@tI54r3f~bIa8tށs,[a\`=#]RDYTM:ҽ.j<#TyGq%2(dj22KQ5QGhGƣddsFqHHqw?8c;FGXX;GcԖ>j2#(7Ǥvhǵd{FG1dtѸX:G9:F#GxG8#GvQҎ5FGj5FGQGq(8xX񌎱dvncF;`xQlr: Cd:u;C :!9vÈt0y{<11289GHxFQ1QG1($ǔtx(cRQv - ,R|/?~/eq-E.b!tfלoœf+R齌"Ib[fg%)2ڧԤ@/!%G,2 Z͇&;Gδ5Y[|Av"'D ?:?P8?C0vpX?PL&԰8pe?2^$ld˧^vrGƵ_eO`ScpcU痮Αw:; \nٔ:u_'h.[-E嬤wDY^&/ V<U.x`^k݈ n-QbU{-`7FkSomҗHr*ϚO!GPGVRS WlL5QX)6萷rL /O~IAȖO[ p|PJE\ *^~Յ;~/wws;B>_%BxCxJ!41Ge٦hHeoNЛ#~ |<_$F3FA?us5Ap+rB1ULGHG*{-a [)@kq+qKq5dDFb)lXXgÞ ӷp9\&5D1F &qƣN}`-mClTGXKb4@D49R%fMf4S2NHQI0j 0,P 0 $l2̥DA5I4DfAa ᅎeg/@/1aq7nKteFQdd5#(G1vhzQQ;njj:Gzƣtt27G52wh掑x;dn2225:Gn=w7LdsFFFG1dj;Gds%e2;XԖdj:FFdxFn:Fꎱ#j98#zƣQҎ5FGj#tƣ(j9FѨHdyF2<cQn5ccXGhxAsCC7x}cc`,Axâ.Á Q5!" cv;14:A<ǘr65lj4>Q2ۍFFFFFFFF|n25飙2gX%|j?:ǔn7ƨqFFFFFFFFFFGJuc#QUe||#w22<5ݫzXqwF:Fj=.22?R[FFFFFFFG4UU:FFG5n2222222222222222<(j2222!aaaaaaaaaaa`G{.x#tn|7|\1ypXXY-Fǚt|q7j?-l5Fa a?wN_W=FQ*j5G_|qHn8>5Qs:e?#Qq7Tsn7<71dw?Gn:Gw.jTeʏ######9nGFFG F X`Oy-%?UF<#j25cq{QFF(dqFFK3h z*p${EbBj>KG~Qqї̏7Ghj222XXX^X. yY UDqX.x?!SQt _({qn:ˊ(M8:Q*84揄t^఺ &T @2fgy @75RʎѕZQ%Q||쌒,qUEGFQw}FGj7FFìTedj5lF_*}Hd|Dt{﮽9{Y/Xn7⬣sqQy_sFX,;.#qeX9_ xwv`xr[E@/"ddaUvH>(fU/gtv\qq|+G7chn?c9cQBлuo赨LPzh]pLא*B\~0Rz 3Щ΍ zFFFFFFD,,,,,,,,,,,,8qddddddddddddddo{FFFKofVM~OqѼI۠*[Όq:FG*}) 18zFq_>ޣ?E_*2zyǔzdn?L~8c:^tctZ7q#n7q` ϟfeYfVt u{EC铤]E.~P_8}q.9Ѹ25#9#c<~8}q#Qk7~ZKw:FGY.#$*qGG1dt~GHXXXXXXXXXXXZ22222222<5?!l[>GCٔOxj58+룈220X//s=@Iz#29c##zFFFFFFFFF,,,,,,,,,,,-QWn7e_U F#B8#qFQFTj5ǝqK' H'aXwKFs{8zFFFFFFGN+;ƣQ}XXXXXXXXXXXX22?b|1Ѩ~j5Ǥ}Q.HMĤr[L HO9]/O q1E]7JAP6Y!54`zuUUu[̜E˚/y~qffY$Pq1@Xw ~ 3ƙ:$L 2p$(0YLԂpw vc0uG:2mRVG19nQ2*;(*)_M2GQ22>>?EfZ(ʣ"GXj5GHGeFq7G22228F#QqFTn,Z.@:d,=tEu0MK%nCֈDa[)m?hb$TR|>vVQ3l F  -9uC!@@Jtj4.;JCPE7?(F$qӷXddtG/xh^ uё=1+i`_ɒP|"X,2ddj5T~, / h !0B; ٹru;h/VQJ*}Bi_E%`(Qsl0I0]N$q| Qu D2f^k"|(4XDyqF!yM(%B,,@̄Htt0 BWU~џ1#QTj{5:z_duWj45SK#*0ddeF Δ|Ld{###QF(j>pyf!㧨=,B`X#UQ QD!D,J2t<݁BS>pXXX^A~qo}i) @FGv^:22>5q/%d)^1TU:IxEuc9W= ,uTtdRtj50n25TUU%Y#&^)_b425F#@$)HĢH 5+qF|#eل40B*")^QjJ#V񌌌j5FE`]}_bzatiS2++nYW -D!J$$0DFR(o9!QM^Β=˽ڣUkQ,:QGFQvX^q wh/XX225j,yR\)~Bry Ћ@[I}$KFRXQw5:Xaaw Evc Yc@![Ȝf0BpAn#x΅I+f` PXX`YT X6`e~;NlsF[^͊CA5Q]Lψho#袭}FF袯L s yQjU] )Lf' rfFQ,QDdLb.1)_3c\P m*gx L2mduvs/.ϴ%b<7WsXڀb;L֫R#FRYF)YEb22(otll;T!tr |)ggqH8Ɯ7M-vW0-6+QW?|#t]l1d+TG|3?D}j Wr4Q*Q]u׀.Btʏ%/X@sv{gQbӎ9C.6do-s١Yr4NM+\Ib2]q37nK_Oͫ1`7E,u5 64Qja`[%BheӳZ/hH$ apBnfY`stlRÉAߜ h]nlܗ R|Ǘ'֋u TLDA9n,n,4))N37ViP+/R$w DMvZ+&衼i쓃üj$Ѓ,sO&[uc@;G\šTF5U9D~z @FpuaRA\UsB`9pI[nqY%1ı૬^`vka~ʜfb#D7Cgp383.ӥ,β@ĵI̅Cͣ+2kRPv%N#zþ`i R2% )ح}Dy_ j=.2 Sb9lg\q+"p$ġ!5-lkZUkXk``}+Egjz0Bqp\ y 9Ѹwc9(w(|c#8ٳu,YS=Ap-r(cq<#Qލƣsq9yƣ2<27=rFB s%6upk(ƥ'ƪKÊTCJaWKӁ ^< ,Ay Z6e#hޥZ(7WX&M4Tzzķ엺EA'фm@~ ycq뉃fFxc>51{#r־d/C7fC2ove2̸:m#sD#de*tHȊ%e(S~5ʚj;FF_~򮮑W%_meeeI /._I~]ZX(UIb9CQ*ع?\^4-ۡ"aJ  ,j5j5F(S$`n2Ufy}sR=B,,.R"!!(&XLNj(u /\,~~e;2` 0`ACC 0`440` 0`CC 0`iQwW@@iX;XƬ?/5ӵFp!' @0Y0:K@߁@q=x(qA7*#hcCa>-`暬.YaAlL4M!<Ƅ"~+Q_t}o'-{o~IFG\t/4y!k#=$~zg*TqFG1mUu9̊€O@Ht (Q3MC 5H@" @D)."R0!7pGqU/ Ah= =>͒Gn+=p- "k ]2, al̙e^Fƨ鏧F뢵c#TdeFLàsb=_">uBɑ^TMFFTdeo.@@D<=q!m9GW1$t\CU1J HD404%LC DU3,IL %(J-/m0RP/ 1>/JU+O9" #h 0*3%LGKw7EjEVj7>у }0"(Xv(f"*H&  x'0`CC½qGIO+ĥ|⮃E8F`|X)*P)fxWUc]O" :ձ%R }].">up>@_H ,,$ E`X 6Fd?Ox?7MQR\mHYTQaJ`5QʍQQT2u",(??20u]==@oyYea`^{EFheFFGQs. @Ҵ*20FFFGgFFR[+Wd,঩K(ʌ2xdeUE(/k{ =B@G ^@l`K#*2(4~Uʣ&FFId/XQ+e%"kQo+9C?fHQGUD_S;((KOvb_ v5#q\Qj5FܼA` ^:^YEC;O?We[j揢 ")禳S/1p~(/r0` 0`4247͖xO|E ) (5eeEX{諀Wc@n$|gEH\1 nЕ3Q?DISa**?4KGuI),e! Øz}b ")%%`]qk9qYM[Z(##UEޮLYWz;BU|R6HX뤌!Ȋ,Y0#1`I !$BDDQDR Eп*TZ8`#UY0j42K}%}1|, @XE*Z24QQLv̍dvi%wjjZ[Pڎպ:C`mQN!aF (##%;)3 F3 k,%bW >YH^6l_چQѸjюQڏej7FFQqGAwE֣8:3ZZ8Q̖tdj5;:HsFQ⎝86Q~ڏ裚92K++==vEd^*R$ b }ݾ@y",B>\PztRuN,^ڍFQ,#<4h[Ѯ8qLb\:$Ĵ/P` TeRMvv](tGeQ5%p0vqeGXvLhGXGj8#*FQ.֍QG4nv(渣)ҍQt+#餽VFFFdddMv7{G^;u%Wx;F(ZVhRahrРyç/KҒffg+kdd_B_Z };Ēx +T-Ctn}c(2{IO](22˚5%xQ5(dEU_~ʽ,-4p[|уЊ{ ƾuZT>yDGY5 6-Kf IIJVa֔,@O @5CYv!g? IhhjKlj E\sƺg;% `7@Gr22Ny@Sbv@Nd 8S{=2eJą du7ppP(` 3b;@spv YhO?L:b%hC(kX>)5әDuq![Э ҇(t%;ۑtx#C7v^xc4;#ʼ2Qm>~6bE22#ҎkGdOMTz*#̫ /H^ - U<టt#ƣQY<$0!l(LfeXKS*-ȸ2նLT>ORُWΌU:}߿߸bzWRQ>(Qܭ*񑑊?UyZMJFFUIu*u튾Q*ҍFVFTt}}"\Wu`X@ P,,{| Нqb tE!He+@`|:us>)51 UQP) , d{FQ~{Tds##MQjQmDs;\zg#OHmUfFD6s09#@@U [ n Ġѕh2eF(OĤ E (D`Y^鯫jT*`, /@Ekl]5erL D:"ihVVV|0hJt w̯qZha!S<YGٵ'j4CȆ.lt] !c[љneG ʎ:[yQ2(j7Gp6;q#ȝc(F8Ql\VQt_4NV I` VK kqaZ22)~[}4eWF|kggB{@P;Ab@FId`ȖQ}>Ła|Fm"x NG9][{uw0V2UTAwRJP;VJ%*K($20X弞yTE!d4gdIu,,/$dZ`^G:`kQfѡlxTʇõM {{ N>I, pU 5ٸP9BzXXY'RRQs^΋G>=?8Kv]*lT\ ·!p!x^`*Q@{# u3cqNjaJm^xG¨kddddddddnj=b[3E1C3s71¥0XiL*4EȇDQ !`A8aAY5!L-LT9ae,cCDD>&&bl2QiHIeIYCQdBJ,. dUYFFFFFFFQQevy)4E50tEj7FFFFRYFFQj222: P2n285Q֨j5*(ѽ]+Tjƣ######TeFb-_´1~cF:[Jj3( Gjʌ?Ƥi,3xfm^GRN~tc*K2JˊY@rc,' 0AR(9:\#ʪ0Uch$X.܀_!zh@7O?Y/XXXXXXXX^ ⠛Ç-8Q۶s)/R22=dJrr;@Mu$~3Ԡ>?)~mi^ QG tH\<ݺγU`E.A8pQQv=ڻ_S*z Ӄma:, Z{K3s%'>FP5G5!umP;Sy?F`!x1svH0q}dMH4 tXtTs_fϟ龖_;;\kb& W%lYz!% ƺq]Il8e5%P3:{(ҔMؖeVdǖ}l/!iWDBO$|a+*HlTC71ZQn :+8mSBԚ^Vs:),VLF  Am]q.r*2 QF-TwuQeF222n^"-5+.D&Ya;dt"Qw+ . GHK#$|wǬdq%ecqJGj;Q19w#c59Gt\%Dh3 d.PJYYQ"$$Rd2*E;AdT   "V%bV $FAt U(X `,ht]V*{n[#Qn=YF=Ѹ#$n225QSqsG9cq#q{F 5##Ǵ.#"ʒ!pڍc37x 9>N{0Wj^zǨ"1GqGG_Tw5]+uZα y:H+#s{[#8 7qeIq P[LKQWddj*XRe ƣRI$pc,P3 qU ёU(dn5tnϊ.)_8 {b'IrTUyQpoOwBV\Y ('R\z wa/XXXXXXXXXXXZ2222222222220&:O @,s:3Arn_̨6ՕG2+8íG(>A2pf^Su+/1>rzƒ_qs !51 @[t*ɴ^>7%###%,;9UWUFGyyZvef5%GTH+GGdj5TqGg߫3eZ;FQj5FWۤ\`̠Hp3D&*EZ@ktvn &^8T8H Ʊ%9cf cIe5%ekQ-QʌF`ԖSP"`ݨs A6zlF| B/Gmmӏ@H- ژD}6*Z:WxRLYc5aQnGK]>L=#.t;e8Ā=0MHI/`][ddeGjёF2FFFFqn8폶<',*LAD,,, )"^mց5G3ߕ.KGK~Ԣb(78*.x-ܐ81IPRj#Dd:El@O 5qj5RZTjTej27ёj7FbFQխm7Qj7qGQ2FQVsQ̆l 6P^kKՐJe(O`fK 1-A&$墬5N3oÏh.2]EP*8f,%߆d[l`Tc59իGq^=z9Ѩ27TtGUѭiW1񌌍ZG5FTj25c’}hǨ#ddtݖW8j85z|Q>(ZC^0 ͓p^P&@zMH6(@D:?~0a(xN)+љ~nY2L+I7"Yކ>M6n\3umܖfS9kcs̐ gk>ǚ_#${ ≀]_QpGkIw,c˻ _`~k0V!HHȂJ-"B @ͽŁB300b!a H T 'l2D.H>:!~z{RV4QzYIy漤e/te~ qN>ׇ-G9T _txS߾5NӛV}VeI{~\j*D`'$>(iabj @,++!dj24FFP5ׁW]UdFTn}Q󌌍Tt22222222!aaay }#MQRYdK ECh)d [;׈VɉIDU'HDnd© .\ I¯Et9U9Ho/!ܿuxFEYQ̔6+####(\i5`C)ޅð EUO I=e%WfZO'!{P!M wynң posJFwUT<%?-QJA>J4bf1FD(Jʪ%K u]TRc5{Wz?L6Q%ȾKR_*ŅYW^bbJޚ`bJ2."s"%)BL P ,,,-K0^L}@fDm_XʟDaS#*4?<######f_9+` {Ewv#wW*P/JuKZ>͑xVnA_VDnF&_ֆC-CJcQ_/~\( YҺTLh\ql(*H"9XX\9ba-QcA$aa6L0E'@DP XY^+ӕcxS2%Y%5BXCDT_ſs{#{Gx0ЬDZ .Qʍs%ԢUH (Z Q~Sv B$, +B$D ,23viƻFFpuJVVb粱cS37Gz?DjIdn5 vwmֻq0 XXhQIt'4`j`! s%?1I=c##########" ꣔an |Ckҝ@ zMH:ǧbYa<|8KeabхnhP  R)@`#CRUJvtiHP,XPt=]r !9 U~1@o*~f*Q0eQG1G_s_RTMJ}f݅%3nZi$#vkԺԼ|jEylhfP('CiecS!^SX;IG6 ]sGcpOZK`мW"f4 wn{ +<#n518#v82u7c#r<##sGJ8 I ../ !~aaaaaa|;P,"cVQ ¿AQ \(<d'˟ҁ1^ݿ+ j& ~31$@:D џX3Ejh^R{w rM뾣laǠuyD!eK!R t(?mȖI&&bLI1=@@ OI)10`& 1`C# R"Lɩ1M1s.$L!HC'sel0ũkLVܳ?.UUSVM V^4 Vʶpw"xD(}(ܳrN&qBę5  R^.y$Ȓq VZB UR8w hBC̒}}fV瞊t8g&[0l>58"ʢ%6|0Wx?ogBF*JUNot0TeTs70蚞jclbbZʑiIo)ڸBeUűո5%ʬ\-Z)In㔙KL`U]! &4